diff options
Diffstat (limited to 'Master/tlpkg/tlperl.old')
1276 files changed, 290480 insertions, 0 deletions
diff --git a/Master/tlpkg/tlperl.old/README.TEXLIVE b/Master/tlpkg/tlperl.old/README.TEXLIVE new file mode 100644 index 00000000000..1671e7674d5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/README.TEXLIVE @@ -0,0 +1,21 @@ + +This directory contains a subset of the Perl 5.8.8 distribution +for Windows. The only purpose of this package is to support programs +shipped with TeX Live. It's not intended for general use. + +The executable files were compiled by Siep Kroonenberg with MinGW. + +Changes: + + * The documentation and many modules have been removed. + + * Some Windows specific modules have been added. + +This version of Perl will not be installed on your system and will not +interfere with other versions of Perl which might be installed already. + +If you need Perl for any other purpose than running the programs +provided by TeX Live, we recommand to install the full version which +can be downloaded from: + + http://www.perl.org diff --git a/Master/tlpkg/tlperl.old/bin/perl.exe b/Master/tlpkg/tlperl.old/bin/perl.exe Binary files differnew file mode 100755 index 00000000000..30108d9a8cc --- /dev/null +++ b/Master/tlpkg/tlperl.old/bin/perl.exe diff --git a/Master/tlpkg/tlperl.old/bin/perl.exe.manifest b/Master/tlpkg/tlperl.old/bin/perl.exe.manifest new file mode 100755 index 00000000000..c97b607769a --- /dev/null +++ b/Master/tlpkg/tlperl.old/bin/perl.exe.manifest @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> + <assemblyIdentity + version="1.0.0.0" + processorArchitecture="*" + name="perl.exe" + type="win32"/> + <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> + <security> + <requestedPrivileges> + <requestedExecutionLevel level="asInvoker"/> + </requestedPrivileges> + </security> + </trustInfo> +</assembly> diff --git a/Master/tlpkg/tlperl.old/bin/perl58.dll b/Master/tlpkg/tlperl.old/bin/perl58.dll Binary files differnew file mode 100755 index 00000000000..d783261a862 --- /dev/null +++ b/Master/tlpkg/tlperl.old/bin/perl58.dll diff --git a/Master/tlpkg/tlperl.old/lib/AnyDBM_File.pm b/Master/tlpkg/tlperl.old/lib/AnyDBM_File.pm new file mode 100644 index 00000000000..d73abab0f9e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/AnyDBM_File.pm @@ -0,0 +1,93 @@ +package AnyDBM_File; + +use 5.006_001; +our $VERSION = '1.00'; +our @ISA = qw(NDBM_File DB_File GDBM_File SDBM_File ODBM_File) unless @ISA; + +my $mod; +for $mod (@ISA) { + if (eval "require $mod") { + @ISA = ($mod); # if we leave @ISA alone, warnings abound + return 1; + } +} + +die "No DBM package was successfully found or installed"; +#return 0; + +=head1 NAME + +AnyDBM_File - provide framework for multiple DBMs + +NDBM_File, DB_File, GDBM_File, SDBM_File, ODBM_File - various DBM implementations + +=head1 SYNOPSIS + + use AnyDBM_File; + +=head1 DESCRIPTION + +This module is a "pure virtual base class"--it has nothing of its own. +It's just there to inherit from one of the various DBM packages. It +prefers ndbm for compatibility reasons with Perl 4, then Berkeley DB (See +L<DB_File>), GDBM, SDBM (which is always there--it comes with Perl), and +finally ODBM. This way old programs that used to use NDBM via dbmopen() +can still do so, but new ones can reorder @ISA: + + BEGIN { @AnyDBM_File::ISA = qw(DB_File GDBM_File NDBM_File) } + use AnyDBM_File; + +Having multiple DBM implementations makes it trivial to copy database formats: + + use POSIX; use NDBM_File; use DB_File; + tie %newhash, 'DB_File', $new_filename, O_CREAT|O_RDWR; + tie %oldhash, 'NDBM_File', $old_filename, 1, 0; + %newhash = %oldhash; + +=head2 DBM Comparisons + +Here's a partial table of features the different packages offer: + + odbm ndbm sdbm gdbm bsd-db + ---- ---- ---- ---- ------ + Linkage comes w/ perl yes yes yes yes yes + Src comes w/ perl no no yes no no + Comes w/ many unix os yes yes[0] no no no + Builds ok on !unix ? ? yes yes ? + Code Size ? ? small big big + Database Size ? ? small big? ok[1] + Speed ? ? slow ok fast + FTPable no no yes yes yes + Easy to build N/A N/A yes yes ok[2] + Size limits 1k 4k 1k[3] none none + Byte-order independent no no no no yes + Licensing restrictions ? ? no yes no + + +=over 4 + +=item [0] + +on mixed universe machines, may be in the bsd compat library, +which is often shunned. + +=item [1] + +Can be trimmed if you compile for one access method. + +=item [2] + +See L<DB_File>. +Requires symbolic links. + +=item [3] + +By default, but can be redefined. + +=back + +=head1 SEE ALSO + +dbm(3), ndbm(3), DB_File(3), L<perldbmfilter> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/AutoLoader.pm b/Master/tlpkg/tlperl.old/lib/AutoLoader.pm new file mode 100644 index 00000000000..4352d8b1fbe --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/AutoLoader.pm @@ -0,0 +1,343 @@ +package AutoLoader; + +use strict; +use 5.006_001; + +our($VERSION, $AUTOLOAD); + +my $is_dosish; +my $is_epoc; +my $is_vms; +my $is_macos; + +BEGIN { + $is_dosish = $^O eq 'dos' || $^O eq 'os2' || $^O eq 'MSWin32' || $^O eq 'NetWare'; + $is_epoc = $^O eq 'epoc'; + $is_vms = $^O eq 'VMS'; + $is_macos = $^O eq 'MacOS'; + $VERSION = '5.60'; +} + +AUTOLOAD { + my $sub = $AUTOLOAD; + my $filename; + # Braces used to preserve $1 et al. + { + # Try to find the autoloaded file from the package-qualified + # name of the sub. e.g., if the sub needed is + # Getopt::Long::GetOptions(), then $INC{Getopt/Long.pm} is + # something like '/usr/lib/perl5/Getopt/Long.pm', and the + # autoload file is '/usr/lib/perl5/auto/Getopt/Long/GetOptions.al'. + # + # However, if @INC is a relative path, this might not work. If, + # for example, @INC = ('lib'), then $INC{Getopt/Long.pm} is + # 'lib/Getopt/Long.pm', and we want to require + # 'auto/Getopt/Long/GetOptions.al' (without the leading 'lib'). + # In this case, we simple prepend the 'auto/' and let the + # C<require> take care of the searching for us. + + my ($pkg,$func) = ($sub =~ /(.*)::([^:]+)$/); + $pkg =~ s#::#/#g; + if (defined($filename = $INC{"$pkg.pm"})) { + if ($is_macos) { + $pkg =~ tr#/#:#; + $filename =~ s#^(.*)$pkg\.pm\z#$1auto:$pkg:$func.al#s; + } else { + $filename =~ s#^(.*)$pkg\.pm\z#$1auto/$pkg/$func.al#s; + } + + # if the file exists, then make sure that it is a + # a fully anchored path (i.e either '/usr/lib/auto/foo/bar.al', + # or './lib/auto/foo/bar.al'. This avoids C<require> searching + # (and failing) to find the 'lib/auto/foo/bar.al' because it + # looked for 'lib/lib/auto/foo/bar.al', given @INC = ('lib'). + + if (-r $filename) { + unless ($filename =~ m|^/|s) { + if ($is_dosish) { + unless ($filename =~ m{^([a-z]:)?[\\/]}is) { + if ($^O ne 'NetWare') { + $filename = "./$filename"; + } else { + $filename = "$filename"; + } + } + } + elsif ($is_epoc) { + unless ($filename =~ m{^([a-z?]:)?[\\/]}is) { + $filename = "./$filename"; + } + } + elsif ($is_vms) { + # XXX todo by VMSmiths + $filename = "./$filename"; + } + elsif (!$is_macos) { + $filename = "./$filename"; + } + } + } + else { + $filename = undef; + } + } + unless (defined $filename) { + # let C<require> do the searching + $filename = "auto/$sub.al"; + $filename =~ s#::#/#g; + } + } + my $save = $@; + local $!; # Do not munge the value. + eval { local $SIG{__DIE__}; require $filename }; + if ($@) { + if (substr($sub,-9) eq '::DESTROY') { + no strict 'refs'; + *$sub = sub {}; + $@ = undef; + } elsif ($@ =~ /^Can't locate/) { + # The load might just have failed because the filename was too + # long for some old SVR3 systems which treat long names as errors. + # If we can successfully truncate a long name then it's worth a go. + # There is a slight risk that we could pick up the wrong file here + # but autosplit should have warned about that when splitting. + if ($filename =~ s/(\w{12,})\.al$/substr($1,0,11).".al"/e){ + eval { local $SIG{__DIE__}; require $filename }; + } + } + if ($@){ + $@ =~ s/ at .*\n//; + my $error = $@; + require Carp; + Carp::croak($error); + } + } + $@ = $save; + goto &$sub; +} + +sub import { + my $pkg = shift; + my $callpkg = caller; + + # + # Export symbols, but not by accident of inheritance. + # + + if ($pkg eq 'AutoLoader') { + no strict 'refs'; + *{ $callpkg . '::AUTOLOAD' } = \&AUTOLOAD + if @_ and $_[0] =~ /^&?AUTOLOAD$/; + } + + # + # Try to find the autosplit index file. Eg., if the call package + # is POSIX, then $INC{POSIX.pm} is something like + # '/usr/local/lib/perl5/POSIX.pm', and the autosplit index file is in + # '/usr/local/lib/perl5/auto/POSIX/autosplit.ix', so we require that. + # + # However, if @INC is a relative path, this might not work. If, + # for example, @INC = ('lib'), then + # $INC{POSIX.pm} is 'lib/POSIX.pm', and we want to require + # 'auto/POSIX/autosplit.ix' (without the leading 'lib'). + # + + (my $calldir = $callpkg) =~ s#::#/#g; + my $path = $INC{$calldir . '.pm'}; + if (defined($path)) { + # Try absolute path name. + if ($is_macos) { + (my $malldir = $calldir) =~ tr#/#:#; + $path =~ s#^(.*)$malldir\.pm\z#$1auto:$malldir:autosplit.ix#s; + } else { + $path =~ s#^(.*)$calldir\.pm\z#$1auto/$calldir/autosplit.ix#; + } + + eval { require $path; }; + # If that failed, try relative path with normal @INC searching. + if ($@) { + $path ="auto/$calldir/autosplit.ix"; + eval { require $path; }; + } + if ($@) { + my $error = $@; + require Carp; + Carp::carp($error); + } + } +} + +sub unimport { + my $callpkg = caller; + + no strict 'refs'; + my $symname = $callpkg . '::AUTOLOAD'; + undef *{ $symname } if \&{ $symname } == \&AUTOLOAD; + *{ $symname } = \&{ $symname }; +} + +1; + +__END__ + +=head1 NAME + +AutoLoader - load subroutines only on demand + +=head1 SYNOPSIS + + package Foo; + use AutoLoader 'AUTOLOAD'; # import the default AUTOLOAD subroutine + + package Bar; + use AutoLoader; # don't import AUTOLOAD, define our own + sub AUTOLOAD { + ... + $AutoLoader::AUTOLOAD = "..."; + goto &AutoLoader::AUTOLOAD; + } + +=head1 DESCRIPTION + +The B<AutoLoader> module works with the B<AutoSplit> module and the +C<__END__> token to defer the loading of some subroutines until they are +used rather than loading them all at once. + +To use B<AutoLoader>, the author of a module has to place the +definitions of subroutines to be autoloaded after an C<__END__> token. +(See L<perldata>.) The B<AutoSplit> module can then be run manually to +extract the definitions into individual files F<auto/funcname.al>. + +B<AutoLoader> implements an AUTOLOAD subroutine. When an undefined +subroutine in is called in a client module of B<AutoLoader>, +B<AutoLoader>'s AUTOLOAD subroutine attempts to locate the subroutine in a +file with a name related to the location of the file from which the +client module was read. As an example, if F<POSIX.pm> is located in +F</usr/local/lib/perl5/POSIX.pm>, B<AutoLoader> will look for perl +subroutines B<POSIX> in F</usr/local/lib/perl5/auto/POSIX/*.al>, where +the C<.al> file has the same name as the subroutine, sans package. If +such a file exists, AUTOLOAD will read and evaluate it, +thus (presumably) defining the needed subroutine. AUTOLOAD will then +C<goto> the newly defined subroutine. + +Once this process completes for a given function, it is defined, so +future calls to the subroutine will bypass the AUTOLOAD mechanism. + +=head2 Subroutine Stubs + +In order for object method lookup and/or prototype checking to operate +correctly even when methods have not yet been defined it is necessary to +"forward declare" each subroutine (as in C<sub NAME;>). See +L<perlsub/"SYNOPSIS">. Such forward declaration creates "subroutine +stubs", which are place holders with no code. + +The AutoSplit and B<AutoLoader> modules automate the creation of forward +declarations. The AutoSplit module creates an 'index' file containing +forward declarations of all the AutoSplit subroutines. When the +AutoLoader module is 'use'd it loads these declarations into its callers +package. + +Because of this mechanism it is important that B<AutoLoader> is always +C<use>d and not C<require>d. + +=head2 Using B<AutoLoader>'s AUTOLOAD Subroutine + +In order to use B<AutoLoader>'s AUTOLOAD subroutine you I<must> +explicitly import it: + + use AutoLoader 'AUTOLOAD'; + +=head2 Overriding B<AutoLoader>'s AUTOLOAD Subroutine + +Some modules, mainly extensions, provide their own AUTOLOAD subroutines. +They typically need to check for some special cases (such as constants) +and then fallback to B<AutoLoader>'s AUTOLOAD for the rest. + +Such modules should I<not> import B<AutoLoader>'s AUTOLOAD subroutine. +Instead, they should define their own AUTOLOAD subroutines along these +lines: + + use AutoLoader; + use Carp; + + sub AUTOLOAD { + my $sub = $AUTOLOAD; + (my $constname = $sub) =~ s/.*:://; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($! != 0) { + if ($! =~ /Invalid/ || $!{EINVAL}) { + $AutoLoader::AUTOLOAD = $sub; + goto &AutoLoader::AUTOLOAD; + } + else { + croak "Your vendor has not defined constant $constname"; + } + } + *$sub = sub { $val }; # same as: eval "sub $sub { $val }"; + goto &$sub; + } + +If any module's own AUTOLOAD subroutine has no need to fallback to the +AutoLoader's AUTOLOAD subroutine (because it doesn't have any AutoSplit +subroutines), then that module should not use B<AutoLoader> at all. + +=head2 Package Lexicals + +Package lexicals declared with C<my> in the main block of a package +using B<AutoLoader> will not be visible to auto-loaded subroutines, due to +the fact that the given scope ends at the C<__END__> marker. A module +using such variables as package globals will not work properly under the +B<AutoLoader>. + +The C<vars> pragma (see L<perlmod/"vars">) may be used in such +situations as an alternative to explicitly qualifying all globals with +the package namespace. Variables pre-declared with this pragma will be +visible to any autoloaded routines (but will not be invisible outside +the package, unfortunately). + +=head2 Not Using AutoLoader + +You can stop using AutoLoader by simply + + no AutoLoader; + +=head2 B<AutoLoader> vs. B<SelfLoader> + +The B<AutoLoader> is similar in purpose to B<SelfLoader>: both delay the +loading of subroutines. + +B<SelfLoader> uses the C<__DATA__> marker rather than C<__END__>. +While this avoids the use of a hierarchy of disk files and the +associated open/close for each routine loaded, B<SelfLoader> suffers a +startup speed disadvantage in the one-time parsing of the lines after +C<__DATA__>, after which routines are cached. B<SelfLoader> can also +handle multiple packages in a file. + +B<AutoLoader> only reads code as it is requested, and in many cases +should be faster, but requires a mechanism like B<AutoSplit> be used to +create the individual files. L<ExtUtils::MakeMaker> will invoke +B<AutoSplit> automatically if B<AutoLoader> is used in a module source +file. + +=head1 CAVEATS + +AutoLoaders prior to Perl 5.002 had a slightly different interface. Any +old modules which use B<AutoLoader> should be changed to the new calling +style. Typically this just means changing a require to a use, adding +the explicit C<'AUTOLOAD'> import if needed, and removing B<AutoLoader> +from C<@ISA>. + +On systems with restrictions on file name length, the file corresponding +to a subroutine may have a shorter name that the routine itself. This +can lead to conflicting file names. The I<AutoSplit> package warns of +these potential conflicts when used to split a module. + +AutoLoader may fail to find the autosplit files (or even find the wrong +ones) in cases where C<@INC> contains relative paths, B<and> the program +does C<chdir>. + +=head1 SEE ALSO + +L<SelfLoader> - an autoloader that doesn't use external files. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/B.pm b/Master/tlpkg/tlperl.old/lib/B.pm new file mode 100644 index 00000000000..12917347cd0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B.pm @@ -0,0 +1,1111 @@ +# B.pm +# +# Copyright (c) 1996, 1997, 1998 Malcolm Beattie +# +# You may distribute under the terms of either the GNU General Public +# License or the Artistic License, as specified in the README file. +# +package B; + +our $VERSION = '1.09_01'; + +use XSLoader (); +require Exporter; +@ISA = qw(Exporter); + +# walkoptree_slow comes from B.pm (you are there), +# walkoptree comes from B.xs +@EXPORT_OK = qw(minus_c ppname save_BEGINs + class peekop cast_I32 cstring cchar hash threadsv_names + main_root main_start main_cv svref_2object opnumber + amagic_generation perlstring + walkoptree_slow walkoptree walkoptree_exec walksymtable + parents comppadlist sv_undef compile_stats timing_info + begin_av init_av check_av end_av regex_padav dowarn + defstash curstash warnhook diehook inc_gv + ); + +sub OPf_KIDS (); +use strict; +@B::SV::ISA = 'B::OBJECT'; +@B::NULL::ISA = 'B::SV'; +@B::PV::ISA = 'B::SV'; +@B::IV::ISA = 'B::SV'; +@B::NV::ISA = 'B::SV'; +@B::RV::ISA = 'B::SV'; +@B::PVIV::ISA = qw(B::PV B::IV); +@B::PVNV::ISA = qw(B::PVIV B::NV); +@B::PVMG::ISA = 'B::PVNV'; +# Change in the inheritance hierarchy post 5.9.0 +@B::PVLV::ISA = $] > 5.009 ? 'B::GV' : 'B::PVMG'; +@B::BM::ISA = 'B::PVMG'; +@B::AV::ISA = 'B::PVMG'; +@B::GV::ISA = 'B::PVMG'; +@B::HV::ISA = 'B::PVMG'; +@B::CV::ISA = 'B::PVMG'; +@B::IO::ISA = 'B::PVMG'; +@B::FM::ISA = 'B::CV'; + +@B::OP::ISA = 'B::OBJECT'; +@B::UNOP::ISA = 'B::OP'; +@B::BINOP::ISA = 'B::UNOP'; +@B::LOGOP::ISA = 'B::UNOP'; +@B::LISTOP::ISA = 'B::BINOP'; +@B::SVOP::ISA = 'B::OP'; +@B::PADOP::ISA = 'B::OP'; +@B::PVOP::ISA = 'B::OP'; +@B::LOOP::ISA = 'B::LISTOP'; +@B::PMOP::ISA = 'B::LISTOP'; +@B::COP::ISA = 'B::OP'; + +@B::SPECIAL::ISA = 'B::OBJECT'; + +{ + # Stop "-w" from complaining about the lack of a real B::OBJECT class + package B::OBJECT; +} + +sub B::GV::SAFENAME { + my $name = (shift())->NAME; + + # The regex below corresponds to the isCONTROLVAR macro + # from toke.c + + $name =~ s/^([\cA-\cZ\c\\c[\c]\c?\c_\c^])/"^". + chr( utf8::unicode_to_native( 64 ^ ord($1) ))/e; + + # When we say unicode_to_native we really mean ascii_to_native, + # which matters iff this is a non-ASCII platform (EBCDIC). + + return $name; +} + +sub B::IV::int_value { + my ($self) = @_; + return (($self->FLAGS() & SVf_IVisUV()) ? $self->UVX : $self->IV); +} + +sub B::NULL::as_string() {""} +sub B::IV::as_string() {goto &B::IV::int_value} +sub B::PV::as_string() {goto &B::PV::PV} + +my $debug; +my $op_count = 0; +my @parents = (); + +sub debug { + my ($class, $value) = @_; + $debug = $value; + walkoptree_debug($value); +} + +sub class { + my $obj = shift; + my $name = ref $obj; + $name =~ s/^.*:://; + return $name; +} + +sub parents { \@parents } + +# For debugging +sub peekop { + my $op = shift; + return sprintf("%s (0x%x) %s", class($op), $$op, $op->name); +} + +sub walkoptree_slow { + my($op, $method, $level) = @_; + $op_count++; # just for statistics + $level ||= 0; + warn(sprintf("walkoptree: %d. %s\n", $level, peekop($op))) if $debug; + $op->$method($level); + if ($$op && ($op->flags & OPf_KIDS)) { + my $kid; + unshift(@parents, $op); + for ($kid = $op->first; $$kid; $kid = $kid->sibling) { + walkoptree_slow($kid, $method, $level + 1); + } + shift @parents; + } + if (class($op) eq 'PMOP' && ref($op->pmreplroot) && ${$op->pmreplroot}) { + unshift(@parents, $op); + walkoptree_slow($op->pmreplroot, $method, $level + 1); + shift @parents; + } +} + +sub compile_stats { + return "Total number of OPs processed: $op_count\n"; +} + +sub timing_info { + my ($sec, $min, $hr) = localtime; + my ($user, $sys) = times; + sprintf("%02d:%02d:%02d user=$user sys=$sys", + $hr, $min, $sec, $user, $sys); +} + +my %symtable; + +sub clearsym { + %symtable = (); +} + +sub savesym { + my ($obj, $value) = @_; +# warn(sprintf("savesym: sym_%x => %s\n", $$obj, $value)); # debug + $symtable{sprintf("sym_%x", $$obj)} = $value; +} + +sub objsym { + my $obj = shift; + return $symtable{sprintf("sym_%x", $$obj)}; +} + +sub walkoptree_exec { + my ($op, $method, $level) = @_; + $level ||= 0; + my ($sym, $ppname); + my $prefix = " " x $level; + for (; $$op; $op = $op->next) { + $sym = objsym($op); + if (defined($sym)) { + print $prefix, "goto $sym\n"; + return; + } + savesym($op, sprintf("%s (0x%lx)", class($op), $$op)); + $op->$method($level); + $ppname = $op->name; + if ($ppname =~ + /^(d?or(assign)?|and(assign)?|mapwhile|grepwhile|entertry|range|cond_expr)$/) + { + print $prefix, uc($1), " => {\n"; + walkoptree_exec($op->other, $method, $level + 1); + print $prefix, "}\n"; + } elsif ($ppname eq "match" || $ppname eq "subst") { + my $pmreplstart = $op->pmreplstart; + if ($$pmreplstart) { + print $prefix, "PMREPLSTART => {\n"; + walkoptree_exec($pmreplstart, $method, $level + 1); + print $prefix, "}\n"; + } + } elsif ($ppname eq "substcont") { + print $prefix, "SUBSTCONT => {\n"; + walkoptree_exec($op->other->pmreplstart, $method, $level + 1); + print $prefix, "}\n"; + $op = $op->other; + } elsif ($ppname eq "enterloop") { + print $prefix, "REDO => {\n"; + walkoptree_exec($op->redoop, $method, $level + 1); + print $prefix, "}\n", $prefix, "NEXT => {\n"; + walkoptree_exec($op->nextop, $method, $level + 1); + print $prefix, "}\n", $prefix, "LAST => {\n"; + walkoptree_exec($op->lastop, $method, $level + 1); + print $prefix, "}\n"; + } elsif ($ppname eq "subst") { + my $replstart = $op->pmreplstart; + if ($$replstart) { + print $prefix, "SUBST => {\n"; + walkoptree_exec($replstart, $method, $level + 1); + print $prefix, "}\n"; + } + } + } +} + +sub walksymtable { + my ($symref, $method, $recurse, $prefix) = @_; + my $sym; + my $ref; + my $fullname; + no strict 'refs'; + $prefix = '' unless defined $prefix; + while (($sym, $ref) = each %$symref) { + $fullname = "*main::".$prefix.$sym; + if ($sym =~ /::$/) { + $sym = $prefix . $sym; + if ($sym ne "main::" && $sym ne "<none>::" && &$recurse($sym)) { + walksymtable(\%$fullname, $method, $recurse, $sym); + } + } else { + svref_2object(\*$fullname)->$method(); + } + } +} + +{ + package B::Section; + my $output_fh; + my %sections; + + sub new { + my ($class, $section, $symtable, $default) = @_; + $output_fh ||= FileHandle->new_tmpfile; + my $obj = bless [-1, $section, $symtable, $default], $class; + $sections{$section} = $obj; + return $obj; + } + + sub get { + my ($class, $section) = @_; + return $sections{$section}; + } + + sub add { + my $section = shift; + while (defined($_ = shift)) { + print $output_fh "$section->[1]\t$_\n"; + $section->[0]++; + } + } + + sub index { + my $section = shift; + return $section->[0]; + } + + sub name { + my $section = shift; + return $section->[1]; + } + + sub symtable { + my $section = shift; + return $section->[2]; + } + + sub default { + my $section = shift; + return $section->[3]; + } + + sub output { + my ($section, $fh, $format) = @_; + my $name = $section->name; + my $sym = $section->symtable || {}; + my $default = $section->default; + + seek($output_fh, 0, 0); + while (<$output_fh>) { + chomp; + s/^(.*?)\t//; + if ($1 eq $name) { + s{(s\\_[0-9a-f]+)} { + exists($sym->{$1}) ? $sym->{$1} : $default; + }ge; + printf $fh $format, $_; + } + } + } +} + +XSLoader::load 'B'; + +1; + +__END__ + +=head1 NAME + +B - The Perl Compiler + +=head1 SYNOPSIS + + use B; + +=head1 DESCRIPTION + +The C<B> module supplies classes which allow a Perl program to delve +into its own innards. It is the module used to implement the +"backends" of the Perl compiler. Usage of the compiler does not +require knowledge of this module: see the F<O> module for the +user-visible part. The C<B> module is of use to those who want to +write new compiler backends. This documentation assumes that the +reader knows a fair amount about perl's internals including such +things as SVs, OPs and the internal symbol table and syntax tree +of a program. + +=head1 OVERVIEW + +The C<B> module contains a set of utility functions for querying the +current state of the Perl interpreter; typically these functions +return objects from the B::SV and B::OP classes, or their derived +classes. These classes in turn define methods for querying the +resulting objects about their own internal state. + +=head1 Utility Functions + +The C<B> module exports a variety of functions: some are simple +utility functions, others provide a Perl program with a way to +get an initial "handle" on an internal object. + +=head2 Functions Returning C<B::SV>, C<B::AV>, C<B::HV>, and C<B::CV> objects + +For descriptions of the class hierarchy of these objects and the +methods that can be called on them, see below, L<"OVERVIEW OF +CLASSES"> and L<"SV-RELATED CLASSES">. + +=over 4 + +=item sv_undef + +Returns the SV object corresponding to the C variable C<sv_undef>. + +=item sv_yes + +Returns the SV object corresponding to the C variable C<sv_yes>. + +=item sv_no + +Returns the SV object corresponding to the C variable C<sv_no>. + +=item svref_2object(SVREF) + +Takes a reference to any Perl value, and turns the referred-to value +into an object in the appropriate B::OP-derived or B::SV-derived +class. Apart from functions such as C<main_root>, this is the primary +way to get an initial "handle" on an internal perl data structure +which can then be followed with the other access methods. + +The returned object will only be valid as long as the underlying OPs +and SVs continue to exist. Do not attempt to use the object after the +underlying structures are freed. + +=item amagic_generation + +Returns the SV object corresponding to the C variable C<amagic_generation>. + +=item init_av + +Returns the AV object (i.e. in class B::AV) representing INIT blocks. + +=item check_av + +Returns the AV object (i.e. in class B::AV) representing CHECK blocks. + +=item begin_av + +Returns the AV object (i.e. in class B::AV) representing BEGIN blocks. + +=item end_av + +Returns the AV object (i.e. in class B::AV) representing END blocks. + +=item comppadlist + +Returns the AV object (i.e. in class B::AV) of the global comppadlist. + +=item regex_padav + +Only when perl was compiled with ithreads. + +=item main_cv + +Return the (faked) CV corresponding to the main part of the Perl +program. + +=back + +=head2 Functions for Examining the Symbol Table + +=over 4 + +=item walksymtable(SYMREF, METHOD, RECURSE, PREFIX) + +Walk the symbol table starting at SYMREF and call METHOD on each +symbol (a B::GV object) visited. When the walk reaches package +symbols (such as "Foo::") it invokes RECURSE, passing in the symbol +name, and only recurses into the package if that sub returns true. + +PREFIX is the name of the SYMREF you're walking. + +For example: + + # Walk CGI's symbol table calling print_subs on each symbol. + # Recurse only into CGI::Util:: + walksymtable(\%CGI::, 'print_subs', sub { $_[0] eq 'CGI::Util::' }, + 'CGI::'); + +print_subs() is a B::GV method you have declared. Also see L<"B::GV +Methods">, below. + +=back + +=head2 Functions Returning C<B::OP> objects or for walking op trees + +For descriptions of the class hierarchy of these objects and the +methods that can be called on them, see below, L<"OVERVIEW OF +CLASSES"> and L<"OP-RELATED CLASSES">. + +=over 4 + +=item main_root + +Returns the root op (i.e. an object in the appropriate B::OP-derived +class) of the main part of the Perl program. + +=item main_start + +Returns the starting op of the main part of the Perl program. + +=item walkoptree(OP, METHOD) + +Does a tree-walk of the syntax tree based at OP and calls METHOD on +each op it visits. Each node is visited before its children. If +C<walkoptree_debug> (see below) has been called to turn debugging on then +the method C<walkoptree_debug> is called on each op before METHOD is +called. + +=item walkoptree_debug(DEBUG) + +Returns the current debugging flag for C<walkoptree>. If the optional +DEBUG argument is non-zero, it sets the debugging flag to that. See +the description of C<walkoptree> above for what the debugging flag +does. + +=back + +=head2 Miscellaneous Utility Functions + +=over 4 + +=item ppname(OPNUM) + +Return the PP function name (e.g. "pp_add") of op number OPNUM. + +=item hash(STR) + +Returns a string in the form "0x..." representing the value of the +internal hash function used by perl on string STR. + +=item cast_I32(I) + +Casts I to the internal I32 type used by that perl. + +=item minus_c + +Does the equivalent of the C<-c> command-line option. Obviously, this +is only useful in a BEGIN block or else the flag is set too late. + +=item cstring(STR) + +Returns a double-quote-surrounded escaped version of STR which can +be used as a string in C source code. + +=item perlstring(STR) + +Returns a double-quote-surrounded escaped version of STR which can +be used as a string in Perl source code. + +=item class(OBJ) + +Returns the class of an object without the part of the classname +preceding the first C<"::">. This is used to turn C<"B::UNOP"> into +C<"UNOP"> for example. + +=item threadsv_names + +In a perl compiled for threads, this returns a list of the special +per-thread threadsv variables. + +=back + + + + +=head1 OVERVIEW OF CLASSES + +The C structures used by Perl's internals to hold SV and OP +information (PVIV, AV, HV, ..., OP, SVOP, UNOP, ...) are modelled on a +class hierarchy and the C<B> module gives access to them via a true +object hierarchy. Structure fields which point to other objects +(whether types of SV or types of OP) are represented by the C<B> +module as Perl objects of the appropriate class. + +The bulk of the C<B> module is the methods for accessing fields of +these structures. + +Note that all access is read-only. You cannot modify the internals by +using this module. Also, note that the B::OP and B::SV objects created +by this module are only valid for as long as the underlying objects +exist; their creation doesn't increase the reference counts of the +underlying objects. Trying to access the fields of a freed object will +give incomprehensible results, or worse. + +=head2 SV-RELATED CLASSES + +B::IV, B::NV, B::RV, B::PV, B::PVIV, B::PVNV, B::PVMG, B::BM, B::PVLV, +B::AV, B::HV, B::CV, B::GV, B::FM, B::IO. These classes correspond in +the obvious way to the underlying C structures of similar names. The +inheritance hierarchy mimics the underlying C "inheritance". For 5.9.1 +and later this is: + + B::SV + | + +--------------+----------+------------+ + | | | | + B::PV B::IV B::NV B::RV + \ / / + \ / / + B::PVIV / + \ / + \ / + \ / + B::PVNV + | + | + B::PVMG + | + +-----+----+------+-----+-----+ + | | | | | | + B::BM B::AV B::GV B::HV B::CV B::IO + | | + B::PVLV | + B::FM + + +For 5.9.0 and earlier, PVLV is a direct subclass of PVMG, so the base +of this diagram is + + | + B::PVMG + | + +------+-----+----+------+-----+-----+ + | | | | | | | + B::PVLV B::BM B::AV B::GV B::HV B::CV B::IO + | + | + B::FM + + +Access methods correspond to the underlying C macros for field access, +usually with the leading "class indication" prefix removed (Sv, Av, +Hv, ...). The leading prefix is only left in cases where its removal +would cause a clash in method name. For example, C<GvREFCNT> stays +as-is since its abbreviation would clash with the "superclass" method +C<REFCNT> (corresponding to the C function C<SvREFCNT>). + +=head2 B::SV Methods + +=over 4 + +=item REFCNT + +=item FLAGS + +=item object_2svref + +Returns a reference to the regular scalar corresponding to this +B::SV object. In other words, this method is the inverse operation +to the svref_2object() subroutine. This scalar and other data it points +at should be considered read-only: modifying them is neither safe nor +guaranteed to have a sensible effect. + +=back + +=head2 B::IV Methods + +=over 4 + +=item IV + +Returns the value of the IV, I<interpreted as +a signed integer>. This will be misleading +if C<FLAGS & SVf_IVisUV>. Perhaps you want the +C<int_value> method instead? + +=item IVX + +=item UVX + +=item int_value + +This method returns the value of the IV as an integer. +It differs from C<IV> in that it returns the correct +value regardless of whether it's stored signed or +unsigned. + +=item needs64bits + +=item packiv + +=back + +=head2 B::NV Methods + +=over 4 + +=item NV + +=item NVX + +=back + +=head2 B::RV Methods + +=over 4 + +=item RV + +=back + +=head2 B::PV Methods + +=over 4 + +=item PV + +This method is the one you usually want. It constructs a +string using the length and offset information in the struct: +for ordinary scalars it will return the string that you'd see +from Perl, even if it contains null characters. + +=item RV + +Same as B::RV::RV, except that it will die() if the PV isn't +a reference. + +=item PVX + +This method is less often useful. It assumes that the string +stored in the struct is null-terminated, and disregards the +length information. + +It is the appropriate method to use if you need to get the name +of a lexical variable from a padname array. Lexical variable names +are always stored with a null terminator, and the length field +(SvCUR) is overloaded for other purposes and can't be relied on here. + +=back + +=head2 B::PVMG Methods + +=over 4 + +=item MAGIC + +=item SvSTASH + +=back + +=head2 B::MAGIC Methods + +=over 4 + +=item MOREMAGIC + +=item precomp + +Only valid on r-magic, returns the string that generated the regexp. + +=item PRIVATE + +=item TYPE + +=item FLAGS + +=item OBJ + +Will die() if called on r-magic. + +=item PTR + +=item REGEX + +Only valid on r-magic, returns the integer value of the REGEX stored +in the MAGIC. + +=back + +=head2 B::PVLV Methods + +=over 4 + +=item TARGOFF + +=item TARGLEN + +=item TYPE + +=item TARG + +=back + +=head2 B::BM Methods + +=over 4 + +=item USEFUL + +=item PREVIOUS + +=item RARE + +=item TABLE + +=back + +=head2 B::GV Methods + +=over 4 + +=item is_empty + +This method returns TRUE if the GP field of the GV is NULL. + +=item NAME + +=item SAFENAME + +This method returns the name of the glob, but if the first +character of the name is a control character, then it converts +it to ^X first, so that *^G would return "^G" rather than "\cG". + +It's useful if you want to print out the name of a variable. +If you restrict yourself to globs which exist at compile-time +then the result ought to be unambiguous, because code like +C<${"^G"} = 1> is compiled as two ops - a constant string and +a dereference (rv2gv) - so that the glob is created at runtime. + +If you're working with globs at runtime, and need to disambiguate +*^G from *{"^G"}, then you should use the raw NAME method. + +=item STASH + +=item SV + +=item IO + +=item FORM + +=item AV + +=item HV + +=item EGV + +=item CV + +=item CVGEN + +=item LINE + +=item FILE + +=item FILEGV + +=item GvREFCNT + +=item FLAGS + +=back + +=head2 B::IO Methods + +=over 4 + +=item LINES + +=item PAGE + +=item PAGE_LEN + +=item LINES_LEFT + +=item TOP_NAME + +=item TOP_GV + +=item FMT_NAME + +=item FMT_GV + +=item BOTTOM_NAME + +=item BOTTOM_GV + +=item SUBPROCESS + +=item IoTYPE + +=item IoFLAGS + +=item IsSTD + +Takes one arguments ( 'stdin' | 'stdout' | 'stderr' ) and returns true +if the IoIFP of the object is equal to the handle whose name was +passed as argument ( i.e. $io->IsSTD('stderr') is true if +IoIFP($io) == PerlIO_stdin() ). + +=back + +=head2 B::AV Methods + +=over 4 + +=item FILL + +=item MAX + +=item OFF + +=item ARRAY + +=item ARRAYelt + +Like C<ARRAY>, but takes an index as an argument to get only one element, +rather than a list of all of them. + +=item AvFLAGS + +=back + +=head2 B::CV Methods + +=over 4 + +=item STASH + +=item START + +=item ROOT + +=item GV + +=item FILE + +=item DEPTH + +=item PADLIST + +=item OUTSIDE + +=item OUTSIDE_SEQ + +=item XSUB + +=item XSUBANY + +For constant subroutines, returns the constant SV returned by the subroutine. + +=item CvFLAGS + +=item const_sv + +=back + +=head2 B::HV Methods + +=over 4 + +=item FILL + +=item MAX + +=item KEYS + +=item RITER + +=item NAME + +=item PMROOT + +=item ARRAY + +=back + +=head2 OP-RELATED CLASSES + +C<B::OP>, C<B::UNOP>, C<B::BINOP>, C<B::LOGOP>, C<B::LISTOP>, C<B::PMOP>, +C<B::SVOP>, C<B::PADOP>, C<B::PVOP>, C<B::LOOP>, C<B::COP>. + +These classes correspond in the obvious way to the underlying C +structures of similar names. The inheritance hierarchy mimics the +underlying C "inheritance": + + B::OP + | + +---------------+--------+--------+ + | | | | + B::UNOP B::SVOP B::PADOP B::COP + ,' `-. + / `--. + B::BINOP B::LOGOP + | + | + B::LISTOP + ,' `. + / \ + B::LOOP B::PMOP + +Access methods correspond to the underlying C structre field names, +with the leading "class indication" prefix (C<"op_">) removed. + +=head2 B::OP Methods + +These methods get the values of similarly named fields within the OP +data structure. See top of C<op.h> for more info. + +=over 4 + +=item next + +=item sibling + +=item name + +This returns the op name as a string (e.g. "add", "rv2av"). + +=item ppaddr + +This returns the function name as a string (e.g. "PL_ppaddr[OP_ADD]", +"PL_ppaddr[OP_RV2AV]"). + +=item desc + +This returns the op description from the global C PL_op_desc array +(e.g. "addition" "array deref"). + +=item targ + +=item type + +=item opt + +=item static + +=item flags + +=item private + +=item spare + +=back + +=head2 B::UNOP METHOD + +=over 4 + +=item first + +=back + +=head2 B::BINOP METHOD + +=over 4 + +=item last + +=back + +=head2 B::LOGOP METHOD + +=over 4 + +=item other + +=back + +=head2 B::LISTOP METHOD + +=over 4 + +=item children + +=back + +=head2 B::PMOP Methods + +=over 4 + +=item pmreplroot + +=item pmreplstart + +=item pmnext + +=item pmregexp + +=item pmflags + +=item pmdynflags + +=item pmpermflags + +=item precomp + +=item pmoffset + +Only when perl was compiled with ithreads. + +=back + +=head2 B::SVOP METHOD + +=over 4 + +=item sv + +=item gv + +=back + +=head2 B::PADOP METHOD + +=over 4 + +=item padix + +=back + +=head2 B::PVOP METHOD + +=over 4 + +=item pv + +=back + +=head2 B::LOOP Methods + +=over 4 + +=item redoop + +=item nextop + +=item lastop + +=back + +=head2 B::COP Methods + +=over 4 + +=item label + +=item stash + +=item stashpv + +=item file + +=item cop_seq + +=item arybase + +=item line + +=item warnings + +=item io + +=back + + +=head1 AUTHOR + +Malcolm Beattie, C<mbeattie@sable.ox.ac.uk> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/B/Asmdata.pm b/Master/tlpkg/tlperl.old/lib/B/Asmdata.pm new file mode 100644 index 00000000000..9e41d6dd757 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/Asmdata.pm @@ -0,0 +1,250 @@ +# -#- buffer-read-only: t -#- +# +# Copyright (c) 1996-1999 Malcolm Beattie +# +# You may distribute under the terms of either the GNU General Public +# License or the Artistic License, as specified in the README file. +# +# +# +# This file is autogenerated from bytecode.pl. Changes made here will be lost. +# +package B::Asmdata; + +our $VERSION = '1.01'; + +use Exporter; +@ISA = qw(Exporter); +@EXPORT_OK = qw(%insn_data @insn_name @optype @specialsv_name); +our(%insn_data, @insn_name, @optype, @specialsv_name); + +@optype = qw(OP UNOP BINOP LOGOP LISTOP PMOP SVOP PADOP PVOP LOOP COP); +@specialsv_name = qw(Nullsv &PL_sv_undef &PL_sv_yes &PL_sv_no pWARN_ALL pWARN_NONE); + +# XXX insn_data is initialised this way because with a large +# %insn_data = (foo => [...], bar => [...], ...) initialiser +# I get a hard-to-track-down stack underflow and segfault. +$insn_data{comment} = [35, \&PUT_comment_t, "GET_comment_t"]; +$insn_data{nop} = [10, \&PUT_none, "GET_none"]; +$insn_data{ret} = [0, \&PUT_none, "GET_none"]; +$insn_data{ldsv} = [1, \&PUT_svindex, "GET_svindex"]; +$insn_data{ldop} = [2, \&PUT_opindex, "GET_opindex"]; +$insn_data{stsv} = [3, \&PUT_U32, "GET_U32"]; +$insn_data{stop} = [4, \&PUT_U32, "GET_U32"]; +$insn_data{stpv} = [5, \&PUT_U32, "GET_U32"]; +$insn_data{ldspecsv} = [6, \&PUT_U8, "GET_U8"]; +$insn_data{ldspecsvx} = [7, \&PUT_U8, "GET_U8"]; +$insn_data{newsv} = [8, \&PUT_U8, "GET_U8"]; +$insn_data{newsvx} = [9, \&PUT_U32, "GET_U32"]; +$insn_data{newop} = [11, \&PUT_U8, "GET_U8"]; +$insn_data{newopx} = [12, \&PUT_U16, "GET_U16"]; +$insn_data{newopn} = [13, \&PUT_U8, "GET_U8"]; +$insn_data{newpv} = [14, \&PUT_PV, "GET_PV"]; +$insn_data{pv_cur} = [15, \&PUT_PADOFFSET, "GET_PADOFFSET"]; +$insn_data{pv_free} = [16, \&PUT_none, "GET_none"]; +$insn_data{sv_upgrade} = [17, \&PUT_U8, "GET_U8"]; +$insn_data{sv_refcnt} = [18, \&PUT_U32, "GET_U32"]; +$insn_data{sv_refcnt_add} = [19, \&PUT_I32, "GET_I32"]; +$insn_data{sv_flags} = [20, \&PUT_U32, "GET_U32"]; +$insn_data{xrv} = [21, \&PUT_svindex, "GET_svindex"]; +$insn_data{xpv} = [22, \&PUT_none, "GET_none"]; +$insn_data{xpv_cur} = [23, \&PUT_PADOFFSET, "GET_PADOFFSET"]; +$insn_data{xpv_len} = [24, \&PUT_PADOFFSET, "GET_PADOFFSET"]; +$insn_data{xiv} = [25, \&PUT_IV, "GET_IV"]; +$insn_data{xnv} = [26, \&PUT_NV, "GET_NV"]; +$insn_data{xlv_targoff} = [27, \&PUT_PADOFFSET, "GET_PADOFFSET"]; +$insn_data{xlv_targlen} = [28, \&PUT_PADOFFSET, "GET_PADOFFSET"]; +$insn_data{xlv_targ} = [29, \&PUT_svindex, "GET_svindex"]; +$insn_data{xlv_type} = [30, \&PUT_U8, "GET_U8"]; +$insn_data{xbm_useful} = [31, \&PUT_I32, "GET_I32"]; +$insn_data{xbm_previous} = [32, \&PUT_U16, "GET_U16"]; +$insn_data{xbm_rare} = [33, \&PUT_U8, "GET_U8"]; +$insn_data{xfm_lines} = [34, \&PUT_IV, "GET_IV"]; +$insn_data{xio_lines} = [36, \&PUT_IV, "GET_IV"]; +$insn_data{xio_page} = [37, \&PUT_IV, "GET_IV"]; +$insn_data{xio_page_len} = [38, \&PUT_IV, "GET_IV"]; +$insn_data{xio_lines_left} = [39, \&PUT_IV, "GET_IV"]; +$insn_data{xio_top_name} = [40, \&PUT_pvindex, "GET_pvindex"]; +$insn_data{xio_top_gv} = [41, \&PUT_svindex, "GET_svindex"]; +$insn_data{xio_fmt_name} = [42, \&PUT_pvindex, "GET_pvindex"]; +$insn_data{xio_fmt_gv} = [43, \&PUT_svindex, "GET_svindex"]; +$insn_data{xio_bottom_name} = [44, \&PUT_pvindex, "GET_pvindex"]; +$insn_data{xio_bottom_gv} = [45, \&PUT_svindex, "GET_svindex"]; +$insn_data{xio_subprocess} = [46, \&PUT_U16, "GET_U16"]; +$insn_data{xio_type} = [47, \&PUT_U8, "GET_U8"]; +$insn_data{xio_flags} = [48, \&PUT_U8, "GET_U8"]; +$insn_data{xcv_xsubany} = [49, \&PUT_svindex, "GET_svindex"]; +$insn_data{xcv_stash} = [50, \&PUT_svindex, "GET_svindex"]; +$insn_data{xcv_start} = [51, \&PUT_opindex, "GET_opindex"]; +$insn_data{xcv_root} = [52, \&PUT_opindex, "GET_opindex"]; +$insn_data{xcv_gv} = [53, \&PUT_svindex, "GET_svindex"]; +$insn_data{xcv_file} = [54, \&PUT_pvindex, "GET_pvindex"]; +$insn_data{xcv_depth} = [55, \&PUT_long, "GET_long"]; +$insn_data{xcv_padlist} = [56, \&PUT_svindex, "GET_svindex"]; +$insn_data{xcv_outside} = [57, \&PUT_svindex, "GET_svindex"]; +$insn_data{xcv_outside_seq} = [58, \&PUT_U32, "GET_U32"]; +$insn_data{xcv_flags} = [59, \&PUT_U16, "GET_U16"]; +$insn_data{av_extend} = [60, \&PUT_PADOFFSET, "GET_PADOFFSET"]; +$insn_data{av_pushx} = [61, \&PUT_svindex, "GET_svindex"]; +$insn_data{av_push} = [62, \&PUT_svindex, "GET_svindex"]; +$insn_data{xav_fill} = [63, \&PUT_PADOFFSET, "GET_PADOFFSET"]; +$insn_data{xav_max} = [64, \&PUT_PADOFFSET, "GET_PADOFFSET"]; +$insn_data{xav_flags} = [65, \&PUT_U8, "GET_U8"]; +$insn_data{xhv_riter} = [66, \&PUT_I32, "GET_I32"]; +$insn_data{xhv_name} = [67, \&PUT_pvindex, "GET_pvindex"]; +$insn_data{xhv_pmroot} = [68, \&PUT_opindex, "GET_opindex"]; +$insn_data{hv_store} = [69, \&PUT_svindex, "GET_svindex"]; +$insn_data{sv_magic} = [70, \&PUT_U8, "GET_U8"]; +$insn_data{mg_obj} = [71, \&PUT_svindex, "GET_svindex"]; +$insn_data{mg_private} = [72, \&PUT_U16, "GET_U16"]; +$insn_data{mg_flags} = [73, \&PUT_U8, "GET_U8"]; +$insn_data{mg_name} = [74, \&PUT_pvcontents, "GET_pvcontents"]; +$insn_data{mg_namex} = [75, \&PUT_svindex, "GET_svindex"]; +$insn_data{xmg_stash} = [76, \&PUT_svindex, "GET_svindex"]; +$insn_data{gv_fetchpv} = [77, \&PUT_strconst, "GET_strconst"]; +$insn_data{gv_fetchpvx} = [78, \&PUT_strconst, "GET_strconst"]; +$insn_data{gv_stashpv} = [79, \&PUT_strconst, "GET_strconst"]; +$insn_data{gv_stashpvx} = [80, \&PUT_strconst, "GET_strconst"]; +$insn_data{gp_sv} = [81, \&PUT_svindex, "GET_svindex"]; +$insn_data{gp_refcnt} = [82, \&PUT_U32, "GET_U32"]; +$insn_data{gp_refcnt_add} = [83, \&PUT_I32, "GET_I32"]; +$insn_data{gp_av} = [84, \&PUT_svindex, "GET_svindex"]; +$insn_data{gp_hv} = [85, \&PUT_svindex, "GET_svindex"]; +$insn_data{gp_cv} = [86, \&PUT_svindex, "GET_svindex"]; +$insn_data{gp_file} = [87, \&PUT_pvindex, "GET_pvindex"]; +$insn_data{gp_io} = [88, \&PUT_svindex, "GET_svindex"]; +$insn_data{gp_form} = [89, \&PUT_svindex, "GET_svindex"]; +$insn_data{gp_cvgen} = [90, \&PUT_U32, "GET_U32"]; +$insn_data{gp_line} = [91, \&PUT_U32, "GET_U32"]; +$insn_data{gp_share} = [92, \&PUT_svindex, "GET_svindex"]; +$insn_data{xgv_flags} = [93, \&PUT_U8, "GET_U8"]; +$insn_data{op_next} = [94, \&PUT_opindex, "GET_opindex"]; +$insn_data{op_sibling} = [95, \&PUT_opindex, "GET_opindex"]; +$insn_data{op_ppaddr} = [96, \&PUT_strconst, "GET_strconst"]; +$insn_data{op_targ} = [97, \&PUT_PADOFFSET, "GET_PADOFFSET"]; +$insn_data{op_type} = [98, \&PUT_U16, "GET_U16"]; +$insn_data{op_seq} = [99, \&PUT_U16, "GET_U16"]; +$insn_data{op_flags} = [100, \&PUT_U8, "GET_U8"]; +$insn_data{op_private} = [101, \&PUT_U8, "GET_U8"]; +$insn_data{op_first} = [102, \&PUT_opindex, "GET_opindex"]; +$insn_data{op_last} = [103, \&PUT_opindex, "GET_opindex"]; +$insn_data{op_other} = [104, \&PUT_opindex, "GET_opindex"]; +$insn_data{op_pmreplroot} = [105, \&PUT_opindex, "GET_opindex"]; +$insn_data{op_pmreplstart} = [106, \&PUT_opindex, "GET_opindex"]; +$insn_data{op_pmnext} = [107, \&PUT_opindex, "GET_opindex"]; +$insn_data{op_pmstashpv} = [108, \&PUT_pvindex, "GET_pvindex"]; +$insn_data{op_pmreplrootpo} = [109, \&PUT_PADOFFSET, "GET_PADOFFSET"]; +$insn_data{op_pmstash} = [110, \&PUT_svindex, "GET_svindex"]; +$insn_data{op_pmreplrootgv} = [111, \&PUT_svindex, "GET_svindex"]; +$insn_data{pregcomp} = [112, \&PUT_pvcontents, "GET_pvcontents"]; +$insn_data{op_pmflags} = [113, \&PUT_U16, "GET_U16"]; +$insn_data{op_pmpermflags} = [114, \&PUT_U16, "GET_U16"]; +$insn_data{op_pmdynflags} = [115, \&PUT_U8, "GET_U8"]; +$insn_data{op_sv} = [116, \&PUT_svindex, "GET_svindex"]; +$insn_data{op_padix} = [117, \&PUT_PADOFFSET, "GET_PADOFFSET"]; +$insn_data{op_pv} = [118, \&PUT_pvcontents, "GET_pvcontents"]; +$insn_data{op_pv_tr} = [119, \&PUT_op_tr_array, "GET_op_tr_array"]; +$insn_data{op_redoop} = [120, \&PUT_opindex, "GET_opindex"]; +$insn_data{op_nextop} = [121, \&PUT_opindex, "GET_opindex"]; +$insn_data{op_lastop} = [122, \&PUT_opindex, "GET_opindex"]; +$insn_data{cop_label} = [123, \&PUT_pvindex, "GET_pvindex"]; +$insn_data{cop_stashpv} = [124, \&PUT_pvindex, "GET_pvindex"]; +$insn_data{cop_file} = [125, \&PUT_pvindex, "GET_pvindex"]; +$insn_data{cop_stash} = [126, \&PUT_svindex, "GET_svindex"]; +$insn_data{cop_filegv} = [127, \&PUT_svindex, "GET_svindex"]; +$insn_data{cop_seq} = [128, \&PUT_U32, "GET_U32"]; +$insn_data{cop_arybase} = [129, \&PUT_I32, "GET_I32"]; +$insn_data{cop_line} = [130, \&PUT_U32, "GET_U32"]; +$insn_data{cop_io} = [131, \&PUT_svindex, "GET_svindex"]; +$insn_data{cop_warnings} = [132, \&PUT_svindex, "GET_svindex"]; +$insn_data{main_start} = [133, \&PUT_opindex, "GET_opindex"]; +$insn_data{main_root} = [134, \&PUT_opindex, "GET_opindex"]; +$insn_data{main_cv} = [135, \&PUT_svindex, "GET_svindex"]; +$insn_data{curpad} = [136, \&PUT_svindex, "GET_svindex"]; +$insn_data{push_begin} = [137, \&PUT_svindex, "GET_svindex"]; +$insn_data{push_init} = [138, \&PUT_svindex, "GET_svindex"]; +$insn_data{push_end} = [139, \&PUT_svindex, "GET_svindex"]; +$insn_data{curstash} = [140, \&PUT_svindex, "GET_svindex"]; +$insn_data{defstash} = [141, \&PUT_svindex, "GET_svindex"]; +$insn_data{data} = [142, \&PUT_U8, "GET_U8"]; +$insn_data{incav} = [143, \&PUT_svindex, "GET_svindex"]; +$insn_data{load_glob} = [144, \&PUT_svindex, "GET_svindex"]; +$insn_data{regex_padav} = [145, \&PUT_svindex, "GET_svindex"]; +$insn_data{dowarn} = [146, \&PUT_U8, "GET_U8"]; +$insn_data{comppad_name} = [147, \&PUT_svindex, "GET_svindex"]; +$insn_data{xgv_stash} = [148, \&PUT_svindex, "GET_svindex"]; +$insn_data{signal} = [149, \&PUT_strconst, "GET_strconst"]; +$insn_data{formfeed} = [150, \&PUT_svindex, "GET_svindex"]; + +my ($insn_name, $insn_data); +while (($insn_name, $insn_data) = each %insn_data) { + $insn_name[$insn_data->[0]] = $insn_name; +} +# Fill in any gaps +@insn_name = map($_ || "unused", @insn_name); + +1; + +__END__ + +=head1 NAME + +B::Asmdata - Autogenerated data about Perl ops, used to generate bytecode + +=head1 SYNOPSIS + + use B::Asmdata qw(%insn_data @insn_name @optype @specialsv_name); + +=head1 DESCRIPTION + +Provides information about Perl ops in order to generate bytecode via +a bunch of exported variables. Its mostly used by B::Assembler and +B::Disassembler. + +=over 4 + +=item %insn_data + + my($bytecode_num, $put_sub, $get_meth) = @$insn_data{$op_name}; + +For a given $op_name (for example, 'cop_label', 'sv_flags', etc...) +you get an array ref containing the bytecode number of the op, a +reference to the subroutine used to 'PUT', and the name of the method +used to 'GET'. + +=for _private +Add more detail about what $put_sub and $get_meth are and how to use them. + +=item @insn_name + + my $op_name = $insn_name[$bytecode_num]; + +A simple mapping of the bytecode number to the name of the op. +Suitable for using with %insn_data like so: + + my $op_info = $insn_data{$insn_name[$bytecode_num]}; + +=item @optype + + my $op_type = $optype[$op_type_num]; + +A simple mapping of the op type number to its type (like 'COP' or 'BINOP'). + +=item @specialsv_name + + my $sv_name = $specialsv_name[$sv_index]; + +Certain SV types are considered 'special'. They're represented by +B::SPECIAL and are referred to by a number from the specialsv_list. +This array maps that number back to the name of the SV (like 'Nullsv' +or '&PL_sv_undef'). + +=back + +=head1 AUTHOR + +Malcolm Beattie, C<mbeattie@sable.ox.ac.uk> + +=cut + +# ex: set ro: diff --git a/Master/tlpkg/tlperl.old/lib/B/Assembler.pm b/Master/tlpkg/tlperl.old/lib/B/Assembler.pm new file mode 100644 index 00000000000..f312273ce36 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/Assembler.pm @@ -0,0 +1,328 @@ +# Assembler.pm +# +# Copyright (c) 1996 Malcolm Beattie +# +# You may distribute under the terms of either the GNU General Public +# License or the Artistic License, as specified in the README file. + +package B::Assembler; +use Exporter; +use B qw(ppname); +use B::Asmdata qw(%insn_data @insn_name); +use Config qw(%Config); +require ByteLoader; # we just need its $VERSION + +no warnings; # XXX + +@ISA = qw(Exporter); +@EXPORT_OK = qw(assemble_fh newasm endasm assemble asm); +$VERSION = 0.07; + +use strict; +my %opnumber; +my ($i, $opname); +for ($i = 0; defined($opname = ppname($i)); $i++) { + $opnumber{$opname} = $i; +} + +my($linenum, $errors, $out); # global state, set up by newasm + +sub error { + my $str = shift; + warn "$linenum: $str\n"; + $errors++; +} + +my $debug = 0; +sub debug { $debug = shift } + +sub limcheck($$$$){ + my( $val, $lo, $hi, $loc ) = @_; + if( $val < $lo || $hi < $val ){ + error "argument for $loc outside [$lo, $hi]: $val"; + $val = $hi; + } + return $val; +} + +# +# First define all the data conversion subs to which Asmdata will refer +# + +sub B::Asmdata::PUT_U8 { + my $arg = shift; + my $c = uncstring($arg); + if (defined($c)) { + if (length($c) != 1) { + error "argument for U8 is too long: $c"; + $c = substr($c, 0, 1); + } + } else { + $arg = limcheck( $arg, 0, 0xff, 'U8' ); + $c = chr($arg); + } + return $c; +} + +sub B::Asmdata::PUT_U16 { + my $arg = limcheck( $_[0], 0, 0xffff, 'U16' ); + pack("S", $arg); +} +sub B::Asmdata::PUT_U32 { + my $arg = limcheck( $_[0], 0, 0xffffffff, 'U32' ); + pack("L", $arg); +} +sub B::Asmdata::PUT_I32 { + my $arg = limcheck( $_[0], -0x80000000, 0x7fffffff, 'I32' ); + pack("l", $arg); +} +sub B::Asmdata::PUT_NV { sprintf("%s\0", $_[0]) } # "%lf" looses precision and pack('d',...) + # may not even be portable between compilers +sub B::Asmdata::PUT_objindex { # could allow names here + my $arg = limcheck( $_[0], 0, 0xffffffff, '*index' ); + pack("L", $arg); +} +sub B::Asmdata::PUT_svindex { &B::Asmdata::PUT_objindex } +sub B::Asmdata::PUT_opindex { &B::Asmdata::PUT_objindex } +sub B::Asmdata::PUT_pvindex { &B::Asmdata::PUT_objindex } + +sub B::Asmdata::PUT_strconst { + my $arg = shift; + my $str = uncstring($arg); + if (!defined($str)) { + error "bad string constant: $arg"; + $str = ''; + } + if ($str =~ s/\0//g) { + error "string constant argument contains NUL: $arg"; + $str = ''; + } + return $str . "\0"; +} + +sub B::Asmdata::PUT_pvcontents { + my $arg = shift; + error "extraneous argument: $arg" if defined $arg; + return ""; +} +sub B::Asmdata::PUT_PV { + my $arg = shift; + my $str = uncstring($arg); + if( ! defined($str) ){ + error "bad string argument: $arg"; + $str = ''; + } + return pack("L", length($str)) . $str; +} +sub B::Asmdata::PUT_comment_t { + my $arg = shift; + $arg = uncstring($arg); + error "bad string argument: $arg" unless defined($arg); + if ($arg =~ s/\n//g) { + error "comment argument contains linefeed: $arg"; + } + return $arg . "\n"; +} +sub B::Asmdata::PUT_double { sprintf("%s\0", $_[0]) } # see PUT_NV above +sub B::Asmdata::PUT_none { + my $arg = shift; + error "extraneous argument: $arg" if defined $arg; + return ""; +} +sub B::Asmdata::PUT_op_tr_array { + my @ary = split /\s*,\s*/, shift; + return pack "S*", @ary; +} + +sub B::Asmdata::PUT_IV64 { + return pack "Q", shift; +} + +sub B::Asmdata::PUT_IV { + $Config{ivsize} == 4 ? &B::Asmdata::PUT_I32 : &B::Asmdata::PUT_IV64; +} + +sub B::Asmdata::PUT_PADOFFSET { + $Config{ptrsize} == 8 ? &B::Asmdata::PUT_IV64 : &B::Asmdata::PUT_U32; +} + +sub B::Asmdata::PUT_long { + $Config{longsize} == 8 ? &B::Asmdata::PUT_IV64 : &B::Asmdata::PUT_U32; +} + +my %unesc = (n => "\n", r => "\r", t => "\t", a => "\a", + b => "\b", f => "\f", v => "\013"); + +sub uncstring { + my $s = shift; + $s =~ s/^"// and $s =~ s/"$// or return undef; + $s =~ s/\\(\d\d\d|.)/length($1) == 3 ? chr(oct($1)) : ($unesc{$1}||$1)/eg; + return $s; +} + +sub strip_comments { + my $stmt = shift; + # Comments only allowed in instructions which don't take string arguments + # Treat string as a single line so .* eats \n characters. + $stmt =~ s{ + ^\s* # Ignore leading whitespace + ( + [^"]* # A double quote '"' indicates a string argument. If we + # find a double quote, the match fails and we strip nothing. + ) + \s*\# # Any amount of whitespace plus the comment marker... + .*$ # ...which carries on to end-of-string. + }{$1}sx; # Keep only the instruction and optional argument. + return $stmt; +} + +# create the ByteCode header: magic, archname, ByteLoader $VERSION, ivsize, +# ptrsize, byteorder +# nvtype is irrelevant (floats are stored as strings) +# byteorder is strconst not U32 because of varying size issues + +sub gen_header { + my $header = ""; + + $header .= B::Asmdata::PUT_U32(0x43424c50); # 'PLBC' + $header .= B::Asmdata::PUT_strconst('"' . $Config{archname}. '"'); + $header .= B::Asmdata::PUT_strconst(qq["$ByteLoader::VERSION"]); + $header .= B::Asmdata::PUT_U32($Config{ivsize}); + $header .= B::Asmdata::PUT_U32($Config{ptrsize}); + $header; +} + +sub parse_statement { + my $stmt = shift; + my ($insn, $arg) = $stmt =~ m{ + ^\s* # allow (but ignore) leading whitespace + (.*?) # Instruction continues up until... + (?: # ...an optional whitespace+argument group + \s+ # first whitespace. + (.*) # The argument is all the rest (newlines included). + )?$ # anchor at end-of-line + }sx; + if (defined($arg)) { + if ($arg =~ s/^0x(?=[0-9a-fA-F]+$)//) { + $arg = hex($arg); + } elsif ($arg =~ s/^0(?=[0-7]+$)//) { + $arg = oct($arg); + } elsif ($arg =~ /^pp_/) { + $arg =~ s/\s*$//; # strip trailing whitespace + my $opnum = $opnumber{$arg}; + if (defined($opnum)) { + $arg = $opnum; + } else { + error qq(No such op type "$arg"); + $arg = 0; + } + } + } + return ($insn, $arg); +} + +sub assemble_insn { + my ($insn, $arg) = @_; + my $data = $insn_data{$insn}; + if (defined($data)) { + my ($bytecode, $putsub) = @{$data}[0, 1]; + my $argcode = &$putsub($arg); + return chr($bytecode).$argcode; + } else { + error qq(no such instruction "$insn"); + return ""; + } +} + +sub assemble_fh { + my ($fh, $out) = @_; + my $line; + my $asm = newasm($out); + while ($line = <$fh>) { + assemble($line); + } + endasm(); +} + +sub newasm { + my($outsub) = @_; + + die "Invalid printing routine for B::Assembler\n" unless ref $outsub eq 'CODE'; + die <<EOD if ref $out; +Can't have multiple byteassembly sessions at once! + (perhaps you forgot an endasm()?) +EOD + + $linenum = $errors = 0; + $out = $outsub; + + $out->(gen_header()); +} + +sub endasm { + if ($errors) { + die "There were $errors assembly errors\n"; + } + $linenum = $errors = $out = 0; +} + +sub assemble { + my($line) = @_; + my ($insn, $arg); + $linenum++; + chomp $line; + if ($debug) { + my $quotedline = $line; + $quotedline =~ s/\\/\\\\/g; + $quotedline =~ s/"/\\"/g; + $out->(assemble_insn("comment", qq("$quotedline"))); + } + if( $line = strip_comments($line) ){ + ($insn, $arg) = parse_statement($line); + $out->(assemble_insn($insn, $arg)); + if ($debug) { + $out->(assemble_insn("nop", undef)); + } + } +} + +### temporary workaround + +sub asm { + return if $_[0] =~ /\s*\W/; + if (defined $_[1]) { + return if $_[1] eq "0" and + $_[0] !~ /^(?:newsvx?|av_pushx?|av_extend|xav_flags)$/; + return if $_[1] eq "1" and $_[0] =~ /^(?:sv_refcnt)$/; + } + assemble "@_"; +} + +1; + +__END__ + +=head1 NAME + +B::Assembler - Assemble Perl bytecode + +=head1 SYNOPSIS + + use B::Assembler qw(newasm endasm assemble); + newasm(\&printsub); # sets up for assembly + assemble($buf); # assembles one line + endasm(); # closes down + + use B::Assembler qw(assemble_fh); + assemble_fh($fh, \&printsub); # assemble everything in $fh + +=head1 DESCRIPTION + +See F<ext/B/B/Assembler.pm>. + +=head1 AUTHORS + +Malcolm Beattie, C<mbeattie@sable.ox.ac.uk> +Per-statement interface by Benjamin Stuhl, C<sho_pi@hotmail.com> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/B/Bblock.pm b/Master/tlpkg/tlperl.old/lib/B/Bblock.pm new file mode 100644 index 00000000000..9566d125aaa --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/Bblock.pm @@ -0,0 +1,224 @@ +package B::Bblock; + +our $VERSION = '1.02_01'; + +use Exporter (); +@ISA = "Exporter"; +@EXPORT_OK = qw(find_leaders); + +use B qw(peekop walkoptree walkoptree_exec + main_root main_start svref_2object + OPf_SPECIAL OPf_STACKED ); + +use B::Concise qw(concise_cv concise_main set_style_standard); +use strict; + +my $bblock; +my @bblock_ends; + +sub mark_leader { + my $op = shift; + if ($$op) { + $bblock->{$$op} = $op; + } +} + +sub remove_sortblock{ + foreach (keys %$bblock){ + my $leader=$$bblock{$_}; + delete $$bblock{$_} if( $leader == 0); + } +} +sub find_leaders { + my ($root, $start) = @_; + $bblock = {}; + mark_leader($start) if ( ref $start ne "B::NULL" ); + walkoptree($root, "mark_if_leader") if ((ref $root) ne "B::NULL") ; + remove_sortblock(); + return $bblock; +} + +# Debugging +sub walk_bblocks { + my ($root, $start) = @_; + my ($op, $lastop, $leader, $bb); + $bblock = {}; + mark_leader($start); + walkoptree($root, "mark_if_leader"); + my @leaders = values %$bblock; + while ($leader = shift @leaders) { + $lastop = $leader; + $op = $leader->next; + while ($$op && !exists($bblock->{$$op})) { + $bblock->{$$op} = $leader; + $lastop = $op; + $op = $op->next; + } + push(@bblock_ends, [$leader, $lastop]); + } + foreach $bb (@bblock_ends) { + ($leader, $lastop) = @$bb; + printf "%s .. %s\n", peekop($leader), peekop($lastop); + for ($op = $leader; $$op != $$lastop; $op = $op->next) { + printf " %s\n", peekop($op); + } + printf " %s\n", peekop($lastop); + } +} + +sub walk_bblocks_obj { + my $cvref = shift; + my $cv = svref_2object($cvref); + walk_bblocks($cv->ROOT, $cv->START); +} + +sub B::OP::mark_if_leader {} + +sub B::COP::mark_if_leader { + my $op = shift; + if ($op->label) { + mark_leader($op); + } +} + +sub B::LOOP::mark_if_leader { + my $op = shift; + mark_leader($op->next); + mark_leader($op->nextop); + mark_leader($op->redoop); + mark_leader($op->lastop->next); +} + +sub B::LOGOP::mark_if_leader { + my $op = shift; + my $opname = $op->name; + mark_leader($op->next); + if ($opname eq "entertry") { + mark_leader($op->other->next); + } else { + mark_leader($op->other); + } +} + +sub B::LISTOP::mark_if_leader { + my $op = shift; + my $first=$op->first; + $first=$first->next while ($first->name eq "null"); + mark_leader($op->first) unless (exists( $bblock->{$$first})); + mark_leader($op->next); + if ($op->name eq "sort" and $op->flags & OPf_SPECIAL + and $op->flags & OPf_STACKED){ + my $root=$op->first->sibling->first; + my $leader=$root->first; + $bblock->{$$leader} = 0; + } +} + +sub B::PMOP::mark_if_leader { + my $op = shift; + if ($op->name ne "pushre") { + my $replroot = $op->pmreplroot; + if ($$replroot) { + mark_leader($replroot); + mark_leader($op->next); + mark_leader($op->pmreplstart); + } + } +} + +# PMOP stuff omitted + +sub compile { + my @options = @_; + B::clearsym(); + if (@options) { + return sub { + my $objname; + foreach $objname (@options) { + $objname = "main::$objname" unless $objname =~ /::/; + eval "walk_bblocks_obj(\\&$objname)"; + die "walk_bblocks_obj(\\&$objname) failed: $@" if $@; + print "-------\n"; + set_style_standard("terse"); + eval "concise_cv('exec', \\&$objname)"; + die "concise_cv('exec', \\&$objname) failed: $@" if $@; + } + } + } else { + return sub { + walk_bblocks(main_root, main_start); + print "-------\n"; + set_style_standard("terse"); + concise_main("exec"); + }; + } +} + +# Basic block leaders: +# Any COP (pp_nextstate) with a non-NULL label +# [The op after a pp_enter] Omit +# [The op after a pp_entersub. Don't count this one.] +# The ops pointed at by nextop, redoop and lastop->op_next of a LOOP +# The ops pointed at by op_next and op_other of a LOGOP, except +# for pp_entertry which has op_next and op_other->op_next +# The op pointed at by op_pmreplstart of a PMOP +# The op pointed at by op_other->op_pmreplstart of pp_substcont? +# [The op after a pp_return] Omit + +1; + +__END__ + +=head1 NAME + +B::Bblock - Walk basic blocks + +=head1 SYNOPSIS + + # External interface + perl -MO=Bblock[,OPTIONS] foo.pl + + # Programmatic API + use B::Bblock qw(find_leaders); + my $leaders = find_leaders($root_op, $start_op); + +=head1 DESCRIPTION + +This module is used by the B::CC back end. It walks "basic blocks". +A basic block is a series of operations which is known to execute from +start to finish, with no possibility of branching or halting. + +It can be used either stand alone or from inside another program. + +=for _private +Somebody who understands the stand-alone options document them, please. + +=head2 Functions + +=over 4 + +=item B<find_leaders> + + my $leaders = find_leaders($root_op, $start_op); + +Given the root of the op tree and an op from which to start +processing, it will return a hash ref representing all the ops which +start a block. + +=for _private +The above description may be somewhat wrong. + +The values of %$leaders are the op objects themselves. Keys are $$op +addresses. + +=for _private +Above cribbed from B::CC's comments. What's a $$op address? + +=back + + +=head1 AUTHOR + +Malcolm Beattie, C<mbeattie@sable.ox.ac.uk> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/B/Bytecode.pm b/Master/tlpkg/tlperl.old/lib/B/Bytecode.pm new file mode 100644 index 00000000000..250569ae57b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/Bytecode.pm @@ -0,0 +1,889 @@ +# B::Bytecode.pm +# Copyright (c) 2003 Enache Adrian. All rights reserved. +# This module is free software; you can redistribute and/or modify +# it under the same terms as Perl itself. + +# Based on the original Bytecode.pm module written by Malcolm Beattie. + +package B::Bytecode; + +our $VERSION = '1.01_01'; + +use strict; +use Config; +use B qw(class main_cv main_root main_start cstring comppadlist + defstash curstash begin_av init_av end_av inc_gv warnhook diehook + dowarn SVt_PVGV SVt_PVHV OPf_SPECIAL OPf_STACKED OPf_MOD + OPpLVAL_INTRO SVf_FAKE SVf_READONLY); +use B::Asmdata qw(@specialsv_name); +use B::Assembler qw(asm newasm endasm); + +################################################# + +my ($varix, $opix, $savebegins, %walked, %files, @cloop); +my %strtab = (0,0); +my %svtab = (0,0); +my %optab = (0,0); +my %spectab = (0,0); +my $tix = 1; +sub asm; +sub nice ($) { } + +BEGIN { + my $ithreads = $Config{'useithreads'} eq 'define'; + eval qq{ + sub ITHREADS() { $ithreads } + sub VERSION() { $] } + }; die $@ if $@; +} + +################################################# + +sub pvstring { + my $pv = shift; + defined($pv) ? cstring ($pv."\0") : "\"\""; +} + +sub pvix { + my $str = pvstring shift; + my $ix = $strtab{$str}; + defined($ix) ? $ix : do { + asm "newpv", $str; + asm "stpv", $strtab{$str} = $tix; + $tix++; + } +} + +sub B::OP::ix { + my $op = shift; + my $ix = $optab{$$op}; + defined($ix) ? $ix : do { + nice "[".$op->name." $tix]"; + asm "newopx", $op->size | $op->type <<7; + $optab{$$op} = $opix = $ix = $tix++; + $op->bsave($ix); + $ix; + } +} + +sub B::SPECIAL::ix { + my $spec = shift; + my $ix = $spectab{$$spec}; + defined($ix) ? $ix : do { + nice '['.$specialsv_name[$$spec].']'; + asm "ldspecsvx", $$spec; + $spectab{$$spec} = $varix = $tix++; + } +} + +sub B::SV::ix { + my $sv = shift; + my $ix = $svtab{$$sv}; + defined($ix) ? $ix : do { + nice '['.class($sv).']'; + asm "newsvx", $sv->FLAGS; + $svtab{$$sv} = $varix = $ix = $tix++; + $sv->bsave($ix); + $ix; + } +} + +sub B::GV::ix { + my ($gv,$desired) = @_; + my $ix = $svtab{$$gv}; + defined($ix) ? $ix : do { + if ($gv->GP) { + my ($svix, $avix, $hvix, $cvix, $ioix, $formix); + nice "[GV]"; + my $name = $gv->STASH->NAME . "::" . $gv->NAME; + asm "gv_fetchpvx", cstring $name; + $svtab{$$gv} = $varix = $ix = $tix++; + asm "sv_flags", $gv->FLAGS; + asm "sv_refcnt", $gv->REFCNT; + asm "xgv_flags", $gv->GvFLAGS; + + asm "gp_refcnt", $gv->GvREFCNT; + asm "load_glob", $ix if $name eq "CORE::GLOBAL::glob"; + return $ix + unless $desired || desired $gv; + $svix = $gv->SV->ix; + $avix = $gv->AV->ix; + $hvix = $gv->HV->ix; + + # XXX {{{{ + my $cv = $gv->CV; + $cvix = $$cv && defined $files{$cv->FILE} ? $cv->ix : 0; + my $form = $gv->FORM; + $formix = $$form && defined $files{$form->FILE} ? $form->ix : 0; + + $ioix = $name !~ /STDOUT$/ ? $gv->IO->ix : 0; + # }}}} XXX + + nice "-GV-", + asm "ldsv", $varix = $ix unless $ix == $varix; + asm "gp_sv", $svix; + asm "gp_av", $avix; + asm "gp_hv", $hvix; + asm "gp_cv", $cvix; + asm "gp_io", $ioix; + asm "gp_cvgen", $gv->CVGEN; + asm "gp_form", $formix; + asm "gp_file", pvix $gv->FILE; + asm "gp_line", $gv->LINE; + asm "formfeed", $svix if $name eq "main::\cL"; + } else { + nice "[GV]"; + asm "newsvx", $gv->FLAGS; + $svtab{$$gv} = $varix = $ix = $tix++; + my $stashix = $gv->STASH->ix; + $gv->B::PVMG::bsave($ix); + asm "xgv_flags", $gv->GvFLAGS; + asm "xgv_stash", $stashix; + } + $ix; + } +} + +sub B::HV::ix { + my $hv = shift; + my $ix = $svtab{$$hv}; + defined($ix) ? $ix : do { + my ($ix,$i,@array); + my $name = $hv->NAME; + if ($name) { + nice "[STASH]"; + asm "gv_stashpvx", cstring $name; + asm "sv_flags", $hv->FLAGS; + $svtab{$$hv} = $varix = $ix = $tix++; + asm "xhv_name", pvix $name; + # my $pmrootix = $hv->PMROOT->ix; # XXX + asm "ldsv", $varix = $ix unless $ix == $varix; + # asm "xhv_pmroot", $pmrootix; # XXX + } else { + nice "[HV]"; + asm "newsvx", $hv->FLAGS; + $svtab{$$hv} = $varix = $ix = $tix++; + my $stashix = $hv->SvSTASH->ix; + for (@array = $hv->ARRAY) { + next if $i = not $i; + $_ = $_->ix; + } + nice "-HV-", + asm "ldsv", $varix = $ix unless $ix == $varix; + ($i = not $i) ? asm ("newpv", pvstring $_) : asm("hv_store", $_) + for @array; + if (VERSION < 5.009) { + asm "xnv", $hv->NVX; + } + asm "xmg_stash", $stashix; + asm "xhv_riter", $hv->RITER; + } + asm "sv_refcnt", $hv->REFCNT; + $ix; + } +} + +sub B::NULL::ix { + my $sv = shift; + $$sv ? $sv->B::SV::ix : 0; +} + +sub B::NULL::opwalk { 0 } + +################################################# + +sub B::NULL::bsave { + my ($sv,$ix) = @_; + + nice '-'.class($sv).'-', + asm "ldsv", $varix = $ix unless $ix == $varix; + asm "sv_refcnt", $sv->REFCNT; +} + +sub B::SV::bsave; + *B::SV::bsave = *B::NULL::bsave; + +sub B::RV::bsave { + my ($sv,$ix) = @_; + my $rvix = $sv->RV->ix; + $sv->B::NULL::bsave($ix); + asm "xrv", $rvix; +} + +sub B::PV::bsave { + my ($sv,$ix) = @_; + $sv->B::NULL::bsave($ix); + asm "newpv", pvstring $sv->PVBM; + asm "xpv"; +} + +sub B::IV::bsave { + my ($sv,$ix) = @_; + $sv->B::NULL::bsave($ix); + asm "xiv", $sv->IVX; +} + +sub B::NV::bsave { + my ($sv,$ix) = @_; + $sv->B::NULL::bsave($ix); + asm "xnv", sprintf "%.40g", $sv->NVX; +} + +sub B::PVIV::bsave { + my ($sv,$ix) = @_; + $sv->POK ? + $sv->B::PV::bsave($ix): + $sv->ROK ? + $sv->B::RV::bsave($ix): + $sv->B::NULL::bsave($ix); + if (VERSION >= 5.009) { + # See note below in B::PVNV::bsave + return if $sv->isa('B::AV'); + return if $sv->isa('B::HV'); + } + asm "xiv", !ITHREADS && $sv->FLAGS & (SVf_FAKE|SVf_READONLY) ? + "0 but true" : $sv->IVX; +} + +sub B::PVNV::bsave { + my ($sv,$ix) = @_; + $sv->B::PVIV::bsave($ix); + if (VERSION >= 5.009) { + # Magical AVs end up here, but AVs now don't have an NV slot actually + # allocated. Hence don't write out assembly to store the NV slot if + # we're actually an array. + return if $sv->isa('B::AV'); + # Likewise HVs have no NV slot actually allocated. + # I don't think that they can get here, but better safe than sorry + return if $sv->isa('B::HV'); + } + asm "xnv", sprintf "%.40g", $sv->NVX; +} + +sub B::PVMG::domagic { + my ($sv,$ix) = @_; + nice '-MAGICAL-'; + my @mglist = $sv->MAGIC; + my (@mgix, @namix); + for (@mglist) { + push @mgix, $_->OBJ->ix; + push @namix, $_->PTR->ix if $_->LENGTH == B::HEf_SVKEY; + } + + nice '-'.class($sv).'-', + asm "ldsv", $varix = $ix unless $ix == $varix; + for (@mglist) { + asm "sv_magic", cstring $_->TYPE; + asm "mg_obj", shift @mgix; + my $length = $_->LENGTH; + if ($length == B::HEf_SVKEY) { + asm "mg_namex", shift @namix; + } elsif ($length) { + asm "newpv", pvstring $_->PTR; + asm "mg_name"; + } + } +} + +sub B::PVMG::bsave { + my ($sv,$ix) = @_; + my $stashix = $sv->SvSTASH->ix; + $sv->B::PVNV::bsave($ix); + asm "xmg_stash", $stashix; + $sv->domagic($ix) if $sv->MAGICAL; +} + +sub B::PVLV::bsave { + my ($sv,$ix) = @_; + my $targix = $sv->TARG->ix; + $sv->B::PVMG::bsave($ix); + asm "xlv_targ", $targix; + asm "xlv_targoff", $sv->TARGOFF; + asm "xlv_targlen", $sv->TARGLEN; + asm "xlv_type", $sv->TYPE; + +} + +sub B::BM::bsave { + my ($sv,$ix) = @_; + $sv->B::PVMG::bsave($ix); + asm "xpv_cur", $sv->CUR; + asm "xbm_useful", $sv->USEFUL; + asm "xbm_previous", $sv->PREVIOUS; + asm "xbm_rare", $sv->RARE; +} + +sub B::IO::bsave { + my ($io,$ix) = @_; + my $topix = $io->TOP_GV->ix; + my $fmtix = $io->FMT_GV->ix; + my $bottomix = $io->BOTTOM_GV->ix; + $io->B::PVMG::bsave($ix); + asm "xio_lines", $io->LINES; + asm "xio_page", $io->PAGE; + asm "xio_page_len", $io->PAGE_LEN; + asm "xio_lines_left", $io->LINES_LEFT; + asm "xio_top_name", pvix $io->TOP_NAME; + asm "xio_top_gv", $topix; + asm "xio_fmt_name", pvix $io->FMT_NAME; + asm "xio_fmt_gv", $fmtix; + asm "xio_bottom_name", pvix $io->BOTTOM_NAME; + asm "xio_bottom_gv", $bottomix; + asm "xio_subprocess", $io->SUBPROCESS; + asm "xio_type", ord $io->IoTYPE; + # asm "xio_flags", ord($io->IoFLAGS) & ~32; # XXX XXX +} + +sub B::CV::bsave { + my ($cv,$ix) = @_; + my $stashix = $cv->STASH->ix; + my $gvix = $cv->GV->ix; + my $padlistix = $cv->PADLIST->ix; + my $outsideix = $cv->OUTSIDE->ix; + my $constix = $cv->CONST ? $cv->XSUBANY->ix : 0; + my $startix = $cv->START->opwalk; + my $rootix = $cv->ROOT->ix; + + $cv->B::PVMG::bsave($ix); + asm "xcv_stash", $stashix; + asm "xcv_start", $startix; + asm "xcv_root", $rootix; + asm "xcv_xsubany", $constix; + asm "xcv_gv", $gvix; + asm "xcv_file", pvix $cv->FILE if $cv->FILE; # XXX AD + asm "xcv_padlist", $padlistix; + asm "xcv_outside", $outsideix; + asm "xcv_flags", $cv->CvFLAGS; + asm "xcv_outside_seq", $cv->OUTSIDE_SEQ; + asm "xcv_depth", $cv->DEPTH; +} + +sub B::FM::bsave { + my ($form,$ix) = @_; + + $form->B::CV::bsave($ix); + asm "xfm_lines", $form->LINES; +} + +sub B::AV::bsave { + my ($av,$ix) = @_; + return $av->B::PVMG::bsave($ix) if $av->MAGICAL; + my @array = $av->ARRAY; + $_ = $_->ix for @array; + my $stashix = $av->SvSTASH->ix; + + nice "-AV-", + asm "ldsv", $varix = $ix unless $ix == $varix; + asm "av_extend", $av->MAX if $av->MAX >= 0; + asm "av_pushx", $_ for @array; + asm "sv_refcnt", $av->REFCNT; + if (VERSION < 5.009) { + asm "xav_flags", $av->AvFLAGS; + } + asm "xmg_stash", $stashix; +} + +sub B::GV::desired { + my $gv = shift; + my ($cv, $form); + $files{$gv->FILE} && $gv->LINE + || ${$cv = $gv->CV} && $files{$cv->FILE} + || ${$form = $gv->FORM} && $files{$form->FILE} +} + +sub B::HV::bwalk { + my $hv = shift; + return if $walked{$$hv}++; + my %stash = $hv->ARRAY; + while (my($k,$v) = each %stash) { + if ($v->SvTYPE == SVt_PVGV) { + my $hash = $v->HV; + if ($$hash && $hash->NAME) { + $hash->bwalk; + } + $v->ix(1) if desired $v; + } else { + nice "[prototype]"; + asm "gv_fetchpvx", cstring $hv->NAME . "::$k"; + $svtab{$$v} = $varix = $tix; + $v->bsave($tix++); + asm "sv_flags", $v->FLAGS; + } + } +} + +###################################################### + + +sub B::OP::bsave_thin { + my ($op, $ix) = @_; + my $next = $op->next; + my $nextix = $optab{$$next}; + $nextix = 0, push @cloop, $op unless defined $nextix; + if ($ix != $opix) { + nice '-'.$op->name.'-', + asm "ldop", $opix = $ix; + } + asm "op_next", $nextix; + asm "op_targ", $op->targ if $op->type; # tricky + asm "op_flags", $op->flags; + asm "op_private", $op->private; +} + +sub B::OP::bsave; + *B::OP::bsave = *B::OP::bsave_thin; + +sub B::UNOP::bsave { + my ($op, $ix) = @_; + my $name = $op->name; + my $flags = $op->flags; + my $first = $op->first; + my $firstix = + $name =~ /fl[io]p/ + # that's just neat + || (!ITHREADS && $name eq 'regcomp') + # trick for /$a/o in pp_regcomp + || $name eq 'rv2sv' + && $op->flags & OPf_MOD + && $op->private & OPpLVAL_INTRO + # change #18774 made my life hard + ? $first->ix + : 0; + + $op->B::OP::bsave($ix); + asm "op_first", $firstix; +} + +sub B::BINOP::bsave { + my ($op, $ix) = @_; + if ($op->name eq 'aassign' && $op->private & B::OPpASSIGN_HASH()) { + my $last = $op->last; + my $lastix = do { + local *B::OP::bsave = *B::OP::bsave_fat; + local *B::UNOP::bsave = *B::UNOP::bsave_fat; + $last->ix; + }; + asm "ldop", $lastix unless $lastix == $opix; + asm "op_targ", $last->targ; + $op->B::OP::bsave($ix); + asm "op_last", $lastix; + } else { + $op->B::OP::bsave($ix); + } +} + +# not needed if no pseudohashes + +*B::BINOP::bsave = *B::OP::bsave if VERSION >= 5.009; + +# deal with sort / formline + +sub B::LISTOP::bsave { + my ($op, $ix) = @_; + my $name = $op->name; + sub blocksort() { OPf_SPECIAL|OPf_STACKED } + if ($name eq 'sort' && ($op->flags & blocksort) == blocksort) { + my $first = $op->first; + my $pushmark = $first->sibling; + my $rvgv = $pushmark->first; + my $leave = $rvgv->first; + + my $leaveix = $leave->ix; + + my $rvgvix = $rvgv->ix; + asm "ldop", $rvgvix unless $rvgvix == $opix; + asm "op_first", $leaveix; + + my $pushmarkix = $pushmark->ix; + asm "ldop", $pushmarkix unless $pushmarkix == $opix; + asm "op_first", $rvgvix; + + my $firstix = $first->ix; + asm "ldop", $firstix unless $firstix == $opix; + asm "op_sibling", $pushmarkix; + + $op->B::OP::bsave($ix); + asm "op_first", $firstix; + } elsif ($name eq 'formline') { + $op->B::UNOP::bsave_fat($ix); + } else { + $op->B::OP::bsave($ix); + } +} + +# fat versions + +sub B::OP::bsave_fat { + my ($op, $ix) = @_; + my $siblix = $op->sibling->ix; + + $op->B::OP::bsave_thin($ix); + asm "op_sibling", $siblix; + # asm "op_seq", -1; XXX don't allocate OPs piece by piece +} + +sub B::UNOP::bsave_fat { + my ($op,$ix) = @_; + my $firstix = $op->first->ix; + + $op->B::OP::bsave($ix); + asm "op_first", $firstix; +} + +sub B::BINOP::bsave_fat { + my ($op,$ix) = @_; + my $last = $op->last; + my $lastix = $op->last->ix; + if (VERSION < 5.009 && $op->name eq 'aassign' && $last->name eq 'null') { + asm "ldop", $lastix unless $lastix == $opix; + asm "op_targ", $last->targ; + } + + $op->B::UNOP::bsave($ix); + asm "op_last", $lastix; +} + +sub B::LOGOP::bsave { + my ($op,$ix) = @_; + my $otherix = $op->other->ix; + + $op->B::UNOP::bsave($ix); + asm "op_other", $otherix; +} + +sub B::PMOP::bsave { + my ($op,$ix) = @_; + my ($rrop, $rrarg, $rstart); + + # my $pmnextix = $op->pmnext->ix; # XXX + + if (ITHREADS) { + if ($op->name eq 'subst') { + $rrop = "op_pmreplroot"; + $rrarg = $op->pmreplroot->ix; + $rstart = $op->pmreplstart->ix; + } elsif ($op->name eq 'pushre') { + $rrop = "op_pmreplrootpo"; + $rrarg = $op->pmreplroot; + } + $op->B::BINOP::bsave($ix); + asm "op_pmstashpv", pvix $op->pmstashpv; + } else { + $rrop = "op_pmreplrootgv"; + $rrarg = $op->pmreplroot->ix; + $rstart = $op->pmreplstart->ix if $op->name eq 'subst'; + my $stashix = $op->pmstash->ix; + $op->B::BINOP::bsave($ix); + asm "op_pmstash", $stashix; + } + + asm $rrop, $rrarg if $rrop; + asm "op_pmreplstart", $rstart if $rstart; + + asm "op_pmflags", $op->pmflags; + asm "op_pmpermflags", $op->pmpermflags; + asm "op_pmdynflags", $op->pmdynflags; + # asm "op_pmnext", $pmnextix; # XXX + asm "newpv", pvstring $op->precomp; + asm "pregcomp"; +} + +sub B::SVOP::bsave { + my ($op,$ix) = @_; + my $svix = $op->sv->ix; + + $op->B::OP::bsave($ix); + asm "op_sv", $svix; +} + +sub B::PADOP::bsave { + my ($op,$ix) = @_; + + $op->B::OP::bsave($ix); + asm "op_padix", $op->padix; +} + +sub B::PVOP::bsave { + my ($op,$ix) = @_; + $op->B::OP::bsave($ix); + return unless my $pv = $op->pv; + + if ($op->name eq 'trans') { + asm "op_pv_tr", join ',', length($pv)/2, unpack("s*", $pv); + } else { + asm "newpv", pvstring $pv; + asm "op_pv"; + } +} + +sub B::LOOP::bsave { + my ($op,$ix) = @_; + my $nextix = $op->nextop->ix; + my $lastix = $op->lastop->ix; + my $redoix = $op->redoop->ix; + + $op->B::BINOP::bsave($ix); + asm "op_redoop", $redoix; + asm "op_nextop", $nextix; + asm "op_lastop", $lastix; +} + +sub B::COP::bsave { + my ($cop,$ix) = @_; + my $warnix = $cop->warnings->ix; + my $ioix = $cop->io->ix; + if (ITHREADS) { + $cop->B::OP::bsave($ix); + asm "cop_stashpv", pvix $cop->stashpv; + asm "cop_file", pvix $cop->file; + } else { + my $stashix = $cop->stash->ix; + my $fileix = $cop->filegv->ix(1); + $cop->B::OP::bsave($ix); + asm "cop_stash", $stashix; + asm "cop_filegv", $fileix; + } + asm "cop_label", pvix $cop->label if $cop->label; # XXX AD + asm "cop_seq", $cop->cop_seq; + asm "cop_arybase", $cop->arybase; + asm "cop_line", $cop->line; + asm "cop_warnings", $warnix; + asm "cop_io", $ioix; +} + +sub B::OP::opwalk { + my $op = shift; + my $ix = $optab{$$op}; + defined($ix) ? $ix : do { + my $ix; + my @oplist = $op->oplist; + push @cloop, undef; + $ix = $_->ix while $_ = pop @oplist; + while ($_ = pop @cloop) { + asm "ldop", $optab{$$_}; + asm "op_next", $optab{${$_->next}}; + } + $ix; + } +} + +################################################# + +sub save_cq { + my $av; + if (($av=begin_av)->isa("B::AV")) { + if ($savebegins) { + for ($av->ARRAY) { + next unless $_->FILE eq $0; + asm "push_begin", $_->ix; + } + } else { + for ($av->ARRAY) { + next unless $_->FILE eq $0; + # XXX BEGIN { goto A while 1; A: } + for (my $op = $_->START; $$op; $op = $op->next) { + next unless $op->name eq 'require' || + # this kludge needed for tests + $op->name eq 'gv' && do { + my $gv = class($op) eq 'SVOP' ? + $op->gv : + (($_->PADLIST->ARRAY)[1]->ARRAY)[$op->padix]; + $$gv && $gv->NAME =~ /use_ok|plan/ + }; + asm "push_begin", $_->ix; + last; + } + } + } + } + if (($av=init_av)->isa("B::AV")) { + for ($av->ARRAY) { + next unless $_->FILE eq $0; + asm "push_init", $_->ix; + } + } + if (($av=end_av)->isa("B::AV")) { + for ($av->ARRAY) { + next unless $_->FILE eq $0; + asm "push_end", $_->ix; + } + } +} + +sub compile { + my ($head, $scan, $T_inhinc, $keep_syn); + my $cwd = ''; + $files{$0} = 1; + sub keep_syn { + $keep_syn = 1; + *B::OP::bsave = *B::OP::bsave_fat; + *B::UNOP::bsave = *B::UNOP::bsave_fat; + *B::BINOP::bsave = *B::BINOP::bsave_fat; + *B::LISTOP::bsave = *B::LISTOP::bsave_fat; + } + sub bwarn { print STDERR "Bytecode.pm: @_\n" } + + for (@_) { + if (/^-S/) { + *newasm = *endasm = sub { }; + *asm = sub { print " @_\n" }; + *nice = sub ($) { print "\n@_\n" }; + } elsif (/^-H/) { + require ByteLoader; + $head = "#! $^X\nuse ByteLoader $ByteLoader::VERSION;\n"; + } elsif (/^-k/) { + keep_syn; + } elsif (/^-o(.*)$/) { + open STDOUT, ">$1" or die "open $1: $!"; + } elsif (/^-f(.*)$/) { + $files{$1} = 1; + } elsif (/^-s(.*)$/) { + $scan = length($1) ? $1 : $0; + } elsif (/^-b/) { + $savebegins = 1; + # this is here for the testsuite + } elsif (/^-TI/) { + $T_inhinc = 1; + } elsif (/^-TF(.*)/) { + my $thatfile = $1; + *B::COP::file = sub { $thatfile }; + } else { + bwarn "Ignoring '$_' option"; + } + } + if ($scan) { + my $f; + if (open $f, $scan) { + while (<$f>) { + /^#\s*line\s+\d+\s+("?)(.*)\1/ and $files{$2} = 1; + /^#/ and next; + if (/\bgoto\b\s*[^&]/ && !$keep_syn) { + bwarn "keeping the syntax tree: \"goto\" op found"; + keep_syn; + } + } + } else { + bwarn "cannot rescan '$scan'"; + } + close $f; + } + binmode STDOUT; + return sub { + print $head if $head; + newasm sub { print @_ }; + + defstash->bwalk; + asm "main_start", main_start->opwalk; + asm "main_root", main_root->ix; + asm "main_cv", main_cv->ix; + asm "curpad", (comppadlist->ARRAY)[1]->ix; + + asm "signal", cstring "__WARN__" # XXX + if warnhook->ix; + asm "incav", inc_gv->AV->ix if $T_inhinc; + save_cq; + asm "incav", inc_gv->AV->ix if $T_inhinc; + asm "dowarn", dowarn; + + { + no strict 'refs'; + nice "<DATA>"; + my $dh = *{defstash->NAME."::DATA"}; + unless (eof $dh) { + local undef $/; + asm "data", ord 'D'; + print <$dh>; + } else { + asm "ret"; + } + } + + endasm; + } +} + +1; + +=head1 NAME + +B::Bytecode - Perl compiler's bytecode backend + +=head1 SYNOPSIS + +B<perl -MO=Bytecode>[B<,-H>][B<,-o>I<script.plc>] I<script.pl> + +=head1 DESCRIPTION + +Compiles a Perl script into a bytecode format that could be loaded +later by the ByteLoader module and executed as a regular Perl script. + +=head1 EXAMPLE + + $ perl -MO=Bytecode,-H,-ohi -e 'print "hi!\n"' + $ perl hi + hi! + +=head1 OPTIONS + +=over 4 + +=item B<-b> + +Save all the BEGIN blocks. Normally only BEGIN blocks that C<require> +other files (ex. C<use Foo;>) are saved. + +=item B<-H> + +prepend a C<use ByteLoader VERSION;> line to the produced bytecode. + +=item B<-k> + +keep the syntax tree - it is stripped by default. + +=item B<-o>I<outfile> + +put the bytecode in <outfile> instead of dumping it to STDOUT. + +=item B<-s> + +scan the script for C<# line ..> directives and for <goto LABEL> +expressions. When gotos are found keep the syntax tree. + +=back + +=head1 KNOWN BUGS + +=over 4 + +=item * + +C<BEGIN { goto A: while 1; A: }> won't even compile. + +=item * + +C<?...?> and C<reset> do not work as expected. + +=item * + +variables in C<(?{ ... })> constructs are not properly scoped. + +=item * + +scripts that use source filters will fail miserably. + +=back + +=head1 NOTICE + +There are also undocumented bugs and options. + +THIS CODE IS HIGHLY EXPERIMENTAL. USE AT YOUR OWN RISK. + +=head1 AUTHORS + +Originally written by Malcolm Beattie <mbeattie@sable.ox.ac.uk> and +modified by Benjamin Stuhl <sho_pi@hotmail.com>. + +Rewritten by Enache Adrian <enache@rdslink.ro>, 2003 a.d. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/B/C.pm b/Master/tlpkg/tlperl.old/lib/B/C.pm new file mode 100644 index 00000000000..cebf4132ffd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/C.pm @@ -0,0 +1,2272 @@ +# C.pm +# +# Copyright (c) 1996, 1997, 1998 Malcolm Beattie +# +# You may distribute under the terms of either the GNU General Public +# License or the Artistic License, as specified in the README file. +# + +package B::C; + +our $VERSION = '1.04_01'; + +package B::C::Section; + +use B (); +use base B::Section; + +sub new +{ + my $class = shift; + my $o = $class->SUPER::new(@_); + push @$o, { values => [] }; + return $o; +} + +sub add +{ + my $section = shift; + push(@{$section->[-1]{values}},@_); +} + +sub index +{ + my $section = shift; + return scalar(@{$section->[-1]{values}})-1; +} + +sub output +{ + my ($section, $fh, $format) = @_; + my $sym = $section->symtable || {}; + my $default = $section->default; + my $i; + foreach (@{$section->[-1]{values}}) + { + s{(s\\_[0-9a-f]+)}{ exists($sym->{$1}) ? $sym->{$1} : $default; }ge; + printf $fh $format, $_, $i; + ++$i; + } +} + +package B::C::InitSection; + +# avoid use vars +@B::C::InitSection::ISA = qw(B::C::Section); + +sub new { + my $class = shift; + my $max_lines = 10000; #pop; + my $section = $class->SUPER::new( @_ ); + + $section->[-1]{evals} = []; + $section->[-1]{chunks} = []; + $section->[-1]{nosplit} = 0; + $section->[-1]{current} = []; + $section->[-1]{count} = 0; + $section->[-1]{max_lines} = $max_lines; + + return $section; +} + +sub split { + my $section = shift; + $section->[-1]{nosplit}-- + if $section->[-1]{nosplit} > 0; +} + +sub no_split { + shift->[-1]{nosplit}++; +} + +sub inc_count { + my $section = shift; + + $section->[-1]{count} += $_[0]; + # this is cheating + $section->add(); +} + +sub add { + my $section = shift->[-1]; + my $current = $section->{current}; + my $nosplit = $section->{nosplit}; + + push @$current, @_; + $section->{count} += scalar(@_); + if( !$nosplit && $section->{count} >= $section->{max_lines} ) { + push @{$section->{chunks}}, $current; + $section->{current} = []; + $section->{count} = 0; + } +} + +sub add_eval { + my $section = shift; + my @strings = @_; + + foreach my $i ( @strings ) { + $i =~ s/\"/\\\"/g; + } + push @{$section->[-1]{evals}}, @strings; +} + +sub output { + my( $section, $fh, $format, $init_name ) = @_; + my $sym = $section->symtable || {}; + my $default = $section->default; + push @{$section->[-1]{chunks}}, $section->[-1]{current}; + + my $name = "aaaa"; + foreach my $i ( @{$section->[-1]{chunks}} ) { + print $fh <<"EOT"; +static int perl_init_${name}() +{ + dTARG; + dSP; +EOT + foreach my $j ( @$i ) { + $j =~ s{(s\\_[0-9a-f]+)} + { exists($sym->{$1}) ? $sym->{$1} : $default; }ge; + print $fh "\t$j\n"; + } + print $fh "\treturn 0;\n}\n"; + + $section->SUPER::add( "perl_init_${name}();" ); + ++$name; + } + foreach my $i ( @{$section->[-1]{evals}} ) { + $section->SUPER::add( sprintf q{eval_pv("%s",1);}, $i ); + } + + print $fh <<"EOT"; +static int ${init_name}() +{ + dTARG; + dSP; +EOT + $section->SUPER::output( $fh, $format ); + print $fh "\treturn 0;\n}\n"; +} + + +package B::C; +use Exporter (); +our %REGEXP; + +{ # block necessary for caller to work + my $caller = caller; + if( $caller eq 'O' ) { + require XSLoader; + XSLoader::load( 'B::C' ); + } +} + +@ISA = qw(Exporter); +@EXPORT_OK = qw(output_all output_boilerplate output_main mark_unused + init_sections set_callback save_unused_subs objsym save_context); + +use B qw(minus_c sv_undef walkoptree walksymtable main_root main_start peekop + class cstring cchar svref_2object compile_stats comppadlist hash + threadsv_names main_cv init_av end_av regex_padav opnumber amagic_generation + HEf_SVKEY SVf_POK SVf_ROK CVf_CONST); +use B::Asmdata qw(@specialsv_name); + +use FileHandle; +use Carp; +use strict; +use Config; + +my $hv_index = 0; +my $gv_index = 0; +my $re_index = 0; +my $pv_index = 0; +my $cv_index = 0; +my $anonsub_index = 0; +my $initsub_index = 0; + +my %symtable; +my %xsub; +my $warn_undefined_syms; +my $verbose; +my %unused_sub_packages; +my $use_xsloader; +my $nullop_count; +my $pv_copy_on_grow = 0; +my $optimize_ppaddr = 0; +my $optimize_warn_sv = 0; +my $use_perl_script_name = 0; +my $save_data_fh = 0; +my $save_sig = 0; +my ($debug_cops, $debug_av, $debug_cv, $debug_mg); +my $max_string_len; + +my $ithreads = $Config{useithreads} eq 'define'; + +my @threadsv_names; +BEGIN { + @threadsv_names = threadsv_names(); +} + +# Code sections +my ($init, $decl, $symsect, $binopsect, $condopsect, $copsect, + $padopsect, $listopsect, $logopsect, $loopsect, $opsect, $pmopsect, + $pvopsect, $svopsect, $unopsect, $svsect, $xpvsect, $xpvavsect, + $xpvhvsect, $xpvcvsect, $xpvivsect, $xpvnvsect, $xpvmgsect, $xpvlvsect, + $xrvsect, $xpvbmsect, $xpviosect ); +my @op_sections = \( $binopsect, $condopsect, $copsect, $padopsect, $listopsect, + $logopsect, $loopsect, $opsect, $pmopsect, $pvopsect, $svopsect, + $unopsect ); + +sub walk_and_save_optree; +my $saveoptree_callback = \&walk_and_save_optree; +sub set_callback { $saveoptree_callback = shift } +sub saveoptree { &$saveoptree_callback(@_) } + +sub walk_and_save_optree { + my ($name, $root, $start) = @_; + walkoptree($root, "save"); + return objsym($start); +} + +# Look this up here so we can do just a number compare +# rather than looking up the name of every BASEOP in B::OP +my $OP_THREADSV = opnumber('threadsv'); + +sub savesym { + my ($obj, $value) = @_; + my $sym = sprintf("s\\_%x", $$obj); + $symtable{$sym} = $value; +} + +sub objsym { + my $obj = shift; + return $symtable{sprintf("s\\_%x", $$obj)}; +} + +sub getsym { + my $sym = shift; + my $value; + + return 0 if $sym eq "sym_0"; # special case + $value = $symtable{$sym}; + if (defined($value)) { + return $value; + } else { + warn "warning: undefined symbol $sym\n" if $warn_undefined_syms; + return "UNUSED"; + } +} + +sub savere { + my $re = shift; + my $sym = sprintf("re%d", $re_index++); + $decl->add(sprintf("static char *$sym = %s;", cstring($re))); + + return ($sym,length(pack "a*",$re)); +} + +sub savepv { + my $pv = pack "a*", shift; + my $pvsym = 0; + my $pvmax = 0; + if ($pv_copy_on_grow) { + $pvsym = sprintf("pv%d", $pv_index++); + + if( defined $max_string_len && length($pv) > $max_string_len ) { + my $chars = join ', ', map { cchar $_ } split //, $pv; + $decl->add(sprintf("static char %s[] = { %s };", $pvsym, $chars)); + } + else { + my $cstring = cstring($pv); + if ($cstring ne "0") { # sic + $decl->add(sprintf("static char %s[] = %s;", + $pvsym, $cstring)); + } + } + } else { + $pvmax = length(pack "a*",$pv) + 1; + } + return ($pvsym, $pvmax); +} + +sub save_rv { + my $sv = shift; +# confess "Can't save RV: not ROK" unless $sv->FLAGS & SVf_ROK; + my $rv = $sv->RV->save; + + $rv =~ s/^\(([AGHS]V|IO)\s*\*\)\s*(\&sv_list.*)$/$2/; + + return $rv; +} + +# savesym, pvmax, len, pv +sub save_pv_or_rv { + my $sv = shift; + + my $rok = $sv->FLAGS & SVf_ROK; + my $pok = $sv->FLAGS & SVf_POK; + my( $len, $pvmax, $savesym, $pv ) = ( 0, 0 ); + if( $rok ) { + $savesym = '(char*)' . save_rv( $sv ); + } + else { + $pv = $pok ? (pack "a*", $sv->PV) : undef; + $len = $pok ? length($pv) : 0; + ($savesym, $pvmax) = $pok ? savepv($pv) : ( 'NULL', 0 ); + } + + return ( $savesym, $pvmax, $len, $pv ); +} + +# see also init_op_ppaddr below; initializes the ppaddt to the +# OpTYPE; init_op_ppaddr iterates over the ops and sets +# op_ppaddr to PL_ppaddr[op_ppaddr]; this avoids an explicit assignmente +# in perl_init ( ~10 bytes/op with GCC/i386 ) +sub B::OP::fake_ppaddr { + return $optimize_ppaddr ? + sprintf("INT2PTR(void*,OP_%s)", uc( $_[0]->name ) ) : + 'NULL'; +} + +# This pair is needed becase B::FAKEOP::save doesn't scalar dereference +# $op->next and $op->sibling + +{ + # For 5.9 the hard coded text is the values for op_opt and op_static in each + # op. The value of op_opt is irrelevant, and the value of op_static needs to + # be 1 to tell op_free that this is a statically defined op and that is + # shouldn't be freed. + + # For 5.8: + # Current workaround/fix for op_free() trying to free statically + # defined OPs is to set op_seq = -1 and check for that in op_free(). + # Instead of hardwiring -1 in place of $op->seq, we use $op_seq + # so that it can be changed back easily if necessary. In fact, to + # stop compilers from moaning about a U16 being initialised with an + # uncast -1 (the printf format is %d so we can't tweak it), we have + # to "know" that op_seq is a U16 and use 65535. Ugh. + + my $static = $] > 5.009 ? '0, 1, 0' : sprintf "%u", 65535; + sub B::OP::_save_common_middle { + my $op = shift; + sprintf ("%s, %u, %u, $static, 0x%x, 0x%x", + $op->fake_ppaddr, $op->targ, $op->type, $op->flags, $op->private); + } +} + +sub B::OP::_save_common { + my $op = shift; + return sprintf("s\\_%x, s\\_%x, %s", + ${$op->next}, ${$op->sibling}, $op->_save_common_middle); +} + +sub B::OP::save { + my ($op, $level) = @_; + my $sym = objsym($op); + return $sym if defined $sym; + my $type = $op->type; + $nullop_count++ unless $type; + if ($type == $OP_THREADSV) { + # saves looking up ppaddr but it's a bit naughty to hard code this + $init->add(sprintf("(void)find_threadsv(%s);", + cstring($threadsv_names[$op->targ]))); + } + $opsect->add($op->_save_common); + my $ix = $opsect->index; + $init->add(sprintf("op_list[$ix].op_ppaddr = %s;", $op->ppaddr)) + unless $optimize_ppaddr; + savesym($op, "&op_list[$ix]"); +} + +sub B::FAKEOP::new { + my ($class, %objdata) = @_; + bless \%objdata, $class; +} + +sub B::FAKEOP::save { + my ($op, $level) = @_; + $opsect->add(sprintf("%s, %s, %s", + $op->next, $op->sibling, $op->_save_common_middle)); + my $ix = $opsect->index; + $init->add(sprintf("op_list[$ix].op_ppaddr = %s;", $op->ppaddr)) + unless $optimize_ppaddr; + return "&op_list[$ix]"; +} + +sub B::FAKEOP::next { $_[0]->{"next"} || 0 } +sub B::FAKEOP::type { $_[0]->{type} || 0} +sub B::FAKEOP::sibling { $_[0]->{sibling} || 0 } +sub B::FAKEOP::ppaddr { $_[0]->{ppaddr} || 0 } +sub B::FAKEOP::targ { $_[0]->{targ} || 0 } +sub B::FAKEOP::flags { $_[0]->{flags} || 0 } +sub B::FAKEOP::private { $_[0]->{private} || 0 } + +sub B::UNOP::save { + my ($op, $level) = @_; + my $sym = objsym($op); + return $sym if defined $sym; + $unopsect->add(sprintf("%s, s\\_%x", $op->_save_common, ${$op->first})); + my $ix = $unopsect->index; + $init->add(sprintf("unop_list[$ix].op_ppaddr = %s;", $op->ppaddr)) + unless $optimize_ppaddr; + savesym($op, "(OP*)&unop_list[$ix]"); +} + +sub B::BINOP::save { + my ($op, $level) = @_; + my $sym = objsym($op); + return $sym if defined $sym; + $binopsect->add(sprintf("%s, s\\_%x, s\\_%x", + $op->_save_common, ${$op->first}, ${$op->last})); + my $ix = $binopsect->index; + $init->add(sprintf("binop_list[$ix].op_ppaddr = %s;", $op->ppaddr)) + unless $optimize_ppaddr; + savesym($op, "(OP*)&binop_list[$ix]"); +} + +sub B::LISTOP::save { + my ($op, $level) = @_; + my $sym = objsym($op); + return $sym if defined $sym; + $listopsect->add(sprintf("%s, s\\_%x, s\\_%x", + $op->_save_common, ${$op->first}, ${$op->last})); + my $ix = $listopsect->index; + $init->add(sprintf("listop_list[$ix].op_ppaddr = %s;", $op->ppaddr)) + unless $optimize_ppaddr; + savesym($op, "(OP*)&listop_list[$ix]"); +} + +sub B::LOGOP::save { + my ($op, $level) = @_; + my $sym = objsym($op); + return $sym if defined $sym; + $logopsect->add(sprintf("%s, s\\_%x, s\\_%x", + $op->_save_common, ${$op->first}, ${$op->other})); + my $ix = $logopsect->index; + $init->add(sprintf("logop_list[$ix].op_ppaddr = %s;", $op->ppaddr)) + unless $optimize_ppaddr; + savesym($op, "(OP*)&logop_list[$ix]"); +} + +sub B::LOOP::save { + my ($op, $level) = @_; + my $sym = objsym($op); + return $sym if defined $sym; + #warn sprintf("LOOP: redoop %s, nextop %s, lastop %s\n", + # peekop($op->redoop), peekop($op->nextop), + # peekop($op->lastop)); # debug + $loopsect->add(sprintf("%s, s\\_%x, s\\_%x, s\\_%x, s\\_%x, s\\_%x", + $op->_save_common, ${$op->first}, ${$op->last}, + ${$op->redoop}, ${$op->nextop}, + ${$op->lastop})); + my $ix = $loopsect->index; + $init->add(sprintf("loop_list[$ix].op_ppaddr = %s;", $op->ppaddr)) + unless $optimize_ppaddr; + savesym($op, "(OP*)&loop_list[$ix]"); +} + +sub B::PVOP::save { + my ($op, $level) = @_; + my $sym = objsym($op); + return $sym if defined $sym; + $pvopsect->add(sprintf("%s, %s", $op->_save_common, cstring($op->pv))); + my $ix = $pvopsect->index; + $init->add(sprintf("pvop_list[$ix].op_ppaddr = %s;", $op->ppaddr)) + unless $optimize_ppaddr; + savesym($op, "(OP*)&pvop_list[$ix]"); +} + +sub B::SVOP::save { + my ($op, $level) = @_; + my $sym = objsym($op); + return $sym if defined $sym; + my $sv = $op->sv; + my $svsym = '(SV*)' . $sv->save; + my $is_const_addr = $svsym =~ m/Null|\&/; + $svopsect->add(sprintf("%s, %s", $op->_save_common, + ( $is_const_addr ? $svsym : 'Nullsv' ))); + my $ix = $svopsect->index; + $init->add(sprintf("svop_list[$ix].op_ppaddr = %s;", $op->ppaddr)) + unless $optimize_ppaddr; + $init->add("svop_list[$ix].op_sv = $svsym;") + unless $is_const_addr; + savesym($op, "(OP*)&svop_list[$ix]"); +} + +sub B::PADOP::save { + my ($op, $level) = @_; + my $sym = objsym($op); + return $sym if defined $sym; + $padopsect->add(sprintf("%s, %d", + $op->_save_common, $op->padix)); + my $ix = $padopsect->index; + $init->add(sprintf("padop_list[$ix].op_ppaddr = %s;", $op->ppaddr)) + unless $optimize_ppaddr; +# $init->add(sprintf("padop_list[$ix].op_padix = %ld;", $op->padix)); + savesym($op, "(OP*)&padop_list[$ix]"); +} + +sub B::COP::save { + my ($op, $level) = @_; + my $sym = objsym($op); + return $sym if defined $sym; + warn sprintf("COP: line %d file %s\n", $op->line, $op->file) + if $debug_cops; + # shameless cut'n'paste from B::Deparse + my $warn_sv; + my $warnings = $op->warnings; + my $is_special = $warnings->isa("B::SPECIAL"); + if ($is_special && $$warnings == 4) { + # use warnings 'all'; + $warn_sv = $optimize_warn_sv ? + 'INT2PTR(SV*,1)' : + 'pWARN_ALL'; + } + elsif ($is_special && $$warnings == 5) { + # no warnings 'all'; + $warn_sv = $optimize_warn_sv ? + 'INT2PTR(SV*,2)' : + 'pWARN_NONE'; + } + elsif ($is_special) { + # use warnings; + $warn_sv = $optimize_warn_sv ? + 'INT2PTR(SV*,3)' : + 'pWARN_STD'; + } + else { + # something else + $warn_sv = $warnings->save; + } + + $copsect->add(sprintf("%s, %s, NULL, NULL, %u, %d, %u, %s", + $op->_save_common, cstring($op->label), $op->cop_seq, + $op->arybase, $op->line, + ( $optimize_warn_sv ? $warn_sv : 'NULL' ))); + my $ix = $copsect->index; + $init->add(sprintf("cop_list[$ix].op_ppaddr = %s;", $op->ppaddr)) + unless $optimize_ppaddr; + $init->add(sprintf("cop_list[$ix].cop_warnings = %s;", $warn_sv )) + unless $optimize_warn_sv; + $init->add(sprintf("CopFILE_set(&cop_list[$ix], %s);", cstring($op->file)), + sprintf("CopSTASHPV_set(&cop_list[$ix], %s);", cstring($op->stashpv))); + + savesym($op, "(OP*)&cop_list[$ix]"); +} + +sub B::PMOP::save { + my ($op, $level) = @_; + my $sym = objsym($op); + return $sym if defined $sym; + my $replroot = $op->pmreplroot; + my $replstart = $op->pmreplstart; + my $replrootfield; + my $replstartfield = sprintf("s\\_%x", $$replstart); + my $gvsym; + my $ppaddr = $op->ppaddr; + # under ithreads, OP_PUSHRE.op_replroot is an integer + $replrootfield = sprintf("s\\_%x", $$replroot) if ref $replroot; + if($ithreads && $op->name eq "pushre") { + $replrootfield = "INT2PTR(OP*,${replroot})"; + } elsif ($$replroot) { + # OP_PUSHRE (a mutated version of OP_MATCH for the regexp + # argument to a split) stores a GV in op_pmreplroot instead + # of a substitution syntax tree. We don't want to walk that... + if ($op->name eq "pushre") { + $gvsym = $replroot->save; +# warn "PMOP::save saving a pp_pushre with GV $gvsym\n"; # debug + $replrootfield = 0; + } else { + $replstartfield = saveoptree("*ignore*", $replroot, $replstart); + } + } + # pmnext handling is broken in perl itself, I think. Bad op_pmnext + # fields aren't noticed in perl's runtime (unless you try reset) but we + # segfault when trying to dereference it to find op->op_pmnext->op_type + $pmopsect->add(sprintf("%s, s\\_%x, s\\_%x, %s, %s, 0, %u, 0x%x, 0x%x, 0x%x", + $op->_save_common, ${$op->first}, ${$op->last}, + $replrootfield, $replstartfield, + ( $ithreads ? $op->pmoffset : 0 ), + $op->pmflags, $op->pmpermflags, $op->pmdynflags )); + my $pm = sprintf("pmop_list[%d]", $pmopsect->index); + $init->add(sprintf("$pm.op_ppaddr = %s;", $ppaddr)) + unless $optimize_ppaddr; + my $re = $op->precomp; + if (defined($re)) { + my( $resym, $relen ) = savere( $re ); + $init->add(sprintf("PM_SETRE(&$pm,pregcomp($resym, $resym + %u, &$pm));", + $relen)); + } + if ($gvsym) { + $init->add("$pm.op_pmreplroot = (OP*)$gvsym;"); + } + savesym($op, "(OP*)&$pm"); +} + +sub B::SPECIAL::save { + my ($sv) = @_; + # special case: $$sv is not the address but an index into specialsv_list +# warn "SPECIAL::save specialsv $$sv\n"; # debug + my $sym = $specialsv_name[$$sv]; + if (!defined($sym)) { + confess "unknown specialsv index $$sv passed to B::SPECIAL::save"; + } + return $sym; +} + +sub B::OBJECT::save {} + +sub B::NULL::save { + my ($sv) = @_; + my $sym = objsym($sv); + return $sym if defined $sym; +# warn "Saving SVt_NULL SV\n"; # debug + # debug + if ($$sv == 0) { + warn "NULL::save for sv = 0 called from @{[(caller(1))[3]]}\n"; + return savesym($sv, "(void*)Nullsv /* XXX */"); + } + $svsect->add(sprintf("0, %u, 0x%x", $sv->REFCNT , $sv->FLAGS)); + return savesym($sv, sprintf("&sv_list[%d]", $svsect->index)); +} + +sub B::IV::save { + my ($sv) = @_; + my $sym = objsym($sv); + return $sym if defined $sym; + $xpvivsect->add(sprintf("0, 0, 0, %d", $sv->IVX)); + $svsect->add(sprintf("&xpviv_list[%d], %lu, 0x%x", + $xpvivsect->index, $sv->REFCNT , $sv->FLAGS)); + return savesym($sv, sprintf("&sv_list[%d]", $svsect->index)); +} + +sub B::NV::save { + my ($sv) = @_; + my $sym = objsym($sv); + return $sym if defined $sym; + my $val= $sv->NVX; + $val .= '.00' if $val =~ /^-?\d+$/; + $xpvnvsect->add(sprintf("0, 0, 0, %d, %s", $sv->IVX, $val)); + $svsect->add(sprintf("&xpvnv_list[%d], %lu, 0x%x", + $xpvnvsect->index, $sv->REFCNT , $sv->FLAGS)); + return savesym($sv, sprintf("&sv_list[%d]", $svsect->index)); +} + +sub savepvn { + my ($dest,$pv) = @_; + my @res; + # work with byte offsets/lengths + my $pv = pack "a*", $pv; + if (defined $max_string_len && length($pv) > $max_string_len) { + push @res, sprintf("Newx(%s,%u,char);", $dest, length($pv)+1); + my $offset = 0; + while (length $pv) { + my $str = substr $pv, 0, $max_string_len, ''; + push @res, sprintf("Copy(%s,$dest+$offset,%u,char);", + cstring($str), length($str)); + $offset += length $str; + } + push @res, sprintf("%s[%u] = '\\0';", $dest, $offset); + } + else { + push @res, sprintf("%s = savepvn(%s, %u);", $dest, + cstring($pv), length($pv)); + } + return @res; +} + +sub B::PVLV::save { + my ($sv) = @_; + my $sym = objsym($sv); + return $sym if defined $sym; + my $pv = $sv->PV; + my $len = length($pv); + my ($pvsym, $pvmax) = savepv($pv); + my ($lvtarg, $lvtarg_sym); + $xpvlvsect->add(sprintf("%s, %u, %u, %d, %g, 0, 0, %u, %u, 0, %s", + $pvsym, $len, $pvmax, $sv->IVX, $sv->NVX, + $sv->TARGOFF, $sv->TARGLEN, cchar($sv->TYPE))); + $svsect->add(sprintf("&xpvlv_list[%d], %lu, 0x%x", + $xpvlvsect->index, $sv->REFCNT , $sv->FLAGS)); + if (!$pv_copy_on_grow) { + $init->add(savepvn(sprintf("xpvlv_list[%d].xpv_pv", + $xpvlvsect->index), $pv)); + } + $sv->save_magic; + return savesym($sv, sprintf("&sv_list[%d]", $svsect->index)); +} + +sub B::PVIV::save { + my ($sv) = @_; + my $sym = objsym($sv); + return $sym if defined $sym; + my( $savesym, $pvmax, $len, $pv ) = save_pv_or_rv( $sv ); + $xpvivsect->add(sprintf("%s, %u, %u, %d", $savesym, $len, $pvmax, $sv->IVX)); + $svsect->add(sprintf("&xpviv_list[%d], %u, 0x%x", + $xpvivsect->index, $sv->REFCNT , $sv->FLAGS)); + if (defined($pv) && !$pv_copy_on_grow) { + $init->add(savepvn(sprintf("xpviv_list[%d].xpv_pv", + $xpvivsect->index), $pv)); + } + return savesym($sv, sprintf("&sv_list[%d]", $svsect->index)); +} + +sub B::PVNV::save { + my ($sv) = @_; + my $sym = objsym($sv); + return $sym if defined $sym; + my( $savesym, $pvmax, $len, $pv ) = save_pv_or_rv( $sv ); + my $val= $sv->NVX; + $val .= '.00' if $val =~ /^-?\d+$/; + $xpvnvsect->add(sprintf("%s, %u, %u, %d, %s", + $savesym, $len, $pvmax, $sv->IVX, $val)); + $svsect->add(sprintf("&xpvnv_list[%d], %lu, 0x%x", + $xpvnvsect->index, $sv->REFCNT , $sv->FLAGS)); + if (defined($pv) && !$pv_copy_on_grow) { + $init->add(savepvn(sprintf("xpvnv_list[%d].xpv_pv", + $xpvnvsect->index), $pv)); + } + return savesym($sv, sprintf("&sv_list[%d]", $svsect->index)); +} + +sub B::BM::save { + my ($sv) = @_; + my $sym = objsym($sv); + return $sym if defined $sym; + my $pv = pack "a*", ($sv->PV . "\0" . $sv->TABLE); + my $len = length($pv); + $xpvbmsect->add(sprintf("0, %u, %u, %d, %s, 0, 0, %d, %u, 0x%x", + $len, $len + 258, $sv->IVX, $sv->NVX, + $sv->USEFUL, $sv->PREVIOUS, $sv->RARE)); + $svsect->add(sprintf("&xpvbm_list[%d], %lu, 0x%x", + $xpvbmsect->index, $sv->REFCNT , $sv->FLAGS)); + $sv->save_magic; + $init->add(savepvn(sprintf("xpvbm_list[%d].xpv_pv", + $xpvbmsect->index), $pv), + sprintf("xpvbm_list[%d].xpv_cur = %u;", + $xpvbmsect->index, $len - 257)); + return savesym($sv, sprintf("&sv_list[%d]", $svsect->index)); +} + +sub B::PV::save { + my ($sv) = @_; + my $sym = objsym($sv); + return $sym if defined $sym; + my( $savesym, $pvmax, $len, $pv ) = save_pv_or_rv( $sv ); + $xpvsect->add(sprintf("%s, %u, %u", $savesym, $len, $pvmax)); + $svsect->add(sprintf("&xpv_list[%d], %lu, 0x%x", + $xpvsect->index, $sv->REFCNT , $sv->FLAGS)); + if (defined($pv) && !$pv_copy_on_grow) { + $init->add(savepvn(sprintf("xpv_list[%d].xpv_pv", + $xpvsect->index), $pv)); + } + return savesym($sv, sprintf("&sv_list[%d]", $svsect->index)); +} + +sub B::PVMG::save { + my ($sv) = @_; + my $sym = objsym($sv); + return $sym if defined $sym; + my( $savesym, $pvmax, $len, $pv ) = save_pv_or_rv( $sv ); + + $xpvmgsect->add(sprintf("%s, %u, %u, %d, %s, 0, 0", + $savesym, $len, $pvmax, + $sv->IVX, $sv->NVX)); + $svsect->add(sprintf("&xpvmg_list[%d], %lu, 0x%x", + $xpvmgsect->index, $sv->REFCNT , $sv->FLAGS)); + if (defined($pv) && !$pv_copy_on_grow) { + $init->add(savepvn(sprintf("xpvmg_list[%d].xpv_pv", + $xpvmgsect->index), $pv)); + } + $sym = savesym($sv, sprintf("&sv_list[%d]", $svsect->index)); + $sv->save_magic; + return $sym; +} + +sub B::PVMG::save_magic { + my ($sv) = @_; + #warn sprintf("saving magic for %s (0x%x)\n", class($sv), $$sv); # debug + my $stash = $sv->SvSTASH; + $stash->save; + if ($$stash) { + warn sprintf("xmg_stash = %s (0x%x)\n", $stash->NAME, $$stash) + if $debug_mg; + # XXX Hope stash is already going to be saved. + $init->add(sprintf("SvSTASH(s\\_%x) = s\\_%x;", $$sv, $$stash)); + } + my @mgchain = $sv->MAGIC; + my ($mg, $type, $obj, $ptr,$len,$ptrsv); + foreach $mg (@mgchain) { + $type = $mg->TYPE; + $ptr = $mg->PTR; + $len=$mg->LENGTH; + if ($debug_mg) { + warn sprintf("magic %s (0x%x), obj %s (0x%x), type %s, ptr %s\n", + class($sv), $$sv, class($obj), $$obj, + cchar($type), cstring($ptr)); + } + + unless( $type eq 'r' ) { + $obj = $mg->OBJ; + $obj->save; + } + + if ($len == HEf_SVKEY){ + #The pointer is an SV* + $ptrsv=svref_2object($ptr)->save; + $init->add(sprintf("sv_magic((SV*)s\\_%x, (SV*)s\\_%x, %s,(char *) %s, %d);", + $$sv, $$obj, cchar($type),$ptrsv,$len)); + }elsif( $type eq 'r' ){ + my $rx = $mg->REGEX; + my $pmop = $REGEXP{$rx}; + + confess "PMOP not found for REGEXP $rx" unless $pmop; + + my( $resym, $relen ) = savere( $mg->precomp ); + my $pmsym = $pmop->save; + $init->add( split /\n/, sprintf <<CODE, $$sv, cchar($type), cstring($ptr) ); +{ + REGEXP* rx = pregcomp($resym, $resym + $relen, (PMOP*)$pmsym); + sv_magic((SV*)s\\_%x, (SV*)rx, %s, %s, %d); +} +CODE + }else{ + $init->add(sprintf("sv_magic((SV*)s\\_%x, (SV*)s\\_%x, %s, %s, %d);", + $$sv, $$obj, cchar($type),cstring($ptr),$len)); + } + } +} + +sub B::RV::save { + my ($sv) = @_; + my $sym = objsym($sv); + return $sym if defined $sym; + my $rv = save_rv( $sv ); + # GVs need to be handled at runtime + if( ref( $sv->RV ) eq 'B::GV' ) { + $xrvsect->add( "(SV*)Nullgv" ); + $init->add(sprintf("xrv_list[%d].xrv_rv = (SV*)%s;\n", $xrvsect->index, $rv)); + } + # and stashes, too + elsif( $sv->RV->isa( 'B::HV' ) && $sv->RV->NAME ) { + $xrvsect->add( "(SV*)Nullhv" ); + $init->add(sprintf("xrv_list[%d].xrv_rv = (SV*)%s;\n", $xrvsect->index, $rv)); + } + else { + $xrvsect->add($rv); + } + $svsect->add(sprintf("&xrv_list[%d], %lu, 0x%x", + $xrvsect->index, $sv->REFCNT , $sv->FLAGS)); + return savesym($sv, sprintf("&sv_list[%d]", $svsect->index)); +} + +sub try_autoload { + my ($cvstashname, $cvname) = @_; + warn sprintf("No definition for sub %s::%s\n", $cvstashname, $cvname); + # Handle AutoLoader classes explicitly. Any more general AUTOLOAD + # use should be handled by the class itself. + no strict 'refs'; + my $isa = \@{"$cvstashname\::ISA"}; + if (grep($_ eq "AutoLoader", @$isa)) { + warn "Forcing immediate load of sub derived from AutoLoader\n"; + # Tweaked version of AutoLoader::AUTOLOAD + my $dir = $cvstashname; + $dir =~ s(::)(/)g; + eval { require "auto/$dir/$cvname.al" }; + if ($@) { + warn qq(failed require "auto/$dir/$cvname.al": $@\n); + return 0; + } else { + return 1; + } + } +} +sub Dummy_initxs{}; +sub B::CV::save { + my ($cv) = @_; + my $sym = objsym($cv); + if (defined($sym)) { +# warn sprintf("CV 0x%x already saved as $sym\n", $$cv); # debug + return $sym; + } + # Reserve a place in svsect and xpvcvsect and record indices + my $gv = $cv->GV; + my ($cvname, $cvstashname); + if ($$gv){ + $cvname = $gv->NAME; + $cvstashname = $gv->STASH->NAME; + } + my $root = $cv->ROOT; + my $cvxsub = $cv->XSUB; + my $isconst = $cv->CvFLAGS & CVf_CONST; + if( $isconst ) { + my $value = $cv->XSUBANY; + my $stash = $gv->STASH; + my $vsym = $value->save; + my $stsym = $stash->save; + my $name = cstring($cvname); + $decl->add( "static CV* cv$cv_index;" ); + $init->add( "cv$cv_index = newCONSTSUB( $stsym, NULL, $vsym );" ); + my $sym = savesym( $cv, "cv$cv_index" ); + $cv_index++; + return $sym; + } + #INIT is removed from the symbol table, so this call must come + # from PL_initav->save. Re-bootstrapping will push INIT back in + # so nullop should be sent. + if (!$isconst && $cvxsub && ($cvname ne "INIT")) { + my $egv = $gv->EGV; + my $stashname = $egv->STASH->NAME; + if ($cvname eq "bootstrap") + { + my $file = $gv->FILE; + $decl->add("/* bootstrap $file */"); + warn "Bootstrap $stashname $file\n"; + # if it not isa('DynaLoader'), it should hopefully be XSLoaded + # ( attributes being an exception, of course ) + if( $stashname ne 'attributes' && + !UNIVERSAL::isa($stashname,'DynaLoader') ) { + $xsub{$stashname}='Dynamic-XSLoaded'; + $use_xsloader = 1; + } + else { + $xsub{$stashname}='Dynamic'; + } + # $xsub{$stashname}='Static' unless $xsub{$stashname}; + return qq/NULL/; + } + else + { + # XSUBs for IO::File, IO::Handle, IO::Socket, + # IO::Seekable and IO::Poll + # are defined in IO.xs, so let's bootstrap it + svref_2object( \&IO::bootstrap )->save + if grep { $stashname eq $_ } qw(IO::File IO::Handle IO::Socket + IO::Seekable IO::Poll); + } + warn sprintf("stub for XSUB $cvstashname\:\:$cvname CV 0x%x\n", $$cv) if $debug_cv; + return qq/(perl_get_cv("$stashname\:\:$cvname",TRUE))/; + } + if ($cvxsub && $cvname eq "INIT") { + no strict 'refs'; + return svref_2object(\&Dummy_initxs)->save; + } + my $sv_ix = $svsect->index + 1; + $svsect->add("svix$sv_ix"); + my $xpvcv_ix = $xpvcvsect->index + 1; + $xpvcvsect->add("xpvcvix$xpvcv_ix"); + # Save symbol now so that GvCV() doesn't recurse back to us via CvGV() + $sym = savesym($cv, "&sv_list[$sv_ix]"); + warn sprintf("saving $cvstashname\:\:$cvname CV 0x%x as $sym\n", $$cv) if $debug_cv; + if (!$$root && !$cvxsub) { + if (try_autoload($cvstashname, $cvname)) { + # Recalculate root and xsub + $root = $cv->ROOT; + $cvxsub = $cv->XSUB; + if ($$root || $cvxsub) { + warn "Successful forced autoload\n"; + } + } + } + my $startfield = 0; + my $padlist = $cv->PADLIST; + my $pv = $cv->PV; + my $xsub = 0; + my $xsubany = "Nullany"; + if ($$root) { + warn sprintf("saving op tree for CV 0x%x, root = 0x%x\n", + $$cv, $$root) if $debug_cv; + my $ppname = ""; + if ($$gv) { + my $stashname = $gv->STASH->NAME; + my $gvname = $gv->NAME; + if ($gvname ne "__ANON__") { + $ppname = (${$gv->FORM} == $$cv) ? "pp_form_" : "pp_sub_"; + $ppname .= ($stashname eq "main") ? + $gvname : "$stashname\::$gvname"; + $ppname =~ s/::/__/g; + if ($gvname eq "INIT"){ + $ppname .= "_$initsub_index"; + $initsub_index++; + } + } + } + if (!$ppname) { + $ppname = "pp_anonsub_$anonsub_index"; + $anonsub_index++; + } + $startfield = saveoptree($ppname, $root, $cv->START, $padlist->ARRAY); + warn sprintf("done saving op tree for CV 0x%x, name %s, root 0x%x\n", + $$cv, $ppname, $$root) if $debug_cv; + if ($$padlist) { + warn sprintf("saving PADLIST 0x%x for CV 0x%x\n", + $$padlist, $$cv) if $debug_cv; + $padlist->save; + warn sprintf("done saving PADLIST 0x%x for CV 0x%x\n", + $$padlist, $$cv) if $debug_cv; + } + } + else { + warn sprintf("No definition for sub %s::%s (unable to autoload)\n", + $cvstashname, $cvname); # debug + } + $pv = '' unless defined $pv; # Avoid use of undef warnings + $symsect->add(sprintf("xpvcvix%d\t%s, %u, 0, %d, %s, 0, Nullhv, Nullhv, %s, s\\_%x, $xsub, $xsubany, Nullgv, \"\", %d, s\\_%x, (CV*)s\\_%x, 0x%x, 0x%x", + $xpvcv_ix, cstring($pv), length($pv), $cv->IVX, + $cv->NVX, $startfield, ${$cv->ROOT}, $cv->DEPTH, + $$padlist, ${$cv->OUTSIDE}, $cv->CvFLAGS, + $cv->OUTSIDE_SEQ)); + + if (${$cv->OUTSIDE} == ${main_cv()}){ + $init->add(sprintf("CvOUTSIDE(s\\_%x)=PL_main_cv;",$$cv)); + $init->add(sprintf("SvREFCNT_inc(PL_main_cv);")); + } + + if ($$gv) { + $gv->save; + $init->add(sprintf("CvGV(s\\_%x) = s\\_%x;",$$cv,$$gv)); + warn sprintf("done saving GV 0x%x for CV 0x%x\n", + $$gv, $$cv) if $debug_cv; + } + if( $ithreads ) { + $init->add( savepvn( "CvFILE($sym)", $cv->FILE) ); + } + else { + $init->add(sprintf("CvFILE($sym) = %s;", cstring($cv->FILE))); + } + my $stash = $cv->STASH; + if ($$stash) { + $stash->save; + $init->add(sprintf("CvSTASH(s\\_%x) = s\\_%x;", $$cv, $$stash)); + warn sprintf("done saving STASH 0x%x for CV 0x%x\n", + $$stash, $$cv) if $debug_cv; + } + $symsect->add(sprintf("svix%d\t(XPVCV*)&xpvcv_list[%u], %lu, 0x%x", + $sv_ix, $xpvcv_ix, $cv->REFCNT +1*0 , $cv->FLAGS)); + return $sym; +} + +sub B::GV::save { + my ($gv) = @_; + my $sym = objsym($gv); + if (defined($sym)) { + #warn sprintf("GV 0x%x already saved as $sym\n", $$gv); # debug + return $sym; + } else { + my $ix = $gv_index++; + $sym = savesym($gv, "gv_list[$ix]"); + #warn sprintf("Saving GV 0x%x as $sym\n", $$gv); # debug + } + my $is_empty = $gv->is_empty; + my $gvname = $gv->NAME; + my $fullname = $gv->STASH->NAME . "::" . $gvname; + my $name = cstring($fullname); + #warn "GV name is $name\n"; # debug + my $egvsym; + unless ($is_empty) { + my $egv = $gv->EGV; + if ($$gv != $$egv) { + #warn(sprintf("EGV name is %s, saving it now\n", + # $egv->STASH->NAME . "::" . $egv->NAME)); # debug + $egvsym = $egv->save; + } + } + $init->add(qq[$sym = gv_fetchpv($name, TRUE, SVt_PV);], + sprintf("SvFLAGS($sym) = 0x%x;", $gv->FLAGS ), + sprintf("GvFLAGS($sym) = 0x%x;", $gv->GvFLAGS)); + $init->add(sprintf("GvLINE($sym) = %u;", $gv->LINE)) unless $is_empty; + # XXX hack for when Perl accesses PVX of GVs + $init->add("SvPVX($sym) = emptystring;\n"); + # Shouldn't need to do save_magic since gv_fetchpv handles that + #$gv->save_magic; + # XXX will always be > 1!!! + my $refcnt = $gv->REFCNT + 1; + $init->add(sprintf("SvREFCNT($sym) += %u;", $refcnt - 1 )) if $refcnt > 1; + + return $sym if $is_empty; + + # XXX B::walksymtable creates an extra reference to the GV + my $gvrefcnt = $gv->GvREFCNT; + if ($gvrefcnt > 1) { + $init->add(sprintf("GvREFCNT($sym) += %u;", $gvrefcnt - 1)); + } + # some non-alphavetic globs require some parts to be saved + # ( ex. %!, but not $! ) + sub Save_HV() { 1 } + sub Save_AV() { 2 } + sub Save_SV() { 4 } + sub Save_CV() { 8 } + sub Save_FORM() { 16 } + sub Save_IO() { 32 } + my $savefields = 0; + if( $gvname !~ /^([^A-Za-z]|STDIN|STDOUT|STDERR|ARGV|SIG|ENV)$/ ) { + $savefields = Save_HV|Save_AV|Save_SV|Save_CV|Save_FORM|Save_IO; + } + elsif( $gvname eq '!' ) { + $savefields = Save_HV; + } + # attributes::bootstrap is created in perl_parse + # saving it would overwrite it, because perl_init() is + # called after perl_parse() + $savefields&=~Save_CV if $fullname eq 'attributes::bootstrap'; + + # save it + # XXX is that correct? + if (defined($egvsym) && $egvsym !~ m/Null/ ) { + # Shared glob *foo = *bar + $init->add("gp_free($sym);", + "GvGP($sym) = GvGP($egvsym);"); + } elsif ($savefields) { + # Don't save subfields of special GVs (*_, *1, *# and so on) +# warn "GV::save saving subfields\n"; # debug + my $gvsv = $gv->SV; + if ($$gvsv && $savefields&Save_SV) { + $gvsv->save; + $init->add(sprintf("GvSV($sym) = s\\_%x;", $$gvsv)); +# warn "GV::save \$$name\n"; # debug + } + my $gvav = $gv->AV; + if ($$gvav && $savefields&Save_AV) { + $gvav->save; + $init->add(sprintf("GvAV($sym) = s\\_%x;", $$gvav)); +# warn "GV::save \@$name\n"; # debug + } + my $gvhv = $gv->HV; + if ($$gvhv && $savefields&Save_HV) { + $gvhv->save; + $init->add(sprintf("GvHV($sym) = s\\_%x;", $$gvhv)); +# warn "GV::save \%$name\n"; # debug + } + my $gvcv = $gv->CV; + if ($$gvcv && $savefields&Save_CV) { + my $origname=cstring($gvcv->GV->EGV->STASH->NAME . + "::" . $gvcv->GV->EGV->NAME); + if (0 && $gvcv->XSUB && $name ne $origname) { #XSUB alias + # must save as a 'stub' so newXS() has a CV to populate + $init->add("{ CV *cv;"); + $init->add("\tcv=perl_get_cv($origname,TRUE);"); + $init->add("\tGvCV($sym)=cv;"); + $init->add("\tSvREFCNT_inc((SV *)cv);"); + $init->add("}"); + } else { + $init->add(sprintf("GvCV($sym) = (CV*)(%s);", $gvcv->save)); +# warn "GV::save &$name\n"; # debug + } + } + $init->add(sprintf("GvFILE($sym) = %s;", cstring($gv->FILE))); +# warn "GV::save GvFILE(*$name)\n"; # debug + my $gvform = $gv->FORM; + if ($$gvform && $savefields&Save_FORM) { + $gvform->save; + $init->add(sprintf("GvFORM($sym) = (CV*)s\\_%x;", $$gvform)); +# warn "GV::save GvFORM(*$name)\n"; # debug + } + my $gvio = $gv->IO; + if ($$gvio && $savefields&Save_IO) { + $gvio->save; + $init->add(sprintf("GvIOp($sym) = s\\_%x;", $$gvio)); + if( $fullname =~ m/::DATA$/ && $save_data_fh ) { + no strict 'refs'; + my $fh = *{$fullname}{IO}; + use strict 'refs'; + $gvio->save_data( $fullname, <$fh> ) if $fh->opened; + } +# warn "GV::save GvIO(*$name)\n"; # debug + } + } + return $sym; +} + +sub B::AV::save { + my ($av) = @_; + my $sym = objsym($av); + return $sym if defined $sym; + my $line = "0, -1, -1, 0, 0.0, 0, Nullhv, 0, 0"; + $line .= sprintf(", 0x%x", $av->AvFLAGS) if $] < 5.009; + $xpvavsect->add($line); + $svsect->add(sprintf("&xpvav_list[%d], %lu, 0x%x", + $xpvavsect->index, $av->REFCNT , $av->FLAGS)); + my $sv_list_index = $svsect->index; + my $fill = $av->FILL; + $av->save_magic; + if ($debug_av) { + $line = sprintf("saving AV 0x%x FILL=$fill", $$av); + $line .= sprintf(" AvFLAGS=0x%x", $av->AvFLAGS) if $] < 5.009; + warn $line; + } + # XXX AVf_REAL is wrong test: need to save comppadlist but not stack + #if ($fill > -1 && ($avflags & AVf_REAL)) { + if ($fill > -1) { + my @array = $av->ARRAY; + if ($debug_av) { + my $el; + my $i = 0; + foreach $el (@array) { + warn sprintf("AV 0x%x[%d] = %s 0x%x\n", + $$av, $i++, class($el), $$el); + } + } +# my @names = map($_->save, @array); + # XXX Better ways to write loop? + # Perhaps svp[0] = ...; svp[1] = ...; svp[2] = ...; + # Perhaps I32 i = 0; svp[i++] = ...; svp[i++] = ...; svp[i++] = ...; + + # micro optimization: op/pat.t ( and other code probably ) + # has very large pads ( 20k/30k elements ) passing them to + # ->add is a performance bottleneck: passing them as a + # single string cuts runtime from 6min20sec to 40sec + + # you want to keep this out of the no_split/split + # map("\t*svp++ = (SV*)$_;", @names), + my $acc = ''; + foreach my $i ( 0..$#array ) { + $acc .= "\t*svp++ = (SV*)" . $array[$i]->save . ";\n\t"; + } + $acc .= "\n"; + + $init->no_split; + $init->add("{", + "\tSV **svp;", + "\tAV *av = (AV*)&sv_list[$sv_list_index];", + "\tav_extend(av, $fill);", + "\tsvp = AvARRAY(av);" ); + $init->add($acc); + $init->add("\tAvFILLp(av) = $fill;", + "}"); + $init->split; + # we really added a lot of lines ( B::C::InitSection->add + # should really scan for \n, but that would slow + # it down + $init->inc_count( $#array ); + } else { + my $max = $av->MAX; + $init->add("av_extend((AV*)&sv_list[$sv_list_index], $max);") + if $max > -1; + } + return savesym($av, "(AV*)&sv_list[$sv_list_index]"); +} + +sub B::HV::save { + my ($hv) = @_; + my $sym = objsym($hv); + return $sym if defined $sym; + my $name = $hv->NAME; + if ($name) { + # It's a stash + + # A perl bug means HvPMROOT isn't altered when a PMOP is freed. Usually + # the only symptom is that sv_reset tries to reset the PMf_USED flag of + # a trashed op but we look at the trashed op_type and segfault. + #my $adpmroot = ${$hv->PMROOT}; + my $adpmroot = 0; + $decl->add("static HV *hv$hv_index;"); + # XXX Beware of weird package names containing double-quotes, \n, ...? + $init->add(qq[hv$hv_index = gv_stashpv("$name", TRUE);]); + if ($adpmroot) { + $init->add(sprintf("HvPMROOT(hv$hv_index) = (PMOP*)s\\_%x;", + $adpmroot)); + } + $sym = savesym($hv, "hv$hv_index"); + $hv_index++; + return $sym; + } + # It's just an ordinary HV + $xpvhvsect->add(sprintf("0, 0, %d, 0, 0.0, 0, Nullhv, %d, 0, 0, 0", + $hv->MAX, $hv->RITER)); + $svsect->add(sprintf("&xpvhv_list[%d], %lu, 0x%x", + $xpvhvsect->index, $hv->REFCNT , $hv->FLAGS)); + my $sv_list_index = $svsect->index; + my @contents = $hv->ARRAY; + if (@contents) { + my $i; + for ($i = 1; $i < @contents; $i += 2) { + $contents[$i] = $contents[$i]->save; + } + $init->no_split; + $init->add("{", "\tHV *hv = (HV*)&sv_list[$sv_list_index];"); + while (@contents) { + my ($key, $value) = splice(@contents, 0, 2); + $init->add(sprintf("\thv_store(hv, %s, %u, %s, %s);", + cstring($key),length(pack "a*",$key), + $value, hash($key))); +# $init->add(sprintf("\thv_store(hv, %s, %u, %s, %s);", +# cstring($key),length($key),$value, 0)); + } + $init->add("}"); + $init->split; + } + $hv->save_magic(); + return savesym($hv, "(HV*)&sv_list[$sv_list_index]"); +} + +sub B::IO::save_data { + my( $io, $globname, @data ) = @_; + my $data = join '', @data; + + # XXX using $DATA might clobber it! + my $sym = svref_2object( \\$data )->save; + $init->add( split /\n/, <<CODE ); + { + GV* gv = (GV*)gv_fetchpv( "$globname", TRUE, SVt_PV ); + SV* sv = $sym; + GvSV( gv ) = sv; + } +CODE + # for PerlIO::scalar + $use_xsloader = 1; + $init->add_eval( sprintf 'open(%s, "<", $%s)', $globname, $globname ); +} + +sub B::IO::save { + my ($io) = @_; + my $sym = objsym($io); + return $sym if defined $sym; + my $pv = $io->PV; + $pv = '' unless defined $pv; + my $len = length($pv); + $xpviosect->add(sprintf("0, %u, %u, %d, %s, 0, 0, 0, 0, 0, %d, %d, %d, %d, %s, Nullgv, %s, Nullgv, %s, Nullgv, %d, %s, 0x%x", + $len, $len+1, $io->IVX, $io->NVX, $io->LINES, + $io->PAGE, $io->PAGE_LEN, $io->LINES_LEFT, + cstring($io->TOP_NAME), cstring($io->FMT_NAME), + cstring($io->BOTTOM_NAME), $io->SUBPROCESS, + cchar($io->IoTYPE), $io->IoFLAGS)); + $svsect->add(sprintf("&xpvio_list[%d], %lu, 0x%x", + $xpviosect->index, $io->REFCNT , $io->FLAGS)); + $sym = savesym($io, sprintf("(IO*)&sv_list[%d]", $svsect->index)); + # deal with $x = *STDIN/STDOUT/STDERR{IO} + my $perlio_func; + foreach ( qw(stdin stdout stderr) ) { + $io->IsSTD($_) and $perlio_func = $_; + } + if( $perlio_func ) { + $init->add( "IoIFP(${sym})=PerlIO_${perlio_func}();" ); + $init->add( "IoOFP(${sym})=PerlIO_${perlio_func}();" ); + } + + my ($field, $fsym); + foreach $field (qw(TOP_GV FMT_GV BOTTOM_GV)) { + $fsym = $io->$field(); + if ($$fsym) { + $init->add(sprintf("Io$field($sym) = (GV*)s\\_%x;", $$fsym)); + $fsym->save; + } + } + $io->save_magic; + return $sym; +} + +sub B::SV::save { + my $sv = shift; + # This is where we catch an honest-to-goodness Nullsv (which gets + # blessed into B::SV explicitly) and any stray erroneous SVs. + return 0 unless $$sv; + confess sprintf("cannot save that type of SV: %s (0x%x)\n", + class($sv), $$sv); +} + +sub output_all { + my $init_name = shift; + my $section; + my @sections = ($opsect, $unopsect, $binopsect, $logopsect, $condopsect, + $listopsect, $pmopsect, $svopsect, $padopsect, $pvopsect, + $loopsect, $copsect, $svsect, $xpvsect, + $xpvavsect, $xpvhvsect, $xpvcvsect, $xpvivsect, $xpvnvsect, + $xpvmgsect, $xpvlvsect, $xrvsect, $xpvbmsect, $xpviosect); + $symsect->output(\*STDOUT, "#define %s\n"); + print "\n"; + output_declarations(); + foreach $section (@sections) { + my $lines = $section->index + 1; + if ($lines) { + my $name = $section->name; + my $typename = ($name eq "xpvcv") ? "XPVCV_or_similar" : uc($name); + print "Static $typename ${name}_list[$lines];\n"; + } + } + # XXX hack for when Perl accesses PVX of GVs + print 'Static char emptystring[] = "\0";'; + + $decl->output(\*STDOUT, "%s\n"); + print "\n"; + foreach $section (@sections) { + my $lines = $section->index + 1; + if ($lines) { + my $name = $section->name; + my $typename = ($name eq "xpvcv") ? "XPVCV_or_similar" : uc($name); + printf "static %s %s_list[%u] = {\n", $typename, $name, $lines; + $section->output(\*STDOUT, "\t{ %s }, /* %d */\n"); + print "};\n\n"; + } + } + + $init->output(\*STDOUT, "\t%s\n", $init_name ); + if ($verbose) { + warn compile_stats(); + warn "NULLOP count: $nullop_count\n"; + } +} + +sub output_declarations { + print <<'EOT'; +#ifdef BROKEN_STATIC_REDECL +#define Static extern +#else +#define Static static +#endif /* BROKEN_STATIC_REDECL */ + +#ifdef BROKEN_UNION_INIT +/* + * Cribbed from cv.h with ANY (a union) replaced by void*. + * Some pre-Standard compilers can't cope with initialising unions. Ho hum. + */ +typedef struct { + char * xpv_pv; /* pointer to malloced string */ + STRLEN xpv_cur; /* length of xp_pv as a C string */ + STRLEN xpv_len; /* allocated size */ + IV xof_off; /* integer value */ + NV xnv_nv; /* numeric value, if any */ + MAGIC* xmg_magic; /* magic for scalar array */ + HV* xmg_stash; /* class package */ + + HV * xcv_stash; + OP * xcv_start; + OP * xcv_root; + void (*xcv_xsub) (pTHX_ CV*); + ANY xcv_xsubany; + GV * xcv_gv; + char * xcv_file; + long xcv_depth; /* >= 2 indicates recursive call */ + AV * xcv_padlist; + CV * xcv_outside; +EOT + print <<'EOT' if $] < 5.009; +#ifdef USE_5005THREADS + perl_mutex *xcv_mutexp; + struct perl_thread *xcv_owner; /* current owner thread */ +#endif /* USE_5005THREADS */ +EOT + print <<'EOT'; + cv_flags_t xcv_flags; + U32 xcv_outside_seq; /* the COP sequence (at the point of our + * compilation) in the lexically enclosing + * sub */ +} XPVCV_or_similar; +#define ANYINIT(i) i +#else +#define XPVCV_or_similar XPVCV +#define ANYINIT(i) {i} +#endif /* BROKEN_UNION_INIT */ +#define Nullany ANYINIT(0) + +#define UNUSED 0 +#define sym_0 0 +EOT + print "static GV *gv_list[$gv_index];\n" if $gv_index; + print "\n"; +} + + +sub output_boilerplate { + print <<'EOT'; +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +/* Workaround for mapstart: the only op which needs a different ppaddr */ +#undef Perl_pp_mapstart +#define Perl_pp_mapstart Perl_pp_grepstart +#undef OP_MAPSTART +#define OP_MAPSTART OP_GREPSTART +#define XS_DynaLoader_boot_DynaLoader boot_DynaLoader +EXTERN_C void boot_DynaLoader (pTHX_ CV* cv); + +static void xs_init (pTHX); +static void dl_init (pTHX); +static PerlInterpreter *my_perl; +EOT +} + +sub init_op_addr { + my( $op_type, $num ) = @_; + my $op_list = $op_type."_list"; + + $init->add( split /\n/, <<EOT ); + { + int i; + + for( i = 0; i < ${num}; ++i ) + { + ${op_list}\[i].op_ppaddr = PL_ppaddr[INT2PTR(int,${op_list}\[i].op_ppaddr)]; + } + } +EOT +} + +sub init_op_warn { + my( $op_type, $num ) = @_; + my $op_list = $op_type."_list"; + + # for resons beyond imagination, MSVC5 considers pWARN_ALL non-const + $init->add( split /\n/, <<EOT ); + { + int i; + + for( i = 0; i < ${num}; ++i ) + { + switch( (int)(${op_list}\[i].cop_warnings) ) + { + case 1: + ${op_list}\[i].cop_warnings = pWARN_ALL; + break; + case 2: + ${op_list}\[i].cop_warnings = pWARN_NONE; + break; + case 3: + ${op_list}\[i].cop_warnings = pWARN_STD; + break; + default: + break; + } + } + } +EOT +} + +sub output_main { + print <<'EOT'; +/* if USE_IMPLICIT_SYS, we need a 'real' exit */ +#if defined(exit) +#undef exit +#endif + +int +main(int argc, char **argv, char **env) +{ + int exitstatus; + int i; + char **fakeargv; + GV* tmpgv; + SV* tmpsv; + int options_count; + + PERL_SYS_INIT3(&argc,&argv,&env); + + if (!PL_do_undump) { + my_perl = perl_alloc(); + if (!my_perl) + exit(1); + perl_construct( my_perl ); + PL_perl_destruct_level = 0; + } +EOT + if( $ithreads ) { + # XXX init free elems! + my $pad_len = regex_padav->FILL + 1 - 1; # first is an avref + + print <<EOT; +#ifdef USE_ITHREADS + for( i = 0; i < $pad_len; ++i ) { + av_push( PL_regex_padav, newSViv(0) ); + } + PL_regex_pad = AvARRAY( PL_regex_padav ); +#endif +EOT + } + + print <<'EOT'; +#ifdef CSH + if (!PL_cshlen) + PL_cshlen = strlen(PL_cshname); +#endif + +#ifdef ALLOW_PERL_OPTIONS +#define EXTRA_OPTIONS 3 +#else +#define EXTRA_OPTIONS 4 +#endif /* ALLOW_PERL_OPTIONS */ + Newx(fakeargv, argc + EXTRA_OPTIONS + 1, char *); + + fakeargv[0] = argv[0]; + fakeargv[1] = "-e"; + fakeargv[2] = ""; + options_count = 3; +EOT + # honour -T + print <<EOT; + if( ${^TAINT} ) { + fakeargv[options_count] = "-T"; + ++options_count; + } +EOT + print <<'EOT'; +#ifndef ALLOW_PERL_OPTIONS + fakeargv[options_count] = "--"; + ++options_count; +#endif /* ALLOW_PERL_OPTIONS */ + for (i = 1; i < argc; i++) + fakeargv[i + options_count - 1] = argv[i]; + fakeargv[argc + options_count - 1] = 0; + + exitstatus = perl_parse(my_perl, xs_init, argc + options_count - 1, + fakeargv, NULL); + + if (exitstatus) + exit( exitstatus ); + + TAINT; +EOT + + if( $use_perl_script_name ) { + my $dollar_0 = $0; + $dollar_0 =~ s/\\/\\\\/g; + $dollar_0 = '"' . $dollar_0 . '"'; + + print <<EOT; + if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {/* $0 */ + tmpsv = GvSV(tmpgv); + sv_setpv(tmpsv, ${dollar_0}); + SvSETMAGIC(tmpsv); + } +EOT + } + else { + print <<EOT; + if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {/* $0 */ + tmpsv = GvSV(tmpgv); + sv_setpv(tmpsv, argv[0]); + SvSETMAGIC(tmpsv); + } +EOT + } + + print <<'EOT'; + if ((tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))) {/* $^X */ + tmpsv = GvSV(tmpgv); +#ifdef WIN32 + sv_setpv(tmpsv,"perl.exe"); +#else + sv_setpv(tmpsv,"perl"); +#endif + SvSETMAGIC(tmpsv); + } + + TAINT_NOT; + + /* PL_main_cv = PL_compcv; */ + PL_compcv = 0; + + exitstatus = perl_init(); + if (exitstatus) + exit( exitstatus ); + dl_init(aTHX); + + exitstatus = perl_run( my_perl ); + + perl_destruct( my_perl ); + perl_free( my_perl ); + + PERL_SYS_TERM(); + + exit( exitstatus ); +} + +/* yanked from perl.c */ +static void +xs_init(pTHX) +{ + char *file = __FILE__; + dTARG; + dSP; +EOT + print "\n#ifdef USE_DYNAMIC_LOADING"; + print qq/\n\tnewXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);/; + print "\n#endif\n" ; + # delete $xsub{'DynaLoader'}; + delete $xsub{'UNIVERSAL'}; + print("/* bootstrapping code*/\n\tSAVETMPS;\n"); + print("\ttarg=sv_newmortal();\n"); + print "#ifdef USE_DYNAMIC_LOADING\n"; + print "\tPUSHMARK(sp);\n"; + print qq/\tXPUSHp("DynaLoader",strlen("DynaLoader"));\n/; + print qq/\tPUTBACK;\n/; + print "\tboot_DynaLoader(aTHX_ NULL);\n"; + print qq/\tSPAGAIN;\n/; + print "#endif\n"; + foreach my $stashname (keys %xsub){ + if ($xsub{$stashname} !~ m/Dynamic/ ) { + my $stashxsub=$stashname; + $stashxsub =~ s/::/__/g; + print "\tPUSHMARK(sp);\n"; + print qq/\tXPUSHp("$stashname",strlen("$stashname"));\n/; + print qq/\tPUTBACK;\n/; + print "\tboot_$stashxsub(aTHX_ NULL);\n"; + print qq/\tSPAGAIN;\n/; + } + } + print("\tFREETMPS;\n/* end bootstrapping code */\n"); + print "}\n"; + +print <<'EOT'; +static void +dl_init(pTHX) +{ + char *file = __FILE__; + dTARG; + dSP; +EOT + print("/* Dynamicboot strapping code*/\n\tSAVETMPS;\n"); + print("\ttarg=sv_newmortal();\n"); + foreach my $stashname (@DynaLoader::dl_modules) { + warn "Loaded $stashname\n"; + if (exists($xsub{$stashname}) && $xsub{$stashname} =~ m/Dynamic/) { + my $stashxsub=$stashname; + $stashxsub =~ s/::/__/g; + print "\tPUSHMARK(sp);\n"; + print qq/\tXPUSHp("$stashname",/,length($stashname),qq/);\n/; + print qq/\tPUTBACK;\n/; + print "#ifdef USE_DYNAMIC_LOADING\n"; + warn "bootstrapping $stashname added to xs_init\n"; + if( $xsub{$stashname} eq 'Dynamic' ) { + print qq/\tperl_call_method("bootstrap",G_DISCARD);\n/; + } + else { + print qq/\tperl_call_pv("XSLoader::load",G_DISCARD);\n/; + } + print "#else\n"; + print "\tboot_$stashxsub(aTHX_ NULL);\n"; + print "#endif\n"; + print qq/\tSPAGAIN;\n/; + } + } + print("\tFREETMPS;\n/* end Dynamic bootstrapping code */\n"); + print "}\n"; +} +sub dump_symtable { + # For debugging + my ($sym, $val); + warn "----Symbol table:\n"; + while (($sym, $val) = each %symtable) { + warn "$sym => $val\n"; + } + warn "---End of symbol table\n"; +} + +sub save_object { + my $sv; + foreach $sv (@_) { + svref_2object($sv)->save; + } +} + +sub Dummy_BootStrap { } + +sub B::GV::savecv +{ + my $gv = shift; + my $package=$gv->STASH->NAME; + my $name = $gv->NAME; + my $cv = $gv->CV; + my $sv = $gv->SV; + my $av = $gv->AV; + my $hv = $gv->HV; + + my $fullname = $gv->STASH->NAME . "::" . $gv->NAME; + + # We may be looking at this package just because it is a branch in the + # symbol table which is on the path to a package which we need to save + # e.g. this is 'Getopt' and we need to save 'Getopt::Long' + # + return unless ($unused_sub_packages{$package}); + return unless ($$cv || $$av || $$sv || $$hv); + $gv->save; +} + +sub mark_package +{ + my $package = shift; + unless ($unused_sub_packages{$package}) + { + no strict 'refs'; + $unused_sub_packages{$package} = 1; + if (defined @{$package.'::ISA'}) + { + foreach my $isa (@{$package.'::ISA'}) + { + if ($isa eq 'DynaLoader') + { + unless (defined(&{$package.'::bootstrap'})) + { + warn "Forcing bootstrap of $package\n"; + eval { $package->bootstrap }; + } + } +# else + { + unless ($unused_sub_packages{$isa}) + { + warn "$isa saved (it is in $package\'s \@ISA)\n"; + mark_package($isa); + } + } + } + } + } + return 1; +} + +sub should_save +{ + no strict qw(vars refs); + my $package = shift; + $package =~ s/::$//; + return $unused_sub_packages{$package} = 0 if ($package =~ /::::/); # skip ::::ISA::CACHE etc. + # warn "Considering $package\n";#debug + foreach my $u (grep($unused_sub_packages{$_},keys %unused_sub_packages)) + { + # If this package is a prefix to something we are saving, traverse it + # but do not mark it for saving if it is not already + # e.g. to get to Getopt::Long we need to traverse Getopt but need + # not save Getopt + return 1 if ($u =~ /^$package\:\:/); + } + if (exists $unused_sub_packages{$package}) + { + # warn "Cached $package is ".$unused_sub_packages{$package}."\n"; + delete_unsaved_hashINC($package) unless $unused_sub_packages{$package} ; + return $unused_sub_packages{$package}; + } + # Omit the packages which we use (and which cause grief + # because of fancy "goto &$AUTOLOAD" stuff). + # XXX Surely there must be a nicer way to do this. + if ($package eq "FileHandle" || $package eq "Config" || + $package eq "SelectSaver" || $package =~/^(B|IO)::/) + { + delete_unsaved_hashINC($package); + return $unused_sub_packages{$package} = 0; + } + # Now see if current package looks like an OO class this is probably too strong. + foreach my $m (qw(new DESTROY TIESCALAR TIEARRAY TIEHASH TIEHANDLE)) + { + if (UNIVERSAL::can($package, $m)) + { + warn "$package has method $m: saving package\n";#debug + return mark_package($package); + } + } + delete_unsaved_hashINC($package); + return $unused_sub_packages{$package} = 0; +} +sub delete_unsaved_hashINC{ + my $packname=shift; + $packname =~ s/\:\:/\//g; + $packname .= '.pm'; +# warn "deleting $packname" if $INC{$packname} ;# debug + delete $INC{$packname}; +} +sub walkpackages +{ + my ($symref, $recurse, $prefix) = @_; + my $sym; + my $ref; + no strict 'vars'; + $prefix = '' unless defined $prefix; + while (($sym, $ref) = each %$symref) + { + local(*glob); + *glob = $ref; + if ($sym =~ /::$/) + { + $sym = $prefix . $sym; + if ($sym ne "main::" && $sym ne "<none>::" && &$recurse($sym)) + { + walkpackages(\%glob, $recurse, $sym); + } + } + } +} + + +sub save_unused_subs +{ + no strict qw(refs); + &descend_marked_unused; + warn "Prescan\n"; + walkpackages(\%{"main::"}, sub { should_save($_[0]); return 1 }); + warn "Saving methods\n"; + walksymtable(\%{"main::"}, "savecv", \&should_save); +} + +sub save_context +{ + my $curpad_nam = (comppadlist->ARRAY)[0]->save; + my $curpad_sym = (comppadlist->ARRAY)[1]->save; + my $inc_hv = svref_2object(\%INC)->save; + my $inc_av = svref_2object(\@INC)->save; + my $amagic_generate= amagic_generation; + $init->add( "PL_curpad = AvARRAY($curpad_sym);", + "GvHV(PL_incgv) = $inc_hv;", + "GvAV(PL_incgv) = $inc_av;", + "av_store(CvPADLIST(PL_main_cv),0,SvREFCNT_inc($curpad_nam));", + "av_store(CvPADLIST(PL_main_cv),1,SvREFCNT_inc($curpad_sym));", + "PL_amagic_generation= $amagic_generate;" ); +} + +sub descend_marked_unused { + foreach my $pack (keys %unused_sub_packages) + { + mark_package($pack); + } +} + +sub save_main { + # this is mainly for the test suite + my $warner = $SIG{__WARN__}; + local $SIG{__WARN__} = sub { print STDERR @_ }; + + warn "Starting compile\n"; + warn "Walking tree\n"; + seek(STDOUT,0,0); #exclude print statements in BEGIN{} into output + walkoptree(main_root, "save"); + warn "done main optree, walking symtable for extras\n" if $debug_cv; + save_unused_subs(); + # XSLoader was used, force saving of XSLoader::load + if( $use_xsloader ) { + my $cv = svref_2object( \&XSLoader::load ); + $cv->save; + } + # save %SIG ( in case it was set in a BEGIN block ) + if( $save_sig ) { + local $SIG{__WARN__} = $warner; + $init->no_split; + $init->add("{", "\tHV* hv = get_hv(\"main::SIG\",1);" ); + foreach my $k ( keys %SIG ) { + next unless ref $SIG{$k}; + my $cv = svref_2object( \$SIG{$k} ); + my $sv = $cv->save; + $init->add('{',sprintf 'SV* sv = (SV*)%s;', $sv ); + $init->add(sprintf("\thv_store(hv, %s, %u, %s, %s);", + cstring($k),length(pack "a*",$k), + 'sv', hash($k))); + $init->add('mg_set(sv);','}'); + } + $init->add('}'); + $init->split; + } + # honour -w + $init->add( sprintf " PL_dowarn = ( %s ) ? G_WARN_ON : G_WARN_OFF;", $^W ); + # + my $init_av = init_av->save; + my $end_av = end_av->save; + $init->add(sprintf("PL_main_root = s\\_%x;", ${main_root()}), + sprintf("PL_main_start = s\\_%x;", ${main_start()}), + "PL_initav = (AV *) $init_av;", + "PL_endav = (AV*) $end_av;"); + save_context(); + # init op addrs ( must be the last action, otherwise + # some ops might not be initialized + if( $optimize_ppaddr ) { + foreach my $i ( @op_sections ) { + my $section = $$i; + next unless $section->index >= 0; + init_op_addr( $section->name, $section->index + 1); + } + } + init_op_warn( $copsect->name, $copsect->index + 1) + if $optimize_warn_sv && $copsect->index >= 0; + + warn "Writing output\n"; + output_boilerplate(); + print "\n"; + output_all("perl_init"); + print "\n"; + output_main(); +} + +sub init_sections { + my @sections = (decl => \$decl, sym => \$symsect, + binop => \$binopsect, condop => \$condopsect, + cop => \$copsect, padop => \$padopsect, + listop => \$listopsect, logop => \$logopsect, + loop => \$loopsect, op => \$opsect, pmop => \$pmopsect, + pvop => \$pvopsect, svop => \$svopsect, unop => \$unopsect, + sv => \$svsect, xpv => \$xpvsect, xpvav => \$xpvavsect, + xpvhv => \$xpvhvsect, xpvcv => \$xpvcvsect, + xpviv => \$xpvivsect, xpvnv => \$xpvnvsect, + xpvmg => \$xpvmgsect, xpvlv => \$xpvlvsect, + xrv => \$xrvsect, xpvbm => \$xpvbmsect, + xpvio => \$xpviosect); + my ($name, $sectref); + while (($name, $sectref) = splice(@sections, 0, 2)) { + $$sectref = new B::C::Section $name, \%symtable, 0; + } + $init = new B::C::InitSection 'init', \%symtable, 0; +} + +sub mark_unused +{ + my ($arg,$val) = @_; + $unused_sub_packages{$arg} = $val; +} + +sub compile { + my @options = @_; + my ($option, $opt, $arg); + my @eval_at_startup; + my %option_map = ( 'cog' => \$pv_copy_on_grow, + 'save-data' => \$save_data_fh, + 'ppaddr' => \$optimize_ppaddr, + 'warn-sv' => \$optimize_warn_sv, + 'use-script-name' => \$use_perl_script_name, + 'save-sig-hash' => \$save_sig, + ); + my %optimization_map = ( 0 => [ qw() ], # special case + 1 => [ qw(-fcog) ], + 2 => [ qw(-fwarn-sv -fppaddr) ], + ); + OPTION: + while ($option = shift @options) { + if ($option =~ /^-(.)(.*)/) { + $opt = $1; + $arg = $2; + } else { + unshift @options, $option; + last OPTION; + } + if ($opt eq "-" && $arg eq "-") { + shift @options; + last OPTION; + } + if ($opt eq "w") { + $warn_undefined_syms = 1; + } elsif ($opt eq "D") { + $arg ||= shift @options; + foreach $arg (split(//, $arg)) { + if ($arg eq "o") { + B->debug(1); + } elsif ($arg eq "c") { + $debug_cops = 1; + } elsif ($arg eq "A") { + $debug_av = 1; + } elsif ($arg eq "C") { + $debug_cv = 1; + } elsif ($arg eq "M") { + $debug_mg = 1; + } else { + warn "ignoring unknown debug option: $arg\n"; + } + } + } elsif ($opt eq "o") { + $arg ||= shift @options; + open(STDOUT, ">$arg") or return "$arg: $!\n"; + } elsif ($opt eq "v") { + $verbose = 1; + } elsif ($opt eq "u") { + $arg ||= shift @options; + mark_unused($arg,undef); + } elsif ($opt eq "f") { + $arg ||= shift @options; + $arg =~ m/(no-)?(.*)/; + my $no = defined($1) && $1 eq 'no-'; + $arg = $no ? $2 : $arg; + if( exists $option_map{$arg} ) { + ${$option_map{$arg}} = !$no; + } else { + die "Invalid optimization '$arg'"; + } + } elsif ($opt eq "O") { + $arg = 1 if $arg eq ""; + my @opt; + foreach my $i ( 1 .. $arg ) { + push @opt, @{$optimization_map{$i}} + if exists $optimization_map{$i}; + } + unshift @options, @opt; + } elsif ($opt eq "e") { + push @eval_at_startup, $arg; + } elsif ($opt eq "l") { + $max_string_len = $arg; + } + } + init_sections(); + foreach my $i ( @eval_at_startup ) { + $init->add_eval( $i ); + } + if (@options) { + return sub { + my $objname; + foreach $objname (@options) { + eval "save_object(\\$objname)"; + } + output_all(); + } + } else { + return sub { save_main() }; + } +} + +1; + +__END__ + +=head1 NAME + +B::C - Perl compiler's C backend + +=head1 SYNOPSIS + + perl -MO=C[,OPTIONS] foo.pl + +=head1 DESCRIPTION + +This compiler backend takes Perl source and generates C source code +corresponding to the internal structures that perl uses to run +your program. When the generated C source is compiled and run, it +cuts out the time which perl would have taken to load and parse +your program into its internal semi-compiled form. That means that +compiling with this backend will not help improve the runtime +execution speed of your program but may improve the start-up time. +Depending on the environment in which your program runs this may be +either a help or a hindrance. + +=head1 OPTIONS + +If there are any non-option arguments, they are taken to be +names of objects to be saved (probably doesn't work properly yet). +Without extra arguments, it saves the main program. + +=over 4 + +=item B<-ofilename> + +Output to filename instead of STDOUT + +=item B<-v> + +Verbose compilation (currently gives a few compilation statistics). + +=item B<--> + +Force end of options + +=item B<-uPackname> + +Force apparently unused subs from package Packname to be compiled. +This allows programs to use eval "foo()" even when sub foo is never +seen to be used at compile time. The down side is that any subs which +really are never used also have code generated. This option is +necessary, for example, if you have a signal handler foo which you +initialise with C<$SIG{BAR} = "foo">. A better fix, though, is just +to change it to C<$SIG{BAR} = \&foo>. You can have multiple B<-u> +options. The compiler tries to figure out which packages may possibly +have subs in which need compiling but the current version doesn't do +it very well. In particular, it is confused by nested packages (i.e. +of the form C<A::B>) where package C<A> does not contain any subs. + +=item B<-D> + +Debug options (concatenated or separate flags like C<perl -D>). + +=item B<-Do> + +OPs, prints each OP as it's processed + +=item B<-Dc> + +COPs, prints COPs as processed (incl. file & line num) + +=item B<-DA> + +prints AV information on saving + +=item B<-DC> + +prints CV information on saving + +=item B<-DM> + +prints MAGIC information on saving + +=item B<-f> + +Force options/optimisations on or off one at a time. You can explicitly +disable an option using B<-fno-option>. All options default to +B<disabled>. + +=over 4 + +=item B<-fcog> + +Copy-on-grow: PVs declared and initialised statically. + +=item B<-fsave-data> + +Save package::DATA filehandles ( only available with PerlIO ). + +=item B<-fppaddr> + +Optimize the initialization of op_ppaddr. + +=item B<-fwarn-sv> + +Optimize the initialization of cop_warnings. + +=item B<-fuse-script-name> + +Use the script name instead of the program name as $0. + +=item B<-fsave-sig-hash> + +Save compile-time modifications to the %SIG hash. + +=back + +=item B<-On> + +Optimisation level (n = 0, 1, 2, ...). B<-O> means B<-O1>. + +=over 4 + +=item B<-O0> + +Disable all optimizations. + +=item B<-O1> + +Enable B<-fcog>. + +=item B<-O2> + +Enable B<-fppaddr>, B<-fwarn-sv>. + +=back + +=item B<-llimit> + +Some C compilers impose an arbitrary limit on the length of string +constants (e.g. 2048 characters for Microsoft Visual C++). The +B<-llimit> options tells the C backend not to generate string literals +exceeding that limit. + +=back + +=head1 EXAMPLES + + perl -MO=C,-ofoo.c foo.pl + perl cc_harness -o foo foo.c + +Note that C<cc_harness> lives in the C<B> subdirectory of your perl +library directory. The utility called C<perlcc> may also be used to +help make use of this compiler. + + perl -MO=C,-v,-DcA,-l2048 bar.pl > /dev/null + +=head1 BUGS + +Plenty. Current status: experimental. + +=head1 AUTHOR + +Malcolm Beattie, C<mbeattie@sable.ox.ac.uk> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/B/CC.pm b/Master/tlpkg/tlperl.old/lib/B/CC.pm new file mode 100644 index 00000000000..079313a0a4e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/CC.pm @@ -0,0 +1,2005 @@ +# CC.pm +# +# Copyright (c) 1996, 1997, 1998 Malcolm Beattie +# +# You may distribute under the terms of either the GNU General Public +# License or the Artistic License, as specified in the README file. +# +package B::CC; + +our $VERSION = '1.00_01'; + +use Config; +use strict; +use B qw(main_start main_root class comppadlist peekop svref_2object + timing_info init_av sv_undef amagic_generation + OPf_WANT_LIST OPf_WANT OPf_MOD OPf_STACKED OPf_SPECIAL + OPpASSIGN_BACKWARDS OPpLVAL_INTRO OPpDEREF_AV OPpDEREF_HV + OPpDEREF OPpFLIP_LINENUM G_ARRAY G_SCALAR + CXt_NULL CXt_SUB CXt_EVAL CXt_LOOP CXt_SUBST CXt_BLOCK + ); +use B::C qw(save_unused_subs objsym init_sections mark_unused + output_all output_boilerplate output_main); +use B::Bblock qw(find_leaders); +use B::Stackobj qw(:types :flags); + +# These should probably be elsewhere +# Flags for $op->flags + +my $module; # module name (when compiled with -m) +my %done; # hash keyed by $$op of leaders of basic blocks + # which have already been done. +my $leaders; # ref to hash of basic block leaders. Keys are $$op + # addresses, values are the $op objects themselves. +my @bblock_todo; # list of leaders of basic blocks that need visiting + # sometime. +my @cc_todo; # list of tuples defining what PP code needs to be + # saved (e.g. CV, main or PMOP repl code). Each tuple + # is [$name, $root, $start, @padlist]. PMOP repl code + # tuples inherit padlist. +my @stack; # shadows perl's stack when contents are known. + # Values are objects derived from class B::Stackobj +my @pad; # Lexicals in current pad as Stackobj-derived objects +my @padlist; # Copy of current padlist so PMOP repl code can find it +my @cxstack; # Shadows the (compile-time) cxstack for next,last,redo +my $jmpbuf_ix = 0; # Next free index for dynamically allocated jmpbufs +my %constobj; # OP_CONST constants as Stackobj-derived objects + # keyed by $$sv. +my $need_freetmps = 0; # We may postpone FREETMPS to the end of each basic + # block or even to the end of each loop of blocks, + # depending on optimisation options. +my $know_op = 0; # Set when C variable op already holds the right op + # (from an immediately preceding DOOP(ppname)). +my $errors = 0; # Number of errors encountered +my %skip_stack; # Hash of PP names which don't need write_back_stack +my %skip_lexicals; # Hash of PP names which don't need write_back_lexicals +my %skip_invalidate; # Hash of PP names which don't need invalidate_lexicals +my %ignore_op; # Hash of ops which do nothing except returning op_next +my %need_curcop; # Hash of ops which need PL_curcop + +my %lexstate; #state of padsvs at the start of a bblock + +BEGIN { + foreach (qw(pp_scalar pp_regcmaybe pp_lineseq pp_scope pp_null)) { + $ignore_op{$_} = 1; + } +} + +my ($module_name); +my ($debug_op, $debug_stack, $debug_cxstack, $debug_pad, $debug_runtime, + $debug_shadow, $debug_queue, $debug_lineno, $debug_timings); + +# Optimisation options. On the command line, use hyphens instead of +# underscores for compatibility with gcc-style options. We use +# underscores here because they are OK in (strict) barewords. +my ($freetmps_each_bblock, $freetmps_each_loop, $omit_taint); +my %optimise = (freetmps_each_bblock => \$freetmps_each_bblock, + freetmps_each_loop => \$freetmps_each_loop, + omit_taint => \$omit_taint); +# perl patchlevel to generate code for (defaults to current patchlevel) +my $patchlevel = int(0.5 + 1000 * ($] - 5)); + +# Could rewrite push_runtime() and output_runtime() to use a +# temporary file if memory is at a premium. +my $ppname; # name of current fake PP function +my $runtime_list_ref; +my $declare_ref; # Hash ref keyed by C variable type of declarations. + +my @pp_list; # list of [$ppname, $runtime_list_ref, $declare_ref] + # tuples to be written out. + +my ($init, $decl); + +sub init_hash { map { $_ => 1 } @_ } + +# +# Initialise the hashes for the default PP functions where we can avoid +# either write_back_stack, write_back_lexicals or invalidate_lexicals. +# +%skip_lexicals = init_hash qw(pp_enter pp_enterloop); +%skip_invalidate = init_hash qw(pp_enter pp_enterloop); +%need_curcop = init_hash qw(pp_rv2gv pp_bless pp_repeat pp_sort pp_caller + pp_reset pp_rv2cv pp_entereval pp_require pp_dofile + pp_entertry pp_enterloop pp_enteriter pp_entersub + pp_enter pp_method); + +sub debug { + if ($debug_runtime) { + warn(@_); + } else { + my @tmp=@_; + runtime(map { chomp; "/* $_ */"} @tmp); + } +} + +sub declare { + my ($type, $var) = @_; + push(@{$declare_ref->{$type}}, $var); +} + +sub push_runtime { + push(@$runtime_list_ref, @_); + warn join("\n", @_) . "\n" if $debug_runtime; +} + +sub save_runtime { + push(@pp_list, [$ppname, $runtime_list_ref, $declare_ref]); +} + +sub output_runtime { + my $ppdata; + print qq(#include "cc_runtime.h"\n); + foreach $ppdata (@pp_list) { + my ($name, $runtime, $declare) = @$ppdata; + print "\nstatic\nCCPP($name)\n{\n"; + my ($type, $varlist, $line); + while (($type, $varlist) = each %$declare) { + print "\t$type ", join(", ", @$varlist), ";\n"; + } + foreach $line (@$runtime) { + print $line, "\n"; + } + print "}\n"; + } +} + +sub runtime { + my $line; + foreach $line (@_) { + push_runtime("\t$line"); + } +} + +sub init_pp { + $ppname = shift; + $runtime_list_ref = []; + $declare_ref = {}; + runtime("dSP;"); + declare("I32", "oldsave"); + declare("SV", "**svp"); + map { declare("SV", "*$_") } qw(sv src dst left right); + declare("MAGIC", "*mg"); + $decl->add("static OP * $ppname (pTHX);"); + debug "init_pp: $ppname\n" if $debug_queue; +} + +# Initialise runtime_callback function for Stackobj class +BEGIN { B::Stackobj::set_callback(\&runtime) } + +# Initialise saveoptree_callback for B::C class +sub cc_queue { + my ($name, $root, $start, @pl) = @_; + debug "cc_queue: name $name, root $root, start $start, padlist (@pl)\n" + if $debug_queue; + if ($name eq "*ignore*") { + $name = 0; + } else { + push(@cc_todo, [$name, $root, $start, (@pl ? @pl : @padlist)]); + } + my $fakeop = new B::FAKEOP ("next" => 0, sibling => 0, ppaddr => $name); + $start = $fakeop->save; + debug "cc_queue: name $name returns $start\n" if $debug_queue; + return $start; +} +BEGIN { B::C::set_callback(\&cc_queue) } + +sub valid_int { $_[0]->{flags} & VALID_INT } +sub valid_double { $_[0]->{flags} & VALID_DOUBLE } +sub valid_numeric { $_[0]->{flags} & (VALID_INT | VALID_DOUBLE) } +sub valid_sv { $_[0]->{flags} & VALID_SV } + +sub top_int { @stack ? $stack[-1]->as_int : "TOPi" } +sub top_double { @stack ? $stack[-1]->as_double : "TOPn" } +sub top_numeric { @stack ? $stack[-1]->as_numeric : "TOPn" } +sub top_sv { @stack ? $stack[-1]->as_sv : "TOPs" } +sub top_bool { @stack ? $stack[-1]->as_bool : "SvTRUE(TOPs)" } + +sub pop_int { @stack ? (pop @stack)->as_int : "POPi" } +sub pop_double { @stack ? (pop @stack)->as_double : "POPn" } +sub pop_numeric { @stack ? (pop @stack)->as_numeric : "POPn" } +sub pop_sv { @stack ? (pop @stack)->as_sv : "POPs" } +sub pop_bool { + if (@stack) { + return ((pop @stack)->as_bool); + } else { + # Careful: POPs has an auto-decrement and SvTRUE evaluates + # its argument more than once. + runtime("sv = POPs;"); + return "SvTRUE(sv)"; + } +} + +sub write_back_lexicals { + my $avoid = shift || 0; + debug "write_back_lexicals($avoid) called from @{[(caller(1))[3]]}\n" + if $debug_shadow; + my $lex; + foreach $lex (@pad) { + next unless ref($lex); + $lex->write_back unless $lex->{flags} & $avoid; + } +} + +sub save_or_restore_lexical_state { + my $bblock=shift; + unless( exists $lexstate{$bblock}){ + foreach my $lex (@pad) { + next unless ref($lex); + ${$lexstate{$bblock}}{$lex->{iv}} = $lex->{flags} ; + } + } + else { + foreach my $lex (@pad) { + next unless ref($lex); + my $old_flags=${$lexstate{$bblock}}{$lex->{iv}} ; + next if ( $old_flags eq $lex->{flags}); + if (($old_flags & VALID_SV) && !($lex->{flags} & VALID_SV)){ + $lex->write_back; + } + if (($old_flags & VALID_DOUBLE) && !($lex->{flags} & VALID_DOUBLE)){ + $lex->load_double; + } + if (($old_flags & VALID_INT) && !($lex->{flags} & VALID_INT)){ + $lex->load_int; + } + } + } +} + +sub write_back_stack { + my $obj; + return unless @stack; + runtime(sprintf("EXTEND(sp, %d);", scalar(@stack))); + foreach $obj (@stack) { + runtime(sprintf("PUSHs((SV*)%s);", $obj->as_sv)); + } + @stack = (); +} + +sub invalidate_lexicals { + my $avoid = shift || 0; + debug "invalidate_lexicals($avoid) called from @{[(caller(1))[3]]}\n" + if $debug_shadow; + my $lex; + foreach $lex (@pad) { + next unless ref($lex); + $lex->invalidate unless $lex->{flags} & $avoid; + } +} + +sub reload_lexicals { + my $lex; + foreach $lex (@pad) { + next unless ref($lex); + my $type = $lex->{type}; + if ($type == T_INT) { + $lex->as_int; + } elsif ($type == T_DOUBLE) { + $lex->as_double; + } else { + $lex->as_sv; + } + } +} + +{ + package B::Pseudoreg; + # + # This class allocates pseudo-registers (OK, so they're C variables). + # + my %alloc; # Keyed by variable name. A value of 1 means the + # variable has been declared. A value of 2 means + # it's in use. + + sub new_scope { %alloc = () } + + sub new ($$$) { + my ($class, $type, $prefix) = @_; + my ($ptr, $i, $varname, $status, $obj); + $prefix =~ s/^(\**)//; + $ptr = $1; + $i = 0; + do { + $varname = "$prefix$i"; + $status = $alloc{$varname}; + } while $status == 2; + if ($status != 1) { + # Not declared yet + B::CC::declare($type, "$ptr$varname"); + $alloc{$varname} = 2; # declared and in use + } + $obj = bless \$varname, $class; + return $obj; + } + sub DESTROY { + my $obj = shift; + $alloc{$$obj} = 1; # no longer in use but still declared + } +} +{ + package B::Shadow; + # + # This class gives a standard API for a perl object to shadow a + # C variable and only generate reloads/write-backs when necessary. + # + # Use $obj->load($foo) instead of runtime("shadowed_c_var = foo"). + # Use $obj->write_back whenever shadowed_c_var needs to be up to date. + # Use $obj->invalidate whenever an unknown function may have + # set shadow itself. + + sub new { + my ($class, $write_back) = @_; + # Object fields are perl shadow variable, validity flag + # (for *C* variable) and callback sub for write_back + # (passed perl shadow variable as argument). + bless [undef, 1, $write_back], $class; + } + sub load { + my ($obj, $newval) = @_; + $obj->[1] = 0; # C variable no longer valid + $obj->[0] = $newval; + } + sub write_back { + my $obj = shift; + if (!($obj->[1])) { + $obj->[1] = 1; # C variable will now be valid + &{$obj->[2]}($obj->[0]); + } + } + sub invalidate { $_[0]->[1] = 0 } # force C variable to be invalid +} +my $curcop = new B::Shadow (sub { + my $opsym = shift->save; + runtime("PL_curcop = (COP*)$opsym;"); +}); + +# +# Context stack shadowing. Mimics stuff in pp_ctl.c, cop.h and so on. +# +sub dopoptoloop { + my $cxix = $#cxstack; + while ($cxix >= 0 && $cxstack[$cxix]->{type} != CXt_LOOP) { + $cxix--; + } + debug "dopoptoloop: returning $cxix" if $debug_cxstack; + return $cxix; +} + +sub dopoptolabel { + my $label = shift; + my $cxix = $#cxstack; + while ($cxix >= 0 && + ($cxstack[$cxix]->{type} != CXt_LOOP || + $cxstack[$cxix]->{label} ne $label)) { + $cxix--; + } + debug "dopoptolabel: returning $cxix" if $debug_cxstack; + return $cxix; +} + +sub error { + my $format = shift; + my $file = $curcop->[0]->file; + my $line = $curcop->[0]->line; + $errors++; + if (@_) { + warn sprintf("%s:%d: $format\n", $file, $line, @_); + } else { + warn sprintf("%s:%d: %s\n", $file, $line, $format); + } +} + +# +# Load pad takes (the elements of) a PADLIST as arguments and loads +# up @pad with Stackobj-derived objects which represent those lexicals. +# If/when perl itself can generate type information (my int $foo) then +# we'll take advantage of that here. Until then, we'll use various hacks +# to tell the compiler when we want a lexical to be a particular type +# or to be a register. +# +sub load_pad { + my ($namelistav, $valuelistav) = @_; + @padlist = @_; + my @namelist = $namelistav->ARRAY; + my @valuelist = $valuelistav->ARRAY; + my $ix; + @pad = (); + debug "load_pad: $#namelist names, $#valuelist values\n" if $debug_pad; + # Temporary lexicals don't get named so it's possible for @valuelist + # to be strictly longer than @namelist. We count $ix up to the end of + # @valuelist but index into @namelist for the name. Any temporaries which + # run off the end of @namelist will make $namesv undefined and we treat + # that the same as having an explicit SPECIAL sv_undef object in @namelist. + # [XXX If/when @_ becomes a lexical, we must start at 0 here.] + for ($ix = 1; $ix < @valuelist; $ix++) { + my $namesv = $namelist[$ix]; + my $type = T_UNKNOWN; + my $flags = 0; + my $name = "tmp$ix"; + my $class = class($namesv); + if (!defined($namesv) || $class eq "SPECIAL") { + # temporaries have &PL_sv_undef instead of a PVNV for a name + $flags = VALID_SV|TEMPORARY|REGISTER; + } else { + if ($namesv->PV =~ /^\$(.*)_([di])(r?)$/) { + $name = $1; + if ($2 eq "i") { + $type = T_INT; + $flags = VALID_SV|VALID_INT; + } elsif ($2 eq "d") { + $type = T_DOUBLE; + $flags = VALID_SV|VALID_DOUBLE; + } + $flags |= REGISTER if $3; + } + } + $pad[$ix] = new B::Stackobj::Padsv ($type, $flags, $ix, + "i_$name", "d_$name"); + + debug sprintf("PL_curpad[$ix] = %s\n", $pad[$ix]->peek) if $debug_pad; + } +} + +sub declare_pad { + my $ix; + for ($ix = 1; $ix <= $#pad; $ix++) { + my $type = $pad[$ix]->{type}; + declare("IV", $type == T_INT ? + sprintf("%s=0",$pad[$ix]->{iv}):$pad[$ix]->{iv}) if $pad[$ix]->save_int; + declare("double", $type == T_DOUBLE ? + sprintf("%s = 0",$pad[$ix]->{nv}):$pad[$ix]->{nv} )if $pad[$ix]->save_double; + + } +} +# +# Debugging stuff +# +sub peek_stack { sprintf "stack = %s\n", join(" ", map($_->minipeek, @stack)) } + +# +# OP stuff +# + +sub label { + my $op = shift; + # XXX Preserve original label name for "real" labels? + return sprintf("lab_%x", $$op); +} + +sub write_label { + my $op = shift; + push_runtime(sprintf(" %s:", label($op))); +} + +sub loadop { + my $op = shift; + my $opsym = $op->save; + runtime("PL_op = $opsym;") unless $know_op; + return $opsym; +} + +sub doop { + my $op = shift; + my $ppname = $op->ppaddr; + my $sym = loadop($op); + runtime("DOOP($ppname);"); + $know_op = 1; + return $sym; +} + +sub gimme { + my $op = shift; + my $flags = $op->flags; + return (($flags & OPf_WANT) ? (($flags & OPf_WANT)== OPf_WANT_LIST? G_ARRAY:G_SCALAR) : "dowantarray()"); +} + +# +# Code generation for PP code +# + +sub pp_null { + my $op = shift; + return $op->next; +} + +sub pp_stub { + my $op = shift; + my $gimme = gimme($op); + if ($gimme != G_ARRAY) { + my $obj= new B::Stackobj::Const(sv_undef); + push(@stack, $obj); + # XXX Change to push a constant sv_undef Stackobj onto @stack + #write_back_stack(); + #runtime("if ($gimme != G_ARRAY) XPUSHs(&PL_sv_undef);"); + } + return $op->next; +} + +sub pp_unstack { + my $op = shift; + @stack = (); + runtime("PP_UNSTACK;"); + return $op->next; +} + +sub pp_and { + my $op = shift; + my $next = $op->next; + reload_lexicals(); + unshift(@bblock_todo, $next); + if (@stack >= 1) { + my $bool = pop_bool(); + write_back_stack(); + save_or_restore_lexical_state($$next); + runtime(sprintf("if (!$bool) {XPUSHs(&PL_sv_no); goto %s;}", label($next))); + } else { + save_or_restore_lexical_state($$next); + runtime(sprintf("if (!%s) goto %s;", top_bool(), label($next)), + "*sp--;"); + } + return $op->other; +} + +sub pp_or { + my $op = shift; + my $next = $op->next; + reload_lexicals(); + unshift(@bblock_todo, $next); + if (@stack >= 1) { + my $bool = pop_bool @stack; + write_back_stack(); + save_or_restore_lexical_state($$next); + runtime(sprintf("if (%s) { XPUSHs(&PL_sv_yes); goto %s; }", + $bool, label($next))); + } else { + save_or_restore_lexical_state($$next); + runtime(sprintf("if (%s) goto %s;", top_bool(), label($next)), + "*sp--;"); + } + return $op->other; +} + +sub pp_cond_expr { + my $op = shift; + my $false = $op->next; + unshift(@bblock_todo, $false); + reload_lexicals(); + my $bool = pop_bool(); + write_back_stack(); + save_or_restore_lexical_state($$false); + runtime(sprintf("if (!$bool) goto %s;", label($false))); + return $op->other; +} + +sub pp_padsv { + my $op = shift; + my $ix = $op->targ; + push(@stack, $pad[$ix]); + if ($op->flags & OPf_MOD) { + my $private = $op->private; + if ($private & OPpLVAL_INTRO) { + runtime("SAVECLEARSV(PL_curpad[$ix]);"); + } elsif ($private & OPpDEREF) { + runtime(sprintf("vivify_ref(PL_curpad[%d], %d);", + $ix, $private & OPpDEREF)); + $pad[$ix]->invalidate; + } + } + return $op->next; +} + +sub pp_const { + my $op = shift; + my $sv = $op->sv; + my $obj; + # constant could be in the pad (under useithreads) + if ($$sv) { + $obj = $constobj{$$sv}; + if (!defined($obj)) { + $obj = $constobj{$$sv} = new B::Stackobj::Const ($sv); + } + } + else { + $obj = $pad[$op->targ]; + } + push(@stack, $obj); + return $op->next; +} + +sub pp_nextstate { + my $op = shift; + $curcop->load($op); + @stack = (); + debug(sprintf("%s:%d\n", $op->file, $op->line)) if $debug_lineno; + runtime("TAINT_NOT;") unless $omit_taint; + runtime("sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;"); + if ($freetmps_each_bblock || $freetmps_each_loop) { + $need_freetmps = 1; + } else { + runtime("FREETMPS;"); + } + return $op->next; +} + +sub pp_dbstate { + my $op = shift; + $curcop->invalidate; # XXX? + return default_pp($op); +} + +#default_pp will handle this: +#sub pp_bless { $curcop->write_back; default_pp(@_) } +#sub pp_repeat { $curcop->write_back; default_pp(@_) } +# The following subs need $curcop->write_back if we decide to support arybase: +# pp_pos, pp_substr, pp_index, pp_rindex, pp_aslice, pp_lslice, pp_splice +#sub pp_caller { $curcop->write_back; default_pp(@_) } +#sub pp_reset { $curcop->write_back; default_pp(@_) } + +sub pp_rv2gv{ + my $op =shift; + $curcop->write_back; + write_back_lexicals() unless $skip_lexicals{$ppname}; + write_back_stack() unless $skip_stack{$ppname}; + my $sym=doop($op); + if ($op->private & OPpDEREF) { + $init->add(sprintf("((UNOP *)$sym)->op_first = $sym;")); + $init->add(sprintf("((UNOP *)$sym)->op_type = %d;", + $op->first->type)); + } + return $op->next; +} +sub pp_sort { + my $op = shift; + my $ppname = $op->ppaddr; + if ( $op->flags & OPf_SPECIAL && $op->flags & OPf_STACKED){ + #this indicates the sort BLOCK Array case + #ugly surgery required. + my $root=$op->first->sibling->first; + my $start=$root->first; + $op->first->save; + $op->first->sibling->save; + $root->save; + my $sym=$start->save; + my $fakeop=cc_queue("pp_sort".$$op,$root,$start); + $init->add(sprintf("(%s)->op_next=%s;",$sym,$fakeop)); + } + $curcop->write_back; + write_back_lexicals(); + write_back_stack(); + doop($op); + return $op->next; +} + +sub pp_gv { + my $op = shift; + my $gvsym; + if ($Config{useithreads}) { + $gvsym = $pad[$op->padix]->as_sv; + } + else { + $gvsym = $op->gv->save; + } + write_back_stack(); + runtime("XPUSHs((SV*)$gvsym);"); + return $op->next; +} + +sub pp_gvsv { + my $op = shift; + my $gvsym; + if ($Config{useithreads}) { + $gvsym = $pad[$op->padix]->as_sv; + } + else { + $gvsym = $op->gv->save; + } + write_back_stack(); + if ($op->private & OPpLVAL_INTRO) { + runtime("XPUSHs(save_scalar($gvsym));"); + } else { + runtime("XPUSHs(GvSV($gvsym));"); + } + return $op->next; +} + +sub pp_aelemfast { + my $op = shift; + my $gvsym; + if ($Config{useithreads}) { + $gvsym = $pad[$op->padix]->as_sv; + } + else { + $gvsym = $op->gv->save; + } + my $ix = $op->private; + my $flag = $op->flags & OPf_MOD; + write_back_stack(); + runtime("svp = av_fetch(GvAV($gvsym), $ix, $flag);", + "PUSHs(svp ? *svp : &PL_sv_undef);"); + return $op->next; +} + +sub int_binop { + my ($op, $operator) = @_; + if ($op->flags & OPf_STACKED) { + my $right = pop_int(); + if (@stack >= 1) { + my $left = top_int(); + $stack[-1]->set_int(&$operator($left, $right)); + } else { + runtime(sprintf("sv_setiv(TOPs, %s);",&$operator("TOPi", $right))); + } + } else { + my $targ = $pad[$op->targ]; + my $right = new B::Pseudoreg ("IV", "riv"); + my $left = new B::Pseudoreg ("IV", "liv"); + runtime(sprintf("$$right = %s; $$left = %s;", pop_int(), pop_int)); + $targ->set_int(&$operator($$left, $$right)); + push(@stack, $targ); + } + return $op->next; +} + +sub INTS_CLOSED () { 0x1 } +sub INT_RESULT () { 0x2 } +sub NUMERIC_RESULT () { 0x4 } + +sub numeric_binop { + my ($op, $operator, $flags) = @_; + my $force_int = 0; + $force_int ||= ($flags & INT_RESULT); + $force_int ||= ($flags & INTS_CLOSED && @stack >= 2 + && valid_int($stack[-2]) && valid_int($stack[-1])); + if ($op->flags & OPf_STACKED) { + my $right = pop_numeric(); + if (@stack >= 1) { + my $left = top_numeric(); + if ($force_int) { + $stack[-1]->set_int(&$operator($left, $right)); + } else { + $stack[-1]->set_numeric(&$operator($left, $right)); + } + } else { + if ($force_int) { + my $rightruntime = new B::Pseudoreg ("IV", "riv"); + runtime(sprintf("$$rightruntime = %s;",$right)); + runtime(sprintf("sv_setiv(TOPs, %s);", + &$operator("TOPi", $$rightruntime))); + } else { + my $rightruntime = new B::Pseudoreg ("double", "rnv"); + runtime(sprintf("$$rightruntime = %s;",$right)); + runtime(sprintf("sv_setnv(TOPs, %s);", + &$operator("TOPn",$$rightruntime))); + } + } + } else { + my $targ = $pad[$op->targ]; + $force_int ||= ($targ->{type} == T_INT); + if ($force_int) { + my $right = new B::Pseudoreg ("IV", "riv"); + my $left = new B::Pseudoreg ("IV", "liv"); + runtime(sprintf("$$right = %s; $$left = %s;", + pop_numeric(), pop_numeric)); + $targ->set_int(&$operator($$left, $$right)); + } else { + my $right = new B::Pseudoreg ("double", "rnv"); + my $left = new B::Pseudoreg ("double", "lnv"); + runtime(sprintf("$$right = %s; $$left = %s;", + pop_numeric(), pop_numeric)); + $targ->set_numeric(&$operator($$left, $$right)); + } + push(@stack, $targ); + } + return $op->next; +} + +sub pp_ncmp { + my ($op) = @_; + if ($op->flags & OPf_STACKED) { + my $right = pop_numeric(); + if (@stack >= 1) { + my $left = top_numeric(); + runtime sprintf("if (%s > %s){",$left,$right); + $stack[-1]->set_int(1); + $stack[-1]->write_back(); + runtime sprintf("}else if (%s < %s ) {",$left,$right); + $stack[-1]->set_int(-1); + $stack[-1]->write_back(); + runtime sprintf("}else if (%s == %s) {",$left,$right); + $stack[-1]->set_int(0); + $stack[-1]->write_back(); + runtime sprintf("}else {"); + $stack[-1]->set_sv("&PL_sv_undef"); + runtime "}"; + } else { + my $rightruntime = new B::Pseudoreg ("double", "rnv"); + runtime(sprintf("$$rightruntime = %s;",$right)); + runtime sprintf(qq/if ("TOPn" > %s){/,$rightruntime); + runtime sprintf("sv_setiv(TOPs,1);"); + runtime sprintf(qq/}else if ( "TOPn" < %s ) {/,$$rightruntime); + runtime sprintf("sv_setiv(TOPs,-1);"); + runtime sprintf(qq/} else if ("TOPn" == %s) {/,$$rightruntime); + runtime sprintf("sv_setiv(TOPs,0);"); + runtime sprintf(qq/}else {/); + runtime sprintf("sv_setiv(TOPs,&PL_sv_undef;"); + runtime "}"; + } + } else { + my $targ = $pad[$op->targ]; + my $right = new B::Pseudoreg ("double", "rnv"); + my $left = new B::Pseudoreg ("double", "lnv"); + runtime(sprintf("$$right = %s; $$left = %s;", + pop_numeric(), pop_numeric)); + runtime sprintf("if (%s > %s){",$$left,$$right); + $targ->set_int(1); + $targ->write_back(); + runtime sprintf("}else if (%s < %s ) {",$$left,$$right); + $targ->set_int(-1); + $targ->write_back(); + runtime sprintf("}else if (%s == %s) {",$$left,$$right); + $targ->set_int(0); + $targ->write_back(); + runtime sprintf("}else {"); + $targ->set_sv("&PL_sv_undef"); + runtime "}"; + push(@stack, $targ); + } + return $op->next; +} + +sub sv_binop { + my ($op, $operator, $flags) = @_; + if ($op->flags & OPf_STACKED) { + my $right = pop_sv(); + if (@stack >= 1) { + my $left = top_sv(); + if ($flags & INT_RESULT) { + $stack[-1]->set_int(&$operator($left, $right)); + } elsif ($flags & NUMERIC_RESULT) { + $stack[-1]->set_numeric(&$operator($left, $right)); + } else { + # XXX Does this work? + runtime(sprintf("sv_setsv($left, %s);", + &$operator($left, $right))); + $stack[-1]->invalidate; + } + } else { + my $f; + if ($flags & INT_RESULT) { + $f = "sv_setiv"; + } elsif ($flags & NUMERIC_RESULT) { + $f = "sv_setnv"; + } else { + $f = "sv_setsv"; + } + runtime(sprintf("%s(TOPs, %s);", $f, &$operator("TOPs", $right))); + } + } else { + my $targ = $pad[$op->targ]; + runtime(sprintf("right = %s; left = %s;", pop_sv(), pop_sv)); + if ($flags & INT_RESULT) { + $targ->set_int(&$operator("left", "right")); + } elsif ($flags & NUMERIC_RESULT) { + $targ->set_numeric(&$operator("left", "right")); + } else { + # XXX Does this work? + runtime(sprintf("sv_setsv(%s, %s);", + $targ->as_sv, &$operator("left", "right"))); + $targ->invalidate; + } + push(@stack, $targ); + } + return $op->next; +} + +sub bool_int_binop { + my ($op, $operator) = @_; + my $right = new B::Pseudoreg ("IV", "riv"); + my $left = new B::Pseudoreg ("IV", "liv"); + runtime(sprintf("$$right = %s; $$left = %s;", pop_int(), pop_int())); + my $bool = new B::Stackobj::Bool (new B::Pseudoreg ("int", "b")); + $bool->set_int(&$operator($$left, $$right)); + push(@stack, $bool); + return $op->next; +} + +sub bool_numeric_binop { + my ($op, $operator) = @_; + my $right = new B::Pseudoreg ("double", "rnv"); + my $left = new B::Pseudoreg ("double", "lnv"); + runtime(sprintf("$$right = %s; $$left = %s;", + pop_numeric(), pop_numeric())); + my $bool = new B::Stackobj::Bool (new B::Pseudoreg ("int", "b")); + $bool->set_numeric(&$operator($$left, $$right)); + push(@stack, $bool); + return $op->next; +} + +sub bool_sv_binop { + my ($op, $operator) = @_; + runtime(sprintf("right = %s; left = %s;", pop_sv(), pop_sv())); + my $bool = new B::Stackobj::Bool (new B::Pseudoreg ("int", "b")); + $bool->set_numeric(&$operator("left", "right")); + push(@stack, $bool); + return $op->next; +} + +sub infix_op { + my $opname = shift; + return sub { "$_[0] $opname $_[1]" } +} + +sub prefix_op { + my $opname = shift; + return sub { sprintf("%s(%s)", $opname, join(", ", @_)) } +} + +BEGIN { + my $plus_op = infix_op("+"); + my $minus_op = infix_op("-"); + my $multiply_op = infix_op("*"); + my $divide_op = infix_op("/"); + my $modulo_op = infix_op("%"); + my $lshift_op = infix_op("<<"); + my $rshift_op = infix_op(">>"); + my $scmp_op = prefix_op("sv_cmp"); + my $seq_op = prefix_op("sv_eq"); + my $sne_op = prefix_op("!sv_eq"); + my $slt_op = sub { "sv_cmp($_[0], $_[1]) < 0" }; + my $sgt_op = sub { "sv_cmp($_[0], $_[1]) > 0" }; + my $sle_op = sub { "sv_cmp($_[0], $_[1]) <= 0" }; + my $sge_op = sub { "sv_cmp($_[0], $_[1]) >= 0" }; + my $eq_op = infix_op("=="); + my $ne_op = infix_op("!="); + my $lt_op = infix_op("<"); + my $gt_op = infix_op(">"); + my $le_op = infix_op("<="); + my $ge_op = infix_op(">="); + + # + # XXX The standard perl PP code has extra handling for + # some special case arguments of these operators. + # + sub pp_add { numeric_binop($_[0], $plus_op) } + sub pp_subtract { numeric_binop($_[0], $minus_op) } + sub pp_multiply { numeric_binop($_[0], $multiply_op) } + sub pp_divide { numeric_binop($_[0], $divide_op) } + sub pp_modulo { int_binop($_[0], $modulo_op) } # differs from perl's + + sub pp_left_shift { int_binop($_[0], $lshift_op) } + sub pp_right_shift { int_binop($_[0], $rshift_op) } + sub pp_i_add { int_binop($_[0], $plus_op) } + sub pp_i_subtract { int_binop($_[0], $minus_op) } + sub pp_i_multiply { int_binop($_[0], $multiply_op) } + sub pp_i_divide { int_binop($_[0], $divide_op) } + sub pp_i_modulo { int_binop($_[0], $modulo_op) } + + sub pp_eq { bool_numeric_binop($_[0], $eq_op) } + sub pp_ne { bool_numeric_binop($_[0], $ne_op) } + sub pp_lt { bool_numeric_binop($_[0], $lt_op) } + sub pp_gt { bool_numeric_binop($_[0], $gt_op) } + sub pp_le { bool_numeric_binop($_[0], $le_op) } + sub pp_ge { bool_numeric_binop($_[0], $ge_op) } + + sub pp_i_eq { bool_int_binop($_[0], $eq_op) } + sub pp_i_ne { bool_int_binop($_[0], $ne_op) } + sub pp_i_lt { bool_int_binop($_[0], $lt_op) } + sub pp_i_gt { bool_int_binop($_[0], $gt_op) } + sub pp_i_le { bool_int_binop($_[0], $le_op) } + sub pp_i_ge { bool_int_binop($_[0], $ge_op) } + + sub pp_scmp { sv_binop($_[0], $scmp_op, INT_RESULT) } + sub pp_slt { bool_sv_binop($_[0], $slt_op) } + sub pp_sgt { bool_sv_binop($_[0], $sgt_op) } + sub pp_sle { bool_sv_binop($_[0], $sle_op) } + sub pp_sge { bool_sv_binop($_[0], $sge_op) } + sub pp_seq { bool_sv_binop($_[0], $seq_op) } + sub pp_sne { bool_sv_binop($_[0], $sne_op) } +} + + +sub pp_sassign { + my $op = shift; + my $backwards = $op->private & OPpASSIGN_BACKWARDS; + my ($dst, $src); + if (@stack >= 2) { + $dst = pop @stack; + $src = pop @stack; + ($src, $dst) = ($dst, $src) if $backwards; + my $type = $src->{type}; + if ($type == T_INT) { + $dst->set_int($src->as_int,$src->{flags} & VALID_UNSIGNED); + } elsif ($type == T_DOUBLE) { + $dst->set_numeric($src->as_numeric); + } else { + $dst->set_sv($src->as_sv); + } + push(@stack, $dst); + } elsif (@stack == 1) { + if ($backwards) { + my $src = pop @stack; + my $type = $src->{type}; + runtime("if (PL_tainting && PL_tainted) TAINT_NOT;"); + if ($type == T_INT) { + if ($src->{flags} & VALID_UNSIGNED){ + runtime sprintf("sv_setuv(TOPs, %s);", $src->as_int); + }else{ + runtime sprintf("sv_setiv(TOPs, %s);", $src->as_int); + } + } elsif ($type == T_DOUBLE) { + runtime sprintf("sv_setnv(TOPs, %s);", $src->as_double); + } else { + runtime sprintf("sv_setsv(TOPs, %s);", $src->as_sv); + } + runtime("SvSETMAGIC(TOPs);"); + } else { + my $dst = $stack[-1]; + my $type = $dst->{type}; + runtime("sv = POPs;"); + runtime("MAYBE_TAINT_SASSIGN_SRC(sv);"); + if ($type == T_INT) { + $dst->set_int("SvIV(sv)"); + } elsif ($type == T_DOUBLE) { + $dst->set_double("SvNV(sv)"); + } else { + runtime("SvSetMagicSV($dst->{sv}, sv);"); + $dst->invalidate; + } + } + } else { + if ($backwards) { + runtime("src = POPs; dst = TOPs;"); + } else { + runtime("dst = POPs; src = TOPs;"); + } + runtime("MAYBE_TAINT_SASSIGN_SRC(src);", + "SvSetSV(dst, src);", + "SvSETMAGIC(dst);", + "SETs(dst);"); + } + return $op->next; +} + +sub pp_preinc { + my $op = shift; + if (@stack >= 1) { + my $obj = $stack[-1]; + my $type = $obj->{type}; + if ($type == T_INT || $type == T_DOUBLE) { + $obj->set_int($obj->as_int . " + 1"); + } else { + runtime sprintf("PP_PREINC(%s);", $obj->as_sv); + $obj->invalidate(); + } + } else { + runtime sprintf("PP_PREINC(TOPs);"); + } + return $op->next; +} + + +sub pp_pushmark { + my $op = shift; + write_back_stack(); + runtime("PUSHMARK(sp);"); + return $op->next; +} + +sub pp_list { + my $op = shift; + write_back_stack(); + my $gimme = gimme($op); + if ($gimme == G_ARRAY) { # sic + runtime("POPMARK;"); # need this even though not a "full" pp_list + } else { + runtime("PP_LIST($gimme);"); + } + return $op->next; +} + +sub pp_entersub { + my $op = shift; + $curcop->write_back; + write_back_lexicals(REGISTER|TEMPORARY); + write_back_stack(); + my $sym = doop($op); + runtime("while (PL_op != ($sym)->op_next && PL_op != (OP*)0 ){"); + runtime("PL_op = (*PL_op->op_ppaddr)(aTHX);"); + runtime("SPAGAIN;}"); + $know_op = 0; + invalidate_lexicals(REGISTER|TEMPORARY); + return $op->next; +} +sub pp_formline { + my $op = shift; + my $ppname = $op->ppaddr; + write_back_lexicals() unless $skip_lexicals{$ppname}; + write_back_stack() unless $skip_stack{$ppname}; + my $sym=doop($op); + # See comment in pp_grepwhile to see why! + $init->add("((LISTOP*)$sym)->op_first = $sym;"); + runtime("if (PL_op == ((LISTOP*)($sym))->op_first){"); + save_or_restore_lexical_state(${$op->first}); + runtime( sprintf("goto %s;",label($op->first))); + runtime("}"); + return $op->next; +} + +sub pp_goto{ + + my $op = shift; + my $ppname = $op->ppaddr; + write_back_lexicals() unless $skip_lexicals{$ppname}; + write_back_stack() unless $skip_stack{$ppname}; + my $sym=doop($op); + runtime("if (PL_op != ($sym)->op_next && PL_op != (OP*)0){return PL_op;}"); + invalidate_lexicals() unless $skip_invalidate{$ppname}; + return $op->next; +} +sub pp_enterwrite { + my $op = shift; + pp_entersub($op); +} +sub pp_leavesub{ + my $op = shift; + write_back_lexicals() unless $skip_lexicals{$ppname}; + write_back_stack() unless $skip_stack{$ppname}; + runtime("if (PL_curstackinfo->si_type == PERLSI_SORT){"); + runtime("\tPUTBACK;return 0;"); + runtime("}"); + doop($op); + return $op->next; +} +sub pp_leavewrite { + my $op = shift; + write_back_lexicals(REGISTER|TEMPORARY); + write_back_stack(); + my $sym = doop($op); + # XXX Is this the right way to distinguish between it returning + # CvSTART(cv) (via doform) and pop_return()? + #runtime("if (PL_op) PL_op = (*PL_op->op_ppaddr)(aTHX);"); + runtime("SPAGAIN;"); + $know_op = 0; + invalidate_lexicals(REGISTER|TEMPORARY); + return $op->next; +} + +sub doeval { + my $op = shift; + $curcop->write_back; + write_back_lexicals(REGISTER|TEMPORARY); + write_back_stack(); + my $sym = loadop($op); + my $ppaddr = $op->ppaddr; + #runtime(qq/printf("$ppaddr type eval\n");/); + runtime("PP_EVAL($ppaddr, ($sym)->op_next);"); + $know_op = 1; + invalidate_lexicals(REGISTER|TEMPORARY); + return $op->next; +} + +sub pp_entereval { doeval(@_) } +sub pp_dofile { doeval(@_) } + +#pp_require is protected by pp_entertry, so no protection for it. +sub pp_require { + my $op = shift; + $curcop->write_back; + write_back_lexicals(REGISTER|TEMPORARY); + write_back_stack(); + my $sym = doop($op); + runtime("while (PL_op != ($sym)->op_next && PL_op != (OP*)0 ){"); + runtime("PL_op = (*PL_op->op_ppaddr)(ARGS);"); + runtime("SPAGAIN;}"); + $know_op = 1; + invalidate_lexicals(REGISTER|TEMPORARY); + return $op->next; +} + + +sub pp_entertry { + my $op = shift; + $curcop->write_back; + write_back_lexicals(REGISTER|TEMPORARY); + write_back_stack(); + my $sym = doop($op); + my $jmpbuf = sprintf("jmpbuf%d", $jmpbuf_ix++); + declare("JMPENV", $jmpbuf); + runtime(sprintf("PP_ENTERTRY(%s,%s);", $jmpbuf, label($op->other->next))); + invalidate_lexicals(REGISTER|TEMPORARY); + return $op->next; +} + +sub pp_leavetry{ + my $op=shift; + default_pp($op); + runtime("PP_LEAVETRY;"); + return $op->next; +} + +sub pp_grepstart { + my $op = shift; + if ($need_freetmps && $freetmps_each_loop) { + runtime("FREETMPS;"); # otherwise the grepwhile loop messes things up + $need_freetmps = 0; + } + write_back_stack(); + my $sym= doop($op); + my $next=$op->next; + $next->save; + my $nexttonext=$next->next; + $nexttonext->save; + save_or_restore_lexical_state($$nexttonext); + runtime(sprintf("if (PL_op == (($sym)->op_next)->op_next) goto %s;", + label($nexttonext))); + return $op->next->other; +} + +sub pp_mapstart { + my $op = shift; + if ($need_freetmps && $freetmps_each_loop) { + runtime("FREETMPS;"); # otherwise the mapwhile loop messes things up + $need_freetmps = 0; + } + write_back_stack(); + # pp_mapstart can return either op_next->op_next or op_next->op_other and + # we need to be able to distinguish the two at runtime. + my $sym= doop($op); + my $next=$op->next; + $next->save; + my $nexttonext=$next->next; + $nexttonext->save; + save_or_restore_lexical_state($$nexttonext); + runtime(sprintf("if (PL_op == (($sym)->op_next)->op_next) goto %s;", + label($nexttonext))); + return $op->next->other; +} + +sub pp_grepwhile { + my $op = shift; + my $next = $op->next; + unshift(@bblock_todo, $next); + write_back_lexicals(); + write_back_stack(); + my $sym = doop($op); + # pp_grepwhile can return either op_next or op_other and we need to + # be able to distinguish the two at runtime. Since it's possible for + # both ops to be "inlined", the fields could both be zero. To get + # around that, we hack op_next to be our own op (purely because we + # know it's a non-NULL pointer and can't be the same as op_other). + $init->add("((LOGOP*)$sym)->op_next = $sym;"); + save_or_restore_lexical_state($$next); + runtime(sprintf("if (PL_op == ($sym)->op_next) goto %s;", label($next))); + $know_op = 0; + return $op->other; +} + +sub pp_mapwhile { + pp_grepwhile(@_); +} + +sub pp_return { + my $op = shift; + write_back_lexicals(REGISTER|TEMPORARY); + write_back_stack(); + doop($op); + runtime("PUTBACK;", "return PL_op;"); + $know_op = 0; + return $op->next; +} + +sub nyi { + my $op = shift; + warn sprintf("%s not yet implemented properly\n", $op->ppaddr); + return default_pp($op); +} + +sub pp_range { + my $op = shift; + my $flags = $op->flags; + if (!($flags & OPf_WANT)) { + error("context of range unknown at compile-time"); + } + write_back_lexicals(); + write_back_stack(); + unless (($flags & OPf_WANT)== OPf_WANT_LIST) { + # We need to save our UNOP structure since pp_flop uses + # it to find and adjust out targ. We don't need it ourselves. + $op->save; + save_or_restore_lexical_state(${$op->other}); + runtime sprintf("if (SvTRUE(PL_curpad[%d])) goto %s;", + $op->targ, label($op->other)); + unshift(@bblock_todo, $op->other); + } + return $op->next; +} + +sub pp_flip { + my $op = shift; + my $flags = $op->flags; + if (!($flags & OPf_WANT)) { + error("context of flip unknown at compile-time"); + } + if (($flags & OPf_WANT)==OPf_WANT_LIST) { + return $op->first->other; + } + write_back_lexicals(); + write_back_stack(); + # We need to save our UNOP structure since pp_flop uses + # it to find and adjust out targ. We don't need it ourselves. + $op->save; + my $ix = $op->targ; + my $rangeix = $op->first->targ; + runtime(($op->private & OPpFLIP_LINENUM) ? + "if (PL_last_in_gv && SvIV(TOPs) == IoLINES(GvIOp(PL_last_in_gv))) {" + : "if (SvTRUE(TOPs)) {"); + runtime("\tsv_setiv(PL_curpad[$rangeix], 1);"); + if ($op->flags & OPf_SPECIAL) { + runtime("sv_setiv(PL_curpad[$ix], 1);"); + } else { + save_or_restore_lexical_state(${$op->first->other}); + runtime("\tsv_setiv(PL_curpad[$ix], 0);", + "\tsp--;", + sprintf("\tgoto %s;", label($op->first->other))); + } + runtime("}", + qq{sv_setpv(PL_curpad[$ix], "");}, + "SETs(PL_curpad[$ix]);"); + $know_op = 0; + return $op->next; +} + +sub pp_flop { + my $op = shift; + default_pp($op); + $know_op = 0; + return $op->next; +} + +sub enterloop { + my $op = shift; + my $nextop = $op->nextop; + my $lastop = $op->lastop; + my $redoop = $op->redoop; + $curcop->write_back; + debug "enterloop: pushing on cxstack" if $debug_cxstack; + push(@cxstack, { + type => CXt_LOOP, + op => $op, + "label" => $curcop->[0]->label, + nextop => $nextop, + lastop => $lastop, + redoop => $redoop + }); + $nextop->save; + $lastop->save; + $redoop->save; + return default_pp($op); +} + +sub pp_enterloop { enterloop(@_) } +sub pp_enteriter { enterloop(@_) } + +sub pp_leaveloop { + my $op = shift; + if (!@cxstack) { + die "panic: leaveloop"; + } + debug "leaveloop: popping from cxstack" if $debug_cxstack; + pop(@cxstack); + return default_pp($op); +} + +sub pp_next { + my $op = shift; + my $cxix; + if ($op->flags & OPf_SPECIAL) { + $cxix = dopoptoloop(); + if ($cxix < 0) { + error('"next" used outside loop'); + return $op->next; # ignore the op + } + } else { + $cxix = dopoptolabel($op->pv); + if ($cxix < 0) { + error('Label not found at compile time for "next %s"', $op->pv); + return $op->next; # ignore the op + } + } + default_pp($op); + my $nextop = $cxstack[$cxix]->{nextop}; + push(@bblock_todo, $nextop); + save_or_restore_lexical_state($$nextop); + runtime(sprintf("goto %s;", label($nextop))); + return $op->next; +} + +sub pp_redo { + my $op = shift; + my $cxix; + if ($op->flags & OPf_SPECIAL) { + $cxix = dopoptoloop(); + if ($cxix < 0) { + error('"redo" used outside loop'); + return $op->next; # ignore the op + } + } else { + $cxix = dopoptolabel($op->pv); + if ($cxix < 0) { + error('Label not found at compile time for "redo %s"', $op->pv); + return $op->next; # ignore the op + } + } + default_pp($op); + my $redoop = $cxstack[$cxix]->{redoop}; + push(@bblock_todo, $redoop); + save_or_restore_lexical_state($$redoop); + runtime(sprintf("goto %s;", label($redoop))); + return $op->next; +} + +sub pp_last { + my $op = shift; + my $cxix; + if ($op->flags & OPf_SPECIAL) { + $cxix = dopoptoloop(); + if ($cxix < 0) { + error('"last" used outside loop'); + return $op->next; # ignore the op + } + } else { + $cxix = dopoptolabel($op->pv); + if ($cxix < 0) { + error('Label not found at compile time for "last %s"', $op->pv); + return $op->next; # ignore the op + } + # XXX Add support for "last" to leave non-loop blocks + if ($cxstack[$cxix]->{type} != CXt_LOOP) { + error('Use of "last" for non-loop blocks is not yet implemented'); + return $op->next; # ignore the op + } + } + default_pp($op); + my $lastop = $cxstack[$cxix]->{lastop}->next; + push(@bblock_todo, $lastop); + save_or_restore_lexical_state($$lastop); + runtime(sprintf("goto %s;", label($lastop))); + return $op->next; +} + +sub pp_subst { + my $op = shift; + write_back_lexicals(); + write_back_stack(); + my $sym = doop($op); + my $replroot = $op->pmreplroot; + if ($$replroot) { + save_or_restore_lexical_state($$replroot); + runtime sprintf("if (PL_op == ((PMOP*)(%s))->op_pmreplroot) goto %s;", + $sym, label($replroot)); + $op->pmreplstart->save; + push(@bblock_todo, $replroot); + } + invalidate_lexicals(); + return $op->next; +} + +sub pp_substcont { + my $op = shift; + write_back_lexicals(); + write_back_stack(); + doop($op); + my $pmop = $op->other; + # warn sprintf("substcont: op = %s, pmop = %s\n", + # peekop($op), peekop($pmop));#debug +# my $pmopsym = objsym($pmop); + my $pmopsym = $pmop->save; # XXX can this recurse? +# warn "pmopsym = $pmopsym\n";#debug + save_or_restore_lexical_state(${$pmop->pmreplstart}); + runtime sprintf("if (PL_op == ((PMOP*)(%s))->op_pmreplstart) goto %s;", + $pmopsym, label($pmop->pmreplstart)); + invalidate_lexicals(); + return $pmop->next; +} + +sub default_pp { + my $op = shift; + my $ppname = "pp_" . $op->name; + if ($curcop and $need_curcop{$ppname}){ + $curcop->write_back; + } + write_back_lexicals() unless $skip_lexicals{$ppname}; + write_back_stack() unless $skip_stack{$ppname}; + doop($op); + # XXX If the only way that ops can write to a TEMPORARY lexical is + # when it's named in $op->targ then we could call + # invalidate_lexicals(TEMPORARY) and avoid having to write back all + # the temporaries. For now, we'll play it safe and write back the lot. + invalidate_lexicals() unless $skip_invalidate{$ppname}; + return $op->next; +} + +sub compile_op { + my $op = shift; + my $ppname = "pp_" . $op->name; + if (exists $ignore_op{$ppname}) { + return $op->next; + } + debug peek_stack() if $debug_stack; + if ($debug_op) { + debug sprintf("%s [%s]\n", + peekop($op), + $op->flags & OPf_STACKED ? "OPf_STACKED" : $op->targ); + } + no strict 'refs'; + if (defined(&$ppname)) { + $know_op = 0; + return &$ppname($op); + } else { + return default_pp($op); + } +} + +sub compile_bblock { + my $op = shift; + #warn "compile_bblock: ", peekop($op), "\n"; # debug + save_or_restore_lexical_state($$op); + write_label($op); + $know_op = 0; + do { + $op = compile_op($op); + } while (defined($op) && $$op && !exists($leaders->{$$op})); + write_back_stack(); # boo hoo: big loss + reload_lexicals(); + return $op; +} + +sub cc { + my ($name, $root, $start, @padlist) = @_; + my $op; + if($done{$$start}){ + #warn "repeat=>".ref($start)."$name,\n";#debug + $decl->add(sprintf("#define $name %s",$done{$$start})); + return; + } + init_pp($name); + load_pad(@padlist); + %lexstate=(); + B::Pseudoreg->new_scope; + @cxstack = (); + if ($debug_timings) { + warn sprintf("Basic block analysis at %s\n", timing_info); + } + $leaders = find_leaders($root, $start); + my @leaders= keys %$leaders; + if ($#leaders > -1) { + @bblock_todo = ($start, values %$leaders) ; + } else{ + runtime("return PL_op?PL_op->op_next:0;"); + } + if ($debug_timings) { + warn sprintf("Compilation at %s\n", timing_info); + } + while (@bblock_todo) { + $op = shift @bblock_todo; + #warn sprintf("Considering basic block %s\n", peekop($op)); # debug + next if !defined($op) || !$$op || $done{$$op}; + #warn "...compiling it\n"; # debug + do { + $done{$$op} = $name; + $op = compile_bblock($op); + if ($need_freetmps && $freetmps_each_bblock) { + runtime("FREETMPS;"); + $need_freetmps = 0; + } + } while defined($op) && $$op && !$done{$$op}; + if ($need_freetmps && $freetmps_each_loop) { + runtime("FREETMPS;"); + $need_freetmps = 0; + } + if (!$$op) { + runtime("PUTBACK;","return PL_op;"); + } elsif ($done{$$op}) { + save_or_restore_lexical_state($$op); + runtime(sprintf("goto %s;", label($op))); + } + } + if ($debug_timings) { + warn sprintf("Saving runtime at %s\n", timing_info); + } + declare_pad(@padlist) ; + save_runtime(); +} + +sub cc_recurse { + my $ccinfo; + my $start; + $start = cc_queue(@_) if @_; + while ($ccinfo = shift @cc_todo) { + cc(@$ccinfo); + } + return $start; +} + +sub cc_obj { + my ($name, $cvref) = @_; + my $cv = svref_2object($cvref); + my @padlist = $cv->PADLIST->ARRAY; + my $curpad_sym = $padlist[1]->save; + cc_recurse($name, $cv->ROOT, $cv->START, @padlist); +} + +sub cc_main { + my @comppadlist = comppadlist->ARRAY; + my $curpad_nam = $comppadlist[0]->save; + my $curpad_sym = $comppadlist[1]->save; + my $init_av = init_av->save; + my $start = cc_recurse("pp_main", main_root, main_start, @comppadlist); + # Do save_unused_subs before saving inc_hv + save_unused_subs(); + cc_recurse(); + + my $inc_hv = svref_2object(\%INC)->save; + my $inc_av = svref_2object(\@INC)->save; + my $amagic_generate= amagic_generation; + return if $errors; + if (!defined($module)) { + $init->add(sprintf("PL_main_root = s\\_%x;", ${main_root()}), + "PL_main_start = $start;", + "PL_curpad = AvARRAY($curpad_sym);", + "PL_initav = (AV *) $init_av;", + "GvHV(PL_incgv) = $inc_hv;", + "GvAV(PL_incgv) = $inc_av;", + "av_store(CvPADLIST(PL_main_cv),0,SvREFCNT_inc($curpad_nam));", + "av_store(CvPADLIST(PL_main_cv),1,SvREFCNT_inc($curpad_sym));", + "PL_amagic_generation= $amagic_generate;", + ); + + } + seek(STDOUT,0,0); #prevent print statements from BEGIN{} into the output + output_boilerplate(); + print "\n"; + output_all("perl_init"); + output_runtime(); + print "\n"; + output_main(); + if (defined($module)) { + my $cmodule = $module; + $cmodule =~ s/::/__/g; + print <<"EOT"; + +#include "XSUB.h" +XS(boot_$cmodule) +{ + dXSARGS; + perl_init(); + ENTER; + SAVETMPS; + SAVEVPTR(PL_curpad); + SAVEVPTR(PL_op); + PL_curpad = AvARRAY($curpad_sym); + PL_op = $start; + pp_main(aTHX); + FREETMPS; + LEAVE; + ST(0) = &PL_sv_yes; + XSRETURN(1); +} +EOT + } + if ($debug_timings) { + warn sprintf("Done at %s\n", timing_info); + } +} + +sub compile { + my @options = @_; + my ($option, $opt, $arg); + OPTION: + while ($option = shift @options) { + if ($option =~ /^-(.)(.*)/) { + $opt = $1; + $arg = $2; + } else { + unshift @options, $option; + last OPTION; + } + if ($opt eq "-" && $arg eq "-") { + shift @options; + last OPTION; + } elsif ($opt eq "o") { + $arg ||= shift @options; + open(STDOUT, ">$arg") or return "open '>$arg': $!\n"; + } elsif ($opt eq "n") { + $arg ||= shift @options; + $module_name = $arg; + } elsif ($opt eq "u") { + $arg ||= shift @options; + mark_unused($arg,undef); + } elsif ($opt eq "f") { + $arg ||= shift @options; + my $value = $arg !~ s/^no-//; + $arg =~ s/-/_/g; + my $ref = $optimise{$arg}; + if (defined($ref)) { + $$ref = $value; + } else { + warn qq(ignoring unknown optimisation option "$arg"\n); + } + } elsif ($opt eq "O") { + $arg = 1 if $arg eq ""; + my $ref; + foreach $ref (values %optimise) { + $$ref = 0; + } + if ($arg >= 2) { + $freetmps_each_loop = 1; + } + if ($arg >= 1) { + $freetmps_each_bblock = 1 unless $freetmps_each_loop; + } + } elsif ($opt eq "m") { + $arg ||= shift @options; + $module = $arg; + mark_unused($arg,undef); + } elsif ($opt eq "p") { + $arg ||= shift @options; + $patchlevel = $arg; + } elsif ($opt eq "D") { + $arg ||= shift @options; + foreach $arg (split(//, $arg)) { + if ($arg eq "o") { + B->debug(1); + } elsif ($arg eq "O") { + $debug_op = 1; + } elsif ($arg eq "s") { + $debug_stack = 1; + } elsif ($arg eq "c") { + $debug_cxstack = 1; + } elsif ($arg eq "p") { + $debug_pad = 1; + } elsif ($arg eq "r") { + $debug_runtime = 1; + } elsif ($arg eq "S") { + $debug_shadow = 1; + } elsif ($arg eq "q") { + $debug_queue = 1; + } elsif ($arg eq "l") { + $debug_lineno = 1; + } elsif ($arg eq "t") { + $debug_timings = 1; + } + } + } + } + init_sections(); + $init = B::Section->get("init"); + $decl = B::Section->get("decl"); + + if (@options) { + return sub { + my ($objname, $ppname); + foreach $objname (@options) { + $objname = "main::$objname" unless $objname =~ /::/; + ($ppname = $objname) =~ s/^.*?:://; + eval "cc_obj(qq(pp_sub_$ppname), \\&$objname)"; + die "cc_obj(qq(pp_sub_$ppname, \\&$objname) failed: $@" if $@; + return if $errors; + } + output_boilerplate(); + print "\n"; + output_all($module_name || "init_module"); + output_runtime(); + } + } else { + return sub { cc_main() }; + } +} + +1; + +__END__ + +=head1 NAME + +B::CC - Perl compiler's optimized C translation backend + +=head1 SYNOPSIS + + perl -MO=CC[,OPTIONS] foo.pl + +=head1 DESCRIPTION + +This compiler backend takes Perl source and generates C source code +corresponding to the flow of your program. In other words, this +backend is somewhat a "real" compiler in the sense that many people +think about compilers. Note however that, currently, it is a very +poor compiler in that although it generates (mostly, or at least +sometimes) correct code, it performs relatively few optimisations. +This will change as the compiler develops. The result is that +running an executable compiled with this backend may start up more +quickly than running the original Perl program (a feature shared +by the B<C> compiler backend--see F<B::C>) and may also execute +slightly faster. This is by no means a good optimising compiler--yet. + +=head1 OPTIONS + +If there are any non-option arguments, they are taken to be +names of objects to be saved (probably doesn't work properly yet). +Without extra arguments, it saves the main program. + +=over 4 + +=item B<-ofilename> + +Output to filename instead of STDOUT + +=item B<-v> + +Verbose compilation (currently gives a few compilation statistics). + +=item B<--> + +Force end of options + +=item B<-uPackname> + +Force apparently unused subs from package Packname to be compiled. +This allows programs to use eval "foo()" even when sub foo is never +seen to be used at compile time. The down side is that any subs which +really are never used also have code generated. This option is +necessary, for example, if you have a signal handler foo which you +initialise with C<$SIG{BAR} = "foo">. A better fix, though, is just +to change it to C<$SIG{BAR} = \&foo>. You can have multiple B<-u> +options. The compiler tries to figure out which packages may possibly +have subs in which need compiling but the current version doesn't do +it very well. In particular, it is confused by nested packages (i.e. +of the form C<A::B>) where package C<A> does not contain any subs. + +=item B<-mModulename> + +Instead of generating source for a runnable executable, generate +source for an XSUB module. The boot_Modulename function (which +DynaLoader can look for) does the appropriate initialisation and runs +the main part of the Perl source that is being compiled. + + +=item B<-D> + +Debug options (concatenated or separate flags like C<perl -D>). + +=item B<-Dr> + +Writes debugging output to STDERR just as it's about to write to the +program's runtime (otherwise writes debugging info as comments in +its C output). + +=item B<-DO> + +Outputs each OP as it's compiled + +=item B<-Ds> + +Outputs the contents of the shadow stack at each OP + +=item B<-Dp> + +Outputs the contents of the shadow pad of lexicals as it's loaded for +each sub or the main program. + +=item B<-Dq> + +Outputs the name of each fake PP function in the queue as it's about +to process it. + +=item B<-Dl> + +Output the filename and line number of each original line of Perl +code as it's processed (C<pp_nextstate>). + +=item B<-Dt> + +Outputs timing information of compilation stages. + +=item B<-f> + +Force optimisations on or off one at a time. + +=item B<-ffreetmps-each-bblock> + +Delays FREETMPS from the end of each statement to the end of the each +basic block. + +=item B<-ffreetmps-each-loop> + +Delays FREETMPS from the end of each statement to the end of the group +of basic blocks forming a loop. At most one of the freetmps-each-* +options can be used. + +=item B<-fomit-taint> + +Omits generating code for handling perl's tainting mechanism. + +=item B<-On> + +Optimisation level (n = 0, 1, 2, ...). B<-O> means B<-O1>. +Currently, B<-O1> sets B<-ffreetmps-each-bblock> and B<-O2> +sets B<-ffreetmps-each-loop>. + +=back + +=head1 EXAMPLES + + perl -MO=CC,-O2,-ofoo.c foo.pl + perl cc_harness -o foo foo.c + +Note that C<cc_harness> lives in the C<B> subdirectory of your perl +library directory. The utility called C<perlcc> may also be used to +help make use of this compiler. + + perl -MO=CC,-mFoo,-oFoo.c Foo.pm + perl cc_harness -shared -c -o Foo.so Foo.c + +=head1 BUGS + +Plenty. Current status: experimental. + +=head1 DIFFERENCES + +These aren't really bugs but they are constructs which are heavily +tied to perl's compile-and-go implementation and with which this +compiler backend cannot cope. + +=head2 Loops + +Standard perl calculates the target of "next", "last", and "redo" +at run-time. The compiler calculates the targets at compile-time. +For example, the program + + sub skip_on_odd { next NUMBER if $_[0] % 2 } + NUMBER: for ($i = 0; $i < 5; $i++) { + skip_on_odd($i); + print $i; + } + +produces the output + + 024 + +with standard perl but gives a compile-time error with the compiler. + +=head2 Context of ".." + +The context (scalar or array) of the ".." operator determines whether +it behaves as a range or a flip/flop. Standard perl delays until +runtime the decision of which context it is in but the compiler needs +to know the context at compile-time. For example, + + @a = (4,6,1,0,0,1); + sub range { (shift @a)..(shift @a) } + print range(); + while (@a) { print scalar(range()) } + +generates the output + + 456123E0 + +with standard Perl but gives a compile-time error with compiled Perl. + +=head2 Arithmetic + +Compiled Perl programs use native C arithmetic much more frequently +than standard perl. Operations on large numbers or on boundary +cases may produce different behaviour. + +=head2 Deprecated features + +Features of standard perl such as C<$[> which have been deprecated +in standard perl since Perl5 was released have not been implemented +in the compiler. + +=head1 AUTHOR + +Malcolm Beattie, C<mbeattie@sable.ox.ac.uk> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/B/Concise.pm b/Master/tlpkg/tlperl.old/lib/B/Concise.pm new file mode 100644 index 00000000000..c84578e44c4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/Concise.pm @@ -0,0 +1,1628 @@ +package B::Concise; +# Copyright (C) 2000-2003 Stephen McCamant. All rights reserved. +# This program is free software; you can redistribute and/or modify it +# under the same terms as Perl itself. + +# Note: we need to keep track of how many use declarations/BEGIN +# blocks this module uses, so we can avoid printing them when user +# asks for the BEGIN blocks in her program. Update the comments and +# the count in concise_specials if you add or delete one. The +# -MO=Concise counts as use #1. + +use strict; # use #2 +use warnings; # uses #3 and #4, since warnings uses Carp + +use Exporter (); # use #5 + +our $VERSION = "0.66"; +our @ISA = qw(Exporter); +our @EXPORT_OK = qw( set_style set_style_standard add_callback + concise_subref concise_cv concise_main + add_style walk_output compile reset_sequence ); +our %EXPORT_TAGS = + ( io => [qw( walk_output compile reset_sequence )], + style => [qw( add_style set_style_standard )], + cb => [qw( add_callback )], + mech => [qw( concise_subref concise_cv concise_main )], ); + +# use #6 +use B qw(class ppname main_start main_root main_cv cstring svref_2object + SVf_IOK SVf_NOK SVf_POK SVf_IVisUV SVf_FAKE OPf_KIDS OPf_SPECIAL + CVf_ANON); + +my %style = + ("terse" => + ["(?(#label =>\n)?)(*( )*)#class (#addr) #name (?([#targ])?) " + . "#svclass~(?((#svaddr))?)~#svval~(?(label \"#coplabel\")?)\n", + "(*( )*)goto #class (#addr)\n", + "#class pp_#name"], + "concise" => + ["#hyphseq2 (*( (x( ;)x))*)<#classsym> " + . "#exname#arg(?([#targarglife])?)~#flags(?(/#private)?)(x(;~->#next)x)\n" + , " (*( )*) goto #seq\n", + "(?(<#seq>)?)#exname#arg(?([#targarglife])?)"], + "linenoise" => + ["(x(;(*( )*))x)#noise#arg(?([#targarg])?)(x( ;\n)x)", + "gt_#seq ", + "(?(#seq)?)#noise#arg(?([#targarg])?)"], + "debug" => + ["#class (#addr)\n\top_next\t\t#nextaddr\n\top_sibling\t#sibaddr\n\t" + . "op_ppaddr\tPL_ppaddr[OP_#NAME]\n\top_type\t\t#typenum\n" . + ($] > 5.009 ? '' : "\top_seq\t\t#seqnum\n") + . "\top_flags\t#flagval\n\top_private\t#privval\n" + . "(?(\top_first\t#firstaddr\n)?)(?(\top_last\t\t#lastaddr\n)?)" + . "(?(\top_sv\t\t#svaddr\n)?)", + " GOTO #addr\n", + "#addr"], + "env" => [$ENV{B_CONCISE_FORMAT}, $ENV{B_CONCISE_GOTO_FORMAT}, + $ENV{B_CONCISE_TREE_FORMAT}], + ); + +# Renderings, ie how Concise prints, is controlled by these vars +# primary: +our $stylename; # selects current style from %style +my $order = "basic"; # how optree is walked & printed: basic, exec, tree + +# rendering mechanics: +# these 'formats' are the line-rendering templates +# they're updated from %style when $stylename changes +my ($format, $gotofmt, $treefmt); + +# lesser players: +my $base = 36; # how <sequence#> is displayed +my $big_endian = 1; # more <sequence#> display +my $tree_style = 0; # tree-order details +my $banner = 1; # print banner before optree is traversed +my $do_main = 0; # force printing of main routine + +# another factor: can affect all styles! +our @callbacks; # allow external management + +set_style_standard("concise"); + +my $curcv; +my $cop_seq_base; + +sub set_style { + ($format, $gotofmt, $treefmt) = @_; + #warn "set_style: deprecated, use set_style_standard instead\n"; # someday + die "expecting 3 style-format args\n" unless @_ == 3; +} + +sub add_style { + my ($newstyle,@args) = @_; + die "style '$newstyle' already exists, choose a new name\n" + if exists $style{$newstyle}; + die "expecting 3 style-format args\n" unless @args == 3; + $style{$newstyle} = [@args]; + $stylename = $newstyle; # update rendering state +} + +sub set_style_standard { + ($stylename) = @_; # update rendering state + die "err: style '$stylename' unknown\n" unless exists $style{$stylename}; + set_style(@{$style{$stylename}}); +} + +sub add_callback { + push @callbacks, @_; +} + +# output handle, used with all Concise-output printing +our $walkHandle; # public for your convenience +BEGIN { $walkHandle = \*STDOUT } + +sub walk_output { # updates $walkHandle + my $handle = shift; + return $walkHandle unless $handle; # allow use as accessor + + if (ref $handle eq 'SCALAR') { + require Config; + die "no perlio in this build, can't call walk_output (\\\$scalar)\n" + unless $Config::Config{useperlio}; + # in 5.8+, open(FILEHANDLE,MODE,REFERENCE) writes to string + open my $tmp, '>', $handle; # but cant re-set existing STDOUT + $walkHandle = $tmp; # so use my $tmp as intermediate var + return $walkHandle; + } + my $iotype = ref $handle; + die "expecting argument/object that can print\n" + unless $iotype eq 'GLOB' or $iotype and $handle->can('print'); + $walkHandle = $handle; +} + +sub concise_subref { + my($order, $coderef, $name) = @_; + my $codeobj = svref_2object($coderef); + + return concise_stashref(@_) + unless ref $codeobj eq 'B::CV'; + concise_cv_obj($order, $codeobj, $name); +} + +sub concise_stashref { + my($order, $h) = @_; + foreach my $k (sort keys %$h) { + local *s = $h->{$k}; + my $coderef = *s{CODE} or next; + reset_sequence(); + print "FUNC: ", *s, "\n"; + my $codeobj = svref_2object($coderef); + next unless ref $codeobj eq 'B::CV'; + eval { concise_cv_obj($order, $codeobj) } + or warn "err $@ on $codeobj"; + } +} + +# This should have been called concise_subref, but it was exported +# under this name in versions before 0.56 +*concise_cv = \&concise_subref; + +sub concise_cv_obj { + my ($order, $cv, $name) = @_; + # name is either a string, or a CODE ref (copy of $cv arg??) + + $curcv = $cv; + if ($cv->XSUB) { + print $walkHandle "$name is XS code\n"; + return; + } + if (class($cv->START) eq "NULL") { + no strict 'refs'; + if (ref $name eq 'CODE') { + print $walkHandle "coderef $name has no START\n"; + } + elsif (exists &$name) { + print $walkHandle "$name exists in stash, but has no START\n"; + } + else { + print $walkHandle "$name not in symbol table\n"; + } + return; + } + sequence($cv->START); + if ($order eq "exec") { + walk_exec($cv->START); + } + elsif ($order eq "basic") { + # walk_topdown($cv->ROOT, sub { $_[0]->concise($_[1]) }, 0); + my $root = $cv->ROOT; + unless (ref $root eq 'B::NULL') { + walk_topdown($root, sub { $_[0]->concise($_[1]) }, 0); + } else { + print $walkHandle "B::NULL encountered doing ROOT on $cv. avoiding disaster\n"; + } + } else { + print $walkHandle tree($cv->ROOT, 0); + } +} + +sub concise_main { + my($order) = @_; + sequence(main_start); + $curcv = main_cv; + if ($order eq "exec") { + return if class(main_start) eq "NULL"; + walk_exec(main_start); + } elsif ($order eq "tree") { + return if class(main_root) eq "NULL"; + print $walkHandle tree(main_root, 0); + } elsif ($order eq "basic") { + return if class(main_root) eq "NULL"; + walk_topdown(main_root, + sub { $_[0]->concise($_[1]) }, 0); + } +} + +sub concise_specials { + my($name, $order, @cv_s) = @_; + my $i = 1; + if ($name eq "BEGIN") { + splice(@cv_s, 0, 8); # skip 7 BEGIN blocks in this file. NOW 8 ?? + } elsif ($name eq "CHECK") { + pop @cv_s; # skip the CHECK block that calls us + } + for my $cv (@cv_s) { + print $walkHandle "$name $i:\n"; + $i++; + concise_cv_obj($order, $cv, $name); + } +} + +my $start_sym = "\e(0"; # "\cN" sometimes also works +my $end_sym = "\e(B"; # "\cO" respectively + +my @tree_decorations = + ([" ", "--", "+-", "|-", "| ", "`-", "-", 1], + [" ", "-", "+", "+", "|", "`", "", 0], + [" ", map("$start_sym$_$end_sym", "qq", "wq", "tq", "x ", "mq", "q"), 1], + [" ", map("$start_sym$_$end_sym", "q", "w", "t", "x", "m"), "", 0], + ); + + +sub compileOpts { + # set rendering state from options and args + my (@options,@args); + if (@_) { + @options = grep(/^-/, @_); + @args = grep(!/^-/, @_); + } + for my $o (@options) { + # mode/order + if ($o eq "-basic") { + $order = "basic"; + } elsif ($o eq "-exec") { + $order = "exec"; + } elsif ($o eq "-tree") { + $order = "tree"; + } + # tree-specific + elsif ($o eq "-compact") { + $tree_style |= 1; + } elsif ($o eq "-loose") { + $tree_style &= ~1; + } elsif ($o eq "-vt") { + $tree_style |= 2; + } elsif ($o eq "-ascii") { + $tree_style &= ~2; + } + # sequence numbering + elsif ($o =~ /^-base(\d+)$/) { + $base = $1; + } elsif ($o eq "-bigendian") { + $big_endian = 1; + } elsif ($o eq "-littleendian") { + $big_endian = 0; + } + elsif ($o eq "-nobanner") { + $banner = 0; + } elsif ($o eq "-banner") { + $banner = 1; + } + elsif ($o eq "-main") { + $do_main = 1; + } elsif ($o eq "-nomain") { + $do_main = 0; + } + # line-style options + elsif (exists $style{substr($o, 1)}) { + $stylename = substr($o, 1); + set_style_standard($stylename); + } else { + warn "Option $o unrecognized"; + } + } + return (@args); +} + +sub compile { + my (@args) = compileOpts(@_); + return sub { + my @newargs = compileOpts(@_); # accept new rendering options + warn "disregarding non-options: @newargs\n" if @newargs; + + for my $objname (@args) { + next unless $objname; # skip null args to avoid noisy responses + + if ($objname eq "BEGIN") { + concise_specials("BEGIN", $order, + B::begin_av->isa("B::AV") ? + B::begin_av->ARRAY : ()); + } elsif ($objname eq "INIT") { + concise_specials("INIT", $order, + B::init_av->isa("B::AV") ? + B::init_av->ARRAY : ()); + } elsif ($objname eq "CHECK") { + concise_specials("CHECK", $order, + B::check_av->isa("B::AV") ? + B::check_av->ARRAY : ()); + } elsif ($objname eq "END") { + concise_specials("END", $order, + B::end_av->isa("B::AV") ? + B::end_av->ARRAY : ()); + } + else { + # convert function names to subrefs + my $objref; + if (ref $objname) { + print $walkHandle "B::Concise::compile($objname)\n" + if $banner; + $objref = $objname; + } else { + $objname = "main::" . $objname unless $objname =~ /::/; + print $walkHandle "$objname:\n"; + no strict 'refs'; + unless (exists &$objname) { + print $walkHandle "err: unknown function ($objname)\n"; + return; + } + $objref = \&$objname; + } + concise_subref($order, $objref, $objname); + } + } + if (!@args or $do_main) { + print $walkHandle "main program:\n" if $do_main; + concise_main($order); + } + return @args; # something + } +} + +my %labels; +my $lastnext; # remembers op-chain, used to insert gotos + +my %opclass = ('OP' => "0", 'UNOP' => "1", 'BINOP' => "2", 'LOGOP' => "|", + 'LISTOP' => "@", 'PMOP' => "/", 'SVOP' => "\$", 'GVOP' => "*", + 'PVOP' => '"', 'LOOP' => "{", 'COP' => ";", 'PADOP' => "#"); + +no warnings 'qw'; # "Possible attempt to put comments..."; use #7 +my @linenoise = + qw'# () sc ( @? 1 $* gv *{ m$ m@ m% m? p/ *$ $ $# & a& pt \\ s\\ rf bl + ` *? <> ?? ?/ r/ c/ // qr s/ /c y/ = @= C sC Cp sp df un BM po +1 +I + -1 -I 1+ I+ 1- I- ** * i* / i/ %$ i% x + i+ - i- . " << >> < i< + > i> <= i, >= i. == i= != i! <? i? s< s> s, s. s= s! s? b& b^ b| -0 -i + ! ~ a2 si cs rd sr e^ lg sq in %x %o ab le ss ve ix ri sf FL od ch cy + uf lf uc lc qm @ [f [ @[ eh vl ky dl ex % ${ @{ uk pk st jn ) )[ a@ + a% sl +] -] [- [+ so rv GS GW MS MW .. f. .f && || ^^ ?: &= |= -> s{ s} + v} ca wa di rs ;; ; ;d }{ { } {} f{ it {l l} rt }l }n }r dm }g }e ^o + ^c ^| ^# um bm t~ u~ ~d DB db ^s se ^g ^r {w }w pf pr ^O ^K ^R ^W ^d ^v + ^e ^t ^k t. fc ic fl .s .p .b .c .l .a .h g1 s1 g2 s2 ?. l? -R -W -X -r + -w -x -e -o -O -z -s -M -A -C -S -c -b -f -d -p -l -u -g -k -t -T -B cd + co cr u. cm ut r. l@ s@ r@ mD uD oD rD tD sD wD cD f$ w$ p$ sh e$ k$ g3 + g4 s4 g5 s5 T@ C@ L@ G@ A@ S@ Hg Hc Hr Hw Mg Mc Ms Mr Sg Sc So rq do {e + e} {t t} g6 G6 6e g7 G7 7e g8 G8 8e g9 G9 9e 6s 7s 8s 9s 6E 7E 8E 9E Pn + Pu GP SP EP Gn Gg GG SG EG g0 c$ lk t$ ;s n> // /= CO'; + +my $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + +sub op_flags { # common flags (see BASOP.op_flags in op.h) + my($x) = @_; + my(@v); + push @v, "v" if ($x & 3) == 1; + push @v, "s" if ($x & 3) == 2; + push @v, "l" if ($x & 3) == 3; + push @v, "K" if $x & 4; + push @v, "P" if $x & 8; + push @v, "R" if $x & 16; + push @v, "M" if $x & 32; + push @v, "S" if $x & 64; + push @v, "*" if $x & 128; + return join("", @v); +} + +sub base_n { + my $x = shift; + return "-" . base_n(-$x) if $x < 0; + my $str = ""; + do { $str .= substr($chars, $x % $base, 1) } while $x = int($x / $base); + $str = reverse $str if $big_endian; + return $str; +} + +my %sequence_num; +my $seq_max = 1; + +sub reset_sequence { + # reset the sequence + %sequence_num = (); + $seq_max = 1; + $lastnext = 0; +} + +sub seq { + my($op) = @_; + return "-" if not exists $sequence_num{$$op}; + return base_n($sequence_num{$$op}); +} + +sub walk_topdown { + my($op, $sub, $level) = @_; + $sub->($op, $level); + if ($op->flags & OPf_KIDS) { + for (my $kid = $op->first; $$kid; $kid = $kid->sibling) { + walk_topdown($kid, $sub, $level + 1); + } + } + elsif (class($op) eq "PMOP") { + my $maybe_root = $op->pmreplroot; + if (ref($maybe_root) and $maybe_root->isa("B::OP")) { + # It really is the root of the replacement, not something + # else stored here for lack of space elsewhere + walk_topdown($maybe_root, $sub, $level + 1); + } + } +} + +sub walklines { + my($ar, $level) = @_; + for my $l (@$ar) { + if (ref($l) eq "ARRAY") { + walklines($l, $level + 1); + } else { + $l->concise($level); + } + } +} + +sub walk_exec { + my($top, $level) = @_; + my %opsseen; + my @lines; + my @todo = ([$top, \@lines]); + while (@todo and my($op, $targ) = @{shift @todo}) { + for (; $$op; $op = $op->next) { + last if $opsseen{$$op}++; + push @$targ, $op; + my $name = $op->name; + if (class($op) eq "LOGOP") { + my $ar = []; + push @$targ, $ar; + push @todo, [$op->other, $ar]; + } elsif ($name eq "subst" and $ {$op->pmreplstart}) { + my $ar = []; + push @$targ, $ar; + push @todo, [$op->pmreplstart, $ar]; + } elsif ($name =~ /^enter(loop|iter)$/) { + if ($] > 5.009) { + $labels{${$op->nextop}} = "NEXT"; + $labels{${$op->lastop}} = "LAST"; + $labels{${$op->redoop}} = "REDO"; + } else { + $labels{$op->nextop->seq} = "NEXT"; + $labels{$op->lastop->seq} = "LAST"; + $labels{$op->redoop->seq} = "REDO"; + } + } + } + } + walklines(\@lines, 0); +} + +# The structure of this routine is purposely modeled after op.c's peep() +sub sequence { + my($op) = @_; + my $oldop = 0; + return if class($op) eq "NULL" or exists $sequence_num{$$op}; + for (; $$op; $op = $op->next) { + last if exists $sequence_num{$$op}; + my $name = $op->name; + if ($name =~ /^(null|scalar|lineseq|scope)$/) { + next if $oldop and $ {$op->next}; + } else { + $sequence_num{$$op} = $seq_max++; + if (class($op) eq "LOGOP") { + my $other = $op->other; + $other = $other->next while $other->name eq "null"; + sequence($other); + } elsif (class($op) eq "LOOP") { + my $redoop = $op->redoop; + $redoop = $redoop->next while $redoop->name eq "null"; + sequence($redoop); + my $nextop = $op->nextop; + $nextop = $nextop->next while $nextop->name eq "null"; + sequence($nextop); + my $lastop = $op->lastop; + $lastop = $lastop->next while $lastop->name eq "null"; + sequence($lastop); + } elsif ($name eq "subst" and $ {$op->pmreplstart}) { + my $replstart = $op->pmreplstart; + $replstart = $replstart->next while $replstart->name eq "null"; + sequence($replstart); + } + } + $oldop = $op; + } +} + +sub fmt_line { # generate text-line for op. + my($hr, $op, $text, $level) = @_; + + $_->($hr, $op, \$text, \$level, $stylename) for @callbacks; + + return '' if $hr->{SKIP}; # suppress line if a callback said so + return '' if $hr->{goto} and $hr->{goto} eq '-'; # no goto nowhere + + # spec: (?(text1#varText2)?) + $text =~ s/\(\?\(([^\#]*?)\#(\w+)([^\#]*?)\)\?\)/ + $hr->{$2} ? $1.$hr->{$2}.$3 : ""/eg; + + # spec: (x(exec_text;basic_text)x) + $text =~ s/\(x\((.*?);(.*?)\)x\)/$order eq "exec" ? $1 : $2/egs; + + # spec: (*(text)*) + $text =~ s/\(\*\(([^;]*?)\)\*\)/$1 x $level/egs; + + # spec: (*(text1;text2)*) + $text =~ s/\(\*\((.*?);(.*?)\)\*\)/$1 x ($level - 1) . $2 x ($level>0)/egs; + + # convert #Var to tag=>val form: Var\t#var + $text =~ s/\#([A-Z][a-z]+)(\d+)?/\t\u$1\t\L#$1$2/gs; + + # spec: #varN + $text =~ s/\#([a-zA-Z]+)(\d+)/sprintf("%-$2s", $hr->{$1})/eg; + + $text =~ s/\#([a-zA-Z]+)/$hr->{$1}/eg; # populate #var's + $text =~ s/[ \t]*~+[ \t]*/ /g; # squeeze tildes + chomp $text; + return "$text\n" if $text ne ""; + return $text; # suppress empty lines +} + +our %priv; # used to display each opcode's BASEOP.op_private values + +$priv{$_}{128} = "LVINTRO" + for ("pos", "substr", "vec", "threadsv", "gvsv", "rv2sv", "rv2hv", "rv2gv", + "rv2av", "rv2arylen", "aelem", "helem", "aslice", "hslice", "padsv", + "padav", "padhv", "enteriter"); +$priv{$_}{64} = "REFC" for ("leave", "leavesub", "leavesublv", "leavewrite"); +$priv{"aassign"}{64} = "COMMON"; +$priv{"aassign"}{32} = "PHASH" if $] < 5.009; +$priv{"sassign"}{64} = "BKWARD"; +$priv{$_}{64} = "RTIME" for ("match", "subst", "substcont", "qr"); +@{$priv{"trans"}}{1,2,4,8,16,64} = ("<UTF", ">UTF", "IDENT", "SQUASH", "DEL", + "COMPL", "GROWS"); +$priv{"repeat"}{64} = "DOLIST"; +$priv{"leaveloop"}{64} = "CONT"; +@{$priv{$_}}{32,64,96} = ("DREFAV", "DREFHV", "DREFSV") + for (qw(rv2gv rv2sv padsv aelem helem)); +@{$priv{"entersub"}}{16,32,64} = ("DBG","TARG","NOMOD"); +@{$priv{$_}}{4,8,128} = ("INARGS","AMPER","NO()") for ("entersub", "rv2cv"); +$priv{"gv"}{32} = "EARLYCV"; +$priv{"aelem"}{16} = $priv{"helem"}{16} = "LVDEFER"; +$priv{$_}{16} = "OURINTR" for ("gvsv", "rv2sv", "rv2av", "rv2hv", "r2gv", + "enteriter"); +$priv{$_}{16} = "TARGMY" + for (map(($_,"s$_"),"chop", "chomp"), + map(($_,"i_$_"), "postinc", "postdec", "multiply", "divide", "modulo", + "add", "subtract", "negate"), "pow", "concat", "stringify", + "left_shift", "right_shift", "bit_and", "bit_xor", "bit_or", + "complement", "atan2", "sin", "cos", "rand", "exp", "log", "sqrt", + "int", "hex", "oct", "abs", "length", "index", "rindex", "sprintf", + "ord", "chr", "crypt", "quotemeta", "join", "push", "unshift", "flock", + "chdir", "chown", "chroot", "unlink", "chmod", "utime", "rename", + "link", "symlink", "mkdir", "rmdir", "wait", "waitpid", "system", + "exec", "kill", "getppid", "getpgrp", "setpgrp", "getpriority", + "setpriority", "time", "sleep"); +$priv{$_}{4} = "REVERSED" for ("enteriter", "iter"); +@{$priv{"const"}}{4,8,16,32,64,128} = ("SHORT","STRICT","ENTERED",'$[',"BARE","WARN"); +$priv{"flip"}{64} = $priv{"flop"}{64} = "LINENUM"; +$priv{"list"}{64} = "GUESSED"; +$priv{"delete"}{64} = "SLICE"; +$priv{"exists"}{64} = "SUB"; +$priv{$_}{64} = "LOCALE" + for ("sort", "prtf", "sprintf", "slt", "sle", "seq", "sne", "sgt", "sge", + "scmp", "lc", "uc", "lcfirst", "ucfirst"); +@{$priv{"sort"}}{1,2,4,8,16} = ("NUM", "INT", "REV", "INPLACE","DESC"); +$priv{"threadsv"}{64} = "SVREFd"; +@{$priv{$_}}{16,32,64,128} = ("INBIN","INCR","OUTBIN","OUTCR") + for ("open", "backtick"); +$priv{"exit"}{128} = "VMS"; +$priv{$_}{2} = "FTACCESS" + for ("ftrread", "ftrwrite", "ftrexec", "fteread", "ftewrite", "fteexec"); +if ($] >= 5.009) { + # Stacked filetests are post 5.8.x + $priv{$_}{4} = "FTSTACKED" + for ("ftrread", "ftrwrite", "ftrexec", "fteread", "ftewrite", "fteexec", + "ftis", "fteowned", "ftrowned", "ftzero", "ftsize", "ftmtime", + "ftatime", "ftctime", "ftsock", "ftchr", "ftblk", "ftfile", "ftdir", + "ftpipe", "ftlink", "ftsuid", "ftsgid", "ftsvtx", "fttty", "fttext", + "ftbinary"); + # Lexical $_ is post 5.8.x + $priv{$_}{2} = "GREPLEX" + for ("mapwhile", "mapstart", "grepwhile", "grepstart"); +} + +sub private_flags { + my($name, $x) = @_; + my @s; + for my $flag (128, 96, 64, 32, 16, 8, 4, 2, 1) { + if ($priv{$name}{$flag} and $x & $flag and $x >= $flag) { + $x -= $flag; + push @s, $priv{$name}{$flag}; + } + } + push @s, $x if $x; + return join(",", @s); +} + +sub concise_sv { + my($sv, $hr, $preferpv) = @_; + $hr->{svclass} = class($sv); + $hr->{svclass} = "UV" + if $hr->{svclass} eq "IV" and $sv->FLAGS & SVf_IVisUV; + Carp::cluck("bad concise_sv: $sv") unless $sv and $$sv; + $hr->{svaddr} = sprintf("%#x", $$sv); + if ($hr->{svclass} eq "GV") { + my $gv = $sv; + my $stash = $gv->STASH->NAME; + if ($stash eq "main") { + $stash = ""; + } else { + $stash = $stash . "::"; + } + $hr->{svval} = "*$stash" . $gv->SAFENAME; + return "*$stash" . $gv->SAFENAME; + } else { + while (class($sv) eq "RV") { + $hr->{svval} .= "\\"; + $sv = $sv->RV; + } + if (class($sv) eq "SPECIAL") { + $hr->{svval} .= ["Null", "sv_undef", "sv_yes", "sv_no"]->[$$sv]; + } elsif ($preferpv && $sv->FLAGS & SVf_POK) { + $hr->{svval} .= cstring($sv->PV); + } elsif ($sv->FLAGS & SVf_NOK) { + $hr->{svval} .= $sv->NV; + } elsif ($sv->FLAGS & SVf_IOK) { + $hr->{svval} .= $sv->int_value; + } elsif ($sv->FLAGS & SVf_POK) { + $hr->{svval} .= cstring($sv->PV); + } elsif (class($sv) eq "HV") { + $hr->{svval} .= 'HASH'; + } + + $hr->{svval} = 'undef' unless defined $hr->{svval}; + my $out = $hr->{svclass}; + return $out .= " $hr->{svval}" ; + } +} + +sub concise_op { + my ($op, $level, $format) = @_; + my %h; + $h{exname} = $h{name} = $op->name; + $h{NAME} = uc $h{name}; + $h{class} = class($op); + $h{extarg} = $h{targ} = $op->targ; + $h{extarg} = "" unless $h{extarg}; + if ($h{name} eq "null" and $h{targ}) { + # targ holds the old type + $h{exname} = "ex-" . substr(ppname($h{targ}), 3); + $h{extarg} = ""; + } elsif ($op->name =~ /^leave(sub(lv)?|write)?$/) { + # targ potentially holds a reference count + if ($op->private & 64) { + my $refs = "ref" . ($h{targ} != 1 ? "s" : ""); + $h{targarglife} = $h{targarg} = "$h{targ} $refs"; + } + } elsif ($h{targ}) { + my $padname = (($curcv->PADLIST->ARRAY)[0]->ARRAY)[$h{targ}]; + if (defined $padname and class($padname) ne "SPECIAL") { + $h{targarg} = $padname->PVX; + if ($padname->FLAGS & SVf_FAKE) { + if ($] < 5.009) { + $h{targarglife} = "$h{targarg}:FAKE"; + } else { + # These changes relate to the jumbo closure fix. + # See changes 19939 and 20005 + my $fake = ''; + $fake .= 'a' if $padname->IVX & 1; # PAD_FAKELEX_ANON + $fake .= 'm' if $padname->IVX & 2; # PAD_FAKELEX_MULTI + $fake .= ':' . $padname->NVX if $curcv->CvFLAGS & CVf_ANON; + $h{targarglife} = "$h{targarg}:FAKE:$fake"; + } + } + else { + my $intro = $padname->NVX - $cop_seq_base; + my $finish = int($padname->IVX) - $cop_seq_base; + $finish = "end" if $finish == 999999999 - $cop_seq_base; + $h{targarglife} = "$h{targarg}:$intro,$finish"; + } + } else { + $h{targarglife} = $h{targarg} = "t" . $h{targ}; + } + } + $h{arg} = ""; + $h{svclass} = $h{svaddr} = $h{svval} = ""; + if ($h{class} eq "PMOP") { + my $precomp = $op->precomp; + if (defined $precomp) { + $precomp = cstring($precomp); # Escape literal control sequences + $precomp = "/$precomp/"; + } else { + $precomp = ""; + } + my $pmreplroot = $op->pmreplroot; + my $pmreplstart; + if (ref($pmreplroot) eq "B::GV") { + # with C<@stash_array = split(/pat/, str);>, + # *stash_array is stored in /pat/'s pmreplroot. + $h{arg} = "($precomp => \@" . $pmreplroot->NAME . ")"; + } elsif (!ref($pmreplroot) and $pmreplroot) { + # same as the last case, except the value is actually a + # pad offset for where the GV is kept (this happens under + # ithreads) + my $gv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$pmreplroot]; + $h{arg} = "($precomp => \@" . $gv->NAME . ")"; + } elsif ($ {$op->pmreplstart}) { + undef $lastnext; + $pmreplstart = "replstart->" . seq($op->pmreplstart); + $h{arg} = "(" . join(" ", $precomp, $pmreplstart) . ")"; + } else { + $h{arg} = "($precomp)"; + } + } elsif ($h{class} eq "PVOP" and $h{name} ne "trans") { + $h{arg} = '("' . $op->pv . '")'; + $h{svval} = '"' . $op->pv . '"'; + } elsif ($h{class} eq "COP") { + my $label = $op->label; + $h{coplabel} = $label; + $label = $label ? "$label: " : ""; + my $loc = $op->file; + $loc =~ s[.*/][]; + $loc .= ":" . $op->line; + my($stash, $cseq) = ($op->stash->NAME, $op->cop_seq - $cop_seq_base); + my $arybase = $op->arybase; + $arybase = $arybase ? ' $[=' . $arybase : ""; + $h{arg} = "($label$stash $cseq $loc$arybase)"; + } elsif ($h{class} eq "LOOP") { + $h{arg} = "(next->" . seq($op->nextop) . " last->" . seq($op->lastop) + . " redo->" . seq($op->redoop) . ")"; + } elsif ($h{class} eq "LOGOP") { + undef $lastnext; + $h{arg} = "(other->" . seq($op->other) . ")"; + } + elsif ($h{class} eq "SVOP" or $h{class} eq "PADOP") { + unless ($h{name} eq 'aelemfast' and $op->flags & OPf_SPECIAL) { + my $idx = ($h{class} eq "SVOP") ? $op->targ : $op->padix; + my $preferpv = $h{name} eq "method_named"; + if ($h{class} eq "PADOP" or !${$op->sv}) { + my $sv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$idx]; + $h{arg} = "[" . concise_sv($sv, \%h, $preferpv) . "]"; + $h{targarglife} = $h{targarg} = ""; + } else { + $h{arg} = "(" . concise_sv($op->sv, \%h, $preferpv) . ")"; + } + } + } + $h{seq} = $h{hyphseq} = seq($op); + $h{seq} = "" if $h{seq} eq "-"; + if ($] > 5.009) { + $h{opt} = $op->opt; + $h{static} = $op->static; + $h{label} = $labels{$$op}; + } else { + $h{seqnum} = $op->seq; + $h{label} = $labels{$op->seq}; + } + $h{next} = $op->next; + $h{next} = (class($h{next}) eq "NULL") ? "(end)" : seq($h{next}); + $h{nextaddr} = sprintf("%#x", $ {$op->next}); + $h{sibaddr} = sprintf("%#x", $ {$op->sibling}); + $h{firstaddr} = sprintf("%#x", $ {$op->first}) if $op->can("first"); + $h{lastaddr} = sprintf("%#x", $ {$op->last}) if $op->can("last"); + + $h{classsym} = $opclass{$h{class}}; + $h{flagval} = $op->flags; + $h{flags} = op_flags($op->flags); + $h{privval} = $op->private; + $h{private} = private_flags($h{name}, $op->private); + $h{addr} = sprintf("%#x", $$op); + $h{typenum} = $op->type; + $h{noise} = $linenoise[$op->type]; + + return fmt_line(\%h, $op, $format, $level); +} + +sub B::OP::concise { + my($op, $level) = @_; + if ($order eq "exec" and $lastnext and $$lastnext != $$op) { + # insert a 'goto' line + my $synth = {"seq" => seq($lastnext), "class" => class($lastnext), + "addr" => sprintf("%#x", $$lastnext), + "goto" => seq($lastnext), # simplify goto '-' removal + }; + print $walkHandle fmt_line($synth, $op, $gotofmt, $level+1); + } + $lastnext = $op->next; + print $walkHandle concise_op($op, $level, $format); +} + +# B::OP::terse (see Terse.pm) now just calls this +sub b_terse { + my($op, $level) = @_; + + # This isn't necessarily right, but there's no easy way to get + # from an OP to the right CV. This is a limitation of the + # ->terse() interface style, and there isn't much to do about + # it. In particular, we can die in concise_op if the main pad + # isn't long enough, or has the wrong kind of entries, compared to + # the pad a sub was compiled with. The fix for that would be to + # make a backwards compatible "terse" format that never even + # looked at the pad, just like the old B::Terse. I don't think + # that's worth the effort, though. + $curcv = main_cv unless $curcv; + + if ($order eq "exec" and $lastnext and $$lastnext != $$op) { + # insert a 'goto' + my $h = {"seq" => seq($lastnext), "class" => class($lastnext), + "addr" => sprintf("%#x", $$lastnext)}; + print # $walkHandle + fmt_line($h, $op, $style{"terse"}[1], $level+1); + } + $lastnext = $op->next; + print # $walkHandle + concise_op($op, $level, $style{"terse"}[0]); +} + +sub tree { + my $op = shift; + my $level = shift; + my $style = $tree_decorations[$tree_style]; + my($space, $single, $kids, $kid, $nokid, $last, $lead, $size) = @$style; + my $name = concise_op($op, $level, $treefmt); + if (not $op->flags & OPf_KIDS) { + return $name . "\n"; + } + my @lines; + for (my $kid = $op->first; $$kid; $kid = $kid->sibling) { + push @lines, tree($kid, $level+1); + } + my $i; + for ($i = $#lines; substr($lines[$i], 0, 1) eq " "; $i--) { + $lines[$i] = $space . $lines[$i]; + } + if ($i > 0) { + $lines[$i] = $last . $lines[$i]; + while ($i-- > 1) { + if (substr($lines[$i], 0, 1) eq " ") { + $lines[$i] = $nokid . $lines[$i]; + } else { + $lines[$i] = $kid . $lines[$i]; + } + } + $lines[$i] = $kids . $lines[$i]; + } else { + $lines[0] = $single . $lines[0]; + } + return("$name$lead" . shift @lines, + map(" " x (length($name)+$size) . $_, @lines)); +} + +# *** Warning: fragile kludge ahead *** +# Because the B::* modules run in the same interpreter as the code +# they're compiling, their presence tends to distort the view we have of +# the code we're looking at. In particular, perl gives sequence numbers +# to COPs. If the program we're looking at were run on its own, this +# would start at 1. Because all of B::Concise and all the modules it +# uses are compiled first, though, by the time we get to the user's +# program the sequence number is already pretty high, which could be +# distracting if you're trying to tell OPs apart. Therefore we'd like to +# subtract an offset from all the sequence numbers we display, to +# restore the simpler view of the world. The trick is to know what that +# offset will be, when we're still compiling B::Concise! If we +# hardcoded a value, it would have to change every time B::Concise or +# other modules we use do. To help a little, what we do here is compile +# a little code at the end of the module, and compute the base sequence +# number for the user's program as being a small offset later, so all we +# have to worry about are changes in the offset. + +# [For 5.8.x and earlier perl is generating sequence numbers for all ops, +# and using them to reference labels] + + +# When you say "perl -MO=Concise -e '$a'", the output should look like: + +# 4 <@> leave[t1] vKP/REFC ->(end) +# 1 <0> enter ->2 + #^ smallest OP sequence number should be 1 +# 2 <;> nextstate(main 1 -e:1) v ->3 + # ^ smallest COP sequence number should be 1 +# - <1> ex-rv2sv vK/1 ->4 +# 3 <$> gvsv(*a) s ->4 + +# If the second of the marked numbers there isn't 1, it means you need +# to update the corresponding magic number in the next line. +# Remember, this needs to stay the last things in the module. + +# Why is this different for MacOS? Does it matter? +my $cop_seq_mnum = $^O eq 'MacOS' ? 12 : 11; +$cop_seq_base = svref_2object(eval 'sub{0;}')->START->cop_seq + $cop_seq_mnum; + +1; + +__END__ + +=head1 NAME + +B::Concise - Walk Perl syntax tree, printing concise info about ops + +=head1 SYNOPSIS + + perl -MO=Concise[,OPTIONS] foo.pl + + use B::Concise qw(set_style add_callback); + +=head1 DESCRIPTION + +This compiler backend prints the internal OPs of a Perl program's syntax +tree in one of several space-efficient text formats suitable for debugging +the inner workings of perl or other compiler backends. It can print OPs in +the order they appear in the OP tree, in the order they will execute, or +in a text approximation to their tree structure, and the format of the +information displayed is customizable. Its function is similar to that of +perl's B<-Dx> debugging flag or the B<B::Terse> module, but it is more +sophisticated and flexible. + +=head1 EXAMPLE + +Here's an example of 2 outputs (aka 'renderings'), using the +-exec and -basic (i.e. default) formatting conventions on the same code +snippet. + + % perl -MO=Concise,-exec -e '$a = $b + 42' + 1 <0> enter + 2 <;> nextstate(main 1 -e:1) v + 3 <#> gvsv[*b] s + 4 <$> const[IV 42] s + * 5 <2> add[t3] sK/2 + 6 <#> gvsv[*a] s + 7 <2> sassign vKS/2 + 8 <@> leave[1 ref] vKP/REFC + +Each line corresponds to an opcode. The opcode marked with '*' is used +in a few examples below. + +The 1st column is the op's sequence number, starting at 1, and is +displayed in base 36 by default. This rendering is in -exec (i.e. +execution) order. + +The symbol between angle brackets indicates the op's type, for +example; <2> is a BINOP, <@> a LISTOP, and <#> is a PADOP, which is +used in threaded perls. (see L</"OP class abbreviations">). + +The opname, as in B<'add[t1]'>, which may be followed by op-specific +information in parentheses or brackets (ex B<'[t1]'>). + +The op-flags (ex B<'sK/2'>) follow, and are described in (L</"OP flags +abbreviations">). + + % perl -MO=Concise -e '$a = $b + 42' + 8 <@> leave[1 ref] vKP/REFC ->(end) + 1 <0> enter ->2 + 2 <;> nextstate(main 1 -e:1) v ->3 + 7 <2> sassign vKS/2 ->8 + * 5 <2> add[t1] sK/2 ->6 + - <1> ex-rv2sv sK/1 ->4 + 3 <$> gvsv(*b) s ->4 + 4 <$> const(IV 42) s ->5 + - <1> ex-rv2sv sKRM*/1 ->7 + 6 <$> gvsv(*a) s ->7 + +The default rendering is top-down, so they're not in execution order. +This form reflects the way the stack is used to parse and evaluate +expressions; the add operates on the two terms below it in the tree. + +Nullops appear as C<ex-opname>, where I<opname> is an op that has been +optimized away by perl. They're displayed with a sequence-number of +'-', because they are not executed (they don't appear in previous +example), they're printed here because they reflect the parse. + +The arrow points to the sequence number of the next op; they're not +displayed in -exec mode, for obvious reasons. + +Note that because this rendering was done on a non-threaded perl, the +PADOPs in the previous examples are now SVOPs, and some (but not all) +of the square brackets have been replaced by round ones. This is a +subtle feature to provide some visual distinction between renderings +on threaded and un-threaded perls. + + +=head1 OPTIONS + +Arguments that don't start with a hyphen are taken to be the names of +subroutines to print the OPs of; if no such functions are specified, +the main body of the program (outside any subroutines, and not +including use'd or require'd files) is rendered. Passing C<BEGIN>, +C<CHECK>, C<INIT>, or C<END> will cause all of the corresponding +special blocks to be printed. + +Options affect how things are rendered (ie printed). They're presented +here by their visual effect, 1st being strongest. They're grouped +according to how they interrelate; within each group the options are +mutually exclusive (unless otherwise stated). + +=head2 Options for Opcode Ordering + +These options control the 'vertical display' of opcodes. The display +'order' is also called 'mode' elsewhere in this document. + +=over 4 + +=item B<-basic> + +Print OPs in the order they appear in the OP tree (a preorder +traversal, starting at the root). The indentation of each OP shows its +level in the tree, and the '->' at the end of the line indicates the +next opcode in execution order. This mode is the default, so the flag +is included simply for completeness. + +=item B<-exec> + +Print OPs in the order they would normally execute (for the majority +of constructs this is a postorder traversal of the tree, ending at the +root). In most cases the OP that usually follows a given OP will +appear directly below it; alternate paths are shown by indentation. In +cases like loops when control jumps out of a linear path, a 'goto' +line is generated. + +=item B<-tree> + +Print OPs in a text approximation of a tree, with the root of the tree +at the left and 'left-to-right' order of children transformed into +'top-to-bottom'. Because this mode grows both to the right and down, +it isn't suitable for large programs (unless you have a very wide +terminal). + +=back + +=head2 Options for Line-Style + +These options select the line-style (or just style) used to render +each opcode, and dictates what info is actually printed into each line. + +=over 4 + +=item B<-concise> + +Use the author's favorite set of formatting conventions. This is the +default, of course. + +=item B<-terse> + +Use formatting conventions that emulate the output of B<B::Terse>. The +basic mode is almost indistinguishable from the real B<B::Terse>, and the +exec mode looks very similar, but is in a more logical order and lacks +curly brackets. B<B::Terse> doesn't have a tree mode, so the tree mode +is only vaguely reminiscent of B<B::Terse>. + +=item B<-linenoise> + +Use formatting conventions in which the name of each OP, rather than being +written out in full, is represented by a one- or two-character abbreviation. +This is mainly a joke. + +=item B<-debug> + +Use formatting conventions reminiscent of B<B::Debug>; these aren't +very concise at all. + +=item B<-env> + +Use formatting conventions read from the environment variables +C<B_CONCISE_FORMAT>, C<B_CONCISE_GOTO_FORMAT>, and C<B_CONCISE_TREE_FORMAT>. + +=back + +=head2 Options for tree-specific formatting + +=over 4 + +=item B<-compact> + +Use a tree format in which the minimum amount of space is used for the +lines connecting nodes (one character in most cases). This squeezes out +a few precious columns of screen real estate. + +=item B<-loose> + +Use a tree format that uses longer edges to separate OP nodes. This format +tends to look better than the compact one, especially in ASCII, and is +the default. + +=item B<-vt> + +Use tree connecting characters drawn from the VT100 line-drawing set. +This looks better if your terminal supports it. + +=item B<-ascii> + +Draw the tree with standard ASCII characters like C<+> and C<|>. These don't +look as clean as the VT100 characters, but they'll work with almost any +terminal (or the horizontal scrolling mode of less(1)) and are suitable +for text documentation or email. This is the default. + +=back + +These are pairwise exclusive, i.e. compact or loose, vt or ascii. + +=head2 Options controlling sequence numbering + +=over 4 + +=item B<-base>I<n> + +Print OP sequence numbers in base I<n>. If I<n> is greater than 10, the +digit for 11 will be 'a', and so on. If I<n> is greater than 36, the digit +for 37 will be 'A', and so on until 62. Values greater than 62 are not +currently supported. The default is 36. + +=item B<-bigendian> + +Print sequence numbers with the most significant digit first. This is the +usual convention for Arabic numerals, and the default. + +=item B<-littleendian> + +Print seqence numbers with the least significant digit first. This is +obviously mutually exclusive with bigendian. + +=back + +=head2 Other options + +These are pairwise exclusive. + +=over 4 + +=item B<-main> + +Include the main program in the output, even if subroutines were also +specified. This rendering is normally suppressed when a subroutine +name or reference is given. + +=item B<-nomain> + +This restores the default behavior after you've changed it with '-main' +(it's not normally needed). If no subroutine name/ref is given, main is +rendered, regardless of this flag. + +=item B<-nobanner> + +Renderings usually include a banner line identifying the function name +or stringified subref. This suppresses the printing of the banner. + +TBC: Remove the stringified coderef; while it provides a 'cookie' for +each function rendered, the cookies used should be 1,2,3.. not a +random hex-address. It also complicates string comparison of two +different trees. + +=item B<-banner> + +restores default banner behavior. + +=item B<-banneris> => subref + +TBC: a hookpoint (and an option to set it) for a user-supplied +function to produce a banner appropriate for users needs. It's not +ideal, because the rendering-state variables, which are a natural +candidate for use in concise.t, are unavailable to the user. + +=back + +=head2 Option Stickiness + +If you invoke Concise more than once in a program, you should know that +the options are 'sticky'. This means that the options you provide in +the first call will be remembered for the 2nd call, unless you +re-specify or change them. + +=head1 ABBREVIATIONS + +The concise style uses symbols to convey maximum info with minimal +clutter (like hex addresses). With just a little practice, you can +start to see the flowers, not just the branches, in the trees. + +=head2 OP class abbreviations + +These symbols appear before the op-name, and indicate the +B:: namespace that represents the ops in your Perl code. + + 0 OP (aka BASEOP) An OP with no children + 1 UNOP An OP with one child + 2 BINOP An OP with two children + | LOGOP A control branch OP + @ LISTOP An OP that could have lots of children + / PMOP An OP with a regular expression + $ SVOP An OP with an SV + " PVOP An OP with a string + { LOOP An OP that holds pointers for a loop + ; COP An OP that marks the start of a statement + # PADOP An OP with a GV on the pad + +=head2 OP flags abbreviations + +OP flags are either public or private. The public flags alter the +behavior of each opcode in consistent ways, and are represented by 0 +or more single characters. + + v OPf_WANT_VOID Want nothing (void context) + s OPf_WANT_SCALAR Want single value (scalar context) + l OPf_WANT_LIST Want list of any length (list context) + Want is unknown + K OPf_KIDS There is a firstborn child. + P OPf_PARENS This operator was parenthesized. + (Or block needs explicit scope entry.) + R OPf_REF Certified reference. + (Return container, not containee). + M OPf_MOD Will modify (lvalue). + S OPf_STACKED Some arg is arriving on the stack. + * OPf_SPECIAL Do something weird for this op (see op.h) + +Private flags, if any are set for an opcode, are displayed after a '/' + + 8 <@> leave[1 ref] vKP/REFC ->(end) + 7 <2> sassign vKS/2 ->8 + +They're opcode specific, and occur less often than the public ones, so +they're represented by short mnemonics instead of single-chars; see +F<op.h> for gory details, or try this quick 2-liner: + + $> perl -MB::Concise -de 1 + DB<1> |x \%B::Concise::priv + +=head1 FORMATTING SPECIFICATIONS + +For each line-style ('concise', 'terse', 'linenoise', etc.) there are +3 format-specs which control how OPs are rendered. + +The first is the 'default' format, which is used in both basic and exec +modes to print all opcodes. The 2nd, goto-format, is used in exec +mode when branches are encountered. They're not real opcodes, and are +inserted to look like a closing curly brace. The tree-format is tree +specific. + +When a line is rendered, the correct format-spec is copied and scanned +for the following items; data is substituted in, and other +manipulations like basic indenting are done, for each opcode rendered. + +There are 3 kinds of items that may be populated; special patterns, +#vars, and literal text, which is copied verbatim. (Yes, it's a set +of s///g steps.) + +=head2 Special Patterns + +These items are the primitives used to perform indenting, and to +select text from amongst alternatives. + +=over 4 + +=item B<(x(>I<exec_text>B<;>I<basic_text>B<)x)> + +Generates I<exec_text> in exec mode, or I<basic_text> in basic mode. + +=item B<(*(>I<text>B<)*)> + +Generates one copy of I<text> for each indentation level. + +=item B<(*(>I<text1>B<;>I<text2>B<)*)> + +Generates one fewer copies of I<text1> than the indentation level, followed +by one copy of I<text2> if the indentation level is more than 0. + +=item B<(?(>I<text1>B<#>I<var>I<Text2>B<)?)> + +If the value of I<var> is true (not empty or zero), generates the +value of I<var> surrounded by I<text1> and I<Text2>, otherwise +nothing. + +=item B<~> + +Any number of tildes and surrounding whitespace will be collapsed to +a single space. + +=back + +=head2 # Variables + +These #vars represent opcode properties that you may want as part of +your rendering. The '#' is intended as a private sigil; a #var's +value is interpolated into the style-line, much like "read $this". + +These vars take 3 forms: + +=over 4 + +=item B<#>I<var> + +A property named 'var' is assumed to exist for the opcodes, and is +interpolated into the rendering. + +=item B<#>I<var>I<N> + +Generates the value of I<var>, left justified to fill I<N> spaces. +Note that this means while you can have properties 'foo' and 'foo2', +you cannot render 'foo2', but you could with 'foo2a'. You would be +wise not to rely on this behavior going forward ;-) + +=item B<#>I<Var> + +This ucfirst form of #var generates a tag-value form of itself for +display; it converts '#Var' into a 'Var => #var' style, which is then +handled as described above. (Imp-note: #Vars cannot be used for +conditional-fills, because the => #var transform is done after the check +for #Var's value). + +=back + +The following variables are 'defined' by B::Concise; when they are +used in a style, their respective values are plugged into the +rendering of each opcode. + +Only some of these are used by the standard styles, the others are +provided for you to delve into optree mechanics, should you wish to +add a new style (see L</add_style> below) that uses them. You can +also add new ones using L</add_callback>. + +=over 4 + +=item B<#addr> + +The address of the OP, in hexadecimal. + +=item B<#arg> + +The OP-specific information of the OP (such as the SV for an SVOP, the +non-local exit pointers for a LOOP, etc.) enclosed in parentheses. + +=item B<#class> + +The B-determined class of the OP, in all caps. + +=item B<#classsym> + +A single symbol abbreviating the class of the OP. + +=item B<#coplabel> + +The label of the statement or block the OP is the start of, if any. + +=item B<#exname> + +The name of the OP, or 'ex-foo' if the OP is a null that used to be a foo. + +=item B<#extarg> + +The target of the OP, or nothing for a nulled OP. + +=item B<#firstaddr> + +The address of the OP's first child, in hexadecimal. + +=item B<#flags> + +The OP's flags, abbreviated as a series of symbols. + +=item B<#flagval> + +The numeric value of the OP's flags. + +=item B<#hyphseq> + +The sequence number of the OP, or a hyphen if it doesn't have one. + +=item B<#label> + +'NEXT', 'LAST', or 'REDO' if the OP is a target of one of those in exec +mode, or empty otherwise. + +=item B<#lastaddr> + +The address of the OP's last child, in hexadecimal. + +=item B<#name> + +The OP's name. + +=item B<#NAME> + +The OP's name, in all caps. + +=item B<#next> + +The sequence number of the OP's next OP. + +=item B<#nextaddr> + +The address of the OP's next OP, in hexadecimal. + +=item B<#noise> + +A one- or two-character abbreviation for the OP's name. + +=item B<#private> + +The OP's private flags, rendered with abbreviated names if possible. + +=item B<#privval> + +The numeric value of the OP's private flags. + +=item B<#seq> + +The sequence number of the OP. Note that this is a sequence number +generated by B::Concise. + +=item B<#seqnum> + +5.8.x and earlier only. 5.9 and later do not provide this. + +The real sequence number of the OP, as a regular number and not adjusted +to be relative to the start of the real program. (This will generally be +a fairly large number because all of B<B::Concise> is compiled before +your program is). + +=item B<#opt> + +Whether or not the op has been optimised by the peephole optimiser. + +Only available in 5.9 and later. + +=item B<#static> + +Whether or not the op is statically defined. This flag is used by the +B::C compiler backend and indicates that the op should not be freed. + +Only available in 5.9 and later. + +=item B<#sibaddr> + +The address of the OP's next youngest sibling, in hexadecimal. + +=item B<#svaddr> + +The address of the OP's SV, if it has an SV, in hexadecimal. + +=item B<#svclass> + +The class of the OP's SV, if it has one, in all caps (e.g., 'IV'). + +=item B<#svval> + +The value of the OP's SV, if it has one, in a short human-readable format. + +=item B<#targ> + +The numeric value of the OP's targ. + +=item B<#targarg> + +The name of the variable the OP's targ refers to, if any, otherwise the +letter t followed by the OP's targ in decimal. + +=item B<#targarglife> + +Same as B<#targarg>, but followed by the COP sequence numbers that delimit +the variable's lifetime (or 'end' for a variable in an open scope) for a +variable. + +=item B<#typenum> + +The numeric value of the OP's type, in decimal. + +=back + +=head1 Using B::Concise outside of the O framework + +The common (and original) usage of B::Concise was for command-line +renderings of simple code, as given in EXAMPLE. But you can also use +B<B::Concise> from your code, and call compile() directly, and +repeatedly. By doing so, you can avoid the compile-time only +operation of O.pm, and even use the debugger to step through +B::Concise::compile() itself. + +Once you're doing this, you may alter Concise output by adding new +rendering styles, and by optionally adding callback routines which +populate new variables, if such were referenced from those (just +added) styles. + +=head2 Example: Altering Concise Renderings + + use B::Concise qw(set_style add_callback); + add_style($yourStyleName => $defaultfmt, $gotofmt, $treefmt); + add_callback + ( sub { + my ($h, $op, $format, $level, $stylename) = @_; + $h->{variable} = some_func($op); + }); + $walker = B::Concise::compile(@options,@subnames,@subrefs); + $walker->(); + +=head2 set_style() + +B<set_style> accepts 3 arguments, and updates the three format-specs +comprising a line-style (basic-exec, goto, tree). It has one minor +drawback though; it doesn't register the style under a new name. This +can become an issue if you render more than once and switch styles. +Thus you may prefer to use add_style() and/or set_style_standard() +instead. + +=head2 set_style_standard($name) + +This restores one of the standard line-styles: C<terse>, C<concise>, +C<linenoise>, C<debug>, C<env>, into effect. It also accepts style +names previously defined with add_style(). + +=head2 add_style() + +This subroutine accepts a new style name and three style arguments as +above, and creates, registers, and selects the newly named style. It is +an error to re-add a style; call set_style_standard() to switch between +several styles. + +=head2 add_callback() + +If your newly minted styles refer to any new #variables, you'll need +to define a callback subroutine that will populate (or modify) those +variables. They are then available for use in the style you've +chosen. + +The callbacks are called for each opcode visited by Concise, in the +same order as they are added. Each subroutine is passed five +parameters. + + 1. A hashref, containing the variable names and values which are + populated into the report-line for the op + 2. the op, as a B<B::OP> object + 3. a reference to the format string + 4. the formatting (indent) level + 5. the selected stylename + +To define your own variables, simply add them to the hash, or change +existing values if you need to. The level and format are passed in as +references to scalars, but it is unlikely that they will need to be +changed or even used. + +=head2 Running B::Concise::compile() + +B<compile> accepts options as described above in L</OPTIONS>, and +arguments, which are either coderefs, or subroutine names. + +It constructs and returns a $treewalker coderef, which when invoked, +traverses, or walks, and renders the optrees of the given arguments to +STDOUT. You can reuse this, and can change the rendering style used +each time; thereafter the coderef renders in the new style. + +B<walk_output> lets you change the print destination from STDOUT to +another open filehandle, or into a string passed as a ref (unless +you've built perl with -Uuseperlio). + + my $walker = B::Concise::compile('-terse','aFuncName', \&aSubRef); # 1 + walk_output(\my $buf); + $walker->(); # 1 renders -terse + set_style_standard('concise'); # 2 + $walker->(); # 2 renders -concise + $walker->(@new); # 3 renders whatever + print "3 different renderings: terse, concise, and @new: $buf\n"; + +When $walker is called, it traverses the subroutines supplied when it +was created, and renders them using the current style. You can change +the style afterwards in several different ways: + + 1. call C<compile>, altering style or mode/order + 2. call C<set_style_standard> + 3. call $walker, passing @new options + +Passing new options to the $walker is the easiest way to change +amongst any pre-defined styles (the ones you add are automatically +recognized as options), and is the only way to alter rendering order +without calling compile again. Note however that rendering state is +still shared amongst multiple $walker objects, so they must still be +used in a coordinated manner. + +=head2 B::Concise::reset_sequence() + +This function (not exported) lets you reset the sequence numbers (note +that they're numbered arbitrarily, their goal being to be human +readable). Its purpose is mostly to support testing, i.e. to compare +the concise output from two identical anonymous subroutines (but +different instances). Without the reset, B::Concise, seeing that +they're separate optrees, generates different sequence numbers in +the output. + +=head2 Errors + +Errors in rendering (non-existent function-name, non-existent coderef) +are written to the STDOUT, or wherever you've set it via +walk_output(). + +Errors using the various *style* calls, and bad args to walk_output(), +result in die(). Use an eval if you wish to catch these errors and +continue processing. + +=head1 AUTHOR + +Stephen McCamant, E<lt>smcc@CSUA.Berkeley.EDUE<gt>. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/B/Debug.pm b/Master/tlpkg/tlperl.old/lib/B/Debug.pm new file mode 100644 index 00000000000..cb369682d66 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/Debug.pm @@ -0,0 +1,305 @@ +package B::Debug; + +our $VERSION = '1.02_01'; + +use strict; +use B qw(peekop class walkoptree walkoptree_exec + main_start main_root cstring sv_undef); +use B::Asmdata qw(@specialsv_name); + +my %done_gv; + +sub B::OP::debug { + my ($op) = @_; + printf <<'EOT', class($op), $$op, ${$op->next}, ${$op->sibling}, $op->ppaddr, $op->targ, $op->type; +%s (0x%lx) + op_next 0x%x + op_sibling 0x%x + op_ppaddr %s + op_targ %d + op_type %d +EOT + if ($] > 5.009) { + printf <<'EOT', $op->opt, $op->static; + op_opt %d + op_static %d +EOT + } else { + printf <<'EOT', $op->seq; + op_seq %d +EOT + } + printf <<'EOT', $op->flags, $op->private; + op_flags %d + op_private %d +EOT +} + +sub B::UNOP::debug { + my ($op) = @_; + $op->B::OP::debug(); + printf "\top_first\t0x%x\n", ${$op->first}; +} + +sub B::BINOP::debug { + my ($op) = @_; + $op->B::UNOP::debug(); + printf "\top_last\t\t0x%x\n", ${$op->last}; +} + +sub B::LOOP::debug { + my ($op) = @_; + $op->B::BINOP::debug(); + printf <<'EOT', ${$op->redoop}, ${$op->nextop}, ${$op->lastop}; + op_redoop 0x%x + op_nextop 0x%x + op_lastop 0x%x +EOT +} + +sub B::LOGOP::debug { + my ($op) = @_; + $op->B::UNOP::debug(); + printf "\top_other\t0x%x\n", ${$op->other}; +} + +sub B::LISTOP::debug { + my ($op) = @_; + $op->B::BINOP::debug(); + printf "\top_children\t%d\n", $op->children; +} + +sub B::PMOP::debug { + my ($op) = @_; + $op->B::LISTOP::debug(); + printf "\top_pmreplroot\t0x%x\n", ${$op->pmreplroot}; + printf "\top_pmreplstart\t0x%x\n", ${$op->pmreplstart}; + printf "\top_pmnext\t0x%x\n", ${$op->pmnext}; + printf "\top_pmregexp->precomp\t%s\n", cstring($op->precomp); + printf "\top_pmflags\t0x%x\n", $op->pmflags; + $op->pmreplroot->debug; +} + +sub B::COP::debug { + my ($op) = @_; + $op->B::OP::debug(); + my $cop_io = class($op->io) eq 'SPECIAL' ? '' : $op->io->as_string; + printf <<'EOT', $op->label, $op->stashpv, $op->file, $op->cop_seq, $op->arybase, $op->line, ${$op->warnings}, cstring($cop_io); + cop_label %s + cop_stashpv %s + cop_file %s + cop_seq %d + cop_arybase %d + cop_line %d + cop_warnings 0x%x + cop_io %s +EOT +} + +sub B::SVOP::debug { + my ($op) = @_; + $op->B::OP::debug(); + printf "\top_sv\t\t0x%x\n", ${$op->sv}; + $op->sv->debug; +} + +sub B::PVOP::debug { + my ($op) = @_; + $op->B::OP::debug(); + printf "\top_pv\t\t%s\n", cstring($op->pv); +} + +sub B::PADOP::debug { + my ($op) = @_; + $op->B::OP::debug(); + printf "\top_padix\t\t%ld\n", $op->padix; +} + +sub B::NULL::debug { + my ($sv) = @_; + if ($$sv == ${sv_undef()}) { + print "&sv_undef\n"; + } else { + printf "NULL (0x%x)\n", $$sv; + } +} + +sub B::SV::debug { + my ($sv) = @_; + if (!$$sv) { + print class($sv), " = NULL\n"; + return; + } + printf <<'EOT', class($sv), $$sv, $sv->REFCNT, $sv->FLAGS; +%s (0x%x) + REFCNT %d + FLAGS 0x%x +EOT +} + +sub B::RV::debug { + my ($rv) = @_; + B::SV::debug($rv); + printf <<'EOT', ${$rv->RV}; + RV 0x%x +EOT + $rv->RV->debug; +} + +sub B::PV::debug { + my ($sv) = @_; + $sv->B::SV::debug(); + my $pv = $sv->PV(); + printf <<'EOT', cstring($pv), length($pv); + xpv_pv %s + xpv_cur %d +EOT +} + +sub B::IV::debug { + my ($sv) = @_; + $sv->B::SV::debug(); + printf "\txiv_iv\t\t%d\n", $sv->IV; +} + +sub B::NV::debug { + my ($sv) = @_; + $sv->B::IV::debug(); + printf "\txnv_nv\t\t%s\n", $sv->NV; +} + +sub B::PVIV::debug { + my ($sv) = @_; + $sv->B::PV::debug(); + printf "\txiv_iv\t\t%d\n", $sv->IV; +} + +sub B::PVNV::debug { + my ($sv) = @_; + $sv->B::PVIV::debug(); + printf "\txnv_nv\t\t%s\n", $sv->NV; +} + +sub B::PVLV::debug { + my ($sv) = @_; + $sv->B::PVNV::debug(); + printf "\txlv_targoff\t%d\n", $sv->TARGOFF; + printf "\txlv_targlen\t%u\n", $sv->TARGLEN; + printf "\txlv_type\t%s\n", cstring(chr($sv->TYPE)); +} + +sub B::BM::debug { + my ($sv) = @_; + $sv->B::PVNV::debug(); + printf "\txbm_useful\t%d\n", $sv->USEFUL; + printf "\txbm_previous\t%u\n", $sv->PREVIOUS; + printf "\txbm_rare\t%s\n", cstring(chr($sv->RARE)); +} + +sub B::CV::debug { + my ($sv) = @_; + $sv->B::PVNV::debug(); + my ($stash) = $sv->STASH; + my ($start) = $sv->START; + my ($root) = $sv->ROOT; + my ($padlist) = $sv->PADLIST; + my ($file) = $sv->FILE; + my ($gv) = $sv->GV; + printf <<'EOT', $$stash, $$start, $$root, $$gv, $file, $sv->DEPTH, $padlist, ${$sv->OUTSIDE}, $sv->OUTSIDE_SEQ; + STASH 0x%x + START 0x%x + ROOT 0x%x + GV 0x%x + FILE %s + DEPTH %d + PADLIST 0x%x + OUTSIDE 0x%x + OUTSIDE_SEQ %d +EOT + $start->debug if $start; + $root->debug if $root; + $gv->debug if $gv; + $padlist->debug if $padlist; +} + +sub B::AV::debug { + my ($av) = @_; + $av->B::SV::debug; + my(@array) = $av->ARRAY; + print "\tARRAY\t\t(", join(", ", map("0x" . $$_, @array)), ")\n"; + printf <<'EOT', scalar(@array), $av->MAX, $av->OFF; + FILL %d + MAX %d + OFF %d +EOT + printf <<'EOT', $av->AvFLAGS if $] < 5.009; + AvFLAGS %d +EOT +} + +sub B::GV::debug { + my ($gv) = @_; + if ($done_gv{$$gv}++) { + printf "GV %s::%s\n", $gv->STASH->NAME, $gv->SAFENAME; + return; + } + my ($sv) = $gv->SV; + my ($av) = $gv->AV; + my ($cv) = $gv->CV; + $gv->B::SV::debug; + printf <<'EOT', $gv->SAFENAME, $gv->STASH->NAME, $gv->STASH, $$sv, $gv->GvREFCNT, $gv->FORM, $$av, ${$gv->HV}, ${$gv->EGV}, $$cv, $gv->CVGEN, $gv->LINE, $gv->FILE, $gv->GvFLAGS; + NAME %s + STASH %s (0x%x) + SV 0x%x + GvREFCNT %d + FORM 0x%x + AV 0x%x + HV 0x%x + EGV 0x%x + CV 0x%x + CVGEN %d + LINE %d + FILE %s + GvFLAGS 0x%x +EOT + $sv->debug if $sv; + $av->debug if $av; + $cv->debug if $cv; +} + +sub B::SPECIAL::debug { + my $sv = shift; + print $specialsv_name[$$sv], "\n"; +} + +sub compile { + my $order = shift; + B::clearsym(); + if ($order && $order eq "exec") { + return sub { walkoptree_exec(main_start, "debug") } + } else { + return sub { walkoptree(main_root, "debug") } + } +} + +1; + +__END__ + +=head1 NAME + +B::Debug - Walk Perl syntax tree, printing debug info about ops + +=head1 SYNOPSIS + + perl -MO=Debug[,OPTIONS] foo.pl + +=head1 DESCRIPTION + +See F<ext/B/README>. + +=head1 AUTHOR + +Malcolm Beattie, C<mbeattie@sable.ox.ac.uk> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/B/Deparse.pm b/Master/tlpkg/tlperl.old/lib/B/Deparse.pm new file mode 100644 index 00000000000..3db6fbe6e1f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/Deparse.pm @@ -0,0 +1,4642 @@ +# B::Deparse.pm +# Copyright (c) 1998-2000, 2002, 2003 Stephen McCamant. All rights reserved. +# This module is free software; you can redistribute and/or modify +# it under the same terms as Perl itself. + +# This is based on the module of the same name by Malcolm Beattie, +# but essentially none of his code remains. + +package B::Deparse; +use Carp; +use B qw(class main_root main_start main_cv svref_2object opnumber perlstring + OPf_WANT OPf_WANT_VOID OPf_WANT_SCALAR OPf_WANT_LIST + OPf_KIDS OPf_REF OPf_STACKED OPf_SPECIAL OPf_MOD + OPpLVAL_INTRO OPpOUR_INTRO OPpENTERSUB_AMPER OPpSLICE OPpCONST_BARE + OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY + OPpCONST_ARYBASE OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER + OPpSORT_REVERSE OPpSORT_INPLACE OPpSORT_DESCEND OPpITER_REVERSED + SVf_IOK SVf_NOK SVf_ROK SVf_POK SVpad_OUR SVf_FAKE SVs_RMG SVs_SMG + CVf_METHOD CVf_LOCKED CVf_LVALUE CVf_ASSERTION + PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE PMf_SKIPWHITE + PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED); +$VERSION = 0.71; +use strict; +use vars qw/$AUTOLOAD/; +use warnings (); + +# Changes between 0.50 and 0.51: +# - fixed nulled leave with live enter in sort { } +# - fixed reference constants (\"str") +# - handle empty programs gracefully +# - handle infinte loops (for (;;) {}, while (1) {}) +# - differentiate between `for my $x ...' and `my $x; for $x ...' +# - various minor cleanups +# - moved globals into an object +# - added `-u', like B::C +# - package declarations using cop_stash +# - subs, formats and code sorted by cop_seq +# Changes between 0.51 and 0.52: +# - added pp_threadsv (special variables under USE_5005THREADS) +# - added documentation +# Changes between 0.52 and 0.53: +# - many changes adding precedence contexts and associativity +# - added `-p' and `-s' output style options +# - various other minor fixes +# Changes between 0.53 and 0.54: +# - added support for new `for (1..100)' optimization, +# thanks to Gisle Aas +# Changes between 0.54 and 0.55: +# - added support for new qr// construct +# - added support for new pp_regcreset OP +# Changes between 0.55 and 0.56: +# - tested on base/*.t, cmd/*.t, comp/*.t, io/*.t +# - fixed $# on non-lexicals broken in last big rewrite +# - added temporary fix for change in opcode of OP_STRINGIFY +# - fixed problem in 0.54's for() patch in `for (@ary)' +# - fixed precedence in conditional of ?: +# - tweaked list paren elimination in `my($x) = @_' +# - made continue-block detection trickier wrt. null ops +# - fixed various prototype problems in pp_entersub +# - added support for sub prototypes that never get GVs +# - added unquoting for special filehandle first arg in truncate +# - print doubled rv2gv (a bug) as `*{*GV}' instead of illegal `**GV' +# - added semicolons at the ends of blocks +# - added -l `#line' declaration option -- fixes cmd/subval.t 27,28 +# Changes between 0.56 and 0.561: +# - fixed multiply-declared my var in pp_truncate (thanks to Sarathy) +# - used new B.pm symbolic constants (done by Nick Ing-Simmons) +# Changes between 0.561 and 0.57: +# - stylistic changes to symbolic constant stuff +# - handled scope in s///e replacement code +# - added unquote option for expanding "" into concats, etc. +# - split method and proto parts of pp_entersub into separate functions +# - various minor cleanups +# Changes after 0.57: +# - added parens in \&foo (patch by Albert Dvornik) +# Changes between 0.57 and 0.58: +# - fixed `0' statements that weren't being printed +# - added methods for use from other programs +# (based on patches from James Duncan and Hugo van der Sanden) +# - added -si and -sT to control indenting (also based on a patch from Hugo) +# - added -sv to print something else instead of '???' +# - preliminary version of utf8 tr/// handling +# Changes after 0.58: +# - uses of $op->ppaddr changed to new $op->name (done by Sarathy) +# - added support for Hugo's new OP_SETSTATE (like nextstate) +# Changes between 0.58 and 0.59 +# - added support for Chip's OP_METHOD_NAMED +# - added support for Ilya's OPpTARGET_MY optimization +# - elided arrows before `()' subscripts when possible +# Changes between 0.59 and 0.60 +# - support for method attribues was added +# - some warnings fixed +# - separate recognition of constant subs +# - rewrote continue block handling, now recoginizing for loops +# - added more control of expanding control structures +# Changes between 0.60 and 0.61 (mostly by Robin Houston) +# - many bug-fixes +# - support for pragmas and 'use' +# - support for the little-used $[ variable +# - support for __DATA__ sections +# - UTF8 support +# - BEGIN, CHECK, INIT and END blocks +# - scoping of subroutine declarations fixed +# - compile-time output from the input program can be suppressed, so that the +# output is just the deparsed code. (a change to O.pm in fact) +# - our() declarations +# - *all* the known bugs are now listed in the BUGS section +# - comprehensive test mechanism (TEST -deparse) +# Changes between 0.62 and 0.63 (mostly by Rafael Garcia-Suarez) +# - bug-fixes +# - new switch -P +# - support for command-line switches (-l, -0, etc.) +# Changes between 0.63 and 0.64 +# - support for //, CHECK blocks, and assertions +# - improved handling of foreach loops and lexicals +# - option to use Data::Dumper for constants +# - more bug fixes +# - discovered lots more bugs not yet fixed + +# Todo: +# (See also BUGS section at the end of this file) +# +# - finish tr/// changes +# - add option for even more parens (generalize \&foo change) +# - left/right context +# - copy comments (look at real text with $^P?) +# - avoid semis in one-statement blocks +# - associativity of &&=, ||=, ?: +# - ',' => '=>' (auto-unquote?) +# - break long lines ("\r" as discretionary break?) +# - configurable syntax highlighting: ANSI color, HTML, TeX, etc. +# - more style options: brace style, hex vs. octal, quotes, ... +# - print big ints as hex/octal instead of decimal (heuristic?) +# - handle `my $x if 0'? +# - version using op_next instead of op_first/sibling? +# - avoid string copies (pass arrays, one big join?) +# - here-docs? + +# Current test.deparse failures +# comp/assertions 38 - disabled assertions should be like "my($x) if 0" +# 'sub f : assertion {}; no assertions; my $x=1; {f(my $x=2); print "$x\n"}' +# comp/hints 6 - location of BEGIN blocks wrt. block openings +# run/switchI 1 - missing -I switches entirely +# perl -Ifoo -e 'print @INC' +# op/caller 2 - warning mask propagates backwards before warnings::register +# 'use warnings; BEGIN {${^WARNING_BITS} eq "U"x12;} use warnings::register' +# op/getpid 2 - can't assign to shared my() declaration (threads only) +# 'my $x : shared = 5' +# op/override 7 - parens on overriden require change v-string interpretation +# 'BEGIN{*CORE::GLOBAL::require=sub {}} require v5.6' +# c.f. 'BEGIN { *f = sub {0} }; f 2' +# op/pat 774 - losing Unicode-ness of Latin1-only strings +# 'use charnames ":short"; $x="\N{latin:a with acute}"' +# op/recurse 12 - missing parens on recursive call makes it look like method +# 'sub f { f($x) }' +# op/subst 90 - inconsistent handling of utf8 under "use utf8" +# op/taint 29 - "use re 'taint'" deparsed in the wrong place wrt. block open +# op/tiehandle compile - "use strict" deparsed in the wrong place +# uni/tr_ several +# ext/B/t/xref 11 - line numbers when we add newlines to one-line subs +# ext/Data/Dumper/t/dumper compile +# ext/DB_file/several +# ext/Encode/several +# ext/Ernno/Errno warnings +# ext/IO/lib/IO/t/io_sel 23 +# ext/PerlIO/t/encoding compile +# ext/POSIX/t/posix 6 +# ext/Socket/Socket 8 +# ext/Storable/t/croak compile +# lib/Attribute/Handlers/t/multi compile +# lib/bignum/ several +# lib/charnames 35 +# lib/constant 32 +# lib/English 40 +# lib/ExtUtils/t/bytes 4 +# lib/File/DosGlob compile +# lib/Filter/Simple/t/data 1 +# lib/Math/BigInt/t/constant 1 +# lib/Net/t/config Deparse-warning +# lib/overload compile +# lib/Switch/ several +# lib/Symbol 4 +# lib/Test/Simple several +# lib/Term/Complete +# lib/Tie/File/t/29_downcopy 5 +# lib/vars 22 + +# Object fields (were globals): +# +# avoid_local: +# (local($a), local($b)) and local($a, $b) have the same internal +# representation but the short form looks better. We notice we can +# use a large-scale local when checking the list, but need to prevent +# individual locals too. This hash holds the addresses of OPs that +# have already had their local-ness accounted for. The same thing +# is done with my(). +# +# curcv: +# CV for current sub (or main program) being deparsed +# +# curcvlex: +# Cached hash of lexical variables for curcv: keys are names, +# each value is an array of pairs, indicating the cop_seq of scopes +# in which a var of that name is valid. +# +# curcop: +# COP for statement being deparsed +# +# curstash: +# name of the current package for deparsed code +# +# subs_todo: +# array of [cop_seq, CV, is_format?] for subs and formats we still +# want to deparse +# +# protos_todo: +# as above, but [name, prototype] for subs that never got a GV +# +# subs_done, forms_done: +# keys are addresses of GVs for subs and formats we've already +# deparsed (or at least put into subs_todo) +# +# subs_declared +# keys are names of subs for which we've printed declarations. +# That means we can omit parentheses from the arguments. +# +# subs_deparsed +# Keeps track of fully qualified names of all deparsed subs. +# +# parens: -p +# linenums: -l +# unquote: -q +# cuddle: ` ' or `\n', depending on -sC +# indent_size: -si +# use_tabs: -sT +# ex_const: -sv + +# A little explanation of how precedence contexts and associativity +# work: +# +# deparse() calls each per-op subroutine with an argument $cx (short +# for context, but not the same as the cx* in the perl core), which is +# a number describing the op's parents in terms of precedence, whether +# they're inside an expression or at statement level, etc. (see +# chart below). When ops with children call deparse on them, they pass +# along their precedence. Fractional values are used to implement +# associativity (`($x + $y) + $z' => `$x + $y + $y') and related +# parentheses hacks. The major disadvantage of this scheme is that +# it doesn't know about right sides and left sides, so say if you +# assign a listop to a variable, it can't tell it's allowed to leave +# the parens off the listop. + +# Precedences: +# 26 [TODO] inside interpolation context ("") +# 25 left terms and list operators (leftward) +# 24 left -> +# 23 nonassoc ++ -- +# 22 right ** +# 21 right ! ~ \ and unary + and - +# 20 left =~ !~ +# 19 left * / % x +# 18 left + - . +# 17 left << >> +# 16 nonassoc named unary operators +# 15 nonassoc < > <= >= lt gt le ge +# 14 nonassoc == != <=> eq ne cmp +# 13 left & +# 12 left | ^ +# 11 left && +# 10 left || +# 9 nonassoc .. ... +# 8 right ?: +# 7 right = += -= *= etc. +# 6 left , => +# 5 nonassoc list operators (rightward) +# 4 right not +# 3 left and +# 2 left or xor +# 1 statement modifiers +# 0.5 statements, but still print scopes as do { ... } +# 0 statement level + +# Nonprinting characters with special meaning: +# \cS - steal parens (see maybe_parens_unop) +# \n - newline and indent +# \t - increase indent +# \b - decrease indent (`outdent') +# \f - flush left (no indent) +# \cK - kill following semicolon, if any + +sub null { + my $op = shift; + return class($op) eq "NULL"; +} + +sub todo { + my $self = shift; + my($cv, $is_form) = @_; + return unless ($cv->FILE eq $0 || exists $self->{files}{$cv->FILE}); + my $seq; + if ($cv->OUTSIDE_SEQ) { + $seq = $cv->OUTSIDE_SEQ; + } elsif (!null($cv->START) and is_state($cv->START)) { + $seq = $cv->START->cop_seq; + } else { + $seq = 0; + } + push @{$self->{'subs_todo'}}, [$seq, $cv, $is_form]; + unless ($is_form || class($cv->STASH) eq 'SPECIAL') { + $self->{'subs_deparsed'}{$cv->STASH->NAME."::".$cv->GV->NAME} = 1; + } +} + +sub next_todo { + my $self = shift; + my $ent = shift @{$self->{'subs_todo'}}; + my $cv = $ent->[1]; + my $gv = $cv->GV; + my $name = $self->gv_name($gv); + if ($ent->[2]) { + return "format $name =\n" + . $self->deparse_format($ent->[1]). "\n"; + } else { + $self->{'subs_declared'}{$name} = 1; + if ($name eq "BEGIN") { + my $use_dec = $self->begin_is_use($cv); + if (defined ($use_dec) and $self->{'expand'} < 5) { + return () if 0 == length($use_dec); + return $use_dec; + } + } + my $l = ''; + if ($self->{'linenums'}) { + my $line = $gv->LINE; + my $file = $gv->FILE; + $l = "\n\f#line $line \"$file\"\n"; + } + my $p = ''; + if (class($cv->STASH) ne "SPECIAL") { + my $stash = $cv->STASH->NAME; + if ($stash ne $self->{'curstash'}) { + $p = "package $stash;\n"; + $name = "$self->{'curstash'}::$name" unless $name =~ /::/; + $self->{'curstash'} = $stash; + } + $name =~ s/^\Q$stash\E:://; + } + return "${p}${l}sub $name " . $self->deparse_sub($cv); + } +} + +# Return a "use" declaration for this BEGIN block, if appropriate +sub begin_is_use { + my ($self, $cv) = @_; + my $root = $cv->ROOT; + local @$self{qw'curcv curcvlex'} = ($cv); +#require B::Debug; +#B::walkoptree($cv->ROOT, "debug"); + my $lineseq = $root->first; + return if $lineseq->name ne "lineseq"; + + my $req_op = $lineseq->first->sibling; + return if $req_op->name ne "require"; + + my $module; + if ($req_op->first->private & OPpCONST_BARE) { + # Actually it should always be a bareword + $module = $self->const_sv($req_op->first)->PV; + $module =~ s[/][::]g; + $module =~ s/.pm$//; + } + else { + $module = $self->const($self->const_sv($req_op->first), 6); + } + + my $version; + my $version_op = $req_op->sibling; + return if class($version_op) eq "NULL"; + if ($version_op->name eq "lineseq") { + # We have a version parameter; skip nextstate & pushmark + my $constop = $version_op->first->next->next; + + return unless $self->const_sv($constop)->PV eq $module; + $constop = $constop->sibling; + $version = $self->const_sv($constop); + if (class($version) eq "IV") { + $version = $version->int_value; + } elsif (class($version) eq "NV") { + $version = $version->NV; + } elsif (class($version) ne "PVMG") { + # Includes PVIV and PVNV + $version = $version->PV; + } else { + # version specified as a v-string + $version = 'v'.join '.', map ord, split //, $version->PV; + } + $constop = $constop->sibling; + return if $constop->name ne "method_named"; + return if $self->const_sv($constop)->PV ne "VERSION"; + } + + $lineseq = $version_op->sibling; + return if $lineseq->name ne "lineseq"; + my $entersub = $lineseq->first->sibling; + if ($entersub->name eq "stub") { + return "use $module $version ();\n" if defined $version; + return "use $module ();\n"; + } + return if $entersub->name ne "entersub"; + + # See if there are import arguments + my $args = ''; + + my $svop = $entersub->first->sibling; # Skip over pushmark + return unless $self->const_sv($svop)->PV eq $module; + + # Pull out the arguments + for ($svop=$svop->sibling; $svop->name ne "method_named"; + $svop = $svop->sibling) { + $args .= ", " if length($args); + $args .= $self->deparse($svop, 6); + } + + my $use = 'use'; + my $method_named = $svop; + return if $method_named->name ne "method_named"; + my $method_name = $self->const_sv($method_named)->PV; + + if ($method_name eq "unimport") { + $use = 'no'; + } + + # Certain pragmas are dealt with using hint bits, + # so we ignore them here + if ($module eq 'strict' || $module eq 'integer' + || $module eq 'bytes' || $module eq 'warnings') { + return ""; + } + + if (defined $version && length $args) { + return "$use $module $version ($args);\n"; + } elsif (defined $version) { + return "$use $module $version;\n"; + } elsif (length $args) { + return "$use $module ($args);\n"; + } else { + return "$use $module;\n"; + } +} + +sub stash_subs { + my ($self, $pack) = @_; + my (@ret, $stash); + if (!defined $pack) { + $pack = ''; + $stash = \%::; + } + else { + $pack =~ s/(::)?$/::/; + no strict 'refs'; + $stash = \%$pack; + } + my %stash = svref_2object($stash)->ARRAY; + while (my ($key, $val) = each %stash) { + next if $key eq 'main::'; # avoid infinite recursion + my $class = class($val); + if ($class eq "PV") { + # Just a prototype. As an ugly but fairly effective way + # to find out if it belongs here is to see if the AUTOLOAD + # (if any) for the stash was defined in one of our files. + my $A = $stash{"AUTOLOAD"}; + if (defined ($A) && class($A) eq "GV" && defined($A->CV) + && class($A->CV) eq "CV") { + my $AF = $A->FILE; + next unless $AF eq $0 || exists $self->{'files'}{$AF}; + } + push @{$self->{'protos_todo'}}, [$pack . $key, $val->PV]; + } elsif ($class eq "IV") { + # Just a name. As above. + my $A = $stash{"AUTOLOAD"}; + if (defined ($A) && class($A) eq "GV" && defined($A->CV) + && class($A->CV) eq "CV") { + my $AF = $A->FILE; + next unless $AF eq $0 || exists $self->{'files'}{$AF}; + } + push @{$self->{'protos_todo'}}, [$pack . $key, undef]; + } elsif ($class eq "GV") { + if (class(my $cv = $val->CV) ne "SPECIAL") { + next if $self->{'subs_done'}{$$val}++; + next if $$val != ${$cv->GV}; # Ignore imposters + $self->todo($cv, 0); + } + if (class(my $cv = $val->FORM) ne "SPECIAL") { + next if $self->{'forms_done'}{$$val}++; + next if $$val != ${$cv->GV}; # Ignore imposters + $self->todo($cv, 1); + } + if (class($val->HV) ne "SPECIAL" && $key =~ /::$/) { + $self->stash_subs($pack . $key); + } + } + } +} + +sub print_protos { + my $self = shift; + my $ar; + my @ret; + foreach $ar (@{$self->{'protos_todo'}}) { + my $proto = (defined $ar->[1] ? " (". $ar->[1] . ")" : ""); + push @ret, "sub " . $ar->[0] . "$proto;\n"; + } + delete $self->{'protos_todo'}; + return @ret; +} + +sub style_opts { + my $self = shift; + my $opts = shift; + my $opt; + while (length($opt = substr($opts, 0, 1))) { + if ($opt eq "C") { + $self->{'cuddle'} = " "; + $opts = substr($opts, 1); + } elsif ($opt eq "i") { + $opts =~ s/^i(\d+)//; + $self->{'indent_size'} = $1; + } elsif ($opt eq "T") { + $self->{'use_tabs'} = 1; + $opts = substr($opts, 1); + } elsif ($opt eq "v") { + $opts =~ s/^v([^.]*)(.|$)//; + $self->{'ex_const'} = $1; + } + } +} + +sub new { + my $class = shift; + my $self = bless {}, $class; + $self->{'cuddle'} = "\n"; + $self->{'curcop'} = undef; + $self->{'curstash'} = "main"; + $self->{'ex_const'} = "'???'"; + $self->{'expand'} = 0; + $self->{'files'} = {}; + $self->{'indent_size'} = 4; + $self->{'linenums'} = 0; + $self->{'parens'} = 0; + $self->{'subs_todo'} = []; + $self->{'unquote'} = 0; + $self->{'use_dumper'} = 0; + $self->{'use_tabs'} = 0; + + $self->{'ambient_arybase'} = 0; + $self->{'ambient_warnings'} = undef; # Assume no lexical warnings + $self->{'ambient_hints'} = 0; + $self->init(); + + while (my $arg = shift @_) { + if ($arg eq "-d") { + $self->{'use_dumper'} = 1; + require Data::Dumper; + } elsif ($arg =~ /^-f(.*)/) { + $self->{'files'}{$1} = 1; + } elsif ($arg eq "-l") { + $self->{'linenums'} = 1; + } elsif ($arg eq "-p") { + $self->{'parens'} = 1; + } elsif ($arg eq "-P") { + $self->{'noproto'} = 1; + } elsif ($arg eq "-q") { + $self->{'unquote'} = 1; + } elsif (substr($arg, 0, 2) eq "-s") { + $self->style_opts(substr $arg, 2); + } elsif ($arg =~ /^-x(\d)$/) { + $self->{'expand'} = $1; + } + } + return $self; +} + +{ + # Mask out the bits that L<warnings::register> uses + my $WARN_MASK; + BEGIN { + $WARN_MASK = $warnings::Bits{all} | $warnings::DeadBits{all}; + } + sub WARN_MASK () { + return $WARN_MASK; + } +} + +# Initialise the contextual information, either from +# defaults provided with the ambient_pragmas method, +# or from perl's own defaults otherwise. +sub init { + my $self = shift; + + $self->{'arybase'} = $self->{'ambient_arybase'}; + $self->{'warnings'} = defined ($self->{'ambient_warnings'}) + ? $self->{'ambient_warnings'} & WARN_MASK + : undef; + $self->{'hints'} = $self->{'ambient_hints'} & 0xFF; + + # also a convenient place to clear out subs_declared + delete $self->{'subs_declared'}; +} + +sub compile { + my(@args) = @_; + return sub { + my $self = B::Deparse->new(@args); + # First deparse command-line args + if (defined $^I) { # deparse -i + print q(BEGIN { $^I = ).perlstring($^I).qq(; }\n); + } + if ($^W) { # deparse -w + print qq(BEGIN { \$^W = $^W; }\n); + } + if ($/ ne "\n" or defined $O::savebackslash) { # deparse -l and -0 + my $fs = perlstring($/) || 'undef'; + my $bs = perlstring($O::savebackslash) || 'undef'; + print qq(BEGIN { \$/ = $fs; \$\\ = $bs; }\n); + } + my @BEGINs = B::begin_av->isa("B::AV") ? B::begin_av->ARRAY : (); + my @CHECKs = B::check_av->isa("B::AV") ? B::check_av->ARRAY : (); + my @INITs = B::init_av->isa("B::AV") ? B::init_av->ARRAY : (); + my @ENDs = B::end_av->isa("B::AV") ? B::end_av->ARRAY : (); + for my $block (@BEGINs, @CHECKs, @INITs, @ENDs) { + $self->todo($block, 0); + } + $self->stash_subs(); + local($SIG{"__DIE__"}) = + sub { + if ($self->{'curcop'}) { + my $cop = $self->{'curcop'}; + my($line, $file) = ($cop->line, $cop->file); + print STDERR "While deparsing $file near line $line,\n"; + } + }; + $self->{'curcv'} = main_cv; + $self->{'curcvlex'} = undef; + print $self->print_protos; + @{$self->{'subs_todo'}} = + sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}}; + print $self->indent($self->deparse_root(main_root)), "\n" + unless null main_root; + my @text; + while (scalar(@{$self->{'subs_todo'}})) { + push @text, $self->next_todo; + } + print $self->indent(join("", @text)), "\n" if @text; + + # Print __DATA__ section, if necessary + no strict 'refs'; + my $laststash = defined $self->{'curcop'} + ? $self->{'curcop'}->stash->NAME : $self->{'curstash'}; + if (defined *{$laststash."::DATA"}{IO}) { + print "package $laststash;\n" + unless $laststash eq $self->{'curstash'}; + print "__DATA__\n"; + print readline(*{$laststash."::DATA"}); + } + } +} + +sub coderef2text { + my $self = shift; + my $sub = shift; + croak "Usage: ->coderef2text(CODEREF)" unless UNIVERSAL::isa($sub, "CODE"); + + $self->init(); + return $self->indent($self->deparse_sub(svref_2object($sub))); +} + +sub ambient_pragmas { + my $self = shift; + my ($arybase, $hint_bits, $warning_bits) = (0, 0); + + while (@_ > 1) { + my $name = shift(); + my $val = shift(); + + if ($name eq 'strict') { + require strict; + + if ($val eq 'none') { + $hint_bits &= ~strict::bits(qw/refs subs vars/); + next(); + } + + my @names; + if ($val eq "all") { + @names = qw/refs subs vars/; + } + elsif (ref $val) { + @names = @$val; + } + else { + @names = split' ', $val; + } + $hint_bits |= strict::bits(@names); + } + + elsif ($name eq '$[') { + $arybase = $val; + } + + elsif ($name eq 'integer' + || $name eq 'bytes' + || $name eq 'utf8') { + require "$name.pm"; + if ($val) { + $hint_bits |= ${$::{"${name}::"}{"hint_bits"}}; + } + else { + $hint_bits &= ~${$::{"${name}::"}{"hint_bits"}}; + } + } + + elsif ($name eq 're') { + require re; + if ($val eq 'none') { + $hint_bits &= ~re::bits(qw/taint eval/); + next(); + } + + my @names; + if ($val eq 'all') { + @names = qw/taint eval/; + } + elsif (ref $val) { + @names = @$val; + } + else { + @names = split' ',$val; + } + $hint_bits |= re::bits(@names); + } + + elsif ($name eq 'warnings') { + if ($val eq 'none') { + $warning_bits = $warnings::NONE; + next(); + } + + my @names; + if (ref $val) { + @names = @$val; + } + else { + @names = split/\s+/, $val; + } + + $warning_bits = $warnings::NONE if !defined ($warning_bits); + $warning_bits |= warnings::bits(@names); + } + + elsif ($name eq 'warning_bits') { + $warning_bits = $val; + } + + elsif ($name eq 'hint_bits') { + $hint_bits = $val; + } + + else { + croak "Unknown pragma type: $name"; + } + } + if (@_) { + croak "The ambient_pragmas method expects an even number of args"; + } + + $self->{'ambient_arybase'} = $arybase; + $self->{'ambient_warnings'} = $warning_bits; + $self->{'ambient_hints'} = $hint_bits; +} + +# This method is the inner loop, so try to keep it simple +sub deparse { + my $self = shift; + my($op, $cx) = @_; + + Carp::confess("Null op in deparse") if !defined($op) + || class($op) eq "NULL"; + my $meth = "pp_" . $op->name; + return $self->$meth($op, $cx); +} + +sub indent { + my $self = shift; + my $txt = shift; + my @lines = split(/\n/, $txt); + my $leader = ""; + my $level = 0; + my $line; + for $line (@lines) { + my $cmd = substr($line, 0, 1); + if ($cmd eq "\t" or $cmd eq "\b") { + $level += ($cmd eq "\t" ? 1 : -1) * $self->{'indent_size'}; + if ($self->{'use_tabs'}) { + $leader = "\t" x ($level / 8) . " " x ($level % 8); + } else { + $leader = " " x $level; + } + $line = substr($line, 1); + } + if (substr($line, 0, 1) eq "\f") { + $line = substr($line, 1); # no indent + } else { + $line = $leader . $line; + } + $line =~ s/\cK;?//g; + } + return join("\n", @lines); +} + +sub deparse_sub { + my $self = shift; + my $cv = shift; + my $proto = ""; +Carp::confess("NULL in deparse_sub") if !defined($cv) || $cv->isa("B::NULL"); +Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL"); + local $self->{'curcop'} = $self->{'curcop'}; + if ($cv->FLAGS & SVf_POK) { + $proto = "(". $cv->PV . ") "; + } + if ($cv->CvFLAGS & (CVf_METHOD|CVf_LOCKED|CVf_LVALUE|CVf_ASSERTION)) { + $proto .= ": "; + $proto .= "lvalue " if $cv->CvFLAGS & CVf_LVALUE; + $proto .= "locked " if $cv->CvFLAGS & CVf_LOCKED; + $proto .= "method " if $cv->CvFLAGS & CVf_METHOD; + $proto .= "assertion " if $cv->CvFLAGS & CVf_ASSERTION; + } + + local($self->{'curcv'}) = $cv; + local($self->{'curcvlex'}); + local(@$self{qw'curstash warnings hints'}) + = @$self{qw'curstash warnings hints'}; + my $body; + if (not null $cv->ROOT) { + my $lineseq = $cv->ROOT->first; + if ($lineseq->name eq "lineseq") { + my @ops; + for(my$o=$lineseq->first; $$o; $o=$o->sibling) { + push @ops, $o; + } + $body = $self->lineseq(undef, @ops).";"; + my $scope_en = $self->find_scope_en($lineseq); + if (defined $scope_en) { + my $subs = join"", $self->seq_subs($scope_en); + $body .= ";\n$subs" if length($subs); + } + } + else { + $body = $self->deparse($cv->ROOT->first, 0); + } + } + else { + my $sv = $cv->const_sv; + if ($$sv) { + # uh-oh. inlinable sub... format it differently + return $proto . "{ " . $self->const($sv, 0) . " }\n"; + } else { # XSUB? (or just a declaration) + return "$proto;\n"; + } + } + return $proto ."{\n\t$body\n\b}" ."\n"; +} + +sub deparse_format { + my $self = shift; + my $form = shift; + my @text; + local($self->{'curcv'}) = $form; + local($self->{'curcvlex'}); + local($self->{'in_format'}) = 1; + local(@$self{qw'curstash warnings hints'}) + = @$self{qw'curstash warnings hints'}; + my $op = $form->ROOT; + my $kid; + return "\f." if $op->first->name eq 'stub' + || $op->first->name eq 'nextstate'; + $op = $op->first->first; # skip leavewrite, lineseq + while (not null $op) { + $op = $op->sibling; # skip nextstate + my @exprs; + $kid = $op->first->sibling; # skip pushmark + push @text, "\f".$self->const_sv($kid)->PV; + $kid = $kid->sibling; + for (; not null $kid; $kid = $kid->sibling) { + push @exprs, $self->deparse($kid, 0); + } + push @text, "\f".join(", ", @exprs)."\n" if @exprs; + $op = $op->sibling; + } + return join("", @text) . "\f."; +} + +sub is_scope { + my $op = shift; + return $op->name eq "leave" || $op->name eq "scope" + || $op->name eq "lineseq" + || ($op->name eq "null" && class($op) eq "UNOP" + && (is_scope($op->first) || $op->first->name eq "enter")); +} + +sub is_state { + my $name = $_[0]->name; + return $name eq "nextstate" || $name eq "dbstate" || $name eq "setstate"; +} + +sub is_miniwhile { # check for one-line loop (`foo() while $y--') + my $op = shift; + return (!null($op) and null($op->sibling) + and $op->name eq "null" and class($op) eq "UNOP" + and (($op->first->name =~ /^(and|or)$/ + and $op->first->first->sibling->name eq "lineseq") + or ($op->first->name eq "lineseq" + and not null $op->first->first->sibling + and $op->first->first->sibling->name eq "unstack") + )); +} + +# Check if the op and its sibling are the initialization and the rest of a +# for (..;..;..) { ... } loop +sub is_for_loop { + my $op = shift; + # This OP might be almost anything, though it won't be a + # nextstate. (It's the initialization, so in the canonical case it + # will be an sassign.) The sibling is a lineseq whose first child + # is a nextstate and whose second is a leaveloop. + my $lseq = $op->sibling; + if (!is_state $op and !null($lseq) and $lseq->name eq "lineseq") { + if ($lseq->first && !null($lseq->first) && is_state($lseq->first) + && (my $sib = $lseq->first->sibling)) { + return (!null($sib) && $sib->name eq "leaveloop"); + } + } + return 0; +} + +sub is_scalar { + my $op = shift; + return ($op->name eq "rv2sv" or + $op->name eq "padsv" or + $op->name eq "gv" or # only in array/hash constructs + $op->flags & OPf_KIDS && !null($op->first) + && $op->first->name eq "gvsv"); +} + +sub maybe_parens { + my $self = shift; + my($text, $cx, $prec) = @_; + if ($prec < $cx # unary ops nest just fine + or $prec == $cx and $cx != 4 and $cx != 16 and $cx != 21 + or $self->{'parens'}) + { + $text = "($text)"; + # In a unop, let parent reuse our parens; see maybe_parens_unop + $text = "\cS" . $text if $cx == 16; + return $text; + } else { + return $text; + } +} + +# same as above, but get around the `if it looks like a function' rule +sub maybe_parens_unop { + my $self = shift; + my($name, $kid, $cx) = @_; + if ($cx > 16 or $self->{'parens'}) { + $kid = $self->deparse($kid, 1); + if ($name eq "umask" && $kid =~ /^\d+$/) { + $kid = sprintf("%#o", $kid); + } + return "$name($kid)"; + } else { + $kid = $self->deparse($kid, 16); + if ($name eq "umask" && $kid =~ /^\d+$/) { + $kid = sprintf("%#o", $kid); + } + if (substr($kid, 0, 1) eq "\cS") { + # use kid's parens + return $name . substr($kid, 1); + } elsif (substr($kid, 0, 1) eq "(") { + # avoid looks-like-a-function trap with extra parens + # (`+' can lead to ambiguities) + return "$name(" . $kid . ")"; + } else { + return "$name $kid"; + } + } +} + +sub maybe_parens_func { + my $self = shift; + my($func, $text, $cx, $prec) = @_; + if ($prec <= $cx or substr($text, 0, 1) eq "(" or $self->{'parens'}) { + return "$func($text)"; + } else { + return "$func $text"; + } +} + +sub maybe_local { + my $self = shift; + my($op, $cx, $text) = @_; + my $our_intro = ($op->name =~ /^(gv|rv2)[ash]v$/) ? OPpOUR_INTRO : 0; + if ($op->private & (OPpLVAL_INTRO|$our_intro) + and not $self->{'avoid_local'}{$$op}) { + my $our_local = ($op->private & OPpLVAL_INTRO) ? "local" : "our"; + if( $our_local eq 'our' ) { + # XXX This assertion fails code with non-ASCII identifiers, + # like ./ext/Encode/t/jperl.t + die "Unexpected our($text)\n" unless $text =~ /^\W(\w+::)*\w+\z/; + $text =~ s/(\w+::)+//; + } + if (want_scalar($op)) { + return "$our_local $text"; + } else { + return $self->maybe_parens_func("$our_local", $text, $cx, 16); + } + } else { + return $text; + } +} + +sub maybe_targmy { + my $self = shift; + my($op, $cx, $func, @args) = @_; + if ($op->private & OPpTARGET_MY) { + my $var = $self->padname($op->targ); + my $val = $func->($self, $op, 7, @args); + return $self->maybe_parens("$var = $val", $cx, 7); + } else { + return $func->($self, $op, $cx, @args); + } +} + +sub padname_sv { + my $self = shift; + my $targ = shift; + return $self->{'curcv'}->PADLIST->ARRAYelt(0)->ARRAYelt($targ); +} + +sub maybe_my { + my $self = shift; + my($op, $cx, $text) = @_; + if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) { + if (want_scalar($op)) { + return "my $text"; + } else { + return $self->maybe_parens_func("my", $text, $cx, 16); + } + } else { + return $text; + } +} + +# The following OPs don't have functions: + +# pp_padany -- does not exist after parsing + +sub AUTOLOAD { + if ($AUTOLOAD =~ s/^.*::pp_//) { + warn "unexpected OP_".uc $AUTOLOAD; + return "XXX"; + } else { + die "Undefined subroutine $AUTOLOAD called"; + } +} + +sub DESTROY {} # Do not AUTOLOAD + +# $root should be the op which represents the root of whatever +# we're sequencing here. If it's undefined, then we don't append +# any subroutine declarations to the deparsed ops, otherwise we +# append appropriate declarations. +sub lineseq { + my($self, $root, @ops) = @_; + my($expr, @exprs); + + my $out_cop = $self->{'curcop'}; + my $out_seq = defined($out_cop) ? $out_cop->cop_seq : undef; + my $limit_seq; + if (defined $root) { + $limit_seq = $out_seq; + my $nseq; + $nseq = $self->find_scope_st($root->sibling) if ${$root->sibling}; + $limit_seq = $nseq if !defined($limit_seq) + or defined($nseq) && $nseq < $limit_seq; + } + $limit_seq = $self->{'limit_seq'} + if defined($self->{'limit_seq'}) + && (!defined($limit_seq) || $self->{'limit_seq'} < $limit_seq); + local $self->{'limit_seq'} = $limit_seq; + for (my $i = 0; $i < @ops; $i++) { + $expr = ""; + if (is_state $ops[$i]) { + $expr = $self->deparse($ops[$i], 0); + $i++; + if ($i > $#ops) { + push @exprs, $expr; + last; + } + } + if (!is_state $ops[$i] and (my $ls = $ops[$i+1]) and + !null($ops[$i+1]) and $ops[$i+1]->name eq "lineseq") + { + if ($ls->first && !null($ls->first) && is_state($ls->first) + && (my $sib = $ls->first->sibling)) { + if (!null($sib) && $sib->name eq "leaveloop") { + push @exprs, $expr . $self->for_loop($ops[$i], 0); + $i++; + next; + } + } + } + $expr .= $self->deparse($ops[$i], (@ops != 1)/2); + $expr =~ s/;\n?\z//; + push @exprs, $expr; + } + my $body = join(";\n", grep {length} @exprs); + my $subs = ""; + if (defined $root && defined $limit_seq && !$self->{'in_format'}) { + $subs = join "\n", $self->seq_subs($limit_seq); + } + return join(";\n", grep {length} $body, $subs); +} + +sub scopeop { + my($real_block, $self, $op, $cx) = @_; + my $kid; + my @kids; + + local(@$self{qw'curstash warnings hints'}) + = @$self{qw'curstash warnings hints'} if $real_block; + if ($real_block) { + $kid = $op->first->sibling; # skip enter + if (is_miniwhile($kid)) { + my $top = $kid->first; + my $name = $top->name; + if ($name eq "and") { + $name = "while"; + } elsif ($name eq "or") { + $name = "until"; + } else { # no conditional -> while 1 or until 0 + return $self->deparse($top->first, 1) . " while 1"; + } + my $cond = $top->first; + my $body = $cond->sibling->first; # skip lineseq + $cond = $self->deparse($cond, 1); + $body = $self->deparse($body, 1); + return "$body $name $cond"; + } + } else { + $kid = $op->first; + } + for (; !null($kid); $kid = $kid->sibling) { + push @kids, $kid; + } + if ($cx > 0) { # inside an expression, (a do {} while for lineseq) + return "do {\n\t" . $self->lineseq($op, @kids) . "\n\b}"; + } else { + my $lineseq = $self->lineseq($op, @kids); + return (length ($lineseq) ? "$lineseq;" : ""); + } +} + +sub pp_scope { scopeop(0, @_); } +sub pp_lineseq { scopeop(0, @_); } +sub pp_leave { scopeop(1, @_); } + +# This is a special case of scopeop and lineseq, for the case of the +# main_root. The difference is that we print the output statements as +# soon as we get them, for the sake of impatient users. +sub deparse_root { + my $self = shift; + my($op) = @_; + local(@$self{qw'curstash warnings hints'}) + = @$self{qw'curstash warnings hints'}; + my @kids; + for (my $kid = $op->first->sibling; !null($kid); $kid = $kid->sibling) { + push @kids, $kid; + } + for (my $i = 0; $i < @kids; $i++) { + my $expr = ""; + if (is_state $kids[$i]) { + $expr = $self->deparse($kids[$i], 0); + $i++; + if ($i > $#kids) { + print $self->indent($expr); + last; + } + } + if (is_for_loop($kids[$i])) { + $expr .= $self->for_loop($kids[$i], 0); + $expr .= ";\n" unless $i == $#kids; + print $self->indent($expr); + $i++; + next; + } + $expr .= $self->deparse($kids[$i], (@kids != 1)/2); + $expr =~ s/;\n?\z//; + $expr .= ";"; + print $self->indent($expr); + print "\n" unless $i == $#kids; + } +} + +# The BEGIN {} is used here because otherwise this code isn't executed +# when you run B::Deparse on itself. +my %globalnames; +BEGIN { map($globalnames{$_}++, "SIG", "STDIN", "STDOUT", "STDERR", "INC", + "ENV", "ARGV", "ARGVOUT", "_"); } + +sub gv_name { + my $self = shift; + my $gv = shift; +Carp::confess() unless ref($gv) eq "B::GV"; + my $stash = $gv->STASH->NAME; + my $name = $gv->SAFENAME; + if (($stash eq 'main' && $globalnames{$name}) + or ($stash eq $self->{'curstash'} && !$globalnames{$name}) + or $name =~ /^[^A-Za-z_:]/) + { + $stash = ""; + } else { + $stash = $stash . "::"; + } + if ($name =~ /^(\^..|{)/) { + $name = "{$name}"; # ${^WARNING_BITS}, etc and ${ + } + return $stash . $name; +} + +# Return the name to use for a stash variable. +# If a lexical with the same name is in scope, it may need to be +# fully-qualified. +sub stash_variable { + my ($self, $prefix, $name) = @_; + + return "$prefix$name" if $name =~ /::/; + + unless ($prefix eq '$' || $prefix eq '@' || #' + $prefix eq '%' || $prefix eq '$#') { + return "$prefix$name"; + } + + my $v = ($prefix eq '$#' ? '@' : $prefix) . $name; + return $prefix .$self->{'curstash'}.'::'. $name if $self->lex_in_scope($v); + return "$prefix$name"; +} + +sub lex_in_scope { + my ($self, $name) = @_; + $self->populate_curcvlex() if !defined $self->{'curcvlex'}; + + return 0 if !defined($self->{'curcop'}); + my $seq = $self->{'curcop'}->cop_seq; + return 0 if !exists $self->{'curcvlex'}{$name}; + for my $a (@{$self->{'curcvlex'}{$name}}) { + my ($st, $en) = @$a; + return 1 if $seq > $st && $seq <= $en; + } + return 0; +} + +sub populate_curcvlex { + my $self = shift; + for (my $cv = $self->{'curcv'}; class($cv) eq "CV"; $cv = $cv->OUTSIDE) { + my $padlist = $cv->PADLIST; + # an undef CV still in lexical chain + next if class($padlist) eq "SPECIAL"; + my @padlist = $padlist->ARRAY; + my @ns = $padlist[0]->ARRAY; + + for (my $i=0; $i<@ns; ++$i) { + next if class($ns[$i]) eq "SPECIAL"; + next if $ns[$i]->FLAGS & SVpad_OUR; # Skip "our" vars + if (class($ns[$i]) eq "PV") { + # Probably that pesky lexical @_ + next; + } + my $name = $ns[$i]->PVX; + my ($seq_st, $seq_en) = + ($ns[$i]->FLAGS & SVf_FAKE) + ? (0, 999999) + : ($ns[$i]->NVX, $ns[$i]->IVX); + + push @{$self->{'curcvlex'}{$name}}, [$seq_st, $seq_en]; + } + } +} + +sub find_scope_st { ((find_scope(@_))[0]); } +sub find_scope_en { ((find_scope(@_))[1]); } + +# Recurses down the tree, looking for pad variable introductions and COPs +sub find_scope { + my ($self, $op, $scope_st, $scope_en) = @_; + carp("Undefined op in find_scope") if !defined $op; + return ($scope_st, $scope_en) unless $op->flags & OPf_KIDS; + + for (my $o=$op->first; $$o; $o=$o->sibling) { + if ($o->name =~ /^pad.v$/ && $o->private & OPpLVAL_INTRO) { + my $s = int($self->padname_sv($o->targ)->NVX); + my $e = $self->padname_sv($o->targ)->IVX; + $scope_st = $s if !defined($scope_st) || $s < $scope_st; + $scope_en = $e if !defined($scope_en) || $e > $scope_en; + } + elsif (is_state($o)) { + my $c = $o->cop_seq; + $scope_st = $c if !defined($scope_st) || $c < $scope_st; + $scope_en = $c if !defined($scope_en) || $c > $scope_en; + } + elsif ($o->flags & OPf_KIDS) { + ($scope_st, $scope_en) = + $self->find_scope($o, $scope_st, $scope_en) + } + } + + return ($scope_st, $scope_en); +} + +# Returns a list of subs which should be inserted before the COP +sub cop_subs { + my ($self, $op, $out_seq) = @_; + my $seq = $op->cop_seq; + # If we have nephews, then our sequence number indicates + # the cop_seq of the end of some sort of scope. + if (class($op->sibling) ne "NULL" && $op->sibling->flags & OPf_KIDS + and my $nseq = $self->find_scope_st($op->sibling) ) { + $seq = $nseq; + } + $seq = $out_seq if defined($out_seq) && $out_seq < $seq; + return $self->seq_subs($seq); +} + +sub seq_subs { + my ($self, $seq) = @_; + my @text; +#push @text, "# ($seq)\n"; + + return "" if !defined $seq; + while (scalar(@{$self->{'subs_todo'}}) + and $seq > $self->{'subs_todo'}[0][0]) { + push @text, $self->next_todo; + } + return @text; +} + +# Notice how subs and formats are inserted between statements here; +# also $[ assignments and pragmas. +sub pp_nextstate { + my $self = shift; + my($op, $cx) = @_; + $self->{'curcop'} = $op; + my @text; + push @text, $self->cop_subs($op); + push @text, $op->label . ": " if $op->label; + my $stash = $op->stashpv; + if ($stash ne $self->{'curstash'}) { + push @text, "package $stash;\n"; + $self->{'curstash'} = $stash; + } + + if ($self->{'arybase'} != $op->arybase) { + push @text, '$[ = '. $op->arybase .";\n"; + $self->{'arybase'} = $op->arybase; + } + + my $warnings = $op->warnings; + my $warning_bits; + if ($warnings->isa("B::SPECIAL") && $$warnings == 4) { + $warning_bits = $warnings::Bits{"all"} & WARN_MASK; + } + elsif ($warnings->isa("B::SPECIAL") && $$warnings == 5) { + $warning_bits = $warnings::NONE; + } + elsif ($warnings->isa("B::SPECIAL")) { + $warning_bits = undef; + } + else { + $warning_bits = $warnings->PV & WARN_MASK; + } + + if (defined ($warning_bits) and + !defined($self->{warnings}) || $self->{'warnings'} ne $warning_bits) { + push @text, declare_warnings($self->{'warnings'}, $warning_bits); + $self->{'warnings'} = $warning_bits; + } + + if ($self->{'hints'} != $op->private) { + push @text, declare_hints($self->{'hints'}, $op->private); + $self->{'hints'} = $op->private; + } + + # This should go after of any branches that add statements, to + # increase the chances that it refers to the same line it did in + # the original program. + if ($self->{'linenums'}) { + push @text, "\f#line " . $op->line . + ' "' . $op->file, qq'"\n'; + } + + return join("", @text); +} + +sub declare_warnings { + my ($from, $to) = @_; + if (($to & WARN_MASK) eq (warnings::bits("all") & WARN_MASK)) { + return "use warnings;\n"; + } + elsif (($to & WARN_MASK) eq ("\0"x length($to) & WARN_MASK)) { + return "no warnings;\n"; + } + return "BEGIN {\${^WARNING_BITS} = ".perlstring($to)."}\n"; +} + +sub declare_hints { + my ($from, $to) = @_; + my $use = $to & ~$from; + my $no = $from & ~$to; + my $decls = ""; + for my $pragma (hint_pragmas($use)) { + $decls .= "use $pragma;\n"; + } + for my $pragma (hint_pragmas($no)) { + $decls .= "no $pragma;\n"; + } + return $decls; +} + +sub hint_pragmas { + my ($bits) = @_; + my @pragmas; + push @pragmas, "integer" if $bits & 0x1; + push @pragmas, "strict 'refs'" if $bits & 0x2; + push @pragmas, "bytes" if $bits & 0x8; + return @pragmas; +} + +sub pp_dbstate { pp_nextstate(@_) } +sub pp_setstate { pp_nextstate(@_) } + +sub pp_unstack { return "" } # see also leaveloop + +sub baseop { + my $self = shift; + my($op, $cx, $name) = @_; + return $name; +} + +sub pp_stub { + my $self = shift; + my($op, $cx, $name) = @_; + if ($cx >= 1) { + return "()"; + } + else { + return "();"; + } +} +sub pp_wantarray { baseop(@_, "wantarray") } +sub pp_fork { baseop(@_, "fork") } +sub pp_wait { maybe_targmy(@_, \&baseop, "wait") } +sub pp_getppid { maybe_targmy(@_, \&baseop, "getppid") } +sub pp_time { maybe_targmy(@_, \&baseop, "time") } +sub pp_tms { baseop(@_, "times") } +sub pp_ghostent { baseop(@_, "gethostent") } +sub pp_gnetent { baseop(@_, "getnetent") } +sub pp_gprotoent { baseop(@_, "getprotoent") } +sub pp_gservent { baseop(@_, "getservent") } +sub pp_ehostent { baseop(@_, "endhostent") } +sub pp_enetent { baseop(@_, "endnetent") } +sub pp_eprotoent { baseop(@_, "endprotoent") } +sub pp_eservent { baseop(@_, "endservent") } +sub pp_gpwent { baseop(@_, "getpwent") } +sub pp_spwent { baseop(@_, "setpwent") } +sub pp_epwent { baseop(@_, "endpwent") } +sub pp_ggrent { baseop(@_, "getgrent") } +sub pp_sgrent { baseop(@_, "setgrent") } +sub pp_egrent { baseop(@_, "endgrent") } +sub pp_getlogin { baseop(@_, "getlogin") } + +sub POSTFIX () { 1 } + +# I couldn't think of a good short name, but this is the category of +# symbolic unary operators with interesting precedence + +sub pfixop { + my $self = shift; + my($op, $cx, $name, $prec, $flags) = (@_, 0); + my $kid = $op->first; + $kid = $self->deparse($kid, $prec); + return $self->maybe_parens(($flags & POSTFIX) ? "$kid$name" : "$name$kid", + $cx, $prec); +} + +sub pp_preinc { pfixop(@_, "++", 23) } +sub pp_predec { pfixop(@_, "--", 23) } +sub pp_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) } +sub pp_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) } +sub pp_i_preinc { pfixop(@_, "++", 23) } +sub pp_i_predec { pfixop(@_, "--", 23) } +sub pp_i_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) } +sub pp_i_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) } +sub pp_complement { maybe_targmy(@_, \&pfixop, "~", 21) } + +sub pp_negate { maybe_targmy(@_, \&real_negate) } +sub real_negate { + my $self = shift; + my($op, $cx) = @_; + if ($op->first->name =~ /^(i_)?negate$/) { + # avoid --$x + $self->pfixop($op, $cx, "-", 21.5); + } else { + $self->pfixop($op, $cx, "-", 21); + } +} +sub pp_i_negate { pp_negate(@_) } + +sub pp_not { + my $self = shift; + my($op, $cx) = @_; + if ($cx <= 4) { + $self->pfixop($op, $cx, "not ", 4); + } else { + $self->pfixop($op, $cx, "!", 21); + } +} + +sub unop { + my $self = shift; + my($op, $cx, $name) = @_; + my $kid; + if ($op->flags & OPf_KIDS) { + $kid = $op->first; + if (defined prototype("CORE::$name") + && prototype("CORE::$name") =~ /^;?\*/ + && $kid->name eq "rv2gv") { + $kid = $kid->first; + } + + return $self->maybe_parens_unop($name, $kid, $cx); + } else { + return $name . ($op->flags & OPf_SPECIAL ? "()" : ""); + } +} + +sub pp_chop { maybe_targmy(@_, \&unop, "chop") } +sub pp_chomp { maybe_targmy(@_, \&unop, "chomp") } +sub pp_schop { maybe_targmy(@_, \&unop, "chop") } +sub pp_schomp { maybe_targmy(@_, \&unop, "chomp") } +sub pp_defined { unop(@_, "defined") } +sub pp_undef { unop(@_, "undef") } +sub pp_study { unop(@_, "study") } +sub pp_ref { unop(@_, "ref") } +sub pp_pos { maybe_local(@_, unop(@_, "pos")) } + +sub pp_sin { maybe_targmy(@_, \&unop, "sin") } +sub pp_cos { maybe_targmy(@_, \&unop, "cos") } +sub pp_rand { maybe_targmy(@_, \&unop, "rand") } +sub pp_srand { unop(@_, "srand") } +sub pp_exp { maybe_targmy(@_, \&unop, "exp") } +sub pp_log { maybe_targmy(@_, \&unop, "log") } +sub pp_sqrt { maybe_targmy(@_, \&unop, "sqrt") } +sub pp_int { maybe_targmy(@_, \&unop, "int") } +sub pp_hex { maybe_targmy(@_, \&unop, "hex") } +sub pp_oct { maybe_targmy(@_, \&unop, "oct") } +sub pp_abs { maybe_targmy(@_, \&unop, "abs") } + +sub pp_length { maybe_targmy(@_, \&unop, "length") } +sub pp_ord { maybe_targmy(@_, \&unop, "ord") } +sub pp_chr { maybe_targmy(@_, \&unop, "chr") } + +sub pp_each { unop(@_, "each") } +sub pp_values { unop(@_, "values") } +sub pp_keys { unop(@_, "keys") } +sub pp_pop { unop(@_, "pop") } +sub pp_shift { unop(@_, "shift") } + +sub pp_caller { unop(@_, "caller") } +sub pp_reset { unop(@_, "reset") } +sub pp_exit { unop(@_, "exit") } +sub pp_prototype { unop(@_, "prototype") } + +sub pp_close { unop(@_, "close") } +sub pp_fileno { unop(@_, "fileno") } +sub pp_umask { unop(@_, "umask") } +sub pp_untie { unop(@_, "untie") } +sub pp_tied { unop(@_, "tied") } +sub pp_dbmclose { unop(@_, "dbmclose") } +sub pp_getc { unop(@_, "getc") } +sub pp_eof { unop(@_, "eof") } +sub pp_tell { unop(@_, "tell") } +sub pp_getsockname { unop(@_, "getsockname") } +sub pp_getpeername { unop(@_, "getpeername") } + +sub pp_chdir { maybe_targmy(@_, \&unop, "chdir") } +sub pp_chroot { maybe_targmy(@_, \&unop, "chroot") } +sub pp_readlink { unop(@_, "readlink") } +sub pp_rmdir { maybe_targmy(@_, \&unop, "rmdir") } +sub pp_readdir { unop(@_, "readdir") } +sub pp_telldir { unop(@_, "telldir") } +sub pp_rewinddir { unop(@_, "rewinddir") } +sub pp_closedir { unop(@_, "closedir") } +sub pp_getpgrp { maybe_targmy(@_, \&unop, "getpgrp") } +sub pp_localtime { unop(@_, "localtime") } +sub pp_gmtime { unop(@_, "gmtime") } +sub pp_alarm { unop(@_, "alarm") } +sub pp_sleep { maybe_targmy(@_, \&unop, "sleep") } + +sub pp_dofile { unop(@_, "do") } +sub pp_entereval { unop(@_, "eval") } + +sub pp_ghbyname { unop(@_, "gethostbyname") } +sub pp_gnbyname { unop(@_, "getnetbyname") } +sub pp_gpbyname { unop(@_, "getprotobyname") } +sub pp_shostent { unop(@_, "sethostent") } +sub pp_snetent { unop(@_, "setnetent") } +sub pp_sprotoent { unop(@_, "setprotoent") } +sub pp_sservent { unop(@_, "setservent") } +sub pp_gpwnam { unop(@_, "getpwnam") } +sub pp_gpwuid { unop(@_, "getpwuid") } +sub pp_ggrnam { unop(@_, "getgrnam") } +sub pp_ggrgid { unop(@_, "getgrgid") } + +sub pp_lock { unop(@_, "lock") } + +sub pp_exists { + my $self = shift; + my($op, $cx) = @_; + my $arg; + if ($op->private & OPpEXISTS_SUB) { + # Checking for the existence of a subroutine + return $self->maybe_parens_func("exists", + $self->pp_rv2cv($op->first, 16), $cx, 16); + } + if ($op->flags & OPf_SPECIAL) { + # Array element, not hash element + return $self->maybe_parens_func("exists", + $self->pp_aelem($op->first, 16), $cx, 16); + } + return $self->maybe_parens_func("exists", $self->pp_helem($op->first, 16), + $cx, 16); +} + +sub pp_delete { + my $self = shift; + my($op, $cx) = @_; + my $arg; + if ($op->private & OPpSLICE) { + if ($op->flags & OPf_SPECIAL) { + # Deleting from an array, not a hash + return $self->maybe_parens_func("delete", + $self->pp_aslice($op->first, 16), + $cx, 16); + } + return $self->maybe_parens_func("delete", + $self->pp_hslice($op->first, 16), + $cx, 16); + } else { + if ($op->flags & OPf_SPECIAL) { + # Deleting from an array, not a hash + return $self->maybe_parens_func("delete", + $self->pp_aelem($op->first, 16), + $cx, 16); + } + return $self->maybe_parens_func("delete", + $self->pp_helem($op->first, 16), + $cx, 16); + } +} + +sub pp_require { + my $self = shift; + my($op, $cx) = @_; + my $opname = $op->flags & OPf_SPECIAL ? 'CORE::require' : 'require'; + if (class($op) eq "UNOP" and $op->first->name eq "const" + and $op->first->private & OPpCONST_BARE) + { + my $name = $self->const_sv($op->first)->PV; + $name =~ s[/][::]g; + $name =~ s/\.pm//g; + return "$opname $name"; + } else { + $self->unop($op, $cx, $opname); + } +} + +sub pp_scalar { + my $self = shift; + my($op, $cv) = @_; + my $kid = $op->first; + if (not null $kid->sibling) { + # XXX Was a here-doc + return $self->dquote($op); + } + $self->unop(@_, "scalar"); +} + + +sub padval { + my $self = shift; + my $targ = shift; + return $self->{'curcv'}->PADLIST->ARRAYelt(1)->ARRAYelt($targ); +} + +sub pp_refgen { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first; + if ($kid->name eq "null") { + $kid = $kid->first; + if ($kid->name eq "anonlist" || $kid->name eq "anonhash") { + my($pre, $post) = @{{"anonlist" => ["[","]"], + "anonhash" => ["{","}"]}->{$kid->name}}; + my($expr, @exprs); + $kid = $kid->first->sibling; # skip pushmark + for (; !null($kid); $kid = $kid->sibling) { + $expr = $self->deparse($kid, 6); + push @exprs, $expr; + } + return $pre . join(", ", @exprs) . $post; + } elsif (!null($kid->sibling) and + $kid->sibling->name eq "anoncode") { + return "sub " . + $self->deparse_sub($self->padval($kid->sibling->targ)); + } elsif ($kid->name eq "pushmark") { + my $sib_name = $kid->sibling->name; + if ($sib_name =~ /^(pad|rv2)[ah]v$/ + and not $kid->sibling->flags & OPf_REF) + { + # The @a in \(@a) isn't in ref context, but only when the + # parens are there. + return "\\(" . $self->pp_list($op->first) . ")"; + } elsif ($sib_name eq 'entersub') { + my $text = $self->deparse($kid->sibling, 1); + # Always show parens for \(&func()), but only with -p otherwise + $text = "($text)" if $self->{'parens'} + or $kid->sibling->private & OPpENTERSUB_AMPER; + return "\\$text"; + } + } + } + $self->pfixop($op, $cx, "\\", 20); +} + +sub pp_srefgen { pp_refgen(@_) } + +sub pp_readline { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first; + $kid = $kid->first if $kid->name eq "rv2gv"; # <$fh> + return "<" . $self->deparse($kid, 1) . ">" if is_scalar($kid); + return $self->unop($op, $cx, "readline"); +} + +sub pp_rcatline { + my $self = shift; + my($op) = @_; + return "<" . $self->gv_name($self->gv_or_padgv($op)) . ">"; +} + +# Unary operators that can occur as pseudo-listops inside double quotes +sub dq_unop { + my $self = shift; + my($op, $cx, $name, $prec, $flags) = (@_, 0, 0); + my $kid; + if ($op->flags & OPf_KIDS) { + $kid = $op->first; + # If there's more than one kid, the first is an ex-pushmark. + $kid = $kid->sibling if not null $kid->sibling; + return $self->maybe_parens_unop($name, $kid, $cx); + } else { + return $name . ($op->flags & OPf_SPECIAL ? "()" : ""); + } +} + +sub pp_ucfirst { dq_unop(@_, "ucfirst") } +sub pp_lcfirst { dq_unop(@_, "lcfirst") } +sub pp_uc { dq_unop(@_, "uc") } +sub pp_lc { dq_unop(@_, "lc") } +sub pp_quotemeta { maybe_targmy(@_, \&dq_unop, "quotemeta") } + +sub loopex { + my $self = shift; + my ($op, $cx, $name) = @_; + if (class($op) eq "PVOP") { + return "$name " . $op->pv; + } elsif (class($op) eq "OP") { + return $name; + } elsif (class($op) eq "UNOP") { + # Note -- loop exits are actually exempt from the + # looks-like-a-func rule, but a few extra parens won't hurt + return $self->maybe_parens_unop($name, $op->first, $cx); + } +} + +sub pp_last { loopex(@_, "last") } +sub pp_next { loopex(@_, "next") } +sub pp_redo { loopex(@_, "redo") } +sub pp_goto { loopex(@_, "goto") } +sub pp_dump { loopex(@_, "dump") } + +sub ftst { + my $self = shift; + my($op, $cx, $name) = @_; + if (class($op) eq "UNOP") { + # Genuine `-X' filetests are exempt from the LLAFR, but not + # l?stat(); for the sake of clarity, give'em all parens + return $self->maybe_parens_unop($name, $op->first, $cx); + } elsif (class($op) =~ /^(SV|PAD)OP$/) { + return $self->maybe_parens_func($name, $self->pp_gv($op, 1), $cx, 16); + } else { # I don't think baseop filetests ever survive ck_ftst, but... + return $name; + } +} + +sub pp_lstat { ftst(@_, "lstat") } +sub pp_stat { ftst(@_, "stat") } +sub pp_ftrread { ftst(@_, "-R") } +sub pp_ftrwrite { ftst(@_, "-W") } +sub pp_ftrexec { ftst(@_, "-X") } +sub pp_fteread { ftst(@_, "-r") } +sub pp_ftewrite { ftst(@_, "-w") } +sub pp_fteexec { ftst(@_, "-x") } +sub pp_ftis { ftst(@_, "-e") } +sub pp_fteowned { ftst(@_, "-O") } +sub pp_ftrowned { ftst(@_, "-o") } +sub pp_ftzero { ftst(@_, "-z") } +sub pp_ftsize { ftst(@_, "-s") } +sub pp_ftmtime { ftst(@_, "-M") } +sub pp_ftatime { ftst(@_, "-A") } +sub pp_ftctime { ftst(@_, "-C") } +sub pp_ftsock { ftst(@_, "-S") } +sub pp_ftchr { ftst(@_, "-c") } +sub pp_ftblk { ftst(@_, "-b") } +sub pp_ftfile { ftst(@_, "-f") } +sub pp_ftdir { ftst(@_, "-d") } +sub pp_ftpipe { ftst(@_, "-p") } +sub pp_ftlink { ftst(@_, "-l") } +sub pp_ftsuid { ftst(@_, "-u") } +sub pp_ftsgid { ftst(@_, "-g") } +sub pp_ftsvtx { ftst(@_, "-k") } +sub pp_fttty { ftst(@_, "-t") } +sub pp_fttext { ftst(@_, "-T") } +sub pp_ftbinary { ftst(@_, "-B") } + +sub SWAP_CHILDREN () { 1 } +sub ASSIGN () { 2 } # has OP= variant +sub LIST_CONTEXT () { 4 } # Assignment is in list context + +my(%left, %right); + +sub assoc_class { + my $op = shift; + my $name = $op->name; + if ($name eq "concat" and $op->first->name eq "concat") { + # avoid spurious `=' -- see comment in pp_concat + return "concat"; + } + if ($name eq "null" and class($op) eq "UNOP" + and $op->first->name =~ /^(and|x?or)$/ + and null $op->first->sibling) + { + # Like all conditional constructs, OP_ANDs and OP_ORs are topped + # with a null that's used as the common end point of the two + # flows of control. For precedence purposes, ignore it. + # (COND_EXPRs have these too, but we don't bother with + # their associativity). + return assoc_class($op->first); + } + return $name . ($op->flags & OPf_STACKED ? "=" : ""); +} + +# Left associative operators, like `+', for which +# $a + $b + $c is equivalent to ($a + $b) + $c + +BEGIN { + %left = ('multiply' => 19, 'i_multiply' => 19, + 'divide' => 19, 'i_divide' => 19, + 'modulo' => 19, 'i_modulo' => 19, + 'repeat' => 19, + 'add' => 18, 'i_add' => 18, + 'subtract' => 18, 'i_subtract' => 18, + 'concat' => 18, + 'left_shift' => 17, 'right_shift' => 17, + 'bit_and' => 13, + 'bit_or' => 12, 'bit_xor' => 12, + 'and' => 3, + 'or' => 2, 'xor' => 2, + ); +} + +sub deparse_binop_left { + my $self = shift; + my($op, $left, $prec) = @_; + if ($left{assoc_class($op)} && $left{assoc_class($left)} + and $left{assoc_class($op)} == $left{assoc_class($left)}) + { + return $self->deparse($left, $prec - .00001); + } else { + return $self->deparse($left, $prec); + } +} + +# Right associative operators, like `=', for which +# $a = $b = $c is equivalent to $a = ($b = $c) + +BEGIN { + %right = ('pow' => 22, + 'sassign=' => 7, 'aassign=' => 7, + 'multiply=' => 7, 'i_multiply=' => 7, + 'divide=' => 7, 'i_divide=' => 7, + 'modulo=' => 7, 'i_modulo=' => 7, + 'repeat=' => 7, + 'add=' => 7, 'i_add=' => 7, + 'subtract=' => 7, 'i_subtract=' => 7, + 'concat=' => 7, + 'left_shift=' => 7, 'right_shift=' => 7, + 'bit_and=' => 7, + 'bit_or=' => 7, 'bit_xor=' => 7, + 'andassign' => 7, + 'orassign' => 7, + ); +} + +sub deparse_binop_right { + my $self = shift; + my($op, $right, $prec) = @_; + if ($right{assoc_class($op)} && $right{assoc_class($right)} + and $right{assoc_class($op)} == $right{assoc_class($right)}) + { + return $self->deparse($right, $prec - .00001); + } else { + return $self->deparse($right, $prec); + } +} + +sub binop { + my $self = shift; + my ($op, $cx, $opname, $prec, $flags) = (@_, 0); + my $left = $op->first; + my $right = $op->last; + my $eq = ""; + if ($op->flags & OPf_STACKED && $flags & ASSIGN) { + $eq = "="; + $prec = 7; + } + if ($flags & SWAP_CHILDREN) { + ($left, $right) = ($right, $left); + } + $left = $self->deparse_binop_left($op, $left, $prec); + $left = "($left)" if $flags & LIST_CONTEXT + && $left !~ /^(my|our|local|)[\@\(]/; + $right = $self->deparse_binop_right($op, $right, $prec); + return $self->maybe_parens("$left $opname$eq $right", $cx, $prec); +} + +sub pp_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) } +sub pp_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) } +sub pp_subtract { maybe_targmy(@_, \&binop, "-",18, ASSIGN) } +sub pp_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) } +sub pp_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) } +sub pp_i_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) } +sub pp_i_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) } +sub pp_i_subtract { maybe_targmy(@_, \&binop, "-", 18, ASSIGN) } +sub pp_i_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) } +sub pp_i_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) } +sub pp_pow { maybe_targmy(@_, \&binop, "**", 22, ASSIGN) } + +sub pp_left_shift { maybe_targmy(@_, \&binop, "<<", 17, ASSIGN) } +sub pp_right_shift { maybe_targmy(@_, \&binop, ">>", 17, ASSIGN) } +sub pp_bit_and { maybe_targmy(@_, \&binop, "&", 13, ASSIGN) } +sub pp_bit_or { maybe_targmy(@_, \&binop, "|", 12, ASSIGN) } +sub pp_bit_xor { maybe_targmy(@_, \&binop, "^", 12, ASSIGN) } + +sub pp_eq { binop(@_, "==", 14) } +sub pp_ne { binop(@_, "!=", 14) } +sub pp_lt { binop(@_, "<", 15) } +sub pp_gt { binop(@_, ">", 15) } +sub pp_ge { binop(@_, ">=", 15) } +sub pp_le { binop(@_, "<=", 15) } +sub pp_ncmp { binop(@_, "<=>", 14) } +sub pp_i_eq { binop(@_, "==", 14) } +sub pp_i_ne { binop(@_, "!=", 14) } +sub pp_i_lt { binop(@_, "<", 15) } +sub pp_i_gt { binop(@_, ">", 15) } +sub pp_i_ge { binop(@_, ">=", 15) } +sub pp_i_le { binop(@_, "<=", 15) } +sub pp_i_ncmp { binop(@_, "<=>", 14) } + +sub pp_seq { binop(@_, "eq", 14) } +sub pp_sne { binop(@_, "ne", 14) } +sub pp_slt { binop(@_, "lt", 15) } +sub pp_sgt { binop(@_, "gt", 15) } +sub pp_sge { binop(@_, "ge", 15) } +sub pp_sle { binop(@_, "le", 15) } +sub pp_scmp { binop(@_, "cmp", 14) } + +sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) } +sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) } + +# `.' is special because concats-of-concats are optimized to save copying +# by making all but the first concat stacked. The effect is as if the +# programmer had written `($a . $b) .= $c', except legal. +sub pp_concat { maybe_targmy(@_, \&real_concat) } +sub real_concat { + my $self = shift; + my($op, $cx) = @_; + my $left = $op->first; + my $right = $op->last; + my $eq = ""; + my $prec = 18; + if ($op->flags & OPf_STACKED and $op->first->name ne "concat") { + $eq = "="; + $prec = 7; + } + $left = $self->deparse_binop_left($op, $left, $prec); + $right = $self->deparse_binop_right($op, $right, $prec); + return $self->maybe_parens("$left .$eq $right", $cx, $prec); +} + +# `x' is weird when the left arg is a list +sub pp_repeat { + my $self = shift; + my($op, $cx) = @_; + my $left = $op->first; + my $right = $op->last; + my $eq = ""; + my $prec = 19; + if ($op->flags & OPf_STACKED) { + $eq = "="; + $prec = 7; + } + if (null($right)) { # list repeat; count is inside left-side ex-list + my $kid = $left->first->sibling; # skip pushmark + my @exprs; + for (; !null($kid->sibling); $kid = $kid->sibling) { + push @exprs, $self->deparse($kid, 6); + } + $right = $kid; + $left = "(" . join(", ", @exprs). ")"; + } else { + $left = $self->deparse_binop_left($op, $left, $prec); + } + $right = $self->deparse_binop_right($op, $right, $prec); + return $self->maybe_parens("$left x$eq $right", $cx, $prec); +} + +sub range { + my $self = shift; + my ($op, $cx, $type) = @_; + my $left = $op->first; + my $right = $left->sibling; + $left = $self->deparse($left, 9); + $right = $self->deparse($right, 9); + return $self->maybe_parens("$left $type $right", $cx, 9); +} + +sub pp_flop { + my $self = shift; + my($op, $cx) = @_; + my $flip = $op->first; + my $type = ($flip->flags & OPf_SPECIAL) ? "..." : ".."; + return $self->range($flip->first, $cx, $type); +} + +# one-line while/until is handled in pp_leave + +sub logop { + my $self = shift; + my ($op, $cx, $lowop, $lowprec, $highop, $highprec, $blockname) = @_; + my $left = $op->first; + my $right = $op->first->sibling; + if ($cx < 1 and is_scope($right) and $blockname + and $self->{'expand'} < 7) + { # if ($a) {$b} + $left = $self->deparse($left, 1); + $right = $self->deparse($right, 0); + return "$blockname ($left) {\n\t$right\n\b}\cK"; + } elsif ($cx < 1 and $blockname and not $self->{'parens'} + and $self->{'expand'} < 7) { # $b if $a + $right = $self->deparse($right, 1); + $left = $self->deparse($left, 1); + return "$right $blockname $left"; + } elsif ($cx > $lowprec and $highop) { # $a && $b + $left = $self->deparse_binop_left($op, $left, $highprec); + $right = $self->deparse_binop_right($op, $right, $highprec); + return $self->maybe_parens("$left $highop $right", $cx, $highprec); + } else { # $a and $b + $left = $self->deparse_binop_left($op, $left, $lowprec); + $right = $self->deparse_binop_right($op, $right, $lowprec); + return $self->maybe_parens("$left $lowop $right", $cx, $lowprec); + } +} + +sub pp_and { logop(@_, "and", 3, "&&", 11, "if") } +sub pp_or { logop(@_, "or", 2, "||", 10, "unless") } +sub pp_dor { logop(@_, "err", 2, "//", 10, "") } + +# xor is syntactically a logop, but it's really a binop (contrary to +# old versions of opcode.pl). Syntax is what matters here. +sub pp_xor { logop(@_, "xor", 2, "", 0, "") } + +sub logassignop { + my $self = shift; + my ($op, $cx, $opname) = @_; + my $left = $op->first; + my $right = $op->first->sibling->first; # skip sassign + $left = $self->deparse($left, 7); + $right = $self->deparse($right, 7); + return $self->maybe_parens("$left $opname $right", $cx, 7); +} + +sub pp_andassign { logassignop(@_, "&&=") } +sub pp_orassign { logassignop(@_, "||=") } +sub pp_dorassign { logassignop(@_, "//=") } + +sub listop { + my $self = shift; + my($op, $cx, $name) = @_; + my(@exprs); + my $parens = ($cx >= 5) || $self->{'parens'}; + my $kid = $op->first->sibling; + return $name if null $kid; + my $first; + $name = "socketpair" if $name eq "sockpair"; + my $proto = prototype("CORE::$name"); + if (defined $proto + && $proto =~ /^;?\*/ + && $kid->name eq "rv2gv") { + $first = $self->deparse($kid->first, 6); + } + else { + $first = $self->deparse($kid, 6); + } + if ($name eq "chmod" && $first =~ /^\d+$/) { + $first = sprintf("%#o", $first); + } + $first = "+$first" if not $parens and substr($first, 0, 1) eq "("; + push @exprs, $first; + $kid = $kid->sibling; + if (defined $proto && $proto =~ /^\*\*/ && $kid->name eq "rv2gv") { + push @exprs, $self->deparse($kid->first, 6); + $kid = $kid->sibling; + } + for (; !null($kid); $kid = $kid->sibling) { + push @exprs, $self->deparse($kid, 6); + } + if ($parens) { + return "$name(" . join(", ", @exprs) . ")"; + } else { + return "$name " . join(", ", @exprs); + } +} + +sub pp_bless { listop(@_, "bless") } +sub pp_atan2 { maybe_targmy(@_, \&listop, "atan2") } +sub pp_substr { maybe_local(@_, listop(@_, "substr")) } +sub pp_vec { maybe_local(@_, listop(@_, "vec")) } +sub pp_index { maybe_targmy(@_, \&listop, "index") } +sub pp_rindex { maybe_targmy(@_, \&listop, "rindex") } +sub pp_sprintf { maybe_targmy(@_, \&listop, "sprintf") } +sub pp_formline { listop(@_, "formline") } # see also deparse_format +sub pp_crypt { maybe_targmy(@_, \&listop, "crypt") } +sub pp_unpack { listop(@_, "unpack") } +sub pp_pack { listop(@_, "pack") } +sub pp_join { maybe_targmy(@_, \&listop, "join") } +sub pp_splice { listop(@_, "splice") } +sub pp_push { maybe_targmy(@_, \&listop, "push") } +sub pp_unshift { maybe_targmy(@_, \&listop, "unshift") } +sub pp_reverse { listop(@_, "reverse") } +sub pp_warn { listop(@_, "warn") } +sub pp_die { listop(@_, "die") } +# Actually, return is exempt from the LLAFR (see examples in this very +# module!), but for consistency's sake, ignore that fact +sub pp_return { listop(@_, "return") } +sub pp_open { listop(@_, "open") } +sub pp_pipe_op { listop(@_, "pipe") } +sub pp_tie { listop(@_, "tie") } +sub pp_binmode { listop(@_, "binmode") } +sub pp_dbmopen { listop(@_, "dbmopen") } +sub pp_sselect { listop(@_, "select") } +sub pp_select { listop(@_, "select") } +sub pp_read { listop(@_, "read") } +sub pp_sysopen { listop(@_, "sysopen") } +sub pp_sysseek { listop(@_, "sysseek") } +sub pp_sysread { listop(@_, "sysread") } +sub pp_syswrite { listop(@_, "syswrite") } +sub pp_send { listop(@_, "send") } +sub pp_recv { listop(@_, "recv") } +sub pp_seek { listop(@_, "seek") } +sub pp_fcntl { listop(@_, "fcntl") } +sub pp_ioctl { listop(@_, "ioctl") } +sub pp_flock { maybe_targmy(@_, \&listop, "flock") } +sub pp_socket { listop(@_, "socket") } +sub pp_sockpair { listop(@_, "sockpair") } +sub pp_bind { listop(@_, "bind") } +sub pp_connect { listop(@_, "connect") } +sub pp_listen { listop(@_, "listen") } +sub pp_accept { listop(@_, "accept") } +sub pp_shutdown { listop(@_, "shutdown") } +sub pp_gsockopt { listop(@_, "getsockopt") } +sub pp_ssockopt { listop(@_, "setsockopt") } +sub pp_chown { maybe_targmy(@_, \&listop, "chown") } +sub pp_unlink { maybe_targmy(@_, \&listop, "unlink") } +sub pp_chmod { maybe_targmy(@_, \&listop, "chmod") } +sub pp_utime { maybe_targmy(@_, \&listop, "utime") } +sub pp_rename { maybe_targmy(@_, \&listop, "rename") } +sub pp_link { maybe_targmy(@_, \&listop, "link") } +sub pp_symlink { maybe_targmy(@_, \&listop, "symlink") } +sub pp_mkdir { maybe_targmy(@_, \&listop, "mkdir") } +sub pp_open_dir { listop(@_, "opendir") } +sub pp_seekdir { listop(@_, "seekdir") } +sub pp_waitpid { maybe_targmy(@_, \&listop, "waitpid") } +sub pp_system { maybe_targmy(@_, \&listop, "system") } +sub pp_exec { maybe_targmy(@_, \&listop, "exec") } +sub pp_kill { maybe_targmy(@_, \&listop, "kill") } +sub pp_setpgrp { maybe_targmy(@_, \&listop, "setpgrp") } +sub pp_getpriority { maybe_targmy(@_, \&listop, "getpriority") } +sub pp_setpriority { maybe_targmy(@_, \&listop, "setpriority") } +sub pp_shmget { listop(@_, "shmget") } +sub pp_shmctl { listop(@_, "shmctl") } +sub pp_shmread { listop(@_, "shmread") } +sub pp_shmwrite { listop(@_, "shmwrite") } +sub pp_msgget { listop(@_, "msgget") } +sub pp_msgctl { listop(@_, "msgctl") } +sub pp_msgsnd { listop(@_, "msgsnd") } +sub pp_msgrcv { listop(@_, "msgrcv") } +sub pp_semget { listop(@_, "semget") } +sub pp_semctl { listop(@_, "semctl") } +sub pp_semop { listop(@_, "semop") } +sub pp_ghbyaddr { listop(@_, "gethostbyaddr") } +sub pp_gnbyaddr { listop(@_, "getnetbyaddr") } +sub pp_gpbynumber { listop(@_, "getprotobynumber") } +sub pp_gsbyname { listop(@_, "getservbyname") } +sub pp_gsbyport { listop(@_, "getservbyport") } +sub pp_syscall { listop(@_, "syscall") } + +sub pp_glob { + my $self = shift; + my($op, $cx) = @_; + my $text = $self->dq($op->first->sibling); # skip pushmark + if ($text =~ /^\$?(\w|::|\`)+$/ # could look like a readline + or $text =~ /[<>]/) { + return 'glob(' . single_delim('qq', '"', $text) . ')'; + } else { + return '<' . $text . '>'; + } +} + +# Truncate is special because OPf_SPECIAL makes a bareword first arg +# be a filehandle. This could probably be better fixed in the core +# by moving the GV lookup into ck_truc. + +sub pp_truncate { + my $self = shift; + my($op, $cx) = @_; + my(@exprs); + my $parens = ($cx >= 5) || $self->{'parens'}; + my $kid = $op->first->sibling; + my $fh; + if ($op->flags & OPf_SPECIAL) { + # $kid is an OP_CONST + $fh = $self->const_sv($kid)->PV; + } else { + $fh = $self->deparse($kid, 6); + $fh = "+$fh" if not $parens and substr($fh, 0, 1) eq "("; + } + my $len = $self->deparse($kid->sibling, 6); + if ($parens) { + return "truncate($fh, $len)"; + } else { + return "truncate $fh, $len"; + } +} + +sub indirop { + my $self = shift; + my($op, $cx, $name) = @_; + my($expr, @exprs); + my $kid = $op->first->sibling; + my $indir = ""; + if ($op->flags & OPf_STACKED) { + $indir = $kid; + $indir = $indir->first; # skip rv2gv + if (is_scope($indir)) { + $indir = "{" . $self->deparse($indir, 0) . "}"; + $indir = "{;}" if $indir eq "{}"; + } elsif ($indir->name eq "const" && $indir->private & OPpCONST_BARE) { + $indir = $self->const_sv($indir)->PV; + } else { + $indir = $self->deparse($indir, 24); + } + $indir = $indir . " "; + $kid = $kid->sibling; + } + if ($name eq "sort" && $op->private & (OPpSORT_NUMERIC | OPpSORT_INTEGER)) { + $indir = ($op->private & OPpSORT_DESCEND) ? '{$b <=> $a} ' + : '{$a <=> $b} '; + } + elsif ($name eq "sort" && $op->private & OPpSORT_DESCEND) { + $indir = '{$b cmp $a} '; + } + for (; !null($kid); $kid = $kid->sibling) { + $expr = $self->deparse($kid, 6); + push @exprs, $expr; + } + my $name2 = $name; + if ($name eq "sort" && $op->private & OPpSORT_REVERSE) { + $name2 = 'reverse sort'; + } + if ($name eq "sort" && ($op->private & OPpSORT_INPLACE)) { + return "$exprs[0] = $name2 $indir $exprs[0]"; + } + + my $args = $indir . join(", ", @exprs); + if ($indir ne "" and $name eq "sort") { + # We don't want to say "sort(f 1, 2, 3)", since perl -w will + # give bareword warnings in that case. Therefore if context + # requires, we'll put parens around the outside "(sort f 1, 2, + # 3)". Unfortunately, we'll currently think the parens are + # necessary more often that they really are, because we don't + # distinguish which side of an assignment we're on. + if ($cx >= 5) { + return "($name2 $args)"; + } else { + return "$name2 $args"; + } + } else { + return $self->maybe_parens_func($name2, $args, $cx, 5); + } + +} + +sub pp_prtf { indirop(@_, "printf") } +sub pp_print { indirop(@_, "print") } +sub pp_sort { indirop(@_, "sort") } + +sub mapop { + my $self = shift; + my($op, $cx, $name) = @_; + my($expr, @exprs); + my $kid = $op->first; # this is the (map|grep)start + $kid = $kid->first->sibling; # skip a pushmark + my $code = $kid->first; # skip a null + if (is_scope $code) { + $code = "{" . $self->deparse($code, 0) . "} "; + } else { + $code = $self->deparse($code, 24) . ", "; + } + $kid = $kid->sibling; + for (; !null($kid); $kid = $kid->sibling) { + $expr = $self->deparse($kid, 6); + push @exprs, $expr if defined $expr; + } + return $self->maybe_parens_func($name, $code . join(", ", @exprs), $cx, 5); +} + +sub pp_mapwhile { mapop(@_, "map") } +sub pp_grepwhile { mapop(@_, "grep") } +sub pp_mapstart { baseop(@_, "map") } +sub pp_grepstart { baseop(@_, "grep") } + +sub pp_list { + my $self = shift; + my($op, $cx) = @_; + my($expr, @exprs); + my $kid = $op->first->sibling; # skip pushmark + my $lop; + my $local = "either"; # could be local(...), my(...) or our(...) + for ($lop = $kid; !null($lop); $lop = $lop->sibling) { + # This assumes that no other private flags equal 128, and that + # OPs that store things other than flags in their op_private, + # like OP_AELEMFAST, won't be immediate children of a list. + # + # OP_ENTERSUB can break this logic, so check for it. + # I suspect that open and exit can too. + + if (!($lop->private & (OPpLVAL_INTRO|OPpOUR_INTRO) + or $lop->name eq "undef") + or $lop->name eq "entersub" + or $lop->name eq "exit" + or $lop->name eq "open") + { + $local = ""; # or not + last; + } + if ($lop->name =~ /^pad[ash]v$/) { # my() + ($local = "", last) if $local eq "local" || $local eq "our"; + $local = "my"; + } elsif ($lop->name =~ /^(gv|rv2)[ash]v$/ + && $lop->private & OPpOUR_INTRO + or $lop->name eq "null" && $lop->first->name eq "gvsv" + && $lop->first->private & OPpOUR_INTRO) { # our() + ($local = "", last) if $local eq "my" || $local eq "local"; + $local = "our"; + } elsif ($lop->name ne "undef" + # specifically avoid the "reverse sort" optimisation, + # where "reverse" is nullified + && !($lop->name eq 'sort' && ($lop->flags & OPpSORT_REVERSE))) + { + # local() + ($local = "", last) if $local eq "my" || $local eq "our"; + $local = "local"; + } + } + $local = "" if $local eq "either"; # no point if it's all undefs + return $self->deparse($kid, $cx) if null $kid->sibling and not $local; + for (; !null($kid); $kid = $kid->sibling) { + if ($local) { + if (class($kid) eq "UNOP" and $kid->first->name eq "gvsv") { + $lop = $kid->first; + } else { + $lop = $kid; + } + $self->{'avoid_local'}{$$lop}++; + $expr = $self->deparse($kid, 6); + delete $self->{'avoid_local'}{$$lop}; + } else { + $expr = $self->deparse($kid, 6); + } + push @exprs, $expr; + } + if ($local) { + return "$local(" . join(", ", @exprs) . ")"; + } else { + return $self->maybe_parens( join(", ", @exprs), $cx, 6); + } +} + +sub is_ifelse_cont { + my $op = shift; + return ($op->name eq "null" and class($op) eq "UNOP" + and $op->first->name =~ /^(and|cond_expr)$/ + and is_scope($op->first->first->sibling)); +} + +sub pp_cond_expr { + my $self = shift; + my($op, $cx) = @_; + my $cond = $op->first; + my $true = $cond->sibling; + my $false = $true->sibling; + my $cuddle = $self->{'cuddle'}; + unless ($cx < 1 and (is_scope($true) and $true->name ne "null") and + (is_scope($false) || is_ifelse_cont($false)) + and $self->{'expand'} < 7) { + $cond = $self->deparse($cond, 8); + $true = $self->deparse($true, 8); + $false = $self->deparse($false, 8); + return $self->maybe_parens("$cond ? $true : $false", $cx, 8); + } + + $cond = $self->deparse($cond, 1); + $true = $self->deparse($true, 0); + my $head = "if ($cond) {\n\t$true\n\b}"; + my @elsifs; + while (!null($false) and is_ifelse_cont($false)) { + my $newop = $false->first; + my $newcond = $newop->first; + my $newtrue = $newcond->sibling; + $false = $newtrue->sibling; # last in chain is OP_AND => no else + $newcond = $self->deparse($newcond, 1); + $newtrue = $self->deparse($newtrue, 0); + push @elsifs, "elsif ($newcond) {\n\t$newtrue\n\b}"; + } + if (!null($false)) { + $false = $cuddle . "else {\n\t" . + $self->deparse($false, 0) . "\n\b}\cK"; + } else { + $false = "\cK"; + } + return $head . join($cuddle, "", @elsifs) . $false; +} + +sub loop_common { + my $self = shift; + my($op, $cx, $init) = @_; + my $enter = $op->first; + my $kid = $enter->sibling; + local(@$self{qw'curstash warnings hints'}) + = @$self{qw'curstash warnings hints'}; + my $head = ""; + my $bare = 0; + my $body; + my $cond = undef; + if ($kid->name eq "lineseq") { # bare or infinite loop + if ($kid->last->name eq "unstack") { # infinite + $head = "while (1) "; # Can't use for(;;) if there's a continue + $cond = ""; + } else { + $bare = 1; + } + $body = $kid; + } elsif ($enter->name eq "enteriter") { # foreach + my $ary = $enter->first->sibling; # first was pushmark + my $var = $ary->sibling; + if ($ary->name eq 'null' and $enter->private & OPpITER_REVERSED) { + # "reverse" was optimised away + $ary = listop($self, $ary->first->sibling, 1, 'reverse'); + } elsif ($enter->flags & OPf_STACKED + and not null $ary->first->sibling->sibling) + { + $ary = $self->deparse($ary->first->sibling, 9) . " .. " . + $self->deparse($ary->first->sibling->sibling, 9); + } else { + $ary = $self->deparse($ary, 1); + } + if (null $var) { + if ($enter->flags & OPf_SPECIAL) { # thread special var + $var = $self->pp_threadsv($enter, 1); + } else { # regular my() variable + $var = $self->pp_padsv($enter, 1); + } + } elsif ($var->name eq "rv2gv") { + $var = $self->pp_rv2sv($var, 1); + if ($enter->private & OPpOUR_INTRO) { + # our declarations don't have package names + $var =~ s/^(.).*::/$1/; + $var = "our $var"; + } + } elsif ($var->name eq "gv") { + $var = "\$" . $self->deparse($var, 1); + } + $body = $kid->first->first->sibling; # skip OP_AND and OP_ITER + if (!is_state $body->first and $body->first->name ne "stub") { + confess unless $var eq '$_'; + $body = $body->first; + return $self->deparse($body, 2) . " foreach ($ary)"; + } + $head = "foreach $var ($ary) "; + } elsif ($kid->name eq "null") { # while/until + $kid = $kid->first; + my $name = {"and" => "while", "or" => "until"}->{$kid->name}; + $cond = $self->deparse($kid->first, 1); + $head = "$name ($cond) "; + $body = $kid->first->sibling; + } elsif ($kid->name eq "stub") { # bare and empty + return "{;}"; # {} could be a hashref + } + # If there isn't a continue block, then the next pointer for the loop + # will point to the unstack, which is kid's last child, except + # in a bare loop, when it will point to the leaveloop. When neither of + # these conditions hold, then the second-to-last child is the continue + # block (or the last in a bare loop). + my $cont_start = $enter->nextop; + my $cont; + if ($$cont_start != $$op && ${$cont_start} != ${$body->last}) { + if ($bare) { + $cont = $body->last; + } else { + $cont = $body->first; + while (!null($cont->sibling->sibling)) { + $cont = $cont->sibling; + } + } + my $state = $body->first; + my $cuddle = $self->{'cuddle'}; + my @states; + for (; $$state != $$cont; $state = $state->sibling) { + push @states, $state; + } + $body = $self->lineseq(undef, @states); + if (defined $cond and not is_scope $cont and $self->{'expand'} < 3) { + $head = "for ($init; $cond; " . $self->deparse($cont, 1) .") "; + $cont = "\cK"; + } else { + $cont = $cuddle . "continue {\n\t" . + $self->deparse($cont, 0) . "\n\b}\cK"; + } + } else { + return "" if !defined $body; + if (length $init) { + $head = "for ($init; $cond;) "; + } + $cont = "\cK"; + $body = $self->deparse($body, 0); + } + $body =~ s/;?$/;\n/; + + return $head . "{\n\t" . $body . "\b}" . $cont; +} + +sub pp_leaveloop { loop_common(@_, "") } + +sub for_loop { + my $self = shift; + my($op, $cx) = @_; + my $init = $self->deparse($op, 1); + return $self->loop_common($op->sibling->first->sibling, $cx, $init); +} + +sub pp_leavetry { + my $self = shift; + return "eval {\n\t" . $self->pp_leave(@_) . "\n\b}"; +} + +BEGIN { eval "sub OP_CONST () {" . opnumber("const") . "}" } +BEGIN { eval "sub OP_STRINGIFY () {" . opnumber("stringify") . "}" } +BEGIN { eval "sub OP_RV2SV () {" . opnumber("rv2sv") . "}" } +BEGIN { eval "sub OP_LIST () {" . opnumber("list") . "}" } + +sub pp_null { + my $self = shift; + my($op, $cx) = @_; + if (class($op) eq "OP") { + # old value is lost + return $self->{'ex_const'} if $op->targ == OP_CONST; + } elsif ($op->first->name eq "pushmark") { + return $self->pp_list($op, $cx); + } elsif ($op->first->name eq "enter") { + return $self->pp_leave($op, $cx); + } elsif ($op->targ == OP_STRINGIFY) { + return $self->dquote($op, $cx); + } elsif (!null($op->first->sibling) and + $op->first->sibling->name eq "readline" and + $op->first->sibling->flags & OPf_STACKED) { + return $self->maybe_parens($self->deparse($op->first, 7) . " = " + . $self->deparse($op->first->sibling, 7), + $cx, 7); + } elsif (!null($op->first->sibling) and + $op->first->sibling->name eq "trans" and + $op->first->sibling->flags & OPf_STACKED) { + return $self->maybe_parens($self->deparse($op->first, 20) . " =~ " + . $self->deparse($op->first->sibling, 20), + $cx, 20); + } elsif ($op->flags & OPf_SPECIAL && $cx < 1 && !$op->targ) { + return "do {\n\t". $self->deparse($op->first, $cx) ."\n\b};"; + } elsif (!null($op->first->sibling) and + $op->first->sibling->name eq "null" and + class($op->first->sibling) eq "UNOP" and + $op->first->sibling->first->flags & OPf_STACKED and + $op->first->sibling->first->name eq "rcatline") { + return $self->maybe_parens($self->deparse($op->first, 18) . " .= " + . $self->deparse($op->first->sibling, 18), + $cx, 18); + } else { + return $self->deparse($op->first, $cx); + } +} + +sub padname { + my $self = shift; + my $targ = shift; + return $self->padname_sv($targ)->PVX; +} + +sub padany { + my $self = shift; + my $op = shift; + return substr($self->padname($op->targ), 1); # skip $/@/% +} + +sub pp_padsv { + my $self = shift; + my($op, $cx) = @_; + return $self->maybe_my($op, $cx, $self->padname($op->targ)); +} + +sub pp_padav { pp_padsv(@_) } +sub pp_padhv { pp_padsv(@_) } + +my @threadsv_names; + +BEGIN { + @threadsv_names = ("_", "1", "2", "3", "4", "5", "6", "7", "8", "9", + "&", "`", "'", "+", "/", ".", ",", "\\", '"', ";", + "^", "-", "%", "=", "|", "~", ":", "^A", "^E", + "!", "@"); +} + +sub pp_threadsv { + my $self = shift; + my($op, $cx) = @_; + return $self->maybe_local($op, $cx, "\$" . $threadsv_names[$op->targ]); +} + +sub gv_or_padgv { + my $self = shift; + my $op = shift; + if (class($op) eq "PADOP") { + return $self->padval($op->padix); + } else { # class($op) eq "SVOP" + return $op->gv; + } +} + +sub pp_gvsv { + my $self = shift; + my($op, $cx) = @_; + my $gv = $self->gv_or_padgv($op); + return $self->maybe_local($op, $cx, $self->stash_variable("\$", + $self->gv_name($gv))); +} + +sub pp_gv { + my $self = shift; + my($op, $cx) = @_; + my $gv = $self->gv_or_padgv($op); + return $self->gv_name($gv); +} + +sub pp_aelemfast { + my $self = shift; + my($op, $cx) = @_; + my $name; + if ($op->flags & OPf_SPECIAL) { # optimised PADAV + $name = $self->padname($op->targ); + $name =~ s/^@/\$/; + } + else { + my $gv = $self->gv_or_padgv($op); + $name = $self->gv_name($gv); + $name = $self->{'curstash'}."::$name" + if $name !~ /::/ && $self->lex_in_scope('@'.$name); + $name = '$' . $name; + } + + return $name . "[" . ($op->private + $self->{'arybase'}) . "]"; +} + +sub rv2x { + my $self = shift; + my($op, $cx, $type) = @_; + + if (class($op) eq 'NULL' || !$op->can("first")) { + carp("Unexpected op in pp_rv2x"); + return 'XXX'; + } + my $kid = $op->first; + if ($kid->name eq "gv") { + return $self->stash_variable($type, $self->deparse($kid, 0)); + } elsif (is_scalar $kid) { + my $str = $self->deparse($kid, 0); + if ($str =~ /^\$([^\w\d])\z/) { + # "$$+" isn't a legal way to write the scalar dereference + # of $+, since the lexer can't tell you aren't trying to + # do something like "$$ + 1" to get one more than your + # PID. Either "${$+}" or "$${+}" are workable + # disambiguations, but if the programmer did the former, + # they'd be in the "else" clause below rather than here. + # It's not clear if this should somehow be unified with + # the code in dq and re_dq that also adds lexer + # disambiguation braces. + $str = '$' . "{$1}"; #' + } + return $type . $str; + } else { + return $type . "{" . $self->deparse($kid, 0) . "}"; + } +} + +sub pp_rv2sv { maybe_local(@_, rv2x(@_, "\$")) } +sub pp_rv2hv { maybe_local(@_, rv2x(@_, "%")) } +sub pp_rv2gv { maybe_local(@_, rv2x(@_, "*")) } + +# skip rv2av +sub pp_av2arylen { + my $self = shift; + my($op, $cx) = @_; + if ($op->first->name eq "padav") { + return $self->maybe_local($op, $cx, '$#' . $self->padany($op->first)); + } else { + return $self->maybe_local($op, $cx, + $self->rv2x($op->first, $cx, '$#')); + } +} + +# skip down to the old, ex-rv2cv +sub pp_rv2cv { + my ($self, $op, $cx) = @_; + if (!null($op->first) && $op->first->name eq 'null' && + $op->first->targ eq OP_LIST) + { + return $self->rv2x($op->first->first->sibling, $cx, "&") + } + else { + return $self->rv2x($op, $cx, "") + } +} + +sub list_const { + my $self = shift; + my($cx, @list) = @_; + my @a = map $self->const($_, 6), @list; + if (@a == 0) { + return "()"; + } elsif (@a == 1) { + return $a[0]; + } elsif ( @a > 2 and !grep(!/^-?\d+$/, @a)) { + # collapse (-1,0,1,2) into (-1..2) + my ($s, $e) = @a[0,-1]; + my $i = $s; + return $self->maybe_parens("$s..$e", $cx, 9) + unless grep $i++ != $_, @a; + } + return $self->maybe_parens(join(", ", @a), $cx, 6); +} + +sub pp_rv2av { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first; + if ($kid->name eq "const") { # constant list + my $av = $self->const_sv($kid); + return $self->list_const($cx, $av->ARRAY); + } else { + return $self->maybe_local($op, $cx, $self->rv2x($op, $cx, "\@")); + } + } + +sub is_subscriptable { + my $op = shift; + if ($op->name =~ /^[ahg]elem/) { + return 1; + } elsif ($op->name eq "entersub") { + my $kid = $op->first; + return 0 unless null $kid->sibling; + $kid = $kid->first; + $kid = $kid->sibling until null $kid->sibling; + return 0 if is_scope($kid); + $kid = $kid->first; + return 0 if $kid->name eq "gv"; + return 0 if is_scalar($kid); + return is_subscriptable($kid); + } else { + return 0; + } +} + +sub elem { + my $self = shift; + my ($op, $cx, $left, $right, $padname) = @_; + my($array, $idx) = ($op->first, $op->first->sibling); + unless ($array->name eq $padname) { # Maybe this has been fixed + $array = $array->first; # skip rv2av (or ex-rv2av in _53+) + } + if ($array->name eq $padname) { + $array = $self->padany($array); + } elsif (is_scope($array)) { # ${expr}[0] + $array = "{" . $self->deparse($array, 0) . "}"; + } elsif ($array->name eq "gv") { + $array = $self->gv_name($self->gv_or_padgv($array)); + if ($array !~ /::/) { + my $prefix = ($left eq '[' ? '@' : '%'); + $array = $self->{curstash}.'::'.$array + if $self->lex_in_scope($prefix . $array); + } + } elsif (is_scalar $array) { # $x[0], $$x[0], ... + $array = $self->deparse($array, 24); + } else { + # $x[20][3]{hi} or expr->[20] + my $arrow = is_subscriptable($array) ? "" : "->"; + return $self->deparse($array, 24) . $arrow . + $left . $self->deparse($idx, 1) . $right; + } + $idx = $self->deparse($idx, 1); + + # Outer parens in an array index will confuse perl + # if we're interpolating in a regular expression, i.e. + # /$x$foo[(-1)]/ is *not* the same as /$x$foo[-1]/ + # + # If $self->{parens}, then an initial '(' will + # definitely be paired with a final ')'. If + # !$self->{parens}, the misleading parens won't + # have been added in the first place. + # + # [You might think that we could get "(...)...(...)" + # where the initial and final parens do not match + # each other. But we can't, because the above would + # only happen if there's an infix binop between the + # two pairs of parens, and *that* means that the whole + # expression would be parenthesized as well.] + # + $idx =~ s/^\((.*)\)$/$1/ if $self->{'parens'}; + + # Hash-element braces will autoquote a bareword inside themselves. + # We need to make sure that C<$hash{warn()}> doesn't come out as + # C<$hash{warn}>, which has a quite different meaning. Currently + # B::Deparse will always quote strings, even if the string was a + # bareword in the original (i.e. the OPpCONST_BARE flag is ignored + # for constant strings.) So we can cheat slightly here - if we see + # a bareword, we know that it is supposed to be a function call. + # + $idx =~ s/^([A-Za-z_]\w*)$/$1()/; + + return "\$" . $array . $left . $idx . $right; +} + +sub pp_aelem { maybe_local(@_, elem(@_, "[", "]", "padav")) } +sub pp_helem { maybe_local(@_, elem(@_, "{", "}", "padhv")) } + +sub pp_gelem { + my $self = shift; + my($op, $cx) = @_; + my($glob, $part) = ($op->first, $op->last); + $glob = $glob->first; # skip rv2gv + $glob = $glob->first if $glob->name eq "rv2gv"; # this one's a bug + my $scope = is_scope($glob); + $glob = $self->deparse($glob, 0); + $part = $self->deparse($part, 1); + return "*" . ($scope ? "{$glob}" : $glob) . "{$part}"; +} + +sub slice { + my $self = shift; + my ($op, $cx, $left, $right, $regname, $padname) = @_; + my $last; + my(@elems, $kid, $array, $list); + if (class($op) eq "LISTOP") { + $last = $op->last; + } else { # ex-hslice inside delete() + for ($kid = $op->first; !null $kid->sibling; $kid = $kid->sibling) {} + $last = $kid; + } + $array = $last; + $array = $array->first + if $array->name eq $regname or $array->name eq "null"; + if (is_scope($array)) { + $array = "{" . $self->deparse($array, 0) . "}"; + } elsif ($array->name eq $padname) { + $array = $self->padany($array); + } else { + $array = $self->deparse($array, 24); + } + $kid = $op->first->sibling; # skip pushmark + if ($kid->name eq "list") { + $kid = $kid->first->sibling; # skip list, pushmark + for (; !null $kid; $kid = $kid->sibling) { + push @elems, $self->deparse($kid, 6); + } + $list = join(", ", @elems); + } else { + $list = $self->deparse($kid, 1); + } + return "\@" . $array . $left . $list . $right; +} + +sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) } +sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) } + +sub pp_lslice { + my $self = shift; + my($op, $cx) = @_; + my $idx = $op->first; + my $list = $op->last; + my(@elems, $kid); + $list = $self->deparse($list, 1); + $idx = $self->deparse($idx, 1); + return "($list)" . "[$idx]"; +} + +sub want_scalar { + my $op = shift; + return ($op->flags & OPf_WANT) == OPf_WANT_SCALAR; +} + +sub want_list { + my $op = shift; + return ($op->flags & OPf_WANT) == OPf_WANT_LIST; +} + +sub method { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first->sibling; # skip pushmark + my($meth, $obj, @exprs); + if ($kid->name eq "list" and want_list $kid) { + # When an indirect object isn't a bareword but the args are in + # parens, the parens aren't part of the method syntax (the LLAFR + # doesn't apply), but they make a list with OPf_PARENS set that + # doesn't get flattened by the append_elem that adds the method, + # making a (object, arg1, arg2, ...) list where the object + # usually is. This can be distinguished from + # `($obj, $arg1, $arg2)->meth()' (which is legal if $arg2 is an + # object) because in the later the list is in scalar context + # as the left side of -> always is, while in the former + # the list is in list context as method arguments always are. + # (Good thing there aren't method prototypes!) + $meth = $kid->sibling; + $kid = $kid->first->sibling; # skip pushmark + $obj = $kid; + $kid = $kid->sibling; + for (; not null $kid; $kid = $kid->sibling) { + push @exprs, $self->deparse($kid, 6); + } + } else { + $obj = $kid; + $kid = $kid->sibling; + for (; !null ($kid->sibling) && $kid->name ne "method_named"; + $kid = $kid->sibling) { + push @exprs, $self->deparse($kid, 6); + } + $meth = $kid; + } + $obj = $self->deparse($obj, 24); + if ($meth->name eq "method_named") { + $meth = $self->const_sv($meth)->PV; + } else { + $meth = $meth->first; + if ($meth->name eq "const") { + # As of 5.005_58, this case is probably obsoleted by the + # method_named case above + $meth = $self->const_sv($meth)->PV; # needs to be bare + } else { + $meth = $self->deparse($meth, 1); + } + } + my $args = join(", ", @exprs); + $kid = $obj . "->" . $meth; + if (length $args) { + return $kid . "(" . $args . ")"; # parens mandatory + } else { + return $kid; + } +} + +# returns "&" if the prototype doesn't match the args, +# or ("", $args_after_prototype_demunging) if it does. +sub check_proto { + my $self = shift; + return "&" if $self->{'noproto'}; + my($proto, @args) = @_; + my($arg, $real); + my $doneok = 0; + my @reals; + # An unbackslashed @ or % gobbles up the rest of the args + 1 while $proto =~ s/(?<!\\)([@%])[^\]]+$/$1/; + while ($proto) { + $proto =~ s/^(\\?[\$\@&%*]|\\\[[\$\@&%*]+\]|;)//; + my $chr = $1; + if ($chr eq "") { + return "&" if @args; + } elsif ($chr eq ";") { + $doneok = 1; + } elsif ($chr eq "@" or $chr eq "%") { + push @reals, map($self->deparse($_, 6), @args); + @args = (); + } else { + $arg = shift @args; + last unless $arg; + if ($chr eq "\$") { + if (want_scalar $arg) { + push @reals, $self->deparse($arg, 6); + } else { + return "&"; + } + } elsif ($chr eq "&") { + if ($arg->name =~ /^(s?refgen|undef)$/) { + push @reals, $self->deparse($arg, 6); + } else { + return "&"; + } + } elsif ($chr eq "*") { + if ($arg->name =~ /^s?refgen$/ + and $arg->first->first->name eq "rv2gv") + { + $real = $arg->first->first; # skip refgen, null + if ($real->first->name eq "gv") { + push @reals, $self->deparse($real, 6); + } else { + push @reals, $self->deparse($real->first, 6); + } + } else { + return "&"; + } + } elsif (substr($chr, 0, 1) eq "\\") { + $chr =~ tr/\\[]//d; + if ($arg->name =~ /^s?refgen$/ and + !null($real = $arg->first) and + ($chr =~ /\$/ && is_scalar($real->first) + or ($chr =~ /@/ + && class($real->first->sibling) ne 'NULL' + && $real->first->sibling->name + =~ /^(rv2|pad)av$/) + or ($chr =~ /%/ + && class($real->first->sibling) ne 'NULL' + && $real->first->sibling->name + =~ /^(rv2|pad)hv$/) + #or ($chr =~ /&/ # This doesn't work + # && $real->first->name eq "rv2cv") + or ($chr =~ /\*/ + && $real->first->name eq "rv2gv"))) + { + push @reals, $self->deparse($real, 6); + } else { + return "&"; + } + } + } + } + return "&" if $proto and !$doneok; # too few args and no `;' + return "&" if @args; # too many args + return ("", join ", ", @reals); +} + +sub pp_entersub { + my $self = shift; + my($op, $cx) = @_; + return $self->method($op, $cx) unless null $op->first->sibling; + my $prefix = ""; + my $amper = ""; + my($kid, @exprs); + if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) { + $prefix = "do "; + } elsif ($op->private & OPpENTERSUB_AMPER) { + $amper = "&"; + } + $kid = $op->first; + $kid = $kid->first->sibling; # skip ex-list, pushmark + for (; not null $kid->sibling; $kid = $kid->sibling) { + push @exprs, $kid; + } + my $simple = 0; + my $proto = undef; + if (is_scope($kid)) { + $amper = "&"; + $kid = "{" . $self->deparse($kid, 0) . "}"; + } elsif ($kid->first->name eq "gv") { + my $gv = $self->gv_or_padgv($kid->first); + if (class($gv->CV) ne "SPECIAL") { + $proto = $gv->CV->PV if $gv->CV->FLAGS & SVf_POK; + } + $simple = 1; # only calls of named functions can be prototyped + $kid = $self->deparse($kid, 24); + } elsif (is_scalar ($kid->first) && $kid->first->name ne 'rv2cv') { + $amper = "&"; + $kid = $self->deparse($kid, 24); + } else { + $prefix = ""; + my $arrow = is_subscriptable($kid->first) ? "" : "->"; + $kid = $self->deparse($kid, 24) . $arrow; + } + + # Doesn't matter how many prototypes there are, if + # they haven't happened yet! + my $declared; + { + no strict 'refs'; + no warnings 'uninitialized'; + $declared = exists $self->{'subs_declared'}{$kid} + || ( + defined &{ ${$self->{'curstash'}."::"}{$kid} } + && !exists + $self->{'subs_deparsed'}{$self->{'curstash'}."::".$kid} + && defined prototype $self->{'curstash'}."::".$kid + ); + if (!$declared && defined($proto)) { + # Avoid "too early to check prototype" warning + ($amper, $proto) = ('&'); + } + } + + my $args; + if ($declared and defined $proto and not $amper) { + ($amper, $args) = $self->check_proto($proto, @exprs); + if ($amper eq "&") { + $args = join(", ", map($self->deparse($_, 6), @exprs)); + } + } else { + $args = join(", ", map($self->deparse($_, 6), @exprs)); + } + if ($prefix or $amper) { + if ($op->flags & OPf_STACKED) { + return $prefix . $amper . $kid . "(" . $args . ")"; + } else { + return $prefix . $amper. $kid; + } + } else { + # glob() invocations can be translated into calls of + # CORE::GLOBAL::glob with a second parameter, a number. + # Reverse this. + if ($kid eq "CORE::GLOBAL::glob") { + $kid = "glob"; + $args =~ s/\s*,[^,]+$//; + } + + # It's a syntax error to call CORE::GLOBAL::foo without a prefix, + # so it must have been translated from a keyword call. Translate + # it back. + $kid =~ s/^CORE::GLOBAL:://; + + my $dproto = defined($proto) ? $proto : "undefined"; + if (!$declared) { + return "$kid(" . $args . ")"; + } elsif ($dproto eq "") { + return $kid; + } elsif ($dproto eq "\$" and is_scalar($exprs[0])) { + # is_scalar is an excessively conservative test here: + # really, we should be comparing to the precedence of the + # top operator of $exprs[0] (ala unop()), but that would + # take some major code restructuring to do right. + return $self->maybe_parens_func($kid, $args, $cx, 16); + } elsif ($dproto ne '$' and defined($proto) || $simple) { #' + return $self->maybe_parens_func($kid, $args, $cx, 5); + } else { + return "$kid(" . $args . ")"; + } + } +} + +sub pp_enterwrite { unop(@_, "write") } + +# escape things that cause interpolation in double quotes, +# but not character escapes +sub uninterp { + my($str) = @_; + $str =~ s/(^|\G|[^\\])((?:\\\\)*)([\$\@]|\\[uUlLQE])/$1$2\\$3/g; + return $str; +} + +{ +my $bal; +BEGIN { + use re "eval"; + # Matches any string which is balanced with respect to {braces} + $bal = qr( + (?: + [^\\{}] + | \\\\ + | \\[{}] + | \{(??{$bal})\} + )* + )x; +} + +# the same, but treat $|, $), $( and $ at the end of the string differently +sub re_uninterp { + my($str) = @_; + + $str =~ s/ + ( ^|\G # $1 + | [^\\] + ) + + ( # $2 + (?:\\\\)* + ) + + ( # $3 + (\(\?\??\{$bal\}\)) # $4 + | [\$\@] + (?!\||\)|\(|$) + | \\[uUlLQE] + ) + + /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg; + + return $str; +} + +# This is for regular expressions with the /x modifier +# We have to leave comments unmangled. +sub re_uninterp_extended { + my($str) = @_; + + $str =~ s/ + ( ^|\G # $1 + | [^\\] + ) + + ( # $2 + (?:\\\\)* + ) + + ( # $3 + ( \(\?\??\{$bal\}\) # $4 (skip over (?{}) and (??{}) blocks) + | \#[^\n]* # (skip over comments) + ) + | [\$\@] + (?!\||\)|\(|$|\s) + | \\[uUlLQE] + ) + + /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg; + + return $str; +} +} + +my %unctrl = # portable to to EBCDIC + ( + "\c@" => '\c@', # unused + "\cA" => '\cA', + "\cB" => '\cB', + "\cC" => '\cC', + "\cD" => '\cD', + "\cE" => '\cE', + "\cF" => '\cF', + "\cG" => '\cG', + "\cH" => '\cH', + "\cI" => '\cI', + "\cJ" => '\cJ', + "\cK" => '\cK', + "\cL" => '\cL', + "\cM" => '\cM', + "\cN" => '\cN', + "\cO" => '\cO', + "\cP" => '\cP', + "\cQ" => '\cQ', + "\cR" => '\cR', + "\cS" => '\cS', + "\cT" => '\cT', + "\cU" => '\cU', + "\cV" => '\cV', + "\cW" => '\cW', + "\cX" => '\cX', + "\cY" => '\cY', + "\cZ" => '\cZ', + "\c[" => '\c[', # unused + "\c\\" => '\c\\', # unused + "\c]" => '\c]', # unused + "\c_" => '\c_', # unused + ); + +# character escapes, but not delimiters that might need to be escaped +sub escape_str { # ASCII, UTF8 + my($str) = @_; + $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg; + $str =~ s/\a/\\a/g; +# $str =~ s/\cH/\\b/g; # \b means something different in a regex + $str =~ s/\t/\\t/g; + $str =~ s/\n/\\n/g; + $str =~ s/\e/\\e/g; + $str =~ s/\f/\\f/g; + $str =~ s/\r/\\r/g; + $str =~ s/([\cA-\cZ])/$unctrl{$1}/ge; + $str =~ s/([[:^print:]])/sprintf("\\%03o", ord($1))/ge; + return $str; +} + +# For regexes with the /x modifier. +# Leave whitespace unmangled. +sub escape_extended_re { + my($str) = @_; + $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg; + $str =~ s/([[:^print:]])/ + ($1 =~ y! \t\n!!) ? $1 : sprintf("\\%03o", ord($1))/ge; + $str =~ s/\n/\n\f/g; + return $str; +} + +# Don't do this for regexen +sub unback { + my($str) = @_; + $str =~ s/\\/\\\\/g; + return $str; +} + +# Remove backslashes which precede literal control characters, +# to avoid creating ambiguity when we escape the latter. +sub re_unback { + my($str) = @_; + + # the insane complexity here is due to the behaviour of "\c\" + $str =~ s/(^|[^\\]|\\c\\)(?<!\\c)\\(\\\\)*(?=[[:^print:]])/$1$2/g; + return $str; +} + +sub balanced_delim { + my($str) = @_; + my @str = split //, $str; + my($ar, $open, $close, $fail, $c, $cnt); + for $ar (['[',']'], ['(',')'], ['<','>'], ['{','}']) { + ($open, $close) = @$ar; + $fail = 0; $cnt = 0; + for $c (@str) { + if ($c eq $open) { + $cnt++; + } elsif ($c eq $close) { + $cnt--; + if ($cnt < 0) { + # qq()() isn't ")(" + $fail = 1; + last; + } + } + } + $fail = 1 if $cnt != 0; + return ($open, "$open$str$close") if not $fail; + } + return ("", $str); +} + +sub single_delim { + my($q, $default, $str) = @_; + return "$default$str$default" if $default and index($str, $default) == -1; + if ($q ne 'qr') { + (my $succeed, $str) = balanced_delim($str); + return "$q$str" if $succeed; + } + for my $delim ('/', '"', '#') { + return "$q$delim" . $str . $delim if index($str, $delim) == -1; + } + if ($default) { + $str =~ s/$default/\\$default/g; + return "$default$str$default"; + } else { + $str =~ s[/][\\/]g; + return "$q/$str/"; + } +} + +my $max_prec; +BEGIN { $max_prec = int(0.999 + 8*length(pack("F", 42))*log(2)/log(10)); } + +# Split a floating point number into an integer mantissa and a binary +# exponent. Assumes you've already made sure the number isn't zero or +# some weird infinity or NaN. +sub split_float { + my($f) = @_; + my $exponent = 0; + if ($f == int($f)) { + while ($f % 2 == 0) { + $f /= 2; + $exponent++; + } + } else { + while ($f != int($f)) { + $f *= 2; + $exponent--; + } + } + my $mantissa = sprintf("%.0f", $f); + return ($mantissa, $exponent); +} + +sub const { + my $self = shift; + my($sv, $cx) = @_; + if ($self->{'use_dumper'}) { + return $self->const_dumper($sv, $cx); + } + if (class($sv) eq "SPECIAL") { + # sv_undef, sv_yes, sv_no + return ('undef', '1', $self->maybe_parens("!1", $cx, 21))[$$sv-1]; + } elsif (class($sv) eq "NULL") { + return 'undef'; + } + # convert a version object into the "v1.2.3" string in its V magic + if ($sv->FLAGS & SVs_RMG) { + for (my $mg = $sv->MAGIC; $mg; $mg = $mg->MOREMAGIC) { + return $mg->PTR if $mg->TYPE eq 'V'; + } + } + + if ($sv->FLAGS & SVf_IOK) { + my $str = $sv->int_value; + $str = $self->maybe_parens($str, $cx, 21) if $str < 0; + return $str; + } elsif ($sv->FLAGS & SVf_NOK) { + my $nv = $sv->NV; + if ($nv == 0) { + if (pack("F", $nv) eq pack("F", 0)) { + # positive zero + return "0"; + } else { + # negative zero + return $self->maybe_parens("-.0", $cx, 21); + } + } elsif (1/$nv == 0) { + if ($nv > 0) { + # positive infinity + return $self->maybe_parens("9**9**9", $cx, 22); + } else { + # negative infinity + return $self->maybe_parens("-9**9**9", $cx, 21); + } + } elsif ($nv != $nv) { + # NaN + if (pack("F", $nv) eq pack("F", sin(9**9**9))) { + # the normal kind + return "sin(9**9**9)"; + } elsif (pack("F", $nv) eq pack("F", -sin(9**9**9))) { + # the inverted kind + return $self->maybe_parens("-sin(9**9**9)", $cx, 21); + } else { + # some other kind + my $hex = unpack("h*", pack("F", $nv)); + return qq'unpack("F", pack("h*", "$hex"))'; + } + } + # first, try the default stringification + my $str = "$nv"; + if ($str != $nv) { + # failing that, try using more precision + $str = sprintf("%.${max_prec}g", $nv); +# if (pack("F", $str) ne pack("F", $nv)) { + if ($str != $nv) { + # not representable in decimal with whatever sprintf() + # and atof() Perl is using here. + my($mant, $exp) = split_float($nv); + return $self->maybe_parens("$mant * 2**$exp", $cx, 19); + } + } + $str = $self->maybe_parens($str, $cx, 21) if $nv < 0; + return $str; + } elsif ($sv->FLAGS & SVf_ROK && $sv->can("RV")) { + my $ref = $sv->RV; + if (class($ref) eq "AV") { + return "[" . $self->list_const(2, $ref->ARRAY) . "]"; + } elsif (class($ref) eq "HV") { + my %hash = $ref->ARRAY; + my @elts; + for my $k (sort keys %hash) { + push @elts, "$k => " . $self->const($hash{$k}, 6); + } + return "{" . join(", ", @elts) . "}"; + } elsif (class($ref) eq "CV") { + return "sub " . $self->deparse_sub($ref); + } + if ($ref->FLAGS & SVs_SMG) { + for (my $mg = $ref->MAGIC; $mg; $mg = $mg->MOREMAGIC) { + if ($mg->TYPE eq 'r') { + my $re = re_uninterp(escape_str(re_unback($mg->precomp))); + return single_delim("qr", "", $re); + } + } + } + + return $self->maybe_parens("\\" . $self->const($ref, 20), $cx, 20); + } elsif ($sv->FLAGS & SVf_POK) { + my $str = $sv->PV; + if ($str =~ /[^ -~]/) { # ASCII for non-printing + return single_delim("qq", '"', uninterp escape_str unback $str); + } else { + return single_delim("q", "'", unback $str); + } + } else { + return "undef"; + } +} + +sub const_dumper { + my $self = shift; + my($sv, $cx) = @_; + my $ref = $sv->object_2svref(); + my $dumper = Data::Dumper->new([$$ref], ['$v']); + $dumper->Purity(1)->Terse(1)->Deparse(1)->Indent(0)->Useqq(1)->Sortkeys(1); + my $str = $dumper->Dump(); + if ($str =~ /^\$v/) { + return '${my ' . $str . ' \$v}'; + } else { + return $str; + } +} + +sub const_sv { + my $self = shift; + my $op = shift; + my $sv = $op->sv; + # the constant could be in the pad (under useithreads) + $sv = $self->padval($op->targ) unless $$sv; + return $sv; +} + +sub pp_const { + my $self = shift; + my($op, $cx) = @_; + if ($op->private & OPpCONST_ARYBASE) { + return '$['; + } +# if ($op->private & OPpCONST_BARE) { # trouble with `=>' autoquoting +# return $self->const_sv($op)->PV; +# } + my $sv = $self->const_sv($op); + return $self->const($sv, $cx); +} + +sub dq { + my $self = shift; + my $op = shift; + my $type = $op->name; + if ($type eq "const") { + return '$[' if $op->private & OPpCONST_ARYBASE; + return uninterp(escape_str(unback($self->const_sv($op)->as_string))); + } elsif ($type eq "concat") { + my $first = $self->dq($op->first); + my $last = $self->dq($op->last); + + # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]", "$foo\::bar" + ($last =~ /^[A-Z\\\^\[\]_?]/ && + $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc + || ($last =~ /^[:'{\[\w_]/ && #' + $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/); + + return $first . $last; + } elsif ($type eq "uc") { + return '\U' . $self->dq($op->first->sibling) . '\E'; + } elsif ($type eq "lc") { + return '\L' . $self->dq($op->first->sibling) . '\E'; + } elsif ($type eq "ucfirst") { + return '\u' . $self->dq($op->first->sibling); + } elsif ($type eq "lcfirst") { + return '\l' . $self->dq($op->first->sibling); + } elsif ($type eq "quotemeta") { + return '\Q' . $self->dq($op->first->sibling) . '\E'; + } elsif ($type eq "join") { + return $self->deparse($op->last, 26); # was join($", @ary) + } else { + return $self->deparse($op, 26); + } +} + +sub pp_backtick { + my $self = shift; + my($op, $cx) = @_; + # skip pushmark + return single_delim("qx", '`', $self->dq($op->first->sibling)); +} + +sub dquote { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first->sibling; # skip ex-stringify, pushmark + return $self->deparse($kid, $cx) if $self->{'unquote'}; + $self->maybe_targmy($kid, $cx, + sub {single_delim("qq", '"', $self->dq($_[1]))}); +} + +# OP_STRINGIFY is a listop, but it only ever has one arg +sub pp_stringify { maybe_targmy(@_, \&dquote) } + +# tr/// and s/// (and tr[][], tr[]//, tr###, etc) +# note that tr(from)/to/ is OK, but not tr/from/(to) +sub double_delim { + my($from, $to) = @_; + my($succeed, $delim); + if ($from !~ m[/] and $to !~ m[/]) { + return "/$from/$to/"; + } elsif (($succeed, $from) = balanced_delim($from) and $succeed) { + if (($succeed, $to) = balanced_delim($to) and $succeed) { + return "$from$to"; + } else { + for $delim ('/', '"', '#') { # note no `'' -- s''' is special + return "$from$delim$to$delim" if index($to, $delim) == -1; + } + $to =~ s[/][\\/]g; + return "$from/$to/"; + } + } else { + for $delim ('/', '"', '#') { # note no ' + return "$delim$from$delim$to$delim" + if index($to . $from, $delim) == -1; + } + $from =~ s[/][\\/]g; + $to =~ s[/][\\/]g; + return "/$from/$to/"; + } +} + +# Only used by tr///, so backslashes hyphens +sub pchr { # ASCII + my($n) = @_; + if ($n == ord '\\') { + return '\\\\'; + } elsif ($n == ord "-") { + return "\\-"; + } elsif ($n >= ord(' ') and $n <= ord('~')) { + return chr($n); + } elsif ($n == ord "\a") { + return '\\a'; + } elsif ($n == ord "\b") { + return '\\b'; + } elsif ($n == ord "\t") { + return '\\t'; + } elsif ($n == ord "\n") { + return '\\n'; + } elsif ($n == ord "\e") { + return '\\e'; + } elsif ($n == ord "\f") { + return '\\f'; + } elsif ($n == ord "\r") { + return '\\r'; + } elsif ($n >= ord("\cA") and $n <= ord("\cZ")) { + return '\\c' . chr(ord("@") + $n); + } else { +# return '\x' . sprintf("%02x", $n); + return '\\' . sprintf("%03o", $n); + } +} + +sub collapse { + my(@chars) = @_; + my($str, $c, $tr) = (""); + for ($c = 0; $c < @chars; $c++) { + $tr = $chars[$c]; + $str .= pchr($tr); + if ($c <= $#chars - 2 and $chars[$c + 1] == $tr + 1 and + $chars[$c + 2] == $tr + 2) + { + for (; $c <= $#chars-1 and $chars[$c + 1] == $chars[$c] + 1; $c++) + {} + $str .= "-"; + $str .= pchr($chars[$c]); + } + } + return $str; +} + +sub tr_decode_byte { + my($table, $flags) = @_; + my(@table) = unpack("s*", $table); + splice @table, 0x100, 1; # Number of subsequent elements + my($c, $tr, @from, @to, @delfrom, $delhyphen); + if ($table[ord "-"] != -1 and + $table[ord("-") - 1] == -1 || $table[ord("-") + 1] == -1) + { + $tr = $table[ord "-"]; + $table[ord "-"] = -1; + if ($tr >= 0) { + @from = ord("-"); + @to = $tr; + } else { # -2 ==> delete + $delhyphen = 1; + } + } + for ($c = 0; $c < @table; $c++) { + $tr = $table[$c]; + if ($tr >= 0) { + push @from, $c; push @to, $tr; + } elsif ($tr == -2) { + push @delfrom, $c; + } + } + @from = (@from, @delfrom); + if ($flags & OPpTRANS_COMPLEMENT) { + my @newfrom = (); + my %from; + @from{@from} = (1) x @from; + for ($c = 0; $c < 256; $c++) { + push @newfrom, $c unless $from{$c}; + } + @from = @newfrom; + } + unless ($flags & OPpTRANS_DELETE || !@to) { + pop @to while $#to and $to[$#to] == $to[$#to -1]; + } + my($from, $to); + $from = collapse(@from); + $to = collapse(@to); + $from .= "-" if $delhyphen; + return ($from, $to); +} + +sub tr_chr { + my $x = shift; + if ($x == ord "-") { + return "\\-"; + } elsif ($x == ord "\\") { + return "\\\\"; + } else { + return chr $x; + } +} + +# XXX This doesn't yet handle all cases correctly either + +sub tr_decode_utf8 { + my($swash_hv, $flags) = @_; + my %swash = $swash_hv->ARRAY; + my $final = undef; + $final = $swash{'FINAL'}->IV if exists $swash{'FINAL'}; + my $none = $swash{"NONE"}->IV; + my $extra = $none + 1; + my(@from, @delfrom, @to); + my $line; + foreach $line (split /\n/, $swash{'LIST'}->PV) { + my($min, $max, $result) = split(/\t/, $line); + $min = hex $min; + if (length $max) { + $max = hex $max; + } else { + $max = $min; + } + $result = hex $result; + if ($result == $extra) { + push @delfrom, [$min, $max]; + } else { + push @from, [$min, $max]; + push @to, [$result, $result + $max - $min]; + } + } + for my $i (0 .. $#from) { + if ($from[$i][0] == ord '-') { + unshift @from, splice(@from, $i, 1); + unshift @to, splice(@to, $i, 1); + last; + } elsif ($from[$i][1] == ord '-') { + $from[$i][1]--; + $to[$i][1]--; + unshift @from, ord '-'; + unshift @to, ord '-'; + last; + } + } + for my $i (0 .. $#delfrom) { + if ($delfrom[$i][0] == ord '-') { + push @delfrom, splice(@delfrom, $i, 1); + last; + } elsif ($delfrom[$i][1] == ord '-') { + $delfrom[$i][1]--; + push @delfrom, ord '-'; + last; + } + } + if (defined $final and $to[$#to][1] != $final) { + push @to, [$final, $final]; + } + push @from, @delfrom; + if ($flags & OPpTRANS_COMPLEMENT) { + my @newfrom; + my $next = 0; + for my $i (0 .. $#from) { + push @newfrom, [$next, $from[$i][0] - 1]; + $next = $from[$i][1] + 1; + } + @from = (); + for my $range (@newfrom) { + if ($range->[0] <= $range->[1]) { + push @from, $range; + } + } + } + my($from, $to, $diff); + for my $chunk (@from) { + $diff = $chunk->[1] - $chunk->[0]; + if ($diff > 1) { + $from .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]); + } elsif ($diff == 1) { + $from .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]); + } else { + $from .= tr_chr($chunk->[0]); + } + } + for my $chunk (@to) { + $diff = $chunk->[1] - $chunk->[0]; + if ($diff > 1) { + $to .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]); + } elsif ($diff == 1) { + $to .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]); + } else { + $to .= tr_chr($chunk->[0]); + } + } + #$final = sprintf("%04x", $final) if defined $final; + #$none = sprintf("%04x", $none) if defined $none; + #$extra = sprintf("%04x", $extra) if defined $extra; + #print STDERR "final: $final\n none: $none\nextra: $extra\n"; + #print STDERR $swash{'LIST'}->PV; + return (escape_str($from), escape_str($to)); +} + +sub pp_trans { + my $self = shift; + my($op, $cx) = @_; + my($from, $to); + if (class($op) eq "PVOP") { + ($from, $to) = tr_decode_byte($op->pv, $op->private); + } else { # class($op) eq "SVOP" + ($from, $to) = tr_decode_utf8($op->sv->RV, $op->private); + } + my $flags = ""; + $flags .= "c" if $op->private & OPpTRANS_COMPLEMENT; + $flags .= "d" if $op->private & OPpTRANS_DELETE; + $to = "" if $from eq $to and $flags eq ""; + $flags .= "s" if $op->private & OPpTRANS_SQUASH; + return "tr" . double_delim($from, $to) . $flags; +} + +# Like dq(), but different +sub re_dq { + my $self = shift; + my ($op, $extended) = @_; + + my $type = $op->name; + if ($type eq "const") { + return '$[' if $op->private & OPpCONST_ARYBASE; + my $unbacked = re_unback($self->const_sv($op)->as_string); + return re_uninterp_extended(escape_extended_re($unbacked)) + if $extended; + return re_uninterp(escape_str($unbacked)); + } elsif ($type eq "concat") { + my $first = $self->re_dq($op->first, $extended); + my $last = $self->re_dq($op->last, $extended); + + # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]" + ($last =~ /^[A-Z\\\^\[\]_?]/ && + $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc + || ($last =~ /^[{\[\w_]/ && + $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/); + + return $first . $last; + } elsif ($type eq "uc") { + return '\U' . $self->re_dq($op->first->sibling, $extended) . '\E'; + } elsif ($type eq "lc") { + return '\L' . $self->re_dq($op->first->sibling, $extended) . '\E'; + } elsif ($type eq "ucfirst") { + return '\u' . $self->re_dq($op->first->sibling, $extended); + } elsif ($type eq "lcfirst") { + return '\l' . $self->re_dq($op->first->sibling, $extended); + } elsif ($type eq "quotemeta") { + return '\Q' . $self->re_dq($op->first->sibling, $extended) . '\E'; + } elsif ($type eq "join") { + return $self->deparse($op->last, 26); # was join($", @ary) + } else { + return $self->deparse($op, 26); + } +} + +sub pure_string { + my ($self, $op) = @_; + return 0 if null $op; + my $type = $op->name; + + if ($type eq 'const') { + return 1; + } + elsif ($type =~ /^[ul]c(first)?$/ || $type eq 'quotemeta') { + return $self->pure_string($op->first->sibling); + } + elsif ($type eq 'join') { + my $join_op = $op->first->sibling; # Skip pushmark + return 0 unless $join_op->name eq 'null' && $join_op->targ eq OP_RV2SV; + + my $gvop = $join_op->first; + return 0 unless $gvop->name eq 'gvsv'; + return 0 unless '"' eq $self->gv_name($self->gv_or_padgv($gvop)); + + return 0 unless ${$join_op->sibling} eq ${$op->last}; + return 0 unless $op->last->name =~ /^(rv2|pad)av$/; + } + elsif ($type eq 'concat') { + return $self->pure_string($op->first) + && $self->pure_string($op->last); + } + elsif (is_scalar($op) || $type =~ /^[ah]elem$/) { + return 1; + } + elsif ($type eq "null" and $op->can('first') and not null $op->first and + $op->first->name eq "null" and $op->first->can('first') + and not null $op->first->first and + $op->first->first->name eq "aelemfast") { + return 1; + } + else { + return 0; + } + + return 1; +} + +sub regcomp { + my $self = shift; + my($op, $cx, $extended) = @_; + my $kid = $op->first; + $kid = $kid->first if $kid->name eq "regcmaybe"; + $kid = $kid->first if $kid->name eq "regcreset"; + if ($kid->name eq "null" and !null($kid->first) + and $kid->first->name eq 'pushmark') + { + my $str = ''; + $kid = $kid->first->sibling; + while (!null($kid)) { + $str .= $self->re_dq($kid, $extended); + $kid = $kid->sibling; + } + return $str, 1; + } + + return ($self->re_dq($kid, $extended), 1) if $self->pure_string($kid); + return ($self->deparse($kid, $cx), 0); +} + +sub pp_regcomp { + my ($self, $op, $cx) = @_; + return (($self->regcomp($op, $cx, 0))[0]); +} + +# osmic acid -- see osmium tetroxide + +my %matchwords; +map($matchwords{join "", sort split //, $_} = $_, 'cig', 'cog', 'cos', 'cogs', + 'cox', 'go', 'is', 'ism', 'iso', 'mig', 'mix', 'osmic', 'ox', 'sic', + 'sig', 'six', 'smog', 'so', 'soc', 'sog', 'xi'); + +sub matchop { + my $self = shift; + my($op, $cx, $name, $delim) = @_; + my $kid = $op->first; + my ($binop, $var, $re) = ("", "", ""); + if ($op->flags & OPf_STACKED) { + $binop = 1; + $var = $self->deparse($kid, 20); + $kid = $kid->sibling; + } + my $quote = 1; + my $extended = ($op->pmflags & PMf_EXTENDED); + if (null $kid) { + my $unbacked = re_unback($op->precomp); + if ($extended) { + $re = re_uninterp_extended(escape_extended_re($unbacked)); + } else { + $re = re_uninterp(escape_str(re_unback($op->precomp))); + } + } elsif ($kid->name ne 'regcomp') { + carp("found ".$kid->name." where regcomp expected"); + } else { + ($re, $quote) = $self->regcomp($kid, 21, $extended); + } + my $flags = ""; + $flags .= "c" if $op->pmflags & PMf_CONTINUE; + $flags .= "g" if $op->pmflags & PMf_GLOBAL; + $flags .= "i" if $op->pmflags & PMf_FOLD; + $flags .= "m" if $op->pmflags & PMf_MULTILINE; + $flags .= "o" if $op->pmflags & PMf_KEEP; + $flags .= "s" if $op->pmflags & PMf_SINGLELINE; + $flags .= "x" if $op->pmflags & PMf_EXTENDED; + $flags = $matchwords{$flags} if $matchwords{$flags}; + if ($op->pmflags & PMf_ONCE) { # only one kind of delimiter works here + $re =~ s/\?/\\?/g; + $re = "?$re?"; + } elsif ($quote) { + $re = single_delim($name, $delim, $re); + } + $re = $re . $flags if $quote; + if ($binop) { + return $self->maybe_parens("$var =~ $re", $cx, 20); + } else { + return $re; + } +} + +sub pp_match { matchop(@_, "m", "/") } +sub pp_pushre { matchop(@_, "m", "/") } +sub pp_qr { matchop(@_, "qr", "") } + +sub pp_split { + my $self = shift; + my($op, $cx) = @_; + my($kid, @exprs, $ary, $expr); + $kid = $op->first; + + # For our kid (an OP_PUSHRE), pmreplroot is never actually the + # root of a replacement; it's either empty, or abused to point to + # the GV for an array we split into (an optimization to save + # assignment overhead). Depending on whether we're using ithreads, + # this OP* holds either a GV* or a PADOFFSET. Luckily, B.xs + # figures out for us which it is. + my $replroot = $kid->pmreplroot; + my $gv = 0; + if (ref($replroot) eq "B::GV") { + $gv = $replroot; + } elsif (!ref($replroot) and $replroot > 0) { + $gv = $self->padval($replroot); + } + $ary = $self->stash_variable('@', $self->gv_name($gv)) if $gv; + + for (; !null($kid); $kid = $kid->sibling) { + push @exprs, $self->deparse($kid, 6); + } + + # handle special case of split(), and split(" ") that compiles to /\s+/ + $kid = $op->first; + if ($kid->flags & OPf_SPECIAL + && $exprs[0] eq '/\\s+/' + && $kid->pmflags & PMf_SKIPWHITE ) { + $exprs[0] = '" "'; + } + + $expr = "split(" . join(", ", @exprs) . ")"; + if ($ary) { + return $self->maybe_parens("$ary = $expr", $cx, 7); + } else { + return $expr; + } +} + +# oxime -- any of various compounds obtained chiefly by the action of +# hydroxylamine on aldehydes and ketones and characterized by the +# bivalent grouping C=NOH [Webster's Tenth] + +my %substwords; +map($substwords{join "", sort split //, $_} = $_, 'ego', 'egoism', 'em', + 'es', 'ex', 'exes', 'gee', 'go', 'goes', 'ie', 'ism', 'iso', 'me', + 'meese', 'meso', 'mig', 'mix', 'os', 'ox', 'oxime', 'see', 'seem', + 'seg', 'sex', 'sig', 'six', 'smog', 'sog', 'some', 'xi'); + +sub pp_subst { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first; + my($binop, $var, $re, $repl) = ("", "", "", ""); + if ($op->flags & OPf_STACKED) { + $binop = 1; + $var = $self->deparse($kid, 20); + $kid = $kid->sibling; + } + my $flags = ""; + if (null($op->pmreplroot)) { + $repl = $self->dq($kid); + $kid = $kid->sibling; + } else { + $repl = $op->pmreplroot->first; # skip substcont + while ($repl->name eq "entereval") { + $repl = $repl->first; + $flags .= "e"; + } + if ($op->pmflags & PMf_EVAL) { + $repl = $self->deparse($repl->first, 0); + } else { + $repl = $self->dq($repl); + } + } + my $extended = ($op->pmflags & PMf_EXTENDED); + if (null $kid) { + my $unbacked = re_unback($op->precomp); + if ($extended) { + $re = re_uninterp_extended(escape_extended_re($unbacked)); + } + else { + $re = re_uninterp(escape_str($unbacked)); + } + } else { + ($re) = $self->regcomp($kid, 1, $extended); + } + $flags .= "e" if $op->pmflags & PMf_EVAL; + $flags .= "g" if $op->pmflags & PMf_GLOBAL; + $flags .= "i" if $op->pmflags & PMf_FOLD; + $flags .= "m" if $op->pmflags & PMf_MULTILINE; + $flags .= "o" if $op->pmflags & PMf_KEEP; + $flags .= "s" if $op->pmflags & PMf_SINGLELINE; + $flags .= "x" if $extended; + $flags = $substwords{$flags} if $substwords{$flags}; + if ($binop) { + return $self->maybe_parens("$var =~ s" + . double_delim($re, $repl) . $flags, + $cx, 20); + } else { + return "s". double_delim($re, $repl) . $flags; + } +} + +1; +__END__ + +=head1 NAME + +B::Deparse - Perl compiler backend to produce perl code + +=head1 SYNOPSIS + +B<perl> B<-MO=Deparse>[B<,-d>][B<,-f>I<FILE>][B<,-p>][B<,-q>][B<,-l>] + [B<,-s>I<LETTERS>][B<,-x>I<LEVEL>] I<prog.pl> + +=head1 DESCRIPTION + +B::Deparse is a backend module for the Perl compiler that generates +perl source code, based on the internal compiled structure that perl +itself creates after parsing a program. The output of B::Deparse won't +be exactly the same as the original source, since perl doesn't keep +track of comments or whitespace, and there isn't a one-to-one +correspondence between perl's syntactical constructions and their +compiled form, but it will often be close. When you use the B<-p> +option, the output also includes parentheses even when they are not +required by precedence, which can make it easy to see if perl is +parsing your expressions the way you intended. + +While B::Deparse goes to some lengths to try to figure out what your +original program was doing, some parts of the language can still trip +it up; it still fails even on some parts of Perl's own test suite. If +you encounter a failure other than the most common ones described in +the BUGS section below, you can help contribute to B::Deparse's +ongoing development by submitting a bug report with a small +example. + +=head1 OPTIONS + +As with all compiler backend options, these must follow directly after +the '-MO=Deparse', separated by a comma but not any white space. + +=over 4 + +=item B<-d> + +Output data values (when they appear as constants) using Data::Dumper. +Without this option, B::Deparse will use some simple routines of its +own for the same purpose. Currently, Data::Dumper is better for some +kinds of data (such as complex structures with sharing and +self-reference) while the built-in routines are better for others +(such as odd floating-point values). + +=item B<-f>I<FILE> + +Normally, B::Deparse deparses the main code of a program, and all the subs +defined in the same file. To include subs defined in other files, pass the +B<-f> option with the filename. You can pass the B<-f> option several times, to +include more than one secondary file. (Most of the time you don't want to +use it at all.) You can also use this option to include subs which are +defined in the scope of a B<#line> directive with two parameters. + +=item B<-l> + +Add '#line' declarations to the output based on the line and file +locations of the original code. + +=item B<-p> + +Print extra parentheses. Without this option, B::Deparse includes +parentheses in its output only when they are needed, based on the +structure of your program. With B<-p>, it uses parentheses (almost) +whenever they would be legal. This can be useful if you are used to +LISP, or if you want to see how perl parses your input. If you say + + if ($var & 0x7f == 65) {print "Gimme an A!"} + print ($which ? $a : $b), "\n"; + $name = $ENV{USER} or "Bob"; + +C<B::Deparse,-p> will print + + if (($var & 0)) { + print('Gimme an A!') + }; + (print(($which ? $a : $b)), '???'); + (($name = $ENV{'USER'}) or '???') + +which probably isn't what you intended (the C<'???'> is a sign that +perl optimized away a constant value). + +=item B<-P> + +Disable prototype checking. With this option, all function calls are +deparsed as if no prototype was defined for them. In other words, + + perl -MO=Deparse,-P -e 'sub foo (\@) { 1 } foo @x' + +will print + + sub foo (\@) { + 1; + } + &foo(\@x); + +making clear how the parameters are actually passed to C<foo>. + +=item B<-q> + +Expand double-quoted strings into the corresponding combinations of +concatenation, uc, ucfirst, lc, lcfirst, quotemeta, and join. For +instance, print + + print "Hello, $world, @ladies, \u$gentlemen\E, \u\L$me!"; + +as + + print 'Hello, ' . $world . ', ' . join($", @ladies) . ', ' + . ucfirst($gentlemen) . ', ' . ucfirst(lc $me . '!'); + +Note that the expanded form represents the way perl handles such +constructions internally -- this option actually turns off the reverse +translation that B::Deparse usually does. On the other hand, note that +C<$x = "$y"> is not the same as C<$x = $y>: the former makes the value +of $y into a string before doing the assignment. + +=item B<-s>I<LETTERS> + +Tweak the style of B::Deparse's output. The letters should follow +directly after the 's', with no space or punctuation. The following +options are available: + +=over 4 + +=item B<C> + +Cuddle C<elsif>, C<else>, and C<continue> blocks. For example, print + + if (...) { + ... + } else { + ... + } + +instead of + + if (...) { + ... + } + else { + ... + } + +The default is not to cuddle. + +=item B<i>I<NUMBER> + +Indent lines by multiples of I<NUMBER> columns. The default is 4 columns. + +=item B<T> + +Use tabs for each 8 columns of indent. The default is to use only spaces. +For instance, if the style options are B<-si4T>, a line that's indented +3 times will be preceded by one tab and four spaces; if the options were +B<-si8T>, the same line would be preceded by three tabs. + +=item B<v>I<STRING>B<.> + +Print I<STRING> for the value of a constant that can't be determined +because it was optimized away (mnemonic: this happens when a constant +is used in B<v>oid context). The end of the string is marked by a period. +The string should be a valid perl expression, generally a constant. +Note that unless it's a number, it probably needs to be quoted, and on +a command line quotes need to be protected from the shell. Some +conventional values include 0, 1, 42, '', 'foo', and +'Useless use of constant omitted' (which may need to be +B<-sv"'Useless use of constant omitted'."> +or something similar depending on your shell). The default is '???'. +If you're using B::Deparse on a module or other file that's require'd, +you shouldn't use a value that evaluates to false, since the customary +true constant at the end of a module will be in void context when the +file is compiled as a main program. + +=back + +=item B<-x>I<LEVEL> + +Expand conventional syntax constructions into equivalent ones that expose +their internal operation. I<LEVEL> should be a digit, with higher values +meaning more expansion. As with B<-q>, this actually involves turning off +special cases in B::Deparse's normal operations. + +If I<LEVEL> is at least 3, C<for> loops will be translated into equivalent +while loops with continue blocks; for instance + + for ($i = 0; $i < 10; ++$i) { + print $i; + } + +turns into + + $i = 0; + while ($i < 10) { + print $i; + } continue { + ++$i + } + +Note that in a few cases this translation can't be perfectly carried back +into the source code -- if the loop's initializer declares a my variable, +for instance, it won't have the correct scope outside of the loop. + +If I<LEVEL> is at least 5, C<use> declarations will be translated into +C<BEGIN> blocks containing calls to C<require> and C<import>; for +instance, + + use strict 'refs'; + +turns into + + sub BEGIN { + require strict; + do { + 'strict'->import('refs') + }; + } + +If I<LEVEL> is at least 7, C<if> statements will be translated into +equivalent expressions using C<&&>, C<?:> and C<do {}>; for instance + + print 'hi' if $nice; + if ($nice) { + print 'hi'; + } + if ($nice) { + print 'hi'; + } else { + print 'bye'; + } + +turns into + + $nice and print 'hi'; + $nice and do { print 'hi' }; + $nice ? do { print 'hi' } : do { print 'bye' }; + +Long sequences of elsifs will turn into nested ternary operators, which +B::Deparse doesn't know how to indent nicely. + +=back + +=head1 USING B::Deparse AS A MODULE + +=head2 Synopsis + + use B::Deparse; + $deparse = B::Deparse->new("-p", "-sC"); + $body = $deparse->coderef2text(\&func); + eval "sub func $body"; # the inverse operation + +=head2 Description + +B::Deparse can also be used on a sub-by-sub basis from other perl +programs. + +=head2 new + + $deparse = B::Deparse->new(OPTIONS) + +Create an object to store the state of a deparsing operation and any +options. The options are the same as those that can be given on the +command line (see L</OPTIONS>); options that are separated by commas +after B<-MO=Deparse> should be given as separate strings. Some +options, like B<-u>, don't make sense for a single subroutine, so +don't pass them. + +=head2 ambient_pragmas + + $deparse->ambient_pragmas(strict => 'all', '$[' => $[); + +The compilation of a subroutine can be affected by a few compiler +directives, B<pragmas>. These are: + +=over 4 + +=item * + +use strict; + +=item * + +use warnings; + +=item * + +Assigning to the special variable $[ + +=item * + +use integer; + +=item * + +use bytes; + +=item * + +use utf8; + +=item * + +use re; + +=back + +Ordinarily, if you use B::Deparse on a subroutine which has +been compiled in the presence of one or more of these pragmas, +the output will include statements to turn on the appropriate +directives. So if you then compile the code returned by coderef2text, +it will behave the same way as the subroutine which you deparsed. + +However, you may know that you intend to use the results in a +particular context, where some pragmas are already in scope. In +this case, you use the B<ambient_pragmas> method to describe the +assumptions you wish to make. + +Not all of the options currently have any useful effect. See +L</BUGS> for more details. + +The parameters it accepts are: + +=over 4 + +=item strict + +Takes a string, possibly containing several values separated +by whitespace. The special values "all" and "none" mean what you'd +expect. + + $deparse->ambient_pragmas(strict => 'subs refs'); + +=item $[ + +Takes a number, the value of the array base $[. + +=item bytes + +=item utf8 + +=item integer + +If the value is true, then the appropriate pragma is assumed to +be in the ambient scope, otherwise not. + +=item re + +Takes a string, possibly containing a whitespace-separated list of +values. The values "all" and "none" are special. It's also permissible +to pass an array reference here. + + $deparser->ambient_pragmas(re => 'eval'); + + +=item warnings + +Takes a string, possibly containing a whitespace-separated list of +values. The values "all" and "none" are special, again. It's also +permissible to pass an array reference here. + + $deparser->ambient_pragmas(warnings => [qw[void io]]); + +If one of the values is the string "FATAL", then all the warnings +in that list will be considered fatal, just as with the B<warnings> +pragma itself. Should you need to specify that some warnings are +fatal, and others are merely enabled, you can pass the B<warnings> +parameter twice: + + $deparser->ambient_pragmas( + warnings => 'all', + warnings => [FATAL => qw/void io/], + ); + +See L<perllexwarn> for more information about lexical warnings. + +=item hint_bits + +=item warning_bits + +These two parameters are used to specify the ambient pragmas in +the format used by the special variables $^H and ${^WARNING_BITS}. + +They exist principally so that you can write code like: + + { my ($hint_bits, $warning_bits); + BEGIN {($hint_bits, $warning_bits) = ($^H, ${^WARNING_BITS})} + $deparser->ambient_pragmas ( + hint_bits => $hint_bits, + warning_bits => $warning_bits, + '$[' => 0 + $[ + ); } + +which specifies that the ambient pragmas are exactly those which +are in scope at the point of calling. + +=back + +=head2 coderef2text + + $body = $deparse->coderef2text(\&func) + $body = $deparse->coderef2text(sub ($$) { ... }) + +Return source code for the body of a subroutine (a block, optionally +preceded by a prototype in parens), given a reference to the +sub. Because a subroutine can have no names, or more than one name, +this method doesn't return a complete subroutine definition -- if you +want to eval the result, you should prepend "sub subname ", or "sub " +for an anonymous function constructor. Unless the sub was defined in +the main:: package, the code will include a package declaration. + +=head1 BUGS + +=over 4 + +=item * + +The only pragmas to be completely supported are: C<use warnings>, +C<use strict 'refs'>, C<use bytes>, and C<use integer>. (C<$[>, which +behaves like a pragma, is also supported.) + +Excepting those listed above, we're currently unable to guarantee that +B::Deparse will produce a pragma at the correct point in the program. +(Specifically, pragmas at the beginning of a block often appear right +before the start of the block instead.) +Since the effects of pragmas are often lexically scoped, this can mean +that the pragma holds sway over a different portion of the program +than in the input file. + +=item * + +In fact, the above is a specific instance of a more general problem: +we can't guarantee to produce BEGIN blocks or C<use> declarations in +exactly the right place. So if you use a module which affects compilation +(such as by over-riding keywords, overloading constants or whatever) +then the output code might not work as intended. + +This is the most serious outstanding problem, and will require some help +from the Perl core to fix. + +=item * + +If a keyword is over-ridden, and your program explicitly calls +the built-in version by using CORE::keyword, the output of B::Deparse +will not reflect this. If you run the resulting code, it will call +the over-ridden version rather than the built-in one. (Maybe there +should be an option to B<always> print keyword calls as C<CORE::name>.) + +=item * + +Some constants don't print correctly either with or without B<-d>. +For instance, neither B::Deparse nor Data::Dumper know how to print +dual-valued scalars correctly, as in: + + use constant E2BIG => ($!=7); $y = E2BIG; print $y, 0+$y; + +=item * + +An input file that uses source filtering probably won't be deparsed into +runnable code, because it will still include the B<use> declaration +for the source filtering module, even though the code that is +produced is already ordinary Perl which shouldn't be filtered again. + +=item * + +Optimised away statements are rendered as '???'. This includes statements that +have a compile-time side-effect, such as the obscure + + my $x if 0; + +which is not, consequently, deparsed correctly. + +=item * + +There are probably many more bugs on non-ASCII platforms (EBCDIC). + +=back + +=head1 AUTHOR + +Stephen McCamant <smcc@CSUA.Berkeley.EDU>, based on an earlier version +by Malcolm Beattie <mbeattie@sable.ox.ac.uk>, with contributions from +Gisle Aas, James Duncan, Albert Dvornik, Robin Houston, Dave Mitchell, +Hugo van der Sanden, Gurusamy Sarathy, Nick Ing-Simmons, and Rafael +Garcia-Suarez. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/B/Disassembler.pm b/Master/tlpkg/tlperl.old/lib/B/Disassembler.pm new file mode 100644 index 00000000000..e1993aa9537 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/Disassembler.pm @@ -0,0 +1,233 @@ +# Disassembler.pm +# +# Copyright (c) 1996 Malcolm Beattie +# +# You may distribute under the terms of either the GNU General Public +# License or the Artistic License, as specified in the README file. + +$B::Disassembler::VERSION = '1.05'; + +package B::Disassembler::BytecodeStream; + +use FileHandle; +use Carp; +use Config qw(%Config); +use B qw(cstring cast_I32); +@ISA = qw(FileHandle); +sub readn { + my ($fh, $len) = @_; + my $data; + read($fh, $data, $len); + croak "reached EOF while reading $len bytes" unless length($data) == $len; + return $data; +} + +sub GET_U8 { + my $fh = shift; + my $c = $fh->getc; + croak "reached EOF while reading U8" unless defined($c); + return ord($c); +} + +sub GET_U16 { + my $fh = shift; + my $str = $fh->readn(2); + croak "reached EOF while reading U16" unless length($str) == 2; + return unpack("S", $str); +} + +sub GET_NV { + my $fh = shift; + my ($str, $c); + while (defined($c = $fh->getc) && $c ne "\0") { + $str .= $c; + } + croak "reached EOF while reading double" unless defined($c); + return $str; +} + +sub GET_U32 { + my $fh = shift; + my $str = $fh->readn(4); + croak "reached EOF while reading U32" unless length($str) == 4; + return unpack("L", $str); +} + +sub GET_I32 { + my $fh = shift; + my $str = $fh->readn(4); + croak "reached EOF while reading I32" unless length($str) == 4; + return unpack("l", $str); +} + +sub GET_objindex { + my $fh = shift; + my $str = $fh->readn(4); + croak "reached EOF while reading objindex" unless length($str) == 4; + return unpack("L", $str); +} + +sub GET_opindex { + my $fh = shift; + my $str = $fh->readn(4); + croak "reached EOF while reading opindex" unless length($str) == 4; + return unpack("L", $str); +} + +sub GET_svindex { + my $fh = shift; + my $str = $fh->readn(4); + croak "reached EOF while reading svindex" unless length($str) == 4; + return unpack("L", $str); +} + +sub GET_pvindex { + my $fh = shift; + my $str = $fh->readn(4); + croak "reached EOF while reading pvindex" unless length($str) == 4; + return unpack("L", $str); +} + +sub GET_strconst { + my $fh = shift; + my ($str, $c); + $str = ''; + while (defined($c = $fh->getc) && $c ne "\0") { + $str .= $c; + } + croak "reached EOF while reading strconst" unless defined($c); + return cstring($str); +} + +sub GET_pvcontents {} + +sub GET_PV { + my $fh = shift; + my $str; + my $len = $fh->GET_U32; + if ($len) { + read($fh, $str, $len); + croak "reached EOF while reading PV" unless length($str) == $len; + return cstring($str); + } else { + return '""'; + } +} + +sub GET_comment_t { + my $fh = shift; + my ($str, $c); + while (defined($c = $fh->getc) && $c ne "\n") { + $str .= $c; + } + croak "reached EOF while reading comment" unless defined($c); + return cstring($str); +} + +sub GET_double { + my $fh = shift; + my ($str, $c); + while (defined($c = $fh->getc) && $c ne "\0") { + $str .= $c; + } + croak "reached EOF while reading double" unless defined($c); + return $str; +} + +sub GET_none {} + +sub GET_op_tr_array { + my $fh = shift; + my $len = unpack "S", $fh->readn(2); + my @ary = unpack "S*", $fh->readn($len*2); + return join(",", $len, @ary); +} + +sub GET_IV64 { + my $fh = shift; + my $str = $fh->readn(8); + croak "reached EOF while reading I32" unless length($str) == 8; + return sprintf "0x%09llx", unpack("q", $str); +} + +sub GET_IV { + $Config{ivsize} == 4 ? &GET_I32 : &GET_IV64; +} + +sub GET_PADOFFSET { + $Config{ptrsize} == 8 ? &GET_IV64 : &GET_U32; +} + +sub GET_long { + $Config{longsize} == 8 ? &GET_IV64 : &GET_U32; +} + + +package B::Disassembler; +use Exporter; +@ISA = qw(Exporter); +@EXPORT_OK = qw(disassemble_fh get_header); +use Carp; +use strict; + +use B::Asmdata qw(%insn_data @insn_name); + +our( $magic, $archname, $blversion, $ivsize, $ptrsize ); + +sub dis_header($){ + my( $fh ) = @_; + $magic = $fh->GET_U32(); + warn( "bad magic" ) if $magic != 0x43424c50; + $archname = $fh->GET_strconst(); + $blversion = $fh->GET_strconst(); + $ivsize = $fh->GET_U32(); + $ptrsize = $fh->GET_U32(); +} + +sub get_header(){ + return( $magic, $archname, $blversion, $ivsize, $ptrsize); +} + +sub disassemble_fh { + my ($fh, $out) = @_; + my ($c, $getmeth, $insn, $arg); + bless $fh, "B::Disassembler::BytecodeStream"; + dis_header( $fh ); + while (defined($c = $fh->getc)) { + $c = ord($c); + $insn = $insn_name[$c]; + if (!defined($insn) || $insn eq "unused") { + my $pos = $fh->tell - 1; + die "Illegal instruction code $c at stream offset $pos\n"; + } + $getmeth = $insn_data{$insn}->[2]; + $arg = $fh->$getmeth(); + if (defined($arg)) { + &$out($insn, $arg); + } else { + &$out($insn); + } + } +} + +1; + +__END__ + +=head1 NAME + +B::Disassembler - Disassemble Perl bytecode + +=head1 SYNOPSIS + + use Disassembler; + +=head1 DESCRIPTION + +See F<ext/B/B/Disassembler.pm>. + +=head1 AUTHOR + +Malcolm Beattie, C<mbeattie@sable.ox.ac.uk> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/B/Lint.pm b/Master/tlpkg/tlperl.old/lib/B/Lint.pm new file mode 100644 index 00000000000..3475bd2596e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/Lint.pm @@ -0,0 +1,392 @@ +package B::Lint; + +our $VERSION = '1.03'; + +=head1 NAME + +B::Lint - Perl lint + +=head1 SYNOPSIS + +perl -MO=Lint[,OPTIONS] foo.pl + +=head1 DESCRIPTION + +The B::Lint module is equivalent to an extended version of the B<-w> +option of B<perl>. It is named after the program F<lint> which carries +out a similar process for C programs. + +=head1 OPTIONS AND LINT CHECKS + +Option words are separated by commas (not whitespace) and follow the +usual conventions of compiler backend options. Following any options +(indicated by a leading B<->) come lint check arguments. Each such +argument (apart from the special B<all> and B<none> options) is a +word representing one possible lint check (turning on that check) or +is B<no-foo> (turning off that check). Before processing the check +arguments, a standard list of checks is turned on. Later options +override earlier ones. Available options are: + +=over 8 + +=item B<context> + +Produces a warning whenever an array is used in an implicit scalar +context. For example, both of the lines + + $foo = length(@bar); + $foo = @bar; + +will elicit a warning. Using an explicit B<scalar()> silences the +warning. For example, + + $foo = scalar(@bar); + +=item B<implicit-read> and B<implicit-write> + +These options produce a warning whenever an operation implicitly +reads or (respectively) writes to one of Perl's special variables. +For example, B<implicit-read> will warn about these: + + /foo/; + +and B<implicit-write> will warn about these: + + s/foo/bar/; + +Both B<implicit-read> and B<implicit-write> warn about this: + + for (@a) { ... } + +=item B<bare-subs> + +This option warns whenever a bareword is implicitly quoted, but is also +the name of a subroutine in the current package. Typical mistakes that it will +trap are: + + use constant foo => 'bar'; + @a = ( foo => 1 ); + $b{foo} = 2; + +Neither of these will do what a naive user would expect. + +=item B<dollar-underscore> + +This option warns whenever C<$_> is used either explicitly anywhere or +as the implicit argument of a B<print> statement. + +=item B<private-names> + +This option warns on each use of any variable, subroutine or +method name that lives in a non-current package but begins with +an underscore ("_"). Warnings aren't issued for the special case +of the single character name "_" by itself (e.g. C<$_> and C<@_>). + +=item B<undefined-subs> + +This option warns whenever an undefined subroutine is invoked. +This option will only catch explicitly invoked subroutines such +as C<foo()> and not indirect invocations such as C<&$subref()> +or C<$obj-E<gt>meth()>. Note that some programs or modules delay +definition of subs until runtime by means of the AUTOLOAD +mechanism. + +=item B<regexp-variables> + +This option warns whenever one of the regexp variables C<$`>, C<$&> or C<$'> +is used. Any occurrence of any of these variables in your +program can slow your whole program down. See L<perlre> for +details. + +=item B<all> + +Turn all warnings on. + +=item B<none> + +Turn all warnings off. + +=back + +=head1 NON LINT-CHECK OPTIONS + +=over 8 + +=item B<-u Package> + +Normally, Lint only checks the main code of the program together +with all subs defined in package main. The B<-u> option lets you +include other package names whose subs are then checked by Lint. + +=back + +=head1 BUGS + +This is only a very preliminary version. + +This module doesn't work correctly on thread-enabled perls. + +=head1 AUTHOR + +Malcolm Beattie, mbeattie@sable.ox.ac.uk. + +=cut + +use strict; +use B qw(walkoptree_slow main_root walksymtable svref_2object parents + OPf_WANT_LIST OPf_WANT OPf_STACKED G_ARRAY SVf_POK + ); + +my $file = "unknown"; # shadows current filename +my $line = 0; # shadows current line number +my $curstash = "main"; # shadows current stash + +# Lint checks +my %check; +my %implies_ok_context; +BEGIN { + map($implies_ok_context{$_}++, + qw(scalar av2arylen aelem aslice helem hslice + keys values hslice defined undef delete)); +} + +# Lint checks turned on by default +my @default_checks = qw(context); + +my %valid_check; +# All valid checks +BEGIN { + map($valid_check{$_}++, + qw(context implicit_read implicit_write dollar_underscore + private_names bare_subs undefined_subs regexp_variables)); +} + +# Debugging options +my ($debug_op); + +my %done_cv; # used to mark which subs have already been linted +my @extra_packages; # Lint checks mainline code and all subs which are + # in main:: or in one of these packages. + +sub warning { + my $format = (@_ < 2) ? "%s" : shift; + warn sprintf("$format at %s line %d\n", @_, $file, $line); +} + +# This gimme can't cope with context that's only determined +# at runtime via dowantarray(). +sub gimme { + my $op = shift; + my $flags = $op->flags; + if ($flags & OPf_WANT) { + return(($flags & OPf_WANT) == OPf_WANT_LIST ? 1 : 0); + } + return undef; +} + +sub B::OP::lint {} + +sub B::COP::lint { + my $op = shift; + if ($op->name eq "nextstate") { + $file = $op->file; + $line = $op->line; + $curstash = $op->stash->NAME; + } +} + +sub B::UNOP::lint { + my $op = shift; + my $opname = $op->name; + if ($check{context} && ($opname eq "rv2av" || $opname eq "rv2hv")) { + my $parent = parents->[0]; + my $pname = $parent->name; + return if gimme($op) || $implies_ok_context{$pname}; + # Two special cases to deal with: "foreach (@foo)" and "delete $a{$b}" + # null out the parent so we have to check for a parent of pp_null and + # a grandparent of pp_enteriter or pp_delete + if ($pname eq "null") { + my $gpname = parents->[1]->name; + return if $gpname eq "enteriter" || $gpname eq "delete"; + } + warning("Implicit scalar context for %s in %s", + $opname eq "rv2av" ? "array" : "hash", $parent->desc); + } + if ($check{private_names} && $opname eq "method") { + my $methop = $op->first; + if ($methop->name eq "const") { + my $method = $methop->sv->PV; + if ($method =~ /^_/ && !defined(&{"$curstash\::$method"})) { + warning("Illegal reference to private method name $method"); + } + } + } +} + +sub B::PMOP::lint { + my $op = shift; + if ($check{implicit_read}) { + if ($op->name eq "match" && !($op->flags & OPf_STACKED)) { + warning('Implicit match on $_'); + } + } + if ($check{implicit_write}) { + if ($op->name eq "subst" && !($op->flags & OPf_STACKED)) { + warning('Implicit substitution on $_'); + } + } +} + +sub B::LOOP::lint { + my $op = shift; + if ($check{implicit_read} || $check{implicit_write}) { + if ($op->name eq "enteriter") { + my $last = $op->last; + if ($last->name eq "gv" && $last->gv->NAME eq "_") { + warning('Implicit use of $_ in foreach'); + } + } + } +} + +sub B::SVOP::lint { + my $op = shift; + if ( $check{bare_subs} && $op->name eq 'const' + && $op->private & 64 ) # OPpCONST_BARE = 64 in op.h + { + my $sv = $op->sv; + if( $sv->FLAGS & SVf_POK && exists &{$curstash.'::'.$sv->PV} ) { + warning "Bare sub name '" . $sv->PV . "' interpreted as string"; + } + } + if ($check{dollar_underscore} && $op->name eq "gvsv" + && $op->gv->NAME eq "_") + { + warning('Use of $_'); + } + if ($check{private_names}) { + my $opname = $op->name; + if ($opname eq "gv" || $opname eq "gvsv") { + my $gv = $op->gv; + if ($gv->NAME =~ /^_./ && $gv->STASH->NAME ne $curstash) { + warning('Illegal reference to private name %s', $gv->NAME); + } + } elsif ($opname eq "method_named") { + my $method = $op->gv->PV; + if ($method =~ /^_./) { + warning("Illegal reference to private method name $method"); + } + } + } + if ($check{undefined_subs}) { + if ($op->name eq "gv" + && $op->next->name eq "entersub") + { + my $gv = $op->gv; + my $subname = $gv->STASH->NAME . "::" . $gv->NAME; + no strict 'refs'; + if (!defined(&$subname)) { + $subname =~ s/^main:://; + warning('Undefined subroutine %s called', $subname); + } + } + } + if ($check{regexp_variables} && $op->name eq "gvsv") { + my $name = $op->gv->NAME; + if ($name =~ /^[&'`]$/) { + warning('Use of regexp variable $%s', $name); + } + } +} + +sub B::GV::lintcv { + my $gv = shift; + my $cv = $gv->CV; + #warn sprintf("lintcv: %s::%s (done=%d)\n", + # $gv->STASH->NAME, $gv->NAME, $done_cv{$$cv});#debug + return if !$$cv || $done_cv{$$cv}++; + my $root = $cv->ROOT; + #warn " root = $root (0x$$root)\n";#debug + walkoptree_slow($root, "lint") if $$root; +} + +sub do_lint { + my %search_pack; + walkoptree_slow(main_root, "lint") if ${main_root()}; + + # Now do subs in main + no strict qw(vars refs); + local(*glob); + for my $sym (keys %main::) { + next if $sym =~ /::$/; + *glob = $main::{$sym}; + svref_2object(\*glob)->EGV->lintcv; + } + + # Now do subs in non-main packages given by -u options + map { $search_pack{$_} = 1 } @extra_packages; + walksymtable(\%{"main::"}, "lintcv", sub { + my $package = shift; + $package =~ s/::$//; + #warn "Considering $package\n";#debug + return exists $search_pack{$package}; + }); +} + +sub compile { + my @options = @_; + my ($option, $opt, $arg); + # Turn on default lint checks + for $opt (@default_checks) { + $check{$opt} = 1; + } + OPTION: + while ($option = shift @options) { + if ($option =~ /^-(.)(.*)/) { + $opt = $1; + $arg = $2; + } else { + unshift @options, $option; + last OPTION; + } + if ($opt eq "-" && $arg eq "-") { + shift @options; + last OPTION; + } elsif ($opt eq "D") { + $arg ||= shift @options; + foreach $arg (split(//, $arg)) { + if ($arg eq "o") { + B->debug(1); + } elsif ($arg eq "O") { + $debug_op = 1; + } + } + } elsif ($opt eq "u") { + $arg ||= shift @options; + push(@extra_packages, $arg); + } + } + foreach $opt (@default_checks, @options) { + $opt =~ tr/-/_/; + if ($opt eq "all") { + %check = %valid_check; + } + elsif ($opt eq "none") { + %check = (); + } + else { + if ($opt =~ s/^no_//) { + $check{$opt} = 0; + } + else { + $check{$opt} = 1; + } + warn "No such check: $opt\n" unless defined $valid_check{$opt}; + } + } + # Remaining arguments are things to check + + return \&do_lint; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/B/Showlex.pm b/Master/tlpkg/tlperl.old/lib/B/Showlex.pm new file mode 100644 index 00000000000..3b261a337df --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/Showlex.pm @@ -0,0 +1,205 @@ +package B::Showlex; + +our $VERSION = '1.02'; + +use strict; +use B qw(svref_2object comppadlist class); +use B::Terse (); +use B::Concise (); + +# +# Invoke as +# perl -MO=Showlex,foo bar.pl +# to see the names of lexical variables used by &foo +# or as +# perl -MO=Showlex bar.pl +# to see the names of file scope lexicals used by bar.pl +# + + +# borrowed from B::Concise +our $walkHandle = \*STDOUT; + +sub walk_output { # updates $walkHandle + $walkHandle = B::Concise::walk_output(@_); + #print "got $walkHandle"; + #print $walkHandle "using it"; + $walkHandle; +} + +sub shownamearray { + my ($name, $av) = @_; + my @els = $av->ARRAY; + my $count = @els; + my $i; + print $walkHandle "$name has $count entries\n"; + for ($i = 0; $i < $count; $i++) { + my $sv = $els[$i]; + if (class($sv) ne "SPECIAL") { + printf $walkHandle "$i: %s (0x%lx) %s\n", class($sv), $$sv, $sv->PVX; + } else { + printf $walkHandle "$i: %s\n", $sv->terse; + #printf $walkHandle "$i: %s\n", B::Concise::concise_sv($sv); + } + } +} + +sub showvaluearray { + my ($name, $av) = @_; + my @els = $av->ARRAY; + my $count = @els; + my $i; + print $walkHandle "$name has $count entries\n"; + for ($i = 0; $i < $count; $i++) { + printf $walkHandle "$i: %s\n", $els[$i]->terse; + #print $walkHandle "$i: %s\n", B::Concise::concise_sv($els[$i]); + } +} + +sub showlex { + my ($objname, $namesav, $valsav) = @_; + shownamearray("Pad of lexical names for $objname", $namesav); + showvaluearray("Pad of lexical values for $objname", $valsav); +} + +my ($newlex, $nosp1); # rendering state vars + +sub newlex { # drop-in for showlex + my ($objname, $names, $vals) = @_; + my @names = $names->ARRAY; + my @vals = $vals->ARRAY; + my $count = @names; + print $walkHandle "$objname Pad has $count entries\n"; + printf $walkHandle "0: %s\n", $names[0]->terse unless $nosp1; + for (my $i = 1; $i < $count; $i++) { + printf $walkHandle "$i: %s = %s\n", $names[$i]->terse, $vals[$i]->terse + unless $nosp1 and $names[$i]->terse =~ /SPECIAL/; + } +} + +sub showlex_obj { + my ($objname, $obj) = @_; + $objname =~ s/^&main::/&/; + showlex($objname, svref_2object($obj)->PADLIST->ARRAY) if !$newlex; + newlex ($objname, svref_2object($obj)->PADLIST->ARRAY) if $newlex; +} + +sub showlex_main { + showlex("comppadlist", comppadlist->ARRAY) if !$newlex; + newlex ("main", comppadlist->ARRAY) if $newlex; +} + +sub compile { + my @options = grep(/^-/, @_); + my @args = grep(!/^-/, @_); + for my $o (@options) { + $newlex = 1 if $o eq "-newlex"; + $nosp1 = 1 if $o eq "-nosp"; + } + + return \&showlex_main unless @args; + return sub { + my $objref; + foreach my $objname (@args) { + next unless $objname; # skip nulls w/o carping + + if (ref $objname) { + print $walkHandle "B::Showlex::compile($objname)\n"; + $objref = $objname; + } else { + $objname = "main::$objname" unless $objname =~ /::/; + print $walkHandle "$objname:\n"; + no strict 'refs'; + die "err: unknown function ($objname)\n" + unless *{$objname}{CODE}; + $objref = \&$objname; + } + showlex_obj($objname, $objref); + } + } +} + +1; + +__END__ + +=head1 NAME + +B::Showlex - Show lexical variables used in functions or files + +=head1 SYNOPSIS + + perl -MO=Showlex[,-OPTIONS][,SUBROUTINE] foo.pl + +=head1 DESCRIPTION + +When a comma-separated list of subroutine names is given as options, Showlex +prints the lexical variables used in those subroutines. Otherwise, it prints +the file-scope lexicals in the file. + +=head1 EXAMPLES + +Traditional form: + + $ perl -MO=Showlex -e 'my ($i,$j,$k)=(1,"foo")' + Pad of lexical names for comppadlist has 4 entries + 0: SPECIAL #1 &PL_sv_undef + 1: PVNV (0x9db0fb0) $i + 2: PVNV (0x9db0f38) $j + 3: PVNV (0x9db0f50) $k + Pad of lexical values for comppadlist has 5 entries + 0: SPECIAL #1 &PL_sv_undef + 1: NULL (0x9da4234) + 2: NULL (0x9db0f2c) + 3: NULL (0x9db0f44) + 4: NULL (0x9da4264) + -e syntax OK + +New-style form: + + $ perl -MO=Showlex,-newlex -e 'my ($i,$j,$k)=(1,"foo")' + main Pad has 4 entries + 0: SPECIAL #1 &PL_sv_undef + 1: PVNV (0xa0c4fb8) "$i" = NULL (0xa0b8234) + 2: PVNV (0xa0c4f40) "$j" = NULL (0xa0c4f34) + 3: PVNV (0xa0c4f58) "$k" = NULL (0xa0c4f4c) + -e syntax OK + +New form, no specials, outside O framework: + + $ perl -MB::Showlex -e \ + 'my ($i,$j,$k)=(1,"foo"); B::Showlex::compile(-newlex,-nosp)->()' + main Pad has 4 entries + 1: PVNV (0x998ffb0) "$i" = IV (0x9983234) 1 + 2: PVNV (0x998ff68) "$j" = PV (0x998ff5c) "foo" + 3: PVNV (0x998ff80) "$k" = NULL (0x998ff74) + +Note that this example shows the values of the lexicals, whereas the other +examples did not (as they're compile-time only). + +=head2 OPTIONS + +The C<-newlex> option produces a more readable C<< name => value >> format, +and is shown in the second example above. + +The C<-nosp> option eliminates reporting of SPECIALs, such as C<0: SPECIAL +#1 &PL_sv_undef> above. Reporting of SPECIALs can sometimes overwhelm +your declared lexicals. + +=head1 SEE ALSO + +C<B::Showlex> can also be used outside of the O framework, as in the third +example. See C<B::Concise> for a fuller explanation of reasons. + +=head1 TODO + +Some of the reported info, such as hex addresses, is not particularly +valuable. Other information would be more useful for the typical +programmer, such as line-numbers, pad-slot reuses, etc.. Given this, +-newlex isnt a particularly good flag-name. + +=head1 AUTHOR + +Malcolm Beattie, C<mbeattie@sable.ox.ac.uk> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/B/Stackobj.pm b/Master/tlpkg/tlperl.old/lib/B/Stackobj.pm new file mode 100644 index 00000000000..b17dfb8173a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/Stackobj.pm @@ -0,0 +1,349 @@ +# Stackobj.pm +# +# Copyright (c) 1996 Malcolm Beattie +# +# You may distribute under the terms of either the GNU General Public +# License or the Artistic License, as specified in the README file. +# +package B::Stackobj; + +our $VERSION = '1.00'; + +use Exporter (); +@ISA = qw(Exporter); +@EXPORT_OK = qw(set_callback T_UNKNOWN T_DOUBLE T_INT VALID_UNSIGNED + VALID_INT VALID_DOUBLE VALID_SV REGISTER TEMPORARY); +%EXPORT_TAGS = (types => [qw(T_UNKNOWN T_DOUBLE T_INT)], + flags => [qw(VALID_INT VALID_DOUBLE VALID_SV + VALID_UNSIGNED REGISTER TEMPORARY)]); + +use Carp qw(confess); +use strict; +use B qw(class SVf_IOK SVf_NOK SVf_IVisUV); + +# Types +sub T_UNKNOWN () { 0 } +sub T_DOUBLE () { 1 } +sub T_INT () { 2 } +sub T_SPECIAL () { 3 } + +# Flags +sub VALID_INT () { 0x01 } +sub VALID_UNSIGNED () { 0x02 } +sub VALID_DOUBLE () { 0x04 } +sub VALID_SV () { 0x08 } +sub REGISTER () { 0x10 } # no implicit write-back when calling subs +sub TEMPORARY () { 0x20 } # no implicit write-back needed at all +sub SAVE_INT () { 0x40 } #if int part needs to be saved at all +sub SAVE_DOUBLE () { 0x80 } #if double part needs to be saved at all + + +# +# Callback for runtime code generation +# +my $runtime_callback = sub { confess "set_callback not yet called" }; +sub set_callback (&) { $runtime_callback = shift } +sub runtime { &$runtime_callback(@_) } + +# +# Methods +# + +sub write_back { confess "stack object does not implement write_back" } + +sub invalidate { shift->{flags} &= ~(VALID_INT |VALID_UNSIGNED | VALID_DOUBLE) } + +sub as_sv { + my $obj = shift; + if (!($obj->{flags} & VALID_SV)) { + $obj->write_back; + $obj->{flags} |= VALID_SV; + } + return $obj->{sv}; +} + +sub as_int { + my $obj = shift; + if (!($obj->{flags} & VALID_INT)) { + $obj->load_int; + $obj->{flags} |= VALID_INT|SAVE_INT; + } + return $obj->{iv}; +} + +sub as_double { + my $obj = shift; + if (!($obj->{flags} & VALID_DOUBLE)) { + $obj->load_double; + $obj->{flags} |= VALID_DOUBLE|SAVE_DOUBLE; + } + return $obj->{nv}; +} + +sub as_numeric { + my $obj = shift; + return $obj->{type} == T_INT ? $obj->as_int : $obj->as_double; +} + +sub as_bool { + my $obj=shift; + if ($obj->{flags} & VALID_INT ){ + return $obj->{iv}; + } + if ($obj->{flags} & VALID_DOUBLE ){ + return $obj->{nv}; + } + return sprintf("(SvTRUE(%s))", $obj->as_sv) ; +} + +# +# Debugging methods +# +sub peek { + my $obj = shift; + my $type = $obj->{type}; + my $flags = $obj->{flags}; + my @flags; + if ($type == T_UNKNOWN) { + $type = "T_UNKNOWN"; + } elsif ($type == T_INT) { + $type = "T_INT"; + } elsif ($type == T_DOUBLE) { + $type = "T_DOUBLE"; + } else { + $type = "(illegal type $type)"; + } + push(@flags, "VALID_INT") if $flags & VALID_INT; + push(@flags, "VALID_DOUBLE") if $flags & VALID_DOUBLE; + push(@flags, "VALID_SV") if $flags & VALID_SV; + push(@flags, "REGISTER") if $flags & REGISTER; + push(@flags, "TEMPORARY") if $flags & TEMPORARY; + @flags = ("none") unless @flags; + return sprintf("%s type=$type flags=%s sv=$obj->{sv}", + class($obj), join("|", @flags)); +} + +sub minipeek { + my $obj = shift; + my $type = $obj->{type}; + my $flags = $obj->{flags}; + if ($type == T_INT || $flags & VALID_INT) { + return $obj->{iv}; + } elsif ($type == T_DOUBLE || $flags & VALID_DOUBLE) { + return $obj->{nv}; + } else { + return $obj->{sv}; + } +} + +# +# Caller needs to ensure that set_int, set_double, +# set_numeric and set_sv are only invoked on legal lvalues. +# +sub set_int { + my ($obj, $expr,$unsigned) = @_; + runtime("$obj->{iv} = $expr;"); + $obj->{flags} &= ~(VALID_SV | VALID_DOUBLE); + $obj->{flags} |= VALID_INT|SAVE_INT; + $obj->{flags} |= VALID_UNSIGNED if $unsigned; +} + +sub set_double { + my ($obj, $expr) = @_; + runtime("$obj->{nv} = $expr;"); + $obj->{flags} &= ~(VALID_SV | VALID_INT); + $obj->{flags} |= VALID_DOUBLE|SAVE_DOUBLE; +} + +sub set_numeric { + my ($obj, $expr) = @_; + if ($obj->{type} == T_INT) { + $obj->set_int($expr); + } else { + $obj->set_double($expr); + } +} + +sub set_sv { + my ($obj, $expr) = @_; + runtime("SvSetSV($obj->{sv}, $expr);"); + $obj->invalidate; + $obj->{flags} |= VALID_SV; +} + +# +# Stackobj::Padsv +# + +@B::Stackobj::Padsv::ISA = 'B::Stackobj'; +sub B::Stackobj::Padsv::new { + my ($class, $type, $extra_flags, $ix, $iname, $dname) = @_; + $extra_flags |= SAVE_INT if $extra_flags & VALID_INT; + $extra_flags |= SAVE_DOUBLE if $extra_flags & VALID_DOUBLE; + bless { + type => $type, + flags => VALID_SV | $extra_flags, + sv => "PL_curpad[$ix]", + iv => "$iname", + nv => "$dname" + }, $class; +} + +sub B::Stackobj::Padsv::load_int { + my $obj = shift; + if ($obj->{flags} & VALID_DOUBLE) { + runtime("$obj->{iv} = $obj->{nv};"); + } else { + runtime("$obj->{iv} = SvIV($obj->{sv});"); + } + $obj->{flags} |= VALID_INT|SAVE_INT; +} + +sub B::Stackobj::Padsv::load_double { + my $obj = shift; + $obj->write_back; + runtime("$obj->{nv} = SvNV($obj->{sv});"); + $obj->{flags} |= VALID_DOUBLE|SAVE_DOUBLE; +} +sub B::Stackobj::Padsv::save_int { + my $obj = shift; + return $obj->{flags} & SAVE_INT; +} + +sub B::Stackobj::Padsv::save_double { + my $obj = shift; + return $obj->{flags} & SAVE_DOUBLE; +} + +sub B::Stackobj::Padsv::write_back { + my $obj = shift; + my $flags = $obj->{flags}; + return if $flags & VALID_SV; + if ($flags & VALID_INT) { + if ($flags & VALID_UNSIGNED ){ + runtime("sv_setuv($obj->{sv}, $obj->{iv});"); + }else{ + runtime("sv_setiv($obj->{sv}, $obj->{iv});"); + } + } elsif ($flags & VALID_DOUBLE) { + runtime("sv_setnv($obj->{sv}, $obj->{nv});"); + } else { + confess "write_back failed for lexical @{[$obj->peek]}\n"; + } + $obj->{flags} |= VALID_SV; +} + +# +# Stackobj::Const +# + +@B::Stackobj::Const::ISA = 'B::Stackobj'; +sub B::Stackobj::Const::new { + my ($class, $sv) = @_; + my $obj = bless { + flags => 0, + sv => $sv # holds the SV object until write_back happens + }, $class; + if ( ref($sv) eq "B::SPECIAL" ){ + $obj->{type}= T_SPECIAL; + }else{ + my $svflags = $sv->FLAGS; + if ($svflags & SVf_IOK) { + $obj->{flags} = VALID_INT|VALID_DOUBLE; + $obj->{type} = T_INT; + if ($svflags & SVf_IVisUV){ + $obj->{flags} |= VALID_UNSIGNED; + $obj->{nv} = $obj->{iv} = $sv->UVX; + }else{ + $obj->{nv} = $obj->{iv} = $sv->IV; + } + } elsif ($svflags & SVf_NOK) { + $obj->{flags} = VALID_INT|VALID_DOUBLE; + $obj->{type} = T_DOUBLE; + $obj->{iv} = $obj->{nv} = $sv->NV; + } else { + $obj->{type} = T_UNKNOWN; + } + } + return $obj; +} + +sub B::Stackobj::Const::write_back { + my $obj = shift; + return if $obj->{flags} & VALID_SV; + # Save the SV object and replace $obj->{sv} by its C source code name + $obj->{sv} = $obj->{sv}->save; + $obj->{flags} |= VALID_SV|VALID_INT|VALID_DOUBLE; +} + +sub B::Stackobj::Const::load_int { + my $obj = shift; + if (ref($obj->{sv}) eq "B::RV"){ + $obj->{iv} = int($obj->{sv}->RV->PV); + }else{ + $obj->{iv} = int($obj->{sv}->PV); + } + $obj->{flags} |= VALID_INT; +} + +sub B::Stackobj::Const::load_double { + my $obj = shift; + if (ref($obj->{sv}) eq "B::RV"){ + $obj->{nv} = $obj->{sv}->RV->PV + 0.0; + }else{ + $obj->{nv} = $obj->{sv}->PV + 0.0; + } + $obj->{flags} |= VALID_DOUBLE; +} + +sub B::Stackobj::Const::invalidate {} + +# +# Stackobj::Bool +# + +@B::Stackobj::Bool::ISA = 'B::Stackobj'; +sub B::Stackobj::Bool::new { + my ($class, $preg) = @_; + my $obj = bless { + type => T_INT, + flags => VALID_INT|VALID_DOUBLE, + iv => $$preg, + nv => $$preg, + preg => $preg # this holds our ref to the pseudo-reg + }, $class; + return $obj; +} + +sub B::Stackobj::Bool::write_back { + my $obj = shift; + return if $obj->{flags} & VALID_SV; + $obj->{sv} = "($obj->{iv} ? &PL_sv_yes : &PL_sv_no)"; + $obj->{flags} |= VALID_SV; +} + +# XXX Might want to handle as_double/set_double/load_double? + +sub B::Stackobj::Bool::invalidate {} + +1; + +__END__ + +=head1 NAME + +B::Stackobj - Helper module for CC backend + +=head1 SYNOPSIS + + use B::Stackobj; + +=head1 DESCRIPTION + +See F<ext/B/README>. + +=head1 AUTHOR + +Malcolm Beattie, C<mbeattie@sable.ox.ac.uk> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/B/Stash.pm b/Master/tlpkg/tlperl.old/lib/B/Stash.pm new file mode 100644 index 00000000000..5e60868a28e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/Stash.pm @@ -0,0 +1,52 @@ +# Stash.pm -- show what stashes are loaded +# vishalb@hotmail.com +package B::Stash; + +our $VERSION = '1.00'; + +=pod + +=head1 NAME + +B::Stash - show what stashes are loaded + +=cut + +BEGIN { %Seen = %INC } + +CHECK { + my @arr=scan($main::{"main::"}); + @arr=map{s/\:\:$//;$_ eq "<none>"?():$_;} @arr; + print "-umain,-u", join (",-u",@arr) ,"\n"; +} +sub scan{ + my $start=shift; + my $prefix=shift; + $prefix = '' unless defined $prefix; + my @return; + foreach my $key ( keys %{$start}){ +# print $prefix,$key,"\n"; + if ($key =~ /::$/){ + unless ($start eq ${$start}{$key} or $key eq "B::" ){ + push @return, $key unless omit($prefix.$key); + foreach my $subscan ( scan(${$start}{$key},$prefix.$key)){ + push @return, "$key".$subscan; + } + } + } + } + return @return; +} +sub omit{ + my $module = shift; + my %omit=("DynaLoader::" => 1 , "XSLoader::" => 1, "CORE::" => 1 , + "CORE::GLOBAL::" => 1, "UNIVERSAL::" => 1 ); + return 1 if $omit{$module}; + if ($module eq "IO::" or $module eq "IO::Handle::"){ + $module =~ s/::/\//g; + return 1 unless $INC{$module}; + } + + return 0; +} +1; diff --git a/Master/tlpkg/tlperl.old/lib/B/Terse.pm b/Master/tlpkg/tlperl.old/lib/B/Terse.pm new file mode 100644 index 00000000000..1d53950ad3b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/Terse.pm @@ -0,0 +1,103 @@ +package B::Terse; + +our $VERSION = '1.03_01'; + +use strict; +use B qw(class); +use B::Asmdata qw(@specialsv_name); +use B::Concise qw(concise_subref set_style_standard); +use Carp; + +sub terse { + my ($order, $subref) = @_; + set_style_standard("terse"); + if ($order eq "exec") { + concise_subref('exec', $subref); + } else { + concise_subref('basic', $subref); + } +} + +sub compile { + my @args = @_; + my $order = @args ? shift(@args) : ""; + $order = "-exec" if $order eq "exec"; + unshift @args, $order if $order ne ""; + B::Concise::compile("-terse", @args); +} + +sub indent { + my ($level) = @_ ? shift : 0; + return " " x $level; +} + +# Don't use this, at least on OPs in subroutines: it has no way of +# getting to the pad, and will give wrong answers or crash. +sub B::OP::terse { + carp "B::OP::terse is deprecated; use B::Concise instead"; + B::Concise::b_terse(@_); +} + +sub B::SV::terse { + my($sv, $level) = (@_, 0); + my %info; + B::Concise::concise_sv($sv, \%info); + my $s = indent($level) + . B::Concise::fmt_line(\%info, $sv, + "#svclass~(?((#svaddr))?)~#svval", 0); + chomp $s; + print "$s\n" unless defined wantarray; + $s; +} + +sub B::NULL::terse { + my ($sv, $level) = (@_, 0); + my $s = indent($level) . sprintf "%s (0x%lx)", class($sv), $$sv; + print "$s\n" unless defined wantarray; + $s; +} + +sub B::SPECIAL::terse { + my ($sv, $level) = (@_, 0); + my $s = indent($level) + . sprintf( "%s #%d %s", class($sv), $$sv, $specialsv_name[$$sv]); + print "$s\n" unless defined wantarray; + $s; +} + +1; + +__END__ + +=head1 NAME + +B::Terse - Walk Perl syntax tree, printing terse info about ops + +=head1 SYNOPSIS + + perl -MO=Terse[,OPTIONS] foo.pl + +=head1 DESCRIPTION + +This version of B::Terse is really just a wrapper that calls B::Concise +with the B<-terse> option. It is provided for compatibility with old scripts +(and habits) but using B::Concise directly is now recommended instead. + +For compatibility with the old B::Terse, this module also adds a +method named C<terse> to B::OP and B::SV objects. The B::SV method is +largely compatible with the old one, though authors of new software +might be advised to choose a more user-friendly output format. The +B::OP C<terse> method, however, doesn't work well. Since B::Terse was +first written, much more information in OPs has migrated to the +scratchpad datastructure, but the C<terse> interface doesn't have any +way of getting to the correct pad. As a kludge, the new version will +always use the pad for the main program, but for OPs in subroutines +this will give the wrong answer or crash. + +=head1 AUTHOR + +The original version of B::Terse was written by Malcolm Beattie, +E<lt>mbeattie@sable.ox.ac.ukE<gt>. This wrapper was written by Stephen +McCamant, E<lt>smcc@MIT.EDUE<gt>. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/B/Xref.pm b/Master/tlpkg/tlperl.old/lib/B/Xref.pm new file mode 100644 index 00000000000..f727dc766b5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/Xref.pm @@ -0,0 +1,430 @@ +package B::Xref; + +our $VERSION = '1.01'; + +=head1 NAME + +B::Xref - Generates cross reference reports for Perl programs + +=head1 SYNOPSIS + +perl -MO=Xref[,OPTIONS] foo.pl + +=head1 DESCRIPTION + +The B::Xref module is used to generate a cross reference listing of all +definitions and uses of variables, subroutines and formats in a Perl program. +It is implemented as a backend for the Perl compiler. + +The report generated is in the following format: + + File filename1 + Subroutine subname1 + Package package1 + object1 line numbers + object2 line numbers + ... + Package package2 + ... + +Each B<File> section reports on a single file. Each B<Subroutine> section +reports on a single subroutine apart from the special cases +"(definitions)" and "(main)". These report, respectively, on subroutine +definitions found by the initial symbol table walk and on the main part of +the program or module external to all subroutines. + +The report is then grouped by the B<Package> of each variable, +subroutine or format with the special case "(lexicals)" meaning +lexical variables. Each B<object> name (implicitly qualified by its +containing B<Package>) includes its type character(s) at the beginning +where possible. Lexical variables are easier to track and even +included dereferencing information where possible. + +The C<line numbers> are a comma separated list of line numbers (some +preceded by code letters) where that object is used in some way. +Simple uses aren't preceded by a code letter. Introductions (such as +where a lexical is first defined with C<my>) are indicated with the +letter "i". Subroutine and method calls are indicated by the character +"&". Subroutine definitions are indicated by "s" and format +definitions by "f". + +=head1 OPTIONS + +Option words are separated by commas (not whitespace) and follow the +usual conventions of compiler backend options. + +=over 8 + +=item C<-oFILENAME> + +Directs output to C<FILENAME> instead of standard output. + +=item C<-r> + +Raw output. Instead of producing a human-readable report, outputs a line +in machine-readable form for each definition/use of a variable/sub/format. + +=item C<-d> + +Don't output the "(definitions)" sections. + +=item C<-D[tO]> + +(Internal) debug options, probably only useful if C<-r> included. +The C<t> option prints the object on the top of the stack as it's +being tracked. The C<O> option prints each operator as it's being +processed in the execution order of the program. + +=back + +=head1 BUGS + +Non-lexical variables are quite difficult to track through a program. +Sometimes the type of a non-lexical variable's use is impossible to +determine. Introductions of non-lexical non-scalars don't seem to be +reported properly. + +=head1 AUTHOR + +Malcolm Beattie, mbeattie@sable.ox.ac.uk. + +=cut + +use strict; +use Config; +use B qw(peekop class comppadlist main_start svref_2object walksymtable + OPpLVAL_INTRO SVf_POK OPpOUR_INTRO cstring + ); + +sub UNKNOWN { ["?", "?", "?"] } + +my @pad; # lexicals in current pad + # as ["(lexical)", type, name] +my %done; # keyed by $$op: set when each $op is done +my $top = UNKNOWN; # shadows top element of stack as + # [pack, type, name] (pack can be "(lexical)") +my $file; # shadows current filename +my $line; # shadows current line number +my $subname; # shadows current sub name +my %table; # Multi-level hash to record all uses etc. +my @todo = (); # List of CVs that need processing + +my %code = (intro => "i", used => "", + subdef => "s", subused => "&", + formdef => "f", meth => "->"); + + +# Options +my ($debug_op, $debug_top, $nodefs, $raw); + +sub process { + my ($var, $event) = @_; + my ($pack, $type, $name) = @$var; + if ($type eq "*") { + if ($event eq "used") { + return; + } elsif ($event eq "subused") { + $type = "&"; + } + } + $type =~ s/(.)\*$/$1/g; + if ($raw) { + printf "%-16s %-12s %5d %-12s %4s %-16s %s\n", + $file, $subname, $line, $pack, $type, $name, $event; + } else { + # Wheee + push(@{$table{$file}->{$subname}->{$pack}->{$type.$name}->{$event}}, + $line); + } +} + +sub load_pad { + my $padlist = shift; + my ($namelistav, $vallistav, @namelist, $ix); + @pad = (); + return if class($padlist) eq "SPECIAL"; + ($namelistav,$vallistav) = $padlist->ARRAY; + @namelist = $namelistav->ARRAY; + for ($ix = 1; $ix < @namelist; $ix++) { + my $namesv = $namelist[$ix]; + next if class($namesv) eq "SPECIAL"; + my ($type, $name) = $namesv->PV =~ /^(.)([^\0]*)(\0.*)?$/; + $pad[$ix] = ["(lexical)", $type || '?', $name || '?']; + } + if ($Config{useithreads}) { + my (@vallist); + @vallist = $vallistav->ARRAY; + for ($ix = 1; $ix < @vallist; $ix++) { + my $valsv = $vallist[$ix]; + next unless class($valsv) eq "GV"; + # these pad GVs don't have corresponding names, so same @pad + # array can be used without collisions + $pad[$ix] = [$valsv->STASH->NAME, "*", $valsv->NAME]; + } + } +} + +sub xref { + my $start = shift; + my $op; + for ($op = $start; $$op; $op = $op->next) { + last if $done{$$op}++; + warn sprintf("top = [%s, %s, %s]\n", @$top) if $debug_top; + warn peekop($op), "\n" if $debug_op; + my $opname = $op->name; + if ($opname =~ /^(or|and|mapwhile|grepwhile|range|cond_expr)$/) { + xref($op->other); + } elsif ($opname eq "match" || $opname eq "subst") { + xref($op->pmreplstart); + } elsif ($opname eq "substcont") { + xref($op->other->pmreplstart); + $op = $op->other; + redo; + } elsif ($opname eq "enterloop") { + xref($op->redoop); + xref($op->nextop); + xref($op->lastop); + } elsif ($opname eq "subst") { + xref($op->pmreplstart); + } else { + no strict 'refs'; + my $ppname = "pp_$opname"; + &$ppname($op) if defined(&$ppname); + } + } +} + +sub xref_cv { + my $cv = shift; + my $pack = $cv->GV->STASH->NAME; + $subname = ($pack eq "main" ? "" : "$pack\::") . $cv->GV->NAME; + load_pad($cv->PADLIST); + xref($cv->START); + $subname = "(main)"; +} + +sub xref_object { + my $cvref = shift; + xref_cv(svref_2object($cvref)); +} + +sub xref_main { + $subname = "(main)"; + load_pad(comppadlist); + xref(main_start); + while (@todo) { + xref_cv(shift @todo); + } +} + +sub pp_nextstate { + my $op = shift; + $file = $op->file; + $line = $op->line; + $top = UNKNOWN; +} + +sub pp_padsv { + my $op = shift; + $top = $pad[$op->targ]; + process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used"); +} + +sub pp_padav { pp_padsv(@_) } +sub pp_padhv { pp_padsv(@_) } + +sub deref { + my ($op, $var, $as) = @_; + $var->[1] = $as . $var->[1]; + process($var, $op->private & OPpOUR_INTRO ? "intro" : "used"); +} + +sub pp_rv2cv { deref(shift, $top, "&"); } +sub pp_rv2hv { deref(shift, $top, "%"); } +sub pp_rv2sv { deref(shift, $top, "\$"); } +sub pp_rv2av { deref(shift, $top, "\@"); } +sub pp_rv2gv { deref(shift, $top, "*"); } + +sub pp_gvsv { + my $op = shift; + my $gv; + if ($Config{useithreads}) { + $top = $pad[$op->padix]; + $top = UNKNOWN unless $top; + $top->[1] = '$'; + } + else { + $gv = $op->gv; + $top = [$gv->STASH->NAME, '$', $gv->SAFENAME]; + } + process($top, $op->private & OPpLVAL_INTRO || + $op->private & OPpOUR_INTRO ? "intro" : "used"); +} + +sub pp_gv { + my $op = shift; + my $gv; + if ($Config{useithreads}) { + $top = $pad[$op->padix]; + $top = UNKNOWN unless $top; + $top->[1] = '*'; + } + else { + $gv = $op->gv; + $top = [$gv->STASH->NAME, "*", $gv->SAFENAME]; + } + process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used"); +} + +sub pp_const { + my $op = shift; + my $sv = $op->sv; + # constant could be in the pad (under useithreads) + if ($$sv) { + $top = ["?", "", + (class($sv) ne "SPECIAL" && $sv->FLAGS & SVf_POK) + ? cstring($sv->PV) : "?"]; + } + else { + $top = $pad[$op->targ]; + $top = UNKNOWN unless $top; + } +} + +sub pp_method { + my $op = shift; + $top = ["(method)", "->".$top->[1], $top->[2]]; +} + +sub pp_entersub { + my $op = shift; + if ($top->[1] eq "m") { + process($top, "meth"); + } else { + process($top, "subused"); + } + $top = UNKNOWN; +} + +# +# Stuff for cross referencing definitions of variables and subs +# + +sub B::GV::xref { + my $gv = shift; + my $cv = $gv->CV; + if ($$cv) { + #return if $done{$$cv}++; + $file = $gv->FILE; + $line = $gv->LINE; + process([$gv->STASH->NAME, "&", $gv->NAME], "subdef"); + push(@todo, $cv); + } + my $form = $gv->FORM; + if ($$form) { + return if $done{$$form}++; + $file = $gv->FILE; + $line = $gv->LINE; + process([$gv->STASH->NAME, "", $gv->NAME], "formdef"); + } +} + +sub xref_definitions { + my ($pack, %exclude); + return if $nodefs; + $subname = "(definitions)"; + foreach $pack (qw(B O AutoLoader DynaLoader XSLoader Config DB VMS + strict vars FileHandle Exporter Carp PerlIO::Layer + attributes utf8 warnings)) { + $exclude{$pack."::"} = 1; + } + no strict qw(vars refs); + walksymtable(\%{"main::"}, "xref", sub { !defined($exclude{$_[0]}) }); +} + +sub output { + return if $raw; + my ($file, $subname, $pack, $name, $ev, $perfile, $persubname, + $perpack, $pername, $perev); + foreach $file (sort(keys(%table))) { + $perfile = $table{$file}; + print "File $file\n"; + foreach $subname (sort(keys(%$perfile))) { + $persubname = $perfile->{$subname}; + print " Subroutine $subname\n"; + foreach $pack (sort(keys(%$persubname))) { + $perpack = $persubname->{$pack}; + print " Package $pack\n"; + foreach $name (sort(keys(%$perpack))) { + $pername = $perpack->{$name}; + my @lines; + foreach $ev (qw(intro formdef subdef meth subused used)) { + $perev = $pername->{$ev}; + if (defined($perev) && @$perev) { + my $code = $code{$ev}; + push(@lines, map("$code$_", @$perev)); + } + } + printf " %-16s %s\n", $name, join(", ", @lines); + } + } + } + } +} + +sub compile { + my @options = @_; + my ($option, $opt, $arg); + OPTION: + while ($option = shift @options) { + if ($option =~ /^-(.)(.*)/) { + $opt = $1; + $arg = $2; + } else { + unshift @options, $option; + last OPTION; + } + if ($opt eq "-" && $arg eq "-") { + shift @options; + last OPTION; + } elsif ($opt eq "o") { + $arg ||= shift @options; + open(STDOUT, ">$arg") or return "$arg: $!\n"; + } elsif ($opt eq "d") { + $nodefs = 1; + } elsif ($opt eq "r") { + $raw = 1; + } elsif ($opt eq "D") { + $arg ||= shift @options; + foreach $arg (split(//, $arg)) { + if ($arg eq "o") { + B->debug(1); + } elsif ($arg eq "O") { + $debug_op = 1; + } elsif ($arg eq "t") { + $debug_top = 1; + } + } + } + } + if (@options) { + return sub { + my $objname; + xref_definitions(); + foreach $objname (@options) { + $objname = "main::$objname" unless $objname =~ /::/; + eval "xref_object(\\&$objname)"; + die "xref_object(\\&$objname) failed: $@" if $@; + } + output(); + } + } else { + return sub { + xref_definitions(); + xref_main(); + output(); + } + } +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/B/assemble b/Master/tlpkg/tlperl.old/lib/B/assemble new file mode 100644 index 00000000000..43cc5bc4b33 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/assemble @@ -0,0 +1,30 @@ +use B::Assembler qw(assemble_fh); +use FileHandle; + +my ($filename, $fh, $out); + +if ($ARGV[0] eq "-d") { + B::Assembler::debug(1); + shift; +} + +$out = \*STDOUT; + +if (@ARGV == 0) { + $fh = \*STDIN; + $filename = "-"; +} elsif (@ARGV == 1) { + $filename = $ARGV[0]; + $fh = new FileHandle "<$filename"; +} elsif (@ARGV == 2) { + $filename = $ARGV[0]; + $fh = new FileHandle "<$filename"; + $out = new FileHandle ">$ARGV[1]"; +} else { + die "Usage: assemble [filename] [outfilename]\n"; +} + +binmode $out; +$SIG{__WARN__} = sub { warn "$filename:@_" }; +$SIG{__DIE__} = sub { die "$filename: @_" }; +assemble_fh($fh, sub { print $out @_ }); diff --git a/Master/tlpkg/tlperl.old/lib/B/cc_harness b/Master/tlpkg/tlperl.old/lib/B/cc_harness new file mode 100644 index 00000000000..79f8727a8f0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/cc_harness @@ -0,0 +1,12 @@ +use Config; + +$libdir = $ENV{PERL_SRC} || "$Config{installarchlib}/CORE"; + +if (!grep(/^-[cS]$/, @ARGV)) { + $linkargs = sprintf("%s $libdir/$Config{libperl} %s", + @Config{qw(ldflags libs)}); +} + +$cccmd = "$Config{cc} $Config{ccflags} -I$libdir @ARGV $linkargs"; +print "$cccmd\n"; +exec $cccmd; diff --git a/Master/tlpkg/tlperl.old/lib/B/disassemble b/Master/tlpkg/tlperl.old/lib/B/disassemble new file mode 100644 index 00000000000..6530b809502 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/disassemble @@ -0,0 +1,22 @@ +use B::Disassembler qw(disassemble_fh); +use FileHandle; + +my $fh; +if (@ARGV == 0) { + $fh = \*STDIN; +} elsif (@ARGV == 1) { + $fh = new FileHandle "<$ARGV[0]"; +} else { + die "Usage: disassemble [filename]\n"; +} + +sub print_insn { + my ($insn, $arg) = @_; + if (defined($arg)) { + printf "%s %s\n", $insn, $arg; + } else { + print $insn, "\n"; + } +} + +disassemble_fh($fh, \&print_insn); diff --git a/Master/tlpkg/tlperl.old/lib/B/makeliblinks b/Master/tlpkg/tlperl.old/lib/B/makeliblinks new file mode 100644 index 00000000000..82560783c01 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/B/makeliblinks @@ -0,0 +1,54 @@ +use File::Find; +use Config; + +if (@ARGV != 2) { + warn <<"EOT"; +Usage: makeliblinks libautodir targetdir +where libautodir is the architecture-dependent auto directory +(e.g. $Config::Config{archlib}/auto). +EOT + exit 2; +} + +my ($libautodir, $targetdir) = @ARGV; + +# Calculate relative path prefix from $targetdir to $libautodir +sub relprefix { + my ($to, $from) = @_; + my $up; + for ($up = 0; substr($to, 0, length($from)) ne $from; $up++) { + $from =~ s( + [^/]+ (?# a group of non-slashes) + /* (?# maybe with some trailing slashes) + $ (?# at the end of the path) + )()x; + } + return (("../" x $up) . substr($to, length($from))); +} + +my $relprefix = relprefix($libautodir, $targetdir); + +my ($dlext, $lib_ext) = @Config::Config{qw(dlext lib_ext)}; + +sub link_if_library { + if (/\.($dlext|$lib_ext)$/o) { + my $ext = $1; + my $name = $File::Find::name; + if (substr($name, 0, length($libautodir) + 1) ne "$libautodir/") { + die "directory of $name doesn't match $libautodir\n"; + } + substr($name, 0, length($libautodir) + 1) = ''; + my @parts = split(m(/), $name); + if ($parts[-1] ne "$parts[-2].$ext") { + die "module name $_ doesn't match its directory $libautodir\n"; + } + pop @parts; + my $libpath = "$targetdir/lib" . join("__", @parts) . ".$ext"; + print "$libpath -> $relprefix/$name\n"; + symlink("$relprefix/$name", $libpath) + or warn "above link failed with error: $!\n"; + } +} + +find(\&link_if_library, $libautodir); +exit 0; diff --git a/Master/tlpkg/tlperl.old/lib/Carp.pm b/Master/tlpkg/tlperl.old/lib/Carp.pm new file mode 100644 index 00000000000..1a814ead34f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Carp.pm @@ -0,0 +1,274 @@ +package Carp; + +our $VERSION = '1.04'; + +=head1 NAME + +carp - warn of errors (from perspective of caller) + +cluck - warn of errors with stack backtrace + (not exported by default) + +croak - die of errors (from perspective of caller) + +confess - die of errors with stack backtrace + +shortmess - return the message that carp and croak produce + +longmess - return the message that cluck and confess produce + +=head1 SYNOPSIS + + use Carp; + croak "We're outta here!"; + + use Carp qw(cluck); + cluck "This is how we got here!"; + + print FH Carp::shortmess("This will have caller's details added"); + print FH Carp::longmess("This will have stack backtrace added"); + +=head1 DESCRIPTION + +The Carp routines are useful in your own modules because +they act like die() or warn(), but with a message which is more +likely to be useful to a user of your module. In the case of +cluck, confess, and longmess that context is a summary of every +call in the call-stack. For a shorter message you can use carp, +croak or shortmess which report the error as being from where +your module was called. There is no guarantee that that is where +the error was, but it is a good educated guess. + +You can also alter the way the output and logic of C<Carp> works, by +changing some global variables in the C<Carp> namespace. See the +section on C<GLOBAL VARIABLES> below. + +Here is a more complete description of how shortmess works. What +it does is search the call-stack for a function call stack where +it hasn't been told that there shouldn't be an error. If every +call is marked safe, it then gives up and gives a full stack +backtrace instead. In other words it presumes that the first likely +looking potential suspect is guilty. Its rules for telling whether +a call shouldn't generate errors work as follows: + +=over 4 + +=item 1. + +Any call from a package to itself is safe. + +=item 2. + +Packages claim that there won't be errors on calls to or from +packages explicitly marked as safe by inclusion in @CARP_NOT, or +(if that array is empty) @ISA. The ability to override what +@ISA says is new in 5.8. + +=item 3. + +The trust in item 2 is transitive. If A trusts B, and B +trusts C, then A trusts C. So if you do not override @ISA +with @CARP_NOT, then this trust relationship is identical to, +"inherits from". + +=item 4. + +Any call from an internal Perl module is safe. (Nothing keeps +user modules from marking themselves as internal to Perl, but +this practice is discouraged.) + +=item 5. + +Any call to Carp is safe. (This rule is what keeps it from +reporting the error where you call carp/croak/shortmess.) + +=back + +=head2 Forcing a Stack Trace + +As a debugging aid, you can force Carp to treat a croak as a confess +and a carp as a cluck across I<all> modules. In other words, force a +detailed stack trace to be given. This can be very helpful when trying +to understand why, or from where, a warning or error is being generated. + +This feature is enabled by 'importing' the non-existent symbol +'verbose'. You would typically enable it by saying + + perl -MCarp=verbose script.pl + +or by including the string C<MCarp=verbose> in the PERL5OPT +environment variable. + +Alternately, you can set the global variable C<$Carp::Verbose> to true. +See the C<GLOBAL VARIABLES> section below. + +=cut + +# This package is heavily used. Be small. Be fast. Be good. + +# Comments added by Andy Wardley <abw@kfs.org> 09-Apr-98, based on an +# _almost_ complete understanding of the package. Corrections and +# comments are welcome. + +# The members of %Internal are packages that are internal to perl. +# Carp will not report errors from within these packages if it +# can. The members of %CarpInternal are internal to Perl's warning +# system. Carp will not report errors from within these packages +# either, and will not report calls *to* these packages for carp and +# croak. They replace $CarpLevel, which is deprecated. The +# $Max(EvalLen|(Arg(Len|Nums)) variables are used to specify how the eval +# text and function arguments should be formatted when printed. + +# Comments added by Jos I. Boumans <kane@dwim.org> 11-Aug-2004 +# I can not get %CarpInternal or %Internal to work as advertised, +# therefor leaving it out of the below documentation. +# $CarpLevel may be decprecated according to the last comment, but +# after 6 years, it's still around and in heavy use ;) + +=pod + +=head1 GLOBAL VARIABLES + +=head2 $Carp::CarpLevel + +This variable determines how many call frames are to be skipped when +reporting where an error occurred on a call to one of C<Carp>'s +functions. For example: + + $Carp::CarpLevel = 1; + sub bar { .... or _error('Wrong input') } + sub _error { Carp::carp(@_) } + +This would make Carp report the error as coming from C<bar>'s caller, +rather than from C<_error>'s caller, as it normally would. + +Defaults to C<0>. + +=head2 $Carp::MaxEvalLen + +This variable determines how many characters of a string-eval are to +be shown in the output. Use a value of C<0> to show all text. + +Defaults to C<0>. + +=head2 $Carp::MaxArgLen + +This variable determines how many characters of each argument to a +function to print. Use a value of C<0> to show the full length of the +argument. + +Defaults to C<64>. + +=head2 $Carp::MaxArgNums + +This variable determines how many arguments to each function to show. +Use a value of C<0> to show all arguments to a function call. + +Defaults to C<8>. + +=head2 $Carp::Verbose + +This variable makes C<Carp> use the C<longmess> function at all times. +This effectively means that all calls to C<carp> become C<cluck> and +all calls to C<croak> become C<confess>. + +Note, this is analogous to using C<use Carp 'verbose'>. + +Defaults to C<0>. + +=cut + + +$CarpInternal{Carp}++; +$CarpInternal{warnings}++; +$CarpLevel = 0; # How many extra package levels to skip on carp. + # How many calls to skip on confess. + # Reconciling these notions is hard, use + # %Internal and %CarpInternal instead. +$MaxEvalLen = 0; # How much eval '...text...' to show. 0 = all. +$MaxArgLen = 64; # How much of each argument to print. 0 = all. +$MaxArgNums = 8; # How many arguments to print. 0 = all. +$Verbose = 0; # If true then make shortmess call longmess instead + +require Exporter; +@ISA = ('Exporter'); +@EXPORT = qw(confess croak carp); +@EXPORT_OK = qw(cluck verbose longmess shortmess); +@EXPORT_FAIL = qw(verbose); # hook to enable verbose mode + +=head1 BUGS + +The Carp routines don't handle exception objects currently. +If called with a first argument that is a reference, they simply +call die() or warn(), as appropriate. + +=cut + +# if the caller specifies verbose usage ("perl -MCarp=verbose script.pl") +# then the following method will be called by the Exporter which knows +# to do this thanks to @EXPORT_FAIL, above. $_[1] will contain the word +# 'verbose'. + +sub export_fail { + shift; + $Verbose = shift if $_[0] eq 'verbose'; + return @_; +} + + +# longmess() crawls all the way up the stack reporting on all the function +# calls made. The error string, $error, is originally constructed from the +# arguments passed into longmess() via confess(), cluck() or shortmess(). +# This gets appended with the stack trace messages which are generated for +# each function call on the stack. + +sub longmess { + { + local($@, $!); + # XXX fix require to not clear $@ or $!? + # don't use require unless we need to (for Safe compartments) + require Carp::Heavy unless $INC{"Carp/Heavy.pm"}; + } + # Icky backwards compatibility wrapper. :-( + my $call_pack = caller(); + if ($Internal{$call_pack} or $CarpInternal{$call_pack}) { + return longmess_heavy(@_); + } + else { + local $CarpLevel = $CarpLevel + 1; + return longmess_heavy(@_); + } +} + + +# shortmess() is called by carp() and croak() to skip all the way up to +# the top-level caller's package and report the error from there. confess() +# and cluck() generate a full stack trace so they call longmess() to +# generate that. In verbose mode shortmess() calls longmess() so +# you always get a stack trace + +sub shortmess { # Short-circuit &longmess if called via multiple packages + { + local($@, $!); + # XXX fix require to not clear $@ or $!? + # don't use require unless we need to (for Safe compartments) + require Carp::Heavy unless $INC{"Carp/Heavy.pm"}; + } + # Icky backwards compatibility wrapper. :-( + my $call_pack = caller(); + local @CARP_NOT = caller(); + shortmess_heavy(@_); +} + + +# the following four functions call longmess() or shortmess() depending on +# whether they should generate a full stack trace (confess() and cluck()) +# or simply report the caller's package (croak() and carp()), respectively. +# confess() and croak() die, carp() and cluck() warn. + +sub croak { die shortmess @_ } +sub confess { die longmess @_ } +sub carp { warn shortmess @_ } +sub cluck { warn longmess @_ } + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Carp/Heavy.pm b/Master/tlpkg/tlperl.old/lib/Carp/Heavy.pm new file mode 100644 index 00000000000..55bca2b421a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Carp/Heavy.pm @@ -0,0 +1,241 @@ +# Carp::Heavy uses some variables in common with Carp. +package Carp; + +=head1 NAME + +Carp::Heavy - heavy machinery, no user serviceable parts inside + +=cut + +# use strict; # not yet + +# On one line so MakeMaker will see it. +use Carp; our $VERSION = $Carp::VERSION; + +our ($CarpLevel, $MaxArgNums, $MaxEvalLen, $MaxArgLen, $Verbose); + +sub caller_info { + my $i = shift(@_) + 1; + package DB; + my %call_info; + @call_info{ + qw(pack file line sub has_args wantarray evaltext is_require) + } = caller($i); + + unless (defined $call_info{pack}) { + return (); + } + + my $sub_name = Carp::get_subname(\%call_info); + if ($call_info{has_args}) { + my @args = map {Carp::format_arg($_)} @DB::args; + if ($MaxArgNums and @args > $MaxArgNums) { # More than we want to show? + $#args = $MaxArgNums; + push @args, '...'; + } + # Push the args onto the subroutine + $sub_name .= '(' . join (', ', @args) . ')'; + } + $call_info{sub_name} = $sub_name; + return wantarray() ? %call_info : \%call_info; +} + +# Transform an argument to a function into a string. +sub format_arg { + my $arg = shift; + if (ref($arg)) { + $arg = defined($overload::VERSION) ? overload::StrVal($arg) : "$arg"; + }elsif (not defined($arg)) { + $arg = 'undef'; + } + $arg =~ s/'/\\'/g; + $arg = str_len_trim($arg, $MaxArgLen); + + # Quote it? + $arg = "'$arg'" unless $arg =~ /^-?[\d.]+\z/; + + # The following handling of "control chars" is direct from + # the original code - it is broken on Unicode though. + # Suggestions? + utf8::is_utf8($arg) + or $arg =~ s/([[:cntrl:]]|[[:^ascii:]])/sprintf("\\x{%x}",ord($1))/eg; + return $arg; +} + +# Takes an inheritance cache and a package and returns +# an anon hash of known inheritances and anon array of +# inheritances which consequences have not been figured +# for. +sub get_status { + my $cache = shift; + my $pkg = shift; + $cache->{$pkg} ||= [{$pkg => $pkg}, [trusts_directly($pkg)]]; + return @{$cache->{$pkg}}; +} + +# Takes the info from caller() and figures out the name of +# the sub/require/eval +sub get_subname { + my $info = shift; + if (defined($info->{evaltext})) { + my $eval = $info->{evaltext}; + if ($info->{is_require}) { + return "require $eval"; + } + else { + $eval =~ s/([\\\'])/\\$1/g; + return "eval '" . str_len_trim($eval, $MaxEvalLen) . "'"; + } + } + + return ($info->{sub} eq '(eval)') ? 'eval {...}' : $info->{sub}; +} + +# Figures out what call (from the point of view of the caller) +# the long error backtrace should start at. +sub long_error_loc { + my $i; + my $lvl = $CarpLevel; + { + my $pkg = caller(++$i); + unless(defined($pkg)) { + # This *shouldn't* happen. + if (%Internal) { + local %Internal; + $i = long_error_loc(); + last; + } + else { + # OK, now I am irritated. + return 2; + } + } + redo if $CarpInternal{$pkg}; + redo unless 0 > --$lvl; + redo if $Internal{$pkg}; + } + return $i - 1; +} + + +sub longmess_heavy { + return @_ if ref($_[0]); # don't break references as exceptions + my $i = long_error_loc(); + return ret_backtrace($i, @_); +} + +# Returns a full stack backtrace starting from where it is +# told. +sub ret_backtrace { + my ($i, @error) = @_; + my $mess; + my $err = join '', @error; + $i++; + + my $tid_msg = ''; + if (defined &Thread::tid) { + my $tid = Thread->self->tid; + $tid_msg = " thread $tid" if $tid; + } + + my %i = caller_info($i); + $mess = "$err at $i{file} line $i{line}$tid_msg\n"; + + while (my %i = caller_info(++$i)) { + $mess .= "\t$i{sub_name} called at $i{file} line $i{line}$tid_msg\n"; + } + + return $mess; +} + +sub ret_summary { + my ($i, @error) = @_; + my $err = join '', @error; + $i++; + + my $tid_msg = ''; + if (defined &Thread::tid) { + my $tid = Thread->self->tid; + $tid_msg = " thread $tid" if $tid; + } + + my %i = caller_info($i); + return "$err at $i{file} line $i{line}$tid_msg\n"; +} + + +sub short_error_loc { + my $cache; + my $i = 1; + my $lvl = $CarpLevel; + { + my $called = caller($i++); + my $caller = caller($i); + return 0 unless defined($caller); # What happened? + redo if $Internal{$caller}; + redo if $CarpInternal{$called}; + redo if trusts($called, $caller, $cache); + redo if trusts($caller, $called, $cache); + redo unless 0 > --$lvl; + } + return $i - 1; +} + +sub shortmess_heavy { + return longmess_heavy(@_) if $Verbose; + return @_ if ref($_[0]); # don't break references as exceptions + my $i = short_error_loc(); + if ($i) { + ret_summary($i, @_); + } + else { + longmess_heavy(@_); + } +} + +# If a string is too long, trims it with ... +sub str_len_trim { + my $str = shift; + my $max = shift || 0; + if (2 < $max and $max < length($str)) { + substr($str, $max - 3) = '...'; + } + return $str; +} + +# Takes two packages and an optional cache. Says whether the +# first inherits from the second. +# +# Recursive versions of this have to work to avoid certain +# possible endless loops, and when following long chains of +# inheritance are less efficient. +sub trusts { + my $child = shift; + my $parent = shift; + my $cache = shift || {}; + my ($known, $partial) = get_status($cache, $child); + # Figure out consequences until we have an answer + while (@$partial and not exists $known->{$parent}) { + my $anc = shift @$partial; + next if exists $known->{$anc}; + $known->{$anc}++; + my ($anc_knows, $anc_partial) = get_status($cache, $anc); + my @found = keys %$anc_knows; + @$known{@found} = (); + push @$partial, @$anc_partial; + } + return exists $known->{$parent}; +} + +# Takes a package and gives a list of those trusted directly +sub trusts_directly { + my $class = shift; + no strict 'refs'; + no warnings 'once'; + return @{"$class\::CARP_NOT"} + ? @{"$class\::CARP_NOT"} + : @{"$class\::ISA"}; +} + +1; + diff --git a/Master/tlpkg/tlperl.old/lib/Class/ISA.pm b/Master/tlpkg/tlperl.old/lib/Class/ISA.pm new file mode 100644 index 00000000000..e1371912e2c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Class/ISA.pm @@ -0,0 +1,214 @@ +#!/usr/local/bin/perl +# Time-stamp: "2004-12-29 20:01:02 AST" -*-Perl-*- + +package Class::ISA; +require 5; +use strict; +use vars qw($Debug $VERSION); +$VERSION = '0.33'; +$Debug = 0 unless defined $Debug; + +=head1 NAME + +Class::ISA -- report the search path for a class's ISA tree + +=head1 SYNOPSIS + + # Suppose you go: use Food::Fishstick, and that uses and + # inherits from other things, which in turn use and inherit + # from other things. And suppose, for sake of brevity of + # example, that their ISA tree is the same as: + + @Food::Fishstick::ISA = qw(Food::Fish Life::Fungus Chemicals); + @Food::Fish::ISA = qw(Food); + @Food::ISA = qw(Matter); + @Life::Fungus::ISA = qw(Life); + @Chemicals::ISA = qw(Matter); + @Life::ISA = qw(Matter); + @Matter::ISA = qw(); + + use Class::ISA; + print "Food::Fishstick path is:\n ", + join(", ", Class::ISA::super_path('Food::Fishstick')), + "\n"; + +That prints: + + Food::Fishstick path is: + Food::Fish, Food, Matter, Life::Fungus, Life, Chemicals + +=head1 DESCRIPTION + +Suppose you have a class (like Food::Fish::Fishstick) that is derived, +via its @ISA, from one or more superclasses (as Food::Fish::Fishstick +is from Food::Fish, Life::Fungus, and Chemicals), and some of those +superclasses may themselves each be derived, via its @ISA, from one or +more superclasses (as above). + +When, then, you call a method in that class ($fishstick->calories), +Perl first searches there for that method, but if it's not there, it +goes searching in its superclasses, and so on, in a depth-first (or +maybe "height-first" is the word) search. In the above example, it'd +first look in Food::Fish, then Food, then Matter, then Life::Fungus, +then Life, then Chemicals. + +This library, Class::ISA, provides functions that return that list -- +the list (in order) of names of classes Perl would search to find a +method, with no duplicates. + +=head1 FUNCTIONS + +=over + +=item the function Class::ISA::super_path($CLASS) + +This returns the ordered list of names of classes that Perl would +search thru in order to find a method, with no duplicates in the list. +$CLASS is not included in the list. UNIVERSAL is not included -- if +you need to consider it, add it to the end. + + +=item the function Class::ISA::self_and_super_path($CLASS) + +Just like C<super_path>, except that $CLASS is included as the first +element. + +=item the function Class::ISA::self_and_super_versions($CLASS) + +This returns a hash whose keys are $CLASS and its +(super-)superclasses, and whose values are the contents of each +class's $VERSION (or undef, for classes with no $VERSION). + +The code for self_and_super_versions is meant to serve as an example +for precisely the kind of tasks I anticipate that self_and_super_path +and super_path will be used for. You are strongly advised to read the +source for self_and_super_versions, and the comments there. + +=back + +=head1 CAUTIONARY NOTES + +* Class::ISA doesn't export anything. You have to address the +functions with a "Class::ISA::" on the front. + +* Contrary to its name, Class::ISA isn't a class; it's just a package. +Strange, isn't it? + +* Say you have a loop in the ISA tree of the class you're calling one +of the Class::ISA functions on: say that Food inherits from Matter, +but Matter inherits from Food (for sake of argument). If Perl, while +searching for a method, actually discovers this cyclicity, it will +throw a fatal error. The functions in Class::ISA effectively ignore +this cyclicity; the Class::ISA algorithm is "never go down the same +path twice", and cyclicities are just a special case of that. + +* The Class::ISA functions just look at @ISAs. But theoretically, I +suppose, AUTOLOADs could bypass Perl's ISA-based search mechanism and +do whatever they please. That would be bad behavior, tho; and I try +not to think about that. + +* If Perl can't find a method anywhere in the ISA tree, it then looks +in the magical class UNIVERSAL. This is rarely relevant to the tasks +that I expect Class::ISA functions to be put to, but if it matters to +you, then instead of this: + + @supers = Class::Tree::super_path($class); + +do this: + + @supers = (Class::Tree::super_path($class), 'UNIVERSAL'); + +And don't say no-one ever told ya! + +* When you call them, the Class::ISA functions look at @ISAs anew -- +that is, there is no memoization, and so if ISAs change during +runtime, you get the current ISA tree's path, not anything memoized. +However, changing ISAs at runtime is probably a sign that you're out +of your mind! + +=head1 COPYRIGHT + +Copyright (c) 1999, 2000 Sean M. Burke. All rights reserved. + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 AUTHOR + +Sean M. Burke C<sburke@cpan.org> + +=cut + +########################################################################### + +sub self_and_super_versions { + no strict 'refs'; + map { + $_ => (defined(${"$_\::VERSION"}) ? ${"$_\::VERSION"} : undef) + } self_and_super_path($_[0]) +} + +# Also consider magic like: +# no strict 'refs'; +# my %class2SomeHashr = +# map { defined(%{"$_\::SomeHash"}) ? ($_ => \%{"$_\::SomeHash"}) : () } +# Class::ISA::self_and_super_path($class); +# to get a hash of refs to all the defined (and non-empty) hashes in +# $class and its superclasses. +# +# Or even consider this incantation for doing something like hash-data +# inheritance: +# no strict 'refs'; +# %union_hash = +# map { defined(%{"$_\::SomeHash"}) ? %{"$_\::SomeHash"}) : () } +# reverse(Class::ISA::self_and_super_path($class)); +# Consider that reverse() is necessary because with +# %foo = ('a', 'wun', 'b', 'tiw', 'a', 'foist'); +# $foo{'a'} is 'foist', not 'wun'. + +########################################################################### +sub super_path { + my @ret = &self_and_super_path(@_); + shift @ret if @ret; + return @ret; +} + +#-------------------------------------------------------------------------- +sub self_and_super_path { + # Assumption: searching is depth-first. + # Assumption: '' (empty string) can't be a class package name. + # Note: 'UNIVERSAL' is not given any special treatment. + return () unless @_; + + my @out = (); + + my @in_stack = ($_[0]); + my %seen = ($_[0] => 1); + + my $current; + while(@in_stack) { + next unless defined($current = shift @in_stack) && length($current); + print "At $current\n" if $Debug; + push @out, $current; + no strict 'refs'; + unshift @in_stack, + map + { my $c = $_; # copy, to avoid being destructive + substr($c,0,2) = "main::" if substr($c,0,2) eq '::'; + # Canonize the :: -> main::, ::foo -> main::foo thing. + # Should I ever canonize the Foo'Bar = Foo::Bar thing? + $seen{$c}++ ? () : $c; + } + @{"$current\::ISA"} + ; + # I.e., if this class has any parents (at least, ones I've never seen + # before), push them, in order, onto the stack of classes I need to + # explore. + } + + return @out; +} +#-------------------------------------------------------------------------- +1; + +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Class/Struct.pm b/Master/tlpkg/tlperl.old/lib/Class/Struct.pm new file mode 100644 index 00000000000..7a9af54faf8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Class/Struct.pm @@ -0,0 +1,636 @@ +package Class::Struct; + +## See POD after __END__ + +use 5.006_001; + +use strict; +use warnings::register; +our(@ISA, @EXPORT, $VERSION); + +use Carp; + +require Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(struct); + +$VERSION = '0.63'; + +## Tested on 5.002 and 5.003 without class membership tests: +my $CHECK_CLASS_MEMBERSHIP = ($] >= 5.003_95); + +my $print = 0; +sub printem { + if (@_) { $print = shift } + else { $print++ } +} + +{ + package Class::Struct::Tie_ISA; + + sub TIEARRAY { + my $class = shift; + return bless [], $class; + } + + sub STORE { + my ($self, $index, $value) = @_; + Class::Struct::_subclass_error(); + } + + sub FETCH { + my ($self, $index) = @_; + $self->[$index]; + } + + sub FETCHSIZE { + my $self = shift; + return scalar(@$self); + } + + sub DESTROY { } +} + +sub import { + my $self = shift; + + if ( @_ == 0 ) { + $self->export_to_level( 1, $self, @EXPORT ); + } elsif ( @_ == 1 ) { + # This is admittedly a little bit silly: + # do we ever export anything else than 'struct'...? + $self->export_to_level( 1, $self, @_ ); + } else { + goto &struct; + } +} + +sub struct { + + # Determine parameter list structure, one of: + # struct( class => [ element-list ]) + # struct( class => { element-list }) + # struct( element-list ) + # Latter form assumes current package name as struct name. + + my ($class, @decls); + my $base_type = ref $_[1]; + if ( $base_type eq 'HASH' ) { + $class = shift; + @decls = %{shift()}; + _usage_error() if @_; + } + elsif ( $base_type eq 'ARRAY' ) { + $class = shift; + @decls = @{shift()}; + _usage_error() if @_; + } + else { + $base_type = 'ARRAY'; + $class = (caller())[0]; + @decls = @_; + } + + _usage_error() if @decls % 2 == 1; + + # Ensure we are not, and will not be, a subclass. + + my $isa = do { + no strict 'refs'; + \@{$class . '::ISA'}; + }; + _subclass_error() if @$isa; + tie @$isa, 'Class::Struct::Tie_ISA'; + + # Create constructor. + + croak "function 'new' already defined in package $class" + if do { no strict 'refs'; defined &{$class . "::new"} }; + + my @methods = (); + my %refs = (); + my %arrays = (); + my %hashes = (); + my %classes = (); + my $got_class = 0; + my $out = ''; + + $out = "{\n package $class;\n use Carp;\n sub new {\n"; + $out .= " my (\$class, \%init) = \@_;\n"; + $out .= " \$class = __PACKAGE__ unless \@_;\n"; + + my $cnt = 0; + my $idx = 0; + my( $cmt, $name, $type, $elem ); + + if( $base_type eq 'HASH' ){ + $out .= " my(\$r) = {};\n"; + $cmt = ''; + } + elsif( $base_type eq 'ARRAY' ){ + $out .= " my(\$r) = [];\n"; + } + while( $idx < @decls ){ + $name = $decls[$idx]; + $type = $decls[$idx+1]; + push( @methods, $name ); + if( $base_type eq 'HASH' ){ + $elem = "{'${class}::$name'}"; + } + elsif( $base_type eq 'ARRAY' ){ + $elem = "[$cnt]"; + ++$cnt; + $cmt = " # $name"; + } + if( $type =~ /^\*(.)/ ){ + $refs{$name}++; + $type = $1; + } + my $init = "defined(\$init{'$name'}) ? \$init{'$name'} :"; + if( $type eq '@' ){ + $out .= " croak 'Initializer for $name must be array reference'\n"; + $out .= " if defined(\$init{'$name'}) && ref(\$init{'$name'}) ne 'ARRAY';\n"; + $out .= " \$r->$elem = $init [];$cmt\n"; + $arrays{$name}++; + } + elsif( $type eq '%' ){ + $out .= " croak 'Initializer for $name must be hash reference'\n"; + $out .= " if defined(\$init{'$name'}) && ref(\$init{'$name'}) ne 'HASH';\n"; + $out .= " \$r->$elem = $init {};$cmt\n"; + $hashes{$name}++; + } + elsif ( $type eq '$') { + $out .= " \$r->$elem = $init undef;$cmt\n"; + } + elsif( $type =~ /^\w+(?:::\w+)*$/ ){ + $out .= " if (defined(\$init{'$name'})) {\n"; + $out .= " if (ref \$init{'$name'} eq 'HASH')\n"; + $out .= " { \$r->$elem = $type->new(\%{\$init{'$name'}}) } $cmt\n"; + $out .= " elsif (UNIVERSAL::isa(\$init{'$name'}, '$type'))\n"; + $out .= " { \$r->$elem = \$init{'$name'} } $cmt\n"; + $out .= " else { croak 'Initializer for $name must be hash or $type reference' }\n"; + $out .= " }\n"; + $classes{$name} = $type; + $got_class = 1; + } + else{ + croak "'$type' is not a valid struct element type"; + } + $idx += 2; + } + $out .= " bless \$r, \$class;\n }\n"; + + # Create accessor methods. + + my( $pre, $pst, $sel ); + $cnt = 0; + foreach $name (@methods){ + if ( do { no strict 'refs'; defined &{$class . "::$name"} } ) { + warnings::warnif("function '$name' already defined, overrides struct accessor method"); + } + else { + $pre = $pst = $cmt = $sel = ''; + if( defined $refs{$name} ){ + $pre = "\\("; + $pst = ")"; + $cmt = " # returns ref"; + } + $out .= " sub $name {$cmt\n my \$r = shift;\n"; + if( $base_type eq 'ARRAY' ){ + $elem = "[$cnt]"; + ++$cnt; + } + elsif( $base_type eq 'HASH' ){ + $elem = "{'${class}::$name'}"; + } + if( defined $arrays{$name} ){ + $out .= " my \$i;\n"; + $out .= " \@_ ? (\$i = shift) : return \$r->$elem;\n"; + $out .= " if (ref(\$i) eq 'ARRAY' && !\@_) { \$r->$elem = \$i; return \$r }\n"; + $sel = "->[\$i]"; + } + elsif( defined $hashes{$name} ){ + $out .= " my \$i;\n"; + $out .= " \@_ ? (\$i = shift) : return \$r->$elem;\n"; + $out .= " if (ref(\$i) eq 'HASH' && !\@_) { \$r->$elem = \$i; return \$r }\n"; + $sel = "->{\$i}"; + } + elsif( defined $classes{$name} ){ + if ( $CHECK_CLASS_MEMBERSHIP ) { + $out .= " croak '$name argument is wrong class' if \@_ && ! UNIVERSAL::isa(\$_[0], '$classes{$name}');\n"; + } + } + $out .= " croak 'Too many args to $name' if \@_ > 1;\n"; + $out .= " \@_ ? ($pre\$r->$elem$sel = shift$pst) : $pre\$r->$elem$sel$pst;\n"; + $out .= " }\n"; + } + } + $out .= "}\n1;\n"; + + print $out if $print; + my $result = eval $out; + carp $@ if $@; +} + +sub _usage_error { + confess "struct usage error"; +} + +sub _subclass_error { + croak 'struct class cannot be a subclass (@ISA not allowed)'; +} + +1; # for require + + +__END__ + +=head1 NAME + +Class::Struct - declare struct-like datatypes as Perl classes + +=head1 SYNOPSIS + + use Class::Struct; + # declare struct, based on array: + struct( CLASS_NAME => [ ELEMENT_NAME => ELEMENT_TYPE, ... ]); + # declare struct, based on hash: + struct( CLASS_NAME => { ELEMENT_NAME => ELEMENT_TYPE, ... }); + + package CLASS_NAME; + use Class::Struct; + # declare struct, based on array, implicit class name: + struct( ELEMENT_NAME => ELEMENT_TYPE, ... ); + + # Declare struct at compile time + use Class::Struct CLASS_NAME => [ ELEMENT_NAME => ELEMENT_TYPE, ... ]; + use Class::Struct CLASS_NAME => { ELEMENT_NAME => ELEMENT_TYPE, ... }; + + # declare struct at compile time, based on array, implicit class name: + package CLASS_NAME; + use Class::Struct ELEMENT_NAME => ELEMENT_TYPE, ... ; + + package Myobj; + use Class::Struct; + # declare struct with four types of elements: + struct( s => '$', a => '@', h => '%', c => 'My_Other_Class' ); + + $obj = new Myobj; # constructor + + # scalar type accessor: + $element_value = $obj->s; # element value + $obj->s('new value'); # assign to element + + # array type accessor: + $ary_ref = $obj->a; # reference to whole array + $ary_element_value = $obj->a(2); # array element value + $obj->a(2, 'new value'); # assign to array element + + # hash type accessor: + $hash_ref = $obj->h; # reference to whole hash + $hash_element_value = $obj->h('x'); # hash element value + $obj->h('x', 'new value'); # assign to hash element + + # class type accessor: + $element_value = $obj->c; # object reference + $obj->c->method(...); # call method of object + $obj->c(new My_Other_Class); # assign a new object + +=head1 DESCRIPTION + +C<Class::Struct> exports a single function, C<struct>. +Given a list of element names and types, and optionally +a class name, C<struct> creates a Perl 5 class that implements +a "struct-like" data structure. + +The new class is given a constructor method, C<new>, for creating +struct objects. + +Each element in the struct data has an accessor method, which is +used to assign to the element and to fetch its value. The +default accessor can be overridden by declaring a C<sub> of the +same name in the package. (See Example 2.) + +Each element's type can be scalar, array, hash, or class. + +=head2 The C<struct()> function + +The C<struct> function has three forms of parameter-list. + + struct( CLASS_NAME => [ ELEMENT_LIST ]); + struct( CLASS_NAME => { ELEMENT_LIST }); + struct( ELEMENT_LIST ); + +The first and second forms explicitly identify the name of the +class being created. The third form assumes the current package +name as the class name. + +An object of a class created by the first and third forms is +based on an array, whereas an object of a class created by the +second form is based on a hash. The array-based forms will be +somewhat faster and smaller; the hash-based forms are more +flexible. + +The class created by C<struct> must not be a subclass of another +class other than C<UNIVERSAL>. + +It can, however, be used as a superclass for other classes. To facilitate +this, the generated constructor method uses a two-argument blessing. +Furthermore, if the class is hash-based, the key of each element is +prefixed with the class name (see I<Perl Cookbook>, Recipe 13.12). + +A function named C<new> must not be explicitly defined in a class +created by C<struct>. + +The I<ELEMENT_LIST> has the form + + NAME => TYPE, ... + +Each name-type pair declares one element of the struct. Each +element name will be defined as an accessor method unless a +method by that name is explicitly defined; in the latter case, a +warning is issued if the warning flag (B<-w>) is set. + +=head2 Class Creation at Compile Time + +C<Class::Struct> can create your class at compile time. The main reason +for doing this is obvious, so your class acts like every other class in +Perl. Creating your class at compile time will make the order of events +similar to using any other class ( or Perl module ). + +There is no significant speed gain between compile time and run time +class creation, there is just a new, more standard order of events. + +=head2 Element Types and Accessor Methods + +The four element types -- scalar, array, hash, and class -- are +represented by strings -- C<'$'>, C<'@'>, C<'%'>, and a class name -- +optionally preceded by a C<'*'>. + +The accessor method provided by C<struct> for an element depends +on the declared type of the element. + +=over 4 + +=item Scalar (C<'$'> or C<'*$'>) + +The element is a scalar, and by default is initialized to C<undef> +(but see L<Initializing with new>). + +The accessor's argument, if any, is assigned to the element. + +If the element type is C<'$'>, the value of the element (after +assignment) is returned. If the element type is C<'*$'>, a reference +to the element is returned. + +=item Array (C<'@'> or C<'*@'>) + +The element is an array, initialized by default to C<()>. + +With no argument, the accessor returns a reference to the +element's whole array (whether or not the element was +specified as C<'@'> or C<'*@'>). + +With one or two arguments, the first argument is an index +specifying one element of the array; the second argument, if +present, is assigned to the array element. If the element type +is C<'@'>, the accessor returns the array element value. If the +element type is C<'*@'>, a reference to the array element is +returned. + +As a special case, when the accessor is called with an array reference +as the sole argument, this causes an assignment of the whole array element. +The object reference is returned. + +=item Hash (C<'%'> or C<'*%'>) + +The element is a hash, initialized by default to C<()>. + +With no argument, the accessor returns a reference to the +element's whole hash (whether or not the element was +specified as C<'%'> or C<'*%'>). + +With one or two arguments, the first argument is a key specifying +one element of the hash; the second argument, if present, is +assigned to the hash element. If the element type is C<'%'>, the +accessor returns the hash element value. If the element type is +C<'*%'>, a reference to the hash element is returned. + +As a special case, when the accessor is called with a hash reference +as the sole argument, this causes an assignment of the whole hash element. +The object reference is returned. + +=item Class (C<'Class_Name'> or C<'*Class_Name'>) + +The element's value must be a reference blessed to the named +class or to one of its subclasses. The element is not initialized +by default. + +The accessor's argument, if any, is assigned to the element. The +accessor will C<croak> if this is not an appropriate object +reference. + +If the element type does not start with a C<'*'>, the accessor +returns the element value (after assignment). If the element type +starts with a C<'*'>, a reference to the element itself is returned. + +=back + +=head2 Initializing with C<new> + +C<struct> always creates a constructor called C<new>. That constructor +may take a list of initializers for the various elements of the new +struct. + +Each initializer is a pair of values: I<element name>C< =E<gt> >I<value>. +The initializer value for a scalar element is just a scalar value. The +initializer for an array element is an array reference. The initializer +for a hash is a hash reference. + +The initializer for a class element is an object of the corresponding class, +or of one of it's subclasses, or a reference to a hash containing named +arguments to be passed to the element's constructor. + +See Example 3 below for an example of initialization. + +=head1 EXAMPLES + +=over 4 + +=item Example 1 + +Giving a struct element a class type that is also a struct is how +structs are nested. Here, C<Timeval> represents a time (seconds and +microseconds), and C<Rusage> has two elements, each of which is of +type C<Timeval>. + + use Class::Struct; + + struct( Rusage => { + ru_utime => 'Timeval', # user time used + ru_stime => 'Timeval', # system time used + }); + + struct( Timeval => [ + tv_secs => '$', # seconds + tv_usecs => '$', # microseconds + ]); + + # create an object: + my $t = Rusage->new(ru_utime=>Timeval->new(), ru_stime=>Timeval->new()); + + # $t->ru_utime and $t->ru_stime are objects of type Timeval. + # set $t->ru_utime to 100.0 sec and $t->ru_stime to 5.0 sec. + $t->ru_utime->tv_secs(100); + $t->ru_utime->tv_usecs(0); + $t->ru_stime->tv_secs(5); + $t->ru_stime->tv_usecs(0); + +=item Example 2 + +An accessor function can be redefined in order to provide +additional checking of values, etc. Here, we want the C<count> +element always to be nonnegative, so we redefine the C<count> +accessor accordingly. + + package MyObj; + use Class::Struct; + + # declare the struct + struct ( 'MyObj', { count => '$', stuff => '%' } ); + + # override the default accessor method for 'count' + sub count { + my $self = shift; + if ( @_ ) { + die 'count must be nonnegative' if $_[0] < 0; + $self->{'MyObj::count'} = shift; + warn "Too many args to count" if @_; + } + return $self->{'MyObj::count'}; + } + + package main; + $x = new MyObj; + print "\$x->count(5) = ", $x->count(5), "\n"; + # prints '$x->count(5) = 5' + + print "\$x->count = ", $x->count, "\n"; + # prints '$x->count = 5' + + print "\$x->count(-5) = ", $x->count(-5), "\n"; + # dies due to negative argument! + +=item Example 3 + +The constructor of a generated class can be passed a list +of I<element>=>I<value> pairs, with which to initialize the struct. +If no initializer is specified for a particular element, its default +initialization is performed instead. Initializers for non-existent +elements are silently ignored. + +Note that the initializer for a nested class may be specified as +an object of that class, or as a reference to a hash of initializers +that are passed on to the nested struct's constructor. + + use Class::Struct; + + struct Breed => + { + name => '$', + cross => '$', + }; + + struct Cat => + [ + name => '$', + kittens => '@', + markings => '%', + breed => 'Breed', + ]; + + + my $cat = Cat->new( name => 'Socks', + kittens => ['Monica', 'Kenneth'], + markings => { socks=>1, blaze=>"white" }, + breed => Breed->new(name=>'short-hair', cross=>1), + or: breed => {name=>'short-hair', cross=>1}, + ); + + print "Once a cat called ", $cat->name, "\n"; + print "(which was a ", $cat->breed->name, ")\n"; + print "had two kittens: ", join(' and ', @{$cat->kittens}), "\n"; + +=back + +=head1 Author and Modification History + +Modified by Damian Conway, 2001-09-10, v0.62. + + Modified implicit construction of nested objects. + Now will also take an object ref instead of requiring a hash ref. + Also default initializes nested object attributes to undef, rather + than calling object constructor without args + Original over-helpfulness was fraught with problems: + * the class's constructor might not be called 'new' + * the class might not have a hash-like-arguments constructor + * the class might not have a no-argument constructor + * "recursive" data structures didn't work well: + package Person; + struct { mother => 'Person', father => 'Person'}; + + +Modified by Casey West, 2000-11-08, v0.59. + + Added the ability for compile time class creation. + +Modified by Damian Conway, 1999-03-05, v0.58. + + Added handling of hash-like arg list to class ctor. + + Changed to two-argument blessing in ctor to support + derivation from created classes. + + Added classname prefixes to keys in hash-based classes + (refer to "Perl Cookbook", Recipe 13.12 for rationale). + + Corrected behaviour of accessors for '*@' and '*%' struct + elements. Package now implements documented behaviour when + returning a reference to an entire hash or array element. + Previously these were returned as a reference to a reference + to the element. + +Renamed to C<Class::Struct> and modified by Jim Miner, 1997-04-02. + + members() function removed. + Documentation corrected and extended. + Use of struct() in a subclass prohibited. + User definition of accessor allowed. + Treatment of '*' in element types corrected. + Treatment of classes as element types corrected. + Class name to struct() made optional. + Diagnostic checks added. + +Originally C<Class::Template> by Dean Roehrich. + + # Template.pm --- struct/member template builder + # 12mar95 + # Dean Roehrich + # + # changes/bugs fixed since 28nov94 version: + # - podified + # changes/bugs fixed since 21nov94 version: + # - Fixed examples. + # changes/bugs fixed since 02sep94 version: + # - Moved to Class::Template. + # changes/bugs fixed since 20feb94 version: + # - Updated to be a more proper module. + # - Added "use strict". + # - Bug in build_methods, was using @var when @$var needed. + # - Now using my() rather than local(). + # + # Uses perl5 classes to create nested data types. + # This is offered as one implementation of Tom Christiansen's "structs.pl" + # idea. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Config.pm b/Master/tlpkg/tlperl.old/lib/Config.pm new file mode 100644 index 00000000000..7e5ad77b30a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Config.pm @@ -0,0 +1,95 @@ +# This file was created by configpm when Perl was built. Any changes +# made to this file will be lost the next time perl is built. + +package Config; +use strict; +# use warnings; Pulls in Carp +# use vars pulls in Carp +@Config::EXPORT = qw(%Config); +@Config::EXPORT_OK = qw(myconfig config_sh config_vars config_re); + +# Need to stub all the functions to make code such as print Config::config_sh +# keep working + +sub myconfig; +sub config_sh; +sub config_vars; +sub config_re; + +my %Export_Cache = map {($_ => 1)} (@Config::EXPORT, @Config::EXPORT_OK); + +our %Config; + +# Define our own import method to avoid pulling in the full Exporter: +sub import { + my $pkg = shift; + @_ = @Config::EXPORT unless @_; + + my @funcs = grep $_ ne '%Config', @_; + my $export_Config = @funcs < @_ ? 1 : 0; + + no strict 'refs'; + my $callpkg = caller(0); + foreach my $func (@funcs) { + die sprintf qq{"%s" is not exported by the %s module\n}, + $func, __PACKAGE__ unless $Export_Cache{$func}; + *{$callpkg.'::'.$func} = \&{$func}; + } + + *{"$callpkg\::Config"} = \%Config if $export_Config; + return; +} + +die "Perl lib version (v5.8.8) doesn't match executable version ($])" + unless $^V; + +$^V eq v5.8.8 + or die "Perl lib version (v5.8.8) doesn't match executable version (" . + sprintf("v%vd",$^V) . ")"; + + +sub FETCH { + my($self, $key) = @_; + + # check for cached value (which may be undef so we use exists not defined) + return $self->{$key} if exists $self->{$key}; + + return $self->fetch_string($key); +} +sub TIEHASH { + bless $_[1], $_[0]; +} + +sub DESTROY { } + +sub AUTOLOAD { + require 'Config_heavy.pl'; + goto \&launcher unless $Config::AUTOLOAD =~ /launcher$/; + die "&Config::AUTOLOAD failed on $Config::AUTOLOAD"; +} + +# tie returns the object, so the value returned to require will be true. +tie %Config, 'Config', { + archlibexp => 'x:\\perl\\lib', + archname => 'MSWin32-x86-multi-thread', + cc => 'gcc', + d_readlink => undef, + d_symlink => undef, + dlsrc => 'dl_win32.xs', + dont_use_nlink => undef, + exe_ext => '.exe', + inc_version_list => '', + intsize => '4', + ldlibpthname => '', + libpth => 'x:\\msys\\mingw\\lib', + osname => 'MSWin32', + osvers => '5.1', + path_sep => ';', + privlibexp => 'x:\\perl\\lib', + scriptdir => 'x:\\perl\\bin', + sitearchexp => 'x:\\perl\\site\\lib', + sitelibexp => 'x:\\perl\\site\\lib', + useithreads => 'define', + usevendorprefix => undef, + version => '5.8.8', +}; diff --git a/Master/tlpkg/tlperl.old/lib/Config_heavy.pl b/Master/tlpkg/tlperl.old/lib/Config_heavy.pl new file mode 100644 index 00000000000..919d4637cf2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Config_heavy.pl @@ -0,0 +1,1185 @@ +# This file was created by configpm when Perl was built. Any changes +# made to this file will be lost the next time perl is built. + +package Config; +use strict; +# use warnings; Pulls in Carp +# use vars pulls in Carp +### Configured by: siepo@xpeco +### Target system: WIN32 + +our $summary = <<'!END!'; +Summary of my $package (revision $revision $version_patchlevel_string) configuration: + Platform: + osname=$osname, osvers=$osvers, archname=$archname + uname='$myuname' + config_args='$config_args' + hint=$hint, useposix=$useposix, d_sigaction=$d_sigaction + usethreads=$usethreads use5005threads=$use5005threads useithreads=$useithreads usemultiplicity=$usemultiplicity + useperlio=$useperlio d_sfio=$d_sfio uselargefiles=$uselargefiles usesocks=$usesocks + use64bitint=$use64bitint use64bitall=$use64bitall uselongdouble=$uselongdouble + usemymalloc=$usemymalloc, bincompat5005=undef + Compiler: + cc='$cc', ccflags ='$ccflags', + optimize='$optimize', + cppflags='$cppflags' + ccversion='$ccversion', gccversion='$gccversion', gccosandvers='$gccosandvers' + intsize=$intsize, longsize=$longsize, ptrsize=$ptrsize, doublesize=$doublesize, byteorder=$byteorder + d_longlong=$d_longlong, longlongsize=$longlongsize, d_longdbl=$d_longdbl, longdblsize=$longdblsize + ivtype='$ivtype', ivsize=$ivsize, nvtype='$nvtype', nvsize=$nvsize, Off_t='$lseektype', lseeksize=$lseeksize + alignbytes=$alignbytes, prototype=$prototype + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth + libs=$libs + perllibs=$perllibs + libc=$libc, so=$so, useshrplib=$useshrplib, libperl=$libperl + gnulibc_version='$gnulibc_version' + Dynamic Linking: + dlsrc=$dlsrc, dlext=$dlext, d_dlsymun=$d_dlsymun, ccdlflags='$ccdlflags' + cccdlflags='$cccdlflags', lddlflags='$lddlflags' + +!END! +my $summary_expanded; + +sub myconfig { + return $summary_expanded if $summary_expanded; + ($summary_expanded = $summary) =~ s{\$(\w+)} + { my $c = $Config::Config{$1}; defined($c) ? $c : 'undef' }ge; + $summary_expanded; +} + +local *_ = \my $a; +$_ = <<'!END!'; +Author='' +CONFIG='true' +Date='$Date' +Header='' +Id='$Id' +Locker='' +Log='$Log' +Mcc='Mcc' +PATCHLEVEL='8' +PERL_API_REVISION='5' +PERL_API_SUBVERSION='0' +PERL_API_VERSION='8' +PERL_CONFIG_SH='true' +PERL_PATCHLEVEL='8' +PERL_REVISION='5' +PERL_SUBVERSION='8' +PERL_VERSION='8' +RCSfile='$RCSfile' +Revision='$Revision' +SUBVERSION='8' +Source='' +State='' +_a='.a' +_exe='.exe' +_o='.o' +afs='false' +afsroot='/afs' +alignbytes='8' +ansi2knr='' +aphostname='' +api_revision='5' +api_subversion='0' +api_version='8' +api_versionstring='5.8.0' +ar='ar' +archlib='x:\perl\lib' +archlibexp='x:\perl\lib' +archname64='' +archname='MSWin32-x86-multi-thread' +archobjs='' +asctime_r_proto='0' +awk='awk' +baserev='5' +bash='' +bin='x:\perl\bin' +binexp='x:\perl\bin' +bison='' +byacc='byacc' +byteorder='1234' +c='' +castflags='0' +cat='type' +cc='gcc' +cccdlflags=' ' +ccdlflags=' ' +ccflags=' -s -O2 -DWIN32 -DHAVE_DES_FCRYPT -DPERL_IMPLICIT_CONTEXT -fno-strict-aliasing -DPERL_MSVCRT_READFIX' +ccflags_uselargefiles='' +ccname='gcc' +ccsymbols='' +ccversion='' +cf_by='siepo' +cf_email='siepo@xpeco' +cf_time='Sun May 27 17:53:00 2007' +charsize='1' +chgrp='' +chmod='' +chown='' +clocktype='clock_t' +comm='' +compress='' +contains='grep' +cp='copy' +cpio='' +cpp='gcc -E' +cpp_stuff='42' +cppccsymbols='' +cppflags='-DWIN32' +cpplast='' +cppminus='-' +cpprun='gcc -E' +cppstdin='gcc -E' +cppsymbols='' +crypt_r_proto='0' +cryptlib='' +csh='undef' +ctermid_r_proto='0' +ctime_r_proto='0' +d_Gconvert='sprintf((b),"%.*g",(n),(x))' +d_PRIEUldbl='undef' +d_PRIFUldbl='undef' +d_PRIGUldbl='undef' +d_PRIXU64='undef' +d_PRId64='undef' +d_PRIeldbl='undef' +d_PRIfldbl='undef' +d_PRIgldbl='undef' +d_PRIi64='undef' +d_PRIo64='undef' +d_PRIu64='undef' +d_PRIx64='undef' +d_SCNfldbl='undef' +d__fwalk='undef' +d_access='define' +d_accessx='undef' +d_aintl='undef' +d_alarm='define' +d_archlib='define' +d_asctime_r='undef' +d_atolf='undef' +d_atoll='undef' +d_attribute_format='undef' +d_attribute_malloc='undef' +d_attribute_nonnull='undef' +d_attribute_noreturn='undef' +d_attribute_pure='undef' +d_attribute_unused='undef' +d_attribute_warn_unused_result='undef' +d_bcmp='undef' +d_bcopy='undef' +d_bsd='define' +d_bsdgetpgrp='undef' +d_bsdsetpgrp='undef' +d_bzero='undef' +d_casti32='define' +d_castneg='define' +d_charvspr='undef' +d_chown='undef' +d_chroot='undef' +d_chsize='define' +d_class='undef' +d_clearenv='undef' +d_closedir='define' +d_cmsghdr_s='undef' +d_const='define' +d_copysignl='undef' +d_crypt='define' +d_crypt_r='undef' +d_csh='undef' +d_ctermid_r='undef' +d_ctime_r='undef' +d_cuserid='undef' +d_dbl_dig='define' +d_dbminitproto='undef' +d_difftime='define' +d_dirfd='undef' +d_dirnamlen='define' +d_dlerror='define' +d_dlopen='define' +d_dlsymun='undef' +d_dosuid='undef' +d_drand48_r='undef' +d_drand48proto='undef' +d_dup2='define' +d_eaccess='undef' +d_endgrent='undef' +d_endgrent_r='undef' +d_endhent='undef' +d_endhostent_r='undef' +d_endnent='undef' +d_endnetent_r='undef' +d_endpent='undef' +d_endprotoent_r='undef' +d_endpwent='undef' +d_endpwent_r='undef' +d_endsent='undef' +d_endservent_r='undef' +d_eofnblk='define' +d_eunice='undef' +d_faststdio='define' +d_fchdir='undef' +d_fchmod='undef' +d_fchown='undef' +d_fcntl='undef' +d_fcntl_can_lock='undef' +d_fd_macros='define' +d_fd_set='define' +d_fds_bits='define' +d_fgetpos='define' +d_finite='undef' +d_finitel='undef' +d_flexfnam='define' +d_flock='define' +d_flockproto='define' +d_fork='undef' +d_fp_class='undef' +d_fpathconf='undef' +d_fpclass='undef' +d_fpclassify='undef' +d_fpclassl='undef' +d_fpos64_t='undef' +d_frexpl='undef' +d_fs_data_s='undef' +d_fseeko='undef' +d_fsetpos='define' +d_fstatfs='undef' +d_fstatvfs='undef' +d_fsync='undef' +d_ftello='undef' +d_ftime='define' +d_futimes='undef' +d_getcwd='define' +d_getespwnam='undef' +d_getfsstat='undef' +d_getgrent='undef' +d_getgrent_r='undef' +d_getgrgid_r='undef' +d_getgrnam_r='undef' +d_getgrps='undef' +d_gethbyaddr='define' +d_gethbyname='define' +d_gethent='undef' +d_gethname='define' +d_gethostbyaddr_r='undef' +d_gethostbyname_r='undef' +d_gethostent_r='undef' +d_gethostprotos='define' +d_getitimer='undef' +d_getlogin='define' +d_getlogin_r='undef' +d_getmnt='undef' +d_getmntent='undef' +d_getnbyaddr='undef' +d_getnbyname='undef' +d_getnent='undef' +d_getnetbyaddr_r='undef' +d_getnetbyname_r='undef' +d_getnetent_r='undef' +d_getnetprotos='undef' +d_getpagsz='undef' +d_getpbyname='define' +d_getpbynumber='define' +d_getpent='undef' +d_getpgid='undef' +d_getpgrp2='undef' +d_getpgrp='undef' +d_getppid='undef' +d_getprior='undef' +d_getprotobyname_r='undef' +d_getprotobynumber_r='undef' +d_getprotoent_r='undef' +d_getprotoprotos='define' +d_getprpwnam='undef' +d_getpwent='undef' +d_getpwent_r='undef' +d_getpwnam_r='undef' +d_getpwuid_r='undef' +d_getsbyname='define' +d_getsbyport='define' +d_getsent='undef' +d_getservbyname_r='undef' +d_getservbyport_r='undef' +d_getservent_r='undef' +d_getservprotos='define' +d_getspnam='undef' +d_getspnam_r='undef' +d_gettimeod='define' +d_gmtime_r='undef' +d_gnulibc='undef' +d_grpasswd='undef' +d_hasmntopt='undef' +d_htonl='define' +d_ilogbl='undef' +d_index='undef' +d_inetaton='undef' +d_int64_t='undef' +d_isascii='define' +d_isfinite='undef' +d_isinf='undef' +d_isnan='define' +d_isnanl='undef' +d_killpg='undef' +d_lchown='undef' +d_ldbl_dig='define' +d_libm_lib_version='undef' +d_link='define' +d_localtime_r='undef' +d_locconv='define' +d_lockf='undef' +d_longdbl='define' +d_longlong='undef' +d_lseekproto='define' +d_lstat='undef' +d_madvise='undef' +d_malloc_good_size='undef' +d_malloc_size='undef' +d_mblen='define' +d_mbstowcs='define' +d_mbtowc='define' +d_memchr='define' +d_memcmp='define' +d_memcpy='define' +d_memmove='define' +d_memset='define' +d_mkdir='define' +d_mkdtemp='undef' +d_mkfifo='undef' +d_mkstemp='undef' +d_mkstemps='undef' +d_mktime='define' +d_mmap='undef' +d_modfl='undef' +d_modfl_pow32_bug='undef' +d_modflproto='undef' +d_mprotect='undef' +d_msg='undef' +d_msg_ctrunc='undef' +d_msg_dontroute='undef' +d_msg_oob='undef' +d_msg_peek='undef' +d_msg_proxy='undef' +d_msgctl='undef' +d_msgget='undef' +d_msghdr_s='undef' +d_msgrcv='undef' +d_msgsnd='undef' +d_msync='undef' +d_munmap='undef' +d_mymalloc='undef' +d_nice='undef' +d_nl_langinfo='undef' +d_nv_preserves_uv='define' +d_nv_zero_is_allbits_zero='define' +d_off64_t='undef' +d_old_pthread_create_joinable='undef' +d_oldpthreads='undef' +d_oldsock='undef' +d_open3='undef' +d_pathconf='undef' +d_pause='define' +d_perl_otherlibdirs='undef' +d_phostname='undef' +d_pipe='define' +d_poll='undef' +d_portable='define' +d_procselfexe='undef' +d_pthread_atfork='undef' +d_pthread_attr_setscope='undef' +d_pthread_yield='undef' +d_pwage='undef' +d_pwchange='undef' +d_pwclass='undef' +d_pwcomment='undef' +d_pwexpire='undef' +d_pwgecos='undef' +d_pwpasswd='undef' +d_pwquota='undef' +d_qgcvt='undef' +d_quad='undef' +d_random_r='undef' +d_readdir64_r='undef' +d_readdir='define' +d_readdir_r='undef' +d_readlink='undef' +d_readv='undef' +d_recvmsg='undef' +d_rename='define' +d_rewinddir='define' +d_rmdir='define' +d_safebcpy='undef' +d_safemcpy='undef' +d_sanemcmp='define' +d_sbrkproto='undef' +d_scalbnl='undef' +d_sched_yield='undef' +d_scm_rights='undef' +d_seekdir='define' +d_select='define' +d_sem='undef' +d_semctl='undef' +d_semctl_semid_ds='undef' +d_semctl_semun='undef' +d_semget='undef' +d_semop='undef' +d_sendmsg='undef' +d_setegid='undef' +d_seteuid='undef' +d_setgrent='undef' +d_setgrent_r='undef' +d_setgrps='undef' +d_sethent='undef' +d_sethostent_r='undef' +d_setitimer='undef' +d_setlinebuf='undef' +d_setlocale='define' +d_setlocale_r='undef' +d_setnent='undef' +d_setnetent_r='undef' +d_setpent='undef' +d_setpgid='undef' +d_setpgrp2='undef' +d_setpgrp='undef' +d_setprior='undef' +d_setproctitle='undef' +d_setprotoent_r='undef' +d_setpwent='undef' +d_setpwent_r='undef' +d_setregid='undef' +d_setresgid='undef' +d_setresuid='undef' +d_setreuid='undef' +d_setrgid='undef' +d_setruid='undef' +d_setsent='undef' +d_setservent_r='undef' +d_setsid='undef' +d_setvbuf='define' +d_sfio='undef' +d_shm='undef' +d_shmat='undef' +d_shmatprototype='undef' +d_shmctl='undef' +d_shmdt='undef' +d_shmget='undef' +d_sigaction='undef' +d_sigprocmask='undef' +d_sigsetjmp='undef' +d_sockatmark='undef' +d_sockatmarkproto='undef' +d_socket='define' +d_socklen_t='undef' +d_sockpair='undef' +d_socks5_init='undef' +d_sprintf_returns_strlen='define' +d_sqrtl='undef' +d_srand48_r='undef' +d_srandom_r='undef' +d_sresgproto='undef' +d_sresuproto='undef' +d_statblks='undef' +d_statfs_f_flags='undef' +d_statfs_s='undef' +d_statvfs='undef' +d_stdio_cnt_lval='define' +d_stdio_ptr_lval='define' +d_stdio_ptr_lval_nochange_cnt='define' +d_stdio_ptr_lval_sets_cnt='undef' +d_stdio_stream_array='undef' +d_stdiobase='define' +d_stdstdio='define' +d_strchr='define' +d_strcoll='define' +d_strctcpy='define' +d_strerrm='strerror(e)' +d_strerror='define' +d_strerror_r='undef' +d_strftime='define' +d_strlcat='undef' +d_strlcpy='undef' +d_strtod='define' +d_strtol='define' +d_strtold='undef' +d_strtoll='undef' +d_strtoq='undef' +d_strtoul='define' +d_strtoull='undef' +d_strtouq='undef' +d_strxfrm='define' +d_suidsafe='undef' +d_symlink='undef' +d_syscall='undef' +d_syscallproto='undef' +d_sysconf='undef' +d_sysernlst='' +d_syserrlst='define' +d_system='define' +d_tcgetpgrp='undef' +d_tcsetpgrp='undef' +d_telldir='define' +d_telldirproto='define' +d_time='define' +d_times='define' +d_tm_tm_gmtoff='undef' +d_tm_tm_zone='undef' +d_tmpnam_r='undef' +d_truncate='undef' +d_ttyname_r='undef' +d_tzname='define' +d_u32align='define' +d_ualarm='undef' +d_umask='define' +d_uname='define' +d_union_semun='define' +d_unordered='undef' +d_unsetenv='undef' +d_usleep='undef' +d_usleepproto='undef' +d_ustat='undef' +d_vendorarch='undef' +d_vendorbin='undef' +d_vendorlib='undef' +d_vendorscript='undef' +d_vfork='undef' +d_void_closedir='undef' +d_voidsig='define' +d_voidtty='' +d_volatile='define' +d_vprintf='define' +d_wait4='undef' +d_waitpid='define' +d_wcstombs='define' +d_wctomb='define' +d_writev='undef' +d_xenix='undef' +date='date' +db_hashtype='int' +db_prefixtype='int' +db_version_major='0' +db_version_minor='0' +db_version_patch='0' +defvoidused='15' +direntrytype='struct direct' +dlext='dll' +dlsrc='dl_win32.xs' +doublesize='8' +drand01='(rand()/(double)((unsigned)1<<RANDBITS))' +drand48_r_proto='0' +dynamic_ext='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call IO List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared' +eagain='EAGAIN' +ebcdic='undef' +echo='echo' +egrep='egrep' +emacs='' +endgrent_r_proto='0' +endhostent_r_proto='0' +endnetent_r_proto='0' +endprotoent_r_proto='0' +endpwent_r_proto='0' +endservent_r_proto='0' +eunicefix=':' +exe_ext='.exe' +expr='expr' +extensions='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Errno Fcntl File/Glob Filter/Util/Call IO List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared' +extras='' +fflushNULL='define' +fflushall='undef' +find='find' +firstmakefile='makefile' +flex='' +fpossize='8' +fpostype='fpos_t' +freetype='void' +from=':' +full_ar='' +full_csh='' +full_sed='' +gccansipedantic='' +gccosandvers='' +gccversion='3.4.5' +getgrent_r_proto='0' +getgrgid_r_proto='0' +getgrnam_r_proto='0' +gethostbyaddr_r_proto='0' +gethostbyname_r_proto='0' +gethostent_r_proto='0' +getlogin_r_proto='0' +getnetbyaddr_r_proto='0' +getnetbyname_r_proto='0' +getnetent_r_proto='0' +getprotobyname_r_proto='0' +getprotobynumber_r_proto='0' +getprotoent_r_proto='0' +getpwent_r_proto='0' +getpwnam_r_proto='0' +getpwuid_r_proto='0' +getservbyname_r_proto='0' +getservbyport_r_proto='0' +getservent_r_proto='0' +getspnam_r_proto='0' +gidformat='"ld"' +gidsign='-1' +gidsize='4' +gidtype='gid_t' +glibpth='/usr/shlib /lib/pa1.1 /usr/lib/large /lib /usr/lib /usr/lib/386 /lib/386 /lib/large /usr/lib/small /lib/small /usr/ccs/lib /usr/ucblib /usr/shlib ' +gmake='gmake' +gmtime_r_proto='0' +gnulibc_version='' +grep='grep' +groupcat='' +groupstype='gid_t' +gzip='gzip' +h_fcntl='false' +h_sysfile='true' +hint='recommended' +hostcat='ypcat hosts' +html1dir=' ' +html1direxp='' +html3dir=' ' +html3direxp='' +i16size='2' +i16type='short' +i32size='4' +i32type='long' +i64size='8' +i64type='long long' +i8size='1' +i8type='char' +i_arpainet='define' +i_bsdioctl='' +i_crypt='undef' +i_db='undef' +i_dbm='undef' +i_dirent='define' +i_dld='undef' +i_dlfcn='define' +i_fcntl='define' +i_float='define' +i_fp='undef' +i_fp_class='undef' +i_gdbm='undef' +i_grp='undef' +i_ieeefp='undef' +i_inttypes='undef' +i_langinfo='undef' +i_libutil='undef' +i_limits='define' +i_locale='define' +i_machcthr='undef' +i_malloc='define' +i_math='define' +i_memory='undef' +i_mntent='undef' +i_ndbm='undef' +i_netdb='undef' +i_neterrno='undef' +i_netinettcp='undef' +i_niin='undef' +i_poll='undef' +i_prot='undef' +i_pthread='undef' +i_pwd='undef' +i_rpcsvcdbm='define' +i_sfio='undef' +i_sgtty='undef' +i_shadow='undef' +i_socks='undef' +i_stdarg='define' +i_stddef='define' +i_stdlib='define' +i_string='define' +i_sunmath='undef' +i_sysaccess='undef' +i_sysdir='undef' +i_sysfile='undef' +i_sysfilio='define' +i_sysin='undef' +i_sysioctl='undef' +i_syslog='undef' +i_sysmman='undef' +i_sysmode='undef' +i_sysmount='undef' +i_sysndir='undef' +i_sysparam='undef' +i_sysresrc='undef' +i_syssecrt='undef' +i_sysselct='undef' +i_syssockio='undef' +i_sysstat='define' +i_sysstatfs='undef' +i_sysstatvfs='undef' +i_systime='undef' +i_systimek='undef' +i_systimes='undef' +i_systypes='define' +i_sysuio='undef' +i_sysun='undef' +i_sysutsname='undef' +i_sysvfs='undef' +i_syswait='undef' +i_termio='undef' +i_termios='undef' +i_time='define' +i_unistd='undef' +i_ustat='undef' +i_utime='define' +i_values='undef' +i_varargs='undef' +i_varhdr='varargs.h' +i_vfork='undef' +ignore_versioned_solibs='' +inc_version_list='' +inc_version_list_init='0' +incpath='x:\msys\mingw\include' +inews='' +installarchlib='x:\perl\lib' +installbin='x:\perl\bin' +installhtml1dir='' +installhtml3dir='' +installhtmldir='x:\perl\html' +installhtmlhelpdir='x:\perl\htmlhelp' +installman1dir='x:\perl\man\man1' +installman3dir='x:\perl\man\man3' +installprefix='x:\perl' +installprefixexp='x:\perl' +installprivlib='x:\perl\lib' +installscript='x:\perl\bin' +installsitearch='x:\perl\site\lib' +installsitebin='x:\perl\bin' +installsitehtml1dir='' +installsitehtml3dir='' +installsitelib='x:\perl\site\lib' +installsiteman1dir='' +installsiteman3dir='' +installsitescript='' +installstyle='lib' +installusrbinperl='undef' +installvendorarch='' +installvendorbin='' +installvendorhtml1dir='' +installvendorhtml3dir='' +installvendorlib='' +installvendorman1dir='' +installvendorman3dir='' +installvendorscript='' +intsize='4' +issymlink='' +ivdformat='"ld"' +ivsize='4' +ivtype='long' +known_extensions='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 NDBM_File ODBM_File Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Thread Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared' +ksh='' +ld='g++' +lddlflags='-mdll -s -L"x:\perl\lib\CORE" -L"x:\msys\mingw\lib"' +ldflags='-s -L"x:\perl\lib\CORE" -L"x:\msys\mingw\lib"' +ldflags_uselargefiles='' +ldlibpthname='' +less='less' +lib_ext='.a' +libc='-lmsvcrt' +libperl='libperl58.a' +libpth='x:\msys\mingw\lib' +libs=' -lmsvcrt -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32' +libsdirs='' +libsfiles='' +libsfound='' +libspath='' +libswanted='net socket inet nsl nm ndbm gdbm dbm db malloc dl dld ld sun m c cposix posix ndir dir crypt ucb bsd BSD PW x' +libswanted_uselargefiles='net socket inet nsl nm ndbm gdbm dbm db malloc dl dld ld sun m c cposix posix ndir dir crypt ucb bsd BSD PW x' +line='line' +lint='' +lkflags='' +ln='' +lns='copy' +localtime_r_proto='0' +locincpth='/usr/local/include /opt/local/include /usr/gnu/include /opt/gnu/include /usr/GNU/include /opt/GNU/include' +loclibpth='/usr/local/lib /opt/local/lib /usr/gnu/lib /opt/gnu/lib /usr/GNU/lib /opt/GNU/lib' +longdblsize='12' +longlongsize='8' +longsize='4' +lp='' +lpr='' +ls='dir' +lseeksize='8' +lseektype='long long' +mail='' +mailx='' +make='dmake' +make_set_make='#' +mallocobj='malloc.o' +mallocsrc='malloc.c' +malloctype='void *' +man1dir='x:\perl\man\man1' +man1direxp='x:\perl\man\man1' +man1ext='1' +man3dir='x:\perl\man\man3' +man3direxp='x:\perl\man\man3' +man3ext='3' +mips_type='' +mistrustnm='' +mkdir='mkdir' +mmaptype='void *' +modetype='mode_t' +more='more /e' +multiarch='undef' +mv='' +myarchname='MSWin32' +mydomain='' +myhostname='' +myuname='' +n='-n' +need_va_copy='undef' +netdb_hlen_type='int' +netdb_host_type='char *' +netdb_name_type='char *' +netdb_net_type='long' +nm='nm' +nm_opt='' +nm_so_opt='' +nonxs_ext='Errno' +nroff='' +nvEUformat='"E"' +nvFUformat='"F"' +nvGUformat='"G"' +nv_preserves_uv_bits='32' +nveformat='"e"' +nvfformat='"f"' +nvgformat='"g"' +nvsize='8' +nvtype='double' +o_nonblock='O_NONBLOCK' +obj_ext='.o' +old_pthread_create_joinable='' +optimize='-s -O2' +orderlib='false' +osname='MSWin32' +osvers='5.1' +otherlibdirs='' +package='perl5' +pager='more /e' +passcat='' +patchlevel='' +path_sep=';' +perl5='' +perl='perl' +perl_patchlevel='' +perladmin='' +perllibs=' -lmsvcrt -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32' +perlpath='x:\perl\bin\perl.exe' +pg='' +phostname='hostname' +pidtype='int' +plibpth='' +pmake='' +pr='' +prefix='x:\perl' +prefixexp='x:\perl' +privlib='x:\perl\lib' +privlibexp='x:\perl\lib' +procselfexe='' +prototype='define' +ptrsize='4' +quadkind='5' +quadtype='long long' +randbits='15' +randfunc='rand' +random_r_proto='0' +randseedtype='unsigned' +ranlib='rem' +rd_nodata='-1' +readdir64_r_proto='0' +readdir_r_proto='0' +revision='5' +rm='del' +rmail='' +run='' +runnm='true' +sPRIEUldbl='"E"' +sPRIFUldbl='"F"' +sPRIGUldbl='"G"' +sPRIXU64='"lX"' +sPRId64='"ld"' +sPRIeldbl='"e"' +sPRIfldbl='"f"' +sPRIgldbl='"g"' +sPRIi64='"li"' +sPRIo64='"lo"' +sPRIu64='"lu"' +sPRIx64='"lx"' +sSCNfldbl='"f"' +sched_yield='' +scriptdir='x:\perl\bin' +scriptdirexp='x:\perl\bin' +sed='sed' +seedfunc='srand' +selectminbits='32' +selecttype='Perl_fd_set *' +sendmail='blat' +setgrent_r_proto='0' +sethostent_r_proto='0' +setlocale_r_proto='0' +setnetent_r_proto='0' +setprotoent_r_proto='0' +setpwent_r_proto='0' +setservent_r_proto='0' +sh='cmd /x /c' +shar='' +sharpbang='#!' +shmattype='void *' +shortsize='2' +shrpenv='' +shsharp='true' +sig_count='26' +sig_name='ZERO HUP INT QUIT ILL NUM05 NUM06 NUM07 FPE KILL NUM10 SEGV NUM12 PIPE ALRM TERM NUM16 NUM17 NUM18 NUM19 CHLD BREAK ABRT STOP NUM24 CONT CLD' +sig_name_init='"ZERO", "HUP", "INT", "QUIT", "ILL", "NUM05", "NUM06", "NUM07", "FPE", "KILL", "NUM10", "SEGV", "NUM12", "PIPE", "ALRM", "TERM", "NUM16", "NUM17", "NUM18", "NUM19", "CHLD", "BREAK", "ABRT", "STOP", "NUM24", "CONT", "CLD", 0' +sig_num='0 1 2 21 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 20' +sig_num_init='0, 1, 2, 21, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 20, 0' +sig_size='27' +signal_t='void' +sitearch='x:\perl\site\lib' +sitearchexp='x:\perl\site\lib' +sitebin='x:\perl\site\bin' +sitebinexp='x:\perl\site\bin' +sitehtml1dir='' +sitehtml1direxp='' +sitehtml3dir='' +sitehtml3direxp='' +sitelib='x:\perl\site\lib' +sitelib_stem='' +sitelibexp='x:\perl\site\lib' +siteman1dir='' +siteman1direxp='' +siteman3dir='' +siteman3direxp='' +siteprefix='x:\perl\site' +siteprefixexp='x:\perl\site' +sitescript='' +sitescriptexp='' +sizesize='4' +sizetype='size_t' +sleep='' +smail='' +so='dll' +sockethdr='' +socketlib='' +socksizetype='int' +sort='sort' +spackage='Perl5' +spitshell='' +srand48_r_proto='0' +srandom_r_proto='0' +src='' +ssizetype='int' +startperl='#!perl' +startsh='#!/bin/sh' +static_ext=' ' +stdchar='char' +stdio_base='((fp)->_base)' +stdio_bufsiz='((fp)->_cnt + (fp)->_ptr - (fp)->_base)' +stdio_cnt='((fp)->_cnt)' +stdio_filbuf='' +stdio_ptr='((fp)->_ptr)' +stdio_stream_array='' +strerror_r_proto='0' +strings='/usr/include/string.h' +submit='' +subversion='' +sysman='/usr/man/man1' +tail='' +tar='' +targetarch='' +tbl='' +tee='' +test='' +timeincl='/usr/include/sys/time.h ' +timetype='time_t' +tmpnam_r_proto='0' +to=':' +touch='touch' +tr='' +trnl='\012' +troff='' +ttyname_r_proto='0' +u16size='2' +u16type='unsigned short' +u32size='4' +u32type='unsigned long' +u64size='8' +u64type='unsigned long long' +u8size='1' +u8type='unsigned char' +uidformat='"ld"' +uidsign='-1' +uidsize='4' +uidtype='uid_t' +uname='uname' +uniq='uniq' +uquadtype='unsigned long long' +use5005threads='undef' +use64bitall='undef' +use64bitint='undef' +usecrosscompile='undef' +usedl='define' +usefaststdio='define' +useithreads='define' +uselargefiles='define' +uselongdouble='undef' +usemallocwrap='define' +usemorebits='undef' +usemultiplicity='define' +usemymalloc='n' +usenm='false' +useopcode='true' +useperlio='define' +useposix='true' +usereentrant='undef' +userelocatableinc='undef' +usesfio='false' +useshrplib='yes' +usesitecustomize='undef' +usesocks='undef' +usethreads='define' +usevendorprefix='undef' +usevfork='false' +usrinc='/usr/include' +uuname='' +uvXUformat='"lX"' +uvoformat='"lo"' +uvsize='4' +uvtype='unsigned long' +uvuformat='"lu"' +uvxformat='"lx"' +vendorarch='' +vendorarchexp='' +vendorbin='' +vendorbinexp='' +vendorhtml1dir=' ' +vendorhtml1direxp='' +vendorhtml3dir=' ' +vendorhtml3direxp='' +vendorlib='' +vendorlib_stem='' +vendorlibexp='' +vendorman1dir=' ' +vendorman1direxp='' +vendorman3dir=' ' +vendorman3direxp='' +vendorprefix='' +vendorprefixexp='' +vendorscript='' +vendorscriptexp='' +version='5.8.8' +version_patchlevel_string='version 8 subversion 8' +versiononly='undef' +vi='' +voidflags='15' +xlibpth='/usr/lib/386 /lib/386' +yacc='yacc' +yaccflags='' +zcat='' +zip='zip' +!END! + +my $i = 0; +foreach my $c (4,3,2) { $i |= ord($c); $i <<= 8 } +$i |= ord(1); +our $byteorder = join('', unpack('aaaa', pack('L!', $i))); +s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m; + +my $config_sh_len = length $_; + +our $Config_SH_expanded = "\n$_" . << 'EOVIRTUAL'; +ccflags_nolargefiles=' -s -O2 -DWIN32 -DHAVE_DES_FCRYPT -DPERL_IMPLICIT_CONTEXT -fno-strict-aliasing -DPERL_MSVCRT_READFIX' +ldflags_nolargefiles='-s -L"x:\perl\lib\CORE" -L"x:\msys\mingw\lib"' +libs_nolargefiles='-lmsvcrt -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32' +libswanted_nolargefiles='' +EOVIRTUAL + +# Search for it in the big string +sub fetch_string { + my($self, $key) = @_; + + # We only have ' delimted. + my $start = index($Config_SH_expanded, "\n$key=\'"); + # Start can never be -1 now, as we've rigged the long string we're + # searching with an initial dummy newline. + return undef if $start == -1; + + $start += length($key) + 3; + + my $value = substr($Config_SH_expanded, $start, + index($Config_SH_expanded, "'\n", $start) + - $start); + # So we can say "if $Config{'foo'}". + $value = undef if $value eq 'undef'; + $self->{$key} = $value; # cache it +} + +my $prevpos = 0; + +sub FIRSTKEY { + $prevpos = 0; + substr($Config_SH_expanded, 1, index($Config_SH_expanded, '=') - 1 ); +} + +sub NEXTKEY { + my $pos = index($Config_SH_expanded, qq('\n), $prevpos) + 2; + my $len = index($Config_SH_expanded, "=", $pos) - $pos; + $prevpos = $pos; + $len > 0 ? substr($Config_SH_expanded, $pos, $len) : undef; +} + +sub EXISTS { + return 1 if exists($_[0]->{$_[1]}); + + return(index($Config_SH_expanded, "\n$_[1]='") != -1 + ); +} + +sub STORE { die "\%Config::Config is read-only\n" } +*DELETE = \&STORE; +*CLEAR = \&STORE; + + +sub config_sh { + substr $Config_SH_expanded, 1, $config_sh_len; +} + +sub config_re { + my $re = shift; + return map { chomp; $_ } grep eval{ /^(?:$re)=/ }, split /^/, + $Config_SH_expanded; +} + +sub config_vars { + # implements -V:cfgvar option (see perlrun -V:) + foreach (@_) { + # find optional leading, trailing colons; and query-spec + my ($notag,$qry,$lncont) = m/^(:)?(.*?)(:)?$/; # flags fore and aft, + # map colon-flags to print decorations + my $prfx = $notag ? '': "$qry="; # tag-prefix for print + my $lnend = $lncont ? ' ' : ";\n"; # line ending for print + + # all config-vars are by definition \w only, any \W means regex + if ($qry =~ /\W/) { + my @matches = config_re($qry); + print map "$_$lnend", @matches ? @matches : "$qry: not found" if !$notag; + print map { s/\w+=//; "$_$lnend" } @matches ? @matches : "$qry: not found" if $notag; + } else { + my $v = (exists $Config::Config{$qry}) ? $Config::Config{$qry} + : 'UNKNOWN'; + $v = 'undef' unless defined $v; + print "${prfx}'${v}'$lnend"; + } + } +} + +# Called by the real AUTOLOAD +sub launcher { + undef &AUTOLOAD; + goto \&$Config::AUTOLOAD; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Cwd.pm b/Master/tlpkg/tlperl.old/lib/Cwd.pm new file mode 100644 index 00000000000..8d25af9f7cd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Cwd.pm @@ -0,0 +1,710 @@ +package Cwd; + +=head1 NAME + +Cwd - get pathname of current working directory + +=head1 SYNOPSIS + + use Cwd; + my $dir = getcwd; + + use Cwd 'abs_path'; + my $abs_path = abs_path($file); + +=head1 DESCRIPTION + +This module provides functions for determining the pathname of the +current working directory. It is recommended that getcwd (or another +*cwd() function) be used in I<all> code to ensure portability. + +By default, it exports the functions cwd(), getcwd(), fastcwd(), and +fastgetcwd() (and, on Win32, getdcwd()) into the caller's namespace. + + +=head2 getcwd and friends + +Each of these functions are called without arguments and return the +absolute path of the current working directory. + +=over 4 + +=item getcwd + + my $cwd = getcwd(); + +Returns the current working directory. + +Re-implements the getcwd(3) (or getwd(3)) functions in Perl. + +=item cwd + + my $cwd = cwd(); + +The cwd() is the most natural form for the current architecture. For +most systems it is identical to `pwd` (but without the trailing line +terminator). + +=item fastcwd + + my $cwd = fastcwd(); + +A more dangerous version of getcwd(), but potentially faster. + +It might conceivably chdir() you out of a directory that it can't +chdir() you back into. If fastcwd encounters a problem it will return +undef but will probably leave you in a different directory. For a +measure of extra security, if everything appears to have worked, the +fastcwd() function will check that it leaves you in the same directory +that it started in. If it has changed it will C<die> with the message +"Unstable directory path, current directory changed +unexpectedly". That should never happen. + +=item fastgetcwd + + my $cwd = fastgetcwd(); + +The fastgetcwd() function is provided as a synonym for cwd(). + +=item getdcwd + + my $cwd = getdcwd(); + my $cwd = getdcwd('C:'); + +The getdcwd() function is also provided on Win32 to get the current working +directory on the specified drive, since Windows maintains a separate current +working directory for each drive. If no drive is specified then the current +drive is assumed. + +This function simply calls the Microsoft C library _getdcwd() function. + +=back + + +=head2 abs_path and friends + +These functions are exported only on request. They each take a single +argument and return the absolute pathname for it. If no argument is +given they'll use the current working directory. + +=over 4 + +=item abs_path + + my $abs_path = abs_path($file); + +Uses the same algorithm as getcwd(). Symbolic links and relative-path +components ("." and "..") are resolved to return the canonical +pathname, just like realpath(3). + +=item realpath + + my $abs_path = realpath($file); + +A synonym for abs_path(). + +=item fast_abs_path + + my $abs_path = fast_abs_path($file); + +A more dangerous, but potentially faster version of abs_path. + +=back + +=head2 $ENV{PWD} + +If you ask to override your chdir() built-in function, + + use Cwd qw(chdir); + +then your PWD environment variable will be kept up to date. Note that +it will only be kept up to date if all packages which use chdir import +it from Cwd. + + +=head1 NOTES + +=over 4 + +=item * + +Since the path seperators are different on some operating systems ('/' +on Unix, ':' on MacPerl, etc...) we recommend you use the File::Spec +modules wherever portability is a concern. + +=item * + +Actually, on Mac OS, the C<getcwd()>, C<fastgetcwd()> and C<fastcwd()> +functions are all aliases for the C<cwd()> function, which, on Mac OS, +calls `pwd`. Likewise, the C<abs_path()> function is an alias for +C<fast_abs_path()>. + +=back + +=head1 AUTHOR + +Originally by the perl5-porters. + +Maintained by Ken Williams <KWILLIAMS@cpan.org> + +=head1 COPYRIGHT + +Copyright (c) 2004 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +Portions of the C code in this library are copyright (c) 1994 by the +Regents of the University of California. All rights reserved. The +license on this code is compatible with the licensing of the rest of +the distribution - please see the source code in F<Cwd.xs> for the +details. + +=head1 SEE ALSO + +L<File::chdir> + +=cut + +use strict; +use Exporter; +use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION); + +$VERSION = '3.12'; + +@ISA = qw/ Exporter /; +@EXPORT = qw(cwd getcwd fastcwd fastgetcwd); +push @EXPORT, qw(getdcwd) if $^O eq 'MSWin32'; +@EXPORT_OK = qw(chdir abs_path fast_abs_path realpath fast_realpath); + +# sys_cwd may keep the builtin command + +# All the functionality of this module may provided by builtins, +# there is no sense to process the rest of the file. +# The best choice may be to have this in BEGIN, but how to return from BEGIN? + +if ($^O eq 'os2') { + local $^W = 0; + + *cwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd; + *getcwd = \&cwd; + *fastgetcwd = \&cwd; + *fastcwd = \&cwd; + + *fast_abs_path = \&sys_abspath if defined &sys_abspath; + *abs_path = \&fast_abs_path; + *realpath = \&fast_abs_path; + *fast_realpath = \&fast_abs_path; + + return 1; +} + +# If loading the XS stuff doesn't work, we can fall back to pure perl +eval { + if ( $] >= 5.006 ) { + require XSLoader; + XSLoader::load( __PACKAGE__, $VERSION ); + } else { + require DynaLoader; + push @ISA, 'DynaLoader'; + __PACKAGE__->bootstrap( $VERSION ); + } +}; + +# Must be after the DynaLoader stuff: +$VERSION = eval $VERSION; + +# Big nasty table of function aliases +my %METHOD_MAP = + ( + VMS => + { + cwd => '_vms_cwd', + getcwd => '_vms_cwd', + fastcwd => '_vms_cwd', + fastgetcwd => '_vms_cwd', + abs_path => '_vms_abs_path', + fast_abs_path => '_vms_abs_path', + }, + + MSWin32 => + { + # We assume that &_NT_cwd is defined as an XSUB or in the core. + cwd => '_NT_cwd', + getcwd => '_NT_cwd', + fastcwd => '_NT_cwd', + fastgetcwd => '_NT_cwd', + abs_path => 'fast_abs_path', + realpath => 'fast_abs_path', + }, + + dos => + { + cwd => '_dos_cwd', + getcwd => '_dos_cwd', + fastgetcwd => '_dos_cwd', + fastcwd => '_dos_cwd', + abs_path => 'fast_abs_path', + }, + + qnx => + { + cwd => '_qnx_cwd', + getcwd => '_qnx_cwd', + fastgetcwd => '_qnx_cwd', + fastcwd => '_qnx_cwd', + abs_path => '_qnx_abs_path', + fast_abs_path => '_qnx_abs_path', + }, + + cygwin => + { + getcwd => 'cwd', + fastgetcwd => 'cwd', + fastcwd => 'cwd', + abs_path => 'fast_abs_path', + realpath => 'fast_abs_path', + }, + + epoc => + { + cwd => '_epoc_cwd', + getcwd => '_epoc_cwd', + fastgetcwd => '_epoc_cwd', + fastcwd => '_epoc_cwd', + abs_path => 'fast_abs_path', + }, + + MacOS => + { + getcwd => 'cwd', + fastgetcwd => 'cwd', + fastcwd => 'cwd', + abs_path => 'fast_abs_path', + }, + ); + +$METHOD_MAP{NT} = $METHOD_MAP{MSWin32}; +$METHOD_MAP{nto} = $METHOD_MAP{qnx}; + + +# Find the pwd command in the expected locations. We assume these +# are safe. This prevents _backtick_pwd() consulting $ENV{PATH} +# so everything works under taint mode. +my $pwd_cmd; +foreach my $try ('/bin/pwd', + '/usr/bin/pwd', + '/QOpenSys/bin/pwd', # OS/400 PASE. + ) { + + if( -x $try ) { + $pwd_cmd = $try; + last; + } +} +unless ($pwd_cmd) { + # Isn't this wrong? _backtick_pwd() will fail if somenone has + # pwd in their path but it is not /bin/pwd or /usr/bin/pwd? + # See [perl #16774]. --jhi + $pwd_cmd = 'pwd'; +} + +# Lazy-load Carp +sub _carp { require Carp; Carp::carp(@_) } +sub _croak { require Carp; Carp::croak(@_) } + +# The 'natural and safe form' for UNIX (pwd may be setuid root) +sub _backtick_pwd { + # Localize %ENV entries in a way that won't create new hash keys + my @localize = grep exists $ENV{$_}, qw(PATH IFS CDPATH ENV BASH_ENV); + local @ENV{@localize}; + + my $cwd = `$pwd_cmd`; + # Belt-and-suspenders in case someone said "undef $/". + local $/ = "\n"; + # `pwd` may fail e.g. if the disk is full + chomp($cwd) if defined $cwd; + $cwd; +} + +# Since some ports may predefine cwd internally (e.g., NT) +# we take care not to override an existing definition for cwd(). + +unless ($METHOD_MAP{$^O}{cwd} or defined &cwd) { + # The pwd command is not available in some chroot(2)'ed environments + my $sep = $Config::Config{path_sep} || ':'; + my $os = $^O; # Protect $^O from tainting + if( $os eq 'MacOS' || (defined $ENV{PATH} && + $os ne 'MSWin32' && # no pwd on Windows + grep { -x "$_/pwd" } split($sep, $ENV{PATH})) ) + { + *cwd = \&_backtick_pwd; + } + else { + *cwd = \&getcwd; + } +} + +# set a reasonable (and very safe) default for fastgetcwd, in case it +# isn't redefined later (20001212 rspier) +*fastgetcwd = \&cwd; + +# By Brandon S. Allbery +# +# Usage: $cwd = getcwd(); + +sub getcwd +{ + abs_path('.'); +} + + +# By John Bazik +# +# Usage: $cwd = &fastcwd; +# +# This is a faster version of getcwd. It's also more dangerous because +# you might chdir out of a directory that you can't chdir back into. + +sub fastcwd_ { + my($odev, $oino, $cdev, $cino, $tdev, $tino); + my(@path, $path); + local(*DIR); + + my($orig_cdev, $orig_cino) = stat('.'); + ($cdev, $cino) = ($orig_cdev, $orig_cino); + for (;;) { + my $direntry; + ($odev, $oino) = ($cdev, $cino); + CORE::chdir('..') || return undef; + ($cdev, $cino) = stat('.'); + last if $odev == $cdev && $oino == $cino; + opendir(DIR, '.') || return undef; + for (;;) { + $direntry = readdir(DIR); + last unless defined $direntry; + next if $direntry eq '.'; + next if $direntry eq '..'; + + ($tdev, $tino) = lstat($direntry); + last unless $tdev != $odev || $tino != $oino; + } + closedir(DIR); + return undef unless defined $direntry; # should never happen + unshift(@path, $direntry); + } + $path = '/' . join('/', @path); + if ($^O eq 'apollo') { $path = "/".$path; } + # At this point $path may be tainted (if tainting) and chdir would fail. + # Untaint it then check that we landed where we started. + $path =~ /^(.*)\z/s # untaint + && CORE::chdir($1) or return undef; + ($cdev, $cino) = stat('.'); + die "Unstable directory path, current directory changed unexpectedly" + if $cdev != $orig_cdev || $cino != $orig_cino; + $path; +} +if (not defined &fastcwd) { *fastcwd = \&fastcwd_ } + + +# Keeps track of current working directory in PWD environment var +# Usage: +# use Cwd 'chdir'; +# chdir $newdir; + +my $chdir_init = 0; + +sub chdir_init { + if ($ENV{'PWD'} and $^O ne 'os2' and $^O ne 'dos' and $^O ne 'MSWin32') { + my($dd,$di) = stat('.'); + my($pd,$pi) = stat($ENV{'PWD'}); + if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) { + $ENV{'PWD'} = cwd(); + } + } + else { + my $wd = cwd(); + $wd = Win32::GetFullPathName($wd) if $^O eq 'MSWin32'; + $ENV{'PWD'} = $wd; + } + # Strip an automounter prefix (where /tmp_mnt/foo/bar == /foo/bar) + if ($^O ne 'MSWin32' and $ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|s) { + my($pd,$pi) = stat($2); + my($dd,$di) = stat($1); + if (defined $pd and defined $dd and $di == $pi and $dd == $pd) { + $ENV{'PWD'}="$2$3"; + } + } + $chdir_init = 1; +} + +sub chdir { + my $newdir = @_ ? shift : ''; # allow for no arg (chdir to HOME dir) + $newdir =~ s|///*|/|g unless $^O eq 'MSWin32'; + chdir_init() unless $chdir_init; + my $newpwd; + if ($^O eq 'MSWin32') { + # get the full path name *before* the chdir() + $newpwd = Win32::GetFullPathName($newdir); + } + + return 0 unless CORE::chdir $newdir; + + if ($^O eq 'VMS') { + return $ENV{'PWD'} = $ENV{'DEFAULT'} + } + elsif ($^O eq 'MacOS') { + return $ENV{'PWD'} = cwd(); + } + elsif ($^O eq 'MSWin32') { + $ENV{'PWD'} = $newpwd; + return 1; + } + + if ($newdir =~ m#^/#s) { + $ENV{'PWD'} = $newdir; + } else { + my @curdir = split(m#/#,$ENV{'PWD'}); + @curdir = ('') unless @curdir; + my $component; + foreach $component (split(m#/#, $newdir)) { + next if $component eq '.'; + pop(@curdir),next if $component eq '..'; + push(@curdir,$component); + } + $ENV{'PWD'} = join('/',@curdir) || '/'; + } + 1; +} + + +sub _perl_abs_path +{ + my $start = @_ ? shift : '.'; + my($dotdots, $cwd, @pst, @cst, $dir, @tst); + + unless (@cst = stat( $start )) + { + _carp("stat($start): $!"); + return ''; + } + + unless (-d _) { + # Make sure we can be invoked on plain files, not just directories. + # NOTE that this routine assumes that '/' is the only directory separator. + + my ($dir, $file) = $start =~ m{^(.*)/(.+)$} + or return cwd() . '/' . $start; + + # Can't use "-l _" here, because the previous stat was a stat(), not an lstat(). + if (-l $start) { + my $link_target = readlink($start); + die "Can't resolve link $start: $!" unless defined $link_target; + + require File::Spec; + $link_target = $dir . '/' . $link_target + unless File::Spec->file_name_is_absolute($link_target); + + return abs_path($link_target); + } + + return $dir ? abs_path($dir) . "/$file" : "/$file"; + } + + $cwd = ''; + $dotdots = $start; + do + { + $dotdots .= '/..'; + @pst = @cst; + local *PARENT; + unless (opendir(PARENT, $dotdots)) + { + _carp("opendir($dotdots): $!"); + return ''; + } + unless (@cst = stat($dotdots)) + { + _carp("stat($dotdots): $!"); + closedir(PARENT); + return ''; + } + if ($pst[0] == $cst[0] && $pst[1] == $cst[1]) + { + $dir = undef; + } + else + { + do + { + unless (defined ($dir = readdir(PARENT))) + { + _carp("readdir($dotdots): $!"); + closedir(PARENT); + return ''; + } + $tst[0] = $pst[0]+1 unless (@tst = lstat("$dotdots/$dir")) + } + while ($dir eq '.' || $dir eq '..' || $tst[0] != $pst[0] || + $tst[1] != $pst[1]); + } + $cwd = (defined $dir ? "$dir" : "" ) . "/$cwd" ; + closedir(PARENT); + } while (defined $dir); + chop($cwd) unless $cwd eq '/'; # drop the trailing / + $cwd; +} + + +my $Curdir; +sub fast_abs_path { + local $ENV{PWD} = $ENV{PWD} || ''; # Guard against clobberage + my $cwd = getcwd(); + require File::Spec; + my $path = @_ ? shift : ($Curdir ||= File::Spec->curdir); + + # Detaint else we'll explode in taint mode. This is safe because + # we're not doing anything dangerous with it. + ($path) = $path =~ /(.*)/; + ($cwd) = $cwd =~ /(.*)/; + + unless (-e $path) { + _croak("$path: No such file or directory"); + } + + unless (-d _) { + # Make sure we can be invoked on plain files, not just directories. + + my ($vol, $dir, $file) = File::Spec->splitpath($path); + return File::Spec->catfile($cwd, $path) unless length $dir; + + if (-l $path) { + my $link_target = readlink($path); + die "Can't resolve link $path: $!" unless defined $link_target; + + $link_target = File::Spec->catpath($vol, $dir, $link_target) + unless File::Spec->file_name_is_absolute($link_target); + + return fast_abs_path($link_target); + } + + return $dir eq File::Spec->rootdir + ? File::Spec->catpath($vol, $dir, $file) + : fast_abs_path(File::Spec->catpath($vol, $dir, '')) . '/' . $file; + } + + if (!CORE::chdir($path)) { + _croak("Cannot chdir to $path: $!"); + } + my $realpath = getcwd(); + if (! ((-d $cwd) && (CORE::chdir($cwd)))) { + _croak("Cannot chdir back to $cwd: $!"); + } + $realpath; +} + +# added function alias to follow principle of least surprise +# based on previous aliasing. --tchrist 27-Jan-00 +*fast_realpath = \&fast_abs_path; + + +# --- PORTING SECTION --- + +# VMS: $ENV{'DEFAULT'} points to default directory at all times +# 06-Mar-1996 Charles Bailey bailey@newman.upenn.edu +# Note: Use of Cwd::chdir() causes the logical name PWD to be defined +# in the process logical name table as the default device and directory +# seen by Perl. This may not be the same as the default device +# and directory seen by DCL after Perl exits, since the effects +# the CRTL chdir() function persist only until Perl exits. + +sub _vms_cwd { + return $ENV{'DEFAULT'}; +} + +sub _vms_abs_path { + return $ENV{'DEFAULT'} unless @_; + + # may need to turn foo.dir into [.foo] + my $path = VMS::Filespec::pathify($_[0]); + $path = $_[0] unless defined $path; + + return VMS::Filespec::rmsexpand($path); +} + +sub _os2_cwd { + $ENV{'PWD'} = `cmd /c cd`; + chomp $ENV{'PWD'}; + $ENV{'PWD'} =~ s:\\:/:g ; + return $ENV{'PWD'}; +} + +sub _win32_cwd { + $ENV{'PWD'} = Win32::GetCwd(); + $ENV{'PWD'} =~ s:\\:/:g ; + return $ENV{'PWD'}; +} + +*_NT_cwd = defined &Win32::GetCwd ? \&_win32_cwd : \&_os2_cwd; + +sub _dos_cwd { + if (!defined &Dos::GetCwd) { + $ENV{'PWD'} = `command /c cd`; + chomp $ENV{'PWD'}; + $ENV{'PWD'} =~ s:\\:/:g ; + } else { + $ENV{'PWD'} = Dos::GetCwd(); + } + return $ENV{'PWD'}; +} + +sub _qnx_cwd { + local $ENV{PATH} = ''; + local $ENV{CDPATH} = ''; + local $ENV{ENV} = ''; + $ENV{'PWD'} = `/usr/bin/fullpath -t`; + chomp $ENV{'PWD'}; + return $ENV{'PWD'}; +} + +sub _qnx_abs_path { + local $ENV{PATH} = ''; + local $ENV{CDPATH} = ''; + local $ENV{ENV} = ''; + my $path = @_ ? shift : '.'; + local *REALPATH; + + defined( open(REALPATH, '-|') || exec '/usr/bin/fullpath', '-t', $path ) or + die "Can't open /usr/bin/fullpath: $!"; + my $realpath = <REALPATH>; + close REALPATH; + chomp $realpath; + return $realpath; +} + +sub _epoc_cwd { + $ENV{'PWD'} = EPOC::getcwd(); + return $ENV{'PWD'}; +} + + +# Now that all the base-level functions are set up, alias the +# user-level functions to the right places + +if (exists $METHOD_MAP{$^O}) { + my $map = $METHOD_MAP{$^O}; + foreach my $name (keys %$map) { + local $^W = 0; # assignments trigger 'subroutine redefined' warning + no strict 'refs'; + *{$name} = \&{$map->{$name}}; + } +} + +# In case the XS version doesn't load. +*abs_path = \&_perl_abs_path unless defined &abs_path; + +# added function alias for those of us more +# used to the libc function. --tchrist 27-Jan-00 +*realpath = \&abs_path; + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Data/Dumper.pm b/Master/tlpkg/tlperl.old/lib/Data/Dumper.pm new file mode 100644 index 00000000000..b7fe1d61e77 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Data/Dumper.pm @@ -0,0 +1,1264 @@ +# +# Data/Dumper.pm +# +# convert perl data structures into perl syntax suitable for both printing +# and eval +# +# Documentation at the __END__ +# + +package Data::Dumper; + +$VERSION = '2.121_08'; + +#$| = 1; + +use 5.006_001; +require Exporter; +require overload; + +use Carp; + +BEGIN { + @ISA = qw(Exporter); + @EXPORT = qw(Dumper); + @EXPORT_OK = qw(DumperX); + + # if run under miniperl, or otherwise lacking dynamic loading, + # XSLoader should be attempted to load, or the pure perl flag + # toggled on load failure. + eval { + require XSLoader; + }; + $Useperl = 1 if $@; +} + +XSLoader::load( 'Data::Dumper' ) unless $Useperl; + +# module vars and their defaults +$Indent = 2 unless defined $Indent; +$Purity = 0 unless defined $Purity; +$Pad = "" unless defined $Pad; +$Varname = "VAR" unless defined $Varname; +$Useqq = 0 unless defined $Useqq; +$Terse = 0 unless defined $Terse; +$Freezer = "" unless defined $Freezer; +$Toaster = "" unless defined $Toaster; +$Deepcopy = 0 unless defined $Deepcopy; +$Quotekeys = 1 unless defined $Quotekeys; +$Bless = "bless" unless defined $Bless; +#$Expdepth = 0 unless defined $Expdepth; +$Maxdepth = 0 unless defined $Maxdepth; +$Pair = ' => ' unless defined $Pair; +$Useperl = 0 unless defined $Useperl; +$Sortkeys = 0 unless defined $Sortkeys; +$Deparse = 0 unless defined $Deparse; + +# +# expects an arrayref of values to be dumped. +# can optionally pass an arrayref of names for the values. +# names must have leading $ sign stripped. begin the name with * +# to cause output of arrays and hashes rather than refs. +# +sub new { + my($c, $v, $n) = @_; + + croak "Usage: PACKAGE->new(ARRAYREF, [ARRAYREF])" + unless (defined($v) && (ref($v) eq 'ARRAY')); + $n = [] unless (defined($n) && (ref($v) eq 'ARRAY')); + + my($s) = { + level => 0, # current recursive depth + indent => $Indent, # various styles of indenting + pad => $Pad, # all lines prefixed by this string + xpad => "", # padding-per-level + apad => "", # added padding for hash keys n such + sep => "", # list separator + pair => $Pair, # hash key/value separator: defaults to ' => ' + seen => {}, # local (nested) refs (id => [name, val]) + todump => $v, # values to dump [] + names => $n, # optional names for values [] + varname => $Varname, # prefix to use for tagging nameless ones + purity => $Purity, # degree to which output is evalable + useqq => $Useqq, # use "" for strings (backslashitis ensues) + terse => $Terse, # avoid name output (where feasible) + freezer => $Freezer, # name of Freezer method for objects + toaster => $Toaster, # name of method to revive objects + deepcopy => $Deepcopy, # dont cross-ref, except to stop recursion + quotekeys => $Quotekeys, # quote hash keys + 'bless' => $Bless, # keyword to use for "bless" +# expdepth => $Expdepth, # cutoff depth for explicit dumping + maxdepth => $Maxdepth, # depth beyond which we give up + useperl => $Useperl, # use the pure Perl implementation + sortkeys => $Sortkeys, # flag or filter for sorting hash keys + deparse => $Deparse, # use B::Deparse for coderefs + }; + + if ($Indent > 0) { + $s->{xpad} = " "; + $s->{sep} = "\n"; + } + return bless($s, $c); +} + +sub init_refaddr_format { + require Config; + my $f = $Config::Config{uvxformat}; + $f =~ tr/"//d; + our $refaddr_format = "0x%" . $f; +} + +sub format_refaddr { + require Scalar::Util; + sprintf our $refaddr_format, Scalar::Util::refaddr(shift); +} + +# +# add-to or query the table of already seen references +# +sub Seen { + my($s, $g) = @_; + if (defined($g) && (ref($g) eq 'HASH')) { + my($k, $v, $id); + while (($k, $v) = each %$g) { + if (defined $v and ref $v) { + $id = format_refaddr($v); + if ($k =~ /^[*](.*)$/) { + $k = (ref $v eq 'ARRAY') ? ( "\\\@" . $1 ) : + (ref $v eq 'HASH') ? ( "\\\%" . $1 ) : + (ref $v eq 'CODE') ? ( "\\\&" . $1 ) : + ( "\$" . $1 ) ; + } + elsif ($k !~ /^\$/) { + $k = "\$" . $k; + } + $s->{seen}{$id} = [$k, $v]; + } + else { + carp "Only refs supported, ignoring non-ref item \$$k"; + } + } + return $s; + } + else { + return map { @$_ } values %{$s->{seen}}; + } +} + +# +# set or query the values to be dumped +# +sub Values { + my($s, $v) = @_; + if (defined($v) && (ref($v) eq 'ARRAY')) { + $s->{todump} = [@$v]; # make a copy + return $s; + } + else { + return @{$s->{todump}}; + } +} + +# +# set or query the names of the values to be dumped +# +sub Names { + my($s, $n) = @_; + if (defined($n) && (ref($n) eq 'ARRAY')) { + $s->{names} = [@$n]; # make a copy + return $s; + } + else { + return @{$s->{names}}; + } +} + +sub DESTROY {} + +sub Dump { + return &Dumpxs + unless $Data::Dumper::Useperl || (ref($_[0]) && $_[0]->{useperl}) || + $Data::Dumper::Useqq || (ref($_[0]) && $_[0]->{useqq}) || + $Data::Dumper::Deparse || (ref($_[0]) && $_[0]->{deparse}); + return &Dumpperl; +} + +# +# dump the refs in the current dumper object. +# expects same args as new() if called via package name. +# +sub Dumpperl { + my($s) = shift; + my(@out, $val, $name); + my($i) = 0; + local(@post); + init_refaddr_format(); + + $s = $s->new(@_) unless ref $s; + + for $val (@{$s->{todump}}) { + my $out = ""; + @post = (); + $name = $s->{names}[$i++]; + if (defined $name) { + if ($name =~ /^[*](.*)$/) { + if (defined $val) { + $name = (ref $val eq 'ARRAY') ? ( "\@" . $1 ) : + (ref $val eq 'HASH') ? ( "\%" . $1 ) : + (ref $val eq 'CODE') ? ( "\*" . $1 ) : + ( "\$" . $1 ) ; + } + else { + $name = "\$" . $1; + } + } + elsif ($name !~ /^\$/) { + $name = "\$" . $name; + } + } + else { + $name = "\$" . $s->{varname} . $i; + } + + my $valstr; + { + local($s->{apad}) = $s->{apad}; + $s->{apad} .= ' ' x (length($name) + 3) if $s->{indent} >= 2; + $valstr = $s->_dump($val, $name); + } + + $valstr = "$name = " . $valstr . ';' if @post or !$s->{terse}; + $out .= $s->{pad} . $valstr . $s->{sep}; + $out .= $s->{pad} . join(';' . $s->{sep} . $s->{pad}, @post) + . ';' . $s->{sep} if @post; + + push @out, $out; + } + return wantarray ? @out : join('', @out); +} + +# +# twist, toil and turn; +# and recurse, of course. +# sometimes sordidly; +# and curse if no recourse. +# +sub _dump { + my($s, $val, $name) = @_; + my($sname); + my($out, $realpack, $realtype, $type, $ipad, $id, $blesspad); + + $type = ref $val; + $out = ""; + + if ($type) { + + # Call the freezer method if it's specified and the object has the + # method. Trap errors and warn() instead of die()ing, like the XS + # implementation. + my $freezer = $s->{freezer}; + if ($freezer and UNIVERSAL::can($val, $freezer)) { + eval { $val->$freezer() }; + warn "WARNING(Freezer method call failed): $@" if $@; + } + + require Scalar::Util; + $realpack = Scalar::Util::blessed($val); + $realtype = $realpack ? Scalar::Util::reftype($val) : ref $val; + $id = format_refaddr($val); + + # if it has a name, we need to either look it up, or keep a tab + # on it so we know when we hit it later + if (defined($name) and length($name)) { + # keep a tab on it so that we dont fall into recursive pit + if (exists $s->{seen}{$id}) { +# if ($s->{expdepth} < $s->{level}) { + if ($s->{purity} and $s->{level} > 0) { + $out = ($realtype eq 'HASH') ? '{}' : + ($realtype eq 'ARRAY') ? '[]' : + 'do{my $o}' ; + push @post, $name . " = " . $s->{seen}{$id}[0]; + } + else { + $out = $s->{seen}{$id}[0]; + if ($name =~ /^([\@\%])/) { + my $start = $1; + if ($out =~ /^\\$start/) { + $out = substr($out, 1); + } + else { + $out = $start . '{' . $out . '}'; + } + } + } + return $out; +# } + } + else { + # store our name + $s->{seen}{$id} = [ (($name =~ /^[@%]/) ? ('\\' . $name ) : + ($realtype eq 'CODE' and + $name =~ /^[*](.*)$/) ? ('\\&' . $1 ) : + $name ), + $val ]; + } + } + + if ($realpack and $realpack eq 'Regexp') { + $out = "$val"; + $out =~ s,/,\\/,g; + return "qr/$out/"; + } + + # If purity is not set and maxdepth is set, then check depth: + # if we have reached maximum depth, return the string + # representation of the thing we are currently examining + # at this depth (i.e., 'Foo=ARRAY(0xdeadbeef)'). + if (!$s->{purity} + and $s->{maxdepth} > 0 + and $s->{level} >= $s->{maxdepth}) + { + return qq['$val']; + } + + # we have a blessed ref + if ($realpack) { + $out = $s->{'bless'} . '( '; + $blesspad = $s->{apad}; + $s->{apad} .= ' ' if ($s->{indent} >= 2); + } + + $s->{level}++; + $ipad = $s->{xpad} x $s->{level}; + + if ($realtype eq 'SCALAR' || $realtype eq 'REF') { + if ($realpack) { + $out .= 'do{\\(my $o = ' . $s->_dump($$val, "\${$name}") . ')}'; + } + else { + $out .= '\\' . $s->_dump($$val, "\${$name}"); + } + } + elsif ($realtype eq 'GLOB') { + $out .= '\\' . $s->_dump($$val, "*{$name}"); + } + elsif ($realtype eq 'ARRAY') { + my($v, $pad, $mname); + my($i) = 0; + $out .= ($name =~ /^\@/) ? '(' : '['; + $pad = $s->{sep} . $s->{pad} . $s->{apad}; + ($name =~ /^\@(.*)$/) ? ($mname = "\$" . $1) : + # omit -> if $foo->[0]->{bar}, but not ${$foo->[0]}->{bar} + ($name =~ /^\\?[\%\@\*\$][^{].*[]}]$/) ? ($mname = $name) : + ($mname = $name . '->'); + $mname .= '->' if $mname =~ /^\*.+\{[A-Z]+\}$/; + for $v (@$val) { + $sname = $mname . '[' . $i . ']'; + $out .= $pad . $ipad . '#' . $i if $s->{indent} >= 3; + $out .= $pad . $ipad . $s->_dump($v, $sname); + $out .= "," if $i++ < $#$val; + } + $out .= $pad . ($s->{xpad} x ($s->{level} - 1)) if $i; + $out .= ($name =~ /^\@/) ? ')' : ']'; + } + elsif ($realtype eq 'HASH') { + my($k, $v, $pad, $lpad, $mname, $pair); + $out .= ($name =~ /^\%/) ? '(' : '{'; + $pad = $s->{sep} . $s->{pad} . $s->{apad}; + $lpad = $s->{apad}; + $pair = $s->{pair}; + ($name =~ /^\%(.*)$/) ? ($mname = "\$" . $1) : + # omit -> if $foo->[0]->{bar}, but not ${$foo->[0]}->{bar} + ($name =~ /^\\?[\%\@\*\$][^{].*[]}]$/) ? ($mname = $name) : + ($mname = $name . '->'); + $mname .= '->' if $mname =~ /^\*.+\{[A-Z]+\}$/; + my ($sortkeys, $keys, $key) = ("$s->{sortkeys}"); + if ($sortkeys) { + if (ref($s->{sortkeys}) eq 'CODE') { + $keys = $s->{sortkeys}($val); + unless (ref($keys) eq 'ARRAY') { + carp "Sortkeys subroutine did not return ARRAYREF"; + $keys = []; + } + } + else { + $keys = [ sort keys %$val ]; + } + } + while (($k, $v) = ! $sortkeys ? (each %$val) : + @$keys ? ($key = shift(@$keys), $val->{$key}) : + () ) + { + my $nk = $s->_dump($k, ""); + $nk = $1 if !$s->{quotekeys} and $nk =~ /^[\"\']([A-Za-z_]\w*)[\"\']$/; + $sname = $mname . '{' . $nk . '}'; + $out .= $pad . $ipad . $nk . $pair; + + # temporarily alter apad + $s->{apad} .= (" " x (length($nk) + 4)) if $s->{indent} >= 2; + $out .= $s->_dump($val->{$k}, $sname) . ","; + $s->{apad} = $lpad if $s->{indent} >= 2; + } + if (substr($out, -1) eq ',') { + chop $out; + $out .= $pad . ($s->{xpad} x ($s->{level} - 1)); + } + $out .= ($name =~ /^\%/) ? ')' : '}'; + } + elsif ($realtype eq 'CODE') { + if ($s->{deparse}) { + require B::Deparse; + my $sub = 'sub ' . (B::Deparse->new)->coderef2text($val); + $pad = $s->{sep} . $s->{pad} . $s->{apad} . $s->{xpad} x ($s->{level} - 1); + $sub =~ s/\n/$pad/gse; + $out .= $sub; + } else { + $out .= 'sub { "DUMMY" }'; + carp "Encountered CODE ref, using dummy placeholder" if $s->{purity}; + } + } + else { + croak "Can\'t handle $realtype type."; + } + + if ($realpack) { # we have a blessed ref + $out .= ', \'' . $realpack . '\'' . ' )'; + $out .= '->' . $s->{toaster} . '()' if $s->{toaster} ne ''; + $s->{apad} = $blesspad; + } + $s->{level}--; + + } + else { # simple scalar + + my $ref = \$_[1]; + # first, catalog the scalar + if ($name ne '') { + $id = format_refaddr($ref); + if (exists $s->{seen}{$id}) { + if ($s->{seen}{$id}[2]) { + $out = $s->{seen}{$id}[0]; + #warn "[<$out]\n"; + return "\${$out}"; + } + } + else { + #warn "[>\\$name]\n"; + $s->{seen}{$id} = ["\\$name", $ref]; + } + } + if (ref($ref) eq 'GLOB' or "$ref" =~ /=GLOB\([^()]+\)$/) { # glob + my $name = substr($val, 1); + if ($name =~ /^[A-Za-z_][\w:]*$/) { + $name =~ s/^main::/::/; + $sname = $name; + } + else { + $sname = $s->_dump($name, ""); + $sname = '{' . $sname . '}'; + } + if ($s->{purity}) { + my $k; + local ($s->{level}) = 0; + for $k (qw(SCALAR ARRAY HASH)) { + my $gval = *$val{$k}; + next unless defined $gval; + next if $k eq "SCALAR" && ! defined $$gval; # always there + + # _dump can push into @post, so we hold our place using $postlen + my $postlen = scalar @post; + $post[$postlen] = "\*$sname = "; + local ($s->{apad}) = " " x length($post[$postlen]) if $s->{indent} >= 2; + $post[$postlen] .= $s->_dump($gval, "\*$sname\{$k\}"); + } + } + $out .= '*' . $sname; + } + elsif (!defined($val)) { + $out .= "undef"; + } + elsif ($val =~ /^(?:0|-?[1-9]\d{0,8})\z/) { # safe decimal number + $out .= $val; + } + else { # string + if ($s->{useqq} or $val =~ tr/\0-\377//c) { + # Fall back to qq if there's unicode + $out .= qquote($val, $s->{useqq}); + } + else { + $val =~ s/([\\\'])/\\$1/g; + $out .= '\'' . $val . '\''; + } + } + } + if ($id) { + # if we made it this far, $id was added to seen list at current + # level, so remove it to get deep copies + if ($s->{deepcopy}) { + delete($s->{seen}{$id}); + } + elsif ($name) { + $s->{seen}{$id}[2] = 1; + } + } + return $out; +} + +# +# non-OO style of earlier version +# +sub Dumper { + return Data::Dumper->Dump([@_]); +} + +# compat stub +sub DumperX { + return Data::Dumper->Dumpxs([@_], []); +} + +sub Dumpf { return Data::Dumper->Dump(@_) } + +sub Dumpp { print Data::Dumper->Dump(@_) } + +# +# reset the "seen" cache +# +sub Reset { + my($s) = shift; + $s->{seen} = {}; + return $s; +} + +sub Indent { + my($s, $v) = @_; + if (defined($v)) { + if ($v == 0) { + $s->{xpad} = ""; + $s->{sep} = ""; + } + else { + $s->{xpad} = " "; + $s->{sep} = "\n"; + } + $s->{indent} = $v; + return $s; + } + else { + return $s->{indent}; + } +} + +sub Pair { + my($s, $v) = @_; + defined($v) ? (($s->{pair} = $v), return $s) : $s->{pair}; +} + +sub Pad { + my($s, $v) = @_; + defined($v) ? (($s->{pad} = $v), return $s) : $s->{pad}; +} + +sub Varname { + my($s, $v) = @_; + defined($v) ? (($s->{varname} = $v), return $s) : $s->{varname}; +} + +sub Purity { + my($s, $v) = @_; + defined($v) ? (($s->{purity} = $v), return $s) : $s->{purity}; +} + +sub Useqq { + my($s, $v) = @_; + defined($v) ? (($s->{useqq} = $v), return $s) : $s->{useqq}; +} + +sub Terse { + my($s, $v) = @_; + defined($v) ? (($s->{terse} = $v), return $s) : $s->{terse}; +} + +sub Freezer { + my($s, $v) = @_; + defined($v) ? (($s->{freezer} = $v), return $s) : $s->{freezer}; +} + +sub Toaster { + my($s, $v) = @_; + defined($v) ? (($s->{toaster} = $v), return $s) : $s->{toaster}; +} + +sub Deepcopy { + my($s, $v) = @_; + defined($v) ? (($s->{deepcopy} = $v), return $s) : $s->{deepcopy}; +} + +sub Quotekeys { + my($s, $v) = @_; + defined($v) ? (($s->{quotekeys} = $v), return $s) : $s->{quotekeys}; +} + +sub Bless { + my($s, $v) = @_; + defined($v) ? (($s->{'bless'} = $v), return $s) : $s->{'bless'}; +} + +sub Maxdepth { + my($s, $v) = @_; + defined($v) ? (($s->{'maxdepth'} = $v), return $s) : $s->{'maxdepth'}; +} + +sub Useperl { + my($s, $v) = @_; + defined($v) ? (($s->{'useperl'} = $v), return $s) : $s->{'useperl'}; +} + +sub Sortkeys { + my($s, $v) = @_; + defined($v) ? (($s->{'sortkeys'} = $v), return $s) : $s->{'sortkeys'}; +} + +sub Deparse { + my($s, $v) = @_; + defined($v) ? (($s->{'deparse'} = $v), return $s) : $s->{'deparse'}; +} + +# used by qquote below +my %esc = ( + "\a" => "\\a", + "\b" => "\\b", + "\t" => "\\t", + "\n" => "\\n", + "\f" => "\\f", + "\r" => "\\r", + "\e" => "\\e", +); + +# put a string value in double quotes +sub qquote { + local($_) = shift; + s/([\\\"\@\$])/\\$1/g; + my $bytes; { use bytes; $bytes = length } + s/([^\x00-\x7f])/'\x{'.sprintf("%x",ord($1)).'}'/ge if $bytes > length; + return qq("$_") unless + /[^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~]/; # fast exit + + my $high = shift || ""; + s/([\a\b\t\n\f\r\e])/$esc{$1}/g; + + if (ord('^')==94) { # ascii + # no need for 3 digits in escape for these + s/([\0-\037])(?!\d)/'\\'.sprintf('%o',ord($1))/eg; + s/([\0-\037\177])/'\\'.sprintf('%03o',ord($1))/eg; + # all but last branch below not supported --BEHAVIOR SUBJECT TO CHANGE-- + if ($high eq "iso8859") { + s/([\200-\240])/'\\'.sprintf('%o',ord($1))/eg; + } elsif ($high eq "utf8") { +# use utf8; +# $str =~ s/([^\040-\176])/sprintf "\\x{%04x}", ord($1)/ge; + } elsif ($high eq "8bit") { + # leave it as it is + } else { + s/([\200-\377])/'\\'.sprintf('%03o',ord($1))/eg; + s/([^\040-\176])/sprintf "\\x{%04x}", ord($1)/ge; + } + } + else { # ebcdic + s{([^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~])(?!\d)} + {my $v = ord($1); '\\'.sprintf(($v <= 037 ? '%o' : '%03o'), $v)}eg; + s{([^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~])} + {'\\'.sprintf('%03o',ord($1))}eg; + } + + return qq("$_"); +} + +# helper sub to sort hash keys in Perl < 5.8.0 where we don't have +# access to sortsv() from XS +sub _sortkeys { [ sort keys %{$_[0]} ] } + +1; +__END__ + +=head1 NAME + +Data::Dumper - stringified perl data structures, suitable for both printing and C<eval> + +=head1 SYNOPSIS + + use Data::Dumper; + + # simple procedural interface + print Dumper($foo, $bar); + + # extended usage with names + print Data::Dumper->Dump([$foo, $bar], [qw(foo *ary)]); + + # configuration variables + { + local $Data::Dumper::Purity = 1; + eval Data::Dumper->Dump([$foo, $bar], [qw(foo *ary)]); + } + + # OO usage + $d = Data::Dumper->new([$foo, $bar], [qw(foo *ary)]); + ... + print $d->Dump; + ... + $d->Purity(1)->Terse(1)->Deepcopy(1); + eval $d->Dump; + + +=head1 DESCRIPTION + +Given a list of scalars or reference variables, writes out their contents in +perl syntax. The references can also be objects. The contents of each +variable is output in a single Perl statement. Handles self-referential +structures correctly. + +The return value can be C<eval>ed to get back an identical copy of the +original reference structure. + +Any references that are the same as one of those passed in will be named +C<$VAR>I<n> (where I<n> is a numeric suffix), and other duplicate references +to substructures within C<$VAR>I<n> will be appropriately labeled using arrow +notation. You can specify names for individual values to be dumped if you +use the C<Dump()> method, or you can change the default C<$VAR> prefix to +something else. See C<$Data::Dumper::Varname> and C<$Data::Dumper::Terse> +below. + +The default output of self-referential structures can be C<eval>ed, but the +nested references to C<$VAR>I<n> will be undefined, since a recursive +structure cannot be constructed using one Perl statement. You should set the +C<Purity> flag to 1 to get additional statements that will correctly fill in +these references. Moreover, if C<eval>ed when strictures are in effect, +you need to ensure that any variables it accesses are previously declared. + +In the extended usage form, the references to be dumped can be given +user-specified names. If a name begins with a C<*>, the output will +describe the dereferenced type of the supplied reference for hashes and +arrays, and coderefs. Output of names will be avoided where possible if +the C<Terse> flag is set. + +In many cases, methods that are used to set the internal state of the +object will return the object itself, so method calls can be conveniently +chained together. + +Several styles of output are possible, all controlled by setting +the C<Indent> flag. See L<Configuration Variables or Methods> below +for details. + + +=head2 Methods + +=over 4 + +=item I<PACKAGE>->new(I<ARRAYREF [>, I<ARRAYREF]>) + +Returns a newly created C<Data::Dumper> object. The first argument is an +anonymous array of values to be dumped. The optional second argument is an +anonymous array of names for the values. The names need not have a leading +C<$> sign, and must be comprised of alphanumeric characters. You can begin +a name with a C<*> to specify that the dereferenced type must be dumped +instead of the reference itself, for ARRAY and HASH references. + +The prefix specified by C<$Data::Dumper::Varname> will be used with a +numeric suffix if the name for a value is undefined. + +Data::Dumper will catalog all references encountered while dumping the +values. Cross-references (in the form of names of substructures in perl +syntax) will be inserted at all possible points, preserving any structural +interdependencies in the original set of values. Structure traversal is +depth-first, and proceeds in order from the first supplied value to +the last. + +=item I<$OBJ>->Dump I<or> I<PACKAGE>->Dump(I<ARRAYREF [>, I<ARRAYREF]>) + +Returns the stringified form of the values stored in the object (preserving +the order in which they were supplied to C<new>), subject to the +configuration options below. In a list context, it returns a list +of strings corresponding to the supplied values. + +The second form, for convenience, simply calls the C<new> method on its +arguments before dumping the object immediately. + +=item I<$OBJ>->Seen(I<[HASHREF]>) + +Queries or adds to the internal table of already encountered references. +You must use C<Reset> to explicitly clear the table if needed. Such +references are not dumped; instead, their names are inserted wherever they +are encountered subsequently. This is useful especially for properly +dumping subroutine references. + +Expects an anonymous hash of name => value pairs. Same rules apply for names +as in C<new>. If no argument is supplied, will return the "seen" list of +name => value pairs, in a list context. Otherwise, returns the object +itself. + +=item I<$OBJ>->Values(I<[ARRAYREF]>) + +Queries or replaces the internal array of values that will be dumped. +When called without arguments, returns the values. Otherwise, returns the +object itself. + +=item I<$OBJ>->Names(I<[ARRAYREF]>) + +Queries or replaces the internal array of user supplied names for the values +that will be dumped. When called without arguments, returns the names. +Otherwise, returns the object itself. + +=item I<$OBJ>->Reset + +Clears the internal table of "seen" references and returns the object +itself. + +=back + +=head2 Functions + +=over 4 + +=item Dumper(I<LIST>) + +Returns the stringified form of the values in the list, subject to the +configuration options below. The values will be named C<$VAR>I<n> in the +output, where I<n> is a numeric suffix. Will return a list of strings +in a list context. + +=back + +=head2 Configuration Variables or Methods + +Several configuration variables can be used to control the kind of output +generated when using the procedural interface. These variables are usually +C<local>ized in a block so that other parts of the code are not affected by +the change. + +These variables determine the default state of the object created by calling +the C<new> method, but cannot be used to alter the state of the object +thereafter. The equivalent method names should be used instead to query +or set the internal state of the object. + +The method forms return the object itself when called with arguments, +so that they can be chained together nicely. + +=over 4 + +=item * + +$Data::Dumper::Indent I<or> I<$OBJ>->Indent(I<[NEWVAL]>) + +Controls the style of indentation. It can be set to 0, 1, 2 or 3. Style 0 +spews output without any newlines, indentation, or spaces between list +items. It is the most compact format possible that can still be called +valid perl. Style 1 outputs a readable form with newlines but no fancy +indentation (each level in the structure is simply indented by a fixed +amount of whitespace). Style 2 (the default) outputs a very readable form +which takes into account the length of hash keys (so the hash value lines +up). Style 3 is like style 2, but also annotates the elements of arrays +with their index (but the comment is on its own line, so array output +consumes twice the number of lines). Style 2 is the default. + +=item * + +$Data::Dumper::Purity I<or> I<$OBJ>->Purity(I<[NEWVAL]>) + +Controls the degree to which the output can be C<eval>ed to recreate the +supplied reference structures. Setting it to 1 will output additional perl +statements that will correctly recreate nested references. The default is +0. + +=item * + +$Data::Dumper::Pad I<or> I<$OBJ>->Pad(I<[NEWVAL]>) + +Specifies the string that will be prefixed to every line of the output. +Empty string by default. + +=item * + +$Data::Dumper::Varname I<or> I<$OBJ>->Varname(I<[NEWVAL]>) + +Contains the prefix to use for tagging variable names in the output. The +default is "VAR". + +=item * + +$Data::Dumper::Useqq I<or> I<$OBJ>->Useqq(I<[NEWVAL]>) + +When set, enables the use of double quotes for representing string values. +Whitespace other than space will be represented as C<[\n\t\r]>, "unsafe" +characters will be backslashed, and unprintable characters will be output as +quoted octal integers. Since setting this variable imposes a performance +penalty, the default is 0. C<Dump()> will run slower if this flag is set, +since the fast XSUB implementation doesn't support it yet. + +=item * + +$Data::Dumper::Terse I<or> I<$OBJ>->Terse(I<[NEWVAL]>) + +When set, Data::Dumper will emit single, non-self-referential values as +atoms/terms rather than statements. This means that the C<$VAR>I<n> names +will be avoided where possible, but be advised that such output may not +always be parseable by C<eval>. + +=item * + +$Data::Dumper::Freezer I<or> $I<OBJ>->Freezer(I<[NEWVAL]>) + +Can be set to a method name, or to an empty string to disable the feature. +Data::Dumper will invoke that method via the object before attempting to +stringify it. This method can alter the contents of the object (if, for +instance, it contains data allocated from C), and even rebless it in a +different package. The client is responsible for making sure the specified +method can be called via the object, and that the object ends up containing +only perl data types after the method has been called. Defaults to an empty +string. + +If an object does not support the method specified (determined using +UNIVERSAL::can()) then the call will be skipped. If the method dies a +warning will be generated. + +=item * + +$Data::Dumper::Toaster I<or> $I<OBJ>->Toaster(I<[NEWVAL]>) + +Can be set to a method name, or to an empty string to disable the feature. +Data::Dumper will emit a method call for any objects that are to be dumped +using the syntax C<bless(DATA, CLASS)-E<gt>METHOD()>. Note that this means that +the method specified will have to perform any modifications required on the +object (like creating new state within it, and/or reblessing it in a +different package) and then return it. The client is responsible for making +sure the method can be called via the object, and that it returns a valid +object. Defaults to an empty string. + +=item * + +$Data::Dumper::Deepcopy I<or> $I<OBJ>->Deepcopy(I<[NEWVAL]>) + +Can be set to a boolean value to enable deep copies of structures. +Cross-referencing will then only be done when absolutely essential +(i.e., to break reference cycles). Default is 0. + +=item * + +$Data::Dumper::Quotekeys I<or> $I<OBJ>->Quotekeys(I<[NEWVAL]>) + +Can be set to a boolean value to control whether hash keys are quoted. +A false value will avoid quoting hash keys when it looks like a simple +string. Default is 1, which will always enclose hash keys in quotes. + +=item * + +$Data::Dumper::Bless I<or> $I<OBJ>->Bless(I<[NEWVAL]>) + +Can be set to a string that specifies an alternative to the C<bless> +builtin operator used to create objects. A function with the specified +name should exist, and should accept the same arguments as the builtin. +Default is C<bless>. + +=item * + +$Data::Dumper::Pair I<or> $I<OBJ>->Pair(I<[NEWVAL]>) + +Can be set to a string that specifies the separator between hash keys +and values. To dump nested hash, array and scalar values to JavaScript, +use: C<$Data::Dumper::Pair = ' : ';>. Implementing C<bless> in JavaScript +is left as an exercise for the reader. +A function with the specified name exists, and accepts the same arguments +as the builtin. + +Default is: C< =E<gt> >. + +=item * + +$Data::Dumper::Maxdepth I<or> $I<OBJ>->Maxdepth(I<[NEWVAL]>) + +Can be set to a positive integer that specifies the depth beyond which +which we don't venture into a structure. Has no effect when +C<Data::Dumper::Purity> is set. (Useful in debugger when we often don't +want to see more than enough). Default is 0, which means there is +no maximum depth. + +=item * + +$Data::Dumper::Useperl I<or> $I<OBJ>->Useperl(I<[NEWVAL]>) + +Can be set to a boolean value which controls whether the pure Perl +implementation of C<Data::Dumper> is used. The C<Data::Dumper> module is +a dual implementation, with almost all functionality written in both +pure Perl and also in XS ('C'). Since the XS version is much faster, it +will always be used if possible. This option lets you override the +default behavior, usually for testing purposes only. Default is 0, which +means the XS implementation will be used if possible. + +=item * + +$Data::Dumper::Sortkeys I<or> $I<OBJ>->Sortkeys(I<[NEWVAL]>) + +Can be set to a boolean value to control whether hash keys are dumped in +sorted order. A true value will cause the keys of all hashes to be +dumped in Perl's default sort order. Can also be set to a subroutine +reference which will be called for each hash that is dumped. In this +case C<Data::Dumper> will call the subroutine once for each hash, +passing it the reference of the hash. The purpose of the subroutine is +to return a reference to an array of the keys that will be dumped, in +the order that they should be dumped. Using this feature, you can +control both the order of the keys, and which keys are actually used. In +other words, this subroutine acts as a filter by which you can exclude +certain keys from being dumped. Default is 0, which means that hash keys +are not sorted. + +=item * + +$Data::Dumper::Deparse I<or> $I<OBJ>->Deparse(I<[NEWVAL]>) + +Can be set to a boolean value to control whether code references are +turned into perl source code. If set to a true value, C<B::Deparse> +will be used to get the source of the code reference. Using this option +will force using the Perl implementation of the dumper, since the fast +XSUB implementation doesn't support it. + +Caution : use this option only if you know that your coderefs will be +properly reconstructed by C<B::Deparse>. + +=back + +=head2 Exports + +=over 4 + +=item Dumper + +=back + +=head1 EXAMPLES + +Run these code snippets to get a quick feel for the behavior of this +module. When you are through with these examples, you may want to +add or change the various configuration variables described above, +to see their behavior. (See the testsuite in the Data::Dumper +distribution for more examples.) + + + use Data::Dumper; + + package Foo; + sub new {bless {'a' => 1, 'b' => sub { return "foo" }}, $_[0]}; + + package Fuz; # a weird REF-REF-SCALAR object + sub new {bless \($_ = \ 'fu\'z'), $_[0]}; + + package main; + $foo = Foo->new; + $fuz = Fuz->new; + $boo = [ 1, [], "abcd", \*foo, + {1 => 'a', 023 => 'b', 0x45 => 'c'}, + \\"p\q\'r", $foo, $fuz]; + + ######## + # simple usage + ######## + + $bar = eval(Dumper($boo)); + print($@) if $@; + print Dumper($boo), Dumper($bar); # pretty print (no array indices) + + $Data::Dumper::Terse = 1; # don't output names where feasible + $Data::Dumper::Indent = 0; # turn off all pretty print + print Dumper($boo), "\n"; + + $Data::Dumper::Indent = 1; # mild pretty print + print Dumper($boo); + + $Data::Dumper::Indent = 3; # pretty print with array indices + print Dumper($boo); + + $Data::Dumper::Useqq = 1; # print strings in double quotes + print Dumper($boo); + + $Data::Dumper::Pair = " : "; # specify hash key/value separator + print Dumper($boo); + + + ######## + # recursive structures + ######## + + @c = ('c'); + $c = \@c; + $b = {}; + $a = [1, $b, $c]; + $b->{a} = $a; + $b->{b} = $a->[1]; + $b->{c} = $a->[2]; + print Data::Dumper->Dump([$a,$b,$c], [qw(a b c)]); + + + $Data::Dumper::Purity = 1; # fill in the holes for eval + print Data::Dumper->Dump([$a, $b], [qw(*a b)]); # print as @a + print Data::Dumper->Dump([$b, $a], [qw(*b a)]); # print as %b + + + $Data::Dumper::Deepcopy = 1; # avoid cross-refs + print Data::Dumper->Dump([$b, $a], [qw(*b a)]); + + + $Data::Dumper::Purity = 0; # avoid cross-refs + print Data::Dumper->Dump([$b, $a], [qw(*b a)]); + + ######## + # deep structures + ######## + + $a = "pearl"; + $b = [ $a ]; + $c = { 'b' => $b }; + $d = [ $c ]; + $e = { 'd' => $d }; + $f = { 'e' => $e }; + print Data::Dumper->Dump([$f], [qw(f)]); + + $Data::Dumper::Maxdepth = 3; # no deeper than 3 refs down + print Data::Dumper->Dump([$f], [qw(f)]); + + + ######## + # object-oriented usage + ######## + + $d = Data::Dumper->new([$a,$b], [qw(a b)]); + $d->Seen({'*c' => $c}); # stash a ref without printing it + $d->Indent(3); + print $d->Dump; + $d->Reset->Purity(0); # empty the seen cache + print join "----\n", $d->Dump; + + + ######## + # persistence + ######## + + package Foo; + sub new { bless { state => 'awake' }, shift } + sub Freeze { + my $s = shift; + print STDERR "preparing to sleep\n"; + $s->{state} = 'asleep'; + return bless $s, 'Foo::ZZZ'; + } + + package Foo::ZZZ; + sub Thaw { + my $s = shift; + print STDERR "waking up\n"; + $s->{state} = 'awake'; + return bless $s, 'Foo'; + } + + package Foo; + use Data::Dumper; + $a = Foo->new; + $b = Data::Dumper->new([$a], ['c']); + $b->Freezer('Freeze'); + $b->Toaster('Thaw'); + $c = $b->Dump; + print $c; + $d = eval $c; + print Data::Dumper->Dump([$d], ['d']); + + + ######## + # symbol substitution (useful for recreating CODE refs) + ######## + + sub foo { print "foo speaking\n" } + *other = \&foo; + $bar = [ \&other ]; + $d = Data::Dumper->new([\&other,$bar],['*other','bar']); + $d->Seen({ '*foo' => \&foo }); + print $d->Dump; + + + ######## + # sorting and filtering hash keys + ######## + + $Data::Dumper::Sortkeys = \&my_filter; + my $foo = { map { (ord, "$_$_$_") } 'I'..'Q' }; + my $bar = { %$foo }; + my $baz = { reverse %$foo }; + print Dumper [ $foo, $bar, $baz ]; + + sub my_filter { + my ($hash) = @_; + # return an array ref containing the hash keys to dump + # in the order that you want them to be dumped + return [ + # Sort the keys of %$foo in reverse numeric order + $hash eq $foo ? (sort {$b <=> $a} keys %$hash) : + # Only dump the odd number keys of %$bar + $hash eq $bar ? (grep {$_ % 2} keys %$hash) : + # Sort keys in default order for all other hashes + (sort keys %$hash) + ]; + } + +=head1 BUGS + +Due to limitations of Perl subroutine call semantics, you cannot pass an +array or hash. Prepend it with a C<\> to pass its reference instead. This +will be remedied in time, now that Perl has subroutine prototypes. +For now, you need to use the extended usage form, and prepend the +name with a C<*> to output it as a hash or array. + +C<Data::Dumper> cheats with CODE references. If a code reference is +encountered in the structure being processed (and if you haven't set +the C<Deparse> flag), an anonymous subroutine that +contains the string '"DUMMY"' will be inserted in its place, and a warning +will be printed if C<Purity> is set. You can C<eval> the result, but bear +in mind that the anonymous sub that gets created is just a placeholder. +Someday, perl will have a switch to cache-on-demand the string +representation of a compiled piece of code, I hope. If you have prior +knowledge of all the code refs that your data structures are likely +to have, you can use the C<Seen> method to pre-seed the internal reference +table and make the dumped output point to them, instead. See L</EXAMPLES> +above. + +The C<Useqq> and C<Deparse> flags makes Dump() run slower, since the +XSUB implementation does not support them. + +SCALAR objects have the weirdest looking C<bless> workaround. + +Pure Perl version of C<Data::Dumper> escapes UTF-8 strings correctly +only in Perl 5.8.0 and later. + +=head2 NOTE + +Starting from Perl 5.8.1 different runs of Perl will have different +ordering of hash keys. The change was done for greater security, +see L<perlsec/"Algorithmic Complexity Attacks">. This means that +different runs of Perl will have different Data::Dumper outputs if +the data contains hashes. If you need to have identical Data::Dumper +outputs from different runs of Perl, use the environment variable +PERL_HASH_SEED, see L<perlrun/PERL_HASH_SEED>. Using this restores +the old (platform-specific) ordering: an even prettier solution might +be to use the C<Sortkeys> filter of Data::Dumper. + +=head1 AUTHOR + +Gurusamy Sarathy gsar@activestate.com + +Copyright (c) 1996-98 Gurusamy Sarathy. All rights reserved. +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 VERSION + +Version 2.121 (Aug 24 2003) + +=head1 SEE ALSO + +perl(1) + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Digest/MD5.pm b/Master/tlpkg/tlperl.old/lib/Digest/MD5.pm new file mode 100644 index 00000000000..17fb11d678a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Digest/MD5.pm @@ -0,0 +1,376 @@ +package Digest::MD5; + +use strict; +use vars qw($VERSION @ISA @EXPORT_OK); + +$VERSION = '2.36'; # $Date: 2005/11/30 13:46:47 $ + +require Exporter; +*import = \&Exporter::import; +@EXPORT_OK = qw(md5 md5_hex md5_base64); + +eval { + require Digest::base; + push(@ISA, 'Digest::base'); +}; +if ($@) { + my $err = $@; + *add_bits = sub { die $err }; +} + + +eval { + require XSLoader; + XSLoader::load('Digest::MD5', $VERSION); +}; +if ($@) { + my $olderr = $@; + eval { + # Try to load the pure perl version + require Digest::Perl::MD5; + + Digest::Perl::MD5->import(qw(md5 md5_hex md5_base64)); + push(@ISA, "Digest::Perl::MD5"); # make OO interface work + }; + if ($@) { + # restore the original error + die $olderr; + } +} +else { + *reset = \&new; +} + +1; +__END__ + +=head1 NAME + +Digest::MD5 - Perl interface to the MD5 Algorithm + +=head1 SYNOPSIS + + # Functional style + use Digest::MD5 qw(md5 md5_hex md5_base64); + + $digest = md5($data); + $digest = md5_hex($data); + $digest = md5_base64($data); + + # OO style + use Digest::MD5; + + $ctx = Digest::MD5->new; + + $ctx->add($data); + $ctx->addfile(*FILE); + + $digest = $ctx->digest; + $digest = $ctx->hexdigest; + $digest = $ctx->b64digest; + +=head1 DESCRIPTION + +The C<Digest::MD5> module allows you to use the RSA Data Security +Inc. MD5 Message Digest algorithm from within Perl programs. The +algorithm takes as input a message of arbitrary length and produces as +output a 128-bit "fingerprint" or "message digest" of the input. + +Note that the MD5 algorithm is not as strong as it used to be. It has +since 2005 been easy to generate different messages that produce the +same MD5 digest. It still seems hard to generate messages that +produce a given digest, but it is probably wise to move to stronger +algorithms for applications that depend on the digest to uniquely identify +a message. + +The C<Digest::MD5> module provide a procedural interface for simple +use, as well as an object oriented interface that can handle messages +of arbitrary length and which can read files directly. + +=head1 FUNCTIONS + +The following functions are provided by the C<Digest::MD5> module. +None of these functions are exported by default. + +=over 4 + +=item md5($data,...) + +This function will concatenate all arguments, calculate the MD5 digest +of this "message", and return it in binary form. The returned string +will be 16 bytes long. + +The result of md5("a", "b", "c") will be exactly the same as the +result of md5("abc"). + +=item md5_hex($data,...) + +Same as md5(), but will return the digest in hexadecimal form. The +length of the returned string will be 32 and it will only contain +characters from this set: '0'..'9' and 'a'..'f'. + +=item md5_base64($data,...) + +Same as md5(), but will return the digest as a base64 encoded string. +The length of the returned string will be 22 and it will only contain +characters from this set: 'A'..'Z', 'a'..'z', '0'..'9', '+' and +'/'. + +Note that the base64 encoded string returned is not padded to be a +multiple of 4 bytes long. If you want interoperability with other +base64 encoded md5 digests you might want to append the redundant +string "==" to the result. + +=back + +=head1 METHODS + +The object oriented interface to C<Digest::MD5> is described in this +section. After a C<Digest::MD5> object has been created, you will add +data to it and finally ask for the digest in a suitable format. A +single object can be used to calculate multiple digests. + +The following methods are provided: + +=over 4 + +=item $md5 = Digest::MD5->new + +The constructor returns a new C<Digest::MD5> object which encapsulate +the state of the MD5 message-digest algorithm. + +If called as an instance method (i.e. $md5->new) it will just reset the +state the object to the state of a newly created object. No new +object is created in this case. + +=item $md5->reset + +This is just an alias for $md5->new. + +=item $md5->clone + +This a copy of the $md5 object. It is useful when you do not want to +destroy the digests state, but need an intermediate value of the +digest, e.g. when calculating digests iteratively on a continuous data +stream. Example: + + my $md5 = Digest::MD5->new; + while (<>) { + $md5->add($_); + print "Line $.: ", $md5->clone->hexdigest, "\n"; + } + +=item $md5->add($data,...) + +The $data provided as argument are appended to the message we +calculate the digest for. The return value is the $md5 object itself. + +All these lines will have the same effect on the state of the $md5 +object: + + $md5->add("a"); $md5->add("b"); $md5->add("c"); + $md5->add("a")->add("b")->add("c"); + $md5->add("a", "b", "c"); + $md5->add("abc"); + +=item $md5->addfile($io_handle) + +The $io_handle will be read until EOF and its content appended to the +message we calculate the digest for. The return value is the $md5 +object itself. + +The addfile() method will croak() if it fails reading data for some +reason. If it croaks it is unpredictable what the state of the $md5 +object will be in. The addfile() method might have been able to read +the file partially before it failed. It is probably wise to discard +or reset the $md5 object if this occurs. + +In most cases you want to make sure that the $io_handle is in +C<binmode> before you pass it as argument to the addfile() method. + +=item $md5->add_bits($data, $nbits) + +=item $md5->add_bits($bitstring) + +Since the MD5 algorithm is byte oriented you might only add bits as +multiples of 8, so you probably want to just use add() instead. The +add_bits() method is provided for compatibility with other digest +implementations. See L<Digest> for description of the arguments +that add_bits() take. + +=item $md5->digest + +Return the binary digest for the message. The returned string will be +16 bytes long. + +Note that the C<digest> operation is effectively a destructive, +read-once operation. Once it has been performed, the C<Digest::MD5> +object is automatically C<reset> and can be used to calculate another +digest value. Call $md5->clone->digest if you want to calculate the +digest without resetting the digest state. + +=item $md5->hexdigest + +Same as $md5->digest, but will return the digest in hexadecimal +form. The length of the returned string will be 32 and it will only +contain characters from this set: '0'..'9' and 'a'..'f'. + +=item $md5->b64digest + +Same as $md5->digest, but will return the digest as a base64 encoded +string. The length of the returned string will be 22 and it will only +contain characters from this set: 'A'..'Z', 'a'..'z', '0'..'9', '+' +and '/'. + + +The base64 encoded string returned is not padded to be a multiple of 4 +bytes long. If you want interoperability with other base64 encoded +md5 digests you might want to append the string "==" to the result. + +=back + + +=head1 EXAMPLES + +The simplest way to use this library is to import the md5_hex() +function (or one of its cousins): + + use Digest::MD5 qw(md5_hex); + print "Digest is ", md5_hex("foobarbaz"), "\n"; + +The above example would print out the message: + + Digest is 6df23dc03f9b54cc38a0fc1483df6e21 + +The same checksum can also be calculated in OO style: + + use Digest::MD5; + + $md5 = Digest::MD5->new; + $md5->add('foo', 'bar'); + $md5->add('baz'); + $digest = $md5->hexdigest; + + print "Digest is $digest\n"; + +With OO style you can break the message arbitrary. This means that we +are no longer limited to have space for the whole message in memory, i.e. +we can handle messages of any size. + +This is useful when calculating checksum for files: + + use Digest::MD5; + + my $file = shift || "/etc/passwd"; + open(FILE, $file) or die "Can't open '$file': $!"; + binmode(FILE); + + $md5 = Digest::MD5->new; + while (<FILE>) { + $md5->add($_); + } + close(FILE); + print $md5->b64digest, " $file\n"; + +Or we can use the addfile method for more efficient reading of +the file: + + use Digest::MD5; + + my $file = shift || "/etc/passwd"; + open(FILE, $file) or die "Can't open '$file': $!"; + binmode(FILE); + + print Digest::MD5->new->addfile(*FILE)->hexdigest, " $file\n"; + +Perl 5.8 support Unicode characters in strings. Since the MD5 +algorithm is only defined for strings of bytes, it can not be used on +strings that contains chars with ordinal number above 255. The MD5 +functions and methods will croak if you try to feed them such input +data: + + use Digest::MD5 qw(md5_hex); + + my $str = "abc\x{300}"; + print md5_hex($str), "\n"; # croaks + # Wide character in subroutine entry + +What you can do is calculate the MD5 checksum of the UTF-8 +representation of such strings. This is achieved by filtering the +string through encode_utf8() function: + + use Digest::MD5 qw(md5_hex); + use Encode qw(encode_utf8); + + my $str = "abc\x{300}"; + print md5_hex(encode_utf8($str)), "\n"; + # 8c2d46911f3f5a326455f0ed7a8ed3b3 + +=head1 SEE ALSO + +L<Digest>, +L<Digest::MD2>, +L<Digest::SHA1>, +L<Digest::HMAC> + +L<md5sum(1)> + +RFC 1321 + +http://en.wikipedia.org/wiki/MD5 + +The paper "How to Break MD5 and Other Hash Functions" by Xiaoyun Wang +and Hongbo Yu. + +=head1 COPYRIGHT + +This library is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + + Copyright 1998-2003 Gisle Aas. + Copyright 1995-1996 Neil Winton. + Copyright 1991-1992 RSA Data Security, Inc. + +The MD5 algorithm is defined in RFC 1321. This implementation is +derived from the reference C code in RFC 1321 which is covered by +the following copyright statement: + +=over 4 + +=item + +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. + +=back + +This copyright does not prohibit distribution of any version of Perl +containing this extension under the terms of the GNU or Artistic +licenses. + +=head1 AUTHORS + +The original C<MD5> interface was written by Neil Winton +(C<N.Winton@axion.bt.co.uk>). + +The C<Digest::MD5> module is written by Gisle Aas <gisle@ActiveState.com>. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Digest/base.pm b/Master/tlpkg/tlperl.old/lib/Digest/base.pm new file mode 100644 index 00000000000..cb336c2cf61 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Digest/base.pm @@ -0,0 +1,100 @@ +package Digest::base; + +use strict; +use vars qw($VERSION); +$VERSION = "1.00"; + +# subclass is supposed to implement at least these +sub new; +sub clone; +sub add; +sub digest; + +sub reset { + my $self = shift; + $self->new(@_); # ugly +} + +sub addfile { + my ($self, $handle) = @_; + + my $n; + my $buf = ""; + + while (($n = read($handle, $buf, 4*1024))) { + $self->add($buf); + } + unless (defined $n) { + require Carp; + Carp::croak("Read failed: $!"); + } + + $self; +} + +sub add_bits { + my $self = shift; + my $bits; + my $nbits; + if (@_ == 1) { + my $arg = shift; + $bits = pack("B*", $arg); + $nbits = length($arg); + } + else { + ($bits, $nbits) = @_; + } + if (($nbits % 8) != 0) { + require Carp; + Carp::croak("Number of bits must be multiple of 8 for this algorithm"); + } + return $self->add(substr($bits, 0, $nbits/8)); +} + +sub hexdigest { + my $self = shift; + return unpack("H*", $self->digest(@_)); +} + +sub b64digest { + my $self = shift; + require MIME::Base64; + my $b64 = MIME::Base64::encode($self->digest(@_), ""); + $b64 =~ s/=+$//; + return $b64; +} + +1; + +__END__ + +=head1 NAME + +Digest::base - Digest base class + +=head1 SYNOPSIS + + package Digest::Foo; + use base 'Digest::base'; + +=head1 DESCRIPTION + +The C<Digest::base> class provide implementations of the methods +C<addfile> and C<add_bits> in terms of C<add>, and of the methods +C<hexdigest> and C<b64digest> in terms of C<digest>. + +Digest implementations might want to inherit from this class to get +this implementations of the alternative I<add> and I<digest> methods. +A minimal subclass needs to implement the following methods by itself: + + new + clone + add + digest + +The arguments and expected behaviour of these methods are described in +L<Digest>. + +=head1 SEE ALSO + +L<Digest> diff --git a/Master/tlpkg/tlperl.old/lib/Digest/file.pm b/Master/tlpkg/tlperl.old/lib/Digest/file.pm new file mode 100644 index 00000000000..67985fd7599 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Digest/file.pm @@ -0,0 +1,85 @@ +package Digest::file; + +use strict; + +use Exporter (); +use Carp qw(croak); +use Digest (); + +use vars qw($VERSION @ISA @EXPORT_OK); + +$VERSION = "1.00"; +@ISA = qw(Exporter); +@EXPORT_OK = qw(digest_file_ctx digest_file digest_file_hex digest_file_base64); + +sub digest_file_ctx { + my $file = shift; + croak("No digest algorithm specified") unless @_; + local *F; + open(F, $file) || croak("Can't open '$file': $!"); + binmode(F); + my $ctx = Digest->new(@_); + $ctx->addfile(*F); + close(F); + return $ctx; +} + +sub digest_file { + digest_file_ctx(@_)->digest; +} + +sub digest_file_hex { + digest_file_ctx(@_)->hexdigest; +} + +sub digest_file_base64 { + digest_file_ctx(@_)->b64digest; +} + +1; + +__END__ + +=head1 NAME + +Digest::file - Calculate digests of files + +=head1 SYNOPSIS + + # Poor mans "md5sum" command + use Digest::file qw(digest_file_hex); + for (@ARGV) { + print digest_file_hex($_, "MD5"), " $_\n"; + } + +=head1 DESCRIPTION + +This module provide 3 convenience functions to calculate the digest +of files. The following functions are provided: + +=over + +=item digest_file( $file, $algorithm, [$arg,...] ) + +This function will calculate and return the binary digest of the bytes +of the given file. The function will croak if it fails to open or +read the file. + +The $algorithm is a string like "MD2", "MD5", "SHA-1", "SHA-512". +Additional arguments are passed to the constructor for the +implementation of the given algorithm. + +=item digest_file_hex( $file, $algorithm, [$arg,...] ) + +Same as digest_file(), but return the digest in hex form. + +=item digest_file_base64( $file, $algorithm, [$arg,...] ) + +Same as digest_file(), but return the digest as a base64 encoded +string. + +=back + +=head1 SEE ALSO + +L<Digest> diff --git a/Master/tlpkg/tlperl.old/lib/DynaLoader.pm b/Master/tlpkg/tlperl.old/lib/DynaLoader.pm new file mode 100644 index 00000000000..178e9b2616c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/DynaLoader.pm @@ -0,0 +1,833 @@ + +# Generated from DynaLoader.pm.PL + +package DynaLoader; + +# And Gandalf said: 'Many folk like to know beforehand what is to +# be set on the table; but those who have laboured to prepare the +# feast like to keep their secret; for wonder makes the words of +# praise louder.' + +# (Quote from Tolkien suggested by Anno Siegel.) +# +# See pod text at end of file for documentation. +# See also ext/DynaLoader/README in source tree for other information. +# +# Tim.Bunce@ig.co.uk, August 1994 + +use vars qw($VERSION *AUTOLOAD); + +$VERSION = '1.05'; # avoid typo warning + +require AutoLoader; +*AUTOLOAD = \&AutoLoader::AUTOLOAD; + +use Config; + +# The following require can't be removed during maintenance +# releases, sadly, because of the risk of buggy code that does +# require Carp; Carp::croak "..."; without brackets dying +# if Carp hasn't been loaded in earlier compile time. :-( +# We'll let those bugs get found on the development track. +require Carp if $] < 5.00450; + +# enable debug/trace messages from DynaLoader perl code +$dl_debug = $ENV{PERL_DL_DEBUG} || 0 unless defined $dl_debug; + +# +# Flags to alter dl_load_file behaviour. Assigned bits: +# 0x01 make symbols available for linking later dl_load_file's. +# (only known to work on Solaris 2 using dlopen(RTLD_GLOBAL)) +# (ignored under VMS; effect is built-in to image linking) +# +# This is called as a class method $module->dl_load_flags. The +# definition here will be inherited and result on "default" loading +# behaviour unless a sub-class of DynaLoader defines its own version. +# + +sub dl_load_flags { 0x00 } + +# ($dl_dlext, $dlsrc) +# = @Config::Config{'dlext', 'dlsrc'}; + ($dl_dlext, $dlsrc) = ('dll','dl_win32.xs') +; +# Some systems need special handling to expand file specifications +# (VMS support by Charles Bailey <bailey@HMIVAX.HUMGEN.UPENN.EDU>) +# See dl_expandspec() for more details. Should be harmless but +# inefficient to define on systems that don't need it. +$Is_VMS = $^O eq 'VMS'; +$do_expand = $Is_VMS; +$Is_MacOS = $^O eq 'MacOS'; + +my $Mac_FS; +$Mac_FS = eval { require Mac::FileSpec::Unixish } if $Is_MacOS; + +@dl_require_symbols = (); # names of symbols we need +@dl_resolve_using = (); # names of files to link with +@dl_library_path = (); # path to look for files + +#XSLoader.pm may have added elements before we were required +#@dl_shared_objects = (); # shared objects for symbols we have +#@dl_librefs = (); # things we have loaded +#@dl_modules = (); # Modules we have loaded + +# This is a fix to support DLD's unfortunate desire to relink -lc +@dl_resolve_using = dl_findfile('-lc') if $dlsrc eq "dl_dld.xs"; + +# Initialise @dl_library_path with the 'standard' library path +# for this platform as determined by Configure. + +push(@dl_library_path, split(' ', $Config::Config{libpth})); + + +my $ldlibpthname = $Config::Config{ldlibpthname}; +my $ldlibpthname_defined = defined $Config::Config{ldlibpthname}; +my $pthsep = $Config::Config{path_sep}; + +# Add to @dl_library_path any extra directories we can gather from environment +# during runtime. + +if ($ldlibpthname_defined && + exists $ENV{$ldlibpthname}) { + push(@dl_library_path, split(/$pthsep/, $ENV{$ldlibpthname})); +} + +# E.g. HP-UX supports both its native SHLIB_PATH *and* LD_LIBRARY_PATH. + +if ($ldlibpthname_defined && + $ldlibpthname ne 'LD_LIBRARY_PATH' && + exists $ENV{LD_LIBRARY_PATH}) { + push(@dl_library_path, split(/$pthsep/, $ENV{LD_LIBRARY_PATH})); +} + + +# No prizes for guessing why we don't say 'bootstrap DynaLoader;' here. +# NOTE: All dl_*.xs (including dl_none.xs) define a dl_error() XSUB +boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) && + !defined(&dl_error); + +if ($dl_debug) { + print STDERR "DynaLoader.pm loaded (@INC, @dl_library_path)\n"; + print STDERR "DynaLoader not linked into this perl\n" + unless defined(&boot_DynaLoader); +} + +1; # End of main code + + +sub croak { require Carp; Carp::croak(@_) } + +sub bootstrap_inherit { + my $module = $_[0]; + local *isa = *{"$module\::ISA"}; + local @isa = (@isa, 'DynaLoader'); + # Cannot goto due to delocalization. Will report errors on a wrong line? + bootstrap(@_); +} + +# The bootstrap function cannot be autoloaded (without complications) +# so we define it here: + +sub bootstrap { + # use local vars to enable $module.bs script to edit values + local(@args) = @_; + local($module) = $args[0]; + local(@dirs, $file); + + unless ($module) { + require Carp; + Carp::confess("Usage: DynaLoader::bootstrap(module)"); + } + + # A common error on platforms which don't support dynamic loading. + # Since it's fatal and potentially confusing we give a detailed message. + croak("Can't load module $module, dynamic loading not available in this perl.\n". + " (You may need to build a new perl executable which either supports\n". + " dynamic loading or has the $module module statically linked into it.)\n") + unless defined(&dl_load_file); + + my @modparts = split(/::/,$module); + my $modfname = $modparts[-1]; + + # Some systems have restrictions on files names for DLL's etc. + # mod2fname returns appropriate file base name (typically truncated) + # It may also edit @modparts if required. + $modfname = &mod2fname(\@modparts) if defined &mod2fname; + + # Truncate the module name to 8.3 format for NetWare + if (($^O eq 'NetWare') && (length($modfname) > 8)) { + $modfname = substr($modfname, 0, 8); + } + + my $modpname = join(($Is_MacOS ? ':' : '/'),@modparts); + + print STDERR "DynaLoader::bootstrap for $module ", + ($Is_MacOS + ? "(:auto:$modpname:$modfname.$dl_dlext)\n" : + "(auto/$modpname/$modfname.$dl_dlext)\n") + if $dl_debug; + + foreach (@INC) { + chop($_ = VMS::Filespec::unixpath($_)) if $Is_VMS; + my $dir; + if ($Is_MacOS) { + my $path = $_; + if ($Mac_FS && ! -d $path) { + $path = Mac::FileSpec::Unixish::nativize($path); + } + $path .= ":" unless /:$/; + $dir = "${path}auto:$modpname"; + } else { + $dir = "$_/auto/$modpname"; + } + + next unless -d $dir; # skip over uninteresting directories + + # check for common cases to avoid autoload of dl_findfile + my $try = $Is_MacOS ? "$dir:$modfname.$dl_dlext" : "$dir/$modfname.$dl_dlext"; + last if $file = ($do_expand) ? dl_expandspec($try) : ((-f $try) && $try); + + # no luck here, save dir for possible later dl_findfile search + push @dirs, $dir; + } + # last resort, let dl_findfile have a go in all known locations + $file = dl_findfile(map("-L$_",@dirs,@INC), $modfname) unless $file; + + croak("Can't locate loadable object for module $module in \@INC (\@INC contains: @INC)") + unless $file; # wording similar to error from 'require' + + $file = uc($file) if $Is_VMS && $Config::Config{d_vms_case_sensitive_symbols}; + my $bootname = "boot_$module"; + $bootname =~ s/\W/_/g; + @dl_require_symbols = ($bootname); + + # Execute optional '.bootstrap' perl script for this module. + # The .bs file can be used to configure @dl_resolve_using etc to + # match the needs of the individual module on this architecture. + my $bs = $file; + $bs =~ s/(\.\w+)?(;\d*)?$/\.bs/; # look for .bs 'beside' the library + if (-s $bs) { # only read file if it's not empty + print STDERR "BS: $bs ($^O, $dlsrc)\n" if $dl_debug; + eval { do $bs; }; + warn "$bs: $@\n" if $@; + } + + my $boot_symbol_ref; + + if ($^O eq 'darwin') { + if ($boot_symbol_ref = dl_find_symbol(0, $bootname)) { + goto boot; #extension library has already been loaded, e.g. darwin + } + } + + # Many dynamic extension loading problems will appear to come from + # this section of code: XYZ failed at line 123 of DynaLoader.pm. + # Often these errors are actually occurring in the initialisation + # C code of the extension XS file. Perl reports the error as being + # in this perl code simply because this was the last perl code + # it executed. + + my $libref = dl_load_file($file, $module->dl_load_flags) or + croak("Can't load '$file' for module $module: ".dl_error()); + + push(@dl_librefs,$libref); # record loaded object + + my @unresolved = dl_undef_symbols(); + if (@unresolved) { + require Carp; + Carp::carp("Undefined symbols present after loading $file: @unresolved\n"); + } + + $boot_symbol_ref = dl_find_symbol($libref, $bootname) or + croak("Can't find '$bootname' symbol in $file\n"); + + push(@dl_modules, $module); # record loaded module + + boot: + my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file); + + # See comment block above + + push(@dl_shared_objects, $file); # record files loaded + + &$xs(@args); +} + + +#sub _check_file { # private utility to handle dl_expandspec vs -f tests +# my($file) = @_; +# return $file if (!$do_expand && -f $file); # the common case +# return $file if ( $do_expand && ($file=dl_expandspec($file))); +# return undef; +#} + + +# Let autosplit and the autoloader deal with these functions: +__END__ + + +sub dl_findfile { + # Read ext/DynaLoader/DynaLoader.doc for detailed information. + # This function does not automatically consider the architecture + # or the perl library auto directories. + my (@args) = @_; + my (@dirs, $dir); # which directories to search + my (@found); # full paths to real files we have found + my $dl_ext= 'dll'; # $Config::Config{'dlext'} suffix for perl extensions + my $dl_so = 'dll'; # $Config::Config{'so'} suffix for shared libraries + + print STDERR "dl_findfile(@args)\n" if $dl_debug; + + # accumulate directories but process files as they appear + arg: foreach(@args) { + # Special fast case: full filepath requires no search + if ($Is_VMS && m%[:>/\]]% && -f $_) { + push(@found,dl_expandspec(VMS::Filespec::vmsify($_))); + last arg unless wantarray; + next; + } + elsif ($Is_MacOS) { + if (m/:/ && -f $_) { + push(@found,$_); + last arg unless wantarray; + } + } + elsif (m:/: && -f $_ && !$do_expand) { + push(@found,$_); + last arg unless wantarray; + next; + } + + # Deal with directories first: + # Using a -L prefix is the preferred option (faster and more robust) + if (m:^-L:) { s/^-L//; push(@dirs, $_); next; } + + if ($Is_MacOS) { + # Otherwise we try to try to spot directories by a heuristic + # (this is a more complicated issue than it first appears) + if (m/:/ && -d $_) { push(@dirs, $_); next; } + # Only files should get this far... + my(@names, $name); # what filenames to look for + s/^-l//; + push(@names, $_); + foreach $dir (@dirs, @dl_library_path) { + next unless -d $dir; + $dir =~ s/^([^:]+)$/:$1/; + $dir =~ s/:$//; + foreach $name (@names) { + my($file) = "$dir:$name"; + print STDERR " checking in $dir for $name\n" if $dl_debug; + if (-f $file) { + push(@found, $file); + next arg; # no need to look any further + } + } + } + next; + } + + # Otherwise we try to try to spot directories by a heuristic + # (this is a more complicated issue than it first appears) + if (m:/: && -d $_) { push(@dirs, $_); next; } + + # VMS: we may be using native VMS directory syntax instead of + # Unix emulation, so check this as well + if ($Is_VMS && /[:>\]]/ && -d $_) { push(@dirs, $_); next; } + + # Only files should get this far... + my(@names, $name); # what filenames to look for + if (m:-l: ) { # convert -lname to appropriate library name + s/-l//; + push(@names,"lib$_.$dl_so"); + push(@names,"lib$_.a"); + } else { # Umm, a bare name. Try various alternatives: + # these should be ordered with the most likely first + push(@names,"$_.$dl_ext") unless m/\.$dl_ext$/o; + push(@names,"$_.$dl_so") unless m/\.$dl_so$/o; + push(@names,"lib$_.$dl_so") unless m:/:; + push(@names,"$_.a") if !m/\.a$/ and $dlsrc eq "dl_dld.xs"; + push(@names, $_); + } + foreach $dir (@dirs, @dl_library_path) { + next unless -d $dir; + chop($dir = VMS::Filespec::unixpath($dir)) if $Is_VMS; + foreach $name (@names) { + my($file) = "$dir/$name"; + print STDERR " checking in $dir for $name\n" if $dl_debug; + $file = ($do_expand) ? dl_expandspec($file) : (-f $file && $file); + #$file = _check_file($file); + if ($file) { + push(@found, $file); + next arg; # no need to look any further + } + } + } + } + if ($dl_debug) { + foreach(@dirs) { + print STDERR " dl_findfile ignored non-existent directory: $_\n" unless -d $_; + } + print STDERR "dl_findfile found: @found\n"; + } + return $found[0] unless wantarray; + @found; +} + + +sub dl_expandspec { + my($spec) = @_; + # Optional function invoked if DynaLoader.pm sets $do_expand. + # Most systems do not require or use this function. + # Some systems may implement it in the dl_*.xs file in which case + # this autoload version will not be called but is harmless. + + # This function is designed to deal with systems which treat some + # 'filenames' in a special way. For example VMS 'Logical Names' + # (something like unix environment variables - but different). + # This function should recognise such names and expand them into + # full file paths. + # Must return undef if $spec is invalid or file does not exist. + + my $file = $spec; # default output to input + + if ($Is_VMS) { # dl_expandspec should be defined in dl_vms.xs + require Carp; + Carp::croak("dl_expandspec: should be defined in XS file!\n"); + } else { + return undef unless -f $file; + } + print STDERR "dl_expandspec($spec) => $file\n" if $dl_debug; + $file; +} + +sub dl_find_symbol_anywhere +{ + my $sym = shift; + my $libref; + foreach $libref (@dl_librefs) { + my $symref = dl_find_symbol($libref,$sym); + return $symref if $symref; + } + return undef; +} + +=head1 NAME + +DynaLoader - Dynamically load C libraries into Perl code + +=head1 SYNOPSIS + + package YourPackage; + require DynaLoader; + @ISA = qw(... DynaLoader ...); + bootstrap YourPackage; + + # optional method for 'global' loading + sub dl_load_flags { 0x01 } + + +=head1 DESCRIPTION + +This document defines a standard generic interface to the dynamic +linking mechanisms available on many platforms. Its primary purpose is +to implement automatic dynamic loading of Perl modules. + +This document serves as both a specification for anyone wishing to +implement the DynaLoader for a new platform and as a guide for +anyone wishing to use the DynaLoader directly in an application. + +The DynaLoader is designed to be a very simple high-level +interface that is sufficiently general to cover the requirements +of SunOS, HP-UX, NeXT, Linux, VMS and other platforms. + +It is also hoped that the interface will cover the needs of OS/2, NT +etc and also allow pseudo-dynamic linking (using C<ld -A> at runtime). + +It must be stressed that the DynaLoader, by itself, is practically +useless for accessing non-Perl libraries because it provides almost no +Perl-to-C 'glue'. There is, for example, no mechanism for calling a C +library function or supplying arguments. A C::DynaLib module +is available from CPAN sites which performs that function for some +common system types. And since the year 2000, there's also Inline::C, +a module that allows you to write Perl subroutines in C. Also available +from your local CPAN site. + +DynaLoader Interface Summary + + @dl_library_path + @dl_resolve_using + @dl_require_symbols + $dl_debug + @dl_librefs + @dl_modules + @dl_shared_objects + Implemented in: + bootstrap($modulename) Perl + @filepaths = dl_findfile(@names) Perl + $flags = $modulename->dl_load_flags Perl + $symref = dl_find_symbol_anywhere($symbol) Perl + + $libref = dl_load_file($filename, $flags) C + $status = dl_unload_file($libref) C + $symref = dl_find_symbol($libref, $symbol) C + @symbols = dl_undef_symbols() C + dl_install_xsub($name, $symref [, $filename]) C + $message = dl_error C + +=over 4 + +=item @dl_library_path + +The standard/default list of directories in which dl_findfile() will +search for libraries etc. Directories are searched in order: +$dl_library_path[0], [1], ... etc + +@dl_library_path is initialised to hold the list of 'normal' directories +(F</usr/lib>, etc) determined by B<Configure> (C<$Config{'libpth'}>). This should +ensure portability across a wide range of platforms. + +@dl_library_path should also be initialised with any other directories +that can be determined from the environment at runtime (such as +LD_LIBRARY_PATH for SunOS). + +After initialisation @dl_library_path can be manipulated by an +application using push and unshift before calling dl_findfile(). +Unshift can be used to add directories to the front of the search order +either to save search time or to override libraries with the same name +in the 'normal' directories. + +The load function that dl_load_file() calls may require an absolute +pathname. The dl_findfile() function and @dl_library_path can be +used to search for and return the absolute pathname for the +library/object that you wish to load. + +=item @dl_resolve_using + +A list of additional libraries or other shared objects which can be +used to resolve any undefined symbols that might be generated by a +later call to load_file(). + +This is only required on some platforms which do not handle dependent +libraries automatically. For example the Socket Perl extension +library (F<auto/Socket/Socket.so>) contains references to many socket +functions which need to be resolved when it's loaded. Most platforms +will automatically know where to find the 'dependent' library (e.g., +F</usr/lib/libsocket.so>). A few platforms need to be told the +location of the dependent library explicitly. Use @dl_resolve_using +for this. + +Example usage: + + @dl_resolve_using = dl_findfile('-lsocket'); + +=item @dl_require_symbols + +A list of one or more symbol names that are in the library/object file +to be dynamically loaded. This is only required on some platforms. + +=item @dl_librefs + +An array of the handles returned by successful calls to dl_load_file(), +made by bootstrap, in the order in which they were loaded. +Can be used with dl_find_symbol() to look for a symbol in any of +the loaded files. + +=item @dl_modules + +An array of module (package) names that have been bootstrap'ed. + +=item @dl_shared_objects + +An array of file names for the shared objects that were loaded. + +=item dl_error() + +Syntax: + + $message = dl_error(); + +Error message text from the last failed DynaLoader function. Note +that, similar to errno in unix, a successful function call does not +reset this message. + +Implementations should detect the error as soon as it occurs in any of +the other functions and save the corresponding message for later +retrieval. This will avoid problems on some platforms (such as SunOS) +where the error message is very temporary (e.g., dlerror()). + +=item $dl_debug + +Internal debugging messages are enabled when $dl_debug is set true. +Currently setting $dl_debug only affects the Perl side of the +DynaLoader. These messages should help an application developer to +resolve any DynaLoader usage problems. + +$dl_debug is set to C<$ENV{'PERL_DL_DEBUG'}> if defined. + +For the DynaLoader developer/porter there is a similar debugging +variable added to the C code (see dlutils.c) and enabled if Perl was +built with the B<-DDEBUGGING> flag. This can also be set via the +PERL_DL_DEBUG environment variable. Set to 1 for minimal information or +higher for more. + +=item dl_findfile() + +Syntax: + + @filepaths = dl_findfile(@names) + +Determine the full paths (including file suffix) of one or more +loadable files given their generic names and optionally one or more +directories. Searches directories in @dl_library_path by default and +returns an empty list if no files were found. + +Names can be specified in a variety of platform independent forms. Any +names in the form B<-lname> are converted into F<libname.*>, where F<.*> is +an appropriate suffix for the platform. + +If a name does not already have a suitable prefix and/or suffix then +the corresponding file will be searched for by trying combinations of +prefix and suffix appropriate to the platform: "$name.o", "lib$name.*" +and "$name". + +If any directories are included in @names they are searched before +@dl_library_path. Directories may be specified as B<-Ldir>. Any other +names are treated as filenames to be searched for. + +Using arguments of the form C<-Ldir> and C<-lname> is recommended. + +Example: + + @dl_resolve_using = dl_findfile(qw(-L/usr/5lib -lposix)); + + +=item dl_expandspec() + +Syntax: + + $filepath = dl_expandspec($spec) + +Some unusual systems, such as VMS, require special filename handling in +order to deal with symbolic names for files (i.e., VMS's Logical Names). + +To support these systems a dl_expandspec() function can be implemented +either in the F<dl_*.xs> file or code can be added to the autoloadable +dl_expandspec() function in F<DynaLoader.pm>. See F<DynaLoader.pm> for +more information. + +=item dl_load_file() + +Syntax: + + $libref = dl_load_file($filename, $flags) + +Dynamically load $filename, which must be the path to a shared object +or library. An opaque 'library reference' is returned as a handle for +the loaded object. Returns undef on error. + +The $flags argument to alters dl_load_file behaviour. +Assigned bits: + + 0x01 make symbols available for linking later dl_load_file's. + (only known to work on Solaris 2 using dlopen(RTLD_GLOBAL)) + (ignored under VMS; this is a normal part of image linking) + +(On systems that provide a handle for the loaded object such as SunOS +and HPUX, $libref will be that handle. On other systems $libref will +typically be $filename or a pointer to a buffer containing $filename. +The application should not examine or alter $libref in any way.) + +This is the function that does the real work. It should use the +current values of @dl_require_symbols and @dl_resolve_using if required. + + SunOS: dlopen($filename) + HP-UX: shl_load($filename) + Linux: dld_create_reference(@dl_require_symbols); dld_link($filename) + NeXT: rld_load($filename, @dl_resolve_using) + VMS: lib$find_image_symbol($filename,$dl_require_symbols[0]) + +(The dlopen() function is also used by Solaris and some versions of +Linux, and is a common choice when providing a "wrapper" on other +mechanisms as is done in the OS/2 port.) + +=item dl_unload_file() + +Syntax: + + $status = dl_unload_file($libref) + +Dynamically unload $libref, which must be an opaque 'library reference' as +returned from dl_load_file. Returns one on success and zero on failure. + +This function is optional and may not necessarily be provided on all platforms. +If it is defined, it is called automatically when the interpreter exits for +every shared object or library loaded by DynaLoader::bootstrap. All such +library references are stored in @dl_librefs by DynaLoader::Bootstrap as it +loads the libraries. The files are unloaded in last-in, first-out order. + +This unloading is usually necessary when embedding a shared-object perl (e.g. +one configured with -Duseshrplib) within a larger application, and the perl +interpreter is created and destroyed several times within the lifetime of the +application. In this case it is possible that the system dynamic linker will +unload and then subsequently reload the shared libperl without relocating any +references to it from any files DynaLoaded by the previous incarnation of the +interpreter. As a result, any shared objects opened by DynaLoader may point to +a now invalid 'ghost' of the libperl shared object, causing apparently random +memory corruption and crashes. This behaviour is most commonly seen when using +Apache and mod_perl built with the APXS mechanism. + + SunOS: dlclose($libref) + HP-UX: ??? + Linux: ??? + NeXT: ??? + VMS: ??? + +(The dlclose() function is also used by Solaris and some versions of +Linux, and is a common choice when providing a "wrapper" on other +mechanisms as is done in the OS/2 port.) + +=item dl_load_flags() + +Syntax: + + $flags = dl_load_flags $modulename; + +Designed to be a method call, and to be overridden by a derived class +(i.e. a class which has DynaLoader in its @ISA). The definition in +DynaLoader itself returns 0, which produces standard behavior from +dl_load_file(). + +=item dl_find_symbol() + +Syntax: + + $symref = dl_find_symbol($libref, $symbol) + +Return the address of the symbol $symbol or C<undef> if not found. If the +target system has separate functions to search for symbols of different +types then dl_find_symbol() should search for function symbols first and +then other types. + +The exact manner in which the address is returned in $symref is not +currently defined. The only initial requirement is that $symref can +be passed to, and understood by, dl_install_xsub(). + + SunOS: dlsym($libref, $symbol) + HP-UX: shl_findsym($libref, $symbol) + Linux: dld_get_func($symbol) and/or dld_get_symbol($symbol) + NeXT: rld_lookup("_$symbol") + VMS: lib$find_image_symbol($libref,$symbol) + + +=item dl_find_symbol_anywhere() + +Syntax: + + $symref = dl_find_symbol_anywhere($symbol) + +Applies dl_find_symbol() to the members of @dl_librefs and returns +the first match found. + +=item dl_undef_symbols() + +Example + + @symbols = dl_undef_symbols() + +Return a list of symbol names which remain undefined after load_file(). +Returns C<()> if not known. Don't worry if your platform does not provide +a mechanism for this. Most do not need it and hence do not provide it, +they just return an empty list. + + +=item dl_install_xsub() + +Syntax: + + dl_install_xsub($perl_name, $symref [, $filename]) + +Create a new Perl external subroutine named $perl_name using $symref as +a pointer to the function which implements the routine. This is simply +a direct call to newXSUB(). Returns a reference to the installed +function. + +The $filename parameter is used by Perl to identify the source file for +the function if required by die(), caller() or the debugger. If +$filename is not defined then "DynaLoader" will be used. + + +=item bootstrap() + +Syntax: + +bootstrap($module) + +This is the normal entry point for automatic dynamic loading in Perl. + +It performs the following actions: + +=over 8 + +=item * + +locates an auto/$module directory by searching @INC + +=item * + +uses dl_findfile() to determine the filename to load + +=item * + +sets @dl_require_symbols to C<("boot_$module")> + +=item * + +executes an F<auto/$module/$module.bs> file if it exists +(typically used to add to @dl_resolve_using any files which +are required to load the module on the current platform) + +=item * + +calls dl_load_flags() to determine how to load the file. + +=item * + +calls dl_load_file() to load the file + +=item * + +calls dl_undef_symbols() and warns if any symbols are undefined + +=item * + +calls dl_find_symbol() for "boot_$module" + +=item * + +calls dl_install_xsub() to install it as "${module}::bootstrap" + +=item * + +calls &{"${module}::bootstrap"} to bootstrap the module (actually +it uses the function reference returned by dl_install_xsub for speed) + +=back + +=back + + +=head1 AUTHOR + +Tim Bunce, 11 August 1994. + +This interface is based on the work and comments of (in no particular +order): Larry Wall, Robert Sanders, Dean Roehrich, Jeff Okamoto, Anno +Siegel, Thomas Neumann, Paul Marquess, Charles Bailey, myself and others. + +Larry Wall designed the elegant inherited bootstrap mechanism and +implemented the first Perl 5 dynamic loader using it. + +Solaris global loading added by Nick Ing-Simmons with design/coding +assistance from Tim Bunce, January 1996. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode.pm b/Master/tlpkg/tlperl.old/lib/Encode.pm new file mode 100644 index 00000000000..ac0123c89ec --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode.pm @@ -0,0 +1,851 @@ +# +# $Id: Encode.pm,v 2.12 2005/09/08 14:17:17 dankogai Exp dankogai $ +# +package Encode; +use strict; +our $VERSION = sprintf "%d.%02d", q$Revision: 2.12 $ =~ /(\d+)/g; +sub DEBUG () { 0 } +use XSLoader (); +XSLoader::load(__PACKAGE__, $VERSION); + +require Exporter; +use base qw/Exporter/; + +# Public, encouraged API is exported by default + +our @EXPORT = qw( + decode decode_utf8 encode encode_utf8 + encodings find_encoding clone_encoding +); + +our @FB_FLAGS = qw(DIE_ON_ERR WARN_ON_ERR RETURN_ON_ERR LEAVE_SRC + PERLQQ HTMLCREF XMLCREF STOP_AT_PARTIAL); +our @FB_CONSTS = qw(FB_DEFAULT FB_CROAK FB_QUIET FB_WARN + FB_PERLQQ FB_HTMLCREF FB_XMLCREF); + +our @EXPORT_OK = + ( + qw( + _utf8_off _utf8_on define_encoding from_to is_16bit is_8bit + is_utf8 perlio_ok resolve_alias utf8_downgrade utf8_upgrade + ), + @FB_FLAGS, @FB_CONSTS, + ); + +our %EXPORT_TAGS = + ( + all => [ @EXPORT, @EXPORT_OK ], + fallbacks => [ @FB_CONSTS ], + fallback_all => [ @FB_CONSTS, @FB_FLAGS ], + ); + +# Documentation moved after __END__ for speed - NI-S + +our $ON_EBCDIC = (ord("A") == 193); + +use Encode::Alias; + +# Make a %Encoding package variable to allow a certain amount of cheating +our %Encoding; +our %ExtModule; +require Encode::Config; +eval { require Encode::ConfigLocal }; + +sub encodings +{ + my $class = shift; + my %enc; + if (@_ and $_[0] eq ":all"){ + %enc = ( %Encoding, %ExtModule ); + }else{ + %enc = %Encoding; + for my $mod (map {m/::/o ? $_ : "Encode::$_" } @_){ + DEBUG and warn $mod; + for my $enc (keys %ExtModule){ + $ExtModule{$enc} eq $mod and $enc{$enc} = $mod; + } + } + } + return + sort { lc $a cmp lc $b } + grep {!/^(?:Internal|Unicode|Guess)$/o} keys %enc; +} + +sub perlio_ok{ + my $obj = ref($_[0]) ? $_[0] : find_encoding($_[0]); + $obj->can("perlio_ok") and return $obj->perlio_ok(); + return 0; # safety net +} + +sub define_encoding +{ + my $obj = shift; + my $name = shift; + $Encoding{$name} = $obj; + my $lc = lc($name); + define_alias($lc => $obj) unless $lc eq $name; + while (@_){ + my $alias = shift; + define_alias($alias, $obj); + } + return $obj; +} + +sub getEncoding +{ + my ($class, $name, $skip_external) = @_; + + ref($name) && $name->can('renew') and return $name; + exists $Encoding{$name} and return $Encoding{$name}; + my $lc = lc $name; + exists $Encoding{$lc} and return $Encoding{$lc}; + + my $oc = $class->find_alias($name); + defined($oc) and return $oc; + $lc ne $name and $oc = $class->find_alias($lc); + defined($oc) and return $oc; + + unless ($skip_external) + { + if (my $mod = $ExtModule{$name} || $ExtModule{$lc}){ + $mod =~ s,::,/,g ; $mod .= '.pm'; + eval{ require $mod; }; + exists $Encoding{$name} and return $Encoding{$name}; + } + } + return; +} + +sub find_encoding($;$) +{ + my ($name, $skip_external) = @_; + return __PACKAGE__->getEncoding($name,$skip_external); +} + +sub resolve_alias($){ + my $obj = find_encoding(shift); + defined $obj and return $obj->name; + return; +} + +sub clone_encoding($){ + my $obj = find_encoding(shift); + ref $obj or return; + eval { require Storable }; + $@ and return; + return Storable::dclone($obj); +} + +sub encode($$;$) +{ + my ($name, $string, $check) = @_; + return undef unless defined $string; + $string .= '' if ref $string; # stringify; + $check ||=0; + my $enc = find_encoding($name); + unless(defined $enc){ + require Carp; + Carp::croak("Unknown encoding '$name'"); + } + my $octets = $enc->encode($string,$check); + $_[1] = $string if $check and !($check & LEAVE_SRC()); + return $octets; +} + +sub decode($$;$) +{ + my ($name,$octets,$check) = @_; + return undef unless defined $octets; + $octets .= '' if ref $octets; + $check ||=0; + my $enc = find_encoding($name); + unless(defined $enc){ + require Carp; + Carp::croak("Unknown encoding '$name'"); + } + my $string = $enc->decode($octets,$check); + $_[1] = $octets if $check and !($check & LEAVE_SRC()); + return $string; +} + +sub from_to($$$;$) +{ + my ($string,$from,$to,$check) = @_; + return undef unless defined $string; + $check ||=0; + my $f = find_encoding($from); + unless (defined $f){ + require Carp; + Carp::croak("Unknown encoding '$from'"); + } + my $t = find_encoding($to); + unless (defined $t){ + require Carp; + Carp::croak("Unknown encoding '$to'"); + } + my $uni = $f->decode($string,$check); + return undef if ($check && length($string)); + $string = $t->encode($uni,$check); + return undef if ($check && length($uni)); + return defined($_[0] = $string) ? length($string) : undef ; +} + +sub encode_utf8($) +{ + my ($str) = @_; + utf8::encode($str); + return $str; +} + +sub decode_utf8($;$) +{ + my ($str, $check) = @_; + if ($check){ + return decode("utf8", $str, $check); + }else{ + return decode("utf8", $str); + return $str; + } +} + +predefine_encodings(1); + +# +# This is to restore %Encoding if really needed; +# + +sub predefine_encodings{ + use Encode::Encoding; + no warnings 'redefine'; + my $use_xs = shift; + if ($ON_EBCDIC) { + # was in Encode::UTF_EBCDIC + package Encode::UTF_EBCDIC; + push @Encode::UTF_EBCDIC::ISA, 'Encode::Encoding'; + *decode = sub{ + my ($obj,$str,$chk) = @_; + my $res = ''; + for (my $i = 0; $i < length($str); $i++) { + $res .= + chr(utf8::unicode_to_native(ord(substr($str,$i,1)))); + } + $_[1] = '' if $chk; + return $res; + }; + *encode = sub{ + my ($obj,$str,$chk) = @_; + my $res = ''; + for (my $i = 0; $i < length($str); $i++) { + $res .= + chr(utf8::native_to_unicode(ord(substr($str,$i,1)))); + } + $_[1] = '' if $chk; + return $res; + }; + $Encode::Encoding{Unicode} = + bless {Name => "UTF_EBCDIC"} => "Encode::UTF_EBCDIC"; + } else { + package Encode::Internal; + push @Encode::Internal::ISA, 'Encode::Encoding'; + *decode = sub{ + my ($obj,$str,$chk) = @_; + utf8::upgrade($str); + $_[1] = '' if $chk; + return $str; + }; + *encode = \&decode; + $Encode::Encoding{Unicode} = + bless {Name => "Internal"} => "Encode::Internal"; + } + + { + # was in Encode::utf8 + package Encode::utf8; + push @Encode::utf8::ISA, 'Encode::Encoding'; + # + if ($use_xs){ + Encode::DEBUG and warn __PACKAGE__, " XS on"; + *decode = \&decode_xs; + *encode = \&encode_xs; + }else{ + Encode::DEBUG and warn __PACKAGE__, " XS off"; + *decode = sub{ + my ($obj,$octets,$chk) = @_; + my $str = Encode::decode_utf8($octets); + if (defined $str) { + $_[1] = '' if $chk; + return $str; + } + return undef; + }; + *encode = sub { + my ($obj,$string,$chk) = @_; + my $octets = Encode::encode_utf8($string); + $_[1] = '' if $chk; + return $octets; + }; + } + *cat_decode = sub{ # ($obj, $dst, $src, $pos, $trm, $chk) + my ($obj, undef, undef, $pos, $trm) = @_; # currently ignores $chk + my ($rdst, $rsrc, $rpos) = \@_[1,2,3]; + use bytes; + if ((my $npos = index($$rsrc, $trm, $pos)) >= 0) { + $$rdst .= substr($$rsrc, $pos, $npos - $pos + length($trm)); + $$rpos = $npos + length($trm); + return 1; + } + $$rdst .= substr($$rsrc, $pos); + $$rpos = length($$rsrc); + return ''; + }; + $Encode::Encoding{utf8} = + bless {Name => "utf8"} => "Encode::utf8"; + $Encode::Encoding{"utf-8-strict"} = + bless {Name => "utf-8-strict", strict_utf8 => 1 } => "Encode::utf8"; + } +} + +1; + +__END__ + +=head1 NAME + +Encode - character encodings + +=head1 SYNOPSIS + + use Encode; + +=head2 Table of Contents + +Encode consists of a collection of modules whose details are too big +to fit in one document. This POD itself explains the top-level APIs +and general topics at a glance. For other topics and more details, +see the PODs below: + + Name Description + -------------------------------------------------------- + Encode::Alias Alias definitions to encodings + Encode::Encoding Encode Implementation Base Class + Encode::Supported List of Supported Encodings + Encode::CN Simplified Chinese Encodings + Encode::JP Japanese Encodings + Encode::KR Korean Encodings + Encode::TW Traditional Chinese Encodings + -------------------------------------------------------- + +=head1 DESCRIPTION + +The C<Encode> module provides the interfaces between Perl's strings +and the rest of the system. Perl strings are sequences of +B<characters>. + +The repertoire of characters that Perl can represent is at least that +defined by the Unicode Consortium. On most platforms the ordinal +values of the characters (as returned by C<ord(ch)>) is the "Unicode +codepoint" for the character (the exceptions are those platforms where +the legacy encoding is some variant of EBCDIC rather than a super-set +of ASCII - see L<perlebcdic>). + +Traditionally, computer data has been moved around in 8-bit chunks +often called "bytes". These chunks are also known as "octets" in +networking standards. Perl is widely used to manipulate data of many +types - not only strings of characters representing human or computer +languages but also "binary" data being the machine's representation of +numbers, pixels in an image - or just about anything. + +When Perl is processing "binary data", the programmer wants Perl to +process "sequences of bytes". This is not a problem for Perl - as a +byte has 256 possible values, it easily fits in Perl's much larger +"logical character". + +=head2 TERMINOLOGY + +=over 2 + +=item * + +I<character>: a character in the range 0..(2**32-1) (or more). +(What Perl's strings are made of.) + +=item * + +I<byte>: a character in the range 0..255 +(A special case of a Perl character.) + +=item * + +I<octet>: 8 bits of data, with ordinal values 0..255 +(Term for bytes passed to or from a non-Perl context, e.g. a disk file.) + +=back + +=head1 PERL ENCODING API + +=over 2 + +=item $octets = encode(ENCODING, $string [, CHECK]) + +Encodes a string from Perl's internal form into I<ENCODING> and returns +a sequence of octets. ENCODING can be either a canonical name or +an alias. For encoding names and aliases, see L</"Defining Aliases">. +For CHECK, see L</"Handling Malformed Data">. + +For example, to convert a string from Perl's internal format to +iso-8859-1 (also known as Latin1), + + $octets = encode("iso-8859-1", $string); + +B<CAVEAT>: When you run C<$octets = encode("utf8", $string)>, then $octets +B<may not be equal to> $string. Though they both contain the same data, the utf8 flag +for $octets is B<always> off. When you encode anything, utf8 flag of +the result is always off, even when it contains completely valid utf8 +string. See L</"The UTF-8 flag"> below. + +If the $string is C<undef> then C<undef> is returned. + +=item $string = decode(ENCODING, $octets [, CHECK]) + +Decodes a sequence of octets assumed to be in I<ENCODING> into Perl's +internal form and returns the resulting string. As in encode(), +ENCODING can be either a canonical name or an alias. For encoding names +and aliases, see L</"Defining Aliases">. For CHECK, see +L</"Handling Malformed Data">. + +For example, to convert ISO-8859-1 data to a string in Perl's internal format: + + $string = decode("iso-8859-1", $octets); + +B<CAVEAT>: When you run C<$string = decode("utf8", $octets)>, then $string +B<may not be equal to> $octets. Though they both contain the same data, +the utf8 flag for $string is on unless $octets entirely consists of +ASCII data (or EBCDIC on EBCDIC machines). See L</"The UTF-8 flag"> +below. + +If the $string is C<undef> then C<undef> is returned. + +=item [$length =] from_to($octets, FROM_ENC, TO_ENC [, CHECK]) + +Converts B<in-place> data between two encodings. The data in $octets +must be encoded as octets and not as characters in Perl's internal +format. For example, to convert ISO-8859-1 data to Microsoft's CP1250 +encoding: + + from_to($octets, "iso-8859-1", "cp1250"); + +and to convert it back: + + from_to($octets, "cp1250", "iso-8859-1"); + +Note that because the conversion happens in place, the data to be +converted cannot be a string constant; it must be a scalar variable. + +from_to() returns the length of the converted string in octets on +success, I<undef> on error. + +B<CAVEAT>: The following operations look the same but are not quite so; + + from_to($data, "iso-8859-1", "utf8"); #1 + $data = decode("iso-8859-1", $data); #2 + +Both #1 and #2 make $data consist of a completely valid UTF-8 string +but only #2 turns utf8 flag on. #1 is equivalent to + + $data = encode("utf8", decode("iso-8859-1", $data)); + +See L</"The UTF-8 flag"> below. + +=item $octets = encode_utf8($string); + +Equivalent to C<$octets = encode("utf8", $string);> The characters +that comprise $string are encoded in Perl's internal format and the +result is returned as a sequence of octets. All possible +characters have a UTF-8 representation so this function cannot fail. + + +=item $string = decode_utf8($octets [, CHECK]); + +equivalent to C<$string = decode("utf8", $octets [, CHECK])>. +The sequence of octets represented by +$octets is decoded from UTF-8 into a sequence of logical +characters. Not all sequences of octets form valid UTF-8 encodings, so +it is possible for this call to fail. For CHECK, see +L</"Handling Malformed Data">. + +=back + +=head2 Listing available encodings + + use Encode; + @list = Encode->encodings(); + +Returns a list of the canonical names of the available encodings that +are loaded. To get a list of all available encodings including the +ones that are not loaded yet, say + + @all_encodings = Encode->encodings(":all"); + +Or you can give the name of a specific module. + + @with_jp = Encode->encodings("Encode::JP"); + +When "::" is not in the name, "Encode::" is assumed. + + @ebcdic = Encode->encodings("EBCDIC"); + +To find out in detail which encodings are supported by this package, +see L<Encode::Supported>. + +=head2 Defining Aliases + +To add a new alias to a given encoding, use: + + use Encode; + use Encode::Alias; + define_alias(newName => ENCODING); + +After that, newName can be used as an alias for ENCODING. +ENCODING may be either the name of an encoding or an +I<encoding object> + +But before you do so, make sure the alias is nonexistent with +C<resolve_alias()>, which returns the canonical name thereof. +i.e. + + Encode::resolve_alias("latin1") eq "iso-8859-1" # true + Encode::resolve_alias("iso-8859-12") # false; nonexistent + Encode::resolve_alias($name) eq $name # true if $name is canonical + +resolve_alias() does not need C<use Encode::Alias>; it can be +exported via C<use Encode qw(resolve_alias)>. + +See L<Encode::Alias> for details. + +=head1 Encoding via PerlIO + +If your perl supports I<PerlIO> (which is the default), you can use a PerlIO layer to decode +and encode directly via a filehandle. The following two examples +are totally identical in their functionality. + + # via PerlIO + open my $in, "<:encoding(shiftjis)", $infile or die; + open my $out, ">:encoding(euc-jp)", $outfile or die; + while(<$in>){ print $out $_; } + + # via from_to + open my $in, "<", $infile or die; + open my $out, ">", $outfile or die; + while(<$in>){ + from_to($_, "shiftjis", "euc-jp", 1); + print $out $_; + } + +Unfortunately, it may be that encodings are PerlIO-savvy. You can check +if your encoding is supported by PerlIO by calling the C<perlio_ok> +method. + + Encode::perlio_ok("hz"); # False + find_encoding("euc-cn")->perlio_ok; # True where PerlIO is available + + use Encode qw(perlio_ok); # exported upon request + perlio_ok("euc-jp") + +Fortunately, all encodings that come with Encode core are PerlIO-savvy +except for hz and ISO-2022-kr. For gory details, see +L<Encode::Encoding> and L<Encode::PerlIO>. + +=head1 Handling Malformed Data + +The optional I<CHECK> argument tells Encode what to do when it +encounters malformed data. Without CHECK, Encode::FB_DEFAULT ( == 0 ) +is assumed. + +As of version 2.12 Encode supports coderef values for CHECK. See below. + +=over 2 + +=item B<NOTE:> Not all encoding support this feature + +Some encodings ignore I<CHECK> argument. For example, +L<Encode::Unicode> ignores I<CHECK> and it always croaks on error. + +=back + +Now here is the list of I<CHECK> values available + +=over 2 + +=item I<CHECK> = Encode::FB_DEFAULT ( == 0) + +If I<CHECK> is 0, (en|de)code will put a I<substitution character> in +place of a malformed character. When you encode, E<lt>subcharE<gt> +will be used. When you decode the code point C<0xFFFD> is used. If +the data is supposed to be UTF-8, an optional lexical warning +(category utf8) is given. + +=item I<CHECK> = Encode::FB_CROAK ( == 1) + +If I<CHECK> is 1, methods will die on error immediately with an error +message. Therefore, when I<CHECK> is set to 1, you should trap the +error with eval{} unless you really want to let it die. + +=item I<CHECK> = Encode::FB_QUIET + +If I<CHECK> is set to Encode::FB_QUIET, (en|de)code will immediately +return the portion of the data that has been processed so far when an +error occurs. The data argument will be overwritten with everything +after that point (that is, the unprocessed part of data). This is +handy when you have to call decode repeatedly in the case where your +source data may contain partial multi-byte character sequences, +(i.e. you are reading with a fixed-width buffer). Here is a sample +code that does exactly this: + + my $buffer = ''; my $string = ''; + while(read $fh, $buffer, 256, length($buffer)){ + $string .= decode($encoding, $buffer, Encode::FB_QUIET); + # $buffer now contains the unprocessed partial character + } + +=item I<CHECK> = Encode::FB_WARN + +This is the same as above, except that it warns on error. Handy when +you are debugging the mode above. + +=item perlqq mode (I<CHECK> = Encode::FB_PERLQQ) + +=item HTML charref mode (I<CHECK> = Encode::FB_HTMLCREF) + +=item XML charref mode (I<CHECK> = Encode::FB_XMLCREF) + +For encodings that are implemented by Encode::XS, CHECK == +Encode::FB_PERLQQ turns (en|de)code into C<perlqq> fallback mode. + +When you decode, C<\xI<HH>> will be inserted for a malformed character, +where I<HH> is the hex representation of the octet that could not be +decoded to utf8. And when you encode, C<\x{I<HHHH>}> will be inserted, +where I<HHHH> is the Unicode ID of the character that cannot be found +in the character repertoire of the encoding. + +HTML/XML character reference modes are about the same, in place of +C<\x{I<HHHH>}>, HTML uses C<&#I<NNN>;> where I<NNN> is a decimal number and +XML uses C<&#xI<HHHH>;> where I<HHHH> is the hexadecimal number. + +In Encode 2.10 or later, C<LEAVE_SRC> is also implied. + +=item The bitmask + +These modes are actually set via a bitmask. Here is how the FB_XX +constants are laid out. You can import the FB_XX constants via +C<use Encode qw(:fallbacks)>; you can import the generic bitmask +constants via C<use Encode qw(:fallback_all)>. + + FB_DEFAULT FB_CROAK FB_QUIET FB_WARN FB_PERLQQ + DIE_ON_ERR 0x0001 X + WARN_ON_ERR 0x0002 X + RETURN_ON_ERR 0x0004 X X + LEAVE_SRC 0x0008 X + PERLQQ 0x0100 X + HTMLCREF 0x0200 + XMLCREF 0x0400 + +=back + +=head2 coderef for CHECK + +As of Encode 2.12 CHECK can also be a code reference which takes the +ord value of unmapped caharacter as an argument and returns a string +that represents the fallback character. For instance, + + $ascii = encode("ascii", $utf8, sub{ sprintf "<U+%04X>", shift }); + +Acts like FB_PERLQQ but E<lt>U+I<XXXX>E<gt> is used instead of +\x{I<XXXX>}. + +=head1 Defining Encodings + +To define a new encoding, use: + + use Encode qw(define_encoding); + define_encoding($object, 'canonicalName' [, alias...]); + +I<canonicalName> will be associated with I<$object>. The object +should provide the interface described in L<Encode::Encoding>. +If more than two arguments are provided then additional +arguments are taken as aliases for I<$object>. + +See L<Encode::Encoding> for more details. + +=head1 The UTF-8 flag + +Before the introduction of utf8 support in perl, The C<eq> operator +just compared the strings represented by two scalars. Beginning with +perl 5.8, C<eq> compares two strings with simultaneous consideration +of I<the utf8 flag>. To explain why we made it so, I will quote page +402 of C<Programming Perl, 3rd ed.> + +=over 2 + +=item Goal #1: + +Old byte-oriented programs should not spontaneously break on the old +byte-oriented data they used to work on. + +=item Goal #2: + +Old byte-oriented programs should magically start working on the new +character-oriented data when appropriate. + +=item Goal #3: + +Programs should run just as fast in the new character-oriented mode +as in the old byte-oriented mode. + +=item Goal #4: + +Perl should remain one language, rather than forking into a +byte-oriented Perl and a character-oriented Perl. + +=back + +Back when C<Programming Perl, 3rd ed.> was written, not even Perl 5.6.0 +was born and many features documented in the book remained +unimplemented for a long time. Perl 5.8 corrected this and the introduction +of the UTF-8 flag is one of them. You can think of this perl notion as of a +byte-oriented mode (utf8 flag off) and a character-oriented mode (utf8 +flag on). + +Here is how Encode takes care of the utf8 flag. + +=over 2 + +=item * + +When you encode, the resulting utf8 flag is always off. + +=item * + +When you decode, the resulting utf8 flag is on unless you can +unambiguously represent data. Here is the definition of +dis-ambiguity. + +After C<$utf8 = decode('foo', $octet);>, + + When $octet is... The utf8 flag in $utf8 is + --------------------------------------------- + In ASCII only (or EBCDIC only) OFF + In ISO-8859-1 ON + In any other Encoding ON + --------------------------------------------- + +As you see, there is one exception, In ASCII. That way you can assume +Goal #1. And with Encode Goal #2 is assumed but you still have to be +careful in such cases mentioned in B<CAVEAT> paragraphs. + +This utf8 flag is not visible in perl scripts, exactly for the same +reason you cannot (or you I<don't have to>) see if a scalar contains a +string, integer, or floating point number. But you can still peek +and poke these if you will. See the section below. + +=back + +=head2 Messing with Perl's Internals + +The following API uses parts of Perl's internals in the current +implementation. As such, they are efficient but may change. + +=over 2 + +=item is_utf8(STRING [, CHECK]) + +[INTERNAL] Tests whether the UTF-8 flag is turned on in the STRING. +If CHECK is true, also checks the data in STRING for being well-formed +UTF-8. Returns true if successful, false otherwise. + +As of perl 5.8.1, L<utf8> also has utf8::is_utf8(). + +=item _utf8_on(STRING) + +[INTERNAL] Turns on the UTF-8 flag in STRING. The data in STRING is +B<not> checked for being well-formed UTF-8. Do not use unless you +B<know> that the STRING is well-formed UTF-8. Returns the previous +state of the UTF-8 flag (so please don't treat the return value as +indicating success or failure), or C<undef> if STRING is not a string. + +=item _utf8_off(STRING) + +[INTERNAL] Turns off the UTF-8 flag in STRING. Do not use frivolously. +Returns the previous state of the UTF-8 flag (so please don't treat the +return value as indicating success or failure), or C<undef> if STRING is +not a string. + +=back + +=head1 UTF-8 vs. utf8 + + ....We now view strings not as sequences of bytes, but as sequences + of numbers in the range 0 .. 2**32-1 (or in the case of 64-bit + computers, 0 .. 2**64-1) -- Programming Perl, 3rd ed. + +That has been the perl's notion of UTF-8 but official UTF-8 is more +strict; Its ranges is much narrower (0 .. 10FFFF), some sequences are +not allowed (i.e. Those used in the surrogate pair, 0xFFFE, et al). + +Now that is overruled by Larry Wall himself. + + From: Larry Wall <larry@wall.org> + Date: December 04, 2004 11:51:58 JST + To: perl-unicode@perl.org + Subject: Re: Make Encode.pm support the real UTF-8 + Message-Id: <20041204025158.GA28754@wall.org> + + On Fri, Dec 03, 2004 at 10:12:12PM +0000, Tim Bunce wrote: + : I've no problem with 'utf8' being perl's unrestricted uft8 encoding, + : but "UTF-8" is the name of the standard and should give the + : corresponding behaviour. + + For what it's worth, that's how I've always kept them straight in my + head. + + Also for what it's worth, Perl 6 will mostly default to strict but + make it easy to switch back to lax. + + Larry + +Do you copy? As of Perl 5.8.7, B<UTF-8> means strict, official UTF-8 +while B<utf8> means liberal, lax, version thereof. And Encode version +2.10 or later thus groks the difference between C<UTF-8> and C"utf8". + + encode("utf8", "\x{FFFF_FFFF}", 1); # okay + encode("UTF-8", "\x{FFFF_FFFF}", 1); # croaks + +C<UTF-8> in Encode is actually a canonical name for C<utf-8-strict>. +Yes, the hyphen between "UTF" and "8" is important. Without it Encode +goes "liberal" + + find_encoding("UTF-8")->name # is 'utf-8-strict' + find_encoding("utf-8")->name # ditto. names are case insensitive + find_encoding("utf8")->name # ditto. "_" are treated as "-" + find_encoding("UTF8")->name # is 'utf8'. + + +=head1 SEE ALSO + +L<Encode::Encoding>, +L<Encode::Supported>, +L<Encode::PerlIO>, +L<encoding>, +L<perlebcdic>, +L<perlfunc/open>, +L<perlunicode>, +L<utf8>, +the Perl Unicode Mailing List E<lt>perl-unicode@perl.orgE<gt> + +=head1 MAINTAINER + +This project was originated by Nick Ing-Simmons and later maintained +by Dan Kogai E<lt>dankogai@dan.co.jpE<gt>. See AUTHORS for a full +list of people involved. For any questions, use +E<lt>perl-unicode@perl.orgE<gt> so we can all share. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/Alias.pm b/Master/tlpkg/tlperl.old/lib/Encode/Alias.pm new file mode 100644 index 00000000000..c0bbf69f469 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/Alias.pm @@ -0,0 +1,341 @@ +package Encode::Alias; +use strict; +no warnings 'redefine'; +use Encode; +our $VERSION = do { my @r = (q$Revision: 2.4 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; +sub DEBUG () { 0 } + +use base qw(Exporter); + +# Public, encouraged API is exported by default + +our @EXPORT = + qw ( + define_alias + find_alias + ); + +our @Alias; # ordered matching list +our %Alias; # cached known aliases + +sub find_alias{ + my $class = shift; + my $find = shift; + unless (exists $Alias{$find}) { + $Alias{$find} = undef; # Recursion guard + for (my $i=0; $i < @Alias; $i += 2){ + my $alias = $Alias[$i]; + my $val = $Alias[$i+1]; + my $new; + if (ref($alias) eq 'Regexp' && $find =~ $alias){ + DEBUG and warn "eval $val"; + $new = eval $val; + DEBUG and $@ and warn "$val, $@"; + }elsif (ref($alias) eq 'CODE'){ + DEBUG and warn "$alias", "->", "($find)"; + $new = $alias->($find); + }elsif (lc($find) eq lc($alias)){ + $new = $val; + } + if (defined($new)){ + next if $new eq $find; # avoid (direct) recursion on bugs + DEBUG and warn "$alias, $new"; + my $enc = (ref($new)) ? $new : Encode::find_encoding($new); + if ($enc){ + $Alias{$find} = $enc; + last; + } + } + } + # case insensitive search when canonical is not in all lowercase + # RT ticket #7835 + unless ($Alias{$find}){ + my $lcfind = lc($find); + for my $name (keys %Encode::Encoding, keys %Encode::ExtModule){ + $lcfind eq lc($name) or next; + $Alias{$find} = Encode::find_encoding($name); + DEBUG and warn "$find => $name"; + } + } + } + if (DEBUG){ + my $name; + if (my $e = $Alias{$find}){ + $name = $e->name; + }else{ + $name = ""; + } + warn "find_alias($class, $find)->name = $name"; + } + return $Alias{$find}; +} + +sub define_alias{ + while (@_){ + my ($alias,$name) = splice(@_,0,2); + unshift(@Alias, $alias => $name); # newer one has precedence + if (ref($alias)){ + # clear %Alias cache to allow overrides + my @a = keys %Alias; + for my $k (@a){ + if (ref($alias) eq 'Regexp' && $k =~ $alias){ + DEBUG and warn "delete \$Alias\{$k\}"; + delete $Alias{$k}; + } + elsif (ref($alias) eq 'CODE'){ + DEBUG and warn "delete \$Alias\{$k\}"; + delete $Alias{$alias->($name)}; + } + } + }else{ + DEBUG and warn "delete \$Alias\{$alias\}"; + delete $Alias{$alias}; + } + } +} + +# Allow latin-1 style names as well +# 0 1 2 3 4 5 6 7 8 9 10 +our @Latin2iso = ( 0, 1, 2, 3, 4, 9, 10, 13, 14, 15, 16 ); +# Allow winlatin1 style names as well +our %Winlatin2cp = ( + 'latin1' => 1252, + 'latin2' => 1250, + 'cyrillic' => 1251, + 'greek' => 1253, + 'turkish' => 1254, + 'hebrew' => 1255, + 'arabic' => 1256, + 'baltic' => 1257, + 'vietnamese' => 1258, + ); + +init_aliases(); + +sub undef_aliases{ + @Alias = (); + %Alias = (); +} + +sub init_aliases +{ + undef_aliases(); + # Try all-lower-case version should all else fails + define_alias( qr/^(.*)$/ => '"\L$1"' ); + + # UTF/UCS stuff + define_alias( qr/^UTF-?7$/i => '"UTF-7"'); + define_alias( qr/^UCS-?2-?LE$/i => '"UCS-2LE"' ); + define_alias( qr/^UCS-?2-?(BE)?$/i => '"UCS-2BE"', + qr/^UCS-?4-?(BE|LE)?$/i => 'uc("UTF-32$1")', + qr/^iso-10646-1$/i => '"UCS-2BE"' ); + define_alias( qr/^UTF-?(16|32)-?BE$/i => '"UTF-$1BE"', + qr/^UTF-?(16|32)-?LE$/i => '"UTF-$1LE"', + qr/^UTF-?(16|32)$/i => '"UTF-$1"', + ); + # ASCII + define_alias(qr/^(?:US-?)ascii$/i => '"ascii"'); + define_alias('C' => 'ascii'); + define_alias(qr/\bISO[-_]?646[-_]?US$/i => '"ascii"'); + # Allow variants of iso-8859-1 etc. + define_alias( qr/\biso[-_]?(\d+)[-_](\d+)$/i => '"iso-$1-$2"' ); + + # At least HP-UX has these. + define_alias( qr/\biso8859(\d+)$/i => '"iso-8859-$1"' ); + + # More HP stuff. + define_alias( qr/\b(?:hp-)?(arabic|greek|hebrew|kana|roman|thai|turkish)8$/i => '"${1}8"' ); + + # The Official name of ASCII. + define_alias( qr/\bANSI[-_]?X3\.4[-_]?1968$/i => '"ascii"' ); + + # This is a font issue, not an encoding issue. + # (The currency symbol of the Latin 1 upper half + # has been redefined as the euro symbol.) + define_alias( qr/^(.+)\@euro$/i => '"$1"' ); + + define_alias( qr/\b(?:iso[-_]?)?latin[-_]?(\d+)$/i + => 'defined $Encode::Alias::Latin2iso[$1] ? "iso-8859-$Encode::Alias::Latin2iso[$1]" : undef' ); + + define_alias( qr/\bwin(latin[12]|cyrillic|baltic|greek|turkish| + hebrew|arabic|baltic|vietnamese)$/ix => + '"cp" . $Encode::Alias::Winlatin2cp{lc($1)}' ); + + # Common names for non-latin preferred MIME names + define_alias( 'ascii' => 'US-ascii', + 'cyrillic' => 'iso-8859-5', + 'arabic' => 'iso-8859-6', + 'greek' => 'iso-8859-7', + 'hebrew' => 'iso-8859-8', + 'thai' => 'iso-8859-11', + 'tis620' => 'iso-8859-11', + ); + + # At least AIX has IBM-NNN (surprisingly...) instead of cpNNN. + # And Microsoft has their own naming (again, surprisingly). + # And windows-* is registered in IANA! + define_alias( qr/\b(?:cp|ibm|ms|windows)[-_ ]?(\d{2,4})$/i => '"cp$1"'); + + # Sometimes seen with a leading zero. + # define_alias( qr/\bcp037\b/i => '"cp37"'); + + # Mac Mappings + # predefined in *.ucm; unneeded + # define_alias( qr/\bmacIcelandic$/i => '"macIceland"'); + define_alias( qr/^mac_(.*)$/i => '"mac$1"'); + # Ououououou. gone. They are differente! + # define_alias( qr/\bmacRomanian$/i => '"macRumanian"'); + + # Standardize on the dashed versions. + define_alias( qr/\bkoi8[\s\-_]*([ru])$/i => '"koi8-$1"' ); + + unless ($Encode::ON_EBCDIC){ + # for Encode::CN + define_alias( qr/\beuc.*cn$/i => '"euc-cn"' ); + define_alias( qr/\bcn.*euc$/i => '"euc-cn"' ); + # define_alias( qr/\bGB[- ]?(\d+)$/i => '"euc-cn"' ) + # CP936 doesn't have vendor-addon for GBK, so they're identical. + define_alias( qr/^gbk$/i => '"cp936"'); + # This fixes gb2312 vs. euc-cn confusion, practically + define_alias( qr/\bGB[-_ ]?2312(?!-?raw)/i => '"euc-cn"' ); + # for Encode::JP + define_alias( qr/\bjis$/i => '"7bit-jis"' ); + define_alias( qr/\beuc.*jp$/i => '"euc-jp"' ); + define_alias( qr/\bjp.*euc$/i => '"euc-jp"' ); + define_alias( qr/\bujis$/i => '"euc-jp"' ); + define_alias( qr/\bshift.*jis$/i => '"shiftjis"' ); + define_alias( qr/\bsjis$/i => '"shiftjis"' ); + define_alias( qr/\bwindows-31j$/i => '"cp932"' ); + # for Encode::KR + define_alias( qr/\beuc.*kr$/i => '"euc-kr"' ); + define_alias( qr/\bkr.*euc$/i => '"euc-kr"' ); + # This fixes ksc5601 vs. euc-kr confusion, practically + define_alias( qr/(?:x-)?uhc$/i => '"cp949"' ); + define_alias( qr/(?:x-)?windows-949$/i => '"cp949"' ); + define_alias( qr/\bks_c_5601-1987$/i => '"cp949"' ); + # for Encode::TW + define_alias( qr/\bbig-?5$/i => '"big5-eten"' ); + define_alias( qr/\bbig5-?et(?:en)?$/i => '"big5-eten"' ); + define_alias( qr/\btca[-_]?big5$/i => '"big5-eten"' ); + define_alias( qr/\bbig5-?hk(?:scs)?$/i => '"big5-hkscs"' ); + define_alias( qr/\bhk(?:scs)?[-_]?big5$/i => '"big5-hkscs"' ); + } + # utf8 is blessed :) + define_alias( qr/^UTF-8$/i => '"utf-8-strict"'); + # At last, Map white space and _ to '-' + define_alias( qr/^(\S+)[\s_]+(.*)$/i => '"$1-$2"' ); +} + +1; +__END__ + +# TODO: HP-UX '8' encodings arabic8 greek8 hebrew8 kana8 thai8 turkish8 +# TODO: HP-UX '15' encodings japanese15 korean15 roi15 +# TODO: Cyrillic encoding ISO-IR-111 (useful?) +# TODO: Armenian encoding ARMSCII-8 +# TODO: Hebrew encoding ISO-8859-8-1 +# TODO: Thai encoding TCVN +# TODO: Vietnamese encodings VPS +# TODO: Mac Asian+African encodings: Arabic Armenian Bengali Burmese +# ChineseSimp ChineseTrad Devanagari Ethiopic ExtArabic +# Farsi Georgian Gujarati Gurmukhi Hebrew Japanese +# Kannada Khmer Korean Laotian Malayalam Mongolian +# Oriya Sinhalese Symbol Tamil Telugu Tibetan Vietnamese + +=head1 NAME + +Encode::Alias - alias definitions to encodings + +=head1 SYNOPSIS + + use Encode; + use Encode::Alias; + define_alias( newName => ENCODING); + +=head1 DESCRIPTION + +Allows newName to be used as an alias for ENCODING. ENCODING may be +either the name of an encoding or an encoding object (as described +in L<Encode>). + +Currently I<newName> can be specified in the following ways: + +=over 4 + +=item As a simple string. + +=item As a qr// compiled regular expression, e.g.: + + define_alias( qr/^iso8859-(\d+)$/i => '"iso-8859-$1"' ); + +In this case, if I<ENCODING> is not a reference, it is C<eval>-ed +in order to allow C<$1> etc. to be substituted. The example is one +way to alias names as used in X11 fonts to the MIME names for the +iso-8859-* family. Note the double quotes inside the single quotes. + +(or, you don't have to do this yourself because this example is predefined) + +If you are using a regex here, you have to use the quotes as shown or +it won't work. Also note that regex handling is tricky even for the +experienced. Use this feature with caution. + +=item As a code reference, e.g.: + + define_alias( sub {shift =~ /^iso8859-(\d+)$/i ? "iso-8859-$1" : undef } ); + +The same effect as the example above in a different way. The coderef +takes the alias name as an argument and returns a canonical name on +success or undef if not. Note the second argument is not required. +Use this with even more caution than the regex version. + +=back + +=head3 Changes in code reference aliasing + +As of Encode 1.87, the older form + + define_alias( sub { return /^iso8859-(\d+)$/i ? "iso-8859-$1" : undef } ); + +no longer works. + +Encode up to 1.86 internally used "local $_" to implement ths older +form. But consider the code below; + + use Encode; + $_ = "eeeee" ; + while (/(e)/g) { + my $utf = decode('aliased-encoding-name', $1); + print "position:",pos,"\n"; + } + +Prior to Encode 1.86 this fails because of "local $_". + +=head2 Alias overloading + +You can override predefined aliases by simply applying define_alias(). +The new alias is always evaluated first, and when necessary, +define_alias() flushes the internal cache to make the new definition +available. + + # redirect SHIFT_JIS to MS/IBM Code Page 932, which is a + # superset of SHIFT_JIS + + define_alias( qr/shift.*jis$/i => '"cp932"' ); + define_alias( qr/sjis$/i => '"cp932"' ); + +If you want to zap all predefined aliases, you can use + + Encode::Alias->undef_aliases; + +to do so. And + + Encode::Alias->init_aliases; + +gets the factory settings back. + +=head1 SEE ALSO + +L<Encode>, L<Encode::Supported> + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Encode/Byte.pm b/Master/tlpkg/tlperl.old/lib/Encode/Byte.pm new file mode 100644 index 00000000000..d40c1c3d9d1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/Byte.pm @@ -0,0 +1,119 @@ +package Encode::Byte; +use Encode; +our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +use XSLoader; +XSLoader::load(__PACKAGE__,$VERSION); + +1; +__END__ + +=head1 NAME + +Encode::Byte - Single Byte Encodings + +=head1 SYNOPSIS + + use Encode qw/encode decode/; + $greek = encode("iso-8859-7", $utf8); # loads Encode::Byte implicitly + $utf8 = decode("iso-8859-7", $greek); # ditto + +=head1 ABSTRACT + +This module implements various single byte encodings. For most cases it uses +\x80-\xff (upper half) to map non-ASCII characters. Encodings +supported are as follows. + + Canonical Alias Description + -------------------------------------------------------------------- + # ISO 8859 series + (iso-8859-1 is in built-in) + iso-8859-2 latin2 [ISO] + iso-8859-3 latin3 [ISO] + iso-8859-4 latin4 [ISO] + iso-8859-5 [ISO] + iso-8859-6 [ISO] + iso-8859-7 [ISO] + iso-8859-8 [ISO] + iso-8859-9 latin5 [ISO] + iso-8859-10 latin6 [ISO] + iso-8859-11 + (iso-8859-12 is nonexistent) + iso-8859-13 latin7 [ISO] + iso-8859-14 latin8 [ISO] + iso-8859-15 latin9 [ISO] + iso-8859-16 latin10 [ISO] + + # Cyrillic + koi8-f + koi8-r cp878 [RFC1489] + koi8-u [RFC2319] + + # Vietnamese + viscii + + # all cp* are also available as ibm-*, ms-*, and windows-* + # also see L<http://msdn.microsoft.com/workshop/author/dhtml/reference/charsets/charset4.asp> + + cp424 + cp437 + cp737 + cp775 + cp850 + cp852 + cp855 + cp856 + cp857 + cp860 + cp861 + cp862 + cp863 + cp864 + cp865 + cp866 + cp869 + cp874 + cp1006 + cp1250 WinLatin2 + cp1251 WinCyrillic + cp1252 WinLatin1 + cp1253 WinGreek + cp1254 WinTurkish + cp1255 WinHebrew + cp1256 WinArabic + cp1257 WinBaltic + cp1258 WinVietnamese + + # Macintosh + # Also see L<http://developer.apple.com/technotes/tn/tn1150.html> + MacArabic + MacCentralEurRoman + MacCroatian + MacCyrillic + MacFarsi + MacGreek + MacHebrew + MacIcelandic + MacRoman + MacRomanian + MacRumanian + MacSami + MacThai + MacTurkish + MacUkrainian + + # More vendor encodings + AdobeStandardEncoding + nextstep + gsm0338 # used in GSM handsets + hp-roman8 + +=head1 DESCRIPTION + +To find how to use this module in detail, see L<Encode>. + +=head1 SEE ALSO + +L<Encode> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/CJKConstants.pm b/Master/tlpkg/tlperl.old/lib/Encode/CJKConstants.pm new file mode 100644 index 00000000000..4ab40e72ef2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/CJKConstants.pm @@ -0,0 +1,66 @@ +# +# $Id: CJKConstants.pm,v 2.0 2004/05/16 20:55:16 dankogai Exp $ +# + +package Encode::CJKConstants; + +use strict; + +our $RCSID = q$Id: CJKConstants.pm,v 2.0 2004/05/16 20:55:16 dankogai Exp $; +our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +use Carp; + +require Exporter; +our @ISA = qw(Exporter); +our @EXPORT = qw(); +our @EXPORT_OK = qw(%CHARCODE %ESC %RE); +our %EXPORT_TAGS = ( 'all' => [ @EXPORT_OK, @EXPORT ] ); + +my %_0208 = ( + 1978 => '\e\$\@', + 1983 => '\e\$B', + 1990 => '\e&\@\e\$B', + ); + +our %CHARCODE = ( + UNDEF_EUC => "\xa2\xae", # ¢® in EUC + UNDEF_SJIS => "\x81\xac", # ¢® in SJIS + UNDEF_JIS => "\xa2\xf7", # ¢÷ -- used in unicode + UNDEF_UNICODE => "\x20\x20", # ¢÷ -- used in unicode + ); + +our %ESC = ( + GB_2312 => "\e\$A", + JIS_0208 => "\e\$B", + JIS_0212 => "\e\$(D", + KSC_5601 => "\e\$(C", + ASC => "\e\(B", + KANA => "\e\(I", + '2022_KR' => "\e\$)C", + ); + +our %RE = + ( + ASCII => '[\x00-\x7f]', + BIN => '[\x00-\x06\x7f\xff]', + EUC_0212 => '\x8f[\xa1-\xfe][\xa1-\xfe]', + EUC_C => '[\xa1-\xfe][\xa1-\xfe]', + EUC_KANA => '\x8e[\xa1-\xdf]', + JIS_0208 => "$_0208{1978}|$_0208{1983}|$_0208{1990}", + JIS_0212 => "\e" . '\$\(D', + ISO_ASC => "\e" . '\([BJ]', + JIS_KANA => "\e" . '\(I', + '2022_KR' => "\e" . '\$\)C', + SJIS_C => '[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]', + SJIS_KANA => '[\xa1-\xdf]', + UTF8 => '[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf][\x80-\xbf]' + ); + +1; + +=head1 NAME + +Encode::CJKConstants.pm -- Internally used by Encode::??::ISO_2022_* + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/CN.pm b/Master/tlpkg/tlperl.old/lib/Encode/CN.pm new file mode 100644 index 00000000000..be5a830fc51 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/CN.pm @@ -0,0 +1,76 @@ +package Encode::CN; +BEGIN { + if (ord("A") == 193) { + die "Encode::CN not supported on EBCDIC\n"; + } +} +our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +use Encode; +use XSLoader; +XSLoader::load(__PACKAGE__,$VERSION); + +# Relocated from Encode.pm + +use Encode::CN::HZ; +# use Encode::CN::2022_CN; + +1; +__END__ + +=head1 NAME + +Encode::CN - China-based Chinese Encodings + +=head1 SYNOPSIS + + use Encode qw/encode decode/; + $euc_cn = encode("euc-cn", $utf8); # loads Encode::CN implicitly + $utf8 = decode("euc-cn", $euc_cn); # ditto + +=head1 DESCRIPTION + +This module implements China-based Chinese charset encodings. +Encodings supported are as follows. + + Canonical Alias Description + -------------------------------------------------------------------- + euc-cn /\beuc.*cn$/i EUC (Extended Unix Character) + /\bcn.*euc$/i + /\bGB[-_ ]?2312(?:\D.*$|$)/i (see below) + gb2312-raw The raw (low-bit) GB2312 character map + gb12345-raw Traditional chinese counterpart to + GB2312 (raw) + iso-ir-165 GB2312 + GB6345 + GB8565 + additions + MacChineseSimp GB2312 + Apple Additions + cp936 Code Page 936, also known as GBK + (Extended GuoBiao) + hz 7-bit escaped GB2312 encoding + -------------------------------------------------------------------- + +To find how to use this module in detail, see L<Encode>. + +=head1 NOTES + +Due to size concerns, C<GB 18030> (an extension to C<GBK>) is distributed +separately on CPAN, under the name L<Encode::HanExtra>. That module +also contains extra Taiwan-based encodings. + +=head1 BUGS + +When you see C<charset=gb2312> on mails and web pages, they really +mean C<euc-cn> encodings. To fix that, C<gb2312> is aliased to C<euc-cn>. +Use C<gb2312-raw> when you really mean it. + +The ASCII region (0x00-0x7f) is preserved for all encodings, even though +this conflicts with mappings by the Unicode Consortium. See + +L<http://www.debian.or.jp/~kubota/unicode-symbols.html.en> + +to find out why it is implemented that way. + +=head1 SEE ALSO + +L<Encode> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/CN/HZ.pm b/Master/tlpkg/tlperl.old/lib/Encode/CN/HZ.pm new file mode 100644 index 00000000000..fbc6ba60ced --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/CN/HZ.pm @@ -0,0 +1,196 @@ +package Encode::CN::HZ; + +use strict; + +use vars qw($VERSION); +$VERSION = do { my @r = (q$Revision: 2.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +use Encode qw(:fallbacks); + +use base qw(Encode::Encoding); +__PACKAGE__->Define('hz'); + +# HZ is a combination of ASCII and escaped GB, so we implement it +# with the GB2312(raw) encoding here. Cf. RFCs 1842 & 1843. + +# not ported for EBCDIC. Which should be used, "~" or "\x7E"? + +sub needs_lines { 1 } + +sub decode ($$;$) +{ + my ($obj,$str,$chk) = @_; + + my $GB = Encode::find_encoding('gb2312-raw'); + my $ret = ''; + my $in_ascii = 1; # default mode is ASCII. + + while (length $str) { + if ($in_ascii) { # ASCII mode + if ($str =~ s/^([\x00-\x7D\x7F]+)//) { # no '~' => ASCII + $ret .= $1; + # EBCDIC should need ascii2native, but not ported. + } + elsif ($str =~ s/^\x7E\x7E//) { # escaped tilde + $ret .= '~'; + } + elsif ($str =~ s/^\x7E\cJ//) { # '\cJ' == LF in ASCII + 1; # no-op + } + elsif ($str =~ s/^\x7E\x7B//) { # '~{' + $in_ascii = 0; # to GB + } + else { # encounters an invalid escape, \x80 or greater + last; + } + } + else { # GB mode; the byte ranges are as in RFC 1843. + if ($str =~ s/^((?:[\x21-\x77][\x21-\x7E])+)//) { + $ret .= $GB->decode($1, $chk); + } + elsif ($str =~ s/^\x7E\x7D//) { # '~}' + $in_ascii = 1; + } + else { # invalid + last; + } + } + } + $_[1] = '' if $chk; # needs_lines guarantees no partial character + return $ret; +} + +sub cat_decode { + my ($obj, undef, $src, $pos, $trm, $chk) = @_; + my ($rdst, $rsrc, $rpos) = \@_[1..3]; + + my $GB = Encode::find_encoding('gb2312-raw'); + my $ret = ''; + my $in_ascii = 1; # default mode is ASCII. + + my $ini_pos = pos($$rsrc); + + substr($src, 0, $pos) = ''; + + my $ini_len = bytes::length($src); + + # $trm is the first of the pair '~~', then 2nd tilde is to be removed. + # XXX: Is better C<$src =~ s/^\x7E// or die if ...>? + $src =~ s/^\x7E// if $trm eq "\x7E"; + + while (length $src) { + my $now; + if ($in_ascii) { # ASCII mode + if ($src =~ s/^([\x00-\x7D\x7F])//) { # no '~' => ASCII + $now = $1; + } + elsif ($src =~ s/^\x7E\x7E//) { # escaped tilde + $now = '~'; + } + elsif ($src =~ s/^\x7E\cJ//) { # '\cJ' == LF in ASCII + next; + } + elsif ($src =~ s/^\x7E\x7B//) { # '~{' + $in_ascii = 0; # to GB + next; + } + else { # encounters an invalid escape, \x80 or greater + last; + } + } + else { # GB mode; the byte ranges are as in RFC 1843. + if ($src =~ s/^((?:[\x21-\x77][\x21-\x7F])+)//) { + $now = $GB->decode($1, $chk); + } + elsif ($src =~ s/^\x7E\x7D//) { # '~}' + $in_ascii = 1; + next; + } + else { # invalid + last; + } + } + + next if ! defined $now; + + $ret .= $now; + + if ($now eq $trm) { + $$rdst .= $ret; + $$rpos = $ini_pos + $pos + $ini_len - bytes::length($src); + pos($$rsrc) = $ini_pos; + return 1; + } + } + + $$rdst .= $ret; + $$rpos = $ini_pos + $pos + $ini_len - bytes::length($src); + pos($$rsrc) = $ini_pos; + return ''; # terminator not found +} + + +sub encode($$;$) +{ + my ($obj,$str,$chk) = @_; + + my $GB = Encode::find_encoding('gb2312-raw'); + my $ret = ''; + my $in_ascii = 1; # default mode is ASCII. + + no warnings 'utf8'; # $str may be malformed UTF8 at the end of a chunk. + + while (length $str) { + if ($str =~ s/^([[:ascii:]]+)//) { + my $tmp = $1; + $tmp =~ s/~/~~/g; # escapes tildes + if (! $in_ascii) { + $ret .= "\x7E\x7D"; # '~}' + $in_ascii = 1; + } + $ret .= pack 'a*', $tmp; # remove UTF8 flag. + } + elsif ($str =~ s/(.)//) { + my $s = $1; + my $tmp = $GB->encode($s, $chk); + last if !defined $tmp; + if (length $tmp == 2) { # maybe a valid GB char (XXX) + if ($in_ascii) { + $ret .= "\x7E\x7B"; # '~{' + $in_ascii = 0; + } + $ret .= $tmp; + } + elsif (length $tmp) { # maybe FALLBACK in ASCII (XXX) + if (!$in_ascii) { + $ret .= "\x7E\x7D"; # '~}' + $in_ascii = 1; + } + $ret .= $tmp; + } + } + else { # if $str is malformed UTF8 *and* if length $str != 0. + last; + } + } + $_[1] = $str if $chk; + + # The state at the end of the chunk is discarded, even if in GB mode. + # That results in the combination of GB-OUT and GB-IN, i.e. "~}~{". + # Parhaps it is harmless, but further investigations may be required... + + if (! $in_ascii) { + $ret .= "\x7E\x7D"; # '~}' + $in_ascii = 1; + } + return $ret; +} + +1; +__END__ + +=head1 NAME + +Encode::CN::HZ -- internally used by Encode::CN + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/Changes.e2x b/Master/tlpkg/tlperl.old/lib/Encode/Changes.e2x new file mode 100644 index 00000000000..5c67c55cb93 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/Changes.e2x @@ -0,0 +1,7 @@ +# +# $Id: Changes.e2x,v 2.0 2004/05/16 20:55:15 dankogai Exp $ +# Revision history for Perl extension Encode::$_Name_. +# + +0.01 $_Now_ + Autogenerated by enc2xs version $_Version_. diff --git a/Master/tlpkg/tlperl.old/lib/Encode/Config.pm b/Master/tlpkg/tlperl.old/lib/Encode/Config.pm new file mode 100644 index 00000000000..d69b92d8248 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/Config.pm @@ -0,0 +1,166 @@ +# +# Demand-load module list +# +package Encode::Config; +our $VERSION = do { my @r = (q$Revision: 2.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +use strict; + +our %ExtModule = + ( + # Encode::Byte + #iso-8859-1 is in Encode.pm itself + 'iso-8859-2' => 'Encode::Byte', + 'iso-8859-3' => 'Encode::Byte', + 'iso-8859-4' => 'Encode::Byte', + 'iso-8859-5' => 'Encode::Byte', + 'iso-8859-6' => 'Encode::Byte', + 'iso-8859-7' => 'Encode::Byte', + 'iso-8859-8' => 'Encode::Byte', + 'iso-8859-9' => 'Encode::Byte', + 'iso-8859-10' => 'Encode::Byte', + 'iso-8859-11' => 'Encode::Byte', + 'iso-8859-13' => 'Encode::Byte', + 'iso-8859-14' => 'Encode::Byte', + 'iso-8859-15' => 'Encode::Byte', + 'iso-8859-16' => 'Encode::Byte', + 'koi8-f' => 'Encode::Byte', + 'koi8-r' => 'Encode::Byte', + 'koi8-u' => 'Encode::Byte', + 'viscii' => 'Encode::Byte', + 'cp424' => 'Encode::Byte', + 'cp437' => 'Encode::Byte', + 'cp737' => 'Encode::Byte', + 'cp775' => 'Encode::Byte', + 'cp850' => 'Encode::Byte', + 'cp852' => 'Encode::Byte', + 'cp855' => 'Encode::Byte', + 'cp856' => 'Encode::Byte', + 'cp857' => 'Encode::Byte', + 'cp860' => 'Encode::Byte', + 'cp861' => 'Encode::Byte', + 'cp862' => 'Encode::Byte', + 'cp863' => 'Encode::Byte', + 'cp864' => 'Encode::Byte', + 'cp865' => 'Encode::Byte', + 'cp866' => 'Encode::Byte', + 'cp869' => 'Encode::Byte', + 'cp874' => 'Encode::Byte', + 'cp1006' => 'Encode::Byte', + 'cp1250' => 'Encode::Byte', + 'cp1251' => 'Encode::Byte', + 'cp1252' => 'Encode::Byte', + 'cp1253' => 'Encode::Byte', + 'cp1254' => 'Encode::Byte', + 'cp1255' => 'Encode::Byte', + 'cp1256' => 'Encode::Byte', + 'cp1257' => 'Encode::Byte', + 'cp1258' => 'Encode::Byte', + 'AdobeStandardEncoding' => 'Encode::Byte', + 'MacArabic' => 'Encode::Byte', + 'MacCentralEurRoman' => 'Encode::Byte', + 'MacCroatian' => 'Encode::Byte', + 'MacCyrillic' => 'Encode::Byte', + 'MacFarsi' => 'Encode::Byte', + 'MacGreek' => 'Encode::Byte', + 'MacHebrew' => 'Encode::Byte', + 'MacIcelandic' => 'Encode::Byte', + 'MacRoman' => 'Encode::Byte', + 'MacRomanian' => 'Encode::Byte', + 'MacRumanian' => 'Encode::Byte', + 'MacSami' => 'Encode::Byte', + 'MacThai' => 'Encode::Byte', + 'MacTurkish' => 'Encode::Byte', + 'MacUkrainian' => 'Encode::Byte', + 'nextstep' => 'Encode::Byte', + 'hp-roman8' => 'Encode::Byte', + 'gsm0338' => 'Encode::Byte', + # Encode::EBCDIC + 'cp37' => 'Encode::EBCDIC', + 'cp500' => 'Encode::EBCDIC', + 'cp875' => 'Encode::EBCDIC', + 'cp1026' => 'Encode::EBCDIC', + 'cp1047' => 'Encode::EBCDIC', + 'posix-bc' => 'Encode::EBCDIC', + # Encode::Symbol + 'dingbats' => 'Encode::Symbol', + 'symbol' => 'Encode::Symbol', + 'AdobeSymbol' => 'Encode::Symbol', + 'AdobeZdingbat' => 'Encode::Symbol', + 'MacDingbats' => 'Encode::Symbol', + 'MacSymbol' => 'Encode::Symbol', + # Encode::Unicode + 'UCS-2BE' => 'Encode::Unicode', + 'UCS-2LE' => 'Encode::Unicode', + 'UTF-16' => 'Encode::Unicode', + 'UTF-16BE' => 'Encode::Unicode', + 'UTF-16LE' => 'Encode::Unicode', + 'UTF-32' => 'Encode::Unicode', + 'UTF-32BE' => 'Encode::Unicode', + 'UTF-32LE' => 'Encode::Unicode', + 'UTF-7' => 'Encode::Unicode::UTF7', + ); + +unless (ord("A") == 193){ + %ExtModule = + ( + %ExtModule, + 'euc-cn' => 'Encode::CN', + 'gb12345-raw' => 'Encode::CN', + 'gb2312-raw' => 'Encode::CN', + 'hz' => 'Encode::CN', + 'iso-ir-165' => 'Encode::CN', + 'cp936' => 'Encode::CN', + 'MacChineseSimp' => 'Encode::CN', + + '7bit-jis' => 'Encode::JP', + 'euc-jp' => 'Encode::JP', + 'iso-2022-jp' => 'Encode::JP', + 'iso-2022-jp-1' => 'Encode::JP', + 'jis0201-raw' => 'Encode::JP', + 'jis0208-raw' => 'Encode::JP', + 'jis0212-raw' => 'Encode::JP', + 'cp932' => 'Encode::JP', + 'MacJapanese' => 'Encode::JP', + 'shiftjis' => 'Encode::JP', + + + 'euc-kr' => 'Encode::KR', + 'iso-2022-kr' => 'Encode::KR', + 'johab' => 'Encode::KR', + 'ksc5601-raw' => 'Encode::KR', + 'cp949' => 'Encode::KR', + 'MacKorean' => 'Encode::KR', + + 'big5-eten' => 'Encode::TW', + 'big5-hkscs' => 'Encode::TW', + 'cp950' => 'Encode::TW', + 'MacChineseTrad' => 'Encode::TW', + + #'big5plus' => 'Encode::HanExtra', + #'euc-tw' => 'Encode::HanExtra', + #'gb18030' => 'Encode::HanExtra', + + 'MIME-Header' => 'Encode::MIME::Header', + 'MIME-B' => 'Encode::MIME::Header', + 'MIME-Q' => 'Encode::MIME::Header', + + 'MIME-Header-ISO_2022_JP' => 'Encode::MIME::Header::ISO_2022_JP', + ); +} + +# +# Why not export ? to keep ConfigLocal Happy! +# +while (my ($enc,$mod) = each %ExtModule){ + $Encode::ExtModule{$enc} = $mod; +} + +1; +__END__ + +=head1 NAME + +Encode::Config -- internally used by Encode + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/ConfigLocal_PM.e2x b/Master/tlpkg/tlperl.old/lib/Encode/ConfigLocal_PM.e2x new file mode 100644 index 00000000000..e203dfded50 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/ConfigLocal_PM.e2x @@ -0,0 +1,13 @@ +# +# Local demand-load module list +# +# You should not edit this file by hand! use "enc2xs -C" +# +package Encode::ConfigLocal; +our $VERSION = $_LocalVer_; + +use strict; + +$_ModLines_ + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Encode/EBCDIC.pm b/Master/tlpkg/tlperl.old/lib/Encode/EBCDIC.pm new file mode 100644 index 00000000000..200a82fea46 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/EBCDIC.pm @@ -0,0 +1,43 @@ +package Encode::EBCDIC; +use Encode; +our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +use XSLoader; +XSLoader::load(__PACKAGE__,$VERSION); + +1; +__END__ + +=head1 NAME + +Encode::EBCDIC - EBCDIC Encodings + +=head1 SYNOPSIS + + use Encode qw/encode decode/; + $posix_bc = encode("posix-bc", $utf8); # loads Encode::EBCDIC implicitly + $utf8 = decode("", $posix_bc); # ditto + +=head1 ABSTRACT + +This module implements various EBCDIC-Based encodings. Encodings +supported are as follows. + + Canonical Alias Description + -------------------------------------------------------------------- + cp37 + cp500 + cp875 + cp1026 + cp1047 + posix-bc + +=head1 DESCRIPTION + +To find how to use this module in detail, see L<Encode>. + +=head1 SEE ALSO + +L<Encode>, L<perlebcdic> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/Encoder.pm b/Master/tlpkg/tlperl.old/lib/Encode/Encoder.pm new file mode 100644 index 00000000000..fe2a2b90ff6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/Encoder.pm @@ -0,0 +1,249 @@ +# +# $Id: Encoder.pm,v 2.0 2004/05/16 20:55:17 dankogai Exp $ +# +package Encode::Encoder; +use strict; +use warnings; +our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +require Exporter; +our @ISA = qw(Exporter); +our @EXPORT_OK = qw ( encoder ); + +our $AUTOLOAD; +sub DEBUG () { 0 } +use Encode qw(encode decode find_encoding from_to); +use Carp; + +sub new{ + my ($class, $data, $encname) = @_; + unless($encname){ + $encname = Encode::is_utf8($data) ? 'utf8' : ''; + }else{ + my $obj = find_encoding($encname) + or croak __PACKAGE__, ": unknown encoding: $encname"; + $encname = $obj->name; + } + my $self = { + data => $data, + encoding => $encname, + }; + bless $self => $class; +} + +sub encoder{ __PACKAGE__->new(@_) } + +sub data{ + my ($self, $data) = @_; + if (defined $data){ + $self->{data} = $data; + return $data; + }else{ + return $self->{data}; + } +} + +sub encoding{ + my ($self, $encname) = @_; + if ($encname){ + my $obj = find_encoding($encname) + or confess __PACKAGE__, ": unknown encoding: $encname"; + $self->{encoding} = $obj->name; + return $self; + }else{ + return $self->{encoding} + } +} + +sub bytes { + my ($self, $encname) = @_; + $encname ||= $self->{encoding}; + my $obj = find_encoding($encname) + or confess __PACKAGE__, ": unknown encoding: $encname"; + $self->{data} = $obj->decode($self->{data}, 1); + $self->{encoding} = '' ; + return $self; +} + +sub DESTROY{ # defined so it won't autoload. + DEBUG and warn shift; +} + +sub AUTOLOAD { + my $self = shift; + my $type = ref($self) + or confess "$self is not an object"; + my $myname = $AUTOLOAD; + $myname =~ s/.*://; # strip fully-qualified portion + my $obj = find_encoding($myname) + or confess __PACKAGE__, ": unknown encoding: $myname"; + DEBUG and warn $self->{encoding}, " => ", $obj->name; + if ($self->{encoding}){ + from_to($self->{data}, $self->{encoding}, $obj->name, 1); + }else{ + $self->{data} = $obj->encode($self->{data}, 1); + } + $self->{encoding} = $obj->name; + return $self; +} + +use overload + q("") => sub { $_[0]->{data} }, + q(0+) => sub { use bytes (); bytes::length($_[0]->{data}) }, + fallback => 1, + ; + +1; +__END__ + +=head1 NAME + +Encode::Encoder -- Object Oriented Encoder + +=head1 SYNOPSIS + + use Encode::Encoder; + # Encode::encode("ISO-8859-1", $data); + Encode::Encoder->new($data)->iso_8859_1; # OOP way + # shortcut + use Encode::Encoder qw(encoder); + encoder($data)->iso_8859_1; + # you can stack them! + encoder($data)->iso_8859_1->base64; # provided base64() is defined + # you can use it as a decoder as well + encoder($base64)->bytes('base64')->latin1; + # stringified + print encoder($data)->utf8->latin1; # prints the string in latin1 + # numified + encoder("\x{abcd}\x{ef}g")->utf8 == 6; # true. bytes::length($data) + +=head1 ABSTRACT + +B<Encode::Encoder> allows you to use Encode in an object-oriented +style. This is not only more intuitive than a functional approach, +but also handier when you want to stack encodings. Suppose you want +your UTF-8 string converted to Latin1 then Base64: you can simply say + + my $base64 = encoder($utf8)->latin1->base64; + +instead of + + my $latin1 = encode("latin1", $utf8); + my $base64 = encode_base64($utf8); + +or the lazier and more convoluted + + my $base64 = encode_base64(encode("latin1", $utf8)); + +=head1 Description + +Here is how to use this module. + +=over 4 + +=item * + +There are at least two instance variables stored in a hash reference, +{data} and {encoding}. + +=item * + +When there is no method, it takes the method name as the name of the +encoding and encodes the instance I<data> with I<encoding>. If successful, +the instance I<encoding> is set accordingly. + +=item * + +You can retrieve the result via -E<gt>data but usually you don't have to +because the stringify operator ("") is overridden to do exactly that. + +=back + +=head2 Predefined Methods + +This module predefines the methods below: + +=over 4 + +=item $e = Encode::Encoder-E<gt>new([$data, $encoding]); + +returns an encoder object. Its data is initialized with $data if +present, and its encoding is set to $encoding if present. + +When $encoding is omitted, it defaults to utf8 if $data is already in +utf8 or "" (empty string) otherwise. + +=item encoder() + +is an alias of Encode::Encoder-E<gt>new(). This one is exported on demand. + +=item $e-E<gt>data([$data]) + +When $data is present, sets the instance data to $data and returns the +object itself. Otherwise, the current instance data is returned. + +=item $e-E<gt>encoding([$encoding]) + +When $encoding is present, sets the instance encoding to $encoding and +returns the object itself. Otherwise, the current instance encoding is +returned. + +=item $e-E<gt>bytes([$encoding]) + +decodes instance data from $encoding, or the instance encoding if +omitted. If the conversion is successful, the instance encoding +will be set to "". + +The name I<bytes> was deliberately picked to avoid namespace tainting +-- this module may be used as a base class so method names that appear +in Encode::Encoding are avoided. + +=back + +=head2 Example: base64 transcoder + +This module is designed to work with L<Encode::Encoding>. +To make the Base64 transcoder example above really work, you could +write a module like this: + + package Encode::Base64; + use base 'Encode::Encoding'; + __PACKAGE__->Define('base64'); + use MIME::Base64; + sub encode{ + my ($obj, $data) = @_; + return encode_base64($data); + } + sub decode{ + my ($obj, $data) = @_; + return decode_base64($data); + } + 1; + __END__ + +And your caller module would be something like this: + + use Encode::Encoder; + use Encode::Base64; + + # now you can really do the following + + encoder($data)->iso_8859_1->base64; + encoder($base64)->bytes('base64')->latin1; + +=head2 Operator Overloading + +This module overloads two operators, stringify ("") and numify (0+). + +Stringify dumps the data inside the object. + +Numify returns the number of bytes in the instance data. + +They come in handy when you want to print or find the size of data. + +=head1 SEE ALSO + +L<Encode>, +L<Encode::Encoding> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/Encoding.pm b/Master/tlpkg/tlperl.old/lib/Encode/Encoding.pm new file mode 100644 index 00000000000..06af9fb6994 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/Encoding.pm @@ -0,0 +1,341 @@ +package Encode::Encoding; +# Base class for classes which implement encodings +use strict; +our $VERSION = do { my @r = (q$Revision: 2.2 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +require Encode; + +sub DEBUG { 0 } +sub Define +{ + my $obj = shift; + my $canonical = shift; + $obj = bless { Name => $canonical },$obj unless ref $obj; + # warn "$canonical => $obj\n"; + Encode::define_encoding($obj, $canonical, @_); +} + +sub name { return shift->{'Name'} } + +# sub renew { return $_[0] } + +sub renew { + my $self = shift; + my $clone = bless { %$self } => ref($self); + $clone->{renewed}++; # so the caller can see it + DEBUG and warn $clone->{renewed}; + return $clone; +} + +sub renewed{ return $_[0]->{renewed} || 0 } + +*new_sequence = \&renew; + +sub needs_lines { 0 }; + +sub perlio_ok { + eval{ require PerlIO::encoding }; + return $@ ? 0 : 1; +} + +# (Temporary|legacy) methods + +sub toUnicode { shift->decode(@_) } +sub fromUnicode { shift->encode(@_) } + +# +# Needs to be overloaded or just croak +# + +sub encode { + require Carp; + my $obj = shift; + my $class = ref($obj) ? ref($obj) : $obj; + Carp::croak($class . "->encode() not defined!"); +} + +sub decode{ + require Carp; + my $obj = shift; + my $class = ref($obj) ? ref($obj) : $obj; + Carp::croak($class . "->encode() not defined!"); +} + +sub DESTROY {} + +1; +__END__ + +=head1 NAME + +Encode::Encoding - Encode Implementation Base Class + +=head1 SYNOPSIS + + package Encode::MyEncoding; + use base qw(Encode::Encoding); + + __PACKAGE__->Define(qw(myCanonical myAlias)); + +=head1 DESCRIPTION + +As mentioned in L<Encode>, encodings are (in the current +implementation at least) defined as objects. The mapping of encoding +name to object is via the C<%Encode::Encoding> hash. Though you can +directly manipulate this hash, it is strongly encouraged to use this +base class module and add encode() and decode() methods. + +=head2 Methods you should implement + +You are strongly encouraged to implement methods below, at least +either encode() or decode(). + +=over 4 + +=item -E<gt>encode($string [,$check]) + +MUST return the octet sequence representing I<$string>. + +=over 2 + +=item * + +If I<$check> is true, it SHOULD modify I<$string> in place to remove +the converted part (i.e. the whole string unless there is an error). +If perlio_ok() is true, SHOULD becomes MUST. + +=item * + +If an error occurs, it SHOULD return the octet sequence for the +fragment of string that has been converted and modify $string in-place +to remove the converted part leaving it starting with the problem +fragment. If perlio_ok() is true, SHOULD becomes MUST. + +=item * + +If I<$check> is is false then C<encode> MUST make a "best effort" to +convert the string - for example, by using a replacement character. + +=back + +=item -E<gt>decode($octets [,$check]) + +MUST return the string that I<$octets> represents. + +=over 2 + +=item * + +If I<$check> is true, it SHOULD modify I<$octets> in place to remove +the converted part (i.e. the whole sequence unless there is an +error). If perlio_ok() is true, SHOULD becomes MUST. + +=item * + +If an error occurs, it SHOULD return the fragment of string that has +been converted and modify $octets in-place to remove the converted +part leaving it starting with the problem fragment. If perlio_ok() is +true, SHOULD becomes MUST. + +=item * + +If I<$check> is false then C<decode> should make a "best effort" to +convert the string - for example by using Unicode's "\x{FFFD}" as a +replacement character. + +=back + +=back + +If you want your encoding to work with L<encoding> pragma, you should +also implement the method below. + +=over 4 + +=item -E<gt>cat_decode($destination, $octets, $offset, $terminator [,$check]) + +MUST decode I<$octets> with I<$offset> and concatenate it to I<$destination>. +Decoding will terminate when $terminator (a string) appears in output. +I<$offset> will be modified to the last $octets position at end of decode. +Returns true if $terminator appears output, else returns false. + +=back + +=head2 Other methods defined in Encode::Encodings + +You do not have to override methods shown below unless you have to. + +=over 4 + +=item -E<gt>name + +Predefined As: + + sub name { return shift->{'Name'} } + +MUST return the string representing the canonical name of the encoding. + +=item -E<gt>renew + +Predefined As: + + sub renew { + my $self = shift; + my $clone = bless { %$self } => ref($self); + $clone->{renewed}++; + return $clone; + } + +This method reconstructs the encoding object if necessary. If you need +to store the state during encoding, this is where you clone your object. + +PerlIO ALWAYS calls this method to make sure it has its own private +encoding object. + +=item -E<gt>renewed + +Predefined As: + + sub renewed { $_[0]->{renewed} || 0 } + +Tells whether the object is renewed (and how many times). Some +modules emit C<Use of uninitialized value in null operation> warning +unless the value is numeric so return 0 for false. + +=item -E<gt>perlio_ok() + +Predefined As: + + sub perlio_ok { + eval{ require PerlIO::encoding }; + return $@ ? 0 : 1; + } + +If your encoding does not support PerlIO for some reasons, just; + + sub perlio_ok { 0 } + +=item -E<gt>needs_lines() + +Predefined As: + + sub needs_lines { 0 }; + +If your encoding can work with PerlIO but needs line buffering, you +MUST define this method so it returns true. 7bit ISO-2022 encodings +are one example that needs this. When this method is missing, false +is assumed. + +=back + +=head2 Example: Encode::ROT13 + + package Encode::ROT13; + use strict; + use base qw(Encode::Encoding); + + __PACKAGE__->Define('rot13'); + + sub encode($$;$){ + my ($obj, $str, $chk) = @_; + $str =~ tr/A-Za-z/N-ZA-Mn-za-m/; + $_[1] = '' if $chk; # this is what in-place edit means + return $str; + } + + # Jr pna or ynml yvxr guvf; + *decode = \&encode; + + 1; + +=head1 Why the heck Encode API is different? + +It should be noted that the I<$check> behaviour is different from the +outer public API. The logic is that the "unchecked" case is useful +when the encoding is part of a stream which may be reporting errors +(e.g. STDERR). In such cases, it is desirable to get everything +through somehow without causing additional errors which obscure the +original one. Also, the encoding is best placed to know what the +correct replacement character is, so if that is the desired behaviour +then letting low level code do it is the most efficient. + +By contrast, if I<$check> is true, the scheme above allows the +encoding to do as much as it can and tell the layer above how much +that was. What is lacking at present is a mechanism to report what +went wrong. The most likely interface will be an additional method +call to the object, or perhaps (to avoid forcing per-stream objects +on otherwise stateless encodings) an additional parameter. + +It is also highly desirable that encoding classes inherit from +C<Encode::Encoding> as a base class. This allows that class to define +additional behaviour for all encoding objects. + + package Encode::MyEncoding; + use base qw(Encode::Encoding); + + __PACKAGE__->Define(qw(myCanonical myAlias)); + +to create an object with C<< bless {Name => ...}, $class >>, and call +define_encoding. They inherit their C<name> method from +C<Encode::Encoding>. + +=head2 Compiled Encodings + +For the sake of speed and efficiency, most of the encodings are now +supported via a I<compiled form>: XS modules generated from UCM +files. Encode provides the enc2xs tool to achieve that. Please see +L<enc2xs> for more details. + +=head1 SEE ALSO + +L<perlmod>, L<enc2xs> + +=begin future + +=over 4 + +=item Scheme 1 + +The fixup routine gets passed the remaining fragment of string being +processed. It modifies it in place to remove bytes/characters it can +understand and returns a string used to represent them. For example: + + sub fixup { + my $ch = substr($_[0],0,1,''); + return sprintf("\x{%02X}",ord($ch); + } + +This scheme is close to how the underlying C code for Encode works, +but gives the fixup routine very little context. + +=item Scheme 2 + +The fixup routine gets passed the original string, an index into +it of the problem area, and the output string so far. It appends +what it wants to the output string and returns a new index into the +original string. For example: + + sub fixup { + # my ($s,$i,$d) = @_; + my $ch = substr($_[0],$_[1],1); + $_[2] .= sprintf("\x{%02X}",ord($ch); + return $_[1]+1; + } + +This scheme gives maximal control to the fixup routine but is more +complicated to code, and may require that the internals of Encode be tweaked to +keep the original string intact. + +=item Other Schemes + +Hybrids of the above. + +Multiple return values rather than in-place modifications. + +Index into the string could be C<pos($str)> allowing C<s/\G...//>. + +=back + +=end future + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/Guess.pm b/Master/tlpkg/tlperl.old/lib/Encode/Guess.pm new file mode 100644 index 00000000000..5692cee9a4a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/Guess.pm @@ -0,0 +1,351 @@ +package Encode::Guess; +use strict; + +use Encode qw(:fallbacks find_encoding); +our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +my $Canon = 'Guess'; +sub DEBUG () { 0 } +our %DEF_SUSPECTS = map { $_ => find_encoding($_) } qw(ascii utf8); +$Encode::Encoding{$Canon} = + bless { + Name => $Canon, + Suspects => { %DEF_SUSPECTS }, + } => __PACKAGE__; + +use base qw(Encode::Encoding); +sub needs_lines { 1 } +sub perlio_ok { 0 } + +our @EXPORT = qw(guess_encoding); +our $NoUTFAutoGuess = 0; +our $UTF8_BOM = pack("C3", 0xef, 0xbb, 0xbf); + +sub import { # Exporter not used so we do it on our own + my $callpkg = caller; + for my $item (@EXPORT){ + no strict 'refs'; + *{"$callpkg\::$item"} = \&{"$item"}; + } + set_suspects(@_); +} + +sub set_suspects{ + my $class = shift; + my $self = ref($class) ? $class : $Encode::Encoding{$Canon}; + $self->{Suspects} = { %DEF_SUSPECTS }; + $self->add_suspects(@_); +} + +sub add_suspects{ + my $class = shift; + my $self = ref($class) ? $class : $Encode::Encoding{$Canon}; + for my $c (@_){ + my $e = find_encoding($c) or die "Unknown encoding: $c"; + $self->{Suspects}{$e->name} = $e; + DEBUG and warn "Added: ", $e->name; + } +} + +sub decode($$;$){ + my ($obj, $octet, $chk) = @_; + my $guessed = guess($obj, $octet); + unless (ref($guessed)){ + require Carp; + Carp::croak($guessed); + } + my $utf8 = $guessed->decode($octet, $chk); + $_[1] = $octet if $chk; + return $utf8; +} + +sub guess_encoding{ + guess($Encode::Encoding{$Canon}, @_); +} + +sub guess { + my $class = shift; + my $obj = ref($class) ? $class : $Encode::Encoding{$Canon}; + my $octet = shift; + + # sanity check + return unless defined $octet and length $octet; + + # cheat 0: utf8 flag; + if ( Encode::is_utf8($octet) ) { + return find_encoding('utf8') unless $NoUTFAutoGuess; + Encode::_utf8_off($octet); + } + # cheat 1: BOM + use Encode::Unicode; + unless ($NoUTFAutoGuess) { + my $BOM = pack('C3', unpack("C3", $octet)); + return find_encoding('utf8') + if (defined $BOM and $BOM eq $UTF8_BOM); + $BOM = unpack('N', $octet); + return find_encoding('UTF-32') + if (defined $BOM and ($BOM == 0xFeFF or $BOM == 0xFFFe0000)); + $BOM = unpack('n', $octet); + return find_encoding('UTF-16') + if (defined $BOM and ($BOM == 0xFeFF or $BOM == 0xFFFe)); + if ($octet =~ /\x00/o){ # if \x00 found, we assume UTF-(16|32)(BE|LE) + my $utf; + my ($be, $le) = (0, 0); + if ($octet =~ /\x00\x00/o){ # UTF-32(BE|LE) assumed + $utf = "UTF-32"; + for my $char (unpack('N*', $octet)){ + $char & 0x0000ffff and $be++; + $char & 0xffff0000 and $le++; + } + }else{ # UTF-16(BE|LE) assumed + $utf = "UTF-16"; + for my $char (unpack('n*', $octet)){ + $char & 0x00ff and $be++; + $char & 0xff00 and $le++; + } + } + DEBUG and warn "$utf, be == $be, le == $le"; + $be == $le + and return + "Encodings ambiguous between $utf BE and LE ($be, $le)"; + $utf .= ($be > $le) ? 'BE' : 'LE'; + return find_encoding($utf); + } + } + my %try = %{$obj->{Suspects}}; + for my $c (@_){ + my $e = find_encoding($c) or die "Unknown encoding: $c"; + $try{$e->name} = $e; + DEBUG and warn "Added: ", $e->name; + } + my $nline = 1; + for my $line (split /\r\n?|\n/, $octet){ + # cheat 2 -- \e in the string + if ($line =~ /\e/o){ + my @keys = keys %try; + delete @try{qw/utf8 ascii/}; + for my $k (@keys){ + ref($try{$k}) eq 'Encode::XS' and delete $try{$k}; + } + } + my %ok = %try; + # warn join(",", keys %try); + for my $k (keys %try){ + my $scratch = $line; + $try{$k}->decode($scratch, FB_QUIET); + if ($scratch eq ''){ + DEBUG and warn sprintf("%4d:%-24s ok\n", $nline, $k); + }else{ + use bytes (); + DEBUG and + warn sprintf("%4d:%-24s not ok; %d bytes left\n", + $nline, $k, bytes::length($scratch)); + delete $ok{$k}; + } + } + %ok or return "No appropriate encodings found!"; + if (scalar(keys(%ok)) == 1){ + my ($retval) = values(%ok); + return $retval; + } + %try = %ok; $nline++; + } + $try{ascii} or + return "Encodings too ambiguous: ", join(" or ", keys %try); + return $try{ascii}; +} + + + +1; +__END__ + +=head1 NAME + +Encode::Guess -- Guesses encoding from data + +=head1 SYNOPSIS + + # if you are sure $data won't contain anything bogus + + use Encode; + use Encode::Guess qw/euc-jp shiftjis 7bit-jis/; + my $utf8 = decode("Guess", $data); + my $data = encode("Guess", $utf8); # this doesn't work! + + # more elaborate way + use Encode::Guess; + my $enc = guess_encoding($data, qw/euc-jp shiftjis 7bit-jis/); + ref($enc) or die "Can't guess: $enc"; # trap error this way + $utf8 = $enc->decode($data); + # or + $utf8 = decode($enc->name, $data) + +=head1 ABSTRACT + +Encode::Guess enables you to guess in what encoding a given data is +encoded, or at least tries to. + +=head1 DESCRIPTION + +By default, it checks only ascii, utf8 and UTF-16/32 with BOM. + + use Encode::Guess; # ascii/utf8/BOMed UTF + +To use it more practically, you have to give the names of encodings to +check (I<suspects> as follows). The name of suspects can either be +canonical names or aliases. + +CAVEAT: Unlike UTF-(16|32), BOM in utf8 is NOT AUTOMATICALLY STRIPPED. + + # tries all major Japanese Encodings as well + use Encode::Guess qw/euc-jp shiftjis 7bit-jis/; + +If the C<$Encode::Guess::NoUTFAutoGuess> variable is set to a true +value, no heuristics will be applied to UTF8/16/32, and the result +will be limited to the suspects and C<ascii>. + +=over 4 + +=item Encode::Guess->set_suspects + +You can also change the internal suspects list via C<set_suspects> +method. + + use Encode::Guess; + Encode::Guess->set_suspects(qw/euc-jp shiftjis 7bit-jis/); + +=item Encode::Guess->add_suspects + +Or you can use C<add_suspects> method. The difference is that +C<set_suspects> flushes the current suspects list while +C<add_suspects> adds. + + use Encode::Guess; + Encode::Guess->add_suspects(qw/euc-jp shiftjis 7bit-jis/); + # now the suspects are euc-jp,shiftjis,7bit-jis, AND + # euc-kr,euc-cn, and big5-eten + Encode::Guess->add_suspects(qw/euc-kr euc-cn big5-eten/); + +=item Encode::decode("Guess" ...) + +When you are content with suspects list, you can now + + my $utf8 = Encode::decode("Guess", $data); + +=item Encode::Guess->guess($data) + +But it will croak if: + +=over + +=item * + +Two or more suspects remain + +=item * + +No suspects left + +=back + +So you should instead try this; + + my $decoder = Encode::Guess->guess($data); + +On success, $decoder is an object that is documented in +L<Encode::Encoding>. So you can now do this; + + my $utf8 = $decoder->decode($data); + +On failure, $decoder now contains an error message so the whole thing +would be as follows; + + my $decoder = Encode::Guess->guess($data); + die $decoder unless ref($decoder); + my $utf8 = $decoder->decode($data); + +=item guess_encoding($data, [, I<list of suspects>]) + +You can also try C<guess_encoding> function which is exported by +default. It takes $data to check and it also takes the list of +suspects by option. The optional suspect list is I<not reflected> to +the internal suspects list. + + my $decoder = guess_encoding($data, qw/euc-jp euc-kr euc-cn/); + die $decoder unless ref($decoder); + my $utf8 = $decoder->decode($data); + # check only ascii and utf8 + my $decoder = guess_encoding($data); + +=back + +=head1 CAVEATS + +=over 4 + +=item * + +Because of the algorithm used, ISO-8859 series and other single-byte +encodings do not work well unless either one of ISO-8859 is the only +one suspect (besides ascii and utf8). + + use Encode::Guess; + # perhaps ok + my $decoder = guess_encoding($data, 'latin1'); + # definitely NOT ok + my $decoder = guess_encoding($data, qw/latin1 greek/); + +The reason is that Encode::Guess guesses encoding by trial and error. +It first splits $data into lines and tries to decode the line for each +suspect. It keeps it going until all but one encoding is eliminated +out of suspects list. ISO-8859 series is just too successful for most +cases (because it fills almost all code points in \x00-\xff). + +=item * + +Do not mix national standard encodings and the corresponding vendor +encodings. + + # a very bad idea + my $decoder + = guess_encoding($data, qw/shiftjis MacJapanese cp932/); + +The reason is that vendor encoding is usually a superset of national +standard so it becomes too ambiguous for most cases. + +=item * + +On the other hand, mixing various national standard encodings +automagically works unless $data is too short to allow for guessing. + + # This is ok if $data is long enough + my $decoder = + guess_encoding($data, qw/euc-cn + euc-jp shiftjis 7bit-jis + euc-kr + big5-eten/); + +=item * + +DO NOT PUT TOO MANY SUSPECTS! Don't you try something like this! + + my $decoder = guess_encoding($data, + Encode->encodings(":all")); + +=back + +It is, after all, just a guess. You should alway be explicit when it +comes to encodings. But there are some, especially Japanese, +environment that guess-coding is a must. Use this module with care. + +=head1 TO DO + +Encode::Guess does not work on EBCDIC platforms. + +=head1 SEE ALSO + +L<Encode>, L<Encode::Encoding> + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Encode/JP.pm b/Master/tlpkg/tlperl.old/lib/Encode/JP.pm new file mode 100644 index 00000000000..01ad37f30db --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/JP.pm @@ -0,0 +1,97 @@ +package Encode::JP; +BEGIN { + if (ord("A") == 193) { + die "Encode::JP not supported on EBCDIC\n"; + } +} +use Encode; +our $VERSION = do { my @r = (q$Revision: 2.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +use XSLoader; +XSLoader::load(__PACKAGE__,$VERSION); + +use Encode::JP::JIS7; + +1; +__END__ + +=head1 NAME + +Encode::JP - Japanese Encodings + +=head1 SYNOPSIS + + use Encode qw/encode decode/; + $euc_jp = encode("euc-jp", $utf8); # loads Encode::JP implicitly + $utf8 = decode("euc-jp", $euc_jp); # ditto + +=head1 ABSTRACT + +This module implements Japanese charset encodings. Encodings +supported are as follows. + + Canonical Alias Description + -------------------------------------------------------------------- + euc-jp /\beuc.*jp$/i EUC (Extended Unix Character) + /\bjp.*euc/i + /\bujis$/i + shiftjis /\bshift.*jis$/i Shift JIS (aka MS Kanji) + /\bsjis$/i + 7bit-jis /\bjis$/i 7bit JIS + iso-2022-jp ISO-2022-JP [RFC1468] + = 7bit JIS with all Halfwidth Kana + converted to Fullwidth + iso-2022-jp-1 ISO-2022-JP-1 [RFC2237] + = ISO-2022-JP with JIS X 0212-1990 + support. See below + MacJapanese Shift JIS + Apple vendor mappings + cp932 /\bwindows-31j$/i Code Page 932 + = Shift JIS + MS/IBM vendor mappings + jis0201-raw JIS0201, raw format + jis0208-raw JIS0201, raw format + jis0212-raw JIS0201, raw format + -------------------------------------------------------------------- + +=head1 DESCRIPTION + +To find out how to use this module in detail, see L<Encode>. + +=head1 Note on ISO-2022-JP(-1)? + +ISO-2022-JP-1 (RFC2237) is a superset of ISO-2022-JP (RFC1468) which +adds support for JIS X 0212-1990. That means you can use the same +code to decode to utf8 but not vice versa. + + $utf8 = decode('iso-2022-jp-1', $stream); + +and + + $utf8 = decode('iso-2022-jp', $stream); + +yield the same result but + + $with_0212 = encode('iso-2022-jp-1', $utf8); + +is now different from + + $without_0212 = encode('iso-2022-jp', $utf8 ); + +In the latter case, characters that map to 0212 are first converted +to U+3013 (0xA2AE in EUC-JP; a white square also known as 'Tofu' or +'geta mark') then fed to the decoding engine. U+FFFD is not used, +in order to preserve text layout as much as possible. + +=head1 BUGS + +The ASCII region (0x00-0x7f) is preserved for all encodings, even +though this conflicts with mappings by the Unicode Consortium. See + +L<http://www.debian.or.jp/~kubota/unicode-symbols.html.en> + +to find out why it is implemented that way. + +=head1 SEE ALSO + +L<Encode> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/JP/H2Z.pm b/Master/tlpkg/tlperl.old/lib/Encode/JP/H2Z.pm new file mode 100644 index 00000000000..0c84c62fda6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/JP/H2Z.pm @@ -0,0 +1,174 @@ +# +# $Id: H2Z.pm,v 2.0 2004/05/16 20:55:17 dankogai Exp $ +# + +package Encode::JP::H2Z; + +use strict; + +our $RCSID = q$Id: H2Z.pm,v 2.0 2004/05/16 20:55:17 dankogai Exp $; +our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +use Encode::CJKConstants qw(:all); + +use vars qw(%_D2Z $_PAT_D2Z + %_Z2D $_PAT_Z2D + %_H2Z $_PAT_H2Z + %_Z2H $_PAT_Z2H); + +%_H2Z = ( + "\x8e\xa1" => "\xa1\xa3", #¡£ + "\x8e\xa2" => "\xa1\xd6", #¡Ö + "\x8e\xa3" => "\xa1\xd7", #¡× + "\x8e\xa4" => "\xa1\xa2", #¡¢ + "\x8e\xa5" => "\xa1\xa6", #¡¦ + "\x8e\xa6" => "\xa5\xf2", #¥ò + "\x8e\xa7" => "\xa5\xa1", #¥¡ + "\x8e\xa8" => "\xa5\xa3", #¥£ + "\x8e\xa9" => "\xa5\xa5", #¥¥ + "\x8e\xaa" => "\xa5\xa7", #¥§ + "\x8e\xab" => "\xa5\xa9", #¥© + "\x8e\xac" => "\xa5\xe3", #¥ã + "\x8e\xad" => "\xa5\xe5", #¥å + "\x8e\xae" => "\xa5\xe7", #¥ç + "\x8e\xaf" => "\xa5\xc3", #¥Ã + "\x8e\xb0" => "\xa1\xbc", #¡¼ + "\x8e\xb1" => "\xa5\xa2", #¥¢ + "\x8e\xb2" => "\xa5\xa4", #¥¤ + "\x8e\xb3" => "\xa5\xa6", #¥¦ + "\x8e\xb4" => "\xa5\xa8", #¥¨ + "\x8e\xb5" => "\xa5\xaa", #¥ª + "\x8e\xb6" => "\xa5\xab", #¥« + "\x8e\xb7" => "\xa5\xad", #¥ + "\x8e\xb8" => "\xa5\xaf", #¥¯ + "\x8e\xb9" => "\xa5\xb1", #¥± + "\x8e\xba" => "\xa5\xb3", #¥³ + "\x8e\xbb" => "\xa5\xb5", #¥µ + "\x8e\xbc" => "\xa5\xb7", #¥· + "\x8e\xbd" => "\xa5\xb9", #¥¹ + "\x8e\xbe" => "\xa5\xbb", #¥» + "\x8e\xbf" => "\xa5\xbd", #¥½ + "\x8e\xc0" => "\xa5\xbf", #¥¿ + "\x8e\xc1" => "\xa5\xc1", #¥Á + "\x8e\xc2" => "\xa5\xc4", #¥Ä + "\x8e\xc3" => "\xa5\xc6", #¥Æ + "\x8e\xc4" => "\xa5\xc8", #¥È + "\x8e\xc5" => "\xa5\xca", #¥Ê + "\x8e\xc6" => "\xa5\xcb", #¥Ë + "\x8e\xc7" => "\xa5\xcc", #¥Ì + "\x8e\xc8" => "\xa5\xcd", #¥Í + "\x8e\xc9" => "\xa5\xce", #¥Î + "\x8e\xca" => "\xa5\xcf", #¥Ï + "\x8e\xcb" => "\xa5\xd2", #¥Ò + "\x8e\xcc" => "\xa5\xd5", #¥Õ + "\x8e\xcd" => "\xa5\xd8", #¥Ø + "\x8e\xce" => "\xa5\xdb", #¥Û + "\x8e\xcf" => "\xa5\xde", #¥Þ + "\x8e\xd0" => "\xa5\xdf", #¥ß + "\x8e\xd1" => "\xa5\xe0", #¥à + "\x8e\xd2" => "\xa5\xe1", #¥á + "\x8e\xd3" => "\xa5\xe2", #¥â + "\x8e\xd4" => "\xa5\xe4", #¥ä + "\x8e\xd5" => "\xa5\xe6", #¥æ + "\x8e\xd6" => "\xa5\xe8", #¥è + "\x8e\xd7" => "\xa5\xe9", #¥é + "\x8e\xd8" => "\xa5\xea", #¥ê + "\x8e\xd9" => "\xa5\xeb", #¥ë + "\x8e\xda" => "\xa5\xec", #¥ì + "\x8e\xdb" => "\xa5\xed", #¥í + "\x8e\xdc" => "\xa5\xef", #¥ï + "\x8e\xdd" => "\xa5\xf3", #¥ó + "\x8e\xde" => "\xa1\xab", #¡« + "\x8e\xdf" => "\xa1\xac", #¡¬ +); + +%_D2Z = ( + "\x8e\xb6\x8e\xde" => "\xa5\xac", #¥¬ + "\x8e\xb7\x8e\xde" => "\xa5\xae", #¥® + "\x8e\xb8\x8e\xde" => "\xa5\xb0", #¥° + "\x8e\xb9\x8e\xde" => "\xa5\xb2", #¥² + "\x8e\xba\x8e\xde" => "\xa5\xb4", #¥´ + "\x8e\xbb\x8e\xde" => "\xa5\xb6", #¥¶ + "\x8e\xbc\x8e\xde" => "\xa5\xb8", #¥¸ + "\x8e\xbd\x8e\xde" => "\xa5\xba", #¥º + "\x8e\xbe\x8e\xde" => "\xa5\xbc", #¥¼ + "\x8e\xbf\x8e\xde" => "\xa5\xbe", #¥¾ + "\x8e\xc0\x8e\xde" => "\xa5\xc0", #¥À + "\x8e\xc1\x8e\xde" => "\xa5\xc2", #¥Â + "\x8e\xc2\x8e\xde" => "\xa5\xc5", #¥Å + "\x8e\xc3\x8e\xde" => "\xa5\xc7", #¥Ç + "\x8e\xc4\x8e\xde" => "\xa5\xc9", #¥É + "\x8e\xca\x8e\xde" => "\xa5\xd0", #¥Ð + "\x8e\xcb\x8e\xde" => "\xa5\xd3", #¥Ó + "\x8e\xcc\x8e\xde" => "\xa5\xd6", #¥Ö + "\x8e\xcd\x8e\xde" => "\xa5\xd9", #¥Ù + "\x8e\xce\x8e\xde" => "\xa5\xdc", #¥Ü + "\x8e\xca\x8e\xdf" => "\xa5\xd1", #¥Ñ + "\x8e\xcb\x8e\xdf" => "\xa5\xd4", #¥Ô + "\x8e\xcc\x8e\xdf" => "\xa5\xd7", #¥× + "\x8e\xcd\x8e\xdf" => "\xa5\xda", #¥Ú + "\x8e\xce\x8e\xdf" => "\xa5\xdd", #¥Ý + "\x8e\xb3\x8e\xde" => "\xa5\xf4", #¥ô +); + +# init only once; + +#$_PAT_D2Z = join("|", keys %_D2Z); +#$_PAT_H2Z = join("|", keys %_H2Z); + +%_Z2H = reverse %_H2Z; +%_Z2D = reverse %_D2Z; + +#$_PAT_Z2H = join("|", keys %_Z2H); +#$_PAT_Z2D = join("|", keys %_Z2D); + +sub h2z { + no warnings qw(uninitialized); + my $r_str = shift; + my ($keep_dakuten) = @_; + my $n = 0; + unless ($keep_dakuten){ + $n = ( + $$r_str =~ s( + ($RE{EUC_KANA} + (?:\x8e[\xde\xdf])?) + ){ + my $str = $1; + $_D2Z{$str} || $_H2Z{$str} || + # in case dakuten and handakuten are side-by-side! + $_H2Z{substr($str,0,2)} . $_H2Z{substr($str,2,2)}; + }eogx + ); + }else{ + $n = ( + $$r_str =~ s( + ($RE{EUC_KANA}) + ){ + $_H2Z{$1}; + }eogx + ); + } + $n; +} + +sub z2h { + my $r_str = shift; + my $n = ( + $$r_str =~ s( + ($RE{EUC_C}|$RE{EUC_0212}|$RE{EUC_KANA}) + ){ + $_Z2D{$1} || $_Z2H{$1} || $1; + }eogx + ); + $n; +} + +1; +__END__ + + +=head1 NAME + +Encode::JP::H2Z -- internally used by Encode::JP::2022_JP* + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/JP/JIS7.pm b/Master/tlpkg/tlperl.old/lib/Encode/JP/JIS7.pm new file mode 100644 index 00000000000..28503ec760c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/JP/JIS7.pm @@ -0,0 +1,165 @@ +package Encode::JP::JIS7; +use strict; + +our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +use Encode qw(:fallbacks); + +for my $name ('7bit-jis', 'iso-2022-jp', 'iso-2022-jp-1'){ + my $h2z = ($name eq '7bit-jis') ? 0 : 1; + my $jis0212 = ($name eq 'iso-2022-jp') ? 0 : 1; + + $Encode::Encoding{$name} = + bless { + Name => $name, + h2z => $h2z, + jis0212 => $jis0212, + } => __PACKAGE__; +} + +use base qw(Encode::Encoding); + +# we override this to 1 so PerlIO works +sub needs_lines { 1 } + +use Encode::CJKConstants qw(:all); + +# +# decode is identical for all 2022 variants +# + +sub decode($$;$) +{ + my ($obj, $str, $chk) = @_; + my $residue = ''; + if ($chk){ + $str =~ s/([^\x00-\x7f].*)$//so and $residue = $1; + } + $residue .= jis_euc(\$str); + $_[1] = $residue if $chk; + return Encode::decode('euc-jp', $str, FB_PERLQQ); +} + +# +# encode is different +# + +sub encode($$;$) +{ + require Encode::JP::H2Z; + my ($obj, $utf8, $chk) = @_; + # empty the input string in the stack so perlio is ok + $_[1] = '' if $chk; + my ($h2z, $jis0212) = @$obj{qw(h2z jis0212)}; + my $octet = Encode::encode('euc-jp', $utf8, FB_PERLQQ) ; + $h2z and &Encode::JP::H2Z::h2z(\$octet); + euc_jis(\$octet, $jis0212); + return $octet; +} + +# +# cat_decode +# +my $re_scan_jis_g = qr{ + \G ( ($RE{JIS_0212}) | $RE{JIS_0208} | + ($RE{ISO_ASC}) | ($RE{JIS_KANA}) | ) + ([^\e]*) +}x; +sub cat_decode { # ($obj, $dst, $src, $pos, $trm, $chk) + my ($obj, undef, undef, $pos, $trm) = @_; # currently ignores $chk + my ($rdst, $rsrc, $rpos) = \@_[1,2,3]; + local ${^ENCODING}; + use bytes; + my $opos = pos($$rsrc); + pos($$rsrc) = $pos; + while ($$rsrc =~ /$re_scan_jis_g/gc) { + my ($esc, $esc_0212, $esc_asc, $esc_kana, $chunk) = + ($1, $2, $3, $4, $5); + + unless ($chunk) { $esc or last; next; } + + if ($esc && !$esc_asc) { + $chunk =~ tr/\x21-\x7e/\xa1-\xfe/; + if ($esc_kana) { + $chunk =~ s/([\xa1-\xdf])/\x8e$1/og; + } elsif ($esc_0212) { + $chunk =~ s/([\xa1-\xfe][\xa1-\xfe])/\x8f$1/og; + } + $chunk = Encode::decode('euc-jp', $chunk, 0); + } + elsif ((my $npos = index($chunk, $trm)) >= 0) { + $$rdst .= substr($chunk, 0, $npos + length($trm)); + $$rpos += length($esc) + $npos + length($trm); + pos($$rsrc) = $opos; + return 1; + } + $$rdst .= $chunk; + $$rpos = pos($$rsrc); + } + $$rpos = pos($$rsrc); + pos($$rsrc) = $opos; + return ''; +} + +# JIS<->EUC +my $re_scan_jis = qr{ + (?:($RE{JIS_0212})|$RE{JIS_0208}|($RE{ISO_ASC})|($RE{JIS_KANA}))([^\e]*) +}x; + +sub jis_euc { + local ${^ENCODING}; + my $r_str = shift; + $$r_str =~ s($re_scan_jis) + { + my ($esc_0212, $esc_asc, $esc_kana, $chunk) = + ($1, $2, $3, $4); + if (!$esc_asc) { + $chunk =~ tr/\x21-\x7e/\xa1-\xfe/; + if ($esc_kana) { + $chunk =~ s/([\xa1-\xdf])/\x8e$1/og; + } + elsif ($esc_0212) { + $chunk =~ s/([\xa1-\xfe][\xa1-\xfe])/\x8f$1/og; + } + } + $chunk; + }geox; + my ($residue) = ($$r_str =~ s/(\e.*)$//so); + return $residue; +} + +sub euc_jis{ + no warnings qw(uninitialized); + my $r_str = shift; + my $jis0212 = shift; + $$r_str =~ s{ + ((?:$RE{EUC_C})+|(?:$RE{EUC_KANA})+|(?:$RE{EUC_0212})+) + }{ + my $chunk = $1; + my $esc = + ( $chunk =~ tr/\x8E//d ) ? $ESC{KANA} : + ( $chunk =~ tr/\x8F//d ) ? $ESC{JIS_0212} : + $ESC{JIS_0208}; + if ($esc eq $ESC{JIS_0212} && !$jis0212){ + # fallback to '?' + $chunk =~ tr/\xA1-\xFE/\x3F/; + }else{ + $chunk =~ tr/\xA1-\xFE/\x21-\x7E/; + } + $esc . $chunk . $ESC{ASC}; + }geox; + $$r_str =~ + s/\Q$ESC{ASC}\E + (\Q$ESC{KANA}\E|\Q$ESC{JIS_0212}\E|\Q$ESC{JIS_0208}\E)/$1/gox; + $$r_str; +} + +1; +__END__ + + +=head1 NAME + +Encode::JP::JIS7 -- internally used by Encode::JP + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/KR.pm b/Master/tlpkg/tlperl.old/lib/Encode/KR.pm new file mode 100644 index 00000000000..e9d4073b7b4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/KR.pm @@ -0,0 +1,72 @@ +package Encode::KR; +BEGIN { + if (ord("A") == 193) { + die "Encode::KR not supported on EBCDIC\n"; + } +} +our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +use Encode; +use XSLoader; +XSLoader::load(__PACKAGE__,$VERSION); + +use Encode::KR::2022_KR; + +1; +__END__ + +=head1 NAME + +Encode::KR - Korean Encodings + +=head1 SYNOPSIS + + use Encode qw/encode decode/; + $euc_kr = encode("euc-kr", $utf8); # loads Encode::KR implicitly + $utf8 = decode("euc-kr", $euc_kr); # ditto + +=head1 DESCRIPTION + +This module implements Korean charset encodings. Encodings supported +are as follows. + + + Canonical Alias Description + -------------------------------------------------------------------- + euc-kr /\beuc.*kr$/i EUC (Extended Unix Character) + /\bkr.*euc$/i + ksc5601-raw Korean standard code set (as is) + cp949 /(?:x-)?uhc$/i + /(?:x-)?windows-949$/i + /\bks_c_5601-1987$/i + Code Page 949 (EUC-KR + 8,822 + (additional Hangul syllables) + MacKorean EUC-KR + Apple Vendor Mappings + johab JOHAB A supplementary encoding defined in + Annex 3 of KS X 1001:1998 + iso-2022-kr iso-2022-kr [RFC1557] + -------------------------------------------------------------------- + +To find how to use this module in detail, see L<Encode>. + +=head1 BUGS + +When you see C<charset=ks_c_5601-1987> on mails and web pages, they really +mean "cp949" encodings. To fix that, the following aliases are set; + + qr/(?:x-)?uhc$/i => '"cp949"' + qr/(?:x-)?windows-949$/i => '"cp949"' + qr/ks_c_5601-1987$/i => '"cp949"' + +The ASCII region (0x00-0x7f) is preserved for all encodings, even +though this conflicts with mappings by the Unicode Consortium. See + +L<http://www.debian.or.jp/~kubota/unicode-symbols.html.en> + +to find out why it is implemented that way. + +=head1 SEE ALSO + +L<Encode> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/KR/2022_KR.pm b/Master/tlpkg/tlperl.old/lib/Encode/KR/2022_KR.pm new file mode 100644 index 00000000000..8b4052be570 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/KR/2022_KR.pm @@ -0,0 +1,79 @@ +package Encode::KR::2022_KR; +use strict; + +our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +use Encode qw(:fallbacks); + +use base qw(Encode::Encoding); +__PACKAGE__->Define('iso-2022-kr'); + +sub needs_lines { 1 } + +sub perlio_ok { + return 0; # for the time being +} + +sub decode +{ + my ($obj, $str, $chk) = @_; + my $res = $str; + my $residue = iso_euc(\$res); + # This is for PerlIO + $_[1] = $residue if $chk; + return Encode::decode('euc-kr', $res, FB_PERLQQ); +} + +sub encode +{ + my ($obj, $utf8, $chk) = @_; + # empty the input string in the stack so perlio is ok + $_[1] = '' if $chk; + my $octet = Encode::encode('euc-kr', $utf8, FB_PERLQQ) ; + euc_iso(\$octet); + return $octet; +} + +use Encode::CJKConstants qw(:all); + +# ISO<->EUC + +sub iso_euc{ + my $r_str = shift; + $$r_str =~ s/$RE{'2022_KR'}//gox; # remove the designator + $$r_str =~ s{ # replace characters in GL + \x0e # between SO(\x0e) and SI(\x0f) + ([^\x0f]*) # with characters in GR + \x0f + } + { + my $out= $1; + $out =~ tr/\x21-\x7e/\xa1-\xfe/; + $out; + }geox; + my ($residue) = ($$r_str =~ s/(\e.*)$//so); + return $residue; +} + +sub euc_iso{ + no warnings qw(uninitialized); + my $r_str = shift; + substr($$r_str,0,0)=$ESC{'2022_KR'}; # put the designator at the beg. + $$r_str =~ s{ # move KS X 1001 characters in GR to GL + ($RE{EUC_C}+) # and enclose them with SO and SI + }{ + my $str = $1; + $str =~ tr/\xA1-\xFE/\x21-\x7E/; + "\x0e" . $str . "\x0f"; + }geox; + $$r_str; +} + +1; +__END__ + +=head1 NAME + +Encode::KR::2022_KR -- internally used by Encode::KR + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/MIME/Header.pm b/Master/tlpkg/tlperl.old/lib/Encode/MIME/Header.pm new file mode 100644 index 00000000000..f4e2ad6e2b5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/MIME/Header.pm @@ -0,0 +1,230 @@ +package Encode::MIME::Header; +use strict; +# use warnings; +our $VERSION = do { my @r = (q$Revision: 2.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; +use Encode qw(find_encoding encode_utf8 decode_utf8); +use MIME::Base64; +use Carp; + +my %seed = + ( + decode_b => '1', # decodes 'B' encoding ? + decode_q => '1', # decodes 'Q' encoding ? + encode => 'B', # encode with 'B' or 'Q' ? + bpl => 75, # bytes per line + ); + +$Encode::Encoding{'MIME-Header'} = + bless { + %seed, + Name => 'MIME-Header', + } => __PACKAGE__; + +$Encode::Encoding{'MIME-B'} = + bless { + %seed, + decode_q => 0, + Name => 'MIME-B', + } => __PACKAGE__; + +$Encode::Encoding{'MIME-Q'} = + bless { + %seed, + decode_q => 1, + encode => 'Q', + Name => 'MIME-Q', + } => __PACKAGE__; + +use base qw(Encode::Encoding); + +sub needs_lines { 1 } +sub perlio_ok{ 0 }; + +sub decode($$;$){ + use utf8; + my ($obj, $str, $chk) = @_; + # zap spaces between encoded words + $str =~ s/\?=\s+=\?/\?==\?/gos; + # multi-line header to single line + $str =~ s/(:?\r|\n|\r\n)[ \t]//gos; + $str =~ + s{ + =\? # begin encoded word + ([0-9A-Za-z\-_]+) # charset (encoding) + \?([QqBb])\? # delimiter + (.*?) # Base64-encodede contents + \?= # end encoded word + }{ + if (uc($2) eq 'B'){ + $obj->{decode_b} or croak qq(MIME "B" unsupported); + decode_b($1, $3); + }elsif(uc($2) eq 'Q'){ + $obj->{decode_q} or croak qq(MIME "Q" unsupported); + decode_q($1, $3); + }else{ + croak qq(MIME "$2" encoding is nonexistent!); + } + }egox; + $_[1] = '' if $chk; + return $str; +} + +sub decode_b{ + my $enc = shift; + my $d = find_encoding($enc) or croak qq(Unknown encoding "$enc"); + my $db64 = decode_base64(shift); + return $d->name eq 'utf8' ? + Encode::decode_utf8($db64) : $d->decode($db64, Encode::FB_PERLQQ); +} + +sub decode_q{ + my ($enc, $q) = @_; + my $d = find_encoding($enc) or croak qq(Unknown encoding "$enc"); + $q =~ s/_/ /go; + $q =~ s/=([0-9A-Fa-f]{2})/pack("C", hex($1))/ego; + return $d->name eq 'utf8' ? + Encode::decode_utf8($q) : $d->decode($q, Encode::FB_PERLQQ); +} + +my $especials = + join('|' => + map {quotemeta(chr($_))} + unpack("C*", qq{()<>@,;:\"\'/[]?.=})); + +my $re_encoded_word = + qr{ + (?: + =\? # begin encoded word + (?:[0-9A-Za-z\-_]+) # charset (encoding) + \?(?:[QqBb])\? # delimiter + (?:.*?) # Base64-encodede contents + \?= # end encoded word + ) + }xo; + +my $re_especials = qr{$re_encoded_word|$especials}xo; + +sub encode($$;$){ + my ($obj, $str, $chk) = @_; + my @line = (); + for my $line (split /\r|\n|\r\n/o, $str){ + my (@word, @subline); + for my $word (split /($re_especials)/o, $line){ + if ($word =~ /[^\x00-\x7f]/o or $word =~ /^$re_encoded_word$/o){ + push @word, $obj->_encode($word); + }else{ + push @word, $word; + } + } + my $subline = ''; + for my $word (@word){ + use bytes (); + if (bytes::length($subline) + bytes::length($word) > $obj->{bpl}){ + push @subline, $subline; + $subline = ''; + } + $subline .= $word; + } + $subline and push @subline, $subline; + push @line, join("\n " => @subline); + } + $_[1] = '' if $chk; + return join("\n", @line); +} + +use constant HEAD => '=?UTF-8?'; +use constant TAIL => '?='; +use constant SINGLE => { B => \&_encode_b, Q => \&_encode_q, }; + +sub _encode{ + my ($o, $str) = @_; + my $enc = $o->{encode}; + my $llen = ($o->{bpl} - length(HEAD) - 2 - length(TAIL)); + # to coerce a floating-point arithmetics, the following contains + # .0 in numbers -- dankogai + $llen *= $enc eq 'B' ? 3.0/4.0 : 1.0/3.0; + my @result = (); + my $chunk = ''; + while(length(my $chr = substr($str, 0, 1, ''))){ + use bytes (); + if (bytes::length($chunk) + bytes::length($chr) > $llen){ + push @result, SINGLE->{$enc}($chunk); + $chunk = ''; + } + $chunk .= $chr; + } + $chunk and push @result, SINGLE->{$enc}($chunk); + return @result; +} + +sub _encode_b{ + HEAD . 'B?' . encode_base64(encode_utf8(shift), '') . TAIL; +} + +sub _encode_q{ + my $chunk = shift; + $chunk =~ s{ + ([^0-9A-Za-z]) + }{ + join("" => map {sprintf "=%02X", $_} unpack("C*", $1)) + }egox; + return decode_utf8(HEAD . 'Q?' . $chunk . TAIL); +} + +1; +__END__ + +=head1 NAME + +Encode::MIME::Header -- MIME 'B' and 'Q' header encoding + +=head1 SYNOPSIS + + use Encode qw/encode decode/; + $utf8 = decode('MIME-Header', $header); + $header = encode('MIME-Header', $utf8); + +=head1 ABSTRACT + +This module implements RFC 2047 Mime Header Encoding. There are 3 +variant encoding names; C<MIME-Header>, C<MIME-B> and C<MIME-Q>. The +difference is described below + + decode() encode() + ---------------------------------------------- + MIME-Header Both B and Q =?UTF-8?B?....?= + MIME-B B only; Q croaks =?UTF-8?B?....?= + MIME-Q Q only; B croaks =?UTF-8?Q?....?= + +=head1 DESCRIPTION + +When you decode(=?I<encoding>?I<X>?I<ENCODED WORD>?=), I<ENCODED WORD> +is extracted and decoded for I<X> encoding (B for Base64, Q for +Quoted-Printable). Then the decoded chunk is fed to +decode(I<encoding>). So long as I<encoding> is supported by Encode, +any source encoding is fine. + +When you encode, it just encodes UTF-8 string with I<X> encoding then +quoted with =?UTF-8?I<X>?....?= . The parts that RFC 2047 forbids to +encode are left as is and long lines are folded within 76 bytes per +line. + +=head1 BUGS + +It would be nice to support encoding to non-UTF8, such as =?ISO-2022-JP? +and =?ISO-8859-1?= but that makes the implementation too complicated. +These days major mail agents all support =?UTF-8? so I think it is +just good enough. + +Due to popular demand, 'MIME-Header-ISO_2022_JP' was introduced by +Makamaka. Thre are still too many MUAs especially cellular phone +handsets which does not grok UTF-8. + +=head1 SEE ALSO + +L<Encode> + +RFC 2047, L<http://www.faqs.org/rfcs/rfc2047.html> and many other +locations. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/MIME/Header/ISO_2022_JP.pm b/Master/tlpkg/tlperl.old/lib/Encode/MIME/Header/ISO_2022_JP.pm new file mode 100644 index 00000000000..5f637a32472 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/MIME/Header/ISO_2022_JP.pm @@ -0,0 +1,127 @@ +package Encode::MIME::Header::ISO_2022_JP; + +use strict; +use base qw(Encode::MIME::Header); + +$Encode::Encoding{'MIME-Header-ISO_2022_JP'} + = bless {encode => 'B', bpl => 76, Name => 'MIME-Header-ISO_2022_JP'} + => __PACKAGE__; + +use constant HEAD => '=?ISO-2022-JP?B?'; +use constant TAIL => '?='; + +use Encode::CJKConstants qw(%RE); + +our $VERSION = do { my @r = (q$Revision: 1.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + + +# I owe the below codes totally to +# Jcode by Dan Kogai & http://www.din.or.jp/~ohzaki/perl.htm#JP_Base64 + +sub encode { + my $self = shift; + my $str = shift; + + utf8::encode($str) if( Encode::is_utf8($str) ); + Encode::from_to($str, 'utf8', 'euc-jp'); + + my($trailing_crlf) = ($str =~ /(\n|\r|\x0d\x0a)$/o); + + $str = _mime_unstructured_header($str, $self->{bpl}); + + not $trailing_crlf and $str =~ s/(\n|\r|\x0d\x0a)$//o; + + return $str; +} + + +sub _mime_unstructured_header { + my ($oldheader, $bpl) = @_; + my $crlf = $oldheader =~ /\n$/; + my($header, @words, @wordstmp, $i) = (''); + + $oldheader =~ s/\s+$//; + + @wordstmp = split /\s+/, $oldheader; + + for ($i = 0; $i < $#wordstmp; $i++){ + if( $wordstmp[$i] !~ /^[\x21-\x7E]+$/ and $wordstmp[$i + 1] !~ /^[\x21-\x7E]+$/){ + $wordstmp[$i + 1] = "$wordstmp[$i] $wordstmp[$i + 1]"; + } + else{ + push(@words, $wordstmp[$i]); + } + } + + push(@words, $wordstmp[-1]); + + for my $word (@words){ + if ($word =~ /^[\x21-\x7E]+$/) { + $header =~ /(?:.*\n)*(.*)/; + if (length($1) + length($word) > $bpl) { + $header .= "\n $word"; + } + else{ + $header .= $word; + } + } + else{ + $header = _add_encoded_word($word, $header, $bpl); + } + + $header =~ /(?:.*\n)*(.*)/; + + if(length($1) == $bpl){ + $header .= "\n "; + } + else { + $header .= ' '; + } + } + + $header =~ s/\n? $//mg; + + $crlf ? "$header\n" : $header; +} + + +sub _add_encoded_word { + my($str, $line, $bpl) = @_; + my $result = ''; + + while( length($str) ){ + my $target = $str; + $str = ''; + + if(length($line) + 22 + ($target =~ /^(?:$RE{EUC_0212}|$RE{EUC_C})/o) * 8 > $bpl){ + $line =~ s/[ \t\n\r]*$/\n/; + $result .= $line; + $line = ' '; + } + + while(1){ + my $iso_2022_jp = $target; + Encode::from_to($iso_2022_jp, 'euc-jp', 'iso-2022-jp'); + + my $encoded + = HEAD . MIME::Base64::encode_base64($iso_2022_jp, '') . TAIL; + + if(length($encoded) + length($line) > $bpl){ + $target =~ s/($RE{EUC_0212}|$RE{EUC_KANA}|$RE{EUC_C}|$RE{ASCII})$//o; + $str = $1 . $str; + } + else{ + $line .= $encoded; + last; + } + } + + } + + $result . $line; +} + + +1; +__END__ + diff --git a/Master/tlpkg/tlperl.old/lib/Encode/Makefile_PL.e2x b/Master/tlpkg/tlperl.old/lib/Encode/Makefile_PL.e2x new file mode 100644 index 00000000000..3bca0bff52b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/Makefile_PL.e2x @@ -0,0 +1,180 @@ +# +# This file is auto-generated by: +# enc2xs version $_Version_ +# $_Now_ +# +use 5.7.2; +use strict; +use ExtUtils::MakeMaker; +use Config; + +# Please edit the following to the taste! +my $name = '$_Name_'; +my %tables = ( + $_Name__t => [ $_TableFiles_ ], + ); + +#### DO NOT EDIT BEYOND THIS POINT! +require File::Spec; +my ($enc2xs, $encode_h) = (); +PATHLOOP: +for my $d (@Config{qw/bin sitebin vendorbin/}, + (split /$Config{path_sep}/o, $ENV{PATH})){ + for my $f (qw/enc2xs enc2xs5.7.3/){ + my $path = File::Spec->catfile($d, $f); + -r $path and $enc2xs = $path and last PATHLOOP; + } +} +$enc2xs or die "enc2xs not found!"; +print "enc2xs is $enc2xs\n"; +my %encode_h = (); +for my $d (@INC){ + my $dir = File::Spec->catfile($d, "Encode"); + my $file = File::Spec->catfile($dir, "encode.h"); + -f $file and $encode_h{$dir} = -M $file; +} +%encode_h or die "encode.h not found!"; +# find the latest one +($encode_h) = sort {$encode_h{$b} <=> $encode_h{$a}} keys %encode_h; +print "encode.h is at $encode_h\n"; + +WriteMakefile( + INC => "-I$encode_h", +#### END_OF_HEADER -- DO NOT EDIT THIS LINE BY HAND! #### + NAME => 'Encode::'.$name, + VERSION_FROM => "$name.pm", + OBJECT => '$(O_FILES)', + 'dist' => { + COMPRESS => 'gzip -9f', + SUFFIX => 'gz', + DIST_DEFAULT => 'all tardist', + }, + MAN3PODS => {}, + PREREQ_PM => { + 'Encode' => "1.41", + }, + # OS 390 winges about line numbers > 64K ??? + XSOPT => '-nolinenumbers', + ); + +package MY; + +sub post_initialize +{ + my ($self) = @_; + my %o; + my $x = $self->{'OBJ_EXT'}; + # Add the table O_FILES + foreach my $e (keys %tables) + { + $o{$e.$x} = 1; + } + $o{"$name$x"} = 1; + $self->{'O_FILES'} = [sort keys %o]; + my @files = ("$name.xs"); + $self->{'C'} = ["$name.c"]; + # The next two lines to make MacPerl Happy -- dankogai via pudge + $self->{SOURCE} .= " $name.c" + if $^O eq 'MacOS' && $self->{SOURCE} !~ /\b$name\.c\b/; + # $self->{'H'} = [$self->catfile($self->updir,'encode.h')]; + my %xs; + foreach my $table (keys %tables) { + push (@{$self->{'C'}},"$table.c"); + # Do NOT add $table.h etc. to H_FILES unless we own up as to how they + # get built. + foreach my $ext (qw($(OBJ_EXT) .c .h .exh .fnm)) { + push (@files,$table.$ext); + } + } + $self->{'XS'} = { "$name.xs" => "$name.c" }; + $self->{'clean'}{'FILES'} .= join(' ',@files); + open(XS,">$name.xs") || die "Cannot open $name.xs:$!"; + print XS <<'END'; +#include <EXTERN.h> +#include <perl.h> +#include <XSUB.h> +#define U8 U8 +#include "encode.h" +END + foreach my $table (keys %tables) { + print XS qq[#include "${table}.h"\n]; + } + print XS <<"END"; + +static void +Encode_XSEncoding(pTHX_ encode_t *enc) +{ + dSP; + HV *stash = gv_stashpv("Encode::XS", TRUE); + SV *sv = sv_bless(newRV_noinc(newSViv(PTR2IV(enc))),stash); + int i = 0; + PUSHMARK(sp); + XPUSHs(sv); + while (enc->name[i]) + { + const char *name = enc->name[i++]; + XPUSHs(sv_2mortal(newSVpvn(name,strlen(name)))); + } + PUTBACK; + call_pv("Encode::define_encoding",G_DISCARD); + SvREFCNT_dec(sv); +} + +MODULE = Encode::$name PACKAGE = Encode::$name +PROTOTYPES: DISABLE +BOOT: +{ +END + foreach my $table (keys %tables) { + print XS qq[#include "${table}.exh"\n]; + } + print XS "}\n"; + close(XS); + return "# Built $name.xs\n\n"; +} + +sub postamble +{ + my $self = shift; + my $dir = "."; # $self->catdir('Encode'); + my $str = "# $name\$(OBJ_EXT) depends on .h and .exh files not .c files - but all written by enc2xs\n"; + $str .= "$name.c : $name.xs "; + foreach my $table (keys %tables) + { + $str .= " $table.c"; + } + $str .= "\n\n"; + $str .= "$name\$(OBJ_EXT) : $name.c\n\n"; + + foreach my $table (keys %tables) + { + my $numlines = 1; + my $lengthsofar = length($str); + my $continuator = ''; + $str .= "$table.c : Makefile.PL"; + foreach my $file (@{$tables{$table}}) + { + $str .= $continuator.' '.$self->catfile($dir,$file); + if ( length($str)-$lengthsofar > 128*$numlines ) + { + $continuator .= " \\\n\t"; + $numlines++; + } else { + $continuator = ''; + } + } + my $plib = $self->{PERL_CORE} ? '"-I$(PERL_LIB)"' : ''; + my $ucopts = '-"Q"'; + $str .= + qq{\n\t\$(PERL) $plib $enc2xs $ucopts -o \$\@ -f $table.fnm\n\n}; + open (FILELIST, ">$table.fnm") + || die "Could not open $table.fnm: $!"; + foreach my $file (@{$tables{$table}}) + { + print FILELIST $self->catfile($dir,$file) . "\n"; + } + close(FILELIST); + } + return $str; +} + diff --git a/Master/tlpkg/tlperl.old/lib/Encode/PerlIO.pod b/Master/tlpkg/tlperl.old/lib/Encode/PerlIO.pod new file mode 100644 index 00000000000..abd1f2d10a1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/PerlIO.pod @@ -0,0 +1,167 @@ +=head1 NAME + +Encode::PerlIO -- a detailed document on Encode and PerlIO + +=head1 Overview + +It is very common to want to do encoding transformations when +reading or writing files, network connections, pipes etc. +If Perl is configured to use the new 'perlio' IO system then +C<Encode> provides a "layer" (see L<PerlIO>) which can transform +data as it is read or written. + +Here is how the blind poet would modernise the encoding: + + use Encode; + open(my $iliad,'<:encoding(iso-8859-7)','iliad.greek'); + open(my $utf8,'>:utf8','iliad.utf8'); + my @epic = <$iliad>; + print $utf8 @epic; + close($utf8); + close($illiad); + +In addition, the new IO system can also be configured to read/write +UTF-8 encoded characters (as noted above, this is efficient): + + open(my $fh,'>:utf8','anything'); + print $fh "Any \x{0021} string \N{SMILEY FACE}\n"; + +Either of the above forms of "layer" specifications can be made the default +for a lexical scope with the C<use open ...> pragma. See L<open>. + +Once a handle is open, its layers can be altered using C<binmode>. + +Without any such configuration, or if Perl itself is built using the +system's own IO, then write operations assume that the file handle +accepts only I<bytes> and will C<die> if a character larger than 255 is +written to the handle. When reading, each octet from the handle becomes +a byte-in-a-character. Note that this default is the same behaviour +as bytes-only languages (including Perl before v5.6) would have, +and is sufficient to handle native 8-bit encodings e.g. iso-8859-1, +EBCDIC etc. and any legacy mechanisms for handling other encodings +and binary data. + +In other cases, it is the program's responsibility to transform +characters into bytes using the API above before doing writes, and to +transform the bytes read from a handle into characters before doing +"character operations" (e.g. C<lc>, C</\W+/>, ...). + +You can also use PerlIO to convert larger amounts of data you don't +want to bring into memory. For example, to convert between ISO-8859-1 +(Latin 1) and UTF-8 (or UTF-EBCDIC in EBCDIC machines): + + open(F, "<:encoding(iso-8859-1)", "data.txt") or die $!; + open(G, ">:utf8", "data.utf") or die $!; + while (<F>) { print G } + + # Could also do "print G <F>" but that would pull + # the whole file into memory just to write it out again. + +More examples: + + open(my $f, "<:encoding(cp1252)") + open(my $g, ">:encoding(iso-8859-2)") + open(my $h, ">:encoding(latin9)") # iso-8859-15 + +See also L<encoding> for how to change the default encoding of the +data in your script. + +=head1 How does it work? + +Here is a crude diagram of how filehandle, PerlIO, and Encode +interact. + + filehandle <-> PerlIO PerlIO <-> scalar (read/printed) + \ / + Encode + +When PerlIO receives data from either direction, it fills a buffer +(currently with 1024 bytes) and passes the buffer to Encode. +Encode tries to convert the valid part and passes it back to PerlIO, +leaving invalid parts (usually a partial character) in the buffer. +PerlIO then appends more data to the buffer, calls Encode again, +and so on until the data stream ends. + +To do so, PerlIO always calls (de|en)code methods with CHECK set to 1. +This ensures that the method stops at the right place when it +encounters partial character. The following is what happens when +PerlIO and Encode tries to encode (from utf8) more than 1024 bytes +and the buffer boundary happens to be in the middle of a character. + + A B C .... ~ \x{3000} .... + 41 42 43 .... 7E e3 80 80 .... + <- buffer ---------------> + << encoded >>>>>>>>>> + <- next buffer ------ + +Encode converts from the beginning to \x7E, leaving \xe3 in the buffer +because it is invalid (partial character). + +Unfortunately, this scheme does not work well with escape-based +encodings such as ISO-2022-JP. + +=head1 Line Buffering + +Now let's see what happens when you try to decode from ISO-2022-JP and +the buffer ends in the middle of a character. + + JIS208-ESC \x{5f3e} + A B C .... ~ \e $ B |DAN | .... + 41 42 43 .... 7E 1b 24 41 43 46 .... + <- buffer ---------------------------> + << encoded >>>>>>>>>>>>>>>>>>>>>>> + +As you see, the next buffer begins with \x43. But \x43 is 'C' in +ASCII, which is wrong in this case because we are now in JISX 0208 +area so it has to convert \x43\x46, not \x43. Unlike utf8 and EUC, +in escape-based encodings you can't tell if a given octet is a whole +character or just part of it. + +Fortunately PerlIO also supports line buffer if you tell PerlIO to use +one instead of fixed buffer. Since ISO-2022-JP is guaranteed to revert to ASCII at the end of the line, partial +character will never happen when line buffer is used. + +To tell PerlIO to use line buffer, implement -E<gt>needs_lines method +for your encoding object. See L<Encode::Encoding> for details. + +Thanks to these efforts most encodings that come with Encode support +PerlIO but that still leaves following encodings. + + iso-2022-kr + MIME-B + MIME-Header + MIME-Q + +Fortunately iso-2022-kr is hardly used (according to Jungshik) and +MIME-* are very unlikely to be fed to PerlIO because they are for mail +headers. See L<Encode::MIME::Header> for details. + +=head2 How can I tell whether my encoding fully supports PerlIO ? + +As of this writing, any encoding whose class belongs to Encode::XS and +Encode::Unicode works. The Encode module has a C<perlio_ok> method +which you can use before applying PerlIO encoding to the filehandle. +Here is an example: + + my $use_perlio = perlio_ok($enc); + my $layer = $use_perlio ? "<:raw" : "<:encoding($enc)"; + open my $fh, $layer, $file or die "$file : $!"; + while(<$fh>){ + $_ = decode($enc, $_) unless $use_perlio; + # .... + } + +=head1 SEE ALSO + +L<Encode::Encoding>, +L<Encode::Supported>, +L<Encode::PerlIO>, +L<encoding>, +L<perlebcdic>, +L<perlfunc/open>, +L<perlunicode>, +L<utf8>, +the Perl Unicode Mailing List E<lt>perl-unicode@perl.orgE<gt> + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Encode/README.e2x b/Master/tlpkg/tlperl.old/lib/Encode/README.e2x new file mode 100644 index 00000000000..28a31a655c2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/README.e2x @@ -0,0 +1,31 @@ +Encode::$_Name_ version 0.1 +======== + +NAME + Encode::$_Name_ - <describe encoding> + +SYNOPSIS + use Encode::$_Name_; + #<put more words here> +ABSTRACT + <fill this in> +INSTALLATION + +To install this module type the following: + + perl Makefile.PL + make + make test + make install + +DEPENDENCIES + +This module requires perl version 5.7.3 or later. + +COPYRIGHT AND LICENCE + +Copyright (C) 2002 Your Name <your@address.domain> + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + diff --git a/Master/tlpkg/tlperl.old/lib/Encode/Supported.pod b/Master/tlpkg/tlperl.old/lib/Encode/Supported.pod new file mode 100644 index 00000000000..651f7e6ed4f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/Supported.pod @@ -0,0 +1,890 @@ +=head1 NAME + +Encode::Supported -- Encodings supported by Encode + +=head1 DESCRIPTION + +=head2 Encoding Names + +Encoding names are case insensitive. White space in names +is ignored. In addition, an encoding may have aliases. +Each encoding has one "canonical" name. The "canonical" +name is chosen from the names of the encoding by picking +the first in the following sequence (with a few exceptions). + +=over 4 + +=item * + +The name used by the Perl community. That includes 'utf8' and 'ascii'. +Unlike aliases, canonical names directly reach the method so such +frequently used words like 'utf8' don't need to do alias lookups. + +=item * + +The MIME name as defined in IETF RFCs. This includes all "iso-"s. + +=item * + +The name in the IANA registry. + +=item * + +The name used by the organization that defined it. + +=back + +In case I<de jure> canonical names differ from that of the Encode +module, they are always aliased if it ever be implemented. So you can +safely tell if a given encoding is implemented or not just by passing +the canonical name. + +Because of all the alias issues, and because in the general case +encodings have state, "Encode" uses an encoding object internally +once an operation is in progress. + +=head1 Supported Encodings + +As of Perl 5.8.0, at least the following encodings are recognized. +Note that unless otherwise specified, they are all case insensitive +(via alias) and all occurrence of spaces are replaced with '-'. +In other words, "ISO 8859 1" and "iso-8859-1" are identical. + +Encodings are categorized and implemented in several different modules +but you don't have to C<use Encode::XX> to make them available for +most cases. Encode.pm will automatically load those modules on demand. + +=head2 Built-in Encodings + +The following encodings are always available. + + Canonical Aliases Comments & References + ---------------------------------------------------------------- + ascii US-ascii ISO-646-US [ECMA] + ascii-ctrl Special Encoding + iso-8859-1 latin1 [ISO] + null Special Encoding + utf8 UTF-8 [RFC2279] + ---------------------------------------------------------------- + +I<null> and I<ascii-ctrl> are special. "null" fails for all character +so when you set fallback mode to PERLQQ, HTMLCREF or XMLCREF, ALL +CHARACTERS will fall back to character references. Ditto for +"ascii-ctrl" except for control characters. For fallback modes, see +L<Encode>. + +=head2 Encode::Unicode -- other Unicode encodings + +Unicode coding schemes other than native utf8 are supported by +Encode::Unicode, which will be autoloaded on demand. + + ---------------------------------------------------------------- + UCS-2BE UCS-2, iso-10646-1 [IANA, UC] + UCS-2LE [UC] + UTF-16 [UC] + UTF-16BE [UC] + UTF-16LE [UC] + UTF-32 [UC] + UTF-32BE UCS-4 [UC] + UTF-32LE [UC] + UTF-7 [RFC2152] + ---------------------------------------------------------------- + +To find how (UCS-2|UTF-(16|32))(LE|BE)? differ from one another, +see L<Encode::Unicode>. + +UTF-7 is a special encoding which "re-encodes" UTF-16BE into a 7-bit +encoding. It is implemented seperately by Encode::Unicode::UTF7. + +=head2 Encode::Byte -- Extended ASCII + +Encode::Byte implements most single-byte encodings except for +Symbols and EBCDIC. The following encodings are based on single-byte +encodings implemented as extended ASCII. Most of them map +\x80-\xff (upper half) to non-ASCII characters. + +=over 4 + +=item ISO-8859 and corresponding vendor mappings + +Since there are so many, they are presented in table format with +languages and corresponding encoding names by vendors. Note that +the table is sorted in order of ISO-8859 and the corresponding vendor +mappings are slightly different from that of ISO. See +L<http://czyborra.com/charsets/iso8859.html> for details. + + Lang/Regions ISO/Other Std. DOS Windows Macintosh Others + ---------------------------------------------------------------- + N. America (ASCII) cp437 AdobeStandardEncoding + cp863 (DOSCanadaF) + W. Europe iso-8859-1 cp850 cp1252 MacRoman nextstep + hp-roman8 + cp860 (DOSPortuguese) + Cntrl. Europe iso-8859-2 cp852 cp1250 MacCentralEurRoman + MacCroatian + MacRomanian + MacRumanian + Latin3[1] iso-8859-3 + Latin4[2] iso-8859-4 + Cyrillics iso-8859-5 cp855 cp1251 MacCyrillic + (See also next section) cp866 MacUkrainian + Arabic iso-8859-6 cp864 cp1256 MacArabic + cp1006 MacFarsi + Greek iso-8859-7 cp737 cp1253 MacGreek + cp869 (DOSGreek2) + Hebrew iso-8859-8 cp862 cp1255 MacHebrew + Turkish iso-8859-9 cp857 cp1254 MacTurkish + Nordics iso-8859-10 cp865 + cp861 MacIcelandic + MacSami + Thai iso-8859-11[3] cp874 MacThai + (iso-8859-12 is nonexistent. Reserved for Indics?) + Baltics iso-8859-13 cp775 cp1257 + Celtics iso-8859-14 + Latin9 [4] iso-8859-15 + Latin10 iso-8859-16 + Vietnamese viscii cp1258 MacVietnamese + ---------------------------------------------------------------- + + [1] Esperanto, Maltese, and Turkish. Turkish is now on 8859-9. + [2] Baltics. Now on 8859-10, except for Latvian. + [3] TIS 620 + Non-Breaking Space (0xA0 / U+00A0) + [4] Nicknamed Latin0; the Euro sign as well as French and Finnish + letters that are missing from 8859-1 were added. + +All cp* are also available as ibm-*, ms-*, and windows-* . See also +L<http://czyborra.com/charsets/codepages.html>. + +Macintosh encodings don't seem to be registered in such entities as +IANA. "Canonical" names in Encode are based upon Apple's Tech Note +1150. See L<http://developer.apple.com/technotes/tn/tn1150.html> +for details. + +=item KOI8 - De Facto Standard for the Cyrillic world + +Though ISO-8859 does have ISO-8859-5, the KOI8 series is far more +popular in the Net. L<Encode> comes with the following KOI charsets. +For gory details, see L<http://czyborra.com/charsets/cyrillic.html> + + ---------------------------------------------------------------- + koi8-f + koi8-r cp878 [RFC1489] + koi8-u [RFC2319] + ---------------------------------------------------------------- + +=item gsm0338 - Hentai Latin 1 + +GSM0338 is for GSM handsets. Though it shares alphanumerals with +ASCII, control character ranges and other parts are mapped very +differently, mainly to store Greek characters. There are also escape +sequences (starting with 0x1B) to cover e.g. the Euro sign. Some +special cases like a trailing 0x00 byte or a lone 0x1B byte are not +well-defined and decode() will return an empty string for them. +One possible workaround is + + $gsm =~ s/\x00\z/\x00\x00/; + $uni = decode("gsm0338", $gsm); + $uni .= "\xA0" if $gsm =~ /\x1B\z/; + +Note that the Encode implementation of GSM0338 does not implement the +reuse of Latin capital letters as Greek capital letters (for example, +the 0x5A is U+005A (LATIN CAPITAL LETTER Z), not U+0396 (GREEK CAPITAL +LETTER ZETA). + +The GSM0338 is also covered in Encode::Byte even though it is not +an "extended ASCII" encoding. + +=back + +=head2 CJK: Chinese, Japanese, Korean (Multibyte) + +Note that Vietnamese is listed above. Also read "Encoding vs Charset" +below. Also note that these are implemented in distinct modules by +countries, due to the size concerns (simplified Chinese is mapped +to 'CN', continental China, while traditional Chinese is mapped to +'TW', Taiwan). Please refer to their respective documentation pages. + +=over 4 + +=item Encode::CN -- Continental China + + Standard DOS/Win Macintosh Comment/Reference + ---------------------------------------------------------------- + euc-cn [1] MacChineseSimp + (gbk) cp936 [2] + gb12345-raw { GB12345 without CES } + gb2312-raw { GB2312 without CES } + hz + iso-ir-165 + ---------------------------------------------------------------- + + [1] GB2312 is aliased to this. See L<Microsoft-related naming mess> + [2] gbk is aliased to this. See L<Microsoft-related naming mess> + +=item Encode::JP -- Japan + + Standard DOS/Win Macintosh Comment/Reference + ---------------------------------------------------------------- + euc-jp + shiftjis cp932 macJapanese + 7bit-jis + iso-2022-jp [RFC1468] + iso-2022-jp-1 [RFC2237] + jis0201-raw { JIS X 0201 (roman + halfwidth kana) without CES } + jis0208-raw { JIS X 0208 (Kanji + fullwidth kana) without CES } + jis0212-raw { JIS X 0212 (Extended Kanji) without CES } + ---------------------------------------------------------------- + +=item Encode::KR -- Korea + + Standard DOS/Win Macintosh Comment/Reference + ---------------------------------------------------------------- + euc-kr MacKorean [RFC1557] + cp949 [1] + iso-2022-kr [RFC1557] + johab [KS X 1001:1998, Annex 3] + ksc5601-raw { KSC5601 without CES } + ---------------------------------------------------------------- + + [1] ks_c_5601-1987, (x-)?windows-949, and uhc are aliased to this. + See below. + +=item Encode::TW -- Taiwan + + Standard DOS/Win Macintosh Comment/Reference + ---------------------------------------------------------------- + big5-eten cp950 MacChineseTrad {big5 aliased to big5-eten} + big5-hkscs + ---------------------------------------------------------------- + +=item Encode::HanExtra -- More Chinese via CPAN + +Due to the size concerns, additional Chinese encodings below are +distributed separately on CPAN, under the name Encode::HanExtra. + + Standard DOS/Win Macintosh Comment/Reference + ---------------------------------------------------------------- + big5ext CMEX's Big5e Extension + big5plus CMEX's Big5+ Extension + cccii Chinese Character Code for Information Interchange + euc-tw EUC (Extended Unix Character) + gb18030 GBK with Traditional Characters + ---------------------------------------------------------------- + +=item Encode::JIS2K -- JIS X 0213 encodings via CPAN + +Due to size concerns, additional Japanese encodings below are +distributed separately on CPAN, under the name Encode::JIS2K. + + Standard DOS/Win Macintosh Comment/Reference + ---------------------------------------------------------------- + euc-jisx0213 + shiftjisx0123 + iso-2022-jp-3 + jis0213-1-raw + jis0213-2-raw + ---------------------------------------------------------------- + +=back + +=head2 Miscellaneous encodings + +=over 4 + +=item Encode::EBCDIC + +See L<perlebcdic> for details. + + ---------------------------------------------------------------- + cp37 + cp500 + cp875 + cp1026 + cp1047 + posix-bc + ---------------------------------------------------------------- + +=item Encode::Symbols + +For symbols and dingbats. + + ---------------------------------------------------------------- + symbol + dingbats + MacDingbats + AdobeZdingbat + AdobeSymbol + ---------------------------------------------------------------- + +=item Encode::MIME::Header + +Strictly speaking, MIME header encoding documented in RFC 2047 is more +of encapsulation than encoding. However, their support in modern +world is imperative so they are supported. + + ---------------------------------------------------------------- + MIME-Header [RFC2047] + MIME-B [RFC2047] + MIME-Q [RFC2047] + ---------------------------------------------------------------- + +=item Encode::Guess + +This one is not a name of encoding but a utility that lets you pick up +the most appropriate encoding for a data out of given I<suspects>. See +L<Encode::Guess> for details. + +=back + +=head1 Unsupported encodings + +The following encodings are not supported as yet; some because they +are rarely used, some because of technical difficulties. They may +be supported by external modules via CPAN in the future, however. + +=over 4 + +=item ISO-2022-JP-2 [RFC1554] + +Not very popular yet. Needs Unicode Database or equivalent to +implement encode() (because it includes JIS X 0208/0212, KSC5601, and +GB2312 simultaneously, whose code points in Unicode overlap. So you +need to lookup the database to determine to what character set a given +Unicode character should belong). + +=item ISO-2022-CN [RFC1922] + +Not very popular. Needs CNS 11643-1 and -2 which are not available in +this module. CNS 11643 is supported (via euc-tw) in Encode::HanExtra. +Autrijus Tang may add support for this encoding in his module in future. + +=item Various HP-UX encodings + +The following are unsupported due to the lack of mapping data. + + '8' - arabic8, greek8, hebrew8, kana8, thai8, and turkish8 + '15' - japanese15, korean15, and roi15 + +=item Cyrillic encoding ISO-IR-111 + +Anton Tagunov doubts its usefulness. + +=item ISO-8859-8-1 [Hebrew] + +None of the Encode team knows Hebrew enough (ISO-8859-8, cp1255 and +MacHebrew are supported because and just because there were mappings +available at L<http://www.unicode.org/>). Contributions welcome. + +=item ISIRI 3342, Iran System, ISIRI 2900 [Farsi] + +Ditto. + +=item Thai encoding TCVN + +Ditto. + +=item Vietnamese encodings VPS + +Though Jungshik Shin has reported that Mozilla supports this encoding, +it was too late before 5.8.0 for us to add it. In the future, it +may be available via a separate module. See +L<http://lxr.mozilla.org/seamonkey/source/intl/uconv/ucvlatin/vps.uf> +and +L<http://lxr.mozilla.org/seamonkey/source/intl/uconv/ucvlatin/vps.ut> +if you are interested in helping us. + +=item Various Mac encodings + +The following are unsupported due to the lack of mapping data. + + MacArmenian, MacBengali, MacBurmese, MacEthiopic + MacExtArabic, MacGeorgian, MacKannada, MacKhmer + MacLaotian, MacMalayalam, MacMongolian, MacOriya + MacSinhalese, MacTamil, MacTelugu, MacTibetan + MacVietnamese + +The rest which are already available are based upon the vendor mappings +at L<http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/> . + +=item (Mac) Indic encodings + +The maps for the following are available at L<http://www.unicode.org/> +but remain unsupport because those encodings need algorithmical +approach, currently unsupported by F<enc2xs>: + + MacDevanagari + MacGurmukhi + MacGujarati + +For details, please see C<Unicode mapping issues and notes:> at +L<http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/DEVANAGA.TXT> . + +I believe this issue is prevalent not only for Mac Indics but also in +other Indic encodings, but the above were the only Indic encodings +maps that I could find at L<http://www.unicode.org/> . + +=back + +=head1 Encoding vs. Charset -- terminology + +We are used to using the term (character) I<encoding> and I<character +set> interchangeably. But just as confusing the terms byte and +character is dangerous and the terms should be differentiated when +needed, we need to differentiate I<encoding> and I<character set>. + +To understand that, here is a description of how we make computers +grok our characters. + +=over 4 + +=item * + +First we start with which characters to include. We call this +collection of characters I<character repertoire>. + +=item * + +Then we have to give each character a unique ID so your computer can +tell the difference between 'a' and 'A'. This itemized character +repertoire is now a I<character set>. + +=item * + +If your computer can grow the character set without further +processing, you can go ahead and use it. This is called a I<coded +character set> (CCS) or I<raw character encoding>. ASCII is used this +way for most cases. + +=item * + +But in many cases, especially multi-byte CJK encodings, you have to +tweak a little more. Your network connection may not accept any data +with the Most Significant Bit set, and your computer may not be able to +tell if a given byte is a whole character or just half of it. So you +have to I<encode> the character set to use it. + +A I<character encoding scheme> (CES) determines how to encode a given +character set, or a set of multiple character sets. 7bit ISO-2022 is +an example of a CES. You switch between character sets via I<escape +sequences>. + +=back + +Technically, or mathematically, speaking, a character set encoded in +such a CES that maps character by character may form a CCS. EUC is such +an example. The CES of EUC is as follows: + +=over 4 + +=item * + +Map ASCII unchanged. + +=item * + +Map such a character set that consists of 94 or 96 powered by N +members by adding 0x80 to each byte. + +=item * + +You can also use 0x8e and 0x8f to indicate that the following sequence of +characters belongs to yet another character set. To each following byte +is added the value 0x80. + +=back + +By carefully looking at the encoded byte sequence, you can find that the +byte sequence conforms a unique number. In that sense, EUC is a CCS +generated by a CES above from up to four CCS (complicated?). UTF-8 +falls into this category. See L<perlUnicode/"UTF-8"> to find out how +UTF-8 maps Unicode to a byte sequence. + +You may also have found out by now why 7bit ISO-2022 cannot comprise +a CCS. If you look at a byte sequence \x21\x21, you can't tell if +it is two !'s or IDEOGRAPHIC SPACE. EUC maps the latter to \xA1\xA1 +so you have no trouble differentiating between "!!". and S<" ">. + +=head1 Encoding Classification (by Anton Tagunov and Dan Kogai) + +This section tries to classify the supported encodings by their +applicability for information exchange over the Internet and to +choose the most suitable aliases to name them in the context of +such communication. + +=over 4 + +=item * + +To (en|de)code encodings marked by C<(**)>, you need +C<Encode::HanExtra>, available from CPAN. + +=back + +Encoding names + + US-ASCII UTF-8 ISO-8859-* KOI8-R + Shift_JIS EUC-JP ISO-2022-JP ISO-2022-JP-1 + EUC-KR Big5 GB2312 + +are registered with IANA as preferred MIME names and may +be used over the Internet. + +C<Shift_JIS> has been officialized by JIS X 0208:1997. +L<Microsoft-related naming mess> gives details. + +C<GB2312> is the IANA name for C<EUC-CN>. +See L<Microsoft-related naming mess> for details. + +C<GB_2312-80> I<raw> encoding is available as C<gb2312-raw> +with Encode. See L<Encode::CN> for details. + + EUC-CN + KOI8-U [RFC2319] + +have not been registered with IANA (as of March 2002) but +seem to be supported by major web browsers. +The IANA name for C<EUC-CN> is C<GB2312>. + + KS_C_5601-1987 + +is heavily misused. +See L<Microsoft-related naming mess> for details. + +C<KS_C_5601-1987> I<raw> encoding is available as C<kcs5601-raw> +with Encode. See L<Encode::KR> for details. + + UTF-16 UTF-16BE UTF-16LE + +are IANA-registered C<charset>s. See [RFC 2781] for details. +Jungshik Shin reports that UTF-16 with a BOM is well accepted +by MS IE 5/6 and NS 4/6. Beware however that + +=over 4 + +=item * + +C<UTF-16> support in any software you're going to be +using/interoperating with has probably been less tested +then C<UTF-8> support + +=item * + +C<UTF-8> coded data seamlessly passes traditional +command piping (C<cat>, C<more>, etc.) while C<UTF-16> coded +data is likely to cause confusion (with its zero bytes, +for example) + +=item * + +it is beyond the power of words to describe the way HTML browsers +encode non-C<ASCII> form data. To get a general impression, visit +L<http://ppewww.ph.gla.ac.uk/~flavell/charset/form-i18n.html>. +While encoding of form data has stabilized for C<UTF-8> encoded pages +(at least IE 5/6, NS 6, and Opera 6 behave consistently), be sure to +expect fun (and cross-browser discrepancies) with C<UTF-16> encoded +pages! + +=back + +The rule of thumb is to use C<UTF-8> unless you know what +you're doing and unless you really benefit from using C<UTF-16>. + + ISO-IR-165 [RFC1345] + VISCII + GB 12345 + GB 18030 (**) (see links bellow) + EUC-TW (**) + +are totally valid encodings but not registered at IANA. +The names under which they are listed here are probably the +most widely-known names for these encodings and are recommended +names. + + BIG5PLUS (**) + +is a proprietary name. + +=head2 Microsoft-related naming mess + +Microsoft products misuse the following names: + +=over 4 + +=item KS_C_5601-1987 + +Microsoft extension to C<EUC-KR>. + +Proper names: C<CP949>, C<UHC>, C<x-windows-949> (as used by Mozilla). + +See L<http://lists.w3.org/Archives/Public/ietf-charsets/2001AprJun/0033.html> +for details. + +Encode aliases C<KS_C_5601-1987> to C<cp949> to reflect this common +misusage. I<Raw> C<KS_C_5601-1987> encoding is available as +C<kcs5601-raw>. + +See L<Encode::KR> for details. + +=item GB2312 + +Microsoft extension to C<EUC-CN>. + +Proper names: C<CP936>, C<GBK>. + +C<GB2312> has been registered in the C<EUC-CN> meaning at +IANA. This has partially repaired the situation: Microsoft's +C<GB2312> has become a superset of the official C<GB2312>. + +Encode aliases C<GB2312> to C<euc-cn> in full agreement with +IANA registration. C<cp936> is supported separately. +I<Raw> C<GB_2312-80> encoding is available as C<gb2312-raw>. + +See L<Encode::CN> for details. + +=item Big5 + +Microsoft extension to C<Big5>. + +Proper name: C<CP950>. + +Encode separately supports C<Big5> and C<cp950>. + +=item Shift_JIS + +Microsoft's understanding of C<Shift_JIS>. + +JIS has not endorsed the full Microsoft standard however. +The official C<Shift_JIS> includes only JIS X 0201 and JIS X 0208 +character sets, while Microsoft has always used C<Shift_JIS> +to encode a wider character repertoire. See C<IANA> registration for +C<Windows-31J>. + +As a historical predecessor, Microsoft's variant +probably has more rights for the name, though it may be objected +that Microsoft shouldn't have used JIS as part of the name +in the first place. + +Unambiguous name: C<CP932>. C<IANA> name (also used by Mozilla, and +provided as an alias by Encode): C<Windows-31J>. + +Encode separately supports C<Shift_JIS> and C<cp932>. + +=back + +=head1 Glossary + +=over 4 + +=item character repertoire + +A collection of unique characters. A I<character> set in the strictest +sense. At this stage, characters are not numbered. + +=item coded character set (CCS) + +A character set that is mapped in a way computers can use directly. +Many character encodings, including EUC, fall in this category. + +=item character encoding scheme (CES) + +An algorithm to map a character set to a byte sequence. You don't +have to be able to tell which character set a given byte sequence +belongs. 7-bit ISO-2022 is a CES but it cannot be a CCS. EUC is an +example of being both a CCS and CES. + +=item charset (in MIME context) + +has long been used in the meaning of C<encoding>, CES. + +While the word combination C<character set> has lost this meaning +in MIME context since [RFC 2130], the C<charset> abbreviation has +retained it. This is how [RFC 2277] and [RFC 2278] bless C<charset>: + + This document uses the term "charset" to mean a set of rules for + mapping from a sequence of octets to a sequence of characters, such + as the combination of a coded character set and a character encoding + scheme; this is also what is used as an identifier in MIME "charset=" + parameters, and registered in the IANA charset registry ... (Note + that this is NOT a term used by other standards bodies, such as ISO). + [RFC 2277] + +=item EUC + +Extended Unix Character. See ISO-2022. + +=item ISO-2022 + +A CES that was carefully designed to coexist with ASCII. There are a 7 +bit version and an 8 bit version. + +The 7 bit version switches character set via escape sequence so it +cannot form a CCS. Since this is more difficult to handle in programs +than the 8 bit version, the 7 bit version is not very popular except for +iso-2022-jp, the I<de facto> standard CES for e-mails. + +The 8 bit version can form a CCS. EUC and ISO-8859 are two examples +thereof. Pre-5.6 perl could use them as string literals. + +=item UCS + +Short for I<Universal Character Set>. When you say just UCS, it means +I<Unicode>. + +=item UCS-2 + +ISO/IEC 10646 encoding form: Universal Character Set coded in two +octets. + +=item Unicode + +A character set that aims to include all character repertoires of the +world. Many character sets in various national as well as industrial +standards have become, in a way, just subsets of Unicode. + +=item UTF + +Short for I<Unicode Transformation Format>. Determines how to map a +Unicode character into a byte sequence. + +=item UTF-16 + +A UTF in 16-bit encoding. Can either be in big endian or little +endian. The big endian version is called UTF-16BE (equal to UCS-2 + +surrogate support) and the little endian version is called UTF-16LE. + +=back + +=head1 See Also + +L<Encode>, +L<Encode::Byte>, +L<Encode::CN>, L<Encode::JP>, L<Encode::KR>, L<Encode::TW>, +L<Encode::EBCDIC>, L<Encode::Symbol> +L<Encode::MIME::Header>, L<Encode::Guess> + +=head1 References + +=over 4 + +=item ECMA + +European Computer Manufacturers Association +L<http://www.ecma.ch> + +=over 4 + +=item ECMA-035 (eq C<ISO-2022>) + +L<http://www.ecma.ch/ecma1/STAND/ECMA-035.HTM> + +The specification of ISO-2022 is available from the link above. + +=back + +=item IANA + +Internet Assigned Numbers Authority +L<http://www.iana.org/> + +=over 4 + +=item Assigned Charset Names by IANA + +L<http://www.iana.org/assignments/character-sets> + +Most of the C<canonical names> in Encode derive from this list +so you can directly apply the string you have extracted from MIME +header of mails and web pages. + +=back + +=item ISO + +International Organization for Standardization +L<http://www.iso.ch/> + +=item RFC + +Request For Comments -- need I say more? +L<http://www.rfc-editor.org/>, L<http://www.rfc.net/>, +L<http://www.faqs.org/rfcs/> + +=item UC + +Unicode Consortium +L<http://www.unicode.org/> + +=over 4 + +=item Unicode Glossary + +L<http://www.unicode.org/glossary/> + +The glossary of this document is based upon this site. + +=back + +=back + +=head2 Other Notable Sites + +=over 4 + +=item czyborra.com + +L<http://czyborra.com/> + +Contains a lot of useful information, especially gory details of ISO +vs. vendor mappings. + +=item CJK.inf + +L<http://www.oreilly.com/people/authors/lunde/cjk_inf.html> + +Somewhat obsolete (last update in 1996), but still useful. Also try + +L<ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/pdf/GB18030_Summary.pdf> + +You will find brief info on C<EUC-CN>, C<GBK> and mostly on C<GB 18030>. + +=item Jungshik Shin's Hangul FAQ + +L<http://jshin.net/faq> + +And especially its subject 8. + +L<http://jshin.net/faq/qa8.html> + +A comprehensive overview of the Korean (C<KS *>) standards. + +=item debian.org: "Introduction to i18n" + +A brief description for most of the mentioned CJK encodings is +contained in +L<http://www.debian.org/doc/manuals/intro-i18n/ch-codes.en.html> + +=back + +=head2 Offline sources + +=over 4 + +=item C<CJKV Information Processing> by Ken Lunde + +CJKV Information Processing +1999 O'Reilly & Associates, ISBN : 1-56592-224-7 + +The modern successor of C<CJK.inf>. + +Features a comprehensive coverage of CJKV character sets and +encodings along with many other issues faced by anyone trying +to better support CJKV languages/scripts in all the areas of +information processing. + +To purchase this book, visit +L<http://www.oreilly.com/catalog/cjkvinfo/> +or your favourite bookstore. + +=back + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/Symbol.pm b/Master/tlpkg/tlperl.old/lib/Encode/Symbol.pm new file mode 100644 index 00000000000..7ad8ca92c7d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/Symbol.pm @@ -0,0 +1,42 @@ +package Encode::Symbol; +use Encode; +our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +use XSLoader; +XSLoader::load(__PACKAGE__,$VERSION); + +1; +__END__ + +=head1 NAME + +Encode::Symbol - Symbol Encodings + +=head1 SYNOPSIS + + use Encode qw/encode decode/; + $symbol = encode("symbol", $utf8); # loads Encode::Symbol implicitly + $utf8 = decode("", $symbol); # ditto + +=head1 ABSTRACT + +This module implements symbol and dingbats encodings. Encodings +supported are as follows. + + Canonical Alias Description + -------------------------------------------------------------------- + symbol + dingbats + AdobeZDingbat + AdobeSymbol + MacDingbats + +=head1 DESCRIPTION + +To find out how to use this module in detail, see L<Encode>. + +=head1 SEE ALSO + +L<Encode> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/TW.pm b/Master/tlpkg/tlperl.old/lib/Encode/TW.pm new file mode 100644 index 00000000000..2e1abc0c7f9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/TW.pm @@ -0,0 +1,78 @@ +package Encode::TW; +BEGIN { + if (ord("A") == 193) { + die "Encode::TW not supported on EBCDIC\n"; + } +} +our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +use Encode; +use XSLoader; +XSLoader::load(__PACKAGE__,$VERSION); + +1; +__END__ + +=head1 NAME + +Encode::TW - Taiwan-based Chinese Encodings + +=head1 SYNOPSIS + + use Encode qw/encode decode/; + $big5 = encode("big5", $utf8); # loads Encode::TW implicitly + $utf8 = decode("big5", $big5); # ditto + +=head1 DESCRIPTION + +This module implements tradition Chinese charset encodings as used +in Taiwan and Hong Kong. +Encodings supported are as follows. + + Canonical Alias Description + -------------------------------------------------------------------- + big5-eten /\bbig-?5$/i Big5 encoding (with ETen extensions) + /\bbig5-?et(en)?$/i + /\btca-?big5$/i + big5-hkscs /\bbig5-?hk(scs)?$/i + /\bhk(scs)?-?big5$/i + Big5 + Cantonese characters in Hong Kong + MacChineseTrad Big5 + Apple Vendor Mappings + cp950 Code Page 950 + = Big5 + Microsoft vendor mappings + -------------------------------------------------------------------- + +To find out how to use this module in detail, see L<Encode>. + +=head1 NOTES + +Due to size concerns, C<EUC-TW> (Extended Unix Character), C<CCCII> +(Chinese Character Code for Information Interchange), C<BIG5PLUS> +(CMEX's Big5+) and C<BIG5EXT> (CMEX's Big5e) are distributed separately +on CPAN, under the name L<Encode::HanExtra>. That module also contains +extra China-based encodings. + +=head1 BUGS + +Since the original C<big5> encoding (1984) is not supported anywhere +(glibc and DOS-based systems uses C<big5> to mean C<big5-eten>; Microsoft +uses C<big5> to mean C<cp950>), a conscious decision was made to alias +C<big5> to C<big5-eten>, which is the de facto superset of the original +big5. + +The C<CNS11643> encoding files are not complete. For common C<CNS11643> +manipulation, please use C<EUC-TW> in L<Encode::HanExtra>, which contains +planes 1-7. + +The ASCII region (0x00-0x7f) is preserved for all encodings, even +though this conflicts with mappings by the Unicode Consortium. See + +L<http://www.debian.or.jp/~kubota/unicode-symbols.html.en> + +to find out why it is implemented that way. + +=head1 SEE ALSO + +L<Encode> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/Unicode.pm b/Master/tlpkg/tlperl.old/lib/Encode/Unicode.pm new file mode 100644 index 00000000000..4d0c31d82d3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/Unicode.pm @@ -0,0 +1,268 @@ +package Encode::Unicode; + +use strict; +use warnings; +no warnings 'redefine'; + +our $VERSION = do { my @r = (q$Revision: 2.2 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + +use XSLoader; +XSLoader::load(__PACKAGE__,$VERSION); + +# +# Object Generator 8 transcoders all at once! +# + +require Encode; + +our %BOM_Unknown = map {$_ => 1} qw(UTF-16 UTF-32); + +for my $name (qw(UTF-16 UTF-16BE UTF-16LE + UTF-32 UTF-32BE UTF-32LE + UCS-2BE UCS-2LE)) +{ + my ($size, $endian, $ucs2, $mask); + $name =~ /^(\w+)-(\d+)(\w*)$/o; + if ($ucs2 = ($1 eq 'UCS')){ + $size = 2; + }else{ + $size = $2/8; + } + $endian = ($3 eq 'BE') ? 'n' : ($3 eq 'LE') ? 'v' : '' ; + $size == 4 and $endian = uc($endian); + + $Encode::Encoding{$name} = + bless { + Name => $name, + size => $size, + endian => $endian, + ucs2 => $ucs2, + } => __PACKAGE__; +} + +use base qw(Encode::Encoding); + +sub renew { + my $self = shift; + $BOM_Unknown{$self->name} or return $self; + my $clone = bless { %$self } => ref($self); + $clone->{renewed}++; # so the caller knows it is renewed. + return $clone; +} + +# There used to be a perl implemntation of (en|de)code but with +# XS version is ripe, perl version is zapped for optimal speed + +*decode = \&decode_xs; +*encode = \&encode_xs; + +1; +__END__ + +=head1 NAME + +Encode::Unicode -- Various Unicode Transformation Formats + +=cut + +=head1 SYNOPSIS + + use Encode qw/encode decode/; + $ucs2 = encode("UCS-2BE", $utf8); + $utf8 = decode("UCS-2BE", $ucs2); + +=head1 ABSTRACT + +This module implements all Character Encoding Schemes of Unicode that +are officially documented by Unicode Consortium (except, of course, +for UTF-8, which is a native format in perl). + +=over 4 + +=item L<http://www.unicode.org/glossary/> says: + +I<Character Encoding Scheme> A character encoding form plus byte +serialization. There are Seven character encoding schemes in Unicode: +UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32 (UCS-4), UTF-32BE (UCS-4BE) and +UTF-32LE (UCS-4LE), and UTF-7. + +Since UTF-7 is a 7-bit (re)encoded version of UTF-16BE, It is not part of +Unicode's Character Encoding Scheme. It is separately implemented in +Encode::Unicode::UTF7. For details see L<Encode::Unicode::UTF7>. + +=item Quick Reference + + Decodes from ord(N) Encodes chr(N) to... + octet/char BOM S.P d800-dfff ord > 0xffff \x{1abcd} == + ---------------+-----------------+------------------------------ + UCS-2BE 2 N N is bogus Not Available + UCS-2LE 2 N N bogus Not Available + UTF-16 2/4 Y Y is S.P S.P BE/LE + UTF-16BE 2/4 N Y S.P S.P 0xd82a,0xdfcd + UTF-16LE 2 N Y S.P S.P 0x2ad8,0xcddf + UTF-32 4 Y - is bogus As is BE/LE + UTF-32BE 4 N - bogus As is 0x0001abcd + UTF-32LE 4 N - bogus As is 0xcdab0100 + UTF-8 1-4 - - bogus >= 4 octets \xf0\x9a\af\8d + ---------------+-----------------+------------------------------ + +=back + +=head1 Size, Endianness, and BOM + +You can categorize these CES by 3 criteria: size of each character, +endianness, and Byte Order Mark. + +=head2 by size + +UCS-2 is a fixed-length encoding with each character taking 16 bits. +It B<does not> support I<surrogate pairs>. When a surrogate pair +is encountered during decode(), its place is filled with \x{FFFD} +if I<CHECK> is 0, or the routine croaks if I<CHECK> is 1. When a +character whose ord value is larger than 0xFFFF is encountered, +its place is filled with \x{FFFD} if I<CHECK> is 0, or the routine +croaks if I<CHECK> is 1. + +UTF-16 is almost the same as UCS-2 but it supports I<surrogate pairs>. +When it encounters a high surrogate (0xD800-0xDBFF), it fetches the +following low surrogate (0xDC00-0xDFFF) and C<desurrogate>s them to +form a character. Bogus surrogates result in death. When \x{10000} +or above is encountered during encode(), it C<ensurrogate>s them and +pushes the surrogate pair to the output stream. + +UTF-32 (UCS-4) is a fixed-length encoding with each character taking 32 bits. +Since it is 32-bit, there is no need for I<surrogate pairs>. + +=head2 by endianness + +The first (and now failed) goal of Unicode was to map all character +repertoires into a fixed-length integer so that programmers are happy. +Since each character is either a I<short> or I<long> in C, you have to +pay attention to the endianness of each platform when you pass data +to one another. + +Anything marked as BE is Big Endian (or network byte order) and LE is +Little Endian (aka VAX byte order). For anything not marked either +BE or LE, a character called Byte Order Mark (BOM) indicating the +endianness is prepended to the string. + +CAVEAT: Though BOM in utf8 (\xEF\xBB\xBF) is valid, it is meaningless +and as of this writing Encode suite just leave it as is (\x{FeFF}). + +=over 4 + +=item BOM as integer when fetched in network byte order + + 16 32 bits/char + ------------------------- + BE 0xFeFF 0x0000FeFF + LE 0xFFeF 0xFFFe0000 + ------------------------- + +=back + +This modules handles the BOM as follows. + +=over 4 + +=item * + +When BE or LE is explicitly stated as the name of encoding, BOM is +simply treated as a normal character (ZERO WIDTH NO-BREAK SPACE). + +=item * + +When BE or LE is omitted during decode(), it checks if BOM is at the +beginning of the string; if one is found, the endianness is set to +what the BOM says. If no BOM is found, the routine dies. + +=item * + +When BE or LE is omitted during encode(), it returns a BE-encoded +string with BOM prepended. So when you want to encode a whole text +file, make sure you encode() the whole text at once, not line by line +or each line, not file, will have a BOM prepended. + +=item * + +C<UCS-2> is an exception. Unlike others, this is an alias of UCS-2BE. +UCS-2 is already registered by IANA and others that way. + +=back + +=head1 Surrogate Pairs + +To say the least, surrogate pairs were the biggest mistake of the +Unicode Consortium. But according to the late Douglas Adams in I<The +Hitchhiker's Guide to the Galaxy> Trilogy, C<In the beginning the +Universe was created. This has made a lot of people very angry and +been widely regarded as a bad move>. Their mistake was not of this +magnitude so let's forgive them. + +(I don't dare make any comparison with Unicode Consortium and the +Vogons here ;) Or, comparing Encode to Babel Fish is completely +appropriate -- if you can only stick this into your ear :) + +Surrogate pairs were born when the Unicode Consortium finally +admitted that 16 bits were not big enough to hold all the world's +character repertoires. But they already made UCS-2 16-bit. What +do we do? + +Back then, the range 0xD800-0xDFFF was not allocated. Let's split +that range in half and use the first half to represent the C<upper +half of a character> and the second half to represent the C<lower +half of a character>. That way, you can represent 1024 * 1024 = +1048576 more characters. Now we can store character ranges up to +\x{10ffff} even with 16-bit encodings. This pair of half-character is +now called a I<surrogate pair> and UTF-16 is the name of the encoding +that embraces them. + +Here is a formula to ensurrogate a Unicode character \x{10000} and +above; + + $hi = ($uni - 0x10000) / 0x400 + 0xD800; + $lo = ($uni - 0x10000) % 0x400 + 0xDC00; + +And to desurrogate; + + $uni = 0x10000 + ($hi - 0xD800) * 0x400 + ($lo - 0xDC00); + +Note this move has made \x{D800}-\x{DFFF} into a forbidden zone but +perl does not prohibit the use of characters within this range. To perl, +every one of \x{0000_0000} up to \x{ffff_ffff} (*) is I<a character>. + + (*) or \x{ffff_ffff_ffff_ffff} if your perl is compiled with 64-bit + integer support! + +=head1 Error Checking + +Unlike most encodings which accept various ways to handle errors, +Unicode encodings simply croaks. + + % perl -MEncode -e '$_ = "\xfe\xff\xd8\xd9\xda\xdb\0\n"' \ + -e 'Encode::from_to($_, "utf16","shift_jis", 0); print' + UTF-16:Malformed LO surrogate d8d9 at /path/to/Encode.pm line 184. + % perl -MEncode -e '$a = "BOM missing"' \ + -e ' Encode::from_to($a, "utf16", "shift_jis", 0); print' + UTF-16:Unrecognised BOM 424f at /path/to/Encode.pm line 184. + +Unlike other encodings where mappings are not one-to-one against +Unicode, UTFs are supposed to map 100% against one another. So Encode +is more strict on UTFs. + +Consider that "division by zero" of Encode :) + +=head1 SEE ALSO + +L<Encode>, L<Encode::Unicode::UTF7>, L<http://www.unicode.org/glossary/>, +L<http://www.unicode.org/unicode/faq/utf_bom.html>, + +RFC 2781 L<http://rfc.net/rfc2781.html>, + +The whole Unicode standard L<http://www.unicode.org/unicode/uni2book/u2.html> + +Ch. 15, pp. 403 of C<Programming Perl (3rd Edition)> +by Larry Wall, Tom Christiansen, Jon Orwant; +O'Reilly & Associates; ISBN 0-596-00027-8 + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/Unicode/UTF7.pm b/Master/tlpkg/tlperl.old/lib/Encode/Unicode/UTF7.pm new file mode 100644 index 00000000000..dc75ce37816 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/Unicode/UTF7.pm @@ -0,0 +1,118 @@ +# +# $Id: UTF7.pm,v 2.1 2004/05/25 16:27:14 dankogai Exp $ +# +package Encode::Unicode::UTF7; +use strict; +no warnings 'redefine'; +use base qw(Encode::Encoding); +__PACKAGE__->Define('UTF-7'); +our $VERSION = do { my @r = (q$Revision: 2.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; +use MIME::Base64; +use Encode; + +# +# Algorithms taken from Unicode::String by Gisle Aas +# + +our $OPTIONAL_DIRECT_CHARS = 1; +my $specials = quotemeta "\'(),-./:?"; +$OPTIONAL_DIRECT_CHARS and + $specials .= quotemeta "!\"#$%&*;<=>@[]^_`{|}"; +# \s will not work because it matches U+3000 DEOGRAPHIC SPACE +# We use qr/[\n\r\t\ ] instead +my $re_asis = qr/(?:[\n\r\t\ A-Za-z0-9$specials])/; +my $re_encoded = qr/(?:[^\n\r\t\ A-Za-z0-9$specials])/; +my $e_utf16 = find_encoding("UTF-16BE"); + +sub needs_lines { 1 }; + +sub encode($$;$){ + my ($obj, $str, $chk) = @_; + my $len = length($str); + pos($str) = 0; + my $bytes = ''; + while (pos($str) < $len){ + if ($str =~ /\G($re_asis+)/ogc){ + $bytes .= $1; + }elsif($str =~ /\G($re_encoded+)/ogsc){ + if ($1 eq "+"){ + $bytes .= "+-"; + }else{ + my $s = $1; + my $base64 = encode_base64($e_utf16->encode($s), ''); + $base64 =~ s/=+$//; + $bytes .= "+$base64-"; + } + }else{ + die "This should not happen! (pos=" . pos($str) . ")"; + } + } + $_[1] = '' if $chk; + return $bytes; +} + +sub decode{ + my ($obj, $bytes, $chk) = @_; + my $len = length($bytes); + my $str = ""; + while (pos($bytes) < $len) { + if ($bytes =~ /\G([^+]+)/ogc) { + $str .= $1; + }elsif($bytes =~ /\G\+-/ogc) { + $str .= "+"; + }elsif($bytes =~ /\G\+([A-Za-z0-9+\/]+)-?/ogsc) { + my $base64 = $1; + my $pad = length($base64) % 4; + $base64 .= "=" x (4 - $pad) if $pad; + $str .= $e_utf16->decode(decode_base64($base64)); + }elsif($bytes =~ /\G\+/ogc) { + $^W and warn "Bad UTF7 data escape"; + $str .= "+"; + }else{ + die "This should not happen " . pos($bytes); + } + } + $_[1] = '' if $chk; + return $str; +} +1; +__END__ + +=head1 NAME + +Encode::Unicode::UTF7 -- UTF-7 encoding + +=head1 SYNOPSIS + + use Encode qw/encode decode/; + $utf7 = encode("UTF-7", $utf8); + $utf8 = decode("UTF-7", $ucs2); + +=head1 ABSTRACT + +This module implements UTF-7 encoding documented in RFC 2152. UTF-7, +as its name suggests, is a 7-bit re-encoded version of UTF-16BE. It +is designed to be MTA-safe and expected to be a standard way to +exchange Unicoded mails via mails. But with the advent of UTF-8 and +8-bit compliant MTAs, UTF-7 is hardly ever used. + +UTF-7 was not supported by Encode until version 1.95 because of that. +But Unicode::String, a module by Gisle Aas which adds Unicode supports +to non-utf8-savvy perl did support UTF-7, the UTF-7 support was added +so Encode can supersede Unicode::String 100%. + +=head1 In Practice + +When you want to encode Unicode for mails and web pages, however, do +not use UTF-7 unless you are sure your recipients and readers can +handle it. Very few MUAs and WWW Browsers support these days (only +Mozilla seems to support one). For general cases, use UTF-8 for +message body and MIME-Header for header instead. + +=head1 SEE ALSO + +L<Encode>, L<Encode::Unicode>, L<Unicode::String> + +RFC 2781 L<http://www.ietf.org/rfc/rfc2152.txt> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/_PM.e2x b/Master/tlpkg/tlperl.old/lib/Encode/_PM.e2x new file mode 100644 index 00000000000..eb59cd1b520 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/_PM.e2x @@ -0,0 +1,23 @@ +package Encode::$_Name_; +our $VERSION = "0.01"; + +use Encode; +use XSLoader; +XSLoader::load(__PACKAGE__,$VERSION); + +1; +__END__ + +=head1 NAME + +Encode::$_Name_ - New Encoding + +=head1 SYNOPSIS + +You got to fill this in! + +=head1 SEE ALSO + +L<Encode> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Encode/_T.e2x b/Master/tlpkg/tlperl.old/lib/Encode/_T.e2x new file mode 100644 index 00000000000..6cf5f293d54 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/_T.e2x @@ -0,0 +1,7 @@ +use strict; +# Adjust the number here! +use Test::More tests => 2; + +use_ok('Encode'); +use_ok('Encode::$_Name_'); +# Add more test here! diff --git a/Master/tlpkg/tlperl.old/lib/Encode/encode.h b/Master/tlpkg/tlperl.old/lib/Encode/encode.h new file mode 100644 index 00000000000..94764a6a14c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Encode/encode.h @@ -0,0 +1,111 @@ +#ifndef ENCODE_H +#define ENCODE_H + +#ifndef U8 +/* + A tad devious this: + perl normally has a #define for U8 - if that isn't present then we + typedef it - leaving it #ifndef so we can do data parts without + getting extern references to the code parts +*/ +typedef unsigned char U8; +#endif + +typedef struct encpage_s encpage_t; + +struct encpage_s +{ + /* fields ordered to pack nicely on 32-bit machines */ + const U8 *seq; /* Packed output sequences we generate + if we match */ + encpage_t *next; /* Page to go to if we match */ + U8 min; /* Min value of octet to match this entry */ + U8 max; /* Max value of octet to match this entry */ + U8 dlen; /* destination length - + size of entries in seq */ + U8 slen; /* source length - + number of source octets needed */ +}; + +/* + At any point in a translation there is a page pointer which points + at an array of the above structures. + + Basic operation : + get octet from source stream. + if (octet >= min && octet < max) { + if slen is 0 then we cannot represent this character. + if we have less than slen octets (including this one) then + we have a partial character. + otherwise + copy dlen octets from seq + dlen*(octet-min) to output + (dlen may be zero if we don't know yet.) + load page pointer with next to continue. + (is slen is one this is end of a character) + get next octet. + } + else { + increment the page pointer to look at next slot in the array + } + + arrays SHALL be constructed so there is an entry which matches + ..0xFF at the end, and either maps it or indicates no + representation. + + if MSB of slen is set then mapping is an approximate "FALLBACK" entry. + +*/ + + +typedef struct encode_s encode_t; +struct encode_s +{ + encpage_t *t_utf8; /* Starting table for translation from + the encoding to UTF-8 form */ + encpage_t *f_utf8; /* Starting table for translation + from UTF-8 to the encoding */ + const U8 *rep; /* Replacement character in this encoding + e.g. "?" */ + int replen; /* Number of octets in rep */ + U8 min_el; /* Minimum octets to represent a character */ + U8 max_el; /* Maximum octets to represent a character */ + const char *name[2]; /* name(s) of this encoding */ +}; + +#ifdef U8 +/* See comment at top of file for deviousness */ + +extern int do_encode(encpage_t *enc, const U8 *src, STRLEN *slen, + U8 *dst, STRLEN dlen, STRLEN *dout, int approx, + const U8 *term, STRLEN tlen); + +extern void Encode_DefineEncoding(encode_t *enc); + +#endif /* U8 */ + +#define ENCODE_NOSPACE 1 +#define ENCODE_PARTIAL 2 +#define ENCODE_NOREP 3 +#define ENCODE_FALLBACK 4 +#define ENCODE_FOUND_TERM 5 + +#define FBCHAR_UTF8 "\xEF\xBF\xBD" + +#define ENCODE_DIE_ON_ERR 0x0001 /* croaks immediately */ +#define ENCODE_WARN_ON_ERR 0x0002 /* warn on error; may proceed */ +#define ENCODE_RETURN_ON_ERR 0x0004 /* immediately returns on NOREP */ +#define ENCODE_LEAVE_SRC 0x0008 /* $src updated unless set */ +#define ENCODE_PERLQQ 0x0100 /* perlqq fallback string */ +#define ENCODE_HTMLCREF 0x0200 /* HTML character ref. fb mode */ +#define ENCODE_XMLCREF 0x0400 /* XML character ref. fb mode */ +#define ENCODE_STOP_AT_PARTIAL 0x0800 /* stop at partial explicitly */ + +#define ENCODE_FB_DEFAULT 0x0000 +#define ENCODE_FB_CROAK 0x0001 +#define ENCODE_FB_QUIET ENCODE_RETURN_ON_ERR +#define ENCODE_FB_WARN (ENCODE_RETURN_ON_ERR|ENCODE_WARN_ON_ERR) +#define ENCODE_FB_PERLQQ (ENCODE_PERLQQ|ENCODE_LEAVE_SRC) +#define ENCODE_FB_HTMLCREF (ENCODE_HTMLCREF|ENCODE_LEAVE_SRC) +#define ENCODE_FB_XMLCREF (ENCODE_XMLCREF|ENCODE_LEAVE_SRC) + +#endif /* ENCODE_H */ diff --git a/Master/tlpkg/tlperl.old/lib/Errno.pm b/Master/tlpkg/tlperl.old/lib/Errno.pm new file mode 100644 index 00000000000..23c07ea0482 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Errno.pm @@ -0,0 +1,227 @@ +# +# This file is auto-generated. ***ANY*** changes here will be lost +# + +package Errno; +our (@EXPORT_OK,%EXPORT_TAGS,@ISA,$VERSION,%errno,$AUTOLOAD); +use Exporter (); +use strict; + +$VERSION = "1.09_01"; +$VERSION = eval $VERSION; +@ISA = qw(Exporter); + +@EXPORT_OK = qw(EBADR ENOMSG ENOTSUP ESTRPIPE EADDRINUSE EL3HLT EBADF + ENOTBLK ENAVAIL ECHRNG ENOTNAM ELNRNG ENOKEY EXDEV EBADE EBADSLT + ECONNREFUSED ENOSTR ENONET EOVERFLOW EISCONN EFBIG EKEYREVOKED + ECONNRESET EWOULDBLOCK ELIBMAX EREMOTEIO ENOPKG ELIBSCN EDESTADDRREQ + ENOTSOCK EIO EMEDIUMTYPE EINPROGRESS ERANGE EAFNOSUPPORT EADDRNOTAVAIL + EINTR EREMOTE EILSEQ ENOMEM EPIPE ENETUNREACH ENODATA EUSERS + EOPNOTSUPP EPROTO EISNAM ESPIPE EALREADY ENAMETOOLONG ENOEXEC EISDIR + EBADRQC EEXIST EDOTDOT ELIBBAD EOWNERDEAD ESRCH EFAULT EXFULL + EDEADLOCK EAGAIN ENOPROTOOPT ENETDOWN EPROTOTYPE EL2NSYNC ENETRESET + EUCLEAN EADV EROFS ESHUTDOWN EMULTIHOP EPROTONOSUPPORT ENFILE ENOLCK + ECONNABORTED ECANCELED EDEADLK ESRMNT ENOLINK ETIME ENOTDIR EINVAL + ENOTTY ENOANO ELOOP ENOENT EPFNOSUPPORT EBADMSG ENOMEDIUM EL2HLT EDOM + EBFONT EKEYEXPIRED EMSGSIZE ENOCSI EL3RST ENOSPC EIDRM ENOBUFS ENOSYS + EHOSTDOWN EBADFD ENOSR ENOTCONN ESTALE EDQUOT EKEYREJECTED EMFILE + ENOTRECOVERABLE EACCES EBUSY E2BIG EPERM ELIBEXEC ETOOMANYREFS ELIBACC + ENOTUNIQ ECOMM ERESTART ESOCKTNOSUPPORT EUNATCH ETIMEDOUT ENXIO ENODEV + ETXTBSY EMLINK ECHILD EHOSTUNREACH EREMCHG ENOTEMPTY); + +%EXPORT_TAGS = ( + POSIX => [qw( + E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT EAGAIN EALREADY + EBADF EBUSY ECHILD ECONNABORTED ECONNREFUSED ECONNRESET EDEADLK + EDESTADDRREQ EDOM EDQUOT EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH + EINPROGRESS EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK + EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH ENFILE ENOBUFS + ENODEV ENOENT ENOEXEC ENOLCK ENOMEM ENOPROTOOPT ENOSPC ENOSYS ENOTBLK + ENOTCONN ENOTDIR ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM + EPFNOSUPPORT EPIPE EPROTONOSUPPORT EPROTOTYPE ERANGE EREMOTE ERESTART + EROFS ESHUTDOWN ESOCKTNOSUPPORT ESPIPE ESRCH ESTALE ETIMEDOUT + ETOOMANYREFS ETXTBSY EUSERS EWOULDBLOCK EXDEV + )] +); + +sub EPERM () { 1 } +sub ENOENT () { 2 } +sub ESRCH () { 3 } +sub EINTR () { 4 } +sub EIO () { 5 } +sub ENXIO () { 6 } +sub E2BIG () { 7 } +sub ENOEXEC () { 8 } +sub EBADF () { 9 } +sub ECHILD () { 10 } +sub EWOULDBLOCK () { 11 } +sub EAGAIN () { 11 } +sub ENOMEM () { 12 } +sub EACCES () { 13 } +sub EFAULT () { 14 } +sub ENOTBLK () { 15 } +sub EBUSY () { 16 } +sub EEXIST () { 17 } +sub EXDEV () { 18 } +sub ENODEV () { 19 } +sub ENOTDIR () { 20 } +sub EISDIR () { 21 } +sub EINVAL () { 22 } +sub ENFILE () { 23 } +sub EMFILE () { 24 } +sub ENOTTY () { 25 } +sub ETXTBSY () { 26 } +sub EFBIG () { 27 } +sub ENOSPC () { 28 } +sub ESPIPE () { 29 } +sub EROFS () { 30 } +sub EMLINK () { 31 } +sub EPIPE () { 32 } +sub EDOM () { 33 } +sub ERANGE () { 34 } +sub EDEADLOCK () { 35 } +sub EDEADLK () { 35 } +sub ENAMETOOLONG () { 36 } +sub ENOLCK () { 37 } +sub ENOSYS () { 38 } +sub ENOTEMPTY () { 39 } +sub ELOOP () { 40 } +sub ENOMSG () { 42 } +sub EIDRM () { 43 } +sub ECHRNG () { 44 } +sub EL2NSYNC () { 45 } +sub EL3HLT () { 46 } +sub EL3RST () { 47 } +sub ELNRNG () { 48 } +sub EUNATCH () { 49 } +sub ENOCSI () { 50 } +sub EL2HLT () { 51 } +sub EBADE () { 52 } +sub EBADR () { 53 } +sub EXFULL () { 54 } +sub ENOANO () { 55 } +sub EBADRQC () { 56 } +sub EBADSLT () { 57 } +sub EBFONT () { 59 } +sub ENOSTR () { 60 } +sub ENODATA () { 61 } +sub ETIME () { 62 } +sub ENOSR () { 63 } +sub ENONET () { 64 } +sub ENOPKG () { 65 } +sub EREMOTE () { 66 } +sub ENOLINK () { 67 } +sub EADV () { 68 } +sub ESRMNT () { 69 } +sub ECOMM () { 70 } +sub EPROTO () { 71 } +sub EMULTIHOP () { 72 } +sub EDOTDOT () { 73 } +sub EBADMSG () { 74 } +sub EOVERFLOW () { 75 } +sub ENOTUNIQ () { 76 } +sub EBADFD () { 77 } +sub EREMCHG () { 78 } +sub ELIBACC () { 79 } +sub ELIBBAD () { 80 } +sub ELIBSCN () { 81 } +sub ELIBMAX () { 82 } +sub ELIBEXEC () { 83 } +sub EILSEQ () { 84 } +sub ERESTART () { 85 } +sub ESTRPIPE () { 86 } +sub EUSERS () { 87 } +sub ENOTSOCK () { 88 } +sub EDESTADDRREQ () { 89 } +sub EMSGSIZE () { 90 } +sub EPROTOTYPE () { 91 } +sub ENOPROTOOPT () { 92 } +sub EPROTONOSUPPORT () { 93 } +sub ESOCKTNOSUPPORT () { 94 } +sub ENOTSUP () { 95 } +sub EOPNOTSUPP () { 95 } +sub EPFNOSUPPORT () { 96 } +sub EAFNOSUPPORT () { 97 } +sub EADDRINUSE () { 98 } +sub EADDRNOTAVAIL () { 99 } +sub ENETDOWN () { 100 } +sub ENETUNREACH () { 101 } +sub ENETRESET () { 102 } +sub ECONNABORTED () { 103 } +sub ECONNRESET () { 104 } +sub ENOBUFS () { 105 } +sub EISCONN () { 106 } +sub ENOTCONN () { 107 } +sub ESHUTDOWN () { 108 } +sub ETOOMANYREFS () { 109 } +sub ETIMEDOUT () { 110 } +sub ECONNREFUSED () { 111 } +sub EHOSTDOWN () { 112 } +sub EHOSTUNREACH () { 113 } +sub EALREADY () { 114 } +sub EINPROGRESS () { 115 } +sub ESTALE () { 116 } +sub EUCLEAN () { 117 } +sub ENOTNAM () { 118 } +sub ENAVAIL () { 119 } +sub EISNAM () { 120 } +sub EREMOTEIO () { 121 } +sub EDQUOT () { 122 } +sub ENOMEDIUM () { 123 } +sub EMEDIUMTYPE () { 124 } +sub ECANCELED () { 125 } +sub ENOKEY () { 126 } +sub EKEYEXPIRED () { 127 } +sub EKEYREVOKED () { 128 } +sub EKEYREJECTED () { 129 } +sub EOWNERDEAD () { 130 } +sub ENOTRECOVERABLE () { 131 } + +sub TIEHASH { bless [] } + +sub FETCH { + my ($self, $errname) = @_; + my $proto = prototype("Errno::$errname"); + my $errno = ""; + if (defined($proto) && $proto eq "") { + no strict 'refs'; + $errno = &$errname; + $errno = 0 unless $! == $errno; + } + return $errno; +} + +sub STORE { + require Carp; + Carp::confess("ERRNO hash is read only!"); +} + +*CLEAR = \&STORE; +*DELETE = \&STORE; + +sub NEXTKEY { + my($k,$v); + while(($k,$v) = each %Errno::) { + my $proto = prototype("Errno::$k"); + last if (defined($proto) && $proto eq ""); + } + $k +} + +sub FIRSTKEY { + my $s = scalar keys %Errno::; # initialize iterator + goto &NEXTKEY; +} + +sub EXISTS { + my ($self, $errname) = @_; + my $r = ref $errname; + my $proto = !$r || $r eq 'CODE' ? prototype($errname) : undef; + defined($proto) && $proto eq ""; +} + +tie %!, __PACKAGE__; + +1; +__END__ + diff --git a/Master/tlpkg/tlperl.old/lib/Exporter.pm b/Master/tlpkg/tlperl.old/lib/Exporter.pm new file mode 100644 index 00000000000..d9c22049776 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Exporter.pm @@ -0,0 +1,440 @@ +package Exporter; + +require 5.006; + +# Be lean. +#use strict; +#no strict 'refs'; + +our $Debug = 0; +our $ExportLevel = 0; +our $Verbose ||= 0; +our $VERSION = '5.58'; +our (%Cache); +$Carp::Internal{Exporter} = 1; + +sub as_heavy { + require Exporter::Heavy; + # Unfortunately, this does not work if the caller is aliased as *name = \&foo + # Thus the need to create a lot of identical subroutines + my $c = (caller(1))[3]; + $c =~ s/.*:://; + \&{"Exporter::Heavy::heavy_$c"}; +} + +sub export { + goto &{as_heavy()}; +} + +sub import { + my $pkg = shift; + my $callpkg = caller($ExportLevel); + + if ($pkg eq "Exporter" and @_ and $_[0] eq "import") { + *{$callpkg."::import"} = \&import; + return; + } + + # We *need* to treat @{"$pkg\::EXPORT_FAIL"} since Carp uses it :-( + my($exports, $fail) = (\@{"$pkg\::EXPORT"}, \@{"$pkg\::EXPORT_FAIL"}); + return export $pkg, $callpkg, @_ + if $Verbose or $Debug or @$fail > 1; + my $export_cache = ($Cache{$pkg} ||= {}); + my $args = @_ or @_ = @$exports; + + local $_; + if ($args and not %$export_cache) { + s/^&//, $export_cache->{$_} = 1 + foreach (@$exports, @{"$pkg\::EXPORT_OK"}); + } + my $heavy; + # Try very hard not to use {} and hence have to enter scope on the foreach + # We bomb out of the loop with last as soon as heavy is set. + if ($args or $fail) { + ($heavy = (/\W/ or $args and not exists $export_cache->{$_} + or @$fail and $_ eq $fail->[0])) and last + foreach (@_); + } else { + ($heavy = /\W/) and last + foreach (@_); + } + return export $pkg, $callpkg, ($args ? @_ : ()) if $heavy; + local $SIG{__WARN__} = + sub {require Carp; &Carp::carp}; + # shortcut for the common case of no type character + *{"$callpkg\::$_"} = \&{"$pkg\::$_"} foreach @_; +} + +# Default methods + +sub export_fail { + my $self = shift; + @_; +} + +# Unfortunately, caller(1)[3] "does not work" if the caller is aliased as +# *name = \&foo. Thus the need to create a lot of identical subroutines +# Otherwise we could have aliased them to export(). + +sub export_to_level { + goto &{as_heavy()}; +} + +sub export_tags { + goto &{as_heavy()}; +} + +sub export_ok_tags { + goto &{as_heavy()}; +} + +sub require_version { + goto &{as_heavy()}; +} + +1; +__END__ + +=head1 NAME + +Exporter - Implements default import method for modules + +=head1 SYNOPSIS + +In module YourModule.pm: + + package YourModule; + require Exporter; + @ISA = qw(Exporter); + @EXPORT_OK = qw(munge frobnicate); # symbols to export on request + +or + + package YourModule; + use Exporter 'import'; # gives you Exporter's import() method directly + @EXPORT_OK = qw(munge frobnicate); # symbols to export on request + +In other files which wish to use YourModule: + + use ModuleName qw(frobnicate); # import listed symbols + frobnicate ($left, $right) # calls YourModule::frobnicate + +=head1 DESCRIPTION + +The Exporter module implements an C<import> method which allows a module +to export functions and variables to its users' namespaces. Many modules +use Exporter rather than implementing their own C<import> method because +Exporter provides a highly flexible interface, with an implementation optimised +for the common case. + +Perl automatically calls the C<import> method when processing a +C<use> statement for a module. Modules and C<use> are documented +in L<perlfunc> and L<perlmod>. Understanding the concept of +modules and how the C<use> statement operates is important to +understanding the Exporter. + +=head2 How to Export + +The arrays C<@EXPORT> and C<@EXPORT_OK> in a module hold lists of +symbols that are going to be exported into the users name space by +default, or which they can request to be exported, respectively. The +symbols can represent functions, scalars, arrays, hashes, or typeglobs. +The symbols must be given by full name with the exception that the +ampersand in front of a function is optional, e.g. + + @EXPORT = qw(afunc $scalar @array); # afunc is a function + @EXPORT_OK = qw(&bfunc %hash *typeglob); # explicit prefix on &bfunc + +If you are only exporting function names it is recommended to omit the +ampersand, as the implementation is faster this way. + +=head2 Selecting What To Export + +Do B<not> export method names! + +Do B<not> export anything else by default without a good reason! + +Exports pollute the namespace of the module user. If you must export +try to use @EXPORT_OK in preference to @EXPORT and avoid short or +common symbol names to reduce the risk of name clashes. + +Generally anything not exported is still accessible from outside the +module using the ModuleName::item_name (or $blessed_ref-E<gt>method) +syntax. By convention you can use a leading underscore on names to +informally indicate that they are 'internal' and not for public use. + +(It is actually possible to get private functions by saying: + + my $subref = sub { ... }; + $subref->(@args); # Call it as a function + $obj->$subref(@args); # Use it as a method + +However if you use them for methods it is up to you to figure out +how to make inheritance work.) + +As a general rule, if the module is trying to be object oriented +then export nothing. If it's just a collection of functions then +@EXPORT_OK anything but use @EXPORT with caution. For function and +method names use barewords in preference to names prefixed with +ampersands for the export lists. + +Other module design guidelines can be found in L<perlmod>. + +=head2 How to Import + +In other files which wish to use your module there are three basic ways for +them to load your module and import its symbols: + +=over 4 + +=item C<use ModuleName;> + +This imports all the symbols from ModuleName's @EXPORT into the namespace +of the C<use> statement. + +=item C<use ModuleName ();> + +This causes perl to load your module but does not import any symbols. + +=item C<use ModuleName qw(...);> + +This imports only the symbols listed by the caller into their namespace. +All listed symbols must be in your @EXPORT or @EXPORT_OK, else an error +occurs. The advanced export features of Exporter are accessed like this, +but with list entries that are syntactically distinct from symbol names. + +=back + +Unless you want to use its advanced features, this is probably all you +need to know to use Exporter. + +=head1 Advanced features + +=head2 Specialised Import Lists + +If any of the entries in an import list begins with !, : or / then +the list is treated as a series of specifications which either add to +or delete from the list of names to import. They are processed left to +right. Specifications are in the form: + + [!]name This name only + [!]:DEFAULT All names in @EXPORT + [!]:tag All names in $EXPORT_TAGS{tag} anonymous list + [!]/pattern/ All names in @EXPORT and @EXPORT_OK which match + +A leading ! indicates that matching names should be deleted from the +list of names to import. If the first specification is a deletion it +is treated as though preceded by :DEFAULT. If you just want to import +extra names in addition to the default set you will still need to +include :DEFAULT explicitly. + +e.g., Module.pm defines: + + @EXPORT = qw(A1 A2 A3 A4 A5); + @EXPORT_OK = qw(B1 B2 B3 B4 B5); + %EXPORT_TAGS = (T1 => [qw(A1 A2 B1 B2)], T2 => [qw(A1 A2 B3 B4)]); + + Note that you cannot use tags in @EXPORT or @EXPORT_OK. + Names in EXPORT_TAGS must also appear in @EXPORT or @EXPORT_OK. + +An application using Module can say something like: + + use Module qw(:DEFAULT :T2 !B3 A3); + +Other examples include: + + use Socket qw(!/^[AP]F_/ !SOMAXCONN !SOL_SOCKET); + use POSIX qw(:errno_h :termios_h !TCSADRAIN !/^EXIT/); + +Remember that most patterns (using //) will need to be anchored +with a leading ^, e.g., C</^EXIT/> rather than C</EXIT/>. + +You can say C<BEGIN { $Exporter::Verbose=1 }> to see how the +specifications are being processed and what is actually being imported +into modules. + +=head2 Exporting without using Exporter's import method + +Exporter has a special method, 'export_to_level' which is used in situations +where you can't directly call Exporter's import method. The export_to_level +method looks like: + + MyPackage->export_to_level($where_to_export, $package, @what_to_export); + +where $where_to_export is an integer telling how far up the calling stack +to export your symbols, and @what_to_export is an array telling what +symbols *to* export (usually this is @_). The $package argument is +currently unused. + +For example, suppose that you have a module, A, which already has an +import function: + + package A; + + @ISA = qw(Exporter); + @EXPORT_OK = qw ($b); + + sub import + { + $A::b = 1; # not a very useful import method + } + +and you want to Export symbol $A::b back to the module that called +package A. Since Exporter relies on the import method to work, via +inheritance, as it stands Exporter::import() will never get called. +Instead, say the following: + + package A; + @ISA = qw(Exporter); + @EXPORT_OK = qw ($b); + + sub import + { + $A::b = 1; + A->export_to_level(1, @_); + } + +This will export the symbols one level 'above' the current package - ie: to +the program or module that used package A. + +Note: Be careful not to modify C<@_> at all before you call export_to_level +- or people using your package will get very unexplained results! + +=head2 Exporting without inheriting from Exporter + +By including Exporter in your @ISA you inherit an Exporter's import() method +but you also inherit several other helper methods which you probably don't +want. To avoid this you can do + + package YourModule; + use Exporter qw( import ); + +which will export Exporter's own import() method into YourModule. +Everything will work as before but you won't need to include Exporter in +@YourModule::ISA. + +=head2 Module Version Checking + +The Exporter module will convert an attempt to import a number from a +module into a call to $module_name-E<gt>require_version($value). This can +be used to validate that the version of the module being used is +greater than or equal to the required version. + +The Exporter module supplies a default require_version method which +checks the value of $VERSION in the exporting module. + +Since the default require_version method treats the $VERSION number as +a simple numeric value it will regard version 1.10 as lower than +1.9. For this reason it is strongly recommended that you use numbers +with at least two decimal places, e.g., 1.09. + +=head2 Managing Unknown Symbols + +In some situations you may want to prevent certain symbols from being +exported. Typically this applies to extensions which have functions +or constants that may not exist on some systems. + +The names of any symbols that cannot be exported should be listed +in the C<@EXPORT_FAIL> array. + +If a module attempts to import any of these symbols the Exporter +will give the module an opportunity to handle the situation before +generating an error. The Exporter will call an export_fail method +with a list of the failed symbols: + + @failed_symbols = $module_name->export_fail(@failed_symbols); + +If the export_fail method returns an empty list then no error is +recorded and all the requested symbols are exported. If the returned +list is not empty then an error is generated for each symbol and the +export fails. The Exporter provides a default export_fail method which +simply returns the list unchanged. + +Uses for the export_fail method include giving better error messages +for some symbols and performing lazy architectural checks (put more +symbols into @EXPORT_FAIL by default and then take them out if someone +actually tries to use them and an expensive check shows that they are +usable on that platform). + +=head2 Tag Handling Utility Functions + +Since the symbols listed within %EXPORT_TAGS must also appear in either +@EXPORT or @EXPORT_OK, two utility functions are provided which allow +you to easily add tagged sets of symbols to @EXPORT or @EXPORT_OK: + + %EXPORT_TAGS = (foo => [qw(aa bb cc)], bar => [qw(aa cc dd)]); + + Exporter::export_tags('foo'); # add aa, bb and cc to @EXPORT + Exporter::export_ok_tags('bar'); # add aa, cc and dd to @EXPORT_OK + +Any names which are not tags are added to @EXPORT or @EXPORT_OK +unchanged but will trigger a warning (with C<-w>) to avoid misspelt tags +names being silently added to @EXPORT or @EXPORT_OK. Future versions +may make this a fatal error. + +=head2 Generating combined tags + +If several symbol categories exist in %EXPORT_TAGS, it's usually +useful to create the utility ":all" to simplify "use" statements. + +The simplest way to do this is: + + %EXPORT_TAGS = (foo => [qw(aa bb cc)], bar => [qw(aa cc dd)]); + + # add all the other ":class" tags to the ":all" class, + # deleting duplicates + { + my %seen; + + push @{$EXPORT_TAGS{all}}, + grep {!$seen{$_}++} @{$EXPORT_TAGS{$_}} foreach keys %EXPORT_TAGS; + } + +CGI.pm creates an ":all" tag which contains some (but not really +all) of its categories. That could be done with one small +change: + + # add some of the other ":class" tags to the ":all" class, + # deleting duplicates + { + my %seen; + + push @{$EXPORT_TAGS{all}}, + grep {!$seen{$_}++} @{$EXPORT_TAGS{$_}} + foreach qw/html2 html3 netscape form cgi internal/; + } + +Note that the tag names in %EXPORT_TAGS don't have the leading ':'. + +=head2 C<AUTOLOAD>ed Constants + +Many modules make use of C<AUTOLOAD>ing for constant subroutines to +avoid having to compile and waste memory on rarely used values (see +L<perlsub> for details on constant subroutines). Calls to such +constant subroutines are not optimized away at compile time because +they can't be checked at compile time for constancy. + +Even if a prototype is available at compile time, the body of the +subroutine is not (it hasn't been C<AUTOLOAD>ed yet). perl needs to +examine both the C<()> prototype and the body of a subroutine at +compile time to detect that it can safely replace calls to that +subroutine with the constant value. + +A workaround for this is to call the constants once in a C<BEGIN> block: + + package My ; + + use Socket ; + + foo( SO_LINGER ); ## SO_LINGER NOT optimized away; called at runtime + BEGIN { SO_LINGER } + foo( SO_LINGER ); ## SO_LINGER optimized away at compile time. + +This forces the C<AUTOLOAD> for C<SO_LINGER> to take place before +SO_LINGER is encountered later in C<My> package. + +If you are writing a package that C<AUTOLOAD>s, consider forcing +an C<AUTOLOAD> for any constants explicitly imported by other packages +or which are usually used when your package is C<use>d. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Exporter/Heavy.pm b/Master/tlpkg/tlperl.old/lib/Exporter/Heavy.pm new file mode 100644 index 00000000000..2cc792288f0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Exporter/Heavy.pm @@ -0,0 +1,248 @@ +package Exporter::Heavy; + +use strict; +no strict 'refs'; + +# On one line so MakeMaker will see it. +require Exporter; our $VERSION = $Exporter::VERSION; +$Carp::Internal{"Exporter::Heavy"} = 1; + +=head1 NAME + +Exporter::Heavy - Exporter guts + +=head1 SYNOPSIS + +(internal use only) + +=head1 DESCRIPTION + +No user-serviceable parts inside. + +=cut + +# +# We go to a lot of trouble not to 'require Carp' at file scope, +# because Carp requires Exporter, and something has to give. +# + +sub _rebuild_cache { + my ($pkg, $exports, $cache) = @_; + s/^&// foreach @$exports; + @{$cache}{@$exports} = (1) x @$exports; + my $ok = \@{"${pkg}::EXPORT_OK"}; + if (@$ok) { + s/^&// foreach @$ok; + @{$cache}{@$ok} = (1) x @$ok; + } +} + +sub heavy_export { + + # First make import warnings look like they're coming from the "use". + local $SIG{__WARN__} = sub { + my $text = shift; + if ($text =~ s/ at \S*Exporter\S*.pm line \d+.*\n//) { + require Carp; + local $Carp::CarpLevel = 1; # ignore package calling us too. + Carp::carp($text); + } + else { + warn $text; + } + }; + local $SIG{__DIE__} = sub { + require Carp; + local $Carp::CarpLevel = 1; # ignore package calling us too. + Carp::croak("$_[0]Illegal null symbol in \@${1}::EXPORT") + if $_[0] =~ /^Unable to create sub named "(.*?)::"/; + }; + + my($pkg, $callpkg, @imports) = @_; + my($type, $sym, $cache_is_current, $oops); + my($exports, $export_cache) = (\@{"${pkg}::EXPORT"}, + $Exporter::Cache{$pkg} ||= {}); + + if (@imports) { + if (!%$export_cache) { + _rebuild_cache ($pkg, $exports, $export_cache); + $cache_is_current = 1; + } + + if (grep m{^[/!:]}, @imports) { + my $tagsref = \%{"${pkg}::EXPORT_TAGS"}; + my $tagdata; + my %imports; + my($remove, $spec, @names, @allexports); + # negated first item implies starting with default set: + unshift @imports, ':DEFAULT' if $imports[0] =~ m/^!/; + foreach $spec (@imports){ + $remove = $spec =~ s/^!//; + + if ($spec =~ s/^://){ + if ($spec eq 'DEFAULT'){ + @names = @$exports; + } + elsif ($tagdata = $tagsref->{$spec}) { + @names = @$tagdata; + } + else { + warn qq["$spec" is not defined in %${pkg}::EXPORT_TAGS]; + ++$oops; + next; + } + } + elsif ($spec =~ m:^/(.*)/$:){ + my $patn = $1; + @allexports = keys %$export_cache unless @allexports; # only do keys once + @names = grep(/$patn/, @allexports); # not anchored by default + } + else { + @names = ($spec); # is a normal symbol name + } + + warn "Import ".($remove ? "del":"add").": @names " + if $Exporter::Verbose; + + if ($remove) { + foreach $sym (@names) { delete $imports{$sym} } + } + else { + @imports{@names} = (1) x @names; + } + } + @imports = keys %imports; + } + + my @carp; + foreach $sym (@imports) { + if (!$export_cache->{$sym}) { + if ($sym =~ m/^\d/) { + $pkg->VERSION($sym); # inherit from UNIVERSAL + # If the version number was the only thing specified + # then we should act as if nothing was specified: + if (@imports == 1) { + @imports = @$exports; + last; + } + # We need a way to emulate 'use Foo ()' but still + # allow an easy version check: "use Foo 1.23, ''"; + if (@imports == 2 and !$imports[1]) { + @imports = (); + last; + } + } elsif ($sym !~ s/^&// || !$export_cache->{$sym}) { + # Last chance - see if they've updated EXPORT_OK since we + # cached it. + + unless ($cache_is_current) { + %$export_cache = (); + _rebuild_cache ($pkg, $exports, $export_cache); + $cache_is_current = 1; + } + + if (!$export_cache->{$sym}) { + # accumulate the non-exports + push @carp, + qq["$sym" is not exported by the $pkg module\n]; + $oops++; + } + } + } + } + if ($oops) { + require Carp; + Carp::croak("@{carp}Can't continue after import errors"); + } + } + else { + @imports = @$exports; + } + + my($fail, $fail_cache) = (\@{"${pkg}::EXPORT_FAIL"}, + $Exporter::FailCache{$pkg} ||= {}); + + if (@$fail) { + if (!%$fail_cache) { + # Build cache of symbols. Optimise the lookup by adding + # barewords twice... both with and without a leading &. + # (Technique could be applied to $export_cache at cost of memory) + my @expanded = map { /^\w/ ? ($_, '&'.$_) : $_ } @$fail; + warn "${pkg}::EXPORT_FAIL cached: @expanded" if $Exporter::Verbose; + @{$fail_cache}{@expanded} = (1) x @expanded; + } + my @failed; + foreach $sym (@imports) { push(@failed, $sym) if $fail_cache->{$sym} } + if (@failed) { + @failed = $pkg->export_fail(@failed); + foreach $sym (@failed) { + require Carp; + Carp::carp(qq["$sym" is not implemented by the $pkg module ], + "on this architecture"); + } + if (@failed) { + require Carp; + Carp::croak("Can't continue after import errors"); + } + } + } + + warn "Importing into $callpkg from $pkg: ", + join(", ",sort @imports) if $Exporter::Verbose; + + foreach $sym (@imports) { + # shortcut for the common case of no type character + (*{"${callpkg}::$sym"} = \&{"${pkg}::$sym"}, next) + unless $sym =~ s/^(\W)//; + $type = $1; + *{"${callpkg}::$sym"} = + $type eq '&' ? \&{"${pkg}::$sym"} : + $type eq '$' ? \${"${pkg}::$sym"} : + $type eq '@' ? \@{"${pkg}::$sym"} : + $type eq '%' ? \%{"${pkg}::$sym"} : + $type eq '*' ? *{"${pkg}::$sym"} : + do { require Carp; Carp::croak("Can't export symbol: $type$sym") }; + } +} + +sub heavy_export_to_level +{ + my $pkg = shift; + my $level = shift; + (undef) = shift; # XXX redundant arg + my $callpkg = caller($level); + $pkg->export($callpkg, @_); +} + +# Utility functions + +sub _push_tags { + my($pkg, $var, $syms) = @_; + my @nontag = (); + my $export_tags = \%{"${pkg}::EXPORT_TAGS"}; + push(@{"${pkg}::$var"}, + map { $export_tags->{$_} ? @{$export_tags->{$_}} + : scalar(push(@nontag,$_),$_) } + (@$syms) ? @$syms : keys %$export_tags); + if (@nontag and $^W) { + # This may change to a die one day + require Carp; + Carp::carp(join(", ", @nontag)." are not tags of $pkg"); + } +} + +sub heavy_require_version { + my($self, $wanted) = @_; + my $pkg = ref $self || $self; + return ${pkg}->VERSION($wanted); +} + +sub heavy_export_tags { + _push_tags((caller)[0], "EXPORT", \@_); +} + +sub heavy_export_ok_tags { + _push_tags((caller)[0], "EXPORT_OK", \@_); +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Fcntl.pm b/Master/tlpkg/tlperl.old/lib/Fcntl.pm new file mode 100644 index 00000000000..7ef0038bd18 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Fcntl.pm @@ -0,0 +1,236 @@ +package Fcntl; + +=head1 NAME + +Fcntl - load the C Fcntl.h defines + +=head1 SYNOPSIS + + use Fcntl; + use Fcntl qw(:DEFAULT :flock); + +=head1 DESCRIPTION + +This module is just a translation of the C F<fcntl.h> file. +Unlike the old mechanism of requiring a translated F<fcntl.ph> +file, this uses the B<h2xs> program (see the Perl source distribution) +and your native C compiler. This means that it has a +far more likely chance of getting the numbers right. + +=head1 NOTE + +Only C<#define> symbols get translated; you must still correctly +pack up your own arguments to pass as args for locking functions, etc. + +=head1 EXPORTED SYMBOLS + +By default your system's F_* and O_* constants (eg, F_DUPFD and +O_CREAT) and the FD_CLOEXEC constant are exported into your namespace. + +You can request that the flock() constants (LOCK_SH, LOCK_EX, LOCK_NB +and LOCK_UN) be provided by using the tag C<:flock>. See L<Exporter>. + +You can request that the old constants (FAPPEND, FASYNC, FCREAT, +FDEFER, FEXCL, FNDELAY, FNONBLOCK, FSYNC, FTRUNC) be provided for +compatibility reasons by using the tag C<:Fcompat>. For new +applications the newer versions of these constants are suggested +(O_APPEND, O_ASYNC, O_CREAT, O_DEFER, O_EXCL, O_NDELAY, O_NONBLOCK, +O_SYNC, O_TRUNC). + +For ease of use also the SEEK_* constants (for seek() and sysseek(), +e.g. SEEK_END) and the S_I* constants (for chmod() and stat()) are +available for import. They can be imported either separately or using +the tags C<:seek> and C<:mode>. + +Please refer to your native fcntl(2), open(2), fseek(3), lseek(2) +(equal to Perl's seek() and sysseek(), respectively), and chmod(2) +documentation to see what constants are implemented in your system. + +See L<perlopentut> to learn about the uses of the O_* constants +with sysopen(). + +See L<perlfunc/seek> and L<perlfunc/sysseek> about the SEEK_* constants. + +See L<perlfunc/stat> about the S_I* constants. + +=cut + +our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $AUTOLOAD); + +require Exporter; +use XSLoader (); +@ISA = qw(Exporter); +$VERSION = "1.05"; +# Items to export into callers namespace by default +# (move infrequently used names to @EXPORT_OK below) +@EXPORT = + qw( + FD_CLOEXEC + F_ALLOCSP + F_ALLOCSP64 + F_COMPAT + F_DUP2FD + F_DUPFD + F_EXLCK + F_FREESP + F_FREESP64 + F_FSYNC + F_FSYNC64 + F_GETFD + F_GETFL + F_GETLK + F_GETLK64 + F_GETOWN + F_NODNY + F_POSIX + F_RDACC + F_RDDNY + F_RDLCK + F_RWACC + F_RWDNY + F_SETFD + F_SETFL + F_SETLK + F_SETLK64 + F_SETLKW + F_SETLKW64 + F_SETOWN + F_SHARE + F_SHLCK + F_UNLCK + F_UNSHARE + F_WRACC + F_WRDNY + F_WRLCK + O_ACCMODE + O_ALIAS + O_APPEND + O_ASYNC + O_BINARY + O_CREAT + O_DEFER + O_DIRECT + O_DIRECTORY + O_DSYNC + O_EXCL + O_EXLOCK + O_LARGEFILE + O_NDELAY + O_NOCTTY + O_NOFOLLOW + O_NOINHERIT + O_NONBLOCK + O_RANDOM + O_RAW + O_RDONLY + O_RDWR + O_RSRC + O_RSYNC + O_SEQUENTIAL + O_SHLOCK + O_SYNC + O_TEMPORARY + O_TEXT + O_TRUNC + O_WRONLY + ); + +# Other items we are prepared to export if requested +@EXPORT_OK = qw( + DN_ACCESS + DN_ATTRIB + DN_CREATE + DN_DELETE + DN_MODIFY + DN_MULTISHOT + DN_RENAME + FAPPEND + FASYNC + FCREAT + FDEFER + FDSYNC + FEXCL + FLARGEFILE + FNDELAY + FNONBLOCK + FRSYNC + FSYNC + FTRUNC + F_GETLEASE + F_GETSIG + F_NOTIFY + F_SETLEASE + F_SETSIG + LOCK_EX + LOCK_MAND + LOCK_NB + LOCK_READ + LOCK_RW + LOCK_SH + LOCK_UN + LOCK_WRITE + O_IGNORE_CTTY + O_NOATIME + O_NOLINK + O_NOTRANS + SEEK_CUR + SEEK_END + SEEK_SET + S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT + S_IREAD S_IWRITE S_IEXEC + S_IRGRP S_IWGRP S_IXGRP S_IRWXG + S_IROTH S_IWOTH S_IXOTH S_IRWXO + S_IRUSR S_IWUSR S_IXUSR S_IRWXU + S_ISUID S_ISGID S_ISVTX S_ISTXT + _S_IFMT S_IFREG S_IFDIR S_IFLNK + &S_ISREG &S_ISDIR &S_ISLNK &S_ISSOCK &S_ISBLK &S_ISCHR &S_ISFIFO + &S_ISWHT &S_ISENFMT &S_IFMT &S_IMODE +); +# Named groups of exports +%EXPORT_TAGS = ( + 'flock' => [qw(LOCK_SH LOCK_EX LOCK_NB LOCK_UN)], + 'Fcompat' => [qw(FAPPEND FASYNC FCREAT FDEFER FDSYNC FEXCL FLARGEFILE + FNDELAY FNONBLOCK FRSYNC FSYNC FTRUNC)], + 'seek' => [qw(SEEK_SET SEEK_CUR SEEK_END)], + 'mode' => [qw(S_ISUID S_ISGID S_ISVTX S_ISTXT + _S_IFMT S_IFREG S_IFDIR S_IFLNK + S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT + S_IRUSR S_IWUSR S_IXUSR S_IRWXU + S_IRGRP S_IWGRP S_IXGRP S_IRWXG + S_IROTH S_IWOTH S_IXOTH S_IRWXO + S_IREAD S_IWRITE S_IEXEC + S_ISREG S_ISDIR S_ISLNK S_ISSOCK + S_ISBLK S_ISCHR S_ISFIFO + S_ISWHT S_ISENFMT + S_IFMT S_IMODE + )], +); + +sub S_IFMT { @_ ? ( $_[0] & _S_IFMT() ) : _S_IFMT() } +sub S_IMODE { $_[0] & 07777 } + +sub S_ISREG { ( $_[0] & _S_IFMT() ) == S_IFREG() } +sub S_ISDIR { ( $_[0] & _S_IFMT() ) == S_IFDIR() } +sub S_ISLNK { ( $_[0] & _S_IFMT() ) == S_IFLNK() } +sub S_ISSOCK { ( $_[0] & _S_IFMT() ) == S_IFSOCK() } +sub S_ISBLK { ( $_[0] & _S_IFMT() ) == S_IFBLK() } +sub S_ISCHR { ( $_[0] & _S_IFMT() ) == S_IFCHR() } +sub S_ISFIFO { ( $_[0] & _S_IFMT() ) == S_IFIFO() } +sub S_ISWHT { ( $_[0] & _S_IFMT() ) == S_IFWHT() } +sub S_ISENFMT { ( $_[0] & _S_IFMT() ) == S_IFENFMT() } + +sub AUTOLOAD { + (my $constname = $AUTOLOAD) =~ s/.*:://; + die "&Fcntl::constant not defined" if $constname eq 'constant'; + my ($error, $val) = constant($constname); + if ($error) { + my (undef,$file,$line) = caller; + die "$error at $file line $line.\n"; + } + *$AUTOLOAD = sub { $val }; + goto &$AUTOLOAD; +} + +XSLoader::load 'Fcntl', $VERSION; + +1; diff --git a/Master/tlpkg/tlperl.old/lib/File/Basename.pm b/Master/tlpkg/tlperl.old/lib/File/Basename.pm new file mode 100644 index 00000000000..837b753972a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/Basename.pm @@ -0,0 +1,398 @@ +=head1 NAME + +File::Basename - Parse file paths into directory, filename and suffix. + +=head1 SYNOPSIS + + use File::Basename; + + ($name,$path,$suffix) = fileparse($fullname,@suffixlist); + $name = fileparse($fullname,@suffixlist); + + $basename = basename($fullname,@suffixlist); + $dirname = dirname($fullname); + + +=head1 DESCRIPTION + +These routines allow you to parse file paths into their directory, filename +and suffix. + +B<NOTE>: C<dirname()> and C<basename()> emulate the behaviours, and +quirks, of the shell and C functions of the same name. See each +function's documentation for details. If your concern is just parsing +paths it is safer to use L<File::Spec>'s C<splitpath()> and +C<splitdir()> methods. + +It is guaranteed that + + # Where $path_separator is / for Unix, \ for Windows, etc... + dirname($path) . $path_separator . basename($path); + +is equivalent to the original path for all systems but VMS. + + +=cut + + +package File::Basename; + +# A bit of juggling to insure that C<use re 'taint';> always works, since +# File::Basename is used during the Perl build, when the re extension may +# not be available. +BEGIN { + unless (eval { require re; }) + { eval ' sub re::import { $^H |= 0x00100000; } ' } # HINT_RE_TAINT + import re 'taint'; +} + + +use strict; +use 5.006; +use warnings; +our(@ISA, @EXPORT, $VERSION, $Fileparse_fstype, $Fileparse_igncase); +require Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(fileparse fileparse_set_fstype basename dirname); +$VERSION = "2.74"; + +fileparse_set_fstype($^O); + + +=over 4 + +=item C<fileparse> + + my($filename, $directories, $suffix) = fileparse($path); + my($filename, $directories, $suffix) = fileparse($path, @suffixes); + my $filename = fileparse($path, @suffixes); + +The C<fileparse()> routine divides a file path into its $directories, $filename +and (optionally) the filename $suffix. + +$directories contains everything up to and including the last +directory separator in the $path including the volume (if applicable). +The remainder of the $path is the $filename. + + # On Unix returns ("baz", "/foo/bar/", "") + fileparse("/foo/bar/baz"); + + # On Windows returns ("baz", "C:\foo\bar\", "") + fileparse("C:\foo\bar\baz"); + + # On Unix returns ("", "/foo/bar/baz/", "") + fileparse("/foo/bar/baz/"); + +If @suffixes are given each element is a pattern (either a string or a +C<qr//>) matched against the end of the $filename. The matching +portion is removed and becomes the $suffix. + + # On Unix returns ("baz", "/foo/bar", ".txt") + fileparse("/foo/bar/baz", qr/\.[^.]*/); + +If type is non-Unix (see C<fileparse_set_fstype()>) then the pattern +matching for suffix removal is performed case-insensitively, since +those systems are not case-sensitive when opening existing files. + +You are guaranteed that C<$directories . $filename . $suffix> will +denote the same location as the original $path. + +=cut + + +sub fileparse { + my($fullname,@suffices) = @_; + + unless (defined $fullname) { + require Carp; + Carp::croak("fileparse(): need a valid pathname"); + } + + my $orig_type = ''; + my($type,$igncase) = ($Fileparse_fstype, $Fileparse_igncase); + + my($taint) = substr($fullname,0,0); # Is $fullname tainted? + + if ($type eq "VMS" and $fullname =~ m{/} ) { + # We're doing Unix emulation + $orig_type = $type; + $type = 'Unix'; + } + + my($dirpath, $basename); + + if (grep { $type eq $_ } qw(MSDOS DOS MSWin32 Epoc)) { + ($dirpath,$basename) = ($fullname =~ /^((?:.*[:\\\/])?)(.*)/s); + $dirpath .= '.\\' unless $dirpath =~ /[\\\/]\z/; + } + elsif ($type eq "OS2") { + ($dirpath,$basename) = ($fullname =~ m#^((?:.*[:\\/])?)(.*)#s); + $dirpath = './' unless $dirpath; # Can't be 0 + $dirpath .= '/' unless $dirpath =~ m#[\\/]\z#; + } + elsif ($type eq "MacOS") { + ($dirpath,$basename) = ($fullname =~ /^(.*:)?(.*)/s); + $dirpath = ':' unless $dirpath; + } + elsif ($type eq "AmigaOS") { + ($dirpath,$basename) = ($fullname =~ /(.*[:\/])?(.*)/s); + $dirpath = './' unless $dirpath; + } + elsif ($type eq 'VMS' ) { + ($dirpath,$basename) = ($fullname =~ /^(.*[:>\]])?(.*)/s); + $dirpath ||= ''; # should always be defined + } + else { # Default to Unix semantics. + ($dirpath,$basename) = ($fullname =~ m#^(.*/)?(.*)#s); + if ($orig_type eq 'VMS' and $fullname =~ m:^(/[^/]+/000000(/|$))(.*):) { + # dev:[000000] is top of VMS tree, similar to Unix '/' + # so strip it off and treat the rest as "normal" + my $devspec = $1; + my $remainder = $3; + ($dirpath,$basename) = ($remainder =~ m#^(.*/)?(.*)#s); + $dirpath ||= ''; # should always be defined + $dirpath = $devspec.$dirpath; + } + $dirpath = './' unless $dirpath; + } + + + my $tail = ''; + my $suffix = ''; + if (@suffices) { + foreach $suffix (@suffices) { + my $pat = ($igncase ? '(?i)' : '') . "($suffix)\$"; + if ($basename =~ s/$pat//s) { + $taint .= substr($suffix,0,0); + $tail = $1 . $tail; + } + } + } + + # Ensure taint is propgated from the path to its pieces. + $tail .= $taint; + wantarray ? ($basename .= $taint, $dirpath .= $taint, $tail) + : ($basename .= $taint); +} + + + +=item C<basename> + + my $filename = basename($path); + my $filename = basename($path, @suffixes); + +This function is provided for compatibility with the Unix shell command +C<basename(1)>. It does B<NOT> always return the file name portion of a +path as you might expect. To be safe, if you want the file name portion of +a path use C<fileparse()>. + +C<basename()> returns the last level of a filepath even if the last +level is clearly directory. In effect, it is acting like C<pop()> for +paths. This differs from C<fileparse()>'s behaviour. + + # Both return "bar" + basename("/foo/bar"); + basename("/foo/bar/"); + +@suffixes work as in C<fileparse()> except all regex metacharacters are +quoted. + + # These two function calls are equivalent. + my $filename = basename("/foo/bar/baz.txt", ".txt"); + my $filename = fileparse("/foo/bar/baz.txt", qr/\Q.txt\E/); + +Also note that in order to be compatible with the shell command, +C<basename()> does not strip off a suffix if it is identical to the +remaining characters in the filename. + +=cut + + +sub basename { + my($path) = shift; + + # From BSD basename(1) + # The basename utility deletes any prefix ending with the last slash `/' + # character present in string (after first stripping trailing slashes) + _strip_trailing_sep($path); + + my($basename, $dirname, $suffix) = fileparse( $path, map("\Q$_\E",@_) ); + + # From BSD basename(1) + # The suffix is not stripped if it is identical to the remaining + # characters in string. + if( length $suffix and !length $basename ) { + $basename = $suffix; + } + + # Ensure that basename '/' == '/' + if( !length $basename ) { + $basename = $dirname; + } + + return $basename; +} + + + +=item C<dirname> + +This function is provided for compatibility with the Unix shell +command C<dirname(1)> and has inherited some of its quirks. In spite of +its name it does B<NOT> always return the directory name as you might +expect. To be safe, if you want the directory name of a path use +C<fileparse()>. + +Only on VMS (where there is no ambiguity between the file and directory +portions of a path) and AmigaOS (possibly due to an implementation quirk in +this module) does C<dirname()> work like C<fileparse($path)>, returning just the +$directories. + + # On VMS and AmigaOS + my $directories = dirname($path); + +When using Unix or MSDOS syntax this emulates the C<dirname(1)> shell function +which is subtly different from how C<fileparse()> works. It returns all but +the last level of a file path even if the last level is clearly a directory. +In effect, it is not returning the directory portion but simply the path one +level up acting like C<chop()> for file paths. + +Also unlike C<fileparse()>, C<dirname()> does not include a trailing slash on +its returned path. + + # returns /foo/bar. fileparse() would return /foo/bar/ + dirname("/foo/bar/baz"); + + # also returns /foo/bar despite the fact that baz is clearly a + # directory. fileparse() would return /foo/bar/baz/ + dirname("/foo/bar/baz/"); + + # returns '.'. fileparse() would return 'foo/' + dirname("foo/"); + +Under VMS, if there is no directory information in the $path, then the +current default device and directory is used. + +=cut + + +sub dirname { + my $path = shift; + + my($type) = $Fileparse_fstype; + + if( $type eq 'VMS' and $path =~ m{/} ) { + # Parse as Unix + local($File::Basename::Fileparse_fstype) = ''; + return dirname($path); + } + + my($basename, $dirname) = fileparse($path); + + if ($type eq 'VMS') { + $dirname ||= $ENV{DEFAULT}; + } + elsif ($type eq 'MacOS') { + if( !length($basename) && $dirname !~ /^[^:]+:\z/) { + _strip_trailing_sep($dirname); + ($basename,$dirname) = fileparse $dirname; + } + $dirname .= ":" unless $dirname =~ /:\z/; + } + elsif (grep { $type eq $_ } qw(MSDOS DOS MSWin32 OS2)) { + _strip_trailing_sep($dirname); + unless( length($basename) ) { + ($basename,$dirname) = fileparse $dirname; + _strip_trailing_sep($dirname); + } + } + elsif ($type eq 'AmigaOS') { + if ( $dirname =~ /:\z/) { return $dirname } + chop $dirname; + $dirname =~ s#[^:/]+\z## unless length($basename); + } + else { + _strip_trailing_sep($dirname); + unless( length($basename) ) { + ($basename,$dirname) = fileparse $dirname; + _strip_trailing_sep($dirname); + } + } + + $dirname; +} + + +# Strip the trailing path separator. +sub _strip_trailing_sep { + my $type = $Fileparse_fstype; + + if ($type eq 'MacOS') { + $_[0] =~ s/([^:]):\z/$1/s; + } + elsif (grep { $type eq $_ } qw(MSDOS DOS MSWin32 OS2)) { + $_[0] =~ s/([^:])[\\\/]*\z/$1/; + } + else { + $_[0] =~ s{(.)/*\z}{$1}s; + } +} + + +=item C<fileparse_set_fstype> + + my $type = fileparse_set_fstype(); + my $previous_type = fileparse_set_fstype($type); + +Normally File::Basename will assume a file path type native to your current +operating system (ie. /foo/bar style on Unix, \foo\bar on Windows, etc...). +With this function you can override that assumption. + +Valid $types are "MacOS", "VMS", "AmigaOS", "OS2", "RISCOS", +"MSWin32", "DOS" (also "MSDOS" for backwards bug compatibility), +"Epoc" and "Unix" (all case-insensitive). If an unrecognized $type is +given "Unix" will be assumed. + +If you've selected VMS syntax, and the file specification you pass to +one of these routines contains a "/", they assume you are using Unix +emulation and apply the Unix syntax rules instead, for that function +call only. + +=back + +=cut + + +BEGIN { + +my @Ignore_Case = qw(MacOS VMS AmigaOS OS2 RISCOS MSWin32 MSDOS DOS Epoc); +my @Types = (@Ignore_Case, qw(Unix)); + +sub fileparse_set_fstype { + my $old = $Fileparse_fstype; + + if (@_) { + my $new_type = shift; + + $Fileparse_fstype = 'Unix'; # default + foreach my $type (@Types) { + $Fileparse_fstype = $type if $new_type =~ /^$type/i; + } + + $Fileparse_igncase = + (grep $Fileparse_fstype eq $_, @Ignore_Case) ? 1 : 0; + } + + return $old; +} + +} + + +1; + + +=head1 SEE ALSO + +L<dirname(1)>, L<basename(1)>, L<File::Spec> diff --git a/Master/tlpkg/tlperl.old/lib/File/CheckTree.pm b/Master/tlpkg/tlperl.old/lib/File/CheckTree.pm new file mode 100644 index 00000000000..20ffd68124d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/CheckTree.pm @@ -0,0 +1,229 @@ +package File::CheckTree; + +use 5.006; +use Cwd; +use Exporter; +use File::Spec; +use warnings; +use strict; + +our $VERSION = '4.3'; +our @ISA = qw(Exporter); +our @EXPORT = qw(validate); + +=head1 NAME + +validate - run many filetest checks on a tree + +=head1 SYNOPSIS + + use File::CheckTree; + + $num_warnings = validate( q{ + /vmunix -e || die + /boot -e || die + /bin cd + csh -ex + csh !-ug + sh -ex + sh !-ug + /usr -d || warn "What happened to $file?\n" + }); + +=head1 DESCRIPTION + +The validate() routine takes a single multiline string consisting of +directives, each containing a filename plus a file test to try on it. +(The file test may also be a "cd", causing subsequent relative filenames +to be interpreted relative to that directory.) After the file test +you may put C<|| die> to make it a fatal error if the file test fails. +The default is C<|| warn>. The file test may optionally have a "!' prepended +to test for the opposite condition. If you do a cd and then list some +relative filenames, you may want to indent them slightly for readability. +If you supply your own die() or warn() message, you can use $file to +interpolate the filename. + +Filetests may be bunched: "-rwx" tests for all of C<-r>, C<-w>, and C<-x>. +Only the first failed test of the bunch will produce a warning. + +The routine returns the number of warnings issued. + +=head1 AUTHOR + +File::CheckTree was derived from lib/validate.pl which was +written by Larry Wall. +Revised by Paul Grassie <F<grassie@perl.com>> in 2002. + +=head1 HISTORY + +File::CheckTree used to not display fatal error messages. +It used to count only those warnings produced by a generic C<|| warn> +(and not those in which the user supplied the message). In addition, +the validate() routine would leave the user program in whatever +directory was last entered through the use of "cd" directives. +These bugs were fixed during the development of perl 5.8. +The first fixed version of File::CheckTree was 4.2. + +=cut + +my $Warnings; + +sub validate { + my ($starting_dir, $file, $test, $cwd, $oldwarnings); + + $starting_dir = cwd; + + $cwd = ""; + $Warnings = 0; + + foreach my $check (split /\n/, $_[0]) { + my ($testlist, @testlist); + + # skip blanks/comments + next if $check =~ /^\s*#/ || $check =~ /^\s*$/; + + # Todo: + # should probably check for invalid directives and die + # but earlier versions of File::CheckTree did not do this either + + # split a line like "/foo -r || die" + # so that $file is "/foo", $test is "-rwx || die" + ($file, $test) = split(' ', $check, 2); # special whitespace split + + # change a $test like "!-ug || die" to "!-Z || die", + # capturing the bundled tests (e.g. "ug") in $2 + if ($test =~ s/ ^ (!?-) (\w{2,}) \b /$1Z/x) { + $testlist = $2; + # split bundled tests, e.g. "ug" to 'u', 'g' + @testlist = split(//, $testlist); + } + else { + # put in placeholder Z for stand-alone test + @testlist = ('Z'); + } + + # will compare these two later to stop on 1st warning w/in a bundle + $oldwarnings = $Warnings; + + foreach my $one (@testlist) { + # examples of $test: "!-Z || die" or "-w || warn" + my $this = $test; + + # expand relative $file to full pathname if preceded by cd directive + $file = File::Spec->catfile($cwd, $file) + if $cwd && !File::Spec->file_name_is_absolute($file); + + # put filename in after the test operator + $this =~ s/(-\w\b)/$1 "\$file"/g; + + # change the "-Z" representing a bundle with the $one test + $this =~ s/-Z/-$one/; + + # if it's a "cd" directive... + if ($this =~ /^cd\b/) { + # add "|| die ..." + $this .= ' || die "cannot cd to $file\n"'; + # expand "cd" directive with directory name + $this =~ s/\bcd\b/chdir(\$cwd = '$file')/; + } + else { + # add "|| warn" as a default disposition + $this .= ' || warn' unless $this =~ /\|\|/; + + # change a generic ".. || die" or ".. || warn" + # to call valmess instead of die/warn directly + # valmess will look up the error message from %Val_Message + $this =~ s/ ^ ( (\S+) \s+ \S+ ) \s* \|\| \s* (die|warn) \s* $ + /$1 || valmess('$3', '$2', \$file)/x; + } + + { + # count warnings, either from valmess or '-r || warn "my msg"' + # also, call any pre-existing signal handler for __WARN__ + my $orig_sigwarn = $SIG{__WARN__}; + local $SIG{__WARN__} = sub { + ++$Warnings; + if ( $orig_sigwarn ) { + $orig_sigwarn->(@_); + } + else { + warn "@_"; + } + }; + + # do the test + eval $this; + + # re-raise an exception caused by a "... || die" test + if ($@) { + # in case of any cd directives, return from whence we came + if ($starting_dir ne cwd) { + chdir($starting_dir) || die "$starting_dir: $!"; + } + die $@ if $@; + } + } + + # stop on 1st warning within a bundle of tests + last if $Warnings > $oldwarnings; + } + } + + # in case of any cd directives, return from whence we came + if ($starting_dir ne cwd) { + chdir($starting_dir) || die "chdir $starting_dir: $!"; + } + + return $Warnings; +} + +my %Val_Message = ( + 'r' => "is not readable by uid $>.", + 'w' => "is not writable by uid $>.", + 'x' => "is not executable by uid $>.", + 'o' => "is not owned by uid $>.", + 'R' => "is not readable by you.", + 'W' => "is not writable by you.", + 'X' => "is not executable by you.", + 'O' => "is not owned by you.", + 'e' => "does not exist.", + 'z' => "does not have zero size.", + 's' => "does not have non-zero size.", + 'f' => "is not a plain file.", + 'd' => "is not a directory.", + 'l' => "is not a symbolic link.", + 'p' => "is not a named pipe (FIFO).", + 'S' => "is not a socket.", + 'b' => "is not a block special file.", + 'c' => "is not a character special file.", + 'u' => "does not have the setuid bit set.", + 'g' => "does not have the setgid bit set.", + 'k' => "does not have the sticky bit set.", + 'T' => "is not a text file.", + 'B' => "is not a binary file." +); + +sub valmess { + my ($disposition, $test, $file) = @_; + my $ferror; + + if ($test =~ / ^ (!?) -(\w) \s* $ /x) { + my ($neg, $ftype) = ($1, $2); + + $ferror = "$file $Val_Message{$ftype}"; + + if ($neg eq '!') { + $ferror =~ s/ is not / should not be / || + $ferror =~ s/ does not / should not / || + $ferror =~ s/ not / /; + } + } + else { + $ferror = "Can't do $test $file.\n"; + } + + die "$ferror\n" if $disposition eq 'die'; + warn "$ferror\n"; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/File/Compare.pm b/Master/tlpkg/tlperl.old/lib/File/Compare.pm new file mode 100644 index 00000000000..0b73d7c7657 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/Compare.pm @@ -0,0 +1,178 @@ +package File::Compare; + +use 5.006; +use strict; +use warnings; +our($VERSION, @ISA, @EXPORT, @EXPORT_OK, $Too_Big); + +require Exporter; +use Carp; + +$VERSION = '1.1003'; +@ISA = qw(Exporter); +@EXPORT = qw(compare); +@EXPORT_OK = qw(cmp compare_text); + +$Too_Big = 1024 * 1024 * 2; + +sub compare { + croak("Usage: compare( file1, file2 [, buffersize]) ") + unless(@_ == 2 || @_ == 3); + + my ($from,$to,$size) = @_; + my $text_mode = defined($size) && (ref($size) eq 'CODE' || $size < 0); + + my ($fromsize,$closefrom,$closeto); + local (*FROM, *TO); + + croak("from undefined") unless (defined $from); + croak("to undefined") unless (defined $to); + + if (ref($from) && + (UNIVERSAL::isa($from,'GLOB') || UNIVERSAL::isa($from,'IO::Handle'))) { + *FROM = *$from; + } elsif (ref(\$from) eq 'GLOB') { + *FROM = $from; + } else { + open(FROM,"<$from") or goto fail_open1; + unless ($text_mode) { + binmode FROM; + $fromsize = -s FROM; + } + $closefrom = 1; + } + + if (ref($to) && + (UNIVERSAL::isa($to,'GLOB') || UNIVERSAL::isa($to,'IO::Handle'))) { + *TO = *$to; + } elsif (ref(\$to) eq 'GLOB') { + *TO = $to; + } else { + open(TO,"<$to") or goto fail_open2; + binmode TO unless $text_mode; + $closeto = 1; + } + + if (!$text_mode && $closefrom && $closeto) { + # If both are opened files we know they differ if their size differ + goto fail_inner if $fromsize != -s TO; + } + + if ($text_mode) { + local $/ = "\n"; + my ($fline,$tline); + while (defined($fline = <FROM>)) { + goto fail_inner unless defined($tline = <TO>); + if (ref $size) { + # $size contains ref to comparison function + goto fail_inner if &$size($fline, $tline); + } else { + goto fail_inner if $fline ne $tline; + } + } + goto fail_inner if defined($tline = <TO>); + } + else { + unless (defined($size) && $size > 0) { + $size = $fromsize || -s TO || 0; + $size = 1024 if $size < 512; + $size = $Too_Big if $size > $Too_Big; + } + + my ($fr,$tr,$fbuf,$tbuf); + $fbuf = $tbuf = ''; + while(defined($fr = read(FROM,$fbuf,$size)) && $fr > 0) { + unless (defined($tr = read(TO,$tbuf,$fr)) && $tbuf eq $fbuf) { + goto fail_inner; + } + } + goto fail_inner if defined($tr = read(TO,$tbuf,$size)) && $tr > 0; + } + + close(TO) || goto fail_open2 if $closeto; + close(FROM) || goto fail_open1 if $closefrom; + + return 0; + + # All of these contortions try to preserve error messages... + fail_inner: + close(TO) || goto fail_open2 if $closeto; + close(FROM) || goto fail_open1 if $closefrom; + + return 1; + + fail_open2: + if ($closefrom) { + my $status = $!; + $! = 0; + close FROM; + $! = $status unless $!; + } + fail_open1: + return -1; +} + +sub cmp; +*cmp = \&compare; + +sub compare_text { + my ($from,$to,$cmp) = @_; + croak("Usage: compare_text( file1, file2 [, cmp-function])") + unless @_ == 2 || @_ == 3; + croak("Third arg to compare_text() function must be a code reference") + if @_ == 3 && ref($cmp) ne 'CODE'; + + # Using a negative buffer size puts compare into text_mode too + $cmp = -1 unless defined $cmp; + compare($from, $to, $cmp); +} + +1; + +__END__ + +=head1 NAME + +File::Compare - Compare files or filehandles + +=head1 SYNOPSIS + + use File::Compare; + + if (compare("file1","file2") == 0) { + print "They're equal\n"; + } + +=head1 DESCRIPTION + +The File::Compare::compare function compares the contents of two +sources, each of which can be a file or a file handle. It is exported +from File::Compare by default. + +File::Compare::cmp is a synonym for File::Compare::compare. It is +exported from File::Compare only by request. + +File::Compare::compare_text does a line by line comparison of the two +files. It stops as soon as a difference is detected. compare_text() +accepts an optional third argument: This must be a CODE reference to +a line comparison function, which returns 0 when both lines are considered +equal. For example: + + compare_text($file1, $file2) + +is basically equivalent to + + compare_text($file1, $file2, sub {$_[0] ne $_[1]} ) + +=head1 RETURN + +File::Compare::compare and its sibling functions return 0 if the files +are equal, 1 if the files are unequal, or -1 if an error was encountered. + +=head1 AUTHOR + +File::Compare was written by Nick Ing-Simmons. +Its original documentation was written by Chip Salzenberg. + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/File/Copy.pm b/Master/tlpkg/tlperl.old/lib/File/Copy.pm new file mode 100644 index 00000000000..52ba7c6d81a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/Copy.pm @@ -0,0 +1,459 @@ +# File/Copy.pm. Written in 1994 by Aaron Sherman <ajs@ajs.com>. This +# source code has been placed in the public domain by the author. +# Please be kind and preserve the documentation. +# +# Additions copyright 1996 by Charles Bailey. Permission is granted +# to distribute the revised code under the same terms as Perl itself. + +package File::Copy; + +use 5.006; +use strict; +use warnings; +use Carp; +use File::Spec; +use Config; +our(@ISA, @EXPORT, @EXPORT_OK, $VERSION, $Too_Big, $Syscopy_is_copy); +sub copy; +sub syscopy; +sub cp; +sub mv; + +# Note that this module implements only *part* of the API defined by +# the File/Copy.pm module of the File-Tools-2.0 package. However, that +# package has not yet been updated to work with Perl 5.004, and so it +# would be a Bad Thing for the CPAN module to grab it and replace this +# module. Therefore, we set this module's version higher than 2.0. +$VERSION = '2.09'; + +require Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(copy move); +@EXPORT_OK = qw(cp mv); + +$Too_Big = 1024 * 1024 * 2; + +my $macfiles; +if ($^O eq 'MacOS') { + $macfiles = eval { require Mac::MoreFiles }; + warn 'Mac::MoreFiles could not be loaded; using non-native syscopy' + if $@ && $^W; +} + +sub _catname { + my($from, $to) = @_; + if (not defined &basename) { + require File::Basename; + import File::Basename 'basename'; + } + + if ($^O eq 'MacOS') { + # a partial dir name that's valid only in the cwd (e.g. 'tmp') + $to = ':' . $to if $to !~ /:/; + } + + return File::Spec->catfile($to, basename($from)); +} + +sub copy { + croak("Usage: copy(FROM, TO [, BUFFERSIZE]) ") + unless(@_ == 2 || @_ == 3); + + my $from = shift; + my $to = shift; + + my $from_a_handle = (ref($from) + ? (ref($from) eq 'GLOB' + || UNIVERSAL::isa($from, 'GLOB') + || UNIVERSAL::isa($from, 'IO::Handle')) + : (ref(\$from) eq 'GLOB')); + my $to_a_handle = (ref($to) + ? (ref($to) eq 'GLOB' + || UNIVERSAL::isa($to, 'GLOB') + || UNIVERSAL::isa($to, 'IO::Handle')) + : (ref(\$to) eq 'GLOB')); + + if ($from eq $to) { # works for references, too + carp("'$from' and '$to' are identical (not copied)"); + # The "copy" was a success as the source and destination contain + # the same data. + return 1; + } + + if ((($Config{d_symlink} && $Config{d_readlink}) || $Config{d_link}) && + !($^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'vms')) { + my @fs = stat($from); + if (@fs) { + my @ts = stat($to); + if (@ts && $fs[0] == $ts[0] && $fs[1] == $ts[1]) { + carp("'$from' and '$to' are identical (not copied)"); + return 0; + } + } + } + + if (!$from_a_handle && !$to_a_handle && -d $to && ! -d $from) { + $to = _catname($from, $to); + } + + if (defined &syscopy && !$Syscopy_is_copy + && !$to_a_handle + && !($from_a_handle && $^O eq 'os2' ) # OS/2 cannot handle handles + && !($from_a_handle && $^O eq 'mpeix') # and neither can MPE/iX. + && !($from_a_handle && $^O eq 'MSWin32') + && !($from_a_handle && $^O eq 'MacOS') + && !($from_a_handle && $^O eq 'NetWare') + ) + { + return syscopy($from, $to); + } + + my $closefrom = 0; + my $closeto = 0; + my ($size, $status, $r, $buf); + local($\) = ''; + + my $from_h; + if ($from_a_handle) { + $from_h = $from; + } else { + $from = _protect($from) if $from =~ /^\s/s; + $from_h = \do { local *FH }; + open($from_h, "< $from\0") or goto fail_open1; + binmode $from_h or die "($!,$^E)"; + $closefrom = 1; + } + + my $to_h; + if ($to_a_handle) { + $to_h = $to; + } else { + $to = _protect($to) if $to =~ /^\s/s; + $to_h = \do { local *FH }; + open($to_h,"> $to\0") or goto fail_open2; + binmode $to_h or die "($!,$^E)"; + $closeto = 1; + } + + if (@_) { + $size = shift(@_) + 0; + croak("Bad buffer size for copy: $size\n") unless ($size > 0); + } else { + $size = tied(*$from_h) ? 0 : -s $from_h || 0; + $size = 1024 if ($size < 512); + $size = $Too_Big if ($size > $Too_Big); + } + + $! = 0; + for (;;) { + my ($r, $w, $t); + defined($r = sysread($from_h, $buf, $size)) + or goto fail_inner; + last unless $r; + for ($w = 0; $w < $r; $w += $t) { + $t = syswrite($to_h, $buf, $r - $w, $w) + or goto fail_inner; + } + } + + close($to_h) || goto fail_open2 if $closeto; + close($from_h) || goto fail_open1 if $closefrom; + + # Use this idiom to avoid uninitialized value warning. + return 1; + + # All of these contortions try to preserve error messages... + fail_inner: + if ($closeto) { + $status = $!; + $! = 0; + close $to_h; + $! = $status unless $!; + } + fail_open2: + if ($closefrom) { + $status = $!; + $! = 0; + close $from_h; + $! = $status unless $!; + } + fail_open1: + return 0; +} + +sub move { + croak("Usage: move(FROM, TO) ") unless @_ == 2; + + my($from,$to) = @_; + + my($fromsz,$tosz1,$tomt1,$tosz2,$tomt2,$sts,$ossts); + + if (-d $to && ! -d $from) { + $to = _catname($from, $to); + } + + ($tosz1,$tomt1) = (stat($to))[7,9]; + $fromsz = -s $from; + if ($^O eq 'os2' and defined $tosz1 and defined $fromsz) { + # will not rename with overwrite + unlink $to; + } + return 1 if rename $from, $to; + + # Did rename return an error even though it succeeded, because $to + # is on a remote NFS file system, and NFS lost the server's ack? + return 1 if defined($fromsz) && !-e $from && # $from disappeared + (($tosz2,$tomt2) = (stat($to))[7,9]) && # $to's there + ($tosz1 != $tosz2 or $tomt1 != $tomt2) && # and changed + $tosz2 == $fromsz; # it's all there + + ($tosz1,$tomt1) = (stat($to))[7,9]; # just in case rename did something + + { + local $@; + eval { + local $SIG{__DIE__}; + copy($from,$to) or die; + my($atime, $mtime) = (stat($from))[8,9]; + utime($atime, $mtime, $to); + unlink($from) or die; + }; + return 1 unless $@; + } + ($sts,$ossts) = ($! + 0, $^E + 0); + + ($tosz2,$tomt2) = ((stat($to))[7,9],0,0) if defined $tomt1; + unlink($to) if !defined($tomt1) or $tomt1 != $tomt2 or $tosz1 != $tosz2; + ($!,$^E) = ($sts,$ossts); + return 0; +} + +*cp = \© +*mv = \&move; + + +if ($^O eq 'MacOS') { + *_protect = sub { MacPerl::MakeFSSpec($_[0]) }; +} else { + *_protect = sub { "./$_[0]" }; +} + +# &syscopy is an XSUB under OS/2 +unless (defined &syscopy) { + if ($^O eq 'VMS') { + *syscopy = \&rmscopy; + } elsif ($^O eq 'mpeix') { + *syscopy = sub { + return 0 unless @_ == 2; + # Use the MPE cp program in order to + # preserve MPE file attributes. + return system('/bin/cp', '-f', $_[0], $_[1]) == 0; + }; + } elsif ($^O eq 'MSWin32') { + *syscopy = sub { + return 0 unless @_ == 2; + return Win32::CopyFile(@_, 1); + }; + } elsif ($macfiles) { + *syscopy = sub { + my($from, $to) = @_; + my($dir, $toname); + + return 0 unless -e $from; + + if ($to =~ /(.*:)([^:]+):?$/) { + ($dir, $toname) = ($1, $2); + } else { + ($dir, $toname) = (":", $to); + } + + unlink($to); + Mac::MoreFiles::FSpFileCopy($from, $dir, $toname, 1); + }; + } else { + $Syscopy_is_copy = 1; + *syscopy = \© + } +} + +1; + +__END__ + +=head1 NAME + +File::Copy - Copy files or filehandles + +=head1 SYNOPSIS + + use File::Copy; + + copy("file1","file2") or die "Copy failed: $!"; + copy("Copy.pm",\*STDOUT); + move("/dev1/fileA","/dev2/fileB"); + + use File::Copy "cp"; + + $n = FileHandle->new("/a/file","r"); + cp($n,"x"); + +=head1 DESCRIPTION + +The File::Copy module provides two basic functions, C<copy> and +C<move>, which are useful for getting the contents of a file from +one place to another. + +=over 4 + +=item * + +The C<copy> function takes two +parameters: a file to copy from and a file to copy to. Either +argument may be a string, a FileHandle reference or a FileHandle +glob. Obviously, if the first argument is a filehandle of some +sort, it will be read from, and if it is a file I<name> it will +be opened for reading. Likewise, the second argument will be +written to (and created if need be). Trying to copy a file on top +of itself is a fatal error. + +B<Note that passing in +files as handles instead of names may lead to loss of information +on some operating systems; it is recommended that you use file +names whenever possible.> Files are opened in binary mode where +applicable. To get a consistent behaviour when copying from a +filehandle to a file, use C<binmode> on the filehandle. + +An optional third parameter can be used to specify the buffer +size used for copying. This is the number of bytes from the +first file, that wil be held in memory at any given time, before +being written to the second file. The default buffer size depends +upon the file, but will generally be the whole file (up to 2Mb), or +1k for filehandles that do not reference files (eg. sockets). + +You may use the syntax C<use File::Copy "cp"> to get at the +"cp" alias for this function. The syntax is I<exactly> the same. + +=item * + +The C<move> function also takes two parameters: the current name +and the intended name of the file to be moved. If the destination +already exists and is a directory, and the source is not a +directory, then the source file will be renamed into the directory +specified by the destination. + +If possible, move() will simply rename the file. Otherwise, it copies +the file to the new location and deletes the original. If an error occurs +during this copy-and-delete process, you may be left with a (possibly partial) +copy of the file under the destination name. + +You may use the "mv" alias for this function in the same way that +you may use the "cp" alias for C<copy>. + +=back + +File::Copy also provides the C<syscopy> routine, which copies the +file specified in the first parameter to the file specified in the +second parameter, preserving OS-specific attributes and file +structure. For Unix systems, this is equivalent to the simple +C<copy> routine, which doesn't preserve OS-specific attributes. For +VMS systems, this calls the C<rmscopy> routine (see below). For OS/2 +systems, this calls the C<syscopy> XSUB directly. For Win32 systems, +this calls C<Win32::CopyFile>. + +On Mac OS (Classic), C<syscopy> calls C<Mac::MoreFiles::FSpFileCopy>, +if available. + +=head2 Special behaviour if C<syscopy> is defined (OS/2, VMS and Win32) + +If both arguments to C<copy> are not file handles, +then C<copy> will perform a "system copy" of +the input file to a new output file, in order to preserve file +attributes, indexed file structure, I<etc.> The buffer size +parameter is ignored. If either argument to C<copy> is a +handle to an opened file, then data is copied using Perl +operators, and no effort is made to preserve file attributes +or record structure. + +The system copy routine may also be called directly under VMS and OS/2 +as C<File::Copy::syscopy> (or under VMS as C<File::Copy::rmscopy>, which +is the routine that does the actual work for syscopy). + +=over 4 + +=item rmscopy($from,$to[,$date_flag]) + +The first and second arguments may be strings, typeglobs, typeglob +references, or objects inheriting from IO::Handle; +they are used in all cases to obtain the +I<filespec> of the input and output files, respectively. The +name and type of the input file are used as defaults for the +output file, if necessary. + +A new version of the output file is always created, which +inherits the structure and RMS attributes of the input file, +except for owner and protections (and possibly timestamps; +see below). All data from the input file is copied to the +output file; if either of the first two parameters to C<rmscopy> +is a file handle, its position is unchanged. (Note that this +means a file handle pointing to the output file will be +associated with an old version of that file after C<rmscopy> +returns, not the newly created version.) + +The third parameter is an integer flag, which tells C<rmscopy> +how to handle timestamps. If it is E<lt> 0, none of the input file's +timestamps are propagated to the output file. If it is E<gt> 0, then +it is interpreted as a bitmask: if bit 0 (the LSB) is set, then +timestamps other than the revision date are propagated; if bit 1 +is set, the revision date is propagated. If the third parameter +to C<rmscopy> is 0, then it behaves much like the DCL COPY command: +if the name or type of the output file was explicitly specified, +then no timestamps are propagated, but if they were taken implicitly +from the input filespec, then all timestamps other than the +revision date are propagated. If this parameter is not supplied, +it defaults to 0. + +Like C<copy>, C<rmscopy> returns 1 on success. If an error occurs, +it sets C<$!>, deletes the output file, and returns 0. + +=back + +=head1 RETURN + +All functions return 1 on success, 0 on failure. +$! will be set if an error was encountered. + +=head1 NOTES + +=over 4 + +=item * + +On Mac OS (Classic), the path separator is ':', not '/', and the +current directory is denoted as ':', not '.'. You should be careful +about specifying relative pathnames. While a full path always begins +with a volume name, a relative pathname should always begin with a +':'. If specifying a volume name only, a trailing ':' is required. + +E.g. + + copy("file1", "tmp"); # creates the file 'tmp' in the current directory + copy("file1", ":tmp:"); # creates :tmp:file1 + copy("file1", ":tmp"); # same as above + copy("file1", "tmp"); # same as above, if 'tmp' is a directory (but don't do + # that, since it may cause confusion, see example #1) + copy("file1", "tmp:file1"); # error, since 'tmp:' is not a volume + copy("file1", ":tmp:file1"); # ok, partial path + copy("file1", "DataHD:"); # creates DataHD:file1 + + move("MacintoshHD:fileA", "DataHD:fileB"); # moves (don't copies) files from one + # volume to another + +=back + +=head1 AUTHOR + +File::Copy was written by Aaron Sherman I<E<lt>ajs@ajs.comE<gt>> in 1995, +and updated by Charles Bailey I<E<lt>bailey@newman.upenn.eduE<gt>> in 1996. + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/File/DosGlob.pm b/Master/tlpkg/tlperl.old/lib/File/DosGlob.pm new file mode 100644 index 00000000000..a1c27d5c32a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/DosGlob.pm @@ -0,0 +1,571 @@ +#!perl -w + +# use strict fails +#Can't use string ("main::glob") as a symbol ref while "strict refs" in use at /usr/lib/perl5/5.005/File/DosGlob.pm line 191. + +# +# Documentation at the __END__ +# + +package File::DosGlob; + +our $VERSION = '1.00'; +use strict; +use warnings; + +sub doglob { + my $cond = shift; + my @retval = (); + #print "doglob: ", join('|', @_), "\n"; + OUTER: + for my $pat (@_) { + my @matched = (); + my @globdirs = (); + my $head = '.'; + my $sepchr = '/'; + my $tail; + next OUTER unless defined $pat and $pat ne ''; + # if arg is within quotes strip em and do no globbing + if ($pat =~ /^"(.*)"\z/s) { + $pat = $1; + if ($cond eq 'd') { push(@retval, $pat) if -d $pat } + else { push(@retval, $pat) if -e $pat } + next OUTER; + } + # wildcards with a drive prefix such as h:*.pm must be changed + # to h:./*.pm to expand correctly + if ($pat =~ m|^([A-Za-z]:)[^/\\]|s) { + substr($_,0,2) = $1 . "./"; + } + if ($pat =~ m|^(.*)([\\/])([^\\/]*)\z|s) { + ($head, $sepchr, $tail) = ($1,$2,$3); + #print "div: |$head|$sepchr|$tail|\n"; + push (@retval, $pat), next OUTER if $tail eq ''; + if ($head =~ /[*?]/) { + @globdirs = doglob('d', $head); + push(@retval, doglob($cond, map {"$_$sepchr$tail"} @globdirs)), + next OUTER if @globdirs; + } + $head .= $sepchr if $head eq '' or $head =~ /^[A-Za-z]:\z/s; + $pat = $tail; + } + # + # If file component has no wildcards, we can avoid opendir + unless ($pat =~ /[*?]/) { + $head = '' if $head eq '.'; + $head .= $sepchr unless $head eq '' or substr($head,-1) eq $sepchr; + $head .= $pat; + if ($cond eq 'd') { push(@retval,$head) if -d $head } + else { push(@retval,$head) if -e $head } + next OUTER; + } + opendir(D, $head) or next OUTER; + my @leaves = readdir D; + closedir D; + $head = '' if $head eq '.'; + $head .= $sepchr unless $head eq '' or substr($head,-1) eq $sepchr; + + # escape regex metachars but not glob chars + $pat =~ s:([].+^\-\${}[|]):\\$1:g; + # and convert DOS-style wildcards to regex + $pat =~ s/\*/.*/g; + $pat =~ s/\?/.?/g; + + #print "regex: '$pat', head: '$head'\n"; + my $matchsub = sub { $_[0] =~ m|^$pat\z|is }; + INNER: + for my $e (@leaves) { + next INNER if $e eq '.' or $e eq '..'; + next INNER if $cond eq 'd' and ! -d "$head$e"; + push(@matched, "$head$e"), next INNER if &$matchsub($e); + # + # [DOS compatibility special case] + # Failed, add a trailing dot and try again, but only + # if name does not have a dot in it *and* pattern + # has a dot *and* name is shorter than 9 chars. + # + if (index($e,'.') == -1 and length($e) < 9 + and index($pat,'\\.') != -1) { + push(@matched, "$head$e"), next INNER if &$matchsub("$e."); + } + } + push @retval, @matched if @matched; + } + return @retval; +} + + +# +# Do DOS-like globbing on Mac OS +# +sub doglob_Mac { + my $cond = shift; + my @retval = (); + + #print "doglob_Mac: ", join('|', @_), "\n"; + OUTER: + for my $arg (@_) { + local $_ = $arg; + my @matched = (); + my @globdirs = (); + my $head = ':'; + my $not_esc_head = $head; + my $sepchr = ':'; + next OUTER unless defined $_ and $_ ne ''; + # if arg is within quotes strip em and do no globbing + if (/^"(.*)"\z/s) { + $_ = $1; + # $_ may contain escaped metachars '\*', '\?' and '\' + my $not_esc_arg = $_; + $not_esc_arg =~ s/\\([*?\\])/$1/g; + if ($cond eq 'd') { push(@retval, $not_esc_arg) if -d $not_esc_arg } + else { push(@retval, $not_esc_arg) if -e $not_esc_arg } + next OUTER; + } + + if (m|^(.*?)(:+)([^:]*)\z|s) { # note: $1 is not greedy + my $tail; + ($head, $sepchr, $tail) = ($1,$2,$3); + #print "div: |$head|$sepchr|$tail|\n"; + push (@retval, $_), next OUTER if $tail eq ''; + # + # $head may contain escaped metachars '\*' and '\?' + + my $tmp_head = $head; + # if a '*' or '?' is preceded by an odd count of '\', temporary delete + # it (and its preceding backslashes), i.e. don't treat '\*' and '\?' as + # wildcards + $tmp_head =~ s/(\\*)([*?])/$2 x ((length($1) + 1) % 2)/eg; + + if ($tmp_head =~ /[*?]/) { # if there are wildcards ... + @globdirs = doglob_Mac('d', $head); + push(@retval, doglob_Mac($cond, map {"$_$sepchr$tail"} @globdirs)), + next OUTER if @globdirs; + } + + $head .= $sepchr; + $not_esc_head = $head; + # unescape $head for file operations + $not_esc_head =~ s/\\([*?\\])/$1/g; + $_ = $tail; + } + # + # If file component has no wildcards, we can avoid opendir + + my $tmp_tail = $_; + # if a '*' or '?' is preceded by an odd count of '\', temporary delete + # it (and its preceding backslashes), i.e. don't treat '\*' and '\?' as + # wildcards + $tmp_tail =~ s/(\\*)([*?])/$2 x ((length($1) + 1) % 2)/eg; + + unless ($tmp_tail =~ /[*?]/) { # if there are wildcards ... + $not_esc_head = $head = '' if $head eq ':'; + my $not_esc_tail = $_; + # unescape $head and $tail for file operations + $not_esc_tail =~ s/\\([*?\\])/$1/g; + $head .= $_; + $not_esc_head .= $not_esc_tail; + if ($cond eq 'd') { push(@retval,$head) if -d $not_esc_head } + else { push(@retval,$head) if -e $not_esc_head } + next OUTER; + } + #print "opendir($not_esc_head)\n"; + opendir(D, $not_esc_head) or next OUTER; + my @leaves = readdir D; + closedir D; + + # escape regex metachars but not '\' and glob chars '*', '?' + $_ =~ s:([].+^\-\${}[|]):\\$1:g; + # and convert DOS-style wildcards to regex, + # but only if they are not escaped + $_ =~ s/(\\*)([*?])/$1 . ('.' x ((length($1) + 1) % 2)) . $2/eg; + + #print "regex: '$_', head: '$head', unescaped head: '$not_esc_head'\n"; + my $matchsub = eval 'sub { $_[0] =~ m|^' . $_ . '\\z|ios }'; + warn($@), next OUTER if $@; + INNER: + for my $e (@leaves) { + next INNER if $e eq '.' or $e eq '..'; + next INNER if $cond eq 'd' and ! -d "$not_esc_head$e"; + + if (&$matchsub($e)) { + my $leave = (($not_esc_head eq ':') && (-f "$not_esc_head$e")) ? + "$e" : "$not_esc_head$e"; + # + # On Mac OS, the two glob metachars '*' and '?' and the escape + # char '\' are valid characters for file and directory names. + # We have to escape and treat them specially. + $leave =~ s|([*?\\])|\\$1|g; + push(@matched, $leave); + next INNER; + } + } + push @retval, @matched if @matched; + } + return @retval; +} + +# +# _expand_volume() will only be used on Mac OS (Classic): +# Takes an array of original patterns as argument and returns an array of +# possibly modified patterns. Each original pattern is processed like +# that: +# + If there's a volume name in the pattern, we push a separate pattern +# for each mounted volume that matches (with '*', '?' and '\' escaped). +# + If there's no volume name in the original pattern, it is pushed +# unchanged. +# Note that the returned array of patterns may be empty. +# +sub _expand_volume { + + require MacPerl; # to be verbose + + my @pat = @_; + my @new_pat = (); + my @FSSpec_Vols = MacPerl::Volumes(); + my @mounted_volumes = (); + + foreach my $spec_vol (@FSSpec_Vols) { + # push all mounted volumes into array + push @mounted_volumes, MacPerl::MakePath($spec_vol); + } + #print "mounted volumes: |@mounted_volumes|\n"; + + while (@pat) { + my $pat = shift @pat; + if ($pat =~ /^([^:]+:)(.*)\z/) { # match a volume name? + my $vol_pat = $1; + my $tail = $2; + # + # escape regex metachars but not '\' and glob chars '*', '?' + $vol_pat =~ s:([].+^\-\${}[|]):\\$1:g; + # and convert DOS-style wildcards to regex, + # but only if they are not escaped + $vol_pat =~ s/(\\*)([*?])/$1 . ('.' x ((length($1) + 1) % 2)) . $2/eg; + #print "volume regex: '$vol_pat' \n"; + + foreach my $volume (@mounted_volumes) { + if ($volume =~ m|^$vol_pat\z|ios) { + # + # On Mac OS, the two glob metachars '*' and '?' and the + # escape char '\' are valid characters for volume names. + # We have to escape and treat them specially. + $volume =~ s|([*?\\])|\\$1|g; + push @new_pat, $volume . $tail; + } + } + } else { # no volume name in pattern, push original pattern + push @new_pat, $pat; + } + } + return @new_pat; +} + + +# +# _preprocess_pattern() will only be used on Mac OS (Classic): +# Resolves any updirs in the pattern. Removes a single trailing colon +# from the pattern, unless it's a volume name pattern like "*HD:" +# +sub _preprocess_pattern { + my @pat = @_; + + foreach my $p (@pat) { + my $proceed; + # resolve any updirs, e.g. "*HD:t?p::a*" -> "*HD:a*" + do { + $proceed = ($p =~ s/^(.*):[^:]+::(.*?)\z/$1:$2/); + } while ($proceed); + # remove a single trailing colon, e.g. ":*:" -> ":*" + $p =~ s/:([^:]+):\z/:$1/; + } + return @pat; +} + + +# +# _un_escape() will only be used on Mac OS (Classic): +# Unescapes a list of arguments which may contain escaped +# metachars '*', '?' and '\'. +# +sub _un_escape { + foreach (@_) { + s/\\([*?\\])/$1/g; + } + return @_; +} + +# +# this can be used to override CORE::glob in a specific +# package by saying C<use File::DosGlob 'glob';> in that +# namespace. +# + +# context (keyed by second cxix arg provided by core) +my %iter; +my %entries; + +sub glob { + my($pat,$cxix) = @_; + my @pat; + + # glob without args defaults to $_ + $pat = $_ unless defined $pat; + + # extract patterns + if ($pat =~ /\s/) { + require Text::ParseWords; + @pat = Text::ParseWords::parse_line('\s+',0,$pat); + } + else { + push @pat, $pat; + } + + # Mike Mestnik: made to do abc{1,2,3} == abc1 abc2 abc3. + # abc3 will be the original {3} (and drop the {}). + # abc1 abc2 will be put in @appendpat. + # This was just the esiest way, not nearly the best. + REHASH: { + my @appendpat = (); + for (@pat) { + # There must be a "," I.E. abc{efg} is not what we want. + while ( /^(.*)(?<!\\)\{(.*?)(?<!\\)\,.*?(?<!\\)\}(.*)$/ ) { + my ($start, $match, $end) = ($1, $2, $3); + #print "Got: \n\t$start\n\t$match\n\t$end\n"; + my $tmp = "$start$match$end"; + while ( $tmp =~ s/^(.*?)(?<!\\)\{(?:.*(?<!\\)\,)?(.*\Q$match\E.*?)(?:(?<!\\)\,.*)?(?<!\\)\}(.*)$/$1$2$3/ ) { + #print "Striped: $tmp\n"; + # these expanshions will be preformed by the original, + # when we call REHASH. + } + push @appendpat, ("$tmp"); + s/^\Q$start\E(?<!\\)\{\Q$match\E(?<!\\)\,/$start\{/; + if ( /^\Q$start\E(?<!\\)\{(?!.*?(?<!\\)\,.*?\Q$end\E$)(.*)(?<!\\)\}\Q$end\E$/ ) { + $match = $1; + #print "GOT: \n\t$start\n\t$match\n\t$end\n\n"; + $_ = "$start$match$end"; + } + } + #print "Sould have "GOT" vs "Got"!\n"; + #FIXME: There should be checking for this. + # How or what should be done about failure is beond me. + } + if ( $#appendpat != -1 + ) { + #print "LOOP\n"; + #FIXME: Max loop, no way! :") + for ( @appendpat ) { + push @pat, $_; + } + goto REHASH; + } + } + for ( @pat ) { + s/\\{/{/g; + s/\\}/}/g; + s/\\,/,/g; + } + #print join ("\n", @pat). "\n"; + + # assume global context if not provided one + $cxix = '_G_' unless defined $cxix; + $iter{$cxix} = 0 unless exists $iter{$cxix}; + + # if we're just beginning, do it all first + if ($iter{$cxix} == 0) { + if ($^O eq 'MacOS') { + # first, take care of updirs and trailing colons + @pat = _preprocess_pattern(@pat); + # expand volume names + @pat = _expand_volume(@pat); + $entries{$cxix} = (@pat) ? [_un_escape( doglob_Mac(1,@pat) )] : [()]; + } else { + $entries{$cxix} = [doglob(1,@pat)]; + } + } + + # chuck it all out, quick or slow + if (wantarray) { + delete $iter{$cxix}; + return @{delete $entries{$cxix}}; + } + else { + if ($iter{$cxix} = scalar @{$entries{$cxix}}) { + return shift @{$entries{$cxix}}; + } + else { + # return undef for EOL + delete $iter{$cxix}; + delete $entries{$cxix}; + return undef; + } + } +} + +{ + no strict 'refs'; + + sub import { + my $pkg = shift; + return unless @_; + my $sym = shift; + my $callpkg = ($sym =~ s/^GLOBAL_//s ? 'CORE::GLOBAL' : caller(0)); + *{$callpkg.'::'.$sym} = \&{$pkg.'::'.$sym} if $sym eq 'glob'; + } +} +1; + +__END__ + +=head1 NAME + +File::DosGlob - DOS like globbing and then some + +=head1 SYNOPSIS + + require 5.004; + + # override CORE::glob in current package + use File::DosGlob 'glob'; + + # override CORE::glob in ALL packages (use with extreme caution!) + use File::DosGlob 'GLOBAL_glob'; + + @perlfiles = glob "..\\pe?l/*.p?"; + print <..\\pe?l/*.p?>; + + # from the command line (overrides only in main::) + > perl -MFile::DosGlob=glob -e "print <../pe*/*p?>" + +=head1 DESCRIPTION + +A module that implements DOS-like globbing with a few enhancements. +It is largely compatible with perlglob.exe (the M$ setargv.obj +version) in all but one respect--it understands wildcards in +directory components. + +For example, C<<..\\l*b\\file/*glob.p?>> will work as expected (in +that it will find something like '..\lib\File/DosGlob.pm' alright). +Note that all path components are case-insensitive, and that +backslashes and forward slashes are both accepted, and preserved. +You may have to double the backslashes if you are putting them in +literally, due to double-quotish parsing of the pattern by perl. + +Spaces in the argument delimit distinct patterns, so +C<glob('*.exe *.dll')> globs all filenames that end in C<.exe> +or C<.dll>. If you want to put in literal spaces in the glob +pattern, you can escape them with either double quotes, or backslashes. +e.g. C<glob('c:/"Program Files"/*/*.dll')>, or +C<glob('c:/Program\ Files/*/*.dll')>. The argument is tokenized using +C<Text::ParseWords::parse_line()>, so see L<Text::ParseWords> for details +of the quoting rules used. + +Extending it to csh patterns is left as an exercise to the reader. + +=head1 NOTES + +=over 4 + +=item * + +Mac OS (Classic) users should note a few differences. The specification +of pathnames in glob patterns adheres to the usual Mac OS conventions: +The path separator is a colon ':', not a slash '/' or backslash '\'. A +full path always begins with a volume name. A relative pathname on Mac +OS must always begin with a ':', except when specifying a file or +directory name in the current working directory, where the leading colon +is optional. If specifying a volume name only, a trailing ':' is +required. Due to these rules, a glob like E<lt>*:E<gt> will find all +mounted volumes, while a glob like E<lt>*E<gt> or E<lt>:*E<gt> will find +all files and directories in the current directory. + +Note that updirs in the glob pattern are resolved before the matching begins, +i.e. a pattern like "*HD:t?p::a*" will be matched as "*HD:a*". Note also, +that a single trailing ':' in the pattern is ignored (unless it's a volume +name pattern like "*HD:"), i.e. a glob like <:*:> will find both directories +I<and> files (and not, as one might expect, only directories). + +The metachars '*', '?' and the escape char '\' are valid characters in +volume, directory and file names on Mac OS. Hence, if you want to match +a '*', '?' or '\' literally, you have to escape these characters. Due to +perl's quoting rules, things may get a bit complicated, when you want to +match a string like '\*' literally, or when you want to match '\' literally, +but treat the immediately following character '*' as metachar. So, here's a +rule of thumb (applies to both single- and double-quoted strings): escape +each '*' or '?' or '\' with a backslash, if you want to treat them literally, +and then double each backslash and your are done. E.g. + +- Match '\*' literally + + escape both '\' and '*' : '\\\*' + double the backslashes : '\\\\\\*' + +(Internally, the glob routine sees a '\\\*', which means that both '\' and +'*' are escaped.) + + +- Match '\' literally, treat '*' as metachar + + escape '\' but not '*' : '\\*' + double the backslashes : '\\\\*' + +(Internally, the glob routine sees a '\\*', which means that '\' is escaped and +'*' is not.) + +Note that you also have to quote literal spaces in the glob pattern, as described +above. + +=back + +=head1 EXPORTS (by request only) + +glob() + +=head1 BUGS + +Should probably be built into the core, and needs to stop +pandering to DOS habits. Needs a dose of optimizium too. + +=head1 AUTHOR + +Gurusamy Sarathy <gsar@activestate.com> + +=head1 HISTORY + +=over 4 + +=item * + +Support for globally overriding glob() (GSAR 3-JUN-98) + +=item * + +Scalar context, independent iterator context fixes (GSAR 15-SEP-97) + +=item * + +A few dir-vs-file optimizations result in glob importation being +10 times faster than using perlglob.exe, and using perlglob.bat is +only twice as slow as perlglob.exe (GSAR 28-MAY-97) + +=item * + +Several cleanups prompted by lack of compatible perlglob.exe +under Borland (GSAR 27-MAY-97) + +=item * + +Initial version (GSAR 20-FEB-97) + +=back + +=head1 SEE ALSO + +perl + +perlglob.bat + +Text::ParseWords + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/File/Find.pm b/Master/tlpkg/tlperl.old/lib/File/Find.pm new file mode 100644 index 00000000000..497051e0635 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/Find.pm @@ -0,0 +1,1275 @@ +package File::Find; +use 5.006; +use strict; +use warnings; +use warnings::register; +our $VERSION = '1.10'; +require Exporter; +require Cwd; + +# +# Modified to ensure sub-directory traversal order is not inverded by stack +# push and pops. That is remains in the same order as in the directory file, +# or user pre-processing (EG:sorted). +# + +=head1 NAME + +File::Find - Traverse a directory tree. + +=head1 SYNOPSIS + + use File::Find; + find(\&wanted, @directories_to_search); + sub wanted { ... } + + use File::Find; + finddepth(\&wanted, @directories_to_search); + sub wanted { ... } + + use File::Find; + find({ wanted => \&process, follow => 1 }, '.'); + +=head1 DESCRIPTION + +These are functions for searching through directory trees doing work +on each file found similar to the Unix I<find> command. File::Find +exports two functions, C<find> and C<finddepth>. They work similarly +but have subtle differences. + +=over 4 + +=item B<find> + + find(\&wanted, @directories); + find(\%options, @directories); + +C<find()> does a depth-first search over the given C<@directories> in +the order they are given. For each file or directory found, it calls +the C<&wanted> subroutine. (See below for details on how to use the +C<&wanted> function). Additionally, for each directory found, it will +C<chdir()> into that directory and continue the search, invoking the +C<&wanted> function on each file or subdirectory in the directory. + +=item B<finddepth> + + finddepth(\&wanted, @directories); + finddepth(\%options, @directories); + +C<finddepth()> works just like C<find()> except that is invokes the +C<&wanted> function for a directory I<after> invoking it for the +directory's contents. It does a postorder traversal instead of a +preorder traversal, working from the bottom of the directory tree up +where C<find()> works from the top of the tree down. + +=back + +=head2 %options + +The first argument to C<find()> is either a code reference to your +C<&wanted> function, or a hash reference describing the operations +to be performed for each file. The +code reference is described in L<The wanted function> below. + +Here are the possible keys for the hash: + +=over 3 + +=item C<wanted> + +The value should be a code reference. This code reference is +described in L<The wanted function> below. + +=item C<bydepth> + +Reports the name of a directory only AFTER all its entries +have been reported. Entry point C<finddepth()> is a shortcut for +specifying C<<{ bydepth => 1 }>> in the first argument of C<find()>. + +=item C<preprocess> + +The value should be a code reference. This code reference is used to +preprocess the current directory. The name of the currently processed +directory is in C<$File::Find::dir>. Your preprocessing function is +called after C<readdir()>, but before the loop that calls the C<wanted()> +function. It is called with a list of strings (actually file/directory +names) and is expected to return a list of strings. The code can be +used to sort the file/directory names alphabetically, numerically, +or to filter out directory entries based on their name alone. When +I<follow> or I<follow_fast> are in effect, C<preprocess> is a no-op. + +=item C<postprocess> + +The value should be a code reference. It is invoked just before leaving +the currently processed directory. It is called in void context with no +arguments. The name of the current directory is in C<$File::Find::dir>. This +hook is handy for summarizing a directory, such as calculating its disk +usage. When I<follow> or I<follow_fast> are in effect, C<postprocess> is a +no-op. + +=item C<follow> + +Causes symbolic links to be followed. Since directory trees with symbolic +links (followed) may contain files more than once and may even have +cycles, a hash has to be built up with an entry for each file. +This might be expensive both in space and time for a large +directory tree. See I<follow_fast> and I<follow_skip> below. +If either I<follow> or I<follow_fast> is in effect: + +=over 6 + +=item * + +It is guaranteed that an I<lstat> has been called before the user's +C<wanted()> function is called. This enables fast file checks involving S<_>. +Note that this guarantee no longer holds if I<follow> or I<follow_fast> +are not set. + +=item * + +There is a variable C<$File::Find::fullname> which holds the absolute +pathname of the file with all symbolic links resolved. If the link is +a dangling symbolic link, then fullname will be set to C<undef>. + +=back + +This is a no-op on Win32. + +=item C<follow_fast> + +This is similar to I<follow> except that it may report some files more +than once. It does detect cycles, however. Since only symbolic links +have to be hashed, this is much cheaper both in space and time. If +processing a file more than once (by the user's C<wanted()> function) +is worse than just taking time, the option I<follow> should be used. + +This is also a no-op on Win32. + +=item C<follow_skip> + +C<follow_skip==1>, which is the default, causes all files which are +neither directories nor symbolic links to be ignored if they are about +to be processed a second time. If a directory or a symbolic link +are about to be processed a second time, File::Find dies. + +C<follow_skip==0> causes File::Find to die if any file is about to be +processed a second time. + +C<follow_skip==2> causes File::Find to ignore any duplicate files and +directories but to proceed normally otherwise. + +=item C<dangling_symlinks> + +If true and a code reference, will be called with the symbolic link +name and the directory it lives in as arguments. Otherwise, if true +and warnings are on, warning "symbolic_link_name is a dangling +symbolic link\n" will be issued. If false, the dangling symbolic link +will be silently ignored. + +=item C<no_chdir> + +Does not C<chdir()> to each directory as it recurses. The C<wanted()> +function will need to be aware of this, of course. In this case, +C<$_> will be the same as C<$File::Find::name>. + +=item C<untaint> + +If find is used in taint-mode (-T command line switch or if EUID != UID +or if EGID != GID) then internally directory names have to be untainted +before they can be chdir'ed to. Therefore they are checked against a regular +expression I<untaint_pattern>. Note that all names passed to the user's +I<wanted()> function are still tainted. If this option is used while +not in taint-mode, C<untaint> is a no-op. + +=item C<untaint_pattern> + +See above. This should be set using the C<qr> quoting operator. +The default is set to C<qr|^([-+@\w./]+)$|>. +Note that the parentheses are vital. + +=item C<untaint_skip> + +If set, a directory which fails the I<untaint_pattern> is skipped, +including all its sub-directories. The default is to 'die' in such a case. + +=back + +=head2 The wanted function + +The C<wanted()> function does whatever verifications you want on +each file and directory. Note that despite its name, the C<wanted()> +function is a generic callback function, and does B<not> tell +File::Find if a file is "wanted" or not. In fact, its return value +is ignored. + +The wanted function takes no arguments but rather does its work +through a collection of variables. + +=over 4 + +=item C<$File::Find::dir> is the current directory name, + +=item C<$_> is the current filename within that directory + +=item C<$File::Find::name> is the complete pathname to the file. + +=back + +Don't modify these variables. + +For example, when examining the file F</some/path/foo.ext> you will have: + + $File::Find::dir = /some/path/ + $_ = foo.ext + $File::Find::name = /some/path/foo.ext + +You are chdir()'d to C<$File::Find::dir> when the function is called, +unless C<no_chdir> was specified. Note that when changing to +directories is in effect the root directory (F</>) is a somewhat +special case inasmuch as the concatenation of C<$File::Find::dir>, +C<'/'> and C<$_> is not literally equal to C<$File::Find::name>. The +table below summarizes all variants: + + $File::Find::name $File::Find::dir $_ + default / / . + no_chdir=>0 /etc / etc + /etc/x /etc x + + no_chdir=>1 / / / + /etc / /etc + /etc/x /etc /etc/x + + +When <follow> or <follow_fast> are in effect, there is +also a C<$File::Find::fullname>. The function may set +C<$File::Find::prune> to prune the tree unless C<bydepth> was +specified. Unless C<follow> or C<follow_fast> is specified, for +compatibility reasons (find.pl, find2perl) there are in addition the +following globals available: C<$File::Find::topdir>, +C<$File::Find::topdev>, C<$File::Find::topino>, +C<$File::Find::topmode> and C<$File::Find::topnlink>. + +This library is useful for the C<find2perl> tool, which when fed, + + find2perl / -name .nfs\* -mtime +7 \ + -exec rm -f {} \; -o -fstype nfs -prune + +produces something like: + + sub wanted { + /^\.nfs.*\z/s && + (($dev, $ino, $mode, $nlink, $uid, $gid) = lstat($_)) && + int(-M _) > 7 && + unlink($_) + || + ($nlink || (($dev, $ino, $mode, $nlink, $uid, $gid) = lstat($_))) && + $dev < 0 && + ($File::Find::prune = 1); + } + +Notice the C<_> in the above C<int(-M _)>: the C<_> is a magical +filehandle that caches the information from the preceding +C<stat()>, C<lstat()>, or filetest. + +Here's another interesting wanted function. It will find all symbolic +links that don't resolve: + + sub wanted { + -l && !-e && print "bogus link: $File::Find::name\n"; + } + +See also the script C<pfind> on CPAN for a nice application of this +module. + +=head1 WARNINGS + +If you run your program with the C<-w> switch, or if you use the +C<warnings> pragma, File::Find will report warnings for several weird +situations. You can disable these warnings by putting the statement + + no warnings 'File::Find'; + +in the appropriate scope. See L<perllexwarn> for more info about lexical +warnings. + +=head1 CAVEAT + +=over 2 + +=item $dont_use_nlink + +You can set the variable C<$File::Find::dont_use_nlink> to 1, if you want to +force File::Find to always stat directories. This was used for file systems +that do not have an C<nlink> count matching the number of sub-directories. +Examples are ISO-9660 (CD-ROM), AFS, HPFS (OS/2 file system), FAT (DOS file +system) and a couple of others. + +You shouldn't need to set this variable, since File::Find should now detect +such file systems on-the-fly and switch itself to using stat. This works even +for parts of your file system, like a mounted CD-ROM. + +If you do set C<$File::Find::dont_use_nlink> to 1, you will notice slow-downs. + +=item symlinks + +Be aware that the option to follow symbolic links can be dangerous. +Depending on the structure of the directory tree (including symbolic +links to directories) you might traverse a given (physical) directory +more than once (only if C<follow_fast> is in effect). +Furthermore, deleting or changing files in a symbolically linked directory +might cause very unpleasant surprises, since you delete or change files +in an unknown directory. + +=back + +=head1 NOTES + +=over 4 + +=item * + +Mac OS (Classic) users should note a few differences: + +=over 4 + +=item * + +The path separator is ':', not '/', and the current directory is denoted +as ':', not '.'. You should be careful about specifying relative pathnames. +While a full path always begins with a volume name, a relative pathname +should always begin with a ':'. If specifying a volume name only, a +trailing ':' is required. + +=item * + +C<$File::Find::dir> is guaranteed to end with a ':'. If C<$_> +contains the name of a directory, that name may or may not end with a +':'. Likewise, C<$File::Find::name>, which contains the complete +pathname to that directory, and C<$File::Find::fullname>, which holds +the absolute pathname of that directory with all symbolic links resolved, +may or may not end with a ':'. + +=item * + +The default C<untaint_pattern> (see above) on Mac OS is set to +C<qr|^(.+)$|>. Note that the parentheses are vital. + +=item * + +The invisible system file "Icon\015" is ignored. While this file may +appear in every directory, there are some more invisible system files +on every volume, which are all located at the volume root level (i.e. +"MacintoshHD:"). These system files are B<not> excluded automatically. +Your filter may use the following code to recognize invisible files or +directories (requires Mac::Files): + + use Mac::Files; + + # invisible() -- returns 1 if file/directory is invisible, + # 0 if it's visible or undef if an error occurred + + sub invisible($) { + my $file = shift; + my ($fileCat, $fileInfo); + my $invisible_flag = 1 << 14; + + if ( $fileCat = FSpGetCatInfo($file) ) { + if ($fileInfo = $fileCat->ioFlFndrInfo() ) { + return (($fileInfo->fdFlags & $invisible_flag) && 1); + } + } + return undef; + } + +Generally, invisible files are system files, unless an odd application +decides to use invisible files for its own purposes. To distinguish +such files from system files, you have to look at the B<type> and B<creator> +file attributes. The MacPerl built-in functions C<GetFileInfo(FILE)> and +C<SetFileInfo(CREATOR, TYPE, FILES)> offer access to these attributes +(see MacPerl.pm for details). + +Files that appear on the desktop actually reside in an (hidden) directory +named "Desktop Folder" on the particular disk volume. Note that, although +all desktop files appear to be on the same "virtual" desktop, each disk +volume actually maintains its own "Desktop Folder" directory. + +=back + +=back + +=head1 BUGS AND CAVEATS + +Despite the name of the C<finddepth()> function, both C<find()> and +C<finddepth()> perform a depth-first search of the directory +hierarchy. + +=head1 HISTORY + +File::Find used to produce incorrect results if called recursively. +During the development of perl 5.8 this bug was fixed. +The first fixed version of File::Find was 1.01. + +=cut + +our @ISA = qw(Exporter); +our @EXPORT = qw(find finddepth); + + +use strict; +my $Is_VMS; +my $Is_MacOS; + +require File::Basename; +require File::Spec; + +# Should ideally be my() not our() but local() currently +# refuses to operate on lexicals + +our %SLnkSeen; +our ($wanted_callback, $avoid_nlink, $bydepth, $no_chdir, $follow, + $follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat, + $pre_process, $post_process, $dangling_symlinks); + +sub contract_name { + my ($cdir,$fn) = @_; + + return substr($cdir,0,rindex($cdir,'/')) if $fn eq $File::Find::current_dir; + + $cdir = substr($cdir,0,rindex($cdir,'/')+1); + + $fn =~ s|^\./||; + + my $abs_name= $cdir . $fn; + + if (substr($fn,0,3) eq '../') { + 1 while $abs_name =~ s!/[^/]*/\.\./!/!; + } + + return $abs_name; +} + +# return the absolute name of a directory or file +sub contract_name_Mac { + my ($cdir,$fn) = @_; + my $abs_name; + + if ($fn =~ /^(:+)(.*)$/) { # valid pathname starting with a ':' + + my $colon_count = length ($1); + if ($colon_count == 1) { + $abs_name = $cdir . $2; + return $abs_name; + } + else { + # need to move up the tree, but + # only if it's not a volume name + for (my $i=1; $i<$colon_count; $i++) { + unless ($cdir =~ /^[^:]+:$/) { # volume name + $cdir =~ s/[^:]+:$//; + } + else { + return undef; + } + } + $abs_name = $cdir . $2; + return $abs_name; + } + + } + else { + + # $fn may be a valid path to a directory or file or (dangling) + # symlink, without a leading ':' + if ( (-e $fn) || (-l $fn) ) { + if ($fn =~ /^[^:]+:/) { # a volume name like DataHD:* + return $fn; # $fn is already an absolute path + } + else { + $abs_name = $cdir . $fn; + return $abs_name; + } + } + else { # argh!, $fn is not a valid directory/file + return undef; + } + } +} + +sub PathCombine($$) { + my ($Base,$Name) = @_; + my $AbsName; + + if ($Is_MacOS) { + # $Name is the resolved symlink (always a full path on MacOS), + # i.e. there's no need to call contract_name_Mac() + $AbsName = $Name; + + # (simple) check for recursion + if ( ( $Base =~ /^$AbsName/) && (-d $AbsName) ) { # recursion + return undef; + } + } + else { + if (substr($Name,0,1) eq '/') { + $AbsName= $Name; + } + else { + $AbsName= contract_name($Base,$Name); + } + + # (simple) check for recursion + my $newlen= length($AbsName); + if ($newlen <= length($Base)) { + if (($newlen == length($Base) || substr($Base,$newlen,1) eq '/') + && $AbsName eq substr($Base,0,$newlen)) + { + return undef; + } + } + } + return $AbsName; +} + +sub Follow_SymLink($) { + my ($AbsName) = @_; + + my ($NewName,$DEV, $INO); + ($DEV, $INO)= lstat $AbsName; + + while (-l _) { + if ($SLnkSeen{$DEV, $INO}++) { + if ($follow_skip < 2) { + die "$AbsName is encountered a second time"; + } + else { + return undef; + } + } + $NewName= PathCombine($AbsName, readlink($AbsName)); + unless(defined $NewName) { + if ($follow_skip < 2) { + die "$AbsName is a recursive symbolic link"; + } + else { + return undef; + } + } + else { + $AbsName= $NewName; + } + ($DEV, $INO) = lstat($AbsName); + return undef unless defined $DEV; # dangling symbolic link + } + + if ($full_check && defined $DEV && $SLnkSeen{$DEV, $INO}++) { + if ( ($follow_skip < 1) || ((-d _) && ($follow_skip < 2)) ) { + die "$AbsName encountered a second time"; + } + else { + return undef; + } + } + + return $AbsName; +} + +our($dir, $name, $fullname, $prune); +sub _find_dir_symlnk($$$); +sub _find_dir($$$); + +# check whether or not a scalar variable is tainted +# (code straight from the Camel, 3rd ed., page 561) +sub is_tainted_pp { + my $arg = shift; + my $nada = substr($arg, 0, 0); # zero-length + local $@; + eval { eval "# $nada" }; + return length($@) != 0; +} + +sub _find_opt { + my $wanted = shift; + die "invalid top directory" unless defined $_[0]; + + # This function must local()ize everything because callbacks may + # call find() or finddepth() + + local %SLnkSeen; + local ($wanted_callback, $avoid_nlink, $bydepth, $no_chdir, $follow, + $follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat, + $pre_process, $post_process, $dangling_symlinks); + local($dir, $name, $fullname, $prune); + local *_ = \my $a; + + my $cwd = $wanted->{bydepth} ? Cwd::fastcwd() : Cwd::getcwd(); + my $cwd_untainted = $cwd; + my $check_t_cwd = 1; + $wanted_callback = $wanted->{wanted}; + $bydepth = $wanted->{bydepth}; + $pre_process = $wanted->{preprocess}; + $post_process = $wanted->{postprocess}; + $no_chdir = $wanted->{no_chdir}; + $full_check = $^O eq 'MSWin32' ? 0 : $wanted->{follow}; + $follow = $^O eq 'MSWin32' ? 0 : + $full_check || $wanted->{follow_fast}; + $follow_skip = $wanted->{follow_skip}; + $untaint = $wanted->{untaint}; + $untaint_pat = $wanted->{untaint_pattern}; + $untaint_skip = $wanted->{untaint_skip}; + $dangling_symlinks = $wanted->{dangling_symlinks}; + + # for compatibility reasons (find.pl, find2perl) + local our ($topdir, $topdev, $topino, $topmode, $topnlink); + + # a symbolic link to a directory doesn't increase the link count + $avoid_nlink = $follow || $File::Find::dont_use_nlink; + + my ($abs_dir, $Is_Dir); + + Proc_Top_Item: + foreach my $TOP (@_) { + my $top_item = $TOP; + + ($topdev,$topino,$topmode,$topnlink) = $follow ? stat $top_item : lstat $top_item; + + if ($Is_MacOS) { + $top_item = ":$top_item" + if ( (-d _) && ( $top_item !~ /:/ ) ); + } elsif ($^O eq 'MSWin32') { + $top_item =~ s|/\z|| unless $top_item =~ m|\w:/$|; + } + else { + $top_item =~ s|/\z|| unless $top_item eq '/'; + } + + $Is_Dir= 0; + + if ($follow) { + + if ($Is_MacOS) { + $cwd = "$cwd:" unless ($cwd =~ /:$/); # for safety + + if ($top_item eq $File::Find::current_dir) { + $abs_dir = $cwd; + } + else { + $abs_dir = contract_name_Mac($cwd, $top_item); + unless (defined $abs_dir) { + warnings::warnif "Can't determine absolute path for $top_item (No such file or directory)\n"; + next Proc_Top_Item; + } + } + + } + else { + if (substr($top_item,0,1) eq '/') { + $abs_dir = $top_item; + } + elsif ($top_item eq $File::Find::current_dir) { + $abs_dir = $cwd; + } + else { # care about any ../ + $abs_dir = contract_name("$cwd/",$top_item); + } + } + $abs_dir= Follow_SymLink($abs_dir); + unless (defined $abs_dir) { + if ($dangling_symlinks) { + if (ref $dangling_symlinks eq 'CODE') { + $dangling_symlinks->($top_item, $cwd); + } else { + warnings::warnif "$top_item is a dangling symbolic link\n"; + } + } + next Proc_Top_Item; + } + + if (-d _) { + _find_dir_symlnk($wanted, $abs_dir, $top_item); + $Is_Dir= 1; + } + } + else { # no follow + $topdir = $top_item; + unless (defined $topnlink) { + warnings::warnif "Can't stat $top_item: $!\n"; + next Proc_Top_Item; + } + if (-d _) { + $top_item =~ s/\.dir\z//i if $Is_VMS; + _find_dir($wanted, $top_item, $topnlink); + $Is_Dir= 1; + } + else { + $abs_dir= $top_item; + } + } + + unless ($Is_Dir) { + unless (($_,$dir) = File::Basename::fileparse($abs_dir)) { + if ($Is_MacOS) { + ($dir,$_) = (':', $top_item); # $File::Find::dir, $_ + } + else { + ($dir,$_) = ('./', $top_item); + } + } + + $abs_dir = $dir; + if (( $untaint ) && (is_tainted($dir) )) { + ( $abs_dir ) = $dir =~ m|$untaint_pat|; + unless (defined $abs_dir) { + if ($untaint_skip == 0) { + die "directory $dir is still tainted"; + } + else { + next Proc_Top_Item; + } + } + } + + unless ($no_chdir || chdir $abs_dir) { + warnings::warnif "Couldn't chdir $abs_dir: $!\n"; + next Proc_Top_Item; + } + + $name = $abs_dir . $_; # $File::Find::name + $_ = $name if $no_chdir; + + { $wanted_callback->() }; # protect against wild "next" + + } + + unless ( $no_chdir ) { + if ( ($check_t_cwd) && (($untaint) && (is_tainted($cwd) )) ) { + ( $cwd_untainted ) = $cwd =~ m|$untaint_pat|; + unless (defined $cwd_untainted) { + die "insecure cwd in find(depth)"; + } + $check_t_cwd = 0; + } + unless (chdir $cwd_untainted) { + die "Can't cd to $cwd: $!\n"; + } + } + } +} + +# API: +# $wanted +# $p_dir : "parent directory" +# $nlink : what came back from the stat +# preconditions: +# chdir (if not no_chdir) to dir + +sub _find_dir($$$) { + my ($wanted, $p_dir, $nlink) = @_; + my ($CdLvl,$Level) = (0,0); + my @Stack; + my @filenames; + my ($subcount,$sub_nlink); + my $SE= []; + my $dir_name= $p_dir; + my $dir_pref; + my $dir_rel = $File::Find::current_dir; + my $tainted = 0; + my $no_nlink; + + if ($Is_MacOS) { + $dir_pref= ($p_dir =~ /:$/) ? $p_dir : "$p_dir:"; # preface + } elsif ($^O eq 'MSWin32') { + $dir_pref = ($p_dir =~ m|\w:/$| ? $p_dir : "$p_dir/" ); + } + else { + $dir_pref= ( $p_dir eq '/' ? '/' : "$p_dir/" ); + } + + local ($dir, $name, $prune, *DIR); + + unless ( $no_chdir || ($p_dir eq $File::Find::current_dir)) { + my $udir = $p_dir; + if (( $untaint ) && (is_tainted($p_dir) )) { + ( $udir ) = $p_dir =~ m|$untaint_pat|; + unless (defined $udir) { + if ($untaint_skip == 0) { + die "directory $p_dir is still tainted"; + } + else { + return; + } + } + } + unless (chdir ($Is_VMS && $udir !~ /[\/\[<]+/ ? "./$udir" : $udir)) { + warnings::warnif "Can't cd to $udir: $!\n"; + return; + } + } + + # push the starting directory + push @Stack,[$CdLvl,$p_dir,$dir_rel,-1] if $bydepth; + + if ($Is_MacOS) { + $p_dir = $dir_pref; # ensure trailing ':' + } + + while (defined $SE) { + unless ($bydepth) { + $dir= $p_dir; # $File::Find::dir + $name= $dir_name; # $File::Find::name + $_= ($no_chdir ? $dir_name : $dir_rel ); # $_ + # prune may happen here + $prune= 0; + { $wanted_callback->() }; # protect against wild "next" + next if $prune; + } + + # change to that directory + unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) { + my $udir= $dir_rel; + if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_rel) )) ) { + ( $udir ) = $dir_rel =~ m|$untaint_pat|; + unless (defined $udir) { + if ($untaint_skip == 0) { + if ($Is_MacOS) { + die "directory ($p_dir) $dir_rel is still tainted"; + } + else { + die "directory (" . ($p_dir ne '/' ? $p_dir : '') . "/) $dir_rel is still tainted"; + } + } else { # $untaint_skip == 1 + next; + } + } + } + unless (chdir ($Is_VMS && $udir !~ /[\/\[<]+/ ? "./$udir" : $udir)) { + if ($Is_MacOS) { + warnings::warnif "Can't cd to ($p_dir) $udir: $!\n"; + } + else { + warnings::warnif "Can't cd to (" . + ($p_dir ne '/' ? $p_dir : '') . "/) $udir: $!\n"; + } + next; + } + $CdLvl++; + } + + if ($Is_MacOS) { + $dir_name = "$dir_name:" unless ($dir_name =~ /:$/); + } + + $dir= $dir_name; # $File::Find::dir + + # Get the list of files in the current directory. + unless (opendir DIR, ($no_chdir ? $dir_name : $File::Find::current_dir)) { + warnings::warnif "Can't opendir($dir_name): $!\n"; + next; + } + @filenames = readdir DIR; + closedir(DIR); + @filenames = $pre_process->(@filenames) if $pre_process; + push @Stack,[$CdLvl,$dir_name,"",-2] if $post_process; + + # default: use whatever was specifid + # (if $nlink >= 2, and $avoid_nlink == 0, this will switch back) + $no_nlink = $avoid_nlink; + # if dir has wrong nlink count, force switch to slower stat method + $no_nlink = 1 if ($nlink < 2); + + if ($nlink == 2 && !$no_nlink) { + # This dir has no subdirectories. + for my $FN (@filenames) { + next if $FN =~ $File::Find::skip_pattern; + + $name = $dir_pref . $FN; # $File::Find::name + $_ = ($no_chdir ? $name : $FN); # $_ + { $wanted_callback->() }; # protect against wild "next" + } + + } + else { + # This dir has subdirectories. + $subcount = $nlink - 2; + + # HACK: insert directories at this position. so as to preserve + # the user pre-processed ordering of files. + # EG: directory traversal is in user sorted order, not at random. + my $stack_top = @Stack; + + for my $FN (@filenames) { + next if $FN =~ $File::Find::skip_pattern; + if ($subcount > 0 || $no_nlink) { + # Seen all the subdirs? + # check for directoriness. + # stat is faster for a file in the current directory + $sub_nlink = (lstat ($no_chdir ? $dir_pref . $FN : $FN))[3]; + + if (-d _) { + --$subcount; + $FN =~ s/\.dir\z//i if $Is_VMS; + # HACK: replace push to preserve dir traversal order + #push @Stack,[$CdLvl,$dir_name,$FN,$sub_nlink]; + splice @Stack, $stack_top, 0, + [$CdLvl,$dir_name,$FN,$sub_nlink]; + } + else { + $name = $dir_pref . $FN; # $File::Find::name + $_= ($no_chdir ? $name : $FN); # $_ + { $wanted_callback->() }; # protect against wild "next" + } + } + else { + $name = $dir_pref . $FN; # $File::Find::name + $_= ($no_chdir ? $name : $FN); # $_ + { $wanted_callback->() }; # protect against wild "next" + } + } + } + } + continue { + while ( defined ($SE = pop @Stack) ) { + ($Level, $p_dir, $dir_rel, $nlink) = @$SE; + if ($CdLvl > $Level && !$no_chdir) { + my $tmp; + if ($Is_MacOS) { + $tmp = (':' x ($CdLvl-$Level)) . ':'; + } + else { + $tmp = join('/',('..') x ($CdLvl-$Level)); + } + die "Can't cd to $dir_name" . $tmp + unless chdir ($tmp); + $CdLvl = $Level; + } + + if ($Is_MacOS) { + # $pdir always has a trailing ':', except for the starting dir, + # where $dir_rel eq ':' + $dir_name = "$p_dir$dir_rel"; + $dir_pref = "$dir_name:"; + } + elsif ($^O eq 'MSWin32') { + $dir_name = ($p_dir =~ m|\w:/$| ? "$p_dir$dir_rel" : "$p_dir/$dir_rel"); + $dir_pref = "$dir_name/"; + } + else { + $dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel"); + $dir_pref = "$dir_name/"; + } + + if ( $nlink == -2 ) { + $name = $dir = $p_dir; # $File::Find::name / dir + $_ = $File::Find::current_dir; + $post_process->(); # End-of-directory processing + } + elsif ( $nlink < 0 ) { # must be finddepth, report dirname now + $name = $dir_name; + if ($Is_MacOS) { + if ($dir_rel eq ':') { # must be the top dir, where we started + $name =~ s|:$||; # $File::Find::name + $p_dir = "$p_dir:" unless ($p_dir =~ /:$/); + } + $dir = $p_dir; # $File::Find::dir + $_ = ($no_chdir ? $name : $dir_rel); # $_ + } + else { + if ( substr($name,-2) eq '/.' ) { + substr($name, length($name) == 2 ? -1 : -2) = ''; + } + $dir = $p_dir; + $_ = ($no_chdir ? $dir_name : $dir_rel ); + if ( substr($_,-2) eq '/.' ) { + substr($_, length($_) == 2 ? -1 : -2) = ''; + } + } + { $wanted_callback->() }; # protect against wild "next" + } + else { + push @Stack,[$CdLvl,$p_dir,$dir_rel,-1] if $bydepth; + last; + } + } + } +} + + +# API: +# $wanted +# $dir_loc : absolute location of a dir +# $p_dir : "parent directory" +# preconditions: +# chdir (if not no_chdir) to dir + +sub _find_dir_symlnk($$$) { + my ($wanted, $dir_loc, $p_dir) = @_; # $dir_loc is the absolute directory + my @Stack; + my @filenames; + my $new_loc; + my $updir_loc = $dir_loc; # untainted parent directory + my $SE = []; + my $dir_name = $p_dir; + my $dir_pref; + my $loc_pref; + my $dir_rel = $File::Find::current_dir; + my $byd_flag; # flag for pending stack entry if $bydepth + my $tainted = 0; + my $ok = 1; + + if ($Is_MacOS) { + $dir_pref = ($p_dir =~ /:$/) ? "$p_dir" : "$p_dir:"; + $loc_pref = ($dir_loc =~ /:$/) ? "$dir_loc" : "$dir_loc:"; + } else { + $dir_pref = ( $p_dir eq '/' ? '/' : "$p_dir/" ); + $loc_pref = ( $dir_loc eq '/' ? '/' : "$dir_loc/" ); + } + + local ($dir, $name, $fullname, $prune, *DIR); + + unless ($no_chdir) { + # untaint the topdir + if (( $untaint ) && (is_tainted($dir_loc) )) { + ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|; # parent dir, now untainted + # once untainted, $updir_loc is pushed on the stack (as parent directory); + # hence, we don't need to untaint the parent directory every time we chdir + # to it later + unless (defined $updir_loc) { + if ($untaint_skip == 0) { + die "directory $dir_loc is still tainted"; + } + else { + return; + } + } + } + $ok = chdir($updir_loc) unless ($p_dir eq $File::Find::current_dir); + unless ($ok) { + warnings::warnif "Can't cd to $updir_loc: $!\n"; + return; + } + } + + push @Stack,[$dir_loc,$updir_loc,$p_dir,$dir_rel,-1] if $bydepth; + + if ($Is_MacOS) { + $p_dir = $dir_pref; # ensure trailing ':' + } + + while (defined $SE) { + + unless ($bydepth) { + # change (back) to parent directory (always untainted) + unless ($no_chdir) { + unless (chdir $updir_loc) { + warnings::warnif "Can't cd to $updir_loc: $!\n"; + next; + } + } + $dir= $p_dir; # $File::Find::dir + $name= $dir_name; # $File::Find::name + $_= ($no_chdir ? $dir_name : $dir_rel ); # $_ + $fullname= $dir_loc; # $File::Find::fullname + # prune may happen here + $prune= 0; + lstat($_); # make sure file tests with '_' work + { $wanted_callback->() }; # protect against wild "next" + next if $prune; + } + + # change to that directory + unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) { + $updir_loc = $dir_loc; + if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_loc) )) ) { + # untaint $dir_loc, what will be pushed on the stack as (untainted) parent dir + ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|; + unless (defined $updir_loc) { + if ($untaint_skip == 0) { + die "directory $dir_loc is still tainted"; + } + else { + next; + } + } + } + unless (chdir $updir_loc) { + warnings::warnif "Can't cd to $updir_loc: $!\n"; + next; + } + } + + if ($Is_MacOS) { + $dir_name = "$dir_name:" unless ($dir_name =~ /:$/); + } + + $dir = $dir_name; # $File::Find::dir + + # Get the list of files in the current directory. + unless (opendir DIR, ($no_chdir ? $dir_loc : $File::Find::current_dir)) { + warnings::warnif "Can't opendir($dir_loc): $!\n"; + next; + } + @filenames = readdir DIR; + closedir(DIR); + + for my $FN (@filenames) { + next if $FN =~ $File::Find::skip_pattern; + + # follow symbolic links / do an lstat + $new_loc = Follow_SymLink($loc_pref.$FN); + + # ignore if invalid symlink + unless (defined $new_loc) { + if ($dangling_symlinks) { + if (ref $dangling_symlinks eq 'CODE') { + $dangling_symlinks->($FN, $dir_pref); + } else { + warnings::warnif "$dir_pref$FN is a dangling symbolic link\n"; + } + } + + $fullname = undef; + $name = $dir_pref . $FN; + $_ = ($no_chdir ? $name : $FN); + { $wanted_callback->() }; + next; + } + + if (-d _) { + push @Stack,[$new_loc,$updir_loc,$dir_name,$FN,1]; + } + else { + $fullname = $new_loc; # $File::Find::fullname + $name = $dir_pref . $FN; # $File::Find::name + $_ = ($no_chdir ? $name : $FN); # $_ + { $wanted_callback->() }; # protect against wild "next" + } + } + + } + continue { + while (defined($SE = pop @Stack)) { + ($dir_loc, $updir_loc, $p_dir, $dir_rel, $byd_flag) = @$SE; + if ($Is_MacOS) { + # $p_dir always has a trailing ':', except for the starting dir, + # where $dir_rel eq ':' + $dir_name = "$p_dir$dir_rel"; + $dir_pref = "$dir_name:"; + $loc_pref = ($dir_loc =~ /:$/) ? $dir_loc : "$dir_loc:"; + } + else { + $dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel"); + $dir_pref = "$dir_name/"; + $loc_pref = "$dir_loc/"; + } + if ( $byd_flag < 0 ) { # must be finddepth, report dirname now + unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) { + unless (chdir $updir_loc) { # $updir_loc (parent dir) is always untainted + warnings::warnif "Can't cd to $updir_loc: $!\n"; + next; + } + } + $fullname = $dir_loc; # $File::Find::fullname + $name = $dir_name; # $File::Find::name + if ($Is_MacOS) { + if ($dir_rel eq ':') { # must be the top dir, where we started + $name =~ s|:$||; # $File::Find::name + $p_dir = "$p_dir:" unless ($p_dir =~ /:$/); + } + $dir = $p_dir; # $File::Find::dir + $_ = ($no_chdir ? $name : $dir_rel); # $_ + } + else { + if ( substr($name,-2) eq '/.' ) { + substr($name, length($name) == 2 ? -1 : -2) = ''; # $File::Find::name + } + $dir = $p_dir; # $File::Find::dir + $_ = ($no_chdir ? $dir_name : $dir_rel); # $_ + if ( substr($_,-2) eq '/.' ) { + substr($_, length($_) == 2 ? -1 : -2) = ''; + } + } + + lstat($_); # make sure file tests with '_' work + { $wanted_callback->() }; # protect against wild "next" + } + else { + push @Stack,[$dir_loc, $updir_loc, $p_dir, $dir_rel,-1] if $bydepth; + last; + } + } + } +} + + +sub wrap_wanted { + my $wanted = shift; + if ( ref($wanted) eq 'HASH' ) { + if ( $wanted->{follow} || $wanted->{follow_fast}) { + $wanted->{follow_skip} = 1 unless defined $wanted->{follow_skip}; + } + if ( $wanted->{untaint} ) { + $wanted->{untaint_pattern} = $File::Find::untaint_pattern + unless defined $wanted->{untaint_pattern}; + $wanted->{untaint_skip} = 0 unless defined $wanted->{untaint_skip}; + } + return $wanted; + } + else { + return { wanted => $wanted }; + } +} + +sub find { + my $wanted = shift; + _find_opt(wrap_wanted($wanted), @_); +} + +sub finddepth { + my $wanted = wrap_wanted(shift); + $wanted->{bydepth} = 1; + _find_opt($wanted, @_); +} + +# default +$File::Find::skip_pattern = qr/^\.{1,2}\z/; +$File::Find::untaint_pattern = qr|^([-+@\w./]+)$|; + +# These are hard-coded for now, but may move to hint files. +if ($^O eq 'VMS') { + $Is_VMS = 1; + $File::Find::dont_use_nlink = 1; +} +elsif ($^O eq 'MacOS') { + $Is_MacOS = 1; + $File::Find::dont_use_nlink = 1; + $File::Find::skip_pattern = qr/^Icon\015\z/; + $File::Find::untaint_pattern = qr|^(.+)$|; +} + +# this _should_ work properly on all platforms +# where File::Find can be expected to work +$File::Find::current_dir = File::Spec->curdir || '.'; + +$File::Find::dont_use_nlink = 1 + if $^O eq 'os2' || $^O eq 'dos' || $^O eq 'amigaos' || $^O eq 'MSWin32' || + $^O eq 'interix' || $^O eq 'cygwin' || $^O eq 'epoc' || $^O eq 'qnx' || + $^O eq 'nto'; + +# Set dont_use_nlink in your hint file if your system's stat doesn't +# report the number of links in a directory as an indication +# of the number of files. +# See, e.g. hints/machten.sh for MachTen 2.2. +unless ($File::Find::dont_use_nlink) { + require Config; + $File::Find::dont_use_nlink = 1 if ($Config::Config{'dont_use_nlink'}); +} + +# We need a function that checks if a scalar is tainted. Either use the +# Scalar::Util module's tainted() function or our (slower) pure Perl +# fallback is_tainted_pp() +{ + local $@; + eval { require Scalar::Util }; + *is_tainted = $@ ? \&is_tainted_pp : \&Scalar::Util::tainted; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/File/Glob.pm b/Master/tlpkg/tlperl.old/lib/File/Glob.pm new file mode 100644 index 00000000000..133c650529b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/Glob.pm @@ -0,0 +1,496 @@ +package File::Glob; + +use strict; +our($VERSION, @ISA, @EXPORT_OK, @EXPORT_FAIL, %EXPORT_TAGS, + $AUTOLOAD, $DEFAULT_FLAGS); + +use XSLoader (); + +@ISA = qw(Exporter); + +# NOTE: The glob() export is only here for compatibility with 5.6.0. +# csh_glob() should not be used directly, unless you know what you're doing. + +@EXPORT_OK = qw( + csh_glob + bsd_glob + glob + GLOB_ABEND + GLOB_ALPHASORT + GLOB_ALTDIRFUNC + GLOB_BRACE + GLOB_CSH + GLOB_ERR + GLOB_ERROR + GLOB_LIMIT + GLOB_MARK + GLOB_NOCASE + GLOB_NOCHECK + GLOB_NOMAGIC + GLOB_NOSORT + GLOB_NOSPACE + GLOB_QUOTE + GLOB_TILDE +); + +%EXPORT_TAGS = ( + 'glob' => [ qw( + GLOB_ABEND + GLOB_ALPHASORT + GLOB_ALTDIRFUNC + GLOB_BRACE + GLOB_CSH + GLOB_ERR + GLOB_ERROR + GLOB_LIMIT + GLOB_MARK + GLOB_NOCASE + GLOB_NOCHECK + GLOB_NOMAGIC + GLOB_NOSORT + GLOB_NOSPACE + GLOB_QUOTE + GLOB_TILDE + glob + bsd_glob + ) ], +); + +$VERSION = '1.05'; + +sub import { + require Exporter; + my $i = 1; + while ($i < @_) { + if ($_[$i] =~ /^:(case|nocase|globally)$/) { + splice(@_, $i, 1); + $DEFAULT_FLAGS &= ~GLOB_NOCASE() if $1 eq 'case'; + $DEFAULT_FLAGS |= GLOB_NOCASE() if $1 eq 'nocase'; + if ($1 eq 'globally') { + local $^W; + *CORE::GLOBAL::glob = \&File::Glob::csh_glob; + } + next; + } + ++$i; + } + goto &Exporter::import; +} + +sub AUTOLOAD { + # This AUTOLOAD is used to 'autoload' constants from the constant() + # XS function. If a constant is not found then control is passed + # to the AUTOLOAD in AutoLoader. + + my $constname; + ($constname = $AUTOLOAD) =~ s/.*:://; + my ($error, $val) = constant($constname); + if ($error) { + require Carp; + Carp::croak($error); + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + +XSLoader::load 'File::Glob', $VERSION; + +# Preloaded methods go here. + +sub GLOB_ERROR { + return (constant('GLOB_ERROR'))[1]; +} + +sub GLOB_CSH () { + GLOB_BRACE() + | GLOB_NOMAGIC() + | GLOB_QUOTE() + | GLOB_TILDE() + | GLOB_ALPHASORT() +} + +$DEFAULT_FLAGS = GLOB_CSH(); +if ($^O =~ /^(?:MSWin32|VMS|os2|dos|riscos|MacOS)$/) { + $DEFAULT_FLAGS |= GLOB_NOCASE(); +} + +# Autoload methods go after =cut, and are processed by the autosplit program. + +sub bsd_glob { + my ($pat,$flags) = @_; + $flags = $DEFAULT_FLAGS if @_ < 2; + return doglob($pat,$flags); +} + +# File::Glob::glob() is deprecated because its prototype is different from +# CORE::glob() (use bsd_glob() instead) +sub glob { + splice @_, 1; # don't pass PL_glob_index as flags! + goto &bsd_glob; +} + +## borrowed heavily from gsar's File::DosGlob +my %iter; +my %entries; + +sub csh_glob { + my $pat = shift; + my $cxix = shift; + my @pat; + + # glob without args defaults to $_ + $pat = $_ unless defined $pat; + + # extract patterns + $pat =~ s/^\s+//; # Protect against empty elements in + $pat =~ s/\s+$//; # things like < *.c> and <*.c >. + # These alone shouldn't trigger ParseWords. + if ($pat =~ /\s/) { + # XXX this is needed for compatibility with the csh + # implementation in Perl. Need to support a flag + # to disable this behavior. + require Text::ParseWords; + @pat = Text::ParseWords::parse_line('\s+',0,$pat); + } + + # assume global context if not provided one + $cxix = '_G_' unless defined $cxix; + $iter{$cxix} = 0 unless exists $iter{$cxix}; + + # if we're just beginning, do it all first + if ($iter{$cxix} == 0) { + if (@pat) { + $entries{$cxix} = [ map { doglob($_, $DEFAULT_FLAGS) } @pat ]; + } + else { + $entries{$cxix} = [ doglob($pat, $DEFAULT_FLAGS) ]; + } + } + + # chuck it all out, quick or slow + if (wantarray) { + delete $iter{$cxix}; + return @{delete $entries{$cxix}}; + } + else { + if ($iter{$cxix} = scalar @{$entries{$cxix}}) { + return shift @{$entries{$cxix}}; + } + else { + # return undef for EOL + delete $iter{$cxix}; + delete $entries{$cxix}; + return undef; + } + } +} + +1; +__END__ + +=head1 NAME + +File::Glob - Perl extension for BSD glob routine + +=head1 SYNOPSIS + + use File::Glob ':glob'; + + @list = bsd_glob('*.[ch]'); + $homedir = bsd_glob('~gnat', GLOB_TILDE | GLOB_ERR); + + if (GLOB_ERROR) { + # an error occurred reading $homedir + } + + ## override the core glob (CORE::glob() does this automatically + ## by default anyway, since v5.6.0) + use File::Glob ':globally'; + my @sources = <*.{c,h,y}>; + + ## override the core glob, forcing case sensitivity + use File::Glob qw(:globally :case); + my @sources = <*.{c,h,y}>; + + ## override the core glob forcing case insensitivity + use File::Glob qw(:globally :nocase); + my @sources = <*.{c,h,y}>; + + ## glob on all files in home directory + use File::Glob ':globally'; + my @sources = <~gnat/*>; + +=head1 DESCRIPTION + +The glob angle-bracket operator C<< <> >> is a pathname generator that +implements the rules for file name pattern matching used by Unix-like shells +such as the Bourne shell or C shell. + +File::Glob::bsd_glob() implements the FreeBSD glob(3) routine, which is +a superset of the POSIX glob() (described in IEEE Std 1003.2 "POSIX.2"). +bsd_glob() takes a mandatory C<pattern> argument, and an optional +C<flags> argument, and returns a list of filenames matching the +pattern, with interpretation of the pattern modified by the C<flags> +variable. + +Since v5.6.0, Perl's CORE::glob() is implemented in terms of bsd_glob(). +Note that they don't share the same prototype--CORE::glob() only accepts +a single argument. Due to historical reasons, CORE::glob() will also +split its argument on whitespace, treating it as multiple patterns, +whereas bsd_glob() considers them as one pattern. + +=head2 META CHARACTERS + + \ Quote the next metacharacter + [] Character class + {} Multiple pattern + * Match any string of characters + ? Match any single character + ~ User name home directory + +The metanotation C<a{b,c,d}e> is a shorthand for C<abe ace ade>. Left to +right order is preserved, with results of matches being sorted separately +at a low level to preserve this order. As a special case C<{>, C<}>, and +C<{}> are passed undisturbed. + +=head2 POSIX FLAGS + +The POSIX defined flags for bsd_glob() are: + +=over 4 + +=item C<GLOB_ERR> + +Force bsd_glob() to return an error when it encounters a directory it +cannot open or read. Ordinarily bsd_glob() continues to find matches. + +=item C<GLOB_LIMIT> + +Make bsd_glob() return an error (GLOB_NOSPACE) when the pattern expands +to a size bigger than the system constant C<ARG_MAX> (usually found in +limits.h). If your system does not define this constant, bsd_glob() uses +C<sysconf(_SC_ARG_MAX)> or C<_POSIX_ARG_MAX> where available (in that +order). You can inspect these values using the standard C<POSIX> +extension. + +=item C<GLOB_MARK> + +Each pathname that is a directory that matches the pattern has a slash +appended. + +=item C<GLOB_NOCASE> + +By default, file names are assumed to be case sensitive; this flag +makes bsd_glob() treat case differences as not significant. + +=item C<GLOB_NOCHECK> + +If the pattern does not match any pathname, then bsd_glob() returns a list +consisting of only the pattern. If C<GLOB_QUOTE> is set, its effect +is present in the pattern returned. + +=item C<GLOB_NOSORT> + +By default, the pathnames are sorted in ascending ASCII order; this +flag prevents that sorting (speeding up bsd_glob()). + +=back + +The FreeBSD extensions to the POSIX standard are the following flags: + +=over 4 + +=item C<GLOB_BRACE> + +Pre-process the string to expand C<{pat,pat,...}> strings like csh(1). +The pattern '{}' is left unexpanded for historical reasons (and csh(1) +does the same thing to ease typing of find(1) patterns). + +=item C<GLOB_NOMAGIC> + +Same as C<GLOB_NOCHECK> but it only returns the pattern if it does not +contain any of the special characters "*", "?" or "[". C<NOMAGIC> is +provided to simplify implementing the historic csh(1) globbing +behaviour and should probably not be used anywhere else. + +=item C<GLOB_QUOTE> + +Use the backslash ('\') character for quoting: every occurrence of a +backslash followed by a character in the pattern is replaced by that +character, avoiding any special interpretation of the character. +(But see below for exceptions on DOSISH systems). + +=item C<GLOB_TILDE> + +Expand patterns that start with '~' to user name home directories. + +=item C<GLOB_CSH> + +For convenience, C<GLOB_CSH> is a synonym for +C<GLOB_BRACE | GLOB_NOMAGIC | GLOB_QUOTE | GLOB_TILDE | GLOB_ALPHASORT>. + +=back + +The POSIX provided C<GLOB_APPEND>, C<GLOB_DOOFFS>, and the FreeBSD +extensions C<GLOB_ALTDIRFUNC>, and C<GLOB_MAGCHAR> flags have not been +implemented in the Perl version because they involve more complex +interaction with the underlying C structures. + +The following flag has been added in the Perl implementation for +csh compatibility: + +=over 4 + +=item C<GLOB_ALPHASORT> + +If C<GLOB_NOSORT> is not in effect, sort filenames is alphabetical +order (case does not matter) rather than in ASCII order. + +=back + +=head1 DIAGNOSTICS + +bsd_glob() returns a list of matching paths, possibly zero length. If an +error occurred, &File::Glob::GLOB_ERROR will be non-zero and C<$!> will be +set. &File::Glob::GLOB_ERROR is guaranteed to be zero if no error occurred, +or one of the following values otherwise: + +=over 4 + +=item C<GLOB_NOSPACE> + +An attempt to allocate memory failed. + +=item C<GLOB_ABEND> + +The glob was stopped because an error was encountered. + +=back + +In the case where bsd_glob() has found some matching paths, but is +interrupted by an error, it will return a list of filenames B<and> +set &File::Glob::ERROR. + +Note that bsd_glob() deviates from POSIX and FreeBSD glob(3) behaviour +by not considering C<ENOENT> and C<ENOTDIR> as errors - bsd_glob() will +continue processing despite those errors, unless the C<GLOB_ERR> flag is +set. + +Be aware that all filenames returned from File::Glob are tainted. + +=head1 NOTES + +=over 4 + +=item * + +If you want to use multiple patterns, e.g. C<bsd_glob("a* b*")>, you should +probably throw them in a set as in C<bsd_glob("{a*,b*}")>. This is because +the argument to bsd_glob() isn't subjected to parsing by the C shell. +Remember that you can use a backslash to escape things. + +=item * + +On DOSISH systems, backslash is a valid directory separator character. +In this case, use of backslash as a quoting character (via GLOB_QUOTE) +interferes with the use of backslash as a directory separator. The +best (simplest, most portable) solution is to use forward slashes for +directory separators, and backslashes for quoting. However, this does +not match "normal practice" on these systems. As a concession to user +expectation, therefore, backslashes (under GLOB_QUOTE) only quote the +glob metacharacters '[', ']', '{', '}', '-', '~', and backslash itself. +All other backslashes are passed through unchanged. + +=item * + +Win32 users should use the real slash. If you really want to use +backslashes, consider using Sarathy's File::DosGlob, which comes with +the standard Perl distribution. + +=item * + +Mac OS (Classic) users should note a few differences. Since +Mac OS is not Unix, when the glob code encounters a tilde glob (e.g. +~user) and the C<GLOB_TILDE> flag is used, it simply returns that +pattern without doing any expansion. + +Glob on Mac OS is case-insensitive by default (if you don't use any +flags). If you specify any flags at all and still want glob +to be case-insensitive, you must include C<GLOB_NOCASE> in the flags. + +The path separator is ':' (aka colon), not '/' (aka slash). Mac OS users +should be careful about specifying relative pathnames. While a full path +always begins with a volume name, a relative pathname should always +begin with a ':'. If specifying a volume name only, a trailing ':' is +required. + +The specification of pathnames in glob patterns adheres to the usual Mac +OS conventions: The path separator is a colon ':', not a slash '/'. A +full path always begins with a volume name. A relative pathname on Mac +OS must always begin with a ':', except when specifying a file or +directory name in the current working directory, where the leading colon +is optional. If specifying a volume name only, a trailing ':' is +required. Due to these rules, a glob like E<lt>*:E<gt> will find all +mounted volumes, while a glob like E<lt>*E<gt> or E<lt>:*E<gt> will find +all files and directories in the current directory. + +Note that updirs in the glob pattern are resolved before the matching begins, +i.e. a pattern like "*HD:t?p::a*" will be matched as "*HD:a*". Note also, +that a single trailing ':' in the pattern is ignored (unless it's a volume +name pattern like "*HD:"), i.e. a glob like E<lt>:*:E<gt> will find both +directories I<and> files (and not, as one might expect, only directories). +You can, however, use the C<GLOB_MARK> flag to distinguish (without a file +test) directory names from file names. + +If the C<GLOB_MARK> flag is set, all directory paths will have a ':' appended. +Since a directory like 'lib:' is I<not> a valid I<relative> path on Mac OS, +both a leading and a trailing colon will be added, when the directory name in +question doesn't contain any colons (e.g. 'lib' becomes ':lib:'). + +=back + +=head1 SEE ALSO + +L<perlfunc/glob>, glob(3) + +=head1 AUTHOR + +The Perl interface was written by Nathan Torkington E<lt>gnat@frii.comE<gt>, +and is released under the artistic license. Further modifications were +made by Greg Bacon E<lt>gbacon@cs.uah.eduE<gt>, Gurusamy Sarathy +E<lt>gsar@activestate.comE<gt>, and Thomas Wegner +E<lt>wegner_thomas@yahoo.comE<gt>. The C glob code has the +following copyright: + + Copyright (c) 1989, 1993 The Regents of the University of California. + All rights reserved. + + This code is derived from software contributed to Berkeley by + Guido van Rossum. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/File/Path.pm b/Master/tlpkg/tlperl.old/lib/File/Path.pm new file mode 100644 index 00000000000..2e41ff3f77f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/Path.pm @@ -0,0 +1,285 @@ +package File::Path; + +=head1 NAME + +File::Path - create or remove directory trees + +=head1 SYNOPSIS + + use File::Path; + + mkpath(['/foo/bar/baz', 'blurfl/quux'], 1, 0711); + rmtree(['foo/bar/baz', 'blurfl/quux'], 1, 1); + +=head1 DESCRIPTION + +The C<mkpath> function provides a convenient way to create directories, even +if your C<mkdir> kernel call won't create more than one level of directory at +a time. C<mkpath> takes three arguments: + +=over 4 + +=item * + +the name of the path to create, or a reference +to a list of paths to create, + +=item * + +a boolean value, which if TRUE will cause C<mkpath> +to print the name of each directory as it is created +(defaults to FALSE), and + +=item * + +the numeric mode to use when creating the directories +(defaults to 0777), to be modified by the current umask. + +=back + +It returns a list of all directories (including intermediates, determined +using the Unix '/' separator) created. + +If a system error prevents a directory from being created, then the +C<mkpath> function throws a fatal error with C<Carp::croak>. This error +can be trapped with an C<eval> block: + + eval { mkpath($dir) }; + if ($@) { + print "Couldn't create $dir: $@"; + } + +Similarly, the C<rmtree> function provides a convenient way to delete a +subtree from the directory structure, much like the Unix command C<rm -r>. +C<rmtree> takes three arguments: + +=over 4 + +=item * + +the root of the subtree to delete, or a reference to +a list of roots. All of the files and directories +below each root, as well as the roots themselves, +will be deleted. + +=item * + +a boolean value, which if TRUE will cause C<rmtree> to +print a message each time it examines a file, giving the +name of the file, and indicating whether it's using C<rmdir> +or C<unlink> to remove it, or that it's skipping it. +(defaults to FALSE) + +=item * + +a boolean value, which if TRUE will cause C<rmtree> to +skip any files to which you do not have delete access +(if running under VMS) or write access (if running +under another OS). This will change in the future when +a criterion for 'delete permission' under OSs other +than VMS is settled. (defaults to FALSE) + +=back + +It returns the number of files successfully deleted. Symlinks are +simply deleted and not followed. + +B<NOTE:> There are race conditions internal to the implementation of +C<rmtree> making it unsafe to use on directory trees which may be +altered or moved while C<rmtree> is running, and in particular on any +directory trees with any path components or subdirectories potentially +writable by untrusted users. + +Additionally, if the third parameter is not TRUE and C<rmtree> is +interrupted, it may leave files and directories with permissions altered +to allow deletion (and older versions of this module would even set +files and directories to world-read/writable!) + +Note also that the occurrence of errors in C<rmtree> can be determined I<only> +by trapping diagnostic messages using C<$SIG{__WARN__}>; it is not apparent +from the return value. + +=head1 DIAGNOSTICS + +=over 4 + +=item * + +On Windows, if C<mkpath> gives you the warning: B<No such file or +directory>, this may mean that you've exceeded your filesystem's +maximum path length. + +=back + +=head1 AUTHORS + +Tim Bunce <F<Tim.Bunce@ig.co.uk>> and +Charles Bailey <F<bailey@newman.upenn.edu>> + +=cut + +use 5.006; +use Carp; +use File::Basename (); +use Exporter (); +use strict; +use warnings; + +our $VERSION = "1.08"; +our @ISA = qw( Exporter ); +our @EXPORT = qw( mkpath rmtree ); + +my $Is_VMS = $^O eq 'VMS'; +my $Is_MacOS = $^O eq 'MacOS'; + +# These OSes complain if you want to remove a file that you have no +# write permission to: +my $force_writeable = ($^O eq 'os2' || $^O eq 'dos' || $^O eq 'MSWin32' || + $^O eq 'amigaos' || $^O eq 'MacOS' || $^O eq 'epoc'); + +sub mkpath { + my($paths, $verbose, $mode) = @_; + # $paths -- either a path string or ref to list of paths + # $verbose -- optional print "mkdir $path" for each directory created + # $mode -- optional permissions, defaults to 0777 + local($")=$Is_MacOS ? ":" : "/"; + $mode = 0777 unless defined($mode); + $paths = [$paths] unless ref $paths; + my(@created,$path); + foreach $path (@$paths) { + $path .= '/' if $^O eq 'os2' and $path =~ /^\w:\z/s; # feature of CRT + # Logic wants Unix paths, so go with the flow. + if ($Is_VMS) { + next if $path eq '/'; + $path = VMS::Filespec::unixify($path); + if ($path =~ m:^(/[^/]+)/?\z:) { + $path = $1.'/000000'; + } + } + next if -d $path; + my $parent = File::Basename::dirname($path); + unless (-d $parent or $path eq $parent) { + push(@created,mkpath($parent, $verbose, $mode)); + } + print "mkdir $path\n" if $verbose; + unless (mkdir($path,$mode)) { + my $e = $!; + # allow for another process to have created it meanwhile + $! = $e, croak ("mkdir $path: $e") unless -d $path; + } + push(@created, $path); + } + @created; +} + +sub rmtree { + my($roots, $verbose, $safe) = @_; + my(@files); + my($count) = 0; + $verbose ||= 0; + $safe ||= 0; + + if ( defined($roots) && length($roots) ) { + $roots = [$roots] unless ref $roots; + } + else { + carp "No root path(s) specified\n"; + return 0; + } + + my($root); + foreach $root (@{$roots}) { + if ($Is_MacOS) { + $root = ":$root" if $root !~ /:/; + $root =~ s#([^:])\z#$1:#; + } else { + $root =~ s#/\z##; + } + (undef, undef, my $rp) = lstat $root or next; + $rp &= 07777; # don't forget setuid, setgid, sticky bits + if ( -d _ ) { + # notabene: 0700 is for making readable in the first place, + # it's also intended to change it to writable in case we have + # to recurse in which case we are better than rm -rf for + # subtrees with strange permissions + chmod($rp | 0700, ($Is_VMS ? VMS::Filespec::fileify($root) : $root)) + or carp "Can't make directory $root read+writeable: $!" + unless $safe; + + if (opendir my $d, $root) { + no strict 'refs'; + if (!defined ${"\cTAINT"} or ${"\cTAINT"}) { + # Blindly untaint dir names + @files = map { /^(.*)$/s ; $1 } readdir $d; + } else { + @files = readdir $d; + } + closedir $d; + } + else { + carp "Can't read $root: $!"; + @files = (); + } + + # Deleting large numbers of files from VMS Files-11 filesystems + # is faster if done in reverse ASCIIbetical order + @files = reverse @files if $Is_VMS; + ($root = VMS::Filespec::unixify($root)) =~ s#\.dir\z## if $Is_VMS; + if ($Is_MacOS) { + @files = map("$root$_", @files); + } else { + @files = map("$root/$_", grep $_!~/^\.{1,2}\z/s,@files); + } + $count += rmtree(\@files,$verbose,$safe); + if ($safe && + ($Is_VMS ? !&VMS::Filespec::candelete($root) : !-w $root)) { + print "skipped $root\n" if $verbose; + next; + } + chmod $rp | 0700, $root + or carp "Can't make directory $root writeable: $!" + if $force_writeable; + print "rmdir $root\n" if $verbose; + if (rmdir $root) { + ++$count; + } + else { + carp "Can't remove directory $root: $!"; + chmod($rp, ($Is_VMS ? VMS::Filespec::fileify($root) : $root)) + or carp("and can't restore permissions to " + . sprintf("0%o",$rp) . "\n"); + } + } + else { + if ($safe && + ($Is_VMS ? !&VMS::Filespec::candelete($root) + : !(-l $root || -w $root))) + { + print "skipped $root\n" if $verbose; + next; + } + chmod $rp | 0600, $root + or carp "Can't make file $root writeable: $!" + if $force_writeable; + print "unlink $root\n" if $verbose; + # delete all versions under VMS + for (;;) { + unless (unlink $root) { + carp "Can't unlink file $root: $!"; + if ($force_writeable) { + chmod $rp, $root + or carp("and can't restore permissions to " + . sprintf("0%o",$rp) . "\n"); + } + last; + } + ++$count; + last unless $Is_VMS && lstat $root; + } + } + } + + $count; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/File/Spec.pm b/Master/tlpkg/tlperl.old/lib/File/Spec.pm new file mode 100644 index 00000000000..0c8cd21e057 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/Spec.pm @@ -0,0 +1,322 @@ +package File::Spec; + +use strict; +use vars qw(@ISA $VERSION); + +$VERSION = '3.12'; +$VERSION = eval $VERSION; + +my %module = (MacOS => 'Mac', + MSWin32 => 'Win32', + os2 => 'OS2', + VMS => 'VMS', + epoc => 'Epoc', + NetWare => 'Win32', # Yes, File::Spec::Win32 works on NetWare. + symbian => 'Win32', # Yes, File::Spec::Win32 works on symbian. + dos => 'OS2', # Yes, File::Spec::OS2 works on DJGPP. + cygwin => 'Cygwin'); + + +my $module = $module{$^O} || 'Unix'; + +require "File/Spec/$module.pm"; +@ISA = ("File::Spec::$module"); + +1; + +__END__ + +=head1 NAME + +File::Spec - portably perform operations on file names + +=head1 SYNOPSIS + + use File::Spec; + + $x=File::Spec->catfile('a', 'b', 'c'); + +which returns 'a/b/c' under Unix. Or: + + use File::Spec::Functions; + + $x = catfile('a', 'b', 'c'); + +=head1 DESCRIPTION + +This module is designed to support operations commonly performed on file +specifications (usually called "file names", but not to be confused with the +contents of a file, or Perl's file handles), such as concatenating several +directory and file names into a single path, or determining whether a path +is rooted. It is based on code directly taken from MakeMaker 5.17, code +written by Andreas KE<ouml>nig, Andy Dougherty, Charles Bailey, Ilya +Zakharevich, Paul Schinder, and others. + +Since these functions are different for most operating systems, each set of +OS specific routines is available in a separate module, including: + + File::Spec::Unix + File::Spec::Mac + File::Spec::OS2 + File::Spec::Win32 + File::Spec::VMS + +The module appropriate for the current OS is automatically loaded by +File::Spec. Since some modules (like VMS) make use of facilities available +only under that OS, it may not be possible to load all modules under all +operating systems. + +Since File::Spec is object oriented, subroutines should not be called directly, +as in: + + File::Spec::catfile('a','b'); + +but rather as class methods: + + File::Spec->catfile('a','b'); + +For simple uses, L<File::Spec::Functions> provides convenient functional +forms of these methods. + +=head1 METHODS + +=over 2 + +=item canonpath + +No physical check on the filesystem, but a logical cleanup of a +path. + + $cpath = File::Spec->canonpath( $path ) ; + +Note that this does *not* collapse F<x/../y> sections into F<y>. This +is by design. If F</foo> on your system is a symlink to F</bar/baz>, +then F</foo/../quux> is actually F</bar/quux>, not F</quux> as a naive +F<../>-removal would give you. If you want to do this kind of +processing, you probably want C<Cwd>'s C<realpath()> function to +actually traverse the filesystem cleaning up paths like this. + +=item catdir + +Concatenate two or more directory names to form a complete path ending +with a directory. But remove the trailing slash from the resulting +string, because it doesn't look good, isn't necessary and confuses +OS/2. Of course, if this is the root directory, don't cut off the +trailing slash :-) + + $path = File::Spec->catdir( @directories ); + +=item catfile + +Concatenate one or more directory names and a filename to form a +complete path ending with a filename + + $path = File::Spec->catfile( @directories, $filename ); + +=item curdir + +Returns a string representation of the current directory. + + $curdir = File::Spec->curdir(); + +=item devnull + +Returns a string representation of the null device. + + $devnull = File::Spec->devnull(); + +=item rootdir + +Returns a string representation of the root directory. + + $rootdir = File::Spec->rootdir(); + +=item tmpdir + +Returns a string representation of the first writable directory from a +list of possible temporary directories. Returns the current directory +if no writable temporary directories are found. The list of directories +checked depends on the platform; e.g. File::Spec::Unix checks C<$ENV{TMPDIR}> +(unless taint is on) and F</tmp>. + + $tmpdir = File::Spec->tmpdir(); + +=item updir + +Returns a string representation of the parent directory. + + $updir = File::Spec->updir(); + +=item no_upwards + +Given a list of file names, strip out those that refer to a parent +directory. (Does not strip symlinks, only '.', '..', and equivalents.) + + @paths = File::Spec->no_upwards( @paths ); + +=item case_tolerant + +Returns a true or false value indicating, respectively, that alphabetic +case is not or is significant when comparing file specifications. + + $is_case_tolerant = File::Spec->case_tolerant(); + +=item file_name_is_absolute + +Takes as its argument a path, and returns true if it is an absolute path. + + $is_absolute = File::Spec->file_name_is_absolute( $path ); + +This does not consult the local filesystem on Unix, Win32, OS/2, or +Mac OS (Classic). It does consult the working environment for VMS +(see L<File::Spec::VMS/file_name_is_absolute>). + +=item path + +Takes no argument. Returns the environment variable C<PATH> (or the local +platform's equivalent) as a list. + + @PATH = File::Spec->path(); + +=item join + +join is the same as catfile. + +=item splitpath + +Splits a path in to volume, directory, and filename portions. On systems +with no concept of volume, returns '' for volume. + + ($volume,$directories,$file) = File::Spec->splitpath( $path ); + ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file ); + +For systems with no syntax differentiating filenames from directories, +assumes that the last file is a path unless C<$no_file> is true or a +trailing separator or F</.> or F</..> is present. On Unix, this means that C<$no_file> +true makes this return ( '', $path, '' ). + +The directory portion may or may not be returned with a trailing '/'. + +The results can be passed to L</catpath()> to get back a path equivalent to +(usually identical to) the original path. + +=item splitdir + +The opposite of L</catdir()>. + + @dirs = File::Spec->splitdir( $directories ); + +C<$directories> must be only the directory portion of the path on systems +that have the concept of a volume or that have path syntax that differentiates +files from directories. + +Unlike just splitting the directories on the separator, empty +directory names (C<''>) can be returned, because these are significant +on some OSes. + +=item catpath() + +Takes volume, directory and file portions and returns an entire path. Under +Unix, C<$volume> is ignored, and directory and file are concatenated. A '/' is +inserted if need be. On other OSes, C<$volume> is significant. + + $full_path = File::Spec->catpath( $volume, $directory, $file ); + +=item abs2rel + +Takes a destination path and an optional base path returns a relative path +from the base path to the destination path: + + $rel_path = File::Spec->abs2rel( $path ) ; + $rel_path = File::Spec->abs2rel( $path, $base ) ; + +If C<$base> is not present or '', then L<cwd()|Cwd> is used. If C<$base> is +relative, then it is converted to absolute form using +L</rel2abs()>. This means that it is taken to be relative to +L<cwd()|Cwd>. + +On systems with the concept of volume, if C<$path> and C<$base> appear to be +on two different volumes, we will not attempt to resolve the two +paths, and we will instead simply return C<$path>. Note that previous +versions of this module ignored the volume of C<$base>, which resulted in +garbage results part of the time. + +On systems that have a grammar that indicates filenames, this ignores the +C<$base> filename as well. Otherwise all path components are assumed to be +directories. + +If C<$path> is relative, it is converted to absolute form using L</rel2abs()>. +This means that it is taken to be relative to L<cwd()|Cwd>. + +No checks against the filesystem are made. On VMS, there is +interaction with the working environment, as logicals and +macros are expanded. + +Based on code written by Shigio Yamaguchi. + +=item rel2abs() + +Converts a relative path to an absolute path. + + $abs_path = File::Spec->rel2abs( $path ) ; + $abs_path = File::Spec->rel2abs( $path, $base ) ; + +If C<$base> is not present or '', then L<cwd()|Cwd> is used. If C<$base> is relative, +then it is converted to absolute form using L</rel2abs()>. This means that it +is taken to be relative to L<cwd()|Cwd>. + +On systems with the concept of volume, if C<$path> and C<$base> appear to be +on two different volumes, we will not attempt to resolve the two +paths, and we will instead simply return C<$path>. Note that previous +versions of this module ignored the volume of C<$base>, which resulted in +garbage results part of the time. + +On systems that have a grammar that indicates filenames, this ignores the +C<$base> filename as well. Otherwise all path components are assumed to be +directories. + +If C<$path> is absolute, it is cleaned up and returned using L</canonpath()>. + +No checks against the filesystem are made. On VMS, there is +interaction with the working environment, as logicals and +macros are expanded. + +Based on code written by Shigio Yamaguchi. + +=back + +For further information, please see L<File::Spec::Unix>, +L<File::Spec::Mac>, L<File::Spec::OS2>, L<File::Spec::Win32>, or +L<File::Spec::VMS>. + +=head1 SEE ALSO + +L<File::Spec::Unix>, L<File::Spec::Mac>, L<File::Spec::OS2>, +L<File::Spec::Win32>, L<File::Spec::VMS>, L<File::Spec::Functions>, +L<ExtUtils::MakeMaker> + +=head1 AUTHOR + +Currently maintained by Ken Williams C<< <KWILLIAMS@cpan.org> >>. + +The vast majority of the code was written by +Kenneth Albanowski C<< <kjahds@kjahds.com> >>, +Andy Dougherty C<< <doughera@lafayette.edu> >>, +Andreas KE<ouml>nig C<< <A.Koenig@franz.ww.TU-Berlin.DE> >>, +Tim Bunce C<< <Tim.Bunce@ig.co.uk> >>. +VMS support by Charles Bailey C<< <bailey@newman.upenn.edu> >>. +OS/2 support by Ilya Zakharevich C<< <ilya@math.ohio-state.edu> >>. +Mac support by Paul Schinder C<< <schinder@pobox.com> >>, and +Thomas Wegner C<< <wegner_thomas@yahoo.com> >>. +abs2rel() and rel2abs() written by Shigio Yamaguchi C<< <shigio@tamacom.com> >>, +modified by Barrie Slaymaker C<< <barries@slaysys.com> >>. +splitpath(), splitdir(), catpath() and catdir() by Barrie Slaymaker. + +=head1 COPYRIGHT + +Copyright (c) 2004 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/File/Spec/Cygwin.pm b/Master/tlpkg/tlperl.old/lib/File/Spec/Cygwin.pm new file mode 100644 index 00000000000..19a2937c6b9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/Spec/Cygwin.pm @@ -0,0 +1,93 @@ +package File::Spec::Cygwin; + +use strict; +use vars qw(@ISA $VERSION); +require File::Spec::Unix; + +$VERSION = '1.1'; + +@ISA = qw(File::Spec::Unix); + +=head1 NAME + +File::Spec::Cygwin - methods for Cygwin file specs + +=head1 SYNOPSIS + + require File::Spec::Cygwin; # Done internally by File::Spec if needed + +=head1 DESCRIPTION + +See L<File::Spec> and L<File::Spec::Unix>. This package overrides the +implementation of these methods, not the semantics. + +This module is still in beta. Cygwin-knowledgeable folks are invited +to offer patches and suggestions. + +=cut + +=pod + +=over 4 + +=item canonpath + +Any C<\> (backslashes) are converted to C</> (forward slashes), +and then File::Spec::Unix canonpath() is called on the result. + +=cut + +sub canonpath { + my($self,$path) = @_; + $path =~ s|\\|/|g; + return $self->SUPER::canonpath($path); +} + +=pod + +=item file_name_is_absolute + +True is returned if the file name begins with C<drive_letter:>, +and if not, File::Spec::Unix file_name_is_absolute() is called. + +=cut + + +sub file_name_is_absolute { + my ($self,$file) = @_; + return 1 if $file =~ m{^([a-z]:)?[\\/]}is; # C:/test + return $self->SUPER::file_name_is_absolute($file); +} + +=item tmpdir (override) + +Returns a string representation of the first existing directory +from the following list: + + $ENV{TMPDIR} + /tmp + C:/temp + +Since Perl 5.8.0, if running under taint mode, and if the environment +variables are tainted, they are not used. + +=cut + +my $tmpdir; +sub tmpdir { + return $tmpdir if defined $tmpdir; + $tmpdir = $_[0]->_tmpdir( $ENV{TMPDIR}, "/tmp", 'C:/temp' ); +} + +=back + +=head1 COPYRIGHT + +Copyright (c) 2004 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut + +1; diff --git a/Master/tlpkg/tlperl.old/lib/File/Spec/Epoc.pm b/Master/tlpkg/tlperl.old/lib/File/Spec/Epoc.pm new file mode 100644 index 00000000000..a7168f9e494 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/Spec/Epoc.pm @@ -0,0 +1,77 @@ +package File::Spec::Epoc; + +use strict; +use vars qw($VERSION @ISA); + +$VERSION = '1.1'; + +require File::Spec::Unix; +@ISA = qw(File::Spec::Unix); + +=head1 NAME + +File::Spec::Epoc - methods for Epoc file specs + +=head1 SYNOPSIS + + require File::Spec::Epoc; # Done internally by File::Spec if needed + +=head1 DESCRIPTION + +See File::Spec::Unix for a documentation of the methods provided +there. This package overrides the implementation of these methods, not +the semantics. + +This package is still work in progress ;-) + +=cut + +sub case_tolerant { + return 1; +} + +=pod + +=over 4 + +=item canonpath() + +No physical check on the filesystem, but a logical cleanup of a +path. On UNIX eliminated successive slashes and successive "/.". + +=back + +=cut + +sub canonpath { + my ($self,$path) = @_; + + $path =~ s|/+|/|g; # xx////xx -> xx/xx + $path =~ s|(/\.)+/|/|g; # xx/././xx -> xx/xx + $path =~ s|^(\./)+||s unless $path eq "./"; # ./xx -> xx + $path =~ s|^/(\.\./)+|/|s; # /../../xx -> xx + $path =~ s|/\Z(?!\n)|| unless $path eq "/"; # xx/ -> xx + return $path; +} + +=pod + +=head1 AUTHOR + +o.flebbe@gmx.de + +=head1 COPYRIGHT + +Copyright (c) 2004 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 SEE ALSO + +See L<File::Spec> and L<File::Spec::Unix>. This package overrides the +implementation of these methods, not the semantics. + +=cut + +1; diff --git a/Master/tlpkg/tlperl.old/lib/File/Spec/Functions.pm b/Master/tlpkg/tlperl.old/lib/File/Spec/Functions.pm new file mode 100644 index 00000000000..38c898c5d8f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/Spec/Functions.pm @@ -0,0 +1,109 @@ +package File::Spec::Functions; + +use File::Spec; +use strict; + +use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION); + +$VERSION = '1.3'; + +require Exporter; + +@ISA = qw(Exporter); + +@EXPORT = qw( + canonpath + catdir + catfile + curdir + rootdir + updir + no_upwards + file_name_is_absolute + path +); + +@EXPORT_OK = qw( + devnull + tmpdir + splitpath + splitdir + catpath + abs2rel + rel2abs + case_tolerant +); + +%EXPORT_TAGS = ( ALL => [ @EXPORT_OK, @EXPORT ] ); + +foreach my $meth (@EXPORT, @EXPORT_OK) { + my $sub = File::Spec->can($meth); + no strict 'refs'; + *{$meth} = sub {&$sub('File::Spec', @_)}; +} + + +1; +__END__ + +=head1 NAME + +File::Spec::Functions - portably perform operations on file names + +=head1 SYNOPSIS + + use File::Spec::Functions; + $x = catfile('a','b'); + +=head1 DESCRIPTION + +This module exports convenience functions for all of the class methods +provided by File::Spec. + +For a reference of available functions, please consult L<File::Spec::Unix>, +which contains the entire set, and which is inherited by the modules for +other platforms. For further information, please see L<File::Spec::Mac>, +L<File::Spec::OS2>, L<File::Spec::Win32>, or L<File::Spec::VMS>. + +=head2 Exports + +The following functions are exported by default. + + canonpath + catdir + catfile + curdir + rootdir + updir + no_upwards + file_name_is_absolute + path + + +The following functions are exported only by request. + + devnull + tmpdir + splitpath + splitdir + catpath + abs2rel + rel2abs + case_tolerant + +All the functions may be imported using the C<:ALL> tag. + +=head1 COPYRIGHT + +Copyright (c) 2004 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 SEE ALSO + +File::Spec, File::Spec::Unix, File::Spec::Mac, File::Spec::OS2, +File::Spec::Win32, File::Spec::VMS, ExtUtils::MakeMaker + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/File/Spec/Mac.pm b/Master/tlpkg/tlperl.old/lib/File/Spec/Mac.pm new file mode 100644 index 00000000000..8b51bd6c249 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/Spec/Mac.pm @@ -0,0 +1,780 @@ +package File::Spec::Mac; + +use strict; +use vars qw(@ISA $VERSION); +require File::Spec::Unix; + +$VERSION = '1.4'; + +@ISA = qw(File::Spec::Unix); + +my $macfiles; +if ($^O eq 'MacOS') { + $macfiles = eval { require Mac::Files }; +} + +sub case_tolerant { 1 } + + +=head1 NAME + +File::Spec::Mac - File::Spec for Mac OS (Classic) + +=head1 SYNOPSIS + + require File::Spec::Mac; # Done internally by File::Spec if needed + +=head1 DESCRIPTION + +Methods for manipulating file specifications. + +=head1 METHODS + +=over 2 + +=item canonpath + +On Mac OS, there's nothing to be done. Returns what it's given. + +=cut + +sub canonpath { + my ($self,$path) = @_; + return $path; +} + +=item catdir() + +Concatenate two or more directory names to form a path separated by colons +(":") ending with a directory. Resulting paths are B<relative> by default, +but can be forced to be absolute (but avoid this, see below). Automatically +puts a trailing ":" on the end of the complete path, because that's what's +done in MacPerl's environment and helps to distinguish a file path from a +directory path. + +B<IMPORTANT NOTE:> Beginning with version 1.3 of this module, the resulting +path is relative by default and I<not> absolute. This decision was made due +to portability reasons. Since C<File::Spec-E<gt>catdir()> returns relative paths +on all other operating systems, it will now also follow this convention on Mac +OS. Note that this may break some existing scripts. + +The intended purpose of this routine is to concatenate I<directory names>. +But because of the nature of Macintosh paths, some additional possibilities +are allowed to make using this routine give reasonable results for some +common situations. In other words, you are also allowed to concatenate +I<paths> instead of directory names (strictly speaking, a string like ":a" +is a path, but not a name, since it contains a punctuation character ":"). + +So, beside calls like + + catdir("a") = ":a:" + catdir("a","b") = ":a:b:" + catdir() = "" (special case) + +calls like the following + + catdir(":a:") = ":a:" + catdir(":a","b") = ":a:b:" + catdir(":a:","b") = ":a:b:" + catdir(":a:",":b:") = ":a:b:" + catdir(":") = ":" + +are allowed. + +Here are the rules that are used in C<catdir()>; note that we try to be as +compatible as possible to Unix: + +=over 2 + +=item 1. + +The resulting path is relative by default, i.e. the resulting path will have a +leading colon. + +=item 2. + +A trailing colon is added automatically to the resulting path, to denote a +directory. + +=item 3. + +Generally, each argument has one leading ":" and one trailing ":" +removed (if any). They are then joined together by a ":". Special +treatment applies for arguments denoting updir paths like "::lib:", +see (4), or arguments consisting solely of colons ("colon paths"), +see (5). + +=item 4. + +When an updir path like ":::lib::" is passed as argument, the number +of directories to climb up is handled correctly, not removing leading +or trailing colons when necessary. E.g. + + catdir(":::a","::b","c") = ":::a::b:c:" + catdir(":::a::","::b","c") = ":::a:::b:c:" + +=item 5. + +Adding a colon ":" or empty string "" to a path at I<any> position +doesn't alter the path, i.e. these arguments are ignored. (When a "" +is passed as the first argument, it has a special meaning, see +(6)). This way, a colon ":" is handled like a "." (curdir) on Unix, +while an empty string "" is generally ignored (see +C<Unix-E<gt>canonpath()> ). Likewise, a "::" is handled like a ".." +(updir), and a ":::" is handled like a "../.." etc. E.g. + + catdir("a",":",":","b") = ":a:b:" + catdir("a",":","::",":b") = ":a::b:" + +=item 6. + +If the first argument is an empty string "" or is a volume name, i.e. matches +the pattern /^[^:]+:/, the resulting path is B<absolute>. + +=item 7. + +Passing an empty string "" as the first argument to C<catdir()> is +like passingC<File::Spec-E<gt>rootdir()> as the first argument, i.e. + + catdir("","a","b") is the same as + + catdir(rootdir(),"a","b"). + +This is true on Unix, where C<catdir("","a","b")> yields "/a/b" and +C<rootdir()> is "/". Note that C<rootdir()> on Mac OS is the startup +volume, which is the closest in concept to Unix' "/". This should help +to run existing scripts originally written for Unix. + +=item 8. + +For absolute paths, some cleanup is done, to ensure that the volume +name isn't immediately followed by updirs. This is invalid, because +this would go beyond "root". Generally, these cases are handled like +their Unix counterparts: + + Unix: + Unix->catdir("","") = "/" + Unix->catdir("",".") = "/" + Unix->catdir("","..") = "/" # can't go beyond root + Unix->catdir("",".","..","..","a") = "/a" + Mac: + Mac->catdir("","") = rootdir() # (e.g. "HD:") + Mac->catdir("",":") = rootdir() + Mac->catdir("","::") = rootdir() # can't go beyond root + Mac->catdir("",":","::","::","a") = rootdir() . "a:" # (e.g. "HD:a:") + +However, this approach is limited to the first arguments following +"root" (again, see C<Unix-E<gt>canonpath()> ). If there are more +arguments that move up the directory tree, an invalid path going +beyond root can be created. + +=back + +As you've seen, you can force C<catdir()> to create an absolute path +by passing either an empty string or a path that begins with a volume +name as the first argument. However, you are strongly encouraged not +to do so, since this is done only for backward compatibility. Newer +versions of File::Spec come with a method called C<catpath()> (see +below), that is designed to offer a portable solution for the creation +of absolute paths. It takes volume, directory and file portions and +returns an entire path. While C<catdir()> is still suitable for the +concatenation of I<directory names>, you are encouraged to use +C<catpath()> to concatenate I<volume names> and I<directory +paths>. E.g. + + $dir = File::Spec->catdir("tmp","sources"); + $abs_path = File::Spec->catpath("MacintoshHD:", $dir,""); + +yields + + "MacintoshHD:tmp:sources:" . + +=cut + +sub catdir { + my $self = shift; + return '' unless @_; + my @args = @_; + my $first_arg; + my $relative; + + # take care of the first argument + + if ($args[0] eq '') { # absolute path, rootdir + shift @args; + $relative = 0; + $first_arg = $self->rootdir; + + } elsif ($args[0] =~ /^[^:]+:/) { # absolute path, volume name + $relative = 0; + $first_arg = shift @args; + # add a trailing ':' if need be (may be it's a path like HD:dir) + $first_arg = "$first_arg:" unless ($first_arg =~ /:\Z(?!\n)/); + + } else { # relative path + $relative = 1; + if ( $args[0] =~ /^::+\Z(?!\n)/ ) { + # updir colon path ('::', ':::' etc.), don't shift + $first_arg = ':'; + } elsif ($args[0] eq ':') { + $first_arg = shift @args; + } else { + # add a trailing ':' if need be + $first_arg = shift @args; + $first_arg = "$first_arg:" unless ($first_arg =~ /:\Z(?!\n)/); + } + } + + # For all other arguments, + # (a) ignore arguments that equal ':' or '', + # (b) handle updir paths specially: + # '::' -> concatenate '::' + # '::' . '::' -> concatenate ':::' etc. + # (c) add a trailing ':' if need be + + my $result = $first_arg; + while (@args) { + my $arg = shift @args; + unless (($arg eq '') || ($arg eq ':')) { + if ($arg =~ /^::+\Z(?!\n)/ ) { # updir colon path like ':::' + my $updir_count = length($arg) - 1; + while ((@args) && ($args[0] =~ /^::+\Z(?!\n)/) ) { # while updir colon path + $arg = shift @args; + $updir_count += (length($arg) - 1); + } + $arg = (':' x $updir_count); + } else { + $arg =~ s/^://s; # remove a leading ':' if any + $arg = "$arg:" unless ($arg =~ /:\Z(?!\n)/); # ensure trailing ':' + } + $result .= $arg; + }#unless + } + + if ( ($relative) && ($result !~ /^:/) ) { + # add a leading colon if need be + $result = ":$result"; + } + + unless ($relative) { + # remove updirs immediately following the volume name + $result =~ s/([^:]+:)(:*)(.*)\Z(?!\n)/$1$3/; + } + + return $result; +} + +=item catfile + +Concatenate one or more directory names and a filename to form a +complete path ending with a filename. Resulting paths are B<relative> +by default, but can be forced to be absolute (but avoid this). + +B<IMPORTANT NOTE:> Beginning with version 1.3 of this module, the +resulting path is relative by default and I<not> absolute. This +decision was made due to portability reasons. Since +C<File::Spec-E<gt>catfile()> returns relative paths on all other +operating systems, it will now also follow this convention on Mac OS. +Note that this may break some existing scripts. + +The last argument is always considered to be the file portion. Since +C<catfile()> uses C<catdir()> (see above) for the concatenation of the +directory portions (if any), the following with regard to relative and +absolute paths is true: + + catfile("") = "" + catfile("file") = "file" + +but + + catfile("","") = rootdir() # (e.g. "HD:") + catfile("","file") = rootdir() . file # (e.g. "HD:file") + catfile("HD:","file") = "HD:file" + +This means that C<catdir()> is called only when there are two or more +arguments, as one might expect. + +Note that the leading ":" is removed from the filename, so that + + catfile("a","b","file") = ":a:b:file" and + + catfile("a","b",":file") = ":a:b:file" + +give the same answer. + +To concatenate I<volume names>, I<directory paths> and I<filenames>, +you are encouraged to use C<catpath()> (see below). + +=cut + +sub catfile { + my $self = shift; + return '' unless @_; + my $file = pop @_; + return $file unless @_; + my $dir = $self->catdir(@_); + $file =~ s/^://s; + return $dir.$file; +} + +=item curdir + +Returns a string representing the current directory. On Mac OS, this is ":". + +=cut + +sub curdir { + return ":"; +} + +=item devnull + +Returns a string representing the null device. On Mac OS, this is "Dev:Null". + +=cut + +sub devnull { + return "Dev:Null"; +} + +=item rootdir + +Returns a string representing the root directory. Under MacPerl, +returns the name of the startup volume, since that's the closest in +concept, although other volumes aren't rooted there. The name has a +trailing ":", because that's the correct specification for a volume +name on Mac OS. + +If Mac::Files could not be loaded, the empty string is returned. + +=cut + +sub rootdir { +# +# There's no real root directory on Mac OS. The name of the startup +# volume is returned, since that's the closest in concept. +# + return '' unless $macfiles; + my $system = Mac::Files::FindFolder(&Mac::Files::kOnSystemDisk, + &Mac::Files::kSystemFolderType); + $system =~ s/:.*\Z(?!\n)/:/s; + return $system; +} + +=item tmpdir + +Returns the contents of $ENV{TMPDIR}, if that directory exits or the +current working directory otherwise. Under MacPerl, $ENV{TMPDIR} will +contain a path like "MacintoshHD:Temporary Items:", which is a hidden +directory on your startup volume. + +=cut + +my $tmpdir; +sub tmpdir { + return $tmpdir if defined $tmpdir; + $tmpdir = $_[0]->_tmpdir( $ENV{TMPDIR} ); +} + +=item updir + +Returns a string representing the parent directory. On Mac OS, this is "::". + +=cut + +sub updir { + return "::"; +} + +=item file_name_is_absolute + +Takes as argument a path and returns true, if it is an absolute path. +If the path has a leading ":", it's a relative path. Otherwise, it's an +absolute path, unless the path doesn't contain any colons, i.e. it's a name +like "a". In this particular case, the path is considered to be relative +(i.e. it is considered to be a filename). Use ":" in the appropriate place +in the path if you want to distinguish unambiguously. As a special case, +the filename '' is always considered to be absolute. Note that with version +1.2 of File::Spec::Mac, this does no longer consult the local filesystem. + +E.g. + + File::Spec->file_name_is_absolute("a"); # false (relative) + File::Spec->file_name_is_absolute(":a:b:"); # false (relative) + File::Spec->file_name_is_absolute("MacintoshHD:"); # true (absolute) + File::Spec->file_name_is_absolute(""); # true (absolute) + + +=cut + +sub file_name_is_absolute { + my ($self,$file) = @_; + if ($file =~ /:/) { + return (! ($file =~ m/^:/s) ); + } elsif ( $file eq '' ) { + return 1 ; + } else { + return 0; # i.e. a file like "a" + } +} + +=item path + +Returns the null list for the MacPerl application, since the concept is +usually meaningless under Mac OS. But if you're using the MacPerl tool under +MPW, it gives back $ENV{Commands} suitably split, as is done in +:lib:ExtUtils:MM_Mac.pm. + +=cut + +sub path { +# +# The concept is meaningless under the MacPerl application. +# Under MPW, it has a meaning. +# + return unless exists $ENV{Commands}; + return split(/,/, $ENV{Commands}); +} + +=item splitpath + + ($volume,$directories,$file) = File::Spec->splitpath( $path ); + ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file ); + +Splits a path into volume, directory, and filename portions. + +On Mac OS, assumes that the last part of the path is a filename unless +$no_file is true or a trailing separator ":" is present. + +The volume portion is always returned with a trailing ":". The directory portion +is always returned with a leading (to denote a relative path) and a trailing ":" +(to denote a directory). The file portion is always returned I<without> a leading ":". +Empty portions are returned as empty string ''. + +The results can be passed to C<catpath()> to get back a path equivalent to +(usually identical to) the original path. + + +=cut + +sub splitpath { + my ($self,$path, $nofile) = @_; + my ($volume,$directory,$file); + + if ( $nofile ) { + ( $volume, $directory ) = $path =~ m|^((?:[^:]+:)?)(.*)|s; + } + else { + $path =~ + m|^( (?: [^:]+: )? ) + ( (?: .*: )? ) + ( .* ) + |xs; + $volume = $1; + $directory = $2; + $file = $3; + } + + $volume = '' unless defined($volume); + $directory = ":$directory" if ( $volume && $directory ); # take care of "HD::dir" + if ($directory) { + # Make sure non-empty directories begin and end in ':' + $directory .= ':' unless (substr($directory,-1) eq ':'); + $directory = ":$directory" unless (substr($directory,0,1) eq ':'); + } else { + $directory = ''; + } + $file = '' unless defined($file); + + return ($volume,$directory,$file); +} + + +=item splitdir + +The opposite of C<catdir()>. + + @dirs = File::Spec->splitdir( $directories ); + +$directories should be only the directory portion of the path on systems +that have the concept of a volume or that have path syntax that differentiates +files from directories. Consider using C<splitpath()> otherwise. + +Unlike just splitting the directories on the separator, empty directory names +(C<"">) can be returned. Since C<catdir()> on Mac OS always appends a trailing +colon to distinguish a directory path from a file path, a single trailing colon +will be ignored, i.e. there's no empty directory name after it. + +Hence, on Mac OS, both + + File::Spec->splitdir( ":a:b::c:" ); and + File::Spec->splitdir( ":a:b::c" ); + +yield: + + ( "a", "b", "::", "c") + +while + + File::Spec->splitdir( ":a:b::c::" ); + +yields: + + ( "a", "b", "::", "c", "::") + + +=cut + +sub splitdir { + my ($self, $path) = @_; + my @result = (); + my ($head, $sep, $tail, $volume, $directories); + + return ('') if ( (!defined($path)) || ($path eq '') ); + return (':') if ($path eq ':'); + + ( $volume, $sep, $directories ) = $path =~ m|^((?:[^:]+:)?)(:*)(.*)|s; + + # deprecated, but handle it correctly + if ($volume) { + push (@result, $volume); + $sep .= ':'; + } + + while ($sep || $directories) { + if (length($sep) > 1) { + my $updir_count = length($sep) - 1; + for (my $i=0; $i<$updir_count; $i++) { + # push '::' updir_count times; + # simulate Unix '..' updirs + push (@result, '::'); + } + } + $sep = ''; + if ($directories) { + ( $head, $sep, $tail ) = $directories =~ m|^((?:[^:]+)?)(:*)(.*)|s; + push (@result, $head); + $directories = $tail; + } + } + return @result; +} + + +=item catpath + + $path = File::Spec->catpath($volume,$directory,$file); + +Takes volume, directory and file portions and returns an entire path. On Mac OS, +$volume, $directory and $file are concatenated. A ':' is inserted if need be. You +may pass an empty string for each portion. If all portions are empty, the empty +string is returned. If $volume is empty, the result will be a relative path, +beginning with a ':'. If $volume and $directory are empty, a leading ":" (if any) +is removed form $file and the remainder is returned. If $file is empty, the +resulting path will have a trailing ':'. + + +=cut + +sub catpath { + my ($self,$volume,$directory,$file) = @_; + + if ( (! $volume) && (! $directory) ) { + $file =~ s/^:// if $file; + return $file ; + } + + # We look for a volume in $volume, then in $directory, but not both + + my ($dir_volume, $dir_dirs) = $self->splitpath($directory, 1); + + $volume = $dir_volume unless length $volume; + my $path = $volume; # may be '' + $path .= ':' unless (substr($path, -1) eq ':'); # ensure trailing ':' + + if ($directory) { + $directory = $dir_dirs if $volume; + $directory =~ s/^://; # remove leading ':' if any + $path .= $directory; + $path .= ':' unless (substr($path, -1) eq ':'); # ensure trailing ':' + } + + if ($file) { + $file =~ s/^://; # remove leading ':' if any + $path .= $file; + } + + return $path; +} + +=item abs2rel + +Takes a destination path and an optional base path and returns a relative path +from the base path to the destination path: + + $rel_path = File::Spec->abs2rel( $path ) ; + $rel_path = File::Spec->abs2rel( $path, $base ) ; + +Note that both paths are assumed to have a notation that distinguishes a +directory path (with trailing ':') from a file path (without trailing ':'). + +If $base is not present or '', then the current working directory is used. +If $base is relative, then it is converted to absolute form using C<rel2abs()>. +This means that it is taken to be relative to the current working directory. + +If $path and $base appear to be on two different volumes, we will not +attempt to resolve the two paths, and we will instead simply return +$path. Note that previous versions of this module ignored the volume +of $base, which resulted in garbage results part of the time. + +If $base doesn't have a trailing colon, the last element of $base is +assumed to be a filename. This filename is ignored. Otherwise all path +components are assumed to be directories. + +If $path is relative, it is converted to absolute form using C<rel2abs()>. +This means that it is taken to be relative to the current working directory. + +Based on code written by Shigio Yamaguchi. + + +=cut + +# maybe this should be done in canonpath() ? +sub _resolve_updirs { + my $path = shift @_; + my $proceed; + + # resolve any updirs, e.g. "HD:tmp::file" -> "HD:file" + do { + $proceed = ($path =~ s/^(.*):[^:]+::(.*?)\z/$1:$2/); + } while ($proceed); + + return $path; +} + + +sub abs2rel { + my($self,$path,$base) = @_; + + # Clean up $path + if ( ! $self->file_name_is_absolute( $path ) ) { + $path = $self->rel2abs( $path ) ; + } + + # Figure out the effective $base and clean it up. + if ( !defined( $base ) || $base eq '' ) { + $base = $self->_cwd(); + } + elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + $base = _resolve_updirs( $base ); # resolve updirs in $base + } + else { + $base = _resolve_updirs( $base ); + } + + # Split up paths - ignore $base's file + my ( $path_vol, $path_dirs, $path_file ) = $self->splitpath( $path ); + my ( $base_vol, $base_dirs ) = $self->splitpath( $base ); + + return $path unless lc( $path_vol ) eq lc( $base_vol ); + + # Now, remove all leading components that are the same + my @pathchunks = $self->splitdir( $path_dirs ); + my @basechunks = $self->splitdir( $base_dirs ); + + while ( @pathchunks && + @basechunks && + lc( $pathchunks[0] ) eq lc( $basechunks[0] ) ) { + shift @pathchunks ; + shift @basechunks ; + } + + # @pathchunks now has the directories to descend in to. + # ensure relative path, even if @pathchunks is empty + $path_dirs = $self->catdir( ':', @pathchunks ); + + # @basechunks now contains the number of directories to climb out of. + $base_dirs = (':' x @basechunks) . ':' ; + + return $self->catpath( '', $self->catdir( $base_dirs, $path_dirs ), $path_file ) ; +} + +=item rel2abs + +Converts a relative path to an absolute path: + + $abs_path = File::Spec->rel2abs( $path ) ; + $abs_path = File::Spec->rel2abs( $path, $base ) ; + +Note that both paths are assumed to have a notation that distinguishes a +directory path (with trailing ':') from a file path (without trailing ':'). + +If $base is not present or '', then $base is set to the current working +directory. If $base is relative, then it is converted to absolute form +using C<rel2abs()>. This means that it is taken to be relative to the +current working directory. + +If $base doesn't have a trailing colon, the last element of $base is +assumed to be a filename. This filename is ignored. Otherwise all path +components are assumed to be directories. + +If $path is already absolute, it is returned and $base is ignored. + +Based on code written by Shigio Yamaguchi. + +=cut + +sub rel2abs { + my ($self,$path,$base) = @_; + + if ( ! $self->file_name_is_absolute($path) ) { + # Figure out the effective $base and clean it up. + if ( !defined( $base ) || $base eq '' ) { + $base = $self->_cwd(); + } + elsif ( ! $self->file_name_is_absolute($base) ) { + $base = $self->rel2abs($base) ; + } + + # Split up paths + + # igonore $path's volume + my ( $path_dirs, $path_file ) = ($self->splitpath($path))[1,2] ; + + # ignore $base's file part + my ( $base_vol, $base_dirs ) = $self->splitpath($base) ; + + # Glom them together + $path_dirs = ':' if ($path_dirs eq ''); + $base_dirs =~ s/:$//; # remove trailing ':', if any + $base_dirs = $base_dirs . $path_dirs; + + $path = $self->catpath( $base_vol, $base_dirs, $path_file ); + } + return $path; +} + + +=back + +=head1 AUTHORS + +See the authors list in I<File::Spec>. Mac OS support by Paul Schinder +<schinder@pobox.com> and Thomas Wegner <wegner_thomas@yahoo.com>. + +=head1 COPYRIGHT + +Copyright (c) 2004 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 SEE ALSO + +See L<File::Spec> and L<File::Spec::Unix>. This package overrides the +implementation of these methods, not the semantics. + +=cut + +1; diff --git a/Master/tlpkg/tlperl.old/lib/File/Spec/OS2.pm b/Master/tlpkg/tlperl.old/lib/File/Spec/OS2.pm new file mode 100644 index 00000000000..ec308f3b6f3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/Spec/OS2.pm @@ -0,0 +1,272 @@ +package File::Spec::OS2; + +use strict; +use vars qw(@ISA $VERSION); +require File::Spec::Unix; + +$VERSION = '1.2'; + +@ISA = qw(File::Spec::Unix); + +sub devnull { + return "/dev/nul"; +} + +sub case_tolerant { + return 1; +} + +sub file_name_is_absolute { + my ($self,$file) = @_; + return scalar($file =~ m{^([a-z]:)?[\\/]}is); +} + +sub path { + my $path = $ENV{PATH}; + $path =~ s:\\:/:g; + my @path = split(';',$path); + foreach (@path) { $_ = '.' if $_ eq '' } + return @path; +} + +sub _cwd { + # In OS/2 the "require Cwd" is unnecessary bloat. + return Cwd::sys_cwd(); +} + +my $tmpdir; +sub tmpdir { + return $tmpdir if defined $tmpdir; + $tmpdir = $_[0]->_tmpdir( @ENV{qw(TMPDIR TEMP TMP)}, + '/tmp', + '/' ); +} + +sub catdir { + my $self = shift; + my @args = @_; + foreach (@args) { + tr[\\][/]; + # append a backslash to each argument unless it has one there + $_ .= "/" unless m{/$}; + } + return $self->canonpath(join('', @args)); +} + +sub canonpath { + my ($self,$path) = @_; + $path =~ s/^([a-z]:)/\l$1/s; + $path =~ s|\\|/|g; + $path =~ s|([^/])/+|$1/|g; # xx////xx -> xx/xx + $path =~ s|(/\.)+/|/|g; # xx/././xx -> xx/xx + $path =~ s|^(\./)+(?=[^/])||s; # ./xx -> xx + $path =~ s|/\Z(?!\n)|| + unless $path =~ m#^([a-z]:)?/\Z(?!\n)#si;# xx/ -> xx + $path =~ s{^/\.\.$}{/}; # /.. -> / + 1 while $path =~ s{^/\.\.}{}; # /../xx -> /xx + return $path; +} + + +sub splitpath { + my ($self,$path, $nofile) = @_; + my ($volume,$directory,$file) = ('','',''); + if ( $nofile ) { + $path =~ + m{^( (?:[a-zA-Z]:|(?:\\\\|//)[^\\/]+[\\/][^\\/]+)? ) + (.*) + }xs; + $volume = $1; + $directory = $2; + } + else { + $path =~ + m{^ ( (?: [a-zA-Z]: | + (?:\\\\|//)[^\\/]+[\\/][^\\/]+ + )? + ) + ( (?:.*[\\\\/](?:\.\.?\Z(?!\n))?)? ) + (.*) + }xs; + $volume = $1; + $directory = $2; + $file = $3; + } + + return ($volume,$directory,$file); +} + + +sub splitdir { + my ($self,$directories) = @_ ; + split m|[\\/]|, $directories, -1; +} + + +sub catpath { + my ($self,$volume,$directory,$file) = @_; + + # If it's UNC, make sure the glue separator is there, reusing + # whatever separator is first in the $volume + $volume .= $1 + if ( $volume =~ m@^([\\/])[\\/][^\\/]+[\\/][^\\/]+\Z(?!\n)@s && + $directory =~ m@^[^\\/]@s + ) ; + + $volume .= $directory ; + + # If the volume is not just A:, make sure the glue separator is + # there, reusing whatever separator is first in the $volume if possible. + if ( $volume !~ m@^[a-zA-Z]:\Z(?!\n)@s && + $volume =~ m@[^\\/]\Z(?!\n)@ && + $file =~ m@[^\\/]@ + ) { + $volume =~ m@([\\/])@ ; + my $sep = $1 ? $1 : '/' ; + $volume .= $sep ; + } + + $volume .= $file ; + + return $volume ; +} + + +sub abs2rel { + my($self,$path,$base) = @_; + + # Clean up $path + if ( ! $self->file_name_is_absolute( $path ) ) { + $path = $self->rel2abs( $path ) ; + } else { + $path = $self->canonpath( $path ) ; + } + + # Figure out the effective $base and clean it up. + if ( !defined( $base ) || $base eq '' ) { + $base = $self->_cwd(); + } elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + } else { + $base = $self->canonpath( $base ) ; + } + + # Split up paths + my ( $path_volume, $path_directories, $path_file ) = $self->splitpath( $path, 1 ) ; + my ( $base_volume, $base_directories ) = $self->splitpath( $base, 1 ) ; + return $path unless $path_volume eq $base_volume; + + # Now, remove all leading components that are the same + my @pathchunks = $self->splitdir( $path_directories ); + my @basechunks = $self->splitdir( $base_directories ); + + while ( @pathchunks && + @basechunks && + lc( $pathchunks[0] ) eq lc( $basechunks[0] ) + ) { + shift @pathchunks ; + shift @basechunks ; + } + + # No need to catdir, we know these are well formed. + $path_directories = CORE::join( '/', @pathchunks ); + $base_directories = CORE::join( '/', @basechunks ); + + # $base_directories now contains the directories the resulting relative + # path must ascend out of before it can descend to $path_directory. So, + # replace all names with $parentDir + + #FA Need to replace between backslashes... + $base_directories =~ s|[^\\/]+|..|g ; + + # Glue the two together, using a separator if necessary, and preventing an + # empty result. + + #FA Must check that new directories are not empty. + if ( $path_directories ne '' && $base_directories ne '' ) { + $path_directories = "$base_directories/$path_directories" ; + } else { + $path_directories = "$base_directories$path_directories" ; + } + + return $self->canonpath( + $self->catpath( "", $path_directories, $path_file ) + ) ; +} + + +sub rel2abs { + my ($self,$path,$base ) = @_; + + if ( ! $self->file_name_is_absolute( $path ) ) { + + if ( !defined( $base ) || $base eq '' ) { + $base = $self->_cwd(); + } + elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + } + else { + $base = $self->canonpath( $base ) ; + } + + my ( $path_directories, $path_file ) = + ($self->splitpath( $path, 1 ))[1,2] ; + + my ( $base_volume, $base_directories ) = + $self->splitpath( $base, 1 ) ; + + $path = $self->catpath( + $base_volume, + $self->catdir( $base_directories, $path_directories ), + $path_file + ) ; + } + + return $self->canonpath( $path ) ; +} + +1; +__END__ + +=head1 NAME + +File::Spec::OS2 - methods for OS/2 file specs + +=head1 SYNOPSIS + + require File::Spec::OS2; # Done internally by File::Spec if needed + +=head1 DESCRIPTION + +See L<File::Spec> and L<File::Spec::Unix>. This package overrides the +implementation of these methods, not the semantics. + +Amongst the changes made for OS/2 are... + +=over 4 + +=item tmpdir + +Modifies the list of places temp directory information is looked for. + + $ENV{TMPDIR} + $ENV{TEMP} + $ENV{TMP} + /tmp + / + +=item splitpath + +Volumes can be drive letters or UNC sharenames (\\server\share). + +=back + +=head1 COPYRIGHT + +Copyright (c) 2004 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/File/Spec/Unix.pm b/Master/tlpkg/tlperl.old/lib/File/Spec/Unix.pm new file mode 100644 index 00000000000..4a25fe632f2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/Spec/Unix.pm @@ -0,0 +1,510 @@ +package File::Spec::Unix; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.5'; + +=head1 NAME + +File::Spec::Unix - File::Spec for Unix, base for other File::Spec modules + +=head1 SYNOPSIS + + require File::Spec::Unix; # Done automatically by File::Spec + +=head1 DESCRIPTION + +Methods for manipulating file specifications. Other File::Spec +modules, such as File::Spec::Mac, inherit from File::Spec::Unix and +override specific methods. + +=head1 METHODS + +=over 2 + +=item canonpath() + +No physical check on the filesystem, but a logical cleanup of a +path. On UNIX eliminates successive slashes and successive "/.". + + $cpath = File::Spec->canonpath( $path ) ; + +Note that this does *not* collapse F<x/../y> sections into F<y>. This +is by design. If F</foo> on your system is a symlink to F</bar/baz>, +then F</foo/../quux> is actually F</bar/quux>, not F</quux> as a naive +F<../>-removal would give you. If you want to do this kind of +processing, you probably want C<Cwd>'s C<realpath()> function to +actually traverse the filesystem cleaning up paths like this. + +=cut + +sub canonpath { + my ($self,$path) = @_; + + # Handle POSIX-style node names beginning with double slash (qnx, nto) + # Handle network path names beginning with double slash (cygwin) + # (POSIX says: "a pathname that begins with two successive slashes + # may be interpreted in an implementation-defined manner, although + # more than two leading slashes shall be treated as a single slash.") + my $node = ''; + if ( $^O =~ m/^(?:qnx|nto|cygwin)$/ && $path =~ s:^(//[^/]+)(/|\z):/:s ) { + $node = $1; + } + # This used to be + # $path =~ s|/+|/|g unless($^O eq 'cygwin'); + # but that made tests 29, 30, 35, 46, and 213 (as of #13272) to fail + # (Mainly because trailing "" directories didn't get stripped). + # Why would cygwin avoid collapsing multiple slashes into one? --jhi + $path =~ s|/+|/|g; # xx////xx -> xx/xx + $path =~ s@(/\.)+(/|\Z(?!\n))@/@g; # xx/././xx -> xx/xx + $path =~ s|^(\./)+||s unless $path eq "./"; # ./xx -> xx + $path =~ s|^/(\.\./)+|/|; # /../../xx -> xx + $path =~ s|^/\.\.$|/|; # /.. -> / + $path =~ s|/\Z(?!\n)|| unless $path eq "/"; # xx/ -> xx + return "$node$path"; +} + +=item catdir() + +Concatenate two or more directory names to form a complete path ending +with a directory. But remove the trailing slash from the resulting +string, because it doesn't look good, isn't necessary and confuses +OS2. Of course, if this is the root directory, don't cut off the +trailing slash :-) + +=cut + +sub catdir { + my $self = shift; + + $self->canonpath(join('/', @_, '')); # '' because need a trailing '/' +} + +=item catfile + +Concatenate one or more directory names and a filename to form a +complete path ending with a filename + +=cut + +sub catfile { + my $self = shift; + my $file = $self->canonpath(pop @_); + return $file unless @_; + my $dir = $self->catdir(@_); + $dir .= "/" unless substr($dir,-1) eq "/"; + return $dir.$file; +} + +=item curdir + +Returns a string representation of the current directory. "." on UNIX. + +=cut + +sub curdir () { '.' } + +=item devnull + +Returns a string representation of the null device. "/dev/null" on UNIX. + +=cut + +sub devnull () { '/dev/null' } + +=item rootdir + +Returns a string representation of the root directory. "/" on UNIX. + +=cut + +sub rootdir () { '/' } + +=item tmpdir + +Returns a string representation of the first writable directory from +the following list or the current directory if none from the list are +writable: + + $ENV{TMPDIR} + /tmp + +Since perl 5.8.0, if running under taint mode, and if $ENV{TMPDIR} +is tainted, it is not used. + +=cut + +my $tmpdir; +sub _tmpdir { + return $tmpdir if defined $tmpdir; + my $self = shift; + my @dirlist = @_; + { + no strict 'refs'; + if (${"\cTAINT"}) { # Check for taint mode on perl >= 5.8.0 + require Scalar::Util; + @dirlist = grep { ! Scalar::Util::tainted($_) } @dirlist; + } + } + foreach (@dirlist) { + next unless defined && -d && -w _; + $tmpdir = $_; + last; + } + $tmpdir = $self->curdir unless defined $tmpdir; + $tmpdir = defined $tmpdir && $self->canonpath($tmpdir); + return $tmpdir; +} + +sub tmpdir { + return $tmpdir if defined $tmpdir; + $tmpdir = $_[0]->_tmpdir( $ENV{TMPDIR}, "/tmp" ); +} + +=item updir + +Returns a string representation of the parent directory. ".." on UNIX. + +=cut + +sub updir () { '..' } + +=item no_upwards + +Given a list of file names, strip out those that refer to a parent +directory. (Does not strip symlinks, only '.', '..', and equivalents.) + +=cut + +sub no_upwards { + my $self = shift; + return grep(!/^\.{1,2}\Z(?!\n)/s, @_); +} + +=item case_tolerant + +Returns a true or false value indicating, respectively, that alphabetic +is not or is significant when comparing file specifications. + +=cut + +sub case_tolerant () { 0 } + +=item file_name_is_absolute + +Takes as argument a path and returns true if it is an absolute path. + +This does not consult the local filesystem on Unix, Win32, OS/2 or Mac +OS (Classic). It does consult the working environment for VMS (see +L<File::Spec::VMS/file_name_is_absolute>). + +=cut + +sub file_name_is_absolute { + my ($self,$file) = @_; + return scalar($file =~ m:^/:s); +} + +=item path + +Takes no argument, returns the environment variable PATH as an array. + +=cut + +sub path { + return () unless exists $ENV{PATH}; + my @path = split(':', $ENV{PATH}); + foreach (@path) { $_ = '.' if $_ eq '' } + return @path; +} + +=item join + +join is the same as catfile. + +=cut + +sub join { + my $self = shift; + return $self->catfile(@_); +} + +=item splitpath + + ($volume,$directories,$file) = File::Spec->splitpath( $path ); + ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file ); + +Splits a path into volume, directory, and filename portions. On systems +with no concept of volume, returns '' for volume. + +For systems with no syntax differentiating filenames from directories, +assumes that the last file is a path unless $no_file is true or a +trailing separator or /. or /.. is present. On Unix this means that $no_file +true makes this return ( '', $path, '' ). + +The directory portion may or may not be returned with a trailing '/'. + +The results can be passed to L</catpath()> to get back a path equivalent to +(usually identical to) the original path. + +=cut + +sub splitpath { + my ($self,$path, $nofile) = @_; + + my ($volume,$directory,$file) = ('','',''); + + if ( $nofile ) { + $directory = $path; + } + else { + $path =~ m|^ ( (?: .* / (?: \.\.?\Z(?!\n) )? )? ) ([^/]*) |xs; + $directory = $1; + $file = $2; + } + + return ($volume,$directory,$file); +} + + +=item splitdir + +The opposite of L</catdir()>. + + @dirs = File::Spec->splitdir( $directories ); + +$directories must be only the directory portion of the path on systems +that have the concept of a volume or that have path syntax that differentiates +files from directories. + +Unlike just splitting the directories on the separator, empty +directory names (C<''>) can be returned, because these are significant +on some OSs. + +On Unix, + + File::Spec->splitdir( "/a/b//c/" ); + +Yields: + + ( '', 'a', 'b', '', 'c', '' ) + +=cut + +sub splitdir { + return split m|/|, $_[1], -1; # Preserve trailing fields +} + + +=item catpath() + +Takes volume, directory and file portions and returns an entire path. Under +Unix, $volume is ignored, and directory and file are concatenated. A '/' is +inserted if needed (though if the directory portion doesn't start with +'/' it is not added). On other OSs, $volume is significant. + +=cut + +sub catpath { + my ($self,$volume,$directory,$file) = @_; + + if ( $directory ne '' && + $file ne '' && + substr( $directory, -1 ) ne '/' && + substr( $file, 0, 1 ) ne '/' + ) { + $directory .= "/$file" ; + } + else { + $directory .= $file ; + } + + return $directory ; +} + +=item abs2rel + +Takes a destination path and an optional base path returns a relative path +from the base path to the destination path: + + $rel_path = File::Spec->abs2rel( $path ) ; + $rel_path = File::Spec->abs2rel( $path, $base ) ; + +If $base is not present or '', then L<cwd()|Cwd> is used. If $base is +relative, then it is converted to absolute form using +L</rel2abs()>. This means that it is taken to be relative to +L<cwd()|Cwd>. + +On systems that have a grammar that indicates filenames, this ignores the +$base filename. Otherwise all path components are assumed to be +directories. + +If $path is relative, it is converted to absolute form using L</rel2abs()>. +This means that it is taken to be relative to L<cwd()|Cwd>. + +No checks against the filesystem are made. On VMS, there is +interaction with the working environment, as logicals and +macros are expanded. + +Based on code written by Shigio Yamaguchi. + +=cut + +sub abs2rel { + my($self,$path,$base) = @_; + + # Clean up $path + if ( ! $self->file_name_is_absolute( $path ) ) { + $path = $self->rel2abs( $path ) ; + } + else { + $path = $self->canonpath( $path ) ; + } + + # Figure out the effective $base and clean it up. + if ( !defined( $base ) || $base eq '' ) { + $base = $self->_cwd(); + } + elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + } + else { + $base = $self->canonpath( $base ) ; + } + + # Now, remove all leading components that are the same + my @pathchunks = $self->splitdir( $path); + my @basechunks = $self->splitdir( $base); + + while (@pathchunks && @basechunks && $pathchunks[0] eq $basechunks[0]) { + shift @pathchunks ; + shift @basechunks ; + } + + $path = CORE::join( '/', @pathchunks ); + $base = CORE::join( '/', @basechunks ); + + # $base now contains the directories the resulting relative path + # must ascend out of before it can descend to $path_directory. So, + # replace all names with $parentDir + $base =~ s|[^/]+|..|g ; + + # Glue the two together, using a separator if necessary, and preventing an + # empty result. + if ( $path ne '' && $base ne '' ) { + $path = "$base/$path" ; + } else { + $path = "$base$path" ; + } + + return $self->canonpath( $path ) ; +} + +=item rel2abs() + +Converts a relative path to an absolute path. + + $abs_path = File::Spec->rel2abs( $path ) ; + $abs_path = File::Spec->rel2abs( $path, $base ) ; + +If $base is not present or '', then L<cwd()|Cwd> is used. If $base is +relative, then it is converted to absolute form using +L</rel2abs()>. This means that it is taken to be relative to +L<cwd()|Cwd>. + +On systems that have a grammar that indicates filenames, this ignores +the $base filename. Otherwise all path components are assumed to be +directories. + +If $path is absolute, it is cleaned up and returned using L</canonpath()>. + +No checks against the filesystem are made. On VMS, there is +interaction with the working environment, as logicals and +macros are expanded. + +Based on code written by Shigio Yamaguchi. + +=cut + +sub rel2abs { + my ($self,$path,$base ) = @_; + + # Clean up $path + if ( ! $self->file_name_is_absolute( $path ) ) { + # Figure out the effective $base and clean it up. + if ( !defined( $base ) || $base eq '' ) { + $base = $self->_cwd(); + } + elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + } + else { + $base = $self->canonpath( $base ) ; + } + + # Glom them together + $path = $self->catdir( $base, $path ) ; + } + + return $self->canonpath( $path ) ; +} + +=back + +=head1 COPYRIGHT + +Copyright (c) 2004 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 SEE ALSO + +L<File::Spec> + +=cut + +# Internal routine to File::Spec, no point in making this public since +# it is the standard Cwd interface. Most of the platform-specific +# File::Spec subclasses use this. +sub _cwd { + require Cwd; + Cwd::cwd(); +} + + +# Internal method to reduce xx\..\yy -> yy +sub _collapse { + my($fs, $path) = @_; + + my $updir = $fs->updir; + my $curdir = $fs->curdir; + + my($vol, $dirs, $file) = $fs->splitpath($path); + my @dirs = $fs->splitdir($dirs); + + my @collapsed; + foreach my $dir (@dirs) { + if( $dir eq $updir and # if we have an updir + @collapsed and # and something to collapse + length $collapsed[-1] and # and its not the rootdir + $collapsed[-1] ne $updir and # nor another updir + $collapsed[-1] ne $curdir # nor the curdir + ) + { # then + pop @collapsed; # collapse + } + else { # else + push @collapsed, $dir; # just hang onto it + } + } + + return $fs->catpath($vol, + $fs->catdir(@collapsed), + $file + ); +} + + +1; diff --git a/Master/tlpkg/tlperl.old/lib/File/Spec/VMS.pm b/Master/tlpkg/tlperl.old/lib/File/Spec/VMS.pm new file mode 100644 index 00000000000..f8923f25fb2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/Spec/VMS.pm @@ -0,0 +1,521 @@ +package File::Spec::VMS; + +use strict; +use vars qw(@ISA $VERSION); +require File::Spec::Unix; + +$VERSION = '1.4'; + +@ISA = qw(File::Spec::Unix); + +use File::Basename; +use VMS::Filespec; + +=head1 NAME + +File::Spec::VMS - methods for VMS file specs + +=head1 SYNOPSIS + + require File::Spec::VMS; # Done internally by File::Spec if needed + +=head1 DESCRIPTION + +See File::Spec::Unix for a documentation of the methods provided +there. This package overrides the implementation of these methods, not +the semantics. + +=over 4 + +=item canonpath (override) + +Removes redundant portions of file specifications according to VMS syntax. + +=cut + +sub canonpath { + my($self,$path) = @_; + + if ($path =~ m|/|) { # Fake Unix + my $pathify = $path =~ m|/\Z(?!\n)|; + $path = $self->SUPER::canonpath($path); + if ($pathify) { return vmspath($path); } + else { return vmsify($path); } + } + else { + $path =~ tr/<>/[]/; # < and > ==> [ and ] + $path =~ s/\]\[\./\.\]\[/g; # ][. ==> .][ + $path =~ s/\[000000\.\]\[/\[/g; # [000000.][ ==> [ + $path =~ s/\[000000\./\[/g; # [000000. ==> [ + $path =~ s/\.\]\[000000\]/\]/g; # .][000000] ==> ] + $path =~ s/\.\]\[/\./g; # foo.][bar ==> foo.bar + 1 while ($path =~ s/([\[\.])(-+)\.(-+)([\.\]])/$1$2$3$4/); + # That loop does the following + # with any amount of dashes: + # .-.-. ==> .--. + # [-.-. ==> [--. + # .-.-] ==> .--] + # [-.-] ==> [--] + 1 while ($path =~ s/([\[\.])[^\]\.]+\.-(-+)([\]\.])/$1$2$3/); + # That loop does the following + # with any amount (minimum 2) + # of dashes: + # .foo.--. ==> .-. + # .foo.--] ==> .-] + # [foo.--. ==> [-. + # [foo.--] ==> [-] + # + # And then, the remaining cases + $path =~ s/\[\.-/[-/; # [.- ==> [- + $path =~ s/\.[^\]\.]+\.-\./\./g; # .foo.-. ==> . + $path =~ s/\[[^\]\.]+\.-\./\[/g; # [foo.-. ==> [ + $path =~ s/\.[^\]\.]+\.-\]/\]/g; # .foo.-] ==> ] + $path =~ s/\[[^\]\.]+\.-\]/\[000000\]/g;# [foo.-] ==> [000000] + $path =~ s/\[\]//; # [] ==> + return $path; + } +} + +=item catdir (override) + +Concatenates a list of file specifications, and returns the result as a +VMS-syntax directory specification. No check is made for "impossible" +cases (e.g. elements other than the first being absolute filespecs). + +=cut + +sub catdir { + my ($self,@dirs) = @_; + my $dir = pop @dirs; + @dirs = grep($_,@dirs); + my $rslt; + if (@dirs) { + my $path = (@dirs == 1 ? $dirs[0] : $self->catdir(@dirs)); + my ($spath,$sdir) = ($path,$dir); + $spath =~ s/\.dir\Z(?!\n)//; $sdir =~ s/\.dir\Z(?!\n)//; + $sdir = $self->eliminate_macros($sdir) unless $sdir =~ /^[\w\-]+\Z(?!\n)/s; + $rslt = $self->fixpath($self->eliminate_macros($spath)."/$sdir",1); + + # Special case for VMS absolute directory specs: these will have had device + # prepended during trip through Unix syntax in eliminate_macros(), since + # Unix syntax has no way to express "absolute from the top of this device's + # directory tree". + if ($spath =~ /^[\[<][^.\-]/s) { $rslt =~ s/^[^\[<]+//s; } + } + else { + if (not defined $dir or not length $dir) { $rslt = ''; } + elsif ($dir =~ /^\$\([^\)]+\)\Z(?!\n)/s) { $rslt = $dir; } + else { $rslt = vmspath($dir); } + } + return $self->canonpath($rslt); +} + +=item catfile (override) + +Concatenates a list of file specifications, and returns the result as a +VMS-syntax file specification. + +=cut + +sub catfile { + my ($self,@files) = @_; + my $file = $self->canonpath(pop @files); + @files = grep($_,@files); + my $rslt; + if (@files) { + my $path = (@files == 1 ? $files[0] : $self->catdir(@files)); + my $spath = $path; + $spath =~ s/\.dir\Z(?!\n)//; + if ($spath =~ /^[^\)\]\/:>]+\)\Z(?!\n)/s && basename($file) eq $file) { + $rslt = "$spath$file"; + } + else { + $rslt = $self->eliminate_macros($spath); + $rslt = vmsify($rslt.($rslt ? '/' : '').unixify($file)); + } + } + else { $rslt = (defined($file) && length($file)) ? vmsify($file) : ''; } + return $self->canonpath($rslt); +} + + +=item curdir (override) + +Returns a string representation of the current directory: '[]' + +=cut + +sub curdir { + return '[]'; +} + +=item devnull (override) + +Returns a string representation of the null device: '_NLA0:' + +=cut + +sub devnull { + return "_NLA0:"; +} + +=item rootdir (override) + +Returns a string representation of the root directory: 'SYS$DISK:[000000]' + +=cut + +sub rootdir { + return 'SYS$DISK:[000000]'; +} + +=item tmpdir (override) + +Returns a string representation of the first writable directory +from the following list or '' if none are writable: + + sys$scratch: + $ENV{TMPDIR} + +Since perl 5.8.0, if running under taint mode, and if $ENV{TMPDIR} +is tainted, it is not used. + +=cut + +my $tmpdir; +sub tmpdir { + return $tmpdir if defined $tmpdir; + $tmpdir = $_[0]->_tmpdir( 'sys$scratch:', $ENV{TMPDIR} ); +} + +=item updir (override) + +Returns a string representation of the parent directory: '[-]' + +=cut + +sub updir { + return '[-]'; +} + +=item case_tolerant (override) + +VMS file specification syntax is case-tolerant. + +=cut + +sub case_tolerant { + return 1; +} + +=item path (override) + +Translate logical name DCL$PATH as a searchlist, rather than trying +to C<split> string value of C<$ENV{'PATH'}>. + +=cut + +sub path { + my (@dirs,$dir,$i); + while ($dir = $ENV{'DCL$PATH;' . $i++}) { push(@dirs,$dir); } + return @dirs; +} + +=item file_name_is_absolute (override) + +Checks for VMS directory spec as well as Unix separators. + +=cut + +sub file_name_is_absolute { + my ($self,$file) = @_; + # If it's a logical name, expand it. + $file = $ENV{$file} while $file =~ /^[\w\$\-]+\Z(?!\n)/s && $ENV{$file}; + return scalar($file =~ m!^/!s || + $file =~ m![<\[][^.\-\]>]! || + $file =~ /:[^<\[]/); +} + +=item splitpath (override) + +Splits using VMS syntax. + +=cut + +sub splitpath { + my($self,$path) = @_; + my($dev,$dir,$file) = ('','',''); + + vmsify($path) =~ /(.+:)?([\[<].*[\]>])?(.*)/s; + return ($1 || '',$2 || '',$3); +} + +=item splitdir (override) + +Split dirspec using VMS syntax. + +=cut + +sub splitdir { + my($self,$dirspec) = @_; + $dirspec =~ tr/<>/[]/; # < and > ==> [ and ] + $dirspec =~ s/\]\[\./\.\]\[/g; # ][. ==> .][ + $dirspec =~ s/\[000000\.\]\[/\[/g; # [000000.][ ==> [ + $dirspec =~ s/\[000000\./\[/g; # [000000. ==> [ + $dirspec =~ s/\.\]\[000000\]/\]/g; # .][000000] ==> ] + $dirspec =~ s/\.\]\[/\./g; # foo.][bar ==> foo.bar + while ($dirspec =~ s/(^|[\[\<\.])\-(\-+)($|[\]\>\.])/$1-.$2$3/g) {} + # That loop does the following + # with any amount of dashes: + # .--. ==> .-.-. + # [--. ==> [-.-. + # .--] ==> .-.-] + # [--] ==> [-.-] + $dirspec = "[$dirspec]" unless $dirspec =~ /[\[<]/; # make legal + my(@dirs) = split('\.', vmspath($dirspec)); + $dirs[0] =~ s/^[\[<]//s; $dirs[-1] =~ s/[\]>]\Z(?!\n)//s; + @dirs; +} + + +=item catpath (override) + +Construct a complete filespec using VMS syntax + +=cut + +sub catpath { + my($self,$dev,$dir,$file) = @_; + + # We look for a volume in $dev, then in $dir, but not both + my ($dir_volume, $dir_dir, $dir_file) = $self->splitpath($dir); + $dev = $dir_volume unless length $dev; + $dir = length $dir_file ? $self->catfile($dir_dir, $dir_file) : $dir_dir; + + if ($dev =~ m|^/+([^/]+)|) { $dev = "$1:"; } + else { $dev .= ':' unless $dev eq '' or $dev =~ /:\Z(?!\n)/; } + if (length($dev) or length($dir)) { + $dir = "[$dir]" unless $dir =~ /[\[<\/]/; + $dir = vmspath($dir); + } + "$dev$dir$file"; +} + +=item abs2rel (override) + +Use VMS syntax when converting filespecs. + +=cut + +sub abs2rel { + my $self = shift; + return vmspath(File::Spec::Unix::abs2rel( $self, @_ )) + if grep m{/}, @_; + + my($path,$base) = @_; + $base = $self->_cwd() unless defined $base and length $base; + + for ($path, $base) { $_ = $self->canonpath($_) } + + # Are we even starting $path on the same (node::)device as $base? Note that + # logical paths or nodename differences may be on the "same device" + # but the comparison that ignores device differences so as to concatenate + # [---] up directory specs is not even a good idea in cases where there is + # a logical path difference between $path and $base nodename and/or device. + # Hence we fall back to returning the absolute $path spec + # if there is a case blind device (or node) difference of any sort + # and we do not even try to call $parse() or consult %ENV for $trnlnm() + # (this module needs to run on non VMS platforms after all). + + my ($path_volume, $path_directories, $path_file) = $self->splitpath($path); + my ($base_volume, $base_directories, $base_file) = $self->splitpath($base); + return $path unless lc($path_volume) eq lc($base_volume); + + for ($path, $base) { $_ = $self->rel2abs($_) } + + # Now, remove all leading components that are the same + my @pathchunks = $self->splitdir( $path_directories ); + unshift(@pathchunks,'000000') unless $pathchunks[0] eq '000000'; + my @basechunks = $self->splitdir( $base_directories ); + unshift(@basechunks,'000000') unless $basechunks[0] eq '000000'; + + while ( @pathchunks && + @basechunks && + lc( $pathchunks[0] ) eq lc( $basechunks[0] ) + ) { + shift @pathchunks ; + shift @basechunks ; + } + + # @basechunks now contains the directories to climb out of, + # @pathchunks now has the directories to descend in to. + $path_directories = join '.', ('-' x @basechunks, @pathchunks) ; + return $self->canonpath( $self->catpath( '', $path_directories, $path_file ) ) ; +} + + +=item rel2abs (override) + +Use VMS syntax when converting filespecs. + +=cut + +sub rel2abs { + my $self = shift ; + my ($path,$base ) = @_; + return undef unless defined $path; + if ($path =~ m/\//) { + $path = ( -d $path || $path =~ m/\/\z/ # educated guessing about + ? vmspath($path) # whether it's a directory + : vmsify($path) ); + } + $base = vmspath($base) if defined $base && $base =~ m/\//; + # Clean up and split up $path + if ( ! $self->file_name_is_absolute( $path ) ) { + # Figure out the effective $base and clean it up. + if ( !defined( $base ) || $base eq '' ) { + $base = $self->_cwd; + } + elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + } + else { + $base = $self->canonpath( $base ) ; + } + + # Split up paths + my ( $path_directories, $path_file ) = + ($self->splitpath( $path ))[1,2] ; + + my ( $base_volume, $base_directories ) = + $self->splitpath( $base ) ; + + $path_directories = '' if $path_directories eq '[]' || + $path_directories eq '<>'; + my $sep = '' ; + $sep = '.' + if ( $base_directories =~ m{[^.\]>]\Z(?!\n)} && + $path_directories =~ m{^[^.\[<]}s + ) ; + $base_directories = "$base_directories$sep$path_directories"; + $base_directories =~ s{\.?[\]>][\[<]\.?}{.}; + + $path = $self->catpath( $base_volume, $base_directories, $path_file ); + } + + return $self->canonpath( $path ) ; +} + + +# eliminate_macros() and fixpath() are MakeMaker-specific methods +# which are used inside catfile() and catdir(). MakeMaker has its own +# copies as of 6.06_03 which are the canonical ones. We leave these +# here, in peace, so that File::Spec continues to work with MakeMakers +# prior to 6.06_03. +# +# Please consider these two methods deprecated. Do not patch them, +# patch the ones in ExtUtils::MM_VMS instead. +sub eliminate_macros { + my($self,$path) = @_; + return '' unless $path; + $self = {} unless ref $self; + + if ($path =~ /\s/) { + return join ' ', map { $self->eliminate_macros($_) } split /\s+/, $path; + } + + my($npath) = unixify($path); + my($complex) = 0; + my($head,$macro,$tail); + + # perform m##g in scalar context so it acts as an iterator + while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#gs) { + if ($self->{$2}) { + ($head,$macro,$tail) = ($1,$2,$3); + if (ref $self->{$macro}) { + if (ref $self->{$macro} eq 'ARRAY') { + $macro = join ' ', @{$self->{$macro}}; + } + else { + print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}), + "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n"; + $macro = "\cB$macro\cB"; + $complex = 1; + } + } + else { ($macro = unixify($self->{$macro})) =~ s#/\Z(?!\n)##; } + $npath = "$head$macro$tail"; + } + } + if ($complex) { $npath =~ s#\cB(.*?)\cB#\${$1}#gs; } + $npath; +} + +# Deprecated. See the note above for eliminate_macros(). +sub fixpath { + my($self,$path,$force_path) = @_; + return '' unless $path; + $self = bless {} unless ref $self; + my($fixedpath,$prefix,$name); + + if ($path =~ /\s/) { + return join ' ', + map { $self->fixpath($_,$force_path) } + split /\s+/, $path; + } + + if ($path =~ m#^\$\([^\)]+\)\Z(?!\n)#s || $path =~ m#[/:>\]]#) { + if ($force_path or $path =~ /(?:DIR\)|\])\Z(?!\n)/) { + $fixedpath = vmspath($self->eliminate_macros($path)); + } + else { + $fixedpath = vmsify($self->eliminate_macros($path)); + } + } + elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#s)) && $self->{$prefix}) { + my($vmspre) = $self->eliminate_macros("\$($prefix)"); + # is it a dir or just a name? + $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\Z(?!\n)/) ? vmspath($vmspre) : ''; + $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name; + $fixedpath = vmspath($fixedpath) if $force_path; + } + else { + $fixedpath = $path; + $fixedpath = vmspath($fixedpath) if $force_path; + } + # No hints, so we try to guess + if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) { + $fixedpath = vmspath($fixedpath) if -d $fixedpath; + } + + # Trim off root dirname if it's had other dirs inserted in front of it. + $fixedpath =~ s/\.000000([\]>])/$1/; + # Special case for VMS absolute directory specs: these will have had device + # prepended during trip through Unix syntax in eliminate_macros(), since + # Unix syntax has no way to express "absolute from the top of this device's + # directory tree". + if ($path =~ /^[\[>][^.\-]/) { $fixedpath =~ s/^[^\[<]+//; } + $fixedpath; +} + + +=back + +=head1 COPYRIGHT + +Copyright (c) 2004 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 SEE ALSO + +See L<File::Spec> and L<File::Spec::Unix>. This package overrides the +implementation of these methods, not the semantics. + +An explanation of VMS file specs can be found at +L<"http://h71000.www7.hp.com/doc/731FINAL/4506/4506pro_014.html#apps_locating_naming_files">. + +=cut + +1; diff --git a/Master/tlpkg/tlperl.old/lib/File/Spec/Win32.pm b/Master/tlpkg/tlperl.old/lib/File/Spec/Win32.pm new file mode 100644 index 00000000000..a324306a74b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/Spec/Win32.pm @@ -0,0 +1,369 @@ +package File::Spec::Win32; + +use strict; + +use vars qw(@ISA $VERSION); +require File::Spec::Unix; + +$VERSION = '1.6'; + +@ISA = qw(File::Spec::Unix); + +=head1 NAME + +File::Spec::Win32 - methods for Win32 file specs + +=head1 SYNOPSIS + + require File::Spec::Win32; # Done internally by File::Spec if needed + +=head1 DESCRIPTION + +See File::Spec::Unix for a documentation of the methods provided +there. This package overrides the implementation of these methods, not +the semantics. + +=over 4 + +=item devnull + +Returns a string representation of the null device. + +=cut + +sub devnull { + return "nul"; +} + +sub rootdir () { '\\' } + + +=item tmpdir + +Returns a string representation of the first existing directory +from the following list: + + $ENV{TMPDIR} + $ENV{TEMP} + $ENV{TMP} + SYS:/temp + C:\system\temp + C:/temp + /tmp + / + +The SYS:/temp is preferred in Novell NetWare and the C:\system\temp +for Symbian (the File::Spec::Win32 is used also for those platforms). + +Since Perl 5.8.0, if running under taint mode, and if the environment +variables are tainted, they are not used. + +=cut + +my $tmpdir; +sub tmpdir { + return $tmpdir if defined $tmpdir; + $tmpdir = $_[0]->_tmpdir( @ENV{qw(TMPDIR TEMP TMP)}, + 'SYS:/temp', + 'C:\system\temp', + 'C:/temp', + '/tmp', + '/' ); +} + +sub case_tolerant { + return 1; +} + +sub file_name_is_absolute { + my ($self,$file) = @_; + return scalar($file =~ m{^([a-z]:)?[\\/]}is); +} + +=item catfile + +Concatenate one or more directory names and a filename to form a +complete path ending with a filename + +=cut + +sub catfile { + my $self = shift; + my $file = $self->canonpath(pop @_); + return $file unless @_; + my $dir = $self->catdir(@_); + $dir .= "\\" unless substr($dir,-1) eq "\\"; + return $dir.$file; +} + +sub catdir { + my $self = shift; + my @args = @_; + foreach (@args) { + tr[/][\\]; + # append a backslash to each argument unless it has one there + $_ .= "\\" unless m{\\$}; + } + return $self->canonpath(join('', @args)); +} + +sub path { + my @path = split(';', $ENV{PATH}); + s/"//g for @path; + @path = grep length, @path; + unshift(@path, "."); + return @path; +} + +=item canonpath + +No physical check on the filesystem, but a logical cleanup of a +path. On UNIX eliminated successive slashes and successive "/.". +On Win32 makes + + dir1\dir2\dir3\..\..\dir4 -> \dir\dir4 and even + dir1\dir2\dir3\...\dir4 -> \dir\dir4 + +=cut + +sub canonpath { + my ($self,$path) = @_; + + $path =~ s/^([a-z]:)/\u$1/s; + $path =~ s|/|\\|g; + $path =~ s|([^\\])\\+|$1\\|g; # xx\\\\xx -> xx\xx + $path =~ s|(\\\.)+\\|\\|g; # xx\.\.\xx -> xx\xx + $path =~ s|^(\.\\)+||s unless $path eq ".\\"; # .\xx -> xx + $path =~ s|\\\Z(?!\n)|| + unless $path =~ m{^([A-Z]:)?\\\Z(?!\n)}s; # xx\ -> xx + # xx1/xx2/xx3/../../xx -> xx1/xx + $path =~ s|\\\.\.\.\\|\\\.\.\\\.\.\\|g; # \...\ is 2 levels up + $path =~ s|^\.\.\.\\|\.\.\\\.\.\\|g; # ...\ is 2 levels up + return $path if $path =~ m|^\.\.|; # skip relative paths + return $path unless $path =~ /\.\./; # too few .'s to cleanup + return $path if $path =~ /\.\.\.\./; # too many .'s to cleanup + $path =~ s{^\\\.\.$}{\\}; # \.. -> \ + 1 while $path =~ s{^\\\.\.}{}; # \..\xx -> \xx + + return $self->_collapse($path); +} + +=item splitpath + + ($volume,$directories,$file) = File::Spec->splitpath( $path ); + ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file ); + +Splits a path into volume, directory, and filename portions. Assumes that +the last file is a path unless the path ends in '\\', '\\.', '\\..' +or $no_file is true. On Win32 this means that $no_file true makes this return +( $volume, $path, '' ). + +Separators accepted are \ and /. + +Volumes can be drive letters or UNC sharenames (\\server\share). + +The results can be passed to L</catpath> to get back a path equivalent to +(usually identical to) the original path. + +=cut + +sub splitpath { + my ($self,$path, $nofile) = @_; + my ($volume,$directory,$file) = ('','',''); + if ( $nofile ) { + $path =~ + m{^( (?:[a-zA-Z]:|(?:\\\\|//)[^\\/]+[\\/][^\\/]+)? ) + (.*) + }xs; + $volume = $1; + $directory = $2; + } + else { + $path =~ + m{^ ( (?: [a-zA-Z]: | + (?:\\\\|//)[^\\/]+[\\/][^\\/]+ + )? + ) + ( (?:.*[\\/](?:\.\.?\Z(?!\n))?)? ) + (.*) + }xs; + $volume = $1; + $directory = $2; + $file = $3; + } + + return ($volume,$directory,$file); +} + + +=item splitdir + +The opposite of L<catdir()|File::Spec/catdir()>. + + @dirs = File::Spec->splitdir( $directories ); + +$directories must be only the directory portion of the path on systems +that have the concept of a volume or that have path syntax that differentiates +files from directories. + +Unlike just splitting the directories on the separator, leading empty and +trailing directory entries can be returned, because these are significant +on some OSs. So, + + File::Spec->splitdir( "/a/b/c" ); + +Yields: + + ( '', 'a', 'b', '', 'c', '' ) + +=cut + +sub splitdir { + my ($self,$directories) = @_ ; + # + # split() likes to forget about trailing null fields, so here we + # check to be sure that there will not be any before handling the + # simple case. + # + if ( $directories !~ m|[\\/]\Z(?!\n)| ) { + return split( m|[\\/]|, $directories ); + } + else { + # + # since there was a trailing separator, add a file name to the end, + # then do the split, then replace it with ''. + # + my( @directories )= split( m|[\\/]|, "${directories}dummy" ) ; + $directories[ $#directories ]= '' ; + return @directories ; + } +} + + +=item catpath + +Takes volume, directory and file portions and returns an entire path. Under +Unix, $volume is ignored, and this is just like catfile(). On other OSs, +the $volume become significant. + +=cut + +sub catpath { + my ($self,$volume,$directory,$file) = @_; + + # If it's UNC, make sure the glue separator is there, reusing + # whatever separator is first in the $volume + my $v; + $volume .= $v + if ( (($v) = $volume =~ m@^([\\/])[\\/][^\\/]+[\\/][^\\/]+\Z(?!\n)@s) && + $directory =~ m@^[^\\/]@s + ) ; + + $volume .= $directory ; + + # If the volume is not just A:, make sure the glue separator is + # there, reusing whatever separator is first in the $volume if possible. + if ( $volume !~ m@^[a-zA-Z]:\Z(?!\n)@s && + $volume =~ m@[^\\/]\Z(?!\n)@ && + $file =~ m@[^\\/]@ + ) { + $volume =~ m@([\\/])@ ; + my $sep = $1 ? $1 : '\\' ; + $volume .= $sep ; + } + + $volume .= $file ; + + return $volume ; +} + + +sub abs2rel { + my($self,$path,$base) = @_; + $base = $self->_cwd() unless defined $base and length $base; + + for ($path, $base) { $_ = $self->canonpath($_) } + + my ($path_volume) = $self->splitpath($path, 1); + my ($base_volume) = $self->splitpath($base, 1); + + # Can't relativize across volumes + return $path unless $path_volume eq $base_volume; + + for ($path, $base) { $_ = $self->rel2abs($_) } + + my $path_directories = ($self->splitpath($path, 1))[1]; + my $base_directories = ($self->splitpath($base, 1))[1]; + + # Now, remove all leading components that are the same + my @pathchunks = $self->splitdir( $path_directories ); + my @basechunks = $self->splitdir( $base_directories ); + + while ( @pathchunks && + @basechunks && + lc( $pathchunks[0] ) eq lc( $basechunks[0] ) + ) { + shift @pathchunks ; + shift @basechunks ; + } + + my $result_dirs = $self->catdir( ($self->updir) x @basechunks, @pathchunks ); + + return $self->canonpath( $self->catpath('', $result_dirs, '') ); +} + + +sub rel2abs { + my ($self,$path,$base ) = @_; + + if ( ! $self->file_name_is_absolute( $path ) ) { + + if ( !defined( $base ) || $base eq '' ) { + require Cwd ; + $base = Cwd::getdcwd( ($self->splitpath( $path ))[0] ) if defined &Cwd::getdcwd ; + $base = $self->_cwd() unless defined $base ; + } + elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + } + else { + $base = $self->canonpath( $base ) ; + } + + my ( $path_directories, $path_file ) = + ($self->splitpath( $path, 1 ))[1,2] ; + + my ( $base_volume, $base_directories ) = + $self->splitpath( $base, 1 ) ; + + $path = $self->catpath( + $base_volume, + $self->catdir( $base_directories, $path_directories ), + $path_file + ) ; + } + + return $self->canonpath( $path ) ; +} + +=back + +=head2 Note For File::Spec::Win32 Maintainers + +Novell NetWare inherits its File::Spec behaviour from File::Spec::Win32. + +=head1 COPYRIGHT + +Copyright (c) 2004 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 SEE ALSO + +See L<File::Spec> and L<File::Spec::Unix>. This package overrides the +implementation of these methods, not the semantics. + +=cut + +1; diff --git a/Master/tlpkg/tlperl.old/lib/File/Temp.pm b/Master/tlpkg/tlperl.old/lib/File/Temp.pm new file mode 100644 index 00000000000..6ddcb3619a7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/Temp.pm @@ -0,0 +1,2244 @@ +package File::Temp; + +=head1 NAME + +File::Temp - return name and handle of a temporary file safely + +=begin __INTERNALS + +=head1 PORTABILITY + +This section is at the top in order to provide easier access to +porters. It is not expected to be rendered by a standard pod +formatting tool. Please skip straight to the SYNOPSIS section if you +are not trying to port this module to a new platform. + +This module is designed to be portable across operating systems and it +currently supports Unix, VMS, DOS, OS/2, Windows and Mac OS +(Classic). When porting to a new OS there are generally three main +issues that have to be solved: + +=over 4 + +=item * + +Can the OS unlink an open file? If it can not then the +C<_can_unlink_opened_file> method should be modified. + +=item * + +Are the return values from C<stat> reliable? By default all the +return values from C<stat> are compared when unlinking a temporary +file using the filename and the handle. Operating systems other than +unix do not always have valid entries in all fields. If C<unlink0> fails +then the C<stat> comparison should be modified accordingly. + +=item * + +Security. Systems that can not support a test for the sticky bit +on a directory can not use the MEDIUM and HIGH security tests. +The C<_can_do_level> method should be modified accordingly. + +=back + +=end __INTERNALS + +=head1 SYNOPSIS + + use File::Temp qw/ tempfile tempdir /; + + $fh = tempfile(); + ($fh, $filename) = tempfile(); + + ($fh, $filename) = tempfile( $template, DIR => $dir); + ($fh, $filename) = tempfile( $template, SUFFIX => '.dat'); + + + $dir = tempdir( CLEANUP => 1 ); + ($fh, $filename) = tempfile( DIR => $dir ); + +Object interface: + + require File::Temp; + use File::Temp (); + + $fh = new File::Temp($template); + $fname = $fh->filename; + + $tmp = new File::Temp( UNLINK => 0, SUFFIX => '.dat' ); + print $tmp "Some data\n"; + print "Filename is $tmp\n"; + +The following interfaces are provided for compatibility with +existing APIs. They should not be used in new code. + +MkTemp family: + + use File::Temp qw/ :mktemp /; + + ($fh, $file) = mkstemp( "tmpfileXXXXX" ); + ($fh, $file) = mkstemps( "tmpfileXXXXXX", $suffix); + + $tmpdir = mkdtemp( $template ); + + $unopened_file = mktemp( $template ); + +POSIX functions: + + use File::Temp qw/ :POSIX /; + + $file = tmpnam(); + $fh = tmpfile(); + + ($fh, $file) = tmpnam(); + +Compatibility functions: + + $unopened_file = File::Temp::tempnam( $dir, $pfx ); + +=head1 DESCRIPTION + +C<File::Temp> can be used to create and open temporary files in a safe +way. There is both a function interface and an object-oriented +interface. The File::Temp constructor or the tempfile() function can +be used to return the name and the open filehandle of a temporary +file. The tempdir() function can be used to create a temporary +directory. + +The security aspect of temporary file creation is emphasized such that +a filehandle and filename are returned together. This helps guarantee +that a race condition can not occur where the temporary file is +created by another process between checking for the existence of the +file and its opening. Additional security levels are provided to +check, for example, that the sticky bit is set on world writable +directories. See L<"safe_level"> for more information. + +For compatibility with popular C library functions, Perl implementations of +the mkstemp() family of functions are provided. These are, mkstemp(), +mkstemps(), mkdtemp() and mktemp(). + +Additionally, implementations of the standard L<POSIX|POSIX> +tmpnam() and tmpfile() functions are provided if required. + +Implementations of mktemp(), tmpnam(), and tempnam() are provided, +but should be used with caution since they return only a filename +that was valid when function was called, so cannot guarantee +that the file will not exist by the time the caller opens the filename. + +=cut + +# 5.6.0 gives us S_IWOTH, S_IWGRP, our and auto-vivifying filehandls +# People would like a version on 5.005 so give them what they want :-) +use 5.005; +use strict; +use Carp; +use File::Spec 0.8; +use File::Path qw/ rmtree /; +use Fcntl 1.03; +use Errno; +require VMS::Stdio if $^O eq 'VMS'; + +# Need the Symbol package if we are running older perl +require Symbol if $] < 5.006; + +### For the OO interface +use base qw/ IO::Handle /; +use overload '""' => "STRINGIFY"; + + +# use 'our' on v5.6.0 +use vars qw($VERSION @EXPORT_OK %EXPORT_TAGS $DEBUG $KEEP_ALL); + +$DEBUG = 0; +$KEEP_ALL = 0; + +# We are exporting functions + +use base qw/Exporter/; + +# Export list - to allow fine tuning of export table + +@EXPORT_OK = qw{ + tempfile + tempdir + tmpnam + tmpfile + mktemp + mkstemp + mkstemps + mkdtemp + unlink0 + cleanup + }; + +# Groups of functions for export + +%EXPORT_TAGS = ( + 'POSIX' => [qw/ tmpnam tmpfile /], + 'mktemp' => [qw/ mktemp mkstemp mkstemps mkdtemp/], + ); + +# add contents of these tags to @EXPORT +Exporter::export_tags('POSIX','mktemp'); + +# Version number + +$VERSION = '0.16'; + +# This is a list of characters that can be used in random filenames + +my @CHARS = (qw/ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + a b c d e f g h i j k l m n o p q r s t u v w x y z + 0 1 2 3 4 5 6 7 8 9 _ + /); + +# Maximum number of tries to make a temp file before failing + +use constant MAX_TRIES => 1000; + +# Minimum number of X characters that should be in a template +use constant MINX => 4; + +# Default template when no template supplied + +use constant TEMPXXX => 'X' x 10; + +# Constants for the security level + +use constant STANDARD => 0; +use constant MEDIUM => 1; +use constant HIGH => 2; + +# OPENFLAGS. If we defined the flag to use with Sysopen here this gives +# us an optimisation when many temporary files are requested + +my $OPENFLAGS = O_CREAT | O_EXCL | O_RDWR; + +unless ($^O eq 'MacOS') { + for my $oflag (qw/ NOFOLLOW BINARY LARGEFILE EXLOCK NOINHERIT /) { + my ($bit, $func) = (0, "Fcntl::O_" . $oflag); + no strict 'refs'; + $OPENFLAGS |= $bit if eval { + # Make sure that redefined die handlers do not cause problems + # eg CGI::Carp + local $SIG{__DIE__} = sub {}; + local $SIG{__WARN__} = sub {}; + $bit = &$func(); + 1; + }; + } +} + +# On some systems the O_TEMPORARY flag can be used to tell the OS +# to automatically remove the file when it is closed. This is fine +# in most cases but not if tempfile is called with UNLINK=>0 and +# the filename is requested -- in the case where the filename is to +# be passed to another routine. This happens on windows. We overcome +# this by using a second open flags variable + +my $OPENTEMPFLAGS = $OPENFLAGS; +unless ($^O eq 'MacOS') { + for my $oflag (qw/ TEMPORARY /) { + my ($bit, $func) = (0, "Fcntl::O_" . $oflag); + no strict 'refs'; + $OPENTEMPFLAGS |= $bit if eval { + # Make sure that redefined die handlers do not cause problems + # eg CGI::Carp + local $SIG{__DIE__} = sub {}; + local $SIG{__WARN__} = sub {}; + $bit = &$func(); + 1; + }; + } +} + +# INTERNAL ROUTINES - not to be used outside of package + +# Generic routine for getting a temporary filename +# modelled on OpenBSD _gettemp() in mktemp.c + +# The template must contain X's that are to be replaced +# with the random values + +# Arguments: + +# TEMPLATE - string containing the XXXXX's that is converted +# to a random filename and opened if required + +# Optionally, a hash can also be supplied containing specific options +# "open" => if true open the temp file, else just return the name +# default is 0 +# "mkdir"=> if true, we are creating a temp directory rather than tempfile +# default is 0 +# "suffixlen" => number of characters at end of PATH to be ignored. +# default is 0. +# "unlink_on_close" => indicates that, if possible, the OS should remove +# the file as soon as it is closed. Usually indicates +# use of the O_TEMPORARY flag to sysopen. +# Usually irrelevant on unix + +# Optionally a reference to a scalar can be passed into the function +# On error this will be used to store the reason for the error +# "ErrStr" => \$errstr + +# "open" and "mkdir" can not both be true +# "unlink_on_close" is not used when "mkdir" is true. + +# The default options are equivalent to mktemp(). + +# Returns: +# filehandle - open file handle (if called with doopen=1, else undef) +# temp name - name of the temp file or directory + +# For example: +# ($fh, $name) = _gettemp($template, "open" => 1); + +# for the current version, failures are associated with +# stored in an error string and returned to give the reason whilst debugging +# This routine is not called by any external function +sub _gettemp { + + croak 'Usage: ($fh, $name) = _gettemp($template, OPTIONS);' + unless scalar(@_) >= 1; + + # the internal error string - expect it to be overridden + # Need this in case the caller decides not to supply us a value + # need an anonymous scalar + my $tempErrStr; + + # Default options + my %options = ( + "open" => 0, + "mkdir" => 0, + "suffixlen" => 0, + "unlink_on_close" => 0, + "ErrStr" => \$tempErrStr, + ); + + # Read the template + my $template = shift; + if (ref($template)) { + # Use a warning here since we have not yet merged ErrStr + carp "File::Temp::_gettemp: template must not be a reference"; + return (); + } + + # Check that the number of entries on stack are even + if (scalar(@_) % 2 != 0) { + # Use a warning here since we have not yet merged ErrStr + carp "File::Temp::_gettemp: Must have even number of options"; + return (); + } + + # Read the options and merge with defaults + %options = (%options, @_) if @_; + + # Make sure the error string is set to undef + ${$options{ErrStr}} = undef; + + # Can not open the file and make a directory in a single call + if ($options{"open"} && $options{"mkdir"}) { + ${$options{ErrStr}} = "doopen and domkdir can not both be true\n"; + return (); + } + + # Find the start of the end of the Xs (position of last X) + # Substr starts from 0 + my $start = length($template) - 1 - $options{"suffixlen"}; + + # Check that we have at least MINX x X (eg 'XXXX") at the end of the string + # (taking suffixlen into account). Any fewer is insecure. + + # Do it using substr - no reason to use a pattern match since + # we know where we are looking and what we are looking for + + if (substr($template, $start - MINX + 1, MINX) ne 'X' x MINX) { + ${$options{ErrStr}} = "The template must end with at least ". + MINX . " 'X' characters\n"; + return (); + } + + # Replace all the X at the end of the substring with a + # random character or just all the XX at the end of a full string. + # Do it as an if, since the suffix adjusts which section to replace + # and suffixlen=0 returns nothing if used in the substr directly + # and generate a full path from the template + + my $path = _replace_XX($template, $options{"suffixlen"}); + + + # Split the path into constituent parts - eventually we need to check + # whether the directory exists + # We need to know whether we are making a temp directory + # or a tempfile + + my ($volume, $directories, $file); + my $parent; # parent directory + if ($options{"mkdir"}) { + # There is no filename at the end + ($volume, $directories, $file) = File::Spec->splitpath( $path, 1); + + # The parent is then $directories without the last directory + # Split the directory and put it back together again + my @dirs = File::Spec->splitdir($directories); + + # If @dirs only has one entry (i.e. the directory template) that means + # we are in the current directory + if ($#dirs == 0) { + $parent = File::Spec->curdir; + } else { + + if ($^O eq 'VMS') { # need volume to avoid relative dir spec + $parent = File::Spec->catdir($volume, @dirs[0..$#dirs-1]); + $parent = 'sys$disk:[]' if $parent eq ''; + } else { + + # Put it back together without the last one + $parent = File::Spec->catdir(@dirs[0..$#dirs-1]); + + # ...and attach the volume (no filename) + $parent = File::Spec->catpath($volume, $parent, ''); + } + + } + + } else { + + # Get rid of the last filename (use File::Basename for this?) + ($volume, $directories, $file) = File::Spec->splitpath( $path ); + + # Join up without the file part + $parent = File::Spec->catpath($volume,$directories,''); + + # If $parent is empty replace with curdir + $parent = File::Spec->curdir + unless $directories ne ''; + + } + + # Check that the parent directories exist + # Do this even for the case where we are simply returning a name + # not a file -- no point returning a name that includes a directory + # that does not exist or is not writable + + unless (-d $parent) { + ${$options{ErrStr}} = "Parent directory ($parent) is not a directory"; + return (); + } + unless (-w $parent) { + ${$options{ErrStr}} = "Parent directory ($parent) is not writable\n"; + return (); + } + + + # Check the stickiness of the directory and chown giveaway if required + # If the directory is world writable the sticky bit + # must be set + + if (File::Temp->safe_level == MEDIUM) { + my $safeerr; + unless (_is_safe($parent,\$safeerr)) { + ${$options{ErrStr}} = "Parent directory ($parent) is not safe ($safeerr)"; + return (); + } + } elsif (File::Temp->safe_level == HIGH) { + my $safeerr; + unless (_is_verysafe($parent, \$safeerr)) { + ${$options{ErrStr}} = "Parent directory ($parent) is not safe ($safeerr)"; + return (); + } + } + + + # Now try MAX_TRIES time to open the file + for (my $i = 0; $i < MAX_TRIES; $i++) { + + # Try to open the file if requested + if ($options{"open"}) { + my $fh; + + # If we are running before perl5.6.0 we can not auto-vivify + if ($] < 5.006) { + $fh = &Symbol::gensym; + } + + # Try to make sure this will be marked close-on-exec + # XXX: Win32 doesn't respect this, nor the proper fcntl, + # but may have O_NOINHERIT. This may or may not be in Fcntl. + local $^F = 2; + + # Store callers umask + my $umask = umask(); + + # Set a known umask + umask(066); + + # Attempt to open the file + my $open_success = undef; + if ( $^O eq 'VMS' and $options{"unlink_on_close"} && !$KEEP_ALL) { + # make it auto delete on close by setting FAB$V_DLT bit + $fh = VMS::Stdio::vmssysopen($path, $OPENFLAGS, 0600, 'fop=dlt'); + $open_success = $fh; + } else { + my $flags = ( ($options{"unlink_on_close"} && !$KEEP_ALL) ? + $OPENTEMPFLAGS : + $OPENFLAGS ); + $open_success = sysopen($fh, $path, $flags, 0600); + } + if ( $open_success ) { + + # Reset umask + umask($umask) if defined $umask; + + # Opened successfully - return file handle and name + return ($fh, $path); + + } else { + # Reset umask + umask($umask) if defined $umask; + + # Error opening file - abort with error + # if the reason was anything but EEXIST + unless ($!{EEXIST}) { + ${$options{ErrStr}} = "Could not create temp file $path: $!"; + return (); + } + + # Loop round for another try + + } + } elsif ($options{"mkdir"}) { + + # Store callers umask + my $umask = umask(); + + # Set a known umask + umask(066); + + # Open the temp directory + if (mkdir( $path, 0700)) { + # created okay + # Reset umask + umask($umask) if defined $umask; + + return undef, $path; + } else { + + # Reset umask + umask($umask) if defined $umask; + + # Abort with error if the reason for failure was anything + # except EEXIST + unless ($!{EEXIST}) { + ${$options{ErrStr}} = "Could not create directory $path: $!"; + return (); + } + + # Loop round for another try + + } + + } else { + + # Return true if the file can not be found + # Directory has been checked previously + + return (undef, $path) unless -e $path; + + # Try again until MAX_TRIES + + } + + # Did not successfully open the tempfile/dir + # so try again with a different set of random letters + # No point in trying to increment unless we have only + # 1 X say and the randomness could come up with the same + # file MAX_TRIES in a row. + + # Store current attempt - in principal this implies that the + # 3rd time around the open attempt that the first temp file + # name could be generated again. Probably should store each + # attempt and make sure that none are repeated + + my $original = $path; + my $counter = 0; # Stop infinite loop + my $MAX_GUESS = 50; + + do { + + # Generate new name from original template + $path = _replace_XX($template, $options{"suffixlen"}); + + $counter++; + + } until ($path ne $original || $counter > $MAX_GUESS); + + # Check for out of control looping + if ($counter > $MAX_GUESS) { + ${$options{ErrStr}} = "Tried to get a new temp name different to the previous value $MAX_GUESS times.\nSomething wrong with template?? ($template)"; + return (); + } + + } + + # If we get here, we have run out of tries + ${ $options{ErrStr} } = "Have exceeded the maximum number of attempts (" + . MAX_TRIES . ") to open temp file/dir"; + + return (); + +} + +# Internal routine to return a random character from the +# character list. Does not do an srand() since rand() +# will do one automatically + +# No arguments. Return value is the random character + +# No longer called since _replace_XX runs a few percent faster if +# I inline the code. This is important if we are creating thousands of +# temporary files. + +sub _randchar { + + $CHARS[ int( rand( $#CHARS ) ) ]; + +} + +# Internal routine to replace the XXXX... with random characters +# This has to be done by _gettemp() every time it fails to +# open a temp file/dir + +# Arguments: $template (the template with XXX), +# $ignore (number of characters at end to ignore) + +# Returns: modified template + +sub _replace_XX { + + croak 'Usage: _replace_XX($template, $ignore)' + unless scalar(@_) == 2; + + my ($path, $ignore) = @_; + + # Do it as an if, since the suffix adjusts which section to replace + # and suffixlen=0 returns nothing if used in the substr directly + # Alternatively, could simply set $ignore to length($path)-1 + # Don't want to always use substr when not required though. + + if ($ignore) { + substr($path, 0, - $ignore) =~ s/X(?=X*\z)/$CHARS[ int( rand( $#CHARS ) ) ]/ge; + } else { + $path =~ s/X(?=X*\z)/$CHARS[ int( rand( $#CHARS ) ) ]/ge; + } + return $path; +} + +# Internal routine to force a temp file to be writable after +# it is created so that we can unlink it. Windows seems to occassionally +# force a file to be readonly when written to certain temp locations +sub _force_writable { + my $file = shift; + my $umask = umask(); + umask(066); + chmod 0600, $file; + umask($umask) if defined $umask; +} + + +# internal routine to check to see if the directory is safe +# First checks to see if the directory is not owned by the +# current user or root. Then checks to see if anyone else +# can write to the directory and if so, checks to see if +# it has the sticky bit set + +# Will not work on systems that do not support sticky bit + +#Args: directory path to check +# Optionally: reference to scalar to contain error message +# Returns true if the path is safe and false otherwise. +# Returns undef if can not even run stat() on the path + +# This routine based on version written by Tom Christiansen + +# Presumably, by the time we actually attempt to create the +# file or directory in this directory, it may not be safe +# anymore... Have to run _is_safe directly after the open. + +sub _is_safe { + + my $path = shift; + my $err_ref = shift; + + # Stat path + my @info = stat($path); + unless (scalar(@info)) { + $$err_ref = "stat(path) returned no values"; + return 0; + }; + return 1 if $^O eq 'VMS'; # owner delete control at file level + + # Check to see whether owner is neither superuser (or a system uid) nor me + # Use the real uid from the $< variable + # UID is in [4] + if ($info[4] > File::Temp->top_system_uid() && $info[4] != $<) { + + Carp::cluck(sprintf "uid=$info[4] topuid=%s \$<=$< path='$path'", + File::Temp->top_system_uid()); + + $$err_ref = "Directory owned neither by root nor the current user" + if ref($err_ref); + return 0; + } + + # check whether group or other can write file + # use 066 to detect either reading or writing + # use 022 to check writability + # Do it with S_IWOTH and S_IWGRP for portability (maybe) + # mode is in info[2] + if (($info[2] & &Fcntl::S_IWGRP) || # Is group writable? + ($info[2] & &Fcntl::S_IWOTH) ) { # Is world writable? + # Must be a directory + unless (-d $path) { + $$err_ref = "Path ($path) is not a directory" + if ref($err_ref); + return 0; + } + # Must have sticky bit set + unless (-k $path) { + $$err_ref = "Sticky bit not set on $path when dir is group|world writable" + if ref($err_ref); + return 0; + } + } + + return 1; +} + +# Internal routine to check whether a directory is safe +# for temp files. Safer than _is_safe since it checks for +# the possibility of chown giveaway and if that is a possibility +# checks each directory in the path to see if it is safe (with _is_safe) + +# If _PC_CHOWN_RESTRICTED is not set, does the full test of each +# directory anyway. + +# Takes optional second arg as scalar ref to error reason + +sub _is_verysafe { + + # Need POSIX - but only want to bother if really necessary due to overhead + require POSIX; + + my $path = shift; + print "_is_verysafe testing $path\n" if $DEBUG; + return 1 if $^O eq 'VMS'; # owner delete control at file level + + my $err_ref = shift; + + # Should Get the value of _PC_CHOWN_RESTRICTED if it is defined + # and If it is not there do the extensive test + my $chown_restricted; + $chown_restricted = &POSIX::_PC_CHOWN_RESTRICTED() + if eval { &POSIX::_PC_CHOWN_RESTRICTED(); 1}; + + # If chown_resticted is set to some value we should test it + if (defined $chown_restricted) { + + # Return if the current directory is safe + return _is_safe($path,$err_ref) if POSIX::sysconf( $chown_restricted ); + + } + + # To reach this point either, the _PC_CHOWN_RESTRICTED symbol + # was not avialable or the symbol was there but chown giveaway + # is allowed. Either way, we now have to test the entire tree for + # safety. + + # Convert path to an absolute directory if required + unless (File::Spec->file_name_is_absolute($path)) { + $path = File::Spec->rel2abs($path); + } + + # Split directory into components - assume no file + my ($volume, $directories, undef) = File::Spec->splitpath( $path, 1); + + # Slightly less efficient than having a function in File::Spec + # to chop off the end of a directory or even a function that + # can handle ../ in a directory tree + # Sometimes splitdir() returns a blank at the end + # so we will probably check the bottom directory twice in some cases + my @dirs = File::Spec->splitdir($directories); + + # Concatenate one less directory each time around + foreach my $pos (0.. $#dirs) { + # Get a directory name + my $dir = File::Spec->catpath($volume, + File::Spec->catdir(@dirs[0.. $#dirs - $pos]), + '' + ); + + print "TESTING DIR $dir\n" if $DEBUG; + + # Check the directory + return 0 unless _is_safe($dir,$err_ref); + + } + + return 1; +} + + + +# internal routine to determine whether unlink works on this +# platform for files that are currently open. +# Returns true if we can, false otherwise. + +# Currently WinNT, OS/2 and VMS can not unlink an opened file +# On VMS this is because the O_EXCL flag is used to open the +# temporary file. Currently I do not know enough about the issues +# on VMS to decide whether O_EXCL is a requirement. + +sub _can_unlink_opened_file { + + if ($^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'VMS' || $^O eq 'dos' || $^O eq 'MacOS') { + return 0; + } else { + return 1; + } + +} + +# internal routine to decide which security levels are allowed +# see safe_level() for more information on this + +# Controls whether the supplied security level is allowed + +# $cando = _can_do_level( $level ) + +sub _can_do_level { + + # Get security level + my $level = shift; + + # Always have to be able to do STANDARD + return 1 if $level == STANDARD; + + # Currently, the systems that can do HIGH or MEDIUM are identical + if ( $^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'cygwin' || $^O eq 'dos' || $^O eq 'MacOS' || $^O eq 'mpeix') { + return 0; + } else { + return 1; + } + +} + +# This routine sets up a deferred unlinking of a specified +# filename and filehandle. It is used in the following cases: +# - Called by unlink0 if an opened file can not be unlinked +# - Called by tempfile() if files are to be removed on shutdown +# - Called by tempdir() if directories are to be removed on shutdown + +# Arguments: +# _deferred_unlink( $fh, $fname, $isdir ); +# +# - filehandle (so that it can be expclicitly closed if open +# - filename (the thing we want to remove) +# - isdir (flag to indicate that we are being given a directory) +# [and hence no filehandle] + +# Status is not referred to since all the magic is done with an END block + +{ + # Will set up two lexical variables to contain all the files to be + # removed. One array for files, another for directories They will + # only exist in this block. + + # This means we only have to set up a single END block to remove + # all files. + + # in order to prevent child processes inadvertently deleting the parent + # temp files we use a hash to store the temp files and directories + # created by a particular process id. + + # %files_to_unlink contains values that are references to an array of + # array references containing the filehandle and filename associated with + # the temp file. + my (%files_to_unlink, %dirs_to_unlink); + + # Set up an end block to use these arrays + END { + cleanup(); + } + + # Cleanup function. Always triggered on END but can be invoked + # manually. + sub cleanup { + if (!$KEEP_ALL) { + # Files + my @files = (exists $files_to_unlink{$$} ? + @{ $files_to_unlink{$$} } : () ); + foreach my $file (@files) { + # close the filehandle without checking its state + # in order to make real sure that this is closed + # if its already closed then I dont care about the answer + # probably a better way to do this + close($file->[0]); # file handle is [0] + + if (-f $file->[1]) { # file name is [1] + _force_writable( $file->[1] ); # for windows + unlink $file->[1] or warn "Error removing ".$file->[1]; + } + } + # Dirs + my @dirs = (exists $dirs_to_unlink{$$} ? + @{ $dirs_to_unlink{$$} } : () ); + foreach my $dir (@dirs) { + if (-d $dir) { + rmtree($dir, $DEBUG, 0); + } + } + + # clear the arrays + @{ $files_to_unlink{$$} } = () + if exists $files_to_unlink{$$}; + @{ $dirs_to_unlink{$$} } = () + if exists $dirs_to_unlink{$$}; + } + } + + + # This is the sub called to register a file for deferred unlinking + # This could simply store the input parameters and defer everything + # until the END block. For now we do a bit of checking at this + # point in order to make sure that (1) we have a file/dir to delete + # and (2) we have been called with the correct arguments. + sub _deferred_unlink { + + croak 'Usage: _deferred_unlink($fh, $fname, $isdir)' + unless scalar(@_) == 3; + + my ($fh, $fname, $isdir) = @_; + + warn "Setting up deferred removal of $fname\n" + if $DEBUG; + + # If we have a directory, check that it is a directory + if ($isdir) { + + if (-d $fname) { + + # Directory exists so store it + # first on VMS turn []foo into [.foo] for rmtree + $fname = VMS::Filespec::vmspath($fname) if $^O eq 'VMS'; + $dirs_to_unlink{$$} = [] + unless exists $dirs_to_unlink{$$}; + push (@{ $dirs_to_unlink{$$} }, $fname); + + } else { + carp "Request to remove directory $fname could not be completed since it does not exist!\n" if $^W; + } + + } else { + + if (-f $fname) { + + # file exists so store handle and name for later removal + $files_to_unlink{$$} = [] + unless exists $files_to_unlink{$$}; + push(@{ $files_to_unlink{$$} }, [$fh, $fname]); + + } else { + carp "Request to remove file $fname could not be completed since it is not there!\n" if $^W; + } + + } + + } + + +} + +=head1 OBJECT-ORIENTED INTERFACE + +This is the primary interface for interacting with +C<File::Temp>. Using the OO interface a temporary file can be created +when the object is constructed and the file can be removed when the +object is no longer required. + +Note that there is no method to obtain the filehandle from the +C<File::Temp> object. The object itself acts as a filehandle. Also, +the object is configured such that it stringifies to the name of the +temporary file. + +=over 4 + +=item B<new> + +Create a temporary file object. + + my $tmp = new File::Temp(); + +by default the object is constructed as if C<tempfile> +was called without options, but with the additional behaviour +that the temporary file is removed by the object destructor +if UNLINK is set to true (the default). + +Supported arguments are the same as for C<tempfile>: UNLINK +(defaulting to true), DIR and SUFFIX. Additionally, the filename +template is specified using the TEMPLATE option. The OPEN option +is not supported (the file is always opened). + + $tmp = new File::Temp( TEMPLATE => 'tempXXXXX', + DIR => 'mydir', + SUFFIX => '.dat'); + +Arguments are case insensitive. + +=cut + +sub new { + my $proto = shift; + my $class = ref($proto) || $proto; + + # read arguments and convert keys to upper case + my %args = @_; + %args = map { uc($_), $args{$_} } keys %args; + + # see if they are unlinking (defaulting to yes) + my $unlink = (exists $args{UNLINK} ? $args{UNLINK} : 1 ); + delete $args{UNLINK}; + + # template (store it in an error so that it will + # disappear from the arg list of tempfile + my @template = ( exists $args{TEMPLATE} ? $args{TEMPLATE} : () ); + delete $args{TEMPLATE}; + + # Protect OPEN + delete $args{OPEN}; + + # Open the file and retain file handle and file name + my ($fh, $path) = tempfile( @template, %args ); + + print "Tmp: $fh - $path\n" if $DEBUG; + + # Store the filename in the scalar slot + ${*$fh} = $path; + + # Store unlink information in hash slot (plus other constructor info) + %{*$fh} = %args; + + # create the object + bless $fh, $class; + + # final method-based configuration + $fh->unlink_on_destroy( $unlink ); + + return $fh; +} + +=item B<filename> + +Return the name of the temporary file associated with this object. + + $filename = $tmp->filename; + +This method is called automatically when the object is used as +a string. + +=cut + +sub filename { + my $self = shift; + return ${*$self}; +} + +sub STRINGIFY { + my $self = shift; + return $self->filename; +} + +=item B<unlink_on_destroy> + +Control whether the file is unlinked when the object goes out of scope. +The file is removed if this value is true and $KEEP_ALL is not. + + $fh->unlink_on_destroy( 1 ); + +Default is for the file to be removed. + +=cut + +sub unlink_on_destroy { + my $self = shift; + if (@_) { + ${*$self}{UNLINK} = shift; + } + return ${*$self}{UNLINK}; +} + +=item B<DESTROY> + +When the object goes out of scope, the destructor is called. This +destructor will attempt to unlink the file (using C<unlink1>) +if the constructor was called with UNLINK set to 1 (the default state +if UNLINK is not specified). + +No error is given if the unlink fails. + +If the global variable $KEEP_ALL is true, the file will not be removed. + +=cut + +sub DESTROY { + my $self = shift; + if (${*$self}{UNLINK} && !$KEEP_ALL) { + print "# ---------> Unlinking $self\n" if $DEBUG; + + # The unlink1 may fail if the file has been closed + # by the caller. This leaves us with the decision + # of whether to refuse to remove the file or simply + # do an unlink without test. Seems to be silly + # to do this when we are trying to be careful + # about security + _force_writable( $self->filename ); # for windows + unlink1( $self, $self->filename ) + or unlink($self->filename); + } +} + +=back + +=head1 FUNCTIONS + +This section describes the recommended interface for generating +temporary files and directories. + +=over 4 + +=item B<tempfile> + +This is the basic function to generate temporary files. +The behaviour of the file can be changed using various options: + + $fh = tempfile(); + ($fh, $filename) = tempfile(); + +Create a temporary file in the directory specified for temporary +files, as specified by the tmpdir() function in L<File::Spec>. + + ($fh, $filename) = tempfile($template); + +Create a temporary file in the current directory using the supplied +template. Trailing `X' characters are replaced with random letters to +generate the filename. At least four `X' characters must be present +at the end of the template. + + ($fh, $filename) = tempfile($template, SUFFIX => $suffix) + +Same as previously, except that a suffix is added to the template +after the `X' translation. Useful for ensuring that a temporary +filename has a particular extension when needed by other applications. +But see the WARNING at the end. + + ($fh, $filename) = tempfile($template, DIR => $dir); + +Translates the template as before except that a directory name +is specified. + + ($fh, $filename) = tempfile($template, UNLINK => 1); + +Return the filename and filehandle as before except that the file is +automatically removed when the program exits (dependent on +$KEEP_ALL). Default is for the file to be removed if a file handle is +requested and to be kept if the filename is requested. In a scalar +context (where no filename is returned) the file is always deleted +either (depending on the operating system) on exit or when it is +closed (unless $KEEP_ALL is true when the temp file is created). + +Use the object-oriented interface if fine-grained control of when +a file is removed is required. + +If the template is not specified, a template is always +automatically generated. This temporary file is placed in tmpdir() +(L<File::Spec>) unless a directory is specified explicitly with the +DIR option. + + $fh = tempfile( $template, DIR => $dir ); + +If called in scalar context, only the filehandle is returned and the +file will automatically be deleted when closed on operating systems +that support this (see the description of tmpfile() elsewhere in this +document). This is the preferred mode of operation, as if you only +have a filehandle, you can never create a race condition by fumbling +with the filename. On systems that can not unlink an open file or can +not mark a file as temporary when it is opened (for example, Windows +NT uses the C<O_TEMPORARY> flag) the file is marked for deletion when +the program ends (equivalent to setting UNLINK to 1). The C<UNLINK> +flag is ignored if present. + + (undef, $filename) = tempfile($template, OPEN => 0); + +This will return the filename based on the template but +will not open this file. Cannot be used in conjunction with +UNLINK set to true. Default is to always open the file +to protect from possible race conditions. A warning is issued +if warnings are turned on. Consider using the tmpnam() +and mktemp() functions described elsewhere in this document +if opening the file is not required. + +Options can be combined as required. + +=cut + +sub tempfile { + + # Can not check for argument count since we can have any + # number of args + + # Default options + my %options = ( + "DIR" => undef, # Directory prefix + "SUFFIX" => '', # Template suffix + "UNLINK" => 0, # Do not unlink file on exit + "OPEN" => 1, # Open file + ); + + # Check to see whether we have an odd or even number of arguments + my $template = (scalar(@_) % 2 == 1 ? shift(@_) : undef); + + # Read the options and merge with defaults + %options = (%options, @_) if @_; + + # First decision is whether or not to open the file + if (! $options{"OPEN"}) { + + warn "tempfile(): temporary filename requested but not opened.\nPossibly unsafe, consider using tempfile() with OPEN set to true\n" + if $^W; + + } + + if ($options{"DIR"} and $^O eq 'VMS') { + + # on VMS turn []foo into [.foo] for concatenation + $options{"DIR"} = VMS::Filespec::vmspath($options{"DIR"}); + } + + # Construct the template + + # Have a choice of trying to work around the mkstemp/mktemp/tmpnam etc + # functions or simply constructing a template and using _gettemp() + # explicitly. Go for the latter + + # First generate a template if not defined and prefix the directory + # If no template must prefix the temp directory + if (defined $template) { + if ($options{"DIR"}) { + + $template = File::Spec->catfile($options{"DIR"}, $template); + + } + + } else { + + if ($options{"DIR"}) { + + $template = File::Spec->catfile($options{"DIR"}, TEMPXXX); + + } else { + + $template = File::Spec->catfile(File::Spec->tmpdir, TEMPXXX); + + } + + } + + # Now add a suffix + $template .= $options{"SUFFIX"}; + + # Determine whether we should tell _gettemp to unlink the file + # On unix this is irrelevant and can be worked out after the file is + # opened (simply by unlinking the open filehandle). On Windows or VMS + # we have to indicate temporary-ness when we open the file. In general + # we only want a true temporary file if we are returning just the + # filehandle - if the user wants the filename they probably do not + # want the file to disappear as soon as they close it (which may be + # important if they want a child process to use the file) + # For this reason, tie unlink_on_close to the return context regardless + # of OS. + my $unlink_on_close = ( wantarray ? 0 : 1); + + # Create the file + my ($fh, $path, $errstr); + croak "Error in tempfile() using $template: $errstr" + unless (($fh, $path) = _gettemp($template, + "open" => $options{'OPEN'}, + "mkdir"=> 0 , + "unlink_on_close" => $unlink_on_close, + "suffixlen" => length($options{'SUFFIX'}), + "ErrStr" => \$errstr, + ) ); + + # Set up an exit handler that can do whatever is right for the + # system. This removes files at exit when requested explicitly or when + # system is asked to unlink_on_close but is unable to do so because + # of OS limitations. + # The latter should be achieved by using a tied filehandle. + # Do not check return status since this is all done with END blocks. + _deferred_unlink($fh, $path, 0) if $options{"UNLINK"}; + + # Return + if (wantarray()) { + + if ($options{'OPEN'}) { + return ($fh, $path); + } else { + return (undef, $path); + } + + } else { + + # Unlink the file. It is up to unlink0 to decide what to do with + # this (whether to unlink now or to defer until later) + unlink0($fh, $path) or croak "Error unlinking file $path using unlink0"; + + # Return just the filehandle. + return $fh; + } + + +} + +=item B<tempdir> + +This is the recommended interface for creation of temporary directories. +The behaviour of the function depends on the arguments: + + $tempdir = tempdir(); + +Create a directory in tmpdir() (see L<File::Spec|File::Spec>). + + $tempdir = tempdir( $template ); + +Create a directory from the supplied template. This template is +similar to that described for tempfile(). `X' characters at the end +of the template are replaced with random letters to construct the +directory name. At least four `X' characters must be in the template. + + $tempdir = tempdir ( DIR => $dir ); + +Specifies the directory to use for the temporary directory. +The temporary directory name is derived from an internal template. + + $tempdir = tempdir ( $template, DIR => $dir ); + +Prepend the supplied directory name to the template. The template +should not include parent directory specifications itself. Any parent +directory specifications are removed from the template before +prepending the supplied directory. + + $tempdir = tempdir ( $template, TMPDIR => 1 ); + +Using the supplied template, create the temporary directory in +a standard location for temporary files. Equivalent to doing + + $tempdir = tempdir ( $template, DIR => File::Spec->tmpdir); + +but shorter. Parent directory specifications are stripped from the +template itself. The C<TMPDIR> option is ignored if C<DIR> is set +explicitly. Additionally, C<TMPDIR> is implied if neither a template +nor a directory are supplied. + + $tempdir = tempdir( $template, CLEANUP => 1); + +Create a temporary directory using the supplied template, but +attempt to remove it (and all files inside it) when the program +exits. Note that an attempt will be made to remove all files from +the directory even if they were not created by this module (otherwise +why ask to clean it up?). The directory removal is made with +the rmtree() function from the L<File::Path|File::Path> module. +Of course, if the template is not specified, the temporary directory +will be created in tmpdir() and will also be removed at program exit. + +=cut + +# ' + +sub tempdir { + + # Can not check for argument count since we can have any + # number of args + + # Default options + my %options = ( + "CLEANUP" => 0, # Remove directory on exit + "DIR" => '', # Root directory + "TMPDIR" => 0, # Use tempdir with template + ); + + # Check to see whether we have an odd or even number of arguments + my $template = (scalar(@_) % 2 == 1 ? shift(@_) : undef ); + + # Read the options and merge with defaults + %options = (%options, @_) if @_; + + # Modify or generate the template + + # Deal with the DIR and TMPDIR options + if (defined $template) { + + # Need to strip directory path if using DIR or TMPDIR + if ($options{'TMPDIR'} || $options{'DIR'}) { + + # Strip parent directory from the filename + # + # There is no filename at the end + $template = VMS::Filespec::vmspath($template) if $^O eq 'VMS'; + my ($volume, $directories, undef) = File::Spec->splitpath( $template, 1); + + # Last directory is then our template + $template = (File::Spec->splitdir($directories))[-1]; + + # Prepend the supplied directory or temp dir + if ($options{"DIR"}) { + + $template = File::Spec->catdir($options{"DIR"}, $template); + + } elsif ($options{TMPDIR}) { + + # Prepend tmpdir + $template = File::Spec->catdir(File::Spec->tmpdir, $template); + + } + + } + + } else { + + if ($options{"DIR"}) { + + $template = File::Spec->catdir($options{"DIR"}, TEMPXXX); + + } else { + + $template = File::Spec->catdir(File::Spec->tmpdir, TEMPXXX); + + } + + } + + # Create the directory + my $tempdir; + my $suffixlen = 0; + if ($^O eq 'VMS') { # dir names can end in delimiters + $template =~ m/([\.\]:>]+)$/; + $suffixlen = length($1); + } + if ( ($^O eq 'MacOS') && (substr($template, -1) eq ':') ) { + # dir name has a trailing ':' + ++$suffixlen; + } + + my $errstr; + croak "Error in tempdir() using $template: $errstr" + unless ((undef, $tempdir) = _gettemp($template, + "open" => 0, + "mkdir"=> 1 , + "suffixlen" => $suffixlen, + "ErrStr" => \$errstr, + ) ); + + # Install exit handler; must be dynamic to get lexical + if ( $options{'CLEANUP'} && -d $tempdir) { + _deferred_unlink(undef, $tempdir, 1); + } + + # Return the dir name + return $tempdir; + +} + +=back + +=head1 MKTEMP FUNCTIONS + +The following functions are Perl implementations of the +mktemp() family of temp file generation system calls. + +=over 4 + +=item B<mkstemp> + +Given a template, returns a filehandle to the temporary file and the name +of the file. + + ($fh, $name) = mkstemp( $template ); + +In scalar context, just the filehandle is returned. + +The template may be any filename with some number of X's appended +to it, for example F</tmp/temp.XXXX>. The trailing X's are replaced +with unique alphanumeric combinations. + +=cut + + + +sub mkstemp { + + croak "Usage: mkstemp(template)" + if scalar(@_) != 1; + + my $template = shift; + + my ($fh, $path, $errstr); + croak "Error in mkstemp using $template: $errstr" + unless (($fh, $path) = _gettemp($template, + "open" => 1, + "mkdir"=> 0 , + "suffixlen" => 0, + "ErrStr" => \$errstr, + ) ); + + if (wantarray()) { + return ($fh, $path); + } else { + return $fh; + } + +} + + +=item B<mkstemps> + +Similar to mkstemp(), except that an extra argument can be supplied +with a suffix to be appended to the template. + + ($fh, $name) = mkstemps( $template, $suffix ); + +For example a template of C<testXXXXXX> and suffix of C<.dat> +would generate a file similar to F<testhGji_w.dat>. + +Returns just the filehandle alone when called in scalar context. + +=cut + +sub mkstemps { + + croak "Usage: mkstemps(template, suffix)" + if scalar(@_) != 2; + + + my $template = shift; + my $suffix = shift; + + $template .= $suffix; + + my ($fh, $path, $errstr); + croak "Error in mkstemps using $template: $errstr" + unless (($fh, $path) = _gettemp($template, + "open" => 1, + "mkdir"=> 0 , + "suffixlen" => length($suffix), + "ErrStr" => \$errstr, + ) ); + + if (wantarray()) { + return ($fh, $path); + } else { + return $fh; + } + +} + +=item B<mkdtemp> + +Create a directory from a template. The template must end in +X's that are replaced by the routine. + + $tmpdir_name = mkdtemp($template); + +Returns the name of the temporary directory created. +Returns undef on failure. + +Directory must be removed by the caller. + +=cut + +#' # for emacs + +sub mkdtemp { + + croak "Usage: mkdtemp(template)" + if scalar(@_) != 1; + + my $template = shift; + my $suffixlen = 0; + if ($^O eq 'VMS') { # dir names can end in delimiters + $template =~ m/([\.\]:>]+)$/; + $suffixlen = length($1); + } + if ( ($^O eq 'MacOS') && (substr($template, -1) eq ':') ) { + # dir name has a trailing ':' + ++$suffixlen; + } + my ($junk, $tmpdir, $errstr); + croak "Error creating temp directory from template $template\: $errstr" + unless (($junk, $tmpdir) = _gettemp($template, + "open" => 0, + "mkdir"=> 1 , + "suffixlen" => $suffixlen, + "ErrStr" => \$errstr, + ) ); + + return $tmpdir; + +} + +=item B<mktemp> + +Returns a valid temporary filename but does not guarantee +that the file will not be opened by someone else. + + $unopened_file = mktemp($template); + +Template is the same as that required by mkstemp(). + +=cut + +sub mktemp { + + croak "Usage: mktemp(template)" + if scalar(@_) != 1; + + my $template = shift; + + my ($tmpname, $junk, $errstr); + croak "Error getting name to temp file from template $template: $errstr" + unless (($junk, $tmpname) = _gettemp($template, + "open" => 0, + "mkdir"=> 0 , + "suffixlen" => 0, + "ErrStr" => \$errstr, + ) ); + + return $tmpname; +} + +=back + +=head1 POSIX FUNCTIONS + +This section describes the re-implementation of the tmpnam() +and tmpfile() functions described in L<POSIX> +using the mkstemp() from this module. + +Unlike the L<POSIX|POSIX> implementations, the directory used +for the temporary file is not specified in a system include +file (C<P_tmpdir>) but simply depends on the choice of tmpdir() +returned by L<File::Spec|File::Spec>. On some implementations this +location can be set using the C<TMPDIR> environment variable, which +may not be secure. +If this is a problem, simply use mkstemp() and specify a template. + +=over 4 + +=item B<tmpnam> + +When called in scalar context, returns the full name (including path) +of a temporary file (uses mktemp()). The only check is that the file does +not already exist, but there is no guarantee that that condition will +continue to apply. + + $file = tmpnam(); + +When called in list context, a filehandle to the open file and +a filename are returned. This is achieved by calling mkstemp() +after constructing a suitable template. + + ($fh, $file) = tmpnam(); + +If possible, this form should be used to prevent possible +race conditions. + +See L<File::Spec/tmpdir> for information on the choice of temporary +directory for a particular operating system. + +=cut + +sub tmpnam { + + # Retrieve the temporary directory name + my $tmpdir = File::Spec->tmpdir; + + croak "Error temporary directory is not writable" + if $tmpdir eq ''; + + # Use a ten character template and append to tmpdir + my $template = File::Spec->catfile($tmpdir, TEMPXXX); + + if (wantarray() ) { + return mkstemp($template); + } else { + return mktemp($template); + } + +} + +=item B<tmpfile> + +Returns the filehandle of a temporary file. + + $fh = tmpfile(); + +The file is removed when the filehandle is closed or when the program +exits. No access to the filename is provided. + +If the temporary file can not be created undef is returned. +Currently this command will probably not work when the temporary +directory is on an NFS file system. + +=cut + +sub tmpfile { + + # Simply call tmpnam() in a list context + my ($fh, $file) = tmpnam(); + + # Make sure file is removed when filehandle is closed + # This will fail on NFS + unlink0($fh, $file) + or return undef; + + return $fh; + +} + +=back + +=head1 ADDITIONAL FUNCTIONS + +These functions are provided for backwards compatibility +with common tempfile generation C library functions. + +They are not exported and must be addressed using the full package +name. + +=over 4 + +=item B<tempnam> + +Return the name of a temporary file in the specified directory +using a prefix. The file is guaranteed not to exist at the time +the function was called, but such guarantees are good for one +clock tick only. Always use the proper form of C<sysopen> +with C<O_CREAT | O_EXCL> if you must open such a filename. + + $filename = File::Temp::tempnam( $dir, $prefix ); + +Equivalent to running mktemp() with $dir/$prefixXXXXXXXX +(using unix file convention as an example) + +Because this function uses mktemp(), it can suffer from race conditions. + +=cut + +sub tempnam { + + croak 'Usage tempnam($dir, $prefix)' unless scalar(@_) == 2; + + my ($dir, $prefix) = @_; + + # Add a string to the prefix + $prefix .= 'XXXXXXXX'; + + # Concatenate the directory to the file + my $template = File::Spec->catfile($dir, $prefix); + + return mktemp($template); + +} + +=back + +=head1 UTILITY FUNCTIONS + +Useful functions for dealing with the filehandle and filename. + +=over 4 + +=item B<unlink0> + +Given an open filehandle and the associated filename, make a safe +unlink. This is achieved by first checking that the filename and +filehandle initially point to the same file and that the number of +links to the file is 1 (all fields returned by stat() are compared). +Then the filename is unlinked and the filehandle checked once again to +verify that the number of links on that file is now 0. This is the +closest you can come to making sure that the filename unlinked was the +same as the file whose descriptor you hold. + + unlink0($fh, $path) + or die "Error unlinking file $path safely"; + +Returns false on error. The filehandle is not closed since on some +occasions this is not required. + +On some platforms, for example Windows NT, it is not possible to +unlink an open file (the file must be closed first). On those +platforms, the actual unlinking is deferred until the program ends and +good status is returned. A check is still performed to make sure that +the filehandle and filename are pointing to the same thing (but not at +the time the end block is executed since the deferred removal may not +have access to the filehandle). + +Additionally, on Windows NT not all the fields returned by stat() can +be compared. For example, the C<dev> and C<rdev> fields seem to be +different. Also, it seems that the size of the file returned by stat() +does not always agree, with C<stat(FH)> being more accurate than +C<stat(filename)>, presumably because of caching issues even when +using autoflush (this is usually overcome by waiting a while after +writing to the tempfile before attempting to C<unlink0> it). + +Finally, on NFS file systems the link count of the file handle does +not always go to zero immediately after unlinking. Currently, this +command is expected to fail on NFS disks. + +This function is disabled if the global variable $KEEP_ALL is true +and an unlink on open file is supported. If the unlink is to be deferred +to the END block, the file is still registered for removal. + +=cut + +sub unlink0 { + + croak 'Usage: unlink0(filehandle, filename)' + unless scalar(@_) == 2; + + # Read args + my ($fh, $path) = @_; + + cmpstat($fh, $path) or return 0; + + # attempt remove the file (does not work on some platforms) + if (_can_unlink_opened_file()) { + + # return early (Without unlink) if we have been instructed to retain files. + return 1 if $KEEP_ALL; + + # XXX: do *not* call this on a directory; possible race + # resulting in recursive removal + croak "unlink0: $path has become a directory!" if -d $path; + unlink($path) or return 0; + + # Stat the filehandle + my @fh = stat $fh; + + print "Link count = $fh[3] \n" if $DEBUG; + + # Make sure that the link count is zero + # - Cygwin provides deferred unlinking, however, + # on Win9x the link count remains 1 + # On NFS the link count may still be 1 but we cant know that + # we are on NFS + return ( $fh[3] == 0 or $^O eq 'cygwin' ? 1 : 0); + + } else { + _deferred_unlink($fh, $path, 0); + return 1; + } + +} + +=item B<cmpstat> + +Compare C<stat> of filehandle with C<stat> of provided filename. This +can be used to check that the filename and filehandle initially point +to the same file and that the number of links to the file is 1 (all +fields returned by stat() are compared). + + cmpstat($fh, $path) + or die "Error comparing handle with file"; + +Returns false if the stat information differs or if the link count is +greater than 1. + +On certain platofms, eg Windows, not all the fields returned by stat() +can be compared. For example, the C<dev> and C<rdev> fields seem to be +different in Windows. Also, it seems that the size of the file +returned by stat() does not always agree, with C<stat(FH)> being more +accurate than C<stat(filename)>, presumably because of caching issues +even when using autoflush (this is usually overcome by waiting a while +after writing to the tempfile before attempting to C<unlink0> it). + +Not exported by default. + +=cut + +sub cmpstat { + + croak 'Usage: cmpstat(filehandle, filename)' + unless scalar(@_) == 2; + + # Read args + my ($fh, $path) = @_; + + warn "Comparing stat\n" + if $DEBUG; + + # Stat the filehandle - which may be closed if someone has manually + # closed the file. Can not turn off warnings without using $^W + # unless we upgrade to 5.006 minimum requirement + my @fh; + { + local ($^W) = 0; + @fh = stat $fh; + } + return unless @fh; + + if ($fh[3] > 1 && $^W) { + carp "unlink0: fstat found too many links; SB=@fh" if $^W; + } + + # Stat the path + my @path = stat $path; + + unless (@path) { + carp "unlink0: $path is gone already" if $^W; + return; + } + + # this is no longer a file, but may be a directory, or worse + unless (-f $path) { + confess "panic: $path is no longer a file: SB=@fh"; + } + + # Do comparison of each member of the array + # On WinNT dev and rdev seem to be different + # depending on whether it is a file or a handle. + # Cannot simply compare all members of the stat return + # Select the ones we can use + my @okstat = (0..$#fh); # Use all by default + if ($^O eq 'MSWin32') { + @okstat = (1,2,3,4,5,7,8,9,10); + } elsif ($^O eq 'os2') { + @okstat = (0, 2..$#fh); + } elsif ($^O eq 'VMS') { # device and file ID are sufficient + @okstat = (0, 1); + } elsif ($^O eq 'dos') { + @okstat = (0,2..7,11..$#fh); + } elsif ($^O eq 'mpeix') { + @okstat = (0..4,8..10); + } + + # Now compare each entry explicitly by number + for (@okstat) { + print "Comparing: $_ : $fh[$_] and $path[$_]\n" if $DEBUG; + # Use eq rather than == since rdev, blksize, and blocks (6, 11, + # and 12) will be '' on platforms that do not support them. This + # is fine since we are only comparing integers. + unless ($fh[$_] eq $path[$_]) { + warn "Did not match $_ element of stat\n" if $DEBUG; + return 0; + } + } + + return 1; +} + +=item B<unlink1> + +Similar to C<unlink0> except after file comparison using cmpstat, the +filehandle is closed prior to attempting to unlink the file. This +allows the file to be removed without using an END block, but does +mean that the post-unlink comparison of the filehandle state provided +by C<unlink0> is not available. + + unlink1($fh, $path) + or die "Error closing and unlinking file"; + +Usually called from the object destructor when using the OO interface. + +Not exported by default. + +This function is disabled if the global variable $KEEP_ALL is true. + +=cut + +sub unlink1 { + croak 'Usage: unlink1(filehandle, filename)' + unless scalar(@_) == 2; + + # Read args + my ($fh, $path) = @_; + + cmpstat($fh, $path) or return 0; + + # Close the file + close( $fh ) or return 0; + + # Make sure the file is writable (for windows) + _force_writable( $path ); + + # return early (without unlink) if we have been instructed to retain files. + return 1 if $KEEP_ALL; + + # remove the file + return unlink($path); +} + +=item B<cleanup> + +Calling this function will cause any temp files or temp directories +that are registered for removal to be removed. This happens automatically +when the process exits but can be triggered manually if the caller is sure +that none of the temp files are required. This method can be registered as +an Apache callback. + +On OSes where temp files are automatically removed when the temp file +is closed, calling this function will have no effect other than to remove +temporary directories (which may include temporary files). + + File::Temp::cleanup(); + +Not exported by default. + +=back + +=head1 PACKAGE VARIABLES + +These functions control the global state of the package. + +=over 4 + +=item B<safe_level> + +Controls the lengths to which the module will go to check the safety of the +temporary file or directory before proceeding. +Options are: + +=over 8 + +=item STANDARD + +Do the basic security measures to ensure the directory exists and +is writable, that the umask() is fixed before opening of the file, +that temporary files are opened only if they do not already exist, and +that possible race conditions are avoided. Finally the L<unlink0|"unlink0"> +function is used to remove files safely. + +=item MEDIUM + +In addition to the STANDARD security, the output directory is checked +to make sure that it is owned either by root or the user running the +program. If the directory is writable by group or by other, it is then +checked to make sure that the sticky bit is set. + +Will not work on platforms that do not support the C<-k> test +for sticky bit. + +=item HIGH + +In addition to the MEDIUM security checks, also check for the +possibility of ``chown() giveaway'' using the L<POSIX|POSIX> +sysconf() function. If this is a possibility, each directory in the +path is checked in turn for safeness, recursively walking back to the +root directory. + +For platforms that do not support the L<POSIX|POSIX> +C<_PC_CHOWN_RESTRICTED> symbol (for example, Windows NT) it is +assumed that ``chown() giveaway'' is possible and the recursive test +is performed. + +=back + +The level can be changed as follows: + + File::Temp->safe_level( File::Temp::HIGH ); + +The level constants are not exported by the module. + +Currently, you must be running at least perl v5.6.0 in order to +run with MEDIUM or HIGH security. This is simply because the +safety tests use functions from L<Fcntl|Fcntl> that are not +available in older versions of perl. The problem is that the version +number for Fcntl is the same in perl 5.6.0 and in 5.005_03 even though +they are different versions. + +On systems that do not support the HIGH or MEDIUM safety levels +(for example Win NT or OS/2) any attempt to change the level will +be ignored. The decision to ignore rather than raise an exception +allows portable programs to be written with high security in mind +for the systems that can support this without those programs failing +on systems where the extra tests are irrelevant. + +If you really need to see whether the change has been accepted +simply examine the return value of C<safe_level>. + + $newlevel = File::Temp->safe_level( File::Temp::HIGH ); + die "Could not change to high security" + if $newlevel != File::Temp::HIGH; + +=cut + +{ + # protect from using the variable itself + my $LEVEL = STANDARD; + sub safe_level { + my $self = shift; + if (@_) { + my $level = shift; + if (($level != STANDARD) && ($level != MEDIUM) && ($level != HIGH)) { + carp "safe_level: Specified level ($level) not STANDARD, MEDIUM or HIGH - ignoring\n" if $^W; + } else { + # Dont allow this on perl 5.005 or earlier + if ($] < 5.006 && $level != STANDARD) { + # Cant do MEDIUM or HIGH checks + croak "Currently requires perl 5.006 or newer to do the safe checks"; + } + # Check that we are allowed to change level + # Silently ignore if we can not. + $LEVEL = $level if _can_do_level($level); + } + } + return $LEVEL; + } +} + +=item TopSystemUID + +This is the highest UID on the current system that refers to a root +UID. This is used to make sure that the temporary directory is +owned by a system UID (C<root>, C<bin>, C<sys> etc) rather than +simply by root. + +This is required since on many unix systems C</tmp> is not owned +by root. + +Default is to assume that any UID less than or equal to 10 is a root +UID. + + File::Temp->top_system_uid(10); + my $topid = File::Temp->top_system_uid; + +This value can be adjusted to reduce security checking if required. +The value is only relevant when C<safe_level> is set to MEDIUM or higher. + +=cut + +{ + my $TopSystemUID = 10; + sub top_system_uid { + my $self = shift; + if (@_) { + my $newuid = shift; + croak "top_system_uid: UIDs should be numeric" + unless $newuid =~ /^\d+$/s; + $TopSystemUID = $newuid; + } + return $TopSystemUID; + } +} + +=item B<$KEEP_ALL> + +Controls whether temporary files and directories should be retained +regardless of any instructions in the program to remove them +automatically. This is useful for debugging but should not be used in +production code. + + $File::Temp::KEEP_ALL = 1; + +Default is for files to be removed as requested by the caller. + +In some cases, files will only be retained if this variable is true +when the file is created. This means that you can not create a temporary +file, set this variable and expect the temp file to still be around +when the program exits. + +=item B<$DEBUG> + +Controls whether debugging messages should be enabled. + + $File::Temp::DEBUG = 1; + +Default is for debugging mode to be disabled. + +=back + +=head1 WARNING + +For maximum security, endeavour always to avoid ever looking at, +touching, or even imputing the existence of the filename. You do not +know that that filename is connected to the same file as the handle +you have, and attempts to check this can only trigger more race +conditions. It's far more secure to use the filehandle alone and +dispense with the filename altogether. + +If you need to pass the handle to something that expects a filename +then, on a unix system, use C<"/dev/fd/" . fileno($fh)> for arbitrary +programs, or more generally C<< "+<=&" . fileno($fh) >> for Perl +programs. You will have to clear the close-on-exec bit on that file +descriptor before passing it to another process. + + use Fcntl qw/F_SETFD F_GETFD/; + fcntl($tmpfh, F_SETFD, 0) + or die "Can't clear close-on-exec flag on temp fh: $!\n"; + +=head2 Temporary files and NFS + +Some problems are associated with using temporary files that reside +on NFS file systems and it is recommended that a local filesystem +is used whenever possible. Some of the security tests will most probably +fail when the temp file is not local. Additionally, be aware that +the performance of I/O operations over NFS will not be as good as for +a local disk. + +=head2 Forking + +In some cases files created by File::Temp are removed from within an +END block. Since END blocks are triggered when a child process exits +(unless C<POSIX::_exit()> is used by the child) File::Temp takes care +to only remove those temp files created by a particular process ID. This +means that a child will not attempt to remove temp files created by the +parent process. + +=head2 BINMODE + +The file returned by File::Temp will have been opened in binary mode +if such a mode is available. If that is not correct, use the binmode() +function to change the mode of the filehandle. + +=head1 HISTORY + +Originally began life in May 1999 as an XS interface to the system +mkstemp() function. In March 2000, the OpenBSD mkstemp() code was +translated to Perl for total control of the code's +security checking, to ensure the presence of the function regardless of +operating system and to help with portability. The module was shipped +as a standard part of perl from v5.6.1. + +=head1 SEE ALSO + +L<POSIX/tmpnam>, L<POSIX/tmpfile>, L<File::Spec>, L<File::Path> + +See L<IO::File> and L<File::MkTemp>, L<Apachae::TempFile> for +different implementations of temporary file handling. + +=head1 AUTHOR + +Tim Jenness E<lt>tjenness@cpan.orgE<gt> + +Copyright (C) 1999-2005 Tim Jenness and the UK Particle Physics and +Astronomy Research Council. All Rights Reserved. This program is free +software; you can redistribute it and/or modify it under the same +terms as Perl itself. + +Original Perl implementation loosely based on the OpenBSD C code for +mkstemp(). Thanks to Tom Christiansen for suggesting that this module +should be written and providing ideas for code improvements and +security enhancements. + +=cut + +1; diff --git a/Master/tlpkg/tlperl.old/lib/File/stat.pm b/Master/tlpkg/tlperl.old/lib/File/stat.pm new file mode 100644 index 00000000000..132cbee27ad --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/File/stat.pm @@ -0,0 +1,139 @@ +package File::stat; +use 5.006; + +use strict; +use warnings; + +our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS); + +our $VERSION = '1.00'; + +BEGIN { + use Exporter (); + @EXPORT = qw(stat lstat); + @EXPORT_OK = qw( $st_dev $st_ino $st_mode + $st_nlink $st_uid $st_gid + $st_rdev $st_size + $st_atime $st_mtime $st_ctime + $st_blksize $st_blocks + ); + %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] ); +} +use vars @EXPORT_OK; + +# Class::Struct forbids use of @ISA +sub import { goto &Exporter::import } + +use Class::Struct qw(struct); +struct 'File::stat' => [ + map { $_ => '$' } qw{ + dev ino mode nlink uid gid rdev size + atime mtime ctime blksize blocks + } +]; + +sub populate (@) { + return unless @_; + my $stob = new(); + @$stob = ( + $st_dev, $st_ino, $st_mode, $st_nlink, $st_uid, $st_gid, $st_rdev, + $st_size, $st_atime, $st_mtime, $st_ctime, $st_blksize, $st_blocks ) + = @_; + return $stob; +} + +sub lstat ($) { populate(CORE::lstat(shift)) } + +sub stat ($) { + my $arg = shift; + my $st = populate(CORE::stat $arg); + return $st if $st; + my $fh; + { + local $!; + no strict 'refs'; + require Symbol; + $fh = \*{ Symbol::qualify( $arg, caller() )}; + return unless defined fileno $fh; + } + return populate(CORE::stat $fh); +} + +1; +__END__ + +=head1 NAME + +File::stat - by-name interface to Perl's built-in stat() functions + +=head1 SYNOPSIS + + use File::stat; + $st = stat($file) or die "No $file: $!"; + if ( ($st->mode & 0111) && $st->nlink > 1) ) { + print "$file is executable with lotsa links\n"; + } + + use File::stat qw(:FIELDS); + stat($file) or die "No $file: $!"; + if ( ($st_mode & 0111) && $st_nlink > 1) ) { + print "$file is executable with lotsa links\n"; + } + +=head1 DESCRIPTION + +This module's default exports override the core stat() +and lstat() functions, replacing them with versions that return +"File::stat" objects. This object has methods that +return the similarly named structure field name from the +stat(2) function; namely, +dev, +ino, +mode, +nlink, +uid, +gid, +rdev, +size, +atime, +mtime, +ctime, +blksize, +and +blocks. + +You may also import all the structure fields directly into your namespace +as regular variables using the :FIELDS import tag. (Note that this still +overrides your stat() and lstat() functions.) Access these fields as +variables named with a preceding C<st_> in front their method names. +Thus, C<$stat_obj-E<gt>dev()> corresponds to $st_dev if you import +the fields. + +To access this functionality without the core overrides, +pass the C<use> an empty import list, and then access +function functions with their full qualified names. +On the other hand, the built-ins are still available +via the C<CORE::> pseudo-package. + +=head1 BUGS + +As of Perl 5.8.0 after using this module you cannot use the implicit +C<$_> or the special filehandle C<_> with stat() or lstat(), trying +to do so leads into strange errors. The workaround is for C<$_> to +be explicit + + my $stat_obj = stat $_; + +and for C<_> to explicitly populate the object using the unexported +and undocumented populate() function with CORE::stat(): + + my $stat_obj = File::stat::populate(CORE::stat(_)); + +=head1 NOTE + +While this class is currently implemented using the Class::Struct +module to build a struct-like class, you shouldn't rely upon this. + +=head1 AUTHOR + +Tom Christiansen diff --git a/Master/tlpkg/tlperl.old/lib/FileHandle.pm b/Master/tlpkg/tlperl.old/lib/FileHandle.pm new file mode 100644 index 00000000000..6be22429440 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/FileHandle.pm @@ -0,0 +1,262 @@ +package FileHandle; + +use 5.006; +use strict; +our($VERSION, @ISA, @EXPORT, @EXPORT_OK); + +$VERSION = "2.01"; + +require IO::File; +@ISA = qw(IO::File); + +@EXPORT = qw(_IOFBF _IOLBF _IONBF); + +@EXPORT_OK = qw( + pipe + + autoflush + output_field_separator + output_record_separator + input_record_separator + input_line_number + format_page_number + format_lines_per_page + format_lines_left + format_name + format_top_name + format_line_break_characters + format_formfeed + + print + printf + getline + getlines +); + +# +# Everything we're willing to export, we must first import. +# +import IO::Handle grep { !defined(&$_) } @EXPORT, @EXPORT_OK; + +# +# Some people call "FileHandle::function", so all the functions +# that were in the old FileHandle class must be imported, too. +# +{ + no strict 'refs'; + + my %import = ( + 'IO::Handle' => + [qw(DESTROY new_from_fd fdopen close fileno getc ungetc gets + eof flush error clearerr setbuf setvbuf _open_mode_string)], + 'IO::Seekable' => + [qw(seek tell getpos setpos)], + 'IO::File' => + [qw(new new_tmpfile open)] + ); + for my $pkg (keys %import) { + for my $func (@{$import{$pkg}}) { + my $c = *{"${pkg}::$func"}{CODE} + or die "${pkg}::$func missing"; + *$func = $c; + } + } +} + +# +# Specialized importer for Fcntl magic. +# +sub import { + my $pkg = shift; + my $callpkg = caller; + require Exporter; + Exporter::export($pkg, $callpkg, @_); + + # + # If the Fcntl extension is available, + # export its constants. + # + eval { + require Fcntl; + Exporter::export('Fcntl', $callpkg); + }; +} + +################################################ +# This is the only exported function we define; +# the rest come from other classes. +# + +sub pipe { + my $r = new IO::Handle; + my $w = new IO::Handle; + CORE::pipe($r, $w) or return undef; + ($r, $w); +} + +# Rebless standard file handles +bless *STDIN{IO}, "FileHandle" if ref *STDIN{IO} eq "IO::Handle"; +bless *STDOUT{IO}, "FileHandle" if ref *STDOUT{IO} eq "IO::Handle"; +bless *STDERR{IO}, "FileHandle" if ref *STDERR{IO} eq "IO::Handle"; + +1; + +__END__ + +=head1 NAME + +FileHandle - supply object methods for filehandles + +=head1 SYNOPSIS + + use FileHandle; + + $fh = new FileHandle; + if ($fh->open("< file")) { + print <$fh>; + $fh->close; + } + + $fh = new FileHandle "> FOO"; + if (defined $fh) { + print $fh "bar\n"; + $fh->close; + } + + $fh = new FileHandle "file", "r"; + if (defined $fh) { + print <$fh>; + undef $fh; # automatically closes the file + } + + $fh = new FileHandle "file", O_WRONLY|O_APPEND; + if (defined $fh) { + print $fh "corge\n"; + undef $fh; # automatically closes the file + } + + $pos = $fh->getpos; + $fh->setpos($pos); + + $fh->setvbuf($buffer_var, _IOLBF, 1024); + + ($readfh, $writefh) = FileHandle::pipe; + + autoflush STDOUT 1; + +=head1 DESCRIPTION + +NOTE: This class is now a front-end to the IO::* classes. + +C<FileHandle::new> creates a C<FileHandle>, which is a reference to a +newly created symbol (see the C<Symbol> package). If it receives any +parameters, they are passed to C<FileHandle::open>; if the open fails, +the C<FileHandle> object is destroyed. Otherwise, it is returned to +the caller. + +C<FileHandle::new_from_fd> creates a C<FileHandle> like C<new> does. +It requires two parameters, which are passed to C<FileHandle::fdopen>; +if the fdopen fails, the C<FileHandle> object is destroyed. +Otherwise, it is returned to the caller. + +C<FileHandle::open> accepts one parameter or two. With one parameter, +it is just a front end for the built-in C<open> function. With two +parameters, the first parameter is a filename that may include +whitespace or other special characters, and the second parameter is +the open mode, optionally followed by a file permission value. + +If C<FileHandle::open> receives a Perl mode string (">", "+<", etc.) +or a POSIX fopen() mode string ("w", "r+", etc.), it uses the basic +Perl C<open> operator. + +If C<FileHandle::open> is given a numeric mode, it passes that mode +and the optional permissions value to the Perl C<sysopen> operator. +For convenience, C<FileHandle::import> tries to import the O_XXX +constants from the Fcntl module. If dynamic loading is not available, +this may fail, but the rest of FileHandle will still work. + +C<FileHandle::fdopen> is like C<open> except that its first parameter +is not a filename but rather a file handle name, a FileHandle object, +or a file descriptor number. + +If the C functions fgetpos() and fsetpos() are available, then +C<FileHandle::getpos> returns an opaque value that represents the +current position of the FileHandle, and C<FileHandle::setpos> uses +that value to return to a previously visited position. + +If the C function setvbuf() is available, then C<FileHandle::setvbuf> +sets the buffering policy for the FileHandle. The calling sequence +for the Perl function is the same as its C counterpart, including the +macros C<_IOFBF>, C<_IOLBF>, and C<_IONBF>, except that the buffer +parameter specifies a scalar variable to use as a buffer. WARNING: A +variable used as a buffer by C<FileHandle::setvbuf> must not be +modified in any way until the FileHandle is closed or until +C<FileHandle::setvbuf> is called again, or memory corruption may +result! + +See L<perlfunc> for complete descriptions of each of the following +supported C<FileHandle> methods, which are just front ends for the +corresponding built-in functions: + + close + fileno + getc + gets + eof + clearerr + seek + tell + +See L<perlvar> for complete descriptions of each of the following +supported C<FileHandle> methods: + + autoflush + output_field_separator + output_record_separator + input_record_separator + input_line_number + format_page_number + format_lines_per_page + format_lines_left + format_name + format_top_name + format_line_break_characters + format_formfeed + +Furthermore, for doing normal I/O you might need these: + +=over 4 + +=item $fh->print + +See L<perlfunc/print>. + +=item $fh->printf + +See L<perlfunc/printf>. + +=item $fh->getline + +This works like <$fh> described in L<perlop/"I/O Operators"> +except that it's more readable and can be safely called in a +list context but still returns just one line. + +=item $fh->getlines + +This works like <$fh> when called in a list context to +read all the remaining lines in a file, except that it's more readable. +It will also croak() if accidentally called in a scalar context. + +=back + +There are many other functions available since FileHandle is descended +from IO::File, IO::Seekable, and IO::Handle. Please see those +respective pages for documentation on more functions. + +=head1 SEE ALSO + +The B<IO> extension, +L<perlfunc>, +L<perlop/"I/O Operators">. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Getopt/Long.pm b/Master/tlpkg/tlperl.old/lib/Getopt/Long.pm new file mode 100644 index 00000000000..04038db58e3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Getopt/Long.pm @@ -0,0 +1,2504 @@ +# Getopt::Long.pm -- Universal options parsing + +package Getopt::Long; + +# RCS Status : $Id: GetoptLong.pm,v 2.72 2005-04-28 21:18:33+02 jv Exp $ +# Author : Johan Vromans +# Created On : Tue Sep 11 15:00:12 1990 +# Last Modified By: Johan Vromans +# Last Modified On: Wed Dec 14 21:17:21 2005 +# Update Count : 1458 +# Status : Released + +################ Copyright ################ + +# This program is Copyright 1990,2005 by Johan Vromans. +# This program is free software; you can redistribute it and/or +# modify it under the terms of the Perl Artistic License or 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. +# +# If you do not have a copy of the GNU General Public License write to +# the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, +# MA 02139, USA. + +################ Module Preamble ################ + +use 5.004; + +use strict; + +use vars qw($VERSION); +$VERSION = 2.35; +# For testing versions only. +#use vars qw($VERSION_STRING); +#$VERSION_STRING = "2.35"; + +use Exporter; +use vars qw(@ISA @EXPORT @EXPORT_OK); +@ISA = qw(Exporter); + +# Exported subroutines. +sub GetOptions(@); # always +sub Configure(@); # on demand +sub HelpMessage(@); # on demand +sub VersionMessage(@); # in demand + +BEGIN { + # Init immediately so their contents can be used in the 'use vars' below. + @EXPORT = qw(&GetOptions $REQUIRE_ORDER $PERMUTE $RETURN_IN_ORDER); + @EXPORT_OK = qw(&HelpMessage &VersionMessage &Configure); +} + +# User visible variables. +use vars @EXPORT, @EXPORT_OK; +use vars qw($error $debug $major_version $minor_version); +# Deprecated visible variables. +use vars qw($autoabbrev $getopt_compat $ignorecase $bundling $order + $passthrough); +# Official invisible variables. +use vars qw($genprefix $caller $gnu_compat $auto_help $auto_version $longprefix); + +# Public subroutines. +sub config(@); # deprecated name + +# Private subroutines. +sub ConfigDefaults(); +sub ParseOptionSpec($$); +sub OptCtl($); +sub FindOption($$$$); +sub ValidValue ($$$$$); + +################ Local Variables ################ + +# $requested_version holds the version that was mentioned in the 'use' +# or 'require', if any. It can be used to enable or disable specific +# features. +my $requested_version = 0; + +################ Resident subroutines ################ + +sub ConfigDefaults() { + # Handle POSIX compliancy. + if ( defined $ENV{"POSIXLY_CORRECT"} ) { + $genprefix = "(--|-)"; + $autoabbrev = 0; # no automatic abbrev of options + $bundling = 0; # no bundling of single letter switches + $getopt_compat = 0; # disallow '+' to start options + $order = $REQUIRE_ORDER; + } + else { + $genprefix = "(--|-|\\+)"; + $autoabbrev = 1; # automatic abbrev of options + $bundling = 0; # bundling off by default + $getopt_compat = 1; # allow '+' to start options + $order = $PERMUTE; + } + # Other configurable settings. + $debug = 0; # for debugging + $error = 0; # error tally + $ignorecase = 1; # ignore case when matching options + $passthrough = 0; # leave unrecognized options alone + $gnu_compat = 0; # require --opt=val if value is optional + $longprefix = "(--)"; # what does a long prefix look like +} + +# Override import. +sub import { + my $pkg = shift; # package + my @syms = (); # symbols to import + my @config = (); # configuration + my $dest = \@syms; # symbols first + for ( @_ ) { + if ( $_ eq ':config' ) { + $dest = \@config; # config next + next; + } + push(@$dest, $_); # push + } + # Hide one level and call super. + local $Exporter::ExportLevel = 1; + push(@syms, qw(&GetOptions)) if @syms; # always export GetOptions + $pkg->SUPER::import(@syms); + # And configure. + Configure(@config) if @config; +} + +################ Initialization ################ + +# Values for $order. See GNU getopt.c for details. +($REQUIRE_ORDER, $PERMUTE, $RETURN_IN_ORDER) = (0..2); +# Version major/minor numbers. +($major_version, $minor_version) = $VERSION =~ /^(\d+)\.(\d+)/; + +ConfigDefaults(); + +################ OO Interface ################ + +package Getopt::Long::Parser; + +# Store a copy of the default configuration. Since ConfigDefaults has +# just been called, what we get from Configure is the default. +my $default_config = do { + Getopt::Long::Configure () +}; + +sub new { + my $that = shift; + my $class = ref($that) || $that; + my %atts = @_; + + # Register the callers package. + my $self = { caller_pkg => (caller)[0] }; + + bless ($self, $class); + + # Process config attributes. + if ( defined $atts{config} ) { + my $save = Getopt::Long::Configure ($default_config, @{$atts{config}}); + $self->{settings} = Getopt::Long::Configure ($save); + delete ($atts{config}); + } + # Else use default config. + else { + $self->{settings} = $default_config; + } + + if ( %atts ) { # Oops + die(__PACKAGE__.": unhandled attributes: ". + join(" ", sort(keys(%atts)))."\n"); + } + + $self; +} + +sub configure { + my ($self) = shift; + + # Restore settings, merge new settings in. + my $save = Getopt::Long::Configure ($self->{settings}, @_); + + # Restore orig config and save the new config. + $self->{settings} = Getopt::Long::Configure ($save); +} + +sub getoptions { + my ($self) = shift; + + # Restore config settings. + my $save = Getopt::Long::Configure ($self->{settings}); + + # Call main routine. + my $ret = 0; + $Getopt::Long::caller = $self->{caller_pkg}; + + eval { + # Locally set exception handler to default, otherwise it will + # be called implicitly here, and again explicitly when we try + # to deliver the messages. + local ($SIG{__DIE__}) = '__DEFAULT__'; + $ret = Getopt::Long::GetOptions (@_); + }; + + # Restore saved settings. + Getopt::Long::Configure ($save); + + # Handle errors and return value. + die ($@) if $@; + return $ret; +} + +package Getopt::Long; + +################ Back to Normal ################ + +# Indices in option control info. +# Note that ParseOptions uses the fields directly. Search for 'hard-wired'. +use constant CTL_TYPE => 0; +#use constant CTL_TYPE_FLAG => ''; +#use constant CTL_TYPE_NEG => '!'; +#use constant CTL_TYPE_INCR => '+'; +#use constant CTL_TYPE_INT => 'i'; +#use constant CTL_TYPE_INTINC => 'I'; +#use constant CTL_TYPE_XINT => 'o'; +#use constant CTL_TYPE_FLOAT => 'f'; +#use constant CTL_TYPE_STRING => 's'; + +use constant CTL_CNAME => 1; + +use constant CTL_DEFAULT => 2; + +use constant CTL_DEST => 3; + use constant CTL_DEST_SCALAR => 0; + use constant CTL_DEST_ARRAY => 1; + use constant CTL_DEST_HASH => 2; + use constant CTL_DEST_CODE => 3; + +use constant CTL_AMIN => 4; +use constant CTL_AMAX => 5; + +# FFU. +#use constant CTL_RANGE => ; +#use constant CTL_REPEAT => ; + +sub GetOptions(@) { + + my @optionlist = @_; # local copy of the option descriptions + my $argend = '--'; # option list terminator + my %opctl = (); # table of option specs + my $pkg = $caller || (caller)[0]; # current context + # Needed if linkage is omitted. + my @ret = (); # accum for non-options + my %linkage; # linkage + my $userlinkage; # user supplied HASH + my $opt; # current option + my $prefix = $genprefix; # current prefix + + $error = ''; + + if ( $debug ) { + # Avoid some warnings if debugging. + local ($^W) = 0; + print STDERR + ("Getopt::Long $Getopt::Long::VERSION (", + '$Revision: 2.72 $', ") ", + "called from package \"$pkg\".", + "\n ", + "ARGV: (@ARGV)", + "\n ", + "autoabbrev=$autoabbrev,". + "bundling=$bundling,", + "getopt_compat=$getopt_compat,", + "gnu_compat=$gnu_compat,", + "order=$order,", + "\n ", + "ignorecase=$ignorecase,", + "requested_version=$requested_version,", + "passthrough=$passthrough,", + "genprefix=\"$genprefix\",", + "longprefix=\"$longprefix\".", + "\n"); + } + + # Check for ref HASH as first argument. + # First argument may be an object. It's OK to use this as long + # as it is really a hash underneath. + $userlinkage = undef; + if ( @optionlist && ref($optionlist[0]) and + UNIVERSAL::isa($optionlist[0],'HASH') ) { + $userlinkage = shift (@optionlist); + print STDERR ("=> user linkage: $userlinkage\n") if $debug; + } + + # See if the first element of the optionlist contains option + # starter characters. + # Be careful not to interpret '<>' as option starters. + if ( @optionlist && $optionlist[0] =~ /^\W+$/ + && !($optionlist[0] eq '<>' + && @optionlist > 0 + && ref($optionlist[1])) ) { + $prefix = shift (@optionlist); + # Turn into regexp. Needs to be parenthesized! + $prefix =~ s/(\W)/\\$1/g; + $prefix = "([" . $prefix . "])"; + print STDERR ("=> prefix=\"$prefix\"\n") if $debug; + } + + # Verify correctness of optionlist. + %opctl = (); + while ( @optionlist ) { + my $opt = shift (@optionlist); + + unless ( defined($opt) ) { + $error .= "Undefined argument in option spec\n"; + next; + } + + # Strip leading prefix so people can specify "--foo=i" if they like. + $opt = $+ if $opt =~ /^$prefix+(.*)$/s; + + if ( $opt eq '<>' ) { + if ( (defined $userlinkage) + && !(@optionlist > 0 && ref($optionlist[0])) + && (exists $userlinkage->{$opt}) + && ref($userlinkage->{$opt}) ) { + unshift (@optionlist, $userlinkage->{$opt}); + } + unless ( @optionlist > 0 + && ref($optionlist[0]) && ref($optionlist[0]) eq 'CODE' ) { + $error .= "Option spec <> requires a reference to a subroutine\n"; + # Kill the linkage (to avoid another error). + shift (@optionlist) + if @optionlist && ref($optionlist[0]); + next; + } + $linkage{'<>'} = shift (@optionlist); + next; + } + + # Parse option spec. + my ($name, $orig) = ParseOptionSpec ($opt, \%opctl); + unless ( defined $name ) { + # Failed. $orig contains the error message. Sorry for the abuse. + $error .= $orig; + # Kill the linkage (to avoid another error). + shift (@optionlist) + if @optionlist && ref($optionlist[0]); + next; + } + + # If no linkage is supplied in the @optionlist, copy it from + # the userlinkage if available. + if ( defined $userlinkage ) { + unless ( @optionlist > 0 && ref($optionlist[0]) ) { + if ( exists $userlinkage->{$orig} && + ref($userlinkage->{$orig}) ) { + print STDERR ("=> found userlinkage for \"$orig\": ", + "$userlinkage->{$orig}\n") + if $debug; + unshift (@optionlist, $userlinkage->{$orig}); + } + else { + # Do nothing. Being undefined will be handled later. + next; + } + } + } + + # Copy the linkage. If omitted, link to global variable. + if ( @optionlist > 0 && ref($optionlist[0]) ) { + print STDERR ("=> link \"$orig\" to $optionlist[0]\n") + if $debug; + my $rl = ref($linkage{$orig} = shift (@optionlist)); + + if ( $rl eq "ARRAY" ) { + $opctl{$name}[CTL_DEST] = CTL_DEST_ARRAY; + } + elsif ( $rl eq "HASH" ) { + $opctl{$name}[CTL_DEST] = CTL_DEST_HASH; + } + elsif ( $rl eq "SCALAR" ) { +# if ( $opctl{$name}[CTL_DEST] == CTL_DEST_ARRAY ) { +# my $t = $linkage{$orig}; +# $$t = $linkage{$orig} = []; +# } +# elsif ( $opctl{$name}[CTL_DEST] == CTL_DEST_HASH ) { +# } +# else { + # Ok. +# } + } + elsif ( $rl eq "CODE" ) { + # Ok. + } + else { + $error .= "Invalid option linkage for \"$opt\"\n"; + } + } + else { + # Link to global $opt_XXX variable. + # Make sure a valid perl identifier results. + my $ov = $orig; + $ov =~ s/\W/_/g; + if ( $opctl{$name}[CTL_DEST] == CTL_DEST_ARRAY ) { + print STDERR ("=> link \"$orig\" to \@$pkg","::opt_$ov\n") + if $debug; + eval ("\$linkage{\$orig} = \\\@".$pkg."::opt_$ov;"); + } + elsif ( $opctl{$name}[CTL_DEST] == CTL_DEST_HASH ) { + print STDERR ("=> link \"$orig\" to \%$pkg","::opt_$ov\n") + if $debug; + eval ("\$linkage{\$orig} = \\\%".$pkg."::opt_$ov;"); + } + else { + print STDERR ("=> link \"$orig\" to \$$pkg","::opt_$ov\n") + if $debug; + eval ("\$linkage{\$orig} = \\\$".$pkg."::opt_$ov;"); + } + } + } + + # Bail out if errors found. + die ($error) if $error; + $error = 0; + + # Supply --version and --help support, if needed and allowed. + if ( defined($auto_version) ? $auto_version : ($requested_version >= 2.3203) ) { + if ( !defined($opctl{version}) ) { + $opctl{version} = ['','version',0,CTL_DEST_CODE,undef]; + $linkage{version} = \&VersionMessage; + } + $auto_version = 1; + } + if ( defined($auto_help) ? $auto_help : ($requested_version >= 2.3203) ) { + if ( !defined($opctl{help}) && !defined($opctl{'?'}) ) { + $opctl{help} = $opctl{'?'} = ['','help',0,CTL_DEST_CODE,undef]; + $linkage{help} = \&HelpMessage; + } + $auto_help = 1; + } + + # Show the options tables if debugging. + if ( $debug ) { + my ($arrow, $k, $v); + $arrow = "=> "; + while ( ($k,$v) = each(%opctl) ) { + print STDERR ($arrow, "\$opctl{$k} = $v ", OptCtl($v), "\n"); + $arrow = " "; + } + } + + # Process argument list + my $goon = 1; + while ( $goon && @ARGV > 0 ) { + + # Get next argument. + $opt = shift (@ARGV); + print STDERR ("=> arg \"", $opt, "\"\n") if $debug; + + # Double dash is option list terminator. + if ( $opt eq $argend ) { + push (@ret, $argend) if $passthrough; + last; + } + + # Look it up. + my $tryopt = $opt; + my $found; # success status + my $key; # key (if hash type) + my $arg; # option argument + my $ctl; # the opctl entry + + ($found, $opt, $ctl, $arg, $key) = + FindOption ($prefix, $argend, $opt, \%opctl); + + if ( $found ) { + + # FindOption undefines $opt in case of errors. + next unless defined $opt; + + my $argcnt = 0; + while ( defined $arg ) { + + # Get the canonical name. + print STDERR ("=> cname for \"$opt\" is ") if $debug; + $opt = $ctl->[CTL_CNAME]; + print STDERR ("\"$ctl->[CTL_CNAME]\"\n") if $debug; + + if ( defined $linkage{$opt} ) { + print STDERR ("=> ref(\$L{$opt}) -> ", + ref($linkage{$opt}), "\n") if $debug; + + if ( ref($linkage{$opt}) eq 'SCALAR' ) { + if ( $ctl->[CTL_TYPE] eq '+' ) { + print STDERR ("=> \$\$L{$opt} += \"$arg\"\n") + if $debug; + if ( defined ${$linkage{$opt}} ) { + ${$linkage{$opt}} += $arg; + } + else { + ${$linkage{$opt}} = $arg; + } + } + elsif ( $ctl->[CTL_DEST] == CTL_DEST_ARRAY ) { + print STDERR ("=> ref(\$L{$opt}) auto-vivified", + " to ARRAY\n") + if $debug; + my $t = $linkage{$opt}; + $$t = $linkage{$opt} = []; + print STDERR ("=> push(\@{\$L{$opt}, \"$arg\")\n") + if $debug; + push (@{$linkage{$opt}}, $arg); + } + elsif ( $ctl->[CTL_DEST] == CTL_DEST_HASH ) { + print STDERR ("=> ref(\$L{$opt}) auto-vivified", + " to HASH\n") + if $debug; + my $t = $linkage{$opt}; + $$t = $linkage{$opt} = {}; + print STDERR ("=> \$\$L{$opt}->{$key} = \"$arg\"\n") + if $debug; + $linkage{$opt}->{$key} = $arg; + } + else { + print STDERR ("=> \$\$L{$opt} = \"$arg\"\n") + if $debug; + ${$linkage{$opt}} = $arg; + } + } + elsif ( ref($linkage{$opt}) eq 'ARRAY' ) { + print STDERR ("=> push(\@{\$L{$opt}, \"$arg\")\n") + if $debug; + push (@{$linkage{$opt}}, $arg); + } + elsif ( ref($linkage{$opt}) eq 'HASH' ) { + print STDERR ("=> \$\$L{$opt}->{$key} = \"$arg\"\n") + if $debug; + $linkage{$opt}->{$key} = $arg; + } + elsif ( ref($linkage{$opt}) eq 'CODE' ) { + print STDERR ("=> &L{$opt}(\"$opt\"", + $ctl->[CTL_DEST] == CTL_DEST_HASH ? ", \"$key\"" : "", + ", \"$arg\")\n") + if $debug; + my $eval_error = do { + local $@; + local $SIG{__DIE__} = '__DEFAULT__'; + eval { + &{$linkage{$opt}}($opt, + $ctl->[CTL_DEST] == CTL_DEST_HASH ? ($key) : (), + $arg); + }; + $@; + }; + print STDERR ("=> die($eval_error)\n") + if $debug && $eval_error ne ''; + if ( $eval_error =~ /^!/ ) { + if ( $eval_error =~ /^!FINISH\b/ ) { + $goon = 0; + } + } + elsif ( $eval_error ne '' ) { + warn ($eval_error); + $error++; + } + } + else { + print STDERR ("Invalid REF type \"", ref($linkage{$opt}), + "\" in linkage\n"); + die("Getopt::Long -- internal error!\n"); + } + } + # No entry in linkage means entry in userlinkage. + elsif ( $ctl->[CTL_DEST] == CTL_DEST_ARRAY ) { + if ( defined $userlinkage->{$opt} ) { + print STDERR ("=> push(\@{\$L{$opt}}, \"$arg\")\n") + if $debug; + push (@{$userlinkage->{$opt}}, $arg); + } + else { + print STDERR ("=>\$L{$opt} = [\"$arg\"]\n") + if $debug; + $userlinkage->{$opt} = [$arg]; + } + } + elsif ( $ctl->[CTL_DEST] == CTL_DEST_HASH ) { + if ( defined $userlinkage->{$opt} ) { + print STDERR ("=> \$L{$opt}->{$key} = \"$arg\"\n") + if $debug; + $userlinkage->{$opt}->{$key} = $arg; + } + else { + print STDERR ("=>\$L{$opt} = {$key => \"$arg\"}\n") + if $debug; + $userlinkage->{$opt} = {$key => $arg}; + } + } + else { + if ( $ctl->[CTL_TYPE] eq '+' ) { + print STDERR ("=> \$L{$opt} += \"$arg\"\n") + if $debug; + if ( defined $userlinkage->{$opt} ) { + $userlinkage->{$opt} += $arg; + } + else { + $userlinkage->{$opt} = $arg; + } + } + else { + print STDERR ("=>\$L{$opt} = \"$arg\"\n") if $debug; + $userlinkage->{$opt} = $arg; + } + } + + $argcnt++; + last if $argcnt >= $ctl->[CTL_AMAX] && $ctl->[CTL_AMAX] != -1; + undef($arg); + + # Need more args? + if ( $argcnt < $ctl->[CTL_AMIN] ) { + if ( @ARGV ) { + if ( ValidValue($ctl, $ARGV[0], 1, $argend, $prefix) ) { + $arg = shift(@ARGV); + ($key,$arg) = $arg =~ /^([^=]+)=(.*)/ + if $ctl->[CTL_DEST] == CTL_DEST_HASH; + next; + } + warn("Value \"$ARGV[0]\" invalid for option $opt\n"); + $error++; + } + else { + warn("Insufficient arguments for option $opt\n"); + $error++; + } + } + + # Any more args? + if ( @ARGV && ValidValue($ctl, $ARGV[0], 0, $argend, $prefix) ) { + $arg = shift(@ARGV); + ($key,$arg) = $arg =~ /^([^=]+)=(.*)/ + if $ctl->[CTL_DEST] == CTL_DEST_HASH; + next; + } + } + } + + # Not an option. Save it if we $PERMUTE and don't have a <>. + elsif ( $order == $PERMUTE ) { + # Try non-options call-back. + my $cb; + if ( (defined ($cb = $linkage{'<>'})) ) { + print STDERR ("=> &L{$tryopt}(\"$tryopt\")\n") + if $debug; + my $eval_error = do { + local $@; + local $SIG{__DIE__} = '__DEFAULT__'; + eval { &$cb ($tryopt) }; + $@; + }; + print STDERR ("=> die($eval_error)\n") + if $debug && $eval_error ne ''; + if ( $eval_error =~ /^!/ ) { + if ( $eval_error =~ /^!FINISH\b/ ) { + $goon = 0; + } + } + elsif ( $eval_error ne '' ) { + warn ($eval_error); + $error++; + } + } + else { + print STDERR ("=> saving \"$tryopt\" ", + "(not an option, may permute)\n") if $debug; + push (@ret, $tryopt); + } + next; + } + + # ...otherwise, terminate. + else { + # Push this one back and exit. + unshift (@ARGV, $tryopt); + return ($error == 0); + } + + } + + # Finish. + if ( @ret && $order == $PERMUTE ) { + # Push back accumulated arguments + print STDERR ("=> restoring \"", join('" "', @ret), "\"\n") + if $debug; + unshift (@ARGV, @ret); + } + + return ($error == 0); +} + +# A readable representation of what's in an optbl. +sub OptCtl ($) { + my ($v) = @_; + my @v = map { defined($_) ? ($_) : ("<undef>") } @$v; + "[". + join(",", + "\"$v[CTL_TYPE]\"", + "\"$v[CTL_CNAME]\"", + "\"$v[CTL_DEFAULT]\"", + ("\$","\@","\%","\&")[$v[CTL_DEST] || 0], + $v[CTL_AMIN] || '', + $v[CTL_AMAX] || '', +# $v[CTL_RANGE] || '', +# $v[CTL_REPEAT] || '', + ). "]"; +} + +# Parse an option specification and fill the tables. +sub ParseOptionSpec ($$) { + my ($opt, $opctl) = @_; + + # Match option spec. + if ( $opt !~ m;^ + ( + # Option name + (?: \w+[-\w]* ) + # Alias names, or "?" + (?: \| (?: \? | \w[-\w]* )? )* + )? + ( + # Either modifiers ... + [!+] + | + # ... or a value/dest/repeat specification + [=:] [ionfs] [@%]? (?: \{\d*,?\d*\} )? + | + # ... or an optional-with-default spec + : (?: -?\d+ | \+ ) [@%]? + )? + $;x ) { + return (undef, "Error in option spec: \"$opt\"\n"); + } + + my ($names, $spec) = ($1, $2); + $spec = '' unless defined $spec; + + # $orig keeps track of the primary name the user specified. + # This name will be used for the internal or external linkage. + # In other words, if the user specifies "FoO|BaR", it will + # match any case combinations of 'foo' and 'bar', but if a global + # variable needs to be set, it will be $opt_FoO in the exact case + # as specified. + my $orig; + + my @names; + if ( defined $names ) { + @names = split (/\|/, $names); + $orig = $names[0]; + } + else { + @names = (''); + $orig = ''; + } + + # Construct the opctl entries. + my $entry; + if ( $spec eq '' || $spec eq '+' || $spec eq '!' ) { + # Fields are hard-wired here. + $entry = [$spec,$orig,undef,CTL_DEST_SCALAR,0,0]; + } + elsif ( $spec =~ /^:(-?\d+|\+)([@%])?$/ ) { + my $def = $1; + my $dest = $2; + my $type = $def eq '+' ? 'I' : 'i'; + $dest ||= '$'; + $dest = $dest eq '@' ? CTL_DEST_ARRAY + : $dest eq '%' ? CTL_DEST_HASH : CTL_DEST_SCALAR; + # Fields are hard-wired here. + $entry = [$type,$orig,$def eq '+' ? undef : $def, + $dest,0,1]; + } + else { + my ($mand, $type, $dest) = + $spec =~ /^([=:])([ionfs])([@%])?(\{(\d+)?(,)?(\d+)?\})?$/; + return (undef, "Cannot repeat while bundling: \"$opt\"\n") + if $bundling && defined($4); + my ($mi, $cm, $ma) = ($5, $6, $7); + return (undef, "{0} is useless in option spec: \"$opt\"\n") + if defined($mi) && !$mi && !defined($ma) && !defined($cm); + + $type = 'i' if $type eq 'n'; + $dest ||= '$'; + $dest = $dest eq '@' ? CTL_DEST_ARRAY + : $dest eq '%' ? CTL_DEST_HASH : CTL_DEST_SCALAR; + # Default minargs to 1/0 depending on mand status. + $mi = $mand eq '=' ? 1 : 0 unless defined $mi; + # Adjust mand status according to minargs. + $mand = $mi ? '=' : ':'; + # Adjust maxargs. + $ma = $mi ? $mi : 1 unless defined $ma || defined $cm; + return (undef, "Max must be greater than zero in option spec: \"$opt\"\n") + if defined($ma) && !$ma; + return (undef, "Max less than min in option spec: \"$opt\"\n") + if defined($ma) && $ma < $mi; + + # Fields are hard-wired here. + $entry = [$type,$orig,undef,$dest,$mi,$ma||-1]; + } + + # Process all names. First is canonical, the rest are aliases. + my $dups = ''; + foreach ( @names ) { + + $_ = lc ($_) + if $ignorecase > (($bundling && length($_) == 1) ? 1 : 0); + + if ( exists $opctl->{$_} ) { + $dups .= "Duplicate specification \"$opt\" for option \"$_\"\n"; + } + + if ( $spec eq '!' ) { + $opctl->{"no$_"} = $entry; + $opctl->{"no-$_"} = $entry; + $opctl->{$_} = [@$entry]; + $opctl->{$_}->[CTL_TYPE] = ''; + } + else { + $opctl->{$_} = $entry; + } + } + + if ( $dups && $^W ) { + foreach ( split(/\n+/, $dups) ) { + warn($_."\n"); + } + } + ($names[0], $orig); +} + +# Option lookup. +sub FindOption ($$$$) { + + # returns (1, $opt, $ctl, $arg, $key) if okay, + # returns (1, undef) if option in error, + # returns (0) otherwise. + + my ($prefix, $argend, $opt, $opctl) = @_; + + print STDERR ("=> find \"$opt\"\n") if $debug; + + return (0) unless $opt =~ /^$prefix(.*)$/s; + return (0) if $opt eq "-" && !defined $opctl->{''}; + + $opt = $+; + my $starter = $1; + + print STDERR ("=> split \"$starter\"+\"$opt\"\n") if $debug; + + my $optarg; # value supplied with --opt=value + my $rest; # remainder from unbundling + + # If it is a long option, it may include the value. + # With getopt_compat, only if not bundling. + if ( ($starter=~/^$longprefix$/ + || ($getopt_compat && ($bundling == 0 || $bundling == 2))) + && $opt =~ /^([^=]+)=(.*)$/s ) { + $opt = $1; + $optarg = $2; + print STDERR ("=> option \"", $opt, + "\", optarg = \"$optarg\"\n") if $debug; + } + + #### Look it up ### + + my $tryopt = $opt; # option to try + + if ( $bundling && $starter eq '-' ) { + + # To try overrides, obey case ignore. + $tryopt = $ignorecase ? lc($opt) : $opt; + + # If bundling == 2, long options can override bundles. + if ( $bundling == 2 && length($tryopt) > 1 + && defined ($opctl->{$tryopt}) ) { + print STDERR ("=> $starter$tryopt overrides unbundling\n") + if $debug; + } + else { + $tryopt = $opt; + # Unbundle single letter option. + $rest = length ($tryopt) > 0 ? substr ($tryopt, 1) : ''; + $tryopt = substr ($tryopt, 0, 1); + $tryopt = lc ($tryopt) if $ignorecase > 1; + print STDERR ("=> $starter$tryopt unbundled from ", + "$starter$tryopt$rest\n") if $debug; + $rest = undef unless $rest ne ''; + } + } + + # Try auto-abbreviation. + elsif ( $autoabbrev ) { + # Sort the possible long option names. + my @names = sort(keys (%$opctl)); + # Downcase if allowed. + $opt = lc ($opt) if $ignorecase; + $tryopt = $opt; + # Turn option name into pattern. + my $pat = quotemeta ($opt); + # Look up in option names. + my @hits = grep (/^$pat/, @names); + print STDERR ("=> ", scalar(@hits), " hits (@hits) with \"$pat\" ", + "out of ", scalar(@names), "\n") if $debug; + + # Check for ambiguous results. + unless ( (@hits <= 1) || (grep ($_ eq $opt, @hits) == 1) ) { + # See if all matches are for the same option. + my %hit; + foreach ( @hits ) { + my $hit = $_; + $hit = $opctl->{$hit}->[CTL_CNAME] + if defined $opctl->{$hit}->[CTL_CNAME]; + $hit{$hit} = 1; + } + # Remove auto-supplied options (version, help). + if ( keys(%hit) == 2 ) { + if ( $auto_version && exists($hit{version}) ) { + delete $hit{version}; + } + elsif ( $auto_help && exists($hit{help}) ) { + delete $hit{help}; + } + } + # Now see if it really is ambiguous. + unless ( keys(%hit) == 1 ) { + return (0) if $passthrough; + warn ("Option ", $opt, " is ambiguous (", + join(", ", @hits), ")\n"); + $error++; + return (1, undef); + } + @hits = keys(%hit); + } + + # Complete the option name, if appropriate. + if ( @hits == 1 && $hits[0] ne $opt ) { + $tryopt = $hits[0]; + $tryopt = lc ($tryopt) if $ignorecase; + print STDERR ("=> option \"$opt\" -> \"$tryopt\"\n") + if $debug; + } + } + + # Map to all lowercase if ignoring case. + elsif ( $ignorecase ) { + $tryopt = lc ($opt); + } + + # Check validity by fetching the info. + my $ctl = $opctl->{$tryopt}; + unless ( defined $ctl ) { + return (0) if $passthrough; + # Pretend one char when bundling. + if ( $bundling == 1 && length($starter) == 1 ) { + $opt = substr($opt,0,1); + unshift (@ARGV, $starter.$rest) if defined $rest; + } + warn ("Unknown option: ", $opt, "\n"); + $error++; + return (1, undef); + } + # Apparently valid. + $opt = $tryopt; + print STDERR ("=> found ", OptCtl($ctl), + " for \"", $opt, "\"\n") if $debug; + + #### Determine argument status #### + + # If it is an option w/o argument, we're almost finished with it. + my $type = $ctl->[CTL_TYPE]; + my $arg; + + if ( $type eq '' || $type eq '!' || $type eq '+' ) { + if ( defined $optarg ) { + return (0) if $passthrough; + warn ("Option ", $opt, " does not take an argument\n"); + $error++; + undef $opt; + } + elsif ( $type eq '' || $type eq '+' ) { + # Supply explicit value. + $arg = 1; + } + else { + $opt =~ s/^no-?//i; # strip NO prefix + $arg = 0; # supply explicit value + } + unshift (@ARGV, $starter.$rest) if defined $rest; + return (1, $opt, $ctl, $arg); + } + + # Get mandatory status and type info. + my $mand = $ctl->[CTL_AMIN]; + + # Check if there is an option argument available. + if ( $gnu_compat && defined $optarg && $optarg eq '' ) { + return (1, $opt, $ctl, $type eq 's' ? '' : 0) unless $mand; + $optarg = 0 unless $type eq 's'; + } + + # Check if there is an option argument available. + if ( defined $optarg + ? ($optarg eq '') + : !(defined $rest || @ARGV > 0) ) { + # Complain if this option needs an argument. + if ( $mand ) { + return (0) if $passthrough; + warn ("Option ", $opt, " requires an argument\n"); + $error++; + return (1, undef); + } + if ( $type eq 'I' ) { + # Fake incremental type. + my @c = @$ctl; + $c[CTL_TYPE] = '+'; + return (1, $opt, \@c, 1); + } + return (1, $opt, $ctl, + defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] : + $type eq 's' ? '' : 0); + } + + # Get (possibly optional) argument. + $arg = (defined $rest ? $rest + : (defined $optarg ? $optarg : shift (@ARGV))); + + # Get key if this is a "name=value" pair for a hash option. + my $key; + if ($ctl->[CTL_DEST] == CTL_DEST_HASH && defined $arg) { + ($key, $arg) = ($arg =~ /^([^=]*)=(.*)$/s) ? ($1, $2) + : ($arg, defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] : + ($mand ? undef : ($type eq 's' ? "" : 1))); + if (! defined $arg) { + warn ("Option $opt, key \"$key\", requires a value\n"); + $error++; + # Push back. + unshift (@ARGV, $starter.$rest) if defined $rest; + return (1, undef); + } + } + + #### Check if the argument is valid for this option #### + + my $key_valid = $ctl->[CTL_DEST] == CTL_DEST_HASH ? "[^=]+=" : ""; + + if ( $type eq 's' ) { # string + # A mandatory string takes anything. + return (1, $opt, $ctl, $arg, $key) if $mand; + + # An optional string takes almost anything. + return (1, $opt, $ctl, $arg, $key) + if defined $optarg || defined $rest; + return (1, $opt, $ctl, $arg, $key) if $arg eq "-"; # ?? + + # Check for option or option list terminator. + if ($arg eq $argend || + $arg =~ /^$prefix.+/) { + # Push back. + unshift (@ARGV, $arg); + # Supply empty value. + $arg = ''; + } + } + + elsif ( $type eq 'i' # numeric/integer + || $type eq 'I' # numeric/integer w/ incr default + || $type eq 'o' ) { # dec/oct/hex/bin value + + my $o_valid = + $type eq 'o' ? "[-+]?[1-9][0-9]*|0x[0-9a-f]+|0b[01]+|0[0-7]*" + : "[-+]?[0-9]+"; + + if ( $bundling && defined $rest + && $rest =~ /^($key_valid)($o_valid)(.*)$/si ) { + ($key, $arg, $rest) = ($1, $2, $+); + chop($key) if $key; + $arg = ($type eq 'o' && $arg =~ /^0/) ? oct($arg) : 0+$arg; + unshift (@ARGV, $starter.$rest) if defined $rest && $rest ne ''; + } + elsif ( $arg =~ /^($o_valid)$/si ) { + $arg = ($type eq 'o' && $arg =~ /^0/) ? oct($arg) : 0+$arg; + } + else { + if ( defined $optarg || $mand ) { + if ( $passthrough ) { + unshift (@ARGV, defined $rest ? $starter.$rest : $arg) + unless defined $optarg; + return (0); + } + warn ("Value \"", $arg, "\" invalid for option ", + $opt, " (", + $type eq 'o' ? "extended " : '', + "number expected)\n"); + $error++; + # Push back. + unshift (@ARGV, $starter.$rest) if defined $rest; + return (1, undef); + } + else { + # Push back. + unshift (@ARGV, defined $rest ? $starter.$rest : $arg); + if ( $type eq 'I' ) { + # Fake incremental type. + my @c = @$ctl; + $c[CTL_TYPE] = '+'; + return (1, $opt, \@c, 1); + } + # Supply default value. + $arg = defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] : 0; + } + } + } + + elsif ( $type eq 'f' ) { # real number, int is also ok + # We require at least one digit before a point or 'e', + # and at least one digit following the point and 'e'. + # [-]NN[.NN][eNN] + if ( $bundling && defined $rest && + $rest =~ /^($key_valid)([-+]?[0-9]+(\.[0-9]+)?([eE][-+]?[0-9]+)?)(.*)$/s ) { + ($key, $arg, $rest) = ($1, $2, $+); + chop($key) if $key; + unshift (@ARGV, $starter.$rest) if defined $rest && $rest ne ''; + } + elsif ( $arg !~ /^[-+]?[0-9.]+(\.[0-9]+)?([eE][-+]?[0-9]+)?$/ ) { + if ( defined $optarg || $mand ) { + if ( $passthrough ) { + unshift (@ARGV, defined $rest ? $starter.$rest : $arg) + unless defined $optarg; + return (0); + } + warn ("Value \"", $arg, "\" invalid for option ", + $opt, " (real number expected)\n"); + $error++; + # Push back. + unshift (@ARGV, $starter.$rest) if defined $rest; + return (1, undef); + } + else { + # Push back. + unshift (@ARGV, defined $rest ? $starter.$rest : $arg); + # Supply default value. + $arg = 0.0; + } + } + } + else { + die("Getopt::Long internal error (Can't happen)\n"); + } + return (1, $opt, $ctl, $arg, $key); +} + +sub ValidValue ($$$$$) { + my ($ctl, $arg, $mand, $argend, $prefix) = @_; + + if ( $ctl->[CTL_DEST] == CTL_DEST_HASH ) { + return 0 unless $arg =~ /[^=]+=(.*)/; + $arg = $1; + } + + my $type = $ctl->[CTL_TYPE]; + + if ( $type eq 's' ) { # string + # A mandatory string takes anything. + return (1) if $mand; + + return (1) if $arg eq "-"; + + # Check for option or option list terminator. + return 0 if $arg eq $argend || $arg =~ /^$prefix.+/; + return 1; + } + + elsif ( $type eq 'i' # numeric/integer + || $type eq 'I' # numeric/integer w/ incr default + || $type eq 'o' ) { # dec/oct/hex/bin value + + my $o_valid = + $type eq 'o' ? "[-+]?[1-9][0-9]*|0x[0-9a-f]+|0b[01]+|0[0-7]*" + : "[-+]?[0-9]+"; + + return $arg =~ /^$o_valid$/si; + } + + elsif ( $type eq 'f' ) { # real number, int is also ok + # We require at least one digit before a point or 'e', + # and at least one digit following the point and 'e'. + # [-]NN[.NN][eNN] + return $arg =~ /^[-+]?[0-9.]+(\.[0-9]+)?([eE][-+]?[0-9]+)?$/; + } + die("ValidValue: Cannot happen\n"); +} + +# Getopt::Long Configuration. +sub Configure (@) { + my (@options) = @_; + + my $prevconfig = + [ $error, $debug, $major_version, $minor_version, + $autoabbrev, $getopt_compat, $ignorecase, $bundling, $order, + $gnu_compat, $passthrough, $genprefix, $auto_version, $auto_help, + $longprefix ]; + + if ( ref($options[0]) eq 'ARRAY' ) { + ( $error, $debug, $major_version, $minor_version, + $autoabbrev, $getopt_compat, $ignorecase, $bundling, $order, + $gnu_compat, $passthrough, $genprefix, $auto_version, $auto_help, + $longprefix ) = @{shift(@options)}; + } + + my $opt; + foreach $opt ( @options ) { + my $try = lc ($opt); + my $action = 1; + if ( $try =~ /^no_?(.*)$/s ) { + $action = 0; + $try = $+; + } + if ( ($try eq 'default' or $try eq 'defaults') && $action ) { + ConfigDefaults (); + } + elsif ( ($try eq 'posix_default' or $try eq 'posix_defaults') ) { + local $ENV{POSIXLY_CORRECT}; + $ENV{POSIXLY_CORRECT} = 1 if $action; + ConfigDefaults (); + } + elsif ( $try eq 'auto_abbrev' or $try eq 'autoabbrev' ) { + $autoabbrev = $action; + } + elsif ( $try eq 'getopt_compat' ) { + $getopt_compat = $action; + } + elsif ( $try eq 'gnu_getopt' ) { + if ( $action ) { + $gnu_compat = 1; + $bundling = 1; + $getopt_compat = 0; + $order = $PERMUTE; + } + } + elsif ( $try eq 'gnu_compat' ) { + $gnu_compat = $action; + } + elsif ( $try =~ /^(auto_?)?version$/ ) { + $auto_version = $action; + } + elsif ( $try =~ /^(auto_?)?help$/ ) { + $auto_help = $action; + } + elsif ( $try eq 'ignorecase' or $try eq 'ignore_case' ) { + $ignorecase = $action; + } + elsif ( $try eq 'ignore_case_always' ) { + $ignorecase = $action ? 2 : 0; + } + elsif ( $try eq 'bundling' ) { + $bundling = $action; + } + elsif ( $try eq 'bundling_override' ) { + $bundling = $action ? 2 : 0; + } + elsif ( $try eq 'require_order' ) { + $order = $action ? $REQUIRE_ORDER : $PERMUTE; + } + elsif ( $try eq 'permute' ) { + $order = $action ? $PERMUTE : $REQUIRE_ORDER; + } + elsif ( $try eq 'pass_through' or $try eq 'passthrough' ) { + $passthrough = $action; + } + elsif ( $try =~ /^prefix=(.+)$/ && $action ) { + $genprefix = $1; + # Turn into regexp. Needs to be parenthesized! + $genprefix = "(" . quotemeta($genprefix) . ")"; + eval { '' =~ /$genprefix/; }; + die("Getopt::Long: invalid pattern \"$genprefix\"") if $@; + } + elsif ( $try =~ /^prefix_pattern=(.+)$/ && $action ) { + $genprefix = $1; + # Parenthesize if needed. + $genprefix = "(" . $genprefix . ")" + unless $genprefix =~ /^\(.*\)$/; + eval { '' =~ m"$genprefix"; }; + die("Getopt::Long: invalid pattern \"$genprefix\"") if $@; + } + elsif ( $try =~ /^long_prefix_pattern=(.+)$/ && $action ) { + $longprefix = $1; + # Parenthesize if needed. + $longprefix = "(" . $longprefix . ")" + unless $longprefix =~ /^\(.*\)$/; + eval { '' =~ m"$longprefix"; }; + die("Getopt::Long: invalid long prefix pattern \"$longprefix\"") if $@; + } + elsif ( $try eq 'debug' ) { + $debug = $action; + } + else { + die("Getopt::Long: unknown config parameter \"$opt\"") + } + } + $prevconfig; +} + +# Deprecated name. +sub config (@) { + Configure (@_); +} + +# Issue a standard message for --version. +# +# The arguments are mostly the same as for Pod::Usage::pod2usage: +# +# - a number (exit value) +# - a string (lead in message) +# - a hash with options. See Pod::Usage for details. +# +sub VersionMessage(@) { + # Massage args. + my $pa = setup_pa_args("version", @_); + + my $v = $main::VERSION; + my $fh = $pa->{-output} || + ($pa->{-exitval} eq "NOEXIT" || $pa->{-exitval} < 2) ? \*STDOUT : \*STDERR; + + print $fh (defined($pa->{-message}) ? $pa->{-message} : (), + $0, defined $v ? " version $v" : (), + "\n", + "(", __PACKAGE__, "::", "GetOptions", + " version ", + defined($Getopt::Long::VERSION_STRING) + ? $Getopt::Long::VERSION_STRING : $VERSION, ";", + " Perl version ", + $] >= 5.006 ? sprintf("%vd", $^V) : $], + ")\n"); + exit($pa->{-exitval}) unless $pa->{-exitval} eq "NOEXIT"; +} + +# Issue a standard message for --help. +# +# The arguments are the same as for Pod::Usage::pod2usage: +# +# - a number (exit value) +# - a string (lead in message) +# - a hash with options. See Pod::Usage for details. +# +sub HelpMessage(@) { + eval { + require Pod::Usage; + import Pod::Usage; + 1; + } || die("Cannot provide help: cannot load Pod::Usage\n"); + + # Note that pod2usage will issue a warning if -exitval => NOEXIT. + pod2usage(setup_pa_args("help", @_)); + +} + +# Helper routine to set up a normalized hash ref to be used as +# argument to pod2usage. +sub setup_pa_args($@) { + my $tag = shift; # who's calling + + # If called by direct binding to an option, it will get the option + # name and value as arguments. Remove these, if so. + @_ = () if @_ == 2 && $_[0] eq $tag; + + my $pa; + if ( @_ > 1 ) { + $pa = { @_ }; + } + else { + $pa = shift || {}; + } + + # At this point, $pa can be a number (exit value), string + # (message) or hash with options. + + if ( UNIVERSAL::isa($pa, 'HASH') ) { + # Get rid of -msg vs. -message ambiguity. + $pa->{-message} = $pa->{-msg}; + delete($pa->{-msg}); + } + elsif ( $pa =~ /^-?\d+$/ ) { + $pa = { -exitval => $pa }; + } + else { + $pa = { -message => $pa }; + } + + # These are _our_ defaults. + $pa->{-verbose} = 0 unless exists($pa->{-verbose}); + $pa->{-exitval} = 0 unless exists($pa->{-exitval}); + $pa; +} + +# Sneak way to know what version the user requested. +sub VERSION { + $requested_version = $_[1]; + shift->SUPER::VERSION(@_); +} + +1; + +################ Documentation ################ + +=head1 NAME + +Getopt::Long - Extended processing of command line options + +=head1 SYNOPSIS + + use Getopt::Long; + my $data = "file.dat"; + my $length = 24; + my $verbose; + $result = GetOptions ("length=i" => \$length, # numeric + "file=s" => \$data, # string + "verbose" => \$verbose); # flag + +=head1 DESCRIPTION + +The Getopt::Long module implements an extended getopt function called +GetOptions(). This function adheres to the POSIX syntax for command +line options, with GNU extensions. In general, this means that options +have long names instead of single letters, and are introduced with a +double dash "--". Support for bundling of command line options, as was +the case with the more traditional single-letter approach, is provided +but not enabled by default. + +=head1 Command Line Options, an Introduction + +Command line operated programs traditionally take their arguments from +the command line, for example filenames or other information that the +program needs to know. Besides arguments, these programs often take +command line I<options> as well. Options are not necessary for the +program to work, hence the name 'option', but are used to modify its +default behaviour. For example, a program could do its job quietly, +but with a suitable option it could provide verbose information about +what it did. + +Command line options come in several flavours. Historically, they are +preceded by a single dash C<->, and consist of a single letter. + + -l -a -c + +Usually, these single-character options can be bundled: + + -lac + +Options can have values, the value is placed after the option +character. Sometimes with whitespace in between, sometimes not: + + -s 24 -s24 + +Due to the very cryptic nature of these options, another style was +developed that used long names. So instead of a cryptic C<-l> one +could use the more descriptive C<--long>. To distinguish between a +bundle of single-character options and a long one, two dashes are used +to precede the option name. Early implementations of long options used +a plus C<+> instead. Also, option values could be specified either +like + + --size=24 + +or + + --size 24 + +The C<+> form is now obsolete and strongly deprecated. + +=head1 Getting Started with Getopt::Long + +Getopt::Long is the Perl5 successor of C<newgetopt.pl>. This was the +first Perl module that provided support for handling the new style of +command line options, hence the name Getopt::Long. This module also +supports single-character options and bundling. Single character +options may be any alphabetic character, a question mark, and a dash. +Long options may consist of a series of letters, digits, and dashes. +Although this is currently not enforced by Getopt::Long, multiple +consecutive dashes are not allowed, and the option name must not end +with a dash. + +To use Getopt::Long from a Perl program, you must include the +following line in your Perl program: + + use Getopt::Long; + +This will load the core of the Getopt::Long module and prepare your +program for using it. Most of the actual Getopt::Long code is not +loaded until you really call one of its functions. + +In the default configuration, options names may be abbreviated to +uniqueness, case does not matter, and a single dash is sufficient, +even for long option names. Also, options may be placed between +non-option arguments. See L<Configuring Getopt::Long> for more +details on how to configure Getopt::Long. + +=head2 Simple options + +The most simple options are the ones that take no values. Their mere +presence on the command line enables the option. Popular examples are: + + --all --verbose --quiet --debug + +Handling simple options is straightforward: + + my $verbose = ''; # option variable with default value (false) + my $all = ''; # option variable with default value (false) + GetOptions ('verbose' => \$verbose, 'all' => \$all); + +The call to GetOptions() parses the command line arguments that are +present in C<@ARGV> and sets the option variable to the value C<1> if +the option did occur on the command line. Otherwise, the option +variable is not touched. Setting the option value to true is often +called I<enabling> the option. + +The option name as specified to the GetOptions() function is called +the option I<specification>. Later we'll see that this specification +can contain more than just the option name. The reference to the +variable is called the option I<destination>. + +GetOptions() will return a true value if the command line could be +processed successfully. Otherwise, it will write error messages to +STDERR, and return a false result. + +=head2 A little bit less simple options + +Getopt::Long supports two useful variants of simple options: +I<negatable> options and I<incremental> options. + +A negatable option is specified with an exclamation mark C<!> after the +option name: + + my $verbose = ''; # option variable with default value (false) + GetOptions ('verbose!' => \$verbose); + +Now, using C<--verbose> on the command line will enable C<$verbose>, +as expected. But it is also allowed to use C<--noverbose>, which will +disable C<$verbose> by setting its value to C<0>. Using a suitable +default value, the program can find out whether C<$verbose> is false +by default, or disabled by using C<--noverbose>. + +An incremental option is specified with a plus C<+> after the +option name: + + my $verbose = ''; # option variable with default value (false) + GetOptions ('verbose+' => \$verbose); + +Using C<--verbose> on the command line will increment the value of +C<$verbose>. This way the program can keep track of how many times the +option occurred on the command line. For example, each occurrence of +C<--verbose> could increase the verbosity level of the program. + +=head2 Mixing command line option with other arguments + +Usually programs take command line options as well as other arguments, +for example, file names. It is good practice to always specify the +options first, and the other arguments last. Getopt::Long will, +however, allow the options and arguments to be mixed and 'filter out' +all the options before passing the rest of the arguments to the +program. To stop Getopt::Long from processing further arguments, +insert a double dash C<--> on the command line: + + --size 24 -- --all + +In this example, C<--all> will I<not> be treated as an option, but +passed to the program unharmed, in C<@ARGV>. + +=head2 Options with values + +For options that take values it must be specified whether the option +value is required or not, and what kind of value the option expects. + +Three kinds of values are supported: integer numbers, floating point +numbers, and strings. + +If the option value is required, Getopt::Long will take the +command line argument that follows the option and assign this to the +option variable. If, however, the option value is specified as +optional, this will only be done if that value does not look like a +valid command line option itself. + + my $tag = ''; # option variable with default value + GetOptions ('tag=s' => \$tag); + +In the option specification, the option name is followed by an equals +sign C<=> and the letter C<s>. The equals sign indicates that this +option requires a value. The letter C<s> indicates that this value is +an arbitrary string. Other possible value types are C<i> for integer +values, and C<f> for floating point values. Using a colon C<:> instead +of the equals sign indicates that the option value is optional. In +this case, if no suitable value is supplied, string valued options get +an empty string C<''> assigned, while numeric options are set to C<0>. + +=head2 Options with multiple values + +Options sometimes take several values. For example, a program could +use multiple directories to search for library files: + + --library lib/stdlib --library lib/extlib + +To accomplish this behaviour, simply specify an array reference as the +destination for the option: + + GetOptions ("library=s" => \@libfiles); + +Alternatively, you can specify that the option can have multiple +values by adding a "@", and pass a scalar reference as the +destination: + + GetOptions ("library=s@" => \$libfiles); + +Used with the example above, C<@libfiles> (or C<@$libfiles>) would +contain two strings upon completion: C<"lib/srdlib"> and +C<"lib/extlib">, in that order. It is also possible to specify that +only integer or floating point numbers are acceptable values. + +Often it is useful to allow comma-separated lists of values as well as +multiple occurrences of the options. This is easy using Perl's split() +and join() operators: + + GetOptions ("library=s" => \@libfiles); + @libfiles = split(/,/,join(',',@libfiles)); + +Of course, it is important to choose the right separator string for +each purpose. + +Warning: What follows is an experimental feature. + +Options can take multiple values at once, for example + + --coordinates 52.2 16.4 --rgbcolor 255 255 149 + +This can be accomplished by adding a repeat specifier to the option +specification. Repeat specifiers are very similar to the C<{...}> +repeat specifiers that can be used with regular expression patterns. +For example, the above command line would be handled as follows: + + GetOptions('coordinates=f{2}' => \@coor, 'rgbcolor=i{3}' => \@color); + +The destination for the option must be an array or array reference. + +It is also possible to specify the minimal and maximal number of +arguments an option takes. C<foo=s{2,4}> indicates an option that +takes at least two and at most 4 arguments. C<foo=s{,}> indicates one +or more values; C<foo:s{,}> indicates zero or more option values. + +=head2 Options with hash values + +If the option destination is a reference to a hash, the option will +take, as value, strings of the form I<key>C<=>I<value>. The value will +be stored with the specified key in the hash. + + GetOptions ("define=s" => \%defines); + +Alternatively you can use: + + GetOptions ("define=s%" => \$defines); + +When used with command line options: + + --define os=linux --define vendor=redhat + +the hash C<%defines> (or C<%$defines>) will contain two keys, C<"os"> +with value C<"linux> and C<"vendor"> with value C<"redhat">. It is +also possible to specify that only integer or floating point numbers +are acceptable values. The keys are always taken to be strings. + +=head2 User-defined subroutines to handle options + +Ultimate control over what should be done when (actually: each time) +an option is encountered on the command line can be achieved by +designating a reference to a subroutine (or an anonymous subroutine) +as the option destination. When GetOptions() encounters the option, it +will call the subroutine with two or three arguments. The first +argument is the name of the option. For a scalar or array destination, +the second argument is the value to be stored. For a hash destination, +the second arguments is the key to the hash, and the third argument +the value to be stored. It is up to the subroutine to store the value, +or do whatever it thinks is appropriate. + +A trivial application of this mechanism is to implement options that +are related to each other. For example: + + my $verbose = ''; # option variable with default value (false) + GetOptions ('verbose' => \$verbose, + 'quiet' => sub { $verbose = 0 }); + +Here C<--verbose> and C<--quiet> control the same variable +C<$verbose>, but with opposite values. + +If the subroutine needs to signal an error, it should call die() with +the desired error message as its argument. GetOptions() will catch the +die(), issue the error message, and record that an error result must +be returned upon completion. + +If the text of the error message starts with an exclamation mark C<!> +it is interpreted specially by GetOptions(). There is currently one +special command implemented: C<die("!FINISH")> will cause GetOptions() +to stop processing options, as if it encountered a double dash C<-->. + +=head2 Options with multiple names + +Often it is user friendly to supply alternate mnemonic names for +options. For example C<--height> could be an alternate name for +C<--length>. Alternate names can be included in the option +specification, separated by vertical bar C<|> characters. To implement +the above example: + + GetOptions ('length|height=f' => \$length); + +The first name is called the I<primary> name, the other names are +called I<aliases>. When using a hash to store options, the key will +always be the primary name. + +Multiple alternate names are possible. + +=head2 Case and abbreviations + +Without additional configuration, GetOptions() will ignore the case of +option names, and allow the options to be abbreviated to uniqueness. + + GetOptions ('length|height=f' => \$length, "head" => \$head); + +This call will allow C<--l> and C<--L> for the length option, but +requires a least C<--hea> and C<--hei> for the head and height options. + +=head2 Summary of Option Specifications + +Each option specifier consists of two parts: the name specification +and the argument specification. + +The name specification contains the name of the option, optionally +followed by a list of alternative names separated by vertical bar +characters. + + length option name is "length" + length|size|l name is "length", aliases are "size" and "l" + +The argument specification is optional. If omitted, the option is +considered boolean, a value of 1 will be assigned when the option is +used on the command line. + +The argument specification can be + +=over 4 + +=item ! + +The option does not take an argument and may be negated by prefixing +it with "no" or "no-". E.g. C<"foo!"> will allow C<--foo> (a value of +1 will be assigned) as well as C<--nofoo> and C<--no-foo> (a value of +0 will be assigned). If the option has aliases, this applies to the +aliases as well. + +Using negation on a single letter option when bundling is in effect is +pointless and will result in a warning. + +=item + + +The option does not take an argument and will be incremented by 1 +every time it appears on the command line. E.g. C<"more+">, when used +with C<--more --more --more>, will increment the value three times, +resulting in a value of 3 (provided it was 0 or undefined at first). + +The C<+> specifier is ignored if the option destination is not a scalar. + +=item = I<type> [ I<desttype> ] [ I<repeat> ] + +The option requires an argument of the given type. Supported types +are: + +=over 4 + +=item s + +String. An arbitrary sequence of characters. It is valid for the +argument to start with C<-> or C<-->. + +=item i + +Integer. An optional leading plus or minus sign, followed by a +sequence of digits. + +=item o + +Extended integer, Perl style. This can be either an optional leading +plus or minus sign, followed by a sequence of digits, or an octal +string (a zero, optionally followed by '0', '1', .. '7'), or a +hexadecimal string (C<0x> followed by '0' .. '9', 'a' .. 'f', case +insensitive), or a binary string (C<0b> followed by a series of '0' +and '1'). + +=item f + +Real number. For example C<3.14>, C<-6.23E24> and so on. + +=back + +The I<desttype> can be C<@> or C<%> to specify that the option is +list or a hash valued. This is only needed when the destination for +the option value is not otherwise specified. It should be omitted when +not needed. + +The I<repeat> specifies the number of values this option takes per +occurrence on the command line. It has the format C<{> [ I<min> ] [ C<,> [ I<max> ] ] C<}>. + +I<min> denotes the minimal number of arguments. It defaults to 1 for +options with C<=> and to 0 for options with C<:>, see below. Note that +I<min> overrules the C<=> / C<:> semantics. + +I<max> denotes the maximum number of arguments. It must be at least +I<min>. If I<max> is omitted, I<but the comma is not>, there is no +upper bound to the number of argument values taken. + +=item : I<type> [ I<desttype> ] + +Like C<=>, but designates the argument as optional. +If omitted, an empty string will be assigned to string values options, +and the value zero to numeric options. + +Note that if a string argument starts with C<-> or C<-->, it will be +considered an option on itself. + +=item : I<number> [ I<desttype> ] + +Like C<:i>, but if the value is omitted, the I<number> will be assigned. + +=item : + [ I<desttype> ] + +Like C<:i>, but if the value is omitted, the current value for the +option will be incremented. + +=back + +=head1 Advanced Possibilities + +=head2 Object oriented interface + +Getopt::Long can be used in an object oriented way as well: + + use Getopt::Long; + $p = new Getopt::Long::Parser; + $p->configure(...configuration options...); + if ($p->getoptions(...options descriptions...)) ... + +Configuration options can be passed to the constructor: + + $p = new Getopt::Long::Parser + config => [...configuration options...]; + +=head2 Thread Safety + +Getopt::Long is thread safe when using ithreads as of Perl 5.8. It is +I<not> thread safe when using the older (experimental and now +obsolete) threads implementation that was added to Perl 5.005. + +=head2 Documentation and help texts + +Getopt::Long encourages the use of Pod::Usage to produce help +messages. For example: + + use Getopt::Long; + use Pod::Usage; + + my $man = 0; + my $help = 0; + + GetOptions('help|?' => \$help, man => \$man) or pod2usage(2); + pod2usage(1) if $help; + pod2usage(-exitstatus => 0, -verbose => 2) if $man; + + __END__ + + =head1 NAME + + sample - Using Getopt::Long and Pod::Usage + + =head1 SYNOPSIS + + sample [options] [file ...] + + Options: + -help brief help message + -man full documentation + + =head1 OPTIONS + + =over 8 + + =item B<-help> + + Print a brief help message and exits. + + =item B<-man> + + Prints the manual page and exits. + + =back + + =head1 DESCRIPTION + + B<This program> will read the given input file(s) and do something + useful with the contents thereof. + + =cut + +See L<Pod::Usage> for details. + +=head2 Storing option values in a hash + +Sometimes, for example when there are a lot of options, having a +separate variable for each of them can be cumbersome. GetOptions() +supports, as an alternative mechanism, storing options in a hash. + +To obtain this, a reference to a hash must be passed I<as the first +argument> to GetOptions(). For each option that is specified on the +command line, the option value will be stored in the hash with the +option name as key. Options that are not actually used on the command +line will not be put in the hash, on other words, +C<exists($h{option})> (or defined()) can be used to test if an option +was used. The drawback is that warnings will be issued if the program +runs under C<use strict> and uses C<$h{option}> without testing with +exists() or defined() first. + + my %h = (); + GetOptions (\%h, 'length=i'); # will store in $h{length} + +For options that take list or hash values, it is necessary to indicate +this by appending an C<@> or C<%> sign after the type: + + GetOptions (\%h, 'colours=s@'); # will push to @{$h{colours}} + +To make things more complicated, the hash may contain references to +the actual destinations, for example: + + my $len = 0; + my %h = ('length' => \$len); + GetOptions (\%h, 'length=i'); # will store in $len + +This example is fully equivalent with: + + my $len = 0; + GetOptions ('length=i' => \$len); # will store in $len + +Any mixture is possible. For example, the most frequently used options +could be stored in variables while all other options get stored in the +hash: + + my $verbose = 0; # frequently referred + my $debug = 0; # frequently referred + my %h = ('verbose' => \$verbose, 'debug' => \$debug); + GetOptions (\%h, 'verbose', 'debug', 'filter', 'size=i'); + if ( $verbose ) { ... } + if ( exists $h{filter} ) { ... option 'filter' was specified ... } + +=head2 Bundling + +With bundling it is possible to set several single-character options +at once. For example if C<a>, C<v> and C<x> are all valid options, + + -vax + +would set all three. + +Getopt::Long supports two levels of bundling. To enable bundling, a +call to Getopt::Long::Configure is required. + +The first level of bundling can be enabled with: + + Getopt::Long::Configure ("bundling"); + +Configured this way, single-character options can be bundled but long +options B<must> always start with a double dash C<--> to avoid +ambiguity. For example, when C<vax>, C<a>, C<v> and C<x> are all valid +options, + + -vax + +would set C<a>, C<v> and C<x>, but + + --vax + +would set C<vax>. + +The second level of bundling lifts this restriction. It can be enabled +with: + + Getopt::Long::Configure ("bundling_override"); + +Now, C<-vax> would set the option C<vax>. + +When any level of bundling is enabled, option values may be inserted +in the bundle. For example: + + -h24w80 + +is equivalent to + + -h 24 -w 80 + +When configured for bundling, single-character options are matched +case sensitive while long options are matched case insensitive. To +have the single-character options matched case insensitive as well, +use: + + Getopt::Long::Configure ("bundling", "ignorecase_always"); + +It goes without saying that bundling can be quite confusing. + +=head2 The lonesome dash + +Normally, a lone dash C<-> on the command line will not be considered +an option. Option processing will terminate (unless "permute" is +configured) and the dash will be left in C<@ARGV>. + +It is possible to get special treatment for a lone dash. This can be +achieved by adding an option specification with an empty name, for +example: + + GetOptions ('' => \$stdio); + +A lone dash on the command line will now be a legal option, and using +it will set variable C<$stdio>. + +=head2 Argument callback + +A special option 'name' C<< <> >> can be used to designate a subroutine +to handle non-option arguments. When GetOptions() encounters an +argument that does not look like an option, it will immediately call this +subroutine and passes it one parameter: the argument name. + +For example: + + my $width = 80; + sub process { ... } + GetOptions ('width=i' => \$width, '<>' => \&process); + +When applied to the following command line: + + arg1 --width=72 arg2 --width=60 arg3 + +This will call +C<process("arg1")> while C<$width> is C<80>, +C<process("arg2")> while C<$width> is C<72>, and +C<process("arg3")> while C<$width> is C<60>. + +This feature requires configuration option B<permute>, see section +L<Configuring Getopt::Long>. + +=head1 Configuring Getopt::Long + +Getopt::Long can be configured by calling subroutine +Getopt::Long::Configure(). This subroutine takes a list of quoted +strings, each specifying a configuration option to be enabled, e.g. +C<ignore_case>, or disabled, e.g. C<no_ignore_case>. Case does not +matter. Multiple calls to Configure() are possible. + +Alternatively, as of version 2.24, the configuration options may be +passed together with the C<use> statement: + + use Getopt::Long qw(:config no_ignore_case bundling); + +The following options are available: + +=over 12 + +=item default + +This option causes all configuration options to be reset to their +default values. + +=item posix_default + +This option causes all configuration options to be reset to their +default values as if the environment variable POSIXLY_CORRECT had +been set. + +=item auto_abbrev + +Allow option names to be abbreviated to uniqueness. +Default is enabled unless environment variable +POSIXLY_CORRECT has been set, in which case C<auto_abbrev> is disabled. + +=item getopt_compat + +Allow C<+> to start options. +Default is enabled unless environment variable +POSIXLY_CORRECT has been set, in which case C<getopt_compat> is disabled. + +=item gnu_compat + +C<gnu_compat> controls whether C<--opt=> is allowed, and what it should +do. Without C<gnu_compat>, C<--opt=> gives an error. With C<gnu_compat>, +C<--opt=> will give option C<opt> and empty value. +This is the way GNU getopt_long() does it. + +=item gnu_getopt + +This is a short way of setting C<gnu_compat> C<bundling> C<permute> +C<no_getopt_compat>. With C<gnu_getopt>, command line handling should be +fully compatible with GNU getopt_long(). + +=item require_order + +Whether command line arguments are allowed to be mixed with options. +Default is disabled unless environment variable +POSIXLY_CORRECT has been set, in which case C<require_order> is enabled. + +See also C<permute>, which is the opposite of C<require_order>. + +=item permute + +Whether command line arguments are allowed to be mixed with options. +Default is enabled unless environment variable +POSIXLY_CORRECT has been set, in which case C<permute> is disabled. +Note that C<permute> is the opposite of C<require_order>. + +If C<permute> is enabled, this means that + + --foo arg1 --bar arg2 arg3 + +is equivalent to + + --foo --bar arg1 arg2 arg3 + +If an argument callback routine is specified, C<@ARGV> will always be +empty upon successful return of GetOptions() since all options have been +processed. The only exception is when C<--> is used: + + --foo arg1 --bar arg2 -- arg3 + +This will call the callback routine for arg1 and arg2, and then +terminate GetOptions() leaving C<"arg2"> in C<@ARGV>. + +If C<require_order> is enabled, options processing +terminates when the first non-option is encountered. + + --foo arg1 --bar arg2 arg3 + +is equivalent to + + --foo -- arg1 --bar arg2 arg3 + +If C<pass_through> is also enabled, options processing will terminate +at the first unrecognized option, or non-option, whichever comes +first. + +=item bundling (default: disabled) + +Enabling this option will allow single-character options to be +bundled. To distinguish bundles from long option names, long options +I<must> be introduced with C<--> and bundles with C<->. + +Note that, if you have options C<a>, C<l> and C<all>, and +auto_abbrev enabled, possible arguments and option settings are: + + using argument sets option(s) + ------------------------------------------ + -a, --a a + -l, --l l + -al, -la, -ala, -all,... a, l + --al, --all all + +The surprising part is that C<--a> sets option C<a> (due to auto +completion), not C<all>. + +Note: disabling C<bundling> also disables C<bundling_override>. + +=item bundling_override (default: disabled) + +If C<bundling_override> is enabled, bundling is enabled as with +C<bundling> but now long option names override option bundles. + +Note: disabling C<bundling_override> also disables C<bundling>. + +B<Note:> Using option bundling can easily lead to unexpected results, +especially when mixing long options and bundles. Caveat emptor. + +=item ignore_case (default: enabled) + +If enabled, case is ignored when matching long option names. If, +however, bundling is enabled as well, single character options will be +treated case-sensitive. + +With C<ignore_case>, option specifications for options that only +differ in case, e.g., C<"foo"> and C<"Foo">, will be flagged as +duplicates. + +Note: disabling C<ignore_case> also disables C<ignore_case_always>. + +=item ignore_case_always (default: disabled) + +When bundling is in effect, case is ignored on single-character +options also. + +Note: disabling C<ignore_case_always> also disables C<ignore_case>. + +=item auto_version (default:disabled) + +Automatically provide support for the B<--version> option if +the application did not specify a handler for this option itself. + +Getopt::Long will provide a standard version message that includes the +program name, its version (if $main::VERSION is defined), and the +versions of Getopt::Long and Perl. The message will be written to +standard output and processing will terminate. + +C<auto_version> will be enabled if the calling program explicitly +specified a version number higher than 2.32 in the C<use> or +C<require> statement. + +=item auto_help (default:disabled) + +Automatically provide support for the B<--help> and B<-?> options if +the application did not specify a handler for this option itself. + +Getopt::Long will provide a help message using module L<Pod::Usage>. The +message, derived from the SYNOPSIS POD section, will be written to +standard output and processing will terminate. + +C<auto_help> will be enabled if the calling program explicitly +specified a version number higher than 2.32 in the C<use> or +C<require> statement. + +=item pass_through (default: disabled) + +Options that are unknown, ambiguous or supplied with an invalid option +value are passed through in C<@ARGV> instead of being flagged as +errors. This makes it possible to write wrapper scripts that process +only part of the user supplied command line arguments, and pass the +remaining options to some other program. + +If C<require_order> is enabled, options processing will terminate at +the first unrecognized option, or non-option, whichever comes first. +However, if C<permute> is enabled instead, results can become confusing. + +Note that the options terminator (default C<-->), if present, will +also be passed through in C<@ARGV>. + +=item prefix + +The string that starts options. If a constant string is not +sufficient, see C<prefix_pattern>. + +=item prefix_pattern + +A Perl pattern that identifies the strings that introduce options. +Default is C<--|-|\+> unless environment variable +POSIXLY_CORRECT has been set, in which case it is C<--|->. + +=item long_prefix_pattern + +A Perl pattern that allows the disambiguation of long and short +prefixes. Default is C<-->. + +Typically you only need to set this if you are using nonstandard +prefixes and want some or all of them to have the same semantics as +'--' does under normal circumstances. + +For example, setting prefix_pattern to C<--|-|\+|\/> and +long_prefix_pattern to C<--|\/> would add Win32 style argument +handling. + +=item debug (default: disabled) + +Enable debugging output. + +=back + +=head1 Exportable Methods + +=over + +=item VersionMessage + +This subroutine provides a standard version message. Its argument can be: + +=over 4 + +=item * + +A string containing the text of a message to print I<before> printing +the standard message. + +=item * + +A numeric value corresponding to the desired exit status. + +=item * + +A reference to a hash. + +=back + +If more than one argument is given then the entire argument list is +assumed to be a hash. If a hash is supplied (either as a reference or +as a list) it should contain one or more elements with the following +keys: + +=over 4 + +=item C<-message> + +=item C<-msg> + +The text of a message to print immediately prior to printing the +program's usage message. + +=item C<-exitval> + +The desired exit status to pass to the B<exit()> function. +This should be an integer, or else the string "NOEXIT" to +indicate that control should simply be returned without +terminating the invoking process. + +=item C<-output> + +A reference to a filehandle, or the pathname of a file to which the +usage message should be written. The default is C<\*STDERR> unless the +exit value is less than 2 (in which case the default is C<\*STDOUT>). + +=back + +You cannot tie this routine directly to an option, e.g.: + + GetOptions("version" => \&VersionMessage); + +Use this instead: + + GetOptions("version" => sub { VersionMessage() }); + +=item HelpMessage + +This subroutine produces a standard help message, derived from the +program's POD section SYNOPSIS using L<Pod::Usage>. It takes the same +arguments as VersionMessage(). In particular, you cannot tie it +directly to an option, e.g.: + + GetOptions("help" => \&HelpMessage); + +Use this instead: + + GetOptions("help" => sub { HelpMessage() }); + +=back + +=head1 Return values and Errors + +Configuration errors and errors in the option definitions are +signalled using die() and will terminate the calling program unless +the call to Getopt::Long::GetOptions() was embedded in C<eval { ... +}>, or die() was trapped using C<$SIG{__DIE__}>. + +GetOptions returns true to indicate success. +It returns false when the function detected one or more errors during +option parsing. These errors are signalled using warn() and can be +trapped with C<$SIG{__WARN__}>. + +=head1 Legacy + +The earliest development of C<newgetopt.pl> started in 1990, with Perl +version 4. As a result, its development, and the development of +Getopt::Long, has gone through several stages. Since backward +compatibility has always been extremely important, the current version +of Getopt::Long still supports a lot of constructs that nowadays are +no longer necessary or otherwise unwanted. This section describes +briefly some of these 'features'. + +=head2 Default destinations + +When no destination is specified for an option, GetOptions will store +the resultant value in a global variable named C<opt_>I<XXX>, where +I<XXX> is the primary name of this option. When a progam executes +under C<use strict> (recommended), these variables must be +pre-declared with our() or C<use vars>. + + our $opt_length = 0; + GetOptions ('length=i'); # will store in $opt_length + +To yield a usable Perl variable, characters that are not part of the +syntax for variables are translated to underscores. For example, +C<--fpp-struct-return> will set the variable +C<$opt_fpp_struct_return>. Note that this variable resides in the +namespace of the calling program, not necessarily C<main>. For +example: + + GetOptions ("size=i", "sizes=i@"); + +with command line "-size 10 -sizes 24 -sizes 48" will perform the +equivalent of the assignments + + $opt_size = 10; + @opt_sizes = (24, 48); + +=head2 Alternative option starters + +A string of alternative option starter characters may be passed as the +first argument (or the first argument after a leading hash reference +argument). + + my $len = 0; + GetOptions ('/', 'length=i' => $len); + +Now the command line may look like: + + /length 24 -- arg + +Note that to terminate options processing still requires a double dash +C<-->. + +GetOptions() will not interpret a leading C<< "<>" >> as option starters +if the next argument is a reference. To force C<< "<" >> and C<< ">" >> as +option starters, use C<< "><" >>. Confusing? Well, B<using a starter +argument is strongly deprecated> anyway. + +=head2 Configuration variables + +Previous versions of Getopt::Long used variables for the purpose of +configuring. Although manipulating these variables still work, it is +strongly encouraged to use the C<Configure> routine that was introduced +in version 2.17. Besides, it is much easier. + +=head1 Trouble Shooting + +=head2 GetOptions does not return a false result when an option is not supplied + +That's why they're called 'options'. + +=head2 GetOptions does not split the command line correctly + +The command line is not split by GetOptions, but by the command line +interpreter (CLI). On Unix, this is the shell. On Windows, it is +COMMAND.COM or CMD.EXE. Other operating systems have other CLIs. + +It is important to know that these CLIs may behave different when the +command line contains special characters, in particular quotes or +backslashes. For example, with Unix shells you can use single quotes +(C<'>) and double quotes (C<">) to group words together. The following +alternatives are equivalent on Unix: + + "two words" + 'two words' + two\ words + +In case of doubt, insert the following statement in front of your Perl +program: + + print STDERR (join("|",@ARGV),"\n"); + +to verify how your CLI passes the arguments to the program. + +=head2 Undefined subroutine &main::GetOptions called + +Are you running Windows, and did you write + + use GetOpt::Long; + +(note the capital 'O')? + +=head2 How do I put a "-?" option into a Getopt::Long? + +You can only obtain this using an alias, and Getopt::Long of at least +version 2.13. + + use Getopt::Long; + GetOptions ("help|?"); # -help and -? will both set $opt_help + +=head1 AUTHOR + +Johan Vromans <jvromans@squirrel.nl> + +=head1 COPYRIGHT AND DISCLAIMER + +This program is Copyright 1990,2005 by Johan Vromans. +This program is free software; you can redistribute it and/or +modify it under the terms of the Perl Artistic License or 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. + +If you do not have a copy of the GNU General Public License write to +the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, +MA 02139, USA. + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Getopt/Std.pm b/Master/tlpkg/tlperl.old/lib/Getopt/Std.pm new file mode 100644 index 00000000000..99f93590622 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Getopt/Std.pm @@ -0,0 +1,294 @@ +package Getopt::Std; +require 5.000; +require Exporter; + +=head1 NAME + +getopt, getopts - Process single-character switches with switch clustering + +=head1 SYNOPSIS + + use Getopt::Std; + + getopt('oDI'); # -o, -D & -I take arg. Sets $opt_* as a side effect. + getopt('oDI', \%opts); # -o, -D & -I take arg. Values in %opts + getopts('oif:'); # -o & -i are boolean flags, -f takes an argument + # Sets $opt_* as a side effect. + getopts('oif:', \%opts); # options as above. Values in %opts + +=head1 DESCRIPTION + +The getopt() function processes single-character switches with switch +clustering. Pass one argument which is a string containing all switches +that take an argument. For each switch found, sets $opt_x (where x is the +switch name) to the value of the argument if an argument is expected, +or 1 otherwise. Switches which take an argument don't care whether +there is a space between the switch and the argument. + +The getopts() function is similar, but you should pass to it the list of all +switches to be recognized. If unspecified switches are found on the +command-line, the user will be warned that an unknown option was given. + +Note that, if your code is running under the recommended C<use strict +'vars'> pragma, you will need to declare these package variables +with "our": + + our($opt_x, $opt_y); + +For those of you who don't like additional global variables being created, getopt() +and getopts() will also accept a hash reference as an optional second argument. +Hash keys will be x (where x is the switch name) with key values the value of +the argument or 1 if no argument is specified. + +To allow programs to process arguments that look like switches, but aren't, +both functions will stop processing switches when they see the argument +C<-->. The C<--> will be removed from @ARGV. + +=head1 C<--help> and C<--version> + +If C<-> is not a recognized switch letter, getopts() supports arguments +C<--help> and C<--version>. If C<main::HELP_MESSAGE()> and/or +C<main::VERSION_MESSAGE()> are defined, they are called; the arguments are +the output file handle, the name of option-processing package, its version, +and the switches string. If the subroutines are not defined, an attempt is +made to generate intelligent messages; for best results, define $main::VERSION. + +If embedded documentation (in pod format, see L<perlpod>) is detected +in the script, C<--help> will also show how to access the documentation. + +Note that due to excessive paranoia, if $Getopt::Std::STANDARD_HELP_VERSION +isn't true (the default is false), then the messages are printed on STDERR, +and the processing continues after the messages are printed. This being +the opposite of the standard-conforming behaviour, it is strongly recommended +to set $Getopt::Std::STANDARD_HELP_VERSION to true. + +One can change the output file handle of the messages by setting +$Getopt::Std::OUTPUT_HELP_VERSION. One can print the messages of C<--help> +(without the C<Usage:> line) and C<--version> by calling functions help_mess() +and version_mess() with the switches string as an argument. + +=cut + +@ISA = qw(Exporter); +@EXPORT = qw(getopt getopts); +$VERSION = '1.05'; +# uncomment the next line to disable 1.03-backward compatibility paranoia +# $STANDARD_HELP_VERSION = 1; + +# Process single-character switches with switch clustering. Pass one argument +# which is a string containing all switches that take an argument. For each +# switch found, sets $opt_x (where x is the switch name) to the value of the +# argument, or 1 if no argument. Switches which take an argument don't care +# whether there is a space between the switch and the argument. + +# Usage: +# getopt('oDI'); # -o, -D & -I take arg. Sets opt_* as a side effect. + +sub getopt (;$$) { + my ($argumentative, $hash) = @_; + $argumentative = '' if !defined $argumentative; + my ($first,$rest); + local $_; + local @EXPORT; + + while (@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/) { + ($first,$rest) = ($1,$2); + if (/^--$/) { # early exit if -- + shift @ARGV; + last; + } + if (index($argumentative,$first) >= 0) { + if ($rest ne '') { + shift(@ARGV); + } + else { + shift(@ARGV); + $rest = shift(@ARGV); + } + if (ref $hash) { + $$hash{$first} = $rest; + } + else { + ${"opt_$first"} = $rest; + push( @EXPORT, "\$opt_$first" ); + } + } + else { + if (ref $hash) { + $$hash{$first} = 1; + } + else { + ${"opt_$first"} = 1; + push( @EXPORT, "\$opt_$first" ); + } + if ($rest ne '') { + $ARGV[0] = "-$rest"; + } + else { + shift(@ARGV); + } + } + } + unless (ref $hash) { + local $Exporter::ExportLevel = 1; + import Getopt::Std; + } +} + +sub output_h () { + return $OUTPUT_HELP_VERSION if defined $OUTPUT_HELP_VERSION; + return \*STDOUT if $STANDARD_HELP_VERSION; + return \*STDERR; +} + +sub try_exit () { + exit 0 if $STANDARD_HELP_VERSION; + my $p = __PACKAGE__; + print {output_h()} <<EOM; + [Now continuing due to backward compatibility and excessive paranoia. + See ``perldoc $p'' about \$$p\::STANDARD_HELP_VERSION.] +EOM +} + +sub version_mess ($;$) { + my $args = shift; + my $h = output_h; + if (@_ and defined &main::VERSION_MESSAGE) { + main::VERSION_MESSAGE($h, __PACKAGE__, $VERSION, $args); + } else { + my $v = $main::VERSION; + $v = '[unknown]' unless defined $v; + my $myv = $VERSION; + $myv .= ' [paranoid]' unless $STANDARD_HELP_VERSION; + my $perlv = $]; + $perlv = sprintf "%vd", $^V if $] >= 5.006; + print $h <<EOH; +$0 version $v calling Getopt::Std::getopts (version $myv), +running under Perl version $perlv. +EOH + } +} + +sub help_mess ($;$) { + my $args = shift; + my $h = output_h; + if (@_ and defined &main::HELP_MESSAGE) { + main::HELP_MESSAGE($h, __PACKAGE__, $VERSION, $args); + } else { + my (@witharg) = ($args =~ /(\S)\s*:/g); + my (@rest) = ($args =~ /([^\s:])(?!\s*:)/g); + my ($help, $arg) = ('', ''); + if (@witharg) { + $help .= "\n\tWith arguments: -" . join " -", @witharg; + $arg = "\nSpace is not required between options and their arguments."; + } + if (@rest) { + $help .= "\n\tBoolean (without arguments): -" . join " -", @rest; + } + my ($scr) = ($0 =~ m,([^/\\]+)$,); + print $h <<EOH if @_; # Let the script override this + +Usage: $scr [-OPTIONS [-MORE_OPTIONS]] [--] [PROGRAM_ARG1 ...] +EOH + print $h <<EOH; + +The following single-character options are accepted:$help + +Options may be merged together. -- stops processing of options.$arg +EOH + my $has_pod; + if ( defined $0 and $0 ne '-e' and -f $0 and -r $0 + and open my $script, '<', $0 ) { + while (<$script>) { + $has_pod = 1, last if /^=(pod|head1)/; + } + } + print $h <<EOH if $has_pod; + +For more details run + perldoc -F $0 +EOH + } +} + +# Usage: +# getopts('a:bc'); # -a takes arg. -b & -c not. Sets opt_* as a +# # side effect. + +sub getopts ($;$) { + my ($argumentative, $hash) = @_; + my (@args,$first,$rest,$exit); + my $errs = 0; + local $_; + local @EXPORT; + + @args = split( / */, $argumentative ); + while(@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/s) { + ($first,$rest) = ($1,$2); + if (/^--$/) { # early exit if -- + shift @ARGV; + last; + } + my $pos = index($argumentative,$first); + if ($pos >= 0) { + if (defined($args[$pos+1]) and ($args[$pos+1] eq ':')) { + shift(@ARGV); + if ($rest eq '') { + ++$errs unless @ARGV; + $rest = shift(@ARGV); + } + if (ref $hash) { + $$hash{$first} = $rest; + } + else { + ${"opt_$first"} = $rest; + push( @EXPORT, "\$opt_$first" ); + } + } + else { + if (ref $hash) { + $$hash{$first} = 1; + } + else { + ${"opt_$first"} = 1; + push( @EXPORT, "\$opt_$first" ); + } + if ($rest eq '') { + shift(@ARGV); + } + else { + $ARGV[0] = "-$rest"; + } + } + } + else { + if ($first eq '-' and $rest eq 'help') { + version_mess($argumentative, 'main'); + help_mess($argumentative, 'main'); + try_exit(); + shift(@ARGV); + next; + } elsif ($first eq '-' and $rest eq 'version') { + version_mess($argumentative, 'main'); + try_exit(); + shift(@ARGV); + next; + } + warn "Unknown option: $first\n"; + ++$errs; + if ($rest ne '') { + $ARGV[0] = "-$rest"; + } + else { + shift(@ARGV); + } + } + } + unless (ref $hash) { + local $Exporter::ExportLevel = 1; + import Getopt::Std; + } + $errs == 0; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/IO.pm b/Master/tlpkg/tlperl.old/lib/IO.pm new file mode 100644 index 00000000000..9fccc3a7356 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/IO.pm @@ -0,0 +1,68 @@ +# + +package IO; + +use XSLoader (); +use Carp; +use strict; +use warnings; + +our $VERSION = "1.22"; +XSLoader::load 'IO', $VERSION; + +sub import { + shift; + + warnings::warnif('deprecated', qq{Parameterless "use IO" deprecated}) + if @_ == 0 ; + + my @l = @_ ? @_ : qw(Handle Seekable File Pipe Socket Dir); + + eval join("", map { "require IO::" . (/(\w+)/)[0] . ";\n" } @l) + or croak $@; +} + +1; + +__END__ + +=head1 NAME + +IO - load various IO modules + +=head1 SYNOPSIS + + use IO qw(Handle File); # loads IO modules, here IO::Handle, IO::File + use IO; # DEPRECATED + +=head1 DESCRIPTION + +C<IO> provides a simple mechanism to load several of the IO modules +in one go. The IO modules belonging to the core are: + + IO::Handle + IO::Seekable + IO::File + IO::Pipe + IO::Socket + IO::Dir + IO::Select + IO::Poll + +Some other IO modules don't belong to the perl core but can be loaded +as well if they have been installed from CPAN. You can discover which +ones exist by searching for "^IO::" on http://search.cpan.org. + +For more information on any of these modules, please see its respective +documentation. + +=head1 DEPRECATED + + use IO; # loads all the modules listed below + +The loaded modules are IO::Handle, IO::Seekable, IO::File, IO::Pipe, +IO::Socket, IO::Dir. You should instead explicitly import the IO +modules you want. + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/IO/Dir.pm b/Master/tlpkg/tlperl.old/lib/IO/Dir.pm new file mode 100644 index 00000000000..fccd02c088a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/IO/Dir.pm @@ -0,0 +1,246 @@ +# IO::Dir.pm +# +# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package IO::Dir; + +use 5.006; + +use strict; +use Carp; +use Symbol; +use Exporter; +use IO::File; +our(@ISA, $VERSION, @EXPORT_OK); +use Tie::Hash; +use File::stat; +use File::Spec; + +@ISA = qw(Tie::Hash Exporter); +$VERSION = "1.05"; +$VERSION = eval $VERSION; +@EXPORT_OK = qw(DIR_UNLINK); + +sub DIR_UNLINK () { 1 } + +sub new { + @_ >= 1 && @_ <= 2 or croak 'usage: new IO::Dir [DIRNAME]'; + my $class = shift; + my $dh = gensym; + if (@_) { + IO::Dir::open($dh, $_[0]) + or return undef; + } + bless $dh, $class; +} + +sub DESTROY { + my ($dh) = @_; + closedir($dh); +} + +sub open { + @_ == 2 or croak 'usage: $dh->open(DIRNAME)'; + my ($dh, $dirname) = @_; + return undef + unless opendir($dh, $dirname); + # a dir name should always have a ":" in it; assume dirname is + # in current directory + $dirname = ':' . $dirname if ( ($^O eq 'MacOS') && ($dirname !~ /:/) ); + ${*$dh}{io_dir_path} = $dirname; + 1; +} + +sub close { + @_ == 1 or croak 'usage: $dh->close()'; + my ($dh) = @_; + closedir($dh); +} + +sub read { + @_ == 1 or croak 'usage: $dh->read()'; + my ($dh) = @_; + readdir($dh); +} + +sub seek { + @_ == 2 or croak 'usage: $dh->seek(POS)'; + my ($dh,$pos) = @_; + seekdir($dh,$pos); +} + +sub tell { + @_ == 1 or croak 'usage: $dh->tell()'; + my ($dh) = @_; + telldir($dh); +} + +sub rewind { + @_ == 1 or croak 'usage: $dh->rewind()'; + my ($dh) = @_; + rewinddir($dh); +} + +sub TIEHASH { + my($class,$dir,$options) = @_; + + my $dh = $class->new($dir) + or return undef; + + $options ||= 0; + + ${*$dh}{io_dir_unlink} = $options & DIR_UNLINK; + $dh; +} + +sub FIRSTKEY { + my($dh) = @_; + $dh->rewind; + scalar $dh->read; +} + +sub NEXTKEY { + my($dh) = @_; + scalar $dh->read; +} + +sub EXISTS { + my($dh,$key) = @_; + -e File::Spec->catfile(${*$dh}{io_dir_path}, $key); +} + +sub FETCH { + my($dh,$key) = @_; + &lstat(File::Spec->catfile(${*$dh}{io_dir_path}, $key)); +} + +sub STORE { + my($dh,$key,$data) = @_; + my($atime,$mtime) = ref($data) ? @$data : ($data,$data); + my $file = File::Spec->catfile(${*$dh}{io_dir_path}, $key); + unless(-e $file) { + my $io = IO::File->new($file,O_CREAT | O_RDWR); + $io->close if $io; + } + utime($atime,$mtime, $file); +} + +sub DELETE { + my($dh,$key) = @_; + + # Only unlink if unlink-ing is enabled + return 0 + unless ${*$dh}{io_dir_unlink}; + + my $file = File::Spec->catfile(${*$dh}{io_dir_path}, $key); + + -d $file + ? rmdir($file) + : unlink($file); +} + +1; + +__END__ + +=head1 NAME + +IO::Dir - supply object methods for directory handles + +=head1 SYNOPSIS + + use IO::Dir; + $d = IO::Dir->new("."); + if (defined $d) { + while (defined($_ = $d->read)) { something($_); } + $d->rewind; + while (defined($_ = $d->read)) { something_else($_); } + undef $d; + } + + tie %dir, 'IO::Dir', "."; + foreach (keys %dir) { + print $_, " " , $dir{$_}->size,"\n"; + } + +=head1 DESCRIPTION + +The C<IO::Dir> package provides two interfaces to perl's directory reading +routines. + +The first interface is an object approach. C<IO::Dir> provides an object +constructor and methods, which are just wrappers around perl's built in +directory reading routines. + +=over 4 + +=item new ( [ DIRNAME ] ) + +C<new> is the constructor for C<IO::Dir> objects. It accepts one optional +argument which, if given, C<new> will pass to C<open> + +=back + +The following methods are wrappers for the directory related functions built +into perl (the trailing `dir' has been removed from the names). See L<perlfunc> +for details of these functions. + +=over 4 + +=item open ( DIRNAME ) + +=item read () + +=item seek ( POS ) + +=item tell () + +=item rewind () + +=item close () + +=back + +C<IO::Dir> also provides an interface to reading directories via a tied +hash. The tied hash extends the interface beyond just the directory +reading routines by the use of C<lstat>, from the C<File::stat> package, +C<unlink>, C<rmdir> and C<utime>. + +=over 4 + +=item tie %hash, 'IO::Dir', DIRNAME [, OPTIONS ] + +=back + +The keys of the hash will be the names of the entries in the directory. +Reading a value from the hash will be the result of calling +C<File::stat::lstat>. Deleting an element from the hash will +delete the corresponding file or subdirectory, +provided that C<DIR_UNLINK> is included in the C<OPTIONS>. + +Assigning to an entry in the hash will cause the time stamps of the file +to be modified. If the file does not exist then it will be created. Assigning +a single integer to a hash element will cause both the access and +modification times to be changed to that value. Alternatively a reference to +an array of two values can be passed. The first array element will be used to +set the access time and the second element will be used to set the modification +time. + +=head1 SEE ALSO + +L<File::stat> + +=head1 AUTHOR + +Graham Barr. Currently maintained by the Perl Porters. Please report all +bugs to <perl5-porters@perl.org>. + +=head1 COPYRIGHT + +Copyright (c) 1997-2003 Graham Barr <gbarr@pobox.com>. All rights reserved. +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/IO/File.pm b/Master/tlpkg/tlperl.old/lib/IO/File.pm new file mode 100644 index 00000000000..e7cdbbed6d7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/IO/File.pm @@ -0,0 +1,208 @@ +# + +package IO::File; + +=head1 NAME + +IO::File - supply object methods for filehandles + +=head1 SYNOPSIS + + use IO::File; + + $fh = new IO::File; + if ($fh->open("< file")) { + print <$fh>; + $fh->close; + } + + $fh = new IO::File "> file"; + if (defined $fh) { + print $fh "bar\n"; + $fh->close; + } + + $fh = new IO::File "file", "r"; + if (defined $fh) { + print <$fh>; + undef $fh; # automatically closes the file + } + + $fh = new IO::File "file", O_WRONLY|O_APPEND; + if (defined $fh) { + print $fh "corge\n"; + + $pos = $fh->getpos; + $fh->setpos($pos); + + undef $fh; # automatically closes the file + } + + autoflush STDOUT 1; + +=head1 DESCRIPTION + +C<IO::File> inherits from C<IO::Handle> and C<IO::Seekable>. It extends +these classes with methods that are specific to file handles. + +=head1 CONSTRUCTOR + +=over 4 + +=item new ( FILENAME [,MODE [,PERMS]] ) + +Creates an C<IO::File>. If it receives any parameters, they are passed to +the method C<open>; if the open fails, the object is destroyed. Otherwise, +it is returned to the caller. + +=item new_tmpfile + +Creates an C<IO::File> opened for read/write on a newly created temporary +file. On systems where this is possible, the temporary file is anonymous +(i.e. it is unlinked after creation, but held open). If the temporary +file cannot be created or opened, the C<IO::File> object is destroyed. +Otherwise, it is returned to the caller. + +=back + +=head1 METHODS + +=over 4 + +=item open( FILENAME [,MODE [,PERMS]] ) + +=item open( FILENAME, IOLAYERS ) + +C<open> accepts one, two or three parameters. With one parameter, +it is just a front end for the built-in C<open> function. With two or three +parameters, the first parameter is a filename that may include +whitespace or other special characters, and the second parameter is +the open mode, optionally followed by a file permission value. + +If C<IO::File::open> receives a Perl mode string ("E<gt>", "+E<lt>", etc.) +or an ANSI C fopen() mode string ("w", "r+", etc.), it uses the basic +Perl C<open> operator (but protects any special characters). + +If C<IO::File::open> is given a numeric mode, it passes that mode +and the optional permissions value to the Perl C<sysopen> operator. +The permissions default to 0666. + +If C<IO::File::open> is given a mode that includes the C<:> character, +it passes all the three arguments to the three-argument C<open> operator. + +For convenience, C<IO::File> exports the O_XXX constants from the +Fcntl module, if this module is available. + +=item binmode( [LAYER] ) + +C<binmode> sets C<binmode> on the underlying C<IO> object, as documented +in C<perldoc -f binmode>. + +C<binmode> accepts one optional parameter, which is the layer to be +passed on to the C<binmode> call. + +=back + +=head1 NOTE + +Some operating systems may perform C<IO::File::new()> or C<IO::File::open()> +on a directory without errors. This behavior is not portable and not +suggested for use. Using C<opendir()> and C<readdir()> or C<IO::Dir> are +suggested instead. + +=head1 SEE ALSO + +L<perlfunc>, +L<perlop/"I/O Operators">, +L<IO::Handle>, +L<IO::Seekable>, +L<IO::Dir> + +=head1 HISTORY + +Derived from FileHandle.pm by Graham Barr E<lt>F<gbarr@pobox.com>E<gt>. + +=cut + +use 5.006_001; +use strict; +our($VERSION, @EXPORT, @EXPORT_OK, @ISA); +use Carp; +use Symbol; +use SelectSaver; +use IO::Seekable; +use File::Spec; + +require Exporter; + +@ISA = qw(IO::Handle IO::Seekable Exporter); + +$VERSION = "1.13"; + +@EXPORT = @IO::Seekable::EXPORT; + +eval { + # Make all Fcntl O_XXX constants available for importing + require Fcntl; + my @O = grep /^O_/, @Fcntl::EXPORT; + Fcntl->import(@O); # first we import what we want to export + push(@EXPORT, @O); +}; + +################################################ +## Constructor +## + +sub new { + my $type = shift; + my $class = ref($type) || $type || "IO::File"; + @_ >= 0 && @_ <= 3 + or croak "usage: new $class [FILENAME [,MODE [,PERMS]]]"; + my $fh = $class->SUPER::new(); + if (@_) { + $fh->open(@_) + or return undef; + } + $fh; +} + +################################################ +## Open +## + +sub open { + @_ >= 2 && @_ <= 4 or croak 'usage: $fh->open(FILENAME [,MODE [,PERMS]])'; + my ($fh, $file) = @_; + if (@_ > 2) { + my ($mode, $perms) = @_[2, 3]; + if ($mode =~ /^\d+$/) { + defined $perms or $perms = 0666; + return sysopen($fh, $file, $mode, $perms); + } elsif ($mode =~ /:/) { + return open($fh, $mode, $file) if @_ == 3; + croak 'usage: $fh->open(FILENAME, IOLAYERS)'; + } + if (defined($file) && length($file) + && ! File::Spec->file_name_is_absolute($file)) + { + $file = File::Spec->rel2abs($file); + } + $file = IO::Handle::_open_mode_string($mode) . " $file\0"; + } + open($fh, $file); +} + +################################################ +## Binmode +## + +sub binmode { + ( @_ == 1 or @_ == 2 ) or croak 'usage $fh->binmode([LAYER])'; + + my($fh, $layer) = @_; + + return binmode $$fh unless $layer; + return binmode $$fh, $layer; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/IO/Handle.pm b/Master/tlpkg/tlperl.old/lib/IO/Handle.pm new file mode 100644 index 00000000000..329d26ad198 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/IO/Handle.pm @@ -0,0 +1,625 @@ +package IO::Handle; + +=head1 NAME + +IO::Handle - supply object methods for I/O handles + +=head1 SYNOPSIS + + use IO::Handle; + + $io = new IO::Handle; + if ($io->fdopen(fileno(STDIN),"r")) { + print $io->getline; + $io->close; + } + + $io = new IO::Handle; + if ($io->fdopen(fileno(STDOUT),"w")) { + $io->print("Some text\n"); + } + + # setvbuf is not available by default on Perls 5.8.0 and later. + use IO::Handle '_IOLBF'; + $io->setvbuf($buffer_var, _IOLBF, 1024); + + undef $io; # automatically closes the file if it's open + + autoflush STDOUT 1; + +=head1 DESCRIPTION + +C<IO::Handle> is the base class for all other IO handle classes. It is +not intended that objects of C<IO::Handle> would be created directly, +but instead C<IO::Handle> is inherited from by several other classes +in the IO hierarchy. + +If you are reading this documentation, looking for a replacement for +the C<FileHandle> package, then I suggest you read the documentation +for C<IO::File> too. + +=head1 CONSTRUCTOR + +=over 4 + +=item new () + +Creates a new C<IO::Handle> object. + +=item new_from_fd ( FD, MODE ) + +Creates an C<IO::Handle> like C<new> does. +It requires two parameters, which are passed to the method C<fdopen>; +if the fdopen fails, the object is destroyed. Otherwise, it is returned +to the caller. + +=back + +=head1 METHODS + +See L<perlfunc> for complete descriptions of each of the following +supported C<IO::Handle> methods, which are just front ends for the +corresponding built-in functions: + + $io->close + $io->eof + $io->fileno + $io->format_write( [FORMAT_NAME] ) + $io->getc + $io->read ( BUF, LEN, [OFFSET] ) + $io->print ( ARGS ) + $io->printf ( FMT, [ARGS] ) + $io->stat + $io->sysread ( BUF, LEN, [OFFSET] ) + $io->syswrite ( BUF, [LEN, [OFFSET]] ) + $io->truncate ( LEN ) + +See L<perlvar> for complete descriptions of each of the following +supported C<IO::Handle> methods. All of them return the previous +value of the attribute and takes an optional single argument that when +given will set the value. If no argument is given the previous value +is unchanged (except for $io->autoflush will actually turn ON +autoflush by default). + + $io->autoflush ( [BOOL] ) $| + $io->format_page_number( [NUM] ) $% + $io->format_lines_per_page( [NUM] ) $= + $io->format_lines_left( [NUM] ) $- + $io->format_name( [STR] ) $~ + $io->format_top_name( [STR] ) $^ + $io->input_line_number( [NUM]) $. + +The following methods are not supported on a per-filehandle basis. + + IO::Handle->format_line_break_characters( [STR] ) $: + IO::Handle->format_formfeed( [STR]) $^L + IO::Handle->output_field_separator( [STR] ) $, + IO::Handle->output_record_separator( [STR] ) $\ + + IO::Handle->input_record_separator( [STR] ) $/ + +Furthermore, for doing normal I/O you might need these: + +=over 4 + +=item $io->fdopen ( FD, MODE ) + +C<fdopen> is like an ordinary C<open> except that its first parameter +is not a filename but rather a file handle name, an IO::Handle object, +or a file descriptor number. + +=item $io->opened + +Returns true if the object is currently a valid file descriptor, false +otherwise. + +=item $io->getline + +This works like <$io> described in L<perlop/"I/O Operators"> +except that it's more readable and can be safely called in a +list context but still returns just one line. If used as the conditional ++within a C<while> or C-style C<for> loop, however, you will need to ++emulate the functionality of <$io> with C<< defined($_ = $io->getline) >>. + +=item $io->getlines + +This works like <$io> when called in a list context to read all +the remaining lines in a file, except that it's more readable. +It will also croak() if accidentally called in a scalar context. + +=item $io->ungetc ( ORD ) + +Pushes a character with the given ordinal value back onto the given +handle's input stream. Only one character of pushback per handle is +guaranteed. + +=item $io->write ( BUF, LEN [, OFFSET ] ) + +This C<write> is like C<write> found in C, that is it is the +opposite of read. The wrapper for the perl C<write> function is +called C<format_write>. + +=item $io->error + +Returns a true value if the given handle has experienced any errors +since it was opened or since the last call to C<clearerr>, or if the +handle is invalid. It only returns false for a valid handle with no +outstanding errors. + +=item $io->clearerr + +Clear the given handle's error indicator. Returns -1 if the handle is +invalid, 0 otherwise. + +=item $io->sync + +C<sync> synchronizes a file's in-memory state with that on the +physical medium. C<sync> does not operate at the perlio api level, but +operates on the file descriptor (similar to sysread, sysseek and +systell). This means that any data held at the perlio api level will not +be synchronized. To synchronize data that is buffered at the perlio api +level you must use the flush method. C<sync> is not implemented on all +platforms. Returns "0 but true" on success, C<undef> on error, C<undef> +for an invalid handle. See L<fsync(3c)>. + +=item $io->flush + +C<flush> causes perl to flush any buffered data at the perlio api level. +Any unread data in the buffer will be discarded, and any unwritten data +will be written to the underlying file descriptor. Returns "0 but true" +on success, C<undef> on error. + +=item $io->printflush ( ARGS ) + +Turns on autoflush, print ARGS and then restores the autoflush status of the +C<IO::Handle> object. Returns the return value from print. + +=item $io->blocking ( [ BOOL ] ) + +If called with an argument C<blocking> will turn on non-blocking IO if +C<BOOL> is false, and turn it off if C<BOOL> is true. + +C<blocking> will return the value of the previous setting, or the +current setting if C<BOOL> is not given. + +If an error occurs C<blocking> will return undef and C<$!> will be set. + +=back + + +If the C functions setbuf() and/or setvbuf() are available, then +C<IO::Handle::setbuf> and C<IO::Handle::setvbuf> set the buffering +policy for an IO::Handle. The calling sequences for the Perl functions +are the same as their C counterparts--including the constants C<_IOFBF>, +C<_IOLBF>, and C<_IONBF> for setvbuf()--except that the buffer parameter +specifies a scalar variable to use as a buffer. You should only +change the buffer before any I/O, or immediately after calling flush. + +WARNING: The IO::Handle::setvbuf() is not available by default on +Perls 5.8.0 and later because setvbuf() is rather specific to using +the stdio library, while Perl prefers the new perlio subsystem instead. + +WARNING: A variable used as a buffer by C<setbuf> or C<setvbuf> B<must not +be modified> in any way until the IO::Handle is closed or C<setbuf> or +C<setvbuf> is called again, or memory corruption may result! Remember that +the order of global destruction is undefined, so even if your buffer +variable remains in scope until program termination, it may be undefined +before the file IO::Handle is closed. Note that you need to import the +constants C<_IOFBF>, C<_IOLBF>, and C<_IONBF> explicitly. Like C, setbuf +returns nothing. setvbuf returns "0 but true", on success, C<undef> on +failure. + +Lastly, there is a special method for working under B<-T> and setuid/gid +scripts: + +=over 4 + +=item $io->untaint + +Marks the object as taint-clean, and as such data read from it will also +be considered taint-clean. Note that this is a very trusting action to +take, and appropriate consideration for the data source and potential +vulnerability should be kept in mind. Returns 0 on success, -1 if setting +the taint-clean flag failed. (eg invalid handle) + +=back + +=head1 NOTE + +An C<IO::Handle> object is a reference to a symbol/GLOB reference (see +the C<Symbol> package). Some modules that +inherit from C<IO::Handle> may want to keep object related variables +in the hash table part of the GLOB. In an attempt to prevent modules +trampling on each other I propose the that any such module should prefix +its variables with its own name separated by _'s. For example the IO::Socket +module keeps a C<timeout> variable in 'io_socket_timeout'. + +=head1 SEE ALSO + +L<perlfunc>, +L<perlop/"I/O Operators">, +L<IO::File> + +=head1 BUGS + +Due to backwards compatibility, all filehandles resemble objects +of class C<IO::Handle>, or actually classes derived from that class. +They actually aren't. Which means you can't derive your own +class from C<IO::Handle> and inherit those methods. + +=head1 HISTORY + +Derived from FileHandle.pm by Graham Barr E<lt>F<gbarr@pobox.com>E<gt> + +=cut + +use 5.006_001; +use strict; +our($VERSION, @EXPORT_OK, @ISA); +use Carp; +use Symbol; +use SelectSaver; +use IO (); # Load the XS module + +require Exporter; +@ISA = qw(Exporter); + +$VERSION = "1.25"; +$VERSION = eval $VERSION; + +@EXPORT_OK = qw( + autoflush + output_field_separator + output_record_separator + input_record_separator + input_line_number + format_page_number + format_lines_per_page + format_lines_left + format_name + format_top_name + format_line_break_characters + format_formfeed + format_write + + print + printf + getline + getlines + + printflush + flush + + SEEK_SET + SEEK_CUR + SEEK_END + _IOFBF + _IOLBF + _IONBF +); + +################################################ +## Constructors, destructors. +## + +sub new { + my $class = ref($_[0]) || $_[0] || "IO::Handle"; + @_ == 1 or croak "usage: new $class"; + my $io = gensym; + bless $io, $class; +} + +sub new_from_fd { + my $class = ref($_[0]) || $_[0] || "IO::Handle"; + @_ == 3 or croak "usage: new_from_fd $class FD, MODE"; + my $io = gensym; + shift; + IO::Handle::fdopen($io, @_) + or return undef; + bless $io, $class; +} + +# +# There is no need for DESTROY to do anything, because when the +# last reference to an IO object is gone, Perl automatically +# closes its associated files (if any). However, to avoid any +# attempts to autoload DESTROY, we here define it to do nothing. +# +sub DESTROY {} + + +################################################ +## Open and close. +## + +sub _open_mode_string { + my ($mode) = @_; + $mode =~ /^\+?(<|>>?)$/ + or $mode =~ s/^r(\+?)$/$1</ + or $mode =~ s/^w(\+?)$/$1>/ + or $mode =~ s/^a(\+?)$/$1>>/ + or croak "IO::Handle: bad open mode: $mode"; + $mode; +} + +sub fdopen { + @_ == 3 or croak 'usage: $io->fdopen(FD, MODE)'; + my ($io, $fd, $mode) = @_; + local(*GLOB); + + if (ref($fd) && "".$fd =~ /GLOB\(/o) { + # It's a glob reference; Alias it as we cannot get name of anon GLOBs + my $n = qualify(*GLOB); + *GLOB = *{*$fd}; + $fd = $n; + } elsif ($fd =~ m#^\d+$#) { + # It's an FD number; prefix with "=". + $fd = "=$fd"; + } + + open($io, _open_mode_string($mode) . '&' . $fd) + ? $io : undef; +} + +sub close { + @_ == 1 or croak 'usage: $io->close()'; + my($io) = @_; + + close($io); +} + +################################################ +## Normal I/O functions. +## + +# flock +# select + +sub opened { + @_ == 1 or croak 'usage: $io->opened()'; + defined fileno($_[0]); +} + +sub fileno { + @_ == 1 or croak 'usage: $io->fileno()'; + fileno($_[0]); +} + +sub getc { + @_ == 1 or croak 'usage: $io->getc()'; + getc($_[0]); +} + +sub eof { + @_ == 1 or croak 'usage: $io->eof()'; + eof($_[0]); +} + +sub print { + @_ or croak 'usage: $io->print(ARGS)'; + my $this = shift; + print $this @_; +} + +sub printf { + @_ >= 2 or croak 'usage: $io->printf(FMT,[ARGS])'; + my $this = shift; + printf $this @_; +} + +sub getline { + @_ == 1 or croak 'usage: $io->getline()'; + my $this = shift; + return scalar <$this>; +} + +*gets = \&getline; # deprecated + +sub getlines { + @_ == 1 or croak 'usage: $io->getlines()'; + wantarray or + croak 'Can\'t call $io->getlines in a scalar context, use $io->getline'; + my $this = shift; + return <$this>; +} + +sub truncate { + @_ == 2 or croak 'usage: $io->truncate(LEN)'; + truncate($_[0], $_[1]); +} + +sub read { + @_ == 3 || @_ == 4 or croak 'usage: $io->read(BUF, LEN [, OFFSET])'; + read($_[0], $_[1], $_[2], $_[3] || 0); +} + +sub sysread { + @_ == 3 || @_ == 4 or croak 'usage: $io->sysread(BUF, LEN [, OFFSET])'; + sysread($_[0], $_[1], $_[2], $_[3] || 0); +} + +sub write { + @_ >= 2 && @_ <= 4 or croak 'usage: $io->write(BUF [, LEN [, OFFSET]])'; + local($\) = ""; + $_[2] = length($_[1]) unless defined $_[2]; + print { $_[0] } substr($_[1], $_[3] || 0, $_[2]); +} + +sub syswrite { + @_ >= 2 && @_ <= 4 or croak 'usage: $io->syswrite(BUF [, LEN [, OFFSET]])'; + if (defined($_[2])) { + syswrite($_[0], $_[1], $_[2], $_[3] || 0); + } else { + syswrite($_[0], $_[1]); + } +} + +sub stat { + @_ == 1 or croak 'usage: $io->stat()'; + stat($_[0]); +} + +################################################ +## State modification functions. +## + +sub autoflush { + my $old = new SelectSaver qualify($_[0], caller); + my $prev = $|; + $| = @_ > 1 ? $_[1] : 1; + $prev; +} + +sub output_field_separator { + carp "output_field_separator is not supported on a per-handle basis" + if ref($_[0]); + my $prev = $,; + $, = $_[1] if @_ > 1; + $prev; +} + +sub output_record_separator { + carp "output_record_separator is not supported on a per-handle basis" + if ref($_[0]); + my $prev = $\; + $\ = $_[1] if @_ > 1; + $prev; +} + +sub input_record_separator { + carp "input_record_separator is not supported on a per-handle basis" + if ref($_[0]); + my $prev = $/; + $/ = $_[1] if @_ > 1; + $prev; +} + +sub input_line_number { + local $.; + () = tell qualify($_[0], caller) if ref($_[0]); + my $prev = $.; + $. = $_[1] if @_ > 1; + $prev; +} + +sub format_page_number { + my $old; + $old = new SelectSaver qualify($_[0], caller) if ref($_[0]); + my $prev = $%; + $% = $_[1] if @_ > 1; + $prev; +} + +sub format_lines_per_page { + my $old; + $old = new SelectSaver qualify($_[0], caller) if ref($_[0]); + my $prev = $=; + $= = $_[1] if @_ > 1; + $prev; +} + +sub format_lines_left { + my $old; + $old = new SelectSaver qualify($_[0], caller) if ref($_[0]); + my $prev = $-; + $- = $_[1] if @_ > 1; + $prev; +} + +sub format_name { + my $old; + $old = new SelectSaver qualify($_[0], caller) if ref($_[0]); + my $prev = $~; + $~ = qualify($_[1], caller) if @_ > 1; + $prev; +} + +sub format_top_name { + my $old; + $old = new SelectSaver qualify($_[0], caller) if ref($_[0]); + my $prev = $^; + $^ = qualify($_[1], caller) if @_ > 1; + $prev; +} + +sub format_line_break_characters { + carp "format_line_break_characters is not supported on a per-handle basis" + if ref($_[0]); + my $prev = $:; + $: = $_[1] if @_ > 1; + $prev; +} + +sub format_formfeed { + carp "format_formfeed is not supported on a per-handle basis" + if ref($_[0]); + my $prev = $^L; + $^L = $_[1] if @_ > 1; + $prev; +} + +sub formline { + my $io = shift; + my $picture = shift; + local($^A) = $^A; + local($\) = ""; + formline($picture, @_); + print $io $^A; +} + +sub format_write { + @_ < 3 || croak 'usage: $io->write( [FORMAT_NAME] )'; + if (@_ == 2) { + my ($io, $fmt) = @_; + my $oldfmt = $io->format_name($fmt); + CORE::write($io); + $io->format_name($oldfmt); + } else { + CORE::write($_[0]); + } +} + +# XXX undocumented +sub fcntl { + @_ == 3 || croak 'usage: $io->fcntl( OP, VALUE );'; + my ($io, $op) = @_; + return fcntl($io, $op, $_[2]); +} + +# XXX undocumented +sub ioctl { + @_ == 3 || croak 'usage: $io->ioctl( OP, VALUE );'; + my ($io, $op) = @_; + return ioctl($io, $op, $_[2]); +} + +# this sub is for compatability with older releases of IO that used +# a sub called constant to detemine if a constant existed -- GMB +# +# The SEEK_* and _IO?BF constants were the only constants at that time +# any new code should just chech defined(&CONSTANT_NAME) + +sub constant { + no strict 'refs'; + my $name = shift; + (($name =~ /^(SEEK_(SET|CUR|END)|_IO[FLN]BF)$/) && defined &{$name}) + ? &{$name}() : undef; +} + + +# so that flush.pl can be deprecated + +sub printflush { + my $io = shift; + my $old; + $old = new SelectSaver qualify($io, caller) if ref($io); + local $| = 1; + if(ref($io)) { + print $io @_; + } + else { + print @_; + } +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/IO/Pipe.pm b/Master/tlpkg/tlperl.old/lib/IO/Pipe.pm new file mode 100644 index 00000000000..827cc48bfcd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/IO/Pipe.pm @@ -0,0 +1,257 @@ +# IO::Pipe.pm +# +# Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package IO::Pipe; + +use 5.006_001; + +use IO::Handle; +use strict; +our($VERSION); +use Carp; +use Symbol; + +$VERSION = "1.13"; + +sub new { + my $type = shift; + my $class = ref($type) || $type || "IO::Pipe"; + @_ == 0 || @_ == 2 or croak "usage: new $class [READFH, WRITEFH]"; + + my $me = bless gensym(), $class; + + my($readfh,$writefh) = @_ ? @_ : $me->handles; + + pipe($readfh, $writefh) + or return undef; + + @{*$me} = ($readfh, $writefh); + + $me; +} + +sub handles { + @_ == 1 or croak 'usage: $pipe->handles()'; + (IO::Pipe::End->new(), IO::Pipe::End->new()); +} + +my $do_spawn = $^O eq 'os2' || $^O eq 'MSWin32'; + +sub _doit { + my $me = shift; + my $rw = shift; + + my $pid = $do_spawn ? 0 : fork(); + + if($pid) { # Parent + return $pid; + } + elsif(defined $pid) { # Child or spawn + my $fh; + my $io = $rw ? \*STDIN : \*STDOUT; + my ($mode, $save) = $rw ? "r" : "w"; + if ($do_spawn) { + require Fcntl; + $save = IO::Handle->new_from_fd($io, $mode); + my $handle = shift; + # Close in child: + unless ($^O eq 'MSWin32') { + fcntl($handle, Fcntl::F_SETFD(), 1) or croak "fcntl: $!"; + } + $fh = $rw ? ${*$me}[0] : ${*$me}[1]; + } else { + shift; + $fh = $rw ? $me->reader() : $me->writer(); # close the other end + } + bless $io, "IO::Handle"; + $io->fdopen($fh, $mode); + $fh->close; + + if ($do_spawn) { + $pid = eval { system 1, @_ }; # 1 == P_NOWAIT + my $err = $!; + + $io->fdopen($save, $mode); + $save->close or croak "Cannot close $!"; + croak "IO::Pipe: Cannot spawn-NOWAIT: $err" if not $pid or $pid < 0; + return $pid; + } else { + exec @_ or + croak "IO::Pipe: Cannot exec: $!"; + } + } + else { + croak "IO::Pipe: Cannot fork: $!"; + } + + # NOT Reached +} + +sub reader { + @_ >= 1 or croak 'usage: $pipe->reader( [SUB_COMMAND_ARGS] )'; + my $me = shift; + + return undef + unless(ref($me) || ref($me = $me->new)); + + my $fh = ${*$me}[0]; + my $pid; + $pid = $me->_doit(0, $fh, @_) + if(@_); + + close ${*$me}[1]; + bless $me, ref($fh); + *$me = *$fh; # Alias self to handle + $me->fdopen($fh->fileno,"r") + unless defined($me->fileno); + bless $fh; # Really wan't un-bless here + ${*$me}{'io_pipe_pid'} = $pid + if defined $pid; + + $me; +} + +sub writer { + @_ >= 1 or croak 'usage: $pipe->writer( [SUB_COMMAND_ARGS] )'; + my $me = shift; + + return undef + unless(ref($me) || ref($me = $me->new)); + + my $fh = ${*$me}[1]; + my $pid; + $pid = $me->_doit(1, $fh, @_) + if(@_); + + close ${*$me}[0]; + bless $me, ref($fh); + *$me = *$fh; # Alias self to handle + $me->fdopen($fh->fileno,"w") + unless defined($me->fileno); + bless $fh; # Really wan't un-bless here + ${*$me}{'io_pipe_pid'} = $pid + if defined $pid; + + $me; +} + +package IO::Pipe::End; + +our(@ISA); + +@ISA = qw(IO::Handle); + +sub close { + my $fh = shift; + my $r = $fh->SUPER::close(@_); + + waitpid(${*$fh}{'io_pipe_pid'},0) + if(defined ${*$fh}{'io_pipe_pid'}); + + $r; +} + +1; + +__END__ + +=head1 NAME + +IO::Pipe - supply object methods for pipes + +=head1 SYNOPSIS + + use IO::Pipe; + + $pipe = new IO::Pipe; + + if($pid = fork()) { # Parent + $pipe->reader(); + + while(<$pipe>) { + ... + } + + } + elsif(defined $pid) { # Child + $pipe->writer(); + + print $pipe ... + } + + or + + $pipe = new IO::Pipe; + + $pipe->reader(qw(ls -l)); + + while(<$pipe>) { + ... + } + +=head1 DESCRIPTION + +C<IO::Pipe> provides an interface to creating pipes between +processes. + +=head1 CONSTRUCTOR + +=over 4 + +=item new ( [READER, WRITER] ) + +Creates an C<IO::Pipe>, which is a reference to a newly created symbol +(see the C<Symbol> package). C<IO::Pipe::new> optionally takes two +arguments, which should be objects blessed into C<IO::Handle>, or a +subclass thereof. These two objects will be used for the system call +to C<pipe>. If no arguments are given then method C<handles> is called +on the new C<IO::Pipe> object. + +These two handles are held in the array part of the GLOB until either +C<reader> or C<writer> is called. + +=back + +=head1 METHODS + +=over 4 + +=item reader ([ARGS]) + +The object is re-blessed into a sub-class of C<IO::Handle>, and becomes a +handle at the reading end of the pipe. If C<ARGS> are given then C<fork> +is called and C<ARGS> are passed to exec. + +=item writer ([ARGS]) + +The object is re-blessed into a sub-class of C<IO::Handle>, and becomes a +handle at the writing end of the pipe. If C<ARGS> are given then C<fork> +is called and C<ARGS> are passed to exec. + +=item handles () + +This method is called during construction by C<IO::Pipe::new> +on the newly created C<IO::Pipe> object. It returns an array of two objects +blessed into C<IO::Pipe::End>, or a subclass thereof. + +=back + +=head1 SEE ALSO + +L<IO::Handle> + +=head1 AUTHOR + +Graham Barr. Currently maintained by the Perl Porters. Please report all +bugs to <perl5-porters@perl.org>. + +=head1 COPYRIGHT + +Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/IO/Poll.pm b/Master/tlpkg/tlperl.old/lib/IO/Poll.pm new file mode 100644 index 00000000000..e7fb0135069 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/IO/Poll.pm @@ -0,0 +1,209 @@ + +# IO::Poll.pm +# +# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package IO::Poll; + +use strict; +use IO::Handle; +use Exporter (); +our(@ISA, @EXPORT_OK, @EXPORT, $VERSION); + +@ISA = qw(Exporter); +$VERSION = "0.07"; + +@EXPORT = qw( POLLIN + POLLOUT + POLLERR + POLLHUP + POLLNVAL + ); + +@EXPORT_OK = qw( + POLLPRI + POLLRDNORM + POLLWRNORM + POLLRDBAND + POLLWRBAND + POLLNORM + ); + +# [0] maps fd's to requested masks +# [1] maps fd's to returned masks +# [2] maps fd's to handles +sub new { + my $class = shift; + + my $self = bless [{},{},{}], $class; + + $self; +} + +sub mask { + my $self = shift; + my $io = shift; + my $fd = fileno($io); + return unless defined $fd; + if (@_) { + my $mask = shift; + if($mask) { + $self->[0]{$fd}{$io} = $mask; # the error events are always returned + $self->[1]{$fd} = 0; # output mask + $self->[2]{$io} = $io; # remember handle + } else { + delete $self->[0]{$fd}{$io}; + unless(%{$self->[0]{$fd}}) { + # We no longer have any handles for this FD + delete $self->[1]{$fd}; + delete $self->[0]{$fd}; + } + delete $self->[2]{$io}; + } + } + + return unless exists $self->[0]{$fd} and exists $self->[0]{$fd}{$io}; + return $self->[0]{$fd}{$io}; +} + + +sub poll { + my($self,$timeout) = @_; + + $self->[1] = {}; + + my($fd,$mask,$iom); + my @poll = (); + + while(($fd,$iom) = each %{$self->[0]}) { + $mask = 0; + $mask |= $_ for values(%$iom); + push(@poll,$fd => $mask); + } + + my $ret = @poll ? _poll(defined($timeout) ? $timeout * 1000 : -1,@poll) : 0; + + return $ret + unless $ret > 0; + + while(@poll) { + my($fd,$got) = splice(@poll,0,2); + $self->[1]{$fd} = $got if $got; + } + + return $ret; +} + +sub events { + my $self = shift; + my $io = shift; + my $fd = fileno($io); + exists $self->[1]{$fd} and exists $self->[0]{$fd}{$io} + ? $self->[1]{$fd} & ($self->[0]{$fd}{$io}|POLLHUP|POLLERR|POLLNVAL) + : 0; +} + +sub remove { + my $self = shift; + my $io = shift; + $self->mask($io,0); +} + +sub handles { + my $self = shift; + return values %{$self->[2]} unless @_; + + my $events = shift || 0; + my($fd,$ev,$io,$mask); + my @handles = (); + + while(($fd,$ev) = each %{$self->[1]}) { + while (($io,$mask) = each %{$self->[0]{$fd}}) { + $mask |= POLLHUP|POLLERR|POLLNVAL; # must allow these + push @handles,$self->[2]{$io} if ($ev & $mask) & $events; + } + } + return @handles; +} + +1; + +__END__ + +=head1 NAME + +IO::Poll - Object interface to system poll call + +=head1 SYNOPSIS + + use IO::Poll qw(POLLRDNORM POLLWRNORM POLLIN POLLHUP); + + $poll = new IO::Poll; + + $poll->mask($input_handle => POLLIN); + $poll->mask($output_handle => POLLOUT); + + $poll->poll($timeout); + + $ev = $poll->events($input); + +=head1 DESCRIPTION + +C<IO::Poll> is a simple interface to the system level poll routine. + +=head1 METHODS + +=over 4 + +=item mask ( IO [, EVENT_MASK ] ) + +If EVENT_MASK is given, then, if EVENT_MASK is non-zero, IO is added to the +list of file descriptors and the next call to poll will check for +any event specified in EVENT_MASK. If EVENT_MASK is zero then IO will be +removed from the list of file descriptors. + +If EVENT_MASK is not given then the return value will be the current +event mask value for IO. + +=item poll ( [ TIMEOUT ] ) + +Call the system level poll routine. If TIMEOUT is not specified then the +call will block. Returns the number of handles which had events +happen, or -1 on error. + +=item events ( IO ) + +Returns the event mask which represents the events that happened on IO +during the last call to C<poll>. + +=item remove ( IO ) + +Remove IO from the list of file descriptors for the next poll. + +=item handles( [ EVENT_MASK ] ) + +Returns a list of handles. If EVENT_MASK is not given then a list of all +handles known will be returned. If EVENT_MASK is given then a list +of handles will be returned which had one of the events specified by +EVENT_MASK happen during the last call ti C<poll> + +=back + +=head1 SEE ALSO + +L<poll(2)>, L<IO::Handle>, L<IO::Select> + +=head1 AUTHOR + +Graham Barr. Currently maintained by the Perl Porters. Please report all +bugs to <perl5-porters@perl.org>. + +=head1 COPYRIGHT + +Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/IO/Seekable.pm b/Master/tlpkg/tlperl.old/lib/IO/Seekable.pm new file mode 100644 index 00000000000..db1effda287 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/IO/Seekable.pm @@ -0,0 +1,128 @@ +# + +package IO::Seekable; + +=head1 NAME + +IO::Seekable - supply seek based methods for I/O objects + +=head1 SYNOPSIS + + use IO::Seekable; + package IO::Something; + @ISA = qw(IO::Seekable); + +=head1 DESCRIPTION + +C<IO::Seekable> does not have a constructor of its own as it is intended to +be inherited by other C<IO::Handle> based objects. It provides methods +which allow seeking of the file descriptors. + +=over 4 + +=item $io->getpos + +Returns an opaque value that represents the current position of the +IO::File, or C<undef> if this is not possible (eg an unseekable stream such +as a terminal, pipe or socket). If the fgetpos() function is available in +your C library it is used to implements getpos, else perl emulates getpos +using C's ftell() function. + +=item $io->setpos + +Uses the value of a previous getpos call to return to a previously visited +position. Returns "0 but true" on success, C<undef> on failure. + +=back + +See L<perlfunc> for complete descriptions of each of the following +supported C<IO::Seekable> methods, which are just front ends for the +corresponding built-in functions: + +=over 4 + +=item $io->seek ( POS, WHENCE ) + +Seek the IO::File to position POS, relative to WHENCE: + +=over 8 + +=item WHENCE=0 (SEEK_SET) + +POS is absolute position. (Seek relative to the start of the file) + +=item WHENCE=1 (SEEK_CUR) + +POS is an offset from the current position. (Seek relative to current) + +=item WHENCE=2 (SEEK_END) + +POS is an offset from the end of the file. (Seek relative to end) + +=back + +The SEEK_* constants can be imported from the C<Fcntl> module if you +don't wish to use the numbers C<0> C<1> or C<2> in your code. + +Returns C<1> upon success, C<0> otherwise. + +=item $io->sysseek( POS, WHENCE ) + +Similar to $io->seek, but sets the IO::File's position using the system +call lseek(2) directly, so will confuse most perl IO operators except +sysread and syswrite (see L<perlfunc> for full details) + +Returns the new position, or C<undef> on failure. A position +of zero is returned as the string C<"0 but true"> + +=item $io->tell + +Returns the IO::File's current position, or -1 on error. + +=back + +=head1 SEE ALSO + +L<perlfunc>, +L<perlop/"I/O Operators">, +L<IO::Handle> +L<IO::File> + +=head1 HISTORY + +Derived from FileHandle.pm by Graham Barr E<lt>gbarr@pobox.comE<gt> + +=cut + +use 5.006_001; +use Carp; +use strict; +our($VERSION, @EXPORT, @ISA); +use IO::Handle (); +# XXX we can't get these from IO::Handle or we'll get prototype +# mismatch warnings on C<use POSIX; use IO::File;> :-( +use Fcntl qw(SEEK_SET SEEK_CUR SEEK_END); +require Exporter; + +@EXPORT = qw(SEEK_SET SEEK_CUR SEEK_END); +@ISA = qw(Exporter); + +$VERSION = "1.10"; +$VERSION = eval $VERSION; + +sub seek { + @_ == 3 or croak 'usage: $io->seek(POS, WHENCE)'; + seek($_[0], $_[1], $_[2]); +} + +sub sysseek { + @_ == 3 or croak 'usage: $io->sysseek(POS, WHENCE)'; + sysseek($_[0], $_[1], $_[2]); +} + +sub tell { + @_ == 1 or croak 'usage: $io->tell()'; + tell($_[0]); +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/IO/Select.pm b/Master/tlpkg/tlperl.old/lib/IO/Select.pm new file mode 100644 index 00000000000..fc05fe70e9c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/IO/Select.pm @@ -0,0 +1,381 @@ +# IO::Select.pm +# +# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package IO::Select; + +use strict; +use warnings::register; +use vars qw($VERSION @ISA); +require Exporter; + +$VERSION = "1.17"; + +@ISA = qw(Exporter); # This is only so we can do version checking + +sub VEC_BITS () {0} +sub FD_COUNT () {1} +sub FIRST_FD () {2} + +sub new +{ + my $self = shift; + my $type = ref($self) || $self; + + my $vec = bless [undef,0], $type; + + $vec->add(@_) + if @_; + + $vec; +} + +sub add +{ + shift->_update('add', @_); +} + + +sub remove +{ + shift->_update('remove', @_); +} + + +sub exists +{ + my $vec = shift; + my $fno = $vec->_fileno(shift); + return undef unless defined $fno; + $vec->[$fno + FIRST_FD]; +} + + +sub _fileno +{ + my($self, $f) = @_; + return unless defined $f; + $f = $f->[0] if ref($f) eq 'ARRAY'; + ($f =~ /^\d+$/) ? $f : fileno($f); +} + +sub _update +{ + my $vec = shift; + my $add = shift eq 'add'; + + my $bits = $vec->[VEC_BITS]; + $bits = '' unless defined $bits; + + my $count = 0; + my $f; + foreach $f (@_) + { + my $fn = $vec->_fileno($f); + next unless defined $fn; + my $i = $fn + FIRST_FD; + if ($add) { + if (defined $vec->[$i]) { + $vec->[$i] = $f; # if array rest might be different, so we update + next; + } + $vec->[FD_COUNT]++; + vec($bits, $fn, 1) = 1; + $vec->[$i] = $f; + } else { # remove + next unless defined $vec->[$i]; + $vec->[FD_COUNT]--; + vec($bits, $fn, 1) = 0; + $vec->[$i] = undef; + } + $count++; + } + $vec->[VEC_BITS] = $vec->[FD_COUNT] ? $bits : undef; + $count; +} + +sub can_read +{ + my $vec = shift; + my $timeout = shift; + my $r = $vec->[VEC_BITS]; + + defined($r) && (select($r,undef,undef,$timeout) > 0) + ? handles($vec, $r) + : (); +} + +sub can_write +{ + my $vec = shift; + my $timeout = shift; + my $w = $vec->[VEC_BITS]; + + defined($w) && (select(undef,$w,undef,$timeout) > 0) + ? handles($vec, $w) + : (); +} + +sub has_exception +{ + my $vec = shift; + my $timeout = shift; + my $e = $vec->[VEC_BITS]; + + defined($e) && (select(undef,undef,$e,$timeout) > 0) + ? handles($vec, $e) + : (); +} + +sub has_error +{ + warnings::warn("Call to deprecated method 'has_error', use 'has_exception'") + if warnings::enabled(); + goto &has_exception; +} + +sub count +{ + my $vec = shift; + $vec->[FD_COUNT]; +} + +sub bits +{ + my $vec = shift; + $vec->[VEC_BITS]; +} + +sub as_string # for debugging +{ + my $vec = shift; + my $str = ref($vec) . ": "; + my $bits = $vec->bits; + my $count = $vec->count; + $str .= defined($bits) ? unpack("b*", $bits) : "undef"; + $str .= " $count"; + my @handles = @$vec; + splice(@handles, 0, FIRST_FD); + for (@handles) { + $str .= " " . (defined($_) ? "$_" : "-"); + } + $str; +} + +sub _max +{ + my($a,$b,$c) = @_; + $a > $b + ? $a > $c + ? $a + : $c + : $b > $c + ? $b + : $c; +} + +sub select +{ + shift + if defined $_[0] && !ref($_[0]); + + my($r,$w,$e,$t) = @_; + my @result = (); + + my $rb = defined $r ? $r->[VEC_BITS] : undef; + my $wb = defined $w ? $w->[VEC_BITS] : undef; + my $eb = defined $e ? $e->[VEC_BITS] : undef; + + if(select($rb,$wb,$eb,$t) > 0) + { + my @r = (); + my @w = (); + my @e = (); + my $i = _max(defined $r ? scalar(@$r)-1 : 0, + defined $w ? scalar(@$w)-1 : 0, + defined $e ? scalar(@$e)-1 : 0); + + for( ; $i >= FIRST_FD ; $i--) + { + my $j = $i - FIRST_FD; + push(@r, $r->[$i]) + if defined $rb && defined $r->[$i] && vec($rb, $j, 1); + push(@w, $w->[$i]) + if defined $wb && defined $w->[$i] && vec($wb, $j, 1); + push(@e, $e->[$i]) + if defined $eb && defined $e->[$i] && vec($eb, $j, 1); + } + + @result = (\@r, \@w, \@e); + } + @result; +} + + +sub handles +{ + my $vec = shift; + my $bits = shift; + my @h = (); + my $i; + my $max = scalar(@$vec) - 1; + + for ($i = FIRST_FD; $i <= $max; $i++) + { + next unless defined $vec->[$i]; + push(@h, $vec->[$i]) + if !defined($bits) || vec($bits, $i - FIRST_FD, 1); + } + + @h; +} + +1; +__END__ + +=head1 NAME + +IO::Select - OO interface to the select system call + +=head1 SYNOPSIS + + use IO::Select; + + $s = IO::Select->new(); + + $s->add(\*STDIN); + $s->add($some_handle); + + @ready = $s->can_read($timeout); + + @ready = IO::Select->new(@handles)->can_read(0); + +=head1 DESCRIPTION + +The C<IO::Select> package implements an object approach to the system C<select> +function call. It allows the user to see what IO handles, see L<IO::Handle>, +are ready for reading, writing or have an exception pending. + +=head1 CONSTRUCTOR + +=over 4 + +=item new ( [ HANDLES ] ) + +The constructor creates a new object and optionally initialises it with a set +of handles. + +=back + +=head1 METHODS + +=over 4 + +=item add ( HANDLES ) + +Add the list of handles to the C<IO::Select> object. It is these values that +will be returned when an event occurs. C<IO::Select> keeps these values in a +cache which is indexed by the C<fileno> of the handle, so if more than one +handle with the same C<fileno> is specified then only the last one is cached. + +Each handle can be an C<IO::Handle> object, an integer or an array +reference where the first element is an C<IO::Handle> or an integer. + +=item remove ( HANDLES ) + +Remove all the given handles from the object. This method also works +by the C<fileno> of the handles. So the exact handles that were added +need not be passed, just handles that have an equivalent C<fileno> + +=item exists ( HANDLE ) + +Returns a true value (actually the handle itself) if it is present. +Returns undef otherwise. + +=item handles + +Return an array of all registered handles. + +=item can_read ( [ TIMEOUT ] ) + +Return an array of handles that are ready for reading. C<TIMEOUT> is +the maximum amount of time to wait before returning an empty list, in +seconds, possibly fractional. If C<TIMEOUT> is not given and any +handles are registered then the call will block. + +=item can_write ( [ TIMEOUT ] ) + +Same as C<can_read> except check for handles that can be written to. + +=item has_exception ( [ TIMEOUT ] ) + +Same as C<can_read> except check for handles that have an exception +condition, for example pending out-of-band data. + +=item count () + +Returns the number of handles that the object will check for when +one of the C<can_> methods is called or the object is passed to +the C<select> static method. + +=item bits() + +Return the bit string suitable as argument to the core select() call. + +=item select ( READ, WRITE, EXCEPTION [, TIMEOUT ] ) + +C<select> is a static method, that is you call it with the package name +like C<new>. C<READ>, C<WRITE> and C<EXCEPTION> are either C<undef> or +C<IO::Select> objects. C<TIMEOUT> is optional and has the same effect as +for the core select call. + +The result will be an array of 3 elements, each a reference to an array +which will hold the handles that are ready for reading, writing and have +exceptions respectively. Upon error an empty list is returned. + +=back + +=head1 EXAMPLE + +Here is a short example which shows how C<IO::Select> could be used +to write a server which communicates with several sockets while also +listening for more connections on a listen socket + + use IO::Select; + use IO::Socket; + + $lsn = new IO::Socket::INET(Listen => 1, LocalPort => 8080); + $sel = new IO::Select( $lsn ); + + while(@ready = $sel->can_read) { + foreach $fh (@ready) { + if($fh == $lsn) { + # Create a new socket + $new = $lsn->accept; + $sel->add($new); + } + else { + # Process socket + + # Maybe we have finished with the socket + $sel->remove($fh); + $fh->close; + } + } + } + +=head1 AUTHOR + +Graham Barr. Currently maintained by the Perl Porters. Please report all +bugs to <perl5-porters@perl.org>. + +=head1 COPYRIGHT + +Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/IO/Socket.pm b/Master/tlpkg/tlperl.old/lib/IO/Socket.pm new file mode 100644 index 00000000000..4429f2bb3e6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/IO/Socket.pm @@ -0,0 +1,476 @@ +# IO::Socket.pm +# +# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package IO::Socket; + +require 5.006; + +use IO::Handle; +use Socket 1.3; +use Carp; +use strict; +our(@ISA, $VERSION, @EXPORT_OK); +use Exporter; +use Errno; + +# legacy + +require IO::Socket::INET; +require IO::Socket::UNIX if ($^O ne 'epoc' && $^O ne 'symbian'); + +@ISA = qw(IO::Handle); + +$VERSION = "1.29"; + +@EXPORT_OK = qw(sockatmark); + +sub import { + my $pkg = shift; + if (@_ && $_[0] eq 'sockatmark') { # not very extensible but for now, fast + Exporter::export_to_level('IO::Socket', 1, $pkg, 'sockatmark'); + } else { + my $callpkg = caller; + Exporter::export 'Socket', $callpkg, @_; + } +} + +sub new { + my($class,%arg) = @_; + my $sock = $class->SUPER::new(); + + $sock->autoflush(1); + + ${*$sock}{'io_socket_timeout'} = delete $arg{Timeout}; + + return scalar(%arg) ? $sock->configure(\%arg) + : $sock; +} + +my @domain2pkg; + +sub register_domain { + my($p,$d) = @_; + $domain2pkg[$d] = $p; +} + +sub configure { + my($sock,$arg) = @_; + my $domain = delete $arg->{Domain}; + + croak 'IO::Socket: Cannot configure a generic socket' + unless defined $domain; + + croak "IO::Socket: Unsupported socket domain" + unless defined $domain2pkg[$domain]; + + croak "IO::Socket: Cannot configure socket in domain '$domain'" + unless ref($sock) eq "IO::Socket"; + + bless($sock, $domain2pkg[$domain]); + $sock->configure($arg); +} + +sub socket { + @_ == 4 or croak 'usage: $sock->socket(DOMAIN, TYPE, PROTOCOL)'; + my($sock,$domain,$type,$protocol) = @_; + + socket($sock,$domain,$type,$protocol) or + return undef; + + ${*$sock}{'io_socket_domain'} = $domain; + ${*$sock}{'io_socket_type'} = $type; + ${*$sock}{'io_socket_proto'} = $protocol; + + $sock; +} + +sub socketpair { + @_ == 4 || croak 'usage: IO::Socket->socketpair(DOMAIN, TYPE, PROTOCOL)'; + my($class,$domain,$type,$protocol) = @_; + my $sock1 = $class->new(); + my $sock2 = $class->new(); + + socketpair($sock1,$sock2,$domain,$type,$protocol) or + return (); + + ${*$sock1}{'io_socket_type'} = ${*$sock2}{'io_socket_type'} = $type; + ${*$sock1}{'io_socket_proto'} = ${*$sock2}{'io_socket_proto'} = $protocol; + + ($sock1,$sock2); +} + +sub connect { + @_ == 2 or croak 'usage: $sock->connect(NAME)'; + my $sock = shift; + my $addr = shift; + my $timeout = ${*$sock}{'io_socket_timeout'}; + my $err; + my $blocking; + + $blocking = $sock->blocking(0) if $timeout; + if (!connect($sock, $addr)) { + if (defined $timeout && $!{EINPROGRESS}) { + require IO::Select; + + my $sel = new IO::Select $sock; + + if (!$sel->can_write($timeout)) { + $err = $! || (exists &Errno::ETIMEDOUT ? &Errno::ETIMEDOUT : 1); + $@ = "connect: timeout"; + } + elsif (!connect($sock,$addr) && not $!{EISCONN}) { + # Some systems refuse to re-connect() to + # an already open socket and set errno to EISCONN. + $err = $!; + $@ = "connect: $!"; + } + } + elsif ($blocking || !$!{EINPROGRESS}) { + $err = $!; + $@ = "connect: $!"; + } + } + + $sock->blocking(1) if $blocking; + + $! = $err if $err; + + $err ? undef : $sock; +} + +sub bind { + @_ == 2 or croak 'usage: $sock->bind(NAME)'; + my $sock = shift; + my $addr = shift; + + return bind($sock, $addr) ? $sock + : undef; +} + +sub listen { + @_ >= 1 && @_ <= 2 or croak 'usage: $sock->listen([QUEUE])'; + my($sock,$queue) = @_; + $queue = 5 + unless $queue && $queue > 0; + + return listen($sock, $queue) ? $sock + : undef; +} + +sub accept { + @_ == 1 || @_ == 2 or croak 'usage $sock->accept([PKG])'; + my $sock = shift; + my $pkg = shift || $sock; + my $timeout = ${*$sock}{'io_socket_timeout'}; + my $new = $pkg->new(Timeout => $timeout); + my $peer = undef; + + if(defined $timeout) { + require IO::Select; + + my $sel = new IO::Select $sock; + + unless ($sel->can_read($timeout)) { + $@ = 'accept: timeout'; + $! = (exists &Errno::ETIMEDOUT ? &Errno::ETIMEDOUT : 1); + return; + } + } + + $peer = accept($new,$sock) + or return; + + return wantarray ? ($new, $peer) + : $new; +} + +sub sockname { + @_ == 1 or croak 'usage: $sock->sockname()'; + getsockname($_[0]); +} + +sub peername { + @_ == 1 or croak 'usage: $sock->peername()'; + my($sock) = @_; + getpeername($sock) + || ${*$sock}{'io_socket_peername'} + || undef; +} + +sub connected { + @_ == 1 or croak 'usage: $sock->connected()'; + my($sock) = @_; + getpeername($sock); +} + +sub send { + @_ >= 2 && @_ <= 4 or croak 'usage: $sock->send(BUF, [FLAGS, [TO]])'; + my $sock = $_[0]; + my $flags = $_[2] || 0; + my $peer = $_[3] || $sock->peername; + + croak 'send: Cannot determine peer address' + unless($peer); + + my $r = defined(getpeername($sock)) + ? send($sock, $_[1], $flags) + : send($sock, $_[1], $flags, $peer); + + # remember who we send to, if it was successful + ${*$sock}{'io_socket_peername'} = $peer + if(@_ == 4 && defined $r); + + $r; +} + +sub recv { + @_ == 3 || @_ == 4 or croak 'usage: $sock->recv(BUF, LEN [, FLAGS])'; + my $sock = $_[0]; + my $len = $_[2]; + my $flags = $_[3] || 0; + + # remember who we recv'd from + ${*$sock}{'io_socket_peername'} = recv($sock, $_[1]='', $len, $flags); +} + +sub shutdown { + @_ == 2 or croak 'usage: $sock->shutdown(HOW)'; + my($sock, $how) = @_; + shutdown($sock, $how); +} + +sub setsockopt { + @_ == 4 or croak '$sock->setsockopt(LEVEL, OPTNAME)'; + setsockopt($_[0],$_[1],$_[2],$_[3]); +} + +my $intsize = length(pack("i",0)); + +sub getsockopt { + @_ == 3 or croak '$sock->getsockopt(LEVEL, OPTNAME)'; + my $r = getsockopt($_[0],$_[1],$_[2]); + # Just a guess + $r = unpack("i", $r) + if(defined $r && length($r) == $intsize); + $r; +} + +sub sockopt { + my $sock = shift; + @_ == 1 ? $sock->getsockopt(SOL_SOCKET,@_) + : $sock->setsockopt(SOL_SOCKET,@_); +} + +sub atmark { + @_ == 1 or croak 'usage: $sock->atmark()'; + my($sock) = @_; + sockatmark($sock); +} + +sub timeout { + @_ == 1 || @_ == 2 or croak 'usage: $sock->timeout([VALUE])'; + my($sock,$val) = @_; + my $r = ${*$sock}{'io_socket_timeout'}; + + ${*$sock}{'io_socket_timeout'} = defined $val ? 0 + $val : $val + if(@_ == 2); + + $r; +} + +sub sockdomain { + @_ == 1 or croak 'usage: $sock->sockdomain()'; + my $sock = shift; + ${*$sock}{'io_socket_domain'}; +} + +sub socktype { + @_ == 1 or croak 'usage: $sock->socktype()'; + my $sock = shift; + ${*$sock}{'io_socket_type'} +} + +sub protocol { + @_ == 1 or croak 'usage: $sock->protocol()'; + my($sock) = @_; + ${*$sock}{'io_socket_proto'}; +} + +1; + +__END__ + +=head1 NAME + +IO::Socket - Object interface to socket communications + +=head1 SYNOPSIS + + use IO::Socket; + +=head1 DESCRIPTION + +C<IO::Socket> provides an object interface to creating and using sockets. It +is built upon the L<IO::Handle> interface and inherits all the methods defined +by L<IO::Handle>. + +C<IO::Socket> only defines methods for those operations which are common to all +types of socket. Operations which are specified to a socket in a particular +domain have methods defined in sub classes of C<IO::Socket> + +C<IO::Socket> will export all functions (and constants) defined by L<Socket>. + +=head1 CONSTRUCTOR + +=over 4 + +=item new ( [ARGS] ) + +Creates an C<IO::Socket>, which is a reference to a +newly created symbol (see the C<Symbol> package). C<new> +optionally takes arguments, these arguments are in key-value pairs. +C<new> only looks for one key C<Domain> which tells new which domain +the socket will be in. All other arguments will be passed to the +configuration method of the package for that domain, See below. + + NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE + +As of VERSION 1.18 all IO::Socket objects have autoflush turned on +by default. This was not the case with earlier releases. + + NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE + +=back + +=head1 METHODS + +See L<perlfunc> for complete descriptions of each of the following +supported C<IO::Socket> methods, which are just front ends for the +corresponding built-in functions: + + socket + socketpair + bind + listen + accept + send + recv + peername (getpeername) + sockname (getsockname) + shutdown + +Some methods take slightly different arguments to those defined in L<perlfunc> +in attempt to make the interface more flexible. These are + +=over 4 + +=item accept([PKG]) + +perform the system call C<accept> on the socket and return a new +object. The new object will be created in the same class as the listen +socket, unless C<PKG> is specified. This object can be used to +communicate with the client that was trying to connect. + +In a scalar context the new socket is returned, or undef upon +failure. In a list context a two-element array is returned containing +the new socket and the peer address; the list will be empty upon +failure. + +The timeout in the [PKG] can be specified as zero to effect a "poll", +but you shouldn't do that because a new IO::Select object will be +created behind the scenes just to do the single poll. This is +horrendously inefficient. Use rather true select() with a zero +timeout on the handle, or non-blocking IO. + +=item socketpair(DOMAIN, TYPE, PROTOCOL) + +Call C<socketpair> and return a list of two sockets created, or an +empty list on failure. + +=back + +Additional methods that are provided are: + +=over 4 + +=item atmark + +True if the socket is currently positioned at the urgent data mark, +false otherwise. + + use IO::Socket; + + my $sock = IO::Socket::INET->new('some_server'); + $sock->read($data, 1024) until $sock->atmark; + +Note: this is a reasonably new addition to the family of socket +functions, so all systems may not support this yet. If it is +unsupported by the system, an attempt to use this method will +abort the program. + +The atmark() functionality is also exportable as sockatmark() function: + + use IO::Socket 'sockatmark'; + +This allows for a more traditional use of sockatmark() as a procedural +socket function. If your system does not support sockatmark(), the +C<use> declaration will fail at compile time. + +=item connected + +If the socket is in a connected state the peer address is returned. +If the socket is not in a connected state then undef will be returned. + +=item protocol + +Returns the numerical number for the protocol being used on the socket, if +known. If the protocol is unknown, as with an AF_UNIX socket, zero +is returned. + +=item sockdomain + +Returns the numerical number for the socket domain type. For example, for +an AF_INET socket the value of &AF_INET will be returned. + +=item sockopt(OPT [, VAL]) + +Unified method to both set and get options in the SOL_SOCKET level. If called +with one argument then getsockopt is called, otherwise setsockopt is called. + +=item socktype + +Returns the numerical number for the socket type. For example, for +a SOCK_STREAM socket the value of &SOCK_STREAM will be returned. + +=item timeout([VAL]) + +Set or get the timeout value associated with this socket. If called without +any arguments then the current setting is returned. If called with an argument +the current setting is changed and the previous value returned. + +=back + +=head1 SEE ALSO + +L<Socket>, L<IO::Handle>, L<IO::Socket::INET>, L<IO::Socket::UNIX> + +=head1 AUTHOR + +Graham Barr. atmark() by Lincoln Stein. Currently maintained by the +Perl Porters. Please report all bugs to <perl5-porters@perl.org>. + +=head1 COPYRIGHT + +Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +The atmark() implementation: Copyright 2001, Lincoln Stein <lstein@cshl.org>. +This module is distributed under the same terms as Perl itself. +Feel free to use, modify and redistribute it as long as you retain +the correct attribution. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/IO/Socket/INET.pm b/Master/tlpkg/tlperl.old/lib/IO/Socket/INET.pm new file mode 100644 index 00000000000..96b49911d81 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/IO/Socket/INET.pm @@ -0,0 +1,431 @@ +# IO::Socket::INET.pm +# +# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package IO::Socket::INET; + +use strict; +our(@ISA, $VERSION); +use IO::Socket; +use Socket; +use Carp; +use Exporter; +use Errno; + +@ISA = qw(IO::Socket); +$VERSION = "1.29"; + +my $EINVAL = exists(&Errno::EINVAL) ? Errno::EINVAL() : 1; + +IO::Socket::INET->register_domain( AF_INET ); + +my %socket_type = ( tcp => SOCK_STREAM, + udp => SOCK_DGRAM, + icmp => SOCK_RAW + ); + +sub new { + my $class = shift; + unshift(@_, "PeerAddr") if @_ == 1; + return $class->SUPER::new(@_); +} + +sub _sock_info { + my($addr,$port,$proto) = @_; + my $origport = $port; + my @proto = (); + my @serv = (); + + $port = $1 + if(defined $addr && $addr =~ s,:([\w\(\)/]+)$,,); + + if(defined $proto && $proto =~ /\D/) { + if(@proto = getprotobyname($proto)) { + $proto = $proto[2] || undef; + } + else { + $@ = "Bad protocol '$proto'"; + return; + } + } + + if(defined $port) { + my $defport = ($port =~ s,\((\d+)\)$,,) ? $1 : undef; + my $pnum = ($port =~ m,^(\d+)$,)[0]; + + @serv = getservbyname($port, $proto[0] || "") + if ($port =~ m,\D,); + + $port = $serv[2] || $defport || $pnum; + unless (defined $port) { + $@ = "Bad service '$origport'"; + return; + } + + $proto = (getprotobyname($serv[3]))[2] || undef + if @serv && !$proto; + } + + return ($addr || undef, + $port || undef, + $proto || undef + ); +} + +sub _error { + my $sock = shift; + my $err = shift; + { + local($!); + my $title = ref($sock).": "; + $@ = join("", $_[0] =~ /^$title/ ? "" : $title, @_); + close($sock) + if(defined fileno($sock)); + } + $! = $err; + return undef; +} + +sub _get_addr { + my($sock,$addr_str, $multi) = @_; + my @addr; + if ($multi && $addr_str !~ /^\d+(?:\.\d+){3}$/) { + (undef, undef, undef, undef, @addr) = gethostbyname($addr_str); + } else { + my $h = inet_aton($addr_str); + push(@addr, $h) if defined $h; + } + @addr; +} + +sub configure { + my($sock,$arg) = @_; + my($lport,$rport,$laddr,$raddr,$proto,$type); + + + $arg->{LocalAddr} = $arg->{LocalHost} + if exists $arg->{LocalHost} && !exists $arg->{LocalAddr}; + + ($laddr,$lport,$proto) = _sock_info($arg->{LocalAddr}, + $arg->{LocalPort}, + $arg->{Proto}) + or return _error($sock, $!, $@); + + $laddr = defined $laddr ? inet_aton($laddr) + : INADDR_ANY; + + return _error($sock, $EINVAL, "Bad hostname '",$arg->{LocalAddr},"'") + unless(defined $laddr); + + $arg->{PeerAddr} = $arg->{PeerHost} + if exists $arg->{PeerHost} && !exists $arg->{PeerAddr}; + + unless(exists $arg->{Listen}) { + ($raddr,$rport,$proto) = _sock_info($arg->{PeerAddr}, + $arg->{PeerPort}, + $proto) + or return _error($sock, $!, $@); + } + + $proto ||= (getprotobyname('tcp'))[2]; + + my $pname = (getprotobynumber($proto))[0]; + $type = $arg->{Type} || $socket_type{lc $pname}; + + my @raddr = (); + + if(defined $raddr) { + @raddr = $sock->_get_addr($raddr, $arg->{MultiHomed}); + return _error($sock, $EINVAL, "Bad hostname '",$arg->{PeerAddr},"'") + unless @raddr; + } + + while(1) { + + $sock->socket(AF_INET, $type, $proto) or + return _error($sock, $!, "$!"); + + if (defined $arg->{Blocking}) { + defined $sock->blocking($arg->{Blocking}) + or return _error($sock, $!, "$!"); + } + + if ($arg->{Reuse} || $arg->{ReuseAddr}) { + $sock->sockopt(SO_REUSEADDR,1) or + return _error($sock, $!, "$!"); + } + + if ($arg->{ReusePort}) { + $sock->sockopt(SO_REUSEPORT,1) or + return _error($sock, $!, "$!"); + } + + if ($arg->{Broadcast}) { + $sock->sockopt(SO_BROADCAST,1) or + return _error($sock, $!, "$!"); + } + + if($lport || ($laddr ne INADDR_ANY) || exists $arg->{Listen}) { + $sock->bind($lport || 0, $laddr) or + return _error($sock, $!, "$!"); + } + + if(exists $arg->{Listen}) { + $sock->listen($arg->{Listen} || 5) or + return _error($sock, $!, "$!"); + last; + } + + # don't try to connect unless we're given a PeerAddr + last unless exists($arg->{PeerAddr}); + + $raddr = shift @raddr; + + return _error($sock, $EINVAL, 'Cannot determine remote port') + unless($rport || $type == SOCK_DGRAM || $type == SOCK_RAW); + + last + unless($type == SOCK_STREAM || defined $raddr); + + return _error($sock, $EINVAL, "Bad hostname '",$arg->{PeerAddr},"'") + unless defined $raddr; + +# my $timeout = ${*$sock}{'io_socket_timeout'}; +# my $before = time() if $timeout; + + undef $@; + if ($sock->connect(pack_sockaddr_in($rport, $raddr))) { +# ${*$sock}{'io_socket_timeout'} = $timeout; + return $sock; + } + + return _error($sock, $!, $@ || "Timeout") + unless @raddr; + +# if ($timeout) { +# my $new_timeout = $timeout - (time() - $before); +# return _error($sock, +# (exists(&Errno::ETIMEDOUT) ? Errno::ETIMEDOUT() : $EINVAL), +# "Timeout") if $new_timeout <= 0; +# ${*$sock}{'io_socket_timeout'} = $new_timeout; +# } + + } + + $sock; +} + +sub connect { + @_ == 2 || @_ == 3 or + croak 'usage: $sock->connect(NAME) or $sock->connect(PORT, ADDR)'; + my $sock = shift; + return $sock->SUPER::connect(@_ == 1 ? shift : pack_sockaddr_in(@_)); +} + +sub bind { + @_ == 2 || @_ == 3 or + croak 'usage: $sock->bind(NAME) or $sock->bind(PORT, ADDR)'; + my $sock = shift; + return $sock->SUPER::bind(@_ == 1 ? shift : pack_sockaddr_in(@_)) +} + +sub sockaddr { + @_ == 1 or croak 'usage: $sock->sockaddr()'; + my($sock) = @_; + my $name = $sock->sockname; + $name ? (sockaddr_in($name))[1] : undef; +} + +sub sockport { + @_ == 1 or croak 'usage: $sock->sockport()'; + my($sock) = @_; + my $name = $sock->sockname; + $name ? (sockaddr_in($name))[0] : undef; +} + +sub sockhost { + @_ == 1 or croak 'usage: $sock->sockhost()'; + my($sock) = @_; + my $addr = $sock->sockaddr; + $addr ? inet_ntoa($addr) : undef; +} + +sub peeraddr { + @_ == 1 or croak 'usage: $sock->peeraddr()'; + my($sock) = @_; + my $name = $sock->peername; + $name ? (sockaddr_in($name))[1] : undef; +} + +sub peerport { + @_ == 1 or croak 'usage: $sock->peerport()'; + my($sock) = @_; + my $name = $sock->peername; + $name ? (sockaddr_in($name))[0] : undef; +} + +sub peerhost { + @_ == 1 or croak 'usage: $sock->peerhost()'; + my($sock) = @_; + my $addr = $sock->peeraddr; + $addr ? inet_ntoa($addr) : undef; +} + +1; + +__END__ + +=head1 NAME + +IO::Socket::INET - Object interface for AF_INET domain sockets + +=head1 SYNOPSIS + + use IO::Socket::INET; + +=head1 DESCRIPTION + +C<IO::Socket::INET> provides an object interface to creating and using sockets +in the AF_INET domain. It is built upon the L<IO::Socket> interface and +inherits all the methods defined by L<IO::Socket>. + +=head1 CONSTRUCTOR + +=over 4 + +=item new ( [ARGS] ) + +Creates an C<IO::Socket::INET> object, which is a reference to a +newly created symbol (see the C<Symbol> package). C<new> +optionally takes arguments, these arguments are in key-value pairs. + +In addition to the key-value pairs accepted by L<IO::Socket>, +C<IO::Socket::INET> provides. + + + PeerAddr Remote host address <hostname>[:<port>] + PeerHost Synonym for PeerAddr + PeerPort Remote port or service <service>[(<no>)] | <no> + LocalAddr Local host bind address hostname[:port] + LocalHost Synonym for LocalAddr + LocalPort Local host bind port <service>[(<no>)] | <no> + Proto Protocol name (or number) "tcp" | "udp" | ... + Type Socket type SOCK_STREAM | SOCK_DGRAM | ... + Listen Queue size for listen + ReuseAddr Set SO_REUSEADDR before binding + Reuse Set SO_REUSEADDR before binding (deprecated, prefer ReuseAddr) + ReusePort Set SO_REUSEPORT before binding + Broadcast Set SO_BROADCAST before binding + Timeout Timeout value for various operations + MultiHomed Try all addresses for multi-homed hosts + Blocking Determine if connection will be blocking mode + +If C<Listen> is defined then a listen socket is created, else if the +socket type, which is derived from the protocol, is SOCK_STREAM then +connect() is called. + +Although it is not illegal, the use of C<MultiHomed> on a socket +which is in non-blocking mode is of little use. This is because the +first connect will never fail with a timeout as the connect call +will not block. + +The C<PeerAddr> can be a hostname or the IP-address on the +"xx.xx.xx.xx" form. The C<PeerPort> can be a number or a symbolic +service name. The service name might be followed by a number in +parenthesis which is used if the service is not known by the system. +The C<PeerPort> specification can also be embedded in the C<PeerAddr> +by preceding it with a ":". + +If C<Proto> is not given and you specify a symbolic C<PeerPort> port, +then the constructor will try to derive C<Proto> from the service +name. As a last resort C<Proto> "tcp" is assumed. The C<Type> +parameter will be deduced from C<Proto> if not specified. + +If the constructor is only passed a single argument, it is assumed to +be a C<PeerAddr> specification. + +If C<Blocking> is set to 0, the connection will be in nonblocking mode. +If not specified it defaults to 1 (blocking mode). + +Examples: + + $sock = IO::Socket::INET->new(PeerAddr => 'www.perl.org', + PeerPort => 'http(80)', + Proto => 'tcp'); + + $sock = IO::Socket::INET->new(PeerAddr => 'localhost:smtp(25)'); + + $sock = IO::Socket::INET->new(Listen => 5, + LocalAddr => 'localhost', + LocalPort => 9000, + Proto => 'tcp'); + + $sock = IO::Socket::INET->new('127.0.0.1:25'); + + $sock = IO::Socket::INET->new(PeerPort => 9999, + PeerAddr => inet_ntoa(INADDR_BROADCAST), + Proto => udp, + LocalAddr => 'localhost', + Broadcast => 1 ) + or die "Can't bind : $@\n"; + + NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE + +As of VERSION 1.18 all IO::Socket objects have autoflush turned on +by default. This was not the case with earlier releases. + + NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE + +=back + +=head2 METHODS + +=over 4 + +=item sockaddr () + +Return the address part of the sockaddr structure for the socket + +=item sockport () + +Return the port number that the socket is using on the local host + +=item sockhost () + +Return the address part of the sockaddr structure for the socket in a +text form xx.xx.xx.xx + +=item peeraddr () + +Return the address part of the sockaddr structure for the socket on +the peer host + +=item peerport () + +Return the port number for the socket on the peer host. + +=item peerhost () + +Return the address part of the sockaddr structure for the socket on the +peer host in a text form xx.xx.xx.xx + +=back + +=head1 SEE ALSO + +L<Socket>, L<IO::Socket> + +=head1 AUTHOR + +Graham Barr. Currently maintained by the Perl Porters. Please report all +bugs to <perl5-porters@perl.org>. + +=head1 COPYRIGHT + +Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/IO/Socket/UNIX.pm b/Master/tlpkg/tlperl.old/lib/IO/Socket/UNIX.pm new file mode 100644 index 00000000000..952a0f41f0c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/IO/Socket/UNIX.pm @@ -0,0 +1,144 @@ +# IO::Socket::UNIX.pm +# +# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package IO::Socket::UNIX; + +use strict; +our(@ISA, $VERSION); +use IO::Socket; +use Socket; +use Carp; + +@ISA = qw(IO::Socket); +$VERSION = "1.22"; +$VERSION = eval $VERSION; + +IO::Socket::UNIX->register_domain( AF_UNIX ); + +sub new { + my $class = shift; + unshift(@_, "Peer") if @_ == 1; + return $class->SUPER::new(@_); +} + +sub configure { + my($sock,$arg) = @_; + my($bport,$cport); + + my $type = $arg->{Type} || SOCK_STREAM; + + $sock->socket(AF_UNIX, $type, 0) or + return undef; + + if(exists $arg->{Local}) { + my $addr = sockaddr_un($arg->{Local}); + $sock->bind($addr) or + return undef; + } + if(exists $arg->{Listen} && $type != SOCK_DGRAM) { + $sock->listen($arg->{Listen} || 5) or + return undef; + } + elsif(exists $arg->{Peer}) { + my $addr = sockaddr_un($arg->{Peer}); + $sock->connect($addr) or + return undef; + } + + $sock; +} + +sub hostpath { + @_ == 1 or croak 'usage: $sock->hostpath()'; + my $n = $_[0]->sockname || return undef; + (sockaddr_un($n))[0]; +} + +sub peerpath { + @_ == 1 or croak 'usage: $sock->peerpath()'; + my $n = $_[0]->peername || return undef; + (sockaddr_un($n))[0]; +} + +1; # Keep require happy + +__END__ + +=head1 NAME + +IO::Socket::UNIX - Object interface for AF_UNIX domain sockets + +=head1 SYNOPSIS + + use IO::Socket::UNIX; + +=head1 DESCRIPTION + +C<IO::Socket::UNIX> provides an object interface to creating and using sockets +in the AF_UNIX domain. It is built upon the L<IO::Socket> interface and +inherits all the methods defined by L<IO::Socket>. + +=head1 CONSTRUCTOR + +=over 4 + +=item new ( [ARGS] ) + +Creates an C<IO::Socket::UNIX> object, which is a reference to a +newly created symbol (see the C<Symbol> package). C<new> +optionally takes arguments, these arguments are in key-value pairs. + +In addition to the key-value pairs accepted by L<IO::Socket>, +C<IO::Socket::UNIX> provides. + + Type Type of socket (eg SOCK_STREAM or SOCK_DGRAM) + Local Path to local fifo + Peer Path to peer fifo + Listen Create a listen socket + +If the constructor is only passed a single argument, it is assumed to +be a C<Peer> specification. + + + NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE + +As of VERSION 1.18 all IO::Socket objects have autoflush turned on +by default. This was not the case with earlier releases. + + NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE + +=back + +=head1 METHODS + +=over 4 + +=item hostpath() + +Returns the pathname to the fifo at the local end + +=item peerpath() + +Returns the pathanme to the fifo at the peer end + +=back + +=head1 SEE ALSO + +L<Socket>, L<IO::Socket> + +=head1 AUTHOR + +Graham Barr. Currently maintained by the Perl Porters. Please report all +bugs to <perl5-porters@perl.org>. + +=head1 COPYRIGHT + +Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/IO/String.pm b/Master/tlpkg/tlperl.old/lib/IO/String.pm new file mode 100755 index 00000000000..4bc8e719601 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/IO/String.pm @@ -0,0 +1,551 @@ +package IO::String; + +# Copyright 1998-2005 Gisle Aas. +# +# This library is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +require 5.005_03; +use strict; +use vars qw($VERSION $DEBUG $IO_CONSTANTS); +$VERSION = "1.08"; # $Date: 2005/12/05 12:00:47 $ + +use Symbol (); + +sub new +{ + my $class = shift; + my $self = bless Symbol::gensym(), ref($class) || $class; + tie *$self, $self; + $self->open(@_); + return $self; +} + +sub open +{ + my $self = shift; + return $self->new(@_) unless ref($self); + + if (@_) { + my $bufref = ref($_[0]) ? $_[0] : \$_[0]; + $$bufref = "" unless defined $$bufref; + *$self->{buf} = $bufref; + } + else { + my $buf = ""; + *$self->{buf} = \$buf; + } + *$self->{pos} = 0; + *$self->{lno} = 0; + return $self; +} + +sub pad +{ + my $self = shift; + my $old = *$self->{pad}; + *$self->{pad} = substr($_[0], 0, 1) if @_; + return "\0" unless defined($old) && length($old); + return $old; +} + +sub dump +{ + require Data::Dumper; + my $self = shift; + print Data::Dumper->Dump([$self], ['*self']); + print Data::Dumper->Dump([*$self{HASH}], ['$self{HASH}']); + return; +} + +sub TIEHANDLE +{ + print "TIEHANDLE @_\n" if $DEBUG; + return $_[0] if ref($_[0]); + my $class = shift; + my $self = bless Symbol::gensym(), $class; + $self->open(@_); + return $self; +} + +sub DESTROY +{ + print "DESTROY @_\n" if $DEBUG; +} + +sub close +{ + my $self = shift; + delete *$self->{buf}; + delete *$self->{pos}; + delete *$self->{lno}; + undef *$self if $] eq "5.008"; # workaround for some bug + return 1; +} + +sub opened +{ + my $self = shift; + return defined *$self->{buf}; +} + +sub binmode +{ + my $self = shift; + return 1 unless @_; + # XXX don't know much about layers yet :-( + return 0; +} + +sub getc +{ + my $self = shift; + my $buf; + return $buf if $self->read($buf, 1); + return undef; +} + +sub ungetc +{ + my $self = shift; + $self->setpos($self->getpos() - 1); + return 1; +} + +sub eof +{ + my $self = shift; + return length(${*$self->{buf}}) <= *$self->{pos}; +} + +sub print +{ + my $self = shift; + if (defined $\) { + if (defined $,) { + $self->write(join($,, @_).$\); + } + else { + $self->write(join("",@_).$\); + } + } + else { + if (defined $,) { + $self->write(join($,, @_)); + } + else { + $self->write(join("",@_)); + } + } + return 1; +} +*printflush = \*print; + +sub printf +{ + my $self = shift; + print "PRINTF(@_)\n" if $DEBUG; + my $fmt = shift; + $self->write(sprintf($fmt, @_)); + return 1; +} + + +my($SEEK_SET, $SEEK_CUR, $SEEK_END); + +sub _init_seek_constants +{ + if ($IO_CONSTANTS) { + require IO::Handle; + $SEEK_SET = &IO::Handle::SEEK_SET; + $SEEK_CUR = &IO::Handle::SEEK_CUR; + $SEEK_END = &IO::Handle::SEEK_END; + } + else { + $SEEK_SET = 0; + $SEEK_CUR = 1; + $SEEK_END = 2; + } +} + + +sub seek +{ + my($self,$off,$whence) = @_; + my $buf = *$self->{buf} || return 0; + my $len = length($$buf); + my $pos = *$self->{pos}; + + _init_seek_constants() unless defined $SEEK_SET; + + if ($whence == $SEEK_SET) { $pos = $off } + elsif ($whence == $SEEK_CUR) { $pos += $off } + elsif ($whence == $SEEK_END) { $pos = $len + $off } + else { die "Bad whence ($whence)" } + print "SEEK(POS=$pos,OFF=$off,LEN=$len)\n" if $DEBUG; + + $pos = 0 if $pos < 0; + $self->truncate($pos) if $pos > $len; # extend file + *$self->{pos} = $pos; + return 1; +} + +sub pos +{ + my $self = shift; + my $old = *$self->{pos}; + if (@_) { + my $pos = shift || 0; + my $buf = *$self->{buf}; + my $len = $buf ? length($$buf) : 0; + $pos = $len if $pos > $len; + *$self->{pos} = $pos; + } + return $old; +} + +sub getpos { shift->pos; } + +*sysseek = \&seek; +*setpos = \&pos; +*tell = \&getpos; + + + +sub getline +{ + my $self = shift; + my $buf = *$self->{buf} || return; + my $len = length($$buf); + my $pos = *$self->{pos}; + return if $pos >= $len; + + unless (defined $/) { # slurp + *$self->{pos} = $len; + return substr($$buf, $pos); + } + + unless (length $/) { # paragraph mode + # XXX slow&lazy implementation using getc() + my $para = ""; + my $eol = 0; + my $c; + while (defined($c = $self->getc)) { + if ($c eq "\n") { + $eol++; + next if $eol > 2; + } + elsif ($eol > 1) { + $self->ungetc($c); + last; + } + else { + $eol = 0; + } + $para .= $c; + } + return $para; # XXX wantarray + } + + my $idx = index($$buf,$/,$pos); + if ($idx < 0) { + # return rest of it + *$self->{pos} = $len; + $. = ++ *$self->{lno}; + return substr($$buf, $pos); + } + $len = $idx - $pos + length($/); + *$self->{pos} += $len; + $. = ++ *$self->{lno}; + return substr($$buf, $pos, $len); +} + +sub getlines +{ + die "getlines() called in scalar context\n" unless wantarray; + my $self = shift; + my($line, @lines); + push(@lines, $line) while defined($line = $self->getline); + return @lines; +} + +sub READLINE +{ + goto &getlines if wantarray; + goto &getline; +} + +sub input_line_number +{ + my $self = shift; + my $old = *$self->{lno}; + *$self->{lno} = shift if @_; + return $old; +} + +sub truncate +{ + my $self = shift; + my $len = shift || 0; + my $buf = *$self->{buf}; + if (length($$buf) >= $len) { + substr($$buf, $len) = ''; + *$self->{pos} = $len if $len < *$self->{pos}; + } + else { + $$buf .= ($self->pad x ($len - length($$buf))); + } + return 1; +} + +sub read +{ + my $self = shift; + my $buf = *$self->{buf}; + return undef unless $buf; + + my $pos = *$self->{pos}; + my $rem = length($$buf) - $pos; + my $len = $_[1]; + $len = $rem if $len > $rem; + return undef if $len < 0; + if (@_ > 2) { # read offset + substr($_[0],$_[2]) = substr($$buf, $pos, $len); + } + else { + $_[0] = substr($$buf, $pos, $len); + } + *$self->{pos} += $len; + return $len; +} + +sub write +{ + my $self = shift; + my $buf = *$self->{buf}; + return unless $buf; + + my $pos = *$self->{pos}; + my $slen = length($_[0]); + my $len = $slen; + my $off = 0; + if (@_ > 1) { + $len = $_[1] if $_[1] < $len; + if (@_ > 2) { + $off = $_[2] || 0; + die "Offset outside string" if $off > $slen; + if ($off < 0) { + $off += $slen; + die "Offset outside string" if $off < 0; + } + my $rem = $slen - $off; + $len = $rem if $rem < $len; + } + } + substr($$buf, $pos, $len) = substr($_[0], $off, $len); + *$self->{pos} += $len; + return $len; +} + +*sysread = \&read; +*syswrite = \&write; + +sub stat +{ + my $self = shift; + return unless $self->opened; + return 1 unless wantarray; + my $len = length ${*$self->{buf}}; + + return ( + undef, undef, # dev, ino + 0666, # filemode + 1, # links + $>, # user id + $), # group id + undef, # device id + $len, # size + undef, # atime + undef, # mtime + undef, # ctime + 512, # blksize + int(($len+511)/512) # blocks + ); +} + +sub FILENO { + return undef; # XXX perlfunc says this means the file is closed +} + +sub blocking { + my $self = shift; + my $old = *$self->{blocking} || 0; + *$self->{blocking} = shift if @_; + return $old; +} + +my $notmuch = sub { return }; + +*fileno = $notmuch; +*error = $notmuch; +*clearerr = $notmuch; +*sync = $notmuch; +*flush = $notmuch; +*setbuf = $notmuch; +*setvbuf = $notmuch; + +*untaint = $notmuch; +*autoflush = $notmuch; +*fcntl = $notmuch; +*ioctl = $notmuch; + +*GETC = \&getc; +*PRINT = \&print; +*PRINTF = \&printf; +*READ = \&read; +*WRITE = \&write; +*SEEK = \&seek; +*TELL = \&getpos; +*EOF = \&eof; +*CLOSE = \&close; +*BINMODE = \&binmode; + + +sub string_ref +{ + my $self = shift; + return *$self->{buf}; +} +*sref = \&string_ref; + +1; + +__END__ + +=head1 NAME + +IO::String - Emulate file interface for in-core strings + +=head1 SYNOPSIS + + use IO::String; + $io = IO::String->new; + $io = IO::String->new($var); + tie *IO, 'IO::String'; + + # read data + <$io>; + $io->getline; + read($io, $buf, 100); + + # write data + print $io "string\n"; + $io->print(@data); + syswrite($io, $buf, 100); + + select $io; + printf "Some text %s\n", $str; + + # seek + $pos = $io->getpos; + $io->setpos(0); # rewind + $io->seek(-30, -1); + seek($io, 0, 0); + +=head1 DESCRIPTION + +The C<IO::String> module provides the C<IO::File> interface for in-core +strings. An C<IO::String> object can be attached to a string, and +makes it possible to use the normal file operations for reading or +writing data, as well as for seeking to various locations of the string. +This is useful when you want to use a library module that only +provides an interface to file handles on data that you have in a string +variable. + +Note that perl-5.8 and better has built-in support for "in memory" +files, which are set up by passing a reference instead of a filename +to the open() call. The reason for using this module is that it +makes the code backwards compatible with older versions of Perl. + +The C<IO::String> module provides an interface compatible with +C<IO::File> as distributed with F<IO-1.20>, but the following methods +are not available: new_from_fd, fdopen, format_write, +format_page_number, format_lines_per_page, format_lines_left, +format_name, format_top_name. + +The following methods are specific to the C<IO::String> class: + +=over 4 + +=item $io = IO::String->new + +=item $io = IO::String->new( $string ) + +The constructor returns a newly-created C<IO::String> object. It +takes an optional argument, which is the string to read from or write +into. If no $string argument is given, then an internal buffer +(initially empty) is allocated. + +The C<IO::String> object returned is tied to itself. This means +that you can use most Perl I/O built-ins on it too: readline, <>, getc, +print, printf, syswrite, sysread, close. + +=item $io->open + +=item $io->open( $string ) + +Attaches an existing IO::String object to some other $string, or +allocates a new internal buffer (if no argument is given). The +position is reset to 0. + +=item $io->string_ref + +Returns a reference to the string that is attached to +the C<IO::String> object. Most useful when you let the C<IO::String> +create an internal buffer to write into. + +=item $io->pad + +=item $io->pad( $char ) + +Specifies the padding to use if +the string is extended by either the seek() or truncate() methods. It +is a single character and defaults to "\0". + +=item $io->pos + +=item $io->pos( $newpos ) + +Yet another interface for reading and setting the current read/write +position within the string (the normal getpos/setpos/tell/seek +methods are also available). The pos() method always returns the +old position, and if you pass it an argument it sets the new +position. + +There is (deliberately) a difference between the setpos() and seek() +methods in that seek() extends the string (with the specified +padding) if you go to a location past the end, whereas setpos() +just snaps back to the end. If truncate() is used to extend the string, +then it works as seek(). + +=back + +=head1 BUGS + +In Perl versions < 5.6, the TIEHANDLE interface was incomplete. +If you use such a Perl, then seek(), tell(), eof(), fileno(), binmode() will +not do anything on an C<IO::String> handle. See L<perltie> for +details. + +=head1 SEE ALSO + +L<IO::File>, L<IO::Stringy>, L<perlfunc/open> + +=head1 COPYRIGHT + +Copyright 1998-2005 Gisle Aas. + +This library is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/List/Util.pm b/Master/tlpkg/tlperl.old/lib/List/Util.pm new file mode 100644 index 00000000000..cfe31f70123 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/List/Util.pm @@ -0,0 +1,277 @@ +# List::Util.pm +# +# Copyright (c) 1997-2005 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package List::Util; + +use strict; +use vars qw(@ISA @EXPORT_OK $VERSION $XS_VERSION $TESTING_PERL_ONLY); +require Exporter; + +@ISA = qw(Exporter); +@EXPORT_OK = qw(first min max minstr maxstr reduce sum shuffle); +$VERSION = "1.18"; +$XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + +eval { + # PERL_DL_NONLAZY must be false, or any errors in loading will just + # cause the perl code to be tested + local $ENV{PERL_DL_NONLAZY} = 0 if $ENV{PERL_DL_NONLAZY}; + eval { + require XSLoader; + XSLoader::load('List::Util', $XS_VERSION); + 1; + } or do { + require DynaLoader; + local @ISA = qw(DynaLoader); + bootstrap List::Util $XS_VERSION; + }; +} unless $TESTING_PERL_ONLY; + + +# This code is only compiled if the XS did not load +# of for perl < 5.6.0 + +if (!defined &reduce) { +eval <<'ESQ' + +sub reduce (&@) { + my $code = shift; + no strict 'refs'; + + return shift unless @_ > 1; + + use vars qw($a $b); + + my $caller = caller; + local(*{$caller."::a"}) = \my $a; + local(*{$caller."::b"}) = \my $b; + + $a = shift; + foreach (@_) { + $b = $_; + $a = &{$code}(); + } + + $a; +} + +sub first (&@) { + my $code = shift; + + foreach (@_) { + return $_ if &{$code}(); + } + + undef; +} + +ESQ +} + +# This code is only compiled if the XS did not load +eval <<'ESQ' if !defined ∑ + +use vars qw($a $b); + +sub sum (@) { reduce { $a + $b } @_ } + +sub min (@) { reduce { $a < $b ? $a : $b } @_ } + +sub max (@) { reduce { $a > $b ? $a : $b } @_ } + +sub minstr (@) { reduce { $a lt $b ? $a : $b } @_ } + +sub maxstr (@) { reduce { $a gt $b ? $a : $b } @_ } + +sub shuffle (@) { + my @a=\(@_); + my $n; + my $i=@_; + map { + $n = rand($i--); + (${$a[$n]}, $a[$n] = $a[$i])[0]; + } @_; +} + +ESQ + +1; + +__END__ + +=head1 NAME + +List::Util - A selection of general-utility list subroutines + +=head1 SYNOPSIS + + use List::Util qw(first max maxstr min minstr reduce shuffle sum); + +=head1 DESCRIPTION + +C<List::Util> contains a selection of subroutines that people have +expressed would be nice to have in the perl core, but the usage would +not really be high enough to warrant the use of a keyword, and the size +so small such that being individual extensions would be wasteful. + +By default C<List::Util> does not export any subroutines. The +subroutines defined are + +=over 4 + +=item first BLOCK LIST + +Similar to C<grep> in that it evaluates BLOCK setting C<$_> to each element +of LIST in turn. C<first> returns the first element where the result from +BLOCK is a true value. If BLOCK never returns true or LIST was empty then +C<undef> is returned. + + $foo = first { defined($_) } @list # first defined value in @list + $foo = first { $_ > $value } @list # first value in @list which + # is greater than $value + +This function could be implemented using C<reduce> like this + + $foo = reduce { defined($a) ? $a : wanted($b) ? $b : undef } undef, @list + +for example wanted() could be defined() which would return the first +defined value in @list + +=item max LIST + +Returns the entry in the list with the highest numerical value. If the +list is empty then C<undef> is returned. + + $foo = max 1..10 # 10 + $foo = max 3,9,12 # 12 + $foo = max @bar, @baz # whatever + +This function could be implemented using C<reduce> like this + + $foo = reduce { $a > $b ? $a : $b } 1..10 + +=item maxstr LIST + +Similar to C<max>, but treats all the entries in the list as strings +and returns the highest string as defined by the C<gt> operator. +If the list is empty then C<undef> is returned. + + $foo = maxstr 'A'..'Z' # 'Z' + $foo = maxstr "hello","world" # "world" + $foo = maxstr @bar, @baz # whatever + +This function could be implemented using C<reduce> like this + + $foo = reduce { $a gt $b ? $a : $b } 'A'..'Z' + +=item min LIST + +Similar to C<max> but returns the entry in the list with the lowest +numerical value. If the list is empty then C<undef> is returned. + + $foo = min 1..10 # 1 + $foo = min 3,9,12 # 3 + $foo = min @bar, @baz # whatever + +This function could be implemented using C<reduce> like this + + $foo = reduce { $a < $b ? $a : $b } 1..10 + +=item minstr LIST + +Similar to C<min>, but treats all the entries in the list as strings +and returns the lowest string as defined by the C<lt> operator. +If the list is empty then C<undef> is returned. + + $foo = minstr 'A'..'Z' # 'A' + $foo = minstr "hello","world" # "hello" + $foo = minstr @bar, @baz # whatever + +This function could be implemented using C<reduce> like this + + $foo = reduce { $a lt $b ? $a : $b } 'A'..'Z' + +=item reduce BLOCK LIST + +Reduces LIST by calling BLOCK multiple times, setting C<$a> and C<$b> +each time. The first call will be with C<$a> and C<$b> set to the first +two elements of the list, subsequent calls will be done by +setting C<$a> to the result of the previous call and C<$b> to the next +element in the list. + +Returns the result of the last call to BLOCK. If LIST is empty then +C<undef> is returned. If LIST only contains one element then that +element is returned and BLOCK is not executed. + + $foo = reduce { $a < $b ? $a : $b } 1..10 # min + $foo = reduce { $a lt $b ? $a : $b } 'aa'..'zz' # minstr + $foo = reduce { $a + $b } 1 .. 10 # sum + $foo = reduce { $a . $b } @bar # concat + +=item shuffle LIST + +Returns the elements of LIST in a random order + + @cards = shuffle 0..51 # 0..51 in a random order + +=item sum LIST + +Returns the sum of all the elements in LIST. If LIST is empty then +C<undef> is returned. + + $foo = sum 1..10 # 55 + $foo = sum 3,9,12 # 24 + $foo = sum @bar, @baz # whatever + +This function could be implemented using C<reduce> like this + + $foo = reduce { $a + $b } 1..10 + +=back + +=head1 KNOWN BUGS + +With perl versions prior to 5.005 there are some cases where reduce +will return an incorrect result. This will show up as test 7 of +reduce.t failing. + +=head1 SUGGESTED ADDITIONS + +The following are additions that have been requested, but I have been reluctant +to add due to them being very simple to implement in perl + + # One argument is true + + sub any { $_ && return 1 for @_; 0 } + + # All arguments are true + + sub all { $_ || return 0 for @_; 1 } + + # All arguments are false + + sub none { $_ && return 0 for @_; 1 } + + # One argument is false + + sub notall { $_ || return 1 for @_; 0 } + + # How many elements are true + + sub true { scalar grep { $_ } @_ } + + # How many elements are false + + sub false { scalar grep { !$_ } @_ } + +=head1 COPYRIGHT + +Copyright (c) 1997-2005 Graham Barr <gbarr@pobox.com>. All rights reserved. +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Opcode.pm b/Master/tlpkg/tlperl.old/lib/Opcode.pm new file mode 100644 index 00000000000..2987b9952e0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Opcode.pm @@ -0,0 +1,578 @@ +package Opcode; + +use 5.006_001; + +use strict; + +our($VERSION, $XS_VERSION, @ISA, @EXPORT_OK); + +$VERSION = "1.06"; +$XS_VERSION = "1.03"; + +use Carp; +use Exporter (); +use XSLoader (); + +BEGIN { + @ISA = qw(Exporter); + @EXPORT_OK = qw( + opset ops_to_opset + opset_to_ops opset_to_hex invert_opset + empty_opset full_opset + opdesc opcodes opmask define_optag + opmask_add verify_opset opdump + ); +} + +sub opset (;@); +sub opset_to_hex ($); +sub opdump (;$); +use subs @EXPORT_OK; + +XSLoader::load 'Opcode', $XS_VERSION; + +_init_optags(); + +sub ops_to_opset { opset @_ } # alias for old name + +sub opset_to_hex ($) { + return "(invalid opset)" unless verify_opset($_[0]); + unpack("h*",$_[0]); +} + +sub opdump (;$) { + my $pat = shift; + # handy utility: perl -MOpcode=opdump -e 'opdump File' + foreach(opset_to_ops(full_opset)) { + my $op = sprintf " %12s %s\n", $_, opdesc($_); + next if defined $pat and $op !~ m/$pat/i; + print $op; + } +} + + + +sub _init_optags { + my(%all, %seen); + @all{opset_to_ops(full_opset)} = (); # keys only + + local($_); + local($/) = "\n=cut"; # skip to optags definition section + <DATA>; + $/ = "\n="; # now read in 'pod section' chunks + while(<DATA>) { + next unless m/^item\s+(:\w+)/; + my $tag = $1; + + # Split into lines, keep only indented lines + my @lines = grep { m/^\s/ } split(/\n/); + foreach (@lines) { s/--.*// } # delete comments + my @ops = map { split ' ' } @lines; # get op words + + foreach(@ops) { + warn "$tag - $_ already tagged in $seen{$_}\n" if $seen{$_}; + $seen{$_} = $tag; + delete $all{$_}; + } + # opset will croak on invalid names + define_optag($tag, opset(@ops)); + } + close(DATA); + warn "Untagged opnames: ".join(' ',keys %all)."\n" if %all; +} + + +1; + +__DATA__ + +=head1 NAME + +Opcode - Disable named opcodes when compiling perl code + +=head1 SYNOPSIS + + use Opcode; + + +=head1 DESCRIPTION + +Perl code is always compiled into an internal format before execution. + +Evaluating perl code (e.g. via "eval" or "do 'file'") causes +the code to be compiled into an internal format and then, +provided there was no error in the compilation, executed. +The internal format is based on many distinct I<opcodes>. + +By default no opmask is in effect and any code can be compiled. + +The Opcode module allow you to define an I<operator mask> to be in +effect when perl I<next> compiles any code. Attempting to compile code +which contains a masked opcode will cause the compilation to fail +with an error. The code will not be executed. + +=head1 NOTE + +The Opcode module is not usually used directly. See the ops pragma and +Safe modules for more typical uses. + +=head1 WARNING + +The authors make B<no warranty>, implied or otherwise, about the +suitability of this software for safety or security purposes. + +The authors shall not in any case be liable for special, incidental, +consequential, indirect or other similar damages arising from the use +of this software. + +Your mileage will vary. If in any doubt B<do not use it>. + + +=head1 Operator Names and Operator Lists + +The canonical list of operator names is the contents of the array +PL_op_name defined and initialised in file F<opcode.h> of the Perl +source distribution (and installed into the perl library). + +Each operator has both a terse name (its opname) and a more verbose or +recognisable descriptive name. The opdesc function can be used to +return a list of descriptions for a list of operators. + +Many of the functions and methods listed below take a list of +operators as parameters. Most operator lists can be made up of several +types of element. Each element can be one of + +=over 8 + +=item an operator name (opname) + +Operator names are typically small lowercase words like enterloop, +leaveloop, last, next, redo etc. Sometimes they are rather cryptic +like gv2cv, i_ncmp and ftsvtx. + +=item an operator tag name (optag) + +Operator tags can be used to refer to groups (or sets) of operators. +Tag names always begin with a colon. The Opcode module defines several +optags and the user can define others using the define_optag function. + +=item a negated opname or optag + +An opname or optag can be prefixed with an exclamation mark, e.g., !mkdir. +Negating an opname or optag means remove the corresponding ops from the +accumulated set of ops at that point. + +=item an operator set (opset) + +An I<opset> as a binary string of approximately 44 bytes which holds a +set or zero or more operators. + +The opset and opset_to_ops functions can be used to convert from +a list of operators to an opset and I<vice versa>. + +Wherever a list of operators can be given you can use one or more opsets. +See also Manipulating Opsets below. + +=back + + +=head1 Opcode Functions + +The Opcode package contains functions for manipulating operator names +tags and sets. All are available for export by the package. + +=over 8 + +=item opcodes + +In a scalar context opcodes returns the number of opcodes in this +version of perl (around 350 for perl-5.7.0). + +In a list context it returns a list of all the operator names. +(Not yet implemented, use @names = opset_to_ops(full_opset).) + +=item opset (OP, ...) + +Returns an opset containing the listed operators. + +=item opset_to_ops (OPSET) + +Returns a list of operator names corresponding to those operators in +the set. + +=item opset_to_hex (OPSET) + +Returns a string representation of an opset. Can be handy for debugging. + +=item full_opset + +Returns an opset which includes all operators. + +=item empty_opset + +Returns an opset which contains no operators. + +=item invert_opset (OPSET) + +Returns an opset which is the inverse set of the one supplied. + +=item verify_opset (OPSET, ...) + +Returns true if the supplied opset looks like a valid opset (is the +right length etc) otherwise it returns false. If an optional second +parameter is true then verify_opset will croak on an invalid opset +instead of returning false. + +Most of the other Opcode functions call verify_opset automatically +and will croak if given an invalid opset. + +=item define_optag (OPTAG, OPSET) + +Define OPTAG as a symbolic name for OPSET. Optag names always start +with a colon C<:>. + +The optag name used must not be defined already (define_optag will +croak if it is already defined). Optag names are global to the perl +process and optag definitions cannot be altered or deleted once +defined. + +It is strongly recommended that applications using Opcode should use a +leading capital letter on their tag names since lowercase names are +reserved for use by the Opcode module. If using Opcode within a module +you should prefix your tags names with the name of your module to +ensure uniqueness and thus avoid clashes with other modules. + +=item opmask_add (OPSET) + +Adds the supplied opset to the current opmask. Note that there is +currently I<no> mechanism for unmasking ops once they have been masked. +This is intentional. + +=item opmask + +Returns an opset corresponding to the current opmask. + +=item opdesc (OP, ...) + +This takes a list of operator names and returns the corresponding list +of operator descriptions. + +=item opdump (PAT) + +Dumps to STDOUT a two column list of op names and op descriptions. +If an optional pattern is given then only lines which match the +(case insensitive) pattern will be output. + +It's designed to be used as a handy command line utility: + + perl -MOpcode=opdump -e opdump + perl -MOpcode=opdump -e 'opdump Eval' + +=back + +=head1 Manipulating Opsets + +Opsets may be manipulated using the perl bit vector operators & (and), | (or), +^ (xor) and ~ (negate/invert). + +However you should never rely on the numerical position of any opcode +within the opset. In other words both sides of a bit vector operator +should be opsets returned from Opcode functions. + +Also, since the number of opcodes in your current version of perl might +not be an exact multiple of eight, there may be unused bits in the last +byte of an upset. This should not cause any problems (Opcode functions +ignore those extra bits) but it does mean that using the ~ operator +will typically not produce the same 'physical' opset 'string' as the +invert_opset function. + + +=head1 TO DO (maybe) + + $bool = opset_eq($opset1, $opset2) true if opsets are logically eqiv + + $yes = opset_can($opset, @ops) true if $opset has all @ops set + + @diff = opset_diff($opset1, $opset2) => ('foo', '!bar', ...) + +=cut + +# the =cut above is used by _init_optags() to get here quickly + +=head1 Predefined Opcode Tags + +=over 5 + +=item :base_core + + null stub scalar pushmark wantarray const defined undef + + rv2sv sassign + + rv2av aassign aelem aelemfast aslice av2arylen + + rv2hv helem hslice each values keys exists delete + + preinc i_preinc predec i_predec postinc i_postinc postdec i_postdec + int hex oct abs pow multiply i_multiply divide i_divide + modulo i_modulo add i_add subtract i_subtract + + left_shift right_shift bit_and bit_xor bit_or negate i_negate + not complement + + lt i_lt gt i_gt le i_le ge i_ge eq i_eq ne i_ne ncmp i_ncmp + slt sgt sle sge seq sne scmp + + substr vec stringify study pos length index rindex ord chr + + ucfirst lcfirst uc lc quotemeta trans chop schop chomp schomp + + match split qr + + list lslice splice push pop shift unshift reverse + + cond_expr flip flop andassign orassign and or xor + + warn die lineseq nextstate scope enter leave setstate + + rv2cv anoncode prototype + + entersub leavesub leavesublv return method method_named -- XXX loops via recursion? + + leaveeval -- needed for Safe to operate, is safe without entereval + +=item :base_mem + +These memory related ops are not included in :base_core because they +can easily be used to implement a resource attack (e.g., consume all +available memory). + + concat repeat join range + + anonlist anonhash + +Note that despite the existence of this optag a memory resource attack +may still be possible using only :base_core ops. + +Disabling these ops is a I<very> heavy handed way to attempt to prevent +a memory resource attack. It's probable that a specific memory limit +mechanism will be added to perl in the near future. + +=item :base_loop + +These loop ops are not included in :base_core because they can easily be +used to implement a resource attack (e.g., consume all available CPU time). + + grepstart grepwhile + mapstart mapwhile + enteriter iter + enterloop leaveloop unstack + last next redo + goto + +=item :base_io + +These ops enable I<filehandle> (rather than filename) based input and +output. These are safe on the assumption that only pre-existing +filehandles are available for use. To create new filehandles other ops +such as open would need to be enabled. + + readline rcatline getc read + + formline enterwrite leavewrite + + print sysread syswrite send recv + + eof tell seek sysseek + + readdir telldir seekdir rewinddir + +=item :base_orig + +These are a hotchpotch of opcodes still waiting to be considered + + gvsv gv gelem + + padsv padav padhv padany + + rv2gv refgen srefgen ref + + bless -- could be used to change ownership of objects (reblessing) + + pushre regcmaybe regcreset regcomp subst substcont + + sprintf prtf -- can core dump + + crypt + + tie untie + + dbmopen dbmclose + sselect select + pipe_op sockpair + + getppid getpgrp setpgrp getpriority setpriority localtime gmtime + + entertry leavetry -- can be used to 'hide' fatal errors + + custom -- where should this go + +=item :base_math + +These ops are not included in :base_core because of the risk of them being +used to generate floating point exceptions (which would have to be caught +using a $SIG{FPE} handler). + + atan2 sin cos exp log sqrt + +These ops are not included in :base_core because they have an effect +beyond the scope of the compartment. + + rand srand + +=item :base_thread + +These ops are related to multi-threading. + + lock threadsv + +=item :default + +A handy tag name for a I<reasonable> default set of ops. (The current ops +allowed are unstable while development continues. It will change.) + + :base_core :base_mem :base_loop :base_io :base_orig :base_thread + +If safety matters to you (and why else would you be using the Opcode module?) +then you should not rely on the definition of this, or indeed any other, optag! + + +=item :filesys_read + + stat lstat readlink + + ftatime ftblk ftchr ftctime ftdir fteexec fteowned fteread + ftewrite ftfile ftis ftlink ftmtime ftpipe ftrexec ftrowned + ftrread ftsgid ftsize ftsock ftsuid fttty ftzero ftrwrite ftsvtx + + fttext ftbinary + + fileno + +=item :sys_db + + ghbyname ghbyaddr ghostent shostent ehostent -- hosts + gnbyname gnbyaddr gnetent snetent enetent -- networks + gpbyname gpbynumber gprotoent sprotoent eprotoent -- protocols + gsbyname gsbyport gservent sservent eservent -- services + + gpwnam gpwuid gpwent spwent epwent getlogin -- users + ggrnam ggrgid ggrent sgrent egrent -- groups + +=item :browse + +A handy tag name for a I<reasonable> default set of ops beyond the +:default optag. Like :default (and indeed all the other optags) its +current definition is unstable while development continues. It will change. + +The :browse tag represents the next step beyond :default. It it a +superset of the :default ops and adds :filesys_read the :sys_db. +The intent being that scripts can access more (possibly sensitive) +information about your system but not be able to change it. + + :default :filesys_read :sys_db + +=item :filesys_open + + sysopen open close + umask binmode + + open_dir closedir -- other dir ops are in :base_io + +=item :filesys_write + + link unlink rename symlink truncate + + mkdir rmdir + + utime chmod chown + + fcntl -- not strictly filesys related, but possibly as dangerous? + +=item :subprocess + + backtick system + + fork + + wait waitpid + + glob -- access to Cshell via <`rm *`> + +=item :ownprocess + + exec exit kill + + time tms -- could be used for timing attacks (paranoid?) + +=item :others + +This tag holds groups of assorted specialist opcodes that don't warrant +having optags defined for them. + +SystemV Interprocess Communications: + + msgctl msgget msgrcv msgsnd + + semctl semget semop + + shmctl shmget shmread shmwrite + +=item :still_to_be_decided + + chdir + flock ioctl + + socket getpeername ssockopt + bind connect listen accept shutdown gsockopt getsockname + + sleep alarm -- changes global timer state and signal handling + sort -- assorted problems including core dumps + tied -- can be used to access object implementing a tie + pack unpack -- can be used to create/use memory pointers + + entereval -- can be used to hide code from initial compile + require dofile + + caller -- get info about calling environment and args + + reset + + dbstate -- perl -d version of nextstate(ment) opcode + +=item :dangerous + +This tag is simply a bucket for opcodes that are unlikely to be used via +a tag name but need to be tagged for completeness and documentation. + + syscall dump chroot + + +=back + +=head1 SEE ALSO + +ops(3) -- perl pragma interface to Opcode module. + +Safe(3) -- Opcode and namespace limited execution compartments + +=head1 AUTHORS + +Originally designed and implemented by Malcolm Beattie, +mbeattie@sable.ox.ac.uk as part of Safe version 1. + +Split out from Safe module version 1, named opcode tags and other +changes added by Tim Bunce. + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/POSIX.pm b/Master/tlpkg/tlperl.old/lib/POSIX.pm new file mode 100644 index 00000000000..87676215e73 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/POSIX.pm @@ -0,0 +1,965 @@ +package POSIX; + +our(@ISA, %EXPORT_TAGS, @EXPORT_OK, $AUTOLOAD) = (); + +our $VERSION = "1.09"; + +use AutoLoader; + +use XSLoader (); + +# Grandfather old foo_h form to new :foo_h form +my $loaded; + +sub import { + load_imports() unless $loaded++; + my $this = shift; + my @list = map { m/^\w+_h$/ ? ":$_" : $_ } @_; + local $Exporter::ExportLevel = 1; + Exporter::import($this,@list); +} + +sub croak { require Carp; goto &Carp::croak } +# declare usage to assist AutoLoad +sub usage; + +XSLoader::load 'POSIX', $VERSION; + +my %NON_CONSTS = (map {($_,1)} + qw(S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISREG WEXITSTATUS + WIFEXITED WIFSIGNALED WIFSTOPPED WSTOPSIG WTERMSIG)); + +sub AUTOLOAD { + if ($AUTOLOAD =~ /::(_?[a-z])/) { + # require AutoLoader; + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD + } + local $! = 0; + my $constname = $AUTOLOAD; + $constname =~ s/.*:://; + if ($NON_CONSTS{$constname}) { + my ($val, $error) = &int_macro_int($constname, $_[0]); + croak $error if $error; + *$AUTOLOAD = sub { &int_macro_int($constname, $_[0]) }; + } else { + my ($error, $val) = constant($constname); + croak $error if $error; + *$AUTOLOAD = sub { $val }; + } + + goto &$AUTOLOAD; +} + +package POSIX::SigAction; + +use AutoLoader 'AUTOLOAD'; +sub new { bless {HANDLER => $_[1], MASK => $_[2], FLAGS => $_[3] || 0, SAFE => 0}, $_[0] } + +package POSIX; + +1; +__END__ + +sub usage { + my ($mess) = @_; + croak "Usage: POSIX::$mess"; +} + +sub redef { + my ($mess) = @_; + croak "Use method $mess instead"; +} + +sub unimpl { + my ($mess) = @_; + $mess =~ s/xxx//; + croak "Unimplemented: POSIX::$mess"; +} + +sub assert { + usage "assert(expr)" if @_ != 1; + if (!$_[0]) { + croak "Assertion failed"; + } +} + +sub tolower { + usage "tolower(string)" if @_ != 1; + lc($_[0]); +} + +sub toupper { + usage "toupper(string)" if @_ != 1; + uc($_[0]); +} + +sub closedir { + usage "closedir(dirhandle)" if @_ != 1; + CORE::closedir($_[0]); +} + +sub opendir { + usage "opendir(directory)" if @_ != 1; + my $dirhandle; + CORE::opendir($dirhandle, $_[0]) + ? $dirhandle + : undef; +} + +sub readdir { + usage "readdir(dirhandle)" if @_ != 1; + CORE::readdir($_[0]); +} + +sub rewinddir { + usage "rewinddir(dirhandle)" if @_ != 1; + CORE::rewinddir($_[0]); +} + +sub errno { + usage "errno()" if @_ != 0; + $! + 0; +} + +sub creat { + usage "creat(filename, mode)" if @_ != 2; + &open($_[0], &O_WRONLY | &O_CREAT | &O_TRUNC, $_[1]); +} + +sub fcntl { + usage "fcntl(filehandle, cmd, arg)" if @_ != 3; + CORE::fcntl($_[0], $_[1], $_[2]); +} + +sub getgrgid { + usage "getgrgid(gid)" if @_ != 1; + CORE::getgrgid($_[0]); +} + +sub getgrnam { + usage "getgrnam(name)" if @_ != 1; + CORE::getgrnam($_[0]); +} + +sub atan2 { + usage "atan2(x,y)" if @_ != 2; + CORE::atan2($_[0], $_[1]); +} + +sub cos { + usage "cos(x)" if @_ != 1; + CORE::cos($_[0]); +} + +sub exp { + usage "exp(x)" if @_ != 1; + CORE::exp($_[0]); +} + +sub fabs { + usage "fabs(x)" if @_ != 1; + CORE::abs($_[0]); +} + +sub log { + usage "log(x)" if @_ != 1; + CORE::log($_[0]); +} + +sub pow { + usage "pow(x,exponent)" if @_ != 2; + $_[0] ** $_[1]; +} + +sub sin { + usage "sin(x)" if @_ != 1; + CORE::sin($_[0]); +} + +sub sqrt { + usage "sqrt(x)" if @_ != 1; + CORE::sqrt($_[0]); +} + +sub getpwnam { + usage "getpwnam(name)" if @_ != 1; + CORE::getpwnam($_[0]); +} + +sub getpwuid { + usage "getpwuid(uid)" if @_ != 1; + CORE::getpwuid($_[0]); +} + +sub longjmp { + unimpl "longjmp() is C-specific: use die instead"; +} + +sub setjmp { + unimpl "setjmp() is C-specific: use eval {} instead"; +} + +sub siglongjmp { + unimpl "siglongjmp() is C-specific: use die instead"; +} + +sub sigsetjmp { + unimpl "sigsetjmp() is C-specific: use eval {} instead"; +} + +sub kill { + usage "kill(pid, sig)" if @_ != 2; + CORE::kill $_[1], $_[0]; +} + +sub raise { + usage "raise(sig)" if @_ != 1; + CORE::kill $_[0], $$; # Is this good enough? +} + +sub offsetof { + unimpl "offsetof() is C-specific, stopped"; +} + +sub clearerr { + redef "IO::Handle::clearerr()"; +} + +sub fclose { + redef "IO::Handle::close()"; +} + +sub fdopen { + redef "IO::Handle::new_from_fd()"; +} + +sub feof { + redef "IO::Handle::eof()"; +} + +sub fgetc { + redef "IO::Handle::getc()"; +} + +sub fgets { + redef "IO::Handle::gets()"; +} + +sub fileno { + redef "IO::Handle::fileno()"; +} + +sub fopen { + redef "IO::File::open()"; +} + +sub fprintf { + unimpl "fprintf() is C-specific--use printf instead"; +} + +sub fputc { + unimpl "fputc() is C-specific--use print instead"; +} + +sub fputs { + unimpl "fputs() is C-specific--use print instead"; +} + +sub fread { + unimpl "fread() is C-specific--use read instead"; +} + +sub freopen { + unimpl "freopen() is C-specific--use open instead"; +} + +sub fscanf { + unimpl "fscanf() is C-specific--use <> and regular expressions instead"; +} + +sub fseek { + redef "IO::Seekable::seek()"; +} + +sub fsync { + redef "IO::Handle::sync()"; +} + +sub ferror { + redef "IO::Handle::error()"; +} + +sub fflush { + redef "IO::Handle::flush()"; +} + +sub fgetpos { + redef "IO::Seekable::getpos()"; +} + +sub fsetpos { + redef "IO::Seekable::setpos()"; +} + +sub ftell { + redef "IO::Seekable::tell()"; +} + +sub fwrite { + unimpl "fwrite() is C-specific--use print instead"; +} + +sub getc { + usage "getc(handle)" if @_ != 1; + CORE::getc($_[0]); +} + +sub getchar { + usage "getchar()" if @_ != 0; + CORE::getc(STDIN); +} + +sub gets { + usage "gets()" if @_ != 0; + scalar <STDIN>; +} + +sub perror { + print STDERR "@_: " if @_; + print STDERR $!,"\n"; +} + +sub printf { + usage "printf(pattern, args...)" if @_ < 1; + CORE::printf STDOUT @_; +} + +sub putc { + unimpl "putc() is C-specific--use print instead"; +} + +sub putchar { + unimpl "putchar() is C-specific--use print instead"; +} + +sub puts { + unimpl "puts() is C-specific--use print instead"; +} + +sub remove { + usage "remove(filename)" if @_ != 1; + CORE::unlink($_[0]); +} + +sub rename { + usage "rename(oldfilename, newfilename)" if @_ != 2; + CORE::rename($_[0], $_[1]); +} + +sub rewind { + usage "rewind(filehandle)" if @_ != 1; + CORE::seek($_[0],0,0); +} + +sub scanf { + unimpl "scanf() is C-specific--use <> and regular expressions instead"; +} + +sub sprintf { + usage "sprintf(pattern,args)" if @_ == 0; + CORE::sprintf(shift,@_); +} + +sub sscanf { + unimpl "sscanf() is C-specific--use regular expressions instead"; +} + +sub tmpfile { + redef "IO::File::new_tmpfile()"; +} + +sub ungetc { + redef "IO::Handle::ungetc()"; +} + +sub vfprintf { + unimpl "vfprintf() is C-specific"; +} + +sub vprintf { + unimpl "vprintf() is C-specific"; +} + +sub vsprintf { + unimpl "vsprintf() is C-specific"; +} + +sub abs { + usage "abs(x)" if @_ != 1; + CORE::abs($_[0]); +} + +sub atexit { + unimpl "atexit() is C-specific: use END {} instead"; +} + +sub atof { + unimpl "atof() is C-specific, stopped"; +} + +sub atoi { + unimpl "atoi() is C-specific, stopped"; +} + +sub atol { + unimpl "atol() is C-specific, stopped"; +} + +sub bsearch { + unimpl "bsearch() not supplied"; +} + +sub calloc { + unimpl "calloc() is C-specific, stopped"; +} + +sub div { + unimpl "div() is C-specific, use /, % and int instead"; +} + +sub exit { + usage "exit(status)" if @_ != 1; + CORE::exit($_[0]); +} + +sub free { + unimpl "free() is C-specific, stopped"; +} + +sub getenv { + usage "getenv(name)" if @_ != 1; + $ENV{$_[0]}; +} + +sub labs { + unimpl "labs() is C-specific, use abs instead"; +} + +sub ldiv { + unimpl "ldiv() is C-specific, use /, % and int instead"; +} + +sub malloc { + unimpl "malloc() is C-specific, stopped"; +} + +sub qsort { + unimpl "qsort() is C-specific, use sort instead"; +} + +sub rand { + unimpl "rand() is non-portable, use Perl's rand instead"; +} + +sub realloc { + unimpl "realloc() is C-specific, stopped"; +} + +sub srand { + unimpl "srand()"; +} + +sub system { + usage "system(command)" if @_ != 1; + CORE::system($_[0]); +} + +sub memchr { + unimpl "memchr() is C-specific, use index() instead"; +} + +sub memcmp { + unimpl "memcmp() is C-specific, use eq instead"; +} + +sub memcpy { + unimpl "memcpy() is C-specific, use = instead"; +} + +sub memmove { + unimpl "memmove() is C-specific, use = instead"; +} + +sub memset { + unimpl "memset() is C-specific, use x instead"; +} + +sub strcat { + unimpl "strcat() is C-specific, use .= instead"; +} + +sub strchr { + unimpl "strchr() is C-specific, use index() instead"; +} + +sub strcmp { + unimpl "strcmp() is C-specific, use eq instead"; +} + +sub strcpy { + unimpl "strcpy() is C-specific, use = instead"; +} + +sub strcspn { + unimpl "strcspn() is C-specific, use regular expressions instead"; +} + +sub strerror { + usage "strerror(errno)" if @_ != 1; + local $! = $_[0]; + $! . ""; +} + +sub strlen { + unimpl "strlen() is C-specific, use length instead"; +} + +sub strncat { + unimpl "strncat() is C-specific, use .= instead"; +} + +sub strncmp { + unimpl "strncmp() is C-specific, use eq instead"; +} + +sub strncpy { + unimpl "strncpy() is C-specific, use = instead"; +} + +sub strpbrk { + unimpl "strpbrk() is C-specific, stopped"; +} + +sub strrchr { + unimpl "strrchr() is C-specific, use rindex() instead"; +} + +sub strspn { + unimpl "strspn() is C-specific, stopped"; +} + +sub strstr { + usage "strstr(big, little)" if @_ != 2; + CORE::index($_[0], $_[1]); +} + +sub strtok { + unimpl "strtok() is C-specific, stopped"; +} + +sub chmod { + usage "chmod(mode, filename)" if @_ != 2; + CORE::chmod($_[0], $_[1]); +} + +sub fstat { + usage "fstat(fd)" if @_ != 1; + local *TMP; + CORE::open(TMP, "<&$_[0]"); # Gross. + my @l = CORE::stat(TMP); + CORE::close(TMP); + @l; +} + +sub mkdir { + usage "mkdir(directoryname, mode)" if @_ != 2; + CORE::mkdir($_[0], $_[1]); +} + +sub stat { + usage "stat(filename)" if @_ != 1; + CORE::stat($_[0]); +} + +sub umask { + usage "umask(mask)" if @_ != 1; + CORE::umask($_[0]); +} + +sub wait { + usage "wait()" if @_ != 0; + CORE::wait(); +} + +sub waitpid { + usage "waitpid(pid, options)" if @_ != 2; + CORE::waitpid($_[0], $_[1]); +} + +sub gmtime { + usage "gmtime(time)" if @_ != 1; + CORE::gmtime($_[0]); +} + +sub localtime { + usage "localtime(time)" if @_ != 1; + CORE::localtime($_[0]); +} + +sub time { + usage "time()" if @_ != 0; + CORE::time; +} + +sub alarm { + usage "alarm(seconds)" if @_ != 1; + CORE::alarm($_[0]); +} + +sub chdir { + usage "chdir(directory)" if @_ != 1; + CORE::chdir($_[0]); +} + +sub chown { + usage "chown(uid, gid, filename)" if @_ != 3; + CORE::chown($_[0], $_[1], $_[2]); +} + +sub execl { + unimpl "execl() is C-specific, stopped"; +} + +sub execle { + unimpl "execle() is C-specific, stopped"; +} + +sub execlp { + unimpl "execlp() is C-specific, stopped"; +} + +sub execv { + unimpl "execv() is C-specific, stopped"; +} + +sub execve { + unimpl "execve() is C-specific, stopped"; +} + +sub execvp { + unimpl "execvp() is C-specific, stopped"; +} + +sub fork { + usage "fork()" if @_ != 0; + CORE::fork; +} + +sub getegid { + usage "getegid()" if @_ != 0; + $) + 0; +} + +sub geteuid { + usage "geteuid()" if @_ != 0; + $> + 0; +} + +sub getgid { + usage "getgid()" if @_ != 0; + $( + 0; +} + +sub getgroups { + usage "getgroups()" if @_ != 0; + my %seen; + grep(!$seen{$_}++, split(' ', $) )); +} + +sub getlogin { + usage "getlogin()" if @_ != 0; + CORE::getlogin(); +} + +sub getpgrp { + usage "getpgrp()" if @_ != 0; + CORE::getpgrp; +} + +sub getpid { + usage "getpid()" if @_ != 0; + $$; +} + +sub getppid { + usage "getppid()" if @_ != 0; + CORE::getppid; +} + +sub getuid { + usage "getuid()" if @_ != 0; + $<; +} + +sub isatty { + usage "isatty(filehandle)" if @_ != 1; + -t $_[0]; +} + +sub link { + usage "link(oldfilename, newfilename)" if @_ != 2; + CORE::link($_[0], $_[1]); +} + +sub rmdir { + usage "rmdir(directoryname)" if @_ != 1; + CORE::rmdir($_[0]); +} + +sub setbuf { + redef "IO::Handle::setbuf()"; +} + +sub setvbuf { + redef "IO::Handle::setvbuf()"; +} + +sub sleep { + usage "sleep(seconds)" if @_ != 1; + $_[0] - CORE::sleep($_[0]); +} + +sub unlink { + usage "unlink(filename)" if @_ != 1; + CORE::unlink($_[0]); +} + +sub utime { + usage "utime(filename, atime, mtime)" if @_ != 3; + CORE::utime($_[1], $_[2], $_[0]); +} + +sub load_imports { +%EXPORT_TAGS = ( + + assert_h => [qw(assert NDEBUG)], + + ctype_h => [qw(isalnum isalpha iscntrl isdigit isgraph islower + isprint ispunct isspace isupper isxdigit tolower toupper)], + + dirent_h => [], + + errno_h => [qw(E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT + EAGAIN EALREADY EBADF EBUSY ECHILD ECONNABORTED + ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT + EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS + EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK + EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH + ENFILE ENOBUFS ENODEV ENOENT ENOEXEC ENOLCK ENOMEM + ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR + ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM + EPFNOSUPPORT EPIPE EPROCLIM EPROTONOSUPPORT EPROTOTYPE + ERANGE EREMOTE ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT + ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS ETXTBSY + EUSERS EWOULDBLOCK EXDEV errno)], + + fcntl_h => [qw(FD_CLOEXEC F_DUPFD F_GETFD F_GETFL F_GETLK F_RDLCK + F_SETFD F_SETFL F_SETLK F_SETLKW F_UNLCK F_WRLCK + O_ACCMODE O_APPEND O_CREAT O_EXCL O_NOCTTY O_NONBLOCK + O_RDONLY O_RDWR O_TRUNC O_WRONLY + creat + SEEK_CUR SEEK_END SEEK_SET + S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU + S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG S_ISUID + S_IWGRP S_IWOTH S_IWUSR)], + + float_h => [qw(DBL_DIG DBL_EPSILON DBL_MANT_DIG + DBL_MAX DBL_MAX_10_EXP DBL_MAX_EXP + DBL_MIN DBL_MIN_10_EXP DBL_MIN_EXP + FLT_DIG FLT_EPSILON FLT_MANT_DIG + FLT_MAX FLT_MAX_10_EXP FLT_MAX_EXP + FLT_MIN FLT_MIN_10_EXP FLT_MIN_EXP + FLT_RADIX FLT_ROUNDS + LDBL_DIG LDBL_EPSILON LDBL_MANT_DIG + LDBL_MAX LDBL_MAX_10_EXP LDBL_MAX_EXP + LDBL_MIN LDBL_MIN_10_EXP LDBL_MIN_EXP)], + + grp_h => [], + + limits_h => [qw( ARG_MAX CHAR_BIT CHAR_MAX CHAR_MIN CHILD_MAX + INT_MAX INT_MIN LINK_MAX LONG_MAX LONG_MIN MAX_CANON + MAX_INPUT MB_LEN_MAX NAME_MAX NGROUPS_MAX OPEN_MAX + PATH_MAX PIPE_BUF SCHAR_MAX SCHAR_MIN SHRT_MAX SHRT_MIN + SSIZE_MAX STREAM_MAX TZNAME_MAX UCHAR_MAX UINT_MAX + ULONG_MAX USHRT_MAX _POSIX_ARG_MAX _POSIX_CHILD_MAX + _POSIX_LINK_MAX _POSIX_MAX_CANON _POSIX_MAX_INPUT + _POSIX_NAME_MAX _POSIX_NGROUPS_MAX _POSIX_OPEN_MAX + _POSIX_PATH_MAX _POSIX_PIPE_BUF _POSIX_SSIZE_MAX + _POSIX_STREAM_MAX _POSIX_TZNAME_MAX)], + + locale_h => [qw(LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES + LC_MONETARY LC_NUMERIC LC_TIME NULL + localeconv setlocale)], + + math_h => [qw(HUGE_VAL acos asin atan ceil cosh fabs floor fmod + frexp ldexp log10 modf pow sinh tan tanh)], + + pwd_h => [], + + setjmp_h => [qw(longjmp setjmp siglongjmp sigsetjmp)], + + signal_h => [qw(SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK + SA_RESETHAND SA_RESTART SA_SIGINFO SIGABRT SIGALRM + SIGCHLD SIGCONT SIGFPE SIGHUP SIGILL SIGINT SIGKILL + SIGPIPE SIGQUIT SIGSEGV SIGSTOP SIGTERM SIGTSTP SIGTTIN + SIGTTOU SIGUSR1 SIGUSR2 SIG_BLOCK SIG_DFL SIG_ERR + SIG_IGN SIG_SETMASK SIG_UNBLOCK raise sigaction signal + sigpending sigprocmask sigsuspend)], + + stdarg_h => [], + + stddef_h => [qw(NULL offsetof)], + + stdio_h => [qw(BUFSIZ EOF FILENAME_MAX L_ctermid L_cuserid + L_tmpname NULL SEEK_CUR SEEK_END SEEK_SET + STREAM_MAX TMP_MAX stderr stdin stdout + clearerr fclose fdopen feof ferror fflush fgetc fgetpos + fgets fopen fprintf fputc fputs fread freopen + fscanf fseek fsetpos ftell fwrite getchar gets + perror putc putchar puts remove rewind + scanf setbuf setvbuf sscanf tmpfile tmpnam + ungetc vfprintf vprintf vsprintf)], + + stdlib_h => [qw(EXIT_FAILURE EXIT_SUCCESS MB_CUR_MAX NULL RAND_MAX + abort atexit atof atoi atol bsearch calloc div + free getenv labs ldiv malloc mblen mbstowcs mbtowc + qsort realloc strtod strtol strtoul wcstombs wctomb)], + + string_h => [qw(NULL memchr memcmp memcpy memmove memset strcat + strchr strcmp strcoll strcpy strcspn strerror strlen + strncat strncmp strncpy strpbrk strrchr strspn strstr + strtok strxfrm)], + + sys_stat_h => [qw(S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU + S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG + S_ISUID S_IWGRP S_IWOTH S_IWUSR S_IXGRP S_IXOTH S_IXUSR + fstat mkfifo)], + + sys_times_h => [], + + sys_types_h => [], + + sys_utsname_h => [qw(uname)], + + sys_wait_h => [qw(WEXITSTATUS WIFEXITED WIFSIGNALED WIFSTOPPED + WNOHANG WSTOPSIG WTERMSIG WUNTRACED)], + + termios_h => [qw( B0 B110 B1200 B134 B150 B1800 B19200 B200 B2400 + B300 B38400 B4800 B50 B600 B75 B9600 BRKINT CLOCAL + CREAD CS5 CS6 CS7 CS8 CSIZE CSTOPB ECHO ECHOE ECHOK + ECHONL HUPCL ICANON ICRNL IEXTEN IGNBRK IGNCR IGNPAR + INLCR INPCK ISIG ISTRIP IXOFF IXON NCCS NOFLSH OPOST + PARENB PARMRK PARODD TCIFLUSH TCIOFF TCIOFLUSH TCION + TCOFLUSH TCOOFF TCOON TCSADRAIN TCSAFLUSH TCSANOW + TOSTOP VEOF VEOL VERASE VINTR VKILL VMIN VQUIT VSTART + VSTOP VSUSP VTIME + cfgetispeed cfgetospeed cfsetispeed cfsetospeed tcdrain + tcflow tcflush tcgetattr tcsendbreak tcsetattr )], + + time_h => [qw(CLK_TCK CLOCKS_PER_SEC NULL asctime clock ctime + difftime mktime strftime tzset tzname)], + + unistd_h => [qw(F_OK NULL R_OK SEEK_CUR SEEK_END SEEK_SET + STDERR_FILENO STDIN_FILENO STDOUT_FILENO W_OK X_OK + _PC_CHOWN_RESTRICTED _PC_LINK_MAX _PC_MAX_CANON + _PC_MAX_INPUT _PC_NAME_MAX _PC_NO_TRUNC _PC_PATH_MAX + _PC_PIPE_BUF _PC_VDISABLE _POSIX_CHOWN_RESTRICTED + _POSIX_JOB_CONTROL _POSIX_NO_TRUNC _POSIX_SAVED_IDS + _POSIX_VDISABLE _POSIX_VERSION _SC_ARG_MAX + _SC_CHILD_MAX _SC_CLK_TCK _SC_JOB_CONTROL + _SC_NGROUPS_MAX _SC_OPEN_MAX _SC_PAGESIZE _SC_SAVED_IDS + _SC_STREAM_MAX _SC_TZNAME_MAX _SC_VERSION + _exit access ctermid cuserid + dup2 dup execl execle execlp execv execve execvp + fpathconf fsync getcwd getegid geteuid getgid getgroups + getpid getuid isatty lseek pathconf pause setgid setpgid + setsid setuid sysconf tcgetpgrp tcsetpgrp ttyname)], + + utime_h => [], + +); + +# Exporter::export_tags(); +for (values %EXPORT_TAGS) { + push @EXPORT, @$_; +} + +@EXPORT_OK = qw( + abs + alarm + atan2 + chdir + chmod + chown + close + closedir + cos + exit + exp + fcntl + fileno + fork + getc + getgrgid + getgrnam + getlogin + getpgrp + getppid + getpwnam + getpwuid + gmtime + isatty + kill + lchown + link + localtime + log + mkdir + nice + open + opendir + pipe + printf + rand + read + readdir + rename + rewinddir + rmdir + sin + sleep + sprintf + sqrt + srand + stat + system + time + times + umask + unlink + utime + wait + waitpid + write +); + +require Exporter; +} + +package POSIX::SigAction; + +sub handler { $_[0]->{HANDLER} = $_[1] if @_ > 1; $_[0]->{HANDLER} }; +sub mask { $_[0]->{MASK} = $_[1] if @_ > 1; $_[0]->{MASK} }; +sub flags { $_[0]->{FLAGS} = $_[1] if @_ > 1; $_[0]->{FLAGS} }; +sub safe { $_[0]->{SAFE} = $_[1] if @_ > 1; $_[0]->{SAFE} }; diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Checker.pm b/Master/tlpkg/tlperl.old/lib/Pod/Checker.pm new file mode 100644 index 00000000000..49162da4a27 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Checker.pm @@ -0,0 +1,1270 @@ +############################################################################# +# Pod/Checker.pm -- check pod documents for syntax errors +# +# Copyright (C) 1994-2000 by Bradford Appleton. All rights reserved. +# This file is part of "PodParser". PodParser is free software; +# you can redistribute it and/or modify it under the same terms +# as Perl itself. +############################################################################# + +package Pod::Checker; + +use vars qw($VERSION); +$VERSION = 1.43; ## Current version of this package +require 5.005; ## requires this Perl version or later + +use Pod::ParseUtils; ## for hyperlinks and lists + +=head1 NAME + +Pod::Checker, podchecker() - check pod documents for syntax errors + +=head1 SYNOPSIS + + use Pod::Checker; + + $syntax_okay = podchecker($filepath, $outputpath, %options); + + my $checker = new Pod::Checker %options; + $checker->parse_from_file($filepath, \*STDERR); + +=head1 OPTIONS/ARGUMENTS + +C<$filepath> is the input POD to read and C<$outputpath> is +where to write POD syntax error messages. Either argument may be a scalar +indicating a file-path, or else a reference to an open filehandle. +If unspecified, the input-file it defaults to C<\*STDIN>, and +the output-file defaults to C<\*STDERR>. + +=head2 podchecker() + +This function can take a hash of options: + +=over 4 + +=item B<-warnings> =E<gt> I<val> + +Turn warnings on/off. I<val> is usually 1 for on, but higher values +trigger additional warnings. See L<"Warnings">. + +=back + +=head1 DESCRIPTION + +B<podchecker> will perform syntax checking of Perl5 POD format documentation. + +Curious/ambitious users are welcome to propose additional features they wish +to see in B<Pod::Checker> and B<podchecker> and verify that the checks are +consistent with L<perlpod>. + +The following checks are currently performed: + +=over 4 + +=item * + +Unknown '=xxxx' commands, unknown 'XE<lt>...E<gt>' interior-sequences, +and unterminated interior sequences. + +=item * + +Check for proper balancing of C<=begin> and C<=end>. The contents of such +a block are generally ignored, i.e. no syntax checks are performed. + +=item * + +Check for proper nesting and balancing of C<=over>, C<=item> and C<=back>. + +=item * + +Check for same nested interior-sequences (e.g. +C<LE<lt>...LE<lt>...E<gt>...E<gt>>). + +=item * + +Check for malformed or nonexisting entities C<EE<lt>...E<gt>>. + +=item * + +Check for correct syntax of hyperlinks C<LE<lt>...E<gt>>. See L<perlpod> +for details. + +=item * + +Check for unresolved document-internal links. This check may also reveal +misspelled links that seem to be internal links but should be links +to something else. + +=back + +=head1 DIAGNOSTICS + +=head2 Errors + +=over 4 + +=item * empty =headn + +A heading (C<=head1> or C<=head2>) without any text? That ain't no +heading! + +=item * =over on line I<N> without closing =back + +The C<=over> command does not have a corresponding C<=back> before the +next heading (C<=head1> or C<=head2>) or the end of the file. + +=item * =item without previous =over + +=item * =back without previous =over + +An C<=item> or C<=back> command has been found outside a +C<=over>/C<=back> block. + +=item * No argument for =begin + +A C<=begin> command was found that is not followed by the formatter +specification. + +=item * =end without =begin + +A standalone C<=end> command was found. + +=item * Nested =begin's + +There were at least two consecutive C<=begin> commands without +the corresponding C<=end>. Only one C<=begin> may be active at +a time. + +=item * =for without formatter specification + +There is no specification of the formatter after the C<=for> command. + +=item * unresolved internal link I<NAME> + +The given link to I<NAME> does not have a matching node in the current +POD. This also happend when a single word node name is not enclosed in +C<"">. + +=item * Unknown command "I<CMD>" + +An invalid POD command has been found. Valid are C<=head1>, C<=head2>, +C<=head3>, C<=head4>, C<=over>, C<=item>, C<=back>, C<=begin>, C<=end>, +C<=for>, C<=pod>, C<=cut> + +=item * Unknown interior-sequence "I<SEQ>" + +An invalid markup command has been encountered. Valid are: +C<BE<lt>E<gt>>, C<CE<lt>E<gt>>, C<EE<lt>E<gt>>, C<FE<lt>E<gt>>, +C<IE<lt>E<gt>>, C<LE<lt>E<gt>>, C<SE<lt>E<gt>>, C<XE<lt>E<gt>>, +C<ZE<lt>E<gt>> + +=item * nested commands I<CMD>E<lt>...I<CMD>E<lt>...E<gt>...E<gt> + +Two nested identical markup commands have been found. Generally this +does not make sense. + +=item * garbled entity I<STRING> + +The I<STRING> found cannot be interpreted as a character entity. + +=item * Entity number out of range + +An entity specified by number (dec, hex, oct) is out of range (1-255). + +=item * malformed link LE<lt>E<gt> + +The link found cannot be parsed because it does not conform to the +syntax described in L<perlpod>. + +=item * nonempty ZE<lt>E<gt> + +The C<ZE<lt>E<gt>> sequence is supposed to be empty. + +=item * empty XE<lt>E<gt> + +The index entry specified contains nothing but whitespace. + +=item * Spurious text after =pod / =cut + +The commands C<=pod> and C<=cut> do not take any arguments. + +=item * Spurious character(s) after =back + +The C<=back> command does not take any arguments. + +=back + +=head2 Warnings + +These may not necessarily cause trouble, but indicate mediocre style. + +=over 4 + +=item * multiple occurrence of link target I<name> + +The POD file has some C<=item> and/or C<=head> commands that have +the same text. Potential hyperlinks to such a text cannot be unique then. +This warning is printed only with warning level greater than one. + +=item * line containing nothing but whitespace in paragraph + +There is some whitespace on a seemingly empty line. POD is very sensitive +to such things, so this is flagged. B<vi> users switch on the B<list> +option to avoid this problem. + +=begin _disabled_ + +=item * file does not start with =head + +The file starts with a different POD directive than head. +This is most probably something you do not want. + +=end _disabled_ + +=item * previous =item has no contents + +There is a list C<=item> right above the flagged line that has no +text contents. You probably want to delete empty items. + +=item * preceding non-item paragraph(s) + +A list introduced by C<=over> starts with a text or verbatim paragraph, +but continues with C<=item>s. Move the non-item paragraph out of the +C<=over>/C<=back> block. + +=item * =item type mismatch (I<one> vs. I<two>) + +A list started with e.g. a bulletted C<=item> and continued with a +numbered one. This is obviously inconsistent. For most translators the +type of the I<first> C<=item> determines the type of the list. + +=item * I<N> unescaped C<E<lt>E<gt>> in paragraph + +Angle brackets not written as C<E<lt>ltE<gt>> and C<E<lt>gtE<gt>> +can potentially cause errors as they could be misinterpreted as +markup commands. This is only printed when the -warnings level is +greater than 1. + +=item * Unknown entity + +A character entity was found that does not belong to the standard +ISO set or the POD specials C<verbar> and C<sol>. + +=item * No items in =over + +The list opened with C<=over> does not contain any items. + +=item * No argument for =item + +C<=item> without any parameters is deprecated. It should either be followed +by C<*> to indicate an unordered list, by a number (optionally followed +by a dot) to indicate an ordered (numbered) list or simple text for a +definition list. + +=item * empty section in previous paragraph + +The previous section (introduced by a C<=head> command) does not contain +any text. This usually indicates that something is missing. Note: A +C<=head1> followed immediately by C<=head2> does not trigger this warning. + +=item * Verbatim paragraph in NAME section + +The NAME section (C<=head1 NAME>) should consist of a single paragraph +with the script/module name, followed by a dash `-' and a very short +description of what the thing is good for. + +=item * =headI<n> without preceding higher level + +For example if there is a C<=head2> in the POD file prior to a +C<=head1>. + +=back + +=head2 Hyperlinks + +There are some warnings wrt. malformed hyperlinks. + +=over 4 + +=item * ignoring leading/trailing whitespace in link + +There is whitespace at the beginning or the end of the contents of +LE<lt>...E<gt>. + +=item * (section) in '$page' deprecated + +There is a section detected in the page name of LE<lt>...E<gt>, e.g. +C<LE<lt>passwd(2)E<gt>>. POD hyperlinks may point to POD documents only. +Please write C<CE<lt>passwd(2)E<gt>> instead. Some formatters are able +to expand this to appropriate code. For links to (builtin) functions, +please say C<LE<lt>perlfunc/mkdirE<gt>>, without (). + +=item * alternative text/node '%s' contains non-escaped | or / + +The characters C<|> and C</> are special in the LE<lt>...E<gt> context. +Although the hyperlink parser does its best to determine which "/" is +text and which is a delimiter in case of doubt, one ought to escape +these literal characters like this: + + / E<sol> + | E<verbar> + +=back + +=head1 RETURN VALUE + +B<podchecker> returns the number of POD syntax errors found or -1 if +there were no POD commands at all found in the file. + +=head1 EXAMPLES + +See L</SYNOPSIS> + +=head1 INTERFACE + +While checking, this module collects document properties, e.g. the nodes +for hyperlinks (C<=headX>, C<=item>) and index entries (C<XE<lt>E<gt>>). +POD translators can use this feature to syntax-check and get the nodes in +a first pass before actually starting to convert. This is expensive in terms +of execution time, but allows for very robust conversions. + +Since PodParser-1.24 the B<Pod::Checker> module uses only the B<poderror> +method to print errors and warnings. The summary output (e.g. +"Pod syntax OK") has been dropped from the module and has been included in +B<podchecker> (the script). This allows users of B<Pod::Checker> to +control completely the output behaviour. Users of B<podchecker> (the script) +get the well-known behaviour. + +=cut + +############################################################################# + +use strict; +#use diagnostics; +use Carp; +use Exporter; +use Pod::Parser; + +use vars qw(@ISA @EXPORT); +@ISA = qw(Pod::Parser); +@EXPORT = qw(&podchecker); + +use vars qw(%VALID_COMMANDS %VALID_SEQUENCES); + +my %VALID_COMMANDS = ( + 'pod' => 1, + 'cut' => 1, + 'head1' => 1, + 'head2' => 1, + 'head3' => 1, + 'head4' => 1, + 'over' => 1, + 'back' => 1, + 'item' => 1, + 'for' => 1, + 'begin' => 1, + 'end' => 1, +); + +my %VALID_SEQUENCES = ( + 'I' => 1, + 'B' => 1, + 'S' => 1, + 'C' => 1, + 'L' => 1, + 'F' => 1, + 'X' => 1, + 'Z' => 1, + 'E' => 1, +); + +# stolen from HTML::Entities +my %ENTITIES = ( + # Some normal chars that have special meaning in SGML context + amp => '&', # ampersand +'gt' => '>', # greater than +'lt' => '<', # less than + quot => '"', # double quote + + # PUBLIC ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML + AElig => 'Æ', # capital AE diphthong (ligature) + Aacute => 'Á', # capital A, acute accent + Acirc => 'Â', # capital A, circumflex accent + Agrave => 'À', # capital A, grave accent + Aring => 'Å', # capital A, ring + Atilde => 'Ã', # capital A, tilde + Auml => 'Ä', # capital A, dieresis or umlaut mark + Ccedil => 'Ç', # capital C, cedilla + ETH => 'Ð', # capital Eth, Icelandic + Eacute => 'É', # capital E, acute accent + Ecirc => 'Ê', # capital E, circumflex accent + Egrave => 'È', # capital E, grave accent + Euml => 'Ë', # capital E, dieresis or umlaut mark + Iacute => 'Í', # capital I, acute accent + Icirc => 'Î', # capital I, circumflex accent + Igrave => 'Ì', # capital I, grave accent + Iuml => 'Ï', # capital I, dieresis or umlaut mark + Ntilde => 'Ñ', # capital N, tilde + Oacute => 'Ó', # capital O, acute accent + Ocirc => 'Ô', # capital O, circumflex accent + Ograve => 'Ò', # capital O, grave accent + Oslash => 'Ø', # capital O, slash + Otilde => 'Õ', # capital O, tilde + Ouml => 'Ö', # capital O, dieresis or umlaut mark + THORN => 'Þ', # capital THORN, Icelandic + Uacute => 'Ú', # capital U, acute accent + Ucirc => 'Û', # capital U, circumflex accent + Ugrave => 'Ù', # capital U, grave accent + Uuml => 'Ü', # capital U, dieresis or umlaut mark + Yacute => 'Ý', # capital Y, acute accent + aacute => 'á', # small a, acute accent + acirc => 'â', # small a, circumflex accent + aelig => 'æ', # small ae diphthong (ligature) + agrave => 'à', # small a, grave accent + aring => 'å', # small a, ring + atilde => 'ã', # small a, tilde + auml => 'ä', # small a, dieresis or umlaut mark + ccedil => 'ç', # small c, cedilla + eacute => 'é', # small e, acute accent + ecirc => 'ê', # small e, circumflex accent + egrave => 'è', # small e, grave accent + eth => 'ð', # small eth, Icelandic + euml => 'ë', # small e, dieresis or umlaut mark + iacute => 'í', # small i, acute accent + icirc => 'î', # small i, circumflex accent + igrave => 'ì', # small i, grave accent + iuml => 'ï', # small i, dieresis or umlaut mark + ntilde => 'ñ', # small n, tilde + oacute => 'ó', # small o, acute accent + ocirc => 'ô', # small o, circumflex accent + ograve => 'ò', # small o, grave accent + oslash => 'ø', # small o, slash + otilde => 'õ', # small o, tilde + ouml => 'ö', # small o, dieresis or umlaut mark + szlig => 'ß', # small sharp s, German (sz ligature) + thorn => 'þ', # small thorn, Icelandic + uacute => 'ú', # small u, acute accent + ucirc => 'û', # small u, circumflex accent + ugrave => 'ù', # small u, grave accent + uuml => 'ü', # small u, dieresis or umlaut mark + yacute => 'ý', # small y, acute accent + yuml => 'ÿ', # small y, dieresis or umlaut mark + + # Some extra Latin 1 chars that are listed in the HTML3.2 draft (21-May-96) + copy => '©', # copyright sign + reg => '®', # registered sign + nbsp => "\240", # non breaking space + + # Additional ISO-8859/1 entities listed in rfc1866 (section 14) + iexcl => '¡', + cent => '¢', + pound => '£', + curren => '¤', + yen => '¥', + brvbar => '¦', + sect => '§', + uml => '¨', + ordf => 'ª', + laquo => '«', +'not' => '¬', # not is a keyword in perl + shy => '', + macr => '¯', + deg => '°', + plusmn => '±', + sup1 => '¹', + sup2 => '²', + sup3 => '³', + acute => '´', + micro => 'µ', + para => '¶', + middot => '·', + cedil => '¸', + ordm => 'º', + raquo => '»', + frac14 => '¼', + frac12 => '½', + frac34 => '¾', + iquest => '¿', +'times' => '×', # times is a keyword in perl + divide => '÷', + +# some POD special entities + verbar => '|', + sol => '/' +); + +##--------------------------------------------------------------------------- + +##--------------------------------- +## Function definitions begin here +##--------------------------------- + +sub podchecker( $ ; $ % ) { + my ($infile, $outfile, %options) = @_; + local $_; + + ## Set defaults + $infile ||= \*STDIN; + $outfile ||= \*STDERR; + + ## Now create a pod checker + my $checker = new Pod::Checker(%options); + + ## Now check the pod document for errors + $checker->parse_from_file($infile, $outfile); + + ## Return the number of errors found + return $checker->num_errors(); +} + +##--------------------------------------------------------------------------- + +##------------------------------- +## Method definitions begin here +##------------------------------- + +################################## + +=over 4 + +=item C<Pod::Checker-E<gt>new( %options )> + +Return a reference to a new Pod::Checker object that inherits from +Pod::Parser and is used for calling the required methods later. The +following options are recognized: + +C<-warnings =E<gt> num> + Print warnings if C<num> is true. The higher the value of C<num>, +the more warnings are printed. Currently there are only levels 1 and 2. + +C<-quiet =E<gt> num> + If C<num> is true, do not print any errors/warnings. This is useful +when Pod::Checker is used to munge POD code into plain text from within +POD formatters. + +=cut + +## sub new { +## my $this = shift; +## my $class = ref($this) || $this; +## my %params = @_; +## my $self = {%params}; +## bless $self, $class; +## $self->initialize(); +## return $self; +## } + +sub initialize { + my $self = shift; + ## Initialize number of errors, and setup an error function to + ## increment this number and then print to the designated output. + $self->{_NUM_ERRORS} = 0; + $self->{_NUM_WARNINGS} = 0; + $self->{-quiet} ||= 0; + # set the error handling subroutine + $self->errorsub($self->{-quiet} ? sub { 1; } : 'poderror'); + $self->{_commands} = 0; # total number of POD commands encountered + $self->{_list_stack} = []; # stack for nested lists + $self->{_have_begin} = ''; # stores =begin + $self->{_links} = []; # stack for internal hyperlinks + $self->{_nodes} = []; # stack for =head/=item nodes + $self->{_index} = []; # text in X<> + # print warnings? + $self->{-warnings} = 1 unless(defined $self->{-warnings}); + $self->{_current_head1} = ''; # the current =head1 block + $self->parseopts(-process_cut_cmd => 1, -warnings => $self->{-warnings}); +} + +################################## + +=item C<$checker-E<gt>poderror( @args )> + +=item C<$checker-E<gt>poderror( {%opts}, @args )> + +Internal method for printing errors and warnings. If no options are +given, simply prints "@_". The following options are recognized and used +to form the output: + + -msg + +A message to print prior to C<@args>. + + -line + +The line number the error occurred in. + + -file + +The file (name) the error occurred in. + + -severity + +The error level, should be 'WARNING' or 'ERROR'. + +=cut + +# Invoked as $self->poderror( @args ), or $self->poderror( {%opts}, @args ) +sub poderror { + my $self = shift; + my %opts = (ref $_[0]) ? %{shift()} : (); + + ## Retrieve options + chomp( my $msg = ($opts{-msg} || "")."@_" ); + my $line = (exists $opts{-line}) ? " at line $opts{-line}" : ""; + my $file = (exists $opts{-file}) ? " in file $opts{-file}" : ""; + unless (exists $opts{-severity}) { + ## See if can find severity in message prefix + $opts{-severity} = $1 if ( $msg =~ s/^\**\s*([A-Z]{3,}):\s+// ); + } + my $severity = (exists $opts{-severity}) ? "*** $opts{-severity}: " : ""; + + ## Increment error count and print message " + ++($self->{_NUM_ERRORS}) + if(!%opts || ($opts{-severity} && $opts{-severity} eq 'ERROR')); + ++($self->{_NUM_WARNINGS}) + if(!%opts || ($opts{-severity} && $opts{-severity} eq 'WARNING')); + unless($self->{-quiet}) { + my $out_fh = $self->output_handle() || \*STDERR; + print $out_fh ($severity, $msg, $line, $file, "\n") + if($self->{-warnings} || !%opts || $opts{-severity} ne 'WARNING'); + } +} + +################################## + +=item C<$checker-E<gt>num_errors()> + +Set (if argument specified) and retrieve the number of errors found. + +=cut + +sub num_errors { + return (@_ > 1) ? ($_[0]->{_NUM_ERRORS} = $_[1]) : $_[0]->{_NUM_ERRORS}; +} + +################################## + +=item C<$checker-E<gt>num_warnings()> + +Set (if argument specified) and retrieve the number of warnings found. + +=cut + +sub num_warnings { + return (@_ > 1) ? ($_[0]->{_NUM_WARNINGS} = $_[1]) : $_[0]->{_NUM_WARNINGS}; +} + +################################## + +=item C<$checker-E<gt>name()> + +Set (if argument specified) and retrieve the canonical name of POD as +found in the C<=head1 NAME> section. + +=cut + +sub name { + return (@_ > 1 && $_[1]) ? + ($_[0]->{-name} = $_[1]) : $_[0]->{-name}; +} + +################################## + +=item C<$checker-E<gt>node()> + +Add (if argument specified) and retrieve the nodes (as defined by C<=headX> +and C<=item>) of the current POD. The nodes are returned in the order of +their occurrence. They consist of plain text, each piece of whitespace is +collapsed to a single blank. + +=cut + +sub node { + my ($self,$text) = @_; + if(defined $text) { + $text =~ s/\s+$//s; # strip trailing whitespace + $text =~ s/\s+/ /gs; # collapse whitespace + # add node, order important! + push(@{$self->{_nodes}}, $text); + # keep also a uniqueness counter + $self->{_unique_nodes}->{$text}++ if($text !~ /^\s*$/s); + return $text; + } + @{$self->{_nodes}}; +} + +################################## + +=item C<$checker-E<gt>idx()> + +Add (if argument specified) and retrieve the index entries (as defined by +C<XE<lt>E<gt>>) of the current POD. They consist of plain text, each piece +of whitespace is collapsed to a single blank. + +=cut + +# set/return index entries of current POD +sub idx { + my ($self,$text) = @_; + if(defined $text) { + $text =~ s/\s+$//s; # strip trailing whitespace + $text =~ s/\s+/ /gs; # collapse whitespace + # add node, order important! + push(@{$self->{_index}}, $text); + # keep also a uniqueness counter + $self->{_unique_nodes}->{$text}++ if($text !~ /^\s*$/s); + return $text; + } + @{$self->{_index}}; +} + +################################## + +=item C<$checker-E<gt>hyperlink()> + +Add (if argument specified) and retrieve the hyperlinks (as defined by +C<LE<lt>E<gt>>) of the current POD. They consist of a 2-item array: line +number and C<Pod::Hyperlink> object. + +=back + +=cut + +# set/return hyperlinks of the current POD +sub hyperlink { + my $self = shift; + if($_[0]) { + push(@{$self->{_links}}, $_[0]); + return $_[0]; + } + @{$self->{_links}}; +} + +## overrides for Pod::Parser + +sub end_pod { + ## Do some final checks and + ## print the number of errors found + my $self = shift; + my $infile = $self->input_file(); + + if(@{$self->{_list_stack}}) { + my $list; + while(($list = $self->_close_list('EOF',$infile)) && + $list->indent() ne 'auto') { + $self->poderror({ -line => 'EOF', -file => $infile, + -severity => 'ERROR', -msg => "=over on line " . + $list->start() . " without closing =back" }); #" + } + } + + # check validity of document internal hyperlinks + # first build the node names from the paragraph text + my %nodes; + foreach($self->node()) { + $nodes{$_} = 1; + if(/^(\S+)\s+\S/) { + # we have more than one word. Use the first as a node, too. + # This is used heavily in perlfunc.pod + $nodes{$1} ||= 2; # derived node + } + } + foreach($self->idx()) { + $nodes{$_} = 3; # index node + } + foreach($self->hyperlink()) { + my ($line,$link) = @$_; + # _TODO_ what if there is a link to the page itself by the name, + # e.g. in Tk::Pod : L<Tk::Pod/"DESCRIPTION"> + if($link->node() && !$link->page() && $link->type() ne 'hyperlink') { + my $node = $self->_check_ptree($self->parse_text($link->node(), + $line), $line, $infile, 'L'); + if($node && !$nodes{$node}) { + $self->poderror({ -line => $line || '', -file => $infile, + -severity => 'ERROR', + -msg => "unresolved internal link '$node'"}); + } + } + } + + # check the internal nodes for uniqueness. This pertains to + # =headX, =item and X<...> + if($self->{-warnings} && $self->{-warnings}>1) { + foreach(grep($self->{_unique_nodes}->{$_} > 1, + keys %{$self->{_unique_nodes}})) { + $self->poderror({ -line => '-', -file => $infile, + -severity => 'WARNING', + -msg => "multiple occurrence of link target '$_'"}); + } + } + + # no POD found here + $self->num_errors(-1) if($self->{_commands} == 0); +} + +# check a POD command directive +sub command { + my ($self, $cmd, $paragraph, $line_num, $pod_para) = @_; + my ($file, $line) = $pod_para->file_line; + ## Check the command syntax + my $arg; # this will hold the command argument + if (! $VALID_COMMANDS{$cmd}) { + $self->poderror({ -line => $line, -file => $file, -severity => 'ERROR', + -msg => "Unknown command '$cmd'" }); + } + else { # found a valid command + $self->{_commands}++; # delete this line if below is enabled again + + ##### following check disabled due to strong request + #if(!$self->{_commands}++ && $cmd !~ /^head/) { + # $self->poderror({ -line => $line, -file => $file, + # -severity => 'WARNING', + # -msg => "file does not start with =head" }); + #} + + # check syntax of particular command + if($cmd eq 'over') { + # check for argument + $arg = $self->interpolate_and_check($paragraph, $line,$file); + my $indent = 4; # default + if($arg && $arg =~ /^\s*(\d+)\s*$/) { + $indent = $1; + } + # start a new list + $self->_open_list($indent,$line,$file); + } + elsif($cmd eq 'item') { + # are we in a list? + unless(@{$self->{_list_stack}}) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'ERROR', + -msg => "=item without previous =over" }); + # auto-open in case we encounter many more + $self->_open_list('auto',$line,$file); + } + my $list = $self->{_list_stack}->[0]; + # check whether the previous item had some contents + if(defined $self->{_list_item_contents} && + $self->{_list_item_contents} == 0) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'WARNING', + -msg => "previous =item has no contents" }); + } + if($list->{_has_par}) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'WARNING', + -msg => "preceding non-item paragraph(s)" }); + delete $list->{_has_par}; + } + # check for argument + $arg = $self->interpolate_and_check($paragraph, $line, $file); + if($arg && $arg =~ /(\S+)/) { + $arg =~ s/[\s\n]+$//; + my $type; + if($arg =~ /^[*]\s*(\S*.*)/) { + $type = 'bullet'; + $self->{_list_item_contents} = $1 ? 1 : 0; + $arg = $1; + } + elsif($arg =~ /^\d+\.?\s*(\S*)/) { + $type = 'number'; + $self->{_list_item_contents} = $1 ? 1 : 0; + $arg = $1; + } + else { + $type = 'definition'; + $self->{_list_item_contents} = 1; + } + my $first = $list->type(); + if($first && $first ne $type) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'WARNING', + -msg => "=item type mismatch ('$first' vs. '$type')"}); + } + else { # first item + $list->type($type); + } + } + else { + $self->poderror({ -line => $line, -file => $file, + -severity => 'WARNING', + -msg => "No argument for =item" }); + $arg = ' '; # empty + $self->{_list_item_contents} = 0; + } + # add this item + $list->item($arg); + # remember this node + $self->node($arg); + } + elsif($cmd eq 'back') { + # check if we have an open list + unless(@{$self->{_list_stack}}) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'ERROR', + -msg => "=back without previous =over" }); + } + else { + # check for spurious characters + $arg = $self->interpolate_and_check($paragraph, $line,$file); + if($arg && $arg =~ /\S/) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'ERROR', + -msg => "Spurious character(s) after =back" }); + } + # close list + my $list = $self->_close_list($line,$file); + # check for empty lists + if(!$list->item() && $self->{-warnings}) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'WARNING', + -msg => "No items in =over (at line " . + $list->start() . ") / =back list"}); #" + } + } + } + elsif($cmd =~ /^head(\d+)/) { + my $hnum = $1; + $self->{"_have_head_$hnum"}++; # count head types + if($hnum > 1 && !$self->{"_have_head_".($hnum -1)}) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'WARNING', + -msg => "=head$hnum without preceding higher level"}); + } + # check whether the previous =head section had some contents + if(defined $self->{_commands_in_head} && + $self->{_commands_in_head} == 0 && + defined $self->{_last_head} && + $self->{_last_head} >= $hnum) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'WARNING', + -msg => "empty section in previous paragraph"}); + } + $self->{_commands_in_head} = -1; + $self->{_last_head} = $hnum; + # check if there is an open list + if(@{$self->{_list_stack}}) { + my $list; + while(($list = $self->_close_list($line,$file)) && + $list->indent() ne 'auto') { + $self->poderror({ -line => $line, -file => $file, + -severity => 'ERROR', + -msg => "=over on line ". $list->start() . + " without closing =back (at $cmd)" }); + } + } + # remember this node + $arg = $self->interpolate_and_check($paragraph, $line,$file); + $arg =~ s/[\s\n]+$//s; + $self->node($arg); + unless(length($arg)) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'ERROR', + -msg => "empty =$cmd"}); + } + if($cmd eq 'head1') { + $self->{_current_head1} = $arg; + } else { + $self->{_current_head1} = ''; + } + } + elsif($cmd eq 'begin') { + if($self->{_have_begin}) { + # already have a begin + $self->poderror({ -line => $line, -file => $file, + -severity => 'ERROR', + -msg => "Nested =begin's (first at line " . + $self->{_have_begin} . ")"}); + } + else { + # check for argument + $arg = $self->interpolate_and_check($paragraph, $line,$file); + unless($arg && $arg =~ /(\S+)/) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'ERROR', + -msg => "No argument for =begin"}); + } + # remember the =begin + $self->{_have_begin} = "$line:$1"; + } + } + elsif($cmd eq 'end') { + if($self->{_have_begin}) { + # close the existing =begin + $self->{_have_begin} = ''; + # check for spurious characters + $arg = $self->interpolate_and_check($paragraph, $line,$file); + # the closing argument is optional + #if($arg && $arg =~ /\S/) { + # $self->poderror({ -line => $line, -file => $file, + # -severity => 'WARNING', + # -msg => "Spurious character(s) after =end" }); + #} + } + else { + # don't have a matching =begin + $self->poderror({ -line => $line, -file => $file, + -severity => 'ERROR', + -msg => "=end without =begin" }); + } + } + elsif($cmd eq 'for') { + unless($paragraph =~ /\s*(\S+)\s*/) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'ERROR', + -msg => "=for without formatter specification" }); + } + $arg = ''; # do not expand paragraph below + } + elsif($cmd =~ /^(pod|cut)$/) { + # check for argument + $arg = $self->interpolate_and_check($paragraph, $line,$file); + if($arg && $arg =~ /(\S+)/) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'ERROR', + -msg => "Spurious text after =$cmd"}); + } + } + $self->{_commands_in_head}++; + ## Check the interior sequences in the command-text + $self->interpolate_and_check($paragraph, $line,$file) + unless(defined $arg); + } +} + +sub _open_list +{ + my ($self,$indent,$line,$file) = @_; + my $list = Pod::List->new( + -indent => $indent, + -start => $line, + -file => $file); + unshift(@{$self->{_list_stack}}, $list); + undef $self->{_list_item_contents}; + $list; +} + +sub _close_list +{ + my ($self,$line,$file) = @_; + my $list = shift(@{$self->{_list_stack}}); + if(defined $self->{_list_item_contents} && + $self->{_list_item_contents} == 0) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'WARNING', + -msg => "previous =item has no contents" }); + } + undef $self->{_list_item_contents}; + $list; +} + +# process a block of some text +sub interpolate_and_check { + my ($self, $paragraph, $line, $file) = @_; + ## Check the interior sequences in the command-text + # and return the text + $self->_check_ptree( + $self->parse_text($paragraph,$line), $line, $file, ''); +} + +sub _check_ptree { + my ($self,$ptree,$line,$file,$nestlist) = @_; + local($_); + my $text = ''; + # process each node in the parse tree + foreach(@$ptree) { + # regular text chunk + unless(ref) { + # count the unescaped angle brackets + # complain only when warning level is greater than 1 + if($self->{-warnings} && $self->{-warnings}>1) { + my $count; + if($count = tr/<>/<>/) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'WARNING', + -msg => "$count unescaped <> in paragraph" }); + } + } + $text .= $_; + next; + } + # have an interior sequence + my $cmd = $_->cmd_name(); + my $contents = $_->parse_tree(); + ($file,$line) = $_->file_line(); + # check for valid tag + if (! $VALID_SEQUENCES{$cmd}) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'ERROR', + -msg => qq(Unknown interior-sequence '$cmd')}); + # expand it anyway + $text .= $self->_check_ptree($contents, $line, $file, "$nestlist$cmd"); + next; + } + if($nestlist =~ /$cmd/) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'WARNING', + -msg => "nested commands $cmd<...$cmd<...>...>"}); + # _TODO_ should we add the contents anyway? + # expand it anyway, see below + } + if($cmd eq 'E') { + # preserve entities + if(@$contents > 1 || ref $$contents[0] || $$contents[0] !~ /^\w+$/) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'ERROR', + -msg => "garbled entity " . $_->raw_text()}); + next; + } + my $ent = $$contents[0]; + my $val; + if($ent =~ /^0x[0-9a-f]+$/i) { + # hexadec entity + $val = hex($ent); + } + elsif($ent =~ /^0\d+$/) { + # octal + $val = oct($ent); + } + elsif($ent =~ /^\d+$/) { + # numeric entity + $val = $ent; + } + if(defined $val) { + if($val>0 && $val<256) { + $text .= chr($val); + } + else { + $self->poderror({ -line => $line, -file => $file, + -severity => 'ERROR', + -msg => "Entity number out of range " . $_->raw_text()}); + } + } + elsif($ENTITIES{$ent}) { + # known ISO entity + $text .= $ENTITIES{$ent}; + } + else { + $self->poderror({ -line => $line, -file => $file, + -severity => 'WARNING', + -msg => "Unknown entity " . $_->raw_text()}); + $text .= "E<$ent>"; + } + } + elsif($cmd eq 'L') { + # try to parse the hyperlink + my $link = Pod::Hyperlink->new($contents->raw_text()); + unless(defined $link) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'ERROR', + -msg => "malformed link " . $_->raw_text() ." : $@"}); + next; + } + $link->line($line); # remember line + if($self->{-warnings}) { + foreach my $w ($link->warning()) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'WARNING', + -msg => $w }); + } + } + # check the link text + $text .= $self->_check_ptree($self->parse_text($link->text(), + $line), $line, $file, "$nestlist$cmd"); + # remember link + $self->hyperlink([$line,$link]); + } + elsif($cmd =~ /[BCFIS]/) { + # add the guts + $text .= $self->_check_ptree($contents, $line, $file, "$nestlist$cmd"); + } + elsif($cmd eq 'Z') { + if(length($contents->raw_text())) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'ERROR', + -msg => "Nonempty Z<>"}); + } + } + elsif($cmd eq 'X') { + my $idx = $self->_check_ptree($contents, $line, $file, "$nestlist$cmd"); + if($idx =~ /^\s*$/s) { + $self->poderror({ -line => $line, -file => $file, + -severity => 'ERROR', + -msg => "Empty X<>"}); + } + else { + # remember this node + $self->idx($idx); + } + } + else { + # not reached + die "internal error"; + } + } + $text; +} + +# process a block of verbatim text +sub verbatim { + ## Nothing particular to check + my ($self, $paragraph, $line_num, $pod_para) = @_; + + $self->_preproc_par($paragraph); + + if($self->{_current_head1} eq 'NAME') { + my ($file, $line) = $pod_para->file_line; + $self->poderror({ -line => $line, -file => $file, + -severity => 'WARNING', + -msg => 'Verbatim paragraph in NAME section' }); + } +} + +# process a block of regular text +sub textblock { + my ($self, $paragraph, $line_num, $pod_para) = @_; + my ($file, $line) = $pod_para->file_line; + + $self->_preproc_par($paragraph); + + # skip this paragraph if in a =begin block + unless($self->{_have_begin}) { + my $block = $self->interpolate_and_check($paragraph, $line,$file); + if($self->{_current_head1} eq 'NAME') { + if($block =~ /^\s*(\S+?)\s*[,-]/) { + # this is the canonical name + $self->{-name} = $1 unless(defined $self->{-name}); + } + } + } +} + +sub _preproc_par +{ + my $self = shift; + $_[0] =~ s/[\s\n]+$//; + if($_[0]) { + $self->{_commands_in_head}++; + $self->{_list_item_contents}++ if(defined $self->{_list_item_contents}); + if(@{$self->{_list_stack}} && !$self->{_list_stack}->[0]->item()) { + $self->{_list_stack}->[0]->{_has_par} = 1; + } + } +} + +1; + +__END__ + +=head1 AUTHOR + +Please report bugs using L<http://rt.cpan.org>. + +Brad Appleton E<lt>bradapp@enteract.comE<gt> (initial version), +Marek Rouchal E<lt>marekr@cpan.orgE<gt> + +Based on code for B<Pod::Text::pod2text()> written by +Tom Christiansen E<lt>tchrist@mox.perl.comE<gt> + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Find.pm b/Master/tlpkg/tlperl.old/lib/Pod/Find.pm new file mode 100644 index 00000000000..0b085b8c9e3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Find.pm @@ -0,0 +1,523 @@ +############################################################################# +# Pod/Find.pm -- finds files containing POD documentation +# +# Author: Marek Rouchal <marekr@cpan.org> +# +# Copyright (C) 1999-2000 by Marek Rouchal (and borrowing code +# from Nick Ing-Simmon's PodToHtml). All rights reserved. +# This file is part of "PodParser". Pod::Find is free software; +# you can redistribute it and/or modify it under the same terms +# as Perl itself. +############################################################################# + +package Pod::Find; + +use vars qw($VERSION); +$VERSION = 1.34; ## Current version of this package +require 5.005; ## requires this Perl version or later +use Carp; + +############################################################################# + +=head1 NAME + +Pod::Find - find POD documents in directory trees + +=head1 SYNOPSIS + + use Pod::Find qw(pod_find simplify_name); + my %pods = pod_find({ -verbose => 1, -inc => 1 }); + foreach(keys %pods) { + print "found library POD `$pods{$_}' in $_\n"; + } + + print "podname=",simplify_name('a/b/c/mymodule.pod'),"\n"; + + $location = pod_where( { -inc => 1 }, "Pod::Find" ); + +=head1 DESCRIPTION + +B<Pod::Find> provides a set of functions to locate POD files. Note that +no function is exported by default to avoid pollution of your namespace, +so be sure to specify them in the B<use> statement if you need them: + + use Pod::Find qw(pod_find); + +From this version on the typical SCM (software configuration management) +files/directories like RCS, CVS, SCCS, .svn are ignored. + +=cut + +use strict; +#use diagnostics; +use Exporter; +use File::Spec; +use File::Find; +use Cwd; + +use vars qw(@ISA @EXPORT_OK $VERSION); +@ISA = qw(Exporter); +@EXPORT_OK = qw(&pod_find &simplify_name &pod_where &contains_pod); + +# package global variables +my $SIMPLIFY_RX; + +=head2 C<pod_find( { %opts } , @directories )> + +The function B<pod_find> searches for POD documents in a given set of +files and/or directories. It returns a hash with the file names as keys +and the POD name as value. The POD name is derived from the file name +and its position in the directory tree. + +E.g. when searching in F<$HOME/perl5lib>, the file +F<$HOME/perl5lib/MyModule.pm> would get the POD name I<MyModule>, +whereas F<$HOME/perl5lib/Myclass/Subclass.pm> would be +I<Myclass::Subclass>. The name information can be used for POD +translators. + +Only text files containing at least one valid POD command are found. + +A warning is printed if more than one POD file with the same POD name +is found, e.g. F<CPAN.pm> in different directories. This usually +indicates duplicate occurrences of modules in the I<@INC> search path. + +B<OPTIONS> The first argument for B<pod_find> may be a hash reference +with options. The rest are either directories that are searched +recursively or files. The POD names of files are the plain basenames +with any Perl-like extension (.pm, .pl, .pod) stripped. + +=over 4 + +=item C<-verbose =E<gt> 1> + +Print progress information while scanning. + +=item C<-perl =E<gt> 1> + +Apply Perl-specific heuristics to find the correct PODs. This includes +stripping Perl-like extensions, omitting subdirectories that are numeric +but do I<not> match the current Perl interpreter's version id, suppressing +F<site_perl> as a module hierarchy name etc. + +=item C<-script =E<gt> 1> + +Search for PODs in the current Perl interpreter's installation +B<scriptdir>. This is taken from the local L<Config|Config> module. + +=item C<-inc =E<gt> 1> + +Search for PODs in the current Perl interpreter's I<@INC> paths. This +automatically considers paths specified in the C<PERL5LIB> environment +as this is prepended to I<@INC> by the Perl interpreter itself. + +=back + +=cut + +# return a hash of the POD files found +# first argument may be a hashref (options), +# rest is a list of directories to search recursively +sub pod_find +{ + my %opts; + if(ref $_[0]) { + %opts = %{shift()}; + } + + $opts{-verbose} ||= 0; + $opts{-perl} ||= 0; + + my (@search) = @_; + + if($opts{-script}) { + require Config; + push(@search, $Config::Config{scriptdir}) + if -d $Config::Config{scriptdir}; + $opts{-perl} = 1; + } + + if($opts{-inc}) { + if ($^O eq 'MacOS') { + # tolerate '.', './some_dir' and '(../)+some_dir' on Mac OS + my @new_INC = @INC; + for (@new_INC) { + if ( $_ eq '.' ) { + $_ = ':'; + } elsif ( $_ =~ s|^((?:\.\./)+)|':' x (length($1)/3)|e ) { + $_ = ':'. $_; + } else { + $_ =~ s|^\./|:|; + } + } + push(@search, grep($_ ne File::Spec->curdir, @new_INC)); + } else { + push(@search, grep($_ ne File::Spec->curdir, @INC)); + } + + $opts{-perl} = 1; + } + + if($opts{-perl}) { + require Config; + # this code simplifies the POD name for Perl modules: + # * remove "site_perl" + # * remove e.g. "i586-linux" (from 'archname') + # * remove e.g. 5.00503 + # * remove pod/ if followed by *.pod (e.g. in pod/perlfunc.pod) + + # Mac OS: + # * remove ":?site_perl:" + # * remove :?pod: if followed by *.pod (e.g. in :pod:perlfunc.pod) + + if ($^O eq 'MacOS') { + $SIMPLIFY_RX = + qq!^(?i:\:?site_perl\:|\:?pod\:(?=.*?\\.pod\\z))*!; + } else { + $SIMPLIFY_RX = + qq!^(?i:site(_perl)?/|\Q$Config::Config{archname}\E/|\\d+\\.\\d+([_.]?\\d+)?/|pod/(?=.*?\\.pod\\z))*!; + } + } + + my %dirs_visited; + my %pods; + my %names; + my $pwd = cwd(); + + foreach my $try (@search) { + unless(File::Spec->file_name_is_absolute($try)) { + # make path absolute + $try = File::Spec->catfile($pwd,$try); + } + # simplify path + # on VMS canonpath will vmsify:[the.path], but File::Find::find + # wants /unixy/paths + $try = File::Spec->canonpath($try) if ($^O ne 'VMS'); + $try = VMS::Filespec::unixify($try) if ($^O eq 'VMS'); + my $name; + if(-f $try) { + if($name = _check_and_extract_name($try, $opts{-verbose})) { + _check_for_duplicates($try, $name, \%names, \%pods); + } + next; + } + my $root_rx = $^O eq 'MacOS' ? qq!^\Q$try\E! : qq!^\Q$try\E/!; + File::Find::find( sub { + my $item = $File::Find::name; + if(-d) { + if($item =~ m{/(?:RCS|CVS|SCCS|\.svn)$}) { + $File::Find::prune = 1; + return; + } + elsif($dirs_visited{$item}) { + warn "Directory '$item' already seen, skipping.\n" + if($opts{-verbose}); + $File::Find::prune = 1; + return; + } + else { + $dirs_visited{$item} = 1; + } + if($opts{-perl} && /^(\d+\.[\d_]+)\z/s && eval "$1" != $]) { + $File::Find::prune = 1; + warn "Perl $] version mismatch on $_, skipping.\n" + if($opts{-verbose}); + } + return; + } + if($name = _check_and_extract_name($item, $opts{-verbose}, $root_rx)) { + _check_for_duplicates($item, $name, \%names, \%pods); + } + }, $try); # end of File::Find::find + } + chdir $pwd; + %pods; +} + +sub _check_for_duplicates { + my ($file, $name, $names_ref, $pods_ref) = @_; + if($$names_ref{$name}) { + warn "Duplicate POD found (shadowing?): $name ($file)\n"; + warn " Already seen in ", + join(' ', grep($$pods_ref{$_} eq $name, keys %$pods_ref)),"\n"; + } + else { + $$names_ref{$name} = 1; + } + $$pods_ref{$file} = $name; +} + +sub _check_and_extract_name { + my ($file, $verbose, $root_rx) = @_; + + # check extension or executable flag + # this involves testing the .bat extension on Win32! + unless(-f $file && -T $file && ($file =~ /\.(pod|pm|plx?)\z/i || -x $file )) { + return undef; + } + + return undef unless contains_pod($file,$verbose); + + # strip non-significant path components + # TODO what happens on e.g. Win32? + my $name = $file; + if(defined $root_rx) { + $name =~ s!$root_rx!!s; + $name =~ s!$SIMPLIFY_RX!!os if(defined $SIMPLIFY_RX); + } + else { + if ($^O eq 'MacOS') { + $name =~ s/^.*://s; + } else { + $name =~ s:^.*/::s; + } + } + _simplify($name); + $name =~ s!/+!::!g; #/ + if ($^O eq 'MacOS') { + $name =~ s!:+!::!g; # : -> :: + } else { + $name =~ s!/+!::!g; # / -> :: + } + $name; +} + +=head2 C<simplify_name( $str )> + +The function B<simplify_name> is equivalent to B<basename>, but also +strips Perl-like extensions (.pm, .pl, .pod) and extensions like +F<.bat>, F<.cmd> on Win32 and OS/2, or F<.com> on VMS, respectively. + +=cut + +# basic simplification of the POD name: +# basename & strip extension +sub simplify_name { + my ($str) = @_; + # remove all path components + if ($^O eq 'MacOS') { + $str =~ s/^.*://s; + } else { + $str =~ s:^.*/::s; + } + _simplify($str); + $str; +} + +# internal sub only +sub _simplify { + # strip Perl's own extensions + $_[0] =~ s/\.(pod|pm|plx?)\z//i; + # strip meaningless extensions on Win32 and OS/2 + $_[0] =~ s/\.(bat|exe|cmd)\z//i if($^O =~ /mswin|os2/i); + # strip meaningless extensions on VMS + $_[0] =~ s/\.(com)\z//i if($^O eq 'VMS'); +} + +# contribution from Tim Jenness <t.jenness@jach.hawaii.edu> + +=head2 C<pod_where( { %opts }, $pod )> + +Returns the location of a pod document given a search directory +and a module (e.g. C<File::Find>) or script (e.g. C<perldoc>) name. + +Options: + +=over 4 + +=item C<-inc =E<gt> 1> + +Search @INC for the pod and also the C<scriptdir> defined in the +L<Config|Config> module. + +=item C<-dirs =E<gt> [ $dir1, $dir2, ... ]> + +Reference to an array of search directories. These are searched in order +before looking in C<@INC> (if B<-inc>). Current directory is used if +none are specified. + +=item C<-verbose =E<gt> 1> + +List directories as they are searched + +=back + +Returns the full path of the first occurrence to the file. +Package names (eg 'A::B') are automatically converted to directory +names in the selected directory. (eg on unix 'A::B' is converted to +'A/B'). Additionally, '.pm', '.pl' and '.pod' are appended to the +search automatically if required. + +A subdirectory F<pod/> is also checked if it exists in any of the given +search directories. This ensures that e.g. L<perlfunc|perlfunc> is +found. + +It is assumed that if a module name is supplied, that that name +matches the file name. Pods are not opened to check for the 'NAME' +entry. + +A check is made to make sure that the file that is found does +contain some pod documentation. + +=cut + +sub pod_where { + + # default options + my %options = ( + '-inc' => 0, + '-verbose' => 0, + '-dirs' => [ File::Spec->curdir ], + ); + + # Check for an options hash as first argument + if (defined $_[0] && ref($_[0]) eq 'HASH') { + my $opt = shift; + + # Merge default options with supplied options + %options = (%options, %$opt); + } + + # Check usage + carp 'Usage: pod_where({options}, $pod)' unless (scalar(@_)); + + # Read argument + my $pod = shift; + + # Split on :: and then join the name together using File::Spec + my @parts = split (/::/, $pod); + + # Get full directory list + my @search_dirs = @{ $options{'-dirs'} }; + + if ($options{'-inc'}) { + + require Config; + + # Add @INC + if ($^O eq 'MacOS' && $options{'-inc'}) { + # tolerate '.', './some_dir' and '(../)+some_dir' on Mac OS + my @new_INC = @INC; + for (@new_INC) { + if ( $_ eq '.' ) { + $_ = ':'; + } elsif ( $_ =~ s|^((?:\.\./)+)|':' x (length($1)/3)|e ) { + $_ = ':'. $_; + } else { + $_ =~ s|^\./|:|; + } + } + push (@search_dirs, @new_INC); + } elsif ($options{'-inc'}) { + push (@search_dirs, @INC); + } + + # Add location of pod documentation for perl man pages (eg perlfunc) + # This is a pod directory in the private install tree + #my $perlpoddir = File::Spec->catdir($Config::Config{'installprivlib'}, + # 'pod'); + #push (@search_dirs, $perlpoddir) + # if -d $perlpoddir; + + # Add location of binaries such as pod2text + push (@search_dirs, $Config::Config{'scriptdir'}) + if -d $Config::Config{'scriptdir'}; + } + + warn "Search path is: ".join(' ', @search_dirs)."\n" + if $options{'-verbose'}; + + # Loop over directories + Dir: foreach my $dir ( @search_dirs ) { + + # Don't bother if can't find the directory + if (-d $dir) { + warn "Looking in directory $dir\n" + if $options{'-verbose'}; + + # Now concatenate this directory with the pod we are searching for + my $fullname = File::Spec->catfile($dir, @parts); + warn "Filename is now $fullname\n" + if $options{'-verbose'}; + + # Loop over possible extensions + foreach my $ext ('', '.pod', '.pm', '.pl') { + my $fullext = $fullname . $ext; + if (-f $fullext && + contains_pod($fullext, $options{'-verbose'}) ) { + warn "FOUND: $fullext\n" if $options{'-verbose'}; + return $fullext; + } + } + } else { + warn "Directory $dir does not exist\n" + if $options{'-verbose'}; + next Dir; + } + # for some strange reason the path on MacOS/darwin/cygwin is + # 'pods' not 'pod' + # this could be the case also for other systems that + # have a case-tolerant file system, but File::Spec + # does not recognize 'darwin' yet. And cygwin also has "pods", + # but is not case tolerant. Oh well... + if((File::Spec->case_tolerant || $^O =~ /macos|darwin|cygwin/i) + && -d File::Spec->catdir($dir,'pods')) { + $dir = File::Spec->catdir($dir,'pods'); + redo Dir; + } + if(-d File::Spec->catdir($dir,'pod')) { + $dir = File::Spec->catdir($dir,'pod'); + redo Dir; + } + } + # No match; + return undef; +} + +=head2 C<contains_pod( $file , $verbose )> + +Returns true if the supplied filename (not POD module) contains some pod +information. + +=cut + +sub contains_pod { + my $file = shift; + my $verbose = 0; + $verbose = shift if @_; + + # check for one line of POD + unless(open(POD,"<$file")) { + warn "Error: $file is unreadable: $!\n"; + return undef; + } + + local $/ = undef; + my $pod = <POD>; + close(POD) || die "Error closing $file: $!\n"; + unless($pod =~ /^=(head\d|pod|over|item)\b/m) { + warn "No POD in $file, skipping.\n" + if($verbose); + return 0; + } + + return 1; +} + +=head1 AUTHOR + +Please report bugs using L<http://rt.cpan.org>. + +Marek Rouchal E<lt>marekr@cpan.orgE<gt>, +heavily borrowing code from Nick Ing-Simmons' PodToHtml. + +Tim Jenness E<lt>t.jenness@jach.hawaii.eduE<gt> provided +C<pod_where> and C<contains_pod>. + +=head1 SEE ALSO + +L<Pod::Parser>, L<Pod::Checker>, L<perldoc> + +=cut + +1; + diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Functions.pm b/Master/tlpkg/tlperl.old/lib/Pod/Functions.pm new file mode 100644 index 00000000000..0e250cf0b50 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Functions.pm @@ -0,0 +1,376 @@ +package Pod::Functions; +use strict; + +=head1 NAME + +Pod::Functions - Group Perl's functions a la perlfunc.pod + +=head1 SYNOPSIS + + use Pod::Functions; + + my @misc_ops = @{ $Kinds{ 'Misc' } }; + my $misc_dsc = $Type_Description{ 'Misc' }; + +or + + perl /path/to/lib/Pod/Functions.pm + +This will print a grouped list of Perl's functions, like the +L<perlfunc/"Perl Functions by Category"> section. + +=head1 DESCRIPTION + +It exports the following variables: + +=over 4 + +=item %Kinds + +This holds a hash-of-lists. Each list contains the functions in the category +the key denotes. + +=item %Type + +In this hash each key represents a function and the value is the category. +The category can be a comma separated list. + +=item %Flavor + +In this hash each key represents a function and the value is a short +description of that function. + +=item %Type_Description + +In this hash each key represents a category of functions and the value is +a short description of that category. + +=item @Type_Order + +This list of categories is used to produce the same order as the +L<perlfunc/"Perl Functions by Category"> section. + +=back + +=head1 CHANGES + +1.02 20020813 <abe@ztreet.demon.nl> + de-typo in the SYNOPSIS section (thanks Mike Castle for noticing) + +1.01 20011229 <abe@ztreet.demon.nl> + fixed some bugs that slipped in after 5.6.1 + added the pod + finished making it strict safe + +1.00 ?? + first numbered version + +=cut + +our $VERSION = '1.03'; + +require Exporter; + +our @ISA = qw(Exporter); +our @EXPORT = qw(%Kinds %Type %Flavor %Type_Description @Type_Order); + +our(%Kinds, %Type, %Flavor); + +our %Type_Description = ( + 'ARRAY' => 'Functions for real @ARRAYs', + 'Binary' => 'Functions for fixed length data or records', + 'File' => 'Functions for filehandles, files, or directories', + 'Flow' => 'Keywords related to control flow of your perl program', + 'HASH' => 'Functions for real %HASHes', + 'I/O' => 'Input and output functions', + 'LIST' => 'Functions for list data', + 'Math' => 'Numeric functions', + 'Misc' => 'Miscellaneous functions', + 'Modules' => 'Keywords related to perl modules', + 'Network' => 'Fetching network info', + 'Objects' => 'Keywords related to classes and object-orientedness', + 'Process' => 'Functions for processes and process groups', + 'Regexp' => 'Regular expressions and pattern matching', + 'Socket' => 'Low-level socket functions', + 'String' => 'Functions for SCALARs or strings', + 'SysV' => 'System V interprocess communication functions', + 'Time' => 'Time-related functions', + 'User' => 'Fetching user and group info', + 'Namespace' => 'Keywords altering or affecting scoping of identifiers', +); + +our @Type_Order = qw{ + String + Regexp + Math + ARRAY + LIST + HASH + I/O + Binary + File + Flow + Namespace + Misc + Process + Modules + Objects + Socket + SysV + User + Network + Time +}; + +while (<DATA>) { + chomp; + s/#.*//; + next unless $_; + my($name, $type, $text) = split " ", $_, 3; + $Type{$name} = $type; + $Flavor{$name} = $text; + for my $t ( split /[,\s]+/, $type ) { + push @{$Kinds{$t}}, $name; + } +} + +close DATA; + +my( $typedesc, $list ); +unless (caller) { + foreach my $type ( @Type_Order ) { + $list = join(", ", sort @{$Kinds{$type}}); + $typedesc = $Type_Description{$type} . ":"; + write; + } +} + +format = + +^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + $typedesc +~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + $typedesc + ~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + $list +. + +1; + +__DATA__ +-X File a file test (-r, -x, etc) +abs Math absolute value function +accept Socket accept an incoming socket connect +alarm Process schedule a SIGALRM +atan2 Math arctangent of Y/X in the range -PI to PI +bind Socket binds an address to a socket +binmode I/O prepare binary files for I/O +bless Objects create an object +caller Flow,Namespace get context of the current subroutine call +chdir File change your current working directory +chmod File changes the permissions on a list of files +chomp String remove a trailing record separator from a string +chop String remove the last character from a string +chown File change the owership on a list of files +chr String get character this number represents +chroot File make directory new root for path lookups +close I/O close file (or pipe or socket) handle +closedir I/O close directory handle +connect Socket connect to a remote socket +continue Flow optional trailing block in a while or foreach +cos Math cosine function +crypt String one-way passwd-style encryption +dbmclose Objects,I/O breaks binding on a tied dbm file +dbmopen Objects,I/O create binding on a tied dbm file +defined Misc test whether a value, variable, or function is defined +delete HASH deletes a value from a hash +die I/O,Flow raise an exception or bail out +do Flow,Modules turn a BLOCK into a TERM +dump Misc,Flow create an immediate core dump +each HASH retrieve the next key/value pair from a hash +endgrent User be done using group file +endhostent User be done using hosts file +endnetent User be done using networks file +endprotoent Network be done using protocols file +endpwent User be done using passwd file +endservent Network be done using services file +eof I/O test a filehandle for its end +eval Flow,Misc catch exceptions or compile and run code +exec Process abandon this program to run another +exists HASH test whether a hash key is present +exit Flow terminate this program +exp Math raise I<e> to a power +fcntl File file control system call +fileno I/O return file descriptor from filehandle +flock I/O lock an entire file with an advisory lock +fork Process create a new process just like this one +format I/O declare a picture format with use by the write() function +formline Misc internal function used for formats +getc I/O get the next character from the filehandle +getgrent User get next group record +getgrgid User get group record given group user ID +getgrnam User get group record given group name +gethostbyaddr Network get host record given its address +gethostbyname Network get host record given name +gethostent Network get next hosts record +getlogin User return who logged in at this tty +getnetbyaddr Network get network record given its address +getnetbyname Network get networks record given name +getnetent Network get next networks record +getpeername Socket find the other end of a socket connection +getpgrp Process get process group +getppid Process get parent process ID +getpriority Process get current nice value +getprotobyname Network get protocol record given name +getprotobynumber Network get protocol record numeric protocol +getprotoent Network get next protocols record +getpwent User get next passwd record +getpwnam User get passwd record given user login name +getpwuid User get passwd record given user ID +getservbyname Network get services record given its name +getservbyport Network get services record given numeric port +getservent Network get next services record +getsockname Socket retrieve the sockaddr for a given socket +getsockopt Socket get socket options on a given socket +glob File expand filenames using wildcards +gmtime Time convert UNIX time into record or string using Greenwich time +goto Flow create spaghetti code +grep LIST locate elements in a list test true against a given criterion +hex Math,String convert a string to a hexadecimal number +import Modules,Namespace patch a module's namespace into your own +index String find a substring within a string +int Math get the integer portion of a number +ioctl File system-dependent device control system call +join LIST join a list into a string using a separator +keys HASH retrieve list of indices from a hash +kill Process send a signal to a process or process group +last Flow exit a block prematurely +lc String return lower-case version of a string +lcfirst String return a string with just the next letter in lower case +length String return the number of bytes in a string +link File create a hard link in the filesytem +listen Socket register your socket as a server +local Misc,Namespace create a temporary value for a global variable (dynamic scoping) +localtime Time convert UNIX time into record or string using local time +lock Threads get a thread lock on a variable, subroutine, or method +log Math retrieve the natural logarithm for a number +lstat File stat a symbolic link +m// Regexp match a string with a regular expression pattern +map LIST apply a change to a list to get back a new list with the changes +mkdir File create a directory +msgctl SysV SysV IPC message control operations +msgget SysV get SysV IPC message queue +msgrcv SysV receive a SysV IPC message from a message queue +msgsnd SysV send a SysV IPC message to a message queue +my Misc,Namespace declare and assign a local variable (lexical scoping) +next Flow iterate a block prematurely +no Modules unimport some module symbols or semantics at compile time +package Modules,Objects,Namespace declare a separate global namespace +prototype Flow,Misc get the prototype (if any) of a subroutine +oct String,Math convert a string to an octal number +open File open a file, pipe, or descriptor +opendir File open a directory +ord String find a character's numeric representation +our Misc,Namespace declare and assign a package variable (lexical scoping) +pack Binary,String convert a list into a binary representation +pipe Process open a pair of connected filehandles +pop ARRAY remove the last element from an array and return it +pos Regexp find or set the offset for the last/next m//g search +print I/O output a list to a filehandle +printf I/O output a formatted list to a filehandle +push ARRAY append one or more elements to an array +q/STRING/ String singly quote a string +qq/STRING/ String doubly quote a string +quotemeta Regexp quote regular expression magic characters +qw/STRING/ LIST quote a list of words +qx/STRING/ Process backquote quote a string +qr/STRING/ Regexp Compile pattern +rand Math retrieve the next pseudorandom number +read I/O,Binary fixed-length buffered input from a filehandle +readdir I/O get a directory from a directory handle +readline I/O fetch a record from a file +readlink File determine where a symbolic link is pointing +readpipe Process execute a system command and collect standard output +recv Socket receive a message over a Socket +redo Flow start this loop iteration over again +ref Objects find out the type of thing being referenced +rename File change a filename +require Modules load in external functions from a library at runtime +reset Misc clear all variables of a given name +return Flow get out of a function early +reverse String,LIST flip a string or a list +rewinddir I/O reset directory handle +rindex String right-to-left substring search +rmdir File remove a directory +s/// Regexp replace a pattern with a string +scalar Misc force a scalar context +seek I/O reposition file pointer for random-access I/O +seekdir I/O reposition directory pointer +select I/O reset default output or do I/O multiplexing +semctl SysV SysV semaphore control operations +semget SysV get set of SysV semaphores +semop SysV SysV semaphore operations +send Socket send a message over a socket +setgrent User prepare group file for use +sethostent Network prepare hosts file for use +setnetent Network prepare networks file for use +setpgrp Process set the process group of a process +setpriority Process set a process's nice value +setprotoent Network prepare protocols file for use +setpwent User prepare passwd file for use +setservent Network prepare services file for use +setsockopt Socket set some socket options +shift ARRAY remove the first element of an array, and return it +shmctl SysV SysV shared memory operations +shmget SysV get SysV shared memory segment identifier +shmread SysV read SysV shared memory +shmwrite SysV write SysV shared memory +shutdown Socket close down just half of a socket connection +sin Math return the sine of a number +sleep Process block for some number of seconds +socket Socket create a socket +socketpair Socket create a pair of sockets +sort LIST sort a list of values +splice ARRAY add or remove elements anywhere in an array +split Regexp split up a string using a regexp delimiter +sprintf String formatted print into a string +sqrt Math square root function +srand Math seed the random number generator +stat File get a file's status information +study Regexp optimize input data for repeated searches +sub Flow declare a subroutine, possibly anonymously +substr String get or alter a portion of a stirng +symlink File create a symbolic link to a file +syscall I/O,Binary execute an arbitrary system call +sysopen File open a file, pipe, or descriptor +sysread I/O,Binary fixed-length unbuffered input from a filehandle +sysseek I/O,Binary position I/O pointer on handle used with sysread and syswrite +system Process run a separate program +syswrite I/O,Binary fixed-length unbuffered output to a filehandle +tell I/O get current seekpointer on a filehandle +telldir I/O get current seekpointer on a directory handle +tie Objects bind a variable to an object class +tied Objects get a reference to the object underlying a tied variable +time Time return number of seconds since 1970 +times Process,Time return elapsed time for self and child processes +tr/// String transliterate a string +truncate I/O shorten a file +uc String return upper-case version of a string +ucfirst String return a string with just the next letter in upper case +umask File set file creation mode mask +undef Misc remove a variable or function definition +unlink File remove one link to a file +unpack Binary,LIST convert binary structure into normal perl variables +unshift ARRAY prepend more elements to the beginning of a list +untie Objects break a tie binding to a variable +use Modules,Namespace load a module and import its namespace +use Objects load in a module at compile time +utime File set a file's last access and modify times +values HASH return a list of the values in a hash +vec Binary test or set particular bits in a string +wait Process wait for any child process to die +waitpid Process wait for a particular child process to die +wantarray Misc,Flow get void vs scalar vs list context of current subroutine call +warn I/O print debugging info +write I/O print a picture record +y/// String transliterate a string diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Html.pm b/Master/tlpkg/tlperl.old/lib/Pod/Html.pm new file mode 100644 index 00000000000..4b9752bc6fc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Html.pm @@ -0,0 +1,2123 @@ +package Pod::Html; +use strict; +require Exporter; + +use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); +$VERSION = 1.0504; +@ISA = qw(Exporter); +@EXPORT = qw(pod2html htmlify); +@EXPORT_OK = qw(anchorify); + +use Carp; +use Config; +use Cwd; +use File::Spec; +use File::Spec::Unix; +use Getopt::Long; + +use locale; # make \w work right in non-ASCII lands + +=head1 NAME + +Pod::Html - module to convert pod files to HTML + +=head1 SYNOPSIS + + use Pod::Html; + pod2html([options]); + +=head1 DESCRIPTION + +Converts files from pod format (see L<perlpod>) to HTML format. It +can automatically generate indexes and cross-references, and it keeps +a cache of things it knows how to cross-reference. + +=head1 ARGUMENTS + +Pod::Html takes the following arguments: + +=over 4 + +=item backlink + + --backlink="Back to Top" + +Adds "Back to Top" links in front of every C<head1> heading (except for +the first). By default, no backlinks are generated. + +=item cachedir + + --cachedir=name + +Creates the item and directory caches in the given directory. + +=item css + + --css=stylesheet + +Specify the URL of a cascading style sheet. Also disables all HTML/CSS +C<style> attributes that are output by default (to avoid conflicts). + +=item flush + + --flush + +Flushes the item and directory caches. + +=item header + + --header + --noheader + +Creates header and footer blocks containing the text of the C<NAME> +section. By default, no headers are generated. + +=item help + + --help + +Displays the usage message. + +=item hiddendirs + + --hiddendirs + --nohiddendirs + +Include hidden directories in the search for POD's in podpath if recurse +is set. +The default is not to traverse any directory whose name begins with C<.>. +See L</"podpath"> and L</"recurse">. + +[This option is for backward compatibility only. +It's hard to imagine that one would usefully create a module with a +name component beginning with C<.>.] + +=item htmldir + + --htmldir=name + +Sets the directory in which the resulting HTML file is placed. This +is used to generate relative links to other files. Not passing this +causes all links to be absolute, since this is the value that tells +Pod::Html the root of the documentation tree. + +=item htmlroot + + --htmlroot=name + +Sets the base URL for the HTML files. When cross-references are made, +the HTML root is prepended to the URL. + +=item index + + --index + --noindex + +Generate an index at the top of the HTML file. This is the default +behaviour. + +=item infile + + --infile=name + +Specify the pod file to convert. Input is taken from STDIN if no +infile is specified. + +=item libpods + + --libpods=name:...:name + +List of page names (eg, "perlfunc") which contain linkable C<=item>s. + +=item netscape + + --netscape + --nonetscape + +B<Deprecated>, has no effect. For backwards compatibility only. + +=item outfile + + --outfile=name + +Specify the HTML file to create. Output goes to STDOUT if no outfile +is specified. + +=item podpath + + --podpath=name:...:name + +Specify which subdirectories of the podroot contain pod files whose +HTML converted forms can be linked to in cross references. + +=item podroot + + --podroot=name + +Specify the base directory for finding library pods. + +=item quiet + + --quiet + --noquiet + +Don't display I<mostly harmless> warning messages. These messages +will be displayed by default. But this is not the same as C<verbose> +mode. + +=item recurse + + --recurse + --norecurse + +Recurse into subdirectories specified in podpath (default behaviour). + +=item title + + --title=title + +Specify the title of the resulting HTML file. + +=item verbose + + --verbose + --noverbose + +Display progress messages. By default, they won't be displayed. + +=back + +=head1 EXAMPLE + + pod2html("pod2html", + "--podpath=lib:ext:pod:vms", + "--podroot=/usr/src/perl", + "--htmlroot=/perl/nmanual", + "--libpods=perlfunc:perlguts:perlvar:perlrun:perlop", + "--recurse", + "--infile=foo.pod", + "--outfile=/perl/nmanual/foo.html"); + +=head1 ENVIRONMENT + +Uses C<$Config{pod2html}> to setup default options. + +=head1 AUTHOR + +Tom Christiansen, E<lt>tchrist@perl.comE<gt>. + +=head1 SEE ALSO + +L<perlpod> + +=head1 COPYRIGHT + +This program is distributed under the Artistic License. + +=cut + + +my($Cachedir); +my($Dircache, $Itemcache); +my @Begin_Stack; +my @Libpods; +my($Htmlroot, $Htmldir, $Htmlfile, $Htmlfileurl); +my($Podfile, @Podpath, $Podroot); +my $Css; + +my $Recurse; +my $Quiet; +my $HiddenDirs; +my $Verbose; +my $Doindex; + +my $Backlink; +my($Listlevel, @Listtype); +my $ListNewTerm; +use vars qw($Ignore); # need to localize it later. + +my(%Items_Named, @Items_Seen); +my($Title, $Header); + +my $Top; +my $Paragraph; + +my %Sections; + +# Caches +my %Pages = (); # associative array used to find the location + # of pages referenced by L<> links. +my %Items = (); # associative array used to find the location + # of =item directives referenced by C<> links + +my %Local_Items; +my $Is83; +my $PTQuote; + +my $Curdir = File::Spec->curdir; + +init_globals(); + +sub init_globals { + $Cachedir = "."; # The directory to which item and directory + # caches will be written. + + $Dircache = "pod2htmd.tmp"; + $Itemcache = "pod2htmi.tmp"; + + @Begin_Stack = (); # begin/end stack + + @Libpods = (); # files to search for links from C<> directives + $Htmlroot = "/"; # http-server base directory from which all + # relative paths in $podpath stem. + $Htmldir = ""; # The directory to which the html pages + # will (eventually) be written. + $Htmlfile = ""; # write to stdout by default + $Htmlfileurl = ""; # The url that other files would use to + # refer to this file. This is only used + # to make relative urls that point to + # other files. + + $Podfile = ""; # read from stdin by default + @Podpath = (); # list of directories containing library pods. + $Podroot = $Curdir; # filesystem base directory from which all + # relative paths in $podpath stem. + $Css = ''; # Cascading style sheet + $Recurse = 1; # recurse on subdirectories in $podpath. + $Quiet = 0; # not quiet by default + $Verbose = 0; # not verbose by default + $Doindex = 1; # non-zero if we should generate an index + $Backlink = ''; # text for "back to top" links + $Listlevel = 0; # current list depth + @Listtype = (); # list types for open lists + $ListNewTerm = 0; # indicates new term in definition list; used + # to correctly open/close <dd> tags + $Ignore = 1; # whether or not to format text. we don't + # format text until we hit our first pod + # directive. + + @Items_Seen = (); # for multiples of the same item in perlfunc + %Items_Named = (); + $Header = 0; # produce block header/footer + $Title = ''; # title to give the pod(s) + $Top = 1; # true if we are at the top of the doc. used + # to prevent the first <hr /> directive. + $Paragraph = ''; # which paragraph we're processing (used + # for error messages) + $PTQuote = 0; # status of double-quote conversion + %Sections = (); # sections within this page + + %Local_Items = (); + $Is83 = $^O eq 'dos'; # Is it an 8.3 filesystem? +} + +# +# clean_data: global clean-up of pod data +# +sub clean_data($){ + my( $dataref ) = @_; + for my $i ( 0..$#{$dataref} ) { + ${$dataref}[$i] =~ s/\s+\Z//; + + # have a look for all-space lines + if( ${$dataref}[$i] =~ /^\s+$/m and $dataref->[$i] !~ /^\s/ ){ + my @chunks = split( /^\s+$/m, ${$dataref}[$i] ); + splice( @$dataref, $i, 1, @chunks ); + } + } +} + + +sub pod2html { + local(@ARGV) = @_; + local($/); + local $_; + + init_globals(); + + $Is83 = 0 if (defined (&Dos::UseLFN) && Dos::UseLFN()); + + # cache of %Pages and %Items from last time we ran pod2html + + #undef $opt_help if defined $opt_help; + + # parse the command-line parameters + parse_command_line(); + + # escape the backlink argument (same goes for title but is done later...) + $Backlink = html_escape($Backlink) if defined $Backlink; + + # set some variables to their default values if necessary + local *POD; + unless (@ARGV && $ARGV[0]) { + $Podfile = "-" unless $Podfile; # stdin + open(POD, "<$Podfile") + || die "$0: cannot open $Podfile file for input: $!\n"; + } else { + $Podfile = $ARGV[0]; # XXX: might be more filenames + *POD = *ARGV; + } + $Htmlfile = "-" unless $Htmlfile; # stdout + $Htmlroot = "" if $Htmlroot eq "/"; # so we don't get a // + $Htmldir =~ s#/\z## ; # so we don't get a // + if ( $Htmlroot eq '' + && defined( $Htmldir ) + && $Htmldir ne '' + && substr( $Htmlfile, 0, length( $Htmldir ) ) eq $Htmldir + ) + { + # Set the 'base' url for this file, so that we can use it + # as the location from which to calculate relative links + # to other files. If this is '', then absolute links will + # be used throughout. + $Htmlfileurl= "$Htmldir/" . substr( $Htmlfile, length( $Htmldir ) + 1); + } + + # read the pod a paragraph at a time + warn "Scanning for sections in input file(s)\n" if $Verbose; + $/ = ""; + my @poddata = <POD>; + close(POD); + + # be eol agnostic + for (@poddata) { + if (/\r/) { + if (/\r\n/) { + @poddata = map { s/\r\n/\n/g; + /\n\n/ ? + map { "$_\n\n" } split /\n\n/ : + $_ } @poddata; + } else { + @poddata = map { s/\r/\n/g; + /\n\n/ ? + map { "$_\n\n" } split /\n\n/ : + $_ } @poddata; + } + last; + } + } + + clean_data( \@poddata ); + + # scan the pod for =head[1-6] directives and build an index + my $index = scan_headings(\%Sections, @poddata); + + unless($index) { + warn "No headings in $Podfile\n" if $Verbose; + } + + # open the output file + open(HTML, ">$Htmlfile") + || die "$0: cannot open $Htmlfile file for output: $!\n"; + + # put a title in the HTML file if one wasn't specified + if ($Title eq '') { + TITLE_SEARCH: { + for (my $i = 0; $i < @poddata; $i++) { + if ($poddata[$i] =~ /^=head1\s*NAME\b/m) { + for my $para ( @poddata[$i, $i+1] ) { + last TITLE_SEARCH + if ($Title) = $para =~ /(\S+\s+-+.*\S)/s; + } + } + + } + } + } + if (!$Title and $Podfile =~ /\.pod\z/) { + # probably a split pod so take first =head[12] as title + for (my $i = 0; $i < @poddata; $i++) { + last if ($Title) = $poddata[$i] =~ /^=head[12]\s*(.*)/; + } + warn "adopted '$Title' as title for $Podfile\n" + if $Verbose and $Title; + } + if ($Title) { + $Title =~ s/\s*\(.*\)//; + } else { + warn "$0: no title for $Podfile.\n" unless $Quiet; + $Podfile =~ /^(.*)(\.[^.\/]+)?\z/s; + $Title = ($Podfile eq "-" ? 'No Title' : $1); + warn "using $Title" if $Verbose; + } + $Title = html_escape($Title); + + my $csslink = ''; + my $bodystyle = ' style="background-color: white"'; + my $tdstyle = ' style="background-color: #cccccc"'; + + if ($Css) { + $csslink = qq(\n<link rel="stylesheet" href="$Css" type="text/css" />); + $csslink =~ s,\\,/,g; + $csslink =~ s,(/.):,$1|,; + $bodystyle = ''; + $tdstyle = ''; + } + + my $block = $Header ? <<END_OF_BLOCK : ''; +<table border="0" width="100%" cellspacing="0" cellpadding="3"> +<tr><td class="block"$tdstyle valign="middle"> +<big><strong><span class="block"> $Title</span></strong></big> +</td></tr> +</table> +END_OF_BLOCK + + print HTML <<END_OF_HEAD; +<?xml version="1.0" ?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>$Title</title>$csslink +<meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<link rev="made" href="mailto:$Config{perladmin}" /> +</head> + +<body$bodystyle> +$block +END_OF_HEAD + + # load/reload/validate/cache %Pages and %Items + get_cache($Dircache, $Itemcache, \@Podpath, $Podroot, $Recurse); + + # scan the pod for =item directives + scan_items( \%Local_Items, "", @poddata); + + # put an index at the top of the file. note, if $Doindex is 0 we + # still generate an index, but surround it with an html comment. + # that way some other program can extract it if desired. + $index =~ s/--+/-/g; + print HTML "<p><a name=\"__index__\"></a></p>\n"; + print HTML "<!-- INDEX BEGIN -->\n"; + print HTML "<!--\n" unless $Doindex; + print HTML $index; + print HTML "-->\n" unless $Doindex; + print HTML "<!-- INDEX END -->\n\n"; + print HTML "<hr />\n" if $Doindex and $index; + + # now convert this file + my $after_item; # set to true after an =item + warn "Converting input file $Podfile\n" if $Verbose; + foreach my $i (0..$#poddata){ + $PTQuote = 0; # status of quote conversion + + $_ = $poddata[$i]; + $Paragraph = $i+1; + if (/^(=.*)/s) { # is it a pod directive? + $Ignore = 0; + $after_item = 0; + $_ = $1; + if (/^=begin\s+(\S+)\s*(.*)/si) {# =begin + process_begin($1, $2); + } elsif (/^=end\s+(\S+)\s*(.*)/si) {# =end + process_end($1, $2); + } elsif (/^=cut/) { # =cut + process_cut(); + } elsif (/^=pod/) { # =pod + process_pod(); + } else { + next if @Begin_Stack && $Begin_Stack[-1] ne 'html'; + + if (/^=(head[1-6])\s+(.*\S)/s) { # =head[1-6] heading + process_head( $1, $2, $Doindex && $index ); + } elsif (/^=item\s*(.*\S)?/sm) { # =item text + process_item( $1 ); + $after_item = 1; + } elsif (/^=over\s*(.*)/) { # =over N + process_over(); + } elsif (/^=back/) { # =back + process_back(); + } elsif (/^=for\s+(\S+)\s*(.*)/si) {# =for + process_for($1,$2); + } else { + /^=(\S*)\s*/; + warn "$0: $Podfile: unknown pod directive '$1' in " + . "paragraph $Paragraph. ignoring.\n" unless $Quiet; + } + } + $Top = 0; + } + else { + next if $Ignore; + next if @Begin_Stack && $Begin_Stack[-1] ne 'html'; + print HTML and next if @Begin_Stack && $Begin_Stack[-1] eq 'html'; + my $text = $_; + + # Open tag for definition list as we have something to put in it + if( $ListNewTerm ){ + print HTML "<dd>\n"; + $ListNewTerm = 0; + } + + if( $text =~ /\A\s+/ ){ + process_pre( \$text ); + print HTML "<pre>\n$text</pre>\n"; + + } else { + process_text( \$text ); + + # experimental: check for a paragraph where all lines + # have some ...\t...\t...\n pattern + if( $text =~ /\t/ ){ + my @lines = split( "\n", $text ); + if( @lines > 1 ){ + my $all = 2; + foreach my $line ( @lines ){ + if( $line =~ /\S/ && $line !~ /\t/ ){ + $all--; + last if $all == 0; + } + } + if( $all > 0 ){ + $text =~ s/\t+/<td>/g; + $text =~ s/^/<tr><td>/gm; + $text = '<table cellspacing="0" cellpadding="0">' . + $text . '</table>'; + } + } + } + ## end of experimental + + print HTML "<p>$text</p>\n"; + } + $after_item = 0; + } + } + + # finish off any pending directives + finish_list(); + + # link to page index + print HTML "<p><a href=\"#__index__\"><small>$Backlink</small></a></p>\n" + if $Doindex and $index and $Backlink; + + print HTML <<END_OF_TAIL; +$block +</body> + +</html> +END_OF_TAIL + + # close the html file + close(HTML); + + warn "Finished\n" if $Verbose; +} + +############################################################################## + +sub usage { + my $podfile = shift; + warn "$0: $podfile: @_\n" if @_; + die <<END_OF_USAGE; +Usage: $0 --help --htmlroot=<name> --infile=<name> --outfile=<name> + --podpath=<name>:...:<name> --podroot=<name> + --libpods=<name>:...:<name> --recurse --verbose --index + --netscape --norecurse --noindex --cachedir=<name> + + --backlink - set text for "back to top" links (default: none). + --cachedir - directory for the item and directory cache files. + --css - stylesheet URL + --flush - flushes the item and directory caches. + --[no]header - produce block header/footer (default is no headers). + --help - prints this message. + --hiddendirs - search hidden directories in podpath + --htmldir - directory for resulting HTML files. + --htmlroot - http-server base directory from which all relative paths + in podpath stem (default is /). + --[no]index - generate an index at the top of the resulting html + (default behaviour). + --infile - filename for the pod to convert (input taken from stdin + by default). + --libpods - colon-separated list of pages to search for =item pod + directives in as targets of C<> and implicit links (empty + by default). note, these are not filenames, but rather + page names like those that appear in L<> links. + --outfile - filename for the resulting html file (output sent to + stdout by default). + --podpath - colon-separated list of directories containing library + pods (empty by default). + --podroot - filesystem base directory from which all relative paths + in podpath stem (default is .). + --[no]quiet - suppress some benign warning messages (default is off). + --[no]recurse - recurse on those subdirectories listed in podpath + (default behaviour). + --title - title that will appear in resulting html file. + --[no]verbose - self-explanatory (off by default). + --[no]netscape - deprecated, has no effect. for backwards compatibility only. + +END_OF_USAGE + +} + +sub parse_command_line { + my ($opt_backlink,$opt_cachedir,$opt_css,$opt_flush,$opt_header,$opt_help, + $opt_htmldir,$opt_htmlroot,$opt_index,$opt_infile,$opt_libpods, + $opt_netscape,$opt_outfile,$opt_podpath,$opt_podroot,$opt_quiet, + $opt_recurse,$opt_title,$opt_verbose,$opt_hiddendirs); + + unshift @ARGV, split ' ', $Config{pod2html} if $Config{pod2html}; + my $result = GetOptions( + 'backlink=s' => \$opt_backlink, + 'cachedir=s' => \$opt_cachedir, + 'css=s' => \$opt_css, + 'flush' => \$opt_flush, + 'header!' => \$opt_header, + 'help' => \$opt_help, + 'hiddendirs!'=> \$opt_hiddendirs, + 'htmldir=s' => \$opt_htmldir, + 'htmlroot=s' => \$opt_htmlroot, + 'index!' => \$opt_index, + 'infile=s' => \$opt_infile, + 'libpods=s' => \$opt_libpods, + 'netscape!' => \$opt_netscape, + 'outfile=s' => \$opt_outfile, + 'podpath=s' => \$opt_podpath, + 'podroot=s' => \$opt_podroot, + 'quiet!' => \$opt_quiet, + 'recurse!' => \$opt_recurse, + 'title=s' => \$opt_title, + 'verbose!' => \$opt_verbose, + ); + usage("-", "invalid parameters") if not $result; + + usage("-") if defined $opt_help; # see if the user asked for help + $opt_help = ""; # just to make -w shut-up. + + @Podpath = split(":", $opt_podpath) if defined $opt_podpath; + @Libpods = split(":", $opt_libpods) if defined $opt_libpods; + + $Backlink = $opt_backlink if defined $opt_backlink; + $Cachedir = $opt_cachedir if defined $opt_cachedir; + $Css = $opt_css if defined $opt_css; + $Header = $opt_header if defined $opt_header; + $Htmldir = $opt_htmldir if defined $opt_htmldir; + $Htmlroot = $opt_htmlroot if defined $opt_htmlroot; + $Doindex = $opt_index if defined $opt_index; + $Podfile = $opt_infile if defined $opt_infile; + $HiddenDirs = $opt_hiddendirs if defined $opt_hiddendirs; + $Htmlfile = $opt_outfile if defined $opt_outfile; + $Podroot = $opt_podroot if defined $opt_podroot; + $Quiet = $opt_quiet if defined $opt_quiet; + $Recurse = $opt_recurse if defined $opt_recurse; + $Title = $opt_title if defined $opt_title; + $Verbose = $opt_verbose if defined $opt_verbose; + + warn "Flushing item and directory caches\n" + if $opt_verbose && defined $opt_flush; + $Dircache = "$Cachedir/pod2htmd.tmp"; + $Itemcache = "$Cachedir/pod2htmi.tmp"; + if (defined $opt_flush) { + 1 while unlink($Dircache, $Itemcache); + } +} + + +my $Saved_Cache_Key; + +sub get_cache { + my($dircache, $itemcache, $podpath, $podroot, $recurse) = @_; + my @cache_key_args = @_; + + # A first-level cache: + # Don't bother reading the cache files if they still apply + # and haven't changed since we last read them. + + my $this_cache_key = cache_key(@cache_key_args); + + return if $Saved_Cache_Key and $this_cache_key eq $Saved_Cache_Key; + + # load the cache of %Pages and %Items if possible. $tests will be + # non-zero if successful. + my $tests = 0; + if (-f $dircache && -f $itemcache) { + warn "scanning for item cache\n" if $Verbose; + $tests = load_cache($dircache, $itemcache, $podpath, $podroot); + } + + # if we didn't succeed in loading the cache then we must (re)build + # %Pages and %Items. + if (!$tests) { + warn "scanning directories in pod-path\n" if $Verbose; + scan_podpath($podroot, $recurse, 0); + } + $Saved_Cache_Key = cache_key(@cache_key_args); +} + +sub cache_key { + my($dircache, $itemcache, $podpath, $podroot, $recurse) = @_; + return join('!', $dircache, $itemcache, $recurse, + @$podpath, $podroot, stat($dircache), stat($itemcache)); +} + +# +# load_cache - tries to find if the caches stored in $dircache and $itemcache +# are valid caches of %Pages and %Items. if they are valid then it loads +# them and returns a non-zero value. +# +sub load_cache { + my($dircache, $itemcache, $podpath, $podroot) = @_; + my($tests); + local $_; + + $tests = 0; + + open(CACHE, "<$itemcache") || + die "$0: error opening $itemcache for reading: $!\n"; + $/ = "\n"; + + # is it the same podpath? + $_ = <CACHE>; + chomp($_); + $tests++ if (join(":", @$podpath) eq $_); + + # is it the same podroot? + $_ = <CACHE>; + chomp($_); + $tests++ if ($podroot eq $_); + + # load the cache if its good + if ($tests != 2) { + close(CACHE); + return 0; + } + + warn "loading item cache\n" if $Verbose; + while (<CACHE>) { + /(.*?) (.*)$/; + $Items{$1} = $2; + } + close(CACHE); + + warn "scanning for directory cache\n" if $Verbose; + open(CACHE, "<$dircache") || + die "$0: error opening $dircache for reading: $!\n"; + $/ = "\n"; + $tests = 0; + + # is it the same podpath? + $_ = <CACHE>; + chomp($_); + $tests++ if (join(":", @$podpath) eq $_); + + # is it the same podroot? + $_ = <CACHE>; + chomp($_); + $tests++ if ($podroot eq $_); + + # load the cache if its good + if ($tests != 2) { + close(CACHE); + return 0; + } + + warn "loading directory cache\n" if $Verbose; + while (<CACHE>) { + /(.*?) (.*)$/; + $Pages{$1} = $2; + } + + close(CACHE); + + return 1; +} + +# +# scan_podpath - scans the directories specified in @podpath for directories, +# .pod files, and .pm files. it also scans the pod files specified in +# @Libpods for =item directives. +# +sub scan_podpath { + my($podroot, $recurse, $append) = @_; + my($pwd, $dir); + my($libpod, $dirname, $pod, @files, @poddata); + + unless($append) { + %Items = (); + %Pages = (); + } + + # scan each directory listed in @Podpath + $pwd = getcwd(); + chdir($podroot) + || die "$0: error changing to directory $podroot: $!\n"; + foreach $dir (@Podpath) { + scan_dir($dir, $recurse); + } + + # scan the pods listed in @Libpods for =item directives + foreach $libpod (@Libpods) { + # if the page isn't defined then we won't know where to find it + # on the system. + next unless defined $Pages{$libpod} && $Pages{$libpod}; + + # if there is a directory then use the .pod and .pm files within it. + # NOTE: Only finds the first so-named directory in the tree. +# if ($Pages{$libpod} =~ /([^:]*[^(\.pod|\.pm)]):/) { + if ($Pages{$libpod} =~ /([^:]*(?<!\.pod)(?<!\.pm)):/) { + # find all the .pod and .pm files within the directory + $dirname = $1; + opendir(DIR, $dirname) || + die "$0: error opening directory $dirname: $!\n"; + @files = grep(/(\.pod|\.pm)\z/ && ! -d $_, readdir(DIR)); + closedir(DIR); + + # scan each .pod and .pm file for =item directives + foreach $pod (@files) { + open(POD, "<$dirname/$pod") || + die "$0: error opening $dirname/$pod for input: $!\n"; + @poddata = <POD>; + close(POD); + clean_data( \@poddata ); + + scan_items( \%Items, "$dirname/$pod", @poddata); + } + + # use the names of files as =item directives too. +### Don't think this should be done this way - confuses issues.(WL) +### foreach $pod (@files) { +### $pod =~ /^(.*)(\.pod|\.pm)$/; +### $Items{$1} = "$dirname/$1.html" if $1; +### } + } elsif ($Pages{$libpod} =~ /([^:]*\.pod):/ || + $Pages{$libpod} =~ /([^:]*\.pm):/) { + # scan the .pod or .pm file for =item directives + $pod = $1; + open(POD, "<$pod") || + die "$0: error opening $pod for input: $!\n"; + @poddata = <POD>; + close(POD); + clean_data( \@poddata ); + + scan_items( \%Items, "$pod", @poddata); + } else { + warn "$0: shouldn't be here (line ".__LINE__."\n" unless $Quiet; + } + } + @poddata = (); # clean-up a bit + + chdir($pwd) + || die "$0: error changing to directory $pwd: $!\n"; + + # cache the item list for later use + warn "caching items for later use\n" if $Verbose; + open(CACHE, ">$Itemcache") || + die "$0: error open $Itemcache for writing: $!\n"; + + print CACHE join(":", @Podpath) . "\n$podroot\n"; + foreach my $key (keys %Items) { + print CACHE "$key $Items{$key}\n"; + } + + close(CACHE); + + # cache the directory list for later use + warn "caching directories for later use\n" if $Verbose; + open(CACHE, ">$Dircache") || + die "$0: error open $Dircache for writing: $!\n"; + + print CACHE join(":", @Podpath) . "\n$podroot\n"; + foreach my $key (keys %Pages) { + print CACHE "$key $Pages{$key}\n"; + } + + close(CACHE); +} + +# +# scan_dir - scans the directory specified in $dir for subdirectories, .pod +# files, and .pm files. notes those that it finds. this information will +# be used later in order to figure out where the pages specified in L<> +# links are on the filesystem. +# +sub scan_dir { + my($dir, $recurse) = @_; + my($t, @subdirs, @pods, $pod, $dirname, @dirs); + local $_; + + @subdirs = (); + @pods = (); + + opendir(DIR, $dir) || + die "$0: error opening directory $dir: $!\n"; + while (defined($_ = readdir(DIR))) { + if (-d "$dir/$_" && $_ ne "." && $_ ne ".." + && ($HiddenDirs || !/^\./) + ) { # directory + $Pages{$_} = "" unless defined $Pages{$_}; + $Pages{$_} .= "$dir/$_:"; + push(@subdirs, $_); + } elsif (/\.pod\z/) { # .pod + s/\.pod\z//; + $Pages{$_} = "" unless defined $Pages{$_}; + $Pages{$_} .= "$dir/$_.pod:"; + push(@pods, "$dir/$_.pod"); + } elsif (/\.html\z/) { # .html + s/\.html\z//; + $Pages{$_} = "" unless defined $Pages{$_}; + $Pages{$_} .= "$dir/$_.pod:"; + } elsif (/\.pm\z/) { # .pm + s/\.pm\z//; + $Pages{$_} = "" unless defined $Pages{$_}; + $Pages{$_} .= "$dir/$_.pm:"; + push(@pods, "$dir/$_.pm"); + } elsif (-T "$dir/$_") { # script(?) + local *F; + if (open(F, "$dir/$_")) { + my $line; + while (defined($line = <F>)) { + if ($line =~ /^=(?:pod|head1)/) { + $Pages{$_} = "" unless defined $Pages{$_}; + $Pages{$_} .= "$dir/$_.pod:"; + last; + } + } + close(F); + } + } + } + closedir(DIR); + + # recurse on the subdirectories if necessary + if ($recurse) { + foreach my $subdir (@subdirs) { + scan_dir("$dir/$subdir", $recurse); + } + } +} + +# +# scan_headings - scan a pod file for head[1-6] tags, note the tags, and +# build an index. +# +sub scan_headings { + my($sections, @data) = @_; + my($tag, $which_head, $otitle, $listdepth, $index); + + local $Ignore = 0; + + $listdepth = 0; + $index = ""; + + # scan for =head directives, note their name, and build an index + # pointing to each of them. + foreach my $line (@data) { + if ($line =~ /^=(head)([1-6])\s+(.*)/) { + ($tag, $which_head, $otitle) = ($1,$2,$3); + + my $title = depod( $otitle ); + my $name = anchorify( $title ); + $$sections{$name} = 1; + $title = process_text( \$otitle ); + + while ($which_head != $listdepth) { + if ($which_head > $listdepth) { + $index .= "\n" . ("\t" x $listdepth) . "<ul>\n"; + $listdepth++; + } elsif ($which_head < $listdepth) { + $listdepth--; + $index .= "\n" . ("\t" x $listdepth) . "</ul>\n"; + } + } + + $index .= "\n" . ("\t" x $listdepth) . "<li>" . + "<a href=\"#" . $name . "\">" . + $title . "</a></li>"; + } + } + + # finish off the lists + while ($listdepth--) { + $index .= "\n" . ("\t" x $listdepth) . "</ul>\n"; + } + + # get rid of bogus lists + $index =~ s,\t*<ul>\s*</ul>\n,,g; + + return $index; +} + +# +# scan_items - scans the pod specified by $pod for =item directives. we +# will use this information later on in resolving C<> links. +# +sub scan_items { + my( $itemref, $pod, @poddata ) = @_; + my($i, $item); + local $_; + + $pod =~ s/\.pod\z//; + $pod .= ".html" if $pod; + + foreach $i (0..$#poddata) { + my $txt = depod( $poddata[$i] ); + + # figure out what kind of item it is. + # Build string for referencing this item. + if ( $txt =~ /\A=item\s+\*\s*(.*)\Z/s ) { # bulleted list + next unless $1; + $item = $1; + } elsif( $txt =~ /\A=item\s+(?>\d+\.?)\s*(.*)\Z/s ) { # numbered list + $item = $1; + } elsif( $txt =~ /\A=item\s+(.*)\Z/s ) { # definition list + $item = $1; + } else { + next; + } + my $fid = fragment_id( $item ); + $$itemref{$fid} = "$pod" if $fid; + } +} + +# +# process_head - convert a pod head[1-6] tag and convert it to HTML format. +# +sub process_head { + my($tag, $heading, $hasindex) = @_; + + # figure out the level of the =head + $tag =~ /head([1-6])/; + my $level = $1; + + finish_list(); + + print HTML "<p>\n"; + if( $level == 1 && ! $Top ){ + print HTML "<a href=\"#__index__\"><small>$Backlink</small></a>\n" + if $hasindex and $Backlink; + print HTML "</p>\n<hr />\n" + } else { + print HTML "</p>\n"; + } + + my $name = anchorify( depod( $heading ) ); + my $convert = process_text( \$heading ); + print HTML "<h$level><a name=\"$name\">$convert</a></h$level>\n"; +} + + +# +# emit_item_tag - print an =item's text +# Note: The global $EmittedItem is used for inhibiting self-references. +# +my $EmittedItem; + +sub emit_item_tag($$$){ + my( $otext, $text, $compact ) = @_; + my $item = fragment_id( $text ); + + $EmittedItem = $item; + ### print STDERR "emit_item_tag=$item ($text)\n"; + + print HTML '<strong>'; + if ($Items_Named{$item}++) { + print HTML process_text( \$otext ); + } else { + my $name = 'item_' . $item; + $name = anchorify($name); + print HTML qq{<a name="$name">}, process_text( \$otext ), '</a>'; + } + print HTML "</strong>"; + undef( $EmittedItem ); +} + +sub new_listitem { + my( $tag ) = @_; + # Open tag for definition list as we have something to put in it + if( ($tag ne 'dl') && ($ListNewTerm) ){ + print HTML "<dd>\n"; + $ListNewTerm = 0; + } + + if( $Items_Seen[$Listlevel]++ == 0 ){ + # start of new list + push( @Listtype, "$tag" ); + print HTML "<$tag>\n"; + } else { + # if this is not the first item, close the previous one + if ( $tag eq 'dl' ){ + print HTML "</dd>\n" unless $ListNewTerm; + } else { + print HTML "</li>\n"; + } + } + my $opentag = $tag eq 'dl' ? 'dt' : 'li'; + print HTML "<$opentag>"; +} + +# +# process_item - convert a pod item tag and convert it to HTML format. +# +sub process_item { + my( $otext ) = @_; + + # lots of documents start a list without doing an =over. this is + # bad! but, the proper thing to do seems to be to just assume + # they did do an =over. so warn them once and then continue. + if( $Listlevel == 0 ){ + warn "$0: $Podfile: unexpected =item directive in paragraph $Paragraph. ignoring.\n" unless $Quiet; + process_over(); + } + + # remove formatting instructions from the text + my $text = depod( $otext ); + + # all the list variants: + if( $text =~ /\A\*/ ){ # bullet + new_listitem( 'ul' ); + if ($text =~ /\A\*\s+(.+)\Z/s ) { # with additional text + my $tag = $1; + $otext =~ s/\A\*\s+//; + emit_item_tag( $otext, $tag, 1 ); + print HTML "\n"; + } + + } elsif( $text =~ /\A\d+/ ){ # numbered list + new_listitem( 'ol' ); + if ($text =~ /\A(?>\d+\.?)\s*(.+)\Z/s ) { # with additional text + my $tag = $1; + $otext =~ s/\A\d+\.?\s*//; + emit_item_tag( $otext, $tag, 1 ); + print HTML "\n"; + } + + } else { # definition list + # new_listitem takes care of opening the <dt> tag + new_listitem( 'dl' ); + if( $text =~ /\A(.+)\Z/s ){ # should have text + emit_item_tag( $otext, $text, 1 ); + } else { + warn "$0: $Podfile: no term text provided for definition list in paragraph $Paragraph. ignoring.\n" unless $Quiet; + } + # write the definition term and close <dt> tag + print HTML "</dt>\n"; + # trigger opening a <dd> tag for the actual definition; will not + # happen if next paragraph is also a definition term (=item) + $ListNewTerm = 1; + } + print HTML "\n"; +} + +# +# process_over - process a pod over tag and start a corresponding HTML list. +# +sub process_over { + # start a new list + $Listlevel++; + push( @Items_Seen, 0 ); +} + +# +# process_back - process a pod back tag and convert it to HTML format. +# +sub process_back { + if( $Listlevel == 0 ){ + warn "$0: $Podfile: unexpected =back directive in paragraph $Paragraph. ignoring.\n" unless $Quiet; + return; + } + + # close off the list. note, I check to see if $Listtype[$Listlevel] is + # defined because an =item directive may have never appeared and thus + # $Listtype[$Listlevel] may have never been initialized. + $Listlevel--; + if( defined $Listtype[$Listlevel] ){ + if ( $Listtype[$Listlevel] eq 'dl' ){ + print HTML "</dd>\n" unless $ListNewTerm; + } else { + print HTML "</li>\n"; + } + print HTML "</$Listtype[$Listlevel]>\n"; + pop( @Listtype ); + $ListNewTerm = 0; + } + + # clean up item count + pop( @Items_Seen ); +} + +# +# process_cut - process a pod cut tag, thus start ignoring pod directives. +# +sub process_cut { + $Ignore = 1; +} + +# +# process_pod - process a pod tag, thus stop ignoring pod directives +# until we see a corresponding cut. +# +sub process_pod { + # no need to set $Ignore to 0 cause the main loop did it +} + +# +# process_for - process a =for pod tag. if it's for html, spit +# it out verbatim, if illustration, center it, otherwise ignore it. +# +sub process_for { + my($whom, $text) = @_; + if ( $whom =~ /^(pod2)?html$/i) { + print HTML $text; + } elsif ($whom =~ /^illustration$/i) { + 1 while chomp $text; + for my $ext (qw[.png .gif .jpeg .jpg .tga .pcl .bmp]) { + $text .= $ext, last if -r "$text$ext"; + } + print HTML qq{<p align="center"><img src="$text" alt="$text illustration" /></p>}; + } +} + +# +# process_begin - process a =begin pod tag. this pushes +# whom we're beginning on the begin stack. if there's a +# begin stack, we only print if it us. +# +sub process_begin { + my($whom, $text) = @_; + $whom = lc($whom); + push (@Begin_Stack, $whom); + if ( $whom =~ /^(pod2)?html$/) { + print HTML $text if $text; + } +} + +# +# process_end - process a =end pod tag. pop the +# begin stack. die if we're mismatched. +# +sub process_end { + my($whom, $text) = @_; + $whom = lc($whom); + if ($Begin_Stack[-1] ne $whom ) { + die "Unmatched begin/end at chunk $Paragraph\n" + } + pop( @Begin_Stack ); +} + +# +# process_pre - indented paragraph, made into <pre></pre> +# +sub process_pre { + my( $text ) = @_; + my( $rest ); + return if $Ignore; + + $rest = $$text; + + # insert spaces in place of tabs + $rest =~ s#(.+)# + my $line = $1; + 1 while $line =~ s/(\t+)/' ' x ((length($1) * 8) - $-[0] % 8)/e; + $line; + #eg; + + # convert some special chars to HTML escapes + $rest = html_escape($rest); + + # try and create links for all occurrences of perl.* within + # the preformatted text. + $rest =~ s{ + (\s*)(perl\w+) + }{ + if ( defined $Pages{$2} ){ # is a link + qq($1<a href="$Htmlroot/$Pages{$2}">$2</a>); + } elsif (defined $Pages{dosify($2)}) { # is a link + qq($1<a href="$Htmlroot/$Pages{dosify($2)}">$2</a>); + } else { + "$1$2"; + } + }xeg; + $rest =~ s{ + (<a\ href="?) ([^>:]*:)? ([^>:]*) \.pod: ([^>:]*:)? + }{ + my $url ; + if ( $Htmlfileurl ne '' ){ + # Here, we take advantage of the knowledge + # that $Htmlfileurl ne '' implies $Htmlroot eq ''. + # Since $Htmlroot eq '', we need to prepend $Htmldir + # on the fron of the link to get the absolute path + # of the link's target. We check for a leading '/' + # to avoid corrupting links that are #, file:, etc. + my $old_url = $3 ; + $old_url = "$Htmldir$old_url" if $old_url =~ m{^\/}; + $url = relativize_url( "$old_url.html", $Htmlfileurl ); + } else { + $url = "$3.html" ; + } + "$1$url" ; + }xeg; + + # Look for embedded URLs and make them into links. We don't + # relativize them since they are best left as the author intended. + + my $urls = '(' . join ('|', qw{ + http + telnet + mailto + news + gopher + file + wais + ftp + } ) + . ')'; + + my $ltrs = '\w'; + my $gunk = '/#~:.?+=&%@!\-'; + my $punc = '.:!?\-;'; + my $any = "${ltrs}${gunk}${punc}"; + + $rest =~ s{ + \b # start at word boundary + ( # begin $1 { + $urls : # need resource and a colon + (?!:) # Ignore File::, among others. + [$any] +? # followed by one or more of any valid + # character, but be conservative and + # take only what you need to.... + ) # end $1 } + (?= + " > # maybe pre-quoted '<a href="...">' + | # or: + [$punc]* # 0 or more punctuation + (?: # followed + [^$any] # by a non-url char + | # or + $ # end of the string + ) # + | # or else + $ # then end of the string + ) + }{<a href="$1">$1</a>}igox; + + # text should be as it is (verbatim) + $$text = $rest; +} + + +# +# pure text processing +# +# pure_text/inIS_text: differ with respect to automatic C<> recognition. +# we don't want this to happen within IS +# +sub pure_text($){ + my $text = shift(); + process_puretext( $text, \$PTQuote, 1 ); +} + +sub inIS_text($){ + my $text = shift(); + process_puretext( $text, \$PTQuote, 0 ); +} + +# +# process_puretext - process pure text (without pod-escapes) converting +# double-quotes and handling implicit C<> links. +# +sub process_puretext { + my($text, $quote, $notinIS) = @_; + + ## Guessing at func() or [\$\@%&]*var references in plain text is destined + ## to produce some strange looking ref's. uncomment to disable: + ## $notinIS = 0; + + my(@words, $lead, $trail); + + # convert double-quotes to single-quotes + if( $$quote && $text =~ s/"/''/s ){ + $$quote = 0; + } + while ($text =~ s/"([^"]*)"/``$1''/sg) {}; + $$quote = 1 if $text =~ s/"/``/s; + + # keep track of leading and trailing white-space + $lead = ($text =~ s/\A(\s+)//s ? $1 : ""); + $trail = ($text =~ s/(\s+)\Z//s ? $1 : ""); + + # split at space/non-space boundaries + @words = split( /(?<=\s)(?=\S)|(?<=\S)(?=\s)/, $text ); + + # process each word individually + foreach my $word (@words) { + # skip space runs + next if $word =~ /^\s*$/; + # see if we can infer a link + if( $notinIS && $word =~ /^(\w+)\((.*)\)$/ ) { + # has parenthesis so should have been a C<> ref + ## try for a pagename (perlXXX(1))? + my( $func, $args ) = ( $1, $2 ); + if( $args =~ /^\d+$/ ){ + my $url = page_sect( $word, '' ); + if( defined $url ){ + $word = "<a href=\"$url\">the $word manpage</a>"; + next; + } + } + ## try function name for a link, append tt'ed argument list + $word = emit_C( $func, '', "($args)"); + +#### disabled. either all (including $\W, $\w+{.*} etc.) or nothing. +## } elsif( $notinIS && $word =~ /^[\$\@%&*]+\w+$/) { +## # perl variables, should be a C<> ref +## $word = emit_C( $word ); + + } elsif ($word =~ m,^\w+://\w,) { + # looks like a URL + # Don't relativize it: leave it as the author intended + $word = qq(<a href="$word">$word</a>); + } elsif ($word =~ /[\w.-]+\@[\w-]+\.\w/) { + # looks like an e-mail address + my ($w1, $w2, $w3) = ("", $word, ""); + ($w1, $w2, $w3) = ("(", $1, ")$2") if $word =~ /^\((.*?)\)(,?)/; + ($w1, $w2, $w3) = ("<", $1, ">$2") if $word =~ /^<(.*?)>(,?)/; + $word = qq($w1<a href="mailto:$w2">$w2</a>$w3); + } else { + $word = html_escape($word) if $word =~ /["&<>]/; + } + } + + # put everything back together + return $lead . join( '', @words ) . $trail; +} + + +# +# process_text - handles plaintext that appears in the input pod file. +# there may be pod commands embedded within the text so those must be +# converted to html commands. +# + +sub process_text1($$;$$); +sub pattern ($) { $_[0] ? '[^\S\n]+'.('>' x ($_[0] + 1)) : '>' } +sub closing ($) { local($_) = shift; (defined && s/\s+$//) ? length : 0 } + +sub process_text { + return if $Ignore; + my( $tref ) = @_; + my $res = process_text1( 0, $tref ); + $$tref = $res; +} + +sub process_text1($$;$$){ + my( $lev, $rstr, $func, $closing ) = @_; + my $res = ''; + + unless (defined $func) { + $func = ''; + $lev++; + } + + if( $func eq 'B' ){ + # B<text> - boldface + $res = '<strong>' . process_text1( $lev, $rstr ) . '</strong>'; + + } elsif( $func eq 'C' ){ + # C<code> - can be a ref or <code></code> + # need to extract text + my $par = go_ahead( $rstr, 'C', $closing ); + + ## clean-up of the link target + my $text = depod( $par ); + + ### my $x = $par =~ /[BI]</ ? 'yes' : 'no' ; + ### print STDERR "-->call emit_C($par) lev=$lev, par with BI=$x\n"; + + $res = emit_C( $text, $lev > 1 || ($par =~ /[BI]</) ); + + } elsif( $func eq 'E' ){ + # E<x> - convert to character + $$rstr =~ s/^([^>]*)>//; + my $escape = $1; + $escape =~ s/^(\d+|X[\dA-F]+)$/#$1/i; + $res = "&$escape;"; + + } elsif( $func eq 'F' ){ + # F<filename> - italizice + $res = '<em>' . process_text1( $lev, $rstr ) . '</em>'; + + } elsif( $func eq 'I' ){ + # I<text> - italizice + $res = '<em>' . process_text1( $lev, $rstr ) . '</em>'; + + } elsif( $func eq 'L' ){ + # L<link> - link + ## L<text|cross-ref> => produce text, use cross-ref for linking + ## L<cross-ref> => make text from cross-ref + ## need to extract text + my $par = go_ahead( $rstr, 'L', $closing ); + + # some L<>'s that shouldn't be: + # a) full-blown URL's are emitted as-is + if( $par =~ m{^\w+://}s ){ + return make_URL_href( $par ); + } + # b) C<...> is stripped and treated as C<> + if( $par =~ /^C<(.*)>$/ ){ + my $text = depod( $1 ); + return emit_C( $text, $lev > 1 || ($par =~ /[BI]</) ); + } + + # analyze the contents + $par =~ s/\n/ /g; # undo word-wrapped tags + my $opar = $par; + my $linktext; + if( $par =~ s{^([^|]+)\|}{} ){ + $linktext = $1; + } + + # make sure sections start with a / + $par =~ s{^"}{/"}; + + my( $page, $section, $ident ); + + # check for link patterns + if( $par =~ m{^([^/]+?)/(?!")(.*?)$} ){ # name/ident + # we've got a name/ident (no quotes) + ( $page, $ident ) = ( $1, $2 ); + ### print STDERR "--> L<$par> to page $page, ident $ident\n"; + + } elsif( $par =~ m{^(.*?)/"?(.*?)"?$} ){ # [name]/"section" + # even though this should be a "section", we go for ident first + ( $page, $ident ) = ( $1, $2 ); + ### print STDERR "--> L<$par> to page $page, section $section\n"; + + } elsif( $par =~ /\s/ ){ # this must be a section with missing quotes + ( $page, $section ) = ( '', $par ); + ### print STDERR "--> L<$par> to void page, section $section\n"; + + } else { + ( $page, $section ) = ( $par, '' ); + ### print STDERR "--> L<$par> to page $par, void section\n"; + } + + # now, either $section or $ident is defined. the convoluted logic + # below tries to resolve L<> according to what the user specified. + # failing this, we try to find the next best thing... + my( $url, $ltext, $fid ); + + RESOLVE: { + if( defined $ident ){ + ## try to resolve $ident as an item + ( $url, $fid ) = coderef( $page, $ident ); + if( $url ){ + if( ! defined( $linktext ) ){ + $linktext = $ident; + $linktext .= " in " if $ident && $page; + $linktext .= "the $page manpage" if $page; + } + ### print STDERR "got coderef url=$url\n"; + last RESOLVE; + } + ## no luck: go for a section (auto-quoting!) + $section = $ident; + } + ## now go for a section + my $htmlsection = htmlify( $section ); + $url = page_sect( $page, $htmlsection ); + if( $url ){ + if( ! defined( $linktext ) ){ + $linktext = $section; + $linktext .= " in " if $section && $page; + $linktext .= "the $page manpage" if $page; + } + ### print STDERR "got page/section url=$url\n"; + last RESOLVE; + } + ## no luck: go for an ident + if( $section ){ + $ident = $section; + } else { + $ident = $page; + $page = undef(); + } + ( $url, $fid ) = coderef( $page, $ident ); + if( $url ){ + if( ! defined( $linktext ) ){ + $linktext = $ident; + $linktext .= " in " if $ident && $page; + $linktext .= "the $page manpage" if $page; + } + ### print STDERR "got section=>coderef url=$url\n"; + last RESOLVE; + } + + # warning; show some text. + $linktext = $opar unless defined $linktext; + warn "$0: $Podfile: cannot resolve L<$opar> in paragraph $Paragraph.\n" unless $Quiet; + } + + # now we have a URL or just plain code + $$rstr = $linktext . '>' . $$rstr; + if( defined( $url ) ){ + $res = "<a href=\"$url\">" . process_text1( $lev, $rstr ) . '</a>'; + } else { + $res = '<em>' . process_text1( $lev, $rstr ) . '</em>'; + } + + } elsif( $func eq 'S' ){ + # S<text> - non-breaking spaces + $res = process_text1( $lev, $rstr ); + $res =~ s/ / /g; + + } elsif( $func eq 'X' ){ + # X<> - ignore + $$rstr =~ s/^[^>]*>//; + + } elsif( $func eq 'Z' ){ + # Z<> - empty + warn "$0: $Podfile: invalid X<> in paragraph $Paragraph.\n" + unless $$rstr =~ s/^>// or $Quiet; + + } else { + my $term = pattern $closing; + while( $$rstr =~ s/\A(.*?)(([BCEFILSXZ])<(<+[^\S\n]+)?|$term)//s ){ + # all others: either recurse into new function or + # terminate at closing angle bracket(s) + my $pt = $1; + $pt .= $2 if !$3 && $lev == 1; + $res .= $lev == 1 ? pure_text( $pt ) : inIS_text( $pt ); + return $res if !$3 && $lev > 1; + if( $3 ){ + $res .= process_text1( $lev, $rstr, $3, closing $4 ); + } + } + if( $lev == 1 ){ + $res .= pure_text( $$rstr ); + } else { + warn "$0: $Podfile: undelimited $func<> in paragraph $Paragraph.\n" unless $Quiet; + } + } + return $res; +} + +# +# go_ahead: extract text of an IS (can be nested) +# +sub go_ahead($$$){ + my( $rstr, $func, $closing ) = @_; + my $res = ''; + my @closing = ($closing); + while( $$rstr =~ + s/\A(.*?)(([BCEFILSXZ])<(<+[^\S\n]+)?|@{[pattern $closing[0]]})//s ){ + $res .= $1; + unless( $3 ){ + shift @closing; + return $res unless @closing; + } else { + unshift @closing, closing $4; + } + $res .= $2; + } + warn "$0: $Podfile: undelimited $func<> in paragraph $Paragraph.\n" unless $Quiet; + return $res; +} + +# +# emit_C - output result of C<text> +# $text is the depod-ed text +# +sub emit_C($;$$){ + my( $text, $nocode, $args ) = @_; + $args = '' unless defined $args; + my $res; + my( $url, $fid ) = coderef( undef(), $text ); + + # need HTML-safe text + my $linktext = html_escape( "$text$args" ); + + if( defined( $url ) && + (!defined( $EmittedItem ) || $EmittedItem ne $fid ) ){ + $res = "<a href=\"$url\"><code>$linktext</code></a>"; + } elsif( 0 && $nocode ){ + $res = $linktext; + } else { + $res = "<code>$linktext</code>"; + } + return $res; +} + +# +# html_escape: make text safe for HTML +# +sub html_escape { + my $rest = $_[0]; + $rest =~ s/&/&/g; + $rest =~ s/</</g; + $rest =~ s/>/>/g; + $rest =~ s/"/"/g; + # ' is only in XHTML, not HTML4. Be conservative + #$rest =~ s/'/'/g; + return $rest; +} + + +# +# dosify - convert filenames to 8.3 +# +sub dosify { + my($str) = @_; + return lc($str) if $^O eq 'VMS'; # VMS just needs casing + if ($Is83) { + $str = lc $str; + $str =~ s/(\.\w+)/substr ($1,0,4)/ge; + $str =~ s/(\w+)/substr ($1,0,8)/ge; + } + return $str; +} + +# +# page_sect - make a URL from the text of a L<> +# +sub page_sect($$) { + my( $page, $section ) = @_; + my( $linktext, $page83, $link); # work strings + + # check if we know that this is a section in this page + if (!defined $Pages{$page} && defined $Sections{$page}) { + $section = $page; + $page = ""; + ### print STDERR "reset page='', section=$section\n"; + } + + $page83=dosify($page); + $page=$page83 if (defined $Pages{$page83}); + if ($page eq "") { + $link = "#" . anchorify( $section ); + } elsif ( $page =~ /::/ ) { + $page =~ s,::,/,g; + # Search page cache for an entry keyed under the html page name, + # then look to see what directory that page might be in. NOTE: + # this will only find one page. A better solution might be to produce + # an intermediate page that is an index to all such pages. + my $page_name = $page ; + $page_name =~ s,^.*/,,s ; + if ( defined( $Pages{ $page_name } ) && + $Pages{ $page_name } =~ /([^:]*$page)\.(?:pod|pm):/ + ) { + $page = $1 ; + } + else { + # NOTE: This branch assumes that all A::B pages are located in + # $Htmlroot/A/B.html . This is often incorrect, since they are + # often in $Htmlroot/lib/A/B.html or such like. Perhaps we could + # analyze the contents of %Pages and figure out where any + # cousins of A::B are, then assume that. So, if A::B isn't found, + # but A::C is found in lib/A/C.pm, then A::B is assumed to be in + # lib/A/B.pm. This is also limited, but it's an improvement. + # Maybe a hints file so that the links point to the correct places + # nonetheless? + + } + $link = "$Htmlroot/$page.html"; + $link .= "#" . anchorify( $section ) if ($section); + } elsif (!defined $Pages{$page}) { + $link = ""; + } else { + $section = anchorify( $section ) if $section ne ""; + ### print STDERR "...section=$section\n"; + + # if there is a directory by the name of the page, then assume that an + # appropriate section will exist in the subdirectory +# if ($section ne "" && $Pages{$page} =~ /([^:]*[^(\.pod|\.pm)]):/) { + if ($section ne "" && $Pages{$page} =~ /([^:]*(?<!\.pod)(?<!\.pm)):/) { + $link = "$Htmlroot/$1/$section.html"; + ### print STDERR "...link=$link\n"; + + # since there is no directory by the name of the page, the section will + # have to exist within a .html of the same name. thus, make sure there + # is a .pod or .pm that might become that .html + } else { + $section = "#$section" if $section; + ### print STDERR "...section=$section\n"; + + # check if there is a .pod with the page name + if ($Pages{$page} =~ /([^:]*)\.pod:/) { + $link = "$Htmlroot/$1.html$section"; + } elsif ($Pages{$page} =~ /([^:]*)\.pm:/) { + $link = "$Htmlroot/$1.html$section"; + } else { + $link = ""; + } + } + } + + if ($link) { + # Here, we take advantage of the knowledge that $Htmlfileurl ne '' + # implies $Htmlroot eq ''. This means that the link in question + # needs a prefix of $Htmldir if it begins with '/'. The test for + # the initial '/' is done to avoid '#'-only links, and to allow + # for other kinds of links, like file:, ftp:, etc. + my $url ; + if ( $Htmlfileurl ne '' ) { + $link = "$Htmldir$link" if $link =~ m{^/}s; + $url = relativize_url( $link, $Htmlfileurl ); +# print( " b: [$link,$Htmlfileurl,$url]\n" ); + } + else { + $url = $link ; + } + return $url; + + } else { + return undef(); + } +} + +# +# relativize_url - convert an absolute URL to one relative to a base URL. +# Assumes both end in a filename. +# +sub relativize_url { + my ($dest,$source) = @_ ; + + my ($dest_volume,$dest_directory,$dest_file) = + File::Spec::Unix->splitpath( $dest ) ; + $dest = File::Spec::Unix->catpath( $dest_volume, $dest_directory, '' ) ; + + my ($source_volume,$source_directory,$source_file) = + File::Spec::Unix->splitpath( $source ) ; + $source = File::Spec::Unix->catpath( $source_volume, $source_directory, '' ) ; + + my $rel_path = '' ; + if ( $dest ne '' ) { + $rel_path = File::Spec::Unix->abs2rel( $dest, $source ) ; + } + + if ( $rel_path ne '' && + substr( $rel_path, -1 ) ne '/' && + substr( $dest_file, 0, 1 ) ne '#' + ) { + $rel_path .= "/$dest_file" ; + } + else { + $rel_path .= "$dest_file" ; + } + + return $rel_path ; +} + + +# +# coderef - make URL from the text of a C<> +# +sub coderef($$){ + my( $page, $item ) = @_; + my( $url ); + + my $fid = fragment_id( $item ); + if( defined( $page ) && $page ne "" ){ + # we have been given a $page... + $page =~ s{::}{/}g; + + # Do we take it? Item could be a section! + my $base = $Items{$fid} || ""; + $base =~ s{[^/]*/}{}; + if( $base ne "$page.html" ){ + ### print STDERR "coderef( $page, $item ): items{$fid} = $Items{$fid} = $base => discard page!\n"; + $page = undef(); + } + + } else { + # no page - local items precede cached items + if( defined( $fid ) ){ + if( exists $Local_Items{$fid} ){ + $page = $Local_Items{$fid}; + } else { + $page = $Items{$fid}; + } + } + } + + # if there was a pod file that we found earlier with an appropriate + # =item directive, then create a link to that page. + if( defined $page ){ + if( $page ){ + if( exists $Pages{$page} and $Pages{$page} =~ /([^:.]*)\.[^:]*:/){ + $page = $1 . '.html'; + } + my $link = "$Htmlroot/$page#item_" . anchorify($fid); + + # Here, we take advantage of the knowledge that $Htmlfileurl + # ne '' implies $Htmlroot eq ''. + if ( $Htmlfileurl ne '' ) { + $link = "$Htmldir$link" ; + $url = relativize_url( $link, $Htmlfileurl ) ; + } else { + $url = $link ; + } + } else { + $url = "#item_" . anchorify($fid); + } + + confess "url has space: $url" if $url =~ /"[^"]*\s[^"]*"/; + } + return( $url, $fid ); +} + + + +# +# Adapted from Nick Ing-Simmons' PodToHtml package. +sub relative_url { + my $source_file = shift ; + my $destination_file = shift; + + my $source = URI::file->new_abs($source_file); + my $uo = URI::file->new($destination_file,$source)->abs; + return $uo->rel->as_string; +} + + +# +# finish_list - finish off any pending HTML lists. this should be called +# after the entire pod file has been read and converted. +# +sub finish_list { + if( $Listlevel ){ + warn "$0: $Podfile: unterminated list(s) at =head in paragraph $Paragraph. ignoring.\n" unless $Quiet; + while( $Listlevel ){ + process_back(); + } + } +} + +# +# htmlify - converts a pod section specification to a suitable section +# specification for HTML. Note that we keep spaces and special characters +# except ", ? (Netscape problem) and the hyphen (writer's problem...). +# +sub htmlify { + my( $heading) = @_; + $heading =~ s/(\s+)/ /g; + $heading =~ s/\s+\Z//; + $heading =~ s/\A\s+//; + # The hyphen is a disgrace to the English language. + $heading =~ s/[-"?]//g; + $heading = lc( $heading ); + return $heading; +} + +# +# similar to htmlify, but turns non-alphanumerics into underscores +# +sub anchorify { + my ($anchor) = @_; + $anchor = htmlify($anchor); + $anchor =~ s/\W/_/g; + return $anchor; +} + +# +# depod - convert text by eliminating all interior sequences +# Note: can be called with copy or modify semantics +# +my %E2c; +$E2c{lt} = '<'; +$E2c{gt} = '>'; +$E2c{sol} = '/'; +$E2c{verbar} = '|'; +$E2c{amp} = '&'; # in Tk's pods + +sub depod1($;$$); + +sub depod($){ + my $string; + if( ref( $_[0] ) ){ + $string = ${$_[0]}; + ${$_[0]} = depod1( \$string ); + } else { + $string = $_[0]; + depod1( \$string ); + } +} + +sub depod1($;$$){ + my( $rstr, $func, $closing ) = @_; + my $res = ''; + return $res unless defined $$rstr; + if( ! defined( $func ) ){ + # skip to next begin of an interior sequence + while( $$rstr =~ s/\A(.*?)([BCEFILSXZ])<(<+[^\S\n]+)?// ){ + # recurse into its text + $res .= $1 . depod1( $rstr, $2, closing $3); + } + $res .= $$rstr; + } elsif( $func eq 'E' ){ + # E<x> - convert to character + $$rstr =~ s/^([^>]*)>//; + $res .= $E2c{$1} || ""; + } elsif( $func eq 'X' ){ + # X<> - ignore + $$rstr =~ s/^[^>]*>//; + } elsif( $func eq 'Z' ){ + # Z<> - empty + $$rstr =~ s/^>//; + } else { + # all others: either recurse into new function or + # terminate at closing angle bracket + my $term = pattern $closing; + while( $$rstr =~ s/\A(.*?)(([BCEFILSXZ])<(<+[^\S\n]+)?|$term)// ){ + $res .= $1; + last unless $3; + $res .= depod1( $rstr, $3, closing $4 ); + } + ## If we're here and $2 ne '>': undelimited interior sequence. + ## Ignored, as this is called without proper indication of where we are. + ## Rely on process_text to produce diagnostics. + } + return $res; +} + +# +# fragment_id - construct a fragment identifier from: +# a) =item text +# b) contents of C<...> +# +my @HC; +sub fragment_id { + my $text = shift(); + $text =~ s/\s+\Z//s; + if( $text ){ + # a method or function? + return $1 if $text =~ /(\w+)\s*\(/; + return $1 if $text =~ /->\s*(\w+)\s*\(?/; + + # a variable name? + return $1 if $text =~ /^([\$\@%*]\S+)/; + + # some pattern matching operator? + return $1 if $text =~ m|^(\w+/).*/\w*$|; + + # fancy stuff... like "do { }" + return $1 if $text =~ m|^(\w+)\s*{.*}$|; + + # honour the perlfunc manpage: func [PAR[,[ ]PAR]...] + # and some funnies with ... Module ... + return $1 if $text =~ m{^([a-z\d_]+)(\s+[A-Z\d,/& ]+)?$}; + return $1 if $text =~ m{^([a-z\d]+)\s+Module(\s+[A-Z\d,/& ]+)?$}; + + # text? normalize! + $text =~ s/\s+/_/sg; + $text =~ s{(\W)}{ + defined( $HC[ord($1)] ) ? $HC[ord($1)] + : ( $HC[ord($1)] = sprintf( "%%%02X", ord($1) ) ) }gxe; + $text = substr( $text, 0, 50 ); + } else { + return undef(); + } +} + +# +# make_URL_href - generate HTML href from URL +# Special treatment for CGI queries. +# +sub make_URL_href($){ + my( $url ) = @_; + if( $url !~ + s{^(http:[-\w/#~:.+=&%@!]+)(\?.*)$}{<a href="$1$2">$1</a>}i ){ + $url = "<a href=\"$url\">$url</a>"; + } + return $url; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Pod/InputObjects.pm b/Master/tlpkg/tlperl.old/lib/Pod/InputObjects.pm new file mode 100644 index 00000000000..fa5f61f9a70 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/InputObjects.pm @@ -0,0 +1,941 @@ +############################################################################# +# Pod/InputObjects.pm -- package which defines objects for input streams +# and paragraphs and commands when parsing POD docs. +# +# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved. +# This file is part of "PodParser". PodParser is free software; +# you can redistribute it and/or modify it under the same terms +# as Perl itself. +############################################################################# + +package Pod::InputObjects; + +use vars qw($VERSION); +$VERSION = 1.30; ## Current version of this package +require 5.005; ## requires this Perl version or later + +############################################################################# + +=head1 NAME + +Pod::InputObjects - objects representing POD input paragraphs, commands, etc. + +=head1 SYNOPSIS + + use Pod::InputObjects; + +=head1 REQUIRES + +perl5.004, Carp + +=head1 EXPORTS + +Nothing. + +=head1 DESCRIPTION + +This module defines some basic input objects used by B<Pod::Parser> when +reading and parsing POD text from an input source. The following objects +are defined: + +=over 4 + +=begin __PRIVATE__ + +=item package B<Pod::InputSource> + +An object corresponding to a source of POD input text. It is mostly a +wrapper around a filehandle or C<IO::Handle>-type object (or anything +that implements the C<getline()> method) which keeps track of some +additional information relevant to the parsing of PODs. + +=end __PRIVATE__ + +=item package B<Pod::Paragraph> + +An object corresponding to a paragraph of POD input text. It may be a +plain paragraph, a verbatim paragraph, or a command paragraph (see +L<perlpod>). + +=item package B<Pod::InteriorSequence> + +An object corresponding to an interior sequence command from the POD +input text (see L<perlpod>). + +=item package B<Pod::ParseTree> + +An object corresponding to a tree of parsed POD text. Each "node" in +a parse-tree (or I<ptree>) is either a text-string or a reference to +a B<Pod::InteriorSequence> object. The nodes appear in the parse-tree +in the order in which they were parsed from left-to-right. + +=back + +Each of these input objects are described in further detail in the +sections which follow. + +=cut + +############################################################################# + +use strict; +#use diagnostics; +#use Carp; + +############################################################################# + +package Pod::InputSource; + +##--------------------------------------------------------------------------- + +=begin __PRIVATE__ + +=head1 B<Pod::InputSource> + +This object corresponds to an input source or stream of POD +documentation. When parsing PODs, it is necessary to associate and store +certain context information with each input source. All of this +information is kept together with the stream itself in one of these +C<Pod::InputSource> objects. Each such object is merely a wrapper around +an C<IO::Handle> object of some kind (or at least something that +implements the C<getline()> method). They have the following +methods/attributes: + +=end __PRIVATE__ + +=cut + +##--------------------------------------------------------------------------- + +=begin __PRIVATE__ + +=head2 B<new()> + + my $pod_input1 = Pod::InputSource->new(-handle => $filehandle); + my $pod_input2 = new Pod::InputSource(-handle => $filehandle, + -name => $name); + my $pod_input3 = new Pod::InputSource(-handle => \*STDIN); + my $pod_input4 = Pod::InputSource->new(-handle => \*STDIN, + -name => "(STDIN)"); + +This is a class method that constructs a C<Pod::InputSource> object and +returns a reference to the new input source object. It takes one or more +keyword arguments in the form of a hash. The keyword C<-handle> is +required and designates the corresponding input handle. The keyword +C<-name> is optional and specifies the name associated with the input +handle (typically a file name). + +=end __PRIVATE__ + +=cut + +sub new { + ## Determine if we were called via an object-ref or a classname + my $this = shift; + my $class = ref($this) || $this; + + ## Any remaining arguments are treated as initial values for the + ## hash that is used to represent this object. Note that we default + ## certain values by specifying them *before* the arguments passed. + ## If they are in the argument list, they will override the defaults. + my $self = { -name => '(unknown)', + -handle => undef, + -was_cutting => 0, + @_ }; + + ## Bless ourselves into the desired class and perform any initialization + bless $self, $class; + return $self; +} + +##--------------------------------------------------------------------------- + +=begin __PRIVATE__ + +=head2 B<name()> + + my $filename = $pod_input->name(); + $pod_input->name($new_filename_to_use); + +This method gets/sets the name of the input source (usually a filename). +If no argument is given, it returns a string containing the name of +the input source; otherwise it sets the name of the input source to the +contents of the given argument. + +=end __PRIVATE__ + +=cut + +sub name { + (@_ > 1) and $_[0]->{'-name'} = $_[1]; + return $_[0]->{'-name'}; +} + +## allow 'filename' as an alias for 'name' +*filename = \&name; + +##--------------------------------------------------------------------------- + +=begin __PRIVATE__ + +=head2 B<handle()> + + my $handle = $pod_input->handle(); + +Returns a reference to the handle object from which input is read (the +one used to contructed this input source object). + +=end __PRIVATE__ + +=cut + +sub handle { + return $_[0]->{'-handle'}; +} + +##--------------------------------------------------------------------------- + +=begin __PRIVATE__ + +=head2 B<was_cutting()> + + print "Yes.\n" if ($pod_input->was_cutting()); + +The value of the C<cutting> state (that the B<cutting()> method would +have returned) immediately before any input was read from this input +stream. After all input from this stream has been read, the C<cutting> +state is restored to this value. + +=end __PRIVATE__ + +=cut + +sub was_cutting { + (@_ > 1) and $_[0]->{-was_cutting} = $_[1]; + return $_[0]->{-was_cutting}; +} + +##--------------------------------------------------------------------------- + +############################################################################# + +package Pod::Paragraph; + +##--------------------------------------------------------------------------- + +=head1 B<Pod::Paragraph> + +An object representing a paragraph of POD input text. +It has the following methods/attributes: + +=cut + +##--------------------------------------------------------------------------- + +=head2 Pod::Paragraph-E<gt>B<new()> + + my $pod_para1 = Pod::Paragraph->new(-text => $text); + my $pod_para2 = Pod::Paragraph->new(-name => $cmd, + -text => $text); + my $pod_para3 = new Pod::Paragraph(-text => $text); + my $pod_para4 = new Pod::Paragraph(-name => $cmd, + -text => $text); + my $pod_para5 = Pod::Paragraph->new(-name => $cmd, + -text => $text, + -file => $filename, + -line => $line_number); + +This is a class method that constructs a C<Pod::Paragraph> object and +returns a reference to the new paragraph object. It may be given one or +two keyword arguments. The C<-text> keyword indicates the corresponding +text of the POD paragraph. The C<-name> keyword indicates the name of +the corresponding POD command, such as C<head1> or C<item> (it should +I<not> contain the C<=> prefix); this is needed only if the POD +paragraph corresponds to a command paragraph. The C<-file> and C<-line> +keywords indicate the filename and line number corresponding to the +beginning of the paragraph + +=cut + +sub new { + ## Determine if we were called via an object-ref or a classname + my $this = shift; + my $class = ref($this) || $this; + + ## Any remaining arguments are treated as initial values for the + ## hash that is used to represent this object. Note that we default + ## certain values by specifying them *before* the arguments passed. + ## If they are in the argument list, they will override the defaults. + my $self = { + -name => undef, + -text => (@_ == 1) ? shift : undef, + -file => '<unknown-file>', + -line => 0, + -prefix => '=', + -separator => ' ', + -ptree => [], + @_ + }; + + ## Bless ourselves into the desired class and perform any initialization + bless $self, $class; + return $self; +} + +##--------------------------------------------------------------------------- + +=head2 $pod_para-E<gt>B<cmd_name()> + + my $para_cmd = $pod_para->cmd_name(); + +If this paragraph is a command paragraph, then this method will return +the name of the command (I<without> any leading C<=> prefix). + +=cut + +sub cmd_name { + (@_ > 1) and $_[0]->{'-name'} = $_[1]; + return $_[0]->{'-name'}; +} + +## let name() be an alias for cmd_name() +*name = \&cmd_name; + +##--------------------------------------------------------------------------- + +=head2 $pod_para-E<gt>B<text()> + + my $para_text = $pod_para->text(); + +This method will return the corresponding text of the paragraph. + +=cut + +sub text { + (@_ > 1) and $_[0]->{'-text'} = $_[1]; + return $_[0]->{'-text'}; +} + +##--------------------------------------------------------------------------- + +=head2 $pod_para-E<gt>B<raw_text()> + + my $raw_pod_para = $pod_para->raw_text(); + +This method will return the I<raw> text of the POD paragraph, exactly +as it appeared in the input. + +=cut + +sub raw_text { + return $_[0]->{'-text'} unless (defined $_[0]->{'-name'}); + return $_[0]->{'-prefix'} . $_[0]->{'-name'} . + $_[0]->{'-separator'} . $_[0]->{'-text'}; +} + +##--------------------------------------------------------------------------- + +=head2 $pod_para-E<gt>B<cmd_prefix()> + + my $prefix = $pod_para->cmd_prefix(); + +If this paragraph is a command paragraph, then this method will return +the prefix used to denote the command (which should be the string "=" +or "=="). + +=cut + +sub cmd_prefix { + return $_[0]->{'-prefix'}; +} + +##--------------------------------------------------------------------------- + +=head2 $pod_para-E<gt>B<cmd_separator()> + + my $separator = $pod_para->cmd_separator(); + +If this paragraph is a command paragraph, then this method will return +the text used to separate the command name from the rest of the +paragraph (if any). + +=cut + +sub cmd_separator { + return $_[0]->{'-separator'}; +} + +##--------------------------------------------------------------------------- + +=head2 $pod_para-E<gt>B<parse_tree()> + + my $ptree = $pod_parser->parse_text( $pod_para->text() ); + $pod_para->parse_tree( $ptree ); + $ptree = $pod_para->parse_tree(); + +This method will get/set the corresponding parse-tree of the paragraph's text. + +=cut + +sub parse_tree { + (@_ > 1) and $_[0]->{'-ptree'} = $_[1]; + return $_[0]->{'-ptree'}; +} + +## let ptree() be an alias for parse_tree() +*ptree = \&parse_tree; + +##--------------------------------------------------------------------------- + +=head2 $pod_para-E<gt>B<file_line()> + + my ($filename, $line_number) = $pod_para->file_line(); + my $position = $pod_para->file_line(); + +Returns the current filename and line number for the paragraph +object. If called in a list context, it returns a list of two +elements: first the filename, then the line number. If called in +a scalar context, it returns a string containing the filename, followed +by a colon (':'), followed by the line number. + +=cut + +sub file_line { + my @loc = ($_[0]->{'-file'} || '<unknown-file>', + $_[0]->{'-line'} || 0); + return (wantarray) ? @loc : join(':', @loc); +} + +##--------------------------------------------------------------------------- + +############################################################################# + +package Pod::InteriorSequence; + +##--------------------------------------------------------------------------- + +=head1 B<Pod::InteriorSequence> + +An object representing a POD interior sequence command. +It has the following methods/attributes: + +=cut + +##--------------------------------------------------------------------------- + +=head2 Pod::InteriorSequence-E<gt>B<new()> + + my $pod_seq1 = Pod::InteriorSequence->new(-name => $cmd + -ldelim => $delimiter); + my $pod_seq2 = new Pod::InteriorSequence(-name => $cmd, + -ldelim => $delimiter); + my $pod_seq3 = new Pod::InteriorSequence(-name => $cmd, + -ldelim => $delimiter, + -file => $filename, + -line => $line_number); + + my $pod_seq4 = new Pod::InteriorSequence(-name => $cmd, $ptree); + my $pod_seq5 = new Pod::InteriorSequence($cmd, $ptree); + +This is a class method that constructs a C<Pod::InteriorSequence> object +and returns a reference to the new interior sequence object. It should +be given two keyword arguments. The C<-ldelim> keyword indicates the +corresponding left-delimiter of the interior sequence (e.g. 'E<lt>'). +The C<-name> keyword indicates the name of the corresponding interior +sequence command, such as C<I> or C<B> or C<C>. The C<-file> and +C<-line> keywords indicate the filename and line number corresponding +to the beginning of the interior sequence. If the C<$ptree> argument is +given, it must be the last argument, and it must be either string, or +else an array-ref suitable for passing to B<Pod::ParseTree::new> (or +it may be a reference to a Pod::ParseTree object). + +=cut + +sub new { + ## Determine if we were called via an object-ref or a classname + my $this = shift; + my $class = ref($this) || $this; + + ## See if first argument has no keyword + if (((@_ <= 2) or (@_ % 2)) and $_[0] !~ /^-\w/) { + ## Yup - need an implicit '-name' before first parameter + unshift @_, '-name'; + } + + ## See if odd number of args + if ((@_ % 2) != 0) { + ## Yup - need an implicit '-ptree' before the last parameter + splice @_, $#_, 0, '-ptree'; + } + + ## Any remaining arguments are treated as initial values for the + ## hash that is used to represent this object. Note that we default + ## certain values by specifying them *before* the arguments passed. + ## If they are in the argument list, they will override the defaults. + my $self = { + -name => (@_ == 1) ? $_[0] : undef, + -file => '<unknown-file>', + -line => 0, + -ldelim => '<', + -rdelim => '>', + @_ + }; + + ## Initialize contents if they havent been already + my $ptree = $self->{'-ptree'} || new Pod::ParseTree(); + if ( ref $ptree =~ /^(ARRAY)?$/ ) { + ## We have an array-ref, or a normal scalar. Pass it as an + ## an argument to the ptree-constructor + $ptree = new Pod::ParseTree($1 ? [$ptree] : $ptree); + } + $self->{'-ptree'} = $ptree; + + ## Bless ourselves into the desired class and perform any initialization + bless $self, $class; + return $self; +} + +##--------------------------------------------------------------------------- + +=head2 $pod_seq-E<gt>B<cmd_name()> + + my $seq_cmd = $pod_seq->cmd_name(); + +The name of the interior sequence command. + +=cut + +sub cmd_name { + (@_ > 1) and $_[0]->{'-name'} = $_[1]; + return $_[0]->{'-name'}; +} + +## let name() be an alias for cmd_name() +*name = \&cmd_name; + +##--------------------------------------------------------------------------- + +## Private subroutine to set the parent pointer of all the given +## children that are interior-sequences to be $self + +sub _set_child2parent_links { + my ($self, @children) = @_; + ## Make sure any sequences know who their parent is + for (@children) { + next unless (length and ref and ref ne 'SCALAR'); + if (UNIVERSAL::isa($_, 'Pod::InteriorSequence') or + UNIVERSAL::can($_, 'nested')) + { + $_->nested($self); + } + } +} + +## Private subroutine to unset child->parent links + +sub _unset_child2parent_links { + my $self = shift; + $self->{'-parent_sequence'} = undef; + my $ptree = $self->{'-ptree'}; + for (@$ptree) { + next unless (length and ref and ref ne 'SCALAR'); + $_->_unset_child2parent_links() + if UNIVERSAL::isa($_, 'Pod::InteriorSequence'); + } +} + +##--------------------------------------------------------------------------- + +=head2 $pod_seq-E<gt>B<prepend()> + + $pod_seq->prepend($text); + $pod_seq1->prepend($pod_seq2); + +Prepends the given string or parse-tree or sequence object to the parse-tree +of this interior sequence. + +=cut + +sub prepend { + my $self = shift; + $self->{'-ptree'}->prepend(@_); + _set_child2parent_links($self, @_); + return $self; +} + +##--------------------------------------------------------------------------- + +=head2 $pod_seq-E<gt>B<append()> + + $pod_seq->append($text); + $pod_seq1->append($pod_seq2); + +Appends the given string or parse-tree or sequence object to the parse-tree +of this interior sequence. + +=cut + +sub append { + my $self = shift; + $self->{'-ptree'}->append(@_); + _set_child2parent_links($self, @_); + return $self; +} + +##--------------------------------------------------------------------------- + +=head2 $pod_seq-E<gt>B<nested()> + + $outer_seq = $pod_seq->nested || print "not nested"; + +If this interior sequence is nested inside of another interior +sequence, then the outer/parent sequence that contains it is +returned. Otherwise C<undef> is returned. + +=cut + +sub nested { + my $self = shift; + (@_ == 1) and $self->{'-parent_sequence'} = shift; + return $self->{'-parent_sequence'} || undef; +} + +##--------------------------------------------------------------------------- + +=head2 $pod_seq-E<gt>B<raw_text()> + + my $seq_raw_text = $pod_seq->raw_text(); + +This method will return the I<raw> text of the POD interior sequence, +exactly as it appeared in the input. + +=cut + +sub raw_text { + my $self = shift; + my $text = $self->{'-name'} . $self->{'-ldelim'}; + for ( $self->{'-ptree'}->children ) { + $text .= (ref $_) ? $_->raw_text : $_; + } + $text .= $self->{'-rdelim'}; + return $text; +} + +##--------------------------------------------------------------------------- + +=head2 $pod_seq-E<gt>B<left_delimiter()> + + my $ldelim = $pod_seq->left_delimiter(); + +The leftmost delimiter beginning the argument text to the interior +sequence (should be "<"). + +=cut + +sub left_delimiter { + (@_ > 1) and $_[0]->{'-ldelim'} = $_[1]; + return $_[0]->{'-ldelim'}; +} + +## let ldelim() be an alias for left_delimiter() +*ldelim = \&left_delimiter; + +##--------------------------------------------------------------------------- + +=head2 $pod_seq-E<gt>B<right_delimiter()> + +The rightmost delimiter beginning the argument text to the interior +sequence (should be ">"). + +=cut + +sub right_delimiter { + (@_ > 1) and $_[0]->{'-rdelim'} = $_[1]; + return $_[0]->{'-rdelim'}; +} + +## let rdelim() be an alias for right_delimiter() +*rdelim = \&right_delimiter; + +##--------------------------------------------------------------------------- + +=head2 $pod_seq-E<gt>B<parse_tree()> + + my $ptree = $pod_parser->parse_text($paragraph_text); + $pod_seq->parse_tree( $ptree ); + $ptree = $pod_seq->parse_tree(); + +This method will get/set the corresponding parse-tree of the interior +sequence's text. + +=cut + +sub parse_tree { + (@_ > 1) and $_[0]->{'-ptree'} = $_[1]; + return $_[0]->{'-ptree'}; +} + +## let ptree() be an alias for parse_tree() +*ptree = \&parse_tree; + +##--------------------------------------------------------------------------- + +=head2 $pod_seq-E<gt>B<file_line()> + + my ($filename, $line_number) = $pod_seq->file_line(); + my $position = $pod_seq->file_line(); + +Returns the current filename and line number for the interior sequence +object. If called in a list context, it returns a list of two +elements: first the filename, then the line number. If called in +a scalar context, it returns a string containing the filename, followed +by a colon (':'), followed by the line number. + +=cut + +sub file_line { + my @loc = ($_[0]->{'-file'} || '<unknown-file>', + $_[0]->{'-line'} || 0); + return (wantarray) ? @loc : join(':', @loc); +} + +##--------------------------------------------------------------------------- + +=head2 Pod::InteriorSequence::B<DESTROY()> + +This method performs any necessary cleanup for the interior-sequence. +If you override this method then it is B<imperative> that you invoke +the parent method from within your own method, otherwise +I<interior-sequence storage will not be reclaimed upon destruction!> + +=cut + +sub DESTROY { + ## We need to get rid of all child->parent pointers throughout the + ## tree so their reference counts will go to zero and they can be + ## garbage-collected + _unset_child2parent_links(@_); +} + +##--------------------------------------------------------------------------- + +############################################################################# + +package Pod::ParseTree; + +##--------------------------------------------------------------------------- + +=head1 B<Pod::ParseTree> + +This object corresponds to a tree of parsed POD text. As POD text is +scanned from left to right, it is parsed into an ordered list of +text-strings and B<Pod::InteriorSequence> objects (in order of +appearance). A B<Pod::ParseTree> object corresponds to this list of +strings and sequences. Each interior sequence in the parse-tree may +itself contain a parse-tree (since interior sequences may be nested). + +=cut + +##--------------------------------------------------------------------------- + +=head2 Pod::ParseTree-E<gt>B<new()> + + my $ptree1 = Pod::ParseTree->new; + my $ptree2 = new Pod::ParseTree; + my $ptree4 = Pod::ParseTree->new($array_ref); + my $ptree3 = new Pod::ParseTree($array_ref); + +This is a class method that constructs a C<Pod::Parse_tree> object and +returns a reference to the new parse-tree. If a single-argument is given, +it must be a reference to an array, and is used to initialize the root +(top) of the parse tree. + +=cut + +sub new { + ## Determine if we were called via an object-ref or a classname + my $this = shift; + my $class = ref($this) || $this; + + my $self = (@_ == 1 and ref $_[0]) ? $_[0] : []; + + ## Bless ourselves into the desired class and perform any initialization + bless $self, $class; + return $self; +} + +##--------------------------------------------------------------------------- + +=head2 $ptree-E<gt>B<top()> + + my $top_node = $ptree->top(); + $ptree->top( $top_node ); + $ptree->top( @children ); + +This method gets/sets the top node of the parse-tree. If no arguments are +given, it returns the topmost node in the tree (the root), which is also +a B<Pod::ParseTree>. If it is given a single argument that is a reference, +then the reference is assumed to a parse-tree and becomes the new top node. +Otherwise, if arguments are given, they are treated as the new list of +children for the top node. + +=cut + +sub top { + my $self = shift; + if (@_ > 0) { + @{ $self } = (@_ == 1 and ref $_[0]) ? ${ @_ } : @_; + } + return $self; +} + +## let parse_tree() & ptree() be aliases for the 'top' method +*parse_tree = *ptree = \⊤ + +##--------------------------------------------------------------------------- + +=head2 $ptree-E<gt>B<children()> + +This method gets/sets the children of the top node in the parse-tree. +If no arguments are given, it returns the list (array) of children +(each of which should be either a string or a B<Pod::InteriorSequence>. +Otherwise, if arguments are given, they are treated as the new list of +children for the top node. + +=cut + +sub children { + my $self = shift; + if (@_ > 0) { + @{ $self } = (@_ == 1 and ref $_[0]) ? ${ @_ } : @_; + } + return @{ $self }; +} + +##--------------------------------------------------------------------------- + +=head2 $ptree-E<gt>B<prepend()> + +This method prepends the given text or parse-tree to the current parse-tree. +If the first item on the parse-tree is text and the argument is also text, +then the text is prepended to the first item (not added as a separate string). +Otherwise the argument is added as a new string or parse-tree I<before> +the current one. + +=cut + +use vars qw(@ptree); ## an alias used for performance reasons + +sub prepend { + my $self = shift; + local *ptree = $self; + for (@_) { + next unless length; + if (@ptree and !(ref $ptree[0]) and !(ref $_)) { + $ptree[0] = $_ . $ptree[0]; + } + else { + unshift @ptree, $_; + } + } +} + +##--------------------------------------------------------------------------- + +=head2 $ptree-E<gt>B<append()> + +This method appends the given text or parse-tree to the current parse-tree. +If the last item on the parse-tree is text and the argument is also text, +then the text is appended to the last item (not added as a separate string). +Otherwise the argument is added as a new string or parse-tree I<after> +the current one. + +=cut + +sub append { + my $self = shift; + local *ptree = $self; + my $can_append = @ptree && !(ref $ptree[-1]); + for (@_) { + if (ref) { + push @ptree, $_; + } + elsif(!length) { + next; + } + elsif ($can_append) { + $ptree[-1] .= $_; + } + else { + push @ptree, $_; + } + } +} + +=head2 $ptree-E<gt>B<raw_text()> + + my $ptree_raw_text = $ptree->raw_text(); + +This method will return the I<raw> text of the POD parse-tree +exactly as it appeared in the input. + +=cut + +sub raw_text { + my $self = shift; + my $text = ""; + for ( @$self ) { + $text .= (ref $_) ? $_->raw_text : $_; + } + return $text; +} + +##--------------------------------------------------------------------------- + +## Private routines to set/unset child->parent links + +sub _unset_child2parent_links { + my $self = shift; + local *ptree = $self; + for (@ptree) { + next unless (defined and length and ref and ref ne 'SCALAR'); + $_->_unset_child2parent_links() + if UNIVERSAL::isa($_, 'Pod::InteriorSequence'); + } +} + +sub _set_child2parent_links { + ## nothing to do, Pod::ParseTrees cant have parent pointers +} + +=head2 Pod::ParseTree::B<DESTROY()> + +This method performs any necessary cleanup for the parse-tree. +If you override this method then it is B<imperative> +that you invoke the parent method from within your own method, +otherwise I<parse-tree storage will not be reclaimed upon destruction!> + +=cut + +sub DESTROY { + ## We need to get rid of all child->parent pointers throughout the + ## tree so their reference counts will go to zero and they can be + ## garbage-collected + _unset_child2parent_links(@_); +} + +############################################################################# + +=head1 SEE ALSO + +See L<Pod::Parser>, L<Pod::Select> + +=head1 AUTHOR + +Please report bugs using L<http://rt.cpan.org>. + +Brad Appleton E<lt>bradapp@enteract.comE<gt> + +=cut + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Pod/LaTeX.pm b/Master/tlpkg/tlperl.old/lib/Pod/LaTeX.pm new file mode 100644 index 00000000000..9d3a905258f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/LaTeX.pm @@ -0,0 +1,1876 @@ +package Pod::LaTeX; + +=head1 NAME + +Pod::LaTeX - Convert Pod data to formatted Latex + +=head1 SYNOPSIS + + use Pod::LaTeX; + my $parser = Pod::LaTeX->new ( ); + + $parser->parse_from_filehandle; + + $parser->parse_from_file ('file.pod', 'file.tex'); + +=head1 DESCRIPTION + +C<Pod::LaTeX> is a module to convert documentation in the Pod format +into Latex. The L<B<pod2latex>|pod2latex> X<pod2latex> command uses +this module for translation. + +C<Pod::LaTeX> is a derived class from L<Pod::Select|Pod::Select>. + +=cut + + +use strict; +require Pod::ParseUtils; +use base qw/ Pod::Select /; + +# use Data::Dumper; # for debugging +use Carp; + +use vars qw/ $VERSION %HTML_Escapes @LatexSections /; + +$VERSION = '0.58'; + +# Definitions of =headN -> latex mapping +@LatexSections = (qw/ + chapter + section + subsection + subsubsection + paragraph + subparagraph + /); + +# Standard escape sequences converted to Latex. +# The Unicode name of each character is given in the comments. +# Complete LaTeX set added by Peter Acklam. + +%HTML_Escapes = ( + 'sol' => '\textfractionsolidus{}', # xxx - or should it be just '/' + 'verbar' => '|', + + # The stuff below is based on the information available at + # http://www.w3.org/TR/html401/sgml/entities.html + + # All characters in the range 0xA0-0xFF of the ISO 8859-1 character set. + # Several of these characters require the `textcomp' LaTeX package. + 'nbsp' => q|~|, # 0xA0 - no-break space = non-breaking space + 'iexcl' => q|\textexclamdown{}|, # 0xA1 - inverted exclamation mark + 'cent' => q|\textcent{}|, # 0xA2 - cent sign + 'pound' => q|\textsterling{}|, # 0xA3 - pound sign + 'curren' => q|\textcurrency{}|, # 0xA4 - currency sign + 'yen' => q|\textyen{}|, # 0xA5 - yen sign = yuan sign + 'brvbar' => q|\textbrokenbar{}|, # 0xA6 - broken bar = broken vertical bar + 'sect' => q|\textsection{}|, # 0xA7 - section sign + 'uml' => q|\textasciidieresis{}|, # 0xA8 - diaeresis = spacing diaeresis + 'copy' => q|\textcopyright{}|, # 0xA9 - copyright sign + 'ordf' => q|\textordfeminine{}|, # 0xAA - feminine ordinal indicator + 'laquo' => q|\guillemotleft{}|, # 0xAB - left-pointing double angle quotation mark = left pointing guillemet + 'not' => q|\textlnot{}|, # 0xAC - not sign + 'shy' => q|\-|, # 0xAD - soft hyphen = discretionary hyphen + 'reg' => q|\textregistered{}|, # 0xAE - registered sign = registered trade mark sign + 'macr' => q|\textasciimacron{}|, # 0xAF - macron = spacing macron = overline = APL overbar + 'deg' => q|\textdegree{}|, # 0xB0 - degree sign + 'plusmn' => q|\textpm{}|, # 0xB1 - plus-minus sign = plus-or-minus sign + 'sup2' => q|\texttwosuperior{}|, # 0xB2 - superscript two = superscript digit two = squared + 'sup3' => q|\textthreesuperior{}|, # 0xB3 - superscript three = superscript digit three = cubed + 'acute' => q|\textasciiacute{}|, # 0xB4 - acute accent = spacing acute + 'micro' => q|\textmu{}|, # 0xB5 - micro sign + 'para' => q|\textparagraph{}|, # 0xB6 - pilcrow sign = paragraph sign + 'middot' => q|\textperiodcentered{}|, # 0xB7 - middle dot = Georgian comma = Greek middle dot + 'cedil' => q|\c{}|, # 0xB8 - cedilla = spacing cedilla + 'sup1' => q|\textonesuperior{}|, # 0xB9 - superscript one = superscript digit one + 'ordm' => q|\textordmasculine{}|, # 0xBA - masculine ordinal indicator + 'raquo' => q|\guillemotright{}|, # 0xBB - right-pointing double angle quotation mark = right pointing guillemet + 'frac14' => q|\textonequarter{}|, # 0xBC - vulgar fraction one quarter = fraction one quarter + 'frac12' => q|\textonehalf{}|, # 0xBD - vulgar fraction one half = fraction one half + 'frac34' => q|\textthreequarters{}|, # 0xBE - vulgar fraction three quarters = fraction three quarters + 'iquest' => q|\textquestiondown{}|, # 0xBF - inverted question mark = turned question mark + 'Agrave' => q|\`A|, # 0xC0 - latin capital letter A with grave = latin capital letter A grave + 'Aacute' => q|\'A|, # 0xC1 - latin capital letter A with acute + 'Acirc' => q|\^A|, # 0xC2 - latin capital letter A with circumflex + 'Atilde' => q|\~A|, # 0xC3 - latin capital letter A with tilde + 'Auml' => q|\"A|, # 0xC4 - latin capital letter A with diaeresis + 'Aring' => q|\AA{}|, # 0xC5 - latin capital letter A with ring above = latin capital letter A ring + 'AElig' => q|\AE{}|, # 0xC6 - latin capital letter AE = latin capital ligature AE + 'Ccedil' => q|\c{C}|, # 0xC7 - latin capital letter C with cedilla + 'Egrave' => q|\`E|, # 0xC8 - latin capital letter E with grave + 'Eacute' => q|\'E|, # 0xC9 - latin capital letter E with acute + 'Ecirc' => q|\^E|, # 0xCA - latin capital letter E with circumflex + 'Euml' => q|\"E|, # 0xCB - latin capital letter E with diaeresis + 'Igrave' => q|\`I|, # 0xCC - latin capital letter I with grave + 'Iacute' => q|\'I|, # 0xCD - latin capital letter I with acute + 'Icirc' => q|\^I|, # 0xCE - latin capital letter I with circumflex + 'Iuml' => q|\"I|, # 0xCF - latin capital letter I with diaeresis + 'ETH' => q|\DH{}|, # 0xD0 - latin capital letter ETH + 'Ntilde' => q|\~N|, # 0xD1 - latin capital letter N with tilde + 'Ograve' => q|\`O|, # 0xD2 - latin capital letter O with grave + 'Oacute' => q|\'O|, # 0xD3 - latin capital letter O with acute + 'Ocirc' => q|\^O|, # 0xD4 - latin capital letter O with circumflex + 'Otilde' => q|\~O|, # 0xD5 - latin capital letter O with tilde + 'Ouml' => q|\"O|, # 0xD6 - latin capital letter O with diaeresis + 'times' => q|\texttimes{}|, # 0xD7 - multiplication sign + 'Oslash' => q|\O{}|, # 0xD8 - latin capital letter O with stroke = latin capital letter O slash + 'Ugrave' => q|\`U|, # 0xD9 - latin capital letter U with grave + 'Uacute' => q|\'U|, # 0xDA - latin capital letter U with acute + 'Ucirc' => q|\^U|, # 0xDB - latin capital letter U with circumflex + 'Uuml' => q|\"U|, # 0xDC - latin capital letter U with diaeresis + 'Yacute' => q|\'Y|, # 0xDD - latin capital letter Y with acute + 'THORN' => q|\TH{}|, # 0xDE - latin capital letter THORN + 'szlig' => q|\ss{}|, # 0xDF - latin small letter sharp s = ess-zed + 'agrave' => q|\`a|, # 0xE0 - latin small letter a with grave = latin small letter a grave + 'aacute' => q|\'a|, # 0xE1 - latin small letter a with acute + 'acirc' => q|\^a|, # 0xE2 - latin small letter a with circumflex + 'atilde' => q|\~a|, # 0xE3 - latin small letter a with tilde + 'auml' => q|\"a|, # 0xE4 - latin small letter a with diaeresis + 'aring' => q|\aa{}|, # 0xE5 - latin small letter a with ring above = latin small letter a ring + 'aelig' => q|\ae{}|, # 0xE6 - latin small letter ae = latin small ligature ae + 'ccedil' => q|\c{c}|, # 0xE7 - latin small letter c with cedilla + 'egrave' => q|\`e|, # 0xE8 - latin small letter e with grave + 'eacute' => q|\'e|, # 0xE9 - latin small letter e with acute + 'ecirc' => q|\^e|, # 0xEA - latin small letter e with circumflex + 'euml' => q|\"e|, # 0xEB - latin small letter e with diaeresis + 'igrave' => q|\`i|, # 0xEC - latin small letter i with grave + 'iacute' => q|\'i|, # 0xED - latin small letter i with acute + 'icirc' => q|\^i|, # 0xEE - latin small letter i with circumflex + 'iuml' => q|\"i|, # 0xEF - latin small letter i with diaeresis + 'eth' => q|\dh{}|, # 0xF0 - latin small letter eth + 'ntilde' => q|\~n|, # 0xF1 - latin small letter n with tilde + 'ograve' => q|\`o|, # 0xF2 - latin small letter o with grave + 'oacute' => q|\'o|, # 0xF3 - latin small letter o with acute + 'ocirc' => q|\^o|, # 0xF4 - latin small letter o with circumflex + 'otilde' => q|\~o|, # 0xF5 - latin small letter o with tilde + 'ouml' => q|\"o|, # 0xF6 - latin small letter o with diaeresis + 'divide' => q|\textdiv{}|, # 0xF7 - division sign + 'oslash' => q|\o{}|, # 0xF8 - latin small letter o with stroke, = latin small letter o slash + 'ugrave' => q|\`u|, # 0xF9 - latin small letter u with grave + 'uacute' => q|\'u|, # 0xFA - latin small letter u with acute + 'ucirc' => q|\^u|, # 0xFB - latin small letter u with circumflex + 'uuml' => q|\"u|, # 0xFC - latin small letter u with diaeresis + 'yacute' => q|\'y|, # 0xFD - latin small letter y with acute + 'thorn' => q|\th{}|, # 0xFE - latin small letter thorn + 'yuml' => q|\"y|, # 0xFF - latin small letter y with diaeresis + + # Latin Extended-B + 'fnof' => q|\textflorin{}|, # latin small f with hook = function = florin + + # Greek + 'Alpha' => q|$\mathrm{A}$|, # greek capital letter alpha + 'Beta' => q|$\mathrm{B}$|, # greek capital letter beta + 'Gamma' => q|$\Gamma$|, # greek capital letter gamma + 'Delta' => q|$\Delta$|, # greek capital letter delta + 'Epsilon' => q|$\mathrm{E}$|, # greek capital letter epsilon + 'Zeta' => q|$\mathrm{Z}$|, # greek capital letter zeta + 'Eta' => q|$\mathrm{H}$|, # greek capital letter eta + 'Theta' => q|$\Theta$|, # greek capital letter theta + 'Iota' => q|$\mathrm{I}$|, # greek capital letter iota + 'Kappa' => q|$\mathrm{K}$|, # greek capital letter kappa + 'Lambda' => q|$\Lambda$|, # greek capital letter lambda + 'Mu' => q|$\mathrm{M}$|, # greek capital letter mu + 'Nu' => q|$\mathrm{N}$|, # greek capital letter nu + 'Xi' => q|$\Xi$|, # greek capital letter xi + 'Omicron' => q|$\mathrm{O}$|, # greek capital letter omicron + 'Pi' => q|$\Pi$|, # greek capital letter pi + 'Rho' => q|$\mathrm{R}$|, # greek capital letter rho + 'Sigma' => q|$\Sigma$|, # greek capital letter sigma + 'Tau' => q|$\mathrm{T}$|, # greek capital letter tau + 'Upsilon' => q|$\Upsilon$|, # greek capital letter upsilon + 'Phi' => q|$\Phi$|, # greek capital letter phi + 'Chi' => q|$\mathrm{X}$|, # greek capital letter chi + 'Psi' => q|$\Psi$|, # greek capital letter psi + 'Omega' => q|$\Omega$|, # greek capital letter omega + + 'alpha' => q|$\alpha$|, # greek small letter alpha + 'beta' => q|$\beta$|, # greek small letter beta + 'gamma' => q|$\gamma$|, # greek small letter gamma + 'delta' => q|$\delta$|, # greek small letter delta + 'epsilon' => q|$\epsilon$|, # greek small letter epsilon + 'zeta' => q|$\zeta$|, # greek small letter zeta + 'eta' => q|$\eta$|, # greek small letter eta + 'theta' => q|$\theta$|, # greek small letter theta + 'iota' => q|$\iota$|, # greek small letter iota + 'kappa' => q|$\kappa$|, # greek small letter kappa + 'lambda' => q|$\lambda$|, # greek small letter lambda + 'mu' => q|$\mu$|, # greek small letter mu + 'nu' => q|$\nu$|, # greek small letter nu + 'xi' => q|$\xi$|, # greek small letter xi + 'omicron' => q|$o$|, # greek small letter omicron + 'pi' => q|$\pi$|, # greek small letter pi + 'rho' => q|$\rho$|, # greek small letter rho +# 'sigmaf' => q||, # greek small letter final sigma + 'sigma' => q|$\sigma$|, # greek small letter sigma + 'tau' => q|$\tau$|, # greek small letter tau + 'upsilon' => q|$\upsilon$|, # greek small letter upsilon + 'phi' => q|$\phi$|, # greek small letter phi + 'chi' => q|$\chi$|, # greek small letter chi + 'psi' => q|$\psi$|, # greek small letter psi + 'omega' => q|$\omega$|, # greek small letter omega +# 'thetasym' => q||, # greek small letter theta symbol +# 'upsih' => q||, # greek upsilon with hook symbol +# 'piv' => q||, # greek pi symbol + + # General Punctuation + 'bull' => q|\textbullet{}|, # bullet = black small circle + # bullet is NOT the same as bullet operator + 'hellip' => q|\textellipsis{}|, # horizontal ellipsis = three dot leader + 'prime' => q|\textquotesingle{}|, # prime = minutes = feet + 'Prime' => q|\textquotedbl{}|, # double prime = seconds = inches + 'oline' => q|\textasciimacron{}|, # overline = spacing overscore + 'frasl' => q|\textfractionsolidus{}|, # fraction slash + + # Letterlike Symbols + 'weierp' => q|$\wp$|, # script capital P = power set = Weierstrass p + 'image' => q|$\Re$|, # blackletter capital I = imaginary part + 'real' => q|$\Im$|, # blackletter capital R = real part symbol + 'trade' => q|\texttrademark{}|, # trade mark sign +# 'alefsym' => q||, # alef symbol = first transfinite cardinal + # alef symbol is NOT the same as hebrew letter alef, although the same + # glyph could be used to depict both characters + + # Arrows + 'larr' => q|\textleftarrow{}|, # leftwards arrow + 'uarr' => q|\textuparrow{}|, # upwards arrow + 'rarr' => q|\textrightarrow{}|, # rightwards arrow + 'darr' => q|\textdownarrow{}|, # downwards arrow + 'harr' => q|$\leftrightarrow$|, # left right arrow +# 'crarr' => q||, # downwards arrow with corner leftwards = carriage return + 'lArr' => q|$\Leftarrow$|, # leftwards double arrow + # ISO 10646 does not say that lArr is the same as the 'is implied by' + # arrow but also does not have any other character for that function. So + # lArr can be used for 'is implied by' as ISOtech suggests + 'uArr' => q|$\Uparrow$|, # upwards double arrow + 'rArr' => q|$\Rightarrow$|, # rightwards double arrow + # ISO 10646 does not say this is the 'implies' character but does not + # have another character with this function so ? rArr can be used for + # 'implies' as ISOtech suggests + 'dArr' => q|$\Downarrow$|, # downwards double arrow + 'hArr' => q|$\Leftrightarrow$|, # left right double arrow + + # Mathematical Operators. + # Some of these require the `amssymb' package. + 'forall' => q|$\forall$|, # for all + 'part' => q|$\partial$|, # partial differential + 'exist' => q|$\exists$|, # there exists + 'empty' => q|$\emptyset$|, # empty set = null set = diameter + 'nabla' => q|$\nabla$|, # nabla = backward difference + 'isin' => q|$\in$|, # element of + 'notin' => q|$\notin$|, # not an element of + 'ni' => q|$\ni$|, # contains as member + 'prod' => q|$\prod$|, # n-ary product = product sign + # prod is NOT the same character as 'greek capital letter pi' though the + # same glyph might be used for both + 'sum' => q|$\sum$|, # n-ary sumation + # sum is NOT the same character as 'greek capital letter sigma' though + # the same glyph might be used for both + 'minus' => q|$-$|, # minus sign + 'lowast' => q|$\ast$|, # asterisk operator + 'radic' => q|$\surd$|, # square root = radical sign + 'prop' => q|$\propto$|, # proportional to + 'infin' => q|$\infty$|, # infinity + 'ang' => q|$\angle$|, # angle + 'and' => q|$\wedge$|, # logical and = wedge + 'or' => q|$\vee$|, # logical or = vee + 'cap' => q|$\cap$|, # intersection = cap + 'cup' => q|$\cup$|, # union = cup + 'int' => q|$\int$|, # integral + 'there4' => q|$\therefore$|, # therefore + 'sim' => q|$\sim$|, # tilde operator = varies with = similar to + # tilde operator is NOT the same character as the tilde + 'cong' => q|$\cong$|, # approximately equal to + 'asymp' => q|$\asymp$|, # almost equal to = asymptotic to + 'ne' => q|$\neq$|, # not equal to + 'equiv' => q|$\equiv$|, # identical to + 'le' => q|$\leq$|, # less-than or equal to + 'ge' => q|$\geq$|, # greater-than or equal to + 'sub' => q|$\subset$|, # subset of + 'sup' => q|$\supset$|, # superset of + # note that nsup, 'not a superset of' is not covered by the Symbol font + # encoding and is not included. + 'nsub' => q|$\not\subset$|, # not a subset of + 'sube' => q|$\subseteq$|, # subset of or equal to + 'supe' => q|$\supseteq$|, # superset of or equal to + 'oplus' => q|$\oplus$|, # circled plus = direct sum + 'otimes' => q|$\otimes$|, # circled times = vector product + 'perp' => q|$\perp$|, # up tack = orthogonal to = perpendicular + 'sdot' => q|$\cdot$|, # dot operator + # dot operator is NOT the same character as middle dot + + # Miscellaneous Technical + 'lceil' => q|$\lceil$|, # left ceiling = apl upstile + 'rceil' => q|$\rceil$|, # right ceiling + 'lfloor' => q|$\lfloor$|, # left floor = apl downstile + 'rfloor' => q|$\rfloor$|, # right floor + 'lang' => q|$\langle$|, # left-pointing angle bracket = bra + # lang is NOT the same character as 'less than' or 'single left-pointing + # angle quotation mark' + 'rang' => q|$\rangle$|, # right-pointing angle bracket = ket + # rang is NOT the same character as 'greater than' or 'single + # right-pointing angle quotation mark' + + # Geometric Shapes + 'loz' => q|$\lozenge$|, # lozenge + + # Miscellaneous Symbols + 'spades' => q|$\spadesuit$|, # black spade suit + 'clubs' => q|$\clubsuit$|, # black club suit = shamrock + 'hearts' => q|$\heartsuit$|, # black heart suit = valentine + 'diams' => q|$\diamondsuit$|, # black diamond suit + + # C0 Controls and Basic Latin + 'quot' => q|"|, # quotation mark = APL quote ["] + 'amp' => q|\&|, # ampersand + 'lt' => q|<|, # less-than sign + 'gt' => q|>|, # greater-than sign + 'OElig' => q|\OE{}|, # latin capital ligature OE + 'oelig' => q|\oe{}|, # latin small ligature oe + 'Scaron' => q|\v{S}|, # latin capital letter S with caron + 'scaron' => q|\v{s}|, # latin small letter s with caron + 'Yuml' => q|\"Y|, # latin capital letter Y with diaeresis + 'circ' => q|\textasciicircum{}|, # modifier letter circumflex accent + 'tilde' => q|\textasciitilde{}|, # small tilde + 'ensp' => q|\phantom{n}|, # en space + 'emsp' => q|\hspace{1em}|, # em space + 'thinsp' => q|\,|, # thin space + 'zwnj' => q|{}|, # zero width non-joiner +# 'zwj' => q||, # zero width joiner +# 'lrm' => q||, # left-to-right mark +# 'rlm' => q||, # right-to-left mark + 'ndash' => q|--|, # en dash + 'mdash' => q|---|, # em dash + 'lsquo' => q|\textquoteleft{}|, # left single quotation mark + 'rsquo' => q|\textquoteright{}|, # right single quotation mark + 'sbquo' => q|\quotesinglbase{}|, # single low-9 quotation mark + 'ldquo' => q|\textquotedblleft{}|, # left double quotation mark + 'rdquo' => q|\textquotedblright{}|, # right double quotation mark + 'bdquo' => q|\quotedblbase{}|, # double low-9 quotation mark + 'dagger' => q|\textdagger{}|, # dagger + 'Dagger' => q|\textdaggerdbl{}|, # double dagger + 'permil' => q|\textperthousand{}|, # per mille sign + 'lsaquo' => q|\guilsinglleft{}|, # single left-pointing angle quotation mark + 'rsaquo' => q|\guilsinglright{}|, # single right-pointing angle quotation mark + 'euro' => q|\texteuro{}|, # euro sign +); + +=head1 OBJECT METHODS + +The following methods are provided in this module. Methods inherited +from C<Pod::Select> are not described in the public interface. + +=over 4 + +=begin __PRIVATE__ + +=item C<initialize> + +Initialise the object. This method is subclassed from C<Pod::Parser>. +The base class method is invoked. This method defines the default +behaviour of the object unless overridden by supplying arguments to +the constructor. + +Internal settings are defaulted as well as the public instance data. +Internal hash values are accessed directly (rather than through +a method) and start with an underscore. + +This method should not be invoked by the user directly. + +=end __PRIVATE__ + +=cut + + + +# - An array for nested lists + +# Arguments have already been read by this point + +sub initialize { + my $self = shift; + + # print Dumper($self); + + # Internals + $self->{_Lists} = []; # For nested lists + $self->{_suppress_all_para} = 0; # For =begin blocks + $self->{_dont_modify_any_para}=0; # For =begin blocks + $self->{_CURRENT_HEAD1} = ''; # Name of current HEAD1 section + + # Options - only initialise if not already set + + # Cause the '=head1 NAME' field to be treated specially + # The contents of the NAME paragraph will be converted + # to a section title. All subsequent =head1 will be converted + # to =head2 and down. Will not affect =head1's prior to NAME + # Assumes: 'Module - purpose' format + # Also creates a purpose field + # The name is used for Labeling of the subsequent subsections + $self->{ReplaceNAMEwithSection} = 0 + unless exists $self->{ReplaceNAMEwithSection}; + $self->{AddPreamble} = 1 # make full latex document + unless exists $self->{AddPreamble}; + $self->{StartWithNewPage} = 0 # Start new page for pod section + unless exists $self->{StartWithNewPage}; + $self->{TableOfContents} = 0 # Add table of contents + unless exists $self->{TableOfContents}; # only relevent if AddPreamble=1 + $self->{AddPostamble} = 1 # Add closing latex code at end + unless exists $self->{AddPostamble}; # effectively end{document} and index + $self->{MakeIndex} = 1 # Add index (only relevant AddPostamble + unless exists $self->{MakeIndex}; # and AddPreamble) + + $self->{UniqueLabels} = 1 # Use label unique for each pod + unless exists $self->{UniqueLabels}; # either based on the filename + # or supplied + + # Control the level of =head1. default is \section + # + $self->{Head1Level} = 1 # Offset in latex sections + unless exists $self->{Head1Level}; # 0 is chapter, 2 is subsection + + # Control at which level numbering of sections is turned off + # ie subsection becomes subsection* + # The numbering is relative to the latex sectioning commands + # and is independent of Pod heading level + # default is to number \section but not \subsection + $self->{LevelNoNum} = 2 + unless exists $self->{LevelNoNum}; + + # Label to be used as prefix to all internal section names + # If not defined will attempt to derive it from the filename + # This can not happen when running parse_from_filehandle though + # hence the ability to set the label externally + # The label could then be Pod::Parser_DESCRIPTION or somesuch + + $self->{Label} = undef # label to be used as prefix + unless exists $self->{Label}; # to all internal section names + + # These allow the caller to add arbritrary latex code to + # start and end of document. AddPreamble and AddPostamble are ignored + # if these are set. + # Also MakeIndex and TableOfContents are also ignored. + $self->{UserPreamble} = undef # User supplied start (AddPreamble =1) + unless exists $self->{Label}; + $self->{UserPostamble} = undef # Use supplied end (AddPostamble=1) + unless exists $self->{Label}; + + # Run base initialize + $self->SUPER::initialize; + +} + +=back + +=head2 Data Accessors + +The following methods are provided for accessing instance data. These +methods should be used for accessing configuration parameters rather +than assuming the object is a hash. + +Default values can be supplied by using these names as keys to a hash +of arguments when using the C<new()> constructor. + +=over 4 + +=item B<AddPreamble> + +Logical to control whether a C<latex> preamble is to be written. +If true, a valid C<latex> preamble is written before the pod data is written. +This is similar to: + + \documentclass{article} + \usepackage[T1]{fontenc} + \usepackage{textcomp} + \begin{document} + +but will be more complicated if table of contents and indexing are required. +Can be used to set or retrieve the current value. + + $add = $parser->AddPreamble(); + $parser->AddPreamble(1); + +If used in conjunction with C<AddPostamble> a full latex document will +be written that could be immediately processed by C<latex>. + +For some pod escapes it may be necessary to include the amsmath +package. This is not yet added to the preamble automaatically. + +=cut + +sub AddPreamble { + my $self = shift; + if (@_) { + $self->{AddPreamble} = shift; + } + return $self->{AddPreamble}; +} + +=item B<AddPostamble> + +Logical to control whether a standard C<latex> ending is written to the output +file after the document has been processed. +In its simplest form this is simply: + + \end{document} + +but can be more complicated if a index is required. +Can be used to set or retrieve the current value. + + $add = $parser->AddPostamble(); + $parser->AddPostamble(1); + +If used in conjunction with C<AddPreaamble> a full latex document will +be written that could be immediately processed by C<latex>. + +=cut + +sub AddPostamble { + my $self = shift; + if (@_) { + $self->{AddPostamble} = shift; + } + return $self->{AddPostamble}; +} + +=item B<Head1Level> + +The C<latex> sectioning level that should be used to correspond to +a pod C<=head1> directive. This can be used, for example, to turn +a C<=head1> into a C<latex> C<subsection>. This should hold a number +corresponding to the required position in an array containing the +following elements: + + [0] chapter + [1] section + [2] subsection + [3] subsubsection + [4] paragraph + [5] subparagraph + +Can be used to set or retrieve the current value: + + $parser->Head1Level(2); + $sect = $parser->Head1Level; + +Setting this number too high can result in sections that may not be reproducible +in the expected way. For example, setting this to 4 would imply that C<=head3> +do not have a corresponding C<latex> section (C<=head1> would correspond to +a C<paragraph>). + +A check is made to ensure that the supplied value is an integer in the +range 0 to 5. + +Default is for a value of 1 (i.e. a C<section>). + +=cut + +sub Head1Level { + my $self = shift; + if (@_) { + my $arg = shift; + if ($arg =~ /^\d$/ && $arg <= $#LatexSections) { + $self->{Head1Level} = $arg; + } else { + carp "Head1Level supplied ($arg) must be integer in range 0 to ".$#LatexSections . "- Ignoring\n"; + } + } + return $self->{Head1Level}; +} + +=item B<Label> + +This is the label that is prefixed to all C<latex> label and index +entries to make them unique. In general, pods have similarly titled +sections (NAME, DESCRIPTION etc) and a C<latex> label will be multiply +defined if more than one pod document is to be included in a single +C<latex> file. To overcome this, this label is prefixed to a label +whenever a label is required (joined with an underscore) or to an +index entry (joined by an exclamation mark which is the normal index +separator). For example, C<\label{text}> becomes C<\label{Label_text}>. + +Can be used to set or retrieve the current value: + + $label = $parser->Label; + $parser->Label($label); + +This label is only used if C<UniqueLabels> is true. +Its value is set automatically from the C<NAME> field +if C<ReplaceNAMEwithSection> is true. If this is not the case +it must be set manually before starting the parse. + +Default value is C<undef>. + +=cut + +sub Label { + my $self = shift; + if (@_) { + $self->{Label} = shift; + } + return $self->{Label}; +} + +=item B<LevelNoNum> + +Control the point at which C<latex> section numbering is turned off. +For example, this can be used to make sure that C<latex> sections +are numbered but subsections are not. + +Can be used to set or retrieve the current value: + + $lev = $parser->LevelNoNum; + $parser->LevelNoNum(2); + +The argument must be an integer between 0 and 5 and is the same as the +number described in C<Head1Level> method description. The number has +nothing to do with the pod heading number, only the C<latex> sectioning. + +Default is 2. (i.e. C<latex> subsections are written as C<subsection*> +but sections are numbered). + +=cut + +sub LevelNoNum { + my $self = shift; + if (@_) { + $self->{LevelNoNum} = shift; + } + return $self->{LevelNoNum}; +} + +=item B<MakeIndex> + +Controls whether C<latex> commands for creating an index are to be inserted +into the preamble and postamble + + $makeindex = $parser->MakeIndex; + $parser->MakeIndex(0); + +Irrelevant if both C<AddPreamble> and C<AddPostamble> are false (or equivalently, +C<UserPreamble> and C<UserPostamble> are set). + +Default is for an index to be created. + +=cut + +sub MakeIndex { + my $self = shift; + if (@_) { + $self->{MakeIndex} = shift; + } + return $self->{MakeIndex}; +} + +=item B<ReplaceNAMEwithSection> + +This controls whether the C<NAME> section in the pod is to be translated +literally or converted to a slightly modified output where the section +name is the pod name rather than "NAME". + +If true, the pod segment + + =head1 NAME + + pod::name - purpose + + =head1 SYNOPSIS + +is converted to the C<latex> + + \section{pod::name\label{pod_name}\index{pod::name}} + + Purpose + + \subsection*{SYNOPSIS\label{pod_name_SYNOPSIS}% + \index{pod::name!SYNOPSIS}} + +(dependent on the value of C<Head1Level> and C<LevelNoNum>). Note that +subsequent C<head1> directives translate to subsections rather than +sections and that the labels and index now include the pod name (dependent +on the value of C<UniqueLabels>). + +The C<Label> is set from the pod name regardless of any current value +of C<Label>. + + $mod = $parser->ReplaceNAMEwithSection; + $parser->ReplaceNAMEwithSection(0); + +Default is to translate the pod literally. + +=cut + +sub ReplaceNAMEwithSection { + my $self = shift; + if (@_) { + $self->{ReplaceNAMEwithSection} = shift; + } + return $self->{ReplaceNAMEwithSection}; +} + +=item B<StartWithNewPage> + +If true, each pod translation will begin with a C<latex> +C<\clearpage>. + + $parser->StartWithNewPage(1); + $newpage = $parser->StartWithNewPage; + +Default is false. + +=cut + +sub StartWithNewPage { + my $self = shift; + if (@_) { + $self->{StartWithNewPage} = shift; + } + return $self->{StartWithNewPage}; +} + +=item B<TableOfContents> + +If true, a table of contents will be created. +Irrelevant if C<AddPreamble> is false or C<UserPreamble> +is set. + + $toc = $parser->TableOfContents; + $parser->TableOfContents(1); + +Default is false. + +=cut + +sub TableOfContents { + my $self = shift; + if (@_) { + $self->{TableOfContents} = shift; + } + return $self->{TableOfContents}; +} + +=item B<UniqueLabels> + +If true, the translator will attempt to make sure that +each C<latex> label or index entry will be uniquely identified +by prefixing the contents of C<Label>. This allows +multiple documents to be combined without clashing +common labels such as C<DESCRIPTION> and C<SYNOPSIS> + + $parser->UniqueLabels(1); + $unq = $parser->UniqueLabels; + +Default is true. + +=cut + +sub UniqueLabels { + my $self = shift; + if (@_) { + $self->{UniqueLabels} = shift; + } + return $self->{UniqueLabels}; +} + +=item B<UserPreamble> + +User supplied C<latex> preamble. Added before the pod translation +data. + +If set, the contents will be prepended to the output file before the translated +data regardless of the value of C<AddPreamble>. +C<MakeIndex> and C<TableOfContents> will also be ignored. + +=cut + +sub UserPreamble { + my $self = shift; + if (@_) { + $self->{UserPreamble} = shift; + } + return $self->{UserPreamble}; +} + +=item B<UserPostamble> + +User supplied C<latex> postamble. Added after the pod translation +data. + +If set, the contents will be prepended to the output file after the translated +data regardless of the value of C<AddPostamble>. +C<MakeIndex> will also be ignored. + +=cut + +sub UserPostamble { + my $self = shift; + if (@_) { + $self->{UserPostamble} = shift; + } + return $self->{UserPostamble}; +} + +=begin __PRIVATE__ + +=item B<Lists> + +Contains details of the currently active lists. + The array contains C<Pod::List> objects. A new C<Pod::List> +object is created each time a list is encountered and it is +pushed onto this stack. When the list context ends, it +is popped from the stack. The array will be empty if no +lists are active. + +Returns array of list information in list context +Returns array ref in scalar context + +=cut + + + +sub lists { + my $self = shift; + return @{ $self->{_Lists} } if wantarray(); + return $self->{_Lists}; +} + +=end __PRIVATE__ + +=back + +=begin __PRIVATE__ + +=head2 Subclassed methods + +The following methods override methods provided in the C<Pod::Select> +base class. See C<Pod::Parser> and C<Pod::Select> for more information +on what these methods require. + +=over 4 + +=cut + +######### END ACCESSORS ################### + +# Opening pod + +=item B<begin_pod> + +Writes the C<latex> preamble if requested. Only writes something +if AddPreamble is true. Writes a standard header unless a UserPreamble +is defined. + +=cut + +sub begin_pod { + my $self = shift; + + # Get the pod identification + # This should really come from the '=head1 NAME' paragraph + + my $infile = $self->input_file; + my $class = ref($self); + my $date = gmtime(time); + + # Comment message to say where this came from + my $comment = << "__TEX_COMMENT__"; +%% Latex generated from POD in document $infile +%% Using the perl module $class +%% Converted on $date +__TEX_COMMENT__ + + # Write the preamble + # If the caller has supplied one then we just use that + + my $preamble = ''; + + if ($self->AddPreamble) { + + if (defined $self->UserPreamble) { + + $preamble = $self->UserPreamble; + + # Add the description of where this came from + $preamble .= "\n$comment\n%% Preamble supplied by user.\n\n"; + + } else { + + # Write our own preamble + + # Code to initialise index making + # Use an array so that we can prepend comment if required + my @makeidx = ( + '\usepackage{makeidx}', + '\makeindex', + ); + + unless ($self->MakeIndex) { + foreach (@makeidx) { + $_ = '%% ' . $_; + } + } + my $makeindex = join("\n",@makeidx) . "\n"; + + # Table of contents + my $tableofcontents = '\tableofcontents'; + + $tableofcontents = '%% ' . $tableofcontents + unless $self->TableOfContents; + + # Roll our own + $preamble = << "__TEX_HEADER__"; +\\documentclass{article} +\\usepackage[T1]{fontenc} +\\usepackage{textcomp} + +$comment + +$makeindex + +\\begin{document} + +$tableofcontents + +__TEX_HEADER__ + + } + } + + # Write the header (blank if none) + $self->_output($preamble); + + # Start on new page if requested + $self->_output("\\clearpage\n") if $self->StartWithNewPage; + +} + + +=item B<end_pod> + +Write the closing C<latex> code. Only writes something if AddPostamble +is true. Writes a standard header unless a UserPostamble is defined. + +=cut + +sub end_pod { + my $self = shift; + + # End string + my $end = ''; + + # Use the user version of the postamble if defined + if ($self->AddPostamble) { + + if (defined $self->UserPostamble) { + $end = $self->UserPostamble; + + } else { + + # Check for index + my $makeindex = '\printindex'; + + $makeindex = '%% '. $makeindex unless $self->MakeIndex; + + $end = "$makeindex\n\n\\end{document}\n"; + } + } + + $self->_output($end); + +} + +=item B<command> + +Process basic pod commands. + +=cut + +sub command { + my $self = shift; + my ($command, $paragraph, $line_num, $parobj) = @_; + + # return if we dont care + return if $command eq 'pod'; + + # Store a copy of the raw text in case we are in a =for + # block and need to preserve the existing latex + my $rawpara = $paragraph; + + # Do the latex escapes + $paragraph = $self->_replace_special_chars($paragraph); + + # Interpolate pod sequences in paragraph + $paragraph = $self->interpolate($paragraph, $line_num); + $paragraph =~ s/\s+$//; + + # Replace characters that can only be done after + # interpolation of interior sequences + $paragraph = $self->_replace_special_chars_late($paragraph); + + # Now run the command + if ($command eq 'over') { + + $self->begin_list($paragraph, $line_num); + + } elsif ($command eq 'item') { + + $self->add_item($paragraph, $line_num); + + } elsif ($command eq 'back') { + + $self->end_list($line_num); + + } elsif ($command eq 'head1') { + + # Store the name of the section + $self->{_CURRENT_HEAD1} = $paragraph; + + # Print it + $self->head(1, $paragraph, $parobj); + + } elsif ($command eq 'head2') { + + $self->head(2, $paragraph, $parobj); + + } elsif ($command eq 'head3') { + + $self->head(3, $paragraph, $parobj); + + } elsif ($command eq 'head4') { + + $self->head(4, $paragraph, $parobj); + + } elsif ($command eq 'head5') { + + $self->head(5, $paragraph, $parobj); + + } elsif ($command eq 'head6') { + + $self->head(6, $paragraph, $parobj); + + } elsif ($command eq 'begin') { + + # pass through if latex + if ($paragraph =~ /^latex/i) { + # Make sure that subsequent paragraphs are not modfied before printing + $self->{_dont_modify_any_para} = 1; + + } else { + # Suppress all subsequent paragraphs unless + # it is explcitly intended for latex + $self->{_suppress_all_para} = 1; + } + + } elsif ($command eq 'for') { + + # =for latex + # some latex + + # With =for we will get the text for the full paragraph + # as well as the format name. + # We do not get an additional paragraph later on. The next + # paragraph is not governed by the =for + + # The first line contains the format and the rest is the + # raw code. + my ($format, $chunk) = split(/\n/, $rawpara, 2); + + # If we have got some latex code print it out immediately + # unmodified. Else do nothing. + if ($format =~ /^latex/i) { + # Make sure that next paragraph is not modfied before printing + $self->_output( $chunk ); + + } + + } elsif ($command eq 'end') { + + # Reset suppression + $self->{_suppress_all_para} = 0; + $self->{_dont_modify_any_para} = 0; + + } elsif ($command eq 'pod') { + + # Do nothing + + } else { + carp "Command $command not recognised at line $line_num\n"; + } + +} + +=item B<verbatim> + +Verbatim text + +=cut + +sub verbatim { + my $self = shift; + my ($paragraph, $line_num, $parobj) = @_; + + # Expand paragraph unless in =begin block + if ($self->{_dont_modify_any_para}) { + # Just print as is + $self->_output($paragraph); + + } else { + + return if $paragraph =~ /^\s+$/; + + # Clean trailing space + $paragraph =~ s/\s+$//; + + # Clean tabs. Routine taken from Tabs.pm + # by David Muir Sharnoff muir@idiom.com, + # slightly modified by hsmyers@sdragons.com 10/22/01 + my @l = split("\n",$paragraph); + foreach (@l) { + 1 while s/(^|\n)([^\t\n]*)(\t+)/ + $1. $2 . (" " x + (8 * length($3) + - (length($2) % 8))) + /sex; + } + $paragraph = join("\n",@l); + # End of change. + + + + $self->_output('\begin{verbatim}' . "\n$paragraph\n". '\end{verbatim}'."\n"); + } +} + +=item B<textblock> + +Plain text paragraph. + +=cut + +sub textblock { + my $self = shift; + my ($paragraph, $line_num, $parobj) = @_; + + # print Dumper($self); + + # Expand paragraph unless in =begin block + if ($self->{_dont_modify_any_para}) { + # Just print as is + $self->_output($paragraph); + + return; + } + + + # Escape latex special characters + $paragraph = $self->_replace_special_chars($paragraph); + + # Interpolate interior sequences + my $expansion = $self->interpolate($paragraph, $line_num); + $expansion =~ s/\s+$//; + + # Escape special characters that can not be done earlier + $expansion = $self->_replace_special_chars_late($expansion); + + # If we are replacing 'head1 NAME' with a section + # we need to look in the paragraph and rewrite things + # Need to make sure this is called only on the first paragraph + # following 'head1 NAME' and not on subsequent paragraphs that may be + # present. + if ($self->{_CURRENT_HEAD1} =~ /^NAME/i && $self->ReplaceNAMEwithSection()) { + + # Strip white space from start and end + $paragraph =~ s/^\s+//; + $paragraph =~ s/\s$//; + + # Split the string into 2 parts + my ($name, $purpose) = split(/\s+-\s+/, $expansion,2); + + # Now prevent this from triggering until a new head1 NAME is set + $self->{_CURRENT_HEAD1} = '_NAME'; + + # Might want to clear the Label() before doing this (CHECK) + + # Print the heading + $self->head(1, $name, $parobj); + + # Set the labeling in case we want unique names later + $self->Label( $self->_create_label( $name, 1 ) ); + + # Raise the Head1Level by one so that subsequent =head1 appear + # as subsections of the main name section unless we are already + # at maximum [Head1Level() could check this itself - CHECK] + $self->Head1Level( $self->Head1Level() + 1) + unless $self->Head1Level == $#LatexSections; + + # Now write out the new latex paragraph + $purpose = ucfirst($purpose); + $self->_output("\n\n$purpose\n\n"); + + } else { + # Just write the output + $self->_output("\n\n$expansion\n\n"); + } + +} + +=item B<interior_sequence> + +Interior sequence expansion + +=cut + +sub interior_sequence { + my $self = shift; + + my ($seq_command, $seq_argument, $pod_seq) = @_; + + if ($seq_command eq 'B') { + return "\\textbf{$seq_argument}"; + + } elsif ($seq_command eq 'I') { + return "\\textit{$seq_argument}"; + + } elsif ($seq_command eq 'E') { + + # If it is simply a number + if ($seq_argument =~ /^\d+$/) { + return chr($seq_argument); + # Look up escape in hash table + } elsif (exists $HTML_Escapes{$seq_argument}) { + return $HTML_Escapes{$seq_argument}; + + } else { + my ($file, $line) = $pod_seq->file_line(); + warn "Escape sequence $seq_argument not recognised at line $line of file $file\n"; + return; + } + + } elsif ($seq_command eq 'Z') { + + # Zero width space + return '{}'; + + } elsif ($seq_command eq 'C') { + return "\\texttt{$seq_argument}"; + + } elsif ($seq_command eq 'F') { + return "\\emph{$seq_argument}"; + + } elsif ($seq_command eq 'S') { + # non breakable spaces + my $nbsp = '~'; + + $seq_argument =~ s/\s/$nbsp/g; + return $seq_argument; + + } elsif ($seq_command eq 'L') { + my $link = new Pod::Hyperlink($seq_argument); + + # undef on failure + unless (defined $link) { + carp $@; + return; + } + + # Handle internal links differently + my $type = $link->type; + my $page = $link->page; + + if ($type eq 'section' && $page eq '') { + # Use internal latex reference + my $node = $link->node; + + # Convert to a label + $node = $self->_create_label($node); + + return "\\S\\ref{$node}"; + + } else { + # Use default markup for external references + # (although Starlink would use \xlabel) + my $markup = $link->markup; + my ($file, $line) = $pod_seq->file_line(); + + return $self->interpolate($link->markup, $line); + } + + + + } elsif ($seq_command eq 'P') { + # Special markup for Pod::Hyperlink + # Replace :: with / - but not sure if I want to do this + # any more. + my $link = $seq_argument; + $link =~ s|::|/|g; + + my $ref = "\\emph{$seq_argument}"; + return $ref; + + } elsif ($seq_command eq 'Q') { + # Special markup for Pod::Hyperlink + return "\\textsf{$seq_argument}"; + + } elsif ($seq_command eq 'X') { + # Index entries + + # use \index command + # I will let '!' go through for now + # not sure how sub categories are handled in X<> + my $index = $self->_create_index($seq_argument); + return "\\index{$index}\n"; + + } else { + carp "Unknown sequence $seq_command<$seq_argument>"; + } + +} + +=back + +=head2 List Methods + +Methods used to handle lists. + +=over 4 + +=item B<begin_list> + +Called when a new list is found (via the C<over> directive). +Creates a new C<Pod::List> object and stores it on the +list stack. + + $parser->begin_list($indent, $line_num); + +=cut + +sub begin_list { + my $self = shift; + my $indent = shift; + my $line_num = shift; + + # Indicate that a list should be started for the next item + # need to do this to work out the type of list + push ( @{$self->lists}, new Pod::List(-indent => $indent, + -start => $line_num, + -file => $self->input_file, + ) + ); + +} + +=item B<end_list> + +Called when the end of a list is found (the C<back> directive). +Pops the C<Pod::List> object off the stack of lists and writes +the C<latex> code required to close a list. + + $parser->end_list($line_num); + +=cut + +sub end_list { + my $self = shift; + my $line_num = shift; + + unless (defined $self->lists->[-1]) { + my $file = $self->input_file; + warn "No list is active at line $line_num (file=$file). Missing =over?\n"; + return; + } + + # What to write depends on list type + my $type = $self->lists->[-1]->type; + + # Dont write anything if the list type is not set + # iomplying that a list was created but no entries were + # placed in it (eg because of a =begin/=end combination) + $self->_output("\\end{$type}\n") + if (defined $type && length($type) > 0); + + # Clear list + pop(@{ $self->lists}); + +} + +=item B<add_item> + +Add items to the list. The first time an item is encountered +(determined from the state of the current C<Pod::List> object) +the type of list is determined (ordered, unnumbered or description) +and the relevant latex code issued. + + $parser->add_item($paragraph, $line_num); + +=cut + +sub add_item { + my $self = shift; + my $paragraph = shift; + my $line_num = shift; + + unless (defined $self->lists->[-1]) { + my $file = $self->input_file; + warn "List has already ended by line $line_num of file $file. Missing =over?\n"; + # Replace special chars +# $paragraph = $self->_replace_special_chars($paragraph); + $self->_output("$paragraph\n\n"); + return; + } + + # If paragraphs printing is turned off via =begin/=end or whatver + # simply return immediately + return if $self->{_suppress_all_para}; + + # Check to see whether we are starting a new lists + if (scalar($self->lists->[-1]->item) == 0) { + + # Examine the paragraph to determine what type of list + # we have + $paragraph =~ s/\s+$//; + $paragraph =~ s/^\s+//; + + my $type; + if (substr($paragraph, 0,1) eq '*') { + $type = 'itemize'; + } elsif ($paragraph =~ /^\d/) { + $type = 'enumerate'; + } else { + $type = 'description'; + } + $self->lists->[-1]->type($type); + + $self->_output("\\begin{$type}\n"); + + } + + my $type = $self->lists->[-1]->type; + + if ($type eq 'description') { + # Handle long items - long items do not wrap + # If the string is longer than 40 characters we split + # it into a real item header and some bold text. + my $maxlen = 40; + my ($hunk1, $hunk2) = $self->_split_delimited( $paragraph, $maxlen ); + + # Print the first hunk + $self->_output("\n\\item[{$hunk1}] "); + + # and the second hunk if it is defined + if ($hunk2) { + $self->_output("\\textbf{$hunk2}"); + } else { + # Not there so make sure we have a new line + $self->_output("\\mbox{}"); + } + + } else { + # If the item was '* Something' or '\d+ something' we still need to write + # out the something. Also allow 1) and 1. + my $extra_info = $paragraph; + $extra_info =~ s/^(\*|\d+[\.\)]?)\s*//; + $self->_output("\n\\item $extra_info"); + } + + # Store the item name in the object. Required so that + # we can tell if the list is new or not + $self->lists->[-1]->item($paragraph); + +} + +=back + +=head2 Methods for headings + +=over 4 + +=item B<head> + +Print a heading of the required level. + + $parser->head($level, $paragraph, $parobj); + +The first argument is the pod heading level. The second argument +is the contents of the heading. The 3rd argument is a Pod::Paragraph +object so that the line number can be extracted. + +=cut + +sub head { + my $self = shift; + my $num = shift; + my $paragraph = shift; + my $parobj = shift; + + # If we are replace 'head1 NAME' with a section + # we return immediately if we get it + return + if ($self->{_CURRENT_HEAD1} =~ /^NAME/i && $self->ReplaceNAMEwithSection()); + + # Create a label + my $label = $self->_create_label($paragraph); + + # Create an index entry + my $index = $self->_create_index($paragraph); + + # Work out position in the above array taking into account + # that =head1 is equivalent to $self->Head1Level + + my $level = $self->Head1Level() - 1 + $num; + + # Warn if heading to large + if ($num > $#LatexSections) { + my $line = $parobj->file_line; + my $file = $self->input_file; + warn "Heading level too large ($level) for LaTeX at line $line of file $file\n"; + $level = $#LatexSections; + } + + # Check to see whether section should be unnumbered + my $star = ($level >= $self->LevelNoNum ? '*' : ''); + + # Section + $self->_output("\\" .$LatexSections[$level] .$star ."{$paragraph\\label{".$label ."}\\index{".$index."}}\n"); + +} + + +=back + +=end __PRIVATE__ + +=begin __PRIVATE__ + +=head2 Internal methods + +Internal routines are described in this section. They do not form part of the +public interface. All private methods start with an underscore. + +=over 4 + +=item B<_output> + +Output text to the output filehandle. This method must be always be called +to output parsed text. + + $parser->_output($text); + +Does not write anything if a =begin is active that should be +ignored. + +=cut + +sub _output { + my $self = shift; + my $text = shift; + + print { $self->output_handle } $text + unless $self->{_suppress_all_para}; + +} + + +=item B<_replace_special_chars> + +Subroutine to replace characters that are special in C<latex> +with the escaped forms + + $escaped = $parser->_replace_special_chars($paragraph); + +Need to call this routine before interior_sequences are munged but not +if verbatim. It must be called before interpolation of interior +sequences so that curly brackets and special latex characters inserted +during interpolation are not themselves escaped. This means that < and +> can not be modified here since the text still contains interior +sequences. + +Special characters and the C<latex> equivalents are: + + } \} + { \{ + _ \_ + $ \$ + % \% + & \& + \ $\backslash$ + ^ \^{} + ~ \~{} + # \# + +=cut + +sub _replace_special_chars { + my $self = shift; + my $paragraph = shift; + + # Replace a \ with $\backslash$ + # This is made more complicated because the dollars will be escaped + # by the subsequent replacement. Easiest to add \backslash + # now and then add the dollars + $paragraph =~ s/\\/\\backslash/g; + + # Must be done after escape of \ since this command adds latex escapes + # Replace characters that can be escaped + $paragraph =~ s/([\$\#&%_{}])/\\$1/g; + + # Replace ^ characters with \^{} so that $^F works okay + $paragraph =~ s/(\^)/\\$1\{\}/g; + + # Replace tilde (~) with \texttt{\~{}} + $paragraph =~ s/~/\\texttt\{\\~\{\}\}/g; + + # Now add the dollars around each \backslash + $paragraph =~ s/(\\backslash)/\$$1\$/g; + return $paragraph; +} + +=item B<_replace_special_chars_late> + +Replace special characters that can not be replaced before interior +sequence interpolation. See C<_replace_special_chars> for a routine +to replace special characters prior to interpolation of interior +sequences. + +Does the following transformation: + + < $<$ + > $>$ + | $|$ + + +=cut + +sub _replace_special_chars_late { + my $self = shift; + my $paragraph = shift; + + # < and > + $paragraph =~ s/(<|>)/\$$1\$/g; + + # Replace | with $|$ + $paragraph =~ s'\|'$|$'g; + + + return $paragraph; +} + + +=item B<_create_label> + +Return a string that can be used as an internal reference +in a C<latex> document (i.e. accepted by the C<\label> command) + + $label = $parser->_create_label($string) + +If UniqueLabels is true returns a label prefixed by Label() +This can be suppressed with an optional second argument. + + $label = $parser->_create_label($string, $suppress); + +If a second argument is supplied (of any value including undef) +the Label() is never prefixed. This means that this routine can +be called to create a Label() without prefixing a previous setting. + +=cut + +sub _create_label { + my $self = shift; + my $paragraph = shift; + my $suppress = (@_ ? 1 : 0 ); + + # Remove latex commands + $paragraph = $self->_clean_latex_commands($paragraph); + + # Remove non alphanumerics from the label and replace with underscores + # want to protect '-' though so use negated character classes + $paragraph =~ s/[^-:\w]/_/g; + + # Multiple underscores will look unsightly so remove repeats + # This will also have the advantage of tidying up the end and + # start of string + $paragraph =~ s/_+/_/g; + + # If required need to make sure that the label is unique + # since it is possible to have multiple pods in a single + # document + if (!$suppress && $self->UniqueLabels() && defined $self->Label) { + $paragraph = $self->Label() .'_'. $paragraph; + } + + return $paragraph; +} + + +=item B<_create_index> + +Similar to C<_create_label> except an index entry is created. +If C<UniqueLabels> is true, the index entry is prefixed by +the current C<Label> and an exclamation mark. + + $ind = $parser->_create_index($paragraph); + +An exclamation mark is used by C<makeindex> to generate +sub-entries in an index. + +=cut + +sub _create_index { + my $self = shift; + my $paragraph = shift; + my $suppress = (@_ ? 1 : 0 ); + + # Remove latex commands + $paragraph = $self->_clean_latex_commands($paragraph); + + # If required need to make sure that the index entry is unique + # since it is possible to have multiple pods in a single + # document + if (!$suppress && $self->UniqueLabels() && defined $self->Label) { + $paragraph = $self->Label() .'!'. $paragraph; + } + + # Need to replace _ with space + $paragraph =~ s/_/ /g; + + return $paragraph; + +} + +=item B<_clean_latex_commands> + +Removes latex commands from text. The latex command is assumed to be of the +form C<\command{ text }>. "C<text>" is retained + + $clean = $parser->_clean_latex_commands($text); + +=cut + +sub _clean_latex_commands { + my $self = shift; + my $paragraph = shift; + + # Remove latex commands of the form \text{ } + # and replace with the contents of the { } + # need to make this non-greedy so that it can handle + # "\text{a} and \text2{b}" + # without converting it to + # "a} and \text2{b" + # This match will still get into trouble if \} is present + # This is not vital since the subsequent replacement of non-alphanumeric + # characters will tidy it up anyway + $paragraph =~ s/\\\w+{(.*?)}/$1/g; + + return $paragraph +} + +=item B<_split_delimited> + +Split the supplied string into two parts at approximately the +specified word boundary. Special care is made to make sure that it +does not split in the middle of some curly brackets. + +e.g. "this text is \textbf{very bold}" would not be split into +"this text is \textbf{very" and " bold". + + ($hunk1, $hunk2) = $self->_split_delimited( $para, $length); + +The length indicates the maximum length of hunk1. + +=cut + +# initially Supplied by hsmyers@sdragons.com +# 10/25/01, utility to split \hbox +# busting lines. Reformatted by TimJ to match module style. +sub _split_delimited { + my $self = shift; + my $input = shift; + my $limit = shift; + + # Return immediately if already small + return ($input, '') if length($input) < $limit; + + my @output; + my $s = ''; + my $t = ''; + my $depth = 0; + my $token; + + $input =~ s/\n/ /gm; + $input .= ' '; + foreach ( split ( //, $input ) ) { + $token .= $_; + if (/\{/) { + $depth++; + } elsif ( /}/ ) { + $depth--; + } elsif ( / / and $depth == 0) { + push @output, $token if ( $token and $token ne ' ' ); + $token = ''; + } + } + + foreach (@output) { + if (length($s) < $limit) { + $s .= $_; + } else { + $t .= $_; + } + } + + # Tidy up + $s =~ s/\s+$//; + $t =~ s/\s+$//; + return ($s,$t); +} + +=back + +=end __PRIVATE__ + +=head1 NOTES + +Compatible with C<latex2e> only. Can not be used with C<latex> v2.09 +or earlier. + +A subclass of C<Pod::Select> so that specific pod sections can be +converted to C<latex> by using the C<select> method. + +Some HTML escapes are missing and many have not been tested. + +=head1 SEE ALSO + +L<Pod::Parser>, L<Pod::Select>, L<pod2latex> + +=head1 AUTHORS + +Tim Jenness E<lt>tjenness@cpan.orgE<gt> + +Bug fixes and improvements have been received from: Simon Cozens +E<lt>simon@cozens.netE<gt>, Mark A. Hershberger +E<lt>mah@everybody.orgE<gt>, Marcel Grunauer +E<lt>marcel@codewerk.comE<gt>, Hugh S Myers +E<lt>hsmyers@sdragons.comE<gt>, Peter J Acklam +E<lt>jacklam@math.uio.noE<gt>, Sudhi Herle E<lt>sudhi@herle.netE<gt>, +Ariel Scolnicov E<lt>ariels@compugen.co.ilE<gt>, +Adriano Rodrigues Ferreira E<lt>ferreira@triang.com.brE<gt> and +R. de Vries E<lt>r.de.vries@dutchspace.nlE<gt>. + + +=head1 COPYRIGHT + +Copyright (C) 2000-2004 Tim Jenness. All Rights Reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=begin __PRIVATE__ + +=head1 REVISION + +$Id: LaTeX.pm,v 1.19 2004/12/30 01:40:44 timj Exp $ + +=end __PRIVATE__ + +=cut + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Man.pm b/Master/tlpkg/tlperl.old/lib/Pod/Man.pm new file mode 100644 index 00000000000..693e4c46896 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Man.pm @@ -0,0 +1,1413 @@ +# Pod::Man -- Convert POD data to formatted *roff input. +# $Id: Man.pm,v 1.37 2003/03/30 22:34:11 eagle Exp $ +# +# Copyright 1999, 2000, 2001, 2002, 2003 by Russ Allbery <rra@stanford.edu> +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. +# +# This module translates POD documentation into *roff markup using the man +# macro set, and is intended for converting POD documents written as Unix +# manual pages to manual pages that can be read by the man(1) command. It is +# a replacement for the pod2man command distributed with versions of Perl +# prior to 5.6. +# +# Perl core hackers, please note that this module is also separately +# maintained outside of the Perl core as part of the podlators. Please send +# me any patches at the address above in addition to sending them to the +# standard Perl mailing lists. + +############################################################################## +# Modules and declarations +############################################################################## + +package Pod::Man; + +require 5.005; + +use Carp qw(carp croak); +use Pod::ParseLink qw(parselink); +use Pod::Parser (); + +use strict; +use subs qw(makespace); +use vars qw(@ISA %ESCAPES $PREAMBLE $VERSION); + +@ISA = qw(Pod::Parser); + +# Don't use the CVS revision as the version, since this module is also in Perl +# core and too many things could munge CVS magic revision strings. This +# number should ideally be the same as the CVS revision in podlators, however. +$VERSION = 1.37; + + +############################################################################## +# Preamble and *roff output tables +############################################################################## + +# The following is the static preamble which starts all *roff output we +# generate. It's completely static except for the font to use as a +# fixed-width font, which is designed by @CFONT@, and the left and right +# quotes to use for C<> text, designated by @LQOUTE@ and @RQUOTE@. $PREAMBLE +# should therefore be run through s/\@CFONT\@/<font>/g before output. +$PREAMBLE = <<'----END OF PREAMBLE----'; +.de Sh \" Subsection heading +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft @CFONT@ +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" Set up some character translations and predefined strings. \*(-- will +.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +.\" double quote, and \*(R" will give a right double quote. \*(C+ will +.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +.\" nothing in troff, for use with C<>. +.tr \(*W- +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.ie n \{\ +. ds -- \(*W- +. ds PI pi +. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +. ds L" "" +. ds R" "" +. ds C` @LQUOTE@ +. ds C' @RQUOTE@ +'br\} +.el\{\ +. ds -- \|\(em\| +. ds PI \(*p +. ds L" `` +. ds R" '' +'br\} +.\" +.\" If the F register is turned on, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. nr % 0 +. rr F +.\} +.\" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.hy 0 +.if n .na +.\" +.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +.\" Fear. Run. Save yourself. No user-serviceable parts. +. \" fudge factors for nroff and troff +.if n \{\ +. ds #H 0 +. ds #V .8m +. ds #F .3m +. ds #[ \f1 +. ds #] \fP +.\} +.if t \{\ +. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +. ds #V .6m +. ds #F 0 +. ds #[ \& +. ds #] \& +.\} +. \" simple accents for nroff and troff +.if n \{\ +. ds ' \& +. ds ` \& +. ds ^ \& +. ds , \& +. ds ~ ~ +. ds / +.\} +.if t \{\ +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +.\} +. \" troff and (daisy-wheel) nroff accents +.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +.ds ae a\h'-(\w'a'u*4/10)'e +.ds Ae A\h'-(\w'A'u*4/10)'E +. \" corrections for vroff +.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +. \" for low resolution devices (crt and lpr) +.if \n(.H>23 .if \n(.V>19 \ +\{\ +. ds : e +. ds 8 ss +. ds o a +. ds d- d\h'-1'\(ga +. ds D- D\h'-1'\(hy +. ds th \o'bp' +. ds Th \o'LP' +. ds ae ae +. ds Ae AE +.\} +.rm #[ #] #H #V #F C +----END OF PREAMBLE---- +#`# for cperl-mode + +# This table is taken nearly verbatim from Tom Christiansen's pod2man. It +# assumes that the standard preamble has already been printed, since that's +# what defines all of the accent marks. Note that some of these are quoted +# with double quotes since they contain embedded single quotes, so use \\ +# uniformly for backslash for readability. +%ESCAPES = ( + 'amp' => '&', # ampersand + 'apos' => "'", # apostrophe + 'lt' => '<', # left chevron, less-than + 'gt' => '>', # right chevron, greater-than + 'quot' => '"', # double quote + 'sol' => '/', # solidus (forward slash) + 'verbar' => '|', # vertical bar + + 'Aacute' => "A\\*'", # capital A, acute accent + 'aacute' => "a\\*'", # small a, acute accent + 'Acirc' => 'A\\*^', # capital A, circumflex accent + 'acirc' => 'a\\*^', # small a, circumflex accent + 'AElig' => '\*(AE', # capital AE diphthong (ligature) + 'aelig' => '\*(ae', # small ae diphthong (ligature) + 'Agrave' => "A\\*`", # capital A, grave accent + 'agrave' => "A\\*`", # small a, grave accent + 'Aring' => 'A\\*o', # capital A, ring + 'aring' => 'a\\*o', # small a, ring + 'Atilde' => 'A\\*~', # capital A, tilde + 'atilde' => 'a\\*~', # small a, tilde + 'Auml' => 'A\\*:', # capital A, dieresis or umlaut mark + 'auml' => 'a\\*:', # small a, dieresis or umlaut mark + 'Ccedil' => 'C\\*,', # capital C, cedilla + 'ccedil' => 'c\\*,', # small c, cedilla + 'Eacute' => "E\\*'", # capital E, acute accent + 'eacute' => "e\\*'", # small e, acute accent + 'Ecirc' => 'E\\*^', # capital E, circumflex accent + 'ecirc' => 'e\\*^', # small e, circumflex accent + 'Egrave' => 'E\\*`', # capital E, grave accent + 'egrave' => 'e\\*`', # small e, grave accent + 'ETH' => '\\*(D-', # capital Eth, Icelandic + 'eth' => '\\*(d-', # small eth, Icelandic + 'Euml' => 'E\\*:', # capital E, dieresis or umlaut mark + 'euml' => 'e\\*:', # small e, dieresis or umlaut mark + 'Iacute' => "I\\*'", # capital I, acute accent + 'iacute' => "i\\*'", # small i, acute accent + 'Icirc' => 'I\\*^', # capital I, circumflex accent + 'icirc' => 'i\\*^', # small i, circumflex accent + 'Igrave' => 'I\\*`', # capital I, grave accent + 'igrave' => 'i\\*`', # small i, grave accent + 'Iuml' => 'I\\*:', # capital I, dieresis or umlaut mark + 'iuml' => 'i\\*:', # small i, dieresis or umlaut mark + 'Ntilde' => 'N\*~', # capital N, tilde + 'ntilde' => 'n\*~', # small n, tilde + 'Oacute' => "O\\*'", # capital O, acute accent + 'oacute' => "o\\*'", # small o, acute accent + 'Ocirc' => 'O\\*^', # capital O, circumflex accent + 'ocirc' => 'o\\*^', # small o, circumflex accent + 'Ograve' => 'O\\*`', # capital O, grave accent + 'ograve' => 'o\\*`', # small o, grave accent + 'Oslash' => 'O\\*/', # capital O, slash + 'oslash' => 'o\\*/', # small o, slash + 'Otilde' => 'O\\*~', # capital O, tilde + 'otilde' => 'o\\*~', # small o, tilde + 'Ouml' => 'O\\*:', # capital O, dieresis or umlaut mark + 'ouml' => 'o\\*:', # small o, dieresis or umlaut mark + 'szlig' => '\*8', # small sharp s, German (sz ligature) + 'THORN' => '\\*(Th', # capital THORN, Icelandic + 'thorn' => '\\*(th', # small thorn, Icelandic + 'Uacute' => "U\\*'", # capital U, acute accent + 'uacute' => "u\\*'", # small u, acute accent + 'Ucirc' => 'U\\*^', # capital U, circumflex accent + 'ucirc' => 'u\\*^', # small u, circumflex accent + 'Ugrave' => 'U\\*`', # capital U, grave accent + 'ugrave' => 'u\\*`', # small u, grave accent + 'Uuml' => 'U\\*:', # capital U, dieresis or umlaut mark + 'uuml' => 'u\\*:', # small u, dieresis or umlaut mark + 'Yacute' => "Y\\*'", # capital Y, acute accent + 'yacute' => "y\\*'", # small y, acute accent + 'yuml' => 'y\\*:', # small y, dieresis or umlaut mark + + 'nbsp' => '\\ ', # non-breaking space + 'shy' => '', # soft (discretionary) hyphen +); + + +############################################################################## +# Static helper functions +############################################################################## + +# Protect leading quotes and periods against interpretation as commands. Also +# protect anything starting with a backslash, since it could expand or hide +# something that *roff would interpret as a command. This is overkill, but +# it's much simpler than trying to parse *roff here. +sub protect { + local $_ = shift; + s/^([.\'\\])/\\&$1/mg; + $_; +} + +# Translate a font string into an escape. +sub toescape { (length ($_[0]) > 1 ? '\f(' : '\f') . $_[0] } + + +############################################################################## +# Initialization +############################################################################## + +# Initialize the object. Here, we also process any additional options passed +# to the constructor or set up defaults if none were given. center is the +# centered title, release is the version number, and date is the date for the +# documentation. Note that we can't know what file name we're processing due +# to the architecture of Pod::Parser, so that *has* to either be passed to the +# constructor or set separately with Pod::Man::name(). +sub initialize { + my $self = shift; + + # Figure out the fixed-width font. If user-supplied, make sure that they + # are the right length. + for (qw/fixed fixedbold fixeditalic fixedbolditalic/) { + if (defined $$self{$_}) { + if (length ($$self{$_}) < 1 || length ($$self{$_}) > 2) { + croak qq(roff font should be 1 or 2 chars,) + . qq( not "$$self{$_}"); + } + } else { + $$self{$_} = ''; + } + } + + # Set the default fonts. We can't be sure what fixed bold-italic is going + # to be called, so default to just bold. + $$self{fixed} ||= 'CW'; + $$self{fixedbold} ||= 'CB'; + $$self{fixeditalic} ||= 'CI'; + $$self{fixedbolditalic} ||= 'CB'; + + # Set up a table of font escapes. First number is fixed-width, second is + # bold, third is italic. + $$self{FONTS} = { '000' => '\fR', '001' => '\fI', + '010' => '\fB', '011' => '\f(BI', + '100' => toescape ($$self{fixed}), + '101' => toescape ($$self{fixeditalic}), + '110' => toescape ($$self{fixedbold}), + '111' => toescape ($$self{fixedbolditalic})}; + + # Extra stuff for page titles. + $$self{center} = 'User Contributed Perl Documentation' + unless defined $$self{center}; + $$self{indent} = 4 unless defined $$self{indent}; + + # We used to try first to get the version number from a local binary, but + # we shouldn't need that any more. Get the version from the running Perl. + # Work a little magic to handle subversions correctly under both the + # pre-5.6 and the post-5.6 version numbering schemes. + if (!defined $$self{release}) { + my @version = ($] =~ /^(\d+)\.(\d{3})(\d{0,3})$/); + $version[2] ||= 0; + $version[2] *= 10 ** (3 - length $version[2]); + for (@version) { $_ += 0 } + $$self{release} = 'perl v' . join ('.', @version); + } + + # Double quotes in things that will be quoted. + for (qw/center date release/) { + $$self{$_} =~ s/\"/\"\"/g if $$self{$_}; + } + + # Figure out what quotes we'll be using for C<> text. + $$self{quotes} ||= '"'; + if ($$self{quotes} eq 'none') { + $$self{LQUOTE} = $$self{RQUOTE} = ''; + } elsif (length ($$self{quotes}) == 1) { + $$self{LQUOTE} = $$self{RQUOTE} = $$self{quotes}; + } elsif ($$self{quotes} =~ /^(.)(.)$/ + || $$self{quotes} =~ /^(..)(..)$/) { + $$self{LQUOTE} = $1; + $$self{RQUOTE} = $2; + } else { + croak qq(Invalid quote specification "$$self{quotes}"); + } + + # Double the first quote; note that this should not be s///g as two double + # quotes is represented in *roff as three double quotes, not four. Weird, + # I know. + $$self{LQUOTE} =~ s/\"/\"\"/; + $$self{RQUOTE} =~ s/\"/\"\"/; + + $self->SUPER::initialize; +} + +# For each document we process, output the preamble first. +sub begin_pod { + my $self = shift; + + # Try to figure out the name and section from the file name. + my $section = $$self{section} || 1; + my $name = $$self{name}; + if (!defined $name) { + $name = $self->input_file; + $section = 3 if (!$$self{section} && $name =~ /\.pm\z/i); + $name =~ s/\.p(od|[lm])\z//i; + if ($section !~ /^3/) { + require File::Basename; + $name = uc File::Basename::basename ($name); + } else { + # Assume that we're dealing with a module. We want to figure out + # the full module name from the path to the file, but we don't + # want to include too much of the path into the module name. Lose + # everything up to the first of: + # + # */lib/*perl*/ standard or site_perl module + # */*perl*/lib/ from -Dprefix=/opt/perl + # */*perl*/ random module hierarchy + # + # which works. Also strip off a leading site or site_perl + # component, any OS-specific component, and any version number + # component, and strip off an initial component of "lib" or + # "blib/lib" since that's what ExtUtils::MakeMaker creates. + # splitdir requires at least File::Spec 0.8. + require File::Spec; + my ($volume, $dirs, $file) = File::Spec->splitpath ($name); + my @dirs = File::Spec->splitdir ($dirs); + my $cut = 0; + my $i; + for ($i = 0; $i < scalar @dirs; $i++) { + if ($dirs[$i] eq 'lib' && $dirs[$i + 1] =~ /perl/) { + $cut = $i + 2; + last; + } elsif ($dirs[$i] =~ /perl/) { + $cut = $i + 1; + $cut++ if $dirs[$i + 1] eq 'lib'; + last; + } + } + if ($cut > 0) { + splice (@dirs, 0, $cut); + shift @dirs if ($dirs[0] =~ /^site(_perl)?$/); + shift @dirs if ($dirs[0] =~ /^[\d.]+$/); + shift @dirs if ($dirs[0] =~ /^(.*-$^O|$^O-.*|$^O)$/); + } + shift @dirs if $dirs[0] eq 'lib'; + splice (@dirs, 0, 2) if ($dirs[0] eq 'blib' && $dirs[1] eq 'lib'); + + # Remove empty directories when building the module name; they + # occur too easily on Unix by doubling slashes. + $name = join ('::', (grep { $_ ? $_ : () } @dirs), $file); + } + } + + # If $name contains spaces, quote it; this mostly comes up in the case of + # input from stdin. + $name = '"' . $name . '"' if ($name =~ /\s/); + + # Modification date header. Try to use the modification time of our + # input. + if (!defined $$self{date}) { + my $time = (stat $self->input_file)[9] || time; + my ($day, $month, $year) = (localtime $time)[3,4,5]; + $month++; + $year += 1900; + $$self{date} = sprintf ('%4d-%02d-%02d', $year, $month, $day); + } + + # Now, print out the preamble and the title. The meaning of the arguments + # to .TH unfortunately vary by system; some systems consider the fourth + # argument to be a "source" and others use it as a version number. + # Generally it's just presented as the left-side footer, though, so it + # doesn't matter too much if a particular system gives it another + # interpretation. + # + # The order of date and release used to be reversed in older versions of + # this module, but this order is correct for both Solaris and Linux. + local $_ = $PREAMBLE; + s/\@CFONT\@/$$self{fixed}/; + s/\@LQUOTE\@/$$self{LQUOTE}/; + s/\@RQUOTE\@/$$self{RQUOTE}/; + chomp $_; + my $pversion = $Pod::Parser::VERSION; + print { $self->output_handle } <<"----END OF HEADER----"; +.\\" Automatically generated by Pod::Man v$VERSION, Pod::Parser v$pversion +.\\" +.\\" Standard preamble: +.\\" ======================================================================== +$_ +.\\" ======================================================================== +.\\" +.IX Title "$name $section" +.TH $name $section "$$self{date}" "$$self{release}" "$$self{center}" +----END OF HEADER---- + + # Initialize a few per-file variables. + $$self{INDENT} = 0; # Current indentation level. + $$self{INDENTS} = []; # Stack of indentations. + $$self{INDEX} = []; # Index keys waiting to be printed. + $$self{IN_NAME} = 0; # Whether processing the NAME section. + $$self{ITEMS} = 0; # The number of consecutive =items. + $$self{ITEMTYPES} = []; # Stack of =item types, one per list. + $$self{SHIFTWAIT} = 0; # Whether there is a shift waiting. + $$self{SHIFTS} = []; # Stack of .RS shifts. +} + + +############################################################################## +# Core overrides +############################################################################## + +# Called for each command paragraph. Gets the command, the associated +# paragraph, the line number, and a Pod::Paragraph object. Just dispatches +# the command to a method named the same as the command. =cut is handled +# internally by Pod::Parser. +sub command { + my $self = shift; + my $command = shift; + return if $command eq 'pod'; + return if ($$self{EXCLUDE} && $command ne 'end'); + if ($self->can ('cmd_' . $command)) { + $command = 'cmd_' . $command; + $self->$command (@_); + } else { + my ($text, $line, $paragraph) = @_; + my $file; + ($file, $line) = $paragraph->file_line; + $text =~ s/\n+\z//; + $text = " $text" if ($text =~ /^\S/); + warn qq($file:$line: Unknown command paragraph "=$command$text"\n); + return; + } +} + +# Called for a verbatim paragraph. Gets the paragraph, the line number, and a +# Pod::Paragraph object. Rofficate backslashes, untabify, put a zero-width +# character at the beginning of each line to protect against commands, and +# wrap in .Vb/.Ve. +sub verbatim { + my $self = shift; + return if $$self{EXCLUDE}; + local $_ = shift; + return if /^\s+$/; + s/\s+$/\n/; + my $lines = tr/\n/\n/; + 1 while s/^(.*?)(\t+)/$1 . ' ' x (length ($2) * 8 - length ($1) % 8)/me; + s/\\/\\e/g; + s/-/\\-/g; + s/'/\\(aq/g; + s/^(\s*\S)/'\&' . $1/gme; + $self->makespace; + $self->output (".Vb $lines\n$_.Ve\n"); + $$self{NEEDSPACE} = 1; +} + +# Called for a regular text block. Gets the paragraph, the line number, and a +# Pod::Paragraph object. Perform interpolation and output the results. +sub textblock { + my $self = shift; + return if $$self{EXCLUDE}; + $self->output ($_[0]), return if $$self{VERBATIM}; + + # Parse the tree. collapse knows about references to scalars as well as + # scalars and does the right thing with them. Tidy up any trailing + # whitespace. + my $text = shift; + $text = $self->parse ($text, @_); + $text =~ s/\n\s*$/\n/; + + # Output the paragraph. We also have to handle =over without =item. If + # there's an =over without =item, SHIFTWAIT will be set, and we need to + # handle creation of the indent here. Add the shift to SHIFTS so that it + # will be cleaned up on =back. + $self->makespace; + if ($$self{SHIFTWAIT}) { + $self->output (".RS $$self{INDENT}\n"); + push (@{ $$self{SHIFTS} }, $$self{INDENT}); + $$self{SHIFTWAIT} = 0; + } + $self->output (protect $self->textmapfonts ($text)); + $self->outindex; + $$self{NEEDSPACE} = 1; +} + +# Called for a formatting code. Takes a Pod::InteriorSequence object and +# returns a reference to a scalar. This scalar is the final formatted text. +# It's returned as a reference to an array so that other formatting codes +# above us know that the text has already been processed. +sub sequence { + my ($self, $seq) = @_; + my $command = $seq->cmd_name; + + # We have to defer processing of the inside of an L<> formatting code. If + # this code is nested inside an L<> code, return the literal raw text of + # it. + my $parent = $seq->nested; + while (defined $parent) { + return $seq->raw_text if ($parent->cmd_name eq 'L'); + $parent = $parent->nested; + } + + # Zero-width characters. + return [ '\&' ] if ($command eq 'Z'); + + # C<>, L<>, X<>, and E<> don't apply guesswork to their contents. C<> + # needs some additional special handling. + my $literal = ($command =~ /^[CELX]$/); + local $_ = $self->collapse ($seq->parse_tree, $literal, $command eq 'C'); + + # Handle E<> escapes. Numeric escapes that match one of the supported ISO + # 8859-1 characters don't work at present. + if ($command eq 'E') { + if (/^\d+$/) { + return [ chr ($_) ]; + } elsif (exists $ESCAPES{$_}) { + return [ $ESCAPES{$_} ]; + } else { + my ($file, $line) = $seq->file_line; + warn "$file:$line: Unknown escape E<$_>\n"; + return [ "E<$_>" ]; + } + } + + # For all the other codes, empty content produces no output. + return '' if $_ eq ''; + + # Handle simple formatting codes. + if ($command eq 'B') { + return [ '\f(BS' . $_ . '\f(BE' ]; + } elsif ($command eq 'F' || $command eq 'I') { + return [ '\f(IS' . $_ . '\f(IE' ]; + } elsif ($command eq 'C') { + return [ $self->quote_literal ($_) ]; + } + + # Handle links. + if ($command eq 'L') { + my ($text, $type) = (parselink ($_))[1,4]; + return '' unless $text; + my ($file, $line) = $seq->file_line; + $text = $self->parse ($text, $line); + $text = '<' . $text . '>' if $type eq 'url'; + return [ $text ]; + } + + # Whitespace protection replaces whitespace with "\ ". + if ($command eq 'S') { + s/\s+/\\ /g; + return [ $_ ]; + } + + # Add an index entry to the list of ones waiting to be output. + if ($command eq 'X') { + push (@{ $$self{INDEX} }, $_); + return ''; + } + + # Anything else is unknown. + my ($file, $line) = $seq->file_line; + warn "$file:$line: Unknown formatting code $command<$_>\n"; +} + + +############################################################################## +# Command paragraphs +############################################################################## + +# All command paragraphs take the paragraph and the line number. + +# First level heading. We can't output .IX in the NAME section due to a bug +# in some versions of catman, so don't output a .IX for that section. .SH +# already uses small caps, so remove \s1 and \s-1. Maintain IN_NAME as +# appropriate, but don't leave it set while calling parse() so as to not +# override guesswork on section headings after NAME. +sub cmd_head1 { + my $self = shift; + $$self{IN_NAME} = 0; + local $_ = $self->parse (@_); + s/\s+$//; + s/\\s-?\d//g; + s/\s*\n\s*/ /g; + if ($$self{ITEMS} > 1) { + $$self{ITEMS} = 0; + $self->output (".PD\n"); + } + $self->output ($self->switchquotes ('.SH', $self->mapfonts ($_))); + $self->outindex (($_ eq 'NAME') ? () : ('Header', $_)); + $$self{NEEDSPACE} = 0; + $$self{IN_NAME} = ($_ eq 'NAME'); +} + +# Second level heading. +sub cmd_head2 { + my $self = shift; + local $_ = $self->parse (@_); + s/\s+$//; + s/\s*\n\s*/ /g; + if ($$self{ITEMS} > 1) { + $$self{ITEMS} = 0; + $self->output (".PD\n"); + } + $self->output ($self->switchquotes ('.Sh', $self->mapfonts ($_))); + $self->outindex ('Subsection', $_); + $$self{NEEDSPACE} = 0; +} + +# Third level heading. +sub cmd_head3 { + my $self = shift; + local $_ = $self->parse (@_); + s/\s+$//; + s/\s*\n\s*/ /g; + if ($$self{ITEMS} > 1) { + $$self{ITEMS} = 0; + $self->output (".PD\n"); + } + $self->makespace; + $self->output ($self->textmapfonts ('\f(IS' . $_ . '\f(IE') . "\n"); + $self->outindex ('Subsection', $_); + $$self{NEEDSPACE} = 1; +} + +# Fourth level heading. +sub cmd_head4 { + my $self = shift; + local $_ = $self->parse (@_); + s/\s+$//; + s/\s*\n\s*/ /g; + if ($$self{ITEMS} > 1) { + $$self{ITEMS} = 0; + $self->output (".PD\n"); + } + $self->makespace; + $self->output ($self->textmapfonts ($_) . "\n"); + $self->outindex ('Subsection', $_); + $$self{NEEDSPACE} = 1; +} + +# Start a list. For indents after the first, wrap the outside indent in .RS +# so that hanging paragraph tags will be correct. +sub cmd_over { + my $self = shift; + local $_ = shift; + unless (/^[-+]?\d+\s+$/) { $_ = $$self{indent} } + if (@{ $$self{SHIFTS} } < @{ $$self{INDENTS} }) { + $self->output (".RS $$self{INDENT}\n"); + push (@{ $$self{SHIFTS} }, $$self{INDENT}); + } + push (@{ $$self{INDENTS} }, $$self{INDENT}); + push (@{ $$self{ITEMTYPES} }, 'unknown'); + $$self{INDENT} = ($_ + 0); + $$self{SHIFTWAIT} = 1; +} + +# End a list. If we've closed an embedded indent, we've mangled the hanging +# paragraph indent, so temporarily replace it with .RS and set WEIRDINDENT. +# We'll close that .RS at the next =back or =item. +sub cmd_back { + my $self = shift; + $$self{INDENT} = pop @{ $$self{INDENTS} }; + if (defined $$self{INDENT}) { + pop @{ $$self{ITEMTYPES} }; + } else { + my ($file, $line, $paragraph) = @_; + ($file, $line) = $paragraph->file_line; + warn "$file:$line: Unmatched =back\n"; + $$self{INDENT} = 0; + } + if (@{ $$self{SHIFTS} } > @{ $$self{INDENTS} }) { + $self->output (".RE\n"); + pop @{ $$self{SHIFTS} }; + } + if (@{ $$self{INDENTS} } > 0) { + $self->output (".RE\n"); + $self->output (".RS $$self{INDENT}\n"); + } + $$self{NEEDSPACE} = 1; + $$self{SHIFTWAIT} = 0; +} + +# An individual list item. Emit an index entry for anything that's +# interesting, but don't emit index entries for things like bullets and +# numbers. rofficate bullets too while we're at it (so for nice output, use * +# for your lists rather than o or . or - or some other thing). Newlines in an +# item title are turned into spaces since *roff can't handle them embedded. +sub cmd_item { + my $self = shift; + local $_ = $self->parse (@_); + s/\s+$//; + s/\s*\n\s*/ /g; + my $index; + if (/\w/ && !/^\w[.\)]\s*$/) { + $index = $_; + $index =~ s/^\s*[-*+o.]?(?:\s+|\Z)//; + } + $_ = '*' unless length ($_) > 0; + my $type = $$self{ITEMTYPES}[0]; + unless (defined $type) { + my ($file, $line, $paragraph) = @_; + ($file, $line) = $paragraph->file_line; + $type = 'unknown'; + } + if ($type eq 'unknown') { + $type = /^\*\s*\Z/ ? 'bullet' : 'text'; + $$self{ITEMTYPES}[0] = $type if $$self{ITEMTYPES}[0]; + } + s/^\*\s*\Z/\\\(bu/ if $type eq 'bullet'; + if (@{ $$self{SHIFTS} } == @{ $$self{INDENTS} }) { + $self->output (".RE\n"); + pop @{ $$self{SHIFTS} }; + } + $_ = $self->textmapfonts ($_); + $self->output (".PD 0\n") if ($$self{ITEMS} == 1); + $self->output ($self->switchquotes ('.IP', $_, $$self{INDENT})); + $self->outindex ($index ? ('Item', $index) : ()); + $$self{NEEDSPACE} = 0; + $$self{ITEMS}++; + $$self{SHIFTWAIT} = 0; +} + +# Begin a block for a particular translator. Setting VERBATIM triggers +# special handling in textblock(). +sub cmd_begin { + my $self = shift; + local $_ = shift; + my ($kind) = /^(\S+)/ or return; + if ($kind eq 'man' || $kind eq 'roff') { + $$self{VERBATIM} = 1; + } else { + $$self{EXCLUDE} = 1; + } +} + +# End a block for a particular translator. We assume that all =begin/=end +# pairs are properly closed. +sub cmd_end { + my $self = shift; + $$self{EXCLUDE} = 0; + $$self{VERBATIM} = 0; +} + +# One paragraph for a particular translator. Ignore it unless it's intended +# for man or roff, in which case we output it verbatim. +sub cmd_for { + my $self = shift; + local $_ = shift; + return unless s/^(?:man|roff)\b[ \t]*\n?//; + $self->output ($_); +} + + +############################################################################## +# Escaping and fontification +############################################################################## + +# At this point, we'll have embedded font codes of the form \f(<font>[SE] +# where <font> is one of B, I, or F. Turn those into the right font start or +# end codes. The old pod2man didn't get B<someI<thing> else> right; after I<> +# it switched back to normal text rather than bold. We take care of this by +# using variables as a combined pointer to our current font sequence, and set +# each to the number of current nestings of start tags for that font. Use +# them as a vector to look up what font sequence to use. +# +# \fP changes to the previous font, but only one previous font is kept. We +# don't know what the outside level font is; normally it's R, but if we're +# inside a heading it could be something else. So arrange things so that the +# outside font is always the "previous" font and end with \fP instead of \fR. +# Idea from Zack Weinberg. +sub mapfonts { + my $self = shift; + local $_ = shift; + + my ($fixed, $bold, $italic) = (0, 0, 0); + my %magic = (F => \$fixed, B => \$bold, I => \$italic); + my $last = '\fR'; + s { \\f\((.)(.) } { + my $sequence = ''; + my $f; + if ($last ne '\fR') { $sequence = '\fP' } + ${ $magic{$1} } += ($2 eq 'S') ? 1 : -1; + $f = $$self{FONTS}{($fixed && 1) . ($bold && 1) . ($italic && 1)}; + if ($f eq $last) { + ''; + } else { + if ($f ne '\fR') { $sequence .= $f } + $last = $f; + $sequence; + } + }gxe; + $_; +} + +# Unfortunately, there is a bug in Solaris 2.6 nroff (not present in GNU +# groff) where the sequence \fB\fP\f(CW\fP leaves the font set to B rather +# than R, presumably because \f(CW doesn't actually do a font change. To work +# around this, use a separate textmapfonts for text blocks where the default +# font is always R and only use the smart mapfonts for headings. +sub textmapfonts { + my $self = shift; + local $_ = shift; + + my ($fixed, $bold, $italic) = (0, 0, 0); + my %magic = (F => \$fixed, B => \$bold, I => \$italic); + s { \\f\((.)(.) } { + ${ $magic{$1} } += ($2 eq 'S') ? 1 : -1; + $$self{FONTS}{($fixed && 1) . ($bold && 1) . ($italic && 1)}; + }gxe; + $_; +} + + +############################################################################## +# *roff-specific parsing and magic +############################################################################## + +# Called instead of parse_text, calls parse_text with the right flags. +sub parse { + my $self = shift; + $self->parse_text ({ -expand_seq => 'sequence', + -expand_ptree => 'collapse' }, @_); +} + +# Takes a parse tree, a flag saying whether or not to treat it as literal text +# (not call guesswork on it), and a flag saying whether or not to clean some +# things up for *roff, and returns the concatenation of all of the text +# strings in that parse tree. If the literal flag isn't true, guesswork() +# will be called on all plain scalars in the parse tree. Otherwise, if +# collapse is being called on a C<> code, $cleanup should be set to true and +# some additional cleanup will be done. Assumes that everything in the parse +# tree is either a scalar or a reference to a scalar. +sub collapse { + my ($self, $ptree, $literal, $cleanup) = @_; + + # If we're processing the NAME section, don't do normal guesswork. This + # is because NAME lines are often extracted by utilities like catman that + # require plain text and don't understand *roff markup. We still need to + # escape backslashes and hyphens for *roff (and catman expects \- instead + # of -). + if ($$self{IN_NAME}) { + $literal = 1; + $cleanup = 1; + } + + # Do the collapse of the parse tree as described above. + return join ('', map { + if (ref $_) { + join ('', @$_); + } elsif ($literal) { + if ($cleanup) { + s/\\/\\e/g; + s/-/\\-/g; + s/__/_\\|_/g; + } + $_; + } else { + $self->guesswork ($_); + } + } $ptree->children); +} + +# Takes a text block to perform guesswork on; this is guaranteed not to +# contain any formatting codes. Returns the text block with remapping done. +sub guesswork { + my $self = shift; + local $_ = shift; + + # rofficate backslashes. + s/\\/\\e/g; + + # Ensure double underbars have a tiny space between them. + s/__/_\\|_/g; + + # Leave hyphens only if they're part of regular words and there is only + # one dash at a time. Leave a dash after the first character as a regular + # non-breaking dash, but don't let it mark the rest of the word invalid + # for hyphenation. + s/-/\\-/g; + s{ + ( (?:\G|^|\s) [a-zA-Z] ) ( \\- )? + ( (?: [a-zA-Z]+ \\-)+ ) + ( [a-zA-Z]+ ) (?=\s|\Z) + \b + } { + my ($prefix, $hyphen, $main, $suffix) = ($1, $2, $3, $4); + $hyphen ||= ''; + $main =~ s/\\-/-/g; + $prefix . $hyphen . $main . $suffix; + }egx; + + # Translate -- into a real em dash if it's used like one. + s{ (\s) \\-\\- (\s) } { $1 . '\*(--' . $2 }egx; + s{ (\b[a-zA-Z]+) \\-\\- (\s|\Z|[a-zA-Z]+\b) } { $1 . '\*(--' . $2 }egx; + + # Make all caps a little smaller. Be careful here, since we don't want to + # make @ARGV into small caps, nor do we want to fix the MIME in + # MIME-Version, since it looks weird with the full-height V. + s{ + ( ^ | [\s\(\"\'\`\[\{<>] ) + ( [A-Z] [A-Z] (?: [/A-Z+:\d_\$&] | \\- )* ) + (?= [\s>\}\]\(\)\'\".?!,;] | \\*\(-- | $ ) + } { $1 . '\s-1' . $2 . '\s0' }egx; + + # Italize functions in the form func(). + s{ + ( \b | \\s-1 ) + ( + [A-Za-z_] ([:\w]|\\s-?[01])+ \(\) + ) + } { $1 . '\f(IS' . $2 . '\f(IE' }egx; + + # func(n) is a reference to a manual page. Make it \fIfunc\fR\|(n). + s{ + ( \b | \\s-1 ) + ( [A-Za-z_] (?:[.:\w]|\\-|\\s-?[01])+ ) + ( + \( \d [a-z]* \) + ) + } { $1 . '\f(IS' . $2 . '\f(IE\|' . $3 }egx; + + # Convert simple Perl variable references to a fixed-width font. + s{ + ( \s+ ) + ( [\$\@%] [\w:]+ ) + (?! \( ) + } { $1 . '\f(FS' . $2 . '\f(FE'}egx; + + # Fix up double quotes. + s{ \" ([^\"]+) \" } { '\*(L"' . $1 . '\*(R"' }egx; + + # Make C++ into \*(C+, which is a squinched version. + s{ \b C\+\+ } {\\*\(C+}gx; + + # All done. + $_; +} + +# Handles C<> text, deciding whether to put \*C` around it or not. This is a +# whole bunch of messy heuristics to try to avoid overquoting, originally from +# Barrie Slaymaker. This largely duplicates similar code in Pod::Text. +sub quote_literal { + my $self = shift; + local $_ = shift; + + # A regex that matches the portion of a variable reference that's the + # array or hash index, separated out just because we want to use it in + # several places in the following regex. + my $index = '(?: \[.*\] | \{.*\} )?'; + + # Check for things that we don't want to quote, and if we find any of + # them, return the string with just a font change and no quoting. + m{ + ^\s* + (?: + ( [\'\`\"] ) .* \1 # already quoted + | \` .* \' # `quoted' + | \$+ [\#^]? \S $index # special ($^Foo, $") + | [\$\@%&*]+ \#? [:\'\w]+ $index # plain var or func + | [\$\@%&*]* [:\'\w]+ (?: -> )? \(\s*[^\s,]\s*\) # 0/1-arg func call + | [+-]? ( \d[\d.]* | \.\d+ ) (?: [eE][+-]?\d+ )? # a number + | 0x [a-fA-F\d]+ # a hex constant + ) + \s*\z + }xo && return '\f(FS' . $_ . '\f(FE'; + + # If we didn't return, go ahead and quote the text. + return '\f(FS\*(C`' . $_ . "\\*(C'\\f(FE"; +} + + +############################################################################## +# Output formatting +############################################################################## + +# Make vertical whitespace. +sub makespace { + my $self = shift; + $self->output (".PD\n") if ($$self{ITEMS} > 1); + $$self{ITEMS} = 0; + $self->output ($$self{INDENT} > 0 ? ".Sp\n" : ".PP\n") + if $$self{NEEDSPACE}; +} + +# Output any pending index entries, and optionally an index entry given as an +# argument. Support multiple index entries in X<> separated by slashes, and +# strip special escapes from index entries. +sub outindex { + my ($self, $section, $index) = @_; + my @entries = map { split m%\s*/\s*% } @{ $$self{INDEX} }; + return unless ($section || @entries); + $$self{INDEX} = []; + my @output; + if (@entries) { + push (@output, [ 'Xref', join (' ', @entries) ]); + } + if ($section) { + $index =~ s/\\-/-/g; + $index =~ s/\\(?:s-?\d|.\(..|.)//g; + push (@output, [ $section, $index ]); + } + for (@output) { + my ($type, $entry) = @$_; + $entry =~ s/\"/\"\"/g; + $entry =~ s/\\/\\e/g; + $self->output (".IX $type " . '"' . $entry . '"' . "\n"); + } +} + +# Output text to the output device. +sub output { print { $_[0]->output_handle } $_[1] } + +# Given a command and a single argument that may or may not contain double +# quotes, handle double-quote formatting for it. If there are no double +# quotes, just return the command followed by the argument in double quotes. +# If there are double quotes, use an if statement to test for nroff, and for +# nroff output the command followed by the argument in double quotes with +# embedded double quotes doubled. For other formatters, remap paired double +# quotes to LQUOTE and RQUOTE. +sub switchquotes { + my $self = shift; + my $command = shift; + local $_ = shift; + my $extra = shift; + s/\\\*\([LR]\"/\"/g; + + # We also have to deal with \*C` and \*C', which are used to add the + # quotes around C<> text, since they may expand to " and if they do this + # confuses the .SH macros and the like no end. Expand them ourselves. + # Also separate troff from nroff if there are any fixed-width fonts in use + # to work around problems with Solaris nroff. + my $c_is_quote = ($$self{LQUOTE} =~ /\"/) || ($$self{RQUOTE} =~ /\"/); + my $fixedpat = join ('|', @{ $$self{FONTS} }{'100', '101', '110', '111'}); + $fixedpat =~ s/\\/\\\\/g; + $fixedpat =~ s/\(/\\\(/g; + if (/\"/ || /$fixedpat/) { + s/\"/\"\"/g; + my $nroff = $_; + my $troff = $_; + $troff =~ s/\"\"([^\"]*)\"\"/\`\`$1\'\'/g; + if ($c_is_quote && /\\\*\(C[\'\`]/) { + $nroff =~ s/\\\*\(C\`/$$self{LQUOTE}/g; + $nroff =~ s/\\\*\(C\'/$$self{RQUOTE}/g; + $troff =~ s/\\\*\(C[\'\`]//g; + } + $nroff = qq("$nroff") . ($extra ? " $extra" : ''); + $troff = qq("$troff") . ($extra ? " $extra" : ''); + + # Work around the Solaris nroff bug where \f(CW\fP leaves the font set + # to Roman rather than the actual previous font when used in headings. + # troff output may still be broken, but at least we can fix nroff by + # just switching the font changes to the non-fixed versions. + $nroff =~ s/\Q$$self{FONTS}{100}\E(.*)\\f[PR]/$1/g; + $nroff =~ s/\Q$$self{FONTS}{101}\E(.*)\\f([PR])/\\fI$1\\f$2/g; + $nroff =~ s/\Q$$self{FONTS}{110}\E(.*)\\f([PR])/\\fB$1\\f$2/g; + $nroff =~ s/\Q$$self{FONTS}{111}\E(.*)\\f([PR])/\\f\(BI$1\\f$2/g; + + # Now finally output the command. Only bother with .ie if the nroff + # and troff output isn't the same. + if ($nroff ne $troff) { + return ".ie n $command $nroff\n.el $command $troff\n"; + } else { + return "$command $nroff\n"; + } + } else { + $_ = qq("$_") . ($extra ? " $extra" : ''); + return "$command $_\n"; + } +} + +############################################################################## +# Module return value and documentation +############################################################################## + +1; +__END__ + +=head1 NAME + +Pod::Man - Convert POD data to formatted *roff input + +=head1 SYNOPSIS + + use Pod::Man; + my $parser = Pod::Man->new (release => $VERSION, section => 8); + + # Read POD from STDIN and write to STDOUT. + $parser->parse_from_filehandle; + + # Read POD from file.pod and write to file.1. + $parser->parse_from_file ('file.pod', 'file.1'); + +=head1 DESCRIPTION + +Pod::Man is a module to convert documentation in the POD format (the +preferred language for documenting Perl) into *roff input using the man +macro set. The resulting *roff code is suitable for display on a terminal +using L<nroff(1)>, normally via L<man(1)>, or printing using L<troff(1)>. +It is conventionally invoked using the driver script B<pod2man>, but it can +also be used directly. + +As a derived class from Pod::Parser, Pod::Man supports the same methods and +interfaces. See L<Pod::Parser> for all the details; briefly, one creates a +new parser with C<< Pod::Man->new() >> and then calls either +parse_from_filehandle() or parse_from_file(). + +new() can take options, in the form of key/value pairs that control the +behavior of the parser. See below for details. + +If no options are given, Pod::Man uses the name of the input file with any +trailing C<.pod>, C<.pm>, or C<.pl> stripped as the man page title, to +section 1 unless the file ended in C<.pm> in which case it defaults to +section 3, to a centered title of "User Contributed Perl Documentation", to +a centered footer of the Perl version it is run with, and to a left-hand +footer of the modification date of its input (or the current date if given +STDIN for input). + +Pod::Man assumes that your *roff formatters have a fixed-width font named +CW. If yours is called something else (like CR), use the C<fixed> option to +specify it. This generally only matters for troff output for printing. +Similarly, you can set the fonts used for bold, italic, and bold italic +fixed-width output. + +Besides the obvious pod conversions, Pod::Man also takes care of formatting +func(), func(3), and simple variable references like $foo or @bar so you +don't have to use code escapes for them; complex expressions like +C<$fred{'stuff'}> will still need to be escaped, though. It also translates +dashes that aren't used as hyphens into en dashes, makes long dashes--like +this--into proper em dashes, fixes "paired quotes," makes C++ look right, +puts a little space between double underbars, makes ALLCAPS a teeny bit +smaller in B<troff>, and escapes stuff that *roff treats as special so that +you don't have to. + +The recognized options to new() are as follows. All options take a single +argument. + +=over 4 + +=item center + +Sets the centered page header to use instead of "User Contributed Perl +Documentation". + +=item date + +Sets the left-hand footer. By default, the modification date of the input +file will be used, or the current date if stat() can't find that file (the +case if the input is from STDIN), and the date will be formatted as +YYYY-MM-DD. + +=item fixed + +The fixed-width font to use for vertabim text and code. Defaults to CW. +Some systems may want CR instead. Only matters for B<troff> output. + +=item fixedbold + +Bold version of the fixed-width font. Defaults to CB. Only matters for +B<troff> output. + +=item fixeditalic + +Italic version of the fixed-width font (actually, something of a misnomer, +since most fixed-width fonts only have an oblique version, not an italic +version). Defaults to CI. Only matters for B<troff> output. + +=item fixedbolditalic + +Bold italic (probably actually oblique) version of the fixed-width font. +Pod::Man doesn't assume you have this, and defaults to CB. Some systems +(such as Solaris) have this font available as CX. Only matters for B<troff> +output. + +=item name + +Set the name of the manual page. Without this option, the manual name is +set to the uppercased base name of the file being converted unless the +manual section is 3, in which case the path is parsed to see if it is a Perl +module path. If it is, a path like C<.../lib/Pod/Man.pm> is converted into +a name like C<Pod::Man>. This option, if given, overrides any automatic +determination of the name. + +=item quotes + +Sets the quote marks used to surround CE<lt>> text. If the value is a +single character, it is used as both the left and right quote; if it is two +characters, the first character is used as the left quote and the second as +the right quoted; and if it is four characters, the first two are used as +the left quote and the second two as the right quote. + +This may also be set to the special value C<none>, in which case no quote +marks are added around CE<lt>> text (but the font is still changed for troff +output). + +=item release + +Set the centered footer. By default, this is the version of Perl you run +Pod::Man under. Note that some system an macro sets assume that the +centered footer will be a modification date and will prepend something like +"Last modified: "; if this is the case, you may want to set C<release> to +the last modified date and C<date> to the version number. + +=item section + +Set the section for the C<.TH> macro. The standard section numbering +convention is to use 1 for user commands, 2 for system calls, 3 for +functions, 4 for devices, 5 for file formats, 6 for games, 7 for +miscellaneous information, and 8 for administrator commands. There is a lot +of variation here, however; some systems (like Solaris) use 4 for file +formats, 5 for miscellaneous information, and 7 for devices. Still others +use 1m instead of 8, or some mix of both. About the only section numbers +that are reliably consistent are 1, 2, and 3. + +By default, section 1 will be used unless the file ends in .pm in which case +section 3 will be selected. + +=back + +The standard Pod::Parser method parse_from_filehandle() takes up to two +arguments, the first being the file handle to read POD from and the second +being the file handle to write the formatted output to. The first defaults +to STDIN if not given, and the second defaults to STDOUT. The method +parse_from_file() is almost identical, except that its two arguments are the +input and output disk files instead. See L<Pod::Parser> for the specific +details. + +=head1 DIAGNOSTICS + +=over 4 + +=item roff font should be 1 or 2 chars, not "%s" + +(F) You specified a *roff font (using C<fixed>, C<fixedbold>, etc.) that +wasn't either one or two characters. Pod::Man doesn't support *roff fonts +longer than two characters, although some *roff extensions do (the canonical +versions of B<nroff> and B<troff> don't either). + +=item Invalid link %s + +(W) The POD source contained a C<LE<lt>E<gt>> formatting code that +Pod::Man was unable to parse. You should never see this error message; it +probably indicates a bug in Pod::Man. + +=item Invalid quote specification "%s" + +(F) The quote specification given (the quotes option to the constructor) was +invalid. A quote specification must be one, two, or four characters long. + +=item %s:%d: Unknown command paragraph "%s". + +(W) The POD source contained a non-standard command paragraph (something of +the form C<=command args>) that Pod::Man didn't know about. It was ignored. + +=item %s:%d: Unknown escape EE<lt>%sE<gt> + +(W) The POD source contained an C<EE<lt>E<gt>> escape that Pod::Man didn't +know about. C<EE<lt>%sE<gt>> was printed verbatim in the output. + +=item %s:%d: Unknown formatting code %s + +(W) The POD source contained a non-standard formatting code (something of +the form C<XE<lt>E<gt>>) that Pod::Man didn't know about. It was ignored. + +=item %s:%d: Unmatched =back + +(W) Pod::Man encountered a C<=back> command that didn't correspond to an +C<=over> command. + +=back + +=head1 BUGS + +Eight-bit input data isn't handled at all well at present. The correct +approach would be to map EE<lt>E<gt> escapes to the appropriate UTF-8 +characters and then do a translation pass on the output according to the +user-specified output character set. Unfortunately, we can't send eight-bit +data directly to the output unless the user says this is okay, since some +vendor *roff implementations can't handle eight-bit data. If the *roff +implementation can, however, that's far superior to the current hacked +characters that only work under troff. + +There is currently no way to turn off the guesswork that tries to format +unmarked text appropriately, and sometimes it isn't wanted (particularly +when using POD to document something other than Perl). + +The NAME section should be recognized specially and index entries emitted +for everything in that section. This would have to be deferred until the +next section, since extraneous things in NAME tends to confuse various man +page processors. + +Pod::Man doesn't handle font names longer than two characters. Neither do +most B<troff> implementations, but GNU troff does as an extension. It would +be nice to support as an option for those who want to use it. + +The preamble added to each output file is rather verbose, and most of it is +only necessary in the presence of EE<lt>E<gt> escapes for non-ASCII +characters. It would ideally be nice if all of those definitions were only +output if needed, perhaps on the fly as the characters are used. + +Pod::Man is excessively slow. + +=head1 CAVEATS + +The handling of hyphens and em dashes is somewhat fragile, and one may get +the wrong one under some circumstances. This should only matter for +B<troff> output. + +When and whether to use small caps is somewhat tricky, and Pod::Man doesn't +necessarily get it right. + +=head1 SEE ALSO + +L<Pod::Parser>, L<perlpod(1)>, L<pod2man(1)>, L<nroff(1)>, L<troff(1)>, +L<man(1)>, L<man(7)> + +Ossanna, Joseph F., and Brian W. Kernighan. "Troff User's Manual," +Computing Science Technical Report No. 54, AT&T Bell Laboratories. This is +the best documentation of standard B<nroff> and B<troff>. At the time of +this writing, it's available at +L<http://www.cs.bell-labs.com/cm/cs/cstr.html>. + +The man page documenting the man macro set may be L<man(5)> instead of +L<man(7)> on your system. Also, please see L<pod2man(1)> for extensive +documentation on writing manual pages if you've not done it before and +aren't familiar with the conventions. + +The current version of this module is always available from its web site at +L<http://www.eyrie.org/~eagle/software/podlators/>. It is also part of the +Perl core distribution as of 5.6.0. + +=head1 AUTHOR + +Russ Allbery <rra@stanford.edu>, based I<very> heavily on the original +B<pod2man> by Tom Christiansen <tchrist@mox.perl.com>. + +=head1 COPYRIGHT AND LICENSE + +Copyright 1999, 2000, 2001, 2002, 2003 by Russ Allbery <rra@stanford.edu>. + +This program is free software; you may redistribute it and/or modify it +under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Pod/ParseLink.pm b/Master/tlpkg/tlperl.old/lib/Pod/ParseLink.pm new file mode 100644 index 00000000000..7e4153da3d0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/ParseLink.pm @@ -0,0 +1,184 @@ +# Pod::ParseLink -- Parse an L<> formatting code in POD text. +# $Id: ParseLink.pm,v 1.6 2002/07/15 05:46:00 eagle Exp $ +# +# Copyright 2001 by Russ Allbery <rra@stanford.edu> +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. +# +# This module implements parsing of the text of an L<> formatting code as +# defined in perlpodspec. It should be suitable for any POD formatter. It +# exports only one function, parselink(), which returns the five-item parse +# defined in perlpodspec. +# +# Perl core hackers, please note that this module is also separately +# maintained outside of the Perl core as part of the podlators. Please send +# me any patches at the address above in addition to sending them to the +# standard Perl mailing lists. + +############################################################################## +# Modules and declarations +############################################################################## + +package Pod::ParseLink; + +require 5.004; + +use strict; +use vars qw(@EXPORT @ISA $VERSION); + +use Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(parselink); + +# Don't use the CVS revision as the version, since this module is also in Perl +# core and too many things could munge CVS magic revision strings. This +# number should ideally be the same as the CVS revision in podlators, however. +$VERSION = 1.06; + + +############################################################################## +# Implementation +############################################################################## + +# Parse the name and section portion of a link into a name and section. +sub _parse_section { + my ($link) = @_; + $link =~ s/^\s+//; + $link =~ s/\s+$//; + + # If the whole link is enclosed in quotes, interpret it all as a section + # even if it contains a slash. + return (undef, $1) if ($link =~ /^"\s*(.*?)\s*"$/); + + # Split into page and section on slash, and then clean up quoting in the + # section. If there is no section and the name contains spaces, also + # guess that it's an old section link. + my ($page, $section) = split (/\s*\/\s*/, $link, 2); + $section =~ s/^"\s*(.*?)\s*"$/$1/ if $section; + if ($page && $page =~ / / && !defined ($section)) { + $section = $page; + $page = undef; + } else { + $page = undef unless $page; + $section = undef unless $section; + } + return ($page, $section); +} + +# Infer link text from the page and section. +sub _infer_text { + my ($page, $section) = @_; + my $inferred; + if ($page && !$section) { + $inferred = $page; + } elsif (!$page && $section) { + $inferred = '"' . $section . '"'; + } elsif ($page && $section) { + $inferred = '"' . $section . '" in ' . $page; + } + return $inferred; +} + +# Given the contents of an L<> formatting code, parse it into the link text, +# the possibly inferred link text, the name or URL, the section, and the type +# of link (pod, man, or url). +sub parselink { + my ($link) = @_; + $link =~ s/\s+/ /g; + if ($link =~ /\A\w+:[^:\s]\S*\Z/) { + return (undef, $link, $link, undef, 'url'); + } else { + my $text; + if ($link =~ /\|/) { + ($text, $link) = split (/\|/, $link, 2); + } + my ($name, $section) = _parse_section ($link); + my $inferred = $text || _infer_text ($name, $section); + my $type = ($name && $name =~ /\(\S*\)/) ? 'man' : 'pod'; + return ($text, $inferred, $name, $section, $type); + } +} + + +############################################################################## +# Module return value and documentation +############################################################################## + +# Ensure we evaluate to true. +1; +__END__ + +=head1 NAME + +Pod::ParseLink - Parse an LE<lt>E<gt> formatting code in POD text + +=head1 SYNOPSIS + + use Pod::ParseLink; + my ($text, $inferred, $name, $section, $type) = parselink ($link); + +=head1 DESCRIPTION + +This module only provides a single function, parselink(), which takes the +text of an LE<lt>E<gt> formatting code and parses it. It returns the anchor +text for the link (if any was given), the anchor text possibly inferred from +the name and section, the name or URL, the section if any, and the type of +link. The type will be one of 'url', 'pod', or 'man', indicating a URL, a +link to a POD page, or a link to a Unix manual page. + +Parsing is implemented per L<perlpodspec>. For backward compatibility, +links where there is no section and name contains spaces, or links where the +entirety of the link (except for the anchor text if given) is enclosed in +double-quotes are interpreted as links to a section (LE<lt>/sectionE<gt>). + +The inferred anchor text is implemented per L<perlpodspec>: + + L<name> => L<name|name> + L</section> => L<"section"|/section> + L<name/section> => L<"section" in name|name/section> + +The name may contain embedded EE<lt>E<gt> and ZE<lt>E<gt> formatting codes, +and the section, anchor text, and inferred anchor text may contain any +formatting codes. Any double quotes around the section are removed as part +of the parsing, as is any leading or trailing whitespace. + +If the text of the LE<lt>E<gt> escape is entirely enclosed in double quotes, +it's interpreted as a link to a section for backwards compatibility. + +No attempt is made to resolve formatting codes. This must be done after +calling parselink (since EE<lt>E<gt> formatting codes can be used to escape +characters that would otherwise be significant to the parser and resolving +them before parsing would result in an incorrect parse of a formatting code +like: + + L<verticalE<verbar>barE<sol>slash> + +which should be interpreted as a link to the C<vertical|bar/slash> POD page +and not as a link to the C<slash> section of the C<bar> POD page with an +anchor text of C<vertical>. Note that not only the anchor text will need to +have formatting codes expanded, but so will the target of the link (to deal +with EE<lt>E<gt> and ZE<lt>E<gt> formatting codes), and special handling of +the section may be necessary depending on whether the translator wants to +consider markup in sections to be significant when resolving links. See +L<perlpodspec> for more information. + +=head1 SEE ALSO + +L<Pod::Parser> + +The current version of this module is always available from its web site at +L<http://www.eyrie.org/~eagle/software/podlators/>. + +=head1 AUTHOR + +Russ Allbery <rra@stanford.edu>. + +=head1 COPYRIGHT AND LICENSE + +Copyright 2001 by Russ Allbery <rra@stanford.edu>. + +This program is free software; you may redistribute it and/or modify it +under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Pod/ParseUtils.pm b/Master/tlpkg/tlperl.old/lib/Pod/ParseUtils.pm new file mode 100644 index 00000000000..878860121d3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/ParseUtils.pm @@ -0,0 +1,852 @@ +############################################################################# +# Pod/ParseUtils.pm -- helpers for POD parsing and conversion +# +# Copyright (C) 1999-2000 by Marek Rouchal. All rights reserved. +# This file is part of "PodParser". PodParser is free software; +# you can redistribute it and/or modify it under the same terms +# as Perl itself. +############################################################################# + +package Pod::ParseUtils; + +use vars qw($VERSION); +$VERSION = 1.33; ## Current version of this package +require 5.005; ## requires this Perl version or later + +=head1 NAME + +Pod::ParseUtils - helpers for POD parsing and conversion + +=head1 SYNOPSIS + + use Pod::ParseUtils; + + my $list = new Pod::List; + my $link = Pod::Hyperlink->new('Pod::Parser'); + +=head1 DESCRIPTION + +B<Pod::ParseUtils> contains a few object-oriented helper packages for +POD parsing and processing (i.e. in POD formatters and translators). + +=cut + +#----------------------------------------------------------------------------- +# Pod::List +# +# class to hold POD list info (=over, =item, =back) +#----------------------------------------------------------------------------- + +package Pod::List; + +use Carp; + +=head2 Pod::List + +B<Pod::List> can be used to hold information about POD lists +(written as =over ... =item ... =back) for further processing. +The following methods are available: + +=over 4 + +=item Pod::List-E<gt>new() + +Create a new list object. Properties may be specified through a hash +reference like this: + + my $list = Pod::List->new({ -start => $., -indent => 4 }); + +See the individual methods/properties for details. + +=cut + +sub new { + my $this = shift; + my $class = ref($this) || $this; + my %params = @_; + my $self = {%params}; + bless $self, $class; + $self->initialize(); + return $self; +} + +sub initialize { + my $self = shift; + $self->{-file} ||= 'unknown'; + $self->{-start} ||= 'unknown'; + $self->{-indent} ||= 4; # perlpod: "should be the default" + $self->{_items} = []; + $self->{-type} ||= ''; +} + +=item $list-E<gt>file() + +Without argument, retrieves the file name the list is in. This must +have been set before by either specifying B<-file> in the B<new()> +method or by calling the B<file()> method with a scalar argument. + +=cut + +# The POD file name the list appears in +sub file { + return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file}; +} + +=item $list-E<gt>start() + +Without argument, retrieves the line number where the list started. +This must have been set before by either specifying B<-start> in the +B<new()> method or by calling the B<start()> method with a scalar +argument. + +=cut + +# The line in the file the node appears +sub start { + return (@_ > 1) ? ($_[0]->{-start} = $_[1]) : $_[0]->{-start}; +} + +=item $list-E<gt>indent() + +Without argument, retrieves the indent level of the list as specified +in C<=over n>. This must have been set before by either specifying +B<-indent> in the B<new()> method or by calling the B<indent()> method +with a scalar argument. + +=cut + +# indent level +sub indent { + return (@_ > 1) ? ($_[0]->{-indent} = $_[1]) : $_[0]->{-indent}; +} + +=item $list-E<gt>type() + +Without argument, retrieves the list type, which can be an arbitrary value, +e.g. C<OL>, C<UL>, ... when thinking the HTML way. +This must have been set before by either specifying +B<-type> in the B<new()> method or by calling the B<type()> method +with a scalar argument. + +=cut + +# The type of the list (UL, OL, ...) +sub type { + return (@_ > 1) ? ($_[0]->{-type} = $_[1]) : $_[0]->{-type}; +} + +=item $list-E<gt>rx() + +Without argument, retrieves a regular expression for simplifying the +individual item strings once the list type has been determined. Usage: +E.g. when converting to HTML, one might strip the leading number in +an ordered list as C<E<lt>OLE<gt>> already prints numbers itself. +This must have been set before by either specifying +B<-rx> in the B<new()> method or by calling the B<rx()> method +with a scalar argument. + +=cut + +# The regular expression to simplify the items +sub rx { + return (@_ > 1) ? ($_[0]->{-rx} = $_[1]) : $_[0]->{-rx}; +} + +=item $list-E<gt>item() + +Without argument, retrieves the array of the items in this list. +The items may be represented by any scalar. +If an argument has been given, it is pushed on the list of items. + +=cut + +# The individual =items of this list +sub item { + my ($self,$item) = @_; + if(defined $item) { + push(@{$self->{_items}}, $item); + return $item; + } + else { + return @{$self->{_items}}; + } +} + +=item $list-E<gt>parent() + +Without argument, retrieves information about the parent holding this +list, which is represented as an arbitrary scalar. +This must have been set before by either specifying +B<-parent> in the B<new()> method or by calling the B<parent()> method +with a scalar argument. + +=cut + +# possibility for parsers/translators to store information about the +# lists's parent object +sub parent { + return (@_ > 1) ? ($_[0]->{-parent} = $_[1]) : $_[0]->{-parent}; +} + +=item $list-E<gt>tag() + +Without argument, retrieves information about the list tag, which can be +any scalar. +This must have been set before by either specifying +B<-tag> in the B<new()> method or by calling the B<tag()> method +with a scalar argument. + +=back + +=cut + +# possibility for parsers/translators to store information about the +# list's object +sub tag { + return (@_ > 1) ? ($_[0]->{-tag} = $_[1]) : $_[0]->{-tag}; +} + +#----------------------------------------------------------------------------- +# Pod::Hyperlink +# +# class to manipulate POD hyperlinks (L<>) +#----------------------------------------------------------------------------- + +package Pod::Hyperlink; + +=head2 Pod::Hyperlink + +B<Pod::Hyperlink> is a class for manipulation of POD hyperlinks. Usage: + + my $link = Pod::Hyperlink->new('alternative text|page/"section in page"'); + +The B<Pod::Hyperlink> class is mainly designed to parse the contents of the +C<LE<lt>...E<gt>> sequence, providing a simple interface for accessing the +different parts of a POD hyperlink for further processing. It can also be +used to construct hyperlinks. + +=over 4 + +=item Pod::Hyperlink-E<gt>new() + +The B<new()> method can either be passed a set of key/value pairs or a single +scalar value, namely the contents of a C<LE<lt>...E<gt>> sequence. An object +of the class C<Pod::Hyperlink> is returned. The value C<undef> indicates a +failure, the error message is stored in C<$@>. + +=cut + +use Carp; + +sub new { + my $this = shift; + my $class = ref($this) || $this; + my $self = +{}; + bless $self, $class; + $self->initialize(); + if(defined $_[0]) { + if(ref($_[0])) { + # called with a list of parameters + %$self = %{$_[0]}; + $self->_construct_text(); + } + else { + # called with L<> contents + return undef unless($self->parse($_[0])); + } + } + return $self; +} + +sub initialize { + my $self = shift; + $self->{-line} ||= 'undef'; + $self->{-file} ||= 'undef'; + $self->{-page} ||= ''; + $self->{-node} ||= ''; + $self->{-alttext} ||= ''; + $self->{-type} ||= 'undef'; + $self->{_warnings} = []; +} + +=item $link-E<gt>parse($string) + +This method can be used to (re)parse a (new) hyperlink, i.e. the contents +of a C<LE<lt>...E<gt>> sequence. The result is stored in the current object. +Warnings are stored in the B<warnings> property. +E.g. sections like C<LE<lt>open(2)E<gt>> are deprecated, as they do not point +to Perl documents. C<LE<lt>DBI::foo(3p)E<gt>> is wrong as well, the manpage +section can simply be dropped. + +=cut + +sub parse { + my $self = shift; + local($_) = $_[0]; + # syntax check the link and extract destination + my ($alttext,$page,$node,$type,$quoted) = (undef,'','','',0); + + $self->{_warnings} = []; + + # collapse newlines with whitespace + s/\s*\n+\s*/ /g; + + # strip leading/trailing whitespace + if(s/^[\s\n]+//) { + $self->warning("ignoring leading whitespace in link"); + } + if(s/[\s\n]+$//) { + $self->warning("ignoring trailing whitespace in link"); + } + unless(length($_)) { + _invalid_link("empty link"); + return undef; + } + + ## Check for different possibilities. This is tedious and error-prone + # we match all possibilities (alttext, page, section/item) + #warn "DEBUG: link=$_\n"; + + # only page + # problem: a lot of people use (), or (1) or the like to indicate + # man page sections. But this collides with L<func()> that is supposed + # to point to an internal funtion... + my $page_rx = '[\w.-]+(?:::[\w.-]+)*(?:[(](?:\d\w*|)[)]|)'; + # page name only + if(m!^($page_rx)$!o) { + $page = $1; + $type = 'page'; + } + # alttext, page and "section" + elsif(m!^(.*?)\s*[|]\s*($page_rx)\s*/\s*"(.+)"$!o) { + ($alttext, $page, $node) = ($1, $2, $3); + $type = 'section'; + $quoted = 1; #... therefore | and / are allowed + } + # alttext and page + elsif(m!^(.*?)\s*[|]\s*($page_rx)$!o) { + ($alttext, $page) = ($1, $2); + $type = 'page'; + } + # alttext and "section" + elsif(m!^(.*?)\s*[|]\s*(?:/\s*|)"(.+)"$!) { + ($alttext, $node) = ($1,$2); + $type = 'section'; + $quoted = 1; + } + # page and "section" + elsif(m!^($page_rx)\s*/\s*"(.+)"$!o) { + ($page, $node) = ($1, $2); + $type = 'section'; + $quoted = 1; + } + # page and item + elsif(m!^($page_rx)\s*/\s*(.+)$!o) { + ($page, $node) = ($1, $2); + $type = 'item'; + } + # only "section" + elsif(m!^/?"(.+)"$!) { + $node = $1; + $type = 'section'; + $quoted = 1; + } + # only item + elsif(m!^\s*/(.+)$!) { + $node = $1; + $type = 'item'; + } + # non-standard: Hyperlink + elsif(m!^(\w+:[^:\s]\S*)$!i) { + $node = $1; + $type = 'hyperlink'; + } + # alttext, page and item + elsif(m!^(.*?)\s*[|]\s*($page_rx)\s*/\s*(.+)$!o) { + ($alttext, $page, $node) = ($1, $2, $3); + $type = 'item'; + } + # alttext and item + elsif(m!^(.*?)\s*[|]\s*/(.+)$!) { + ($alttext, $node) = ($1,$2); + } + # nonstandard: alttext and hyperlink + elsif(m!^(.*?)\s*[|]\s*(\w+:[^:\s]\S*)$!) { + ($alttext, $node) = ($1,$2); + $type = 'hyperlink'; + } + # must be an item or a "malformed" section (without "") + else { + $node = $_; + $type = 'item'; + } + # collapse whitespace in nodes + $node =~ s/\s+/ /gs; + + # empty alternative text expands to node name + if(defined $alttext) { + if(!length($alttext)) { + $alttext = $node | $page; + } + } + else { + $alttext = ''; + } + + if($page =~ /[(]\w*[)]$/) { + $self->warning("(section) in '$page' deprecated"); + } + if(!$quoted && $node =~ m:[|/]: && $type ne 'hyperlink') { + $self->warning("node '$node' contains non-escaped | or /"); + } + if($alttext =~ m:[|/]:) { + $self->warning("alternative text '$node' contains non-escaped | or /"); + } + $self->{-page} = $page; + $self->{-node} = $node; + $self->{-alttext} = $alttext; + #warn "DEBUG: page=$page section=$section item=$item alttext=$alttext\n"; + $self->{-type} = $type; + $self->_construct_text(); + 1; +} + +sub _construct_text { + my $self = shift; + my $alttext = $self->alttext(); + my $type = $self->type(); + my $section = $self->node(); + my $page = $self->page(); + my $page_ext = ''; + $page =~ s/([(]\w*[)])$// && ($page_ext = $1); + if($alttext) { + $self->{_text} = $alttext; + } + elsif($type eq 'hyperlink') { + $self->{_text} = $section; + } + else { + $self->{_text} = ($section || '') . + (($page && $section) ? ' in ' : '') . + "$page$page_ext"; + } + # for being marked up later + # use the non-standard markers P<> and Q<>, so that the resulting + # text can be parsed by the translators. It's their job to put + # the correct hypertext around the linktext + if($alttext) { + $self->{_markup} = "Q<$alttext>"; + } + elsif($type eq 'hyperlink') { + $self->{_markup} = "Q<$section>"; + } + else { + $self->{_markup} = (!$section ? '' : "Q<$section>") . + ($page ? ($section ? ' in ':'') . "P<$page>$page_ext" : ''); + } +} + +=item $link-E<gt>markup($string) + +Set/retrieve the textual value of the link. This string contains special +markers C<PE<lt>E<gt>> and C<QE<lt>E<gt>> that should be expanded by the +translator's interior sequence expansion engine to the +formatter-specific code to highlight/activate the hyperlink. The details +have to be implemented in the translator. + +=cut + +#' retrieve/set markuped text +sub markup { + return (@_ > 1) ? ($_[0]->{_markup} = $_[1]) : $_[0]->{_markup}; +} + +=item $link-E<gt>text() + +This method returns the textual representation of the hyperlink as above, +but without markers (read only). Depending on the link type this is one of +the following alternatives (the + and * denote the portions of the text +that are marked up): + + +perl+ L<perl> + *$|* in +perlvar+ L<perlvar/$|> + *OPTIONS* in +perldoc+ L<perldoc/"OPTIONS"> + *DESCRIPTION* L<"DESCRIPTION"> + +=cut + +# The complete link's text +sub text { + $_[0]->{_text}; +} + +=item $link-E<gt>warning() + +After parsing, this method returns any warnings encountered during the +parsing process. + +=cut + +# Set/retrieve warnings +sub warning { + my $self = shift; + if(@_) { + push(@{$self->{_warnings}}, @_); + return @_; + } + return @{$self->{_warnings}}; +} + +=item $link-E<gt>file() + +=item $link-E<gt>line() + +Just simple slots for storing information about the line and the file +the link was encountered in. Has to be filled in manually. + +=cut + +# The line in the file the link appears +sub line { + return (@_ > 1) ? ($_[0]->{-line} = $_[1]) : $_[0]->{-line}; +} + +# The POD file name the link appears in +sub file { + return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file}; +} + +=item $link-E<gt>page() + +This method sets or returns the POD page this link points to. + +=cut + +# The POD page the link appears on +sub page { + if (@_ > 1) { + $_[0]->{-page} = $_[1]; + $_[0]->_construct_text(); + } + $_[0]->{-page}; +} + +=item $link-E<gt>node() + +As above, but the destination node text of the link. + +=cut + +# The link destination +sub node { + if (@_ > 1) { + $_[0]->{-node} = $_[1]; + $_[0]->_construct_text(); + } + $_[0]->{-node}; +} + +=item $link-E<gt>alttext() + +Sets or returns an alternative text specified in the link. + +=cut + +# Potential alternative text +sub alttext { + if (@_ > 1) { + $_[0]->{-alttext} = $_[1]; + $_[0]->_construct_text(); + } + $_[0]->{-alttext}; +} + +=item $link-E<gt>type() + +The node type, either C<section> or C<item>. As an unofficial type, +there is also C<hyperlink>, derived from e.g. C<LE<lt>http://perl.comE<gt>> + +=cut + +# The type: item or headn +sub type { + return (@_ > 1) ? ($_[0]->{-type} = $_[1]) : $_[0]->{-type}; +} + +=item $link-E<gt>link() + +Returns the link as contents of C<LE<lt>E<gt>>. Reciprocal to B<parse()>. + +=back + +=cut + +# The link itself +sub link { + my $self = shift; + my $link = $self->page() || ''; + if($self->node()) { + my $node = $self->node(); + $text =~ s/\|/E<verbar>/g; + $text =~ s:/:E<sol>:g; + if($self->type() eq 'section') { + $link .= ($link ? '/' : '') . '"' . $node . '"'; + } + elsif($self->type() eq 'hyperlink') { + $link = $self->node(); + } + else { # item + $link .= '/' . $node; + } + } + if($self->alttext()) { + my $text = $self->alttext(); + $text =~ s/\|/E<verbar>/g; + $text =~ s:/:E<sol>:g; + $link = "$text|$link"; + } + $link; +} + +sub _invalid_link { + my ($msg) = @_; + # this sets @_ + #eval { die "$msg\n" }; + #chomp $@; + $@ = $msg; # this seems to work, too! + undef; +} + +#----------------------------------------------------------------------------- +# Pod::Cache +# +# class to hold POD page details +#----------------------------------------------------------------------------- + +package Pod::Cache; + +=head2 Pod::Cache + +B<Pod::Cache> holds information about a set of POD documents, +especially the nodes for hyperlinks. +The following methods are available: + +=over 4 + +=item Pod::Cache-E<gt>new() + +Create a new cache object. This object can hold an arbitrary number of +POD documents of class Pod::Cache::Item. + +=cut + +sub new { + my $this = shift; + my $class = ref($this) || $this; + my $self = []; + bless $self, $class; + return $self; +} + +=item $cache-E<gt>item() + +Add a new item to the cache. Without arguments, this method returns a +list of all cache elements. + +=cut + +sub item { + my ($self,%param) = @_; + if(%param) { + my $item = Pod::Cache::Item->new(%param); + push(@$self, $item); + return $item; + } + else { + return @{$self}; + } +} + +=item $cache-E<gt>find_page($name) + +Look for a POD document named C<$name> in the cache. Returns the +reference to the corresponding Pod::Cache::Item object or undef if +not found. + +=back + +=cut + +sub find_page { + my ($self,$page) = @_; + foreach(@$self) { + if($_->page() eq $page) { + return $_; + } + } + undef; +} + +package Pod::Cache::Item; + +=head2 Pod::Cache::Item + +B<Pod::Cache::Item> holds information about individual POD documents, +that can be grouped in a Pod::Cache object. +It is intended to hold information about the hyperlink nodes of POD +documents. +The following methods are available: + +=over 4 + +=item Pod::Cache::Item-E<gt>new() + +Create a new object. + +=cut + +sub new { + my $this = shift; + my $class = ref($this) || $this; + my %params = @_; + my $self = {%params}; + bless $self, $class; + $self->initialize(); + return $self; +} + +sub initialize { + my $self = shift; + $self->{-nodes} = [] unless(defined $self->{-nodes}); +} + +=item $cacheitem-E<gt>page() + +Set/retrieve the POD document name (e.g. "Pod::Parser"). + +=cut + +# The POD page +sub page { + return (@_ > 1) ? ($_[0]->{-page} = $_[1]) : $_[0]->{-page}; +} + +=item $cacheitem-E<gt>description() + +Set/retrieve the POD short description as found in the C<=head1 NAME> +section. + +=cut + +# The POD description, taken out of NAME if present +sub description { + return (@_ > 1) ? ($_[0]->{-description} = $_[1]) : $_[0]->{-description}; +} + +=item $cacheitem-E<gt>path() + +Set/retrieve the POD file storage path. + +=cut + +# The file path +sub path { + return (@_ > 1) ? ($_[0]->{-path} = $_[1]) : $_[0]->{-path}; +} + +=item $cacheitem-E<gt>file() + +Set/retrieve the POD file name. + +=cut + +# The POD file name +sub file { + return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file}; +} + +=item $cacheitem-E<gt>nodes() + +Add a node (or a list of nodes) to the document's node list. Note that +the order is kept, i.e. start with the first node and end with the last. +If no argument is given, the current list of nodes is returned in the +same order the nodes have been added. +A node can be any scalar, but usually is a pair of node string and +unique id for the C<find_node> method to work correctly. + +=cut + +# The POD nodes +sub nodes { + my ($self,@nodes) = @_; + if(@nodes) { + push(@{$self->{-nodes}}, @nodes); + return @nodes; + } + else { + return @{$self->{-nodes}}; + } +} + +=item $cacheitem-E<gt>find_node($name) + +Look for a node or index entry named C<$name> in the object. +Returns the unique id of the node (i.e. the second element of the array +stored in the node arry) or undef if not found. + +=cut + +sub find_node { + my ($self,$node) = @_; + my @search; + push(@search, @{$self->{-nodes}}) if($self->{-nodes}); + push(@search, @{$self->{-idx}}) if($self->{-idx}); + foreach(@search) { + if($_->[0] eq $node) { + return $_->[1]; # id + } + } + undef; +} + +=item $cacheitem-E<gt>idx() + +Add an index entry (or a list of them) to the document's index list. Note that +the order is kept, i.e. start with the first node and end with the last. +If no argument is given, the current list of index entries is returned in the +same order the entries have been added. +An index entry can be any scalar, but usually is a pair of string and +unique id. + +=back + +=cut + +# The POD index entries +sub idx { + my ($self,@idx) = @_; + if(@idx) { + push(@{$self->{-idx}}, @idx); + return @idx; + } + else { + return @{$self->{-idx}}; + } +} + +=head1 AUTHOR + +Please report bugs using L<http://rt.cpan.org>. + +Marek Rouchal E<lt>marekr@cpan.orgE<gt>, borrowing +a lot of things from L<pod2man> and L<pod2roff> as well as other POD +processing tools by Tom Christiansen, Brad Appleton and Russ Allbery. + +=head1 SEE ALSO + +L<pod2man>, L<pod2roff>, L<Pod::Parser>, L<Pod::Checker>, +L<pod2html> + +=cut + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Parser.pm b/Master/tlpkg/tlperl.old/lib/Pod/Parser.pm new file mode 100644 index 00000000000..a5fde848503 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Parser.pm @@ -0,0 +1,1799 @@ +############################################################################# +# Pod/Parser.pm -- package which defines a base class for parsing POD docs. +# +# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved. +# This file is part of "PodParser". PodParser is free software; +# you can redistribute it and/or modify it under the same terms +# as Perl itself. +############################################################################# + +package Pod::Parser; + +use vars qw($VERSION); +$VERSION = 1.32; ## Current version of this package +require 5.005; ## requires this Perl version or later + +############################################################################# + +=head1 NAME + +Pod::Parser - base class for creating POD filters and translators + +=head1 SYNOPSIS + + use Pod::Parser; + + package MyParser; + @ISA = qw(Pod::Parser); + + sub command { + my ($parser, $command, $paragraph, $line_num) = @_; + ## Interpret the command and its text; sample actions might be: + if ($command eq 'head1') { ... } + elsif ($command eq 'head2') { ... } + ## ... other commands and their actions + my $out_fh = $parser->output_handle(); + my $expansion = $parser->interpolate($paragraph, $line_num); + print $out_fh $expansion; + } + + sub verbatim { + my ($parser, $paragraph, $line_num) = @_; + ## Format verbatim paragraph; sample actions might be: + my $out_fh = $parser->output_handle(); + print $out_fh $paragraph; + } + + sub textblock { + my ($parser, $paragraph, $line_num) = @_; + ## Translate/Format this block of text; sample actions might be: + my $out_fh = $parser->output_handle(); + my $expansion = $parser->interpolate($paragraph, $line_num); + print $out_fh $expansion; + } + + sub interior_sequence { + my ($parser, $seq_command, $seq_argument) = @_; + ## Expand an interior sequence; sample actions might be: + return "*$seq_argument*" if ($seq_command eq 'B'); + return "`$seq_argument'" if ($seq_command eq 'C'); + return "_${seq_argument}_'" if ($seq_command eq 'I'); + ## ... other sequence commands and their resulting text + } + + package main; + + ## Create a parser object and have it parse file whose name was + ## given on the command-line (use STDIN if no files were given). + $parser = new MyParser(); + $parser->parse_from_filehandle(\*STDIN) if (@ARGV == 0); + for (@ARGV) { $parser->parse_from_file($_); } + +=head1 REQUIRES + +perl5.005, Pod::InputObjects, Exporter, Symbol, Carp + +=head1 EXPORTS + +Nothing. + +=head1 DESCRIPTION + +B<Pod::Parser> is a base class for creating POD filters and translators. +It handles most of the effort involved with parsing the POD sections +from an input stream, leaving subclasses free to be concerned only with +performing the actual translation of text. + +B<Pod::Parser> parses PODs, and makes method calls to handle the various +components of the POD. Subclasses of B<Pod::Parser> override these methods +to translate the POD into whatever output format they desire. + +=head1 QUICK OVERVIEW + +To create a POD filter for translating POD documentation into some other +format, you create a subclass of B<Pod::Parser> which typically overrides +just the base class implementation for the following methods: + +=over 2 + +=item * + +B<command()> + +=item * + +B<verbatim()> + +=item * + +B<textblock()> + +=item * + +B<interior_sequence()> + +=back + +You may also want to override the B<begin_input()> and B<end_input()> +methods for your subclass (to perform any needed per-file and/or +per-document initialization or cleanup). + +If you need to perform any preprocesssing of input before it is parsed +you may want to override one or more of B<preprocess_line()> and/or +B<preprocess_paragraph()>. + +Sometimes it may be necessary to make more than one pass over the input +files. If this is the case you have several options. You can make the +first pass using B<Pod::Parser> and override your methods to store the +intermediate results in memory somewhere for the B<end_pod()> method to +process. You could use B<Pod::Parser> for several passes with an +appropriate state variable to control the operation for each pass. If +your input source can't be reset to start at the beginning, you can +store it in some other structure as a string or an array and have that +structure implement a B<getline()> method (which is all that +B<parse_from_filehandle()> uses to read input). + +Feel free to add any member data fields you need to keep track of things +like current font, indentation, horizontal or vertical position, or +whatever else you like. Be sure to read L<"PRIVATE METHODS AND DATA"> +to avoid name collisions. + +For the most part, the B<Pod::Parser> base class should be able to +do most of the input parsing for you and leave you free to worry about +how to intepret the commands and translate the result. + +Note that all we have described here in this quick overview is the +simplest most straightforward use of B<Pod::Parser> to do stream-based +parsing. It is also possible to use the B<Pod::Parser::parse_text> function +to do more sophisticated tree-based parsing. See L<"TREE-BASED PARSING">. + +=head1 PARSING OPTIONS + +A I<parse-option> is simply a named option of B<Pod::Parser> with a +value that corresponds to a certain specified behavior. These various +behaviors of B<Pod::Parser> may be enabled/disabled by setting +or unsetting one or more I<parse-options> using the B<parseopts()> method. +The set of currently accepted parse-options is as follows: + +=over 3 + +=item B<-want_nonPODs> (default: unset) + +Normally (by default) B<Pod::Parser> will only provide access to +the POD sections of the input. Input paragraphs that are not part +of the POD-format documentation are not made available to the caller +(not even using B<preprocess_paragraph()>). Setting this option to a +non-empty, non-zero value will allow B<preprocess_paragraph()> to see +non-POD sections of the input as well as POD sections. The B<cutting()> +method can be used to determine if the corresponding paragraph is a POD +paragraph, or some other input paragraph. + +=item B<-process_cut_cmd> (default: unset) + +Normally (by default) B<Pod::Parser> handles the C<=cut> POD directive +by itself and does not pass it on to the caller for processing. Setting +this option to a non-empty, non-zero value will cause B<Pod::Parser> to +pass the C<=cut> directive to the caller just like any other POD command +(and hence it may be processed by the B<command()> method). + +B<Pod::Parser> will still interpret the C<=cut> directive to mean that +"cutting mode" has been (re)entered, but the caller will get a chance +to capture the actual C<=cut> paragraph itself for whatever purpose +it desires. + +=item B<-warnings> (default: unset) + +Normally (by default) B<Pod::Parser> recognizes a bare minimum of +pod syntax errors and warnings and issues diagnostic messages +for errors, but not for warnings. (Use B<Pod::Checker> to do more +thorough checking of POD syntax.) Setting this option to a non-empty, +non-zero value will cause B<Pod::Parser> to issue diagnostics for +the few warnings it recognizes as well as the errors. + +=back + +Please see L<"parseopts()"> for a complete description of the interface +for the setting and unsetting of parse-options. + +=cut + +############################################################################# + +use vars qw(@ISA); +use strict; +#use diagnostics; +use Pod::InputObjects; +use Carp; +use Exporter; +BEGIN { + if ($] < 5.6) { + require Symbol; + import Symbol; + } +} +@ISA = qw(Exporter); + +## These "variables" are used as local "glob aliases" for performance +use vars qw(%myData %myOpts @input_stack); + +############################################################################# + +=head1 RECOMMENDED SUBROUTINE/METHOD OVERRIDES + +B<Pod::Parser> provides several methods which most subclasses will probably +want to override. These methods are as follows: + +=cut + +##--------------------------------------------------------------------------- + +=head1 B<command()> + + $parser->command($cmd,$text,$line_num,$pod_para); + +This method should be overridden by subclasses to take the appropriate +action when a POD command paragraph (denoted by a line beginning with +"=") is encountered. When such a POD directive is seen in the input, +this method is called and is passed: + +=over 3 + +=item C<$cmd> + +the name of the command for this POD paragraph + +=item C<$text> + +the paragraph text for the given POD paragraph command. + +=item C<$line_num> + +the line-number of the beginning of the paragraph + +=item C<$pod_para> + +a reference to a C<Pod::Paragraph> object which contains further +information about the paragraph command (see L<Pod::InputObjects> +for details). + +=back + +B<Note> that this method I<is> called for C<=pod> paragraphs. + +The base class implementation of this method simply treats the raw POD +command as normal block of paragraph text (invoking the B<textblock()> +method with the command paragraph). + +=cut + +sub command { + my ($self, $cmd, $text, $line_num, $pod_para) = @_; + ## Just treat this like a textblock + $self->textblock($pod_para->raw_text(), $line_num, $pod_para); +} + +##--------------------------------------------------------------------------- + +=head1 B<verbatim()> + + $parser->verbatim($text,$line_num,$pod_para); + +This method may be overridden by subclasses to take the appropriate +action when a block of verbatim text is encountered. It is passed the +following parameters: + +=over 3 + +=item C<$text> + +the block of text for the verbatim paragraph + +=item C<$line_num> + +the line-number of the beginning of the paragraph + +=item C<$pod_para> + +a reference to a C<Pod::Paragraph> object which contains further +information about the paragraph (see L<Pod::InputObjects> +for details). + +=back + +The base class implementation of this method simply prints the textblock +(unmodified) to the output filehandle. + +=cut + +sub verbatim { + my ($self, $text, $line_num, $pod_para) = @_; + my $out_fh = $self->{_OUTPUT}; + print $out_fh $text; +} + +##--------------------------------------------------------------------------- + +=head1 B<textblock()> + + $parser->textblock($text,$line_num,$pod_para); + +This method may be overridden by subclasses to take the appropriate +action when a normal block of POD text is encountered (although the base +class method will usually do what you want). It is passed the following +parameters: + +=over 3 + +=item C<$text> + +the block of text for the a POD paragraph + +=item C<$line_num> + +the line-number of the beginning of the paragraph + +=item C<$pod_para> + +a reference to a C<Pod::Paragraph> object which contains further +information about the paragraph (see L<Pod::InputObjects> +for details). + +=back + +In order to process interior sequences, subclasses implementations of +this method will probably want to invoke either B<interpolate()> or +B<parse_text()>, passing it the text block C<$text>, and the corresponding +line number in C<$line_num>, and then perform any desired processing upon +the returned result. + +The base class implementation of this method simply prints the text block +as it occurred in the input stream). + +=cut + +sub textblock { + my ($self, $text, $line_num, $pod_para) = @_; + my $out_fh = $self->{_OUTPUT}; + print $out_fh $self->interpolate($text, $line_num); +} + +##--------------------------------------------------------------------------- + +=head1 B<interior_sequence()> + + $parser->interior_sequence($seq_cmd,$seq_arg,$pod_seq); + +This method should be overridden by subclasses to take the appropriate +action when an interior sequence is encountered. An interior sequence is +an embedded command within a block of text which appears as a command +name (usually a single uppercase character) followed immediately by a +string of text which is enclosed in angle brackets. This method is +passed the sequence command C<$seq_cmd> and the corresponding text +C<$seq_arg>. It is invoked by the B<interpolate()> method for each interior +sequence that occurs in the string that it is passed. It should return +the desired text string to be used in place of the interior sequence. +The C<$pod_seq> argument is a reference to a C<Pod::InteriorSequence> +object which contains further information about the interior sequence. +Please see L<Pod::InputObjects> for details if you need to access this +additional information. + +Subclass implementations of this method may wish to invoke the +B<nested()> method of C<$pod_seq> to see if it is nested inside +some other interior-sequence (and if so, which kind). + +The base class implementation of the B<interior_sequence()> method +simply returns the raw text of the interior sequence (as it occurred +in the input) to the caller. + +=cut + +sub interior_sequence { + my ($self, $seq_cmd, $seq_arg, $pod_seq) = @_; + ## Just return the raw text of the interior sequence + return $pod_seq->raw_text(); +} + +############################################################################# + +=head1 OPTIONAL SUBROUTINE/METHOD OVERRIDES + +B<Pod::Parser> provides several methods which subclasses may want to override +to perform any special pre/post-processing. These methods do I<not> have to +be overridden, but it may be useful for subclasses to take advantage of them. + +=cut + +##--------------------------------------------------------------------------- + +=head1 B<new()> + + my $parser = Pod::Parser->new(); + +This is the constructor for B<Pod::Parser> and its subclasses. You +I<do not> need to override this method! It is capable of constructing +subclass objects as well as base class objects, provided you use +any of the following constructor invocation styles: + + my $parser1 = MyParser->new(); + my $parser2 = new MyParser(); + my $parser3 = $parser2->new(); + +where C<MyParser> is some subclass of B<Pod::Parser>. + +Using the syntax C<MyParser::new()> to invoke the constructor is I<not> +recommended, but if you insist on being able to do this, then the +subclass I<will> need to override the B<new()> constructor method. If +you do override the constructor, you I<must> be sure to invoke the +B<initialize()> method of the newly blessed object. + +Using any of the above invocations, the first argument to the +constructor is always the corresponding package name (or object +reference). No other arguments are required, but if desired, an +associative array (or hash-table) my be passed to the B<new()> +constructor, as in: + + my $parser1 = MyParser->new( MYDATA => $value1, MOREDATA => $value2 ); + my $parser2 = new MyParser( -myflag => 1 ); + +All arguments passed to the B<new()> constructor will be treated as +key/value pairs in a hash-table. The newly constructed object will be +initialized by copying the contents of the given hash-table (which may +have been empty). The B<new()> constructor for this class and all of its +subclasses returns a blessed reference to the initialized object (hash-table). + +=cut + +sub new { + ## Determine if we were called via an object-ref or a classname + my $this = shift; + my $class = ref($this) || $this; + ## Any remaining arguments are treated as initial values for the + ## hash that is used to represent this object. + my %params = @_; + my $self = { %params }; + ## Bless ourselves into the desired class and perform any initialization + bless $self, $class; + $self->initialize(); + return $self; +} + +##--------------------------------------------------------------------------- + +=head1 B<initialize()> + + $parser->initialize(); + +This method performs any necessary object initialization. It takes no +arguments (other than the object instance of course, which is typically +copied to a local variable named C<$self>). If subclasses override this +method then they I<must> be sure to invoke C<$self-E<gt>SUPER::initialize()>. + +=cut + +sub initialize { + #my $self = shift; + #return; +} + +##--------------------------------------------------------------------------- + +=head1 B<begin_pod()> + + $parser->begin_pod(); + +This method is invoked at the beginning of processing for each POD +document that is encountered in the input. Subclasses should override +this method to perform any per-document initialization. + +=cut + +sub begin_pod { + #my $self = shift; + #return; +} + +##--------------------------------------------------------------------------- + +=head1 B<begin_input()> + + $parser->begin_input(); + +This method is invoked by B<parse_from_filehandle()> immediately I<before> +processing input from a filehandle. The base class implementation does +nothing, however, subclasses may override it to perform any per-file +initializations. + +Note that if multiple files are parsed for a single POD document +(perhaps the result of some future C<=include> directive) this method +is invoked for every file that is parsed. If you wish to perform certain +initializations once per document, then you should use B<begin_pod()>. + +=cut + +sub begin_input { + #my $self = shift; + #return; +} + +##--------------------------------------------------------------------------- + +=head1 B<end_input()> + + $parser->end_input(); + +This method is invoked by B<parse_from_filehandle()> immediately I<after> +processing input from a filehandle. The base class implementation does +nothing, however, subclasses may override it to perform any per-file +cleanup actions. + +Please note that if multiple files are parsed for a single POD document +(perhaps the result of some kind of C<=include> directive) this method +is invoked for every file that is parsed. If you wish to perform certain +cleanup actions once per document, then you should use B<end_pod()>. + +=cut + +sub end_input { + #my $self = shift; + #return; +} + +##--------------------------------------------------------------------------- + +=head1 B<end_pod()> + + $parser->end_pod(); + +This method is invoked at the end of processing for each POD document +that is encountered in the input. Subclasses should override this method +to perform any per-document finalization. + +=cut + +sub end_pod { + #my $self = shift; + #return; +} + +##--------------------------------------------------------------------------- + +=head1 B<preprocess_line()> + + $textline = $parser->preprocess_line($text, $line_num); + +This method should be overridden by subclasses that wish to perform +any kind of preprocessing for each I<line> of input (I<before> it has +been determined whether or not it is part of a POD paragraph). The +parameter C<$text> is the input line; and the parameter C<$line_num> is +the line number of the corresponding text line. + +The value returned should correspond to the new text to use in its +place. If the empty string or an undefined value is returned then no +further processing will be performed for this line. + +Please note that the B<preprocess_line()> method is invoked I<before> +the B<preprocess_paragraph()> method. After all (possibly preprocessed) +lines in a paragraph have been assembled together and it has been +determined that the paragraph is part of the POD documentation from one +of the selected sections, then B<preprocess_paragraph()> is invoked. + +The base class implementation of this method returns the given text. + +=cut + +sub preprocess_line { + my ($self, $text, $line_num) = @_; + return $text; +} + +##--------------------------------------------------------------------------- + +=head1 B<preprocess_paragraph()> + + $textblock = $parser->preprocess_paragraph($text, $line_num); + +This method should be overridden by subclasses that wish to perform any +kind of preprocessing for each block (paragraph) of POD documentation +that appears in the input stream. The parameter C<$text> is the POD +paragraph from the input file; and the parameter C<$line_num> is the +line number for the beginning of the corresponding paragraph. + +The value returned should correspond to the new text to use in its +place If the empty string is returned or an undefined value is +returned, then the given C<$text> is ignored (not processed). + +This method is invoked after gathering up all the lines in a paragraph +and after determining the cutting state of the paragraph, +but before trying to further parse or interpret them. After +B<preprocess_paragraph()> returns, the current cutting state (which +is returned by C<$self-E<gt>cutting()>) is examined. If it evaluates +to true then input text (including the given C<$text>) is cut (not +processed) until the next POD directive is encountered. + +Please note that the B<preprocess_line()> method is invoked I<before> +the B<preprocess_paragraph()> method. After all (possibly preprocessed) +lines in a paragraph have been assembled together and either it has been +determined that the paragraph is part of the POD documentation from one +of the selected sections or the C<-want_nonPODs> option is true, +then B<preprocess_paragraph()> is invoked. + +The base class implementation of this method returns the given text. + +=cut + +sub preprocess_paragraph { + my ($self, $text, $line_num) = @_; + return $text; +} + +############################################################################# + +=head1 METHODS FOR PARSING AND PROCESSING + +B<Pod::Parser> provides several methods to process input text. These +methods typically won't need to be overridden (and in some cases they +can't be overridden), but subclasses may want to invoke them to exploit +their functionality. + +=cut + +##--------------------------------------------------------------------------- + +=head1 B<parse_text()> + + $ptree1 = $parser->parse_text($text, $line_num); + $ptree2 = $parser->parse_text({%opts}, $text, $line_num); + $ptree3 = $parser->parse_text(\%opts, $text, $line_num); + +This method is useful if you need to perform your own interpolation +of interior sequences and can't rely upon B<interpolate> to expand +them in simple bottom-up order. + +The parameter C<$text> is a string or block of text to be parsed +for interior sequences; and the parameter C<$line_num> is the +line number curresponding to the beginning of C<$text>. + +B<parse_text()> will parse the given text into a parse-tree of "nodes." +and interior-sequences. Each "node" in the parse tree is either a +text-string, or a B<Pod::InteriorSequence>. The result returned is a +parse-tree of type B<Pod::ParseTree>. Please see L<Pod::InputObjects> +for more information about B<Pod::InteriorSequence> and B<Pod::ParseTree>. + +If desired, an optional hash-ref may be specified as the first argument +to customize certain aspects of the parse-tree that is created and +returned. The set of recognized option keywords are: + +=over 3 + +=item B<-expand_seq> =E<gt> I<code-ref>|I<method-name> + +Normally, the parse-tree returned by B<parse_text()> will contain an +unexpanded C<Pod::InteriorSequence> object for each interior-sequence +encountered. Specifying B<-expand_seq> tells B<parse_text()> to "expand" +every interior-sequence it sees by invoking the referenced function +(or named method of the parser object) and using the return value as the +expanded result. + +If a subroutine reference was given, it is invoked as: + + &$code_ref( $parser, $sequence ) + +and if a method-name was given, it is invoked as: + + $parser->method_name( $sequence ) + +where C<$parser> is a reference to the parser object, and C<$sequence> +is a reference to the interior-sequence object. +[I<NOTE>: If the B<interior_sequence()> method is specified, then it is +invoked according to the interface specified in L<"interior_sequence()">]. + +=item B<-expand_text> =E<gt> I<code-ref>|I<method-name> + +Normally, the parse-tree returned by B<parse_text()> will contain a +text-string for each contiguous sequence of characters outside of an +interior-sequence. Specifying B<-expand_text> tells B<parse_text()> to +"preprocess" every such text-string it sees by invoking the referenced +function (or named method of the parser object) and using the return value +as the preprocessed (or "expanded") result. [Note that if the result is +an interior-sequence, then it will I<not> be expanded as specified by the +B<-expand_seq> option; Any such recursive expansion needs to be handled by +the specified callback routine.] + +If a subroutine reference was given, it is invoked as: + + &$code_ref( $parser, $text, $ptree_node ) + +and if a method-name was given, it is invoked as: + + $parser->method_name( $text, $ptree_node ) + +where C<$parser> is a reference to the parser object, C<$text> is the +text-string encountered, and C<$ptree_node> is a reference to the current +node in the parse-tree (usually an interior-sequence object or else the +top-level node of the parse-tree). + +=item B<-expand_ptree> =E<gt> I<code-ref>|I<method-name> + +Rather than returning a C<Pod::ParseTree>, pass the parse-tree as an +argument to the referenced subroutine (or named method of the parser +object) and return the result instead of the parse-tree object. + +If a subroutine reference was given, it is invoked as: + + &$code_ref( $parser, $ptree ) + +and if a method-name was given, it is invoked as: + + $parser->method_name( $ptree ) + +where C<$parser> is a reference to the parser object, and C<$ptree> +is a reference to the parse-tree object. + +=back + +=cut + +sub parse_text { + my $self = shift; + local $_ = ''; + + ## Get options and set any defaults + my %opts = (ref $_[0]) ? %{ shift() } : (); + my $expand_seq = $opts{'-expand_seq'} || undef; + my $expand_text = $opts{'-expand_text'} || undef; + my $expand_ptree = $opts{'-expand_ptree'} || undef; + + my $text = shift; + my $line = shift; + my $file = $self->input_file(); + my $cmd = ""; + + ## Convert method calls into closures, for our convenience + my $xseq_sub = $expand_seq; + my $xtext_sub = $expand_text; + my $xptree_sub = $expand_ptree; + if (defined $expand_seq and $expand_seq eq 'interior_sequence') { + ## If 'interior_sequence' is the method to use, we have to pass + ## more than just the sequence object, we also need to pass the + ## sequence name and text. + $xseq_sub = sub { + my ($self, $iseq) = @_; + my $args = join("", $iseq->parse_tree->children); + return $self->interior_sequence($iseq->name, $args, $iseq); + }; + } + ref $xseq_sub or $xseq_sub = sub { shift()->$expand_seq(@_) }; + ref $xtext_sub or $xtext_sub = sub { shift()->$expand_text(@_) }; + ref $xptree_sub or $xptree_sub = sub { shift()->$expand_ptree(@_) }; + + ## Keep track of the "current" interior sequence, and maintain a stack + ## of "in progress" sequences. + ## + ## NOTE that we push our own "accumulator" at the very beginning of the + ## stack. It's really a parse-tree, not a sequence; but it implements + ## the methods we need so we can use it to gather-up all the sequences + ## and strings we parse. Thus, by the end of our parsing, it should be + ## the only thing left on our stack and all we have to do is return it! + ## + my $seq = Pod::ParseTree->new(); + my @seq_stack = ($seq); + my ($ldelim, $rdelim) = ('', ''); + + ## Iterate over all sequence starts text (NOTE: split with + ## capturing parens keeps the delimiters) + $_ = $text; + my @tokens = split /([A-Z]<(?:<+\s)?)/; + while ( @tokens ) { + $_ = shift @tokens; + ## Look for the beginning of a sequence + if ( /^([A-Z])(<(?:<+\s)?)$/ ) { + ## Push a new sequence onto the stack of those "in-progress" + my $ldelim_orig; + ($cmd, $ldelim_orig) = ($1, $2); + ($ldelim = $ldelim_orig) =~ s/\s+$//; + ($rdelim = $ldelim) =~ tr/</>/; + $seq = Pod::InteriorSequence->new( + -name => $cmd, + -ldelim => $ldelim_orig, -rdelim => $rdelim, + -file => $file, -line => $line + ); + (@seq_stack > 1) and $seq->nested($seq_stack[-1]); + push @seq_stack, $seq; + } + ## Look for sequence ending + elsif ( @seq_stack > 1 ) { + ## Make sure we match the right kind of closing delimiter + my ($seq_end, $post_seq) = ("", ""); + if ( ($ldelim eq '<' and /\A(.*?)(>)/s) + or /\A(.*?)(\s+$rdelim)/s ) + { + ## Found end-of-sequence, capture the interior and the + ## closing the delimiter, and put the rest back on the + ## token-list + $post_seq = substr($_, length($1) + length($2)); + ($_, $seq_end) = ($1, $2); + (length $post_seq) and unshift @tokens, $post_seq; + } + if (length) { + ## In the middle of a sequence, append this text to it, and + ## dont forget to "expand" it if that's what the caller wanted + $seq->append($expand_text ? &$xtext_sub($self,$_,$seq) : $_); + $_ .= $seq_end; + } + if (length $seq_end) { + ## End of current sequence, record terminating delimiter + $seq->rdelim($seq_end); + ## Pop it off the stack of "in progress" sequences + pop @seq_stack; + ## Append result to its parent in current parse tree + $seq_stack[-1]->append($expand_seq ? &$xseq_sub($self,$seq) + : $seq); + ## Remember the current cmd-name and left-delimiter + if(@seq_stack > 1) { + $cmd = $seq_stack[-1]->name; + $ldelim = $seq_stack[-1]->ldelim; + $rdelim = $seq_stack[-1]->rdelim; + } else { + $cmd = $ldelim = $rdelim = ''; + } + } + } + elsif (length) { + ## In the middle of a sequence, append this text to it, and + ## dont forget to "expand" it if that's what the caller wanted + $seq->append($expand_text ? &$xtext_sub($self,$_,$seq) : $_); + } + ## Keep track of line count + $line += tr/\n//; + ## Remember the "current" sequence + $seq = $seq_stack[-1]; + } + + ## Handle unterminated sequences + my $errorsub = (@seq_stack > 1) ? $self->errorsub() : undef; + while (@seq_stack > 1) { + ($cmd, $file, $line) = ($seq->name, $seq->file_line); + $ldelim = $seq->ldelim; + ($rdelim = $ldelim) =~ tr/</>/; + $rdelim =~ s/^(\S+)(\s*)$/$2$1/; + pop @seq_stack; + my $errmsg = "*** ERROR: unterminated ${cmd}${ldelim}...${rdelim}". + " at line $line in file $file\n"; + (ref $errorsub) and &{$errorsub}($errmsg) + or (defined $errorsub) and $self->$errorsub($errmsg) + or warn($errmsg); + $seq_stack[-1]->append($expand_seq ? &$xseq_sub($self,$seq) : $seq); + $seq = $seq_stack[-1]; + } + + ## Return the resulting parse-tree + my $ptree = (pop @seq_stack)->parse_tree; + return $expand_ptree ? &$xptree_sub($self, $ptree) : $ptree; +} + +##--------------------------------------------------------------------------- + +=head1 B<interpolate()> + + $textblock = $parser->interpolate($text, $line_num); + +This method translates all text (including any embedded interior sequences) +in the given text string C<$text> and returns the interpolated result. The +parameter C<$line_num> is the line number corresponding to the beginning +of C<$text>. + +B<interpolate()> merely invokes a private method to recursively expand +nested interior sequences in bottom-up order (innermost sequences are +expanded first). If there is a need to expand nested sequences in +some alternate order, use B<parse_text> instead. + +=cut + +sub interpolate { + my($self, $text, $line_num) = @_; + my %parse_opts = ( -expand_seq => 'interior_sequence' ); + my $ptree = $self->parse_text( \%parse_opts, $text, $line_num ); + return join "", $ptree->children(); +} + +##--------------------------------------------------------------------------- + +=begin __PRIVATE__ + +=head1 B<parse_paragraph()> + + $parser->parse_paragraph($text, $line_num); + +This method takes the text of a POD paragraph to be processed, along +with its corresponding line number, and invokes the appropriate method +(one of B<command()>, B<verbatim()>, or B<textblock()>). + +For performance reasons, this method is invoked directly without any +dynamic lookup; Hence subclasses may I<not> override it! + +=end __PRIVATE__ + +=cut + +sub parse_paragraph { + my ($self, $text, $line_num) = @_; + local *myData = $self; ## alias to avoid deref-ing overhead + local *myOpts = ($myData{_PARSEOPTS} ||= {}); ## get parse-options + local $_; + + ## See if we want to preprocess nonPOD paragraphs as well as POD ones. + my $wantNonPods = $myOpts{'-want_nonPODs'}; + + ## Update cutting status + $myData{_CUTTING} = 0 if $text =~ /^={1,2}\S/; + + ## Perform any desired preprocessing if we wanted it this early + $wantNonPods and $text = $self->preprocess_paragraph($text, $line_num); + + ## Ignore up until next POD directive if we are cutting + return if $myData{_CUTTING}; + + ## Now we know this is block of text in a POD section! + + ##----------------------------------------------------------------- + ## This is a hook (hack ;-) for Pod::Select to do its thing without + ## having to override methods, but also without Pod::Parser assuming + ## $self is an instance of Pod::Select (if the _SELECTED_SECTIONS + ## field exists then we assume there is an is_selected() method for + ## us to invoke (calling $self->can('is_selected') could verify this + ## but that is more overhead than I want to incur) + ##----------------------------------------------------------------- + + ## Ignore this block if it isnt in one of the selected sections + if (exists $myData{_SELECTED_SECTIONS}) { + $self->is_selected($text) or return ($myData{_CUTTING} = 1); + } + + ## If we havent already, perform any desired preprocessing and + ## then re-check the "cutting" state + unless ($wantNonPods) { + $text = $self->preprocess_paragraph($text, $line_num); + return 1 unless ((defined $text) and (length $text)); + return 1 if ($myData{_CUTTING}); + } + + ## Look for one of the three types of paragraphs + my ($pfx, $cmd, $arg, $sep) = ('', '', '', ''); + my $pod_para = undef; + if ($text =~ /^(={1,2})(?=\S)/) { + ## Looks like a command paragraph. Capture the command prefix used + ## ("=" or "=="), as well as the command-name, its paragraph text, + ## and whatever sequence of characters was used to separate them + $pfx = $1; + $_ = substr($text, length $pfx); + ($cmd, $sep, $text) = split /(\s+)/, $_, 2; + ## If this is a "cut" directive then we dont need to do anything + ## except return to "cutting" mode. + if ($cmd eq 'cut') { + $myData{_CUTTING} = 1; + return unless $myOpts{'-process_cut_cmd'}; + } + } + ## Save the attributes indicating how the command was specified. + $pod_para = new Pod::Paragraph( + -name => $cmd, + -text => $text, + -prefix => $pfx, + -separator => $sep, + -file => $myData{_INFILE}, + -line => $line_num + ); + # ## Invoke appropriate callbacks + # if (exists $myData{_CALLBACKS}) { + # ## Look through the callback list, invoke callbacks, + # ## then see if we need to do the default actions + # ## (invoke_callbacks will return true if we do). + # return 1 unless $self->invoke_callbacks($cmd, $text, $line_num, $pod_para); + # } + if (length $cmd) { + ## A command paragraph + $self->command($cmd, $text, $line_num, $pod_para); + } + elsif ($text =~ /^\s+/) { + ## Indented text - must be a verbatim paragraph + $self->verbatim($text, $line_num, $pod_para); + } + else { + ## Looks like an ordinary block of text + $self->textblock($text, $line_num, $pod_para); + } + return 1; +} + +##--------------------------------------------------------------------------- + +=head1 B<parse_from_filehandle()> + + $parser->parse_from_filehandle($in_fh,$out_fh); + +This method takes an input filehandle (which is assumed to already be +opened for reading) and reads the entire input stream looking for blocks +(paragraphs) of POD documentation to be processed. If no first argument +is given the default input filehandle C<STDIN> is used. + +The C<$in_fh> parameter may be any object that provides a B<getline()> +method to retrieve a single line of input text (hence, an appropriate +wrapper object could be used to parse PODs from a single string or an +array of strings). + +Using C<$in_fh-E<gt>getline()>, input is read line-by-line and assembled +into paragraphs or "blocks" (which are separated by lines containing +nothing but whitespace). For each block of POD documentation +encountered it will invoke a method to parse the given paragraph. + +If a second argument is given then it should correspond to a filehandle where +output should be sent (otherwise the default output filehandle is +C<STDOUT> if no output filehandle is currently in use). + +B<NOTE:> For performance reasons, this method caches the input stream at +the top of the stack in a local variable. Any attempts by clients to +change the stack contents during processing when in the midst executing +of this method I<will not affect> the input stream used by the current +invocation of this method. + +This method does I<not> usually need to be overridden by subclasses. + +=cut + +sub parse_from_filehandle { + my $self = shift; + my %opts = (ref $_[0] eq 'HASH') ? %{ shift() } : (); + my ($in_fh, $out_fh) = @_; + $in_fh = \*STDIN unless ($in_fh); + local *myData = $self; ## alias to avoid deref-ing overhead + local *myOpts = ($myData{_PARSEOPTS} ||= {}); ## get parse-options + local $_; + + ## Put this stream at the top of the stack and do beginning-of-input + ## processing. NOTE that $in_fh might be reset during this process. + my $topstream = $self->_push_input_stream($in_fh, $out_fh); + (exists $opts{-cutting}) and $self->cutting( $opts{-cutting} ); + + ## Initialize line/paragraph + my ($textline, $paragraph) = ('', ''); + my ($nlines, $plines) = (0, 0); + + ## Use <$fh> instead of $fh->getline where possible (for speed) + $_ = ref $in_fh; + my $tied_fh = (/^(?:GLOB|FileHandle|IO::\w+)$/ or tied $in_fh); + + ## Read paragraphs line-by-line + while (defined ($textline = $tied_fh ? <$in_fh> : $in_fh->getline)) { + $textline = $self->preprocess_line($textline, ++$nlines); + next unless ((defined $textline) && (length $textline)); + + if ((! length $paragraph) && ($textline =~ /^==/)) { + ## '==' denotes a one-line command paragraph + $paragraph = $textline; + $plines = 1; + $textline = ''; + } else { + ## Append this line to the current paragraph + $paragraph .= $textline; + ++$plines; + } + + ## See if this line is blank and ends the current paragraph. + ## If it isnt, then keep iterating until it is. + next unless (($textline =~ /^([^\S\r\n]*)[\r\n]*$/) + && (length $paragraph)); + + ## Issue a warning about any non-empty blank lines + if (length($1) > 0 and $myOpts{'-warnings'} and ! $myData{_CUTTING}) { + my $errorsub = $self->errorsub(); + my $file = $self->input_file(); + my $errmsg = "*** WARNING: line containing nothing but whitespace". + " in paragraph at line $nlines in file $file\n"; + (ref $errorsub) and &{$errorsub}($errmsg) + or (defined $errorsub) and $self->$errorsub($errmsg) + or warn($errmsg); + } + + ## Now process the paragraph + parse_paragraph($self, $paragraph, ($nlines - $plines) + 1); + $paragraph = ''; + $plines = 0; + } + ## Dont forget about the last paragraph in the file + if (length $paragraph) { + parse_paragraph($self, $paragraph, ($nlines - $plines) + 1) + } + + ## Now pop the input stream off the top of the input stack. + $self->_pop_input_stream(); +} + +##--------------------------------------------------------------------------- + +=head1 B<parse_from_file()> + + $parser->parse_from_file($filename,$outfile); + +This method takes a filename and does the following: + +=over 2 + +=item * + +opens the input and output files for reading +(creating the appropriate filehandles) + +=item * + +invokes the B<parse_from_filehandle()> method passing it the +corresponding input and output filehandles. + +=item * + +closes the input and output files. + +=back + +If the special input filename "-" or "<&STDIN" is given then the STDIN +filehandle is used for input (and no open or close is performed). If no +input filename is specified then "-" is implied. + +If a second argument is given then it should be the name of the desired +output file. If the special output filename "-" or ">&STDOUT" is given +then the STDOUT filehandle is used for output (and no open or close is +performed). If the special output filename ">&STDERR" is given then the +STDERR filehandle is used for output (and no open or close is +performed). If no output filehandle is currently in use and no output +filename is specified, then "-" is implied. +Alternatively, an L<IO::String> object is also accepted as an output +file handle. + +This method does I<not> usually need to be overridden by subclasses. + +=cut + +sub parse_from_file { + my $self = shift; + my %opts = (ref $_[0] eq 'HASH') ? %{ shift() } : (); + my ($infile, $outfile) = @_; + my ($in_fh, $out_fh) = (gensym(), gensym()) if ($] < 5.006); + my ($close_input, $close_output) = (0, 0); + local *myData = $self; + local *_; + + ## Is $infile a filename or a (possibly implied) filehandle + if (defined $infile && ref $infile) { + if (ref($infile) =~ /^(SCALAR|ARRAY|HASH|CODE|REF)$/) { + croak "Input from $1 reference not supported!\n"; + } + ## Must be a filehandle-ref (or else assume its a ref to an object + ## that supports the common IO read operations). + $myData{_INFILE} = ${$infile}; + $in_fh = $infile; + } + elsif (!defined($infile) || !length($infile) || ($infile eq '-') + || ($infile =~ /^<&(?:STDIN|0)$/i)) + { + ## Not a filename, just a string implying STDIN + $infile ||= '-'; + $myData{_INFILE} = "<standard input>"; + $in_fh = \*STDIN; + } + else { + ## We have a filename, open it for reading + $myData{_INFILE} = $infile; + open($in_fh, "< $infile") or + croak "Can't open $infile for reading: $!\n"; + $close_input = 1; + } + + ## NOTE: we need to be *very* careful when "defaulting" the output + ## file. We only want to use a default if this is the beginning of + ## the entire document (but *not* if this is an included file). We + ## determine this by seeing if the input stream stack has been set-up + ## already + + ## Is $outfile a filename, a (possibly implied) filehandle, maybe a ref? + if (ref $outfile) { + ## we need to check for ref() first, as other checks involve reading + if (ref($outfile) =~ /^(ARRAY|HASH|CODE)$/) { + croak "Output to $1 reference not supported!\n"; + } + elsif (ref($outfile) eq 'SCALAR') { +# # NOTE: IO::String isn't a part of the perl distribution, +# # so probably we shouldn't support this case... +# require IO::String; +# $myData{_OUTFILE} = "$outfile"; +# $out_fh = IO::String->new($outfile); + croak "Output to SCALAR reference not supported!\n"; + } + else { + ## Must be a filehandle-ref (or else assume its a ref to an + ## object that supports the common IO write operations). + $myData{_OUTFILE} = ${$outfile}; + $out_fh = $outfile; + } + } + elsif (!defined($outfile) || !length($outfile) || ($outfile eq '-') + || ($outfile =~ /^>&?(?:STDOUT|1)$/i)) + { + if (defined $myData{_TOP_STREAM}) { + $out_fh = $myData{_OUTPUT}; + } + else { + ## Not a filename, just a string implying STDOUT + $outfile ||= '-'; + $myData{_OUTFILE} = "<standard output>"; + $out_fh = \*STDOUT; + } + } + elsif ($outfile =~ /^>&(STDERR|2)$/i) { + ## Not a filename, just a string implying STDERR + $myData{_OUTFILE} = "<standard error>"; + $out_fh = \*STDERR; + } + else { + ## We have a filename, open it for writing + $myData{_OUTFILE} = $outfile; + (-d $outfile) and croak "$outfile is a directory, not POD input!\n"; + open($out_fh, "> $outfile") or + croak "Can't open $outfile for writing: $!\n"; + $close_output = 1; + } + + ## Whew! That was a lot of work to set up reasonably/robust behavior + ## in the case of a non-filename for reading and writing. Now we just + ## have to parse the input and close the handles when we're finished. + $self->parse_from_filehandle(\%opts, $in_fh, $out_fh); + + $close_input and + close($in_fh) || croak "Can't close $infile after reading: $!\n"; + $close_output and + close($out_fh) || croak "Can't close $outfile after writing: $!\n"; +} + +############################################################################# + +=head1 ACCESSOR METHODS + +Clients of B<Pod::Parser> should use the following methods to access +instance data fields: + +=cut + +##--------------------------------------------------------------------------- + +=head1 B<errorsub()> + + $parser->errorsub("method_name"); + $parser->errorsub(\&warn_user); + $parser->errorsub(sub { print STDERR, @_ }); + +Specifies the method or subroutine to use when printing error messages +about POD syntax. The supplied method/subroutine I<must> return TRUE upon +successful printing of the message. If C<undef> is given, then the B<warn> +builtin is used to issue error messages (this is the default behavior). + + my $errorsub = $parser->errorsub() + my $errmsg = "This is an error message!\n" + (ref $errorsub) and &{$errorsub}($errmsg) + or (defined $errorsub) and $parser->$errorsub($errmsg) + or warn($errmsg); + +Returns a method name, or else a reference to the user-supplied subroutine +used to print error messages. Returns C<undef> if the B<warn> builtin +is used to issue error messages (this is the default behavior). + +=cut + +sub errorsub { + return (@_ > 1) ? ($_[0]->{_ERRORSUB} = $_[1]) : $_[0]->{_ERRORSUB}; +} + +##--------------------------------------------------------------------------- + +=head1 B<cutting()> + + $boolean = $parser->cutting(); + +Returns the current C<cutting> state: a boolean-valued scalar which +evaluates to true if text from the input file is currently being "cut" +(meaning it is I<not> considered part of the POD document). + + $parser->cutting($boolean); + +Sets the current C<cutting> state to the given value and returns the +result. + +=cut + +sub cutting { + return (@_ > 1) ? ($_[0]->{_CUTTING} = $_[1]) : $_[0]->{_CUTTING}; +} + +##--------------------------------------------------------------------------- + +##--------------------------------------------------------------------------- + +=head1 B<parseopts()> + +When invoked with no additional arguments, B<parseopts> returns a hashtable +of all the current parsing options. + + ## See if we are parsing non-POD sections as well as POD ones + my %opts = $parser->parseopts(); + $opts{'-want_nonPODs}' and print "-want_nonPODs\n"; + +When invoked using a single string, B<parseopts> treats the string as the +name of a parse-option and returns its corresponding value if it exists +(returns C<undef> if it doesn't). + + ## Did we ask to see '=cut' paragraphs? + my $want_cut = $parser->parseopts('-process_cut_cmd'); + $want_cut and print "-process_cut_cmd\n"; + +When invoked with multiple arguments, B<parseopts> treats them as +key/value pairs and the specified parse-option names are set to the +given values. Any unspecified parse-options are unaffected. + + ## Set them back to the default + $parser->parseopts(-warnings => 0); + +When passed a single hash-ref, B<parseopts> uses that hash to completely +reset the existing parse-options, all previous parse-option values +are lost. + + ## Reset all options to default + $parser->parseopts( { } ); + +See L<"PARSING OPTIONS"> for more information on the name and meaning of each +parse-option currently recognized. + +=cut + +sub parseopts { + local *myData = shift; + local *myOpts = ($myData{_PARSEOPTS} ||= {}); + return %myOpts if (@_ == 0); + if (@_ == 1) { + local $_ = shift; + return ref($_) ? $myData{_PARSEOPTS} = $_ : $myOpts{$_}; + } + my @newOpts = (%myOpts, @_); + $myData{_PARSEOPTS} = { @newOpts }; +} + +##--------------------------------------------------------------------------- + +=head1 B<output_file()> + + $fname = $parser->output_file(); + +Returns the name of the output file being written. + +=cut + +sub output_file { + return $_[0]->{_OUTFILE}; +} + +##--------------------------------------------------------------------------- + +=head1 B<output_handle()> + + $fhandle = $parser->output_handle(); + +Returns the output filehandle object. + +=cut + +sub output_handle { + return $_[0]->{_OUTPUT}; +} + +##--------------------------------------------------------------------------- + +=head1 B<input_file()> + + $fname = $parser->input_file(); + +Returns the name of the input file being read. + +=cut + +sub input_file { + return $_[0]->{_INFILE}; +} + +##--------------------------------------------------------------------------- + +=head1 B<input_handle()> + + $fhandle = $parser->input_handle(); + +Returns the current input filehandle object. + +=cut + +sub input_handle { + return $_[0]->{_INPUT}; +} + +##--------------------------------------------------------------------------- + +=begin __PRIVATE__ + +=head1 B<input_streams()> + + $listref = $parser->input_streams(); + +Returns a reference to an array which corresponds to the stack of all +the input streams that are currently in the middle of being parsed. + +While parsing an input stream, it is possible to invoke +B<parse_from_file()> or B<parse_from_filehandle()> to parse a new input +stream and then return to parsing the previous input stream. Each input +stream to be parsed is pushed onto the end of this input stack +before any of its input is read. The input stream that is currently +being parsed is always at the end (or top) of the input stack. When an +input stream has been exhausted, it is popped off the end of the +input stack. + +Each element on this input stack is a reference to C<Pod::InputSource> +object. Please see L<Pod::InputObjects> for more details. + +This method might be invoked when printing diagnostic messages, for example, +to obtain the name and line number of the all input files that are currently +being processed. + +=end __PRIVATE__ + +=cut + +sub input_streams { + return $_[0]->{_INPUT_STREAMS}; +} + +##--------------------------------------------------------------------------- + +=begin __PRIVATE__ + +=head1 B<top_stream()> + + $hashref = $parser->top_stream(); + +Returns a reference to the hash-table that represents the element +that is currently at the top (end) of the input stream stack +(see L<"input_streams()">). The return value will be the C<undef> +if the input stack is empty. + +This method might be used when printing diagnostic messages, for example, +to obtain the name and line number of the current input file. + +=end __PRIVATE__ + +=cut + +sub top_stream { + return $_[0]->{_TOP_STREAM} || undef; +} + +############################################################################# + +=head1 PRIVATE METHODS AND DATA + +B<Pod::Parser> makes use of several internal methods and data fields +which clients should not need to see or use. For the sake of avoiding +name collisions for client data and methods, these methods and fields +are briefly discussed here. Determined hackers may obtain further +information about them by reading the B<Pod::Parser> source code. + +Private data fields are stored in the hash-object whose reference is +returned by the B<new()> constructor for this class. The names of all +private methods and data-fields used by B<Pod::Parser> begin with a +prefix of "_" and match the regular expression C</^_\w+$/>. + +=cut + +##--------------------------------------------------------------------------- + +=begin _PRIVATE_ + +=head1 B<_push_input_stream()> + + $hashref = $parser->_push_input_stream($in_fh,$out_fh); + +This method will push the given input stream on the input stack and +perform any necessary beginning-of-document or beginning-of-file +processing. The argument C<$in_fh> is the input stream filehandle to +push, and C<$out_fh> is the corresponding output filehandle to use (if +it is not given or is undefined, then the current output stream is used, +which defaults to standard output if it doesnt exist yet). + +The value returned will be reference to the hash-table that represents +the new top of the input stream stack. I<Please Note> that it is +possible for this method to use default values for the input and output +file handles. If this happens, you will need to look at the C<INPUT> +and C<OUTPUT> instance data members to determine their new values. + +=end _PRIVATE_ + +=cut + +sub _push_input_stream { + my ($self, $in_fh, $out_fh) = @_; + local *myData = $self; + + ## Initialize stuff for the entire document if this is *not* + ## an included file. + ## + ## NOTE: we need to be *very* careful when "defaulting" the output + ## filehandle. We only want to use a default value if this is the + ## beginning of the entire document (but *not* if this is an included + ## file). + unless (defined $myData{_TOP_STREAM}) { + $out_fh = \*STDOUT unless (defined $out_fh); + $myData{_CUTTING} = 1; ## current "cutting" state + $myData{_INPUT_STREAMS} = []; ## stack of all input streams + } + + ## Initialize input indicators + $myData{_OUTFILE} = '(unknown)' unless (defined $myData{_OUTFILE}); + $myData{_OUTPUT} = $out_fh if (defined $out_fh); + $in_fh = \*STDIN unless (defined $in_fh); + $myData{_INFILE} = '(unknown)' unless (defined $myData{_INFILE}); + $myData{_INPUT} = $in_fh; + my $input_top = $myData{_TOP_STREAM} + = new Pod::InputSource( + -name => $myData{_INFILE}, + -handle => $in_fh, + -was_cutting => $myData{_CUTTING} + ); + local *input_stack = $myData{_INPUT_STREAMS}; + push(@input_stack, $input_top); + + ## Perform beginning-of-document and/or beginning-of-input processing + $self->begin_pod() if (@input_stack == 1); + $self->begin_input(); + + return $input_top; +} + +##--------------------------------------------------------------------------- + +=begin _PRIVATE_ + +=head1 B<_pop_input_stream()> + + $hashref = $parser->_pop_input_stream(); + +This takes no arguments. It will perform any necessary end-of-file or +end-of-document processing and then pop the current input stream from +the top of the input stack. + +The value returned will be reference to the hash-table that represents +the new top of the input stream stack. + +=end _PRIVATE_ + +=cut + +sub _pop_input_stream { + my ($self) = @_; + local *myData = $self; + local *input_stack = $myData{_INPUT_STREAMS}; + + ## Perform end-of-input and/or end-of-document processing + $self->end_input() if (@input_stack > 0); + $self->end_pod() if (@input_stack == 1); + + ## Restore cutting state to whatever it was before we started + ## parsing this file. + my $old_top = pop(@input_stack); + $myData{_CUTTING} = $old_top->was_cutting(); + + ## Dont forget to reset the input indicators + my $input_top = undef; + if (@input_stack > 0) { + $input_top = $myData{_TOP_STREAM} = $input_stack[-1]; + $myData{_INFILE} = $input_top->name(); + $myData{_INPUT} = $input_top->handle(); + } else { + delete $myData{_TOP_STREAM}; + delete $myData{_INPUT_STREAMS}; + } + + return $input_top; +} + +############################################################################# + +=head1 TREE-BASED PARSING + +If straightforward stream-based parsing wont meet your needs (as is +likely the case for tasks such as translating PODs into structured +markup languages like HTML and XML) then you may need to take the +tree-based approach. Rather than doing everything in one pass and +calling the B<interpolate()> method to expand sequences into text, it +may be desirable to instead create a parse-tree using the B<parse_text()> +method to return a tree-like structure which may contain an ordered +list of children (each of which may be a text-string, or a similar +tree-like structure). + +Pay special attention to L<"METHODS FOR PARSING AND PROCESSING"> and +to the objects described in L<Pod::InputObjects>. The former describes +the gory details and parameters for how to customize and extend the +parsing behavior of B<Pod::Parser>. B<Pod::InputObjects> provides +several objects that may all be used interchangeably as parse-trees. The +most obvious one is the B<Pod::ParseTree> object. It defines the basic +interface and functionality that all things trying to be a POD parse-tree +should do. A B<Pod::ParseTree> is defined such that each "node" may be a +text-string, or a reference to another parse-tree. Each B<Pod::Paragraph> +object and each B<Pod::InteriorSequence> object also supports the basic +parse-tree interface. + +The B<parse_text()> method takes a given paragraph of text, and +returns a parse-tree that contains one or more children, each of which +may be a text-string, or an InteriorSequence object. There are also +callback-options that may be passed to B<parse_text()> to customize +the way it expands or transforms interior-sequences, as well as the +returned result. These callbacks can be used to create a parse-tree +with custom-made objects (which may or may not support the parse-tree +interface, depending on how you choose to do it). + +If you wish to turn an entire POD document into a parse-tree, that process +is fairly straightforward. The B<parse_text()> method is the key to doing +this successfully. Every paragraph-callback (i.e. the polymorphic methods +for B<command()>, B<verbatim()>, and B<textblock()> paragraphs) takes +a B<Pod::Paragraph> object as an argument. Each paragraph object has a +B<parse_tree()> method that can be used to get or set a corresponding +parse-tree. So for each of those paragraph-callback methods, simply call +B<parse_text()> with the options you desire, and then use the returned +parse-tree to assign to the given paragraph object. + +That gives you a parse-tree for each paragraph - so now all you need is +an ordered list of paragraphs. You can maintain that yourself as a data +element in the object/hash. The most straightforward way would be simply +to use an array-ref, with the desired set of custom "options" for each +invocation of B<parse_text>. Let's assume the desired option-set is +given by the hash C<%options>. Then we might do something like the +following: + + package MyPodParserTree; + + @ISA = qw( Pod::Parser ); + + ... + + sub begin_pod { + my $self = shift; + $self->{'-paragraphs'} = []; ## initialize paragraph list + } + + sub command { + my ($parser, $command, $paragraph, $line_num, $pod_para) = @_; + my $ptree = $parser->parse_text({%options}, $paragraph, ...); + $pod_para->parse_tree( $ptree ); + push @{ $self->{'-paragraphs'} }, $pod_para; + } + + sub verbatim { + my ($parser, $paragraph, $line_num, $pod_para) = @_; + push @{ $self->{'-paragraphs'} }, $pod_para; + } + + sub textblock { + my ($parser, $paragraph, $line_num, $pod_para) = @_; + my $ptree = $parser->parse_text({%options}, $paragraph, ...); + $pod_para->parse_tree( $ptree ); + push @{ $self->{'-paragraphs'} }, $pod_para; + } + + ... + + package main; + ... + my $parser = new MyPodParserTree(...); + $parser->parse_from_file(...); + my $paragraphs_ref = $parser->{'-paragraphs'}; + +Of course, in this module-author's humble opinion, I'd be more inclined to +use the existing B<Pod::ParseTree> object than a simple array. That way +everything in it, paragraphs and sequences, all respond to the same core +interface for all parse-tree nodes. The result would look something like: + + package MyPodParserTree2; + + ... + + sub begin_pod { + my $self = shift; + $self->{'-ptree'} = new Pod::ParseTree; ## initialize parse-tree + } + + sub parse_tree { + ## convenience method to get/set the parse-tree for the entire POD + (@_ > 1) and $_[0]->{'-ptree'} = $_[1]; + return $_[0]->{'-ptree'}; + } + + sub command { + my ($parser, $command, $paragraph, $line_num, $pod_para) = @_; + my $ptree = $parser->parse_text({<<options>>}, $paragraph, ...); + $pod_para->parse_tree( $ptree ); + $parser->parse_tree()->append( $pod_para ); + } + + sub verbatim { + my ($parser, $paragraph, $line_num, $pod_para) = @_; + $parser->parse_tree()->append( $pod_para ); + } + + sub textblock { + my ($parser, $paragraph, $line_num, $pod_para) = @_; + my $ptree = $parser->parse_text({<<options>>}, $paragraph, ...); + $pod_para->parse_tree( $ptree ); + $parser->parse_tree()->append( $pod_para ); + } + + ... + + package main; + ... + my $parser = new MyPodParserTree2(...); + $parser->parse_from_file(...); + my $ptree = $parser->parse_tree; + ... + +Now you have the entire POD document as one great big parse-tree. You +can even use the B<-expand_seq> option to B<parse_text> to insert +whole different kinds of objects. Just don't expect B<Pod::Parser> +to know what to do with them after that. That will need to be in your +code. Or, alternatively, you can insert any object you like so long as +it conforms to the B<Pod::ParseTree> interface. + +One could use this to create subclasses of B<Pod::Paragraphs> and +B<Pod::InteriorSequences> for specific commands (or to create your own +custom node-types in the parse-tree) and add some kind of B<emit()> +method to each custom node/subclass object in the tree. Then all you'd +need to do is recursively walk the tree in the desired order, processing +the children (most likely from left to right) by formatting them if +they are text-strings, or by calling their B<emit()> method if they +are objects/references. + +=head1 SEE ALSO + +L<Pod::InputObjects>, L<Pod::Select> + +B<Pod::InputObjects> defines POD input objects corresponding to +command paragraphs, parse-trees, and interior-sequences. + +B<Pod::Select> is a subclass of B<Pod::Parser> which provides the ability +to selectively include and/or exclude sections of a POD document from being +translated based upon the current heading, subheading, subsubheading, etc. + +=for __PRIVATE__ +B<Pod::Callbacks> is a subclass of B<Pod::Parser> which gives its users +the ability the employ I<callback functions> instead of, or in addition +to, overriding methods of the base class. + +=for __PRIVATE__ +B<Pod::Select> and B<Pod::Callbacks> do not override any +methods nor do they define any new methods with the same name. Because +of this, they may I<both> be used (in combination) as a base class of +the same subclass in order to combine their functionality without +causing any namespace clashes due to multiple inheritance. + +=head1 AUTHOR + +Please report bugs using L<http://rt.cpan.org>. + +Brad Appleton E<lt>bradapp@enteract.comE<gt> + +Based on code for B<Pod::Text> written by +Tom Christiansen E<lt>tchrist@mox.perl.comE<gt> + +=cut + +1; +# vim: ts=4 sw=4 et diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Perldoc.pm b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc.pm new file mode 100644 index 00000000000..8f9614838fb --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc.pm @@ -0,0 +1,1762 @@ + +require 5; +use 5.006; # we use some open(X, "<", $y) syntax +package Pod::Perldoc; +use strict; +use warnings; +use Config '%Config'; + +use Fcntl; # for sysopen +use File::Spec::Functions qw(catfile catdir splitdir); + +use vars qw($VERSION @Pagers $Bindir $Pod2man + $Temp_Files_Created $Temp_File_Lifetime +); +$VERSION = '3.14'; +#.......................................................................... + +BEGIN { # Make a DEBUG constant very first thing... + unless(defined &DEBUG) { + if(($ENV{'PERLDOCDEBUG'} || '') =~ m/^(\d+)/) { # untaint + eval("sub DEBUG () {$1}"); + die "WHAT? Couldn't eval-up a DEBUG constant!? $@" if $@; + } else { + *DEBUG = sub () {0}; + } + } +} + +use Pod::Perldoc::GetOptsOO; # uses the DEBUG. + +#.......................................................................... + +sub TRUE () {1} +sub FALSE () {return} + +BEGIN { + *IS_VMS = $^O eq 'VMS' ? \&TRUE : \&FALSE unless defined &IS_VMS; + *IS_MSWin32 = $^O eq 'MSWin32' ? \&TRUE : \&FALSE unless defined &IS_MSWin32; + *IS_Dos = $^O eq 'dos' ? \&TRUE : \&FALSE unless defined &IS_Dos; + *IS_OS2 = $^O eq 'os2' ? \&TRUE : \&FALSE unless defined &IS_OS2; + *IS_Cygwin = $^O eq 'cygwin' ? \&TRUE : \&FALSE unless defined &IS_Cygwin; + *IS_Linux = $^O eq 'linux' ? \&TRUE : \&FALSE unless defined &IS_Linux; + *IS_HPUX = $^O =~ m/hpux/ ? \&TRUE : \&FALSE unless defined &IS_HPUX; +} + +$Temp_File_Lifetime ||= 60 * 60 * 24 * 5; + # If it's older than five days, it's quite unlikely + # that anyone's still looking at it!! + # (Currently used only by the MSWin cleanup routine) + + +#.......................................................................... +{ my $pager = $Config{'pager'}; + push @Pagers, $pager if -x (split /\s+/, $pager)[0] or IS_VMS; +} +$Bindir = $Config{'scriptdirexp'}; +$Pod2man = "pod2man" . ( $Config{'versiononly'} ? $Config{'version'} : '' ); + +# End of class-init stuff +# +########################################################################### +# +# Option accessors... + +foreach my $subname (map "opt_$_", split '', q{mhlvriFfXqnTdU}) { + no strict 'refs'; + *$subname = do{ use strict 'refs'; sub () { shift->_elem($subname, @_) } }; +} + +# And these are so that GetOptsOO knows they take options: +sub opt_f_with { shift->_elem('opt_f', @_) } +sub opt_q_with { shift->_elem('opt_q', @_) } +sub opt_d_with { shift->_elem('opt_d', @_) } + +sub opt_w_with { # Specify an option for the formatter subclass + my($self, $value) = @_; + if($value =~ m/^([-_a-zA-Z][-_a-zA-Z0-9]*)(?:[=\:](.*?))?$/s) { + my $option = $1; + my $option_value = defined($2) ? $2 : "TRUE"; + $option =~ tr/\-/_/s; # tolerate "foo-bar" for "foo_bar" + $self->add_formatter_option( $option, $option_value ); + } else { + warn "\"$value\" isn't a good formatter option name. I'm ignoring it!\n"; + } + return; +} + +sub opt_M_with { # specify formatter class name(s) + my($self, $classes) = @_; + return unless defined $classes and length $classes; + DEBUG > 4 and print "Considering new formatter classes -M$classes\n"; + my @classes_to_add; + foreach my $classname (split m/[,;]+/s, $classes) { + next unless $classname =~ m/\S/; + if( $classname =~ m/^(\w+(::\w+)+)$/s ) { + # A mildly restrictive concept of what modulenames are valid. + push @classes_to_add, $1; # untaint + } else { + warn "\"$classname\" isn't a valid classname. Ignoring.\n"; + } + } + + unshift @{ $self->{'formatter_classes'} }, @classes_to_add; + + DEBUG > 3 and print( + "Adding @classes_to_add to the list of formatter classes, " + . "making them @{ $self->{'formatter_classes'} }.\n" + ); + + return; +} + +sub opt_V { # report version and exit + print join '', + "Perldoc v$VERSION, under perl v$] for $^O", + + (defined(&Win32::BuildNumber) and defined &Win32::BuildNumber()) + ? (" (win32 build ", &Win32::BuildNumber(), ")") : (), + + (chr(65) eq 'A') ? () : " (non-ASCII)", + + "\n", + ; + exit; +} + +sub opt_t { # choose plaintext as output format + my $self = shift; + $self->opt_o_with('text') if @_ and $_[0]; + return $self->_elem('opt_t', @_); +} + +sub opt_u { # choose raw pod as output format + my $self = shift; + $self->opt_o_with('pod') if @_ and $_[0]; + return $self->_elem('opt_u', @_); +} + +sub opt_n_with { + # choose man as the output format, and specify the proggy to run + my $self = shift; + $self->opt_o_with('man') if @_ and $_[0]; + $self->_elem('opt_n', @_); +} + +sub opt_o_with { # "o" for output format + my($self, $rest) = @_; + return unless defined $rest and length $rest; + if($rest =~ m/^(\w+)$/s) { + $rest = $1; #untaint + } else { + warn "\"$rest\" isn't a valid output format. Skipping.\n"; + return; + } + + $self->aside("Noting \"$rest\" as desired output format...\n"); + + # Figure out what class(es) that could actually mean... + + my @classes; + foreach my $prefix ("Pod::Perldoc::To", "Pod::Simple::", "Pod::") { + # Messy but smart: + foreach my $stem ( + $rest, # Yes, try it first with the given capitalization + "\L$rest", "\L\u$rest", "\U$rest" # And then try variations + + ) { + push @classes, $prefix . $stem; + #print "Considering $prefix$stem\n"; + } + + # Tidier, but misses too much: + #push @classes, $prefix . ucfirst(lc($rest)); + } + $self->opt_M_with( join ";", @classes ); + return; +} + +########################################################################### +# % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % + +sub run { # to be called by the "perldoc" executable + my $class = shift; + if(DEBUG > 3) { + print "Parameters to $class\->run:\n"; + my @x = @_; + while(@x) { + $x[1] = '<undef>' unless defined $x[1]; + $x[1] = "@{$x[1]}" if ref( $x[1] ) eq 'ARRAY'; + print " [$x[0]] => [$x[1]]\n"; + splice @x,0,2; + } + print "\n"; + } + return $class -> new(@_) -> process() || 0; +} + +# % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % +########################################################################### + +sub new { # yeah, nothing fancy + my $class = shift; + my $new = bless {@_}, (ref($class) || $class); + DEBUG > 1 and print "New $class object $new\n"; + $new->init(); + $new; +} + +#.......................................................................... + +sub aside { # If we're in -v or DEBUG mode, say this. + my $self = shift; + if( DEBUG or $self->opt_v ) { + my $out = join( '', + DEBUG ? do { + my $callsub = (caller(1))[3]; + my $package = quotemeta(__PACKAGE__ . '::'); + $callsub =~ s/^$package/'/os; + # the o is justified, as $package really won't change. + $callsub . ": "; + } : '', + @_, + ); + if(DEBUG) { print $out } else { print STDERR $out } + } + return; +} + +#.......................................................................... + +sub usage { + my $self = shift; + warn "@_\n" if @_; + + # Erase evidence of previous errors (if any), so exit status is simple. + $! = 0; + + die <<EOF; +perldoc [options] PageName|ModuleName|ProgramName... +perldoc [options] -f BuiltinFunction +perldoc [options] -q FAQRegex + +Options: + -h Display this help message + -V report version + -r Recursive search (slow) + -i Ignore case + -t Display pod using pod2text instead of pod2man and nroff + (-t is the default on win32 unless -n is specified) + -u Display unformatted pod text + -m Display module's file in its entirety + -n Specify replacement for nroff + -l Display the module's file name + -F Arguments are file names, not modules + -v Verbosely describe what's going on + -T Send output to STDOUT without any pager + -d output_filename_to_send_to + -o output_format_name + -M FormatterModuleNameToUse + -w formatter_option:option_value + -X use index if present (looks for pod.idx at $Config{archlib}) + -q Search the text of questions (not answers) in perlfaq[1-9] + +PageName|ModuleName... + is the name of a piece of documentation that you want to look at. You + may either give a descriptive name of the page (as in the case of + `perlfunc') the name of a module, either like `Term::Info' or like + `Term/Info', or the name of a program, like `perldoc'. + +BuiltinFunction + is the name of a perl function. Will extract documentation from + `perlfunc'. + +FAQRegex + is a regex. Will search perlfaq[1-9] for and extract any + questions that match. + +Any switches in the PERLDOC environment variable will be used before the +command line arguments. The optional pod index file contains a list of +filenames, one per line. + [Perldoc v$VERSION] +EOF + +} + +#.......................................................................... + +sub usage_brief { + my $me = $0; # Editing $0 is unportable + + $me =~ s,.*[/\\],,; # get basename + + die <<"EOUSAGE"; +Usage: $me [-h] [-V] [-r] [-i] [-v] [-t] [-u] [-m] [-n nroffer_program] [-l] [-T] [-d output_filename] [-o output_format] [-M FormatterModuleNameToUse] [-w formatter_option:option_value] [-F] [-X] PageName|ModuleName|ProgramName + $me -f PerlFunc + $me -q FAQKeywords + +The -h option prints more help. Also try "perldoc perldoc" to get +acquainted with the system. [Perldoc v$VERSION] +EOUSAGE + +} + +#.......................................................................... + +sub pagers { @{ shift->{'pagers'} } } + +#.......................................................................... + +sub _elem { # handy scalar meta-accessor: shift->_elem("foo", @_) + if(@_ > 2) { return $_[0]{ $_[1] } = $_[2] } + else { return $_[0]{ $_[1] } } +} +#.......................................................................... +########################################################################### +# +# Init formatter switches, and start it off with __bindir and all that +# other stuff that ToMan.pm needs. +# + +sub init { + my $self = shift; + + # Make sure creat()s are neither too much nor too little + eval { umask(0077) }; # doubtless someone has no mask + + $self->{'args'} ||= \@ARGV; + $self->{'found'} ||= []; + $self->{'temp_file_list'} ||= []; + + + $self->{'target'} = undef; + + $self->init_formatter_class_list; + + $self->{'pagers' } = [@Pagers] unless exists $self->{'pagers'}; + $self->{'bindir' } = $Bindir unless exists $self->{'bindir'}; + $self->{'pod2man'} = $Pod2man unless exists $self->{'pod2man'}; + + push @{ $self->{'formatter_switches'} = [] }, ( + # Yeah, we could use a hashref, but maybe there's some class where options + # have to be ordered; so we'll use an arrayref. + + [ '__bindir' => $self->{'bindir' } ], + [ '__pod2man' => $self->{'pod2man'} ], + ); + + DEBUG > 3 and printf "Formatter switches now: [%s]\n", + join ' ', map "[@$_]", @{ $self->{'formatter_switches'} }; + + return; +} + +#.......................................................................... + +sub init_formatter_class_list { + my $self = shift; + $self->{'formatter_classes'} ||= []; + + # Remember, no switches have been read yet, when + # we've started this routine. + + $self->opt_M_with('Pod::Perldoc::ToPod'); # the always-there fallthru + $self->opt_o_with('text'); + $self->opt_o_with('man') unless IS_MSWin32 || IS_Dos + || !($ENV{TERM} && ( + ($ENV{TERM} || '') !~ /dumb|emacs|none|unknown/i + )); + + return; +} + +#.......................................................................... + +sub process { + # if this ever returns, its retval will be used for exit(RETVAL) + + my $self = shift; + DEBUG > 1 and print " Beginning process.\n"; + DEBUG > 1 and print " Args: @{$self->{'args'}}\n\n"; + if(DEBUG > 3) { + print "Object contents:\n"; + my @x = %$self; + while(@x) { + $x[1] = '<undef>' unless defined $x[1]; + $x[1] = "@{$x[1]}" if ref( $x[1] ) eq 'ARRAY'; + print " [$x[0]] => [$x[1]]\n"; + splice @x,0,2; + } + print "\n"; + } + + # TODO: make it deal with being invoked as various different things + # such as perlfaq". + + return $self->usage_brief unless @{ $self->{'args'} }; + $self->pagers_guessing; + $self->options_reading; + $self->aside(sprintf "$0 => %s v%s\n", ref($self), $self->VERSION); + $self->drop_privs_maybe; + $self->options_processing; + + # Hm, we have @pages and @found, but we only really act on one + # file per call, with the exception of the opt_q hack, and with + # -l things + + $self->aside("\n"); + + my @pages; + $self->{'pages'} = \@pages; + if( $self->opt_f) { @pages = ("perlfunc") } + elsif( $self->opt_q) { @pages = ("perlfaq1" .. "perlfaq9") } + else { @pages = @{$self->{'args'}}; + # @pages = __FILE__ + # if @pages == 1 and $pages[0] eq 'perldoc'; + } + + return $self->usage_brief unless @pages; + + $self->find_good_formatter_class(); + $self->formatter_sanity_check(); + + $self->maybe_diddle_INC(); + # for when we're apparently in a module or extension directory + + my @found = $self->grand_search_init(\@pages); + exit (IS_VMS ? 98962 : 1) unless @found; + + if ($self->opt_l) { + DEBUG and print "We're in -l mode, so byebye after this:\n"; + print join("\n", @found), "\n"; + return; + } + + $self->tweak_found_pathnames(\@found); + $self->assert_closing_stdout; + return $self->page_module_file(@found) if $self->opt_m; + DEBUG > 2 and print "Found: [@found]\n"; + + return $self->render_and_page(\@found); +} + +#.......................................................................... +{ + +my( %class_seen, %class_loaded ); +sub find_good_formatter_class { + my $self = $_[0]; + my @class_list = @{ $self->{'formatter_classes'} || [] }; + die "WHAT? Nothing in the formatter class list!?" unless @class_list; + + my $good_class_found; + foreach my $c (@class_list) { + DEBUG > 4 and print "Trying to load $c...\n"; + if($class_loaded{$c}) { + DEBUG > 4 and print "OK, the already-loaded $c it is!\n"; + $good_class_found = $c; + last; + } + + if($class_seen{$c}) { + DEBUG > 4 and print + "I've tried $c before, and it's no good. Skipping.\n"; + next; + } + + $class_seen{$c} = 1; + + if( $c->can('parse_from_file') ) { + DEBUG > 4 and print + "Interesting, the formatter class $c is already loaded!\n"; + + } elsif( + (IS_VMS or IS_MSWin32 or IS_Dos or IS_OS2) + # the alway case-insensitive fs's + and $class_seen{lc("~$c")}++ + ) { + DEBUG > 4 and print + "We already used something quite like \"\L$c\E\", so no point using $c\n"; + # This avoids redefining the package. + } else { + DEBUG > 4 and print "Trying to eval 'require $c'...\n"; + + local $^W = $^W; + if(DEBUG() or $self->opt_v) { + # feh, let 'em see it + } else { + $^W = 0; + # The average user just has no reason to be seeing + # $^W-suppressable warnings from the the require! + } + + eval "require $c"; + if($@) { + DEBUG > 4 and print "Couldn't load $c: $!\n"; + next; + } + } + + if( $c->can('parse_from_file') ) { + DEBUG > 4 and print "Settling on $c\n"; + my $v = $c->VERSION; + $v = ( defined $v and length $v ) ? " version $v" : ''; + $self->aside("Formatter class $c$v successfully loaded!\n"); + $good_class_found = $c; + last; + } else { + DEBUG > 4 and print "Class $c isn't a formatter?! Skipping.\n"; + } + } + + die "Can't find any loadable formatter class in @class_list?!\nAborting" + unless $good_class_found; + + $self->{'formatter_class'} = $good_class_found; + $self->aside("Will format with the class $good_class_found\n"); + + return; +} + +} +#.......................................................................... + +sub formatter_sanity_check { + my $self = shift; + my $formatter_class = $self->{'formatter_class'} + || die "NO FORMATTER CLASS YET!?"; + + if(!$self->opt_T # so -T can FORCE sending to STDOUT + and $formatter_class->can('is_pageable') + and !$formatter_class->is_pageable + and !$formatter_class->can('page_for_perldoc') + ) { + my $ext = + ($formatter_class->can('output_extension') + && $formatter_class->output_extension + ) || ''; + $ext = ".$ext" if length $ext; + + die + "When using Perldoc to format with $formatter_class, you have to\n" + . "specify -T or -dsomefile$ext\n" + . "See `perldoc perldoc' for more information on those switches.\n" + ; + } +} + +#.......................................................................... + +sub render_and_page { + my($self, $found_list) = @_; + + $self->maybe_generate_dynamic_pod($found_list); + + my($out, $formatter) = $self->render_findings($found_list); + + if($self->opt_d) { + printf "Perldoc (%s) output saved to %s\n", + $self->{'formatter_class'} || ref($self), + $out; + print "But notice that it's 0 bytes long!\n" unless -s $out; + + + } elsif( # Allow the formatter to "page" itself, if it wants. + $formatter->can('page_for_perldoc') + and do { + $self->aside("Going to call $formatter\->page_for_perldoc(\"$out\")\n"); + if( $formatter->page_for_perldoc($out, $self) ) { + $self->aside("page_for_perldoc returned true, so NOT paging with $self.\n"); + 1; + } else { + $self->aside("page_for_perldoc returned false, so paging with $self instead.\n"); + ''; + } + } + ) { + # Do nothing, since the formatter has "paged" it for itself. + + } else { + # Page it normally (internally) + + if( -s $out ) { # Usual case: + $self->page($out, $self->{'output_to_stdout'}, $self->pagers); + + } else { + # Odd case: + $self->aside("Skipping $out (from $$found_list[0] " + . "via $$self{'formatter_class'}) as it is 0-length.\n"); + + push @{ $self->{'temp_file_list'} }, $out; + $self->unlink_if_temp_file($out); + } + } + + $self->after_rendering(); # any extra cleanup or whatever + + return; +} + +#.......................................................................... + +sub options_reading { + my $self = shift; + + if( defined $ENV{"PERLDOC"} and length $ENV{"PERLDOC"} ) { + require Text::ParseWords; + $self->aside("Noting env PERLDOC setting of $ENV{'PERLDOC'}\n"); + # Yes, appends to the beginning + unshift @{ $self->{'args'} }, + Text::ParseWords::shellwords( $ENV{"PERLDOC"} ) + ; + DEBUG > 1 and print " Args now: @{$self->{'args'}}\n\n"; + } else { + DEBUG > 1 and print " Okay, no PERLDOC setting in ENV.\n"; + } + + DEBUG > 1 + and print " Args right before switch processing: @{$self->{'args'}}\n"; + + Pod::Perldoc::GetOptsOO::getopts( $self, $self->{'args'}, 'YES' ) + or return $self->usage; + + DEBUG > 1 + and print " Args after switch processing: @{$self->{'args'}}\n"; + + return $self->usage if $self->opt_h; + + return; +} + +#.......................................................................... + +sub options_processing { + my $self = shift; + + if ($self->opt_X) { + my $podidx = "$Config{'archlib'}/pod.idx"; + $podidx = "" unless -f $podidx && -r _ && -M _ <= 7; + $self->{'podidx'} = $podidx; + } + + $self->{'output_to_stdout'} = 1 if $self->opt_T or ! -t STDOUT; + + $self->options_sanity; + + $self->opt_n("nroff") unless $self->opt_n; + $self->add_formatter_option( '__nroffer' => $self->opt_n ); + + return; +} + +#.......................................................................... + +sub options_sanity { + my $self = shift; + + # The opts-counting stuff interacts quite badly with + # the $ENV{"PERLDOC"} stuff. I.e., if I have $ENV{"PERLDOC"} + # set to -t, and I specify -u on the command line, I don't want + # to be hectored at that -u and -t don't make sense together. + + #my $opts = grep $_ && 1, # yes, the count of the set ones + # $self->opt_t, $self->opt_u, $self->opt_m, $self->opt_l + #; + # + #$self->usage("only one of -t, -u, -m or -l") if $opts > 1; + + + # Any sanity-checking need doing here? + + return; +} + +#.......................................................................... + +sub grand_search_init { + my($self, $pages, @found) = @_; + + foreach (@$pages) { + if ($self->{'podidx'} && open(PODIDX, $self->{'podidx'})) { + my $searchfor = catfile split '::', $_; + $self->aside( "Searching for '$searchfor' in $self->{'podidx'}\n" ); + local $_; + while (<PODIDX>) { + chomp; + push(@found, $_) if m,/$searchfor(?:\.(?:pod|pm))?\z,i; + } + close(PODIDX) or die "Can't close $$self{'podidx'}: $!"; + next; + } + + $self->aside( "Searching for $_\n" ); + + if ($self->opt_F) { + next unless -r; + push @found, $_ if $self->opt_m or $self->containspod($_); + next; + } + + # We must look both in @INC for library modules and in $bindir + # for executables, like h2xs or perldoc itself. + + my @searchdirs = ($self->{'bindir'}, @INC); + unless ($self->opt_m) { + if (IS_VMS) { + my($i,$trn); + for ($i = 0; $trn = $ENV{'DCL$PATH;'.$i}; $i++) { + push(@searchdirs,$trn); + } + push(@searchdirs,'perl_root:[lib.pod]') # installed pods + } + else { + push(@searchdirs, grep(-d, split($Config{path_sep}, + $ENV{'PATH'}))); + } + } + my @files = $self->searchfor(0,$_,@searchdirs); + if (@files) { + $self->aside( "Found as @files\n" ); + } + else { + # no match, try recursive search + @searchdirs = grep(!/^\.\z/s,@INC); + @files= $self->searchfor(1,$_,@searchdirs) if $self->opt_r; + if (@files) { + $self->aside( "Loosely found as @files\n" ); + } + else { + print STDERR "No " . + ($self->opt_m ? "module" : "documentation") . " found for \"$_\".\n"; + if ( @{ $self->{'found'} } ) { + print STDERR "However, try\n"; + for my $dir (@{ $self->{'found'} }) { + opendir(DIR, $dir) or die "opendir $dir: $!"; + while (my $file = readdir(DIR)) { + next if ($file =~ /^\./s); + $file =~ s/\.(pm|pod)\z//; # XXX: badfs + print STDERR "\tperldoc $_\::$file\n"; + } + closedir(DIR) or die "closedir $dir: $!"; + } + } + } + } + push(@found,@files); + } + return @found; +} + +#.......................................................................... + +sub maybe_generate_dynamic_pod { + my($self, $found_things) = @_; + my @dynamic_pod; + + $self->search_perlfunc($found_things, \@dynamic_pod) if $self->opt_f; + + $self->search_perlfaqs($found_things, \@dynamic_pod) if $self->opt_q; + + if( ! $self->opt_f and ! $self->opt_q ) { + DEBUG > 4 and print "That's a non-dynamic pod search.\n"; + } elsif ( @dynamic_pod ) { + $self->aside("Hm, I found some Pod from that search!\n"); + my ($buffd, $buffer) = $self->new_tempfile('pod', 'dyn'); + + push @{ $self->{'temp_file_list'} }, $buffer; + # I.e., it MIGHT be deleted at the end. + + my $in_list = $self->opt_f; + + print $buffd "=over 8\n\n" if $in_list; + print $buffd @dynamic_pod or die "Can't print $buffer: $!"; + print $buffd "=back\n" if $in_list; + + close $buffd or die "Can't close $buffer: $!"; + + @$found_things = $buffer; + # Yes, so found_things never has more than one thing in + # it, by time we leave here + + $self->add_formatter_option('__filter_nroff' => 1); + + } else { + @$found_things = (); + $self->aside("I found no Pod from that search!\n"); + } + + return; +} + +#.......................................................................... + +sub add_formatter_option { # $self->add_formatter_option('key' => 'value'); + my $self = shift; + push @{ $self->{'formatter_switches'} }, [ @_ ] if @_; + + DEBUG > 3 and printf "Formatter switches now: [%s]\n", + join ' ', map "[@$_]", @{ $self->{'formatter_switches'} }; + + return; +} + +#.......................................................................... + +sub search_perlfunc { + my($self, $found_things, $pod) = @_; + + DEBUG > 2 and print "Search: @$found_things\n"; + + my $perlfunc = shift @$found_things; + open(PFUNC, "<", $perlfunc) # "Funk is its own reward" + or die("Can't open $perlfunc: $!"); + + # Functions like -r, -e, etc. are listed under `-X'. + my $search_re = ($self->opt_f =~ /^-[rwxoRWXOeszfdlpSbctugkTBMAC]$/) + ? '(?:I<)?-X' : quotemeta($self->opt_f) ; + + DEBUG > 2 and + print "Going to perlfunc-scan for $search_re in $perlfunc\n"; + + # Skip introduction + local $_; + while (<PFUNC>) { + last if /^=head2 Alphabetical Listing of Perl Functions/; + } + + # Look for our function + my $found = 0; + my $inlist = 0; + while (<PFUNC>) { # "The Mothership Connection is here!" + if ( m/^=item\s+$search_re\b/ ) { + $found = 1; + } + elsif (/^=item/) { + last if $found > 1 and not $inlist; + } + next unless $found; + if (/^=over/) { + ++$inlist; + } + elsif (/^=back/) { + --$inlist; + } + push @$pod, $_; + ++$found if /^\w/; # found descriptive text + } + if (!@$pod) { + die sprintf + "No documentation for perl function `%s' found\n", + $self->opt_f + ; + } + close PFUNC or die "Can't open $perlfunc: $!"; + + return; +} + +#.......................................................................... + +sub search_perlfaqs { + my( $self, $found_things, $pod) = @_; + + my $found = 0; + my %found_in; + my $search_key = $self->opt_q; + + my $rx = eval { qr/$search_key/ } + or die <<EOD; +Invalid regular expression '$search_key' given as -q pattern: +$@ +Did you mean \\Q$search_key ? + +EOD + + local $_; + foreach my $file (@$found_things) { + die "invalid file spec: $!" if $file =~ /[<>|]/; + open(INFAQ, "<", $file) # XXX 5.6ism + or die "Can't read-open $file: $!\nAborting"; + while (<INFAQ>) { + if ( m/^=head2\s+.*(?:$search_key)/i ) { + $found = 1; + push @$pod, "=head1 Found in $file\n\n" unless $found_in{$file}++; + } + elsif (/^=head[12]/) { + $found = 0; + } + next unless $found; + push @$pod, $_; + } + close(INFAQ); + } + die("No documentation for perl FAQ keyword `$search_key' found\n") + unless @$pod; + + return; +} + + +#.......................................................................... + +sub render_findings { + # Return the filename to open + + my($self, $found_things) = @_; + + my $formatter_class = $self->{'formatter_class'} + || die "No formatter class set!?"; + my $formatter = $formatter_class->can('new') + ? $formatter_class->new + : $formatter_class + ; + + if(! @$found_things) { + die "Nothing found?!"; + # should have been caught before here + } elsif(@$found_things > 1) { + warn join '', + "Perldoc is only really meant for reading one document at a time.\n", + "So these parameters are being ignored: ", + join(' ', @$found_things[1 .. $#$found_things] ), + "\n" + } + + my $file = $found_things->[0]; + + DEBUG > 3 and printf "Formatter switches now: [%s]\n", + join ' ', map "[@$_]", @{ $self->{'formatter_switches'} }; + + # Set formatter options: + if( ref $formatter ) { + foreach my $f (@{ $self->{'formatter_switches'} || [] }) { + my($switch, $value, $silent_fail) = @$f; + if( $formatter->can($switch) ) { + eval { $formatter->$switch( defined($value) ? $value : () ) }; + warn "Got an error when setting $formatter_class\->$switch:\n$@\n" + if $@; + } else { + if( $silent_fail or $switch =~ m/^__/s ) { + DEBUG > 2 and print "Formatter $formatter_class doesn't support $switch\n"; + } else { + warn "$formatter_class doesn't recognize the $switch switch.\n"; + } + } + } + } + + $self->{'output_is_binary'} = + $formatter->can('write_with_binmode') && $formatter->write_with_binmode; + + my ($out_fh, $out) = $self->new_output_file( + ( $formatter->can('output_extension') && $formatter->output_extension ) + || undef, + $self->useful_filename_bit, + ); + + # Now, finally, do the formatting! + { + local $^W = $^W; + if(DEBUG() or $self->opt_v) { + # feh, let 'em see it + } else { + $^W = 0; + # The average user just has no reason to be seeing + # $^W-suppressable warnings from the formatting! + } + + eval { $formatter->parse_from_file( $file, $out_fh ) }; + } + + warn "Error while formatting with $formatter_class:\n $@\n" if $@; + DEBUG > 2 and print "Back from formatting with $formatter_class\n"; + + close $out_fh + or warn "Can't close $out: $!\n(Did $formatter already close it?)"; + sleep 0; sleep 0; sleep 0; + # Give the system a few timeslices to meditate on the fact + # that the output file does in fact exist and is closed. + + $self->unlink_if_temp_file($file); + + unless( -s $out ) { + if( $formatter->can( 'if_zero_length' ) ) { + # Basically this is just a hook for Pod::Simple::Checker; since + # what other class could /happily/ format an input file with Pod + # as a 0-length output file? + $formatter->if_zero_length( $file, $out, $out_fh ); + } else { + warn "Got a 0-length file from $$found_things[0] via $formatter_class!?\n" + } + } + + DEBUG and print "Finished writing to $out.\n"; + return($out, $formatter) if wantarray; + return $out; +} + +#.......................................................................... + +sub unlink_if_temp_file { + # Unlink the specified file IFF it's in the list of temp files. + # Really only used in the case of -f / -q things when we can + # throw away the dynamically generated source pod file once + # we've formatted it. + # + my($self, $file) = @_; + return unless defined $file and length $file; + + my $temp_file_list = $self->{'temp_file_list'} || return; + if(grep $_ eq $file, @$temp_file_list) { + $self->aside("Unlinking $file\n"); + unlink($file) or warn "Odd, couldn't unlink $file: $!"; + } else { + DEBUG > 1 and print "$file isn't a temp file, so not unlinking.\n"; + } + return; +} + +#.......................................................................... + +sub MSWin_temp_cleanup { + + # Nothing particularly MSWin-specific in here, but I don't know if any + # other OS needs its temp dir policed like MSWin does! + + my $self = shift; + + my $tempdir = $ENV{'TEMP'}; + return unless defined $tempdir and length $tempdir + and -e $tempdir and -d _ and -w _; + + $self->aside( + "Considering whether any old files of mine in $tempdir need unlinking.\n" + ); + + opendir(TMPDIR, $tempdir) || return; + my @to_unlink; + + my $limit = time() - $Temp_File_Lifetime; + + DEBUG > 5 and printf "Looking for things pre-dating %s (%x)\n", + ($limit) x 2; + + my $filespec; + + while(defined($filespec = readdir(TMPDIR))) { + if( + $filespec =~ m{^perldoc_[a-zA-Z0-9]+_T([a-fA-F0-9]{7,})_[a-fA-F0-9]{3,}}s + ) { + if( hex($1) < $limit ) { + push @to_unlink, "$tempdir/$filespec"; + $self->aside( "Will unlink my old temp file $to_unlink[-1]\n" ); + } else { + DEBUG > 5 and + printf " $tempdir/$filespec is too recent (after %x)\n", $limit; + } + } else { + DEBUG > 5 and + print " $tempdir/$filespec doesn't look like a perldoc temp file.\n"; + } + } + closedir(TMPDIR); + $self->aside(sprintf "Unlinked %s items of mine in %s\n", + scalar(unlink(@to_unlink)), + $tempdir + ); + return; +} + +# . . . . . . . . . . . . . . . . . . . . . . . . . + +sub MSWin_perldoc_tempfile { + my($self, $suffix, $infix) = @_; + + my $tempdir = $ENV{'TEMP'}; + return unless defined $tempdir and length $tempdir + and -e $tempdir and -d _ and -w _; + + my $spec; + + do { + $spec = sprintf "%s\\perldoc_%s_T%x_%x%02x.%s", # used also in MSWin_temp_cleanup + # Yes, we embed the create-time in the filename! + $tempdir, + $infix || 'x', + time(), + $$, + defined( &Win32::GetTickCount ) + ? (Win32::GetTickCount() & 0xff) + : int(rand 256) + # Under MSWin, $$ values get reused quickly! So if we ran + # perldoc foo and then perldoc bar before there was time for + # time() to increment time."_$$" would likely be the same + # for each process! So we tack on the tick count's lower + # bits (or, in a pinch, rand) + , + $suffix || 'txt'; + ; + } while( -e $spec ); + + my $counter = 0; + + while($counter < 50) { + my $fh; + # If we are running before perl5.6.0, we can't autovivify + if ($] < 5.006) { + require Symbol; + $fh = Symbol::gensym(); + } + DEBUG > 3 and print "About to try making temp file $spec\n"; + return($fh, $spec) if open($fh, ">", $spec); # XXX 5.6ism + $self->aside("Can't create temp file $spec: $!\n"); + } + + $self->aside("Giving up on making a temp file!\n"); + die "Can't make a tempfile!?"; +} + +#.......................................................................... + + +sub after_rendering { + my $self = $_[0]; + $self->after_rendering_VMS if IS_VMS; + $self->after_rendering_MSWin32 if IS_MSWin32; + $self->after_rendering_Dos if IS_Dos; + $self->after_rendering_OS2 if IS_OS2; + return; +} + +sub after_rendering_VMS { return } +sub after_rendering_Dos { return } +sub after_rendering_OS2 { return } + +sub after_rendering_MSWin32 { + shift->MSWin_temp_cleanup() if $Temp_Files_Created; +} + +#.......................................................................... +# : : : : : : : : : +#.......................................................................... + + +sub minus_f_nocase { # i.e., do like -f, but without regard to case + + my($self, $dir, $file) = @_; + my $path = catfile($dir,$file); + return $path if -f $path and -r _; + + if(!$self->opt_i + or IS_VMS or IS_MSWin32 + or IS_Dos or IS_OS2 + ) { + # On a case-forgiving file system, or if case is important, + # that is it, all we can do. + warn "Ignored $path: unreadable\n" if -f _; + return ''; + } + + local *DIR; + my @p = ($dir); + my($p,$cip); + foreach $p (splitdir $file){ + my $try = catfile @p, $p; + $self->aside("Scrutinizing $try...\n"); + stat $try; + if (-d _) { + push @p, $p; + if ( $p eq $self->{'target'} ) { + my $tmp_path = catfile @p; + my $path_f = 0; + for (@{ $self->{'found'} }) { + $path_f = 1 if $_ eq $tmp_path; + } + push (@{ $self->{'found'} }, $tmp_path) unless $path_f; + $self->aside( "Found as $tmp_path but directory\n" ); + } + } + elsif (-f _ && -r _) { + return $try; + } + elsif (-f _) { + warn "Ignored $try: unreadable\n"; + } + elsif (-d catdir(@p)) { # at least we see the containing directory! + my $found = 0; + my $lcp = lc $p; + my $p_dirspec = catdir(@p); + opendir DIR, $p_dirspec or die "opendir $p_dirspec: $!"; + while(defined( $cip = readdir(DIR) )) { + if (lc $cip eq $lcp){ + $found++; + last; # XXX stop at the first? what if there's others? + } + } + closedir DIR or die "closedir $p_dirspec: $!"; + return "" unless $found; + + push @p, $cip; + my $p_filespec = catfile(@p); + return $p_filespec if -f $p_filespec and -r _; + warn "Ignored $p_filespec: unreadable\n" if -f _; + } + } + return ""; +} + +#.......................................................................... + +sub pagers_guessing { + my $self = shift; + + my @pagers; + push @pagers, $self->pagers; + $self->{'pagers'} = \@pagers; + + if (IS_MSWin32) { + push @pagers, qw( more< less notepad ); + unshift @pagers, $ENV{PAGER} if $ENV{PAGER}; + } + elsif (IS_VMS) { + push @pagers, qw( most more less type/page ); + } + elsif (IS_Dos) { + push @pagers, qw( less.exe more.com< ); + unshift @pagers, $ENV{PAGER} if $ENV{PAGER}; + } + else { + if (IS_OS2) { + unshift @pagers, 'less', 'cmd /c more <'; + } + push @pagers, qw( more less pg view cat ); + unshift @pagers, $ENV{PAGER} if $ENV{PAGER}; + } + + if (IS_Cygwin) { + if (($pagers[0] eq 'less') || ($pagers[0] eq '/usr/bin/less')) { + unshift @pagers, '/usr/bin/less -isrR'; + } + } + + unshift @pagers, $ENV{PERLDOC_PAGER} if $ENV{PERLDOC_PAGER}; + + return; +} + +#.......................................................................... + +sub page_module_file { + my($self, @found) = @_; + + # Security note: + # Don't ever just pass this off to anything like MSWin's "start.exe", + # since we might be calling on a .pl file, and we wouldn't want that + # to actually /execute/ the file that we just want to page thru! + # Also a consideration if one were to use a web browser as a pager; + # doing so could trigger the browser's MIME mapping for whatever + # it thinks .pm/.pl/whatever is. Probably just a (useless and + # annoying) "Save as..." dialog, but potentially executing the file + # in question -- particularly in the case of MSIE and it's, ahem, + # occasionally hazy distinction between OS-local extension + # associations, and browser-specific MIME mappings. + + if ($self->{'output_to_stdout'}) { + $self->aside("Sending unpaged output to STDOUT.\n"); + local $_; + my $any_error = 0; + foreach my $output (@found) { + unless( open(TMP, "<", $output) ) { # XXX 5.6ism + warn("Can't open $output: $!"); + $any_error = 1; + next; + } + while (<TMP>) { + print or die "Can't print to stdout: $!"; + } + close TMP or die "Can't close while $output: $!"; + $self->unlink_if_temp_file($output); + } + return $any_error; # successful + } + + foreach my $pager ( $self->pagers ) { + $self->aside("About to try calling $pager @found\n"); + if (system($pager, @found) == 0) { + $self->aside("Yay, it worked.\n"); + return 0; + } + $self->aside("That didn't work.\n"); + + # Odd -- when it fails, under Win32, this seems to neither + # return with a fail nor return with a success!! + # That's discouraging! + } + + $self->aside( + sprintf "Can't manage to find a way to page [%s] via pagers [%s]\n", + join(' ', @found), + join(' ', $self->pagers), + ); + + if (IS_VMS) { + DEBUG > 1 and print "Bailing out in a VMSish way.\n"; + eval q{ + use vmsish qw(status exit); + exit $?; + 1; + } or die; + } + + return 1; + # i.e., an UNSUCCESSFUL return value! +} + +#.......................................................................... + +sub check_file { + my($self, $dir, $file) = @_; + + unless( ref $self ) { + # Should never get called: + $Carp::Verbose = 1; + require Carp; + Carp::croak( join '', + "Crazy ", __PACKAGE__, " error:\n", + "check_file must be an object_method!\n", + "Aborting" + ); + } + + if(length $dir and not -d $dir) { + DEBUG > 3 and print " No dir $dir -- skipping.\n"; + return ""; + } + + if ($self->opt_m) { + return $self->minus_f_nocase($dir,$file); + } + + else { + my $path = $self->minus_f_nocase($dir,$file); + if( length $path and $self->containspod($path) ) { + DEBUG > 3 and print + " The file $path indeed looks promising!\n"; + return $path; + } + } + DEBUG > 3 and print " No good: $file in $dir\n"; + + return ""; +} + +#.......................................................................... + +sub containspod { + my($self, $file, $readit) = @_; + return 1 if !$readit && $file =~ /\.pod\z/i; + + + # Under cygwin the /usr/bin/perl is legal executable, but + # you cannot open a file with that name. It must be spelled + # out as "/usr/bin/perl.exe". + # + # The following if-case under cygwin prevents error + # + # $ perldoc perl + # Cannot open /usr/bin/perl: no such file or directory + # + # This would work though + # + # $ perldoc perl.pod + + if ( IS_Cygwin and -x $file and -f "$file.exe" ) + { + warn "Cygwin $file.exe search skipped\n" if DEBUG or $self->opt_v; + return 0; + } + + local($_); + open(TEST,"<", $file) or die "Can't open $file: $!"; # XXX 5.6ism + while (<TEST>) { + if (/^=head/) { + close(TEST) or die "Can't close $file: $!"; + return 1; + } + } + close(TEST) or die "Can't close $file: $!"; + return 0; +} + +#.......................................................................... + +sub maybe_diddle_INC { + my $self = shift; + + # Does this look like a module or extension directory? + + if (-f "Makefile.PL") { + + # Add "." and "lib" to @INC (if they exist) + eval q{ use lib qw(. lib); 1; } or die; + + # don't add if superuser + if ($< && $> && -f "blib") { # don't be looking too hard now! + eval q{ use blib; 1 }; + warn $@ if $@ && $self->opt_v; + } + } + + return; +} + +#.......................................................................... + +sub new_output_file { + my $self = shift; + my $outspec = $self->opt_d; # Yes, -d overrides all else! + # So don't call this twice per format-job! + + return $self->new_tempfile(@_) unless defined $outspec and length $outspec; + + # Otherwise open a write-handle on opt_d!f + + my $fh; + # If we are running before perl5.6.0, we can't autovivify + if ($] < 5.006) { + require Symbol; + $fh = Symbol::gensym(); + } + DEBUG > 3 and print "About to try writing to specified output file $outspec\n"; + die "Can't write-open $outspec: $!" + unless open($fh, ">", $outspec); # XXX 5.6ism + + DEBUG > 3 and print "Successfully opened $outspec\n"; + binmode($fh) if $self->{'output_is_binary'}; + return($fh, $outspec); +} + +#.......................................................................... + +sub useful_filename_bit { + # This tries to provide a meaningful bit of text to do with the query, + # such as can be used in naming the file -- since if we're going to be + # opening windows on temp files (as a "pager" may well do!) then it's + # better if the temp file's name (which may well be used as the window + # title) isn't ALL just random garbage! + # In other words "perldoc_LWPSimple_2371981429" is a better temp file + # name than "perldoc_2371981429". So this routine is what tries to + # provide the "LWPSimple" bit. + # + my $self = shift; + my $pages = $self->{'pages'} || return undef; + return undef unless @$pages; + + my $chunk = $pages->[0]; + return undef unless defined $chunk; + $chunk =~ s/:://g; + $chunk =~ s/\.\w+$//g; # strip any extension + if( $chunk =~ m/([^\#\\:\/\$]+)$/s ) { # get basename, if it's a file + $chunk = $1; + } else { + return undef; + } + $chunk =~ s/[^a-zA-Z0-9]+//g; # leave ONLY a-zA-Z0-9 things! + $chunk = substr($chunk, -10) if length($chunk) > 10; + return $chunk; +} + +#.......................................................................... + +sub new_tempfile { # $self->new_tempfile( [$suffix, [$infix] ] ) + my $self = shift; + + ++$Temp_Files_Created; + + if( IS_MSWin32 ) { + my @out = $self->MSWin_perldoc_tempfile(@_); + return @out if @out; + # otherwise fall thru to the normal stuff below... + } + + require File::Temp; + return File::Temp::tempfile(UNLINK => 1); +} + +#.......................................................................... + +sub page { # apply a pager to the output file + my ($self, $output, $output_to_stdout, @pagers) = @_; + if ($output_to_stdout) { + $self->aside("Sending unpaged output to STDOUT.\n"); + open(TMP, "<", $output) or die "Can't open $output: $!"; # XXX 5.6ism + local $_; + while (<TMP>) { + print or die "Can't print to stdout: $!"; + } + close TMP or die "Can't close while $output: $!"; + $self->unlink_if_temp_file($output); + } else { + # On VMS, quoting prevents logical expansion, and temp files with no + # extension get the wrong default extension (such as .LIS for TYPE) + + $output = VMS::Filespec::rmsexpand($output, '.') if IS_VMS; + + $output =~ s{/}{\\}g if IS_MSWin32 || IS_Dos; + # Altho "/" under MSWin is in theory good as a pathsep, + # many many corners of the OS don't like it. So we + # have to force it to be "\" to make everyone happy. + + foreach my $pager (@pagers) { + $self->aside("About to try calling $pager $output\n"); + if (IS_VMS) { + last if system("$pager $output") == 0; + } else { + last if system("$pager \"$output\"") == 0; + } + } + } + return; +} + +#.......................................................................... + +sub searchfor { + my($self, $recurse,$s,@dirs) = @_; + $s =~ s!::!/!g; + $s = VMS::Filespec::unixify($s) if IS_VMS; + return $s if -f $s && $self->containspod($s); + $self->aside( "Looking for $s in @dirs\n" ); + my $ret; + my $i; + my $dir; + $self->{'target'} = (splitdir $s)[-1]; # XXX: why not use File::Basename? + for ($i=0; $i<@dirs; $i++) { + $dir = $dirs[$i]; + next unless -d $dir; # some dirs in @INC are optional + ($dir = VMS::Filespec::unixpath($dir)) =~ s!/\z!! if IS_VMS; + if ( (! $self->opt_m && ( $ret = $self->check_file($dir,"$s.pod"))) + or ( $ret = $self->check_file($dir,"$s.pm")) + or ( $ret = $self->check_file($dir,$s)) + or ( IS_VMS and + $ret = $self->check_file($dir,"$s.com")) + or ( IS_OS2 and + $ret = $self->check_file($dir,"$s.cmd")) + or ( (IS_MSWin32 or IS_Dos or IS_OS2) and + $ret = $self->check_file($dir,"$s.bat")) + or ( $ret = $self->check_file("$dir/pod","$s.pod")) + or ( $ret = $self->check_file("$dir/pod",$s)) + or ( $ret = $self->check_file("$dir/pods","$s.pod")) + or ( $ret = $self->check_file("$dir/pods",$s)) + ) { + DEBUG > 1 and print " Found $ret\n"; + return $ret; + } + + if ($recurse) { + opendir(D,$dir) or die "Can't opendir $dir: $!"; + my @newdirs = map catfile($dir, $_), grep { + not /^\.\.?\z/s and + not /^auto\z/s and # save time! don't search auto dirs + -d catfile($dir, $_) + } readdir D; + closedir(D) or die "Can't closedir $dir: $!"; + next unless @newdirs; + # what a wicked map! + @newdirs = map((s/\.dir\z//,$_)[1],@newdirs) if IS_VMS; + $self->aside( "Also looking in @newdirs\n" ); + push(@dirs,@newdirs); + } + } + return (); +} + +#.......................................................................... +{ + my $already_asserted; + sub assert_closing_stdout { + my $self = shift; + + return if $already_asserted; + + eval q~ END { close(STDOUT) || die "Can't close STDOUT: $!" } ~; + # What for? to let the pager know that nothing more will come? + + die $@ if $@; + $already_asserted = 1; + return; + } +} + +#.......................................................................... + +sub tweak_found_pathnames { + my($self, $found) = @_; + if (IS_MSWin32) { + foreach (@$found) { s,/,\\,g } + } + return; +} + +#.......................................................................... +# : : : : : : : : : +#.......................................................................... + +sub am_taint_checking { + my $self = shift; + die "NO ENVIRONMENT?!?!" unless keys %ENV; # reset iterator along the way + my($k,$v) = each %ENV; + return is_tainted($v); +} + +#.......................................................................... + +sub is_tainted { # just a function + my $arg = shift; + my $nada = substr($arg, 0, 0); # zero-length! + local $@; # preserve the caller's version of $@ + eval { eval "# $nada" }; + return length($@) != 0; +} + +#.......................................................................... + +sub drop_privs_maybe { + my $self = shift; + + # Attempt to drop privs if we should be tainting and aren't + if (!(IS_VMS || IS_MSWin32 || IS_Dos + || IS_OS2 + ) + && ($> == 0 || $< == 0) + && !$self->am_taint_checking() + ) { + my $id = eval { getpwnam("nobody") }; + $id = eval { getpwnam("nouser") } unless defined $id; + $id = -2 unless defined $id; + # + # According to Stevens' APUE and various + # (BSD, Solaris, HP-UX) man pages, setting + # the real uid first and effective uid second + # is the way to go if one wants to drop privileges, + # because if one changes into an effective uid of + # non-zero, one cannot change the real uid any more. + # + # Actually, it gets even messier. There is + # a third uid, called the saved uid, and as + # long as that is zero, one can get back to + # uid of zero. Setting the real-effective *twice* + # helps in *most* systems (FreeBSD and Solaris) + # but apparently in HP-UX even this doesn't help: + # the saved uid stays zero (apparently the only way + # in HP-UX to change saved uid is to call setuid() + # when the effective uid is zero). + # + eval { + $< = $id; # real uid + $> = $id; # effective uid + $< = $id; # real uid + $> = $id; # effective uid + }; + if( !$@ && $< && $> ) { + DEBUG and print "OK, I dropped privileges.\n"; + } elsif( $self->opt_U ) { + DEBUG and print "Couldn't drop privileges, but in -U mode, so feh." + } else { + DEBUG and print "Hm, couldn't drop privileges. Ah well.\n"; + # We used to die here; but that seemed pointless. + } + } + return; +} + +#.......................................................................... + +1; + +__END__ + +# See "perldoc perldoc" for basic details. +# +# Perldoc -- look up a piece of documentation in .pod format that +# is embedded in the perl installation tree. +# +#~~~~~~ +# +# See ChangeLog in CPAN dist for Pod::Perldoc for later notes. +# +# Version 3.01: Sun Nov 10 21:38:09 MST 2002 +# Sean M. Burke <sburke@cpan.org> +# Massive refactoring and code-tidying. +# Now it's a module(-family)! +# Formatter-specific stuff pulled out into Pod::Perldoc::To(Whatever).pm +# Added -T, -d, -o, -M, -w. +# Added some improved MSWin funk. +# +#~~~~~~ +# +# Version 2.05: Sat Oct 12 16:09:00 CEST 2002 +# Hugo van der Sanden <hv@crypt.org> +# Made -U the default, based on patch from Simon Cozens +# Version 2.04: Sun Aug 18 13:27:12 BST 2002 +# Randy W. Sims <RandyS@ThePierianSpring.org> +# allow -n to enable nroff under Win32 +# Version 2.03: Sun Apr 23 16:56:34 BST 2000 +# Hugo van der Sanden <hv@crypt.org> +# don't die when 'use blib' fails +# Version 2.02: Mon Mar 13 18:03:04 MST 2000 +# Tom Christiansen <tchrist@perl.com> +# Added -U insecurity option +# Version 2.01: Sat Mar 11 15:22:33 MST 2000 +# Tom Christiansen <tchrist@perl.com>, querulously. +# Security and correctness patches. +# What a twisted bit of distasteful spaghetti code. +# Version 2.0: ???? +# +#~~~~~~ +# +# Version 1.15: Tue Aug 24 01:50:20 EST 1999 +# Charles Wilson <cwilson@ece.gatech.edu> +# changed /pod/ directory to /pods/ for cygwin +# to support cygwin/win32 +# Version 1.14: Wed Jul 15 01:50:20 EST 1998 +# Robin Barker <rmb1@cise.npl.co.uk> +# -strict, -w cleanups +# Version 1.13: Fri Feb 27 16:20:50 EST 1997 +# Gurusamy Sarathy <gsar@activestate.com> +# -doc tweaks for -F and -X options +# Version 1.12: Sat Apr 12 22:41:09 EST 1997 +# Gurusamy Sarathy <gsar@activestate.com> +# -various fixes for win32 +# Version 1.11: Tue Dec 26 09:54:33 EST 1995 +# Kenneth Albanowski <kjahds@kjahds.com> +# -added Charles Bailey's further VMS patches, and -u switch +# -added -t switch, with pod2text support +# +# Version 1.10: Thu Nov 9 07:23:47 EST 1995 +# Kenneth Albanowski <kjahds@kjahds.com> +# -added VMS support +# -added better error recognition (on no found pages, just exit. On +# missing nroff/pod2man, just display raw pod.) +# -added recursive/case-insensitive matching (thanks, Andreas). This +# slows things down a bit, unfortunately. Give a precise name, and +# it'll run faster. +# +# Version 1.01: Tue May 30 14:47:34 EDT 1995 +# Andy Dougherty <doughera@lafcol.lafayette.edu> +# -added pod documentation. +# -added PATH searching. +# -added searching pod/ subdirectory (mainly to pick up perlfunc.pod +# and friends. +# +#~~~~~~~ +# +# TODO: +# +# Cache the directories read during sloppy match +# (To disk, or just in-memory?) +# +# Backport this to perl 5.005? +# +# Implement at least part of the "perlman" interface described +# in Programming Perl 3e? diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/BaseTo.pm b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/BaseTo.pm new file mode 100644 index 00000000000..6ca2a8c7e54 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/BaseTo.pm @@ -0,0 +1,28 @@ + +require 5; +package Pod::Perldoc::BaseTo; +use strict; +use warnings; + +sub is_pageable { '' } +sub write_with_binmode { 1 } + +sub output_extension { 'txt' } # override in subclass! + +# sub new { my $self = shift; ... } +# sub parse_from_file( my($class, $in, $out) = ...; ... } + +#sub new { return bless {}, ref($_[0]) || $_[0] } + +sub _perldoc_elem { + my($self, $name) = splice @_,0,2; + if(@_) { + $self->{$name} = $_[0]; + } else { + $self->{$name}; + } +} + + +1; + diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/GetOptsOO.pm b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/GetOptsOO.pm new file mode 100644 index 00000000000..b29aeb10906 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/GetOptsOO.pm @@ -0,0 +1,106 @@ + +require 5; +package Pod::Perldoc::GetOptsOO; +use strict; + +# Rather like Getopt::Std's getopts +# Call Pod::Perldoc::GetOptsOO::getopts($object, \@ARGV, $truth) +# Given -n, if there's a opt_n_with, it'll call $object->opt_n_with( ARGUMENT ) +# (e.g., "-n foo" => $object->opt_n_with('foo'). Ditto "-nfoo") +# Otherwise (given -n) if there's an opt_n, we'll call it $object->opt_n($truth) +# (Truth defaults to 1) +# Otherwise we try calling $object->handle_unknown_option('n') +# (and we increment the error count by the return value of it) +# If there's no handle_unknown_option, then we just warn, and then increment +# the error counter +# +# The return value of Pod::Perldoc::GetOptsOO::getopts is true if no errors, +# otherwise it's false. +# +## sburke@cpan.org 2002-10-31 + +BEGIN { # Make a DEBUG constant ASAP + *DEBUG = defined( &Pod::Perldoc::DEBUG ) + ? \&Pod::Perldoc::DEBUG + : sub(){10}; +} + + +sub getopts { + my($target, $args, $truth) = @_; + + $args ||= \@ARGV; + + $target->aside( + "Starting switch processing. Scanning arguments [@$args]\n" + ) if $target->can('aside'); + + return unless @$args; + + $truth = 1 unless @_ > 2; + + DEBUG > 3 and print " Truth is $truth\n"; + + + my $error_count = 0; + + while( @$args and ($_ = $args->[0]) =~ m/^-(.)(.*)/s ) { + my($first,$rest) = ($1,$2); + if ($_ eq '--') { # early exit if "--" + shift @$args; + last; + } + my $method = "opt_${first}_with"; + if( $target->can($method) ) { # it's argumental + if($rest eq '') { # like -f bar + shift @$args; + warn "Option $first needs a following argument!\n" unless @$args; + $rest = shift @$args; + } else { # like -fbar (== -f bar) + shift @$args; + } + + DEBUG > 3 and print " $method => $rest\n"; + $target->$method( $rest ); + + # Otherwise, it's not argumental... + } else { + + if( $target->can( $method = "opt_$first" ) ) { + DEBUG > 3 and print " $method is true ($truth)\n"; + $target->$method( $truth ); + + # Otherwise it's an unknown option... + + } elsif( $target->can('handle_unknown_option') ) { + DEBUG > 3 + and print " calling handle_unknown_option('$first')\n"; + + $error_count += ( + $target->handle_unknown_option( $first ) || 0 + ); + + } else { + ++$error_count; + warn "Unknown option: $first\n"; + } + + if($rest eq '') { # like -f + shift @$args + } else { # like -fbar (== -f -bar ) + DEBUG > 2 and print " Setting args->[0] to \"-$rest\"\n"; + $args->[0] = "-$rest"; + } + } + } + + + $target->aside( + "Ending switch processing. Args are [@$args] with $error_count errors.\n" + ) if $target->can('aside'); + + $error_count == 0; +} + +1; + diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToChecker.pm b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToChecker.pm new file mode 100644 index 00000000000..c60290d6502 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToChecker.pm @@ -0,0 +1,72 @@ + +require 5; +package Pod::Perldoc::ToChecker; +use strict; +use warnings; +use vars qw(@ISA); + +# Pick our superclass... +# +eval 'require Pod::Simple::Checker'; +if($@) { + require Pod::Checker; + @ISA = ('Pod::Checker'); +} else { + @ISA = ('Pod::Simple::Checker'); +} + +sub is_pageable { 1 } +sub write_with_binmode { 0 } +sub output_extension { 'txt' } + +sub if_zero_length { + my( $self, $file, $tmp, $tmpfd ) = @_; + print "No Pod errors in $file\n"; +} + + +1; + +__END__ + +=head1 NAME + +Pod::Perldoc::ToChecker - let Perldoc check Pod for errors + +=head1 SYNOPSIS + + % perldoc -o checker SomeFile.pod + No Pod errors in SomeFile.pod + (or an error report) + +=head1 DESCRIPTION + +This is a "plug-in" class that allows Perldoc to use +Pod::Simple::Checker as a "formatter" class (or if that is +not available, then Pod::Checker), to check for errors in a given +Pod file. + +This is actually a Pod::Simple::Checker (or Pod::Checker) subclass, and +inherits all its options. + +=head1 SEE ALSO + +L<Pod::Simple::Checker>, L<Pod::Simple>, L<Pod::Checker>, L<Pod::Perldoc> + +=head1 COPYRIGHT AND DISCLAIMERS + +Copyright (c) 2002 Sean M. Burke. All rights reserved. + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +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. + +=head1 AUTHOR + +Sean M. Burke C<sburke@cpan.org> + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToMan.pm b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToMan.pm new file mode 100644 index 00000000000..43191222376 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToMan.pm @@ -0,0 +1,187 @@ + +require 5; +package Pod::Perldoc::ToMan; +use strict; +use warnings; + +# This class is unlike ToText.pm et al, because we're NOT paging thru +# the output in our particular format -- we make the output and +# then we run nroff (or whatever) on it, and then page thru the +# (plaintext) output of THAT! + +use base qw(Pod::Perldoc::BaseTo); +sub is_pageable { 1 } +sub write_with_binmode { 0 } +sub output_extension { 'txt' } + +sub __filter_nroff { shift->_perldoc_elem('__filter_nroff' , @_) } +sub __nroffer { shift->_perldoc_elem('__nroffer' , @_) } +sub __bindir { shift->_perldoc_elem('__bindir' , @_) } +sub __pod2man { shift->_perldoc_elem('__pod2man' , @_) } +sub __output_file { shift->_perldoc_elem('__output_file' , @_) } + +sub center { shift->_perldoc_elem('center' , @_) } +sub date { shift->_perldoc_elem('date' , @_) } +sub fixed { shift->_perldoc_elem('fixed' , @_) } +sub fixedbold { shift->_perldoc_elem('fixedbold' , @_) } +sub fixeditalic { shift->_perldoc_elem('fixeditalic' , @_) } +sub fixedbolditalic { shift->_perldoc_elem('fixedbolditalic', @_) } +sub quotes { shift->_perldoc_elem('quotes' , @_) } +sub release { shift->_perldoc_elem('release' , @_) } +sub section { shift->_perldoc_elem('section' , @_) } + +sub new { return bless {}, ref($_[0]) || $_[0] } + +use File::Spec::Functions qw(catfile); + +sub parse_from_file { + my $self = shift; + my($file, $outfh) = @_; + + my $render = $self->{'__nroffer'} || die "no nroffer set!?"; + + # turn the switches into CLIs + my $switches = join ' ', + map qq{"--$_=$self->{$_}"}, + grep !m/^_/s, + keys %$self + ; + + my $pod2man = + catfile( + ($self->{'__bindir'} || die "no bindir set?!" ), + ($self->{'__pod2man'} || die "no pod2man set?!" ), + ) + ; + unless(-e $pod2man) { + # This is rarely needed, I think. + $pod2man = $self->{'__pod2man'} || die "no pod2man set?!"; + die "Can't find a pod2man?! (". $self->{'__pod2man'} .")\nAborting" + unless -e $pod2man; + } + + my $command = "$pod2man $switches --lax $file | $render -man"; + # no temp file, just a pipe! + + # Thanks to Brendan O'Dea for contributing the following block + if(Pod::Perldoc::IS_Linux and -t STDOUT + and my ($cols) = `stty -a` =~ m/\bcolumns\s+(\d+)/ + ) { + my $c = $cols * 39 / 40; + $cols = $c > $cols - 2 ? $c : $cols -2; + $command .= ' -rLL=' . (int $c) . 'n' if $cols > 80; + } + + if(Pod::Perldoc::IS_Cygwin) { + $command .= ' -c'; + } + + # I hear persistent reports that adding a -c switch to $render + # solves many people's problems. But I also hear that some mans + # don't have a -c switch, so that unconditionally adding it here + # would presumably be a Bad Thing -- sburke@cpan.org + + $command .= " | col -x" if Pod::Perldoc::IS_HPUX; + + defined(&Pod::Perldoc::DEBUG) + and Pod::Perldoc::DEBUG() + and print "About to run $command\n"; + ; + + my $rslt = `$command`; + + my $err; + + if( $self->{'__filter_nroff'} ) { + defined(&Pod::Perldoc::DEBUG) + and &Pod::Perldoc::DEBUG() + and print "filter_nroff is set, so filtering...\n"; + $rslt = $self->___Do_filter_nroff($rslt); + } else { + defined(&Pod::Perldoc::DEBUG) + and Pod::Perldoc::DEBUG() + and print "filter_nroff isn't set, so not filtering.\n"; + } + + if (($err = $?)) { + defined(&Pod::Perldoc::DEBUG) + and Pod::Perldoc::DEBUG() + and print "Nonzero exit ($?) while running $command.\n", + "Falling back to Pod::Perldoc::ToPod\n ", + ; + # A desperate fallthru: + require Pod::Perldoc::ToPod; + return Pod::Perldoc::ToPod->new->parse_from_file(@_); + + } else { + print $outfh $rslt + or die "Can't print to $$self{__output_file}: $!"; + } + + return; +} + + +sub ___Do_filter_nroff { + my $self = shift; + my @data = split /\n{2,}/, shift; + + shift @data while @data and $data[0] !~ /\S/; # Go to header + shift @data if @data and $data[0] =~ /Contributed\s+Perl/; # Skip header + pop @data if @data and $data[-1] =~ /^\w/; # Skip footer, like + # 28/Jan/99 perl 5.005, patch 53 1 + join "\n\n", @data; +} + +1; + +__END__ + +=head1 NAME + +Pod::Perldoc::ToMan - let Perldoc render Pod as man pages + +=head1 SYNOPSIS + + perldoc -o man Some::Modulename + +=head1 DESCRIPTION + +This is a "plug-in" class that allows Perldoc to use +Pod::Man and C<nroff> for reading Pod pages. + +The following options are supported: center, date, fixed, fixedbold, +fixeditalic, fixedbolditalic, quotes, release, section + +(Those options are explained in L<Pod::Man>.) + +For example: + + perldoc -o man -w center:Pod Some::Modulename + +=head1 CAVEAT + +This module may change to use a different pod-to-nroff formatter class +in the future, and this may change what options are supported. + +=head1 SEE ALSO + +L<Pod::Man>, L<Pod::Perldoc>, L<Pod::Perldoc::ToNroff> + +=head1 COPYRIGHT AND DISCLAIMERS + +Copyright (c) 2002,3,4 Sean M. Burke. All rights reserved. + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +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. + +=head1 AUTHOR + +Sean M. Burke C<sburke@cpan.org> + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToNroff.pm b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToNroff.pm new file mode 100644 index 00000000000..d0568605068 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToNroff.pm @@ -0,0 +1,100 @@ + +require 5; +package Pod::Perldoc::ToNroff; +use strict; +use warnings; + +# This is unlike ToMan.pm in that it emits the raw nroff source! + +use base qw(Pod::Perldoc::BaseTo); + +sub is_pageable { 1 } # well, if you ask for it... +sub write_with_binmode { 0 } +sub output_extension { 'man' } + +use Pod::Man (); + +sub center { shift->_perldoc_elem('center' , @_) } +sub date { shift->_perldoc_elem('date' , @_) } +sub fixed { shift->_perldoc_elem('fixed' , @_) } +sub fixedbold { shift->_perldoc_elem('fixedbold' , @_) } +sub fixeditalic { shift->_perldoc_elem('fixeditalic' , @_) } +sub fixedbolditalic { shift->_perldoc_elem('fixedbolditalic', @_) } +sub quotes { shift->_perldoc_elem('quotes' , @_) } +sub release { shift->_perldoc_elem('release' , @_) } +sub section { shift->_perldoc_elem('section' , @_) } + +sub new { return bless {}, ref($_[0]) || $_[0] } + +sub parse_from_file { + my $self = shift; + my $file = $_[0]; + + my @options = + map {; $_, $self->{$_} } + grep !m/^_/s, + keys %$self + ; + + defined(&Pod::Perldoc::DEBUG) + and Pod::Perldoc::DEBUG() + and print "About to call new Pod::Man ", + $Pod::Man::VERSION ? "(v$Pod::Man::VERSION) " : '', + "with options: ", + @options ? "[@options]" : "(nil)", "\n"; + ; + + Pod::Man->new(@options)->parse_from_file(@_); +} + +1; +__END__ + +=head1 NAME + +Pod::Perldoc::ToNroff - let Perldoc convert Pod to nroff + +=head1 SYNOPSIS + + perldoc -o nroff -d something.3 Some::Modulename + +=head1 DESCRIPTION + +This is a "plug-in" class that allows Perldoc to use +Pod::Man as a formatter class. + +The following options are supported: center, date, fixed, fixedbold, +fixeditalic, fixedbolditalic, quotes, release, section + +Those options are explained in L<Pod::Man>. + +For example: + + perldoc -o nroff -w center:Pod -d something.3 Some::Modulename + +=head1 CAVEAT + +This module may change to use a different pod-to-nroff formatter class +in the future, and this may change what options are supported. + +=head1 SEE ALSO + +L<Pod::Man>, L<Pod::Perldoc>, L<Pod::Perldoc::ToMan> + +=head1 COPYRIGHT AND DISCLAIMERS + +Copyright (c) 2002 Sean M. Burke. All rights reserved. + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +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. + +=head1 AUTHOR + +Sean M. Burke C<sburke@cpan.org> + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToPod.pm b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToPod.pm new file mode 100644 index 00000000000..bccbfcadbd6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToPod.pm @@ -0,0 +1,90 @@ + +# This class is just a hack to act as a "formatter" for +# actually unformatted Pod. +# +# Note that this isn't the same as just passing thru whatever +# we're given -- we pass thru only the pod source, and suppress +# the Perl code (or whatever non-pod stuff is in the source file). + + +require 5; +package Pod::Perldoc::ToPod; +use strict; +use warnings; + +use base qw(Pod::Perldoc::BaseTo); +sub is_pageable { 1 } +sub write_with_binmode { 0 } +sub output_extension { 'pod' } + +sub new { return bless {}, ref($_[0]) || $_[0] } + +sub parse_from_file { + my( $self, $in, $outfh ) = @_; + + open(IN, "<", $in) or die "Can't read-open $in: $!\nAborting"; + + my $cut_mode = 1; + + # A hack for finding things between =foo and =cut, inclusive + local $_; + while (<IN>) { + if( m/^=(\w+)/s ) { + if($cut_mode = ($1 eq 'cut')) { + print $outfh "\n=cut\n\n"; + # Pass thru the =cut line with some harmless + # (and occasionally helpful) padding + } + } + next if $cut_mode; + print $outfh $_ or die "Can't print to $outfh: $!"; + } + + close IN or die "Can't close $in: $!"; + return; +} + +1; +__END__ + +=head1 NAME + +Pod::Perldoc::ToPod - let Perldoc render Pod as ... Pod! + +=head1 SYNOPSIS + + perldoc -opod Some::Modulename + +(That's currently the same as the following:) + + perldoc -u Some::Modulename + +=head1 DESCRIPTION + +This is a "plug-in" class that allows Perldoc to display Pod source as +itself! Pretty Zen, huh? + +Currently this class works by just filtering out the non-Pod stuff from +a given input file. + +=head1 SEE ALSO + +L<Pod::Perldoc> + +=head1 COPYRIGHT AND DISCLAIMERS + +Copyright (c) 2002 Sean M. Burke. All rights reserved. + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +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. + +=head1 AUTHOR + +Sean M. Burke C<sburke@cpan.org> + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToRtf.pm b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToRtf.pm new file mode 100644 index 00000000000..25e609e313a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToRtf.pm @@ -0,0 +1,85 @@ + +require 5; +package Pod::Perldoc::ToRtf; +use strict; +use warnings; +use vars qw($VERSION); + +use base qw( Pod::Simple::RTF ); + +$VERSION # so that ->VERSION is happy +# stop CPAN from seeing this + = +$Pod::Simple::RTF::VERSION; + + +sub is_pageable { 0 } +sub write_with_binmode { 0 } +sub output_extension { 'rtf' } + +sub page_for_perldoc { + my($self, $tempfile, $perldoc) = @_; + return unless $perldoc->IS_MSWin32; + + my $rtf_pager = $ENV{'RTFREADER'} || 'write.exe'; + + $perldoc->aside( "About to launch <\"$rtf_pager\" \"$tempfile\">\n" ); + + return 1 if system( qq{"$rtf_pager"}, qq{"$tempfile"} ) == 0; + return 0; +} + +1; +__END__ + +=head1 NAME + +Pod::Perldoc::ToRtf - let Perldoc render Pod as RTF + +=head1 SYNOPSIS + + perldoc -o rtf Some::Modulename + +=head1 DESCRIPTION + +This is a "plug-in" class that allows Perldoc to use +Pod::Simple::RTF as a formatter class. + +This is actually a Pod::Simple::RTF subclass, and inherits +all its options. + +You have to have Pod::Simple::RTF installed (from the Pod::Simple dist), +or this module won't work. + +If Perldoc is running under MSWin and uses this class as a formatter, +the output will be opened with F<write.exe> or whatever program is +specified in the environment variable C<RTFREADER>. For example, to +specify that RTF files should be opened the same as they are when you +double-click them, you would do C<set RTFREADER=start.exe> in your +F<autoexec.bat>. + +Handy tip: put C<set PERLDOC=-ortf> in your F<autoexec.bat> +and that will set this class as the default formatter to run when +you do C<perldoc whatever>. + +=head1 SEE ALSO + +L<Pod::Simple::RTF>, L<Pod::Simple>, L<Pod::Perldoc> + +=head1 COPYRIGHT AND DISCLAIMERS + +Copyright (c) 2002 Sean M. Burke. All rights reserved. + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +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. + +=head1 AUTHOR + +Sean M. Burke C<sburke@cpan.org> + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToText.pm b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToText.pm new file mode 100644 index 00000000000..2eb9e0644ac --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToText.pm @@ -0,0 +1,91 @@ + +require 5; +package Pod::Perldoc::ToText; +use strict; +use warnings; + +use base qw(Pod::Perldoc::BaseTo); + +sub is_pageable { 1 } +sub write_with_binmode { 0 } +sub output_extension { 'txt' } + +use Pod::Text (); + +sub alt { shift->_perldoc_elem('alt' , @_) } +sub indent { shift->_perldoc_elem('indent' , @_) } +sub loose { shift->_perldoc_elem('loose' , @_) } +sub quotes { shift->_perldoc_elem('quotes' , @_) } +sub sentence { shift->_perldoc_elem('sentence', @_) } +sub width { shift->_perldoc_elem('width' , @_) } + +sub new { return bless {}, ref($_[0]) || $_[0] } + +sub parse_from_file { + my $self = shift; + + my @options = + map {; $_, $self->{$_} } + grep !m/^_/s, + keys %$self + ; + + defined(&Pod::Perldoc::DEBUG) + and Pod::Perldoc::DEBUG() + and print "About to call new Pod::Text ", + $Pod::Text::VERSION ? "(v$Pod::Text::VERSION) " : '', + "with options: ", + @options ? "[@options]" : "(nil)", "\n"; + ; + + Pod::Text->new(@options)->parse_from_file(@_); +} + +1; + +=head1 NAME + +Pod::Perldoc::ToText - let Perldoc render Pod as plaintext + +=head1 SYNOPSIS + + perldoc -o text Some::Modulename + +=head1 DESCRIPTION + +This is a "plug-in" class that allows Perldoc to use +Pod::Text as a formatter class. + +It supports the following options, which are explained in +L<Pod::Text>: alt, indent, loose, quotes, sentence, width + +For example: + + perldoc -o text -w indent:5 Some::Modulename + +=head1 CAVEAT + +This module may change to use a different text formatter class in the +future, and this may change what options are supported. + +=head1 SEE ALSO + +L<Pod::Text>, L<Pod::Perldoc> + +=head1 COPYRIGHT AND DISCLAIMERS + +Copyright (c) 2002 Sean M. Burke. All rights reserved. + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +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. + +=head1 AUTHOR + +Sean M. Burke C<sburke@cpan.org> + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToTk.pm b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToTk.pm new file mode 100644 index 00000000000..39459629503 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToTk.pm @@ -0,0 +1,129 @@ + +require 5; +package Pod::Perldoc::ToTk; +use strict; +use warnings; + +use base qw(Pod::Perldoc::BaseTo); + +sub is_pageable { 1 } +sub write_with_binmode { 0 } +sub output_extension { 'txt' } # doesn't matter +sub if_zero_length { } # because it will be 0-length! +sub new { return bless {}, ref($_[0]) || $_[0] } + +# TODO: document these and their meanings... +sub tree { shift->_perldoc_elem('tree' , @_) } +sub tk_opt { shift->_perldoc_elem('tk_opt' , @_) } +sub forky { shift->_perldoc_elem('forky' , @_) } + +use Pod::Perldoc (); +use File::Spec::Functions qw(catfile); + +use Tk; +die join '', __PACKAGE__, " doesn't work nice with Tk.pm verison $Tk::VERSION" + if $Tk::VERSION eq '800.003'; + +BEGIN { eval { require Tk::FcyEntry; }; }; +use Tk::Pod; + +# The following was adapted from "tkpod" in the Tk-Pod dist. + +sub parse_from_file { + + my($self, $Input_File) = @_; + if($self->{'forky'}) { + return if fork; # i.e., parent process returns + } + + $Input_File =~ s{\\}{/}g + if Pod::Perldoc::IS_MSWin32 or Pod::Perldoc::IS_Dos + # and maybe OS/2 + ; + + my($tk_opt, $tree); + $tree = $self->{'tree' }; + $tk_opt = $self->{'tk_opt'}; + + #require Tk::ErrorDialog; + + # Add 'Tk' subdirectories to search path so, e.g., + # 'Scrolled' will find doc in 'Tk/Scrolled' + + if( $tk_opt ) { + push @INC, grep -d $_, map catfile($_,'Tk'), @INC; + } + + my $mw = MainWindow->new(); + #eval 'use blib "/home/e/eserte/src/perl/Tk-App";require Tk::App::Debug'; + $mw->withdraw; + + # CDE use Font Settings if available + my $ufont = $mw->optionGet('userFont','UserFont'); # fixed width + my $sfont = $mw->optionGet('systemFont','SystemFont'); # proportional + if (defined($ufont) and defined($sfont)) { + foreach ($ufont, $sfont) { s/:$//; }; + $mw->optionAdd('*Font', $sfont); + $mw->optionAdd('*Entry.Font', $ufont); + $mw->optionAdd('*Text.Font', $ufont); + } + + $mw->optionAdd('*Menu.tearOff', $Tk::platform ne 'MSWin32' ? 1 : 0); + + $mw->Pod( + '-file' => $Input_File, + (($Tk::Pod::VERSION >= 4) ? ('-tree' => $tree) : ()) + )->focusNext; + + # xxx dirty but it works. A simple $mw->destroy if $mw->children + # does not work because Tk::ErrorDialogs could be created. + # (they are withdrawn after Ok instead of destory'ed I guess) + + if ($mw->children) { + $mw->repeat(1000, sub { + # ErrorDialog is withdrawn not deleted :-( + foreach ($mw->children) { + return if "$_" =~ /^Tk::Pod/ # ->isa('Tk::Pod') + } + $mw->destroy; + }); + } else { + $mw->destroy; + } + #$mw->WidgetDump; + MainLoop(); + + exit if $self->{'forky'}; # we were the child! so exit now! + return; +} + +1; +__END__ + + +=head1 NAME + +Pod::Perldoc::ToTk - let Perldoc use Tk::Pod to render Pod + +=head1 SYNOPSIS + + perldoc -o tk Some::Modulename & + +=head1 DESCRIPTION + +This is a "plug-in" class that allows Perldoc to use +Tk::Pod as a formatter class. + +You have to have installed Tk::Pod first, or this class won't load. + +=head1 SEE ALSO + +L<Tk::Pod>, L<Pod::Perldoc> + +=head1 AUTHOR + +Sean M. Burke C<sburke@cpan.org>, with significant portions copied from +F<tkpod> in the Tk::Pod dist, by Nick Ing-Simmons, Slaven Rezic, et al. + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToXml.pm b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToXml.pm new file mode 100644 index 00000000000..dd0d15cc10b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Perldoc/ToXml.pm @@ -0,0 +1,63 @@ + +require 5; +package Pod::Perldoc::ToXml; +use strict; +use warnings; +use vars qw($VERSION); + +use base qw( Pod::Simple::XMLOutStream ); + +$VERSION # so that ->VERSION is happy +# stop CPAN from seeing this + = +$Pod::Simple::XMLOutStream::VERSION; + + +sub is_pageable { 0 } +sub write_with_binmode { 0 } +sub output_extension { 'xml' } + +1; +__END__ + +=head1 NAME + +Pod::Perldoc::ToXml - let Perldoc render Pod as XML + +=head1 SYNOPSIS + + perldoc -o xml -d out.xml Some::Modulename + +=head1 DESCRIPTION + +This is a "plug-in" class that allows Perldoc to use +Pod::Simple::XMLOutStream as a formatter class. + +This is actually a Pod::Simple::XMLOutStream subclass, and inherits +all its options. + +You have to have installed Pod::Simple::XMLOutStream (from the Pod::Simple +dist), or this class won't work. + + +=head1 SEE ALSO + +L<Pod::Simple::XMLOutStream>, L<Pod::Simple>, L<Pod::Perldoc> + +=head1 COPYRIGHT AND DISCLAIMERS + +Copyright (c) 2002 Sean M. Burke. All rights reserved. + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +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. + +=head1 AUTHOR + +Sean M. Burke C<sburke@cpan.org> + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Pod/PlainText.pm b/Master/tlpkg/tlperl.old/lib/Pod/PlainText.pm new file mode 100644 index 00000000000..3f5ce90d2ba --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/PlainText.pm @@ -0,0 +1,705 @@ +# Pod::PlainText -- Convert POD data to formatted ASCII text. +# $Id: Text.pm,v 2.1 1999/09/20 11:53:33 eagle Exp $ +# +# Copyright 1999-2000 by Russ Allbery <rra@stanford.edu> +# +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. +# +# This module is intended to be a replacement for Pod::Text, and attempts to +# match its output except for some specific circumstances where other +# decisions seemed to produce better output. It uses Pod::Parser and is +# designed to be very easy to subclass. + +############################################################################ +# Modules and declarations +############################################################################ + +package Pod::PlainText; + +require 5.005; + +use Carp qw(carp croak); +use Pod::Select (); + +use strict; +use vars qw(@ISA %ESCAPES $VERSION); + +# We inherit from Pod::Select instead of Pod::Parser so that we can be used +# by Pod::Usage. +@ISA = qw(Pod::Select); + +$VERSION = '2.02'; + + +############################################################################ +# Table of supported E<> escapes +############################################################################ + +# This table is taken near verbatim from Pod::PlainText in Pod::Parser, +# which got it near verbatim from the original Pod::Text. It is therefore +# credited to Tom Christiansen, and I'm glad I didn't have to write it. :) +%ESCAPES = ( + 'amp' => '&', # ampersand + 'lt' => '<', # left chevron, less-than + 'gt' => '>', # right chevron, greater-than + 'quot' => '"', # double quote + + "Aacute" => "\xC1", # capital A, acute accent + "aacute" => "\xE1", # small a, acute accent + "Acirc" => "\xC2", # capital A, circumflex accent + "acirc" => "\xE2", # small a, circumflex accent + "AElig" => "\xC6", # capital AE diphthong (ligature) + "aelig" => "\xE6", # small ae diphthong (ligature) + "Agrave" => "\xC0", # capital A, grave accent + "agrave" => "\xE0", # small a, grave accent + "Aring" => "\xC5", # capital A, ring + "aring" => "\xE5", # small a, ring + "Atilde" => "\xC3", # capital A, tilde + "atilde" => "\xE3", # small a, tilde + "Auml" => "\xC4", # capital A, dieresis or umlaut mark + "auml" => "\xE4", # small a, dieresis or umlaut mark + "Ccedil" => "\xC7", # capital C, cedilla + "ccedil" => "\xE7", # small c, cedilla + "Eacute" => "\xC9", # capital E, acute accent + "eacute" => "\xE9", # small e, acute accent + "Ecirc" => "\xCA", # capital E, circumflex accent + "ecirc" => "\xEA", # small e, circumflex accent + "Egrave" => "\xC8", # capital E, grave accent + "egrave" => "\xE8", # small e, grave accent + "ETH" => "\xD0", # capital Eth, Icelandic + "eth" => "\xF0", # small eth, Icelandic + "Euml" => "\xCB", # capital E, dieresis or umlaut mark + "euml" => "\xEB", # small e, dieresis or umlaut mark + "Iacute" => "\xCD", # capital I, acute accent + "iacute" => "\xED", # small i, acute accent + "Icirc" => "\xCE", # capital I, circumflex accent + "icirc" => "\xEE", # small i, circumflex accent + "Igrave" => "\xCD", # capital I, grave accent + "igrave" => "\xED", # small i, grave accent + "Iuml" => "\xCF", # capital I, dieresis or umlaut mark + "iuml" => "\xEF", # small i, dieresis or umlaut mark + "Ntilde" => "\xD1", # capital N, tilde + "ntilde" => "\xF1", # small n, tilde + "Oacute" => "\xD3", # capital O, acute accent + "oacute" => "\xF3", # small o, acute accent + "Ocirc" => "\xD4", # capital O, circumflex accent + "ocirc" => "\xF4", # small o, circumflex accent + "Ograve" => "\xD2", # capital O, grave accent + "ograve" => "\xF2", # small o, grave accent + "Oslash" => "\xD8", # capital O, slash + "oslash" => "\xF8", # small o, slash + "Otilde" => "\xD5", # capital O, tilde + "otilde" => "\xF5", # small o, tilde + "Ouml" => "\xD6", # capital O, dieresis or umlaut mark + "ouml" => "\xF6", # small o, dieresis or umlaut mark + "szlig" => "\xDF", # small sharp s, German (sz ligature) + "THORN" => "\xDE", # capital THORN, Icelandic + "thorn" => "\xFE", # small thorn, Icelandic + "Uacute" => "\xDA", # capital U, acute accent + "uacute" => "\xFA", # small u, acute accent + "Ucirc" => "\xDB", # capital U, circumflex accent + "ucirc" => "\xFB", # small u, circumflex accent + "Ugrave" => "\xD9", # capital U, grave accent + "ugrave" => "\xF9", # small u, grave accent + "Uuml" => "\xDC", # capital U, dieresis or umlaut mark + "uuml" => "\xFC", # small u, dieresis or umlaut mark + "Yacute" => "\xDD", # capital Y, acute accent + "yacute" => "\xFD", # small y, acute accent + "yuml" => "\xFF", # small y, dieresis or umlaut mark + + "lchevron" => "\xAB", # left chevron (double less than) + "rchevron" => "\xBB", # right chevron (double greater than) +); + + +############################################################################ +# Initialization +############################################################################ + +# Initialize the object. Must be sure to call our parent initializer. +sub initialize { + my $self = shift; + + $$self{alt} = 0 unless defined $$self{alt}; + $$self{indent} = 4 unless defined $$self{indent}; + $$self{loose} = 0 unless defined $$self{loose}; + $$self{sentence} = 0 unless defined $$self{sentence}; + $$self{width} = 76 unless defined $$self{width}; + + $$self{INDENTS} = []; # Stack of indentations. + $$self{MARGIN} = $$self{indent}; # Current left margin in spaces. + + $self->SUPER::initialize; +} + + +############################################################################ +# Core overrides +############################################################################ + +# Called for each command paragraph. Gets the command, the associated +# paragraph, the line number, and a Pod::Paragraph object. Just dispatches +# the command to a method named the same as the command. =cut is handled +# internally by Pod::Parser. +sub command { + my $self = shift; + my $command = shift; + return if $command eq 'pod'; + return if ($$self{EXCLUDE} && $command ne 'end'); + $self->item ("\n") if defined $$self{ITEM}; + $command = 'cmd_' . $command; + $self->$command (@_); +} + +# Called for a verbatim paragraph. Gets the paragraph, the line number, and +# a Pod::Paragraph object. Just output it verbatim, but with tabs converted +# to spaces. +sub verbatim { + my $self = shift; + return if $$self{EXCLUDE}; + $self->item if defined $$self{ITEM}; + local $_ = shift; + return if /^\s*$/; + s/^(\s*\S+)/(' ' x $$self{MARGIN}) . $1/gme; + $self->output ($_); +} + +# Called for a regular text block. Gets the paragraph, the line number, and +# a Pod::Paragraph object. Perform interpolation and output the results. +sub textblock { + my $self = shift; + return if $$self{EXCLUDE}; + $self->output ($_[0]), return if $$self{VERBATIM}; + local $_ = shift; + my $line = shift; + + # Perform a little magic to collapse multiple L<> references. This is + # here mostly for backwards-compatibility. We'll just rewrite the whole + # thing into actual text at this part, bypassing the whole internal + # sequence parsing thing. + s{ + ( + L< # A link of the form L</something>. + / + ( + [:\w]+ # The item has to be a simple word... + (\(\))? # ...or simple function. + ) + > + ( + ,?\s+(and\s+)? # Allow lots of them, conjuncted. + L< + / + ( + [:\w]+ + (\(\))? + ) + > + )+ + ) + } { + local $_ = $1; + s%L</([^>]+)>%$1%g; + my @items = split /(?:,?\s+(?:and\s+)?)/; + my $string = "the "; + my $i; + for ($i = 0; $i < @items; $i++) { + $string .= $items[$i]; + $string .= ", " if @items > 2 && $i != $#items; + $string .= " and " if ($i == $#items - 1); + } + $string .= " entries elsewhere in this document"; + $string; + }gex; + + # Now actually interpolate and output the paragraph. + $_ = $self->interpolate ($_, $line); + s/\s+$/\n/; + if (defined $$self{ITEM}) { + $self->item ($_ . "\n"); + } else { + $self->output ($self->reformat ($_ . "\n")); + } +} + +# Called for an interior sequence. Gets the command, argument, and a +# Pod::InteriorSequence object and is expected to return the resulting text. +# Calls code, bold, italic, file, and link to handle those types of +# sequences, and handles S<>, E<>, X<>, and Z<> directly. +sub interior_sequence { + my $self = shift; + my $command = shift; + local $_ = shift; + return '' if ($command eq 'X' || $command eq 'Z'); + + # Expand escapes into the actual character now, carping if invalid. + if ($command eq 'E') { + return $ESCAPES{$_} if defined $ESCAPES{$_}; + carp "Unknown escape: E<$_>"; + return "E<$_>"; + } + + # For all the other sequences, empty content produces no output. + return if $_ eq ''; + + # For S<>, compress all internal whitespace and then map spaces to \01. + # When we output the text, we'll map this back. + if ($command eq 'S') { + s/\s{2,}/ /g; + tr/ /\01/; + return $_; + } + + # Anything else needs to get dispatched to another method. + if ($command eq 'B') { return $self->seq_b ($_) } + elsif ($command eq 'C') { return $self->seq_c ($_) } + elsif ($command eq 'F') { return $self->seq_f ($_) } + elsif ($command eq 'I') { return $self->seq_i ($_) } + elsif ($command eq 'L') { return $self->seq_l ($_) } + else { carp "Unknown sequence $command<$_>" } +} + +# Called for each paragraph that's actually part of the POD. We take +# advantage of this opportunity to untabify the input. +sub preprocess_paragraph { + my $self = shift; + local $_ = shift; + 1 while s/^(.*?)(\t+)/$1 . ' ' x (length ($2) * 8 - length ($1) % 8)/me; + $_; +} + + +############################################################################ +# Command paragraphs +############################################################################ + +# All command paragraphs take the paragraph and the line number. + +# First level heading. +sub cmd_head1 { + my $self = shift; + local $_ = shift; + s/\s+$//; + $_ = $self->interpolate ($_, shift); + if ($$self{alt}) { + $self->output ("\n==== $_ ====\n\n"); + } else { + $_ .= "\n" if $$self{loose}; + $self->output ($_ . "\n"); + } +} + +# Second level heading. +sub cmd_head2 { + my $self = shift; + local $_ = shift; + s/\s+$//; + $_ = $self->interpolate ($_, shift); + if ($$self{alt}) { + $self->output ("\n== $_ ==\n\n"); + } else { + $self->output (' ' x ($$self{indent} / 2) . $_ . "\n\n"); + } +} + +# Start a list. +sub cmd_over { + my $self = shift; + local $_ = shift; + unless (/^[-+]?\d+\s+$/) { $_ = $$self{indent} } + push (@{ $$self{INDENTS} }, $$self{MARGIN}); + $$self{MARGIN} += ($_ + 0); +} + +# End a list. +sub cmd_back { + my $self = shift; + $$self{MARGIN} = pop @{ $$self{INDENTS} }; + unless (defined $$self{MARGIN}) { + carp "Unmatched =back"; + $$self{MARGIN} = $$self{indent}; + } +} + +# An individual list item. +sub cmd_item { + my $self = shift; + if (defined $$self{ITEM}) { $self->item } + local $_ = shift; + s/\s+$//; + $$self{ITEM} = $self->interpolate ($_); +} + +# Begin a block for a particular translator. Setting VERBATIM triggers +# special handling in textblock(). +sub cmd_begin { + my $self = shift; + local $_ = shift; + my ($kind) = /^(\S+)/ or return; + if ($kind eq 'text') { + $$self{VERBATIM} = 1; + } else { + $$self{EXCLUDE} = 1; + } +} + +# End a block for a particular translator. We assume that all =begin/=end +# pairs are properly closed. +sub cmd_end { + my $self = shift; + $$self{EXCLUDE} = 0; + $$self{VERBATIM} = 0; +} + +# One paragraph for a particular translator. Ignore it unless it's intended +# for text, in which case we treat it as a verbatim text block. +sub cmd_for { + my $self = shift; + local $_ = shift; + my $line = shift; + return unless s/^text\b[ \t]*\n?//; + $self->verbatim ($_, $line); +} + + +############################################################################ +# Interior sequences +############################################################################ + +# The simple formatting ones. These are here mostly so that subclasses can +# override them and do more complicated things. +sub seq_b { return $_[0]{alt} ? "``$_[1]''" : $_[1] } +sub seq_c { return $_[0]{alt} ? "``$_[1]''" : "`$_[1]'" } +sub seq_f { return $_[0]{alt} ? "\"$_[1]\"" : $_[1] } +sub seq_i { return '*' . $_[1] . '*' } + +# The complicated one. Handle links. Since this is plain text, we can't +# actually make any real links, so this is all to figure out what text we +# print out. +sub seq_l { + my $self = shift; + local $_ = shift; + + # Smash whitespace in case we were split across multiple lines. + s/\s+/ /g; + + # If we were given any explicit text, just output it. + if (/^([^|]+)\|/) { return $1 } + + # Okay, leading and trailing whitespace isn't important; get rid of it. + s/^\s+//; + s/\s+$//; + + # Default to using the whole content of the link entry as a section + # name. Note that L<manpage/> forces a manpage interpretation, as does + # something looking like L<manpage(section)>. The latter is an + # enhancement over the original Pod::Text. + my ($manpage, $section) = ('', $_); + if (/^(?:https?|ftp|news):/) { + # a URL + return $_; + } elsif (/^"\s*(.*?)\s*"$/) { + $section = '"' . $1 . '"'; + } elsif (m/^[-:.\w]+(?:\(\S+\))?$/) { + ($manpage, $section) = ($_, ''); + } elsif (m%/%) { + ($manpage, $section) = split (/\s*\/\s*/, $_, 2); + } + + my $text = ''; + # Now build the actual output text. + if (!length $section) { + $text = "the $manpage manpage" if length $manpage; + } elsif ($section =~ /^[:\w]+(?:\(\))?/) { + $text .= 'the ' . $section . ' entry'; + $text .= (length $manpage) ? " in the $manpage manpage" + : " elsewhere in this document"; + } else { + $section =~ s/^\"\s*//; + $section =~ s/\s*\"$//; + $text .= 'the section on "' . $section . '"'; + $text .= " in the $manpage manpage" if length $manpage; + } + $text; +} + + +############################################################################ +# List handling +############################################################################ + +# This method is called whenever an =item command is complete (in other +# words, we've seen its associated paragraph or know for certain that it +# doesn't have one). It gets the paragraph associated with the item as an +# argument. If that argument is empty, just output the item tag; if it +# contains a newline, output the item tag followed by the newline. +# Otherwise, see if there's enough room for us to output the item tag in the +# margin of the text or if we have to put it on a separate line. +sub item { + my $self = shift; + local $_ = shift; + my $tag = $$self{ITEM}; + unless (defined $tag) { + carp "item called without tag"; + return; + } + undef $$self{ITEM}; + my $indent = $$self{INDENTS}[-1]; + unless (defined $indent) { $indent = $$self{indent} } + my $space = ' ' x $indent; + $space =~ s/^ /:/ if $$self{alt}; + if (!$_ || /^\s+$/ || ($$self{MARGIN} - $indent < length ($tag) + 1)) { + my $margin = $$self{MARGIN}; + $$self{MARGIN} = $indent; + my $output = $self->reformat ($tag); + $output =~ s/\n*$/\n/; + $self->output ($output); + $$self{MARGIN} = $margin; + $self->output ($self->reformat ($_)) if /\S/; + } else { + $_ = $self->reformat ($_); + s/^ /:/ if ($$self{alt} && $indent > 0); + my $tagspace = ' ' x length $tag; + s/^($space)$tagspace/$1$tag/ or warn "Bizarre space in item"; + $self->output ($_); + } +} + + +############################################################################ +# Output formatting +############################################################################ + +# Wrap a line, indenting by the current left margin. We can't use +# Text::Wrap because it plays games with tabs. We can't use formline, even +# though we'd really like to, because it screws up non-printing characters. +# So we have to do the wrapping ourselves. +sub wrap { + my $self = shift; + local $_ = shift; + my $output = ''; + my $spaces = ' ' x $$self{MARGIN}; + my $width = $$self{width} - $$self{MARGIN}; + while (length > $width) { + if (s/^([^\n]{0,$width})\s+// || s/^([^\n]{$width})//) { + $output .= $spaces . $1 . "\n"; + } else { + last; + } + } + $output .= $spaces . $_; + $output =~ s/\s+$/\n\n/; + $output; +} + +# Reformat a paragraph of text for the current margin. Takes the text to +# reformat and returns the formatted text. +sub reformat { + my $self = shift; + local $_ = shift; + + # If we're trying to preserve two spaces after sentences, do some + # munging to support that. Otherwise, smash all repeated whitespace. + if ($$self{sentence}) { + s/ +$//mg; + s/\.\n/. \n/g; + s/\n/ /g; + s/ +/ /g; + } else { + s/\s+/ /g; + } + $self->wrap ($_); +} + +# Output text to the output device. +sub output { $_[1] =~ tr/\01/ /; print { $_[0]->output_handle } $_[1] } + + +############################################################################ +# Backwards compatibility +############################################################################ + +# The old Pod::Text module did everything in a pod2text() function. This +# tries to provide the same interface for legacy applications. +sub pod2text { + my @args; + + # This is really ugly; I hate doing option parsing in the middle of a + # module. But the old Pod::Text module supported passing flags to its + # entry function, so handle -a and -<number>. + while ($_[0] =~ /^-/) { + my $flag = shift; + if ($flag eq '-a') { push (@args, alt => 1) } + elsif ($flag =~ /^-(\d+)$/) { push (@args, width => $1) } + else { + unshift (@_, $flag); + last; + } + } + + # Now that we know what arguments we're using, create the parser. + my $parser = Pod::PlainText->new (@args); + + # If two arguments were given, the second argument is going to be a file + # handle. That means we want to call parse_from_filehandle(), which + # means we need to turn the first argument into a file handle. Magic + # open will handle the <&STDIN case automagically. + if (defined $_[1]) { + local *IN; + unless (open (IN, $_[0])) { + croak ("Can't open $_[0] for reading: $!\n"); + return; + } + $_[0] = \*IN; + return $parser->parse_from_filehandle (@_); + } else { + return $parser->parse_from_file (@_); + } +} + + +############################################################################ +# Module return value and documentation +############################################################################ + +1; +__END__ + +=head1 NAME + +Pod::PlainText - Convert POD data to formatted ASCII text + +=head1 SYNOPSIS + + use Pod::PlainText; + my $parser = Pod::PlainText->new (sentence => 0, width => 78); + + # Read POD from STDIN and write to STDOUT. + $parser->parse_from_filehandle; + + # Read POD from file.pod and write to file.txt. + $parser->parse_from_file ('file.pod', 'file.txt'); + +=head1 DESCRIPTION + +Pod::PlainText is a module that can convert documentation in the POD format (the +preferred language for documenting Perl) into formatted ASCII. It uses no +special formatting controls or codes whatsoever, and its output is therefore +suitable for nearly any device. + +As a derived class from Pod::Parser, Pod::PlainText supports the same methods and +interfaces. See L<Pod::Parser> for all the details; briefly, one creates a +new parser with C<Pod::PlainText-E<gt>new()> and then calls either +parse_from_filehandle() or parse_from_file(). + +new() can take options, in the form of key/value pairs, that control the +behavior of the parser. The currently recognized options are: + +=over 4 + +=item alt + +If set to a true value, selects an alternate output format that, among other +things, uses a different heading style and marks C<=item> entries with a +colon in the left margin. Defaults to false. + +=item indent + +The number of spaces to indent regular text, and the default indentation for +C<=over> blocks. Defaults to 4. + +=item loose + +If set to a true value, a blank line is printed after a C<=head1> heading. +If set to false (the default), no blank line is printed after C<=head1>, +although one is still printed after C<=head2>. This is the default because +it's the expected formatting for manual pages; if you're formatting +arbitrary text documents, setting this to true may result in more pleasing +output. + +=item sentence + +If set to a true value, Pod::PlainText will assume that each sentence ends in two +spaces, and will try to preserve that spacing. If set to false, all +consecutive whitespace in non-verbatim paragraphs is compressed into a +single space. Defaults to true. + +=item width + +The column at which to wrap text on the right-hand side. Defaults to 76. + +=back + +The standard Pod::Parser method parse_from_filehandle() takes up to two +arguments, the first being the file handle to read POD from and the second +being the file handle to write the formatted output to. The first defaults +to STDIN if not given, and the second defaults to STDOUT. The method +parse_from_file() is almost identical, except that its two arguments are the +input and output disk files instead. See L<Pod::Parser> for the specific +details. + +=head1 DIAGNOSTICS + +=over 4 + +=item Bizarre space in item + +(W) Something has gone wrong in internal C<=item> processing. This message +indicates a bug in Pod::PlainText; you should never see it. + +=item Can't open %s for reading: %s + +(F) Pod::PlainText was invoked via the compatibility mode pod2text() interface +and the input file it was given could not be opened. + +=item Unknown escape: %s + +(W) The POD source contained an C<EE<lt>E<gt>> escape that Pod::PlainText didn't +know about. + +=item Unknown sequence: %s + +(W) The POD source contained a non-standard internal sequence (something of +the form C<XE<lt>E<gt>>) that Pod::PlainText didn't know about. + +=item Unmatched =back + +(W) Pod::PlainText encountered a C<=back> command that didn't correspond to an +C<=over> command. + +=back + +=head1 RESTRICTIONS + +Embedded Ctrl-As (octal 001) in the input will be mapped to spaces on +output, due to an internal implementation detail. + +=head1 NOTES + +This is a replacement for an earlier Pod::Text module written by Tom +Christiansen. It has a revamped interface, since it now uses Pod::Parser, +but an interface roughly compatible with the old Pod::Text::pod2text() +function is still available. Please change to the new calling convention, +though. + +The original Pod::Text contained code to do formatting via termcap +sequences, although it wasn't turned on by default and it was problematic to +get it to work at all. This rewrite doesn't even try to do that, but a +subclass of it does. Look for L<Pod::Text::Termcap|Pod::Text::Termcap>. + +=head1 SEE ALSO + +L<Pod::Parser|Pod::Parser>, L<Pod::Text::Termcap|Pod::Text::Termcap>, +pod2text(1) + +=head1 AUTHOR + +Please report bugs using L<http://rt.cpan.org>. + +Russ Allbery E<lt>rra@stanford.eduE<gt>, based I<very> heavily on the +original Pod::Text by Tom Christiansen E<lt>tchrist@mox.perl.comE<gt> and +its conversion to Pod::Parser by Brad Appleton +E<lt>bradapp@enteract.comE<gt>. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Plainer.pm b/Master/tlpkg/tlperl.old/lib/Pod/Plainer.pm new file mode 100644 index 00000000000..373e8d090af --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Plainer.pm @@ -0,0 +1,69 @@ +package Pod::Plainer; +use strict; +use Pod::Parser; +our @ISA = qw(Pod::Parser); +our $VERSION = '0.01'; + +our %E = qw( < lt > gt ); + +sub escape_ltgt { + (undef, my $text) = @_; + $text =~ s/([<>])/E<$E{$1}>/g; + $text +} + +sub simple_delimiters { + (undef, my $seq) = @_; + $seq -> left_delimiter( '<' ); + $seq -> right_delimiter( '>' ); + $seq; +} + +sub textblock { + my($parser,$text,$line) = @_; + print {$parser->output_handle()} + $parser->parse_text( + { -expand_text => q(escape_ltgt), + -expand_seq => q(simple_delimiters) }, + $text, $line ) -> raw_text(); +} + +1; + +__END__ + +=head1 NAME + +Pod::Plainer - Perl extension for converting Pod to old style Pod. + +=head1 SYNOPSIS + + use Pod::Plainer; + + my $parser = Pod::Plainer -> new (); + $parser -> parse_from_filehandle(\*STDIN); + +=head1 DESCRIPTION + +Pod::Plainer uses Pod::Parser which takes Pod with the (new) +'CE<lt>E<lt> .. E<gt>E<gt>' constructs +and returns the old(er) style with just 'CE<lt>E<gt>'; +'<' and '>' are replaced by 'EE<lt>ltE<gt>' and 'EE<lt>gtE<gt>'. + +This can be used to pre-process Pod before using tools which do not +recognise the new style Pods. + +=head2 EXPORT + +None by default. + +=head1 AUTHOR + +Robin Barker, rmb1@cise.npl.co.uk + +=head1 SEE ALSO + +See L<Pod::Parser>. + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Select.pm b/Master/tlpkg/tlperl.old/lib/Pod/Select.pm new file mode 100644 index 00000000000..1cc14dff4b6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Select.pm @@ -0,0 +1,754 @@ +############################################################################# +# Pod/Select.pm -- function to select portions of POD docs +# +# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved. +# This file is part of "PodParser". PodParser is free software; +# you can redistribute it and/or modify it under the same terms +# as Perl itself. +############################################################################# + +package Pod::Select; + +use vars qw($VERSION); +$VERSION = 1.30; ## Current version of this package +require 5.005; ## requires this Perl version or later + +############################################################################# + +=head1 NAME + +Pod::Select, podselect() - extract selected sections of POD from input + +=head1 SYNOPSIS + + use Pod::Select; + + ## Select all the POD sections for each file in @filelist + ## and print the result on standard output. + podselect(@filelist); + + ## Same as above, but write to tmp.out + podselect({-output => "tmp.out"}, @filelist): + + ## Select from the given filelist, only those POD sections that are + ## within a 1st level section named any of: NAME, SYNOPSIS, OPTIONS. + podselect({-sections => ["NAME|SYNOPSIS", "OPTIONS"]}, @filelist): + + ## Select the "DESCRIPTION" section of the PODs from STDIN and write + ## the result to STDERR. + podselect({-output => ">&STDERR", -sections => ["DESCRIPTION"]}, \*STDIN); + +or + + use Pod::Select; + + ## Create a parser object for selecting POD sections from the input + $parser = new Pod::Select(); + + ## Select all the POD sections for each file in @filelist + ## and print the result to tmp.out. + $parser->parse_from_file("<&STDIN", "tmp.out"); + + ## Select from the given filelist, only those POD sections that are + ## within a 1st level section named any of: NAME, SYNOPSIS, OPTIONS. + $parser->select("NAME|SYNOPSIS", "OPTIONS"); + for (@filelist) { $parser->parse_from_file($_); } + + ## Select the "DESCRIPTION" and "SEE ALSO" sections of the PODs from + ## STDIN and write the result to STDERR. + $parser->select("DESCRIPTION"); + $parser->add_selection("SEE ALSO"); + $parser->parse_from_filehandle(\*STDIN, \*STDERR); + +=head1 REQUIRES + +perl5.005, Pod::Parser, Exporter, Carp + +=head1 EXPORTS + +podselect() + +=head1 DESCRIPTION + +B<podselect()> is a function which will extract specified sections of +pod documentation from an input stream. This ability is provided by the +B<Pod::Select> module which is a subclass of B<Pod::Parser>. +B<Pod::Select> provides a method named B<select()> to specify the set of +POD sections to select for processing/printing. B<podselect()> merely +creates a B<Pod::Select> object and then invokes the B<podselect()> +followed by B<parse_from_file()>. + +=head1 SECTION SPECIFICATIONS + +B<podselect()> and B<Pod::Select::select()> may be given one or more +"section specifications" to restrict the text processed to only the +desired set of sections and their corresponding subsections. A section +specification is a string containing one or more Perl-style regular +expressions separated by forward slashes ("/"). If you need to use a +forward slash literally within a section title you can escape it with a +backslash ("\/"). + +The formal syntax of a section specification is: + +=over 4 + +=item * + +I<head1-title-regex>/I<head2-title-regex>/... + +=back + +Any omitted or empty regular expressions will default to ".*". +Please note that each regular expression given is implicitly +anchored by adding "^" and "$" to the beginning and end. Also, if a +given regular expression starts with a "!" character, then the +expression is I<negated> (so C<!foo> would match anything I<except> +C<foo>). + +Some example section specifications follow. + +=over 4 + +=item * + +Match the C<NAME> and C<SYNOPSIS> sections and all of their subsections: + +C<NAME|SYNOPSIS> + +=item * + +Match only the C<Question> and C<Answer> subsections of the C<DESCRIPTION> +section: + +C<DESCRIPTION/Question|Answer> + +=item * + +Match the C<Comments> subsection of I<all> sections: + +C</Comments> + +=item * + +Match all subsections of C<DESCRIPTION> I<except> for C<Comments>: + +C<DESCRIPTION/!Comments> + +=item * + +Match the C<DESCRIPTION> section but do I<not> match any of its subsections: + +C<DESCRIPTION/!.+> + +=item * + +Match all top level sections but none of their subsections: + +C</!.+> + +=back + +=begin _NOT_IMPLEMENTED_ + +=head1 RANGE SPECIFICATIONS + +B<podselect()> and B<Pod::Select::select()> may be given one or more +"range specifications" to restrict the text processed to only the +desired ranges of paragraphs in the desired set of sections. A range +specification is a string containing a single Perl-style regular +expression (a regex), or else two Perl-style regular expressions +(regexs) separated by a ".." (Perl's "range" operator is ".."). +The regexs in a range specification are delimited by forward slashes +("/"). If you need to use a forward slash literally within a regex you +can escape it with a backslash ("\/"). + +The formal syntax of a range specification is: + +=over 4 + +=item * + +/I<start-range-regex>/[../I<end-range-regex>/] + +=back + +Where each the item inside square brackets (the ".." followed by the +end-range-regex) is optional. Each "range-regex" is of the form: + + =cmd-expr text-expr + +Where I<cmd-expr> is intended to match the name of one or more POD +commands, and I<text-expr> is intended to match the paragraph text for +the command. If a range-regex is supposed to match a POD command, then +the first character of the regex (the one after the initial '/') +absolutely I<must> be a single '=' character; it may not be anything +else (not even a regex meta-character) if it is supposed to match +against the name of a POD command. + +If no I<=cmd-expr> is given then the text-expr will be matched against +plain textblocks unless it is preceded by a space, in which case it is +matched against verbatim text-blocks. If no I<text-expr> is given then +only the command-portion of the paragraph is matched against. + +Note that these two expressions are each implicitly anchored. This +means that when matching against the command-name, there will be an +implicit '^' and '$' around the given I<=cmd-expr>; and when matching +against the paragraph text there will be an implicit '\A' and '\Z' +around the given I<text-expr>. + +Unlike with section-specs, the '!' character does I<not> have any special +meaning (negation or otherwise) at the beginning of a range-spec! + +Some example range specifications follow. + +=over 4 + +=item +Match all C<=for html> paragraphs: + +C</=for html/> + +=item +Match all paragraphs between C<=begin html> and C<=end html> +(note that this will I<not> work correctly if such sections +are nested): + +C</=begin html/../=end html/> + +=item +Match all paragraphs between the given C<=item> name until the end of the +current section: + +C</=item mine/../=head\d/> + +=item +Match all paragraphs between the given C<=item> until the next item, or +until the end of the itemized list (note that this will I<not> work as +desired if the item contains an itemized list nested within it): + +C</=item mine/../=(item|back)/> + +=back + +=end _NOT_IMPLEMENTED_ + +=cut + +############################################################################# + +use strict; +#use diagnostics; +use Carp; +use Pod::Parser 1.04; +use vars qw(@ISA @EXPORT $MAX_HEADING_LEVEL); + +@ISA = qw(Pod::Parser); +@EXPORT = qw(&podselect); + +## Maximum number of heading levels supported for '=headN' directives +*MAX_HEADING_LEVEL = \3; + +############################################################################# + +=head1 OBJECT METHODS + +The following methods are provided in this module. Each one takes a +reference to the object itself as an implicit first parameter. + +=cut + +##--------------------------------------------------------------------------- + +## =begin _PRIVATE_ +## +## =head1 B<_init_headings()> +## +## Initialize the current set of active section headings. +## +## =cut +## +## =end _PRIVATE_ + +use vars qw(%myData @section_headings); + +sub _init_headings { + my $self = shift; + local *myData = $self; + + ## Initialize current section heading titles if necessary + unless (defined $myData{_SECTION_HEADINGS}) { + local *section_headings = $myData{_SECTION_HEADINGS} = []; + for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) { + $section_headings[$i] = ''; + } + } +} + +##--------------------------------------------------------------------------- + +=head1 B<curr_headings()> + + ($head1, $head2, $head3, ...) = $parser->curr_headings(); + $head1 = $parser->curr_headings(1); + +This method returns a list of the currently active section headings and +subheadings in the document being parsed. The list of headings returned +corresponds to the most recently parsed paragraph of the input. + +If an argument is given, it must correspond to the desired section +heading number, in which case only the specified section heading is +returned. If there is no current section heading at the specified +level, then C<undef> is returned. + +=cut + +sub curr_headings { + my $self = shift; + $self->_init_headings() unless (defined $self->{_SECTION_HEADINGS}); + my @headings = @{ $self->{_SECTION_HEADINGS} }; + return (@_ > 0 and $_[0] =~ /^\d+$/) ? $headings[$_[0] - 1] : @headings; +} + +##--------------------------------------------------------------------------- + +=head1 B<select()> + + $parser->select($section_spec1,$section_spec2,...); + +This method is used to select the particular sections and subsections of +POD documentation that are to be printed and/or processed. The existing +set of selected sections is I<replaced> with the given set of sections. +See B<add_selection()> for adding to the current set of selected +sections. + +Each of the C<$section_spec> arguments should be a section specification +as described in L<"SECTION SPECIFICATIONS">. The section specifications +are parsed by this method and the resulting regular expressions are +stored in the invoking object. + +If no C<$section_spec> arguments are given, then the existing set of +selected sections is cleared out (which means C<all> sections will be +processed). + +This method should I<not> normally be overridden by subclasses. + +=cut + +use vars qw(@selected_sections); + +sub select { + my $self = shift; + my @sections = @_; + local *myData = $self; + local $_; + +### NEED TO DISCERN A SECTION-SPEC FROM A RANGE-SPEC (look for m{^/.+/$}?) + + ##--------------------------------------------------------------------- + ## The following is a blatant hack for backward compatibility, and for + ## implementing add_selection(). If the *first* *argument* is the + ## string "+", then the remaining section specifications are *added* + ## to the current set of selections; otherwise the given section + ## specifications will *replace* the current set of selections. + ## + ## This should probably be fixed someday, but for the present time, + ## it seems incredibly unlikely that "+" would ever correspond to + ## a legitimate section heading + ##--------------------------------------------------------------------- + my $add = ($sections[0] eq "+") ? shift(@sections) : ""; + + ## Reset the set of sections to use + unless (@sections > 0) { + delete $myData{_SELECTED_SECTIONS} unless ($add); + return; + } + $myData{_SELECTED_SECTIONS} = [] + unless ($add && exists $myData{_SELECTED_SECTIONS}); + local *selected_sections = $myData{_SELECTED_SECTIONS}; + + ## Compile each spec + my $spec; + for $spec (@sections) { + if ( defined($_ = &_compile_section_spec($spec)) ) { + ## Store them in our sections array + push(@selected_sections, $_); + } + else { + carp "Ignoring section spec \"$spec\"!\n"; + } + } +} + +##--------------------------------------------------------------------------- + +=head1 B<add_selection()> + + $parser->add_selection($section_spec1,$section_spec2,...); + +This method is used to add to the currently selected sections and +subsections of POD documentation that are to be printed and/or +processed. See <select()> for replacing the currently selected sections. + +Each of the C<$section_spec> arguments should be a section specification +as described in L<"SECTION SPECIFICATIONS">. The section specifications +are parsed by this method and the resulting regular expressions are +stored in the invoking object. + +This method should I<not> normally be overridden by subclasses. + +=cut + +sub add_selection { + my $self = shift; + $self->select("+", @_); +} + +##--------------------------------------------------------------------------- + +=head1 B<clear_selections()> + + $parser->clear_selections(); + +This method takes no arguments, it has the exact same effect as invoking +<select()> with no arguments. + +=cut + +sub clear_selections { + my $self = shift; + $self->select(); +} + +##--------------------------------------------------------------------------- + +=head1 B<match_section()> + + $boolean = $parser->match_section($heading1,$heading2,...); + +Returns a value of true if the given section and subsection heading +titles match any of the currently selected section specifications in +effect from prior calls to B<select()> and B<add_selection()> (or if +there are no explictly selected/deselected sections). + +The arguments C<$heading1>, C<$heading2>, etc. are the heading titles of +the corresponding sections, subsections, etc. to try and match. If +C<$headingN> is omitted then it defaults to the current corresponding +section heading title in the input. + +This method should I<not> normally be overridden by subclasses. + +=cut + +sub match_section { + my $self = shift; + my (@headings) = @_; + local *myData = $self; + + ## Return true if no restrictions were explicitly specified + my $selections = (exists $myData{_SELECTED_SECTIONS}) + ? $myData{_SELECTED_SECTIONS} : undef; + return 1 unless ((defined $selections) && (@{$selections} > 0)); + + ## Default any unspecified sections to the current one + my @current_headings = $self->curr_headings(); + for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) { + (defined $headings[$i]) or $headings[$i] = $current_headings[$i]; + } + + ## Look for a match against the specified section expressions + my ($section_spec, $regex, $negated, $match); + for $section_spec ( @{$selections} ) { + ##------------------------------------------------------ + ## Each portion of this spec must match in order for + ## the spec to be matched. So we will start with a + ## match-value of 'true' and logically 'and' it with + ## the results of matching a given element of the spec. + ##------------------------------------------------------ + $match = 1; + for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) { + $regex = $section_spec->[$i]; + $negated = ($regex =~ s/^\!//); + $match &= ($negated ? ($headings[$i] !~ /${regex}/) + : ($headings[$i] =~ /${regex}/)); + last unless ($match); + } + return 1 if ($match); + } + return 0; ## no match +} + +##--------------------------------------------------------------------------- + +=head1 B<is_selected()> + + $boolean = $parser->is_selected($paragraph); + +This method is used to determine if the block of text given in +C<$paragraph> falls within the currently selected set of POD sections +and subsections to be printed or processed. This method is also +responsible for keeping track of the current input section and +subsections. It is assumed that C<$paragraph> is the most recently read +(but not yet processed) input paragraph. + +The value returned will be true if the C<$paragraph> and the rest of the +text in the same section as C<$paragraph> should be selected (included) +for processing; otherwise a false value is returned. + +=cut + +sub is_selected { + my ($self, $paragraph) = @_; + local $_; + local *myData = $self; + + $self->_init_headings() unless (defined $myData{_SECTION_HEADINGS}); + + ## Keep track of current sections levels and headings + $_ = $paragraph; + if (/^=((?:sub)*)(?:head(?:ing)?|sec(?:tion)?)(\d*)\s+(.*)\s*$/) + { + ## This is a section heading command + my ($level, $heading) = ($2, $3); + $level = 1 + (length($1) / 3) if ((! length $level) || (length $1)); + ## Reset the current section heading at this level + $myData{_SECTION_HEADINGS}->[$level - 1] = $heading; + ## Reset subsection headings of this one to empty + for (my $i = $level; $i < $MAX_HEADING_LEVEL; ++$i) { + $myData{_SECTION_HEADINGS}->[$i] = ''; + } + } + + return $self->match_section(); +} + +############################################################################# + +=head1 EXPORTED FUNCTIONS + +The following functions are exported by this module. Please note that +these are functions (not methods) and therefore C<do not> take an +implicit first argument. + +=cut + +##--------------------------------------------------------------------------- + +=head1 B<podselect()> + + podselect(\%options,@filelist); + +B<podselect> will print the raw (untranslated) POD paragraphs of all +POD sections in the given input files specified by C<@filelist> +according to the given options. + +If any argument to B<podselect> is a reference to a hash +(associative array) then the values with the following keys are +processed as follows: + +=over 4 + +=item B<-output> + +A string corresponding to the desired output file (or ">&STDOUT" +or ">&STDERR"). The default is to use standard output. + +=item B<-sections> + +A reference to an array of sections specifications (as described in +L<"SECTION SPECIFICATIONS">) which indicate the desired set of POD +sections and subsections to be selected from input. If no section +specifications are given, then all sections of the PODs are used. + +=begin _NOT_IMPLEMENTED_ + +=item B<-ranges> + +A reference to an array of range specifications (as described in +L<"RANGE SPECIFICATIONS">) which indicate the desired range of POD +paragraphs to be selected from the desired input sections. If no range +specifications are given, then all paragraphs of the desired sections +are used. + +=end _NOT_IMPLEMENTED_ + +=back + +All other arguments should correspond to the names of input files +containing POD sections. A file name of "-" or "<&STDIN" will +be interpeted to mean standard input (which is the default if no +filenames are given). + +=cut + +sub podselect { + my(@argv) = @_; + my %defaults = (); + my $pod_parser = new Pod::Select(%defaults); + my $num_inputs = 0; + my $output = ">&STDOUT"; + my %opts; + local $_; + for (@argv) { + if (ref($_)) { + next unless (ref($_) eq 'HASH'); + %opts = (%defaults, %{$_}); + + ##------------------------------------------------------------- + ## Need this for backward compatibility since we formerly used + ## options that were all uppercase words rather than ones that + ## looked like Unix command-line options. + ## to be uppercase keywords) + ##------------------------------------------------------------- + %opts = map { + my ($key, $val) = (lc $_, $opts{$_}); + $key =~ s/^(?=\w)/-/; + $key =~ /^-se[cl]/ and $key = '-sections'; + #! $key eq '-range' and $key .= 's'; + ($key => $val); + } (keys %opts); + + ## Process the options + (exists $opts{'-output'}) and $output = $opts{'-output'}; + + ## Select the desired sections + $pod_parser->select(@{ $opts{'-sections'} }) + if ( (defined $opts{'-sections'}) + && ((ref $opts{'-sections'}) eq 'ARRAY') ); + + #! ## Select the desired paragraph ranges + #! $pod_parser->select(@{ $opts{'-ranges'} }) + #! if ( (defined $opts{'-ranges'}) + #! && ((ref $opts{'-ranges'}) eq 'ARRAY') ); + } + else { + $pod_parser->parse_from_file($_, $output); + ++$num_inputs; + } + } + $pod_parser->parse_from_file("-") unless ($num_inputs > 0); +} + +############################################################################# + +=head1 PRIVATE METHODS AND DATA + +B<Pod::Select> makes uses a number of internal methods and data fields +which clients should not need to see or use. For the sake of avoiding +name collisions with client data and methods, these methods and fields +are briefly discussed here. Determined hackers may obtain further +information about them by reading the B<Pod::Select> source code. + +Private data fields are stored in the hash-object whose reference is +returned by the B<new()> constructor for this class. The names of all +private methods and data-fields used by B<Pod::Select> begin with a +prefix of "_" and match the regular expression C</^_\w+$/>. + +=cut + +##--------------------------------------------------------------------------- + +=begin _PRIVATE_ + +=head1 B<_compile_section_spec()> + + $listref = $parser->_compile_section_spec($section_spec); + +This function (note it is a function and I<not> a method) takes a +section specification (as described in L<"SECTION SPECIFICATIONS">) +given in C<$section_sepc>, and compiles it into a list of regular +expressions. If C<$section_spec> has no syntax errors, then a reference +to the list (array) of corresponding regular expressions is returned; +otherwise C<undef> is returned and an error message is printed (using +B<carp>) for each invalid regex. + +=end _PRIVATE_ + +=cut + +sub _compile_section_spec { + my ($section_spec) = @_; + my (@regexs, $negated); + + ## Compile the spec into a list of regexs + local $_ = $section_spec; + s|\\\\|\001|g; ## handle escaped backward slashes + s|\\/|\002|g; ## handle escaped forward slashes + + ## Parse the regexs for the heading titles + @regexs = split('/', $_, $MAX_HEADING_LEVEL); + + ## Set default regex for ommitted levels + for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) { + $regexs[$i] = '.*' unless ((defined $regexs[$i]) + && (length $regexs[$i])); + } + ## Modify the regexs as needed and validate their syntax + my $bad_regexs = 0; + for (@regexs) { + $_ .= '.+' if ($_ eq '!'); + s|\001|\\\\|g; ## restore escaped backward slashes + s|\002|\\/|g; ## restore escaped forward slashes + $negated = s/^\!//; ## check for negation + eval "/$_/"; ## check regex syntax + if ($@) { + ++$bad_regexs; + carp "Bad regular expression /$_/ in \"$section_spec\": $@\n"; + } + else { + ## Add the forward and rear anchors (and put the negator back) + $_ = '^' . $_ unless (/^\^/); + $_ = $_ . '$' unless (/\$$/); + $_ = '!' . $_ if ($negated); + } + } + return (! $bad_regexs) ? [ @regexs ] : undef; +} + +##--------------------------------------------------------------------------- + +=begin _PRIVATE_ + +=head2 $self->{_SECTION_HEADINGS} + +A reference to an array of the current section heading titles for each +heading level (note that the first heading level title is at index 0). + +=end _PRIVATE_ + +=cut + +##--------------------------------------------------------------------------- + +=begin _PRIVATE_ + +=head2 $self->{_SELECTED_SECTIONS} + +A reference to an array of references to arrays. Each subarray is a list +of anchored regular expressions (preceded by a "!" if the expression is to +be negated). The index of the expression in the subarray should correspond +to the index of the heading title in C<$self-E<gt>{_SECTION_HEADINGS}> +that it is to be matched against. + +=end _PRIVATE_ + +=cut + +############################################################################# + +=head1 SEE ALSO + +L<Pod::Parser> + +=head1 AUTHOR + +Please report bugs using L<http://rt.cpan.org>. + +Brad Appleton E<lt>bradapp@enteract.comE<gt> + +Based on code for B<pod2text> written by +Tom Christiansen E<lt>tchrist@mox.perl.comE<gt> + +=cut + +1; +# vim: ts=4 sw=4 et diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Text.pm b/Master/tlpkg/tlperl.old/lib/Pod/Text.pm new file mode 100644 index 00000000000..1028f2e9e1b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Text.pm @@ -0,0 +1,848 @@ +# Pod::Text -- Convert POD data to formatted ASCII text. +# $Id: Text.pm,v 2.21 2002/08/04 03:34:58 eagle Exp $ +# +# Copyright 1999, 2000, 2001, 2002 by Russ Allbery <rra@stanford.edu> +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. +# +# This module converts POD to formatted text. It replaces the old Pod::Text +# module that came with versions of Perl prior to 5.6.0 and attempts to match +# its output except for some specific circumstances where other decisions +# seemed to produce better output. It uses Pod::Parser and is designed to be +# very easy to subclass. +# +# Perl core hackers, please note that this module is also separately +# maintained outside of the Perl core as part of the podlators. Please send +# me any patches at the address above in addition to sending them to the +# standard Perl mailing lists. + +############################################################################## +# Modules and declarations +############################################################################## + +package Pod::Text; + +require 5.004; + +use Carp qw(carp croak); +use Exporter (); +use Pod::ParseLink qw(parselink); +use Pod::Select (); + +use strict; +use vars qw(@ISA @EXPORT %ESCAPES $VERSION); + +# We inherit from Pod::Select instead of Pod::Parser so that we can be used by +# Pod::Usage. +@ISA = qw(Pod::Select Exporter); + +# We have to export pod2text for backward compatibility. +@EXPORT = qw(pod2text); + +# Don't use the CVS revision as the version, since this module is also in Perl +# core and too many things could munge CVS magic revision strings. This +# number should ideally be the same as the CVS revision in podlators, however. +$VERSION = 2.21; + + +############################################################################## +# Table of supported E<> escapes +############################################################################## + +# This table is taken near verbatim from Pod::PlainText in Pod::Parser, which +# got it near verbatim from the original Pod::Text. It is therefore credited +# to Tom Christiansen, and I'm glad I didn't have to write it. :) "iexcl" to +# "divide" added by Tim Jenness. +%ESCAPES = ( + 'amp' => '&', # ampersand + 'apos' => "'", # apostrophe + 'lt' => '<', # left chevron, less-than + 'gt' => '>', # right chevron, greater-than + 'quot' => '"', # double quote + 'sol' => '/', # solidus (forward slash) + 'verbar' => '|', # vertical bar + + "Aacute" => "\xC1", # capital A, acute accent + "aacute" => "\xE1", # small a, acute accent + "Acirc" => "\xC2", # capital A, circumflex accent + "acirc" => "\xE2", # small a, circumflex accent + "AElig" => "\xC6", # capital AE diphthong (ligature) + "aelig" => "\xE6", # small ae diphthong (ligature) + "Agrave" => "\xC0", # capital A, grave accent + "agrave" => "\xE0", # small a, grave accent + "Aring" => "\xC5", # capital A, ring + "aring" => "\xE5", # small a, ring + "Atilde" => "\xC3", # capital A, tilde + "atilde" => "\xE3", # small a, tilde + "Auml" => "\xC4", # capital A, dieresis or umlaut mark + "auml" => "\xE4", # small a, dieresis or umlaut mark + "Ccedil" => "\xC7", # capital C, cedilla + "ccedil" => "\xE7", # small c, cedilla + "Eacute" => "\xC9", # capital E, acute accent + "eacute" => "\xE9", # small e, acute accent + "Ecirc" => "\xCA", # capital E, circumflex accent + "ecirc" => "\xEA", # small e, circumflex accent + "Egrave" => "\xC8", # capital E, grave accent + "egrave" => "\xE8", # small e, grave accent + "ETH" => "\xD0", # capital Eth, Icelandic + "eth" => "\xF0", # small eth, Icelandic + "Euml" => "\xCB", # capital E, dieresis or umlaut mark + "euml" => "\xEB", # small e, dieresis or umlaut mark + "Iacute" => "\xCD", # capital I, acute accent + "iacute" => "\xED", # small i, acute accent + "Icirc" => "\xCE", # capital I, circumflex accent + "icirc" => "\xEE", # small i, circumflex accent + "Igrave" => "\xCC", # capital I, grave accent + "igrave" => "\xEC", # small i, grave accent + "Iuml" => "\xCF", # capital I, dieresis or umlaut mark + "iuml" => "\xEF", # small i, dieresis or umlaut mark + "Ntilde" => "\xD1", # capital N, tilde + "ntilde" => "\xF1", # small n, tilde + "Oacute" => "\xD3", # capital O, acute accent + "oacute" => "\xF3", # small o, acute accent + "Ocirc" => "\xD4", # capital O, circumflex accent + "ocirc" => "\xF4", # small o, circumflex accent + "Ograve" => "\xD2", # capital O, grave accent + "ograve" => "\xF2", # small o, grave accent + "Oslash" => "\xD8", # capital O, slash + "oslash" => "\xF8", # small o, slash + "Otilde" => "\xD5", # capital O, tilde + "otilde" => "\xF5", # small o, tilde + "Ouml" => "\xD6", # capital O, dieresis or umlaut mark + "ouml" => "\xF6", # small o, dieresis or umlaut mark + "szlig" => "\xDF", # small sharp s, German (sz ligature) + "THORN" => "\xDE", # capital THORN, Icelandic + "thorn" => "\xFE", # small thorn, Icelandic + "Uacute" => "\xDA", # capital U, acute accent + "uacute" => "\xFA", # small u, acute accent + "Ucirc" => "\xDB", # capital U, circumflex accent + "ucirc" => "\xFB", # small u, circumflex accent + "Ugrave" => "\xD9", # capital U, grave accent + "ugrave" => "\xF9", # small u, grave accent + "Uuml" => "\xDC", # capital U, dieresis or umlaut mark + "uuml" => "\xFC", # small u, dieresis or umlaut mark + "Yacute" => "\xDD", # capital Y, acute accent + "yacute" => "\xFD", # small y, acute accent + "yuml" => "\xFF", # small y, dieresis or umlaut mark + + "laquo" => "\xAB", # left pointing double angle quotation mark + "lchevron" => "\xAB", # synonym (backwards compatibility) + "raquo" => "\xBB", # right pointing double angle quotation mark + "rchevron" => "\xBB", # synonym (backwards compatibility) + + "iexcl" => "\xA1", # inverted exclamation mark + "cent" => "\xA2", # cent sign + "pound" => "\xA3", # (UK) pound sign + "curren" => "\xA4", # currency sign + "yen" => "\xA5", # yen sign + "brvbar" => "\xA6", # broken vertical bar + "sect" => "\xA7", # section sign + "uml" => "\xA8", # diaresis + "copy" => "\xA9", # Copyright symbol + "ordf" => "\xAA", # feminine ordinal indicator + "not" => "\xAC", # not sign + "shy" => '', # soft (discretionary) hyphen + "reg" => "\xAE", # registered trademark + "macr" => "\xAF", # macron, overline + "deg" => "\xB0", # degree sign + "plusmn" => "\xB1", # plus-minus sign + "sup2" => "\xB2", # superscript 2 + "sup3" => "\xB3", # superscript 3 + "acute" => "\xB4", # acute accent + "micro" => "\xB5", # micro sign + "para" => "\xB6", # pilcrow sign = paragraph sign + "middot" => "\xB7", # middle dot = Georgian comma + "cedil" => "\xB8", # cedilla + "sup1" => "\xB9", # superscript 1 + "ordm" => "\xBA", # masculine ordinal indicator + "frac14" => "\xBC", # vulgar fraction one quarter + "frac12" => "\xBD", # vulgar fraction one half + "frac34" => "\xBE", # vulgar fraction three quarters + "iquest" => "\xBF", # inverted question mark + "times" => "\xD7", # multiplication sign + "divide" => "\xF7", # division sign + + "nbsp" => "\x01", # non-breaking space +); + + +############################################################################## +# Initialization +############################################################################## + +# Initialize the object. Must be sure to call our parent initializer. +sub initialize { + my $self = shift; + + $$self{alt} = 0 unless defined $$self{alt}; + $$self{indent} = 4 unless defined $$self{indent}; + $$self{margin} = 0 unless defined $$self{margin}; + $$self{loose} = 0 unless defined $$self{loose}; + $$self{sentence} = 0 unless defined $$self{sentence}; + $$self{width} = 76 unless defined $$self{width}; + + # Figure out what quotes we'll be using for C<> text. + $$self{quotes} ||= '"'; + if ($$self{quotes} eq 'none') { + $$self{LQUOTE} = $$self{RQUOTE} = ''; + } elsif (length ($$self{quotes}) == 1) { + $$self{LQUOTE} = $$self{RQUOTE} = $$self{quotes}; + } elsif ($$self{quotes} =~ /^(.)(.)$/ + || $$self{quotes} =~ /^(..)(..)$/) { + $$self{LQUOTE} = $1; + $$self{RQUOTE} = $2; + } else { + croak qq(Invalid quote specification "$$self{quotes}"); + } + + # Stack of indentations. + $$self{INDENTS} = []; + + # Current left margin. + $$self{MARGIN} = $$self{indent} + $$self{margin}; + + $self->SUPER::initialize; + + # Tell Pod::Parser that we want the non-POD stuff too if code was set. + $self->parseopts ('-want_nonPODs' => 1) if $$self{code}; +} + + +############################################################################## +# Core overrides +############################################################################## + +# Called for each command paragraph. Gets the command, the associated +# paragraph, the line number, and a Pod::Paragraph object. Just dispatches +# the command to a method named the same as the command. =cut is handled +# internally by Pod::Parser. +sub command { + my $self = shift; + my $command = shift; + return if $command eq 'pod'; + return if ($$self{EXCLUDE} && $command ne 'end'); + if ($self->can ('cmd_' . $command)) { + $command = 'cmd_' . $command; + $self->$command (@_); + } else { + my ($text, $line, $paragraph) = @_; + my $file; + ($file, $line) = $paragraph->file_line; + $text =~ s/\n+\z//; + $text = " $text" if ($text =~ /^\S/); + warn qq($file:$line: Unknown command paragraph: =$command$text\n); + return; + } +} + +# Called for a verbatim paragraph. Gets the paragraph, the line number, and a +# Pod::Paragraph object. Just output it verbatim, but with tabs converted to +# spaces. +sub verbatim { + my $self = shift; + return if $$self{EXCLUDE}; + $self->item if defined $$self{ITEM}; + local $_ = shift; + return if /^\s*$/; + s/^(\s*\S+)/(' ' x $$self{MARGIN}) . $1/gme; + $self->output ($_); +} + +# Called for a regular text block. Gets the paragraph, the line number, and a +# Pod::Paragraph object. Perform interpolation and output the results. +sub textblock { + my $self = shift; + return if $$self{EXCLUDE}; + $self->output ($_[0]), return if $$self{VERBATIM}; + local $_ = shift; + my $line = shift; + + # Interpolate and output the paragraph. + $_ = $self->interpolate ($_, $line); + s/\s+$/\n/; + if (defined $$self{ITEM}) { + $self->item ($_ . "\n"); + } else { + $self->output ($self->reformat ($_ . "\n")); + } +} + +# Called for a formatting code. Gets the command, argument, and a +# Pod::InteriorSequence object and is expected to return the resulting text. +# Calls methods for code, bold, italic, file, and link to handle those types +# of codes, and handles S<>, E<>, X<>, and Z<> directly. +sub interior_sequence { + local $_; + my ($self, $command, $seq); + ($self, $command, $_, $seq) = @_; + + # We have to defer processing of the inside of an L<> formatting code. If + # this code is nested inside an L<> code, return the literal raw text of + # it. + my $parent = $seq->nested; + while (defined $parent) { + return $seq->raw_text if ($parent->cmd_name eq 'L'); + $parent = $parent->nested; + } + + # Index entries are ignored in plain text. + return '' if ($command eq 'X' || $command eq 'Z'); + + # Expand escapes into the actual character now, warning if invalid. + if ($command eq 'E') { + if (/^\d+$/) { + return chr; + } else { + return $ESCAPES{$_} if defined $ESCAPES{$_}; + my ($file, $line) = $seq->file_line; + warn "$file:$line: Unknown escape: E<$_>\n"; + return "E<$_>"; + } + } + + # For all the other formatting codes, empty content produces no output. + return if $_ eq ''; + + # For S<>, compress all internal whitespace and then map spaces to \01. + # When we output the text, we'll map this back. + if ($command eq 'S') { + s/\s+/ /g; + tr/ /\01/; + return $_; + } + + # Anything else needs to get dispatched to another method. + if ($command eq 'B') { return $self->seq_b ($_) } + elsif ($command eq 'C') { return $self->seq_c ($_) } + elsif ($command eq 'F') { return $self->seq_f ($_) } + elsif ($command eq 'I') { return $self->seq_i ($_) } + elsif ($command eq 'L') { return $self->seq_l ($_, $seq) } + else { + my ($file, $line) = $seq->file_line; + warn "$file:$line: Unknown formatting code: $command<$_>\n"; + } +} + +# Called for each paragraph that's actually part of the POD. We take +# advantage of this opportunity to untabify the input. Also, if given the +# code option, we may see paragraphs that aren't part of the POD and need to +# output them directly. +sub preprocess_paragraph { + my $self = shift; + local $_ = shift; + 1 while s/^(.*?)(\t+)/$1 . ' ' x (length ($2) * 8 - length ($1) % 8)/me; + $self->output_code ($_) if $self->cutting; + $_; +} + + +############################################################################## +# Command paragraphs +############################################################################## + +# All command paragraphs take the paragraph and the line number. + +# First level heading. +sub cmd_head1 { + my ($self, $text, $line) = @_; + $self->heading ($text, $line, 0, '===='); +} + +# Second level heading. +sub cmd_head2 { + my ($self, $text, $line) = @_; + $self->heading ($text, $line, $$self{indent} / 2, '== '); +} + +# Third level heading. +sub cmd_head3 { + my ($self, $text, $line) = @_; + $self->heading ($text, $line, $$self{indent} * 2 / 3 + 0.5, '= '); +} + +# Third level heading. +sub cmd_head4 { + my ($self, $text, $line) = @_; + $self->heading ($text, $line, $$self{indent} * 3 / 4 + 0.5, '- '); +} + +# Start a list. +sub cmd_over { + my $self = shift; + local $_ = shift; + $self->item ("\n\n") if defined $$self{ITEM}; + unless (/^[-+]?\d+\s+$/) { $_ = $$self{indent} } + push (@{ $$self{INDENTS} }, $$self{MARGIN}); + $$self{MARGIN} += ($_ + 0); +} + +# End a list. +sub cmd_back { + my ($self, $text, $line, $paragraph) = @_; + $self->item ("\n\n") if defined $$self{ITEM}; + $$self{MARGIN} = pop @{ $$self{INDENTS} }; + unless (defined $$self{MARGIN}) { + my $file; + ($file, $line) = $paragraph->file_line; + warn "$file:$line: Unmatched =back\n"; + $$self{MARGIN} = $$self{indent}; + } +} + +# An individual list item. +sub cmd_item { + my $self = shift; + if (defined $$self{ITEM}) { $self->item } + local $_ = shift; + s/\s+$//; + $$self{ITEM} = $_ ? $self->interpolate ($_) : '*'; +} + +# Begin a block for a particular translator. Setting VERBATIM triggers +# special handling in textblock(). +sub cmd_begin { + my $self = shift; + local $_ = shift; + my ($kind) = /^(\S+)/ or return; + if ($kind eq 'text') { + $$self{VERBATIM} = 1; + } else { + $$self{EXCLUDE} = 1; + } +} + +# End a block for a particular translator. We assume that all =begin/=end +# pairs are properly closed. +sub cmd_end { + my $self = shift; + $$self{EXCLUDE} = 0; + $$self{VERBATIM} = 0; +} + +# One paragraph for a particular translator. Ignore it unless it's intended +# for text, in which case we treat it as a verbatim text block. +sub cmd_for { + my $self = shift; + local $_ = shift; + my $line = shift; + return unless s/^text\b[ \t]*\n?//; + $self->verbatim ($_, $line); +} + + +############################################################################## +# Formatting codes +############################################################################## + +# The simple ones. These are here mostly so that subclasses can override them +# and do more complicated things. +sub seq_b { return $_[0]{alt} ? "``$_[1]''" : $_[1] } +sub seq_f { return $_[0]{alt} ? "\"$_[1]\"" : $_[1] } +sub seq_i { return '*' . $_[1] . '*' } + +# Apply a whole bunch of messy heuristics to not quote things that don't +# benefit from being quoted. These originally come from Barrie Slaymaker and +# largely duplicate code in Pod::Man. +sub seq_c { + my $self = shift; + local $_ = shift; + + # A regex that matches the portion of a variable reference that's the + # array or hash index, separated out just because we want to use it in + # several places in the following regex. + my $index = '(?: \[.*\] | \{.*\} )?'; + + # Check for things that we don't want to quote, and if we find any of + # them, return the string with just a font change and no quoting. + m{ + ^\s* + (?: + ( [\'\`\"] ) .* \1 # already quoted + | \` .* \' # `quoted' + | \$+ [\#^]? \S $index # special ($^Foo, $") + | [\$\@%&*]+ \#? [:\'\w]+ $index # plain var or func + | [\$\@%&*]* [:\'\w]+ (?: -> )? \(\s*[^\s,]\s*\) # 0/1-arg func call + | [+-]? ( \d[\d.]* | \.\d+ ) (?: [eE][+-]?\d+ )? # a number + | 0x [a-fA-F\d]+ # a hex constant + ) + \s*\z + }xo && return $_; + + # If we didn't return, go ahead and quote the text. + return $$self{alt} ? "``$_''" : "$$self{LQUOTE}$_$$self{RQUOTE}"; +} + +# Handle links. Since this is plain text, we can't actually make any real +# links, so this is all to figure out what text we print out. Most of the +# work is done by Pod::ParseLink. +sub seq_l { + my ($self, $link, $seq) = @_; + my ($text, $type) = (parselink ($link))[1,4]; + my ($file, $line) = $seq->file_line; + $text = $self->interpolate ($text, $line); + $text = '<' . $text . '>' if $type eq 'url'; + return $text || ''; +} + + +############################################################################## +# Header handling +############################################################################## + +# The common code for handling all headers. Takes the interpolated header +# text, the line number, the indentation, and the surrounding marker for the +# alt formatting method. +sub heading { + my ($self, $text, $line, $indent, $marker) = @_; + $self->item ("\n\n") if defined $$self{ITEM}; + $text =~ s/\s+$//; + $text = $self->interpolate ($text, $line); + if ($$self{alt}) { + my $closemark = reverse (split (//, $marker)); + my $margin = ' ' x $$self{margin}; + $self->output ("\n" . "$margin$marker $text $closemark" . "\n\n"); + } else { + $text .= "\n" if $$self{loose}; + my $margin = ' ' x ($$self{margin} + $indent); + $self->output ($margin . $text . "\n"); + } +} + + +############################################################################## +# List handling +############################################################################## + +# This method is called whenever an =item command is complete (in other words, +# we've seen its associated paragraph or know for certain that it doesn't have +# one). It gets the paragraph associated with the item as an argument. If +# that argument is empty, just output the item tag; if it contains a newline, +# output the item tag followed by the newline. Otherwise, see if there's +# enough room for us to output the item tag in the margin of the text or if we +# have to put it on a separate line. +sub item { + my $self = shift; + local $_ = shift; + my $tag = $$self{ITEM}; + unless (defined $tag) { + carp "Item called without tag"; + return; + } + undef $$self{ITEM}; + my $indent = $$self{INDENTS}[-1]; + unless (defined $indent) { $indent = $$self{indent} } + my $margin = ' ' x $$self{margin}; + if (!$_ || /^\s+$/ || ($$self{MARGIN} - $indent < length ($tag) + 1)) { + my $realindent = $$self{MARGIN}; + $$self{MARGIN} = $indent; + my $output = $self->reformat ($tag); + $output =~ s/^$margin /$margin:/ if ($$self{alt} && $indent > 0); + $output =~ s/\n*$/\n/; + + # If the text is just whitespace, we have an empty item paragraph; + # this can result from =over/=item/=back without any intermixed + # paragraphs. Insert some whitespace to keep the =item from merging + # into the next paragraph. + $output .= "\n" if $_ && $_ =~ /^\s*$/; + + $self->output ($output); + $$self{MARGIN} = $realindent; + $self->output ($self->reformat ($_)) if $_ && /\S/; + } else { + my $space = ' ' x $indent; + $space =~ s/^$margin /$margin:/ if $$self{alt}; + $_ = $self->reformat ($_); + s/^$margin /$margin:/ if ($$self{alt} && $indent > 0); + my $tagspace = ' ' x length $tag; + s/^($space)$tagspace/$1$tag/ or warn "Bizarre space in item"; + $self->output ($_); + } +} + + +############################################################################## +# Output formatting +############################################################################## + +# Wrap a line, indenting by the current left margin. We can't use Text::Wrap +# because it plays games with tabs. We can't use formline, even though we'd +# really like to, because it screws up non-printing characters. So we have to +# do the wrapping ourselves. +sub wrap { + my $self = shift; + local $_ = shift; + my $output = ''; + my $spaces = ' ' x $$self{MARGIN}; + my $width = $$self{width} - $$self{MARGIN}; + while (length > $width) { + if (s/^([^\n]{0,$width})\s+// || s/^([^\n]{$width})//) { + $output .= $spaces . $1 . "\n"; + } else { + last; + } + } + $output .= $spaces . $_; + $output =~ s/\s+$/\n\n/; + $output; +} + +# Reformat a paragraph of text for the current margin. Takes the text to +# reformat and returns the formatted text. +sub reformat { + my $self = shift; + local $_ = shift; + + # If we're trying to preserve two spaces after sentences, do some munging + # to support that. Otherwise, smash all repeated whitespace. + if ($$self{sentence}) { + s/ +$//mg; + s/\.\n/. \n/g; + s/\n/ /g; + s/ +/ /g; + } else { + s/\s+/ /g; + } + $self->wrap ($_); +} + +# Output text to the output device. +sub output { $_[1] =~ tr/\01/ /; print { $_[0]->output_handle } $_[1] } + +# Output a block of code (something that isn't part of the POD text). Called +# by preprocess_paragraph only if we were given the code option. Exists here +# only so that it can be overridden by subclasses. +sub output_code { $_[0]->output ($_[1]) } + + +############################################################################## +# Backwards compatibility +############################################################################## + +# The old Pod::Text module did everything in a pod2text() function. This +# tries to provide the same interface for legacy applications. +sub pod2text { + my @args; + + # This is really ugly; I hate doing option parsing in the middle of a + # module. But the old Pod::Text module supported passing flags to its + # entry function, so handle -a and -<number>. + while ($_[0] =~ /^-/) { + my $flag = shift; + if ($flag eq '-a') { push (@args, alt => 1) } + elsif ($flag =~ /^-(\d+)$/) { push (@args, width => $1) } + else { + unshift (@_, $flag); + last; + } + } + + # Now that we know what arguments we're using, create the parser. + my $parser = Pod::Text->new (@args); + + # If two arguments were given, the second argument is going to be a file + # handle. That means we want to call parse_from_filehandle(), which means + # we need to turn the first argument into a file handle. Magic open will + # handle the <&STDIN case automagically. + if (defined $_[1]) { + my @fhs = @_; + local *IN; + unless (open (IN, $fhs[0])) { + croak ("Can't open $fhs[0] for reading: $!\n"); + return; + } + $fhs[0] = \*IN; + return $parser->parse_from_filehandle (@fhs); + } else { + return $parser->parse_from_file (@_); + } +} + + +############################################################################## +# Module return value and documentation +############################################################################## + +1; +__END__ + +=head1 NAME + +Pod::Text - Convert POD data to formatted ASCII text + +=head1 SYNOPSIS + + use Pod::Text; + my $parser = Pod::Text->new (sentence => 0, width => 78); + + # Read POD from STDIN and write to STDOUT. + $parser->parse_from_filehandle; + + # Read POD from file.pod and write to file.txt. + $parser->parse_from_file ('file.pod', 'file.txt'); + +=head1 DESCRIPTION + +Pod::Text is a module that can convert documentation in the POD format (the +preferred language for documenting Perl) into formatted ASCII. It uses no +special formatting controls or codes whatsoever, and its output is therefore +suitable for nearly any device. + +As a derived class from Pod::Parser, Pod::Text supports the same methods and +interfaces. See L<Pod::Parser> for all the details; briefly, one creates a +new parser with C<< Pod::Text->new() >> and then calls either +parse_from_filehandle() or parse_from_file(). + +new() can take options, in the form of key/value pairs, that control the +behavior of the parser. The currently recognized options are: + +=over 4 + +=item alt + +If set to a true value, selects an alternate output format that, among other +things, uses a different heading style and marks C<=item> entries with a +colon in the left margin. Defaults to false. + +=item code + +If set to a true value, the non-POD parts of the input file will be included +in the output. Useful for viewing code documented with POD blocks with the +POD rendered and the code left intact. + +=item indent + +The number of spaces to indent regular text, and the default indentation for +C<=over> blocks. Defaults to 4. + +=item loose + +If set to a true value, a blank line is printed after a C<=head1> heading. +If set to false (the default), no blank line is printed after C<=head1>, +although one is still printed after C<=head2>. This is the default because +it's the expected formatting for manual pages; if you're formatting +arbitrary text documents, setting this to true may result in more pleasing +output. + +=item margin + +The width of the left margin in spaces. Defaults to 0. This is the margin +for all text, including headings, not the amount by which regular text is +indented; for the latter, see the I<indent> option. To set the right +margin, see the I<width> option. + +=item quotes + +Sets the quote marks used to surround CE<lt>> text. If the value is a +single character, it is used as both the left and right quote; if it is two +characters, the first character is used as the left quote and the second as +the right quoted; and if it is four characters, the first two are used as +the left quote and the second two as the right quote. + +This may also be set to the special value C<none>, in which case no quote +marks are added around CE<lt>> text. + +=item sentence + +If set to a true value, Pod::Text will assume that each sentence ends in two +spaces, and will try to preserve that spacing. If set to false, all +consecutive whitespace in non-verbatim paragraphs is compressed into a +single space. Defaults to true. + +=item width + +The column at which to wrap text on the right-hand side. Defaults to 76. + +=back + +The standard Pod::Parser method parse_from_filehandle() takes up to two +arguments, the first being the file handle to read POD from and the second +being the file handle to write the formatted output to. The first defaults +to STDIN if not given, and the second defaults to STDOUT. The method +parse_from_file() is almost identical, except that its two arguments are the +input and output disk files instead. See L<Pod::Parser> for the specific +details. + +=head1 DIAGNOSTICS + +=over 4 + +=item Bizarre space in item + +=item Item called without tag + +(W) Something has gone wrong in internal C<=item> processing. These +messages indicate a bug in Pod::Text; you should never see them. + +=item Can't open %s for reading: %s + +(F) Pod::Text was invoked via the compatibility mode pod2text() interface +and the input file it was given could not be opened. + +=item Invalid quote specification "%s" + +(F) The quote specification given (the quotes option to the constructor) was +invalid. A quote specification must be one, two, or four characters long. + +=item %s:%d: Unknown command paragraph: %s + +(W) The POD source contained a non-standard command paragraph (something of +the form C<=command args>) that Pod::Man didn't know about. It was ignored. + +=item %s:%d: Unknown escape: %s + +(W) The POD source contained an C<EE<lt>E<gt>> escape that Pod::Text didn't +know about. + +=item %s:%d: Unknown formatting code: %s + +(W) The POD source contained a non-standard formatting code (something of +the form C<XE<lt>E<gt>>) that Pod::Text didn't know about. + +=item %s:%d: Unmatched =back + +(W) Pod::Text encountered a C<=back> command that didn't correspond to an +C<=over> command. + +=back + +=head1 RESTRICTIONS + +Embedded Ctrl-As (octal 001) in the input will be mapped to spaces on +output, due to an internal implementation detail. + +=head1 NOTES + +This is a replacement for an earlier Pod::Text module written by Tom +Christiansen. It has a revamped interface, since it now uses Pod::Parser, +but an interface roughly compatible with the old Pod::Text::pod2text() +function is still available. Please change to the new calling convention, +though. + +The original Pod::Text contained code to do formatting via termcap +sequences, although it wasn't turned on by default and it was problematic to +get it to work at all. This rewrite doesn't even try to do that, but a +subclass of it does. Look for L<Pod::Text::Termcap>. + +=head1 SEE ALSO + +L<Pod::Parser>, L<Pod::Text::Termcap>, L<pod2text(1)> + +The current version of this module is always available from its web site at +L<http://www.eyrie.org/~eagle/software/podlators/>. It is also part of the +Perl core distribution as of 5.6.0. + +=head1 AUTHOR + +Russ Allbery <rra@stanford.edu>, based I<very> heavily on the original +Pod::Text by Tom Christiansen <tchrist@mox.perl.com> and its conversion to +Pod::Parser by Brad Appleton <bradapp@enteract.com>. + +=head1 COPYRIGHT AND LICENSE + +Copyright 1999, 2000, 2001, 2002 by Russ Allbery <rra@stanford.edu>. + +This program is free software; you may redistribute it and/or modify it +under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Text/Color.pm b/Master/tlpkg/tlperl.old/lib/Pod/Text/Color.pm new file mode 100644 index 00000000000..2ba31369b96 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Text/Color.pm @@ -0,0 +1,145 @@ +# Pod::Text::Color -- Convert POD data to formatted color ASCII text +# $Id: Color.pm,v 1.4 2002/07/15 05:46:00 eagle Exp $ +# +# Copyright 1999, 2001 by Russ Allbery <rra@stanford.edu> +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. +# +# This is just a basic proof of concept. It should later be modified to make +# better use of color, take options changing what colors are used for what +# text, and the like. + +############################################################################## +# Modules and declarations +############################################################################## + +package Pod::Text::Color; + +require 5.004; + +use Pod::Text (); +use Term::ANSIColor qw(colored); + +use strict; +use vars qw(@ISA $VERSION); + +@ISA = qw(Pod::Text); + +# Don't use the CVS revision as the version, since this module is also in Perl +# core and too many things could munge CVS magic revision strings. This +# number should ideally be the same as the CVS revision in podlators, however. +$VERSION = 1.04; + + +############################################################################## +# Overrides +############################################################################## + +# Make level one headings bold. +sub cmd_head1 { + my $self = shift; + local $_ = shift; + s/\s+$//; + $self->SUPER::cmd_head1 (colored ($_, 'bold')); +} + +# Make level two headings bold. +sub cmd_head2 { + my $self = shift; + local $_ = shift; + s/\s+$//; + $self->SUPER::cmd_head2 (colored ($_, 'bold')); +} + +# Fix the various formatting codes. +sub seq_b { return colored ($_[1], 'bold') } +sub seq_f { return colored ($_[1], 'cyan') } +sub seq_i { return colored ($_[1], 'yellow') } + +# Output any included code in green. +sub output_code { + my ($self, $code) = @_; + $code = colored ($code, 'green'); + $self->output ($code); +} + +# We unfortunately have to override the wrapping code here, since the normal +# wrapping code gets really confused by all the escape sequences. +sub wrap { + my $self = shift; + local $_ = shift; + my $output = ''; + my $spaces = ' ' x $$self{MARGIN}; + my $width = $$self{width} - $$self{MARGIN}; + while (length > $width) { + if (s/^((?:(?:\e\[[\d;]+m)?[^\n]){0,$width})\s+// + || s/^((?:(?:\e\[[\d;]+m)?[^\n]){$width})//) { + $output .= $spaces . $1 . "\n"; + } else { + last; + } + } + $output .= $spaces . $_; + $output =~ s/\s+$/\n\n/; + $output; +} + +############################################################################## +# Module return value and documentation +############################################################################## + +1; +__END__ + +=head1 NAME + +Pod::Text::Color - Convert POD data to formatted color ASCII text + +=head1 SYNOPSIS + + use Pod::Text::Color; + my $parser = Pod::Text::Color->new (sentence => 0, width => 78); + + # Read POD from STDIN and write to STDOUT. + $parser->parse_from_filehandle; + + # Read POD from file.pod and write to file.txt. + $parser->parse_from_file ('file.pod', 'file.txt'); + +=head1 DESCRIPTION + +Pod::Text::Color is a simple subclass of Pod::Text that highlights output +text using ANSI color escape sequences. Apart from the color, it in all +ways functions like Pod::Text. See L<Pod::Text> for details and available +options. + +Term::ANSIColor is used to get colors and therefore must be installed to use +this module. + +=head1 BUGS + +This is just a basic proof of concept. It should be seriously expanded to +support configurable coloration via options passed to the constructor, and +B<pod2text> should be taught about those. + +=head1 SEE ALSO + +L<Pod::Text>, L<Pod::Parser> + +The current version of this module is always available from its web site at +L<http://www.eyrie.org/~eagle/software/podlators/>. It is also part of the +Perl core distribution as of 5.6.0. + +=head1 AUTHOR + +Russ Allbery <rra@stanford.edu>. + +=head1 COPYRIGHT AND LICENSE + +Copyright 1999, 2001 by Russ Allbery <rra@stanford.edu>. + +This program is free software; you may redistribute it and/or modify it +under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Text/Overstrike.pm b/Master/tlpkg/tlperl.old/lib/Pod/Text/Overstrike.pm new file mode 100644 index 00000000000..8ba918396c1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Text/Overstrike.pm @@ -0,0 +1,208 @@ +# Pod::Text::Overstrike -- Convert POD data to formatted overstrike text +# $Id: Overstrike.pm,v 1.10 2002/08/04 03:35:01 eagle Exp $ +# +# Created by Joe Smith <Joe.Smith@inwap.com> 30-Nov-2000 +# (based on Pod::Text::Color by Russ Allbery <rra@stanford.edu>) +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. +# +# This was written because the output from: +# +# pod2text Text.pm > plain.txt; less plain.txt +# +# is not as rich as the output from +# +# pod2man Text.pm | nroff -man > fancy.txt; less fancy.txt +# +# and because both Pod::Text::Color and Pod::Text::Termcap are not device +# independent. + +############################################################################## +# Modules and declarations +############################################################################## + +package Pod::Text::Overstrike; + +require 5.004; + +use Pod::Text (); + +use strict; +use vars qw(@ISA $VERSION); + +@ISA = qw(Pod::Text); + +# Don't use the CVS revision as the version, since this module is also in Perl +# core and too many things could munge CVS magic revision strings. This +# number should ideally be the same as the CVS revision in podlators, however. +$VERSION = 1.10; + + +############################################################################## +# Overrides +############################################################################## + +# Make level one headings bold, overridding any existing formatting. +sub cmd_head1 { + my ($self, $text, $line) = @_; + $text =~ s/\s+$//; + $text = $self->strip_format ($self->interpolate ($text, $line)); + $text =~ s/(.)/$1\b$1/g; + $self->SUPER::cmd_head1 ($text); +} + +# Make level two headings bold, overriding any existing formatting. +sub cmd_head2 { + my ($self, $text, $line) = @_; + $text =~ s/\s+$//; + $text = $self->strip_format ($self->interpolate ($text, $line)); + $text =~ s/(.)/$1\b$1/g; + $self->SUPER::cmd_head2 ($text); +} + +# Make level three headings underscored, overriding any existing formatting. +sub cmd_head3 { + my ($self, $text, $line) = @_; + $text =~ s/\s+$//; + $text = $self->strip_format ($self->interpolate ($text, $line)); + $text =~ s/(.)/_\b$1/g; + $self->SUPER::cmd_head3 ($text); +} + +# Level four headings look like level three headings. +sub cmd_head4 { + my ($self, $text, $line) = @_; + $text =~ s/\s+$//; + $text = $self->strip_format ($self->interpolate ($text, $line)); + $text =~ s/(.)/_\b$1/g; + $self->SUPER::cmd_head4 ($text); +} + +# The common code for handling all headers. We have to override to avoid +# interpolating twice and because we don't want to honor alt. +sub heading { + my ($self, $text, $line, $indent, $marker) = @_; + $self->item ("\n\n") if defined $$self{ITEM}; + $text .= "\n" if $$self{loose}; + my $margin = ' ' x ($$self{margin} + $indent); + $self->output ($margin . $text . "\n"); +} + +# Fix the various formatting codes. +sub seq_b { local $_ = strip_format (@_); s/(.)/$1\b$1/g; $_ } +sub seq_f { local $_ = strip_format (@_); s/(.)/_\b$1/g; $_ } +sub seq_i { local $_ = strip_format (@_); s/(.)/_\b$1/g; $_ } + +# Output any included code in bold. +sub output_code { + my ($self, $code) = @_; + $code =~ s/(.)/$1\b$1/g; + $self->output ($code); +} + +# We unfortunately have to override the wrapping code here, since the normal +# wrapping code gets really confused by all the backspaces. +sub wrap { + my $self = shift; + local $_ = shift; + my $output = ''; + my $spaces = ' ' x $$self{MARGIN}; + my $width = $$self{width} - $$self{MARGIN}; + while (length > $width) { + # This regex represents a single character, that's possibly underlined + # or in bold (in which case, it's three characters; the character, a + # backspace, and a character). Use [^\n] rather than . to protect + # against odd settings of $*. + my $char = '(?:[^\n][\b])?[^\n]'; + if (s/^((?>$char){0,$width})(?:\Z|\s+)//) { + $output .= $spaces . $1 . "\n"; + } else { + last; + } + } + $output .= $spaces . $_; + $output =~ s/\s+$/\n\n/; + $output; +} + +############################################################################## +# Utility functions +############################################################################## + +# Strip all of the formatting from a provided string, returning the stripped +# version. +sub strip_format { + my ($self, $text) = @_; + $text =~ s/(.)[\b]\1/$1/g; + $text =~ s/_[\b]//g; + return $text; +} + +############################################################################## +# Module return value and documentation +############################################################################## + +1; +__END__ + +=head1 NAME + +Pod::Text::Overstrike - Convert POD data to formatted overstrike text + +=head1 SYNOPSIS + + use Pod::Text::Overstrike; + my $parser = Pod::Text::Overstrike->new (sentence => 0, width => 78); + + # Read POD from STDIN and write to STDOUT. + $parser->parse_from_filehandle; + + # Read POD from file.pod and write to file.txt. + $parser->parse_from_file ('file.pod', 'file.txt'); + +=head1 DESCRIPTION + +Pod::Text::Overstrike is a simple subclass of Pod::Text that highlights +output text using overstrike sequences, in a manner similar to nroff. +Characters in bold text are overstruck (character, backspace, character) and +characters in underlined text are converted to overstruck underscores +(underscore, backspace, character). This format was originally designed for +hardcopy terminals and/or lineprinters, yet is readable on softcopy (CRT) +terminals. + +Overstruck text is best viewed by page-at-a-time programs that take +advantage of the terminal's B<stand-out> and I<underline> capabilities, such +as the less program on Unix. + +Apart from the overstrike, it in all ways functions like Pod::Text. See +L<Pod::Text> for details and available options. + +=head1 BUGS + +Currently, the outermost formatting instruction wins, so for example +underlined text inside a region of bold text is displayed as simply bold. +There may be some better approach possible. + +=head1 SEE ALSO + +L<Pod::Text>, L<Pod::Parser> + +The current version of this module is always available from its web site at +L<http://www.eyrie.org/~eagle/software/podlators/>. It is also part of the +Perl core distribution as of 5.6.0. + +=head1 AUTHOR + +Joe Smith <Joe.Smith@inwap.com>, using the framework created by Russ Allbery +<rra@stanford.edu>. + +=head1 COPYRIGHT AND LICENSE + +Copyright 2000 by Joe Smith <Joe.Smith@inwap.com>. +Copyright 2001 by Russ Allbery <rra@stanford.edu>. + +This program is free software; you may redistribute it and/or modify it +under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Text/Termcap.pm b/Master/tlpkg/tlperl.old/lib/Pod/Text/Termcap.pm new file mode 100644 index 00000000000..02a7fb9842a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Text/Termcap.pm @@ -0,0 +1,180 @@ +# Pod::Text::Termcap -- Convert POD data to ASCII text with format escapes. +# $Id: Termcap.pm,v 1.11 2003/07/09 21:52:30 eagle Exp $ +# +# Copyright 1999, 2001, 2002 by Russ Allbery <rra@stanford.edu> +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. +# +# This is a simple subclass of Pod::Text that overrides a few key methods to +# output the right termcap escape sequences for formatted text on the current +# terminal type. + +############################################################################## +# Modules and declarations +############################################################################## + +package Pod::Text::Termcap; + +require 5.004; + +use Pod::Text (); +use POSIX (); +use Term::Cap; + +use strict; +use vars qw(@ISA $VERSION); + +@ISA = qw(Pod::Text); + +# Don't use the CVS revision as the version, since this module is also in Perl +# core and too many things could munge CVS magic revision strings. This +# number should ideally be the same as the CVS revision in podlators, however. +$VERSION = 1.11; + + +############################################################################## +# Overrides +############################################################################## + +# In the initialization method, grab our terminal characteristics as well as +# do all the stuff we normally do. +sub initialize { + my $self = shift; + my ($ospeed, $term, $termios); + + # $ENV{HOME} is usually not set on Windows. The default Term::Cap path + # may not work on Solaris. + my $home = exists $ENV{HOME} ? "$ENV{HOME}/.termcap:" : ''; + $ENV{TERMPATH} = $home . '/etc/termcap:/usr/share/misc/termcap' + . ':/usr/share/lib/termcap'; + + # Fall back on a hard-coded terminal speed if POSIX::Termios isn't + # available (such as on VMS). + eval { $termios = POSIX::Termios->new }; + if ($@) { + $ospeed = 9600; + } else { + $termios->getattr; + $ospeed = $termios->getospeed || 9600; + } + + # Fall back on the ANSI escape sequences if Term::Cap doesn't work. + eval { $term = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed } }; + $$self{BOLD} = $$term{_md} || "\e[1m"; + $$self{UNDL} = $$term{_us} || "\e[4m"; + $$self{NORM} = $$term{_me} || "\e[m"; + + unless (defined $$self{width}) { + $$self{width} = $ENV{COLUMNS} || $$term{_co} || 80; + $$self{width} -= 2; + } + + $self->SUPER::initialize; +} + +# Make level one headings bold. +sub cmd_head1 { + my $self = shift; + local $_ = shift; + s/\s+$//; + $self->SUPER::cmd_head1 ("$$self{BOLD}$_$$self{NORM}"); +} + +# Make level two headings bold. +sub cmd_head2 { + my $self = shift; + local $_ = shift; + s/\s+$//; + $self->SUPER::cmd_head2 ("$$self{BOLD}$_$$self{NORM}"); +} + +# Fix up B<> and I<>. Note that we intentionally don't do F<>. +sub seq_b { my $self = shift; return "$$self{BOLD}$_[0]$$self{NORM}" } +sub seq_i { my $self = shift; return "$$self{UNDL}$_[0]$$self{NORM}" } + +# Output any included code in bold. +sub output_code { + my ($self, $code) = @_; + $self->output ($$self{BOLD} . $code . $$self{NORM}); +} + +# Override the wrapping code to igore the special sequences. +sub wrap { + my $self = shift; + local $_ = shift; + my $output = ''; + my $spaces = ' ' x $$self{MARGIN}; + my $width = $$self{width} - $$self{MARGIN}; + my $code = "(?:\Q$$self{BOLD}\E|\Q$$self{UNDL}\E|\Q$$self{NORM}\E)"; + while (length > $width) { + if (s/^((?:$code?[^\n]){0,$width})\s+// + || s/^((?:$code?[^\n]){$width})//) { + $output .= $spaces . $1 . "\n"; + } else { + last; + } + } + $output .= $spaces . $_; + $output =~ s/\s+$/\n\n/; + $output; +} + + +############################################################################## +# Module return value and documentation +############################################################################## + +1; +__END__ + +=head1 NAME + +Pod::Text::Termcap - Convert POD data to ASCII text with format escapes + +=head1 SYNOPSIS + + use Pod::Text::Termcap; + my $parser = Pod::Text::Termcap->new (sentence => 0, width => 78); + + # Read POD from STDIN and write to STDOUT. + $parser->parse_from_filehandle; + + # Read POD from file.pod and write to file.txt. + $parser->parse_from_file ('file.pod', 'file.txt'); + +=head1 DESCRIPTION + +Pod::Text::Termcap is a simple subclass of Pod::Text that highlights output +text using the correct termcap escape sequences for the current terminal. +Apart from the format codes, it in all ways functions like Pod::Text. See +L<Pod::Text> for details and available options. + +=head1 NOTES + +This module uses Term::Cap to retrieve the formatting escape sequences for +the current terminal, and falls back on the ECMA-48 (the same in this +regard as ANSI X3.64 and ISO 6429, the escape codes also used by DEC VT100 +terminals) if the bold, underline, and reset codes aren't set in the +termcap information. + +=head1 SEE ALSO + +L<Pod::Text>, L<Pod::Parser>, L<Term::Cap> + +The current version of this module is always available from its web site at +L<http://www.eyrie.org/~eagle/software/podlators/>. It is also part of the +Perl core distribution as of 5.6.0. + +=head1 AUTHOR + +Russ Allbery <rra@stanford.edu>. + +=head1 COPYRIGHT AND LICENSE + +Copyright 1999, 2001, 2002 by Russ Allbery <rra@stanford.edu>. + +This program is free software; you may redistribute it and/or modify it +under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Pod/Usage.pm b/Master/tlpkg/tlperl.old/lib/Pod/Usage.pm new file mode 100644 index 00000000000..c298e941f21 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Pod/Usage.pm @@ -0,0 +1,659 @@ +############################################################################# +# Pod/Usage.pm -- print usage messages for the running script. +# +# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved. +# This file is part of "PodParser". PodParser is free software; +# you can redistribute it and/or modify it under the same terms +# as Perl itself. +############################################################################# + +package Pod::Usage; + +use vars qw($VERSION); +$VERSION = 1.33; ## Current version of this package +require 5.005; ## requires this Perl version or later + +=head1 NAME + +Pod::Usage, pod2usage() - print a usage message from embedded pod documentation + +=head1 SYNOPSIS + + use Pod::Usage + + my $message_text = "This text precedes the usage message."; + my $exit_status = 2; ## The exit status to use + my $verbose_level = 0; ## The verbose level to use + my $filehandle = \*STDERR; ## The filehandle to write to + + pod2usage($message_text); + + pod2usage($exit_status); + + pod2usage( { -message => $message_text , + -exitval => $exit_status , + -verbose => $verbose_level, + -output => $filehandle } ); + + pod2usage( -msg => $message_text , + -exitval => $exit_status , + -verbose => $verbose_level, + -output => $filehandle ); + + pod2usage( -verbose => 2, + -noperldoc => 1 ) + +=head1 ARGUMENTS + +B<pod2usage> should be given either a single argument, or a list of +arguments corresponding to an associative array (a "hash"). When a single +argument is given, it should correspond to exactly one of the following: + +=over 4 + +=item * + +A string containing the text of a message to print I<before> printing +the usage message + +=item * + +A numeric value corresponding to the desired exit status + +=item * + +A reference to a hash + +=back + +If more than one argument is given then the entire argument list is +assumed to be a hash. If a hash is supplied (either as a reference or +as a list) it should contain one or more elements with the following +keys: + +=over 4 + +=item C<-message> + +=item C<-msg> + +The text of a message to print immediately prior to printing the +program's usage message. + +=item C<-exitval> + +The desired exit status to pass to the B<exit()> function. +This should be an integer, or else the string "NOEXIT" to +indicate that control should simply be returned without +terminating the invoking process. + +=item C<-verbose> + +The desired level of "verboseness" to use when printing the usage +message. If the corresponding value is 0, then only the "SYNOPSIS" +section of the pod documentation is printed. If the corresponding value +is 1, then the "SYNOPSIS" section, along with any section entitled +"OPTIONS", "ARGUMENTS", or "OPTIONS AND ARGUMENTS" is printed. If the +corresponding value is 2 or more then the entire manpage is printed. + +The special verbosity level 99 requires to also specify the -section +parameter; then these sections are extracted (see L<Pod::Select>) +and printed. + +=item C<-section> + +A string representing a selection list for sections to be printed +when -verbose is set to 99, e.g. C<"NAME|SYNOPSIS|DESCRIPTION|VERSION">. + +=item C<-output> + +A reference to a filehandle, or the pathname of a file to which the +usage message should be written. The default is C<\*STDERR> unless the +exit value is less than 2 (in which case the default is C<\*STDOUT>). + +=item C<-input> + +A reference to a filehandle, or the pathname of a file from which the +invoking script's pod documentation should be read. It defaults to the +file indicated by C<$0> (C<$PROGRAM_NAME> for users of F<English.pm>). + +=item C<-pathlist> + +A list of directory paths. If the input file does not exist, then it +will be searched for in the given directory list (in the order the +directories appear in the list). It defaults to the list of directories +implied by C<$ENV{PATH}>. The list may be specified either by a reference +to an array, or by a string of directory paths which use the same path +separator as C<$ENV{PATH}> on your system (e.g., C<:> for Unix, C<;> for +MSWin32 and DOS). + +=item C<-noperldoc> + +By default, Pod::Usage will call L<perldoc> when -verbose >= 2 is +specified. This does not work well e.g. if the script was packed +with L<PAR>. The -noperldoc option suppresses the external call to +L<perldoc> and uses the simple text formatter (L<Pod::Text>) to +output the POD. + +=back + +=head1 DESCRIPTION + +B<pod2usage> will print a usage message for the invoking script (using +its embedded pod documentation) and then exit the script with the +desired exit status. The usage message printed may have any one of three +levels of "verboseness": If the verbose level is 0, then only a synopsis +is printed. If the verbose level is 1, then the synopsis is printed +along with a description (if present) of the command line options and +arguments. If the verbose level is 2, then the entire manual page is +printed. + +Unless they are explicitly specified, the default values for the exit +status, verbose level, and output stream to use are determined as +follows: + +=over 4 + +=item * + +If neither the exit status nor the verbose level is specified, then the +default is to use an exit status of 2 with a verbose level of 0. + +=item * + +If an exit status I<is> specified but the verbose level is I<not>, then the +verbose level will default to 1 if the exit status is less than 2 and +will default to 0 otherwise. + +=item * + +If an exit status is I<not> specified but verbose level I<is> given, then +the exit status will default to 2 if the verbose level is 0 and will +default to 1 otherwise. + +=item * + +If the exit status used is less than 2, then output is printed on +C<STDOUT>. Otherwise output is printed on C<STDERR>. + +=back + +Although the above may seem a bit confusing at first, it generally does +"the right thing" in most situations. This determination of the default +values to use is based upon the following typical Unix conventions: + +=over 4 + +=item * + +An exit status of 0 implies "success". For example, B<diff(1)> exits +with a status of 0 if the two files have the same contents. + +=item * + +An exit status of 1 implies possibly abnormal, but non-defective, program +termination. For example, B<grep(1)> exits with a status of 1 if +it did I<not> find a matching line for the given regular expression. + +=item * + +An exit status of 2 or more implies a fatal error. For example, B<ls(1)> +exits with a status of 2 if you specify an illegal (unknown) option on +the command line. + +=item * + +Usage messages issued as a result of bad command-line syntax should go +to C<STDERR>. However, usage messages issued due to an explicit request +to print usage (like specifying B<-help> on the command line) should go +to C<STDOUT>, just in case the user wants to pipe the output to a pager +(such as B<more(1)>). + +=item * + +If program usage has been explicitly requested by the user, it is often +desireable to exit with a status of 1 (as opposed to 0) after issuing +the user-requested usage message. It is also desireable to give a +more verbose description of program usage in this case. + +=back + +B<pod2usage> doesn't force the above conventions upon you, but it will +use them by default if you don't expressly tell it to do otherwise. The +ability of B<pod2usage()> to accept a single number or a string makes it +convenient to use as an innocent looking error message handling function: + + use Pod::Usage; + use Getopt::Long; + + ## Parse options + GetOptions("help", "man", "flag1") || pod2usage(2); + pod2usage(1) if ($opt_help); + pod2usage(-verbose => 2) if ($opt_man); + + ## Check for too many filenames + pod2usage("$0: Too many files given.\n") if (@ARGV > 1); + +Some user's however may feel that the above "economy of expression" is +not particularly readable nor consistent and may instead choose to do +something more like the following: + + use Pod::Usage; + use Getopt::Long; + + ## Parse options + GetOptions("help", "man", "flag1") || pod2usage(-verbose => 0); + pod2usage(-verbose => 1) if ($opt_help); + pod2usage(-verbose => 2) if ($opt_man); + + ## Check for too many filenames + pod2usage(-verbose => 2, -message => "$0: Too many files given.\n") + if (@ARGV > 1); + +As with all things in Perl, I<there's more than one way to do it>, and +B<pod2usage()> adheres to this philosophy. If you are interested in +seeing a number of different ways to invoke B<pod2usage> (although by no +means exhaustive), please refer to L<"EXAMPLES">. + +=head1 EXAMPLES + +Each of the following invocations of C<pod2usage()> will print just the +"SYNOPSIS" section to C<STDERR> and will exit with a status of 2: + + pod2usage(); + + pod2usage(2); + + pod2usage(-verbose => 0); + + pod2usage(-exitval => 2); + + pod2usage({-exitval => 2, -output => \*STDERR}); + + pod2usage({-verbose => 0, -output => \*STDERR}); + + pod2usage(-exitval => 2, -verbose => 0); + + pod2usage(-exitval => 2, -verbose => 0, -output => \*STDERR); + +Each of the following invocations of C<pod2usage()> will print a message +of "Syntax error." (followed by a newline) to C<STDERR>, immediately +followed by just the "SYNOPSIS" section (also printed to C<STDERR>) and +will exit with a status of 2: + + pod2usage("Syntax error."); + + pod2usage(-message => "Syntax error.", -verbose => 0); + + pod2usage(-msg => "Syntax error.", -exitval => 2); + + pod2usage({-msg => "Syntax error.", -exitval => 2, -output => \*STDERR}); + + pod2usage({-msg => "Syntax error.", -verbose => 0, -output => \*STDERR}); + + pod2usage(-msg => "Syntax error.", -exitval => 2, -verbose => 0); + + pod2usage(-message => "Syntax error.", + -exitval => 2, + -verbose => 0, + -output => \*STDERR); + +Each of the following invocations of C<pod2usage()> will print the +"SYNOPSIS" section and any "OPTIONS" and/or "ARGUMENTS" sections to +C<STDOUT> and will exit with a status of 1: + + pod2usage(1); + + pod2usage(-verbose => 1); + + pod2usage(-exitval => 1); + + pod2usage({-exitval => 1, -output => \*STDOUT}); + + pod2usage({-verbose => 1, -output => \*STDOUT}); + + pod2usage(-exitval => 1, -verbose => 1); + + pod2usage(-exitval => 1, -verbose => 1, -output => \*STDOUT}); + +Each of the following invocations of C<pod2usage()> will print the +entire manual page to C<STDOUT> and will exit with a status of 1: + + pod2usage(-verbose => 2); + + pod2usage({-verbose => 2, -output => \*STDOUT}); + + pod2usage(-exitval => 1, -verbose => 2); + + pod2usage({-exitval => 1, -verbose => 2, -output => \*STDOUT}); + +=head2 Recommended Use + +Most scripts should print some type of usage message to C<STDERR> when a +command line syntax error is detected. They should also provide an +option (usually C<-H> or C<-help>) to print a (possibly more verbose) +usage message to C<STDOUT>. Some scripts may even wish to go so far as to +provide a means of printing their complete documentation to C<STDOUT> +(perhaps by allowing a C<-man> option). The following complete example +uses B<Pod::Usage> in combination with B<Getopt::Long> to do all of these +things: + + use Getopt::Long; + use Pod::Usage; + + my $man = 0; + my $help = 0; + ## Parse options and print usage if there is a syntax error, + ## or if usage was explicitly requested. + GetOptions('help|?' => \$help, man => \$man) or pod2usage(2); + pod2usage(1) if $help; + pod2usage(-verbose => 2) if $man; + + ## If no arguments were given, then allow STDIN to be used only + ## if it's not connected to a terminal (otherwise print usage) + pod2usage("$0: No files given.") if ((@ARGV == 0) && (-t STDIN)); + __END__ + + =head1 NAME + + sample - Using GetOpt::Long and Pod::Usage + + =head1 SYNOPSIS + + sample [options] [file ...] + + Options: + -help brief help message + -man full documentation + + =head1 OPTIONS + + =over 8 + + =item B<-help> + + Print a brief help message and exits. + + =item B<-man> + + Prints the manual page and exits. + + =back + + =head1 DESCRIPTION + + B<This program> will read the given input file(s) and do something + useful with the contents thereof. + + =cut + +=head1 CAVEATS + +By default, B<pod2usage()> will use C<$0> as the path to the pod input +file. Unfortunately, not all systems on which Perl runs will set C<$0> +properly (although if C<$0> isn't found, B<pod2usage()> will search +C<$ENV{PATH}> or else the list specified by the C<-pathlist> option). +If this is the case for your system, you may need to explicitly specify +the path to the pod docs for the invoking script using something +similar to the following: + + pod2usage(-exitval => 2, -input => "/path/to/your/pod/docs"); + +In the pathological case that a script is called via a relative path +I<and> the script itself changes the current working directory +(see L<perlfunc/chdir>) I<before> calling pod2usage, Pod::Usage will +fail even on robust platforms. Don't do that. + +=head1 AUTHOR + +Please report bugs using L<http://rt.cpan.org>. + +Brad Appleton E<lt>bradapp@enteract.comE<gt> + +Based on code for B<Pod::Text::pod2text()> written by +Tom Christiansen E<lt>tchrist@mox.perl.comE<gt> + +=head1 ACKNOWLEDGEMENTS + +Steven McDougall E<lt>swmcd@world.std.comE<gt> for his help and patience +with re-writing this manpage. + +=cut + +############################################################################# + +use strict; +#use diagnostics; +use Carp; +use Config; +use Exporter; +use File::Spec; + +use vars qw(@ISA @EXPORT); +@EXPORT = qw(&pod2usage); +BEGIN { + if ( $] >= 5.005_58 ) { + require Pod::Text; + @ISA = qw( Pod::Text ); + } + else { + require Pod::PlainText; + @ISA = qw( Pod::PlainText ); + } +} + + +##--------------------------------------------------------------------------- + +##--------------------------------- +## Function definitions begin here +##--------------------------------- + +sub pod2usage { + local($_) = shift; + my %opts; + ## Collect arguments + if (@_ > 0) { + ## Too many arguments - assume that this is a hash and + ## the user forgot to pass a reference to it. + %opts = ($_, @_); + } + elsif (!defined $_) { + $_ = ""; + } + elsif (ref $_) { + ## User passed a ref to a hash + %opts = %{$_} if (ref($_) eq 'HASH'); + } + elsif (/^[-+]?\d+$/) { + ## User passed in the exit value to use + $opts{"-exitval"} = $_; + } + else { + ## User passed in a message to print before issuing usage. + $_ and $opts{"-message"} = $_; + } + + ## Need this for backward compatibility since we formerly used + ## options that were all uppercase words rather than ones that + ## looked like Unix command-line options. + ## to be uppercase keywords) + %opts = map { + my $val = $opts{$_}; + s/^(?=\w)/-/; + /^-msg/i and $_ = '-message'; + /^-exit/i and $_ = '-exitval'; + lc($_) => $val; + } (keys %opts); + + ## Now determine default -exitval and -verbose values to use + if ((! defined $opts{"-exitval"}) && (! defined $opts{"-verbose"})) { + $opts{"-exitval"} = 2; + $opts{"-verbose"} = 0; + } + elsif (! defined $opts{"-exitval"}) { + $opts{"-exitval"} = ($opts{"-verbose"} > 0) ? 1 : 2; + } + elsif (! defined $opts{"-verbose"}) { + $opts{"-verbose"} = (lc($opts{"-exitval"}) eq "noexit" || + $opts{"-exitval"} < 2); + } + + ## Default the output file + $opts{"-output"} = (lc($opts{"-exitval"}) eq "noexit" || + $opts{"-exitval"} < 2) ? \*STDOUT : \*STDERR + unless (defined $opts{"-output"}); + ## Default the input file + $opts{"-input"} = $0 unless (defined $opts{"-input"}); + + ## Look up input file in path if it doesnt exist. + unless ((ref $opts{"-input"}) || (-e $opts{"-input"})) { + my ($dirname, $basename) = ('', $opts{"-input"}); + my $pathsep = ($^O =~ /^(?:dos|os2|MSWin32)$/) ? ";" + : (($^O eq 'MacOS' || $^O eq 'VMS') ? ',' : ":"); + my $pathspec = $opts{"-pathlist"} || $ENV{PATH} || $ENV{PERL5LIB}; + + my @paths = (ref $pathspec) ? @$pathspec : split($pathsep, $pathspec); + for $dirname (@paths) { + $_ = File::Spec->catfile($dirname, $basename) if length; + last if (-e $_) && ($opts{"-input"} = $_); + } + } + + ## Now create a pod reader and constrain it to the desired sections. + my $parser = new Pod::Usage(USAGE_OPTIONS => \%opts); + if ($opts{"-verbose"} == 0) { + $parser->select('SYNOPSIS\s*'); + } + elsif ($opts{"-verbose"} == 1) { + my $opt_re = '(?i)' . + '(?:OPTIONS|ARGUMENTS)' . + '(?:\s*(?:AND|\/)\s*(?:OPTIONS|ARGUMENTS))?'; + $parser->select( 'SYNOPSIS', $opt_re, "DESCRIPTION/$opt_re" ); + } + elsif ($opts{"-verbose"} == 99) { + $parser->select( $opts{"-sections"} ); + $opts{"-verbose"} = 1; + } + + ## Now translate the pod document and then exit with the desired status + if ( !$opts{"-noperldoc"} + and $opts{"-verbose"} >= 2 + and !ref($opts{"-input"}) + and $opts{"-output"} == \*STDOUT ) + { + ## spit out the entire PODs. Might as well invoke perldoc + my $progpath = File::Spec->catfile($Config{scriptdir}, "perldoc"); + system($progpath, $opts{"-input"}); + } + else { + $parser->parse_from_file($opts{"-input"}, $opts{"-output"}); + } + + exit($opts{"-exitval"}) unless (lc($opts{"-exitval"}) eq 'noexit'); +} + +##--------------------------------------------------------------------------- + +##------------------------------- +## Method definitions begin here +##------------------------------- + +sub new { + my $this = shift; + my $class = ref($this) || $this; + my %params = @_; + my $self = {%params}; + bless $self, $class; + if ($self->can('initialize')) { + $self->initialize(); + } else { + $self = $self->SUPER::new(); + %$self = (%$self, %params); + } + return $self; +} + +sub select { + my ($self, @res) = @_; + if ($ISA[0]->can('select')) { + $self->SUPER::select(@_); + } else { + $self->{USAGE_SELECT} = \@res; + } +} + +# Override Pod::Text->seq_i to return just "arg", not "*arg*". +sub seq_i { return $_[1] } + +# This overrides the Pod::Text method to do something very akin to what +# Pod::Select did as well as the work done below by preprocess_paragraph. +# Note that the below is very, very specific to Pod::Text. +sub _handle_element_end { + my ($self, $element) = @_; + if ($element eq 'head1') { + $$self{USAGE_HEAD1} = $$self{PENDING}[-1][1]; + $$self{PENDING}[-1][1] =~ s/^\s*SYNOPSIS\s*$/USAGE/; + } elsif ($element eq 'head2') { + $$self{USAGE_HEAD2} = $$self{PENDING}[-1][1]; + } + if ($element eq 'head1' || $element eq 'head2') { + $$self{USAGE_SKIPPING} = 1; + my $heading = $$self{USAGE_HEAD1}; + $heading .= '/' . $$self{USAGE_HEAD2} if defined $$self{USAGE_HEAD2}; + for (@{ $$self{USAGE_SELECT} }) { + if ($heading =~ /^$_\s*$/) { + $$self{USAGE_SKIPPING} = 0; + last; + } + } + + # Try to do some lowercasing instead of all-caps in headings, and use + # a colon to end all headings. + local $_ = $$self{PENDING}[-1][1]; + s{([A-Z])([A-Z]+)}{((length($2) > 2) ? $1 : lc($1)) . lc($2)}ge; + s/\s*$/:/ unless (/:\s*$/); + $_ .= "\n"; + $$self{PENDING}[-1][1] = $_; + } + if ($$self{USAGE_SKIPPING}) { + pop @{ $$self{PENDING} }; + } else { + $self->SUPER::_handle_element_end($element); + } +} + +sub start_document { + my $self = shift; + $self->SUPER::start_document(); + my $msg = $self->{USAGE_OPTIONS}->{-message} or return 1; + my $out_fh = $self->output_fh(); + print $out_fh "$msg\n"; +} + +sub begin_pod { + my $self = shift; + $self->SUPER::begin_pod(); ## Have to call superclass + my $msg = $self->{USAGE_OPTIONS}->{-message} or return 1; + my $out_fh = $self->output_handle(); + print $out_fh "$msg\n"; +} + +sub preprocess_paragraph { + my $self = shift; + local $_ = shift; + my $line = shift; + ## See if this is a heading and we arent printing the entire manpage. + if (($self->{USAGE_OPTIONS}->{-verbose} < 2) && /^=head/) { + ## Change the title of the SYNOPSIS section to USAGE + s/^=head1\s+SYNOPSIS\s*$/=head1 USAGE/; + ## Try to do some lowercasing instead of all-caps in headings + s{([A-Z])([A-Z]+)}{((length($2) > 2) ? $1 : lc($1)) . lc($2)}ge; + ## Use a colon to end all headings + s/\s*$/:/ unless (/:\s*$/); + $_ .= "\n"; + } + return $self->SUPER::preprocess_paragraph($_); +} + +1; # keep require happy diff --git a/Master/tlpkg/tlperl.old/lib/Safe.pm b/Master/tlpkg/tlperl.old/lib/Safe.pm new file mode 100644 index 00000000000..e2a608023ca --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Safe.pm @@ -0,0 +1,576 @@ +package Safe; + +use 5.003_11; +use strict; + +$Safe::VERSION = "2.12"; + +# *** Don't declare any lexicals above this point *** +# +# This function should return a closure which contains an eval that can't +# see any lexicals in scope (apart from __ExPr__ which is unavoidable) + +sub lexless_anon_sub { + # $_[0] is package; + # $_[1] is strict flag; + my $__ExPr__ = $_[2]; # must be a lexical to create the closure that + # can be used to pass the value into the safe + # world + + # Create anon sub ref in root of compartment. + # Uses a closure (on $__ExPr__) to pass in the code to be executed. + # (eval on one line to keep line numbers as expected by caller) + eval sprintf + 'package %s; %s strict; sub { @_=(); eval q[my $__ExPr__;] . $__ExPr__; }', + $_[0], $_[1] ? 'use' : 'no'; +} + +use Carp; +use Carp::Heavy; + +use Opcode 1.01, qw( + opset opset_to_ops opmask_add + empty_opset full_opset invert_opset verify_opset + opdesc opcodes opmask define_optag opset_to_hex +); + +*ops_to_opset = \&opset; # Temporary alias for old Penguins + + +my $default_root = 0; +my $default_share = ['*_']; #, '*main::']; + +sub new { + my($class, $root, $mask) = @_; + my $obj = {}; + bless $obj, $class; + + if (defined($root)) { + croak "Can't use \"$root\" as root name" + if $root =~ /^main\b/ or $root !~ /^\w[:\w]*$/; + $obj->{Root} = $root; + $obj->{Erase} = 0; + } + else { + $obj->{Root} = "Safe::Root".$default_root++; + $obj->{Erase} = 1; + } + + # use permit/deny methods instead till interface issues resolved + # XXX perhaps new Safe 'Root', mask => $mask, foo => bar, ...; + croak "Mask parameter to new no longer supported" if defined $mask; + $obj->permit_only(':default'); + + # We must share $_ and @_ with the compartment or else ops such + # as split, length and so on won't default to $_ properly, nor + # will passing argument to subroutines work (via @_). In fact, + # for reasons I don't completely understand, we need to share + # the whole glob *_ rather than $_ and @_ separately, otherwise + # @_ in non default packages within the compartment don't work. + $obj->share_from('main', $default_share); + Opcode::_safe_pkg_prep($obj->{Root}) if($Opcode::VERSION > 1.04); + return $obj; +} + +sub DESTROY { + my $obj = shift; + $obj->erase('DESTROY') if $obj->{Erase}; +} + +sub erase { + my ($obj, $action) = @_; + my $pkg = $obj->root(); + my ($stem, $leaf); + + no strict 'refs'; + $pkg = "main::$pkg\::"; # expand to full symbol table name + ($stem, $leaf) = $pkg =~ m/(.*::)(\w+::)$/; + + # The 'my $foo' is needed! Without it you get an + # 'Attempt to free unreferenced scalar' warning! + my $stem_symtab = *{$stem}{HASH}; + + #warn "erase($pkg) stem=$stem, leaf=$leaf"; + #warn " stem_symtab hash ".scalar(%$stem_symtab)."\n"; + # ", join(', ', %$stem_symtab),"\n"; + +# delete $stem_symtab->{$leaf}; + + my $leaf_glob = $stem_symtab->{$leaf}; + my $leaf_symtab = *{$leaf_glob}{HASH}; +# warn " leaf_symtab ", join(', ', %$leaf_symtab),"\n"; + %$leaf_symtab = (); + #delete $leaf_symtab->{'__ANON__'}; + #delete $leaf_symtab->{'foo'}; + #delete $leaf_symtab->{'main::'}; +# my $foo = undef ${"$stem\::"}{"$leaf\::"}; + + if ($action and $action eq 'DESTROY') { + delete $stem_symtab->{$leaf}; + } else { + $obj->share_from('main', $default_share); + } + 1; +} + + +sub reinit { + my $obj= shift; + $obj->erase; + $obj->share_redo; +} + +sub root { + my $obj = shift; + croak("Safe root method now read-only") if @_; + return $obj->{Root}; +} + + +sub mask { + my $obj = shift; + return $obj->{Mask} unless @_; + $obj->deny_only(@_); +} + +# v1 compatibility methods +sub trap { shift->deny(@_) } +sub untrap { shift->permit(@_) } + +sub deny { + my $obj = shift; + $obj->{Mask} |= opset(@_); +} +sub deny_only { + my $obj = shift; + $obj->{Mask} = opset(@_); +} + +sub permit { + my $obj = shift; + # XXX needs testing + $obj->{Mask} &= invert_opset opset(@_); +} +sub permit_only { + my $obj = shift; + $obj->{Mask} = invert_opset opset(@_); +} + + +sub dump_mask { + my $obj = shift; + print opset_to_hex($obj->{Mask}),"\n"; +} + + + +sub share { + my($obj, @vars) = @_; + $obj->share_from(scalar(caller), \@vars); +} + +sub share_from { + my $obj = shift; + my $pkg = shift; + my $vars = shift; + my $no_record = shift || 0; + my $root = $obj->root(); + croak("vars not an array ref") unless ref $vars eq 'ARRAY'; + no strict 'refs'; + # Check that 'from' package actually exists + croak("Package \"$pkg\" does not exist") + unless keys %{"$pkg\::"}; + my $arg; + foreach $arg (@$vars) { + # catch some $safe->share($var) errors: + croak("'$arg' not a valid symbol table name") + unless $arg =~ /^[\$\@%*&]?\w[\w:]*$/ + or $arg =~ /^\$\W$/; + my ($var, $type); + $type = $1 if ($var = $arg) =~ s/^(\W)//; + # warn "share_from $pkg $type $var"; + *{$root."::$var"} = (!$type) ? \&{$pkg."::$var"} + : ($type eq '&') ? \&{$pkg."::$var"} + : ($type eq '$') ? \${$pkg."::$var"} + : ($type eq '@') ? \@{$pkg."::$var"} + : ($type eq '%') ? \%{$pkg."::$var"} + : ($type eq '*') ? *{$pkg."::$var"} + : croak(qq(Can't share "$type$var" of unknown type)); + } + $obj->share_record($pkg, $vars) unless $no_record or !$vars; +} + +sub share_record { + my $obj = shift; + my $pkg = shift; + my $vars = shift; + my $shares = \%{$obj->{Shares} ||= {}}; + # Record shares using keys of $obj->{Shares}. See reinit. + @{$shares}{@$vars} = ($pkg) x @$vars if @$vars; +} +sub share_redo { + my $obj = shift; + my $shares = \%{$obj->{Shares} ||= {}}; + my($var, $pkg); + while(($var, $pkg) = each %$shares) { + # warn "share_redo $pkg\:: $var"; + $obj->share_from($pkg, [ $var ], 1); + } +} +sub share_forget { + delete shift->{Shares}; +} + +sub varglob { + my ($obj, $var) = @_; + no strict 'refs'; + return *{$obj->root()."::$var"}; +} + + +sub reval { + my ($obj, $expr, $strict) = @_; + my $root = $obj->{Root}; + + my $evalsub = lexless_anon_sub($root,$strict, $expr); + return Opcode::_safe_call_sv($root, $obj->{Mask}, $evalsub); +} + +sub rdo { + my ($obj, $file) = @_; + my $root = $obj->{Root}; + + my $evalsub = eval + sprintf('package %s; sub { @_ = (); do $file }', $root); + return Opcode::_safe_call_sv($root, $obj->{Mask}, $evalsub); +} + + +1; + +__END__ + +=head1 NAME + +Safe - Compile and execute code in restricted compartments + +=head1 SYNOPSIS + + use Safe; + + $compartment = new Safe; + + $compartment->permit(qw(time sort :browse)); + + $result = $compartment->reval($unsafe_code); + +=head1 DESCRIPTION + +The Safe extension module allows the creation of compartments +in which perl code can be evaluated. Each compartment has + +=over 8 + +=item a new namespace + +The "root" of the namespace (i.e. "main::") is changed to a +different package and code evaluated in the compartment cannot +refer to variables outside this namespace, even with run-time +glob lookups and other tricks. + +Code which is compiled outside the compartment can choose to place +variables into (or I<share> variables with) the compartment's namespace +and only that data will be visible to code evaluated in the +compartment. + +By default, the only variables shared with compartments are the +"underscore" variables $_ and @_ (and, technically, the less frequently +used %_, the _ filehandle and so on). This is because otherwise perl +operators which default to $_ will not work and neither will the +assignment of arguments to @_ on subroutine entry. + +=item an operator mask + +Each compartment has an associated "operator mask". Recall that +perl code is compiled into an internal format before execution. +Evaluating perl code (e.g. via "eval" or "do 'file'") causes +the code to be compiled into an internal format and then, +provided there was no error in the compilation, executed. +Code evaluated in a compartment compiles subject to the +compartment's operator mask. Attempting to evaluate code in a +compartment which contains a masked operator will cause the +compilation to fail with an error. The code will not be executed. + +The default operator mask for a newly created compartment is +the ':default' optag. + +It is important that you read the Opcode(3) module documentation +for more information, especially for detailed definitions of opnames, +optags and opsets. + +Since it is only at the compilation stage that the operator mask +applies, controlled access to potentially unsafe operations can +be achieved by having a handle to a wrapper subroutine (written +outside the compartment) placed into the compartment. For example, + + $cpt = new Safe; + sub wrapper { + # vet arguments and perform potentially unsafe operations + } + $cpt->share('&wrapper'); + +=back + + +=head1 WARNING + +The authors make B<no warranty>, implied or otherwise, about the +suitability of this software for safety or security purposes. + +The authors shall not in any case be liable for special, incidental, +consequential, indirect or other similar damages arising from the use +of this software. + +Your mileage will vary. If in any doubt B<do not use it>. + + +=head2 RECENT CHANGES + +The interface to the Safe module has changed quite dramatically since +version 1 (as supplied with Perl5.002). Study these pages carefully if +you have code written to use Safe version 1 because you will need to +makes changes. + + +=head2 Methods in class Safe + +To create a new compartment, use + + $cpt = new Safe; + +Optional argument is (NAMESPACE), where NAMESPACE is the root namespace +to use for the compartment (defaults to "Safe::Root0", incremented for +each new compartment). + +Note that version 1.00 of the Safe module supported a second optional +parameter, MASK. That functionality has been withdrawn pending deeper +consideration. Use the permit and deny methods described below. + +The following methods can then be used on the compartment +object returned by the above constructor. The object argument +is implicit in each case. + + +=over 8 + +=item permit (OP, ...) + +Permit the listed operators to be used when compiling code in the +compartment (in I<addition> to any operators already permitted). + +You can list opcodes by names, or use a tag name; see +L<Opcode/"Predefined Opcode Tags">. + +=item permit_only (OP, ...) + +Permit I<only> the listed operators to be used when compiling code in +the compartment (I<no> other operators are permitted). + +=item deny (OP, ...) + +Deny the listed operators from being used when compiling code in the +compartment (other operators may still be permitted). + +=item deny_only (OP, ...) + +Deny I<only> the listed operators from being used when compiling code +in the compartment (I<all> other operators will be permitted). + +=item trap (OP, ...) + +=item untrap (OP, ...) + +The trap and untrap methods are synonyms for deny and permit +respectfully. + +=item share (NAME, ...) + +This shares the variable(s) in the argument list with the compartment. +This is almost identical to exporting variables using the L<Exporter> +module. + +Each NAME must be the B<name> of a non-lexical variable, typically +with the leading type identifier included. A bareword is treated as a +function name. + +Examples of legal names are '$foo' for a scalar, '@foo' for an +array, '%foo' for a hash, '&foo' or 'foo' for a subroutine and '*foo' +for a glob (i.e. all symbol table entries associated with "foo", +including scalar, array, hash, sub and filehandle). + +Each NAME is assumed to be in the calling package. See share_from +for an alternative method (which share uses). + +=item share_from (PACKAGE, ARRAYREF) + +This method is similar to share() but allows you to explicitly name the +package that symbols should be shared from. The symbol names (including +type characters) are supplied as an array reference. + + $safe->share_from('main', [ '$foo', '%bar', 'func' ]); + + +=item varglob (VARNAME) + +This returns a glob reference for the symbol table entry of VARNAME in +the package of the compartment. VARNAME must be the B<name> of a +variable without any leading type marker. For example, + + $cpt = new Safe 'Root'; + $Root::foo = "Hello world"; + # Equivalent version which doesn't need to know $cpt's package name: + ${$cpt->varglob('foo')} = "Hello world"; + + +=item reval (STRING) + +This evaluates STRING as perl code inside the compartment. + +The code can only see the compartment's namespace (as returned by the +B<root> method). The compartment's root package appears to be the +C<main::> package to the code inside the compartment. + +Any attempt by the code in STRING to use an operator which is not permitted +by the compartment will cause an error (at run-time of the main program +but at compile-time for the code in STRING). The error is of the form +"'%s' trapped by operation mask...". + +If an operation is trapped in this way, then the code in STRING will +not be executed. If such a trapped operation occurs or any other +compile-time or return error, then $@ is set to the error message, just +as with an eval(). + +If there is no error, then the method returns the value of the last +expression evaluated, or a return statement may be used, just as with +subroutines and B<eval()>. The context (list or scalar) is determined +by the caller as usual. + +This behaviour differs from the beta distribution of the Safe extension +where earlier versions of perl made it hard to mimic the return +behaviour of the eval() command and the context was always scalar. + +Some points to note: + +If the entereval op is permitted then the code can use eval "..." to +'hide' code which might use denied ops. This is not a major problem +since when the code tries to execute the eval it will fail because the +opmask is still in effect. However this technique would allow clever, +and possibly harmful, code to 'probe' the boundaries of what is +possible. + +Any string eval which is executed by code executing in a compartment, +or by code called from code executing in a compartment, will be eval'd +in the namespace of the compartment. This is potentially a serious +problem. + +Consider a function foo() in package pkg compiled outside a compartment +but shared with it. Assume the compartment has a root package called +'Root'. If foo() contains an eval statement like eval '$foo = 1' then, +normally, $pkg::foo will be set to 1. If foo() is called from the +compartment (by whatever means) then instead of setting $pkg::foo, the +eval will actually set $Root::pkg::foo. + +This can easily be demonstrated by using a module, such as the Socket +module, which uses eval "..." as part of an AUTOLOAD function. You can +'use' the module outside the compartment and share an (autoloaded) +function with the compartment. If an autoload is triggered by code in +the compartment, or by any code anywhere that is called by any means +from the compartment, then the eval in the Socket module's AUTOLOAD +function happens in the namespace of the compartment. Any variables +created or used by the eval'd code are now under the control of +the code in the compartment. + +A similar effect applies to I<all> runtime symbol lookups in code +called from a compartment but not compiled within it. + + + +=item rdo (FILENAME) + +This evaluates the contents of file FILENAME inside the compartment. +See above documentation on the B<reval> method for further details. + +=item root (NAMESPACE) + +This method returns the name of the package that is the root of the +compartment's namespace. + +Note that this behaviour differs from version 1.00 of the Safe module +where the root module could be used to change the namespace. That +functionality has been withdrawn pending deeper consideration. + +=item mask (MASK) + +This is a get-or-set method for the compartment's operator mask. + +With no MASK argument present, it returns the current operator mask of +the compartment. + +With the MASK argument present, it sets the operator mask for the +compartment (equivalent to calling the deny_only method). + +=back + + +=head2 Some Safety Issues + +This section is currently just an outline of some of the things code in +a compartment might do (intentionally or unintentionally) which can +have an effect outside the compartment. + +=over 8 + +=item Memory + +Consuming all (or nearly all) available memory. + +=item CPU + +Causing infinite loops etc. + +=item Snooping + +Copying private information out of your system. Even something as +simple as your user name is of value to others. Much useful information +could be gleaned from your environment variables for example. + +=item Signals + +Causing signals (especially SIGFPE and SIGALARM) to affect your process. + +Setting up a signal handler will need to be carefully considered +and controlled. What mask is in effect when a signal handler +gets called? If a user can get an imported function to get an +exception and call the user's signal handler, does that user's +restricted mask get re-instated before the handler is called? +Does an imported handler get called with its original mask or +the user's one? + +=item State Changes + +Ops such as chdir obviously effect the process as a whole and not just +the code in the compartment. Ops such as rand and srand have a similar +but more subtle effect. + +=back + +=head2 AUTHOR + +Originally designed and implemented by Malcolm Beattie, +mbeattie@sable.ox.ac.uk. + +Reworked to use the Opcode module and other changes added by Tim Bunce +E<lt>F<Tim.Bunce@ig.co.uk>E<gt>. + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Scalar/Util.pm b/Master/tlpkg/tlperl.old/lib/Scalar/Util.pm new file mode 100644 index 00000000000..4ae525a17c0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Scalar/Util.pm @@ -0,0 +1,147 @@ +# Scalar::Util.pm +# +# Copyright (c) 1997-2005 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package Scalar::Util; + +use strict; +use vars qw(@ISA @EXPORT_OK $VERSION); +require Exporter; +require List::Util; # List::Util loads the XS + +@ISA = qw(Exporter); +@EXPORT_OK = qw(blessed dualvar reftype weaken isweak tainted readonly openhandle refaddr isvstring looks_like_number set_prototype); +$VERSION = "1.18"; +$VERSION = eval $VERSION; + +sub export_fail { + if (grep { /^(weaken|isweak)$/ } @_ ) { + require Carp; + Carp::croak("Weak references are not implemented in the version of perl"); + } + if (grep { /^(isvstring)$/ } @_ ) { + require Carp; + Carp::croak("Vstrings are not implemented in the version of perl"); + } + if (grep { /^(dualvar|set_prototype)$/ } @_ ) { + require Carp; + Carp::croak("$1 is only avaliable with the XS version"); + } + + @_; +} + +sub openhandle ($) { + my $fh = shift; + my $rt = reftype($fh) || ''; + + return defined(fileno($fh)) ? $fh : undef + if $rt eq 'IO'; + + if (reftype(\$fh) eq 'GLOB') { # handle openhandle(*DATA) + $fh = \(my $tmp=$fh); + } + elsif ($rt ne 'GLOB') { + return undef; + } + + (tied(*$fh) or defined(fileno($fh))) + ? $fh : undef; +} + +eval <<'ESQ' unless defined &dualvar; + +use vars qw(@EXPORT_FAIL); +push @EXPORT_FAIL, qw(weaken isweak dualvar isvstring set_prototype); + +# The code beyond here is only used if the XS is not installed + +# Hope nobody defines a sub by this name +sub UNIVERSAL::a_sub_not_likely_to_be_here { ref($_[0]) } + +sub blessed ($) { + local($@, $SIG{__DIE__}, $SIG{__WARN__}); + length(ref($_[0])) + ? eval { $_[0]->a_sub_not_likely_to_be_here } + : undef +} + +sub refaddr($) { + my $pkg = ref($_[0]) or return undef; + if (blessed($_[0])) { + bless $_[0], 'Scalar::Util::Fake'; + } + else { + $pkg = undef; + } + "$_[0]" =~ /0x(\w+)/; + my $i = do { local $^W; hex $1 }; + bless $_[0], $pkg if defined $pkg; + $i; +} + +sub reftype ($) { + local($@, $SIG{__DIE__}, $SIG{__WARN__}); + my $r = shift; + my $t; + + length($t = ref($r)) or return undef; + + # This eval will fail if the reference is not blessed + eval { $r->a_sub_not_likely_to_be_here; 1 } + ? do { + $t = eval { + # we have a GLOB or an IO. Stringify a GLOB gives it's name + my $q = *$r; + $q =~ /^\*/ ? "GLOB" : "IO"; + } + or do { + # OK, if we don't have a GLOB what parts of + # a glob will it populate. + # NOTE: A glob always has a SCALAR + local *glob = $r; + defined *glob{ARRAY} && "ARRAY" + or defined *glob{HASH} && "HASH" + or defined *glob{CODE} && "CODE" + or length(ref(${$r})) ? "REF" : "SCALAR"; + } + } + : $t +} + +sub tainted { + local($@, $SIG{__DIE__}, $SIG{__WARN__}); + local $^W = 0; + eval { kill 0 * $_[0] }; + $@ =~ /^Insecure/; +} + +sub readonly { + return 0 if tied($_[0]) || (ref(\($_[0])) ne "SCALAR"); + + local($@, $SIG{__DIE__}, $SIG{__WARN__}); + my $tmp = $_[0]; + + !eval { $_[0] = $tmp; 1 }; +} + +sub looks_like_number { + local $_ = shift; + + # checks from perlfaq4 + return 0 if !defined($_) or ref($_); + return 1 if (/^[+-]?\d+$/); # is a +/- integer + return 1 if (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/); # a C float + return 1 if ($] >= 5.008 and /^(Inf(inity)?|NaN)$/i) or ($] >= 5.006001 and /^Inf$/i); + + 0; +} + +ESQ + +1; + +__END__ + diff --git a/Master/tlpkg/tlperl.old/lib/SelectSaver.pm b/Master/tlpkg/tlperl.old/lib/SelectSaver.pm new file mode 100644 index 00000000000..1207b88a4a2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/SelectSaver.pm @@ -0,0 +1,54 @@ +package SelectSaver; + +our $VERSION = '1.01'; + +=head1 NAME + +SelectSaver - save and restore selected file handle + +=head1 SYNOPSIS + + use SelectSaver; + + { + my $saver = new SelectSaver(FILEHANDLE); + # FILEHANDLE is selected + } + # previous handle is selected + + { + my $saver = new SelectSaver; + # new handle may be selected, or not + } + # previous handle is selected + +=head1 DESCRIPTION + +A C<SelectSaver> object contains a reference to the file handle that +was selected when it was created. If its C<new> method gets an extra +parameter, then that parameter is selected; otherwise, the selected +file handle remains unchanged. + +When a C<SelectSaver> is destroyed, it re-selects the file handle +that was selected when it was created. + +=cut + +require 5.000; +use Carp; +use Symbol; + +sub new { + @_ >= 1 && @_ <= 2 or croak 'usage: new SelectSaver [FILEHANDLE]'; + my $fh = select; + my $self = bless \$fh, $_[0]; + select qualify($_[1], caller) if @_ > 1; + $self; +} + +sub DESTROY { + my $self = $_[0]; + select $$self; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Symbol.pm b/Master/tlpkg/tlperl.old/lib/Symbol.pm new file mode 100644 index 00000000000..3bb5d9240c1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Symbol.pm @@ -0,0 +1,170 @@ +package Symbol; + +=head1 NAME + +Symbol - manipulate Perl symbols and their names + +=head1 SYNOPSIS + + use Symbol; + + $sym = gensym; + open($sym, "filename"); + $_ = <$sym>; + # etc. + + ungensym $sym; # no effect + + # replace *FOO{IO} handle but not $FOO, %FOO, etc. + *FOO = geniosym; + + print qualify("x"), "\n"; # "Test::x" + print qualify("x", "FOO"), "\n" # "FOO::x" + print qualify("BAR::x"), "\n"; # "BAR::x" + print qualify("BAR::x", "FOO"), "\n"; # "BAR::x" + print qualify("STDOUT", "FOO"), "\n"; # "main::STDOUT" (global) + print qualify(\*x), "\n"; # returns \*x + print qualify(\*x, "FOO"), "\n"; # returns \*x + + use strict refs; + print { qualify_to_ref $fh } "foo!\n"; + $ref = qualify_to_ref $name, $pkg; + + use Symbol qw(delete_package); + delete_package('Foo::Bar'); + print "deleted\n" unless exists $Foo::{'Bar::'}; + +=head1 DESCRIPTION + +C<Symbol::gensym> creates an anonymous glob and returns a reference +to it. Such a glob reference can be used as a file or directory +handle. + +For backward compatibility with older implementations that didn't +support anonymous globs, C<Symbol::ungensym> is also provided. +But it doesn't do anything. + +C<Symbol::geniosym> creates an anonymous IO handle. This can be +assigned into an existing glob without affecting the non-IO portions +of the glob. + +C<Symbol::qualify> turns unqualified symbol names into qualified +variable names (e.g. "myvar" -E<gt> "MyPackage::myvar"). If it is given a +second parameter, C<qualify> uses it as the default package; +otherwise, it uses the package of its caller. Regardless, global +variable names (e.g. "STDOUT", "ENV", "SIG") are always qualified with +"main::". + +Qualification applies only to symbol names (strings). References are +left unchanged under the assumption that they are glob references, +which are qualified by their nature. + +C<Symbol::qualify_to_ref> is just like C<Symbol::qualify> except that it +returns a glob ref rather than a symbol name, so you can use the result +even if C<use strict 'refs'> is in effect. + +C<Symbol::delete_package> wipes out a whole package namespace. Note +this routine is not exported by default--you may want to import it +explicitly. + +=head1 BUGS + +C<Symbol::delete_package> is a bit too powerful. It undefines every symbol that +lives in the specified package. Since perl, for performance reasons, does not +perform a symbol table lookup each time a function is called or a global +variable is accessed, some code that has already been loaded and that makes use +of symbols in package C<Foo> may stop working after you delete C<Foo>, even if +you reload the C<Foo> module afterwards. + +=cut + +BEGIN { require 5.005; } + +require Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(gensym ungensym qualify qualify_to_ref); +@EXPORT_OK = qw(delete_package geniosym); + +$VERSION = '1.06'; + +my $genpkg = "Symbol::"; +my $genseq = 0; + +my %global = map {$_ => 1} qw(ARGV ARGVOUT ENV INC SIG STDERR STDIN STDOUT); + +# +# Note that we never _copy_ the glob; we just make a ref to it. +# If we did copy it, then SVf_FAKE would be set on the copy, and +# glob-specific behaviors (e.g. C<*$ref = \&func>) wouldn't work. +# +sub gensym () { + my $name = "GEN" . $genseq++; + my $ref = \*{$genpkg . $name}; + delete $$genpkg{$name}; + $ref; +} + +sub geniosym () { + my $sym = gensym(); + # force the IO slot to be filled + select(select $sym); + *$sym{IO}; +} + +sub ungensym ($) {} + +sub qualify ($;$) { + my ($name) = @_; + if (!ref($name) && index($name, '::') == -1 && index($name, "'") == -1) { + my $pkg; + # Global names: special character, "^xyz", or other. + if ($name =~ /^(([^a-z])|(\^[a-z_]+))\z/i || $global{$name}) { + # RGS 2001-11-05 : translate leading ^X to control-char + $name =~ s/^\^([a-z_])/'qq(\c'.$1.')'/eei; + $pkg = "main"; + } + else { + $pkg = (@_ > 1) ? $_[1] : caller; + } + $name = $pkg . "::" . $name; + } + $name; +} + +sub qualify_to_ref ($;$) { + return \*{ qualify $_[0], @_ > 1 ? $_[1] : caller }; +} + +# +# of Safe.pm lineage +# +sub delete_package ($) { + my $pkg = shift; + + # expand to full symbol table name if needed + + unless ($pkg =~ /^main::.*::$/) { + $pkg = "main$pkg" if $pkg =~ /^::/; + $pkg = "main::$pkg" unless $pkg =~ /^main::/; + $pkg .= '::' unless $pkg =~ /::$/; + } + + my($stem, $leaf) = $pkg =~ m/(.*::)(\w+::)$/; + my $stem_symtab = *{$stem}{HASH}; + return unless defined $stem_symtab and exists $stem_symtab->{$leaf}; + + + # free all the symbols in the package + + my $leaf_symtab = *{$stem_symtab->{$leaf}}{HASH}; + foreach my $name (keys %$leaf_symtab) { + undef *{$pkg . $name}; + } + + # delete the symbol table + + %$leaf_symtab = (); + delete $stem_symtab->{$leaf}; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Term/ANSIColor.pm b/Master/tlpkg/tlperl.old/lib/Term/ANSIColor.pm new file mode 100644 index 00000000000..9320fa06b23 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Term/ANSIColor.pm @@ -0,0 +1,472 @@ +# Term::ANSIColor -- Color screen output using ANSI escape sequences. +# $Id: ANSIColor.pm,v 1.10 2005/08/21 18:31:58 eagle Exp $ +# +# Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2005 +# by Russ Allbery <rra@stanford.edu> and Zenin +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. +# +# Ah, September, when the sysadmins turn colors and fall off the trees.... +# -- Dave Van Domelen + +############################################################################## +# Modules and declarations +############################################################################## + +package Term::ANSIColor; +require 5.001; + +use strict; +use vars qw($AUTOLOAD $AUTORESET $EACHLINE @ISA @EXPORT @EXPORT_OK + %EXPORT_TAGS $VERSION %attributes %attributes_r); + +use Exporter (); +@ISA = qw(Exporter); +@EXPORT = qw(color colored); +@EXPORT_OK = qw(uncolor); +%EXPORT_TAGS = (constants => [qw(CLEAR RESET BOLD DARK UNDERLINE UNDERSCORE + BLINK REVERSE CONCEALED BLACK RED GREEN + YELLOW BLUE MAGENTA CYAN WHITE ON_BLACK + ON_RED ON_GREEN ON_YELLOW ON_BLUE ON_MAGENTA + ON_CYAN ON_WHITE)]); +Exporter::export_ok_tags ('constants'); + +# Don't use the CVS revision as the version, since this module is also in Perl +# core and too many things could munge CVS magic revision strings. +$VERSION = '1.10'; + +############################################################################## +# Internal data structures +############################################################################## + +%attributes = ('clear' => 0, + 'reset' => 0, + 'bold' => 1, + 'dark' => 2, + 'underline' => 4, + 'underscore' => 4, + 'blink' => 5, + 'reverse' => 7, + 'concealed' => 8, + + 'black' => 30, 'on_black' => 40, + 'red' => 31, 'on_red' => 41, + 'green' => 32, 'on_green' => 42, + 'yellow' => 33, 'on_yellow' => 43, + 'blue' => 34, 'on_blue' => 44, + 'magenta' => 35, 'on_magenta' => 45, + 'cyan' => 36, 'on_cyan' => 46, + 'white' => 37, 'on_white' => 47); + +# Reverse lookup. Alphabetically first name for a sequence is preferred. +for (reverse sort keys %attributes) { + $attributes_r{$attributes{$_}} = $_; +} + +############################################################################## +# Implementation (constant form) +############################################################################## + +# Time to have fun! We now want to define the constant subs, which are named +# the same as the attributes above but in all caps. Each constant sub needs +# to act differently depending on whether $AUTORESET is set. Without +# autoreset: +# +# BLUE "text\n" ==> "\e[34mtext\n" +# +# If $AUTORESET is set, we should instead get: +# +# BLUE "text\n" ==> "\e[34mtext\n\e[0m" +# +# The sub also needs to handle the case where it has no arguments correctly. +# Maintaining all of this as separate subs would be a major nightmare, as well +# as duplicate the %attributes hash, so instead we define an AUTOLOAD sub to +# define the constant subs on demand. To do that, we check the name of the +# called sub against the list of attributes, and if it's an all-caps version +# of one of them, we define the sub on the fly and then run it. +# +# If the environment variable ANSI_COLORS_DISABLED is set, turn all of the +# generated subs into pass-through functions that don't add any escape +# sequences. This is to make it easier to write scripts that also work on +# systems without any ANSI support, like Windows consoles. +sub AUTOLOAD { + my $enable_colors = !defined $ENV{ANSI_COLORS_DISABLED}; + my $sub; + ($sub = $AUTOLOAD) =~ s/^.*:://; + my $attr = $attributes{lc $sub}; + if ($sub =~ /^[A-Z_]+$/ && defined $attr) { + $attr = $enable_colors ? "\e[" . $attr . 'm' : ''; + eval qq { + sub $AUTOLOAD { + if (\$AUTORESET && \@_) { + '$attr' . "\@_" . "\e[0m"; + } else { + ('$attr' . "\@_"); + } + } + }; + goto &$AUTOLOAD; + } else { + require Carp; + Carp::croak ("undefined subroutine &$AUTOLOAD called"); + } +} + +############################################################################## +# Implementation (attribute string form) +############################################################################## + +# Return the escape code for a given set of color attributes. +sub color { + return '' if defined $ENV{ANSI_COLORS_DISABLED}; + my @codes = map { split } @_; + my $attribute = ''; + foreach (@codes) { + $_ = lc $_; + unless (defined $attributes{$_}) { + require Carp; + Carp::croak ("Invalid attribute name $_"); + } + $attribute .= $attributes{$_} . ';'; + } + chop $attribute; + ($attribute ne '') ? "\e[${attribute}m" : undef; +} + +# Return a list of named color attributes for a given set of escape codes. +# Escape sequences can be given with or without enclosing "\e[" and "m". The +# empty escape sequence '' or "\e[m" gives an empty list of attrs. +sub uncolor { + my (@nums, @result); + for (@_) { + my $escape = $_; + $escape =~ s/^\e\[//; + $escape =~ s/m$//; + unless ($escape =~ /^((?:\d+;)*\d*)$/) { + require Carp; + Carp::croak ("Bad escape sequence $_"); + } + push (@nums, split (/;/, $1)); + } + for (@nums) { + $_ += 0; # Strip leading zeroes + my $name = $attributes_r{$_}; + if (!defined $name) { + require Carp; + Carp::croak ("No name for escape sequence $_" ); + } + push (@result, $name); + } + @result; +} + +# Given a string and a set of attributes, returns the string surrounded by +# escape codes to set those attributes and then clear them at the end of the +# string. The attributes can be given either as an array ref as the first +# argument or as a list as the second and subsequent arguments. If $EACHLINE +# is set, insert a reset before each occurrence of the string $EACHLINE and +# the starting attribute code after the string $EACHLINE, so that no attribute +# crosses line delimiters (this is often desirable if the output is to be +# piped to a pager or some other program). +sub colored { + my ($string, @codes); + if (ref $_[0]) { + @codes = @{+shift}; + $string = join ('', @_); + } else { + $string = shift; + @codes = @_; + } + return $string if defined $ENV{ANSI_COLORS_DISABLED}; + if (defined $EACHLINE) { + my $attr = color (@codes); + join '', + map { $_ ne $EACHLINE ? $attr . $_ . "\e[0m" : $_ } + grep { length ($_) > 0 } + split (/(\Q$EACHLINE\E)/, $string); + } else { + color (@codes) . $string . "\e[0m"; + } +} + +############################################################################## +# Module return value and documentation +############################################################################## + +# Ensure we evaluate to true. +1; +__END__ + +=head1 NAME + +Term::ANSIColor - Color screen output using ANSI escape sequences + +=head1 SYNOPSIS + + use Term::ANSIColor; + print color 'bold blue'; + print "This text is bold blue.\n"; + print color 'reset'; + print "This text is normal.\n"; + print colored ("Yellow on magenta.\n", 'yellow on_magenta'); + print "This text is normal.\n"; + print colored ['yellow on_magenta'], "Yellow on magenta.\n"; + + use Term::ANSIColor qw(uncolor); + print uncolor '01;31', "\n"; + + use Term::ANSIColor qw(:constants); + print BOLD, BLUE, "This text is in bold blue.\n", RESET; + + use Term::ANSIColor qw(:constants); + $Term::ANSIColor::AUTORESET = 1; + print BOLD BLUE "This text is in bold blue.\n"; + print "This text is normal.\n"; + +=head1 DESCRIPTION + +This module has two interfaces, one through color() and colored() and the +other through constants. It also offers the utility function uncolor(), +which has to be explicitly imported to be used (see L<SYNOPSIS>). + +color() takes any number of strings as arguments and considers them to be +space-separated lists of attributes. It then forms and returns the escape +sequence to set those attributes. It doesn't print it out, just returns it, +so you'll have to print it yourself if you want to (this is so that you can +save it as a string, pass it to something else, send it to a file handle, or +do anything else with it that you might care to). + +uncolor() performs the opposite translation, turning escape sequences +into a list of strings. + +The recognized attributes (all of which should be fairly intuitive) are +clear, reset, dark, bold, underline, underscore, blink, reverse, concealed, +black, red, green, yellow, blue, magenta, on_black, on_red, on_green, +on_yellow, on_blue, on_magenta, on_cyan, and on_white. Case is not +significant. Underline and underscore are equivalent, as are clear and +reset, so use whichever is the most intuitive to you. The color alone sets +the foreground color, and on_color sets the background color. + +Note that not all attributes are supported by all terminal types, and some +terminals may not support any of these sequences. Dark, blink, and +concealed in particular are frequently not implemented. + +Attributes, once set, last until they are unset (by sending the attribute +"reset"). Be careful to do this, or otherwise your attribute will last +after your script is done running, and people get very annoyed at having +their prompt and typing changed to weird colors. + +As an aid to help with this, colored() takes a scalar as the first argument +and any number of attribute strings as the second argument and returns the +scalar wrapped in escape codes so that the attributes will be set as +requested before the string and reset to normal after the string. +Alternately, you can pass a reference to an array as the first argument, and +then the contents of that array will be taken as attributes and color codes +and the remainder of the arguments as text to colorize. + +Normally, colored() just puts attribute codes at the beginning and end of +the string, but if you set $Term::ANSIColor::EACHLINE to some string, that +string will be considered the line delimiter and the attribute will be set +at the beginning of each line of the passed string and reset at the end of +each line. This is often desirable if the output is being sent to a program +like a pager that can be confused by attributes that span lines. Normally +you'll want to set $Term::ANSIColor::EACHLINE to C<"\n"> to use this +feature. + +Alternately, if you import C<:constants>, you can use the constants CLEAR, +RESET, BOLD, DARK, UNDERLINE, UNDERSCORE, BLINK, REVERSE, CONCEALED, BLACK, +RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, ON_BLACK, ON_RED, ON_GREEN, +ON_YELLOW, ON_BLUE, ON_MAGENTA, ON_CYAN, and ON_WHITE directly. These are +the same as color('attribute') and can be used if you prefer typing: + + print BOLD BLUE ON_WHITE "Text\n", RESET; + +to + + print colored ("Text\n", 'bold blue on_white'); + +When using the constants, if you don't want to have to remember to add the +C<, RESET> at the end of each print line, you can set +$Term::ANSIColor::AUTORESET to a true value. Then, the display mode will +automatically be reset if there is no comma after the constant. In other +words, with that variable set: + + print BOLD BLUE "Text\n"; + +will reset the display mode afterwards, whereas: + + print BOLD, BLUE, "Text\n"; + +will not. + +The subroutine interface has the advantage over the constants interface in +that only two subroutines are exported into your namespace, versus +twenty-two in the constants interface. On the flip side, the constants +interface has the advantage of better compile time error checking, since +misspelled names of colors or attributes in calls to color() and colored() +won't be caught until runtime whereas misspelled names of constants will be +caught at compile time. So, polute your namespace with almost two dozen +subroutines that you may not even use that often, or risk a silly bug by +mistyping an attribute. Your choice, TMTOWTDI after all. + +=head1 DIAGNOSTICS + +=over 4 + +=item Bad escape sequence %s + +(F) You passed an invalid ANSI escape sequence to uncolor(). + +=item Bareword "%s" not allowed while "strict subs" in use + +(F) You probably mistyped a constant color name such as: + + $Foobar = FOOBAR . "This line should be blue\n"; + +or: + + @Foobar = FOOBAR, "This line should be blue\n"; + +This will only show up under use strict (another good reason to run under +use strict). + +=item Invalid attribute name %s + +(F) You passed an invalid attribute name to either color() or colored(). + +=item Name "%s" used only once: possible typo + +(W) You probably mistyped a constant color name such as: + + print FOOBAR "This text is color FOOBAR\n"; + +It's probably better to always use commas after constant names in order to +force the next error. + +=item No comma allowed after filehandle + +(F) You probably mistyped a constant color name such as: + + print FOOBAR, "This text is color FOOBAR\n"; + +Generating this fatal compile error is one of the main advantages of using +the constants interface, since you'll immediately know if you mistype a +color name. + +=item No name for escape sequence %s + +(F) The ANSI escape sequence passed to uncolor() contains escapes which +aren't recognized and can't be translated to names. + +=back + +=head1 ENVIRONMENT + +=over 4 + +=item ANSI_COLORS_DISABLED + +If this environment variable is set, all of the functions defined by this +module (color(), colored(), and all of the constants not previously used in +the program) will not output any escape sequences and instead will just +return the empty string or pass through the original text as appropriate. +This is intended to support easy use of scripts using this module on +platforms that don't support ANSI escape sequences. + +For it to have its proper effect, this environment variable must be set +before any color constants are used in the program. + +=back + +=head1 RESTRICTIONS + +It would be nice if one could leave off the commas around the constants +entirely and just say: + + print BOLD BLUE ON_WHITE "Text\n" RESET; + +but the syntax of Perl doesn't allow this. You need a comma after the +string. (Of course, you may consider it a bug that commas between all the +constants aren't required, in which case you may feel free to insert commas +unless you're using $Term::ANSIColor::AUTORESET.) + +For easier debuging, you may prefer to always use the commas when not +setting $Term::ANSIColor::AUTORESET so that you'll get a fatal compile error +rather than a warning. + +=head1 NOTES + +The codes generated by this module are standard terminal control codes, +complying with ECMA-48 and ISO 6429 (generally referred to as "ANSI color" +for the color codes). The non-color control codes (bold, dark, italic, +underline, and reverse) are part of the earlier ANSI X3.64 standard for +control sequences for video terminals and peripherals. + +Note that not all displays are ISO 6429-compliant, or even X3.64-compliant +(or are even attempting to be so). This module will not work as expected on +displays that do not honor these escape sequences, such as cmd.exe, 4nt.exe, +and command.com under either Windows NT or Windows 2000. They may just be +ignored, or they may display as an ESC character followed by some apparent +garbage. + +Jean Delvare provided the following table of different common terminal +emulators and their support for the various attributes and others have helped +me flesh it out: + + clear bold dark under blink reverse conceal + ------------------------------------------------------------------------ + xterm yes yes no yes bold yes yes + linux yes yes yes bold yes yes no + rxvt yes yes no yes bold/black yes no + dtterm yes yes yes yes reverse yes yes + teraterm yes reverse no yes rev/red yes no + aixterm kinda normal no yes no yes yes + PuTTY yes color no yes no yes no + Windows yes no no no no yes no + Cygwin SSH yes yes no color color color yes + Mac Terminal yes yes no yes yes yes yes + +Windows is Windows telnet, Cygwin SSH is the OpenSSH implementation under +Cygwin on Windows NT, and Mac Terminal is the Terminal application in Mac OS +X. Where the entry is other than yes or no, that emulator displays the +given attribute as something else instead. Note that on an aixterm, clear +doesn't reset colors; you have to explicitly set the colors back to what you +want. More entries in this table are welcome. + +Note that codes 3 (italic), 6 (rapid blink), and 9 (strikethrough) are +specified in ANSI X3.64 and ECMA-048 but are not commonly supported by most +displays and emulators and therefore aren't supported by this module at the +present time. ECMA-048 also specifies a large number of other attributes, +including a sequence of attributes for font changes, Fraktur characters, +double-underlining, framing, circling, and overlining. As none of these +attributes are widely supported or useful, they also aren't currently +supported by this module. + +=head1 SEE ALSO + +ECMA-048 is available on-line (at least at the time of this writing) at +L<http://www.ecma-international.org/publications/standards/ECMA-048.HTM>. + +ISO 6429 is available from ISO for a charge; the author of this module does +not own a copy of it. Since the source material for ISO 6429 was ECMA-048 +and the latter is available for free, there seems little reason to obtain +the ISO standard. + +The current version of this module is always available from its web site at +L<http://www.eyrie.org/~eagle/software/ansicolor/>. It is also part of the +Perl core distribution as of 5.6.0. + +=head1 AUTHORS + +Original idea (using constants) by Zenin, reimplemented using subs by Russ +Allbery <rra@stanford.edu>, and then combined with the original idea by Russ +with input from Zenin. Russ Allbery now maintains this module. + +=head1 COPYRIGHT AND LICENSE + +Copyright 1996, 1997, 1998, 2000, 2001, 2002 Russ Allbery <rra@stanford.edu> +and Zenin. This program is free software; you may redistribute it and/or +modify it under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Term/Cap.pm b/Master/tlpkg/tlperl.old/lib/Term/Cap.pm new file mode 100644 index 00000000000..b71c51ceba4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Term/Cap.pm @@ -0,0 +1,669 @@ +package Term::Cap; + +# Since the debugger uses Term::ReadLine which uses Term::Cap, we want +# to load as few modules as possible. This includes Carp.pm. +sub carp { + require Carp; + goto &Carp::carp; +} + +sub croak { + require Carp; + goto &Carp::croak; +} + +use strict; + +use vars qw($VERSION $VMS_TERMCAP); +use vars qw($termpat $state $first $entry); + +$VERSION = '1.09'; + +# Version undef: Thu Dec 14 20:02:42 CST 1995 by sanders@bsdi.com +# Version 1.00: Thu Nov 30 23:34:29 EST 2000 by schwern@pobox.com +# [PATCH] $VERSION crusade, strict, tests, etc... all over lib/ +# Version 1.01: Wed May 23 00:00:00 CST 2001 by d-lewart@uiuc.edu +# Avoid warnings in Tgetent and Tputs +# Version 1.02: Sat Nov 17 13:50:39 GMT 2001 by jns@gellyfish.com +# Altered layout of the POD +# Added Test::More to PREREQ_PM in Makefile.PL +# Fixed no argument Tgetent() +# Version 1.03: Wed Nov 28 10:09:38 GMT 2001 +# VMS Support from Charles Lane <lane@DUPHY4.Physics.Drexel.Edu> +# Version 1.04: Thu Nov 29 16:22:03 GMT 2001 +# Fixed warnings in test +# Version 1.05: Mon Dec 3 15:33:49 GMT 2001 +# Don't try to fall back on infocmp if it's not there. From chromatic. +# Version 1.06: Thu Dec 6 18:43:22 GMT 2001 +# Preload the default VMS termcap from Charles Lane +# Don't carp at setting OSPEED unless warnings are on. +# Version 1.07: Wed Jan 2 21:35:09 GMT 2002 +# Sanity check on infocmp output from Norton Allen +# Repaired INSTALLDIRS thanks to Michael Schwern +# Version 1.08: Sat Sep 28 11:33:15 BST 2002 +# Late loading of 'Carp' as per Michael Schwern +# Version 1.09: Tue Apr 20 12:06:51 BST 2004 +# Merged in changes from and to Core +# Core (Fri Aug 30 14:15:55 CEST 2002): +# Cope with comments lines from 'infocmp' from Brendan O'Dea +# Allow for EBCDIC in Tgoto magic test. + +# TODO: +# support Berkeley DB termcaps +# should probably be a .xs module +# force $FH into callers package? +# keep $FH in object at Tgetent time? + +=head1 NAME + +Term::Cap - Perl termcap interface + +=head1 SYNOPSIS + + require Term::Cap; + $terminal = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed }; + $terminal->Trequire(qw/ce ku kd/); + $terminal->Tgoto('cm', $col, $row, $FH); + $terminal->Tputs('dl', $count, $FH); + $terminal->Tpad($string, $count, $FH); + +=head1 DESCRIPTION + +These are low-level functions to extract and use capabilities from +a terminal capability (termcap) database. + +More information on the terminal capabilities will be found in the +termcap manpage on most Unix-like systems. + +=head2 METHODS + +=over 4 + +The output strings for B<Tputs> are cached for counts of 1 for performance. +B<Tgoto> and B<Tpad> do not cache. C<$self-E<gt>{_xx}> is the raw termcap +data and C<$self-E<gt>{xx}> is the cached version. + + print $terminal->Tpad($self->{_xx}, 1); + +B<Tgoto>, B<Tputs>, and B<Tpad> return the string and will also +output the string to $FH if specified. + + +=cut + +# Preload the default VMS termcap. +# If a different termcap is required then the text of one can be supplied +# in $Term::Cap::VMS_TERMCAP before Tgetent is called. + +if ( $^O eq 'VMS') { + chomp (my @entry = <DATA>); + $VMS_TERMCAP = join '', @entry; +} + +# Returns a list of termcap files to check. + +sub termcap_path { ## private + my @termcap_path; + # $TERMCAP, if it's a filespec + push(@termcap_path, $ENV{TERMCAP}) + if ((exists $ENV{TERMCAP}) && + (($^O eq 'os2' || $^O eq 'MSWin32' || $^O eq 'dos') + ? $ENV{TERMCAP} =~ /^[a-z]:[\\\/]/is + : $ENV{TERMCAP} =~ /^\//s)); + if ((exists $ENV{TERMPATH}) && ($ENV{TERMPATH})) { + # Add the users $TERMPATH + push(@termcap_path, split(/(:|\s+)/, $ENV{TERMPATH})) + } + else { + # Defaults + push(@termcap_path, + $ENV{'HOME'} . '/.termcap', + '/etc/termcap', + '/usr/share/misc/termcap', + ); + } + + # return the list of those termcaps that exist + return grep(-f, @termcap_path); +} + +=item B<Tgetent> + +Returns a blessed object reference which the user can +then use to send the control strings to the terminal using B<Tputs> +and B<Tgoto>. + +The function extracts the entry of the specified terminal +type I<TERM> (defaults to the environment variable I<TERM>) from the +database. + +It will look in the environment for a I<TERMCAP> variable. If +found, and the value does not begin with a slash, and the terminal +type name is the same as the environment string I<TERM>, the +I<TERMCAP> string is used instead of reading a termcap file. If +it does begin with a slash, the string is used as a path name of +the termcap file to search. If I<TERMCAP> does not begin with a +slash and name is different from I<TERM>, B<Tgetent> searches the +files F<$HOME/.termcap>, F</etc/termcap>, and F</usr/share/misc/termcap>, +in that order, unless the environment variable I<TERMPATH> exists, +in which case it specifies a list of file pathnames (separated by +spaces or colons) to be searched B<instead>. Whenever multiple +files are searched and a tc field occurs in the requested entry, +the entry it names must be found in the same file or one of the +succeeding files. If there is a C<:tc=...:> in the I<TERMCAP> +environment variable string it will continue the search in the +files as above. + +The extracted termcap entry is available in the object +as C<$self-E<gt>{TERMCAP}>. + +It takes a hash reference as an argument with two optional keys: + +=over 2 + +=item OSPEED + +The terminal output bit rate (often mistakenly called the baud rate) +for this terminal - if not set a warning will be generated +and it will be defaulted to 9600. I<OSPEED> can be be specified as +either a POSIX termios/SYSV termio speeds (where 9600 equals 9600) or +an old DSD-style speed ( where 13 equals 9600). + + +=item TERM + +The terminal type whose termcap entry will be used - if not supplied it will +default to $ENV{TERM}: if that is not set then B<Tgetent> will croak. + +=back + +It calls C<croak> on failure. + +=cut + +sub Tgetent { ## public -- static method + my $class = shift; + my ($self) = @_; + + $self = {} unless defined $self; + bless $self, $class; + + my($term,$cap,$search,$field,$max,$tmp_term,$TERMCAP); + local($termpat,$state,$first,$entry); # used inside eval + local $_; + + # Compute PADDING factor from OSPEED (to be used by Tpad) + if (! $self->{OSPEED}) { + if ( $^W ) { + carp "OSPEED was not set, defaulting to 9600"; + } + $self->{OSPEED} = 9600; + } + if ($self->{OSPEED} < 16) { + # delays for old style speeds + my @pad = (0,200,133.3,90.9,74.3,66.7,50,33.3,16.7,8.3,5.5,4.1,2,1,.5,.2); + $self->{PADDING} = $pad[$self->{OSPEED}]; + } + else { + $self->{PADDING} = 10000 / $self->{OSPEED}; + } + + $self->{TERM} = ($self->{TERM} || $ENV{TERM} || croak "TERM not set"); + $term = $self->{TERM}; # $term is the term type we are looking for + + # $tmp_term is always the next term (possibly :tc=...:) we are looking for + $tmp_term = $self->{TERM}; + # protect any pattern metacharacters in $tmp_term + $termpat = $tmp_term; $termpat =~ s/(\W)/\\$1/g; + + my $foo = (exists $ENV{TERMCAP} ? $ENV{TERMCAP} : ''); + + # $entry is the extracted termcap entry + if (($foo !~ m:^/:s) && ($foo =~ m/(^|\|)${termpat}[:|]/s)) { + $entry = $foo; + } + + my @termcap_path = termcap_path(); + + unless (@termcap_path || $entry) + { + # last resort--fake up a termcap from terminfo + local $ENV{TERM} = $term; + + if ( $^O eq 'VMS' ) { + $entry = $VMS_TERMCAP; + } + else { + if ( grep { -x "$_/infocmp" } split /:/, $ENV{PATH} ) { + eval + { + my $tmp = `infocmp -C 2>/dev/null`; + $tmp =~ s/^#.*\n//gm; # remove comments + if (( $tmp !~ m%^/%s ) && ( $tmp =~ /(^|\|)${termpat}[:|]/s)) { + $entry = $tmp; + } + }; + } + } + } + + croak "Can't find a valid termcap file" unless @termcap_path || $entry; + + $state = 1; # 0 == finished + # 1 == next file + # 2 == search again + + $first = 0; # first entry (keeps term name) + + $max = 32; # max :tc=...:'s + + if ($entry) { + # ok, we're starting with $TERMCAP + $first++; # we're the first entry + # do we need to continue? + if ($entry =~ s/:tc=([^:]+):/:/) { + $tmp_term = $1; + # protect any pattern metacharacters in $tmp_term + $termpat = $tmp_term; $termpat =~ s/(\W)/\\$1/g; + } + else { + $state = 0; # we're already finished + } + } + + # This is eval'ed inside the while loop for each file + $search = q{ + while (<TERMCAP>) { + next if /^\\t/ || /^#/; + if ($_ =~ m/(^|\\|)${termpat}[:|]/o) { + chomp; + s/^[^:]*:// if $first++; + $state = 0; + while ($_ =~ s/\\\\$//) { + defined(my $x = <TERMCAP>) or last; + $_ .= $x; chomp; + } + last; + } + } + defined $entry or $entry = ''; + $entry .= $_ if $_; + }; + + while ($state != 0) { + if ($state == 1) { + # get the next TERMCAP + $TERMCAP = shift @termcap_path + || croak "failed termcap lookup on $tmp_term"; + } + else { + # do the same file again + # prevent endless recursion + $max-- || croak "failed termcap loop at $tmp_term"; + $state = 1; # ok, maybe do a new file next time + } + + open(TERMCAP,"< $TERMCAP\0") || croak "open $TERMCAP: $!"; + eval $search; + die $@ if $@; + close TERMCAP; + + # If :tc=...: found then search this file again + $entry =~ s/:tc=([^:]+):/:/ && ($tmp_term = $1, $state = 2); + # protect any pattern metacharacters in $tmp_term + $termpat = $tmp_term; $termpat =~ s/(\W)/\\$1/g; + } + + croak "Can't find $term" if $entry eq ''; + $entry =~ s/:+\s*:+/:/g; # cleanup $entry + $entry =~ s/:+/:/g; # cleanup $entry + $self->{TERMCAP} = $entry; # save it + # print STDERR "DEBUG: $entry = ", $entry, "\n"; + + # Precompile $entry into the object + $entry =~ s/^[^:]*://; + foreach $field (split(/:[\s:\\]*/,$entry)) { + if (defined $field && $field =~ /^(\w\w)$/) { + $self->{'_' . $field} = 1 unless defined $self->{'_' . $1}; + # print STDERR "DEBUG: flag $1\n"; + } + elsif (defined $field && $field =~ /^(\w\w)\@/) { + $self->{'_' . $1} = ""; + # print STDERR "DEBUG: unset $1\n"; + } + elsif (defined $field && $field =~ /^(\w\w)#(.*)/) { + $self->{'_' . $1} = $2 unless defined $self->{'_' . $1}; + # print STDERR "DEBUG: numeric $1 = $2\n"; + } + elsif (defined $field && $field =~ /^(\w\w)=(.*)/) { + # print STDERR "DEBUG: string $1 = $2\n"; + next if defined $self->{'_' . ($cap = $1)}; + $_ = $2; + s/\\E/\033/g; + s/\\(\d\d\d)/pack('c',oct($1) & 0177)/eg; + s/\\n/\n/g; + s/\\r/\r/g; + s/\\t/\t/g; + s/\\b/\b/g; + s/\\f/\f/g; + s/\\\^/\377/g; + s/\^\?/\177/g; + s/\^(.)/pack('c',ord($1) & 31)/eg; + s/\\(.)/$1/g; + s/\377/^/g; + $self->{'_' . $cap} = $_; + } + # else { carp "junk in $term ignored: $field"; } + } + $self->{'_pc'} = "\0" unless defined $self->{'_pc'}; + $self->{'_bc'} = "\b" unless defined $self->{'_bc'}; + $self; +} + +# $terminal->Tpad($string, $cnt, $FH); + +=item B<Tpad> + +Outputs a literal string with appropriate padding for the current terminal. + +It takes three arguments: + +=over 2 + +=item B<$string> + +The literal string to be output. If it starts with a number and an optional +'*' then the padding will be increased by an amount relative to this number, +if the '*' is present then this amount will me multiplied by $cnt. This part +of $string is removed before output/ + +=item B<$cnt> + +Will be used to modify the padding applied to string as described above. + +=item B<$FH> + +An optional filehandle (or IO::Handle ) that output will be printed to. + +=back + +The padded $string is returned. + +=cut + +sub Tpad { ## public + my $self = shift; + my($string, $cnt, $FH) = @_; + my($decr, $ms); + + if (defined $string && $string =~ /(^[\d.]+)(\*?)(.*)$/) { + $ms = $1; + $ms *= $cnt if $2; + $string = $3; + $decr = $self->{PADDING}; + if ($decr > .1) { + $ms += $decr / 2; + $string .= $self->{'_pc'} x ($ms / $decr); + } + } + print $FH $string if $FH; + $string; +} + +# $terminal->Tputs($cap, $cnt, $FH); + +=item B<Tputs> + +Output the string for the given capability padded as appropriate without +any parameter substitution. + +It takes three arguments: + +=over 2 + +=item B<$cap> + +The capability whose string is to be output. + +=item B<$cnt> + +A count passed to Tpad to modify the padding applied to the output string. +If $cnt is zero or one then the resulting string will be cached. + +=item B<$FH> + +An optional filehandle (or IO::Handle ) that output will be printed to. + +=back + +The appropriate string for the capability will be returned. + +=cut + +sub Tputs { ## public + my $self = shift; + my($cap, $cnt, $FH) = @_; + my $string; + + $cnt = 0 unless $cnt; + + if ($cnt > 1) { + $string = Tpad($self, $self->{'_' . $cap}, $cnt); + } else { + # cache result because Tpad can be slow + unless (exists $self->{$cap}) { + $self->{$cap} = exists $self->{"_$cap"} ? + Tpad($self, $self->{"_$cap"}, 1) : undef; + } + $string = $self->{$cap}; + } + print $FH $string if $FH; + $string; +} + +# $terminal->Tgoto($cap, $col, $row, $FH); + +=item B<Tgoto> + +B<Tgoto> decodes a cursor addressing string with the given parameters. + +There are four arguments: + +=over 2 + +=item B<$cap> + +The name of the capability to be output. + +=item B<$col> + +The first value to be substituted in the output string ( usually the column +in a cursor addressing capability ) + +=item B<$row> + +The second value to be substituted in the output string (usually the row +in cursor addressing capabilities) + +=item B<$FH> + +An optional filehandle (or IO::Handle ) to which the output string will be +printed. + +=back + +Substitutions are made with $col and $row in the output string with the +following sprintf() line formats: + + %% output `%' + %d output value as in printf %d + %2 output value as in printf %2d + %3 output value as in printf %3d + %. output value as in printf %c + %+x add x to value, then do %. + + %>xy if value > x then add y, no output + %r reverse order of two parameters, no output + %i increment by one, no output + %B BCD (16*(value/10)) + (value%10), no output + + %n exclusive-or all parameters with 0140 (Datamedia 2500) + %D Reverse coding (value - 2*(value%16)), no output (Delta Data) + +The output string will be returned. + +=cut + +sub Tgoto { ## public + my $self = shift; + my($cap, $code, $tmp, $FH) = @_; + my $string = $self->{'_' . $cap}; + my $result = ''; + my $after = ''; + my $online = 0; + my @tmp = ($tmp,$code); + my $cnt = $code; + + while ($string =~ /^([^%]*)%(.)(.*)/) { + $result .= $1; + $code = $2; + $string = $3; + if ($code eq 'd') { + $result .= sprintf("%d",shift(@tmp)); + } + elsif ($code eq '.') { + $tmp = shift(@tmp); + if ($tmp == 0 || $tmp == 4 || $tmp == 10) { + if ($online) { + ++$tmp, $after .= $self->{'_up'} if $self->{'_up'}; + } + else { + ++$tmp, $after .= $self->{'_bc'}; + } + } + $result .= sprintf("%c",$tmp); + $online = !$online; + } + elsif ($code eq '+') { + $result .= sprintf("%c",shift(@tmp)+ord($string)); + $string = substr($string,1,99); + $online = !$online; + } + elsif ($code eq 'r') { + ($code,$tmp) = @tmp; + @tmp = ($tmp,$code); + $online = !$online; + } + elsif ($code eq '>') { + ($code,$tmp,$string) = unpack("CCa99",$string); + if ($tmp[$[] > $code) { + $tmp[$[] += $tmp; + } + } + elsif ($code eq '2') { + $result .= sprintf("%02d",shift(@tmp)); + $online = !$online; + } + elsif ($code eq '3') { + $result .= sprintf("%03d",shift(@tmp)); + $online = !$online; + } + elsif ($code eq 'i') { + ($code,$tmp) = @tmp; + @tmp = ($code+1,$tmp+1); + } + else { + return "OOPS"; + } + } + $string = Tpad($self, $result . $string . $after, $cnt); + print $FH $string if $FH; + $string; +} + +# $terminal->Trequire(qw/ce ku kd/); + +=item B<Trequire> + +Takes a list of capabilities as an argument and will croak if one is not +found. + +=cut + +sub Trequire { ## public + my $self = shift; + my($cap,@undefined); + foreach $cap (@_) { + push(@undefined, $cap) + unless defined $self->{'_' . $cap} && $self->{'_' . $cap}; + } + croak "Terminal does not support: (@undefined)" if @undefined; +} + +=back + +=head1 EXAMPLES + + use Term::Cap; + + # Get terminal output speed + require POSIX; + my $termios = new POSIX::Termios; + $termios->getattr; + my $ospeed = $termios->getospeed; + + # Old-style ioctl code to get ospeed: + # require 'ioctl.pl'; + # ioctl(TTY,$TIOCGETP,$sgtty); + # ($ispeed,$ospeed) = unpack('cc',$sgtty); + + # allocate and initialize a terminal structure + $terminal = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed }; + + # require certain capabilities to be available + $terminal->Trequire(qw/ce ku kd/); + + # Output Routines, if $FH is undefined these just return the string + + # Tgoto does the % expansion stuff with the given args + $terminal->Tgoto('cm', $col, $row, $FH); + + # Tputs doesn't do any % expansion. + $terminal->Tputs('dl', $count = 1, $FH); + +=head1 COPYRIGHT AND LICENSE + +Please see the README file in distribution. + +=head1 AUTHOR + +This module is part of the core Perl distribution and is also maintained +for CPAN by Jonathan Stowe <jns@gellyfish.com>. + +=head1 SEE ALSO + +termcap(5) + +=cut + +# Below is a default entry for systems where there are terminals but no +# termcap +1; +__DATA__ +vt220|vt200|DEC VT220 in vt100 emulation mode: +am:mi:xn:xo: +co#80:li#24: +RA=\E[?7l:SA=\E[?7h: +ac=kkllmmjjnnwwqquuttvvxx:ae=\E(B:al=\E[L:as=\E(0: +bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH: +cr=^M:cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:do=\E[B: +ei=\E[4l:ho=\E[H:im=\E[4h: +is=\E[1;24r\E[24;1H: +nd=\E[C: +kd=\E[B::kl=\E[D:kr=\E[C:ku=\E[A:le=^H: +mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m: +kb=\0177: +r2=\E>\E[24;1H\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E=:rc=\E8: +sc=\E7:se=\E[27m:sf=\ED:so=\E[7m:sr=\EM:ta=^I: +ue=\E[24m:up=\E[A:us=\E[4m:ve=\E[?25h:vi=\E[?25l: + diff --git a/Master/tlpkg/tlperl.old/lib/Term/Complete.pm b/Master/tlpkg/tlperl.old/lib/Term/Complete.pm new file mode 100644 index 00000000000..601e4956430 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Term/Complete.pm @@ -0,0 +1,188 @@ +package Term::Complete; +require 5.000; +require Exporter; + +use strict; +our @ISA = qw(Exporter); +our @EXPORT = qw(Complete); +our $VERSION = '1.402'; + +# @(#)complete.pl,v1.2 (me@anywhere.EBay.Sun.COM) 09/23/91 + +=head1 NAME + +Term::Complete - Perl word completion module + +=head1 SYNOPSIS + + $input = Complete('prompt_string', \@completion_list); + $input = Complete('prompt_string', @completion_list); + +=head1 DESCRIPTION + +This routine provides word completion on the list of words in +the array (or array ref). + +The tty driver is put into raw mode and restored using an operating +system specific command, in UNIX-like environments C<stty>. + +The following command characters are defined: + +=over 4 + +=item E<lt>tabE<gt> + +Attempts word completion. +Cannot be changed. + +=item ^D + +Prints completion list. +Defined by I<$Term::Complete::complete>. + +=item ^U + +Erases the current input. +Defined by I<$Term::Complete::kill>. + +=item E<lt>delE<gt>, E<lt>bsE<gt> + +Erases one character. +Defined by I<$Term::Complete::erase1> and I<$Term::Complete::erase2>. + +=back + +=head1 DIAGNOSTICS + +Bell sounds when word completion fails. + +=head1 BUGS + +The completion character E<lt>tabE<gt> cannot be changed. + +=head1 AUTHOR + +Wayne Thompson + +=cut + +our($complete, $kill, $erase1, $erase2, $tty_raw_noecho, $tty_restore, $stty, $tty_safe_restore); +our($tty_saved_state) = ''; +CONFIG: { + $complete = "\004"; + $kill = "\025"; + $erase1 = "\177"; + $erase2 = "\010"; + foreach my $s (qw(/bin/stty /usr/bin/stty)) { + if (-x $s) { + $tty_raw_noecho = "$s raw -echo"; + $tty_restore = "$s -raw echo"; + $tty_safe_restore = $tty_restore; + $stty = $s; + last; + } + } +} + +sub Complete { + my($prompt, @cmp_lst, $cmp, $test, $l, @match); + my ($return, $r) = ("", 0); + + $return = ""; + $r = 0; + + $prompt = shift; + if (ref $_[0] || $_[0] =~ /^\*/) { + @cmp_lst = sort @{$_[0]}; + } + else { + @cmp_lst = sort(@_); + } + + # Attempt to save the current stty state, to be restored later + if (defined $stty && defined $tty_saved_state && $tty_saved_state eq '') { + $tty_saved_state = qx($stty -g 2>/dev/null); + if ($?) { + # stty -g not supported + $tty_saved_state = undef; + } + else { + $tty_saved_state =~ s/\s+$//g; + $tty_restore = qq($stty "$tty_saved_state" 2>/dev/null); + } + } + system $tty_raw_noecho if defined $tty_raw_noecho; + LOOP: { + local $_; + print($prompt, $return); + while (($_ = getc(STDIN)) ne "\r") { + CASE: { + # (TAB) attempt completion + $_ eq "\t" && do { + @match = grep(/^\Q$return/, @cmp_lst); + unless ($#match < 0) { + $l = length($test = shift(@match)); + foreach $cmp (@match) { + until (substr($cmp, 0, $l) eq substr($test, 0, $l)) { + $l--; + } + } + print("\a"); + print($test = substr($test, $r, $l - $r)); + $r = length($return .= $test); + } + last CASE; + }; + + # (^D) completion list + $_ eq $complete && do { + print(join("\r\n", '', grep(/^\Q$return/, @cmp_lst)), "\r\n"); + redo LOOP; + }; + + # (^U) kill + $_ eq $kill && do { + if ($r) { + $r = 0; + $return = ""; + print("\r\n"); + redo LOOP; + } + last CASE; + }; + + # (DEL) || (BS) erase + ($_ eq $erase1 || $_ eq $erase2) && do { + if($r) { + print("\b \b"); + chop($return); + $r--; + } + last CASE; + }; + + # printable char + ord >= 32 && do { + $return .= $_; + $r++; + print; + last CASE; + }; + } + } + } + + # system $tty_restore if defined $tty_restore; + if (defined $tty_saved_state && defined $tty_restore && defined $tty_safe_restore) + { + system $tty_restore; + if ($?) { + # tty_restore caused error + system $tty_safe_restore; + } + } + print("\n"); + $return; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Term/ReadLine.pm b/Master/tlpkg/tlperl.old/lib/Term/ReadLine.pm new file mode 100644 index 00000000000..48eb9911a6f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Term/ReadLine.pm @@ -0,0 +1,399 @@ +=head1 NAME + +Term::ReadLine - Perl interface to various C<readline> packages. +If no real package is found, substitutes stubs instead of basic functions. + +=head1 SYNOPSIS + + use Term::ReadLine; + my $term = new Term::ReadLine 'Simple Perl calc'; + my $prompt = "Enter your arithmetic expression: "; + my $OUT = $term->OUT || \*STDOUT; + while ( defined ($_ = $term->readline($prompt)) ) { + my $res = eval($_); + warn $@ if $@; + print $OUT $res, "\n" unless $@; + $term->addhistory($_) if /\S/; + } + +=head1 DESCRIPTION + +This package is just a front end to some other packages. It's a stub to +set up a common interface to the various ReadLine implementations found on +CPAN (under the C<Term::ReadLine::*> namespace). + +=head1 Minimal set of supported functions + +All the supported functions should be called as methods, i.e., either as + + $term = new Term::ReadLine 'name'; + +or as + + $term->addhistory('row'); + +where $term is a return value of Term::ReadLine-E<gt>new(). + +=over 12 + +=item C<ReadLine> + +returns the actual package that executes the commands. Among possible +values are C<Term::ReadLine::Gnu>, C<Term::ReadLine::Perl>, +C<Term::ReadLine::Stub>. + +=item C<new> + +returns the handle for subsequent calls to following +functions. Argument is the name of the application. Optionally can be +followed by two arguments for C<IN> and C<OUT> filehandles. These +arguments should be globs. + +=item C<readline> + +gets an input line, I<possibly> with actual C<readline> +support. Trailing newline is removed. Returns C<undef> on C<EOF>. + +=item C<addhistory> + +adds the line to the history of input, from where it can be used if +the actual C<readline> is present. + +=item C<IN>, C<OUT> + +return the filehandles for input and output or C<undef> if C<readline> +input and output cannot be used for Perl. + +=item C<MinLine> + +If argument is specified, it is an advice on minimal size of line to +be included into history. C<undef> means do not include anything into +history. Returns the old value. + +=item C<findConsole> + +returns an array with two strings that give most appropriate names for +files for input and output using conventions C<"E<lt>$in">, C<"E<gt>out">. + +=item Attribs + +returns a reference to a hash which describes internal configuration +of the package. Names of keys in this hash conform to standard +conventions with the leading C<rl_> stripped. + +=item C<Features> + +Returns a reference to a hash with keys being features present in +current implementation. Several optional features are used in the +minimal interface: C<appname> should be present if the first argument +to C<new> is recognized, and C<minline> should be present if +C<MinLine> method is not dummy. C<autohistory> should be present if +lines are put into history automatically (maybe subject to +C<MinLine>), and C<addhistory> if C<addhistory> method is not dummy. + +If C<Features> method reports a feature C<attribs> as present, the +method C<Attribs> is not dummy. + +=back + +=head1 Additional supported functions + +Actually C<Term::ReadLine> can use some other package, that will +support a richer set of commands. + +All these commands are callable via method interface and have names +which conform to standard conventions with the leading C<rl_> stripped. + +The stub package included with the perl distribution allows some +additional methods: + +=over 12 + +=item C<tkRunning> + +makes Tk event loop run when waiting for user input (i.e., during +C<readline> method). + +=item C<ornaments> + +makes the command line stand out by using termcap data. The argument +to C<ornaments> should be 0, 1, or a string of a form +C<"aa,bb,cc,dd">. Four components of this string should be names of +I<terminal capacities>, first two will be issued to make the prompt +standout, last two to make the input line standout. + +=item C<newTTY> + +takes two arguments which are input filehandle and output filehandle. +Switches to use these filehandles. + +=back + +One can check whether the currently loaded ReadLine package supports +these methods by checking for corresponding C<Features>. + +=head1 EXPORTS + +None + +=head1 ENVIRONMENT + +The environment variable C<PERL_RL> governs which ReadLine clone is +loaded. If the value is false, a dummy interface is used. If the value +is true, it should be tail of the name of the package to use, such as +C<Perl> or C<Gnu>. + +As a special case, if the value of this variable is space-separated, +the tail might be used to disable the ornaments by setting the tail to +be C<o=0> or C<ornaments=0>. The head should be as described above, say + +If the variable is not set, or if the head of space-separated list is +empty, the best available package is loaded. + + export "PERL_RL=Perl o=0" # Use Perl ReadLine without ornaments + export "PERL_RL= o=0" # Use best available ReadLine without ornaments + +(Note that processing of C<PERL_RL> for ornaments is in the discretion of the +particular used C<Term::ReadLine::*> package). + +=head1 CAVEATS + +It seems that using Term::ReadLine from Emacs minibuffer doesn't work +quite right and one will get an error message like + + Cannot open /dev/tty for read at ... + +One possible workaround for this is to explicitly open /dev/tty like this + + open (FH, "/dev/tty" ) + or eval 'sub Term::ReadLine::findConsole { ("&STDIN", "&STDERR") }'; + die $@ if $@; + close (FH); + +or you can try using the 4-argument form of Term::ReadLine->new(). + +=cut + +use strict; + +package Term::ReadLine::Stub; +our @ISA = qw'Term::ReadLine::Tk Term::ReadLine::TermCap'; + +$DB::emacs = $DB::emacs; # To peacify -w +our @rl_term_set; +*rl_term_set = \@Term::ReadLine::TermCap::rl_term_set; + +sub PERL_UNICODE_STDIN () { 0x0001 } + +sub ReadLine {'Term::ReadLine::Stub'} +sub readline { + my $self = shift; + my ($in,$out,$str) = @$self; + my $prompt = shift; + print $out $rl_term_set[0], $prompt, $rl_term_set[1], $rl_term_set[2]; + $self->register_Tk + if not $Term::ReadLine::registered and $Term::ReadLine::toloop + and defined &Tk::DoOneEvent; + #$str = scalar <$in>; + $str = $self->get_line; + $str =~ s/^\s*\Q$prompt\E// if ($^O eq 'MacOS'); + utf8::upgrade($str) + if (${^UNICODE} & PERL_UNICODE_STDIN || defined ${^ENCODING}) && + utf8::valid($str); + print $out $rl_term_set[3]; + # bug in 5.000: chomping empty string creats length -1: + chomp $str if defined $str; + $str; +} +sub addhistory {} + +sub findConsole { + my $console; + + if ($^O eq 'MacOS') { + $console = "Dev:Console"; + } elsif (-e "/dev/tty") { + $console = "/dev/tty"; + } elsif (-e "con" or $^O eq 'MSWin32') { + $console = "con"; + } else { + $console = "sys\$command"; + } + + if (($^O eq 'amigaos') || ($^O eq 'beos') || ($^O eq 'epoc')) { + $console = undef; + } + elsif ($^O eq 'os2') { + if ($DB::emacs) { + $console = undef; + } else { + $console = "/dev/con"; + } + } + + my $consoleOUT = $console; + $console = "&STDIN" unless defined $console; + if (!defined $consoleOUT) { + $consoleOUT = defined fileno(STDERR) ? "&STDERR" : "&STDOUT"; + } + ($console,$consoleOUT); +} + +sub new { + die "method new called with wrong number of arguments" + unless @_==2 or @_==4; + #local (*FIN, *FOUT); + my ($FIN, $FOUT, $ret); + if (@_==2) { + my($console, $consoleOUT) = $_[0]->findConsole; + + open(FIN, "<$console"); + open(FOUT,">$consoleOUT"); + #OUT->autoflush(1); # Conflicts with debugger? + my $sel = select(FOUT); + $| = 1; # for DB::OUT + select($sel); + $ret = bless [\*FIN, \*FOUT]; + } else { # Filehandles supplied + $FIN = $_[2]; $FOUT = $_[3]; + #OUT->autoflush(1); # Conflicts with debugger? + my $sel = select($FOUT); + $| = 1; # for DB::OUT + select($sel); + $ret = bless [$FIN, $FOUT]; + } + if ($ret->Features->{ornaments} + and not ($ENV{PERL_RL} and $ENV{PERL_RL} =~ /\bo\w*=0/)) { + local $Term::ReadLine::termcap_nowarn = 1; + $ret->ornaments(1); + } + return $ret; +} + +sub newTTY { + my ($self, $in, $out) = @_; + $self->[0] = $in; + $self->[1] = $out; + my $sel = select($out); + $| = 1; # for DB::OUT + select($sel); +} + +sub IN { shift->[0] } +sub OUT { shift->[1] } +sub MinLine { undef } +sub Attribs { {} } + +my %features = (tkRunning => 1, ornaments => 1, 'newTTY' => 1); +sub Features { \%features } + +package Term::ReadLine; # So late to allow the above code be defined? + +our $VERSION = '1.02'; + +my ($which) = exists $ENV{PERL_RL} ? split /\s+/, $ENV{PERL_RL} : undef; +if ($which) { + if ($which =~ /\bgnu\b/i){ + eval "use Term::ReadLine::Gnu;"; + } elsif ($which =~ /\bperl\b/i) { + eval "use Term::ReadLine::Perl;"; + } else { + eval "use Term::ReadLine::$which;"; + } +} elsif (defined $which and $which ne '') { # Defined but false + # Do nothing fancy +} else { + eval "use Term::ReadLine::Gnu; 1" or eval "use Term::ReadLine::Perl; 1"; +} + +#require FileHandle; + +# To make possible switch off RL in debugger: (Not needed, work done +# in debugger). +our @ISA; +if (defined &Term::ReadLine::Gnu::readline) { + @ISA = qw(Term::ReadLine::Gnu Term::ReadLine::Stub); +} elsif (defined &Term::ReadLine::Perl::readline) { + @ISA = qw(Term::ReadLine::Perl Term::ReadLine::Stub); +} elsif (defined $which && defined &{"Term::ReadLine::$which\::readline"}) { + @ISA = "Term::ReadLine::$which"; +} else { + @ISA = qw(Term::ReadLine::Stub); +} + +package Term::ReadLine::TermCap; + +# Prompt-start, prompt-end, command-line-start, command-line-end +# -- zero-width beautifies to emit around prompt and the command line. +our @rl_term_set = ("","","",""); +# string encoded: +our $rl_term_set = ',,,'; + +our $terminal; +sub LoadTermCap { + return if defined $terminal; + + require Term::Cap; + $terminal = Tgetent Term::Cap ({OSPEED => 9600}); # Avoid warning. +} + +sub ornaments { + shift; + return $rl_term_set unless @_; + $rl_term_set = shift; + $rl_term_set ||= ',,,'; + $rl_term_set = 'us,ue,md,me' if $rl_term_set eq '1'; + my @ts = split /,/, $rl_term_set, 4; + eval { LoadTermCap }; + unless (defined $terminal) { + warn("Cannot find termcap: $@\n") unless $Term::ReadLine::termcap_nowarn; + $rl_term_set = ',,,'; + return; + } + @rl_term_set = map {$_ ? $terminal->Tputs($_,1) || '' : ''} @ts; + return $rl_term_set; +} + + +package Term::ReadLine::Tk; + +our($count_handle, $count_DoOne, $count_loop); +$count_handle = $count_DoOne = $count_loop = 0; + +our($giveup); +sub handle {$giveup = 1; $count_handle++} + +sub Tk_loop { + # Tk->tkwait('variable',\$giveup); # needs Widget + $count_DoOne++, Tk::DoOneEvent(0) until $giveup; + $count_loop++; + $giveup = 0; +} + +sub register_Tk { + my $self = shift; + $Term::ReadLine::registered++ + or Tk->fileevent($self->IN,'readable',\&handle); +} + +sub tkRunning { + $Term::ReadLine::toloop = $_[1] if @_ > 1; + $Term::ReadLine::toloop; +} + +sub get_c { + my $self = shift; + $self->Tk_loop if $Term::ReadLine::toloop && defined &Tk::DoOneEvent; + return getc $self->IN; +} + +sub get_line { + my $self = shift; + $self->Tk_loop if $Term::ReadLine::toloop && defined &Tk::DoOneEvent; + my $in = $self->IN; + local ($/) = "\n"; + return scalar <$in>; +} + +1; + diff --git a/Master/tlpkg/tlperl.old/lib/Text/Abbrev.pm b/Master/tlpkg/tlperl.old/lib/Text/Abbrev.pm new file mode 100644 index 00000000000..c6be63bcc60 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Text/Abbrev.pm @@ -0,0 +1,84 @@ +package Text::Abbrev; +require 5.005; # Probably works on earlier versions too. +require Exporter; + +our $VERSION = '1.01'; + +=head1 NAME + +abbrev - create an abbreviation table from a list + +=head1 SYNOPSIS + + use Text::Abbrev; + abbrev $hashref, LIST + + +=head1 DESCRIPTION + +Stores all unambiguous truncations of each element of LIST +as keys in the associative array referenced by C<$hashref>. +The values are the original list elements. + +=head1 EXAMPLE + + $hashref = abbrev qw(list edit send abort gripe); + + %hash = abbrev qw(list edit send abort gripe); + + abbrev $hashref, qw(list edit send abort gripe); + + abbrev(*hash, qw(list edit send abort gripe)); + +=cut + +@ISA = qw(Exporter); +@EXPORT = qw(abbrev); + +# Usage: +# abbrev \%foo, LIST; +# ... +# $long = $foo{$short}; + +sub abbrev { + my ($word, $hashref, $glob, %table, $returnvoid); + + @_ or return; # So we don't autovivify onto @_ and trigger warning + if (ref($_[0])) { # hash reference preferably + $hashref = shift; + $returnvoid = 1; + } elsif (ref \$_[0] eq 'GLOB') { # is actually a glob (deprecated) + $hashref = \%{shift()}; + $returnvoid = 1; + } + %{$hashref} = (); + + WORD: foreach $word (@_) { + for (my $len = (length $word) - 1; $len > 0; --$len) { + my $abbrev = substr($word,0,$len); + my $seen = ++$table{$abbrev}; + if ($seen == 1) { # We're the first word so far to have + # this abbreviation. + $hashref->{$abbrev} = $word; + } elsif ($seen == 2) { # We're the second word to have this + # abbreviation, so we can't use it. + delete $hashref->{$abbrev}; + } else { # We're the third word to have this + # abbreviation, so skip to the next word. + next WORD; + } + } + } + # Non-abbreviations always get entered, even if they aren't unique + foreach $word (@_) { + $hashref->{$word} = $word; + } + return if $returnvoid; + if (wantarray) { + %{$hashref}; + } else { + $hashref; + } +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Text/Balanced.pm b/Master/tlpkg/tlperl.old/lib/Text/Balanced.pm new file mode 100644 index 00000000000..820ae255a71 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Text/Balanced.pm @@ -0,0 +1,2302 @@ +# EXTRACT VARIOUSLY DELIMITED TEXT SEQUENCES FROM STRINGS. +# FOR FULL DOCUMENTATION SEE Balanced.pod + +use 5.005; +use strict; + +package Text::Balanced; + +use Exporter; +use SelfLoader; +use vars qw { $VERSION @ISA %EXPORT_TAGS }; + +$VERSION = '1.95'; +@ISA = qw ( Exporter ); + +%EXPORT_TAGS = ( ALL => [ qw( + &extract_delimited + &extract_bracketed + &extract_quotelike + &extract_codeblock + &extract_variable + &extract_tagged + &extract_multiple + + &gen_delimited_pat + &gen_extract_tagged + + &delimited_pat + ) ] ); + +Exporter::export_ok_tags('ALL'); + +# PROTOTYPES + +sub _match_bracketed($$$$$$); +sub _match_variable($$); +sub _match_codeblock($$$$$$$); +sub _match_quotelike($$$$); + +# HANDLE RETURN VALUES IN VARIOUS CONTEXTS + +sub _failmsg { + my ($message, $pos) = @_; + $@ = bless { error=>$message, pos=>$pos }, "Text::Balanced::ErrorMsg"; +} + +sub _fail +{ + my ($wantarray, $textref, $message, $pos) = @_; + _failmsg $message, $pos if $message; + return ("",$$textref,"") if $wantarray; + return undef; +} + +sub _succeed +{ + $@ = undef; + my ($wantarray,$textref) = splice @_, 0, 2; + my ($extrapos, $extralen) = @_>18 ? splice(@_, -2, 2) : (0,0); + my ($startlen) = $_[5]; + my $remainderpos = $_[2]; + if ($wantarray) + { + my @res; + while (my ($from, $len) = splice @_, 0, 2) + { + push @res, substr($$textref,$from,$len); + } + if ($extralen) { # CORRECT FILLET + my $extra = substr($res[0], $extrapos-$startlen, $extralen, "\n"); + $res[1] = "$extra$res[1]"; + eval { substr($$textref,$remainderpos,0) = $extra; + substr($$textref,$extrapos,$extralen,"\n")} ; + #REARRANGE HERE DOC AND FILLET IF POSSIBLE + pos($$textref) = $remainderpos-$extralen+1; # RESET \G + } + else { + pos($$textref) = $remainderpos; # RESET \G + } + return @res; + } + else + { + my $match = substr($$textref,$_[0],$_[1]); + substr($match,$extrapos-$_[0]-$startlen,$extralen,"") if $extralen; + my $extra = $extralen + ? substr($$textref, $extrapos, $extralen)."\n" : ""; + eval {substr($$textref,$_[4],$_[1]+$_[5])=$extra} ; #CHOP OUT PREFIX & MATCH, IF POSSIBLE + pos($$textref) = $_[4]; # RESET \G + return $match; + } +} + +# BUILD A PATTERN MATCHING A SIMPLE DELIMITED STRING + +sub gen_delimited_pat($;$) # ($delimiters;$escapes) +{ + my ($dels, $escs) = @_; + return "" unless $dels =~ /\S/; + $escs = '\\' unless $escs; + $escs .= substr($escs,-1) x (length($dels)-length($escs)); + my @pat = (); + my $i; + for ($i=0; $i<length $dels; $i++) + { + my $del = quotemeta substr($dels,$i,1); + my $esc = quotemeta substr($escs,$i,1); + if ($del eq $esc) + { + push @pat, "$del(?:[^$del]*(?:(?:$del$del)[^$del]*)*)$del"; + } + else + { + push @pat, "$del(?:[^$esc$del]*(?:$esc.[^$esc$del]*)*)$del"; + } + } + my $pat = join '|', @pat; + return "(?:$pat)"; +} + +*delimited_pat = \&gen_delimited_pat; + + +# THE EXTRACTION FUNCTIONS + +sub extract_delimited (;$$$$) +{ + my $textref = defined $_[0] ? \$_[0] : \$_; + my $wantarray = wantarray; + my $del = defined $_[1] ? $_[1] : qq{\'\"\`}; + my $pre = defined $_[2] ? $_[2] : '\s*'; + my $esc = defined $_[3] ? $_[3] : qq{\\}; + my $pat = gen_delimited_pat($del, $esc); + my $startpos = pos $$textref || 0; + return _fail($wantarray, $textref, "Not a delimited pattern", 0) + unless $$textref =~ m/\G($pre)($pat)/gc; + my $prelen = length($1); + my $matchpos = $startpos+$prelen; + my $endpos = pos $$textref; + return _succeed $wantarray, $textref, + $matchpos, $endpos-$matchpos, # MATCH + $endpos, length($$textref)-$endpos, # REMAINDER + $startpos, $prelen; # PREFIX +} + +sub extract_bracketed (;$$$) +{ + my $textref = defined $_[0] ? \$_[0] : \$_; + my $ldel = defined $_[1] ? $_[1] : '{([<'; + my $pre = defined $_[2] ? $_[2] : '\s*'; + my $wantarray = wantarray; + my $qdel = ""; + my $quotelike; + $ldel =~ s/'//g and $qdel .= q{'}; + $ldel =~ s/"//g and $qdel .= q{"}; + $ldel =~ s/`//g and $qdel .= q{`}; + $ldel =~ s/q//g and $quotelike = 1; + $ldel =~ tr/[](){}<>\0-\377/[[(({{<</ds; + my $rdel = $ldel; + unless ($rdel =~ tr/[({</])}>/) + { + return _fail $wantarray, $textref, + "Did not find a suitable bracket in delimiter: \"$_[1]\"", + 0; + } + my $posbug = pos; + $ldel = join('|', map { quotemeta $_ } split('', $ldel)); + $rdel = join('|', map { quotemeta $_ } split('', $rdel)); + pos = $posbug; + + my $startpos = pos $$textref || 0; + my @match = _match_bracketed($textref,$pre, $ldel, $qdel, $quotelike, $rdel); + + return _fail ($wantarray, $textref) unless @match; + + return _succeed ( $wantarray, $textref, + $match[2], $match[5]+2, # MATCH + @match[8,9], # REMAINDER + @match[0,1], # PREFIX + ); +} + +sub _match_bracketed($$$$$$) # $textref, $pre, $ldel, $qdel, $quotelike, $rdel +{ + my ($textref, $pre, $ldel, $qdel, $quotelike, $rdel) = @_; + my ($startpos, $ldelpos, $endpos) = (pos $$textref = pos $$textref||0); + unless ($$textref =~ m/\G$pre/gc) + { + _failmsg "Did not find prefix: /$pre/", $startpos; + return; + } + + $ldelpos = pos $$textref; + + unless ($$textref =~ m/\G($ldel)/gc) + { + _failmsg "Did not find opening bracket after prefix: \"$pre\"", + pos $$textref; + pos $$textref = $startpos; + return; + } + + my @nesting = ( $1 ); + my $textlen = length $$textref; + while (pos $$textref < $textlen) + { + next if $$textref =~ m/\G\\./gcs; + + if ($$textref =~ m/\G($ldel)/gc) + { + push @nesting, $1; + } + elsif ($$textref =~ m/\G($rdel)/gc) + { + my ($found, $brackettype) = ($1, $1); + if ($#nesting < 0) + { + _failmsg "Unmatched closing bracket: \"$found\"", + pos $$textref; + pos $$textref = $startpos; + return; + } + my $expected = pop(@nesting); + $expected =~ tr/({[</)}]>/; + if ($expected ne $brackettype) + { + _failmsg qq{Mismatched closing bracket: expected "$expected" but found "$found"}, + pos $$textref; + pos $$textref = $startpos; + return; + } + last if $#nesting < 0; + } + elsif ($qdel && $$textref =~ m/\G([$qdel])/gc) + { + $$textref =~ m/\G[^\\$1]*(?:\\.[^\\$1]*)*(\Q$1\E)/gsc and next; + _failmsg "Unmatched embedded quote ($1)", + pos $$textref; + pos $$textref = $startpos; + return; + } + elsif ($quotelike && _match_quotelike($textref,"",1,0)) + { + next; + } + + else { $$textref =~ m/\G(?:[a-zA-Z0-9]+|.)/gcs } + } + if ($#nesting>=0) + { + _failmsg "Unmatched opening bracket(s): " + . join("..",@nesting)."..", + pos $$textref; + pos $$textref = $startpos; + return; + } + + $endpos = pos $$textref; + + return ( + $startpos, $ldelpos-$startpos, # PREFIX + $ldelpos, 1, # OPENING BRACKET + $ldelpos+1, $endpos-$ldelpos-2, # CONTENTS + $endpos-1, 1, # CLOSING BRACKET + $endpos, length($$textref)-$endpos, # REMAINDER + ); +} + +sub revbracket($) +{ + my $brack = reverse $_[0]; + $brack =~ tr/[({</])}>/; + return $brack; +} + +my $XMLNAME = q{[a-zA-Z_:][a-zA-Z0-9_:.-]*}; + +sub extract_tagged (;$$$$$) # ($text, $opentag, $closetag, $pre, \%options) +{ + my $textref = defined $_[0] ? \$_[0] : \$_; + my $ldel = $_[1]; + my $rdel = $_[2]; + my $pre = defined $_[3] ? $_[3] : '\s*'; + my %options = defined $_[4] ? %{$_[4]} : (); + my $omode = defined $options{fail} ? $options{fail} : ''; + my $bad = ref($options{reject}) eq 'ARRAY' ? join('|', @{$options{reject}}) + : defined($options{reject}) ? $options{reject} + : '' + ; + my $ignore = ref($options{ignore}) eq 'ARRAY' ? join('|', @{$options{ignore}}) + : defined($options{ignore}) ? $options{ignore} + : '' + ; + + if (!defined $ldel) { $ldel = '<\w+(?:' . gen_delimited_pat(q{'"}) . '|[^>])*>'; } + $@ = undef; + + my @match = _match_tagged($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore); + + return _fail(wantarray, $textref) unless @match; + return _succeed wantarray, $textref, + $match[2], $match[3]+$match[5]+$match[7], # MATCH + @match[8..9,0..1,2..7]; # REM, PRE, BITS +} + +sub _match_tagged # ($$$$$$$) +{ + my ($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore) = @_; + my $rdelspec; + + my ($startpos, $opentagpos, $textpos, $parapos, $closetagpos, $endpos) = ( pos($$textref) = pos($$textref)||0 ); + + unless ($$textref =~ m/\G($pre)/gc) + { + _failmsg "Did not find prefix: /$pre/", pos $$textref; + goto failed; + } + + $opentagpos = pos($$textref); + + unless ($$textref =~ m/\G$ldel/gc) + { + _failmsg "Did not find opening tag: /$ldel/", pos $$textref; + goto failed; + } + + $textpos = pos($$textref); + + if (!defined $rdel) + { + $rdelspec = $&; + unless ($rdelspec =~ s/\A([[(<{]+)($XMLNAME).*/ quotemeta "$1\/$2". revbracket($1) /oes) + { + _failmsg "Unable to construct closing tag to match: $rdel", + pos $$textref; + goto failed; + } + } + else + { + $rdelspec = eval "qq{$rdel}" || do { + my $del; + for (qw,~ ! ^ & * ) _ + - = } ] : " ; ' > . ? / | ',) + { next if $rdel =~ /\Q$_/; $del = $_; last } + unless ($del) { + use Carp; + croak "Can't interpolate right delimiter $rdel" + } + eval "qq$del$rdel$del"; + }; + } + + while (pos($$textref) < length($$textref)) + { + next if $$textref =~ m/\G\\./gc; + + if ($$textref =~ m/\G(\n[ \t]*\n)/gc ) + { + $parapos = pos($$textref) - length($1) + unless defined $parapos; + } + elsif ($$textref =~ m/\G($rdelspec)/gc ) + { + $closetagpos = pos($$textref)-length($1); + goto matched; + } + elsif ($ignore && $$textref =~ m/\G(?:$ignore)/gc) + { + next; + } + elsif ($bad && $$textref =~ m/\G($bad)/gcs) + { + pos($$textref) -= length($1); # CUT OFF WHATEVER CAUSED THE SHORTNESS + goto short if ($omode eq 'PARA' || $omode eq 'MAX'); + _failmsg "Found invalid nested tag: $1", pos $$textref; + goto failed; + } + elsif ($$textref =~ m/\G($ldel)/gc) + { + my $tag = $1; + pos($$textref) -= length($tag); # REWIND TO NESTED TAG + unless (_match_tagged(@_)) # MATCH NESTED TAG + { + goto short if $omode eq 'PARA' || $omode eq 'MAX'; + _failmsg "Found unbalanced nested tag: $tag", + pos $$textref; + goto failed; + } + } + else { $$textref =~ m/./gcs } + } + +short: + $closetagpos = pos($$textref); + goto matched if $omode eq 'MAX'; + goto failed unless $omode eq 'PARA'; + + if (defined $parapos) { pos($$textref) = $parapos } + else { $parapos = pos($$textref) } + + return ( + $startpos, $opentagpos-$startpos, # PREFIX + $opentagpos, $textpos-$opentagpos, # OPENING TAG + $textpos, $parapos-$textpos, # TEXT + $parapos, 0, # NO CLOSING TAG + $parapos, length($$textref)-$parapos, # REMAINDER + ); + +matched: + $endpos = pos($$textref); + return ( + $startpos, $opentagpos-$startpos, # PREFIX + $opentagpos, $textpos-$opentagpos, # OPENING TAG + $textpos, $closetagpos-$textpos, # TEXT + $closetagpos, $endpos-$closetagpos, # CLOSING TAG + $endpos, length($$textref)-$endpos, # REMAINDER + ); + +failed: + _failmsg "Did not find closing tag", pos $$textref unless $@; + pos($$textref) = $startpos; + return; +} + +sub extract_variable (;$$) +{ + my $textref = defined $_[0] ? \$_[0] : \$_; + return ("","","") unless defined $$textref; + my $pre = defined $_[1] ? $_[1] : '\s*'; + + my @match = _match_variable($textref,$pre); + + return _fail wantarray, $textref unless @match; + + return _succeed wantarray, $textref, + @match[2..3,4..5,0..1]; # MATCH, REMAINDER, PREFIX +} + +sub _match_variable($$) +{ +# $# +# $^ +# $$ + my ($textref, $pre) = @_; + my $startpos = pos($$textref) = pos($$textref)||0; + unless ($$textref =~ m/\G($pre)/gc) + { + _failmsg "Did not find prefix: /$pre/", pos $$textref; + return; + } + my $varpos = pos($$textref); + unless ($$textref =~ m{\G\$\s*(?!::)(\d+|[][&`'+*./|,";%=~:?!\@<>()-]|\^[a-z]?)}gci) + { + unless ($$textref =~ m/\G((\$#?|[*\@\%]|\\&)+)/gc) + { + _failmsg "Did not find leading dereferencer", pos $$textref; + pos $$textref = $startpos; + return; + } + my $deref = $1; + + unless ($$textref =~ m/\G\s*(?:::|')?(?:[_a-z]\w*(?:::|'))*[_a-z]\w*/gci + or _match_codeblock($textref, "", '\{', '\}', '\{', '\}', 0) + or $deref eq '$#' or $deref eq '$$' ) + { + _failmsg "Bad identifier after dereferencer", pos $$textref; + pos $$textref = $startpos; + return; + } + } + + while (1) + { + next if $$textref =~ m/\G\s*(?:->)?\s*[{]\w+[}]/gc; + next if _match_codeblock($textref, + qr/\s*->\s*(?:[_a-zA-Z]\w+\s*)?/, + qr/[({[]/, qr/[)}\]]/, + qr/[({[]/, qr/[)}\]]/, 0); + next if _match_codeblock($textref, + qr/\s*/, qr/[{[]/, qr/[}\]]/, + qr/[{[]/, qr/[}\]]/, 0); + next if _match_variable($textref,'\s*->\s*'); + next if $$textref =~ m/\G\s*->\s*\w+(?![{([])/gc; + last; + } + + my $endpos = pos($$textref); + return ($startpos, $varpos-$startpos, + $varpos, $endpos-$varpos, + $endpos, length($$textref)-$endpos + ); +} + +sub extract_codeblock (;$$$$$) +{ + my $textref = defined $_[0] ? \$_[0] : \$_; + my $wantarray = wantarray; + my $ldel_inner = defined $_[1] ? $_[1] : '{'; + my $pre = defined $_[2] ? $_[2] : '\s*'; + my $ldel_outer = defined $_[3] ? $_[3] : $ldel_inner; + my $rd = $_[4]; + my $rdel_inner = $ldel_inner; + my $rdel_outer = $ldel_outer; + my $posbug = pos; + for ($ldel_inner, $ldel_outer) { tr/[]()<>{}\0-\377/[[((<<{{/ds } + for ($rdel_inner, $rdel_outer) { tr/[]()<>{}\0-\377/]]))>>}}/ds } + for ($ldel_inner, $ldel_outer, $rdel_inner, $rdel_outer) + { + $_ = '('.join('|',map { quotemeta $_ } split('',$_)).')' + } + pos = $posbug; + + my @match = _match_codeblock($textref, $pre, + $ldel_outer, $rdel_outer, + $ldel_inner, $rdel_inner, + $rd); + return _fail($wantarray, $textref) unless @match; + return _succeed($wantarray, $textref, + @match[2..3,4..5,0..1] # MATCH, REMAINDER, PREFIX + ); + +} + +sub _match_codeblock($$$$$$$) +{ + my ($textref, $pre, $ldel_outer, $rdel_outer, $ldel_inner, $rdel_inner, $rd) = @_; + my $startpos = pos($$textref) = pos($$textref) || 0; + unless ($$textref =~ m/\G($pre)/gc) + { + _failmsg qq{Did not match prefix /$pre/ at"} . + substr($$textref,pos($$textref),20) . + q{..."}, + pos $$textref; + return; + } + my $codepos = pos($$textref); + unless ($$textref =~ m/\G($ldel_outer)/gc) # OUTERMOST DELIMITER + { + _failmsg qq{Did not find expected opening bracket at "} . + substr($$textref,pos($$textref),20) . + q{..."}, + pos $$textref; + pos $$textref = $startpos; + return; + } + my $closing = $1; + $closing =~ tr/([<{/)]>}/; + my $matched; + my $patvalid = 1; + while (pos($$textref) < length($$textref)) + { + $matched = ''; + if ($rd && $$textref =~ m#\G(\Q(?)\E|\Q(s?)\E|\Q(s)\E)#gc) + { + $patvalid = 0; + next; + } + + if ($$textref =~ m/\G\s*#.*/gc) + { + next; + } + + if ($$textref =~ m/\G\s*($rdel_outer)/gc) + { + unless ($matched = ($closing && $1 eq $closing) ) + { + next if $1 eq '>'; # MIGHT BE A "LESS THAN" + _failmsg q{Mismatched closing bracket at "} . + substr($$textref,pos($$textref),20) . + qq{...". Expected '$closing'}, + pos $$textref; + } + last; + } + + if (_match_variable($textref,'\s*') || + _match_quotelike($textref,'\s*',$patvalid,$patvalid) ) + { + $patvalid = 0; + next; + } + + + # NEED TO COVER MANY MORE CASES HERE!!! + if ($$textref =~ m#\G\s*(?!$ldel_inner) + ( [-+*x/%^&|.]=? + | [!=]~ + | =(?!>) + | (\*\*|&&|\|\||<<|>>)=? + | split|grep|map|return + | [([] + )#gcx) + { + $patvalid = 1; + next; + } + + if ( _match_codeblock($textref, '\s*', $ldel_inner, $rdel_inner, $ldel_inner, $rdel_inner, $rd) ) + { + $patvalid = 1; + next; + } + + if ($$textref =~ m/\G\s*$ldel_outer/gc) + { + _failmsg q{Improperly nested codeblock at "} . + substr($$textref,pos($$textref),20) . + q{..."}, + pos $$textref; + last; + } + + $patvalid = 0; + $$textref =~ m/\G\s*(\w+|[-=>]>|.|\Z)/gc; + } + continue { $@ = undef } + + unless ($matched) + { + _failmsg 'No match found for opening bracket', pos $$textref + unless $@; + return; + } + + my $endpos = pos($$textref); + return ( $startpos, $codepos-$startpos, + $codepos, $endpos-$codepos, + $endpos, length($$textref)-$endpos, + ); +} + + +my %mods = ( + 'none' => '[cgimsox]*', + 'm' => '[cgimsox]*', + 's' => '[cegimsox]*', + 'tr' => '[cds]*', + 'y' => '[cds]*', + 'qq' => '', + 'qx' => '', + 'qw' => '', + 'qr' => '[imsx]*', + 'q' => '', + ); + +sub extract_quotelike (;$$) +{ + my $textref = $_[0] ? \$_[0] : \$_; + my $wantarray = wantarray; + my $pre = defined $_[1] ? $_[1] : '\s*'; + + my @match = _match_quotelike($textref,$pre,1,0); + return _fail($wantarray, $textref) unless @match; + return _succeed($wantarray, $textref, + $match[2], $match[18]-$match[2], # MATCH + @match[18,19], # REMAINDER + @match[0,1], # PREFIX + @match[2..17], # THE BITS + @match[20,21], # ANY FILLET? + ); +}; + +sub _match_quotelike($$$$) # ($textref, $prepat, $allow_raw_match) +{ + my ($textref, $pre, $rawmatch, $qmark) = @_; + + my ($textlen,$startpos, + $oppos, + $preld1pos,$ld1pos,$str1pos,$rd1pos, + $preld2pos,$ld2pos,$str2pos,$rd2pos, + $modpos) = ( length($$textref), pos($$textref) = pos($$textref) || 0 ); + + unless ($$textref =~ m/\G($pre)/gc) + { + _failmsg qq{Did not find prefix /$pre/ at "} . + substr($$textref, pos($$textref), 20) . + q{..."}, + pos $$textref; + return; + } + $oppos = pos($$textref); + + my $initial = substr($$textref,$oppos,1); + + if ($initial && $initial =~ m|^[\"\'\`]| + || $rawmatch && $initial =~ m|^/| + || $qmark && $initial =~ m|^\?|) + { + unless ($$textref =~ m/ \Q$initial\E [^\\$initial]* (\\.[^\\$initial]*)* \Q$initial\E /gcsx) + { + _failmsg qq{Did not find closing delimiter to match '$initial' at "} . + substr($$textref, $oppos, 20) . + q{..."}, + pos $$textref; + pos $$textref = $startpos; + return; + } + $modpos= pos($$textref); + $rd1pos = $modpos-1; + + if ($initial eq '/' || $initial eq '?') + { + $$textref =~ m/\G$mods{none}/gc + } + + my $endpos = pos($$textref); + return ( + $startpos, $oppos-$startpos, # PREFIX + $oppos, 0, # NO OPERATOR + $oppos, 1, # LEFT DEL + $oppos+1, $rd1pos-$oppos-1, # STR/PAT + $rd1pos, 1, # RIGHT DEL + $modpos, 0, # NO 2ND LDEL + $modpos, 0, # NO 2ND STR + $modpos, 0, # NO 2ND RDEL + $modpos, $endpos-$modpos, # MODIFIERS + $endpos, $textlen-$endpos, # REMAINDER + ); + } + + unless ($$textref =~ m{\G(\b(?:m|s|qq|qx|qw|q|qr|tr|y)\b(?=\s*\S)|<<)}gc) + { + _failmsg q{No quotelike operator found after prefix at "} . + substr($$textref, pos($$textref), 20) . + q{..."}, + pos $$textref; + pos $$textref = $startpos; + return; + } + + my $op = $1; + $preld1pos = pos($$textref); + if ($op eq '<<') { + $ld1pos = pos($$textref); + my $label; + if ($$textref =~ m{\G([A-Za-z_]\w*)}gc) { + $label = $1; + } + elsif ($$textref =~ m{ \G ' ([^'\\]* (?:\\.[^'\\]*)*) ' + | \G " ([^"\\]* (?:\\.[^"\\]*)*) " + | \G ` ([^`\\]* (?:\\.[^`\\]*)*) ` + }gcsx) { + $label = $+; + } + else { + $label = ""; + } + my $extrapos = pos($$textref); + $$textref =~ m{.*\n}gc; + $str1pos = pos($$textref); + unless ($$textref =~ m{.*?\n(?=$label\n)}gc) { + _failmsg qq{Missing here doc terminator ('$label') after "} . + substr($$textref, $startpos, 20) . + q{..."}, + pos $$textref; + pos $$textref = $startpos; + return; + } + $rd1pos = pos($$textref); + $$textref =~ m{$label\n}gc; + $ld2pos = pos($$textref); + return ( + $startpos, $oppos-$startpos, # PREFIX + $oppos, length($op), # OPERATOR + $ld1pos, $extrapos-$ld1pos, # LEFT DEL + $str1pos, $rd1pos-$str1pos, # STR/PAT + $rd1pos, $ld2pos-$rd1pos, # RIGHT DEL + $ld2pos, 0, # NO 2ND LDEL + $ld2pos, 0, # NO 2ND STR + $ld2pos, 0, # NO 2ND RDEL + $ld2pos, 0, # NO MODIFIERS + $ld2pos, $textlen-$ld2pos, # REMAINDER + $extrapos, $str1pos-$extrapos, # FILLETED BIT + ); + } + + $$textref =~ m/\G\s*/gc; + $ld1pos = pos($$textref); + $str1pos = $ld1pos+1; + + unless ($$textref =~ m/\G(\S)/gc) # SHOULD USE LOOKAHEAD + { + _failmsg "No block delimiter found after quotelike $op", + pos $$textref; + pos $$textref = $startpos; + return; + } + pos($$textref) = $ld1pos; # HAVE TO DO THIS BECAUSE LOOKAHEAD BROKEN + my ($ldel1, $rdel1) = ("\Q$1","\Q$1"); + if ($ldel1 =~ /[[(<{]/) + { + $rdel1 =~ tr/[({</])}>/; + _match_bracketed($textref,"",$ldel1,"","",$rdel1) + || do { pos $$textref = $startpos; return }; + } + else + { + $$textref =~ /$ldel1[^\\$ldel1]*(\\.[^\\$ldel1]*)*$ldel1/gcs + || do { pos $$textref = $startpos; return }; + } + $ld2pos = $rd1pos = pos($$textref)-1; + + my $second_arg = $op =~ /s|tr|y/ ? 1 : 0; + if ($second_arg) + { + my ($ldel2, $rdel2); + if ($ldel1 =~ /[[(<{]/) + { + unless ($$textref =~ /\G\s*(\S)/gc) # SHOULD USE LOOKAHEAD + { + _failmsg "Missing second block for quotelike $op", + pos $$textref; + pos $$textref = $startpos; + return; + } + $ldel2 = $rdel2 = "\Q$1"; + $rdel2 =~ tr/[({</])}>/; + } + else + { + $ldel2 = $rdel2 = $ldel1; + } + $str2pos = $ld2pos+1; + + if ($ldel2 =~ /[[(<{]/) + { + pos($$textref)--; # OVERCOME BROKEN LOOKAHEAD + _match_bracketed($textref,"",$ldel2,"","",$rdel2) + || do { pos $$textref = $startpos; return }; + } + else + { + $$textref =~ /[^\\$ldel2]*(\\.[^\\$ldel2]*)*$ldel2/gcs + || do { pos $$textref = $startpos; return }; + } + $rd2pos = pos($$textref)-1; + } + else + { + $ld2pos = $str2pos = $rd2pos = $rd1pos; + } + + $modpos = pos $$textref; + + $$textref =~ m/\G($mods{$op})/gc; + my $endpos = pos $$textref; + + return ( + $startpos, $oppos-$startpos, # PREFIX + $oppos, length($op), # OPERATOR + $ld1pos, 1, # LEFT DEL + $str1pos, $rd1pos-$str1pos, # STR/PAT + $rd1pos, 1, # RIGHT DEL + $ld2pos, $second_arg, # 2ND LDEL (MAYBE) + $str2pos, $rd2pos-$str2pos, # 2ND STR (MAYBE) + $rd2pos, $second_arg, # 2ND RDEL (MAYBE) + $modpos, $endpos-$modpos, # MODIFIERS + $endpos, $textlen-$endpos, # REMAINDER + ); +} + +my $def_func = +[ + sub { extract_variable($_[0], '') }, + sub { extract_quotelike($_[0],'') }, + sub { extract_codeblock($_[0],'{}','') }, +]; + +sub extract_multiple (;$$$$) # ($text, $functions_ref, $max_fields, $ignoreunknown) +{ + my $textref = defined($_[0]) ? \$_[0] : \$_; + my $posbug = pos; + my ($lastpos, $firstpos); + my @fields = (); + + #for ($$textref) + { + my @func = defined $_[1] ? @{$_[1]} : @{$def_func}; + my $max = defined $_[2] && $_[2]>0 ? $_[2] : 1_000_000_000; + my $igunk = $_[3]; + + pos $$textref ||= 0; + + unless (wantarray) + { + use Carp; + carp "extract_multiple reset maximal count to 1 in scalar context" + if $^W && defined($_[2]) && $max > 1; + $max = 1 + } + + my $unkpos; + my $func; + my $class; + + my @class; + foreach $func ( @func ) + { + if (ref($func) eq 'HASH') + { + push @class, (keys %$func)[0]; + $func = (values %$func)[0]; + } + else + { + push @class, undef; + } + } + + FIELD: while (pos($$textref) < length($$textref)) + { + my ($field, $rem); + my @bits; + foreach my $i ( 0..$#func ) + { + my $pref; + $func = $func[$i]; + $class = $class[$i]; + $lastpos = pos $$textref; + if (ref($func) eq 'CODE') + { ($field,$rem,$pref) = @bits = $func->($$textref); + # print "[$field|$rem]" if $field; + } + elsif (ref($func) eq 'Text::Balanced::Extractor') + { @bits = $field = $func->extract($$textref) } + elsif( $$textref =~ m/\G$func/gc ) + { @bits = $field = defined($1) ? $1 : $& } + $pref ||= ""; + if (defined($field) && length($field)) + { + if (!$igunk) { + $unkpos = pos $$textref + if length($pref) && !defined($unkpos); + if (defined $unkpos) + { + push @fields, substr($$textref, $unkpos, $lastpos-$unkpos).$pref; + $firstpos = $unkpos unless defined $firstpos; + undef $unkpos; + last FIELD if @fields == $max; + } + } + push @fields, $class + ? bless (\$field, $class) + : $field; + $firstpos = $lastpos unless defined $firstpos; + $lastpos = pos $$textref; + last FIELD if @fields == $max; + next FIELD; + } + } + if ($$textref =~ /\G(.)/gcs) + { + $unkpos = pos($$textref)-1 + unless $igunk || defined $unkpos; + } + } + + if (defined $unkpos) + { + push @fields, substr($$textref, $unkpos); + $firstpos = $unkpos unless defined $firstpos; + $lastpos = length $$textref; + } + last; + } + + pos $$textref = $lastpos; + return @fields if wantarray; + + $firstpos ||= 0; + eval { substr($$textref,$firstpos,$lastpos-$firstpos)=""; + pos $$textref = $firstpos }; + return $fields[0]; +} + + +sub gen_extract_tagged # ($opentag, $closetag, $pre, \%options) +{ + my $ldel = $_[0]; + my $rdel = $_[1]; + my $pre = defined $_[2] ? $_[2] : '\s*'; + my %options = defined $_[3] ? %{$_[3]} : (); + my $omode = defined $options{fail} ? $options{fail} : ''; + my $bad = ref($options{reject}) eq 'ARRAY' ? join('|', @{$options{reject}}) + : defined($options{reject}) ? $options{reject} + : '' + ; + my $ignore = ref($options{ignore}) eq 'ARRAY' ? join('|', @{$options{ignore}}) + : defined($options{ignore}) ? $options{ignore} + : '' + ; + + if (!defined $ldel) { $ldel = '<\w+(?:' . gen_delimited_pat(q{'"}) . '|[^>])*>'; } + + my $posbug = pos; + for ($ldel, $pre, $bad, $ignore) { $_ = qr/$_/ if $_ } + pos = $posbug; + + my $closure = sub + { + my $textref = defined $_[0] ? \$_[0] : \$_; + my @match = Text::Balanced::_match_tagged($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore); + + return _fail(wantarray, $textref) unless @match; + return _succeed wantarray, $textref, + $match[2], $match[3]+$match[5]+$match[7], # MATCH + @match[8..9,0..1,2..7]; # REM, PRE, BITS + }; + + bless $closure, 'Text::Balanced::Extractor'; +} + +package Text::Balanced::Extractor; + +sub extract($$) # ($self, $text) +{ + &{$_[0]}($_[1]); +} + +package Text::Balanced::ErrorMsg; + +use overload '""' => sub { "$_[0]->{error}, detected at offset $_[0]->{pos}" }; + +1; + +__END__ + +=head1 NAME + +Text::Balanced - Extract delimited text sequences from strings. + + +=head1 SYNOPSIS + + use Text::Balanced qw ( + extract_delimited + extract_bracketed + extract_quotelike + extract_codeblock + extract_variable + extract_tagged + extract_multiple + + gen_delimited_pat + gen_extract_tagged + ); + + # Extract the initial substring of $text that is delimited by + # two (unescaped) instances of the first character in $delim. + + ($extracted, $remainder) = extract_delimited($text,$delim); + + + # Extract the initial substring of $text that is bracketed + # with a delimiter(s) specified by $delim (where the string + # in $delim contains one or more of '(){}[]<>'). + + ($extracted, $remainder) = extract_bracketed($text,$delim); + + + # Extract the initial substring of $text that is bounded by + # an XML tag. + + ($extracted, $remainder) = extract_tagged($text); + + + # Extract the initial substring of $text that is bounded by + # a C<BEGIN>...C<END> pair. Don't allow nested C<BEGIN> tags + + ($extracted, $remainder) = + extract_tagged($text,"BEGIN","END",undef,{bad=>["BEGIN"]}); + + + # Extract the initial substring of $text that represents a + # Perl "quote or quote-like operation" + + ($extracted, $remainder) = extract_quotelike($text); + + + # Extract the initial substring of $text that represents a block + # of Perl code, bracketed by any of character(s) specified by $delim + # (where the string $delim contains one or more of '(){}[]<>'). + + ($extracted, $remainder) = extract_codeblock($text,$delim); + + + # Extract the initial substrings of $text that would be extracted by + # one or more sequential applications of the specified functions + # or regular expressions + + @extracted = extract_multiple($text, + [ \&extract_bracketed, + \&extract_quotelike, + \&some_other_extractor_sub, + qr/[xyz]*/, + 'literal', + ]); + +# Create a string representing an optimized pattern (a la Friedl) +# that matches a substring delimited by any of the specified characters +# (in this case: any type of quote or a slash) + + $patstring = gen_delimited_pat(q{'"`/}); + + +# Generate a reference to an anonymous sub that is just like extract_tagged +# but pre-compiled and optimized for a specific pair of tags, and consequently +# much faster (i.e. 3 times faster). It uses qr// for better performance on +# repeated calls, so it only works under Perl 5.005 or later. + + $extract_head = gen_extract_tagged('<HEAD>','</HEAD>'); + + ($extracted, $remainder) = $extract_head->($text); + + +=head1 DESCRIPTION + +The various C<extract_...> subroutines may be used to +extract a delimited substring, possibly after skipping a +specified prefix string. By default, that prefix is +optional whitespace (C</\s*/>), but you can change it to whatever +you wish (see below). + +The substring to be extracted must appear at the +current C<pos> location of the string's variable +(or at index zero, if no C<pos> position is defined). +In other words, the C<extract_...> subroutines I<don't> +extract the first occurance of a substring anywhere +in a string (like an unanchored regex would). Rather, +they extract an occurance of the substring appearing +immediately at the current matching position in the +string (like a C<\G>-anchored regex would). + + + +=head2 General behaviour in list contexts + +In a list context, all the subroutines return a list, the first three +elements of which are always: + +=over 4 + +=item [0] + +The extracted string, including the specified delimiters. +If the extraction fails an empty string is returned. + +=item [1] + +The remainder of the input string (i.e. the characters after the +extracted string). On failure, the entire string is returned. + +=item [2] + +The skipped prefix (i.e. the characters before the extracted string). +On failure, the empty string is returned. + +=back + +Note that in a list context, the contents of the original input text (the first +argument) are not modified in any way. + +However, if the input text was passed in a variable, that variable's +C<pos> value is updated to point at the first character after the +extracted text. That means that in a list context the various +subroutines can be used much like regular expressions. For example: + + while ( $next = (extract_quotelike($text))[0] ) + { + # process next quote-like (in $next) + } + + +=head2 General behaviour in scalar and void contexts + +In a scalar context, the extracted string is returned, having first been +removed from the input text. Thus, the following code also processes +each quote-like operation, but actually removes them from $text: + + while ( $next = extract_quotelike($text) ) + { + # process next quote-like (in $next) + } + +Note that if the input text is a read-only string (i.e. a literal), +no attempt is made to remove the extracted text. + +In a void context the behaviour of the extraction subroutines is +exactly the same as in a scalar context, except (of course) that the +extracted substring is not returned. + +=head2 A note about prefixes + +Prefix patterns are matched without any trailing modifiers (C</gimsox> etc.) +This can bite you if you're expecting a prefix specification like +'.*?(?=<H1>)' to skip everything up to the first <H1> tag. Such a prefix +pattern will only succeed if the <H1> tag is on the current line, since +. normally doesn't match newlines. + +To overcome this limitation, you need to turn on /s matching within +the prefix pattern, using the C<(?s)> directive: '(?s).*?(?=<H1>)' + + +=head2 C<extract_delimited> + +The C<extract_delimited> function formalizes the common idiom +of extracting a single-character-delimited substring from the start of +a string. For example, to extract a single-quote delimited string, the +following code is typically used: + + ($remainder = $text) =~ s/\A('(\\.|[^'])*')//s; + $extracted = $1; + +but with C<extract_delimited> it can be simplified to: + + ($extracted,$remainder) = extract_delimited($text, "'"); + +C<extract_delimited> takes up to four scalars (the input text, the +delimiters, a prefix pattern to be skipped, and any escape characters) +and extracts the initial substring of the text that +is appropriately delimited. If the delimiter string has multiple +characters, the first one encountered in the text is taken to delimit +the substring. +The third argument specifies a prefix pattern that is to be skipped +(but must be present!) before the substring is extracted. +The final argument specifies the escape character to be used for each +delimiter. + +All arguments are optional. If the escape characters are not specified, +every delimiter is escaped with a backslash (C<\>). +If the prefix is not specified, the +pattern C<'\s*'> - optional whitespace - is used. If the delimiter set +is also not specified, the set C</["'`]/> is used. If the text to be processed +is not specified either, C<$_> is used. + +In list context, C<extract_delimited> returns a array of three +elements, the extracted substring (I<including the surrounding +delimiters>), the remainder of the text, and the skipped prefix (if +any). If a suitable delimited substring is not found, the first +element of the array is the empty string, the second is the complete +original text, and the prefix returned in the third element is an +empty string. + +In a scalar context, just the extracted substring is returned. In +a void context, the extracted substring (and any prefix) are simply +removed from the beginning of the first argument. + +Examples: + + # Remove a single-quoted substring from the very beginning of $text: + + $substring = extract_delimited($text, "'", ''); + + # Remove a single-quoted Pascalish substring (i.e. one in which + # doubling the quote character escapes it) from the very + # beginning of $text: + + $substring = extract_delimited($text, "'", '', "'"); + + # Extract a single- or double- quoted substring from the + # beginning of $text, optionally after some whitespace + # (note the list context to protect $text from modification): + + ($substring) = extract_delimited $text, q{"'}; + + + # Delete the substring delimited by the first '/' in $text: + + $text = join '', (extract_delimited($text,'/','[^/]*')[2,1]; + +Note that this last example is I<not> the same as deleting the first +quote-like pattern. For instance, if C<$text> contained the string: + + "if ('./cmd' =~ m/$UNIXCMD/s) { $cmd = $1; }" + +then after the deletion it would contain: + + "if ('.$UNIXCMD/s) { $cmd = $1; }" + +not: + + "if ('./cmd' =~ ms) { $cmd = $1; }" + + +See L<"extract_quotelike"> for a (partial) solution to this problem. + + +=head2 C<extract_bracketed> + +Like C<"extract_delimited">, the C<extract_bracketed> function takes +up to three optional scalar arguments: a string to extract from, a delimiter +specifier, and a prefix pattern. As before, a missing prefix defaults to +optional whitespace and a missing text defaults to C<$_>. However, a missing +delimiter specifier defaults to C<'{}()[]E<lt>E<gt>'> (see below). + +C<extract_bracketed> extracts a balanced-bracket-delimited +substring (using any one (or more) of the user-specified delimiter +brackets: '(..)', '{..}', '[..]', or '<..>'). Optionally it will also +respect quoted unbalanced brackets (see below). + +A "delimiter bracket" is a bracket in list of delimiters passed as +C<extract_bracketed>'s second argument. Delimiter brackets are +specified by giving either the left or right (or both!) versions +of the required bracket(s). Note that the order in which +two or more delimiter brackets are specified is not significant. + +A "balanced-bracket-delimited substring" is a substring bounded by +matched brackets, such that any other (left or right) delimiter +bracket I<within> the substring is also matched by an opposite +(right or left) delimiter bracket I<at the same level of nesting>. Any +type of bracket not in the delimiter list is treated as an ordinary +character. + +In other words, each type of bracket specified as a delimiter must be +balanced and correctly nested within the substring, and any other kind of +("non-delimiter") bracket in the substring is ignored. + +For example, given the string: + + $text = "{ an '[irregularly :-(] {} parenthesized >:-)' string }"; + +then a call to C<extract_bracketed> in a list context: + + @result = extract_bracketed( $text, '{}' ); + +would return: + + ( "{ an '[irregularly :-(] {} parenthesized >:-)' string }" , "" , "" ) + +since both sets of C<'{..}'> brackets are properly nested and evenly balanced. +(In a scalar context just the first element of the array would be returned. In +a void context, C<$text> would be replaced by an empty string.) + +Likewise the call in: + + @result = extract_bracketed( $text, '{[' ); + +would return the same result, since all sets of both types of specified +delimiter brackets are correctly nested and balanced. + +However, the call in: + + @result = extract_bracketed( $text, '{([<' ); + +would fail, returning: + + ( undef , "{ an '[irregularly :-(] {} parenthesized >:-)' string }" ); + +because the embedded pairs of C<'(..)'>s and C<'[..]'>s are "cross-nested" and +the embedded C<'E<gt>'> is unbalanced. (In a scalar context, this call would +return an empty string. In a void context, C<$text> would be unchanged.) + +Note that the embedded single-quotes in the string don't help in this +case, since they have not been specified as acceptable delimiters and are +therefore treated as non-delimiter characters (and ignored). + +However, if a particular species of quote character is included in the +delimiter specification, then that type of quote will be correctly handled. +for example, if C<$text> is: + + $text = '<A HREF=">>>>">link</A>'; + +then + + @result = extract_bracketed( $text, '<">' ); + +returns: + + ( '<A HREF=">>>>">', 'link</A>', "" ) + +as expected. Without the specification of C<"> as an embedded quoter: + + @result = extract_bracketed( $text, '<>' ); + +the result would be: + + ( '<A HREF=">', '>>>">link</A>', "" ) + +In addition to the quote delimiters C<'>, C<">, and C<`>, full Perl quote-like +quoting (i.e. q{string}, qq{string}, etc) can be specified by including the +letter 'q' as a delimiter. Hence: + + @result = extract_bracketed( $text, '<q>' ); + +would correctly match something like this: + + $text = '<leftop: conj /and/ conj>'; + +See also: C<"extract_quotelike"> and C<"extract_codeblock">. + + +=head2 C<extract_variable> + +C<extract_variable> extracts any valid Perl variable or +variable-involved expression, including scalars, arrays, hashes, array +accesses, hash look-ups, method calls through objects, subroutine calles +through subroutine references, etc. + +The subroutine takes up to two optional arguments: + +=over 4 + +=item 1. + +A string to be processed (C<$_> if the string is omitted or C<undef>) + +=item 2. + +A string specifying a pattern to be matched as a prefix (which is to be +skipped). If omitted, optional whitespace is skipped. + +=back + +On success in a list context, an array of 3 elements is returned. The +elements are: + +=over 4 + +=item [0] + +the extracted variable, or variablish expression + +=item [1] + +the remainder of the input text, + +=item [2] + +the prefix substring (if any), + +=back + +On failure, all of these values (except the remaining text) are C<undef>. + +In a scalar context, C<extract_variable> returns just the complete +substring that matched a variablish expression. C<undef> is returned on +failure. In addition, the original input text has the returned substring +(and any prefix) removed from it. + +In a void context, the input text just has the matched substring (and +any specified prefix) removed. + + +=head2 C<extract_tagged> + +C<extract_tagged> extracts and segments text between (balanced) +specified tags. + +The subroutine takes up to five optional arguments: + +=over 4 + +=item 1. + +A string to be processed (C<$_> if the string is omitted or C<undef>) + +=item 2. + +A string specifying a pattern to be matched as the opening tag. +If the pattern string is omitted (or C<undef>) then a pattern +that matches any standard XML tag is used. + +=item 3. + +A string specifying a pattern to be matched at the closing tag. +If the pattern string is omitted (or C<undef>) then the closing +tag is constructed by inserting a C</> after any leading bracket +characters in the actual opening tag that was matched (I<not> the pattern +that matched the tag). For example, if the opening tag pattern +is specified as C<'{{\w+}}'> and actually matched the opening tag +C<"{{DATA}}">, then the constructed closing tag would be C<"{{/DATA}}">. + +=item 4. + +A string specifying a pattern to be matched as a prefix (which is to be +skipped). If omitted, optional whitespace is skipped. + +=item 5. + +A hash reference containing various parsing options (see below) + +=back + +The various options that can be specified are: + +=over 4 + +=item C<reject =E<gt> $listref> + +The list reference contains one or more strings specifying patterns +that must I<not> appear within the tagged text. + +For example, to extract +an HTML link (which should not contain nested links) use: + + extract_tagged($text, '<A>', '</A>', undef, {reject => ['<A>']} ); + +=item C<ignore =E<gt> $listref> + +The list reference contains one or more strings specifying patterns +that are I<not> be be treated as nested tags within the tagged text +(even if they would match the start tag pattern). + +For example, to extract an arbitrary XML tag, but ignore "empty" elements: + + extract_tagged($text, undef, undef, undef, {ignore => ['<[^>]*/>']} ); + +(also see L<"gen_delimited_pat"> below). + + +=item C<fail =E<gt> $str> + +The C<fail> option indicates the action to be taken if a matching end +tag is not encountered (i.e. before the end of the string or some +C<reject> pattern matches). By default, a failure to match a closing +tag causes C<extract_tagged> to immediately fail. + +However, if the string value associated with <reject> is "MAX", then +C<extract_tagged> returns the complete text up to the point of failure. +If the string is "PARA", C<extract_tagged> returns only the first paragraph +after the tag (up to the first line that is either empty or contains +only whitespace characters). +If the string is "", the the default behaviour (i.e. failure) is reinstated. + +For example, suppose the start tag "/para" introduces a paragraph, which then +continues until the next "/endpara" tag or until another "/para" tag is +encountered: + + $text = "/para line 1\n\nline 3\n/para line 4"; + + extract_tagged($text, '/para', '/endpara', undef, + {reject => '/para', fail => MAX ); + + # EXTRACTED: "/para line 1\n\nline 3\n" + +Suppose instead, that if no matching "/endpara" tag is found, the "/para" +tag refers only to the immediately following paragraph: + + $text = "/para line 1\n\nline 3\n/para line 4"; + + extract_tagged($text, '/para', '/endpara', undef, + {reject => '/para', fail => MAX ); + + # EXTRACTED: "/para line 1\n" + +Note that the specified C<fail> behaviour applies to nested tags as well. + +=back + +On success in a list context, an array of 6 elements is returned. The elements are: + +=over 4 + +=item [0] + +the extracted tagged substring (including the outermost tags), + +=item [1] + +the remainder of the input text, + +=item [2] + +the prefix substring (if any), + +=item [3] + +the opening tag + +=item [4] + +the text between the opening and closing tags + +=item [5] + +the closing tag (or "" if no closing tag was found) + +=back + +On failure, all of these values (except the remaining text) are C<undef>. + +In a scalar context, C<extract_tagged> returns just the complete +substring that matched a tagged text (including the start and end +tags). C<undef> is returned on failure. In addition, the original input +text has the returned substring (and any prefix) removed from it. + +In a void context, the input text just has the matched substring (and +any specified prefix) removed. + + +=head2 C<gen_extract_tagged> + +(Note: This subroutine is only available under Perl5.005) + +C<gen_extract_tagged> generates a new anonymous subroutine which +extracts text between (balanced) specified tags. In other words, +it generates a function identical in function to C<extract_tagged>. + +The difference between C<extract_tagged> and the anonymous +subroutines generated by +C<gen_extract_tagged>, is that those generated subroutines: + +=over 4 + +=item * + +do not have to reparse tag specification or parsing options every time +they are called (whereas C<extract_tagged> has to effectively rebuild +its tag parser on every call); + +=item * + +make use of the new qr// construct to pre-compile the regexes they use +(whereas C<extract_tagged> uses standard string variable interpolation +to create tag-matching patterns). + +=back + +The subroutine takes up to four optional arguments (the same set as +C<extract_tagged> except for the string to be processed). It returns +a reference to a subroutine which in turn takes a single argument (the text to +be extracted from). + +In other words, the implementation of C<extract_tagged> is exactly +equivalent to: + + sub extract_tagged + { + my $text = shift; + $extractor = gen_extract_tagged(@_); + return $extractor->($text); + } + +(although C<extract_tagged> is not currently implemented that way, in order +to preserve pre-5.005 compatibility). + +Using C<gen_extract_tagged> to create extraction functions for specific tags +is a good idea if those functions are going to be called more than once, since +their performance is typically twice as good as the more general-purpose +C<extract_tagged>. + + +=head2 C<extract_quotelike> + +C<extract_quotelike> attempts to recognize, extract, and segment any +one of the various Perl quotes and quotelike operators (see +L<perlop(3)>) Nested backslashed delimiters, embedded balanced bracket +delimiters (for the quotelike operators), and trailing modifiers are +all caught. For example, in: + + extract_quotelike 'q # an octothorpe: \# (not the end of the q!) #' + + extract_quotelike ' "You said, \"Use sed\"." ' + + extract_quotelike ' s{([A-Z]{1,8}\.[A-Z]{3})} /\L$1\E/; ' + + extract_quotelike ' tr/\\\/\\\\/\\\//ds; ' + +the full Perl quotelike operations are all extracted correctly. + +Note too that, when using the /x modifier on a regex, any comment +containing the current pattern delimiter will cause the regex to be +immediately terminated. In other words: + + 'm / + (?i) # CASE INSENSITIVE + [a-z_] # LEADING ALPHABETIC/UNDERSCORE + [a-z0-9]* # FOLLOWED BY ANY NUMBER OF ALPHANUMERICS + /x' + +will be extracted as if it were: + + 'm / + (?i) # CASE INSENSITIVE + [a-z_] # LEADING ALPHABETIC/' + +This behaviour is identical to that of the actual compiler. + +C<extract_quotelike> takes two arguments: the text to be processed and +a prefix to be matched at the very beginning of the text. If no prefix +is specified, optional whitespace is the default. If no text is given, +C<$_> is used. + +In a list context, an array of 11 elements is returned. The elements are: + +=over 4 + +=item [0] + +the extracted quotelike substring (including trailing modifiers), + +=item [1] + +the remainder of the input text, + +=item [2] + +the prefix substring (if any), + +=item [3] + +the name of the quotelike operator (if any), + +=item [4] + +the left delimiter of the first block of the operation, + +=item [5] + +the text of the first block of the operation +(that is, the contents of +a quote, the regex of a match or substitution or the target list of a +translation), + +=item [6] + +the right delimiter of the first block of the operation, + +=item [7] + +the left delimiter of the second block of the operation +(that is, if it is a C<s>, C<tr>, or C<y>), + +=item [8] + +the text of the second block of the operation +(that is, the replacement of a substitution or the translation list +of a translation), + +=item [9] + +the right delimiter of the second block of the operation (if any), + +=item [10] + +the trailing modifiers on the operation (if any). + +=back + +For each of the fields marked "(if any)" the default value on success is +an empty string. +On failure, all of these values (except the remaining text) are C<undef>. + + +In a scalar context, C<extract_quotelike> returns just the complete substring +that matched a quotelike operation (or C<undef> on failure). In a scalar or +void context, the input text has the same substring (and any specified +prefix) removed. + +Examples: + + # Remove the first quotelike literal that appears in text + + $quotelike = extract_quotelike($text,'.*?'); + + # Replace one or more leading whitespace-separated quotelike + # literals in $_ with "<QLL>" + + do { $_ = join '<QLL>', (extract_quotelike)[2,1] } until $@; + + + # Isolate the search pattern in a quotelike operation from $text + + ($op,$pat) = (extract_quotelike $text)[3,5]; + if ($op =~ /[ms]/) + { + print "search pattern: $pat\n"; + } + else + { + print "$op is not a pattern matching operation\n"; + } + + +=head2 C<extract_quotelike> and "here documents" + +C<extract_quotelike> can successfully extract "here documents" from an input +string, but with an important caveat in list contexts. + +Unlike other types of quote-like literals, a here document is rarely +a contiguous substring. For example, a typical piece of code using +here document might look like this: + + <<'EOMSG' || die; + This is the message. + EOMSG + exit; + +Given this as an input string in a scalar context, C<extract_quotelike> +would correctly return the string "<<'EOMSG'\nThis is the message.\nEOMSG", +leaving the string " || die;\nexit;" in the original variable. In other words, +the two separate pieces of the here document are successfully extracted and +concatenated. + +In a list context, C<extract_quotelike> would return the list + +=over 4 + +=item [0] + +"<<'EOMSG'\nThis is the message.\nEOMSG\n" (i.e. the full extracted here document, +including fore and aft delimiters), + +=item [1] + +" || die;\nexit;" (i.e. the remainder of the input text, concatenated), + +=item [2] + +"" (i.e. the prefix substring -- trivial in this case), + +=item [3] + +"<<" (i.e. the "name" of the quotelike operator) + +=item [4] + +"'EOMSG'" (i.e. the left delimiter of the here document, including any quotes), + +=item [5] + +"This is the message.\n" (i.e. the text of the here document), + +=item [6] + +"EOMSG" (i.e. the right delimiter of the here document), + +=item [7..10] + +"" (a here document has no second left delimiter, second text, second right +delimiter, or trailing modifiers). + +=back + +However, the matching position of the input variable would be set to +"exit;" (i.e. I<after> the closing delimiter of the here document), +which would cause the earlier " || die;\nexit;" to be skipped in any +sequence of code fragment extractions. + +To avoid this problem, when it encounters a here document whilst +extracting from a modifiable string, C<extract_quotelike> silently +rearranges the string to an equivalent piece of Perl: + + <<'EOMSG' + This is the message. + EOMSG + || die; + exit; + +in which the here document I<is> contiguous. It still leaves the +matching position after the here document, but now the rest of the line +on which the here document starts is not skipped. + +To prevent <extract_quotelike> from mucking about with the input in this way +(this is the only case where a list-context C<extract_quotelike> does so), +you can pass the input variable as an interpolated literal: + + $quotelike = extract_quotelike("$var"); + + +=head2 C<extract_codeblock> + +C<extract_codeblock> attempts to recognize and extract a balanced +bracket delimited substring that may contain unbalanced brackets +inside Perl quotes or quotelike operations. That is, C<extract_codeblock> +is like a combination of C<"extract_bracketed"> and +C<"extract_quotelike">. + +C<extract_codeblock> takes the same initial three parameters as C<extract_bracketed>: +a text to process, a set of delimiter brackets to look for, and a prefix to +match first. It also takes an optional fourth parameter, which allows the +outermost delimiter brackets to be specified separately (see below). + +Omitting the first argument (input text) means process C<$_> instead. +Omitting the second argument (delimiter brackets) indicates that only C<'{'> is to be used. +Omitting the third argument (prefix argument) implies optional whitespace at the start. +Omitting the fourth argument (outermost delimiter brackets) indicates that the +value of the second argument is to be used for the outermost delimiters. + +Once the prefix an dthe outermost opening delimiter bracket have been +recognized, code blocks are extracted by stepping through the input text and +trying the following alternatives in sequence: + +=over 4 + +=item 1. + +Try and match a closing delimiter bracket. If the bracket was the same +species as the last opening bracket, return the substring to that +point. If the bracket was mismatched, return an error. + +=item 2. + +Try to match a quote or quotelike operator. If found, call +C<extract_quotelike> to eat it. If C<extract_quotelike> fails, return +the error it returned. Otherwise go back to step 1. + +=item 3. + +Try to match an opening delimiter bracket. If found, call +C<extract_codeblock> recursively to eat the embedded block. If the +recursive call fails, return an error. Otherwise, go back to step 1. + +=item 4. + +Unconditionally match a bareword or any other single character, and +then go back to step 1. + +=back + + +Examples: + + # Find a while loop in the text + + if ($text =~ s/.*?while\s*\{/{/) + { + $loop = "while " . extract_codeblock($text); + } + + # Remove the first round-bracketed list (which may include + # round- or curly-bracketed code blocks or quotelike operators) + + extract_codeblock $text, "(){}", '[^(]*'; + + +The ability to specify a different outermost delimiter bracket is useful +in some circumstances. For example, in the Parse::RecDescent module, +parser actions which are to be performed only on a successful parse +are specified using a C<E<lt>defer:...E<gt>> directive. For example: + + sentence: subject verb object + <defer: {$::theVerb = $item{verb}} > + +Parse::RecDescent uses C<extract_codeblock($text, '{}E<lt>E<gt>')> to extract the code +within the C<E<lt>defer:...E<gt>> directive, but there's a problem. + +A deferred action like this: + + <defer: {if ($count>10) {$count--}} > + +will be incorrectly parsed as: + + <defer: {if ($count> + +because the "less than" operator is interpreted as a closing delimiter. + +But, by extracting the directive using +S<C<extract_codeblock($text, '{}', undef, 'E<lt>E<gt>')>> +the '>' character is only treated as a delimited at the outermost +level of the code block, so the directive is parsed correctly. + +=head2 C<extract_multiple> + +The C<extract_multiple> subroutine takes a string to be processed and a +list of extractors (subroutines or regular expressions) to apply to that string. + +In an array context C<extract_multiple> returns an array of substrings +of the original string, as extracted by the specified extractors. +In a scalar context, C<extract_multiple> returns the first +substring successfully extracted from the original string. In both +scalar and void contexts the original string has the first successfully +extracted substring removed from it. In all contexts +C<extract_multiple> starts at the current C<pos> of the string, and +sets that C<pos> appropriately after it matches. + +Hence, the aim of of a call to C<extract_multiple> in a list context +is to split the processed string into as many non-overlapping fields as +possible, by repeatedly applying each of the specified extractors +to the remainder of the string. Thus C<extract_multiple> is +a generalized form of Perl's C<split> subroutine. + +The subroutine takes up to four optional arguments: + +=over 4 + +=item 1. + +A string to be processed (C<$_> if the string is omitted or C<undef>) + +=item 2. + +A reference to a list of subroutine references and/or qr// objects and/or +literal strings and/or hash references, specifying the extractors +to be used to split the string. If this argument is omitted (or +C<undef>) the list: + + [ + sub { extract_variable($_[0], '') }, + sub { extract_quotelike($_[0],'') }, + sub { extract_codeblock($_[0],'{}','') }, + ] + +is used. + + +=item 3. + +An number specifying the maximum number of fields to return. If this +argument is omitted (or C<undef>), split continues as long as possible. + +If the third argument is I<N>, then extraction continues until I<N> fields +have been successfully extracted, or until the string has been completely +processed. + +Note that in scalar and void contexts the value of this argument is +automatically reset to 1 (under C<-w>, a warning is issued if the argument +has to be reset). + +=item 4. + +A value indicating whether unmatched substrings (see below) within the +text should be skipped or returned as fields. If the value is true, +such substrings are skipped. Otherwise, they are returned. + +=back + +The extraction process works by applying each extractor in +sequence to the text string. + +If the extractor is a subroutine it is called in a list context and is +expected to return a list of a single element, namely the extracted +text. It may optionally also return two further arguments: a string +representing the text left after extraction (like $' for a pattern +match), and a string representing any prefix skipped before the +extraction (like $` in a pattern match). Note that this is designed +to facilitate the use of other Text::Balanced subroutines with +C<extract_multiple>. Note too that the value returned by an extractor +subroutine need not bear any relationship to the corresponding substring +of the original text (see examples below). + +If the extractor is a precompiled regular expression or a string, +it is matched against the text in a scalar context with a leading +'\G' and the gc modifiers enabled. The extracted value is either +$1 if that variable is defined after the match, or else the +complete match (i.e. $&). + +If the extractor is a hash reference, it must contain exactly one element. +The value of that element is one of the +above extractor types (subroutine reference, regular expression, or string). +The key of that element is the name of a class into which the successful +return value of the extractor will be blessed. + +If an extractor returns a defined value, that value is immediately +treated as the next extracted field and pushed onto the list of fields. +If the extractor was specified in a hash reference, the field is also +blessed into the appropriate class, + +If the extractor fails to match (in the case of a regex extractor), or returns an empty list or an undefined value (in the case of a subroutine extractor), it is +assumed to have failed to extract. +If none of the extractor subroutines succeeds, then one +character is extracted from the start of the text and the extraction +subroutines reapplied. Characters which are thus removed are accumulated and +eventually become the next field (unless the fourth argument is true, in which +case they are disgarded). + +For example, the following extracts substrings that are valid Perl variables: + + @fields = extract_multiple($text, + [ sub { extract_variable($_[0]) } ], + undef, 1); + +This example separates a text into fields which are quote delimited, +curly bracketed, and anything else. The delimited and bracketed +parts are also blessed to identify them (the "anything else" is unblessed): + + @fields = extract_multiple($text, + [ + { Delim => sub { extract_delimited($_[0],q{'"}) } }, + { Brack => sub { extract_bracketed($_[0],'{}') } }, + ]); + +This call extracts the next single substring that is a valid Perl quotelike +operator (and removes it from $text): + + $quotelike = extract_multiple($text, + [ + sub { extract_quotelike($_[0]) }, + ], undef, 1); + +Finally, here is yet another way to do comma-separated value parsing: + + @fields = extract_multiple($csv_text, + [ + sub { extract_delimited($_[0],q{'"}) }, + qr/([^,]+)(.*)/, + ], + undef,1); + +The list in the second argument means: +I<"Try and extract a ' or " delimited string, otherwise extract anything up to a comma...">. +The undef third argument means: +I<"...as many times as possible...">, +and the true value in the fourth argument means +I<"...discarding anything else that appears (i.e. the commas)">. + +If you wanted the commas preserved as separate fields (i.e. like split +does if your split pattern has capturing parentheses), you would +just make the last parameter undefined (or remove it). + + +=head2 C<gen_delimited_pat> + +The C<gen_delimited_pat> subroutine takes a single (string) argument and + > builds a Friedl-style optimized regex that matches a string delimited +by any one of the characters in the single argument. For example: + + gen_delimited_pat(q{'"}) + +returns the regex: + + (?:\"(?:\\\"|(?!\").)*\"|\'(?:\\\'|(?!\').)*\') + +Note that the specified delimiters are automatically quotemeta'd. + +A typical use of C<gen_delimited_pat> would be to build special purpose tags +for C<extract_tagged>. For example, to properly ignore "empty" XML elements +(which might contain quoted strings): + + my $empty_tag = '<(' . gen_delimited_pat(q{'"}) . '|.)+/>'; + + extract_tagged($text, undef, undef, undef, {ignore => [$empty_tag]} ); + + +C<gen_delimited_pat> may also be called with an optional second argument, +which specifies the "escape" character(s) to be used for each delimiter. +For example to match a Pascal-style string (where ' is the delimiter +and '' is a literal ' within the string): + + gen_delimited_pat(q{'},q{'}); + +Different escape characters can be specified for different delimiters. +For example, to specify that '/' is the escape for single quotes +and '%' is the escape for double quotes: + + gen_delimited_pat(q{'"},q{/%}); + +If more delimiters than escape chars are specified, the last escape char +is used for the remaining delimiters. +If no escape char is specified for a given specified delimiter, '\' is used. + +Note that +C<gen_delimited_pat> was previously called +C<delimited_pat>. That name may still be used, but is now deprecated. + + +=head1 DIAGNOSTICS + +In a list context, all the functions return C<(undef,$original_text)> +on failure. In a scalar context, failure is indicated by returning C<undef> +(in this case the input text is not modified in any way). + +In addition, on failure in I<any> context, the C<$@> variable is set. +Accessing C<$@-E<gt>{error}> returns one of the error diagnostics listed +below. +Accessing C<$@-E<gt>{pos}> returns the offset into the original string at +which the error was detected (although not necessarily where it occurred!) +Printing C<$@> directly produces the error message, with the offset appended. +On success, the C<$@> variable is guaranteed to be C<undef>. + +The available diagnostics are: + +=over 4 + +=item C<Did not find a suitable bracket: "%s"> + +The delimiter provided to C<extract_bracketed> was not one of +C<'()[]E<lt>E<gt>{}'>. + +=item C<Did not find prefix: /%s/> + +A non-optional prefix was specified but wasn't found at the start of the text. + +=item C<Did not find opening bracket after prefix: "%s"> + +C<extract_bracketed> or C<extract_codeblock> was expecting a +particular kind of bracket at the start of the text, and didn't find it. + +=item C<No quotelike operator found after prefix: "%s"> + +C<extract_quotelike> didn't find one of the quotelike operators C<q>, +C<qq>, C<qw>, C<qx>, C<s>, C<tr> or C<y> at the start of the substring +it was extracting. + +=item C<Unmatched closing bracket: "%c"> + +C<extract_bracketed>, C<extract_quotelike> or C<extract_codeblock> encountered +a closing bracket where none was expected. + +=item C<Unmatched opening bracket(s): "%s"> + +C<extract_bracketed>, C<extract_quotelike> or C<extract_codeblock> ran +out of characters in the text before closing one or more levels of nested +brackets. + +=item C<Unmatched embedded quote (%s)> + +C<extract_bracketed> attempted to match an embedded quoted substring, but +failed to find a closing quote to match it. + +=item C<Did not find closing delimiter to match '%s'> + +C<extract_quotelike> was unable to find a closing delimiter to match the +one that opened the quote-like operation. + +=item C<Mismatched closing bracket: expected "%c" but found "%s"> + +C<extract_bracketed>, C<extract_quotelike> or C<extract_codeblock> found +a valid bracket delimiter, but it was the wrong species. This usually +indicates a nesting error, but may indicate incorrect quoting or escaping. + +=item C<No block delimiter found after quotelike "%s"> + +C<extract_quotelike> or C<extract_codeblock> found one of the +quotelike operators C<q>, C<qq>, C<qw>, C<qx>, C<s>, C<tr> or C<y> +without a suitable block after it. + +=item C<Did not find leading dereferencer> + +C<extract_variable> was expecting one of '$', '@', or '%' at the start of +a variable, but didn't find any of them. + +=item C<Bad identifier after dereferencer> + +C<extract_variable> found a '$', '@', or '%' indicating a variable, but that +character was not followed by a legal Perl identifier. + +=item C<Did not find expected opening bracket at %s> + +C<extract_codeblock> failed to find any of the outermost opening brackets +that were specified. + +=item C<Improperly nested codeblock at %s> + +A nested code block was found that started with a delimiter that was specified +as being only to be used as an outermost bracket. + +=item C<Missing second block for quotelike "%s"> + +C<extract_codeblock> or C<extract_quotelike> found one of the +quotelike operators C<s>, C<tr> or C<y> followed by only one block. + +=item C<No match found for opening bracket> + +C<extract_codeblock> failed to find a closing bracket to match the outermost +opening bracket. + +=item C<Did not find opening tag: /%s/> + +C<extract_tagged> did not find a suitable opening tag (after any specified +prefix was removed). + +=item C<Unable to construct closing tag to match: /%s/> + +C<extract_tagged> matched the specified opening tag and tried to +modify the matched text to produce a matching closing tag (because +none was specified). It failed to generate the closing tag, almost +certainly because the opening tag did not start with a +bracket of some kind. + +=item C<Found invalid nested tag: %s> + +C<extract_tagged> found a nested tag that appeared in the "reject" list +(and the failure mode was not "MAX" or "PARA"). + +=item C<Found unbalanced nested tag: %s> + +C<extract_tagged> found a nested opening tag that was not matched by a +corresponding nested closing tag (and the failure mode was not "MAX" or "PARA"). + +=item C<Did not find closing tag> + +C<extract_tagged> reached the end of the text without finding a closing tag +to match the original opening tag (and the failure mode was not +"MAX" or "PARA"). + + + + +=back + + +=head1 AUTHOR + +Damian Conway (damian@conway.org) + + +=head1 BUGS AND IRRITATIONS + +There are undoubtedly serious bugs lurking somewhere in this code, if +only because parts of it give the impression of understanding a great deal +more about Perl than they really do. + +Bug reports and other feedback are most welcome. + + +=head1 COPYRIGHT + + Copyright (c) 1997-2001, Damian Conway. All Rights Reserved. + This module is free software. It may be used, redistributed + and/or modified under the same terms as Perl itself. diff --git a/Master/tlpkg/tlperl.old/lib/Text/ParseWords.pm b/Master/tlpkg/tlperl.old/lib/Text/ParseWords.pm new file mode 100644 index 00000000000..2f6812ade80 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Text/ParseWords.pm @@ -0,0 +1,263 @@ +package Text::ParseWords; + +use vars qw($VERSION @ISA @EXPORT $PERL_SINGLE_QUOTE); +$VERSION = "3.24"; + +require 5.000; + +use Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(shellwords quotewords nested_quotewords parse_line); +@EXPORT_OK = qw(old_shellwords); + + +sub shellwords { + my(@lines) = @_; + $lines[$#lines] =~ s/\s+$//; + return(quotewords('\s+', 0, @lines)); +} + + + +sub quotewords { + my($delim, $keep, @lines) = @_; + my($line, @words, @allwords); + + foreach $line (@lines) { + @words = parse_line($delim, $keep, $line); + return() unless (@words || !length($line)); + push(@allwords, @words); + } + return(@allwords); +} + + + +sub nested_quotewords { + my($delim, $keep, @lines) = @_; + my($i, @allwords); + + for ($i = 0; $i < @lines; $i++) { + @{$allwords[$i]} = parse_line($delim, $keep, $lines[$i]); + return() unless (@{$allwords[$i]} || !length($lines[$i])); + } + return(@allwords); +} + + + +sub parse_line { + my($delimiter, $keep, $line) = @_; + my($word, @pieces); + + no warnings 'uninitialized'; # we will be testing undef strings + + while (length($line)) { + $line =~ s/^(["']) # a $quote + ((?:\\.|(?!\1)[^\\])*) # and $quoted text + \1 # followed by the same quote + | # --OR-- + ^((?:\\.|[^\\"'])*?) # an $unquoted text + (\Z(?!\n)|(?-x:$delimiter)|(?!^)(?=["'])) + # plus EOL, delimiter, or quote + //xs or return; # extended layout + my($quote, $quoted, $unquoted, $delim) = ($1, $2, $3, $4); + return() unless( defined($quote) || length($unquoted) || length($delim)); + + if ($keep) { + $quoted = "$quote$quoted$quote"; + } + else { + $unquoted =~ s/\\(.)/$1/sg; + if (defined $quote) { + $quoted =~ s/\\(.)/$1/sg if ($quote eq '"'); + $quoted =~ s/\\([\\'])/$1/g if ( $PERL_SINGLE_QUOTE && $quote eq "'"); + } + } + $word .= substr($line, 0, 0); # leave results tainted + $word .= defined $quote ? $quoted : $unquoted; + + if (length($delim)) { + push(@pieces, $word); + push(@pieces, $delim) if ($keep eq 'delimiters'); + undef $word; + } + if (!length($line)) { + push(@pieces, $word); + } + } + return(@pieces); +} + + + +sub old_shellwords { + + # Usage: + # use ParseWords; + # @words = old_shellwords($line); + # or + # @words = old_shellwords(@lines); + # or + # @words = old_shellwords(); # defaults to $_ (and clobbers it) + + no warnings 'uninitialized'; # we will be testing undef strings + local *_ = \join('', @_) if @_; + my (@words, $snippet); + + s/\A\s+//; + while ($_ ne '') { + my $field = substr($_, 0, 0); # leave results tainted + for (;;) { + if (s/\A"(([^"\\]|\\.)*)"//s) { + ($snippet = $1) =~ s#\\(.)#$1#sg; + } + elsif (/\A"/) { + require Carp; + Carp::carp("Unmatched double quote: $_"); + return(); + } + elsif (s/\A'(([^'\\]|\\.)*)'//s) { + ($snippet = $1) =~ s#\\(.)#$1#sg; + } + elsif (/\A'/) { + require Carp; + Carp::carp("Unmatched single quote: $_"); + return(); + } + elsif (s/\A\\(.)//s) { + $snippet = $1; + } + elsif (s/\A([^\s\\'"]+)//) { + $snippet = $1; + } + else { + s/\A\s+//; + last; + } + $field .= $snippet; + } + push(@words, $field); + } + return @words; +} + +1; + +__END__ + +=head1 NAME + +Text::ParseWords - parse text into an array of tokens or array of arrays + +=head1 SYNOPSIS + + use Text::ParseWords; + @lists = &nested_quotewords($delim, $keep, @lines); + @words = "ewords($delim, $keep, @lines); + @words = &shellwords(@lines); + @words = &parse_line($delim, $keep, $line); + @words = &old_shellwords(@lines); # DEPRECATED! + +=head1 DESCRIPTION + +The &nested_quotewords() and "ewords() functions accept a delimiter +(which can be a regular expression) +and a list of lines and then breaks those lines up into a list of +words ignoring delimiters that appear inside quotes. "ewords() +returns all of the tokens in a single long list, while &nested_quotewords() +returns a list of token lists corresponding to the elements of @lines. +&parse_line() does tokenizing on a single string. The &*quotewords() +functions simply call &parse_line(), so if you're only splitting +one line you can call &parse_line() directly and save a function +call. + +The $keep argument is a boolean flag. If true, then the tokens are +split on the specified delimiter, but all other characters (quotes, +backslashes, etc.) are kept in the tokens. If $keep is false then the +&*quotewords() functions remove all quotes and backslashes that are +not themselves backslash-escaped or inside of single quotes (i.e., +"ewords() tries to interpret these characters just like the Bourne +shell). NB: these semantics are significantly different from the +original version of this module shipped with Perl 5.000 through 5.004. +As an additional feature, $keep may be the keyword "delimiters" which +causes the functions to preserve the delimiters in each string as +tokens in the token lists, in addition to preserving quote and +backslash characters. + +&shellwords() is written as a special case of "ewords(), and it +does token parsing with whitespace as a delimiter-- similar to most +Unix shells. + +=head1 EXAMPLES + +The sample program: + + use Text::ParseWords; + @words = "ewords('\s+', 0, q{this is "a test" of\ quotewords \"for you}); + $i = 0; + foreach (@words) { + print "$i: <$_>\n"; + $i++; + } + +produces: + + 0: <this> + 1: <is> + 2: <a test> + 3: <of quotewords> + 4: <"for> + 5: <you> + +demonstrating: + +=over 4 + +=item 0 + +a simple word + +=item 1 + +multiple spaces are skipped because of our $delim + +=item 2 + +use of quotes to include a space in a word + +=item 3 + +use of a backslash to include a space in a word + +=item 4 + +use of a backslash to remove the special meaning of a double-quote + +=item 5 + +another simple word (note the lack of effect of the +backslashed double-quote) + +=back + +Replacing C<"ewords('\s+', 0, q{this is...})> +with C<&shellwords(q{this is...})> +is a simpler way to accomplish the same thing. + +=head1 AUTHORS + +Maintainer is Hal Pomeranz <pomeranz@netcom.com>, 1994-1997 (Original +author unknown). Much of the code for &parse_line() (including the +primary regexp) from Joerk Behrends <jbehrends@multimediaproduzenten.de>. + +Examples section another documentation provided by John Heidemann +<johnh@ISI.EDU> + +Bug reports, patches, and nagging provided by lots of folks-- thanks +everybody! Special thanks to Michael Schwern <schwern@envirolink.org> +for assuring me that a &nested_quotewords() would be useful, and to +Jeff Friedl <jfriedl@yahoo-inc.com> for telling me not to worry about +error-checking (sort of-- you had to be there). + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Text/Soundex.pm b/Master/tlpkg/tlperl.old/lib/Text/Soundex.pm new file mode 100644 index 00000000000..64a9e6507d5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Text/Soundex.pm @@ -0,0 +1,150 @@ +package Text::Soundex; +require 5.000; +require Exporter; + +@ISA = qw(Exporter); +@EXPORT = qw(&soundex $soundex_nocode); + +$VERSION = '1.01'; + +# $Id: soundex.pl,v 1.2 1994/03/24 00:30:27 mike Exp $ +# +# Implementation of soundex algorithm as described by Knuth in volume +# 3 of The Art of Computer Programming, with ideas stolen from Ian +# Phillipps <ian@pipex.net>. +# +# Mike Stok <Mike.Stok@meiko.concord.ma.us>, 2 March 1994. +# +# Knuth's test cases are: +# +# Euler, Ellery -> E460 +# Gauss, Ghosh -> G200 +# Hilbert, Heilbronn -> H416 +# Knuth, Kant -> K530 +# Lloyd, Ladd -> L300 +# Lukasiewicz, Lissajous -> L222 +# +# $Log: soundex.pl,v $ +# Revision 1.2 1994/03/24 00:30:27 mike +# Subtle bug (any excuse :-) spotted by Rich Pinder <rpinder@hsc.usc.edu> +# in the way I handles leasing characters which were different but had +# the same soundex code. This showed up comparing it with Oracle's +# soundex output. +# +# Revision 1.1 1994/03/02 13:01:30 mike +# Initial revision +# +# +############################################################################## + +# $soundex_nocode is used to indicate a string doesn't have a soundex +# code, I like undef other people may want to set it to 'Z000'. + +$soundex_nocode = undef; + +sub soundex +{ + local (@s, $f, $fc, $_) = @_; + + push @s, '' unless @s; # handle no args as a single empty string + + foreach (@s) + { + $_ = uc $_; + tr/A-Z//cd; + + if ($_ eq '') + { + $_ = $soundex_nocode; + } + else + { + ($f) = /^(.)/; + tr/AEHIOUWYBFPVCGJKQSXZDTLMNR/00000000111122222222334556/; + ($fc) = /^(.)/; + s/^$fc+//; + tr///cs; + tr/0//d; + $_ = $f . $_ . '000'; + s/^(.{4}).*/$1/; + } + } + + wantarray ? @s : shift @s; +} + +1; + +__END__ + +=head1 NAME + +Text::Soundex - Implementation of the Soundex Algorithm as Described by Knuth + +=head1 SYNOPSIS + + use Text::Soundex; + + $code = soundex $string; # get soundex code for a string + @codes = soundex @list; # get list of codes for list of strings + + # set value to be returned for strings without soundex code + + $soundex_nocode = 'Z000'; + +=head1 DESCRIPTION + +This module implements the soundex algorithm as described by Donald Knuth +in Volume 3 of B<The Art of Computer Programming>. The algorithm is +intended to hash words (in particular surnames) into a small space using a +simple model which approximates the sound of the word when spoken by an English +speaker. Each word is reduced to a four character string, the first +character being an upper case letter and the remaining three being digits. + +If there is no soundex code representation for a string then the value of +C<$soundex_nocode> is returned. This is initially set to C<undef>, but +many people seem to prefer an I<unlikely> value like C<Z000> +(how unlikely this is depends on the data set being dealt with.) Any value +can be assigned to C<$soundex_nocode>. + +In scalar context C<soundex> returns the soundex code of its first +argument, and in list context a list is returned in which each element is the +soundex code for the corresponding argument passed to C<soundex> e.g. + + @codes = soundex qw(Mike Stok); + +leaves C<@codes> containing C<('M200', 'S320')>. + +=head1 EXAMPLES + +Knuth's examples of various names and the soundex codes they map to +are listed below: + + Euler, Ellery -> E460 + Gauss, Ghosh -> G200 + Hilbert, Heilbronn -> H416 + Knuth, Kant -> K530 + Lloyd, Ladd -> L300 + Lukasiewicz, Lissajous -> L222 + +so: + + $code = soundex 'Knuth'; # $code contains 'K530' + @list = soundex qw(Lloyd Gauss); # @list contains 'L300', 'G200' + +=head1 LIMITATIONS + +As the soundex algorithm was originally used a B<long> time ago in the US +it considers only the English alphabet and pronunciation. + +As it is mapping a large space (arbitrary length strings) onto a small +space (single letter plus 3 digits) no inference can be made about the +similarity of two strings which end up with the same soundex code. For +example, both C<Hilbert> and C<Heilbronn> end up with a soundex code +of C<H416>. + +=head1 AUTHOR + +This code was implemented by Mike Stok (C<stok@cybercom.net>) from the +description given by Knuth. Ian Phillipps (C<ian@pipex.net>) and Rich Pinder +(C<rpinder@hsc.usc.edu>) supplied ideas and spotted mistakes. diff --git a/Master/tlpkg/tlperl.old/lib/Text/Tabs.pm b/Master/tlpkg/tlperl.old/lib/Text/Tabs.pm new file mode 100644 index 00000000000..36107fcfe3e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Text/Tabs.pm @@ -0,0 +1,121 @@ + +package Text::Tabs; + +require Exporter; + +@ISA = (Exporter); +@EXPORT = qw(expand unexpand $tabstop); + +use vars qw($VERSION $tabstop $debug); +$VERSION = 2005.0824; + +use strict; + +BEGIN { + $tabstop = 8; + $debug = 0; +} + +sub expand { + my @l; + my $pad; + for ( @_ ) { + my $s = ''; + for (split(/^/m, $_, -1)) { + my $offs = 0; + s{\t}{ + $pad = $tabstop - (pos() + $offs) % $tabstop; + $offs += $pad - 1; + " " x $pad; + }eg; + $s .= $_; + } + push(@l, $s); + } + return @l if wantarray; + return $l[0]; +} + +sub unexpand +{ + my (@l) = @_; + my @e; + my $x; + my $line; + my @lines; + my $lastbit; + for $x (@l) { + @lines = split("\n", $x, -1); + for $line (@lines) { + $line = expand($line); + @e = split(/(.{$tabstop})/,$line,-1); + $lastbit = pop(@e); + $lastbit = '' unless defined $lastbit; + $lastbit = "\t" + if $lastbit eq " "x$tabstop; + for $_ (@e) { + if ($debug) { + my $x = $_; + $x =~ s/\t/^I\t/gs; + print "sub on '$x'\n"; + } + s/ +$/\t/; + } + $line = join('',@e, $lastbit); + } + $x = join("\n", @lines); + } + return @l if wantarray; + return $l[0]; +} + +1; +__END__ + +sub expand +{ + my (@l) = @_; + for $_ (@l) { + 1 while s/(^|\n)([^\t\n]*)(\t+)/ + $1. $2 . (" " x + ($tabstop * length($3) + - (length($2) % $tabstop))) + /sex; + } + return @l if wantarray; + return $l[0]; +} + + +=head1 NAME + +Text::Tabs -- expand and unexpand tabs per the unix expand(1) and unexpand(1) + +=head1 SYNOPSIS + + use Text::Tabs; + + $tabstop = 4; + @lines_without_tabs = expand(@lines_with_tabs); + @lines_with_tabs = unexpand(@lines_without_tabs); + +=head1 DESCRIPTION + +Text::Tabs does about what the unix utilities expand(1) and unexpand(1) +do. Given a line with tabs in it, expand will replace the tabs with +the appropriate number of spaces. Given a line with or without tabs in +it, unexpand will add tabs when it can save bytes by doing so. Invisible +compression with plain ascii! + +=head1 BUGS + +expand doesn't handle newlines very quickly -- do not feed it an +entire document in one string. Instead feed it an array of lines. + +=head1 LICENSE + +Copyright (C) 1996-2002,2005 David Muir Sharnoff. +Copyright (C) 2005 Aristotle Pagaltzis +This module may be modified, used, copied, and redistributed at your own risk. +Publicly redistributed modified versions must use a different name. + diff --git a/Master/tlpkg/tlperl.old/lib/Text/Wrap.pm b/Master/tlpkg/tlperl.old/lib/Text/Wrap.pm new file mode 100644 index 00000000000..d364cfc1195 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Text/Wrap.pm @@ -0,0 +1,223 @@ +package Text::Wrap; + +require Exporter; + +@ISA = qw(Exporter); +@EXPORT = qw(wrap fill); +@EXPORT_OK = qw($columns $break $huge); + +$VERSION = 2005.0824_01; + +use vars qw($VERSION $columns $debug $break $huge $unexpand $tabstop + $separator $separator2); +use strict; + +BEGIN { + $columns = 76; # <= screen width + $debug = 0; + $break = '\s'; + $huge = 'wrap'; # alternatively: 'die' or 'overflow' + $unexpand = 1; + $tabstop = 8; + $separator = "\n"; + $separator2 = undef; +} + +use Text::Tabs qw(expand unexpand); + +sub wrap +{ + my ($ip, $xp, @t) = @_; + + local($Text::Tabs::tabstop) = $tabstop; + my $r = ""; + my $tail = pop(@t); + my $t = expand(join("", (map { /\s+\z/ ? ( $_ ) : ($_, ' ') } @t), $tail)); + my $lead = $ip; + my $ll = $columns - length(expand($ip)) - 1; + $ll = 0 if $ll < 0; + my $nll = $columns - length(expand($xp)) - 1; + my $nl = ""; + my $remainder = ""; + + use re 'taint'; + + pos($t) = 0; + while ($t !~ /\G\s*\Z/gc) { + if ($t =~ /\G([^\n]{0,$ll})($break|\n*\z)/xmgc) { + $r .= $unexpand + ? unexpand($nl . $lead . $1) + : $nl . $lead . $1; + $remainder = $2; + } elsif ($huge eq 'wrap' && $t =~ /\G([^\n]{$ll})/gc) { + $r .= $unexpand + ? unexpand($nl . $lead . $1) + : $nl . $lead . $1; + $remainder = defined($separator2) ? $separator2 : $separator; + } elsif ($huge eq 'overflow' && $t =~ /\G([^\n]*?)($break|\z)/xmgc) { + $r .= $unexpand + ? unexpand($nl . $lead . $1) + : $nl . $lead . $1; + $remainder = $2; + } elsif ($huge eq 'die') { + die "couldn't wrap '$t'"; + } else { + die "This shouldn't happen"; + } + + $lead = $xp; + $ll = $nll; + $nl = defined($separator2) + ? ($remainder eq "\n" + ? "\n" + : $separator2) + : $separator; + } + $r .= $remainder; + + print "-----------$r---------\n" if $debug; + + print "Finish up with '$lead'\n" if $debug; + + $r .= $lead . substr($t, pos($t), length($t)-pos($t)) + if pos($t) ne length($t); + + print "-----------$r---------\n" if $debug;; + + return $r; +} + +sub fill +{ + my ($ip, $xp, @raw) = @_; + my @para; + my $pp; + + for $pp (split(/\n\s+/, join("\n",@raw))) { + $pp =~ s/\s+/ /g; + my $x = wrap($ip, $xp, $pp); + push(@para, $x); + } + + # if paragraph_indent is the same as line_indent, + # separate paragraphs with blank lines + + my $ps = ($ip eq $xp) ? "\n\n" : "\n"; + return join ($ps, @para); +} + +1; +__END__ + +=head1 NAME + +Text::Wrap - line wrapping to form simple paragraphs + +=head1 SYNOPSIS + +B<Example 1> + + use Text::Wrap + + $initial_tab = "\t"; # Tab before first line + $subsequent_tab = ""; # All other lines flush left + + print wrap($initial_tab, $subsequent_tab, @text); + print fill($initial_tab, $subsequent_tab, @text); + + $lines = wrap($initial_tab, $subsequent_tab, @text); + + @paragraphs = fill($initial_tab, $subsequent_tab, @text); + +B<Example 2> + + use Text::Wrap qw(wrap $columns $huge); + + $columns = 132; # Wrap at 132 characters + $huge = 'die'; + $huge = 'wrap'; + $huge = 'overflow'; + +B<Example 3> + + use Text::Wrap + + $Text::Wrap::columns = 72; + print wrap('', '', @text); + +=head1 DESCRIPTION + +C<Text::Wrap::wrap()> is a very simple paragraph formatter. It formats a +single paragraph at a time by breaking lines at word boundries. +Indentation is controlled for the first line (C<$initial_tab>) and +all subsequent lines (C<$subsequent_tab>) independently. Please note: +C<$initial_tab> and C<$subsequent_tab> are the literal strings that will +be used: it is unlikley you would want to pass in a number. + +Text::Wrap::fill() is a simple multi-paragraph formatter. It formats +each paragraph separately and then joins them together when it's done. It +will destroy any whitespace in the original text. It breaks text into +paragraphs by looking for whitespace after a newline. In other respects +it acts like wrap(). + +=head1 OVERRIDES + +C<Text::Wrap::wrap()> has a number of variables that control its behavior. +Because other modules might be using C<Text::Wrap::wrap()> it is suggested +that you leave these variables alone! If you can't do that, then +use C<local($Text::Wrap::VARIABLE) = YOURVALUE> when you change the +values so that the original value is restored. This C<local()> trick +will not work if you import the variable into your own namespace. + +Lines are wrapped at C<$Text::Wrap::columns> columns. C<$Text::Wrap::columns> +should be set to the full width of your output device. In fact, +every resulting line will have length of no more than C<$columns - 1>. + +It is possible to control which characters terminate words by +modifying C<$Text::Wrap::break>. Set this to a string such as +C<'[\s:]'> (to break before spaces or colons) or a pre-compiled regexp +such as C<qr/[\s']/> (to break before spaces or apostrophes). The +default is simply C<'\s'>; that is, words are terminated by spaces. +(This means, among other things, that trailing punctuation such as +full stops or commas stay with the word they are "attached" to.) + +Beginner note: In example 2, above C<$columns> is imported into +the local namespace, and set locally. In example 3, +C<$Text::Wrap::columns> is set in its own namespace without importing it. + +C<Text::Wrap::wrap()> starts its work by expanding all the tabs in its +input into spaces. The last thing it does it to turn spaces back +into tabs. If you do not want tabs in your results, set +C<$Text::Wrap::unexpand> to a false value. Likewise if you do not +want to use 8-character tabstops, set C<$Text::Wrap::tabstop> to +the number of characters you do want for your tabstops. + +If you want to separate your lines with something other than C<\n> +then set C<$Text::Wrap::separator> to your preference. This replaces +all newlines with C<$Text::Wrap::separator>. If you just to preserve +existing newlines but add new breaks with something else, set +C<$Text::Wrap::separator2> instead. + +When words that are longer than C<$columns> are encountered, they +are broken up. C<wrap()> adds a C<"\n"> at column C<$columns>. +This behavior can be overridden by setting C<$huge> to +'die' or to 'overflow'. When set to 'die', large words will cause +C<die()> to be called. When set to 'overflow', large words will be +left intact. + +Historical notes: 'die' used to be the default value of +C<$huge>. Now, 'wrap' is the default value. + +=head1 EXAMPLE + + print wrap("\t","","This is a bit of text that forms + a normal book-style paragraph"); + +=head1 LICENSE + +David Muir Sharnoff <muir@idiom.com> with help from Tim Pierce and +many many others. Copyright (C) 1996-2002 David Muir Sharnoff. +This module may be modified, used, copied, and redistributed at +your own risk. Publicly redistributed modified versions must use +a different name. + diff --git a/Master/tlpkg/tlperl.old/lib/Tie/Array.pm b/Master/tlpkg/tlperl.old/lib/Tie/Array.pm new file mode 100644 index 00000000000..af8f51e9f51 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tie/Array.pm @@ -0,0 +1,287 @@ +package Tie::Array; + +use 5.006_001; +use strict; +use Carp; +our $VERSION = '1.03'; + +# Pod documentation after __END__ below. + +sub DESTROY { } +sub EXTEND { } +sub UNSHIFT { scalar shift->SPLICE(0,0,@_) } +sub SHIFT { shift->SPLICE(0,1) } +sub CLEAR { shift->STORESIZE(0) } + +sub PUSH +{ + my $obj = shift; + my $i = $obj->FETCHSIZE; + $obj->STORE($i++, shift) while (@_); +} + +sub POP +{ + my $obj = shift; + my $newsize = $obj->FETCHSIZE - 1; + my $val; + if ($newsize >= 0) + { + $val = $obj->FETCH($newsize); + $obj->STORESIZE($newsize); + } + $val; +} + +sub SPLICE { + my $obj = shift; + my $sz = $obj->FETCHSIZE; + my $off = (@_) ? shift : 0; + $off += $sz if ($off < 0); + my $len = (@_) ? shift : $sz - $off; + $len += $sz - $off if $len < 0; + my @result; + for (my $i = 0; $i < $len; $i++) { + push(@result,$obj->FETCH($off+$i)); + } + $off = $sz if $off > $sz; + $len -= $off + $len - $sz if $off + $len > $sz; + if (@_ > $len) { + # Move items up to make room + my $d = @_ - $len; + my $e = $off+$len; + $obj->EXTEND($sz+$d); + for (my $i=$sz-1; $i >= $e; $i--) { + my $val = $obj->FETCH($i); + $obj->STORE($i+$d,$val); + } + } + elsif (@_ < $len) { + # Move items down to close the gap + my $d = $len - @_; + my $e = $off+$len; + for (my $i=$off+$len; $i < $sz; $i++) { + my $val = $obj->FETCH($i); + $obj->STORE($i-$d,$val); + } + $obj->STORESIZE($sz-$d); + } + for (my $i=0; $i < @_; $i++) { + $obj->STORE($off+$i,$_[$i]); + } + return wantarray ? @result : pop @result; +} + +sub EXISTS { + my $pkg = ref $_[0]; + croak "$pkg doesn't define an EXISTS method"; +} + +sub DELETE { + my $pkg = ref $_[0]; + croak "$pkg doesn't define a DELETE method"; +} + +package Tie::StdArray; +use vars qw(@ISA); +@ISA = 'Tie::Array'; + +sub TIEARRAY { bless [], $_[0] } +sub FETCHSIZE { scalar @{$_[0]} } +sub STORESIZE { $#{$_[0]} = $_[1]-1 } +sub STORE { $_[0]->[$_[1]] = $_[2] } +sub FETCH { $_[0]->[$_[1]] } +sub CLEAR { @{$_[0]} = () } +sub POP { pop(@{$_[0]}) } +sub PUSH { my $o = shift; push(@$o,@_) } +sub SHIFT { shift(@{$_[0]}) } +sub UNSHIFT { my $o = shift; unshift(@$o,@_) } +sub EXISTS { exists $_[0]->[$_[1]] } +sub DELETE { delete $_[0]->[$_[1]] } + +sub SPLICE +{ + my $ob = shift; + my $sz = $ob->FETCHSIZE; + my $off = @_ ? shift : 0; + $off += $sz if $off < 0; + my $len = @_ ? shift : $sz-$off; + return splice(@$ob,$off,$len,@_); +} + +1; + +__END__ + +=head1 NAME + +Tie::Array - base class for tied arrays + +=head1 SYNOPSIS + + package Tie::NewArray; + use Tie::Array; + @ISA = ('Tie::Array'); + + # mandatory methods + sub TIEARRAY { ... } + sub FETCH { ... } + sub FETCHSIZE { ... } + + sub STORE { ... } # mandatory if elements writeable + sub STORESIZE { ... } # mandatory if elements can be added/deleted + sub EXISTS { ... } # mandatory if exists() expected to work + sub DELETE { ... } # mandatory if delete() expected to work + + # optional methods - for efficiency + sub CLEAR { ... } + sub PUSH { ... } + sub POP { ... } + sub SHIFT { ... } + sub UNSHIFT { ... } + sub SPLICE { ... } + sub EXTEND { ... } + sub DESTROY { ... } + + package Tie::NewStdArray; + use Tie::Array; + + @ISA = ('Tie::StdArray'); + + # all methods provided by default + + package main; + + $object = tie @somearray,Tie::NewArray; + $object = tie @somearray,Tie::StdArray; + $object = tie @somearray,Tie::NewStdArray; + + + +=head1 DESCRIPTION + +This module provides methods for array-tying classes. See +L<perltie> for a list of the functions required in order to tie an array +to a package. The basic B<Tie::Array> package provides stub C<DESTROY>, +and C<EXTEND> methods that do nothing, stub C<DELETE> and C<EXISTS> +methods that croak() if the delete() or exists() builtins are ever called +on the tied array, and implementations of C<PUSH>, C<POP>, C<SHIFT>, +C<UNSHIFT>, C<SPLICE> and C<CLEAR> in terms of basic C<FETCH>, C<STORE>, +C<FETCHSIZE>, C<STORESIZE>. + +The B<Tie::StdArray> package provides efficient methods required for tied arrays +which are implemented as blessed references to an "inner" perl array. +It inherits from B<Tie::Array>, and should cause tied arrays to behave exactly +like standard arrays, allowing for selective overloading of methods. + +For developers wishing to write their own tied arrays, the required methods +are briefly defined below. See the L<perltie> section for more detailed +descriptive, as well as example code: + +=over 4 + +=item TIEARRAY classname, LIST + +The class method is invoked by the command C<tie @array, classname>. Associates +an array instance with the specified class. C<LIST> would represent +additional arguments (along the lines of L<AnyDBM_File> and compatriots) needed +to complete the association. The method should return an object of a class which +provides the methods below. + +=item STORE this, index, value + +Store datum I<value> into I<index> for the tied array associated with +object I<this>. If this makes the array larger then +class's mapping of C<undef> should be returned for new positions. + +=item FETCH this, index + +Retrieve the datum in I<index> for the tied array associated with +object I<this>. + +=item FETCHSIZE this + +Returns the total number of items in the tied array associated with +object I<this>. (Equivalent to C<scalar(@array)>). + +=item STORESIZE this, count + +Sets the total number of items in the tied array associated with +object I<this> to be I<count>. If this makes the array larger then +class's mapping of C<undef> should be returned for new positions. +If the array becomes smaller then entries beyond count should be +deleted. + +=item EXTEND this, count + +Informative call that array is likely to grow to have I<count> entries. +Can be used to optimize allocation. This method need do nothing. + +=item EXISTS this, key + +Verify that the element at index I<key> exists in the tied array I<this>. + +The B<Tie::Array> implementation is a stub that simply croaks. + +=item DELETE this, key + +Delete the element at index I<key> from the tied array I<this>. + +The B<Tie::Array> implementation is a stub that simply croaks. + +=item CLEAR this + +Clear (remove, delete, ...) all values from the tied array associated with +object I<this>. + +=item DESTROY this + +Normal object destructor method. + +=item PUSH this, LIST + +Append elements of LIST to the array. + +=item POP this + +Remove last element of the array and return it. + +=item SHIFT this + +Remove the first element of the array (shifting other elements down) +and return it. + +=item UNSHIFT this, LIST + +Insert LIST elements at the beginning of the array, moving existing elements +up to make room. + +=item SPLICE this, offset, length, LIST + +Perform the equivalent of C<splice> on the array. + +I<offset> is optional and defaults to zero, negative values count back +from the end of the array. + +I<length> is optional and defaults to rest of the array. + +I<LIST> may be empty. + +Returns a list of the original I<length> elements at I<offset>. + +=back + +=head1 CAVEATS + +There is no support at present for tied @ISA. There is a potential conflict +between magic entries needed to notice setting of @ISA, and those needed to +implement 'tie'. + +Very little consideration has been given to the behaviour of tied arrays +when C<$[> is not default value of zero. + +=head1 AUTHOR + +Nick Ing-Simmons E<lt>nik@tiuk.ti.comE<gt> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Tie/File.pm b/Master/tlpkg/tlperl.old/lib/Tie/File.pm new file mode 100644 index 00000000000..a1f40afe199 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tie/File.pm @@ -0,0 +1,2632 @@ + +package Tie::File; +require 5.005; +use Carp ':DEFAULT', 'confess'; +use POSIX 'SEEK_SET'; +use Fcntl 'O_CREAT', 'O_RDWR', 'LOCK_EX', 'LOCK_SH', 'O_WRONLY', 'O_RDONLY'; +sub O_ACCMODE () { O_RDONLY | O_RDWR | O_WRONLY } + + +$VERSION = "0.97"; +my $DEFAULT_MEMORY_SIZE = 1<<21; # 2 megabytes +my $DEFAULT_AUTODEFER_THRESHHOLD = 3; # 3 records +my $DEFAULT_AUTODEFER_FILELEN_THRESHHOLD = 65536; # 16 disk blocksful + +my %good_opt = map {$_ => 1, "-$_" => 1} + qw(memory dw_size mode recsep discipline + autodefer autochomp autodefer_threshhold concurrent); + +sub TIEARRAY { + if (@_ % 2 != 0) { + croak "usage: tie \@array, $_[0], filename, [option => value]..."; + } + my ($pack, $file, %opts) = @_; + + # transform '-foo' keys into 'foo' keys + for my $key (keys %opts) { + unless ($good_opt{$key}) { + croak("$pack: Unrecognized option '$key'\n"); + } + my $okey = $key; + if ($key =~ s/^-+//) { + $opts{$key} = delete $opts{$okey}; + } + } + + if ($opts{concurrent}) { + croak("$pack: concurrent access not supported yet\n"); + } + + unless (defined $opts{memory}) { + # default is the larger of the default cache size and the + # deferred-write buffer size (if specified) + $opts{memory} = $DEFAULT_MEMORY_SIZE; + $opts{memory} = $opts{dw_size} + if defined $opts{dw_size} && $opts{dw_size} > $DEFAULT_MEMORY_SIZE; + # Dora Winifred Read + } + $opts{dw_size} = $opts{memory} unless defined $opts{dw_size}; + if ($opts{dw_size} > $opts{memory}) { + croak("$pack: dw_size may not be larger than total memory allocation\n"); + } + # are we in deferred-write mode? + $opts{defer} = 0 unless defined $opts{defer}; + $opts{deferred} = {}; # no records are presently deferred + $opts{deferred_s} = 0; # count of total bytes in ->{deferred} + $opts{deferred_max} = -1; # empty + + # What's a good way to arrange that this class can be overridden? + $opts{cache} = Tie::File::Cache->new($opts{memory}); + + # autodeferment is enabled by default + $opts{autodefer} = 1 unless defined $opts{autodefer}; + $opts{autodeferring} = 0; # but is not initially active + $opts{ad_history} = []; + $opts{autodefer_threshhold} = $DEFAULT_AUTODEFER_THRESHHOLD + unless defined $opts{autodefer_threshhold}; + $opts{autodefer_filelen_threshhold} = $DEFAULT_AUTODEFER_FILELEN_THRESHHOLD + unless defined $opts{autodefer_filelen_threshhold}; + + $opts{offsets} = [0]; + $opts{filename} = $file; + unless (defined $opts{recsep}) { + $opts{recsep} = _default_recsep(); + } + $opts{recseplen} = length($opts{recsep}); + if ($opts{recseplen} == 0) { + croak "Empty record separator not supported by $pack"; + } + + $opts{autochomp} = 1 unless defined $opts{autochomp}; + + $opts{mode} = O_CREAT|O_RDWR unless defined $opts{mode}; + $opts{rdonly} = (($opts{mode} & O_ACCMODE) == O_RDONLY); + $opts{sawlastrec} = undef; + + my $fh; + + if (UNIVERSAL::isa($file, 'GLOB')) { + # We use 1 here on the theory that some systems + # may not indicate failure if we use 0. + # MSWin32 does not indicate failure with 0, but I don't know if + # it will indicate failure with 1 or not. + unless (seek $file, 1, SEEK_SET) { + croak "$pack: your filehandle does not appear to be seekable"; + } + seek $file, 0, SEEK_SET # put it back + $fh = $file; # setting binmode is the user's problem + } elsif (ref $file) { + croak "usage: tie \@array, $pack, filename, [option => value]..."; + } else { + # $fh = \do { local *FH }; # XXX this is buggy + if ($] < 5.006) { + # perl 5.005 and earlier don't autovivify filehandles + require Symbol; + $fh = Symbol::gensym(); + } + sysopen $fh, $file, $opts{mode}, 0666 or return; + binmode $fh; + ++$opts{ourfh}; + } + { my $ofh = select $fh; $| = 1; select $ofh } # autoflush on write + if (defined $opts{discipline} && $] >= 5.006) { + # This avoids a compile-time warning under 5.005 + eval 'binmode($fh, $opts{discipline})'; + croak $@ if $@ =~ /unknown discipline/i; + die if $@; + } + $opts{fh} = $fh; + + bless \%opts => $pack; +} + +sub FETCH { + my ($self, $n) = @_; + my $rec; + + # check the defer buffer + $rec = $self->{deferred}{$n} if exists $self->{deferred}{$n}; + $rec = $self->_fetch($n) unless defined $rec; + + # inlined _chomp1 + substr($rec, - $self->{recseplen}) = "" + if defined $rec && $self->{autochomp}; + $rec; +} + +# Chomp many records in-place; return nothing useful +sub _chomp { + my $self = shift; + return unless $self->{autochomp}; + if ($self->{autochomp}) { + for (@_) { + next unless defined; + substr($_, - $self->{recseplen}) = ""; + } + } +} + +# Chomp one record in-place; return modified record +sub _chomp1 { + my ($self, $rec) = @_; + return $rec unless $self->{autochomp}; + return unless defined $rec; + substr($rec, - $self->{recseplen}) = ""; + $rec; +} + +sub _fetch { + my ($self, $n) = @_; + + # check the record cache + { my $cached = $self->{cache}->lookup($n); + return $cached if defined $cached; + } + + if ($#{$self->{offsets}} < $n) { + return if $self->{eof}; # request for record beyond end of file + my $o = $self->_fill_offsets_to($n); + # If it's still undefined, there is no such record, so return 'undef' + return unless defined $o; + } + + my $fh = $self->{FH}; + $self->_seek($n); # we can do this now that offsets is populated + my $rec = $self->_read_record; + +# If we happen to have just read the first record, check to see if +# the length of the record matches what 'tell' says. If not, Tie::File +# won't work, and should drop dead. +# +# if ($n == 0 && defined($rec) && tell($self->{fh}) != length($rec)) { +# if (defined $self->{discipline}) { +# croak "I/O discipline $self->{discipline} not supported"; +# } else { +# croak "File encoding not supported"; +# } +# } + + $self->{cache}->insert($n, $rec) if defined $rec && not $self->{flushing}; + $rec; +} + +sub STORE { + my ($self, $n, $rec) = @_; + die "STORE called from _check_integrity!" if $DIAGNOSTIC; + + $self->_fixrecs($rec); + + if ($self->{autodefer}) { + $self->_annotate_ad_history($n); + } + + return $self->_store_deferred($n, $rec) if $self->_is_deferring; + + + # We need this to decide whether the new record will fit + # It incidentally populates the offsets table + # Note we have to do this before we alter the cache + # 20020324 Wait, but this DOES alter the cache. TODO BUG? + my $oldrec = $self->_fetch($n); + + if (not defined $oldrec) { + # We're storing a record beyond the end of the file + $self->_extend_file_to($n+1); + $oldrec = $self->{recsep}; + } +# return if $oldrec eq $rec; # don't bother + my $len_diff = length($rec) - length($oldrec); + + # length($oldrec) here is not consistent with text mode TODO XXX BUG + $self->_mtwrite($rec, $self->{offsets}[$n], length($oldrec)); + $self->_oadjust([$n, 1, $rec]); + $self->{cache}->update($n, $rec); +} + +sub _store_deferred { + my ($self, $n, $rec) = @_; + $self->{cache}->remove($n); + my $old_deferred = $self->{deferred}{$n}; + + if (defined $self->{deferred_max} && $n > $self->{deferred_max}) { + $self->{deferred_max} = $n; + } + $self->{deferred}{$n} = $rec; + + my $len_diff = length($rec); + $len_diff -= length($old_deferred) if defined $old_deferred; + $self->{deferred_s} += $len_diff; + $self->{cache}->adj_limit(-$len_diff); + if ($self->{deferred_s} > $self->{dw_size}) { + $self->_flush; + } elsif ($self->_cache_too_full) { + $self->_cache_flush; + } +} + +# Remove a single record from the deferred-write buffer without writing it +# The record need not be present +sub _delete_deferred { + my ($self, $n) = @_; + my $rec = delete $self->{deferred}{$n}; + return unless defined $rec; + + if (defined $self->{deferred_max} + && $n == $self->{deferred_max}) { + undef $self->{deferred_max}; + } + + $self->{deferred_s} -= length $rec; + $self->{cache}->adj_limit(length $rec); +} + +sub FETCHSIZE { + my $self = shift; + my $n = $self->{eof} ? $#{$self->{offsets}} : $self->_fill_offsets; + + my $top_deferred = $self->_defer_max; + $n = $top_deferred+1 if defined $top_deferred && $n < $top_deferred+1; + $n; +} + +sub STORESIZE { + my ($self, $len) = @_; + + if ($self->{autodefer}) { + $self->_annotate_ad_history('STORESIZE'); + } + + my $olen = $self->FETCHSIZE; + return if $len == $olen; # Woo-hoo! + + # file gets longer + if ($len > $olen) { + if ($self->_is_deferring) { + for ($olen .. $len-1) { + $self->_store_deferred($_, $self->{recsep}); + } + } else { + $self->_extend_file_to($len); + } + return; + } + + # file gets shorter + if ($self->_is_deferring) { + # TODO maybe replace this with map-plus-assignment? + for (grep $_ >= $len, keys %{$self->{deferred}}) { + $self->_delete_deferred($_); + } + $self->{deferred_max} = $len-1; + } + + $self->_seek($len); + $self->_chop_file; + $#{$self->{offsets}} = $len; +# $self->{offsets}[0] = 0; # in case we just chopped this + + $self->{cache}->remove(grep $_ >= $len, $self->{cache}->ckeys); +} + +### OPTIMIZE ME +### It should not be necessary to do FETCHSIZE +### Just seek to the end of the file. +sub PUSH { + my $self = shift; + $self->SPLICE($self->FETCHSIZE, scalar(@_), @_); + + # No need to return: + # $self->FETCHSIZE; # because av.c takes care of this for me +} + +sub POP { + my $self = shift; + my $size = $self->FETCHSIZE; + return if $size == 0; +# print STDERR "# POPPITY POP POP POP\n"; + scalar $self->SPLICE($size-1, 1); +} + +sub SHIFT { + my $self = shift; + scalar $self->SPLICE(0, 1); +} + +sub UNSHIFT { + my $self = shift; + $self->SPLICE(0, 0, @_); + # $self->FETCHSIZE; # av.c takes care of this for me +} + +sub CLEAR { + my $self = shift; + + if ($self->{autodefer}) { + $self->_annotate_ad_history('CLEAR'); + } + + $self->_seekb(0); + $self->_chop_file; + $self->{cache}->set_limit($self->{memory}); + $self->{cache}->empty; + @{$self->{offsets}} = (0); + %{$self->{deferred}}= (); + $self->{deferred_s} = 0; + $self->{deferred_max} = -1; +} + +sub EXTEND { + my ($self, $n) = @_; + + # No need to pre-extend anything in this case + return if $self->_is_deferring; + + $self->_fill_offsets_to($n); + $self->_extend_file_to($n); +} + +sub DELETE { + my ($self, $n) = @_; + + if ($self->{autodefer}) { + $self->_annotate_ad_history('DELETE'); + } + + my $lastrec = $self->FETCHSIZE-1; + my $rec = $self->FETCH($n); + $self->_delete_deferred($n) if $self->_is_deferring; + if ($n == $lastrec) { + $self->_seek($n); + $self->_chop_file; + $#{$self->{offsets}}--; + $self->{cache}->remove($n); + # perhaps in this case I should also remove trailing null records? + # 20020316 + # Note that delete @a[-3..-1] deletes the records in the wrong order, + # so we only chop the very last one out of the file. We could repair this + # by tracking deleted records inside the object. + } elsif ($n < $lastrec) { + $self->STORE($n, ""); + } + $rec; +} + +sub EXISTS { + my ($self, $n) = @_; + return 1 if exists $self->{deferred}{$n}; + $n < $self->FETCHSIZE; +} + +sub SPLICE { + my $self = shift; + + if ($self->{autodefer}) { + $self->_annotate_ad_history('SPLICE'); + } + + $self->_flush if $self->_is_deferring; # move this up? + if (wantarray) { + $self->_chomp(my @a = $self->_splice(@_)); + @a; + } else { + $self->_chomp1(scalar $self->_splice(@_)); + } +} + +sub DESTROY { + my $self = shift; + $self->flush if $self->_is_deferring; + $self->{cache}->delink if defined $self->{cache}; # break circular link + if ($self->{fh} and $self->{ourfh}) { + delete $self->{ourfh}; + close delete $self->{fh}; + } +} + +sub _splice { + my ($self, $pos, $nrecs, @data) = @_; + my @result; + + $pos = 0 unless defined $pos; + + # Deal with negative and other out-of-range positions + # Also set default for $nrecs + { + my $oldsize = $self->FETCHSIZE; + $nrecs = $oldsize unless defined $nrecs; + my $oldpos = $pos; + + if ($pos < 0) { + $pos += $oldsize; + if ($pos < 0) { + croak "Modification of non-creatable array value attempted, subscript $oldpos"; + } + } + + if ($pos > $oldsize) { + return unless @data; + $pos = $oldsize; # This is what perl does for normal arrays + } + + # The manual is very unclear here + if ($nrecs < 0) { + $nrecs = $oldsize - $pos + $nrecs; + $nrecs = 0 if $nrecs < 0; + } + + # nrecs is too big---it really means "until the end" + # 20030507 + if ($nrecs + $pos > $oldsize) { + $nrecs = $oldsize - $pos; + } + } + + $self->_fixrecs(@data); + my $data = join '', @data; + my $datalen = length $data; + my $oldlen = 0; + + # compute length of data being removed + for ($pos .. $pos+$nrecs-1) { + last unless defined $self->_fill_offsets_to($_); + my $rec = $self->_fetch($_); + last unless defined $rec; + push @result, $rec; + + # Why don't we just use length($rec) here? + # Because that record might have come from the cache. _splice + # might have been called to flush out the deferred-write records, + # and in this case length($rec) is the length of the record to be + # *written*, not the length of the actual record in the file. But + # the offsets are still true. 20020322 + $oldlen += $self->{offsets}[$_+1] - $self->{offsets}[$_] + if defined $self->{offsets}[$_+1]; + } + $self->_fill_offsets_to($pos+$nrecs); + + # Modify the file + $self->_mtwrite($data, $self->{offsets}[$pos], $oldlen); + # Adjust the offsets table + $self->_oadjust([$pos, $nrecs, @data]); + + { # Take this read cache stuff out into a separate function + # You made a half-attempt to put it into _oadjust. + # Finish something like that up eventually. + # STORE also needs to do something similarish + + # update the read cache, part 1 + # modified records + for ($pos .. $pos+$nrecs-1) { + my $new = $data[$_-$pos]; + if (defined $new) { + $self->{cache}->update($_, $new); + } else { + $self->{cache}->remove($_); + } + } + + # update the read cache, part 2 + # moved records - records past the site of the change + # need to be renumbered + # Maybe merge this with the previous block? + { + my @oldkeys = grep $_ >= $pos + $nrecs, $self->{cache}->ckeys; + my @newkeys = map $_-$nrecs+@data, @oldkeys; + $self->{cache}->rekey(\@oldkeys, \@newkeys); + } + + # Now there might be too much data in the cache, if we spliced out + # some short records and spliced in some long ones. If so, flush + # the cache. + $self->_cache_flush; + } + + # Yes, the return value of 'splice' *is* actually this complicated + wantarray ? @result : @result ? $result[-1] : undef; +} + + +# write data into the file +# $data is the data to be written. +# it should be written at position $pos, and should overwrite +# exactly $len of the following bytes. +# Note that if length($data) > $len, the subsequent bytes will have to +# be moved up, and if length($data) < $len, they will have to +# be moved down +sub _twrite { + my ($self, $data, $pos, $len) = @_; + + unless (defined $pos) { + die "\$pos was undefined in _twrite"; + } + + my $len_diff = length($data) - $len; + + if ($len_diff == 0) { # Woo-hoo! + my $fh = $self->{fh}; + $self->_seekb($pos); + $self->_write_record($data); + return; # well, that was easy. + } + + # the two records are of different lengths + # our strategy here: rewrite the tail of the file, + # reading ahead one buffer at a time + # $bufsize is required to be at least as large as the data we're overwriting + my $bufsize = _bufsize($len_diff); + my ($writepos, $readpos) = ($pos, $pos+$len); + my $next_block; + my $more_data; + + # Seems like there ought to be a way to avoid the repeated code + # and the special case here. The read(1) is also a little weird. + # Think about this. + do { + $self->_seekb($readpos); + my $br = read $self->{fh}, $next_block, $bufsize; + $more_data = read $self->{fh}, my($dummy), 1; + $self->_seekb($writepos); + $self->_write_record($data); + $readpos += $br; + $writepos += length $data; + $data = $next_block; + } while $more_data; + $self->_seekb($writepos); + $self->_write_record($next_block); + + # There might be leftover data at the end of the file + $self->_chop_file if $len_diff < 0; +} + +# _iwrite(D, S, E) +# Insert text D at position S. +# Let C = E-S-|D|. If C < 0; die. +# Data in [S,S+C) is copied to [S+D,S+D+C) = [S+D,E). +# Data in [S+C = E-D, E) is returned. Data in [E, oo) is untouched. +# +# In a later version, don't read the entire intervening area into +# memory at once; do the copying block by block. +sub _iwrite { + my $self = shift; + my ($D, $s, $e) = @_; + my $d = length $D; + my $c = $e-$s-$d; + local *FH = $self->{fh}; + confess "Not enough space to insert $d bytes between $s and $e" + if $c < 0; + confess "[$s,$e) is an invalid insertion range" if $e < $s; + + $self->_seekb($s); + read FH, my $buf, $e-$s; + + $D .= substr($buf, 0, $c, ""); + + $self->_seekb($s); + $self->_write_record($D); + + return $buf; +} + +# Like _twrite, but the data-pos-len triple may be repeated; you may +# write several chunks. All the writing will be done in +# one pass. Chunks SHALL be in ascending order and SHALL NOT overlap. +sub _mtwrite { + my $self = shift; + my $unwritten = ""; + my $delta = 0; + + @_ % 3 == 0 + or die "Arguments to _mtwrite did not come in groups of three"; + + while (@_) { + my ($data, $pos, $len) = splice @_, 0, 3; + my $end = $pos + $len; # The OLD end of the segment to be replaced + $data = $unwritten . $data; + $delta -= length($unwritten); + $unwritten = ""; + $pos += $delta; # This is where the data goes now + my $dlen = length $data; + $self->_seekb($pos); + if ($len >= $dlen) { # the data will fit + $self->_write_record($data); + $delta += ($dlen - $len); # everything following moves down by this much + $data = ""; # All the data in the buffer has been written + } else { # won't fit + my $writable = substr($data, 0, $len - $delta, ""); + $self->_write_record($writable); + $delta += ($dlen - $len); # everything following moves down by this much + } + + # At this point we've written some but maybe not all of the data. + # There might be a gap to close up, or $data might still contain a + # bunch of unwritten data that didn't fit. + my $ndlen = length $data; + if ($delta == 0) { + $self->_write_record($data); + } elsif ($delta < 0) { + # upcopy (close up gap) + if (@_) { + $self->_upcopy($end, $end + $delta, $_[1] - $end); + } else { + $self->_upcopy($end, $end + $delta); + } + } else { + # downcopy (insert data that didn't fit; replace this data in memory + # with _later_ data that doesn't fit) + if (@_) { + $unwritten = $self->_downcopy($data, $end, $_[1] - $end); + } else { + # Make the file longer to accomodate the last segment that doesn' + $unwritten = $self->_downcopy($data, $end); + } + } + } +} + +# Copy block of data of length $len from position $spos to position $dpos +# $dpos must be <= $spos +# +# If $len is undefined, go all the way to the end of the file +# and then truncate it ($spos - $dpos bytes will be removed) +sub _upcopy { + my $blocksize = 8192; + my ($self, $spos, $dpos, $len) = @_; + if ($dpos > $spos) { + die "source ($spos) was upstream of destination ($dpos) in _upcopy"; + } elsif ($dpos == $spos) { + return; + } + + while (! defined ($len) || $len > 0) { + my $readsize = ! defined($len) ? $blocksize + : $len > $blocksize ? $blocksize + : $len; + + my $fh = $self->{fh}; + $self->_seekb($spos); + my $bytes_read = read $fh, my($data), $readsize; + $self->_seekb($dpos); + if ($data eq "") { + $self->_chop_file; + last; + } + $self->_write_record($data); + $spos += $bytes_read; + $dpos += $bytes_read; + $len -= $bytes_read if defined $len; + } +} + +# Write $data into a block of length $len at position $pos, +# moving everything in the block forwards to make room. +# Instead of writing the last length($data) bytes from the block +# (because there isn't room for them any longer) return them. +# +# Undefined $len means 'until the end of the file' +sub _downcopy { + my $blocksize = 8192; + my ($self, $data, $pos, $len) = @_; + my $fh = $self->{fh}; + + while (! defined $len || $len > 0) { + my $readsize = ! defined($len) ? $blocksize + : $len > $blocksize? $blocksize : $len; + $self->_seekb($pos); + read $fh, my($old), $readsize; + my $last_read_was_short = length($old) < $readsize; + $data .= $old; + my $writable; + if ($last_read_was_short) { + # If last read was short, then $data now contains the entire rest + # of the file, so there's no need to write only one block of it + $writable = $data; + $data = ""; + } else { + $writable = substr($data, 0, $readsize, ""); + } + last if $writable eq ""; + $self->_seekb($pos); + $self->_write_record($writable); + last if $last_read_was_short && $data eq ""; + $len -= $readsize if defined $len; + $pos += $readsize; + } + return $data; +} + +# Adjust the object data structures following an '_mtwrite' +# Arguments are +# [$pos, $nrecs, @length] items +# indicating that $nrecs records were removed at $recpos (a record offset) +# and replaced with records of length @length... +# Arguments guarantee that $recpos is strictly increasing. +# No return value +sub _oadjust { + my $self = shift; + my $delta = 0; + my $delta_recs = 0; + my $prev_end = -1; + my %newkeys; + + for (@_) { + my ($pos, $nrecs, @data) = @$_; + $pos += $delta_recs; + + # Adjust the offsets of the records after the previous batch up + # to the first new one of this batch + for my $i ($prev_end+2 .. $pos - 1) { + $self->{offsets}[$i] += $delta; + $newkey{$i} = $i + $delta_recs; + } + + $prev_end = $pos + @data - 1; # last record moved on this pass + + # Remove the offsets for the removed records; + # replace with the offsets for the inserted records + my @newoff = ($self->{offsets}[$pos] + $delta); + for my $i (0 .. $#data) { + my $newlen = length $data[$i]; + push @newoff, $newoff[$i] + $newlen; + $delta += $newlen; + } + + for my $i ($pos .. $pos+$nrecs-1) { + last if $i+1 > $#{$self->{offsets}}; + my $oldlen = $self->{offsets}[$i+1] - $self->{offsets}[$i]; + $delta -= $oldlen; + } + +# # also this data has changed, so update it in the cache +# for (0 .. $#data) { +# $self->{cache}->update($pos + $_, $data[$_]); +# } +# if ($delta_recs) { +# my @oldkeys = grep $_ >= $pos + @data, $self->{cache}->ckeys; +# my @newkeys = map $_ + $delta_recs, @oldkeys; +# $self->{cache}->rekey(\@oldkeys, \@newkeys); +# } + + # replace old offsets with new + splice @{$self->{offsets}}, $pos, $nrecs+1, @newoff; + # What if we just spliced out the end of the offsets table? + # shouldn't we clear $self->{eof}? Test for this XXX BUG TODO + + $delta_recs += @data - $nrecs; # net change in total number of records + } + + # The trailing records at the very end of the file + if ($delta) { + for my $i ($prev_end+2 .. $#{$self->{offsets}}) { + $self->{offsets}[$i] += $delta; + } + } + + # If we scrubbed out all known offsets, regenerate the trivial table + # that knows that the file does indeed start at 0. + $self->{offsets}[0] = 0 unless @{$self->{offsets}}; + # If the file got longer, the offsets table is no longer complete + # $self->{eof} = 0 if $delta_recs > 0; + + # Now there might be too much data in the cache, if we spliced out + # some short records and spliced in some long ones. If so, flush + # the cache. + $self->_cache_flush; +} + +# If a record does not already end with the appropriate terminator +# string, append one. +sub _fixrecs { + my $self = shift; + for (@_) { + $_ = "" unless defined $_; + $_ .= $self->{recsep} + unless substr($_, - $self->{recseplen}) eq $self->{recsep}; + } +} + + +################################################################ +# +# Basic read, write, and seek +# + +# seek to the beginning of record #$n +# Assumes that the offsets table is already correctly populated +# +# Note that $n=-1 has a special meaning here: It means the start of +# the last known record; this may or may not be the very last record +# in the file, depending on whether the offsets table is fully populated. +# +sub _seek { + my ($self, $n) = @_; + my $o = $self->{offsets}[$n]; + defined($o) + or confess("logic error: undefined offset for record $n"); + seek $self->{fh}, $o, SEEK_SET + or confess "Couldn't seek filehandle: $!"; # "Should never happen." +} + +# seek to byte $b in the file +sub _seekb { + my ($self, $b) = @_; + seek $self->{fh}, $b, SEEK_SET + or die "Couldn't seek filehandle: $!"; # "Should never happen." +} + +# populate the offsets table up to the beginning of record $n +# return the offset of record $n +sub _fill_offsets_to { + my ($self, $n) = @_; + + return $self->{offsets}[$n] if $self->{eof}; + + my $fh = $self->{fh}; + local *OFF = $self->{offsets}; + my $rec; + + until ($#OFF >= $n) { + $self->_seek(-1); # tricky -- see comment at _seek + $rec = $self->_read_record; + if (defined $rec) { + push @OFF, int(tell $fh); # Tels says that int() saves memory here + } else { + $self->{eof} = 1; + return; # It turns out there is no such record + } + } + + # we have now read all the records up to record n-1, + # so we can return the offset of record n + $OFF[$n]; +} + +sub _fill_offsets { + my ($self) = @_; + + my $fh = $self->{fh}; + local *OFF = $self->{offsets}; + + $self->_seek(-1); # tricky -- see comment at _seek + + # Tels says that inlining read_record() would make this loop + # five times faster. 20030508 + while ( defined $self->_read_record()) { + # int() saves us memory here + push @OFF, int(tell $fh); + } + + $self->{eof} = 1; + $#OFF; +} + +# assumes that $rec is already suitably terminated +sub _write_record { + my ($self, $rec) = @_; + my $fh = $self->{fh}; + local $\ = ""; + print $fh $rec + or die "Couldn't write record: $!"; # "Should never happen." +# $self->{_written} += length($rec); +} + +sub _read_record { + my $self = shift; + my $rec; + { local $/ = $self->{recsep}; + my $fh = $self->{fh}; + $rec = <$fh>; + } + return unless defined $rec; + if (substr($rec, -$self->{recseplen}) ne $self->{recsep}) { + # improperly terminated final record --- quietly fix it. +# my $ac = substr($rec, -$self->{recseplen}); +# $ac =~ s/\n/\\n/g; + $self->{sawlastrec} = 1; + unless ($self->{rdonly}) { + local $\ = ""; + my $fh = $self->{fh}; + print $fh $self->{recsep}; + } + $rec .= $self->{recsep}; + } +# $self->{_read} += length($rec) if defined $rec; + $rec; +} + +sub _rw_stats { + my $self = shift; + @{$self}{'_read', '_written'}; +} + +################################################################ +# +# Read cache management + +sub _cache_flush { + my ($self) = @_; + $self->{cache}->reduce_size_to($self->{memory} - $self->{deferred_s}); +} + +sub _cache_too_full { + my $self = shift; + $self->{cache}->bytes + $self->{deferred_s} >= $self->{memory}; +} + +################################################################ +# +# File custodial services +# + + +# We have read to the end of the file and have the offsets table +# entirely populated. Now we need to write a new record beyond +# the end of the file. We prepare for this by writing +# empty records into the file up to the position we want +# +# assumes that the offsets table already contains the offset of record $n, +# if it exists, and extends to the end of the file if not. +sub _extend_file_to { + my ($self, $n) = @_; + $self->_seek(-1); # position after the end of the last record + my $pos = $self->{offsets}[-1]; + + # the offsets table has one entry more than the total number of records + my $extras = $n - $#{$self->{offsets}}; + + # Todo : just use $self->{recsep} x $extras here? + while ($extras-- > 0) { + $self->_write_record($self->{recsep}); + push @{$self->{offsets}}, int(tell $self->{fh}); + } +} + +# Truncate the file at the current position +sub _chop_file { + my $self = shift; + truncate $self->{fh}, tell($self->{fh}); +} + + +# compute the size of a buffer suitable for moving +# all the data in a file forward $n bytes +# ($n may be negative) +# The result should be at least $n. +sub _bufsize { + my $n = shift; + return 8192 if $n <= 0; + my $b = $n & ~8191; + $b += 8192 if $n & 8191; + $b; +} + +################################################################ +# +# Miscellaneous public methods +# + +# Lock the file +sub flock { + my ($self, $op) = @_; + unless (@_ <= 3) { + my $pack = ref $self; + croak "Usage: $pack\->flock([OPERATION])"; + } + my $fh = $self->{fh}; + $op = LOCK_EX unless defined $op; + my $locked = flock $fh, $op; + + if ($locked && ($op & (LOCK_EX | LOCK_SH))) { + # If you're locking the file, then presumably it's because + # there might have been a write access by another process. + # In that case, the read cache contents and the offsets table + # might be invalid, so discard them. 20030508 + $self->{offsets} = [0]; + $self->{cache}->empty; + } + + $locked; +} + +# Get/set autochomp option +sub autochomp { + my $self = shift; + if (@_) { + my $old = $self->{autochomp}; + $self->{autochomp} = shift; + $old; + } else { + $self->{autochomp}; + } +} + +# Get offset table entries; returns offset of nth record +sub offset { + my ($self, $n) = @_; + + if ($#{$self->{offsets}} < $n) { + return if $self->{eof}; # request for record beyond the end of file + my $o = $self->_fill_offsets_to($n); + # If it's still undefined, there is no such record, so return 'undef' + return unless defined $o; + } + + $self->{offsets}[$n]; +} + +sub discard_offsets { + my $self = shift; + $self->{offsets} = [0]; +} + +################################################################ +# +# Matters related to deferred writing +# + +# Defer writes +sub defer { + my $self = shift; + $self->_stop_autodeferring; + @{$self->{ad_history}} = (); + $self->{defer} = 1; +} + +# Flush deferred writes +# +# This could be better optimized to write the file in one pass, instead +# of one pass per block of records. But that will require modifications +# to _twrite, so I should have a good _twrite test suite first. +sub flush { + my $self = shift; + + $self->_flush; + $self->{defer} = 0; +} + +sub _old_flush { + my $self = shift; + my @writable = sort {$a<=>$b} (keys %{$self->{deferred}}); + + while (@writable) { + # gather all consecutive records from the front of @writable + my $first_rec = shift @writable; + my $last_rec = $first_rec+1; + ++$last_rec, shift @writable while @writable && $last_rec == $writable[0]; + --$last_rec; + $self->_fill_offsets_to($last_rec); + $self->_extend_file_to($last_rec); + $self->_splice($first_rec, $last_rec-$first_rec+1, + @{$self->{deferred}}{$first_rec .. $last_rec}); + } + + $self->_discard; # clear out defered-write-cache +} + +sub _flush { + my $self = shift; + my @writable = sort {$a<=>$b} (keys %{$self->{deferred}}); + my @args; + my @adjust; + + while (@writable) { + # gather all consecutive records from the front of @writable + my $first_rec = shift @writable; + my $last_rec = $first_rec+1; + ++$last_rec, shift @writable while @writable && $last_rec == $writable[0]; + --$last_rec; + my $end = $self->_fill_offsets_to($last_rec+1); + if (not defined $end) { + $self->_extend_file_to($last_rec); + $end = $self->{offsets}[$last_rec]; + } + my ($start) = $self->{offsets}[$first_rec]; + push @args, + join("", @{$self->{deferred}}{$first_rec .. $last_rec}), # data + $start, # position + $end-$start; # length + push @adjust, [$first_rec, # starting at this position... + $last_rec-$first_rec+1, # this many records... + # are replaced with these... + @{$self->{deferred}}{$first_rec .. $last_rec}, + ]; + } + + $self->_mtwrite(@args); # write multiple record groups + $self->_discard; # clear out defered-write-cache + $self->_oadjust(@adjust); +} + +# Discard deferred writes and disable future deferred writes +sub discard { + my $self = shift; + $self->_discard; + $self->{defer} = 0; +} + +# Discard deferred writes, but retain old deferred writing mode +sub _discard { + my $self = shift; + %{$self->{deferred}} = (); + $self->{deferred_s} = 0; + $self->{deferred_max} = -1; + $self->{cache}->set_limit($self->{memory}); +} + +# Deferred writing is enabled, either explicitly ($self->{defer}) +# or automatically ($self->{autodeferring}) +sub _is_deferring { + my $self = shift; + $self->{defer} || $self->{autodeferring}; +} + +# The largest record number of any deferred record +sub _defer_max { + my $self = shift; + return $self->{deferred_max} if defined $self->{deferred_max}; + my $max = -1; + for my $key (keys %{$self->{deferred}}) { + $max = $key if $key > $max; + } + $self->{deferred_max} = $max; + $max; +} + +################################################################ +# +# Matters related to autodeferment +# + +# Get/set autodefer option +sub autodefer { + my $self = shift; + if (@_) { + my $old = $self->{autodefer}; + $self->{autodefer} = shift; + if ($old) { + $self->_stop_autodeferring; + @{$self->{ad_history}} = (); + } + $old; + } else { + $self->{autodefer}; + } +} + +# The user is trying to store record #$n Record that in the history, +# and then enable (or disable) autodeferment if that seems useful. +# Note that it's OK for $n to be a non-number, as long as the function +# is prepared to deal with that. Nobody else looks at the ad_history. +# +# Now, what does the ad_history mean, and what is this function doing? +# Essentially, the idea is to enable autodeferring when we see that the +# user has made three consecutive STORE calls to three consecutive records. +# ("Three" is actually ->{autodefer_threshhold}.) +# A STORE call for record #$n inserts $n into the autodefer history, +# and if the history contains three consecutive records, we enable +# autodeferment. An ad_history of [X, Y] means that the most recent +# STOREs were for records X, X+1, ..., Y, in that order. +# +# Inserting a nonconsecutive number erases the history and starts over. +# +# Performing a special operation like SPLICE erases the history. +# +# There's one special case: CLEAR means that CLEAR was just called. +# In this case, we prime the history with [-2, -1] so that if the next +# write is for record 0, autodeferring goes on immediately. This is for +# the common special case of "@a = (...)". +# +sub _annotate_ad_history { + my ($self, $n) = @_; + return unless $self->{autodefer}; # feature is disabled + return if $self->{defer}; # already in explicit defer mode + return unless $self->{offsets}[-1] >= $self->{autodefer_filelen_threshhold}; + + local *H = $self->{ad_history}; + if ($n eq 'CLEAR') { + @H = (-2, -1); # prime the history with fake records + $self->_stop_autodeferring; + } elsif ($n =~ /^\d+$/) { + if (@H == 0) { + @H = ($n, $n); + } else { # @H == 2 + if ($H[1] == $n-1) { # another consecutive record + $H[1]++; + if ($H[1] - $H[0] + 1 >= $self->{autodefer_threshhold}) { + $self->{autodeferring} = 1; + } + } else { # nonconsecutive- erase and start over + @H = ($n, $n); + $self->_stop_autodeferring; + } + } + } else { # SPLICE or STORESIZE or some such + @H = (); + $self->_stop_autodeferring; + } +} + +# If autodeferring was enabled, cut it out and discard the history +sub _stop_autodeferring { + my $self = shift; + if ($self->{autodeferring}) { + $self->_flush; + } + $self->{autodeferring} = 0; +} + +################################################################ + + +# This is NOT a method. It is here for two reasons: +# 1. To factor a fairly complicated block out of the constructor +# 2. To provide access for the test suite, which need to be sure +# files are being written properly. +sub _default_recsep { + my $recsep = $/; + if ($^O eq 'MSWin32') { # Dos too? + # Windows users expect files to be terminated with \r\n + # But $/ is set to \n instead + # Note that this also transforms \n\n into \r\n\r\n. + # That is a feature. + $recsep =~ s/\n/\r\n/g; + } + $recsep; +} + +# Utility function for _check_integrity +sub _ci_warn { + my $msg = shift; + $msg =~ s/\n/\\n/g; + $msg =~ s/\r/\\r/g; + print "# $msg\n"; +} + +# Given a file, make sure the cache is consistent with the +# file contents and the internal data structures are consistent with +# each other. Returns true if everything checks out, false if not +# +# The $file argument is no longer used. It is retained for compatibility +# with the existing test suite. +sub _check_integrity { + my ($self, $file, $warn) = @_; + my $rsl = $self->{recseplen}; + my $rs = $self->{recsep}; + my $good = 1; + local *_; # local $_ does not work here + local $DIAGNOSTIC = 1; + + if (not defined $rs) { + _ci_warn("recsep is undef!"); + $good = 0; + } elsif ($rs eq "") { + _ci_warn("recsep is empty!"); + $good = 0; + } elsif ($rsl != length $rs) { + my $ln = length $rs; + _ci_warn("recsep <$rs> has length $ln, should be $rsl"); + $good = 0; + } + + if (not defined $self->{offsets}[0]) { + _ci_warn("offset 0 is missing!"); + $good = 0; + + } elsif ($self->{offsets}[0] != 0) { + _ci_warn("rec 0: offset <$self->{offsets}[0]> s/b 0!"); + $good = 0; + } + + my $cached = 0; + { + local *F = $self->{fh}; + seek F, 0, SEEK_SET; + local $. = 0; + local $/ = $rs; + + while (<F>) { + my $n = $. - 1; + my $cached = $self->{cache}->_produce($n); + my $offset = $self->{offsets}[$.]; + my $ao = tell F; + if (defined $offset && $offset != $ao) { + _ci_warn("rec $n: offset <$offset> actual <$ao>"); + $good = 0; + } + if (defined $cached && $_ ne $cached && ! $self->{deferred}{$n}) { + $good = 0; + _ci_warn("rec $n: cached <$cached> actual <$_>"); + } + if (defined $cached && substr($cached, -$rsl) ne $rs) { + $good = 0; + _ci_warn("rec $n in the cache is missing the record separator"); + } + if (! defined $offset && $self->{eof}) { + $good = 0; + _ci_warn("The offset table was marked complete, but it is missing element $."); + } + } + if (@{$self->{offsets}} > $.+1) { + $good = 0; + my $n = @{$self->{offsets}}; + _ci_warn("The offset table has $n items, but the file has only $."); + } + + my $deferring = $self->_is_deferring; + for my $n ($self->{cache}->ckeys) { + my $r = $self->{cache}->_produce($n); + $cached += length($r); + next if $n+1 <= $.; # checked this already + _ci_warn("spurious caching of record $n"); + $good = 0; + } + my $b = $self->{cache}->bytes; + if ($cached != $b) { + _ci_warn("cache size is $b, should be $cached"); + $good = 0; + } + } + + # That cache has its own set of tests + $good = 0 unless $self->{cache}->_check_integrity; + + # Now let's check the deferbuffer + # Unless deferred writing is enabled, it should be empty + if (! $self->_is_deferring && %{$self->{deferred}}) { + _ci_warn("deferred writing disabled, but deferbuffer nonempty"); + $good = 0; + } + + # Any record in the deferbuffer should *not* be present in the readcache + my $deferred_s = 0; + while (my ($n, $r) = each %{$self->{deferred}}) { + $deferred_s += length($r); + if (defined $self->{cache}->_produce($n)) { + _ci_warn("record $n is in the deferbuffer *and* the readcache"); + $good = 0; + } + if (substr($r, -$rsl) ne $rs) { + _ci_warn("rec $n in the deferbuffer is missing the record separator"); + $good = 0; + } + } + + # Total size of deferbuffer should match internal total + if ($deferred_s != $self->{deferred_s}) { + _ci_warn("buffer size is $self->{deferred_s}, should be $deferred_s"); + $good = 0; + } + + # Total size of deferbuffer should not exceed the specified limit + if ($deferred_s > $self->{dw_size}) { + _ci_warn("buffer size is $self->{deferred_s} which exceeds the limit of $self->{dw_size}"); + $good = 0; + } + + # Total size of cached data should not exceed the specified limit + if ($deferred_s + $cached > $self->{memory}) { + my $total = $deferred_s + $cached; + _ci_warn("total stored data size is $total which exceeds the limit of $self->{memory}"); + $good = 0; + } + + # Stuff related to autodeferment + if (!$self->{autodefer} && @{$self->{ad_history}}) { + _ci_warn("autodefer is disabled, but ad_history is nonempty"); + $good = 0; + } + if ($self->{autodeferring} && $self->{defer}) { + _ci_warn("both autodeferring and explicit deferring are active"); + $good = 0; + } + if (@{$self->{ad_history}} == 0) { + # That's OK, no additional tests required + } elsif (@{$self->{ad_history}} == 2) { + my @non_number = grep !/^-?\d+$/, @{$self->{ad_history}}; + if (@non_number) { + my $msg; + { local $" = ')('; + $msg = "ad_history contains non-numbers (@{$self->{ad_history}})"; + } + _ci_warn($msg); + $good = 0; + } elsif ($self->{ad_history}[1] < $self->{ad_history}[0]) { + _ci_warn("ad_history has nonsensical values @{$self->{ad_history}}"); + $good = 0; + } + } else { + _ci_warn("ad_history has bad length <@{$self->{ad_history}}>"); + $good = 0; + } + + $good; +} + +################################################################ +# +# Tie::File::Cache +# +# Read cache + +package Tie::File::Cache; +$Tie::File::Cache::VERSION = $Tie::File::VERSION; +use Carp ':DEFAULT', 'confess'; + +sub HEAP () { 0 } +sub HASH () { 1 } +sub MAX () { 2 } +sub BYTES() { 3 } +#sub STAT () { 4 } # Array with request statistics for each record +#sub MISS () { 5 } # Total number of cache misses +#sub REQ () { 6 } # Total number of cache requests +use strict 'vars'; + +sub new { + my ($pack, $max) = @_; + local *_; + croak "missing argument to ->new" unless defined $max; + my $self = []; + bless $self => $pack; + @$self = (Tie::File::Heap->new($self), {}, $max, 0); + $self; +} + +sub adj_limit { + my ($self, $n) = @_; + $self->[MAX] += $n; +} + +sub set_limit { + my ($self, $n) = @_; + $self->[MAX] = $n; +} + +# For internal use only +# Will be called by the heap structure to notify us that a certain +# piece of data has moved from one heap element to another. +# $k is the hash key of the item +# $n is the new index into the heap at which it is stored +# If $n is undefined, the item has been removed from the heap. +sub _heap_move { + my ($self, $k, $n) = @_; + if (defined $n) { + $self->[HASH]{$k} = $n; + } else { + delete $self->[HASH]{$k}; + } +} + +sub insert { + my ($self, $key, $val) = @_; + local *_; + croak "missing argument to ->insert" unless defined $key; + unless (defined $self->[MAX]) { + confess "undefined max" ; + } + confess "undefined val" unless defined $val; + return if length($val) > $self->[MAX]; + +# if ($self->[STAT]) { +# $self->[STAT][$key] = 1; +# return; +# } + + my $oldnode = $self->[HASH]{$key}; + if (defined $oldnode) { + my $oldval = $self->[HEAP]->set_val($oldnode, $val); + $self->[BYTES] -= length($oldval); + } else { + $self->[HEAP]->insert($key, $val); + } + $self->[BYTES] += length($val); + $self->flush if $self->[BYTES] > $self->[MAX]; +} + +sub expire { + my $self = shift; + my $old_data = $self->[HEAP]->popheap; + return unless defined $old_data; + $self->[BYTES] -= length $old_data; + $old_data; +} + +sub remove { + my ($self, @keys) = @_; + my @result; + +# if ($self->[STAT]) { +# for my $key (@keys) { +# $self->[STAT][$key] = 0; +# } +# return; +# } + + for my $key (@keys) { + next unless exists $self->[HASH]{$key}; + my $old_data = $self->[HEAP]->remove($self->[HASH]{$key}); + $self->[BYTES] -= length $old_data; + push @result, $old_data; + } + @result; +} + +sub lookup { + my ($self, $key) = @_; + local *_; + croak "missing argument to ->lookup" unless defined $key; + +# if ($self->[STAT]) { +# $self->[MISS]++ if $self->[STAT][$key]++ == 0; +# $self->[REQ]++; +# my $hit_rate = 1 - $self->[MISS] / $self->[REQ]; +# # Do some testing to determine this threshhold +# $#$self = STAT - 1 if $hit_rate > 0.20; +# } + + if (exists $self->[HASH]{$key}) { + $self->[HEAP]->lookup($self->[HASH]{$key}); + } else { + return; + } +} + +# For internal use only +sub _produce { + my ($self, $key) = @_; + my $loc = $self->[HASH]{$key}; + return unless defined $loc; + $self->[HEAP][$loc][2]; +} + +# For internal use only +sub _promote { + my ($self, $key) = @_; + $self->[HEAP]->promote($self->[HASH]{$key}); +} + +sub empty { + my ($self) = @_; + %{$self->[HASH]} = (); + $self->[BYTES] = 0; + $self->[HEAP]->empty; +# @{$self->[STAT]} = (); +# $self->[MISS] = 0; +# $self->[REQ] = 0; +} + +sub is_empty { + my ($self) = @_; + keys %{$self->[HASH]} == 0; +} + +sub update { + my ($self, $key, $val) = @_; + local *_; + croak "missing argument to ->update" unless defined $key; + if (length($val) > $self->[MAX]) { + my ($oldval) = $self->remove($key); + $self->[BYTES] -= length($oldval) if defined $oldval; + } elsif (exists $self->[HASH]{$key}) { + my $oldval = $self->[HEAP]->set_val($self->[HASH]{$key}, $val); + $self->[BYTES] += length($val); + $self->[BYTES] -= length($oldval) if defined $oldval; + } else { + $self->[HEAP]->insert($key, $val); + $self->[BYTES] += length($val); + } + $self->flush; +} + +sub rekey { + my ($self, $okeys, $nkeys) = @_; + local *_; + my %map; + @map{@$okeys} = @$nkeys; + croak "missing argument to ->rekey" unless defined $nkeys; + croak "length mismatch in ->rekey arguments" unless @$nkeys == @$okeys; + my %adjusted; # map new keys to heap indices + # You should be able to cut this to one loop TODO XXX + for (0 .. $#$okeys) { + $adjusted{$nkeys->[$_]} = delete $self->[HASH]{$okeys->[$_]}; + } + while (my ($nk, $ix) = each %adjusted) { + # @{$self->[HASH]}{keys %adjusted} = values %adjusted; + $self->[HEAP]->rekey($ix, $nk); + $self->[HASH]{$nk} = $ix; + } +} + +sub ckeys { + my $self = shift; + my @a = keys %{$self->[HASH]}; + @a; +} + +# Return total amount of cached data +sub bytes { + my $self = shift; + $self->[BYTES]; +} + +# Expire oldest item from cache until cache size is smaller than $max +sub reduce_size_to { + my ($self, $max) = @_; + until ($self->[BYTES] <= $max) { + # Note that Tie::File::Cache::expire has been inlined here + my $old_data = $self->[HEAP]->popheap; + return unless defined $old_data; + $self->[BYTES] -= length $old_data; + } +} + +# Why not just $self->reduce_size_to($self->[MAX])? +# Try this when things stabilize TODO XXX +# If the cache is too full, expire the oldest records +sub flush { + my $self = shift; + $self->reduce_size_to($self->[MAX]) if $self->[BYTES] > $self->[MAX]; +} + +# For internal use only +sub _produce_lru { + my $self = shift; + $self->[HEAP]->expire_order; +} + +BEGIN { *_ci_warn = \&Tie::File::_ci_warn } + +sub _check_integrity { # For CACHE + my $self = shift; + my $good = 1; + + # Test HEAP + $self->[HEAP]->_check_integrity or $good = 0; + + # Test HASH + my $bytes = 0; + for my $k (keys %{$self->[HASH]}) { + if ($k ne '0' && $k !~ /^[1-9][0-9]*$/) { + $good = 0; + _ci_warn "Cache hash key <$k> is non-numeric"; + } + + my $h = $self->[HASH]{$k}; + if (! defined $h) { + $good = 0; + _ci_warn "Heap index number for key $k is undefined"; + } elsif ($h == 0) { + $good = 0; + _ci_warn "Heap index number for key $k is zero"; + } else { + my $j = $self->[HEAP][$h]; + if (! defined $j) { + $good = 0; + _ci_warn "Heap contents key $k (=> $h) are undefined"; + } else { + $bytes += length($j->[2]); + if ($k ne $j->[1]) { + $good = 0; + _ci_warn "Heap contents key $k (=> $h) is $j->[1], should be $k"; + } + } + } + } + + # Test BYTES + if ($bytes != $self->[BYTES]) { + $good = 0; + _ci_warn "Total data in cache is $bytes, expected $self->[BYTES]"; + } + + # Test MAX + if ($bytes > $self->[MAX]) { + $good = 0; + _ci_warn "Total data in cache is $bytes, exceeds maximum $self->[MAX]"; + } + + return $good; +} + +sub delink { + my $self = shift; + $self->[HEAP] = undef; # Bye bye heap +} + +################################################################ +# +# Tie::File::Heap +# +# Heap data structure for use by cache LRU routines + +package Tie::File::Heap; +use Carp ':DEFAULT', 'confess'; +$Tie::File::Heap::VERSION = $Tie::File::Cache::VERSION; +sub SEQ () { 0 }; +sub KEY () { 1 }; +sub DAT () { 2 }; + +sub new { + my ($pack, $cache) = @_; + die "$pack: Parent cache object $cache does not support _heap_move method" + unless eval { $cache->can('_heap_move') }; + my $self = [[0,$cache,0]]; + bless $self => $pack; +} + +# Allocate a new sequence number, larger than all previously allocated numbers +sub _nseq { + my $self = shift; + $self->[0][0]++; +} + +sub _cache { + my $self = shift; + $self->[0][1]; +} + +sub _nelts { + my $self = shift; + $self->[0][2]; +} + +sub _nelts_inc { + my $self = shift; + ++$self->[0][2]; +} + +sub _nelts_dec { + my $self = shift; + --$self->[0][2]; +} + +sub is_empty { + my $self = shift; + $self->_nelts == 0; +} + +sub empty { + my $self = shift; + $#$self = 0; + $self->[0][2] = 0; + $self->[0][0] = 0; # might as well reset the sequence numbers +} + +# notify the parent cache object that we moved something +sub _heap_move { + my $self = shift; + $self->_cache->_heap_move(@_); +} + +# Insert a piece of data into the heap with the indicated sequence number. +# The item with the smallest sequence number is always at the top. +# If no sequence number is specified, allocate a new one and insert the +# item at the bottom. +sub insert { + my ($self, $key, $data, $seq) = @_; + $seq = $self->_nseq unless defined $seq; + $self->_insert_new([$seq, $key, $data]); +} + +# Insert a new, fresh item at the bottom of the heap +sub _insert_new { + my ($self, $item) = @_; + my $i = @$self; + $i = int($i/2) until defined $self->[$i/2]; + $self->[$i] = $item; + $self->[0][1]->_heap_move($self->[$i][KEY], $i); + $self->_nelts_inc; +} + +# Insert [$data, $seq] pair at or below item $i in the heap. +# If $i is omitted, default to 1 (the top element.) +sub _insert { + my ($self, $item, $i) = @_; +# $self->_check_loc($i) if defined $i; + $i = 1 unless defined $i; + until (! defined $self->[$i]) { + if ($self->[$i][SEQ] > $item->[SEQ]) { # inserted item is older + ($self->[$i], $item) = ($item, $self->[$i]); + $self->[0][1]->_heap_move($self->[$i][KEY], $i); + } + # If either is undefined, go that way. Otherwise, choose at random + my $dir; + $dir = 0 if !defined $self->[2*$i]; + $dir = 1 if !defined $self->[2*$i+1]; + $dir = int(rand(2)) unless defined $dir; + $i = 2*$i + $dir; + } + $self->[$i] = $item; + $self->[0][1]->_heap_move($self->[$i][KEY], $i); + $self->_nelts_inc; +} + +# Remove the item at node $i from the heap, moving child items upwards. +# The item with the smallest sequence number is always at the top. +# Moving items upwards maintains this condition. +# Return the removed item. Return undef if there was no item at node $i. +sub remove { + my ($self, $i) = @_; + $i = 1 unless defined $i; + my $top = $self->[$i]; + return unless defined $top; + while (1) { + my $ii; + my ($L, $R) = (2*$i, 2*$i+1); + + # If either is undefined, go the other way. + # Otherwise, go towards the smallest. + last unless defined $self->[$L] || defined $self->[$R]; + $ii = $R if not defined $self->[$L]; + $ii = $L if not defined $self->[$R]; + unless (defined $ii) { + $ii = $self->[$L][SEQ] < $self->[$R][SEQ] ? $L : $R; + } + + $self->[$i] = $self->[$ii]; # Promote child to fill vacated spot + $self->[0][1]->_heap_move($self->[$i][KEY], $i); + $i = $ii; # Fill new vacated spot + } + $self->[0][1]->_heap_move($top->[KEY], undef); + undef $self->[$i]; + $self->_nelts_dec; + return $top->[DAT]; +} + +sub popheap { + my $self = shift; + $self->remove(1); +} + +# set the sequence number of the indicated item to a higher number +# than any other item in the heap, and bubble the item down to the +# bottom. +sub promote { + my ($self, $n) = @_; +# $self->_check_loc($n); + $self->[$n][SEQ] = $self->_nseq; + my $i = $n; + while (1) { + my ($L, $R) = (2*$i, 2*$i+1); + my $dir; + last unless defined $self->[$L] || defined $self->[$R]; + $dir = $R unless defined $self->[$L]; + $dir = $L unless defined $self->[$R]; + unless (defined $dir) { + $dir = $self->[$L][SEQ] < $self->[$R][SEQ] ? $L : $R; + } + @{$self}[$i, $dir] = @{$self}[$dir, $i]; + for ($i, $dir) { + $self->[0][1]->_heap_move($self->[$_][KEY], $_) if defined $self->[$_]; + } + $i = $dir; + } +} + +# Return item $n from the heap, promoting its LRU status +sub lookup { + my ($self, $n) = @_; +# $self->_check_loc($n); + my $val = $self->[$n]; + $self->promote($n); + $val->[DAT]; +} + + +# Assign a new value for node $n, promoting it to the bottom of the heap +sub set_val { + my ($self, $n, $val) = @_; +# $self->_check_loc($n); + my $oval = $self->[$n][DAT]; + $self->[$n][DAT] = $val; + $self->promote($n); + return $oval; +} + +# The hask key has changed for an item; +# alter the heap's record of the hash key +sub rekey { + my ($self, $n, $new_key) = @_; +# $self->_check_loc($n); + $self->[$n][KEY] = $new_key; +} + +sub _check_loc { + my ($self, $n) = @_; + unless (1 || defined $self->[$n]) { + confess "_check_loc($n) failed"; + } +} + +BEGIN { *_ci_warn = \&Tie::File::_ci_warn } + +sub _check_integrity { + my $self = shift; + my $good = 1; + my %seq; + + unless (eval {$self->[0][1]->isa("Tie::File::Cache")}) { + _ci_warn "Element 0 of heap corrupt"; + $good = 0; + } + $good = 0 unless $self->_satisfies_heap_condition(1); + for my $i (2 .. $#{$self}) { + my $p = int($i/2); # index of parent node + if (defined $self->[$i] && ! defined $self->[$p]) { + _ci_warn "Element $i of heap defined, but parent $p isn't"; + $good = 0; + } + + if (defined $self->[$i]) { + if ($seq{$self->[$i][SEQ]}) { + my $seq = $self->[$i][SEQ]; + _ci_warn "Nodes $i and $seq{$seq} both have SEQ=$seq"; + $good = 0; + } else { + $seq{$self->[$i][SEQ]} = $i; + } + } + } + + return $good; +} + +sub _satisfies_heap_condition { + my $self = shift; + my $n = shift || 1; + my $good = 1; + for (0, 1) { + my $c = $n*2 + $_; + next unless defined $self->[$c]; + if ($self->[$n][SEQ] >= $self->[$c]) { + _ci_warn "Node $n of heap does not predate node $c"; + $good = 0 ; + } + $good = 0 unless $self->_satisfies_heap_condition($c); + } + return $good; +} + +# Return a list of all the values, sorted by expiration order +sub expire_order { + my $self = shift; + my @nodes = sort {$a->[SEQ] <=> $b->[SEQ]} $self->_nodes; + map { $_->[KEY] } @nodes; +} + +sub _nodes { + my $self = shift; + my $i = shift || 1; + return unless defined $self->[$i]; + ($self->[$i], $self->_nodes($i*2), $self->_nodes($i*2+1)); +} + +"Cogito, ergo sum."; # don't forget to return a true value from the file + +__END__ + +=head1 NAME + +Tie::File - Access the lines of a disk file via a Perl array + +=head1 SYNOPSIS + + # This file documents Tie::File version 0.97 + use Tie::File; + + tie @array, 'Tie::File', filename or die ...; + + $array[13] = 'blah'; # line 13 of the file is now 'blah' + print $array[42]; # display line 42 of the file + + $n_recs = @array; # how many records are in the file? + $#array -= 2; # chop two records off the end + + + for (@array) { + s/PERL/Perl/g; # Replace PERL with Perl everywhere in the file + } + + # These are just like regular push, pop, unshift, shift, and splice + # Except that they modify the file in the way you would expect + + push @array, new recs...; + my $r1 = pop @array; + unshift @array, new recs...; + my $r2 = shift @array; + @old_recs = splice @array, 3, 7, new recs...; + + untie @array; # all finished + + +=head1 DESCRIPTION + +C<Tie::File> represents a regular text file as a Perl array. Each +element in the array corresponds to a record in the file. The first +line of the file is element 0 of the array; the second line is element +1, and so on. + +The file is I<not> loaded into memory, so this will work even for +gigantic files. + +Changes to the array are reflected in the file immediately. + +Lazy people and beginners may now stop reading the manual. + +=head2 C<recsep> + +What is a 'record'? By default, the meaning is the same as for the +C<E<lt>...E<gt>> operator: It's a string terminated by C<$/>, which is +probably C<"\n">. (Minor exception: on DOS and Win32 systems, a +'record' is a string terminated by C<"\r\n">.) You may change the +definition of "record" by supplying the C<recsep> option in the C<tie> +call: + + tie @array, 'Tie::File', $file, recsep => 'es'; + +This says that records are delimited by the string C<es>. If the file +contained the following data: + + Curse these pesky flies!\n + +then the C<@array> would appear to have four elements: + + "Curse th" + "e p" + "ky fli" + "!\n" + +An undefined value is not permitted as a record separator. Perl's +special "paragraph mode" semantics (E<agrave> la C<$/ = "">) are not +emulated. + +Records read from the tied array do not have the record separator +string on the end; this is to allow + + $array[17] .= "extra"; + +to work as expected. + +(See L<"autochomp">, below.) Records stored into the array will have +the record separator string appended before they are written to the +file, if they don't have one already. For example, if the record +separator string is C<"\n">, then the following two lines do exactly +the same thing: + + $array[17] = "Cherry pie"; + $array[17] = "Cherry pie\n"; + +The result is that the contents of line 17 of the file will be +replaced with "Cherry pie"; a newline character will separate line 17 +from line 18. This means that this code will do nothing: + + chomp $array[17]; + +Because the C<chomp>ed value will have the separator reattached when +it is written back to the file. There is no way to create a file +whose trailing record separator string is missing. + +Inserting records that I<contain> the record separator string is not +supported by this module. It will probably produce a reasonable +result, but what this result will be may change in a future version. +Use 'splice' to insert records or to replace one record with several. + +=head2 C<autochomp> + +Normally, array elements have the record separator removed, so that if +the file contains the text + + Gold + Frankincense + Myrrh + +the tied array will appear to contain C<("Gold", "Frankincense", +"Myrrh")>. If you set C<autochomp> to a false value, the record +separator will not be removed. If the file above was tied with + + tie @gifts, "Tie::File", $gifts, autochomp => 0; + +then the array C<@gifts> would appear to contain C<("Gold\n", +"Frankincense\n", "Myrrh\n")>, or (on Win32 systems) C<("Gold\r\n", +"Frankincense\r\n", "Myrrh\r\n")>. + +=head2 C<mode> + +Normally, the specified file will be opened for read and write access, +and will be created if it does not exist. (That is, the flags +C<O_RDWR | O_CREAT> are supplied in the C<open> call.) If you want to +change this, you may supply alternative flags in the C<mode> option. +See L<Fcntl> for a listing of available flags. +For example: + + # open the file if it exists, but fail if it does not exist + use Fcntl 'O_RDWR'; + tie @array, 'Tie::File', $file, mode => O_RDWR; + + # create the file if it does not exist + use Fcntl 'O_RDWR', 'O_CREAT'; + tie @array, 'Tie::File', $file, mode => O_RDWR | O_CREAT; + + # open an existing file in read-only mode + use Fcntl 'O_RDONLY'; + tie @array, 'Tie::File', $file, mode => O_RDONLY; + +Opening the data file in write-only or append mode is not supported. + +=head2 C<memory> + +This is an upper limit on the amount of memory that C<Tie::File> will +consume at any time while managing the file. This is used for two +things: managing the I<read cache> and managing the I<deferred write +buffer>. + +Records read in from the file are cached, to avoid having to re-read +them repeatedly. If you read the same record twice, the first time it +will be stored in memory, and the second time it will be fetched from +the I<read cache>. The amount of data in the read cache will not +exceed the value you specified for C<memory>. If C<Tie::File> wants +to cache a new record, but the read cache is full, it will make room +by expiring the least-recently visited records from the read cache. + +The default memory limit is 2Mib. You can adjust the maximum read +cache size by supplying the C<memory> option. The argument is the +desired cache size, in bytes. + + # I have a lot of memory, so use a large cache to speed up access + tie @array, 'Tie::File', $file, memory => 20_000_000; + +Setting the memory limit to 0 will inhibit caching; records will be +fetched from disk every time you examine them. + +The C<memory> value is not an absolute or exact limit on the memory +used. C<Tie::File> objects contains some structures besides the read +cache and the deferred write buffer, whose sizes are not charged +against C<memory>. + +The cache itself consumes about 310 bytes per cached record, so if +your file has many short records, you may want to decrease the cache +memory limit, or else the cache overhead may exceed the size of the +cached data. + + +=head2 C<dw_size> + +(This is an advanced feature. Skip this section on first reading.) + +If you use deferred writing (See L<"Deferred Writing">, below) then +data you write into the array will not be written directly to the +file; instead, it will be saved in the I<deferred write buffer> to be +written out later. Data in the deferred write buffer is also charged +against the memory limit you set with the C<memory> option. + +You may set the C<dw_size> option to limit the amount of data that can +be saved in the deferred write buffer. This limit may not exceed the +total memory limit. For example, if you set C<dw_size> to 1000 and +C<memory> to 2500, that means that no more than 1000 bytes of deferred +writes will be saved up. The space available for the read cache will +vary, but it will always be at least 1500 bytes (if the deferred write +buffer is full) and it could grow as large as 2500 bytes (if the +deferred write buffer is empty.) + +If you don't specify a C<dw_size>, it defaults to the entire memory +limit. + +=head2 Option Format + +C<-mode> is a synonym for C<mode>. C<-recsep> is a synonym for +C<recsep>. C<-memory> is a synonym for C<memory>. You get the +idea. + +=head1 Public Methods + +The C<tie> call returns an object, say C<$o>. You may call + + $rec = $o->FETCH($n); + $o->STORE($n, $rec); + +to fetch or store the record at line C<$n>, respectively; similarly +the other tied array methods. (See L<perltie> for details.) You may +also call the following methods on this object: + +=head2 C<flock> + + $o->flock(MODE) + +will lock the tied file. C<MODE> has the same meaning as the second +argument to the Perl built-in C<flock> function; for example +C<LOCK_SH> or C<LOCK_EX | LOCK_NB>. (These constants are provided by +the C<use Fcntl ':flock'> declaration.) + +C<MODE> is optional; the default is C<LOCK_EX>. + +C<Tie::File> maintains an internal table of the byte offset of each +record it has seen in the file. + +When you use C<flock> to lock the file, C<Tie::File> assumes that the +read cache is no longer trustworthy, because another process might +have modified the file since the last time it was read. Therefore, a +successful call to C<flock> discards the contents of the read cache +and the internal record offset table. + +C<Tie::File> promises that the following sequence of operations will +be safe: + + my $o = tie @array, "Tie::File", $filename; + $o->flock; + +In particular, C<Tie::File> will I<not> read or write the file during +the C<tie> call. (Exception: Using C<mode =E<gt> O_TRUNC> will, of +course, erase the file during the C<tie> call. If you want to do this +safely, then open the file without C<O_TRUNC>, lock the file, and use +C<@array = ()>.) + +The best way to unlock a file is to discard the object and untie the +array. It is probably unsafe to unlock the file without also untying +it, because if you do, changes may remain unwritten inside the object. +That is why there is no shortcut for unlocking. If you really want to +unlock the file prematurely, you know what to do; if you don't know +what to do, then don't do it. + +All the usual warnings about file locking apply here. In particular, +note that file locking in Perl is B<advisory>, which means that +holding a lock will not prevent anyone else from reading, writing, or +erasing the file; it only prevents them from getting another lock at +the same time. Locks are analogous to green traffic lights: If you +have a green light, that does not prevent the idiot coming the other +way from plowing into you sideways; it merely guarantees to you that +the idiot does not also have a green light at the same time. + +=head2 C<autochomp> + + my $old_value = $o->autochomp(0); # disable autochomp option + my $old_value = $o->autochomp(1); # enable autochomp option + + my $ac = $o->autochomp(); # recover current value + +See L<"autochomp">, above. + +=head2 C<defer>, C<flush>, C<discard>, and C<autodefer> + +See L<"Deferred Writing">, below. + +=head2 C<offset> + + $off = $o->offset($n); + +This method returns the byte offset of the start of the C<$n>th record +in the file. If there is no such record, it returns an undefined +value. + +=head1 Tying to an already-opened filehandle + +If C<$fh> is a filehandle, such as is returned by C<IO::File> or one +of the other C<IO> modules, you may use: + + tie @array, 'Tie::File', $fh, ...; + +Similarly if you opened that handle C<FH> with regular C<open> or +C<sysopen>, you may use: + + tie @array, 'Tie::File', \*FH, ...; + +Handles that were opened write-only won't work. Handles that were +opened read-only will work as long as you don't try to modify the +array. Handles must be attached to seekable sources of data---that +means no pipes or sockets. If C<Tie::File> can detect that you +supplied a non-seekable handle, the C<tie> call will throw an +exception. (On Unix systems, it can detect this.) + +Note that Tie::File will only close any filehandles that it opened +internally. If you passed it a filehandle as above, you "own" the +filehandle, and are responsible for closing it after you have untied +the @array. + +=head1 Deferred Writing + +(This is an advanced feature. Skip this section on first reading.) + +Normally, modifying a C<Tie::File> array writes to the underlying file +immediately. Every assignment like C<$a[3] = ...> rewrites as much of +the file as is necessary; typically, everything from line 3 through +the end will need to be rewritten. This is the simplest and most +transparent behavior. Performance even for large files is reasonably +good. + +However, under some circumstances, this behavior may be excessively +slow. For example, suppose you have a million-record file, and you +want to do: + + for (@FILE) { + $_ = "> $_"; + } + +The first time through the loop, you will rewrite the entire file, +from line 0 through the end. The second time through the loop, you +will rewrite the entire file from line 1 through the end. The third +time through the loop, you will rewrite the entire file from line 2 to +the end. And so on. + +If the performance in such cases is unacceptable, you may defer the +actual writing, and then have it done all at once. The following loop +will perform much better for large files: + + (tied @a)->defer; + for (@a) { + $_ = "> $_"; + } + (tied @a)->flush; + +If C<Tie::File>'s memory limit is large enough, all the writing will +done in memory. Then, when you call C<-E<gt>flush>, the entire file +will be rewritten in a single pass. + +(Actually, the preceding discussion is something of a fib. You don't +need to enable deferred writing to get good performance for this +common case, because C<Tie::File> will do it for you automatically +unless you specifically tell it not to. See L<"autodeferring">, +below.) + +Calling C<-E<gt>flush> returns the array to immediate-write mode. If +you wish to discard the deferred writes, you may call C<-E<gt>discard> +instead of C<-E<gt>flush>. Note that in some cases, some of the data +will have been written already, and it will be too late for +C<-E<gt>discard> to discard all the changes. Support for +C<-E<gt>discard> may be withdrawn in a future version of C<Tie::File>. + +Deferred writes are cached in memory up to the limit specified by the +C<dw_size> option (see above). If the deferred-write buffer is full +and you try to write still more deferred data, the buffer will be +flushed. All buffered data will be written immediately, the buffer +will be emptied, and the now-empty space will be used for future +deferred writes. + +If the deferred-write buffer isn't yet full, but the total size of the +buffer and the read cache would exceed the C<memory> limit, the oldest +records will be expired from the read cache until the total size is +under the limit. + +C<push>, C<pop>, C<shift>, C<unshift>, and C<splice> cannot be +deferred. When you perform one of these operations, any deferred data +is written to the file and the operation is performed immediately. +This may change in a future version. + +If you resize the array with deferred writing enabled, the file will +be resized immediately, but deferred records will not be written. +This has a surprising consequence: C<@a = (...)> erases the file +immediately, but the writing of the actual data is deferred. This +might be a bug. If it is a bug, it will be fixed in a future version. + +=head2 Autodeferring + +C<Tie::File> tries to guess when deferred writing might be helpful, +and to turn it on and off automatically. + + for (@a) { + $_ = "> $_"; + } + +In this example, only the first two assignments will be done +immediately; after this, all the changes to the file will be deferred +up to the user-specified memory limit. + +You should usually be able to ignore this and just use the module +without thinking about deferring. However, special applications may +require fine control over which writes are deferred, or may require +that all writes be immediate. To disable the autodeferment feature, +use + + (tied @o)->autodefer(0); + +or + + tie @array, 'Tie::File', $file, autodefer => 0; + + +Similarly, C<-E<gt>autodefer(1)> re-enables autodeferment, and +C<-E<gt>autodefer()> recovers the current value of the autodefer setting. + + +=head1 CONCURRENT ACCESS TO FILES + +Caching and deferred writing are inappropriate if you want the same +file to be accessed simultaneously from more than one process. Other +optimizations performed internally by this module are also +incompatible with concurrent access. A future version of this module will +support a C<concurrent =E<gt> 1> option that enables safe concurrent access. + +Previous versions of this documentation suggested using C<memory +=E<gt> 0> for safe concurrent access. This was mistaken. Tie::File +will not support safe concurrent access before version 0.98. + +=head1 CAVEATS + +(That's Latin for 'warnings'.) + +=over 4 + +=item * + +Reasonable effort was made to make this module efficient. Nevertheless, +changing the size of a record in the middle of a large file will +always be fairly slow, because everything after the new record must be +moved. + +=item * + +The behavior of tied arrays is not precisely the same as for regular +arrays. For example: + + # This DOES print "How unusual!" + undef $a[10]; print "How unusual!\n" if defined $a[10]; + +C<undef>-ing a C<Tie::File> array element just blanks out the +corresponding record in the file. When you read it back again, you'll +get the empty string, so the supposedly-C<undef>'ed value will be +defined. Similarly, if you have C<autochomp> disabled, then + + # This DOES print "How unusual!" if 'autochomp' is disabled + undef $a[10]; + print "How unusual!\n" if $a[10]; + +Because when C<autochomp> is disabled, C<$a[10]> will read back as +C<"\n"> (or whatever the record separator string is.) + +There are other minor differences, particularly regarding C<exists> +and C<delete>, but in general, the correspondence is extremely close. + +=item * + +I have supposed that since this module is concerned with file I/O, +almost all normal use of it will be heavily I/O bound. This means +that the time to maintain complicated data structures inside the +module will be dominated by the time to actually perform the I/O. +When there was an opportunity to spend CPU time to avoid doing I/O, I +usually tried to take it. + +=item * + +You might be tempted to think that deferred writing is like +transactions, with C<flush> as C<commit> and C<discard> as +C<rollback>, but it isn't, so don't. + +=item * + +There is a large memory overhead for each record offset and for each +cache entry: about 310 bytes per cached data record, and about 21 bytes per offset table entry. + +The per-record overhead will limit the maximum number of records you +can access per file. Note that I<accessing> the length of the array +via C<$x = scalar @tied_file> accesses B<all> records and stores their +offsets. The same for C<foreach (@tied_file)>, even if you exit the +loop early. + +=back + +=head1 SUBCLASSING + +This version promises absolutely nothing about the internals, which +may change without notice. A future version of the module will have a +well-defined and stable subclassing API. + +=head1 WHAT ABOUT C<DB_File>? + +People sometimes point out that L<DB_File> will do something similar, +and ask why C<Tie::File> module is necessary. + +There are a number of reasons that you might prefer C<Tie::File>. +A list is available at C<http://perl.plover.com/TieFile/why-not-DB_File>. + +=head1 AUTHOR + +Mark Jason Dominus + +To contact the author, send email to: C<mjd-perl-tiefile+@plover.com> + +To receive an announcement whenever a new version of this module is +released, send a blank email message to +C<mjd-perl-tiefile-subscribe@plover.com>. + +The most recent version of this module, including documentation and +any news of importance, will be available at + + http://perl.plover.com/TieFile/ + + +=head1 LICENSE + +C<Tie::File> version 0.97 is copyright (C) 2003 Mark Jason Dominus. + +This library is free software; you may redistribute it and/or modify +it under the same terms as Perl itself. + +These terms are your choice of any of (1) the Perl Artistic Licence, +or (2) version 2 of the GNU General Public License as published by the +Free Software Foundation, or (3) any later version of the GNU General +Public License. + +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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this library program; it should be in the file C<COPYING>. +If not, write to the Free Software Foundation, Inc., 59 Temple Place, +Suite 330, Boston, MA 02111 USA + +For licensing inquiries, contact the author at: + + Mark Jason Dominus + 255 S. Warnock St. + Philadelphia, PA 19107 + +=head1 WARRANTY + +C<Tie::File> version 0.97 comes with ABSOLUTELY NO WARRANTY. +For details, see the license. + +=head1 THANKS + +Gigantic thanks to Jarkko Hietaniemi, for agreeing to put this in the +core when I hadn't written it yet, and for generally being helpful, +supportive, and competent. (Usually the rule is "choose any one.") +Also big thanks to Abhijit Menon-Sen for all of the same things. + +Special thanks to Craig Berry and Peter Prymmer (for VMS portability +help), Randy Kobes (for Win32 portability help), Clinton Pierce and +Autrijus Tang (for heroic eleventh-hour Win32 testing above and beyond +the call of duty), Michael G Schwern (for testing advice), and the +rest of the CPAN testers (for testing generally). + +Special thanks to Tels for suggesting several speed and memory +optimizations. + +Additional thanks to: +Edward Avis / +Mattia Barbon / +Tom Christiansen / +Gerrit Haase / +Gurusamy Sarathy / +Jarkko Hietaniemi (again) / +Nikola Knezevic / +John Kominetz / +Nick Ing-Simmons / +Tassilo von Parseval / +H. Dieter Pearcey / +Slaven Rezic / +Eric Roode / +Peter Scott / +Peter Somu / +Autrijus Tang (again) / +Tels (again) / +Juerd Waalboer + +=head1 TODO + +More tests. (Stuff I didn't think of yet.) + +Paragraph mode? + +Fixed-length mode. Leave-blanks mode. + +Maybe an autolocking mode? + +For many common uses of the module, the read cache is a liability. +For example, a program that inserts a single record, or that scans the +file once, will have a cache hit rate of zero. This suggests a major +optimization: The cache should be initially disabled. Here's a hybrid +approach: Initially, the cache is disabled, but the cache code +maintains statistics about how high the hit rate would be *if* it were +enabled. When it sees the hit rate get high enough, it enables +itself. The STAT comments in this code are the beginning of an +implementation of this. + +Record locking with fcntl()? Then the module might support an undo +log and get real transactions. What a tour de force that would be. + +Keeping track of the highest cached record. This would allow reads-in-a-row +to skip the cache lookup faster (if reading from 1..N with empty cache at +start, the last cached value will be always N-1). + +More tests. + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Tie/Handle.pm b/Master/tlpkg/tlperl.old/lib/Tie/Handle.pm new file mode 100644 index 00000000000..d8747f12af1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tie/Handle.pm @@ -0,0 +1,234 @@ +package Tie::Handle; + +use 5.006_001; +our $VERSION = '4.1'; + +=head1 NAME + +Tie::Handle, Tie::StdHandle - base class definitions for tied handles + +=head1 SYNOPSIS + + package NewHandle; + require Tie::Handle; + + @ISA = qw(Tie::Handle); + + sub READ { ... } # Provide a needed method + sub TIEHANDLE { ... } # Overrides inherited method + + + package main; + + tie *FH, 'NewHandle'; + +=head1 DESCRIPTION + +This module provides some skeletal methods for handle-tying classes. See +L<perltie> for a list of the functions required in tying a handle to a package. +The basic B<Tie::Handle> package provides a C<new> method, as well as methods +C<TIEHANDLE>, C<PRINT>, C<PRINTF> and C<GETC>. + +For developers wishing to write their own tied-handle classes, the methods +are summarized below. The L<perltie> section not only documents these, but +has sample code as well: + +=over 4 + +=item TIEHANDLE classname, LIST + +The method invoked by the command C<tie *glob, classname>. Associates a new +glob instance with the specified class. C<LIST> would represent additional +arguments (along the lines of L<AnyDBM_File> and compatriots) needed to +complete the association. + +=item WRITE this, scalar, length, offset + +Write I<length> bytes of data from I<scalar> starting at I<offset>. + +=item PRINT this, LIST + +Print the values in I<LIST> + +=item PRINTF this, format, LIST + +Print the values in I<LIST> using I<format> + +=item READ this, scalar, length, offset + +Read I<length> bytes of data into I<scalar> starting at I<offset>. + +=item READLINE this + +Read a single line + +=item GETC this + +Get a single character + +=item CLOSE this + +Close the handle + +=item OPEN this, filename + +(Re-)open the handle + +=item BINMODE this + +Specify content is binary + +=item EOF this + +Test for end of file. + +=item TELL this + +Return position in the file. + +=item SEEK this, offset, whence + +Position the file. + +Test for end of file. + +=item DESTROY this + +Free the storage associated with the tied handle referenced by I<this>. +This is rarely needed, as Perl manages its memory quite well. But the +option exists, should a class wish to perform specific actions upon the +destruction of an instance. + +=back + +=head1 MORE INFORMATION + +The L<perltie> section contains an example of tying handles. + +=head1 COMPATIBILITY + +This version of Tie::Handle is neither related to nor compatible with +the Tie::Handle (3.0) module available on CPAN. It was due to an +accident that two modules with the same name appeared. The namespace +clash has been cleared in favor of this module that comes with the +perl core in September 2000 and accordingly the version number has +been bumped up to 4.0. + +=cut + +use Carp; +use warnings::register; + +sub new { + my $pkg = shift; + $pkg->TIEHANDLE(@_); +} + +# "Grandfather" the new, a la Tie::Hash + +sub TIEHANDLE { + my $pkg = shift; + if (defined &{"{$pkg}::new"}) { + warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIEHANDLE is missing"); + $pkg->new(@_); + } + else { + croak "$pkg doesn't define a TIEHANDLE method"; + } +} + +sub PRINT { + my $self = shift; + if($self->can('WRITE') != \&WRITE) { + my $buf = join(defined $, ? $, : "",@_); + $buf .= $\ if defined $\; + $self->WRITE($buf,length($buf),0); + } + else { + croak ref($self)," doesn't define a PRINT method"; + } +} + +sub PRINTF { + my $self = shift; + + if($self->can('WRITE') != \&WRITE) { + my $buf = sprintf(shift,@_); + $self->WRITE($buf,length($buf),0); + } + else { + croak ref($self)," doesn't define a PRINTF method"; + } +} + +sub READLINE { + my $pkg = ref $_[0]; + croak "$pkg doesn't define a READLINE method"; +} + +sub GETC { + my $self = shift; + + if($self->can('READ') != \&READ) { + my $buf; + $self->READ($buf,1); + return $buf; + } + else { + croak ref($self)," doesn't define a GETC method"; + } +} + +sub READ { + my $pkg = ref $_[0]; + croak "$pkg doesn't define a READ method"; +} + +sub WRITE { + my $pkg = ref $_[0]; + croak "$pkg doesn't define a WRITE method"; +} + +sub CLOSE { + my $pkg = ref $_[0]; + croak "$pkg doesn't define a CLOSE method"; +} + +package Tie::StdHandle; +our @ISA = 'Tie::Handle'; +use Carp; + +sub TIEHANDLE +{ + my $class = shift; + my $fh = \do { local *HANDLE}; + bless $fh,$class; + $fh->OPEN(@_) if (@_); + return $fh; +} + +sub EOF { eof($_[0]) } +sub TELL { tell($_[0]) } +sub FILENO { fileno($_[0]) } +sub SEEK { seek($_[0],$_[1],$_[2]) } +sub CLOSE { close($_[0]) } +sub BINMODE { binmode($_[0]) } + +sub OPEN +{ + $_[0]->CLOSE if defined($_[0]->FILENO); + @_ == 2 ? open($_[0], $_[1]) : open($_[0], $_[1], $_[2]); +} + +sub READ { read($_[0],$_[1],$_[2]) } +sub READLINE { my $fh = $_[0]; <$fh> } +sub GETC { getc($_[0]) } + +sub WRITE +{ + my $fh = $_[0]; + print $fh substr($_[1],0,$_[2]) +} + + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tie/Hash.pm b/Master/tlpkg/tlperl.old/lib/Tie/Hash.pm new file mode 100644 index 00000000000..a838915482b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tie/Hash.pm @@ -0,0 +1,257 @@ +package Tie::Hash; + +our $VERSION = '1.02'; + +=head1 NAME + +Tie::Hash, Tie::StdHash, Tie::ExtraHash - base class definitions for tied hashes + +=head1 SYNOPSIS + + package NewHash; + require Tie::Hash; + + @ISA = (Tie::Hash); + + sub DELETE { ... } # Provides needed method + sub CLEAR { ... } # Overrides inherited method + + + package NewStdHash; + require Tie::Hash; + + @ISA = (Tie::StdHash); + + # All methods provided by default, define only those needing overrides + # Accessors access the storage in %{$_[0]}; + # TIEHASH should return a reference to the actual storage + sub DELETE { ... } + + package NewExtraHash; + require Tie::Hash; + + @ISA = (Tie::ExtraHash); + + # All methods provided by default, define only those needing overrides + # Accessors access the storage in %{$_[0][0]}; + # TIEHASH should return an array reference with the first element being + # the reference to the actual storage + sub DELETE { + $_[0][1]->('del', $_[0][0], $_[1]); # Call the report writer + delete $_[0][0]->{$_[1]}; # $_[0]->SUPER::DELETE($_[1]) + } + + + package main; + + tie %new_hash, 'NewHash'; + tie %new_std_hash, 'NewStdHash'; + tie %new_extra_hash, 'NewExtraHash', + sub {warn "Doing \U$_[1]\E of $_[2].\n"}; + +=head1 DESCRIPTION + +This module provides some skeletal methods for hash-tying classes. See +L<perltie> for a list of the functions required in order to tie a hash +to a package. The basic B<Tie::Hash> package provides a C<new> method, as well +as methods C<TIEHASH>, C<EXISTS> and C<CLEAR>. The B<Tie::StdHash> and +B<Tie::ExtraHash> packages +provide most methods for hashes described in L<perltie> (the exceptions +are C<UNTIE> and C<DESTROY>). They cause tied hashes to behave exactly like standard hashes, +and allow for selective overwriting of methods. B<Tie::Hash> grandfathers the +C<new> method: it is used if C<TIEHASH> is not defined +in the case a class forgets to include a C<TIEHASH> method. + +For developers wishing to write their own tied hashes, the required methods +are briefly defined below. See the L<perltie> section for more detailed +descriptive, as well as example code: + +=over 4 + +=item TIEHASH classname, LIST + +The method invoked by the command C<tie %hash, classname>. Associates a new +hash instance with the specified class. C<LIST> would represent additional +arguments (along the lines of L<AnyDBM_File> and compatriots) needed to +complete the association. + +=item STORE this, key, value + +Store datum I<value> into I<key> for the tied hash I<this>. + +=item FETCH this, key + +Retrieve the datum in I<key> for the tied hash I<this>. + +=item FIRSTKEY this + +Return the first key in the hash. + +=item NEXTKEY this, lastkey + +Return the next key in the hash. + +=item EXISTS this, key + +Verify that I<key> exists with the tied hash I<this>. + +The B<Tie::Hash> implementation is a stub that simply croaks. + +=item DELETE this, key + +Delete the key I<key> from the tied hash I<this>. + +=item CLEAR this + +Clear all values from the tied hash I<this>. + +=item SCALAR this + +Returns what evaluating the hash in scalar context yields. + +B<Tie::Hash> does not implement this method (but B<Tie::StdHash> +and B<Tie::ExtraHash> do). + +=back + +=head1 Inheriting from B<Tie::StdHash> + +The accessor methods assume that the actual storage for the data in the tied +hash is in the hash referenced by C<tied(%tiedhash)>. Thus overwritten +C<TIEHASH> method should return a hash reference, and the remaining methods +should operate on the hash referenced by the first argument: + + package ReportHash; + our @ISA = 'Tie::StdHash'; + + sub TIEHASH { + my $storage = bless {}, shift; + warn "New ReportHash created, stored in $storage.\n"; + $storage + } + sub STORE { + warn "Storing data with key $_[1] at $_[0].\n"; + $_[0]{$_[1]} = $_[2] + } + + +=head1 Inheriting from B<Tie::ExtraHash> + +The accessor methods assume that the actual storage for the data in the tied +hash is in the hash referenced by C<(tied(%tiedhash))-E<gt>[0]>. Thus overwritten +C<TIEHASH> method should return an array reference with the first +element being a hash reference, and the remaining methods should operate on the +hash C<< %{ $_[0]->[0] } >>: + + package ReportHash; + our @ISA = 'Tie::ExtraHash'; + + sub TIEHASH { + my $class = shift; + my $storage = bless [{}, @_], $class; + warn "New ReportHash created, stored in $storage.\n"; + $storage; + } + sub STORE { + warn "Storing data with key $_[1] at $_[0].\n"; + $_[0][0]{$_[1]} = $_[2] + } + +The default C<TIEHASH> method stores "extra" arguments to tie() starting +from offset 1 in the array referenced by C<tied(%tiedhash)>; this is the +same storage algorithm as in TIEHASH subroutine above. Hence, a typical +package inheriting from B<Tie::ExtraHash> does not need to overwrite this +method. + +=head1 C<SCALAR>, C<UNTIE> and C<DESTROY> + +The methods C<UNTIE> and C<DESTROY> are not defined in B<Tie::Hash>, +B<Tie::StdHash>, or B<Tie::ExtraHash>. Tied hashes do not require +presence of these methods, but if defined, the methods will be called in +proper time, see L<perltie>. + +C<SCALAR> is only defined in B<Tie::StdHash> and B<Tie::ExtraHash>. + +If needed, these methods should be defined by the package inheriting from +B<Tie::Hash>, B<Tie::StdHash>, or B<Tie::ExtraHash>. See L<pertie/"SCALAR"> +to find out what happens when C<SCALAR> does not exist. + +=head1 MORE INFORMATION + +The packages relating to various DBM-related implementations (F<DB_File>, +F<NDBM_File>, etc.) show examples of general tied hashes, as does the +L<Config> module. While these do not utilize B<Tie::Hash>, they serve as +good working examples. + +=cut + +use Carp; +use warnings::register; + +sub new { + my $pkg = shift; + $pkg->TIEHASH(@_); +} + +# Grandfather "new" + +sub TIEHASH { + my $pkg = shift; + if (defined &{"${pkg}::new"}) { + warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIEHASH is missing"); + $pkg->new(@_); + } + else { + croak "$pkg doesn't define a TIEHASH method"; + } +} + +sub EXISTS { + my $pkg = ref $_[0]; + croak "$pkg doesn't define an EXISTS method"; +} + +sub CLEAR { + my $self = shift; + my $key = $self->FIRSTKEY(@_); + my @keys; + + while (defined $key) { + push @keys, $key; + $key = $self->NEXTKEY(@_, $key); + } + foreach $key (@keys) { + $self->DELETE(@_, $key); + } +} + +# The Tie::StdHash package implements standard perl hash behaviour. +# It exists to act as a base class for classes which only wish to +# alter some parts of their behaviour. + +package Tie::StdHash; +# @ISA = qw(Tie::Hash); # would inherit new() only + +sub TIEHASH { bless {}, $_[0] } +sub STORE { $_[0]->{$_[1]} = $_[2] } +sub FETCH { $_[0]->{$_[1]} } +sub FIRSTKEY { my $a = scalar keys %{$_[0]}; each %{$_[0]} } +sub NEXTKEY { each %{$_[0]} } +sub EXISTS { exists $_[0]->{$_[1]} } +sub DELETE { delete $_[0]->{$_[1]} } +sub CLEAR { %{$_[0]} = () } +sub SCALAR { scalar %{$_[0]} } + +package Tie::ExtraHash; + +sub TIEHASH { my $p = shift; bless [{}, @_], $p } +sub STORE { $_[0][0]{$_[1]} = $_[2] } +sub FETCH { $_[0][0]{$_[1]} } +sub FIRSTKEY { my $a = scalar keys %{$_[0][0]}; each %{$_[0][0]} } +sub NEXTKEY { each %{$_[0][0]} } +sub EXISTS { exists $_[0][0]->{$_[1]} } +sub DELETE { delete $_[0][0]->{$_[1]} } +sub CLEAR { %{$_[0][0]} = () } +sub SCALAR { scalar %{$_[0][0]} } + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tie/Memoize.pm b/Master/tlpkg/tlperl.old/lib/Tie/Memoize.pm new file mode 100644 index 00000000000..2793a04590d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tie/Memoize.pm @@ -0,0 +1,128 @@ +use strict; +package Tie::Memoize; +use Tie::Hash; +our @ISA = 'Tie::ExtraHash'; +our $VERSION = '1.0'; + +our $exists_token = \undef; + +sub croak {require Carp; goto &Carp::croak} + +# Format: [0: STORAGE, 1: EXISTS-CACHE, 2: FETCH_function; +# 3: EXISTS_function, 4: DATA, 5: EXISTS_different ] + +sub FETCH { + my ($h,$key) = ($_[0][0], $_[1]); + my $res = $h->{$key}; + return $res if defined $res; # Shortcut if accessible + return $res if exists $h->{$key}; # Accessible, but undef + my $cache = $_[0][1]{$key}; + return if defined $cache and not $cache; # Known to not exist + my @res = $_[0][2]->($key, $_[0][4]); # Autoload + $_[0][1]{$key} = 0, return unless @res; # Cache non-existence + delete $_[0][1]{$key}; # Clear existence cache, not needed any more + $_[0][0]{$key} = $res[0]; # Store data and return +} + +sub EXISTS { + my ($a,$key) = (shift, shift); + return 1 if exists $a->[0]{$key}; # Have data + my $cache = $a->[1]{$key}; + return $cache if defined $cache; # Existence cache + my @res = $a->[3]($key,$a->[4]); + $_[0][1]{$key} = 0, return unless @res; # Cache non-existence + # Now we know it exists + return ($_[0][1]{$key} = 1) if $a->[5]; # Only existence reported + # Now know the value + $_[0][0]{$key} = $res[0]; # Store data + return 1 +} + +sub TIEHASH { + croak 'syntax: tie %hash, \'Tie::AutoLoad\', \&fetch_subr' if @_ < 2; + croak 'syntax: tie %hash, \'Tie::AutoLoad\', \&fetch_subr, $data, \&exists_subr, \%data_cache, \%existence_cache' if @_ > 6; + push @_, undef if @_ < 3; # Data + push @_, $_[1] if @_ < 4; # exists + push @_, {} while @_ < 6; # initial value and caches + bless [ @_[4,5,1,3,2], $_[1] ne $_[3]], $_[0] +} + +1; + +=head1 NAME + +Tie::Memoize - add data to hash when needed + +=head1 SYNOPSIS + + require Tie::Memoize; + tie %hash, 'Tie::Memoize', + \&fetch, # The rest is optional + $DATA, \&exists, + {%ini_value}, {%ini_existence}; + +=head1 DESCRIPTION + +This package allows a tied hash to autoload its values on the first access, +and to use the cached value on the following accesses. + +Only read-accesses (via fetching the value or C<exists>) result in calls to +the functions; the modify-accesses are performed as on a normal hash. + +The required arguments during C<tie> are the hash, the package, and +the reference to the C<FETCH>ing function. The optional arguments are +an arbitrary scalar $data, the reference to the C<EXISTS> function, +and initial values of the hash and of the existence cache. + +Both the C<FETCH>ing function and the C<EXISTS> functions have the +same signature: the arguments are C<$key, $data>; $data is the same +value as given as argument during tie()ing. Both functions should +return an empty list if the value does not exist. If C<EXISTS> +function is different from the C<FETCH>ing function, it should return +a TRUE value on success. The C<FETCH>ing function should return the +intended value if the key is valid. + +=head1 Inheriting from B<Tie::Memoize> + +The structure of the tied() data is an array reference with elements + + 0: cache of known values + 1: cache of known existence of keys + 2: FETCH function + 3: EXISTS function + 4: $data + +The rest is for internal usage of this package. In particular, if +TIEHASH is overwritten, it should call SUPER::TIEHASH. + +=head1 EXAMPLE + + sub slurp { + my ($key, $dir) = shift; + open my $h, '<', "$dir/$key" or return; + local $/; <$h> # slurp it all + } + sub exists { my ($key, $dir) = shift; return -f "$dir/$key" } + + tie %hash, 'Tie::Memoize', \&slurp, $directory, \&exists, + { fake_file1 => $content1, fake_file2 => $content2 }, + { pretend_does_not_exists => 0, known_to_exist => 1 }; + +This example treats the slightly modified contents of $directory as a +hash. The modifications are that the keys F<fake_file1> and +F<fake_file2> fetch values $content1 and $content2, and +F<pretend_does_not_exists> will never be accessed. Additionally, the +existence of F<known_to_exist> is never checked (so if it does not +exists when its content is needed, the user of %hash may be confused). + +=head1 BUGS + +FIRSTKEY and NEXTKEY methods go through the keys which were already read, +not all the possible keys of the hash. + +=head1 AUTHOR + +Ilya Zakharevich L<mailto:perl-module-hash-memoize@ilyaz.org>. + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Tie/RefHash.pm b/Master/tlpkg/tlperl.old/lib/Tie/RefHash.pm new file mode 100644 index 00000000000..cfcdd5b5a10 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tie/RefHash.pm @@ -0,0 +1,170 @@ +package Tie::RefHash; + +our $VERSION = 1.32; + +=head1 NAME + +Tie::RefHash - use references as hash keys + +=head1 SYNOPSIS + + require 5.004; + use Tie::RefHash; + tie HASHVARIABLE, 'Tie::RefHash', LIST; + tie HASHVARIABLE, 'Tie::RefHash::Nestable', LIST; + + untie HASHVARIABLE; + +=head1 DESCRIPTION + +This module provides the ability to use references as hash keys if you +first C<tie> the hash variable to this module. Normally, only the +keys of the tied hash itself are preserved as references; to use +references as keys in hashes-of-hashes, use Tie::RefHash::Nestable, +included as part of Tie::RefHash. + +It is implemented using the standard perl TIEHASH interface. Please +see the C<tie> entry in perlfunc(1) and perltie(1) for more information. + +The Nestable version works by looking for hash references being stored +and converting them to tied hashes so that they too can have +references as keys. This will happen without warning whenever you +store a reference to one of your own hashes in the tied hash. + +=head1 EXAMPLE + + use Tie::RefHash; + tie %h, 'Tie::RefHash'; + $a = []; + $b = {}; + $c = \*main; + $d = \"gunk"; + $e = sub { 'foo' }; + %h = ($a => 1, $b => 2, $c => 3, $d => 4, $e => 5); + $a->[0] = 'foo'; + $b->{foo} = 'bar'; + for (keys %h) { + print ref($_), "\n"; + } + + tie %h, 'Tie::RefHash::Nestable'; + $h{$a}->{$b} = 1; + for (keys %h, keys %{$h{$a}}) { + print ref($_), "\n"; + } + +=head1 AUTHOR + +Gurusamy Sarathy gsar@activestate.com + +'Nestable' by Ed Avis ed@membled.com + +=head1 VERSION + +Version 1.32 + +=head1 SEE ALSO + +perl(1), perlfunc(1), perltie(1) + +=cut + +use Tie::Hash; +use vars '@ISA'; +@ISA = qw(Tie::Hash); +use strict; + +require overload; # to support objects with overloaded "" + +sub TIEHASH { + my $c = shift; + my $s = []; + bless $s, $c; + while (@_) { + $s->STORE(shift, shift); + } + return $s; +} + +sub FETCH { + my($s, $k) = @_; + if (ref $k) { + my $kstr = overload::StrVal($k); + if (defined $s->[0]{$kstr}) { + $s->[0]{$kstr}[1]; + } + else { + undef; + } + } + else { + $s->[1]{$k}; + } +} + +sub STORE { + my($s, $k, $v) = @_; + if (ref $k) { + $s->[0]{overload::StrVal($k)} = [$k, $v]; + } + else { + $s->[1]{$k} = $v; + } + $v; +} + +sub DELETE { + my($s, $k) = @_; + (ref $k) + ? (delete($s->[0]{overload::StrVal($k)}) || [])->[1] + : delete($s->[1]{$k}); +} + +sub EXISTS { + my($s, $k) = @_; + (ref $k) ? exists($s->[0]{overload::StrVal($k)}) : exists($s->[1]{$k}); +} + +sub FIRSTKEY { + my $s = shift; + keys %{$s->[0]}; # reset iterator + keys %{$s->[1]}; # reset iterator + $s->[2] = 0; # flag for iteration, see NEXTKEY + $s->NEXTKEY; +} + +sub NEXTKEY { + my $s = shift; + my ($k, $v); + if (!$s->[2]) { + if (($k, $v) = each %{$s->[0]}) { + return $v->[0]; + } + else { + $s->[2] = 1; + } + } + return each %{$s->[1]}; +} + +sub CLEAR { + my $s = shift; + $s->[2] = 0; + %{$s->[0]} = (); + %{$s->[1]} = (); +} + +package Tie::RefHash::Nestable; +use vars '@ISA'; +@ISA = 'Tie::RefHash'; + +sub STORE { + my($s, $k, $v) = @_; + if (ref($v) eq 'HASH' and not tied %$v) { + my @elems = %$v; + tie %$v, ref($s), @elems; + } + $s->SUPER::STORE($k, $v); +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tie/Scalar.pm b/Master/tlpkg/tlperl.old/lib/Tie/Scalar.pm new file mode 100644 index 00000000000..c23c12187a8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tie/Scalar.pm @@ -0,0 +1,140 @@ +package Tie::Scalar; + +our $VERSION = '1.00'; + +=head1 NAME + +Tie::Scalar, Tie::StdScalar - base class definitions for tied scalars + +=head1 SYNOPSIS + + package NewScalar; + require Tie::Scalar; + + @ISA = (Tie::Scalar); + + sub FETCH { ... } # Provide a needed method + sub TIESCALAR { ... } # Overrides inherited method + + + package NewStdScalar; + require Tie::Scalar; + + @ISA = (Tie::StdScalar); + + # All methods provided by default, so define only what needs be overridden + sub FETCH { ... } + + + package main; + + tie $new_scalar, 'NewScalar'; + tie $new_std_scalar, 'NewStdScalar'; + +=head1 DESCRIPTION + +This module provides some skeletal methods for scalar-tying classes. See +L<perltie> for a list of the functions required in tying a scalar to a +package. The basic B<Tie::Scalar> package provides a C<new> method, as well +as methods C<TIESCALAR>, C<FETCH> and C<STORE>. The B<Tie::StdScalar> +package provides all the methods specified in L<perltie>. It inherits from +B<Tie::Scalar> and causes scalars tied to it to behave exactly like the +built-in scalars, allowing for selective overloading of methods. The C<new> +method is provided as a means of grandfathering, for classes that forget to +provide their own C<TIESCALAR> method. + +For developers wishing to write their own tied-scalar classes, the methods +are summarized below. The L<perltie> section not only documents these, but +has sample code as well: + +=over 4 + +=item TIESCALAR classname, LIST + +The method invoked by the command C<tie $scalar, classname>. Associates a new +scalar instance with the specified class. C<LIST> would represent additional +arguments (along the lines of L<AnyDBM_File> and compatriots) needed to +complete the association. + +=item FETCH this + +Retrieve the value of the tied scalar referenced by I<this>. + +=item STORE this, value + +Store data I<value> in the tied scalar referenced by I<this>. + +=item DESTROY this + +Free the storage associated with the tied scalar referenced by I<this>. +This is rarely needed, as Perl manages its memory quite well. But the +option exists, should a class wish to perform specific actions upon the +destruction of an instance. + +=back + +=head1 MORE INFORMATION + +The L<perltie> section uses a good example of tying scalars by associating +process IDs with priority. + +=cut + +use Carp; +use warnings::register; + +sub new { + my $pkg = shift; + $pkg->TIESCALAR(@_); +} + +# "Grandfather" the new, a la Tie::Hash + +sub TIESCALAR { + my $pkg = shift; + if ($pkg->can('new') and $pkg ne __PACKAGE__) { + warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIESCALAR is missing"); + $pkg->new(@_); + } + else { + croak "$pkg doesn't define a TIESCALAR method"; + } +} + +sub FETCH { + my $pkg = ref $_[0]; + croak "$pkg doesn't define a FETCH method"; +} + +sub STORE { + my $pkg = ref $_[0]; + croak "$pkg doesn't define a STORE method"; +} + +# +# The Tie::StdScalar package provides scalars that behave exactly like +# Perl's built-in scalars. Good base to inherit from, if you're only going to +# tweak a small bit. +# +package Tie::StdScalar; +@ISA = (Tie::Scalar); + +sub TIESCALAR { + my $class = shift; + my $instance = shift || undef; + return bless \$instance => $class; +} + +sub FETCH { + return ${$_[0]}; +} + +sub STORE { + ${$_[0]} = $_[1]; +} + +sub DESTROY { + undef ${$_[0]}; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tie/SubstrHash.pm b/Master/tlpkg/tlperl.old/lib/Tie/SubstrHash.pm new file mode 100644 index 00000000000..476dd686787 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tie/SubstrHash.pm @@ -0,0 +1,215 @@ +package Tie::SubstrHash; + +our $VERSION = '1.00'; + +=head1 NAME + +Tie::SubstrHash - Fixed-table-size, fixed-key-length hashing + +=head1 SYNOPSIS + + require Tie::SubstrHash; + + tie %myhash, 'Tie::SubstrHash', $key_len, $value_len, $table_size; + +=head1 DESCRIPTION + +The B<Tie::SubstrHash> package provides a hash-table-like interface to +an array of determinate size, with constant key size and record size. + +Upon tying a new hash to this package, the developer must specify the +size of the keys that will be used, the size of the value fields that the +keys will index, and the size of the overall table (in terms of key-value +pairs, not size in hard memory). I<These values will not change for the +duration of the tied hash>. The newly-allocated hash table may now have +data stored and retrieved. Efforts to store more than C<$table_size> +elements will result in a fatal error, as will efforts to store a value +not exactly C<$value_len> characters in length, or reference through a +key not exactly C<$key_len> characters in length. While these constraints +may seem excessive, the result is a hash table using much less internal +memory than an equivalent freely-allocated hash table. + +=head1 CAVEATS + +Because the current implementation uses the table and key sizes for the +hashing algorithm, there is no means by which to dynamically change the +value of any of the initialization parameters. + +The hash does not support exists(). + +=cut + +use Carp; + +sub TIEHASH { + my $pack = shift; + my ($klen, $vlen, $tsize) = @_; + my $rlen = 1 + $klen + $vlen; + $tsize = [$tsize, + findgteprime($tsize * 1.1)]; # Allow 10% empty. + local $self = bless ["\0", $klen, $vlen, $tsize, $rlen, 0, -1]; + $$self[0] x= $rlen * $tsize->[1]; + $self; +} + +sub CLEAR { + local($self) = @_; + $$self[0] = "\0" x ($$self[4] * $$self[3]->[1]); + $$self[5] = 0; + $$self[6] = -1; +} + +sub FETCH { + local($self,$key) = @_; + local($klen, $vlen, $tsize, $rlen) = @$self[1..4]; + &hashkey; + for (;;) { + $offset = $hash * $rlen; + $record = substr($$self[0], $offset, $rlen); + if (ord($record) == 0) { + return undef; + } + elsif (ord($record) == 1) { + } + elsif (substr($record, 1, $klen) eq $key) { + return substr($record, 1+$klen, $vlen); + } + &rehash; + } +} + +sub STORE { + local($self,$key,$val) = @_; + local($klen, $vlen, $tsize, $rlen) = @$self[1..4]; + croak("Table is full ($tsize->[0] elements)") if $$self[5] > $tsize->[0]; + croak(qq/Value "$val" is not $vlen characters long/) + if length($val) != $vlen; + my $writeoffset; + + &hashkey; + for (;;) { + $offset = $hash * $rlen; + $record = substr($$self[0], $offset, $rlen); + if (ord($record) == 0) { + $record = "\2". $key . $val; + die "panic" unless length($record) == $rlen; + $writeoffset = $offset unless defined $writeoffset; + substr($$self[0], $writeoffset, $rlen) = $record; + ++$$self[5]; + return; + } + elsif (ord($record) == 1) { + $writeoffset = $offset unless defined $writeoffset; + } + elsif (substr($record, 1, $klen) eq $key) { + $record = "\2". $key . $val; + die "panic" unless length($record) == $rlen; + substr($$self[0], $offset, $rlen) = $record; + return; + } + &rehash; + } +} + +sub DELETE { + local($self,$key) = @_; + local($klen, $vlen, $tsize, $rlen) = @$self[1..4]; + &hashkey; + for (;;) { + $offset = $hash * $rlen; + $record = substr($$self[0], $offset, $rlen); + if (ord($record) == 0) { + return undef; + } + elsif (ord($record) == 1) { + } + elsif (substr($record, 1, $klen) eq $key) { + substr($$self[0], $offset, 1) = "\1"; + return substr($record, 1+$klen, $vlen); + --$$self[5]; + } + &rehash; + } +} + +sub FIRSTKEY { + local($self) = @_; + $$self[6] = -1; + &NEXTKEY; +} + +sub NEXTKEY { + local($self) = @_; + local($klen, $vlen, $tsize, $rlen, $entries, $iterix) = @$self[1..6]; + for (++$iterix; $iterix < $tsize->[1]; ++$iterix) { + next unless substr($$self[0], $iterix * $rlen, 1) eq "\2"; + $$self[6] = $iterix; + return substr($$self[0], $iterix * $rlen + 1, $klen); + } + $$self[6] = -1; + undef; +} + +sub EXISTS { + croak "Tie::SubstrHash does not support exists()"; +} + +sub hashkey { + croak(qq/Key "$key" is not $klen characters long/) + if length($key) != $klen; + $hash = 2; + for (unpack('C*', $key)) { + $hash = $hash * 33 + $_; + &_hashwrap if $hash >= 1e13; + } + &_hashwrap if $hash >= $tsize->[1]; + $hash = 1 unless $hash; + $hashbase = $hash; +} + +sub _hashwrap { + $hash -= int($hash / $tsize->[1]) * $tsize->[1]; +} + +sub rehash { + $hash += $hashbase; + $hash -= $tsize->[1] if $hash >= $tsize->[1]; +} + +# using POSIX::ceil() would be too heavy, and not all platforms have it. +sub ceil { + my $num = shift; + $num = int($num + 1) unless $num == int $num; + return $num; +} + +# See: +# +# http://www-groups.dcs.st-andrews.ac.uk/~history/HistTopics/Prime_numbers.html +# + +sub findgteprime { # find the smallest prime integer greater than or equal to + use integer; + + my $num = ceil(shift); + return 2 if $num <= 2; + + $num++ unless $num % 2; + my $i; + my $sqrtnum = int sqrt $num; + my $sqrtnumsquared = $sqrtnum * $sqrtnum; + + NUM: + for (;; $num += 2) { + if ($sqrtnumsquared < $num) { + $sqrtnum++; + $sqrtnumsquared = $sqrtnum * $sqrtnum; + } + for ($i = 3; $i <= $sqrtnum; $i += 2) { + next NUM unless $num % $i; + } + return $num; + } +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tie/Watch.pm b/Master/tlpkg/tlperl.old/lib/Tie/Watch.pm new file mode 100644 index 00000000000..48f46acd2b0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tie/Watch.pm @@ -0,0 +1,560 @@ +$Tie::Watch::VERSION = '1.2'; + +package Tie::Watch; + +=head1 NAME + + Tie::Watch - place watchpoints on Perl variables. + +=head1 SYNOPSIS + + use Tie::Watch; + + $watch = Tie::Watch->new( + -variable => \$frog, + -debug => 1, + -shadow => 0, + -fetch => [\&fetch, 'arg1', 'arg2', ..., 'argn'], + -store => \&store, + -destroy => sub {print "Final value=$frog.\n"}, + } + %vinfo = $watch->Info; + $args = $watch->Args(-fetch); + $val = $watch->Fetch; + print "val=", $watch->Say($val), ".\n"; + $watch->Store('Hello'); + $watch->Unwatch; + +=head1 DESCRIPTION + +This class module binds one or more subroutines of your devising to a +Perl variable. All variables can have B<FETCH>, B<STORE> and +B<DESTROY> callbacks. Additionally, arrays can define B<CLEAR>, +B<DELETE>, B<EXISTS>, B<EXTEND>, B<FETCHSIZE>, B<POP>, B<PUSH>, +B<SHIFT>, B<SPLICE>, B<STORESIZE> and B<UNSHIFT> callbacks, and hashes +can define B<CLEAR>, B<DELETE>, B<EXISTS>, B<FIRSTKEY> and B<NEXTKEY> +callbacks. If these term are unfamiliar to you, I I<really> suggest +you read L<perltie>. + +With Tie::Watch you can: + + . alter a variable's value + . prevent a variable's value from being changed + . invoke a Perl/Tk callback when a variable changes + . trace references to a variable + +Callback format is patterned after the Perl/Tk scheme: supply either a +code reference, or, supply an array reference and pass the callback +code reference in the first element of the array, followed by callback +arguments. (See examples in the Synopsis, above.) + +Tie::Watch provides default callbacks for any that you fail to +specify. Other than negatively impacting performance, they perform +the standard action that you'd expect, so the variable behaves +"normally". Once you override a default callback, perhaps to insert +debug code like print statements, your callback normally finishes by +calling the underlying (overridden) method. But you don't have to! + +To map a tied method name to a default callback name simply lowercase +the tied method name and uppercase its first character. So FETCH +becomes Fetch, NEXTKEY becomes Nextkey, etcetera. + +Here are two callbacks for a scalar. The B<FETCH> (read) callback does +nothing other than illustrate the fact that it returns the value to +assign the variable. The B<STORE> (write) callback uppercases the +variable and returns it. In all cases the callback I<must> return the +correct read or write value - typically, it does this by invoking the +underlying method. + + my $fetch_scalar = sub { + my($self) = @_; + $self->Fetch; + }; + + my $store_scalar = sub { + my($self, $new_val) = @_; + $self->Store(uc $new_val); + }; + +Here are B<FETCH> and B<STORE> callbacks for either an array or hash. +They do essentially the same thing as the scalar callbacks, but +provide a little more information. + + my $fetch = sub { + my($self, $key) = @_; + my $val = $self->Fetch($key); + print "In fetch callback, key=$key, val=", $self->Say($val); + my $args = $self->Args(-fetch); + print ", args=('", join("', '", @$args), "')" if $args; + print ".\n"; + $val; + }; + + my $store = sub { + my($self, $key, $new_val) = @_; + my $val = $self->Fetch($key); + $new_val = uc $new_val; + $self->Store($key, $new_val); + print "In store callback, key=$key, val=", $self->Say($val), + ", new_val=", $self->Say($new_val); + my $args = $self->Args(-store); + print ", args=('", join("', '", @$args), "')" if $args; + print ".\n"; + $new_val; + }; + +In all cases, the first parameter is a reference to the Watch object, +used to invoke the following class methods. + +=head1 METHODS + +=over 4 + +=item $watch = Tie::Watch->new(-options => values); + +The watchpoint constructor method that accepts option/value pairs to +create and configure the Watch object. The only required option is +B<-variable>. + +B<-variable> is a I<reference> to a scalar, array or hash variable. + +B<-debug> (default 0) is 1 to activate debug print statements internal +to Tie::Watch. + +B<-shadow> (default 1) is 0 to disable array and hash shadowing. To +prevent infinite recursion Tie::Watch maintains parallel variables for +arrays and hashes. When the watchpoint is created the parallel shadow +variable is initialized with the watched variable's contents, and when +the watchpoint is deleted the shadow variable is copied to the original +variable. Thus, changes made during the watch process are not lost. +Shadowing is on my default. If you disable shadowing any changes made +to an array or hash are lost when the watchpoint is deleted. + +Specify any of the following relevant callback parameters, in the +format described above: B<-fetch>, B<-store>, B<-destroy>. +Additionally for arrays: B<-clear>, B<-extend>, B<-fetchsize>, +B<-pop>, B<-push>, B<-shift>, B<-splice>, B<-storesize> and +B<-unshift>. Additionally for hashes: B<-clear>, B<-delete>, +B<-exists>, B<-firstkey> and B<-nextkey>. + +=item $args = $watch->Args(-fetch); + +Returns a reference to a list of arguments for the specified callback, +or undefined if none. + +=item $watch->Fetch(); $watch->Fetch($key); + +Returns a variable's current value. $key is required for an array or +hash. + +=item %vinfo = $watch->Info(); + +Returns a hash detailing the internals of the Watch object, with these +keys: + + %vinfo = { + -variable => SCALAR(0x200737f8) + -debug => '0' + -shadow => '1' + -value => 'HELLO SCALAR' + -destroy => ARRAY(0x200f86cc) + -fetch => ARRAY(0x200f8558) + -store => ARRAY(0x200f85a0) + -legible => above data formatted as a list of string, for printing + } + +For array and hash Watch objects, the B<-value> key is replaced with a +B<-ptr> key which is a reference to the parallel array or hash. +Additionally, for an array or hash, there are key/value pairs for +all the variable specific callbacks. + +=item $watch->Say($val); + +Used mainly for debugging, it returns $val in quotes if required, or +the string "undefined" for undefined values. + +=item $watch->Store($new_val); $watch->Store($key, $new_val); + +Store a variable's new value. $key is required for an array or hash. + +=item $watch->Unwatch(); + +Stop watching the variable. + +=back + +=head1 EFFICIENCY CONSIDERATIONS + +If you can live using the class methods provided, please do so. You +can meddle with the object hash directly and improved watch +performance, at the risk of your code breaking in the future. + +=head1 AUTHOR + +Stephen O. Lidie + +=head1 HISTORY + + lusol@Lehigh.EDU, LUCC, 96/05/30 + . Original version 0.92 release, based on the Trace module from Hans Mulder, + and ideas from Tim Bunce. + + lusol@Lehigh.EDU, LUCC, 96/12/25 + . Version 0.96, release two inner references detected by Perl 5.004. + + lusol@Lehigh.EDU, LUCC, 97/01/11 + . Version 0.97, fix Makefile.PL and MANIFEST (thanks Andreas Koenig). + Make sure test.pl doesn't fail if Tk isn't installed. + + Stephen.O.Lidie@Lehigh.EDU, Lehigh University Computing Center, 97/10/03 + . Version 0.98, implement -shadow option for arrays and hashes. + + Stephen.O.Lidie@Lehigh.EDU, Lehigh University Computing Center, 98/02/11 + . Version 0.99, finally, with Perl 5.004_57, we can completely watch arrays. + With tied array support this module is essentially complete, so its been + optimized for speed at the expense of clarity - sorry about that. The + Delete() method has been renamed Unwatch() because it conflicts with the + builtin delete(). + + Stephen.O.Lidie@Lehigh.EDU, Lehigh University Computing Center, 99/04/04 + . Version 1.0, for Perl 5.005_03, update Makefile.PL for ActiveState, and + add two examples (one for Perl/Tk). + + sol0@lehigh.edu, Lehigh University Computing Center, 2003/06/07 + . Version 1.1, for Perl 5.8, can trace a reference now, patch from Slaven + Rezic. + + sol0@lehigh.edu, Lehigh University Computing Center, 2005/05/17 + . Version 1.2, for Perl 5.8, per Rob Seegel's suggestion, support array + DELETE and EXISTS. + +=head1 COPYRIGHT + +Copyright (C) 1996 - 2005 Stephen O. Lidie. All rights reserved. + +This program is free software; you can redistribute it and/or modify it under +the same terms as Perl itself. + +=cut + +use 5.004_57;; +use Carp; +use strict; +use subs qw/normalize_callbacks/; +use vars qw/@array_callbacks @hash_callbacks @scalar_callbacks/; + +@array_callbacks = qw/-clear -delete -destroy -exists -extend -fetch + -fetchsize -pop -push -shift -splice -store + -storesize -unshift/; +@hash_callbacks = qw/-clear -delete -destroy -exists -fetch -firstkey + -nextkey -store/; +@scalar_callbacks = qw/-destroy -fetch -store/; + +sub new { + + # Watch constructor. The *real* constructor is Tie::Watch->base_watch(), + # invoked by methods in other Watch packages, depending upon the variable's + # type. Here we supply defaulted parameter values and then verify them, + # normalize all callbacks and bind the variable to the appropriate package. + + my($class, %args) = @_; + my $version = $Tie::Watch::VERSION; + my (%arg_defaults) = (-debug => 0, -shadow => 1); + my $variable = $args{-variable}; + croak "Tie::Watch::new(): -variable is required." if not defined $variable; + + my($type, $watch_obj) = (ref $variable, undef); + if ($type =~ /(SCALAR|REF)/) { + @arg_defaults{@scalar_callbacks} = ( + [\&Tie::Watch::Scalar::Destroy], [\&Tie::Watch::Scalar::Fetch], + [\&Tie::Watch::Scalar::Store]); + } elsif ($type =~ /ARRAY/) { + @arg_defaults{@array_callbacks} = ( + [\&Tie::Watch::Array::Clear], [\&Tie::Watch::Array::Delete], + [\&Tie::Watch::Array::Destroy], [\&Tie::Watch::Array::Exists], + [\&Tie::Watch::Array::Extend], [\&Tie::Watch::Array::Fetch], + [\&Tie::Watch::Array::Fetchsize], [\&Tie::Watch::Array::Pop], + [\&Tie::Watch::Array::Push], [\&Tie::Watch::Array::Shift], + [\&Tie::Watch::Array::Splice], [\&Tie::Watch::Array::Store], + [\&Tie::Watch::Array::Storesize], [\&Tie::Watch::Array::Unshift]); + } elsif ($type =~ /HASH/) { + @arg_defaults{@hash_callbacks} = ( + [\&Tie::Watch::Hash::Clear], [\&Tie::Watch::Hash::Delete], + [\&Tie::Watch::Hash::Destroy], [\&Tie::Watch::Hash::Exists], + [\&Tie::Watch::Hash::Fetch], [\&Tie::Watch::Hash::Firstkey], + [\&Tie::Watch::Hash::Nextkey], [\&Tie::Watch::Hash::Store]); + } else { + croak "Tie::Watch::new() - not a variable reference."; + } + my(@margs, %ahsh, $args, @args); + @margs = grep ! defined $args{$_}, keys %arg_defaults; + %ahsh = %args; # argument hash + @ahsh{@margs} = @arg_defaults{@margs}; # fill in missing values + normalize_callbacks \%ahsh; + + if ($type =~ /(SCALAR|REF)/) { + $watch_obj = tie $$variable, 'Tie::Watch::Scalar', %ahsh; + } elsif ($type =~ /ARRAY/) { + $watch_obj = tie @$variable, 'Tie::Watch::Array', %ahsh; + } elsif ($type =~ /HASH/) { + $watch_obj = tie %$variable, 'Tie::Watch::Hash', %ahsh; + } + $watch_obj; + +} # end new, Watch constructor + +sub Args { + + # Return a reference to a list of callback arguments, or undef if none. + # + # $_[0] = self + # $_[1] = callback type + + defined $_[0]->{$_[1]}->[1] ? [@{$_[0]->{$_[1]}}[1 .. $#{$_[0]->{$_[1]}}]] + : undef; + +} # end Args + +sub Info { + + # Info() method subclassed by other Watch modules. + # + # $_[0] = self + # @_[1 .. $#_] = optional callback types + + my(%vinfo, @results); + my(@info) = (qw/-variable -debug -shadow/); + push @info, @_[1 .. $#_] if scalar @_ >= 2; + foreach my $type (@info) { + push @results, sprintf('%-10s: ', substr $type, 1) . + $_[0]->Say($_[0]->{$type}); + $vinfo{$type} = $_[0]->{$type}; + } + $vinfo{-legible} = [@results]; + %vinfo; + +} # end Info + +sub Say { + + # For debugging, mainly. + # + # $_[0] = self + # $_[1] = value + + defined $_[1] ? (ref($_[1]) ne '' ? $_[1] : "'$_[1]'") : "undefined"; + +} # end Say + +sub Unwatch { + + # Stop watching a variable by releasing the last reference and untieing it. + # Update the original variable with its shadow, if appropriate. + # + # $_[0] = self + + my $variable = $_[0]->{-variable}; + my $type = ref $variable; + my $copy = $_[0]->{-ptr} if $type !~ /(SCALAR|REF)/; + my $shadow = $_[0]->{-shadow}; + undef $_[0]; + if ($type =~ /(SCALAR|REF)/) { + untie $$variable; + } elsif ($type =~ /ARRAY/) { + untie @$variable; + @$variable = @$copy if $shadow; + } elsif ($type =~ /HASH/) { + untie %$variable; + %$variable = %$copy if $shadow; + } else { + croak "Tie::Watch::Delete() - not a variable reference."; + } + +} # end Unwatch + +# Watch private methods. + +sub base_watch { + + # Watch base class constructor invoked by other Watch modules. + + my($class, %args) = @_; + my $watch_obj = {%args}; + $watch_obj; + +} # end base_watch + +sub callback { + + # Execute a Watch callback, either the default or user specified. + # Note that the arguments are those supplied by the tied method, + # not those (if any) specified by the user when the watch object + # was instantiated. This is for performance reasons, and why the + # Args() method exists. + # + # $_[0] = self + # $_[1] = callback type + # $_[2] through $#_ = tied arguments + + &{$_[0]->{$_[1]}->[0]} ($_[0], @_[2 .. $#_]); + +} # end callback + +sub normalize_callbacks { + + # Ensure all callbacks are normalized in [\&code, @args] format. + + my($args_ref) = @_; + my($cb, $ref); + foreach my $arg (keys %$args_ref) { + next if $arg =~ /variable|debug|shadow/; + $cb = $args_ref->{$arg}; + $ref = ref $cb; + if ($ref =~ /CODE/) { + $args_ref->{$arg} = [$cb]; + } elsif ($ref !~ /ARRAY/) { + croak "Tie::Watch: malformed callback $arg=$cb."; + } + } + +} # end normalize_callbacks + +############################################################################### + +package Tie::Watch::Scalar; + +use Carp; +@Tie::Watch::Scalar::ISA = qw/Tie::Watch/; + +sub TIESCALAR { + + my($class, %args) = @_; + my $variable = $args{-variable}; + my $watch_obj = Tie::Watch->base_watch(%args); + $watch_obj->{-value} = $$variable; + print "WatchScalar new: $variable created, \@_=", join(',', @_), "!\n" + if $watch_obj->{-debug}; + bless $watch_obj, $class; + +} # end TIESCALAR + +sub Info {$_[0]->SUPER::Info('-value', @Tie::Watch::scalar_callbacks)} + +# Default scalar callbacks. + +sub Destroy {undef %{$_[0]}} +sub Fetch {$_[0]->{-value}} +sub Store {$_[0]->{-value} = $_[1]} + +# Scalar access methods. + +sub DESTROY {$_[0]->callback('-destroy')} +sub FETCH {$_[0]->callback('-fetch')} +sub STORE {$_[0]->callback('-store', $_[1])} + +############################################################################### + +package Tie::Watch::Array; + +use Carp; +@Tie::Watch::Array::ISA = qw/Tie::Watch/; + +sub TIEARRAY { + + my($class, %args) = @_; + my($variable, $shadow) = @args{-variable, -shadow}; + my @copy = @$variable if $shadow; # make a private copy of user's array + $args{-ptr} = $shadow ? \@copy : []; + my $watch_obj = Tie::Watch->base_watch(%args); + print "WatchArray new: $variable created, \@_=", join(',', @_), "!\n" + if $watch_obj->{-debug}; + bless $watch_obj, $class; + +} # end TIEARRAY + +sub Info {$_[0]->SUPER::Info('-ptr', @Tie::Watch::array_callbacks)} + +# Default array callbacks. + +sub Clear {$_[0]->{-ptr} = ()} +sub Delete {delete $_[0]->{-ptr}->[$_[1]]} +sub Destroy {undef %{$_[0]}} +sub Exists {exists $_[0]->{-ptr}->[$_[1]]} +sub Extend {} +sub Fetch {$_[0]->{-ptr}->[$_[1]]} +sub Fetchsize {scalar @{$_[0]->{-ptr}}} +sub Pop {pop @{$_[0]->{-ptr}}} +sub Push {push @{$_[0]->{-ptr}}, @_[1 .. $#_]} +sub Shift {shift @{$_[0]->{-ptr}}} +sub Splice { + my $n = scalar @_; # splice() is wierd! + return splice @{$_[0]->{-ptr}}, $_[1] if $n == 2; + return splice @{$_[0]->{-ptr}}, $_[1], $_[2] if $n == 3; + return splice @{$_[0]->{-ptr}}, $_[1], $_[2], @_[3 .. $#_] if $n >= 4; +} +sub Store {$_[0]->{-ptr}->[$_[1]] = $_[2]} +sub Storesize {$#{$_[0]->{-ptr}} = $_[1] - 1} +sub Unshift {unshift @{$_[0]->{-ptr}}, @_[1 .. $#_]} + +# Array access methods. + +sub CLEAR {$_[0]->callback('-clear')} +sub DELETE {$_[0]->callback('-delete', $_[1])} +sub DESTROY {$_[0]->callback('-destroy')} +sub EXISTS {$_[0]->callback('-exists', $_[1])} +sub EXTEND {$_[0]->callback('-extend', $_[1])} +sub FETCH {$_[0]->callback('-fetch', $_[1])} +sub FETCHSIZE {$_[0]->callback('-fetchsize')} +sub POP {$_[0]->callback('-pop')} +sub PUSH {$_[0]->callback('-push', @_[1 .. $#_])} +sub SHIFT {$_[0]->callback('-shift')} +sub SPLICE {$_[0]->callback('-splice', @_[1 .. $#_])} +sub STORE {$_[0]->callback('-store', $_[1], $_[2])} +sub STORESIZE {$_[0]->callback('-storesize', $_[1])} +sub UNSHIFT {$_[0]->callback('-unshift', @_[1 .. $#_])} + +############################################################################### + +package Tie::Watch::Hash; + +use Carp; +@Tie::Watch::Hash::ISA = qw/Tie::Watch/; + +sub TIEHASH { + + my($class, %args) = @_; + my($variable, $shadow) = @args{-variable, -shadow}; + my %copy = %$variable if $shadow; # make a private copy of user's hash + $args{-ptr} = $shadow ? \%copy : {}; + my $watch_obj = Tie::Watch->base_watch(%args); + print "WatchHash new: $variable created, \@_=", join(',', @_), "!\n" + if $watch_obj->{-debug}; + bless $watch_obj, $class; + +} # end TIEHASH + +sub Info {$_[0]->SUPER::Info('-ptr', @Tie::Watch::hash_callbacks)} + +# Default hash callbacks. + +sub Clear {$_[0]->{-ptr} = ()} +sub Delete {delete $_[0]->{-ptr}->{$_[1]}} +sub Destroy {undef %{$_[0]}} +sub Exists {exists $_[0]->{-ptr}->{$_[1]}} +sub Fetch {$_[0]->{-ptr}->{$_[1]}} +sub Firstkey {my $c = keys %{$_[0]->{-ptr}}; each %{$_[0]->{-ptr}}} +sub Nextkey {each %{$_[0]->{-ptr}}} +sub Store {$_[0]->{-ptr}->{$_[1]} = $_[2]} + +# Hash access methods. + +sub CLEAR {$_[0]->callback('-clear')} +sub DELETE {$_[0]->callback('-delete', $_[1])} +sub DESTROY {$_[0]->callback('-destroy')} +sub EXISTS {$_[0]->callback('-exists', $_[1])} +sub FETCH {$_[0]->callback('-fetch', $_[1])} +sub FIRSTKEY {$_[0]->callback('-firstkey')} +sub NEXTKEY {$_[0]->callback('-nextkey')} +sub STORE {$_[0]->callback('-store', $_[1], $_[2])} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Time/HiRes.pm b/Master/tlpkg/tlperl.old/lib/Time/HiRes.pm new file mode 100644 index 00000000000..964e4385dfc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Time/HiRes.pm @@ -0,0 +1,500 @@ +package Time::HiRes; + +use strict; +use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD); + +require Exporter; +require DynaLoader; + +@ISA = qw(Exporter DynaLoader); + +@EXPORT = qw( ); +@EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval + getitimer setitimer nanosleep clock_gettime clock_getres + clock clock_nanosleep + CLOCK_HIGHRES CLOCK_MONOTONIC CLOCK_PROCESS_CPUTIME_ID + CLOCK_REALTIME CLOCK_SOFTTIME CLOCK_THREAD_CPUTIME_ID + CLOCK_TIMEOFDAY CLOCKS_PER_SEC + ITIMER_REAL ITIMER_VIRTUAL ITIMER_PROF ITIMER_REALPROF + TIMER_ABSTIME + d_usleep d_ualarm d_gettimeofday d_getitimer d_setitimer + d_nanosleep d_clock_gettime d_clock_getres + d_clock d_clock_nanosleep); + +$VERSION = '1.86'; +$XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + +sub AUTOLOAD { + my $constname; + ($constname = $AUTOLOAD) =~ s/.*:://; + # print "AUTOLOAD: constname = $constname ($AUTOLOAD)\n"; + die "&Time::HiRes::constant not defined" if $constname eq 'constant'; + my ($error, $val) = constant($constname); + # print "AUTOLOAD: error = $error, val = $val\n"; + if ($error) { + my (undef,$file,$line) = caller; + die "$error at $file line $line.\n"; + } + { + no strict 'refs'; + *$AUTOLOAD = sub { $val }; + } + goto &$AUTOLOAD; +} + +sub import { + my $this = shift; + for my $i (@_) { + if (($i eq 'clock_getres' && !&d_clock_getres) || + ($i eq 'clock_gettime' && !&d_clock_gettime) || + ($i eq 'clock_nanosleep' && !&d_clock_nanosleep) || + ($i eq 'clock' && !&d_clock) || + ($i eq 'nanosleep' && !&d_nanosleep) || + ($i eq 'usleep' && !&d_usleep) || + ($i eq 'ualarm' && !&d_ualarm)) { + require Carp; + Carp::croak("Time::HiRes::$i(): unimplemented in this platform"); + } + } + Time::HiRes->export_to_level(1, $this, @_); +} + +bootstrap Time::HiRes; + +# Preloaded methods go here. + +sub tv_interval { + # probably could have been done in C + my ($a, $b) = @_; + $b = [gettimeofday()] unless defined($b); + (${$b}[0] - ${$a}[0]) + ((${$b}[1] - ${$a}[1]) / 1_000_000); +} + +# Autoload methods go after =cut, and are processed by the autosplit program. + +1; +__END__ + +=head1 NAME + +Time::HiRes - High resolution alarm, sleep, gettimeofday, interval timers + +=head1 SYNOPSIS + + use Time::HiRes qw( usleep ualarm gettimeofday tv_interval nanosleep + clock_gettime clock_getres clock_nanosleep clock ); + + usleep ($microseconds); + nanosleep ($nanoseconds); + + ualarm ($microseconds); + ualarm ($microseconds, $interval_microseconds); + + $t0 = [gettimeofday]; + ($seconds, $microseconds) = gettimeofday; + + $elapsed = tv_interval ( $t0, [$seconds, $microseconds]); + $elapsed = tv_interval ( $t0, [gettimeofday]); + $elapsed = tv_interval ( $t0 ); + + use Time::HiRes qw ( time alarm sleep ); + + $now_fractions = time; + sleep ($floating_seconds); + alarm ($floating_seconds); + alarm ($floating_seconds, $floating_interval); + + use Time::HiRes qw( setitimer getitimer + ITIMER_REAL ITIMER_VIRTUAL ITIMER_PROF ITIMER_REALPROF ); + + setitimer ($which, $floating_seconds, $floating_interval ); + getitimer ($which); + + $realtime = clock_gettime(CLOCK_REALTIME); + $resolution = clock_getres(CLOCK_REALTIME); + + clock_nanosleep(CLOCK_REALTIME, 1.5); + clock_nanosleep(CLOCK_REALTIME, time() + 10, TIMER_ABSTIME); + + my $ticktock = clock(); + +=head1 DESCRIPTION + +The C<Time::HiRes> module implements a Perl interface to the +C<usleep>, C<nanosleep>, C<ualarm>, C<gettimeofday>, and +C<setitimer>/C<getitimer> system calls, in other words, high +resolution time and timers. See the L</EXAMPLES> section below and the +test scripts for usage; see your system documentation for the +description of the underlying C<nanosleep> or C<usleep>, C<ualarm>, +C<gettimeofday>, and C<setitimer>/C<getitimer> calls. + +If your system lacks C<gettimeofday()> or an emulation of it you don't +get C<gettimeofday()> or the one-argument form of C<tv_interval()>. +If your system lacks all of C<nanosleep()>, C<usleep()>, +C<select()>, and C<poll>, you don't get C<Time::HiRes::usleep()>, +C<Time::HiRes::nanosleep()>, or C<Time::HiRes::sleep()>. +If your system lacks both C<ualarm()> and C<setitimer()> you don't get +C<Time::HiRes::ualarm()> or C<Time::HiRes::alarm()>. + +If you try to import an unimplemented function in the C<use> statement +it will fail at compile time. + +If your subsecond sleeping is implemented with C<nanosleep()> instead +of C<usleep()>, you can mix subsecond sleeping with signals since +C<nanosleep()> does not use signals. This, however, is not portable, +and you should first check for the truth value of +C<&Time::HiRes::d_nanosleep> to see whether you have nanosleep, and +then carefully read your C<nanosleep()> C API documentation for any +peculiarities. + +If you are using C<nanosleep> for something else than mixing sleeping +with signals, give some thought to whether Perl is the tool you should +be using for work requiring nanosecond accuracies. + +The following functions can be imported from this module. +No functions are exported by default. + +=over 4 + +=item gettimeofday () + +In array context returns a two-element array with the seconds and +microseconds since the epoch. In scalar context returns floating +seconds like C<Time::HiRes::time()> (see below). + +=item usleep ( $useconds ) + +Sleeps for the number of microseconds (millionths of a second) +specified. Returns the number of microseconds actually slept. Can +sleep for more than one second, unlike the C<usleep> system call. Can +also sleep for zero seconds, which often works like a I<thread yield>. +See also C<Time::HiRes::usleep()>, C<Time::HiRes::sleep()>, and +C<Time::HiRes::clock_nanosleep()>. + +Do not expect usleep() to be exact down to one microsecond. + +=item nanosleep ( $nanoseconds ) + +Sleeps for the number of nanoseconds (1e9ths of a second) specified. +Returns the number of nanoseconds actually slept (accurate only to +microseconds, the nearest thousand of them). Can sleep for more than +one second. Can also sleep for zero seconds, which often works like a +I<thread yield>. See also C<Time::HiRes::sleep()>, +C<Time::HiRes::usleep()>, and C<Time::HiRes::clock_nanosleep()>. + +Do not expect nanosleep() to be exact down to one nanosecond. +Getting even accuracy of one thousand nanoseconds is good. + +=item ualarm ( $useconds [, $interval_useconds ] ) + +Issues a C<ualarm> call; the C<$interval_useconds> is optional and +will be zero if unspecified, resulting in C<alarm>-like behaviour. + +Note that the interaction between alarms and sleeps is unspecified. + +=item tv_interval + +tv_interval ( $ref_to_gettimeofday [, $ref_to_later_gettimeofday] ) + +Returns the floating seconds between the two times, which should have +been returned by C<gettimeofday()>. If the second argument is omitted, +then the current time is used. + +=item time () + +Returns a floating seconds since the epoch. This function can be +imported, resulting in a nice drop-in replacement for the C<time> +provided with core Perl; see the L</EXAMPLES> below. + +B<NOTE 1>: This higher resolution timer can return values either less +or more than the core C<time()>, depending on whether your platform +rounds the higher resolution timer values up, down, or to the nearest second +to get the core C<time()>, but naturally the difference should be never +more than half a second. See also L</clock_getres>, if available +in your system. + +B<NOTE 2>: Since Sunday, September 9th, 2001 at 01:46:40 AM GMT, when +the C<time()> seconds since epoch rolled over to 1_000_000_000, the +default floating point format of Perl and the seconds since epoch have +conspired to produce an apparent bug: if you print the value of +C<Time::HiRes::time()> you seem to be getting only five decimals, not +six as promised (microseconds). Not to worry, the microseconds are +there (assuming your platform supports such granularity in the first +place). What is going on is that the default floating point format of +Perl only outputs 15 digits. In this case that means ten digits +before the decimal separator and five after. To see the microseconds +you can use either C<printf>/C<sprintf> with C<"%.6f">, or the +C<gettimeofday()> function in list context, which will give you the +seconds and microseconds as two separate values. + +=item sleep ( $floating_seconds ) + +Sleeps for the specified amount of seconds. Returns the number of +seconds actually slept (a floating point value). This function can +be imported, resulting in a nice drop-in replacement for the C<sleep> +provided with perl, see the L</EXAMPLES> below. + +Note that the interaction between alarms and sleeps is unspecified. + +=item alarm ( $floating_seconds [, $interval_floating_seconds ] ) + +The C<SIGALRM> signal is sent after the specified number of seconds. +Implemented using C<ualarm()>. The C<$interval_floating_seconds> argument +is optional and will be zero if unspecified, resulting in C<alarm()>-like +behaviour. This function can be imported, resulting in a nice drop-in +replacement for the C<alarm> provided with perl, see the L</EXAMPLES> below. + +B<NOTE 1>: With some combinations of operating systems and Perl +releases C<SIGALRM> restarts C<select()>, instead of interrupting it. +This means that an C<alarm()> followed by a C<select()> may together +take the sum of the times specified for the the C<alarm()> and the +C<select()>, not just the time of the C<alarm()>. + +Note that the interaction between alarms and sleeps is unspecified. + +=item setitimer ( $which, $floating_seconds [, $interval_floating_seconds ] ) + +Start up an interval timer: after a certain time, a signal arrives, +and more signals may keep arriving at certain intervals. To disable +an "itimer", use C<$floating_seconds> of zero. If the +C<$interval_floating_seconds> is set to zero (or unspecified), the +timer is disabled B<after> the next delivered signal. + +Use of interval timers may interfere with C<alarm()>, C<sleep()>, +and C<usleep()>. In standard-speak the "interaction is unspecified", +which means that I<anything> may happen: it may work, it may not. + +In scalar context, the remaining time in the timer is returned. + +In list context, both the remaining time and the interval are returned. + +There are usually three or four interval timers available: the +C<$which> can be C<ITIMER_REAL>, C<ITIMER_VIRTUAL>, C<ITIMER_PROF>, or +C<ITIMER_REALPROF>. Note that which ones are available depends: true +UNIX platforms usually have the first three, but (for example) Win32 +and Cygwin have only C<ITIMER_REAL>, and only Solaris seems to have +C<ITIMER_REALPROF> (which is used to profile multithreaded programs). + +C<ITIMER_REAL> results in C<alarm()>-like behaviour. Time is counted in +I<real time>; that is, wallclock time. C<SIGALRM> is delivered when +the timer expires. + +C<ITIMER_VIRTUAL> counts time in (process) I<virtual time>; that is, +only when the process is running. In multiprocessor/user/CPU systems +this may be more or less than real or wallclock time. (This time is +also known as the I<user time>.) C<SIGVTALRM> is delivered when the +timer expires. + +C<ITIMER_PROF> counts time when either the process virtual time or when +the operating system is running on behalf of the process (such as I/O). +(This time is also known as the I<system time>.) (The sum of user +time and system time is known as the I<CPU time>.) C<SIGPROF> is +delivered when the timer expires. C<SIGPROF> can interrupt system calls. + +The semantics of interval timers for multithreaded programs are +system-specific, and some systems may support additional interval +timers. See your C<setitimer()> documentation. + +=item getitimer ( $which ) + +Return the remaining time in the interval timer specified by C<$which>. + +In scalar context, the remaining time is returned. + +In list context, both the remaining time and the interval are returned. +The interval is always what you put in using C<setitimer()>. + +=item clock_gettime ( $which ) + +Return as seconds the current value of the POSIX high resolution timer +specified by C<$which>. All implementations that support POSIX high +resolution timers are supposed to support at least the C<$which> value +of C<CLOCK_REALTIME>, which is supposed to return results close to the +results of C<gettimeofday>, or the number of seconds since 00:00:00:00 +January 1, 1970 Greenwich Mean Time (GMT). Do not assume that +CLOCK_REALTIME is zero, it might be one, or something else. +Another potentially useful (but not available everywhere) value is +C<CLOCK_MONOTONIC>, which guarantees a monotonically increasing time +value (unlike time(), which can be adjusted). See your system +documentation for other possibly supported values. + +=item clock_getres ( $which ) + +Return as seconds the resolution of the POSIX high resolution timer +specified by C<$which>. All implementations that support POSIX high +resolution timers are supposed to support at least the C<$which> value +of C<CLOCK_REALTIME>, see L</clock_gettime>. + +=item clock_nanosleep ( $which, $seconds, $flags = 0) + +Sleeps for the number of seconds (1e9ths of a second) specified. +Returns the number of seconds actually slept. The $which is the +"clock id", as with clock_gettime() and clock_getres(). The flags +default to zero but C<TIMER_ABSTIME> can specified (must be exported +explicitly) which means that C<$nanoseconds> is not a time interval +(as is the default) but instead an absolute time. Can sleep for more +than one second. Can also sleep for zero seconds, which often works +like a I<thread yield>. See also C<Time::HiRes::sleep()>, +C<Time::HiRes::usleep()>, and C<Time::HiRes::nanosleep()>. + +Do not expect clock_nanosleep() to be exact down to one nanosecond. +Getting even accuracy of one thousand nanoseconds is good. + +=item clock() + +Return as seconds the I<process time> (user + system time) spent by +the process since the first call to clock() (the definition is B<not> +"since the start of the process", though if you are lucky these times +may be quite close to each other, depending on the system). What this +means is that you probably need to store the result of your first call +to clock(), and subtract that value from the following results of clock(). + +The time returned also includes the process times of the terminated +child processes for which wait() has been executed. This value is +somewhat like the second value returned by the times() of core Perl, +but not necessarily identical. Note that due to backward +compatibility limitations the returned value may wrap around at about +2147 seconds or at about 36 minutes. + +=back + +=head1 EXAMPLES + + use Time::HiRes qw(usleep ualarm gettimeofday tv_interval); + + $microseconds = 750_000; + usleep($microseconds); + + # signal alarm in 2.5s & every .1s thereafter + ualarm(2_500_000, 100_000); + + # get seconds and microseconds since the epoch + ($s, $usec) = gettimeofday(); + + # measure elapsed time + # (could also do by subtracting 2 gettimeofday return values) + $t0 = [gettimeofday]; + # do bunch of stuff here + $t1 = [gettimeofday]; + # do more stuff here + $t0_t1 = tv_interval $t0, $t1; + + $elapsed = tv_interval ($t0, [gettimeofday]); + $elapsed = tv_interval ($t0); # equivalent code + + # + # replacements for time, alarm and sleep that know about + # floating seconds + # + use Time::HiRes; + $now_fractions = Time::HiRes::time; + Time::HiRes::sleep (2.5); + Time::HiRes::alarm (10.6666666); + + use Time::HiRes qw ( time alarm sleep ); + $now_fractions = time; + sleep (2.5); + alarm (10.6666666); + + # Arm an interval timer to go off first at 10 seconds and + # after that every 2.5 seconds, in process virtual time + + use Time::HiRes qw ( setitimer ITIMER_VIRTUAL time ); + + $SIG{VTALRM} = sub { print time, "\n" }; + setitimer(ITIMER_VIRTUAL, 10, 2.5); + + use Time::HiRes qw( clock_gettime clock_getres CLOCK_REALTIME ); + # Read the POSIX high resolution timer. + my $high = clock_getres(CLOCK_REALTIME); + # But how accurate we can be, really? + my $reso = clock_getres(CLOCK_REALTIME); + + use Time::HiRes qw( clock_nanosleep TIMER_ABSTIME ); + clock_nanosleep(CLOCK_REALTIME, 1e6); + clock_nanosleep(CLOCK_REALTIME, 2e9, TIMER_ABSTIME); + + use Time::HiRes qw( clock ); + my $clock0 = clock(); + ... # Do something. + my $clock1 = clock(); + my $clockd = $clock1 - $clock0; + +=head1 C API + +In addition to the perl API described above, a C API is available for +extension writers. The following C functions are available in the +modglobal hash: + + name C prototype + --------------- ---------------------- + Time::NVtime double (*)() + Time::U2time void (*)(pTHX_ UV ret[2]) + +Both functions return equivalent information (like C<gettimeofday>) +but with different representations. The names C<NVtime> and C<U2time> +were selected mainly because they are operating system independent. +(C<gettimeofday> is Unix-centric, though some platforms like Win32 and +VMS have emulations for it.) + +Here is an example of using C<NVtime> from C: + + double (*myNVtime)(); /* Returns -1 on failure. */ + SV **svp = hv_fetch(PL_modglobal, "Time::NVtime", 12, 0); + if (!svp) croak("Time::HiRes is required"); + if (!SvIOK(*svp)) croak("Time::NVtime isn't a function pointer"); + myNVtime = INT2PTR(double(*)(), SvIV(*svp)); + printf("The current time is: %f\n", (*myNVtime)()); + +=head1 DIAGNOSTICS + +=head2 negative time not invented yet + +You tried to use a negative time argument. + +=head2 internal error: useconds < 0 (unsigned ... signed ...) + +Something went horribly wrong-- the number of microseconds that cannot +become negative just became negative. Maybe your compiler is broken? + +=head1 CAVEATS + +Notice that the core C<time()> maybe rounding rather than truncating. +What this means is that the core C<time()> may be reporting the time +as one second later than C<gettimeofday()> and C<Time::HiRes::time()>. + +Adjusting the system clock (either manually or by services like ntp) +may cause problems, especially for long running programs that assume +a monotonously increasing time (note that all platforms do not adjust +time as gracefully as UNIX ntp does). For example in Win32 (and derived +platforms like Cygwin and MinGW) the Time::HiRes::time() may temporarily +drift off from the system clock (and the original time()) by up to 0.5 +seconds. Time::HiRes will notice this eventually and recalibrate. +Note that since Time::HiRes 1.77 the clock_gettime(CLOCK_MONOTONIC) +might help in this (in case your system supports CLOCK_MONOTONIC). + +=head1 SEE ALSO + +Perl modules L<BSD::Resource>, L<Time::TAI64>. + +Your system documentation for C<clock_gettime>, C<clock_settime>, +C<gettimeofday>, C<getitimer>, C<setitimer>, C<ualarm>. + +=head1 AUTHORS + +D. Wegscheid <wegscd@whirlpool.com> +R. Schertler <roderick@argon.org> +J. Hietaniemi <jhi@iki.fi> +G. Aas <gisle@aas.no> + +=head1 COPYRIGHT AND LICENSE + +Copyright (c) 1996-2002 Douglas E. Wegscheid. All rights reserved. + +Copyright (c) 2002, 2003, 2004, 2005 Jarkko Hietaniemi. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Time/Local.pm b/Master/tlpkg/tlperl.old/lib/Time/Local.pm new file mode 100644 index 00000000000..912f17d0310 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Time/Local.pm @@ -0,0 +1,366 @@ +package Time::Local; + +require Exporter; +use Carp; +use Config; +use strict; +use integer; + +use vars qw( $VERSION @ISA @EXPORT @EXPORT_OK ); +$VERSION = '1.11'; +$VERSION = eval $VERSION; +@ISA = qw( Exporter ); +@EXPORT = qw( timegm timelocal ); +@EXPORT_OK = qw( timegm_nocheck timelocal_nocheck ); + +my @MonthDays = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); + +# Determine breakpoint for rolling century +my $ThisYear = (localtime())[5]; +my $Breakpoint = ($ThisYear + 50) % 100; +my $NextCentury = $ThisYear - $ThisYear % 100; + $NextCentury += 100 if $Breakpoint < 50; +my $Century = $NextCentury - 100; +my $SecOff = 0; + +my (%Options, %Cheat, %Min, %Max); +my ($MinInt, $MaxInt); + +if ($^O eq 'MacOS') { + # time_t is unsigned... + $MaxInt = (1 << (8 * $Config{intsize})) - 1; + $MinInt = 0; +} else { + $MaxInt = ((1 << (8 * $Config{intsize} - 2))-1)*2 + 1; + $MinInt = -$MaxInt - 1; + + # On Win32 (and others?) time_t appears to be signed, but negative + # epochs still don't work. - XXX - this is experimental + $MinInt = 0 + unless defined ((localtime(-1))[0]); +} + +$Max{Day} = ($MaxInt >> 1) / 43200; +$Min{Day} = $MinInt ? -($Max{Day} + 1) : 0; + +$Max{Sec} = $MaxInt - 86400 * $Max{Day}; +$Min{Sec} = $MinInt - 86400 * $Min{Day}; + +# Determine the EPOC day for this machine +my $Epoc = 0; +if ($^O eq 'vos') { +# work around posix-977 -- VOS doesn't handle dates in +# the range 1970-1980. + $Epoc = _daygm((0, 0, 0, 1, 0, 70, 4, 0)); +} +elsif ($^O eq 'MacOS') { + no integer; + + # MacOS time() is seconds since 1 Jan 1904, localtime + # so we need to calculate an offset to apply later + $Epoc = 693901; + $SecOff = timelocal(localtime(0)) - timelocal(gmtime(0)); + $Epoc += _daygm(gmtime(0)); +} +else { + $Epoc = _daygm(gmtime(0)); +} + +%Cheat=(); # clear the cache as epoc has changed + +sub _daygm { + $_[3] + ($Cheat{pack("ss",@_[4,5])} ||= do { + my $month = ($_[4] + 10) % 12; + my $year = $_[5] + 1900 - $month/10; + 365*$year + $year/4 - $year/100 + $year/400 + ($month*306 + 5)/10 - $Epoc + }); +} + + +sub _timegm { + my $sec = $SecOff + $_[0] + 60 * $_[1] + 3600 * $_[2]; + + no integer; + + $sec + 86400 * &_daygm; +} + + +sub _zoneadjust { + my ($day, $sec, $time) = @_; + + $sec = $sec + _timegm(localtime($time)) - $time; + if ($sec >= 86400) { $day++; $sec -= 86400; } + if ($sec < 0) { $day--; $sec += 86400; } + + ($day, $sec); +} + + +sub timegm { + my ($sec,$min,$hour,$mday,$month,$year) = @_; + + if ($year >= 1000) { + $year -= 1900; + } + elsif ($year < 100 and $year >= 0) { + $year += ($year > $Breakpoint) ? $Century : $NextCentury; + } + + unless ($Options{no_range_check}) { + if (abs($year) >= 0x7fff) { + $year += 1900; + croak "Cannot handle date ($sec, $min, $hour, $mday, $month, *$year*)"; + } + + croak "Month '$month' out of range 0..11" if $month > 11 or $month < 0; + + my $md = $MonthDays[$month]; +# ++$md if $month == 1 and $year % 4 == 0 and +# ($year % 100 != 0 or ($year + 1900) % 400 == 0); + ++$md unless $month != 1 or $year % 4 or !($year % 400); + + croak "Day '$mday' out of range 1..$md" if $mday > $md or $mday < 1; + croak "Hour '$hour' out of range 0..23" if $hour > 23 or $hour < 0; + croak "Minute '$min' out of range 0..59" if $min > 59 or $min < 0; + croak "Second '$sec' out of range 0..59" if $sec > 59 or $sec < 0; + } + + my $days = _daygm(undef, undef, undef, $mday, $month, $year); + my $xsec = $sec + $SecOff + 60*$min + 3600*$hour; + + unless ($Options{no_range_check} + or ($days > $Min{Day} or $days == $Min{Day} and $xsec >= $Min{Sec}) + and ($days < $Max{Day} or $days == $Max{Day} and $xsec <= $Max{Sec})) + { + warn "Day too small - $days > $Min{Day}\n" if $days < $Min{Day}; + warn "Day too big - $days > $Max{Day}\n" if $days > $Max{Day}; + warn "Sec too small - $days < $Min{Sec}\n" if $days < $Min{Sec}; + warn "Sec too big - $days > $Max{Sec}\n" if $days > $Max{Sec}; + $year += 1900; + croak "Cannot handle date ($sec, $min, $hour, $mday, $month, $year)"; + } + + no integer; + + $xsec + 86400 * $days; +} + + +sub timegm_nocheck { + local $Options{no_range_check} = 1; + &timegm; +} + + +sub timelocal { + # Adjust Max/Min allowed times to fit local time zone and call timegm + local ($Max{Day}, $Max{Sec}) = _zoneadjust($Max{Day}, $Max{Sec}, $MaxInt); + local ($Min{Day}, $Min{Sec}) = _zoneadjust($Min{Day}, $Min{Sec}, $MinInt); + my $ref_t = &timegm; + + # Calculate first guess with a one-day delta to avoid localtime overflow + my $delta = ($_[5] < 100)? 86400 : -86400; + my $loc_t = _timegm(localtime( $ref_t + $delta )) - $delta; + + # Is there a timezone offset from GMT or are we done + my $zone_off = $ref_t - $loc_t + or return $loc_t; + + # This hack is needed to always pick the first matching time + # during a DST change when time would otherwise be ambiguous + $zone_off -= 3600 if ($delta > 0 && $ref_t >= 3600); + + # Adjust for timezone + $loc_t = $ref_t + $zone_off; + + # Are we close to a DST change or are we done + my $dst_off = $ref_t - _timegm(localtime($loc_t)) + or return $loc_t; + + # Adjust for DST change + $loc_t += $dst_off; + + return $loc_t if $dst_off >= 0; + + # for a negative offset from GMT, and if the original date + # was a non-extent gap in a forward DST jump, we should + # now have the wrong answer - undo the DST adjust; + + my ($s,$m,$h) = localtime($loc_t); + $loc_t -= $dst_off if $s != $_[0] || $m != $_[1] || $h != $_[2]; + + $loc_t; +} + + +sub timelocal_nocheck { + local $Options{no_range_check} = 1; + &timelocal; +} + +1; + +__END__ + +=head1 NAME + +Time::Local - efficiently compute time from local and GMT time + +=head1 SYNOPSIS + + $time = timelocal($sec,$min,$hour,$mday,$mon,$year); + $time = timegm($sec,$min,$hour,$mday,$mon,$year); + +=head1 DESCRIPTION + +These routines are the inverse of built-in perl functions localtime() +and gmtime(). They accept a date as a six-element array, and return +the corresponding time(2) value in seconds since the system epoch +(Midnight, January 1, 1970 GMT on Unix, for example). This value can +be positive or negative, though POSIX only requires support for +positive values, so dates before the system's epoch may not work on +all operating systems. + +It is worth drawing particular attention to the expected ranges for +the values provided. The value for the day of the month is the actual day +(ie 1..31), while the month is the number of months since January (0..11). +This is consistent with the values returned from localtime() and gmtime(). + +The timelocal() and timegm() functions perform range checking on the +input $sec, $min, $hour, $mday, and $mon values by default. If you'd +rather they didn't, you can explicitly import the timelocal_nocheck() +and timegm_nocheck() functions. + + use Time::Local 'timelocal_nocheck'; + + { + # The 365th day of 1999 + print scalar localtime timelocal_nocheck 0,0,0,365,0,99; + + # The twenty thousandth day since 1970 + print scalar localtime timelocal_nocheck 0,0,0,20000,0,70; + + # And even the 10,000,000th second since 1999! + print scalar localtime timelocal_nocheck 10000000,0,0,1,0,99; + } + +Your mileage may vary when trying these with minutes and hours, +and it doesn't work at all for months. + +Strictly speaking, the year should also be specified in a form consistent +with localtime(), i.e. the offset from 1900. +In order to make the interpretation of the year easier for humans, +however, who are more accustomed to seeing years as two-digit or four-digit +values, the following conventions are followed: + +=over 4 + +=item * + +Years greater than 999 are interpreted as being the actual year, +rather than the offset from 1900. Thus, 1964 would indicate the year +Martin Luther King won the Nobel prize, not the year 3864. + +=item * + +Years in the range 100..999 are interpreted as offset from 1900, +so that 112 indicates 2012. This rule also applies to years less than zero +(but see note below regarding date range). + +=item * + +Years in the range 0..99 are interpreted as shorthand for years in the +rolling "current century," defined as 50 years on either side of the current +year. Thus, today, in 1999, 0 would refer to 2000, and 45 to 2045, +but 55 would refer to 1955. Twenty years from now, 55 would instead refer +to 2055. This is messy, but matches the way people currently think about +two digit dates. Whenever possible, use an absolute four digit year instead. + +=back + +The scheme above allows interpretation of a wide range of dates, particularly +if 4-digit years are used. + +Please note, however, that the range of dates that can be actually be handled +depends on the size of an integer (time_t) on a given platform. +Currently, this is 32 bits for most systems, yielding an approximate range +from Dec 1901 to Jan 2038. + +Both timelocal() and timegm() croak if given dates outside the supported +range. + +=head2 Ambiguous Local Times (DST) + +Because of DST changes, there are many time zones where the same local +time occurs for two different GMT times on the same day. For example, +in the "Europe/Paris" time zone, the local time of 2001-10-28 02:30:00 +can represent either 2001-10-28 00:30:00 GMT, B<or> 2001-10-28 +01:30:00 GMT. + +When given an ambiguous local time, the timelocal() function should +always return the epoch for the I<earlier> of the two possible GMT +times. + +=head2 Non-Existent Local Times (DST) + +When a DST change causes a locale clock to skip one hour forward, +there will be an hour's worth of local times that don't exist. Again, +for the "Europe/Paris" time zone, the local clock jumped from +2001-03-25 01:59:59 to 2001-03-25 03:00:00. + +If the timelocal() function is given a non-existent local time, it +will simply return an epoch value for the time one hour later. + +=head2 Negative Epoch Values + +Negative epoch (time_t) values are not officially supported by the +POSIX standards, so this module's tests do not test them. On some +systems, they are known not to work. These include MacOS (pre-OSX) +and Win32. + +On systems which do support negative epoch values, this module should +be able to cope with dates before the start of the epoch, down the +minimum value of time_t for the system. + +=head1 IMPLEMENTATION + +These routines are quite efficient and yet are always guaranteed to agree +with localtime() and gmtime(). We manage this by caching the start times +of any months we've seen before. If we know the start time of the month, +we can always calculate any time within the month. The start times +are calculated using a mathematical formula. Unlike other algorithms +that do multiple calls to gmtime(). + +timelocal() is implemented using the same cache. We just assume that we're +translating a GMT time, and then fudge it when we're done for the timezone +and daylight savings arguments. Note that the timezone is evaluated for +each date because countries occasionally change their official timezones. +Assuming that localtime() corrects for these changes, this routine will +also be correct. + +=head1 BUGS + +The whole scheme for interpreting two-digit years can be considered a bug. + +=head1 SUPPORT + +Support for this module is provided via the datetime@perl.org +email list. See http://lists.perl.org/ for more details. + +Please submit bugs using the RT system at rt.cpan.org, or as a last +resort, to the datetime@perl.org list. + +=head1 AUTHOR + +This module is based on a Perl 4 library, timelocal.pl, that was +included with Perl 4.036, and was most likely written by Tom +Christiansen. + +The current version was written by Graham Barr. + +It is now being maintained separately from the Perl core by Dave +Rolsky, <autarch@urth.org>. + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Time/gmtime.pm b/Master/tlpkg/tlperl.old/lib/Time/gmtime.pm new file mode 100644 index 00000000000..4e1359b36d9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Time/gmtime.pm @@ -0,0 +1,90 @@ +package Time::gmtime; +use strict; +use 5.006_001; + +use Time::tm; + +our(@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION); +BEGIN { + use Exporter (); + @ISA = qw(Exporter Time::tm); + @EXPORT = qw(gmtime gmctime); + @EXPORT_OK = qw( + $tm_sec $tm_min $tm_hour $tm_mday + $tm_mon $tm_year $tm_wday $tm_yday + $tm_isdst + ); + %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] ); + $VERSION = 1.02; +} +use vars @EXPORT_OK; + +sub populate (@) { + return unless @_; + my $tmob = Time::tm->new(); + @$tmob = ( + $tm_sec, $tm_min, $tm_hour, $tm_mday, + $tm_mon, $tm_year, $tm_wday, $tm_yday, + $tm_isdst ) + = @_; + return $tmob; +} + +sub gmtime (;$) { populate CORE::gmtime(@_ ? shift : time)} +sub gmctime (;$) { scalar CORE::gmtime(@_ ? shift : time)} + +1; +__END__ + +=head1 NAME + +Time::gmtime - by-name interface to Perl's built-in gmtime() function + +=head1 SYNOPSIS + + use Time::gmtime; + $gm = gmtime(); + printf "The day in Greenwich is %s\n", + (qw(Sun Mon Tue Wed Thu Fri Sat Sun))[ gm->wday() ]; + + use Time::gmtime w(:FIELDS; + printf "The day in Greenwich is %s\n", + (qw(Sun Mon Tue Wed Thu Fri Sat Sun))[ gm_wday() ]; + + $now = gmctime(); + + use Time::gmtime; + use File::stat; + $date_string = gmctime(stat($file)->mtime); + +=head1 DESCRIPTION + +This module's default exports override the core gmtime() function, +replacing it with a version that returns "Time::tm" objects. +This object has methods that return the similarly named structure field +name from the C's tm structure from F<time.h>; namely sec, min, hour, +mday, mon, year, wday, yday, and isdst. + +You may also import all the structure fields directly into your namespace +as regular variables using the :FIELDS import tag. (Note that this +still overrides your core functions.) Access these fields as variables +named with a preceding C<tm_> in front their method names. Thus, +C<$tm_obj-E<gt>mday()> corresponds to $tm_mday if you import the fields. + +The gmctime() function provides a way of getting at the +scalar sense of the original CORE::gmtime() function. + +To access this functionality without the core overrides, +pass the C<use> an empty import list, and then access +function functions with their full qualified names. +On the other hand, the built-ins are still available +via the C<CORE::> pseudo-package. + +=head1 NOTE + +While this class is currently implemented using the Class::Struct +module to build a struct-like class, you shouldn't rely upon this. + +=head1 AUTHOR + +Tom Christiansen diff --git a/Master/tlpkg/tlperl.old/lib/Time/localtime.pm b/Master/tlpkg/tlperl.old/lib/Time/localtime.pm new file mode 100644 index 00000000000..c3d9fb36085 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Time/localtime.pm @@ -0,0 +1,86 @@ +package Time::localtime; +use strict; +use 5.006_001; + +use Time::tm; + +our(@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION); +BEGIN { + use Exporter (); + @ISA = qw(Exporter Time::tm); + @EXPORT = qw(localtime ctime); + @EXPORT_OK = qw( + $tm_sec $tm_min $tm_hour $tm_mday + $tm_mon $tm_year $tm_wday $tm_yday + $tm_isdst + ); + %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] ); + $VERSION = 1.02; +} +use vars @EXPORT_OK; + +sub populate (@) { + return unless @_; + my $tmob = Time::tm->new(); + @$tmob = ( + $tm_sec, $tm_min, $tm_hour, $tm_mday, + $tm_mon, $tm_year, $tm_wday, $tm_yday, + $tm_isdst ) + = @_; + return $tmob; +} + +sub localtime (;$) { populate CORE::localtime(@_ ? shift : time)} +sub ctime (;$) { scalar CORE::localtime(@_ ? shift : time) } + +1; + +__END__ + +=head1 NAME + +Time::localtime - by-name interface to Perl's built-in localtime() function + +=head1 SYNOPSIS + + use Time::localtime; + printf "Year is %d\n", localtime->year() + 1900; + + $now = ctime(); + + use Time::localtime; + use File::stat; + $date_string = ctime(stat($file)->mtime); + +=head1 DESCRIPTION + +This module's default exports override the core localtime() function, +replacing it with a version that returns "Time::tm" objects. +This object has methods that return the similarly named structure field +name from the C's tm structure from F<time.h>; namely sec, min, hour, +mday, mon, year, wday, yday, and isdst. + +You may also import all the structure fields directly into your namespace +as regular variables using the :FIELDS import tag. (Note that this still +overrides your core functions.) Access these fields as +variables named with a preceding C<tm_> in front their method names. +Thus, C<$tm_obj-E<gt>mday()> corresponds to $tm_mday if you import +the fields. + +The ctime() function provides a way of getting at the +scalar sense of the original CORE::localtime() function. + +To access this functionality without the core overrides, +pass the C<use> an empty import list, and then access +function functions with their full qualified names. +On the other hand, the built-ins are still available +via the C<CORE::> pseudo-package. + +=head1 NOTE + +While this class is currently implemented using the Class::Struct +module to build a struct-like class, you shouldn't rely upon this. + +=head1 AUTHOR + +Tom Christiansen diff --git a/Master/tlpkg/tlperl.old/lib/Time/tm.pm b/Master/tlpkg/tlperl.old/lib/Time/tm.pm new file mode 100644 index 00000000000..2c308ebb411 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Time/tm.pm @@ -0,0 +1,33 @@ +package Time::tm; +use strict; + +our $VERSION = '1.00'; + +use Class::Struct qw(struct); +struct('Time::tm' => [ + map { $_ => '$' } qw{ sec min hour mday mon year wday yday isdst } +]); + +1; +__END__ + +=head1 NAME + +Time::tm - internal object used by Time::gmtime and Time::localtime + +=head1 SYNOPSIS + +Don't use this module directly. + +=head1 DESCRIPTION + +This module is used internally as a base class by Time::localtime And +Time::gmtime functions. It creates a Time::tm struct object which is +addressable just like's C's tm structure from F<time.h>; namely with sec, +min, hour, mday, mon, year, wday, yday, and isdst. + +This class is an internal interface only. + +=head1 AUTHOR + +Tom Christiansen diff --git a/Master/tlpkg/tlperl.old/lib/Tk.pm b/Master/tlpkg/tlperl.old/lib/Tk.pm new file mode 100644 index 00000000000..deb453172eb --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk.pm @@ -0,0 +1,821 @@ +# +# Copyright (c) 1992-1994 The Regents of the University of California. +# Copyright (c) 1994 Sun Microsystems, Inc. +# Copyright (c) 1995-2004 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or + +# modify it under the same terms as Perl itself, subject +# to additional disclaimer in Tk/license.terms due to partial +# derivation from Tk8.0 sources. +# +package Tk; +require 5.007; +use Tk::Event (); +use AutoLoader qw(AUTOLOAD); +use DynaLoader; +use Cwd(); +use base qw(Exporter DynaLoader); + +*fileevent = \&Tk::Event::IO::fileevent; + +use Encode; +$Tk::encodeStopOnError = Encode::FB_QUIET(); +$Tk::encodeFallback = Encode::FB_PERLQQ(); # Encode::FB_DEFAULT(); + +our %font_encoding = ('jis0208' => 'jis0208-raw', + 'jis0212' => 'jis0212-raw', + 'ksc5601' => 'ksc5601-raw', + 'gb2312' => 'gb2312-raw', + 'unicode' => 'ucs-2le', + ); + +BEGIN { + if($^O eq 'cygwin') + { + require Tk::Config; + $Tk::platform = $Tk::Config::win_arch; + $Tk::platform = 'unix' if $Tk::platform eq 'x'; + } + else + { + $Tk::platform = ($^O eq 'MSWin32') ? $^O : 'unix'; + } +}; + +$Tk::tearoff = 1 if ($Tk::platform eq 'unix'); + + +@EXPORT = qw(Exists Ev exit MainLoop DoOneEvent tkinit); +@EXPORT_OK = qw(NoOp after *widget *event lsearch catch $XS_VERSION + DONT_WAIT WINDOW_EVENTS FILE_EVENTS TIMER_EVENTS + IDLE_EVENTS ALL_EVENTS + NORMAL_BG ACTIVE_BG SELECT_BG + SELECT_FG TROUGH INDICATOR DISABLED BLACK WHITE); +%EXPORT_TAGS = (eventtypes => [qw(DONT_WAIT WINDOW_EVENTS FILE_EVENTS + TIMER_EVENTS IDLE_EVENTS ALL_EVENTS)], + variables => [qw(*widget *event)], + colors => [qw(NORMAL_BG ACTIVE_BG SELECT_BG SELECT_FG + TROUGH INDICATOR DISABLED BLACK WHITE)], + ); + +use strict; +use Carp; + +# Record author's perforce depot record +$Tk::CHANGE = q$Change: 3279 $; + +# $tk_version and $tk_patchLevel are reset by pTk when a mainwindow +# is created, $VERSION is checked by bootstrap +$Tk::version = '8.4'; +$Tk::patchLevel = '8.4'; +$Tk::VERSION = '804.027'; +$Tk::XS_VERSION = $Tk::VERSION; +$Tk::strictMotif = 0; + + +{($Tk::library) = __FILE__ =~ /^(.*)\.pm$/;} +$Tk::library = Tk->findINC('.') unless (defined($Tk::library) && -d $Tk::library); + +$Tk::widget = undef; +$Tk::event = undef; + +use vars qw($inMainLoop); + +bootstrap Tk; + +my $boot_time = timeofday(); + +# This is a workround for Solaris X11 locale handling +Preload(DynaLoader::dl_findfile('-L/usr/openwin/lib','-lX11')) + if (NeedPreload() && -d '/usr/openwin/lib'); + +use Tk::Submethods ('option' => [qw(add get clear readfile)], + 'clipboard' => [qw(clear append)] + ); + +# +# Next few routines are here as perl code as doing caller() +# in XS code is very complicated - so instead C code calls BackTrace +# +sub _backTrace +{ + my $w = shift; + my $i = 1; + my ($pack,$file,$line,$sub) = caller($i++); + while (1) + { + my $loc = "at $file line $line"; + ($pack,$file,$line,$sub) = caller($i++); + last unless defined($sub); + return 1 if $sub eq '(eval)'; + $w->AddErrorInfo("$sub $loc"); + } + return 0; +} + +sub BackTrace +{ + my $w = shift; + return unless (@_ || $@); + my $mess = (@_) ? shift : "$@"; + die "$mess\n" if $w->_backTrace; + # if we get here we are not in an eval so report now + $w->Fail($mess); + $w->idletasks; + die "$mess\n"; +} + +# +# This is a $SIG{__DIE__} handler which does not change the $@ +# string in the way 'croak' does, but rather add to Tk's ErrorInfo. +# It stops at 1st enclosing eval on assumption that the eval +# is part of Tk call process and will add its own context to ErrorInfo +# and then pass on the error. +# +sub __DIE__ +{ + my $mess = shift; + my $w = $Tk::widget; + # Note that if a __DIE__ handler returns it re-dies up the chain. + return unless defined($w) && Exists($w); + # This special message is for exit() as an exception see pTkCallback.c + return if $mess =~/^_TK_EXIT_\(\d+\)/; + return if $w->_backTrace; + # Not in an eval - should not happen +} + +sub XEvent::xy { shift->Info('xy') } + +sub XEvent::AUTOLOAD +{ + my ($meth) = $XEvent::AUTOLOAD =~ /(\w)$/; + no strict 'refs'; + *{$XEvent::AUTOLOAD} = sub { shift->Info($meth) }; + goto &$XEvent::AUTOLOAD; +} + +sub NoOp { } + +sub Ev +{ + if (@_ == 1) + { + my $arg = $_[0]; + return bless (((ref $arg) ? $arg : \$arg), 'Tk::Ev'); + } + else + { + return bless [@_],'Tk::Ev'; + } +} + +sub InitClass +{ + my ($package,$parent) = @_; + croak "Unexpected type of parent $parent" unless(ref $parent); + croak "$parent is not a widget" unless($parent->IsWidget); + my $mw = $parent->MainWindow; + my $hash = $mw->TkHash('_ClassInit_'); + unless (exists $hash->{$package}) + { + $package->Install($mw); + $hash->{$package} = $package->ClassInit($mw); + } +} + +require Tk::Widget; +require Tk::Image; +require Tk::MainWindow; + +sub Exists +{my $w = shift; + return defined($w) && ref($w) && $w->IsWidget && $w->exists; +} + +sub Time_So_Far +{ + return timeofday() - $boot_time; +} + +# Selection* are not autoloaded as names are too long. + +sub SelectionOwn +{my $widget = shift; + selection('own',(@_,$widget)); +} + +sub SelectionOwner +{ + selection('own','-displayof',@_); +} + +sub SelectionClear +{ + selection('clear','-displayof',@_); +} + +sub SelectionExists +{ + selection('exists','-displayof',@_); +} + +sub SelectionHandle +{my $widget = shift; + my $command = pop; + selection('handle',@_,$widget,$command); +} + +sub SplitString +{ + local $_ = shift; + my (@arr, $tmp); + while (/\{([^{}]*)\}|((?:[^\s\\]|\\.)+)/gs) { + if (defined $1) { push @arr, $1 } + else { $tmp = $2 ; $tmp =~ s/\\([\s\\])/$1/g; push @arr, $tmp } + } + # carp '('.join(',',@arr).")"; + return @arr; +} + +sub Methods +{ + my ($package) = caller; + no strict 'refs'; + foreach my $meth (@_) + { + my $name = $meth; + *{$package."::$meth"} = sub { shift->WidgetMethod($name,@_) }; + } +} + +my %dialog = ( tk_chooseColor => 'ColorDialog', + tk_messageBox => 'MessageBox', + tk_getOpenFile => 'FDialog', + tk_getSaveFile => 'FDialog', + tk_chooseDirectory => 'FDialog' +# Slaven claims NI-S's version above does not work +# and provides this +# tk_chooseDirectory => 'DirDialog' + ); + +foreach my $dialog (keys %dialog) + { + no strict 'refs'; + unless (defined &$dialog) + { + my $kind = $dialog; + my $code = \&{"Tk::$dialog{$dialog}"}; + *$dialog = sub { &$code($kind,@_) }; + } + } + +sub MessageBox { + my ($kind,%args) = @_; + require Tk::Dialog; + my $parent = delete $args{'-parent'}; + my $args = \%args; + + $args->{-bitmap} = delete $args->{-icon} if defined $args->{-icon}; + $args->{-text} = delete $args->{-message} if defined $args->{-message}; + $args->{-type} = 'OK' unless defined $args->{-type}; + + my $type; + if (defined($type = delete $args->{-type})) { + delete $args->{-type}; + my @buttons = grep($_,map(ucfirst($_), + split(/(abort|retry|ignore|yes|no|cancel|ok)/, + lc($type)))); + $args->{-buttons} = [@buttons]; + $args->{-default_button} = ucfirst(delete $args->{-default}) if + defined $args->{-default}; + if (not defined $args->{-default_button} and scalar(@buttons) == 1) { + $args->{-default_button} = $buttons[0]; + } + my $md = $parent->Dialog(%$args); + my $an = $md->Show; + $md->destroy; + return $an; + } +} # end messageBox + +sub messageBox +{ + my ($widget,%args) = @_; + # remove in a later version: + if (exists $args{'-text'}) + { + warn "The -text option is deprecated. Please use -message instead"; + if (!exists $args{'-message'}) + { + $args{'-message'} = delete $args{'-text'}; + } + } + $args{'-type'} = (exists $args{'-type'}) ? lc($args{'-type'}) : 'ok'; + $args{'-default'} = lc($args{'-default'}) if (exists $args{'-default'}); + ucfirst tk_messageBox(-parent => $widget, %args); +} + +sub getOpenFile +{ + tk_getOpenFile(-parent => shift,@_); +} + +sub getSaveFile +{ + tk_getSaveFile(-parent => shift,@_); +} + +sub chooseColor +{ + tk_chooseColor(-parent => shift,@_); +} + +sub chooseDirectory +{ + tk_chooseDirectory(-parent => shift,@_); +} + +sub DialogWrapper +{ + my ($method,$kind,%args) = @_; + my $created = 0; + my $w = delete $args{'-parent'}; + if (defined $w) + { + $args{'-popover'} = $w; + } + else + { + $w = MainWindow->new; + $w->withdraw; + $created = 1; + } + my $mw = $w->toplevel; + my $fs = $mw->{$kind}; + unless (defined $fs) + { + $mw->{$kind} = $fs = $mw->$method(%args); + } + else + { + $fs->configure(%args); + } + my $val = $fs->Show; + $w->destroy if $created; + return $val; +} + +sub ColorDialog +{ + require Tk::ColorEditor; + DialogWrapper('ColorDialog',@_); +} + +sub FDialog +{ + require Tk::FBox; + my $cmd = shift; + if ($cmd =~ /Save/) + { + push @_, -type => 'save'; + } + elsif ($cmd =~ /Directory/) + { + push @_, -type => 'dir'; + } + DialogWrapper('FBox', $cmd, @_); +} + +sub DirDialog +{ + require Tk::DirTree; + DialogWrapper('DirTreeDialog',@_); +} + +*MotifFDialog = \&FDialog; + +*CORE::GLOBAL::exit = \&exit; + +sub MainLoop +{ + unless ($inMainLoop) + { + local $inMainLoop = 1; + while (Tk::MainWindow->Count) + { + DoOneEvent(0); + } + } +} + +sub tkinit { return MainWindow->new(@_) } + +# a wrapper on eval which turns off user $SIG{__DIE__} +sub catch (&) +{ + my $sub = shift; + eval {local $SIG{'__DIE__'}; &$sub }; +} + +my $Home; + +sub TranslateFileName +{ + local $_ = shift; + unless (defined $Home) + { + $Home = $ENV{'HOME'} || (defined $ENV{'HOMEDRIVE'} && defined $ENV{'HOMEPATH'} ? $ENV{'HOMEDRIVE'}.$ENV{'HOMEPATH'} : ""); + $Home =~ s#\\#/#g; + $Home .= '/' unless $Home =~ m#/$#; + } + s#~/#$Home#g; + # warn $_; + return $_; +} + +sub findINC +{ + my $file = join('/',@_); + my $dir; + $file =~ s,::,/,g; + foreach $dir (@INC) + { + my $path; + return $path if (-e ($path = "$dir/$file")); + } + return undef; +} + +sub idletasks +{ + shift->update('idletasks'); +} + +sub backtrace +{ + my ($self,$msg,$i) = @_; + $i = 1 if @_ < 3; + while (1) + { + my ($pack,$file,$line,$sub) = caller($i++); + last unless defined($sub); + $msg .= "\n $sub at $file line $line"; + } + return "$msg\n"; +} + +sub die_with_trace +{ + my ($self,$msg) = @_; + die $self->backtrace($msg,1); +} + + + +1; + +__END__ + +sub Error +{my $w = shift; + my $error = shift; + if (Exists($w)) + { + my $grab = $w->grab('current'); + $grab->Unbusy if (defined $grab); + } + chomp($error); + warn "Tk::Error: $error\n " . join("\n ",@_)."\n"; +} + +sub CancelRepeat +{ + my $w = shift->MainWindow; + my $id = delete $w->{_afterId_}; + $w->after('cancel',$id) if (defined $id); +} + +sub RepeatId +{ + my ($w,$id) = @_; + $w = $w->MainWindow; + $w->CancelRepeat; + $w->{_afterId_} = $id; +} + + + +#---------------------------------------------------------------------------- +# focus.tcl -- +# +# This file defines several procedures for managing the input +# focus. +# +# @(#) focus.tcl 1.6 94/12/19 17:06:46 +# +# Copyright (c) 1994 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +sub FocusChildren { shift->children } + +# +# focusNext -- +# This procedure is invoked to move the input focus to the next window +# after a given one. "Next" is defined in terms of the window +# stacking order, with all the windows underneath a given top-level +# (no matter how deeply nested in the hierarchy) considered except +# for frames and toplevels. +# +# Arguments: +# w - Name of a window: the procedure will set the focus +# to the next window after this one in the traversal +# order. +sub focusNext +{ + my $w = shift; + my $cur = $w; + while (1) + { + # Descend to just before the first child of the current widget. + my $parent = $cur; + my @children = $cur->FocusChildren(); + my $i = -1; + # Look for the next sibling that isn't a top-level. + while (1) + { + $i += 1; + if ($i < @children) + { + $cur = $children[$i]; + next if ($cur->toplevel == $cur); + last + } + # No more siblings, so go to the current widget's parent. + # If it's a top-level, break out of the loop, otherwise + # look for its next sibling. + $cur = $parent; + last if ($cur->toplevel() == $cur); + $parent = $parent->parent(); + @children = $parent->FocusChildren(); + $i = lsearch(\@children,$cur); + } + if ($cur == $w || $cur->FocusOK) + { + $cur->tabFocus; + return; + } + } +} +# focusPrev -- +# This procedure is invoked to move the input focus to the previous +# window before a given one. "Previous" is defined in terms of the +# window stacking order, with all the windows underneath a given +# top-level (no matter how deeply nested in the hierarchy) considered. +# +# Arguments: +# w - Name of a window: the procedure will set the focus +# to the previous window before this one in the traversal +# order. +sub focusPrev +{ + my $w = shift; + my $cur = $w; + my @children; + my $i; + my $parent; + while (1) + { + # Collect information about the current window's position + # among its siblings. Also, if the window is a top-level, + # then reposition to just after the last child of the window. + if ($cur->toplevel() == $cur) + { + $parent = $cur; + @children = $cur->FocusChildren(); + $i = @children; + } + else + { + $parent = $cur->parent(); + @children = $parent->FocusChildren(); + $i = lsearch(\@children,$cur); + } + # Go to the previous sibling, then descend to its last descendant + # (highest in stacking order. While doing this, ignore top-levels + # and their descendants. When we run out of descendants, go up + # one level to the parent. + while ($i > 0) + { + $i--; + $cur = $children[$i]; + next if ($cur->toplevel() == $cur); + $parent = $cur; + @children = $parent->FocusChildren(); + $i = @children; + } + $cur = $parent; + if ($cur == $w || $cur->FocusOK) + { + $cur->tabFocus; + return; + } + } + +} + +sub FocusOK +{ + my $w = shift; + my $value; + catch { $value = $w->cget('-takefocus') }; + if (!$@ && defined($value)) + { + return 0 if ($value eq '0'); + return $w->viewable if ($value eq '1'); + if ($value) + { + $value = $w->$value(); + return $value if (defined $value); + } + } + if (!$w->viewable) + { + return 0; + } + catch { $value = $w->cget('-state') } ; + if (!$@ && defined($value) && $value eq 'disabled') + { + return 0; + } + $value = grep(/Key|Focus/,$w->Tk::bind(),$w->Tk::bind(ref($w))); + return $value; +} + + +# focusFollowsMouse +# +# If this procedure is invoked, Tk will enter "focus-follows-mouse" +# mode, where the focus is always on whatever window contains the +# mouse. If this procedure isn't invoked, then the user typically +# has to click on a window to give it the focus. +# +# Arguments: +# None. + +sub EnterFocus +{ + my $w = shift; + return unless $w; + my $Ev = $w->XEvent; + my $d = $Ev->d; + $w->Tk::focus() if ($d eq 'NotifyAncestor' || $d eq 'NotifyNonlinear' || $d eq 'NotifyInferior'); +} + +sub tabFocus +{ + shift->Tk::focus; +} + +sub focusFollowsMouse +{ + my $widget = shift; + $widget->bind('all','<Enter>','EnterFocus'); +} + +# tkTraverseToMenu -- +# This procedure implements keyboard traversal of menus. Given an +# ASCII character "char", it looks for a menubutton with that character +# underlined. If one is found, it posts the menubutton's menu +# +# Arguments: +# w - Window in which the key was typed (selects +# a toplevel window). +# char - Character that selects a menu. The case +# is ignored. If an empty string, nothing +# happens. +sub TraverseToMenu +{ + my $w = shift; + my $char = shift; + return unless(defined $char && $char ne ''); + $w = $w->toplevel->FindMenu($char); +} +# tkFirstMenu -- +# This procedure traverses to the first menubutton in the toplevel +# for a given window, and posts that menubutton's menu. +# +# Arguments: +# w - Name of a window. Selects which toplevel +# to search for menubuttons. +sub FirstMenu +{ + my $w = shift; + $w = $w->toplevel->FindMenu(''); +} + +# These wrappers don't use method syntax so need to live +# in same package as raw Tk routines are newXS'ed into. + +sub Selection +{my $widget = shift; + my $cmd = shift; + croak 'Use SelectionOwn/SelectionOwner' if ($cmd eq 'own'); + croak "Use Selection\u$cmd()"; +} + +# If we have sub Clipboard in Tk then use base qw(Tk::Clipboard ....) +# calls it when it does its eval "require $base" +#sub Clipboard +#{my $w = shift; +# my $cmd = shift; +# croak "Use clipboard\u$cmd()"; +#} + +sub Receive +{ + my $w = shift; + warn 'Receive(' . join(',',@_) .')'; + die 'Tk rejects send(' . join(',',@_) .")\n"; +} + +sub break +{ + die "_TK_BREAK_\n"; +} + +sub updateWidgets +{ + my ($w) = @_; + while ($w->DoOneEvent(DONT_WAIT|IDLE_EVENTS|WINDOW_EVENTS)) + { + } + $w; +} + +sub ImageNames +{ + image('names'); +} + +sub ImageTypes +{ + image('types'); +} + +sub interps +{ + my $w = shift; + return $w->winfo('interps','-displayof'); +} + +sub lsearch +{my $ar = shift; + my $x = shift; + my $i; + for ($i = 0; $i < scalar @$ar; $i++) + { + return $i if ($$ar[$i] eq $x); + } + return -1; +} + + +sub getEncoding +{ + my ($class,$name) = @_; + eval { require Encode }; + if ($@) + { + require Tk::DummyEncode; + return Tk::DummyEncode->getEncoding($name); + } + $name = $Tk::font_encoding{$name} if exists $Tk::font_encoding{$name}; + my $enc = Encode::find_encoding($name); + + unless ($enc) + { + $enc = Encode::find_encoding($name) if ($name =~ s/[-_]\d+$//) + } +# if ($enc) +# { +# print STDERR "Lookup '$name' => ".$enc->name."\n"; +# } +# else +# { +# print STDERR "Failed '$name'\n"; +# } + unless ($enc) + { + if ($name eq 'X11ControlChars') + { + require Tk::DummyEncode; + $Encode::encoding{$name} = $enc = Tk::DummyEncode->getEncoding($name); + } + } + return $enc; +} + + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Adjuster.pm b/Master/tlpkg/tlperl.old/lib/Tk/Adjuster.pm new file mode 100644 index 00000000000..382ec6db6f9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Adjuster.pm @@ -0,0 +1,436 @@ +package Tk::Adjuster; + +use vars qw($VERSION); +$VERSION = '4.007'; # $Id: //depot/Tkutf8/Tk/Adjuster.pm#7 $ + +use base qw(Tk::Frame); + +# We cannot do this : + +# Construct Tk::Widget 'packAdjust'; + +# because if managed object is Derived (e.g. a Scrolled) then our 'new' +# will be delegated and hierachy gets turned inside-out +# So packAdjust is autoloaded in Widget.pm + + +Construct Tk::Widget qw(Adjuster); + +{package Tk::Adjuster::Item; + +use strict; +use base qw(Tk::Frame); + +sub ClassInit +{ + my ($class,$mw) = @_; + $mw->bind($class,'<1>',['BDown', 1]); + $mw->bind($class,'<Shift-1>',['BDown', 0]); + $mw->bind($class,'<B1-Motion>',['Motion',1]); + $mw->bind($class,'<Shift-B1-Motion>',['Motion',0]); + $mw->bind($class,'<ButtonRelease-1>',['Motion',0]); + return $class; +} + +sub BDown +{ + my($w, $delay_mask) = @_; + $w->{'start_x'} = $w->XEvent->x; + $w->{'start_y'} = $w->XEvent->y; + my $adj = $w->Parent; + delete $adj->{'lin_info'}; + my $delay = $delay_mask && $adj->cget('-delay'); + if ($delay) + { + $adj->vert ? $adj->delta_width_bar(0) : $adj->delta_height_bar(0); + } +} + +sub Motion +{ + my($w, $delay_mask) = @_; + my $ev = $w->XEvent; + my $adj = $w->Parent; + + my $delay = $delay_mask && $adj->cget('-delay'); + if ($adj->vert) + { + my $dx = $ev->x - $w->{'start_x'}; + $delay ? $adj->delta_width_bar($dx) : $adj->delta_width($dx); + } + else + { + my $dy = $ev->y - $w->{'start_y'}; + $delay ? $adj->delta_height_bar($dy) : $adj->delta_height($dy); + } +} + +} + + + +sub packAfter +{ + my ($w,$s,%args) = @_; + my $side = $args{'-side'} ? $args{'-side'} : 'top'; + $w->configure(-side => $side, -widget => $s); + $w->packed($s, %args); +} + +sub packForget +{ + my ($w,$forget_slave) = @_; + $w->Tk::Widget::packForget; + $w->slave->packForget if $forget_slave; +} + +# Called by Tk::Widget::packAdjust. It was here before packAfter was added +sub packed +{ + my ($w,$s,%args) = @_; + delete $args{'-before'}; + delete $args{'-in'}; + $args{'-expand'} = 0; + $args{'-after'} = $s; + $args{'-fill'} = (($w->vert) ? 'y' : 'x'); + $w->pack(%args); +} + +sub gridded +{ + my ($w,$s,%args) = @_; + # delete $args{'-before'}; + # $args{'-expand'} = 0; + # $args{'-after'} = $s; + # $args{'-fill'} = (($w->vert) ? 'y' : 'x'); + $w->grid(%args); +} + +sub ClassInit +{ + my ($class,$mw) = @_; + $mw->bind($class,'<Configure>','SizeChange'); + $mw->bind($class,'<Unmap>','Restore'); + $mw->bind($class,'<Map>','Mapped'); + return $class; +} + +sub SizeChange +{ + my $w = shift; + # reqwidth/height of Adjuster is stored here. If it is partially pushed out + # of the window, then $w->width/height returns that of the visible part. + if ($w->vert) + { + my $sx = ($w->Width - $w->{'sep'}->Width)/2; + $w->{'but'}->place('-x' => 0, '-y' => $w->Height-18); + $w->{'sep'}->place('-x' => $sx, '-y' => 0, -relheight => 1); + $w->configure(-width => $w->{'but'}->ReqWidth); + $w->{'reqwidth'} = $w->reqwidth; + } + else + { + my $sy = ($w->Height - $w->{'sep'}->Height)/2; + $w->{'but'}->place('-x' => $w->Width-18, '-y' => 0); + $w->{'sep'}->place('-x' => 0, '-y' => $sy, -relwidth => 1); + $w->configure(-height => $w->{'but'}->ReqHeight); + $w->{'reqheight'} = $w->reqheight; + } + # Turn off geometry propagation in the slave. Do only if necessary, as this + # causes repacking. + my $s = $w->slave; + $s->packPropagate('0') if $s->packSlaves && $s->packPropagate(); + $s->gridPropagate('0') if $s->gridSlaves && $s->gridPropagate(); +} + +sub Mapped +{ + my $w = shift; + $w->idletasks; + my $m = $w->manager; + if ($m =~ /^(?:pack|grid)$/) + { + my %info = $w->$m('info'); + my $master = $info{'-in'}; + $master->$m('propagate',0); + $w->{'master'} = $master; + } + $w->slave_expand_off; +} + +sub Populate +{ + my ($w,$args) = @_; + $w->SUPER::Populate($args); + $w->{'sep'} = Tk::Adjuster::Item->new($w,-bd => 1, -relief => 'sunken'); + $w->{'but'} = Tk::Adjuster::Item->new($w,-bd => 1, -width => 8, -height => 8, -relief => 'raised'); + + # Need to explicitly set frame width to 0 for Win32 + my $l = $w->{'lin'} = $w->toplevel->Frame(-bd => 0); + + my $cs = $w->ConfigSpecs(-widget => ['PASSIVE','widget','Widget',$w->Parent], + -side => ['METHOD','side','Side','top'], + -delay => ['PASSIVE','delay','Delay', 1], + -background => [['SELF',$w->{'sep'},$w->{'but'}],'background','Background',undef], + -foreground => [Tk::Configure->new($w->{'lin'},'-background'),'foreground','Foreground','black'], + -restore => ['PASSIVE','restore', 'Restore', 1], + ); + $w->_OnDestroy(qw(sep but lin master)); +} + +sub side +{ + my ($w,$val) = @_; + if (@_ > 1) + { + $w->{'side'} = $val; + my $cursor; + if ($w->vert) + { + $cursor = 'sb_h_double_arrow'; + $w->{'sep'}->configure(-width => 2, -height => 10000); + } + else + { + $cursor = 'sb_v_double_arrow'; + $w->{'sep'}->configure(-height => 2, -width => 10000); + } + my $x; + foreach $x ($w->{'sep'},$w->{'but'}) + { + $x->configure(-cursor => $cursor); + } + } + return $w->{'side'}; +} + +sub slave +{ + my $w = shift; + my $s = $w->cget('-widget'); + return $s; +} + +sub vert +{ + my $w = shift; + my $side = $w->cget('-side'); + return 1 if $side eq 'left'; + return -1 if $side eq 'right'; + return 0; +} + +# If the Adjuster gets unmapped, it attempts to restore itself. If its +# slave is mapped, then it reduces the size of the slave so that there is +# then room in the master for the Adjuster widget. +sub Restore +{ + my $w = shift; + return if ! $w->toplevel->IsMapped || + ! $w->slave->IsMapped || + ! $w->cget('-restore'); + $w->vert ? $w->delta_width(0) : $w->delta_height(0); +} + +sub delta_width_bar +{ + my ($w,$dx) = @_; + my $l = $w->{'lin'}; + my $r = $w->{'sep'}; + my $t = $w->toplevel; + my $m = $w->{'master'}; + my $s = $w->slave; + my ($min_rootx, $max_rootx, $t_border); + if (! $w->{'lin_info'}) + { + my $m_border = $m->cget('-bd') + $m->cget('-highlightthickness'); + $t_border = $t->cget('-bd') + $t->cget('-highlightthickness'); + if ($w->cget('-side') eq 'right') + { + $min_rootx = $m->rootx + $m_border; + $max_rootx = $s->rootx + $s->width - 1; + } + else + { + $min_rootx = $s->rootx; + $max_rootx = $m->rootx + $m->width - $m_border - 1; + } + $w->{'lin_info'} = [$min_rootx, $max_rootx, $t_border]; + } + else + { + ($min_rootx, $max_rootx, $t_border) = @{$w->{'lin_info'}}; + } + $l->configure(-width => 1, -height => $w->height) unless $l->IsMapped; + + my $new_rootx = $w->rootx + $w->{'reqwidth'}/2 + $dx; + $new_rootx = $min_rootx if $new_rootx < $min_rootx; + $new_rootx = $max_rootx if $new_rootx > $max_rootx; + my $placex = $new_rootx - $t->rootx - $t_border; + my $placey = $w->rooty - $t->rooty - $t_border; + $l->place(-in => $t, -anchor => 'n', '-x' => $placex, '-y' => $placey); + my $this = $w->containing($new_rootx, $w->rooty + 1); + $l->raise($this) if $this && $this ne $t; +} + +sub delta_width +{ + my ($w,$dx) = @_; + my $l = $w->{'lin'}; + $l->placeForget; + my $s = $w->slave; + if ($s) + { + my $m = $w->{'master'}; + my $m_border = $m->cget('-bd') + $m->cget('-highlightthickness'); + my $w_width = $w->{'reqwidth'}; + my $m_width = $m->width; + my $s_width = $s->width; + my $max_width = $m_width - $w_width; + my $max_s_width; + if ($w->cget('-side') eq 'right') + { + $dx = -$dx; + $max_s_width = $max_width - + ($m->rootx + $m_width - ($s->rootx+$s_width)) - $m_border; + } + else + { + $max_s_width = $max_width - ($s->rootx - $m->rootx) - $m_border; + } + my $new_width = $s_width+$dx; + $new_width = $max_s_width if $new_width > $max_s_width; + $new_width = 0 if $new_width < 0; + $s->GeometryRequest($new_width, $s->height); + } +} + +sub delta_height_bar +{ + my ($w,$dy) = @_; + my $l = $w->{'lin'}; + my $r = $w->{'sep'}; + my $t = $w->toplevel; + my $m = $w->{'master'}; + my $s = $w->slave; + my ($min_rooty, $max_rooty, $t_border); + if (! $w->{'lin_info'}) + { + my $m_border = $m->cget('-bd') + $m->cget('-highlightthickness'); + $t_border = $t->cget('-bd') + $t->cget('-highlightthickness'); + if ($w->cget('-side') eq 'bottom') + { + $min_rooty = $m->rooty + $m_border; + $max_rooty = $s->rooty + $s->height - 1; + } + else + { + $min_rooty = $s->rooty; + $max_rooty = $m->rooty + $m->height - $m_border - 1; + } + $w->{'lin_info'} = [$min_rooty, $max_rooty, $t_border]; + } + else + { + ($min_rooty, $max_rooty, $t_border) = @{$w->{'lin_info'}}; + } + $l->configure(-height => 1, -width => $w->width) unless $l->IsMapped; + + my $new_rooty = $w->rooty + $w->{'reqheight'}/2 + $dy; + $new_rooty = $min_rooty if $new_rooty < $min_rooty; + $new_rooty = $max_rooty if $new_rooty > $max_rooty; + my $placey = $new_rooty - $t->rooty - $t_border; + my $placex = $w->rootx - $t->rootx - $t_border; + $l->place(-in => $t, -anchor => 'w', '-x' => $placex, '-y' => $placey); + my $this = $w->containing($w->rootx + 1, $new_rooty); + $l->raise($this) if $this && $this ne $t; +} + +sub delta_height +{ + my ($w,$dy) = @_; + my $l = $w->{'lin'}; + $l->placeForget; + my $s = $w->slave; + if ($s) + { + my $m = $w->{'master'}; + my $m_border = $m->cget('-bd') + $m->cget('-highlightthickness'); + my $w_height = $w->{'reqheight'}; + my $m_height = $m->height; + my $s_height = $s->height; + my $max_height = $m_height - $w_height; + my $max_s_height; + if ($w->cget('-side') eq 'bottom') + { + $dy = -$dy; + $max_s_height = $max_height - + ($m->rooty + $m_height - ($s->rooty+$s_height)) - $m_border; + } + else + { + $max_s_height = $max_height - ($s->rooty - $m->rooty) - $m_border; + } + my $new_height = $s_height+$dy; + + $new_height = $max_s_height if $new_height > $max_s_height; + $new_height = 0 if $new_height < 0; + $s->GeometryRequest($s->width, $new_height); + } +} + +# Turn off expansion in the slave. +# This is done only if necessary, as calls to pack/gridConfigure cause +# repacking. +# Before call to pack/gridConfigure, the reqwidth/reqheight is set to the +# current width/height. This is because the geometry managers use +# the requested values, not the actual, to calculate the new geometry. +sub slave_expand_off +{ + my $w = shift; + my $s = $w->slave; + return if ! $s; + + my $manager = $s->manager; + if ($manager eq 'pack') + { + my %info = $s->packInfo; + my $expand = $info{'-expand'}; + if ($expand) + { + $s->GeometryRequest($s->width, $s->height); + $s->packConfigure(-expand => 0); + } + } + elsif ($manager eq 'grid') + { + my %info = $s->gridInfo; + my $master = $info{'-in'}; + if ($w->vert) + { + my $col = $info{'-column'}; + my $expand = $master->gridColumnconfigure($col, '-weight'); + if ($expand) + { + $s->GeometryRequest($s->width, $s->height); + $master->gridColumnconfigure($col, -weight => 0); + } + } + else + { + my $row = $info{'-row'}; + my $expand = $master->gridRowconfigure($row, '-weight'); + if ($expand) + { + $s->GeometryRequest($s->width, $s->height); + $master->gridRowconfigure($row, -weight => 0); + } + } + } +} + +1; + +__END__ + +=cut #' emacs hilighting... diff --git a/Master/tlpkg/tlperl.old/lib/Tk/After.pm b/Master/tlpkg/tlperl.old/lib/Tk/After.pm new file mode 100644 index 00000000000..85a0e406ee5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/After.pm @@ -0,0 +1,104 @@ +# Copyright (c) 1995-2004 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::After; +use Carp; + +use vars qw($VERSION); +$VERSION = '4.007'; # $Id: //depot/Tkutf8/Tk/After.pm#11 $ + +sub _cancelAll +{ + my $w = shift; + my $h = delete $w->{_After_}; + foreach my $obj (values %$h) + { + # carp "Auto cancel ".$obj->[1]." for ".$obj->[0]->PathName; + $obj->cancel; + bless $obj,"Tk::After::Cancelled"; + } +} + +sub Tk::After::Cancelled::once { } +sub Tk::After::Cancelled::repeat { } + +sub submit +{ + my $obj = shift; + my $w = $obj->[0]; + my $id = $obj->[1]; + my $t = $obj->[2]; + my $method = $obj->[3]; + delete($w->{_After_}{$id}) if (defined $id); + $id = $w->Tk::after($t,[$method => $obj]); + unless (exists $w->{_After_}) + { + $w->{_After_} = {}; + $w->OnDestroy([\&_cancelAll, $w]); + } + $w->{_After_}{$id} = $obj; + $obj->[1] = $id; + return $obj; +} + +sub DESTROY +{ + my $obj = shift; + $obj->cancel; + undef $obj->[0]; + undef $obj->[4]; +} + +sub new +{ + my ($class,$w,$t,$method,@cb) = @_; + my $cb = (@cb == 1) ? shift(@cb) : [@cb]; + my $obj = bless [$w,undef,$t,$method,Tk::Callback->new($cb)],$class; + return $obj->submit; +} + +sub cancel +{ + my $obj = shift; + my $id = $obj->[1]; + my $w = $obj->[0]; + if ($id) + { + $w->Tk::after('cancel'=> $id) if Tk::Exists($w); + delete $w->{_After_}{$id} if exists $w->{_After_}; + $obj->[1] = undef; + } + return $obj; +} + +sub repeat +{ + my $obj = shift; + $obj->submit; + local $Tk::widget = $obj->[0]; + $obj->[4]->Call; +} + +sub once +{ + my $obj = shift; + my $w = $obj->[0]; + my $id = $obj->[1]; + delete $w->{_After_}{$id}; + local $Tk::widget = $w; + $obj->[4]->Call; +} + +sub time { + my $obj = shift; + my $delay = shift; + if (defined $delay) { + $obj->cancel if $delay == 0; + $obj->[2] = $delay; + } + $obj->[2]; +} + +1; +__END__ + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Animation.pm b/Master/tlpkg/tlperl.old/lib/Tk/Animation.pm new file mode 100644 index 00000000000..428f3f1f48f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Animation.pm @@ -0,0 +1,178 @@ +package Tk::Animation; + +use vars qw($VERSION); +$VERSION = '4.006'; # $Id: //depot/Tkutf8/Tk/Animation.pm#8 $ + +use Tk::Photo; +use base qw(Tk::Photo); + +Construct Tk::Widget 'Animation'; + +sub MainWindow +{ + return shift->{'_MainWIndow_'}; +} + +sub add_frame +{ + my $obj = shift; + $obj->{'_frames_'} = [] unless exists $obj->{'_frames_'}; + push(@{$obj->{'_frames_'}},@_); +} + +sub new +{ + my ($class,$widget,%args) = @_; + my $obj = $class->SUPER::new($widget,%args); + $obj->{'_MainWIndow_'} = $widget->MainWindow; + if ($args{'-format'} eq 'gif') + { + my @images; + local $@; + while (1) + { + my $index = @images; + $args{'-format'} = "gif -index $index"; + my $img; + eval {local $SIG{'__DIE__'}; $img = $class->SUPER::new($widget,%args) }; + last if $@; + push(@images,$img); + } + if (@images > 1) + { + $obj->add_frame(@images); + $obj->{'_frame_index_'} = 0; + } + } + $obj->set_image( 0 ); + $obj->{_delta_} = 1; + $obj->{_blank_} = 0; + return $obj; +} + +sub fast_forward { + + my( $self, $delta) = @_; + + $self->{_delta_} = $delta; + if( not exists $self->{_playing_} ) { + my $playing = exists $self->{'_NextId_'}; + $self->{_playing_} = $playing; + $self->resume_animation if not $playing; + } else { + my $playing = delete $self->{_playing_}; + $self->pause_animation if not $playing; + } + +} # end fast_forward + +*fast_reverse = \&fast_forward; + +sub frame_count { + my $frames = shift->{'_frames_'}; + return -1 unless $frames; + return @$frames; +} + +sub blank { + my( $self, $blank ) = @_; + $blank = 1 if not defined $blank; + $self->{_blank_} = $blank; + $blank; +} + +sub set_image +{ + my ($obj,$index) = @_; + my $frames = $obj->{'_frames_'}; + return unless $frames && @$frames; + $index = 0 unless $index < @$frames; + $obj->blank if $obj->{_blank_}; # helps some make others worse + $obj->copy($frames->[$index]); + $obj->{'_frame_index_'} = $index; +} + +sub next_image +{ + my ($obj, $delta) = @_; + $delta = $obj->{_delta_} unless $delta; + my $frames = $obj->{'_frames_'}; + return unless $frames && @$frames; + $obj->set_image((($obj->{'_frame_index_'} || 0) + $delta) % @$frames); +} + +sub prev_image { shift->next_image( -1 ) } + +sub pause_animation { + my $self = shift; + my $id = delete $self->{'_NextId_'}; + Tk::catch { $id->cancel } if $id; +} + +sub resume_animation { + my( $self, $period ) = @_; + if( not defined $self->{'_period_'} ) { + $self->{'_period_'} = defined( $period ) ? $period : 100; + } + $period = $self->{'_period_'}; + my $w = $self->MainWindow; + $self->{'_NextId_'} = $w->repeat( $period => [ $self => 'next_image' ] ); +} + +sub start_animation +{ + my ($obj,$period) = @_; + $period ||= 100; + my $frames = $obj->{'_frames_'}; + return unless $frames && @$frames; + my $w = $obj->MainWindow; + $obj->stop_animation; + $obj->{'_period_'} = $period; + $obj->{'_NextId_'} = $w->repeat($period,[$obj,'next_image']); +} + +sub stop_animation +{ + my ($obj) = @_; + my $id = delete $obj->{'_NextId_'}; + Tk::catch { $id->cancel } if $id; + $obj->set_image(0); +} + +1; +__END__ + +=cut + +# +# This almost works for changing the animation on the fly +# but does not resize things correctly +# + +sub gif_sequence +{ + my ($obj,%args) = @_; + my $widget = $obj->MainWindow; + my @images; + local $@; + while (1) + { + my $index = @images; + $args{'-format'} = "gif -index $index"; + my $img; + eval + {local $SIG{'__DIE__'}; + my $img = $widget->Photo(%args); + push(@images,$img); + }; + last if $@; + } + if (@images) + { + delete $obj->{'_frames_'}; + $obj->add_frame(@images); + $obj->configure(-width => 0, -height => 0); + $obj->set_frame(0); + } +} + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Balloon.pm b/Master/tlpkg/tlperl.old/lib/Tk/Balloon.pm new file mode 100644 index 00000000000..2ee0f6c3bce --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Balloon.pm @@ -0,0 +1,621 @@ +# +# The help widget that provides both "balloon" and "status bar" +# types of help messages. +# +# This is a patched version of Balloon 3.037 - it adds support +# for different orientations of the balloon widget, depending +# on wether there's enough space for it. The little arrow now +# should always point directly to the client. +# Added by Gerhard Petrowitsch (gerhard.petrowitsch@philips.com) +# +# Nov 1, 2003 - Jack Dunnigan +# Added support for more than one screen in single logical +# screen mode (i.e. xinerama, dual monitors) + +package Tk::Balloon; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #10 $ =~ /\D(\d+)\s*$/; + +use Tk qw(Ev Exists); +use Carp; +require Tk::Toplevel; + +Tk::Widget->Construct('Balloon'); +use base qw(Tk::Toplevel); + +# use UNIVERSAL; avoid the UNIVERSAL.pm file subs are XS in perl core + +use strict; + +my @balloons; +my $button_up = 0; +my %arrows = ( TL => 'R0lGODlhBgAGAJEAANnZ2QAAAP///////yH5BAEAAAAALAAAAAAGAAYAAAINjA0HAEdwLCwMKIQfBQA7', + TR => 'R0lGODlhBgAGAJEAANnZ2QAAAP///////yH5BAEAAAAALAAAAAAGAAYAAAIRBGMDwAEQkgAIAAoCABEEuwAAOw==', + BR => 'R0lGODlhBgAGAJEAANnZ2QAAAP///////yH5BAEAAAAALAAAAAAGAAYAAAIPDOHHhYVRAIgIAEISQLELADs=', + BL => 'R0lGODlhBgAGAJEAANnZ2QAAAP///////yH5BAEAAAAALAAAAAAGAAYAAAIPhB1xAUFALCIMKAaAWQAVADs=', + NO => 'R0lGODlhAQABAJEAANnZ2f///////////yH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==' + ); + + +sub ClassInit { + my ($class, $mw) = @_; + $mw->bind('all', '<Motion>', ['Tk::Balloon::Motion', Ev('X'), Ev('Y'), Ev('s')]); + $mw->bind('all', '<Leave>', ['Tk::Balloon::Motion', Ev('X'), Ev('Y'), Ev('s')]); + $mw->bind('all', '<Button>', 'Tk::Balloon::ButtonDown'); + $mw->bind('all', '<ButtonRelease>', 'Tk::Balloon::ButtonUp'); + return $class; +} + +sub Populate { + my ($w, $args) = @_; + + $w->SUPER::Populate($args); + + $w->overrideredirect(1); + $w->withdraw; + # Only the container frame's background should be black... makes it + # look better. + $w->configure(-background => 'black'); + + # the balloon arrows + $w->{img_tl} = $w->Photo(-data => $arrows{TL}, -format => 'gif'); + $w->{img_tr} = $w->Photo(-data => $arrows{TR}, -format => 'gif'); + $w->{img_bl} = $w->Photo(-data => $arrows{BL}, -format => 'gif'); + $w->{img_br} = $w->Photo(-data => $arrows{BR}, -format => 'gif'); + $w->{img_no} = $w->Photo(-data => $arrows{NO}, -format => 'gif'); + $w->OnDestroy([$w, '_destroyed']); + + $w->{'pointer'} = $w->Label(-bd=>0, -relief=>'flat',-image=>$w->{img_no}); + + # the balloon message + # We give the Label a big borderwidth + # ..enough to slide a 6x6 gif image along the border including some space + + my $ml = $w->Label(-bd => 0, + -padx => 10, + -pady => 3, + -justify => 'left', + -relief=>'flat'); + $w->Advertise('message' => $ml); + + $ml->pack( + -side => 'top', + -anchor => 'nw', + -expand => 1, + -fill => 'both', + -padx => 0, + -pady => 0); + + # append to global list of balloons + push(@balloons, $w); + $w->{'popped'} = 0; + $w->{'buttonDown'} = 0; + $w->{'menu_index'} = 'none'; + $w->{'menu_index_over'} = 'none'; + $w->{'canvas_tag'} = ''; + $w->{'canvas_tag_over'} = ''; + $w->{'current_screen'} = 0; + + $w->ConfigSpecs(-installcolormap => ['PASSIVE', 'installColormap', 'InstallColormap', 0], + -initwait => ['PASSIVE', 'initWait', 'InitWait', 350], + -state => ['PASSIVE', 'state', 'State', 'both'], + -statusbar => ['PASSIVE', 'statusBar', 'StatusBar', undef], + -statusmsg => ['PASSIVE', 'statusMsg', 'StatusMsg', ''], + -balloonmsg => ['PASSIVE', 'balloonMsg', 'BalloonMsg', ''], + -balloonposition => ['PASSIVE', 'balloonPosition', 'BalloonPosition', 'widget'], + -postcommand => ['CALLBACK', 'postCommand', 'PostCommand', undef], + -cancelcommand => ['CALLBACK', 'cancelCommand', 'CancelCommand', undef], + -motioncommand => ['CALLBACK', 'motionCommand', 'MotionCommand', undef], + -background => ['DESCENDANTS', 'background', 'Background', '#C0C080'], + -foreground => ['DESCENDANTS', 'foreground', 'Foreground', undef], + -font => [$ml, 'font', 'Font', '-*-helvetica-medium-r-normal--*-120-*-*-*-*-*-*'], + -borderwidth => ['SELF', 'borderWidth', 'BorderWidth', 1], + -numscreens=>['PASSIVE', 'numScreens','NumScreens',1], + ); +} + +# attach a client to the balloon +sub attach { + my ($w, $client, %args) = @_; + foreach my $key (grep(/command$/,keys %args)) + { + $args{$key} = Tk::Callback->new($args{$key}); + } + my $msg = delete $args{-msg}; + $args{-balloonmsg} = $msg unless exists $args{-balloonmsg}; + $args{-statusmsg} = $msg unless exists $args{-statusmsg}; + $w->{'clients'}{$client} = \%args; + $client->OnDestroy([$w, 'detach', $client]); +} + +# detach a client from the balloon. +sub detach { + my ($w, $client) = @_; + if (Exists($w)) + { + $w->Deactivate if ($client->IS($w->{'client'})); + } + delete $w->{'clients'}{$client}; +} + +sub GetOption +{ + my ($w,$opt,$client) = @_; + $client = $w->{'client'} unless defined $client; + if (defined $client) + { + my $info = $w->{'clients'}{$client}; + return $info->{$opt} if exists $info->{$opt}; + } + return $w->cget($opt); +} + +sub Motion { + my ($ewin, $x, $y, $s) = @_; + + return if not defined $ewin; + + # Find which window we are over + my $over = $ewin->Containing($x, $y); + + return if &grabBad($ewin, $over); + + foreach my $w (@balloons) { + # if cursor has moved over the balloon -- ignore + next if defined $over and $over->toplevel eq $w; + + # find the client window that matches + my $client = $over; + while (defined $client) { + last if (exists $w->{'clients'}{$client}); + $client = $client->Parent; + } + if (defined $client) { + # popping up disabled -- ignore + my $state = $w->GetOption(-state => $client); + next if $state eq 'none'; + # Check if a button was recently released: + my $deactivate = 0; + if ($button_up) { + $deactivate = 1; + $button_up = 0; + } + # Deactivate it if the motioncommand says to: + my $command = $w->GetOption(-motioncommand => $client); + $deactivate = $command->Call($client, $x, $y) if defined $command; + if ($deactivate) + { + $w->Deactivate; + } + else + { + # warn "deact: $client $w->{'client'}"; + $w->Deactivate unless $client->IS($w->{'client'}); + my $msg = $client->BalloonInfo($w,$x,$y,'-statusmsg','-balloonmsg'); + if (defined($msg)) + { + my $delay = delete $w->{'delay'}; + $delay->cancel if defined $delay; + my $initwait = $w->GetOption(-initwait => $client); + $w->{'delay'} = $client->after($initwait, sub {$w->SwitchToClient($client);}); + $w->{'client'} = $client; + } + } + } else { + # cursor is at a position covered by a non client + # pop down the balloon if it is up or scheduled. + $w->Deactivate; + } + } +} + +sub ButtonDown { + my ($ewin) = @_; + + foreach my $w (@balloons) { + $w->Deactivate; + } +} + +sub ButtonUp { + $button_up = 1; +} + +# switch the balloon to a new client +sub SwitchToClient { + my ($w, $client) = @_; + return unless Exists($w); + return unless Exists($client); + return unless $client->IS($w->{'client'}); + return if &grabBad($w, $client); + my $command = $w->GetOption(-postcommand => $client); + if (defined $command) { + # Execute the user's command and return if it returns false: + my $pos = $command->Call($client); + return if not $pos; + if ($pos =~ /^(\d+),(\d+)$/) { + # Save the returned position so the Popup method can use it: + $w->{'clients'}{$client}{'postposition'} = [$1, $2]; + } + } + my $state = $w->GetOption(-state => $client); + $w->Popup if ($state =~ /both|balloon/); + $w->SetStatus if ($state =~ /both|status/); + $w->{'popped'} = 1; + $w->{'delay'} = $w->repeat(200, ['Verify', $w, $client]); +} + +sub grabBad { + + my ($w, $client) = @_; + + return 0 unless Exists($client); + my $g = $w->grabCurrent; + return 0 unless defined $g; + return 0 if $g->isa('Tk::Menu'); + return 0 if $g eq $client; + + # The grab is OK if $client is a decendant of $g. Use the internal Tcl/Tk + # pathname (yes, it's cheating, but it's legal). + + return 0 if $g == $w->MainWindow; + my $wp = $w->PathName; + my $gp = $g->PathName; + return 0 if $wp =~ /^$gp/; + return 1; # bad grab + +} # end grabBad + + +sub Subclient +{ + my ($w,$data) = @_; + if (defined($w->{'subclient'}) && (!defined($data) || $w->{'subclient'} ne $data)) + { + $w->Deactivate; + } + $w->{'subclient'} = $data; +} + +sub Verify { + my $w = shift; + my $client = shift; + my ($X,$Y) = (@_) ? @_ : ($w->pointerxy); + my $over = $w->Containing($X,$Y); + return if not defined $over or ($over->toplevel eq $w); + my $deactivate = # DELETE? or move it to the isa-Menu section?: + # ($over ne $client) or + not $client->IS($w->{'client'}) +# or (!$client->isa('Tk::Menu') && $w->grabCurrent); +# or $w->grabbad($client); + or &grabBad($w, $client); + if ($deactivate) + { + $w->Deactivate; + } + else + { + $client->BalloonInfo($w,$X,$Y,'-statusmsg','-balloonmsg'); + } +} + +sub Deactivate { + my ($w) = @_; + my $delay = delete $w->{'delay'}; + $delay->cancel if defined $delay; + if ($w->{'popped'}) { + my $client = $w->{'client'}; + my $command = $w->GetOption(-cancelcommand => $client); + if (defined $command) { + # Execute the user's command and return if it returns false: + return if not $command->Call($client); + } + $w->withdraw; + $w->ClearStatus; + $w->{'popped'} = 0; + $w->{'menu_index'} = 'none'; + $w->{'canvas_tag'} = ''; + } + $w->{'client'} = undef; + $w->{'subclient'} = undef; + $w->{'location'} = undef; +} + +sub Popup { + my ($w) = @_; + if ($w->cget(-installcolormap)) { + $w->colormapwindows($w->winfo('toplevel')) + } + my $client = $w->{'client'}; + return if not defined $client or not exists $w->{'clients'}{$client}; + my $msg = $client->BalloonInfo($w, $w->pointerxy,'-balloonmsg'); + # Dereference it if it looks like a scalar reference: + $msg = $$msg if UNIVERSAL::isa($msg, 'SCALAR'); + + $w->Subwidget('message')->configure(-text => $msg); + $w->idletasks; + + return unless Exists($w); + return unless Exists($client); + return if $msg eq ''; # Don't popup empty balloons. + + my ($x, $y); + my $pos = $w->GetOption(-balloonposition => $client); + my $postpos = delete $w->{'clients'}{$client}{'postposition'}; + if (defined $postpos) { + # The postcommand must have returned a position for the balloon - I will use that: + ($x,$y) = @{$postpos}; + } elsif ($pos eq 'mouse') { + ($x,$y)=$client->pointerxy; # We adjust the position later + } elsif ($pos eq 'widget') { + $x = int($client->rootx + $client->width/2); + $y = int($client->rooty + int ($client->height/1.3)); + } else { + croak "'$pos' is not a valid position for the balloon - it must be one of: 'widget', 'mouse'."; + } + + $w->idletasks; + + # Explanation of following code. [JD] + # PREMISE: We want to ensure that the balloon is always "on screen". + # To do this we use calculate the size of the + # toplevel before it is mapped. Then we adjust it's position with respect to the + # mouse cursor or widget. Balloons are usually shown below and to the right of the target. + # From extensive KDE experience using Xinerama, and from using dual monitors on WinXP.. + # the balloon will extend across two monitors in single logical screen mode (SLS). + # This is an undesirable characteristic indeed. Trying to read a disjointed balloon + # across monitors is not fun. + # + # The intent of the following code is to fix this problem. We do this by avoiding + # placement of any part of the balloon over,say, the "half screenwidth" mark (for two + # monitors in SLS mode) or "thirds of screenwidth" mark (for 3 monitors) and so on... + # i.e. In SLS mode these *WILL BE* separate screens and as such, should be considered hard + # boundaries to be avoided. + # + # The only drawback of this code, is I know of no way to actually determine this on a + # user by user basis. This means that the developer or administrator will have to know + # the hardware (monitor) setup for which the application is designed. + # + # This code uses Gerhard's GIF images but changes *how* the image gets shown. Instead + # of creating four separate labels, we configure only ONE label with the proper image. + # Then using the place geometry manager, this image/label can be "slid" along the + # appropriate side of the toplevel so that it always points directly at the target widget. + # + # Here we go.. + + my ($width, $height) = ($w->reqwidth, $w->reqheight); + my ($sw, $sh) = ($w->screenwidth, $w->screenheight); + my $numscreen = $w->cget(-numscreens); + my $deltax = $sw/$numscreen; + my $leftedge; + my $rightedge; + my $count = 0; + for (my $i=0; $i<$sw; $i+=$deltax){ + $leftedge = $i; + $rightedge = $i + $deltax; + if ($x >= $leftedge && $x < $rightedge ){ + last; + } + $count++; + } + + # Force another look at balloon location because mouse has switched + # virtual screens. + $w->{'location'} = undef unless ( $count == $w->{'current_screen'} ); + $w->{'current_screen'} = $count; + + my $xx=undef; + my $yy=undef; # to hold final toplevel placement + my $slideOffsetX = 0; + my $slideOffsetY = 0; + my $cornerOffset = 5; #default - keep corner away from pointer + my $testtop = $y - $height - $cornerOffset; + my $testbottom = $y + $height + (2*$cornerOffset); + my $testright = $x + $width + (2*$cornerOffset); + my $testleft = $x - $width - $cornerOffset; + my $vert='bottom'; #default + my $horiz='right'; #default + + + if ( defined $w->{'location'} ){ + # Once balloon is activated, **don't** change the location of the balloon. + # It is annoying to have it jump from one location to another. + ( $w->{'location'}=~/top/ ) ? ( $vert = 'top' ) : ( $vert = 'bottom' ); + ( $w->{'location'}=~/left/ ) ? ( $horiz = 'left' ) : ( $horiz = 'right' ); + + if ($vert eq 'top' && $testtop < 0) { + $yy = 0; + $slideOffsetY = $testtop; + } + elsif ($vert eq 'bottom' && $testbottom > $sh) { + $slideOffsetY = $testbottom - $sh; + } + + if ($horiz eq 'left' && $testleft < $leftedge) { + $xx = $leftedge; + } + elsif ($horiz eq 'right' && $testright > $rightedge) { + $slideOffsetX = $testright - $rightedge; + } + } + else { + #Test balloon positions in the vertical + if ($testbottom > $sh) { + #Then offscreen to bottom, check top + if ($testtop >= 0) { + $vert = 'top'; + } + elsif ($y > $sh/2) { + #still offscreen to top but there is more room above then below + $vert = 'top'; + $yy=0; + $slideOffsetY = $testtop; + } + if ($vert eq 'bottom'){ + #Calculate Yoffset to fit entire balloon onto screen + $slideOffsetY = $testbottom - $sh; + } + } + #Test balloon positions in the horizontal + + if ($testright > $rightedge) { + #The offscreen, check left + if ($testleft >= $leftedge) { + $horiz = 'left'; + } + elsif ($x > ($leftedge+$deltax) ) { + #still offscreen to left but there is more room to left than right + $horiz = 'left'; + $xx=0; + $slideOffsetX = $testleft; + } + if ($horiz eq 'right'){ + #Calculate Xoffset to fit entire balloon onto screen + $slideOffsetX = $testright - $rightedge; + } + } + } + + $w->{'location'} = $vert.$horiz unless (defined $w->{'location'}); + + if ($w->{'location'} eq 'bottomright') { + if ( $slideOffsetX or $slideOffsetY ) { + $w->{'pointer'}->configure(-image => $w->{img_no}); + } + else { + $w->{'pointer'}->configure(-image => $w->{img_tl}); + } + + $w->{'pointer'}->place( + -in=>$w, +# -relx=>0, -x=>$slideOffsetX + 2, +# -rely=>0, -y=>$slideOffsetY + 2, + -relx=>0, -x=>2, + -rely=>0, -y=>2, + -bordermode=>'outside', + -anchor=>'nw'); + + $xx=$x-$slideOffsetX+(2*$cornerOffset) unless (defined $xx); + $yy=$y-$slideOffsetY+(2*$cornerOffset) unless (defined $yy); + + } + elsif ($w->{'location'} eq 'bottomleft') { + if ( $slideOffsetX or $slideOffsetY ) { + $w->{'pointer'}->configure(-image => $w->{img_no}); + } + else { + $w->{'pointer'}->configure(-image => $w->{img_tr}); + } + + $w->{'pointer'}->place(-in=>$w, +# -relx=>1, -x=>$slideOffsetX - 2, +# -rely=>0, -y=>$slideOffsetY + 2, + -relx=>1, -x=>-2, + -rely=>0, -y=>2, + -bordermode=>'outside', + -anchor=>'ne'); + + $xx=$x-$width-$slideOffsetX-$cornerOffset unless (defined $xx); + $yy=$y-$slideOffsetY+(2*$cornerOffset) unless (defined $yy); + + } + elsif ($w->{'location'} eq 'topright') { + if ( $slideOffsetX or $slideOffsetY ) { + $w->{'pointer'}->configure(-image => $w->{img_no}); + } + else { + $w->{'pointer'}->configure(-image => $w->{img_bl}); + } + + $w->{'pointer'}->place(-in=>$w, +# -relx=>0, -x=>$slideOffsetX + 2, +# -rely=>1, -y=>$slideOffsetY - 2, + -relx=>0, -x=>2, + -rely=>1, -y=>-2, + -bordermode=>'outside', + -anchor=>'sw'); + + $xx=$x-$slideOffsetX+$cornerOffset unless (defined $xx); + $yy=$y-$height-$slideOffsetY-$cornerOffset unless (defined $yy); + } + elsif ($w->{'location'} eq 'topleft') { + if ( $slideOffsetX or $slideOffsetY ) { + $w->{'pointer'}->configure(-image => $w->{img_no}); + } + else { + $w->{'pointer'}->configure(-image => $w->{img_br}); + } + + $w->{'pointer'}->place(-in=>$w, +# -relx=>1, -x=>$slideOffsetX - 2, +# -rely=>1, -y=>$slideOffsetY - 2, + -relx=>1, -x=>-2, + -rely=>1, -y=>-2, + -bordermode=>'outside', + -anchor=>'se'); + + $xx=$x-$width-$slideOffsetX-$cornerOffset unless (defined $xx); + $yy=$y-$height-$slideOffsetY-$cornerOffset unless (defined $yy); + } + + $w->{'pointer'}->raise; + $xx = int($xx); + $yy = int($yy); + $w->geometry("+$xx+$yy"); + $w->deiconify(); + $w->raise; +} + +sub SetStatus { + my ($w) = @_; + my $client = $w->{'client'}; + my $s = $w->GetOption(-statusbar => $client); + if (defined $s and $s->winfo('exists')) { + my $vref = $s->cget(-textvariable); + return if not defined $client or not exists $w->{'clients'}{$client}; + my $msg = $client->BalloonInfo($w, $w->pointerxy,'-statusmsg'); + # Dereference it if it looks like a scalar reference: + $msg = $$msg if UNIVERSAL::isa($msg, 'SCALAR'); + if (not defined $vref) { + eval { $s->configure(-text => $msg); }; + } else { + $$vref = $msg; + } + } +} + +sub ClearStatus { + my ($w) = @_; + my $client = $w->{'client'}; + my $s = $w->GetOption(-statusbar => $client); + if (defined $s and $s->winfo('exists')) { + my $vref = $s->cget(-textvariable); + if (defined $vref) { + $$vref = ''; + } else { + eval { $s->configure(-text => ''); } + } + } +} + +sub _destroyed { + my ($w) = @_; + # This is called when widget is destroyed (no matter how!) + # via the ->OnDestroy hook set in Populate. + # remove ourselves from the list of baloons. + @balloons = grep($w != $_, @balloons); + + # FIXME: If @balloons is now empty perhaps remove the 'all' bindings + # to reduce overhead until another balloon is created? + + # Delete the images + for (qw(no tl tr bl br)) { + my $img = delete $w->{"img_$_"}; + $img->delete if defined $img; + } +} + +1; + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Bitmap.pm b/Master/tlpkg/tlperl.old/lib/Tk/Bitmap.pm new file mode 100644 index 00000000000..d081a393804 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Bitmap.pm @@ -0,0 +1,10 @@ +package Tk::Bitmap; +require Tk; +require Tk::Image; +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Tk/Bitmap.pm#4 $ +use base qw(Tk::Image); +Construct Tk::Image 'Bitmap'; +sub Tk_image { 'bitmap' } +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/BrowseEntry.pm b/Master/tlpkg/tlperl.old/lib/Tk/BrowseEntry.pm new file mode 100644 index 00000000000..5c4b6b782c2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/BrowseEntry.pm @@ -0,0 +1,510 @@ +# +# BrowseEntry is a stripped down version of ComboBox.tcl from Tix4.0 +# +# Some additions by Slaven Rezic <slaven@rezic.de> to make the widget +# look like the Windows' Combobox. There are also additional options. +# + +package Tk::BrowseEntry; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #13 $ =~ /\D(\d+)\s*$/; + +use Tk qw(Ev); +use Carp; +use strict; + +use base qw(Tk::Frame); +Construct Tk::Widget 'BrowseEntry'; + +require Tk::LabEntry; + +sub LabEntryWidget { "LabEntry" } +sub ButtonWidget { "Button" } +sub ListboxWidget { "Listbox" } + +sub Populate { + my ($w, $args) = @_; + + $w->Tk::Frame::Populate($args); + + # entry widget and arrow button + my $lpack = delete $args->{-labelPack}; + if (not defined $lpack) { + $lpack = [-side => 'left', -anchor => 'e']; + } + $w->{_BE_Style} = delete $args->{-style} || $Tk::platform; + my $LabEntry = $w->LabEntryWidget; + my $Listbox = $w->ListboxWidget; + my $Button = $w->ButtonWidget; + # XXX should this be retained? +# if (defined $args->{-state} and $args->{-state} eq 'readonly') { # XXX works only at construction time +# $LabEntry = "NoSelLabEntry"; +# require Tk::NoSelLabEntry; +# } + my $e; + my $var = ""; + my @LabEntry_args = (-textvariable => \$var); + if (exists $args->{-label}) { + $e = $w->$LabEntry(-labelPack => $lpack, + -label => delete $args->{-label}, + @LabEntry_args, + ); + } else { + $e = $w->$LabEntry(@LabEntry_args); + } + my $b = $w->$Button(-bitmap => '@' . Tk->findINC($w->{_BE_Style} eq 'MSWin32' ? 'arrowdownwin.xbm' : 'cbxarrow.xbm')); + $w->Advertise('entry' => $e); + $w->Advertise('arrow' => $b); + + # Pack the button to align vertically with the entry widget + my @anch; + my $edge = {@$lpack}->{-side}; + push(@anch,-anchor => 's') if ($edge && $edge eq 'top'); + push(@anch,-anchor => 'n') if ($edge && $edge eq 'bottom'); + $b->pack(-side => 'right', -padx => 1, @anch); + + $e->pack(-side => 'right', -fill => 'x', -expand => 1); #XXX, -padx => 1); + + # popup shell for listbox with values. + my $c = $w->Toplevel(-bd => 2, + -relief => ($w->{_BE_Style} eq 'MSWin32' + ? "solid" : "raised")); + $c->overrideredirect(1); + $c->withdraw; + my $sl = $c->Scrolled( $Listbox, qw/-selectmode browse -scrollbars oe/ ); + if ($w->{_BE_Style} eq 'MSWin32' and $Tk::platform eq 'MSWin32') { + $sl->configure(-bg => 'SystemWindow', -relief => "flat"); + } + $w->Advertise('choices' => $c); + $w->Advertise('slistbox' => $sl); + $sl->pack(-expand => 1, -fill => 'both'); + + $sl->Subwidget("scrolled")->bind("<Motion>",sub { + return unless ($w->{_BE_Style} eq 'MSWin32'); + my $e = $_[0]->XEvent; + my $y = $e->y; + my $inx = $sl->nearest($y); + if (defined $inx) { + $sl->selectionClear(0, "end"); + $sl->selectionSet($inx); + } + }); + + # other initializations + $w->SetBindings; + $w->{'_BE_popped'} = 0; + $w->Delegates(get => $sl, DEFAULT => $e); + $w->ConfigSpecs( + -font => [qw/DESCENDANTS font Font/], + -listwidth => [qw/PASSIVE listWidth ListWidth/, undef], + -listheight => [{-height => $sl}, qw/listHeight ListHeight/, undef], + -listcmd => [qw/CALLBACK listCmd ListCmd/, undef], + -autolistwidth => [qw/PASSIVE autoListWidth AutoListWidth/, undef], + -autolimitheight => [qw/PASSIVE autoLimitHeight AutoLimitHeight 0/], + -browsecmd => [qw/CALLBACK browseCmd BrowseCmd/, undef], + -browse2cmd => [qw/CALLBACK browse2Cmd Browse2Cmd/, undef], + -choices => [qw/METHOD choices Choices/, undef], + -state => [qw/METHOD state State normal/], + -arrowimage => [ {-image => $b}, qw/arrowImage ArrowImage/, undef], + -variable => [ {'-textvariable' => $e} ], + -colorstate => [qw/PASSIVE colorState ColorState/, undef], + -command => '-browsecmd', + -options => '-choices', + -label => [qw/PASSIVE label Label/, undef], + -labelPack => [qw/PASSIVE labelPack LabelPack/, undef], + #-background => [$e, qw/background Background/, undef], + #-foreground => [$e, qw/foreground Foreground/, undef], + -buttontakefocus => [{-takefocus => $b}, 'buttonTakefocus', + 'ButtonTakefocus', 1], + DEFAULT => [$e] ); +} + +sub SetBindings { + my ($w) = @_; + + my $e = $w->Subwidget('entry'); + my $b = $w->Subwidget('arrow'); + + # set bind tags + $w->bindtags([$w, 'Tk::BrowseEntry', $w->toplevel, 'all']); + # as we don't bind $e here leave its tags alone ... + # $e->bindtags([$e, ref($e), $e->toplevel, 'all']); + + # bindings for the button and entry + $b->bind('<1>',[$w,'BtnDown']); + $b->toplevel->bind('<ButtonRelease-1>',[$w,'ButtonHack']); + $b->bind('<space>',[$w,'space']); + + # bindings for listbox + my $sl = $w->Subwidget('slistbox'); + my $l = $sl->Subwidget('listbox'); + $l->bind('<ButtonRelease-1>',[$w,'ListboxRelease',Ev('x'),Ev('y')]); + $l->bind('<Escape>' => [$w,'LbClose']); + $l->bind('<Return>' => [$w,'Return',$l]); + + # allow click outside the popped up listbox to pop it down. + $w->bind('<1>','BtnDown'); +} + +sub space +{ + my $w = shift; + $w->BtnDown; + $w->{'_BE_savefocus'} = $w->focusCurrent; + $w->Subwidget('slistbox')->focus; +} + + +sub ListboxRelease +{ + my ($w,$x,$y) = @_; + $w->ButtonHack; + $w->LbChoose($x, $y); +} + +sub Return +{ + my ($w,$l) = @_; + my($x, $y) = $l->bbox($l->curselection); + $w->LbChoose($x, $y) +} + + +sub BtnDown { + my ($w) = @_; + return if $w->cget( '-state' ) eq 'disabled'; + + if ($w->{'_BE_popped'}) { + $w->Popdown; + $w->{'_BE_buttonHack'} = 0; + } else { + $w->PopupChoices; + $w->{'_BE_buttonHack'} = 1; + } +} + +sub PopupChoices { + my ($w) = @_; + + if (!$w->{'_BE_popped'}) { + $w->Callback(-listcmd => $w); + my $e = $w->Subwidget('entry'); + my $c = $w->Subwidget('choices'); + my $s = $w->Subwidget('slistbox'); + my $a = $w->Subwidget('arrow'); + my $y1 = ($w->{_BE_Style} eq 'MSWin32' + ? $a->rooty + $a->height + : $e->rooty + $e->height + 3 + ); + my $bd = $c->cget(-bd) + $c->cget(-highlightthickness); + # using the real listbox reqheight rather than the + # container frame one, which does not change after resizing the + # listbox + my $ht = $s->Subwidget("scrolled")->reqheight + 2 * $bd; + my $x1 = ($w->{_BE_Style} eq 'MSWin32' + ? $e->Subwidget("entry")->rootx + : $e->rootx + ); + my ($width, $x2); + if (defined $w->cget(-listwidth)) { + $width = $w->cget(-listwidth); + $x2 = $x1 + $width; + } else { + $x2 = $a->rootx + $a->width; + $width = $x2 - $x1; + } + my $rw = $c->reqwidth; + if ($rw < $width) { + $rw = $width + } else { + if ($rw > $width * 3) { + $rw = $width * 3; + } + if ($rw > $w->vrootwidth) { + $rw = $w->vrootwidth; + } + } + $width = $rw; + + # if listbox is too far right, pull it back to the left + # + if ($x2 > $w->vrootwidth) { + $x1 = $w->vrootwidth - $width; + } + + # if listbox is too far left, pull it back to the right + # + if ($x1 < 0) { + $x1 = 0; + } + + # if listbox is below bottom of screen, pull it up. + # check the Win32 taskbar, if possible + my $rootheight; + if ($Tk::platform eq 'MSWin32' and $^O eq 'MSWin32') { + eval { + require Win32Util; # XXX should not use a non-CPAN widget + $rootheight = (Win32Util::screen_region($w))[3]; + }; + } + if (!defined $rootheight) { + $rootheight = $w->vrootheight; + } + + my $y2 = $y1 + $ht; + if ($y2 > $rootheight) { + $y1 = $y1 - $ht - ($e->height - 5); + } + $c->geometry(sprintf('%dx%d+%d+%d', $rw, $ht, $x1, $y1)); + $c->deiconify; + $c->raise; + $e->focus; + $w->{'_BE_popped'} = 1; + + # highlight current selection + my $current_sel = $e->get; + if (defined $current_sel) { + my $i = 0; + foreach my $str ($s->get(0, "end")) { + if ($str eq $current_sel) { + $s->selectionClear(0, "end"); + $s->selectionSet($i); + last; + } + $i++; + } + } + + $c->configure(-cursor => 'arrow'); + $w->{'_BE_grabinfo'} = $w->grabSave; + $w->grabGlobal; + } +} + +# choose value from listbox if appropriate +sub LbChoose { + my ($w, $x, $y) = @_; + my $l = $w->Subwidget('slistbox')->Subwidget('listbox'); + if ((($x < 0) || ($x > $l->Width)) || + (($y < 0) || ($y > $l->Height))) { + # mouse was clicked outside the listbox... close the listbox + $w->LbClose; + } else { + # select appropriate entry and close the listbox + $w->LbCopySelection; + $w->Callback(-browsecmd, $w, $w->Subwidget('entry')->get()); + $w->Callback(-browse2cmd => $w, $w->LbIndex); + } +} + +# close the listbox after clearing selection +sub LbClose { + my ($w) = @_; + my $l = $w->Subwidget('slistbox')->Subwidget('listbox'); + $l->selection('clear', 0, 'end'); + $w->Popdown; +} + +# copy the selection to the entry and close listbox +sub LbCopySelection { + my ($w) = @_; + my $index = $w->LbIndex; + if (defined $index) { + $w->{'_BE_curIndex'} = $index; + my $l = $w->Subwidget('slistbox')->Subwidget('listbox'); + my $var_ref = $w->cget( '-textvariable' ); + $$var_ref = $l->get($index); + if ($w->{'_BE_popped'}) { + $w->Popdown; + } + } + $w->Popdown; +} + +sub LbIndex { + my ($w, $flag) = @_; + my ($sel) = $w->Subwidget('slistbox')->Subwidget('listbox')->curselection; + if (defined $sel) { + return int($sel); + } else { + if (defined $flag && ($flag eq 'emptyOK')) { + return undef; + } else { + return 0; + } + } +} + +# pop down the listbox +sub Popdown { + my ($w) = @_; + if ($w->{'_BE_savefocus'} && Tk::Exists($w->{'_BE_savefocus'})) { + $w->{'_BE_savefocus'}->focus; + delete $w->{'_BE_savefocus'}; + } + if ($w->{'_BE_popped'}) { + my $c = $w->Subwidget('choices'); + $c->withdraw; + $w->grabRelease; + if (ref $w->{'_BE_grabinfo'} eq 'CODE') { + $w->{'_BE_grabinfo'}->(); + delete $w->{'_BE_grabinfo'}; + } + $w->{'_BE_popped'} = 0; + } +} + +# This hack is to prevent the ugliness of the arrow being depressed. +# +sub ButtonHack { + my ($w) = @_; + my $b = $w->Subwidget('arrow'); + if ($w->{'_BE_buttonHack'}) { + $b->butUp; + } +} + +sub choices +{ + my ($w,$choices) = @_; + if (@_ > 1) + { + $w->delete( qw/0 end/ ); + my %hash; + my $var = $w->cget('-textvariable'); + my $old = $$var; + foreach my $val (@$choices) + { + $w->insert( 'end', $val); + $hash{$val} = 1; + } + $old = $choices->[0] + if defined $old && not exists $hash{$old} && defined $choices->[0]; + $$var = $old; + } + else + { + return( $w->get( qw/0 end/ ) ); + } +} + +sub _set_edit_state { + my( $w, $state ) = @_; + + my $entry = $w->Subwidget( 'entry' ); + my $button = $w->Subwidget( 'arrow' ); + + if ($w->cget( '-colorstate' )) { + my $color; + if( $state eq 'normal' ) { # Editable + $color = 'gray95'; + } else { # Not Editable + $color = $w->cget( -background ) || 'lightgray'; + } + $entry->Subwidget( 'entry' )->configure( -background => $color ); + } + + if( $state eq 'readonly' ) { + $entry->configure( -state => 'disabled' ); + $button->configure( -state => 'normal' ); + if ($w->{_BE_Style} eq 'MSWin32') { + $entry->bind('<1>',[$w,'BtnDown']); + $w->{_BE_OriginalCursor} = $entry->cget( -cursor ); + $entry->configure( -cursor => 'left_ptr' ); + } + } else { + $entry->configure( -state => $state ); + if (exists $w->{_BE_OriginalCursor}) { + $entry->configure(-cursor => delete $w->{_BE_OriginalCursor}); + } + $button->configure( -state => $state ); + if ($w->{_BE_Style} eq 'MSWin32') { + $entry->bind('<1>',['Button1',Tk::Ev('x')]); + } + } +} + +sub state { + my $w = shift; + unless( @_ ) { + return( $w->{Configure}{-state} ); + } else { + my $state = shift; + $w->{Configure}{-state} = $state; + $w->_set_edit_state( $state ); + } +} + +sub _max { + my $max = shift; + foreach my $val (@_) { + $max = $val if $max < $val; + } + return( $max ); +} + +sub shrinkwrap { + my( $w, $size ) = @_; + + unless( defined $size ) { + $size = _max( map( length, $w->get( qw/0 end/ ) ) ) || 0;; + } + + my $lb = $w->Subwidget( 'slistbox' )->Subwidget( 'listbox' ); + $w->configure( -width => $size ); + $lb->configure( -width => $size ); +} + +sub limitheight { + my $w = shift; + my $choices_number = shift || $w->Subwidget('slistbox')->index("end"); + $choices_number = 10 if $choices_number > 10; + $w->configure(-listheight => $choices_number) if ($choices_number > 0); +} + +sub insert { + my $w = shift; + $w->Subwidget("slistbox")->insert(@_); + if ($w->cget(-autolimitheight)) { + $w->limitheight; + } + if ($w->cget(-autolistwidth)) { + $w->updateListWidth(@_[1..$#_]); + } +} + +sub delete { + my $w = shift; + $w->Subwidget("slistbox")->delete(@_); + if ($w->cget(-autolimitheight)) { + $w->limitheight; + } + if ($w->cget(-autolistwidth)) { + $w->updateListWidth(); + } +} + +sub updateListWidth { + my $w = shift; + my @ins = @_; + if (!@ins) { + @ins = $w->get(0, "end"); + } + + my $max_width = 0; + foreach my $ins (@ins) { + my $new_width = $w->fontMeasure($w->cget(-font), $ins); + if ($new_width > $max_width) { + $max_width = $new_width; + } + } + if ($max_width > 20) { # be sane + $w->configure(-listwidth => $max_width + 32); # XXX for scrollbar + } +} + +1; + +__END__ + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Button.pm b/Master/tlpkg/tlperl.old/lib/Tk/Button.pm new file mode 100644 index 00000000000..efa597dee14 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Button.pm @@ -0,0 +1,148 @@ +package Tk::Button; +# Conversion from Tk4.0 button.tcl competed. +# +# Copyright (c) 1992-1994 The Regents of the University of California. +# Copyright (c) 1994 Sun Microsystems, Inc. +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or + +use vars qw($VERSION); +$VERSION = '4.008'; # $Id: //depot/Tkutf8/Tk/Button.pm#8 $ + +# modify it under the same terms as Perl itself, subject +# to additional disclaimer in license.terms due to partial +# derivation from Tk4.0 sources. + +use strict; + +require Tk::Widget; +use base qw(Tk::Widget); + +use vars qw($buttonWindow $relief); + +Tk::Methods('deselect','flash','invoke','select','toggle'); + +sub Tk_cmd { \&Tk::button } + +Construct Tk::Widget 'Button'; + +sub ClassInit +{ + my ($class,$mw) = @_; + $mw->bind($class,'<Enter>', 'Enter'); + $mw->bind($class,'<Leave>', 'Leave'); + $mw->bind($class,'<1>', 'butDown'); + $mw->bind($class,'<ButtonRelease-1>', 'butUp'); + $mw->bind($class,'<space>', 'Invoke'); + $mw->bind($class,'<Return>', 'Invoke'); + return $class; +} + +# tkButtonEnter -- +# The procedure below is invoked when the mouse pointer enters a +# button widget. It records the button we're in and changes the +# state of the button to active unless the button is disabled. +# +# Arguments: +# w - The name of the widget. + +sub Enter +{ + my $w = shift; + my $E = shift; + if ($w->cget('-state') ne 'disabled') + { + $w->configure('-state' => 'active'); + $w->configure('-state' => 'active', '-relief' => 'sunken') if (defined($buttonWindow) && $w == $buttonWindow) + } + $Tk::window = $w; +} + +# tkButtonLeave -- +# The procedure below is invoked when the mouse pointer leaves a +# button widget. It changes the state of the button back to +# inactive. If we're leaving the button window with a mouse button +# pressed (tkPriv(buttonWindow) == $w), restore the relief of the +# button too. +# +# Arguments: +# w - The name of the widget. +sub Leave +{ + my $w = shift; + $w->configure('-state'=>'normal') if ($w->cget('-state') ne 'disabled'); + $w->configure('-relief' => $relief) if (defined($buttonWindow) && $w == $buttonWindow); + undef $Tk::window; +} + +# tkButtonDown -- +# The procedure below is invoked when the mouse button is pressed in +# a button widget. It records the fact that the mouse is in the button, +# saves the button's relief so it can be restored later, and changes +# the relief to sunken. +# +# Arguments: +# w - The name of the widget. +sub butDown +{ + my $w = shift; + $relief = $w->cget('-relief'); + if ($w->cget('-state') ne 'disabled') + { + $buttonWindow = $w; + $w->configure('-relief' => 'sunken') + } +} + +# tkButtonUp -- +# The procedure below is invoked when the mouse button is released +# in a button widget. It restores the button's relief and invokes +# the command as long as the mouse hasn't left the button. +# +# Arguments: +# w - The name of the widget. +sub butUp +{ + my $w = shift; + if (defined($buttonWindow) && $buttonWindow == $w) + { + undef $buttonWindow; + $w->configure('-relief' => $relief); + if ($w->IS($Tk::window) && $w->cget('-state') ne 'disabled') + { + $w->invoke; + } + } +} + +# tkButtonInvoke -- +# The procedure below is called when a button is invoked through +# the keyboard. It simulate a press of the button via the mouse. +# +# Arguments: +# w - The name of the widget. +sub Invoke +{ + my $w = shift; + if ($w->cget('-state') ne 'disabled') + { + my $oldRelief = $w->cget('-relief'); + my $oldState = $w->cget('-state'); + $w->configure('-state' => 'active', '-relief' => 'sunken'); + $w->idletasks; + $w->after(100); + $w->configure('-state' => $oldState, '-relief' => $oldRelief); + $w->invoke; + } +} + + + +1; + +__END__ + + + + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Camel.xpm b/Master/tlpkg/tlperl.old/lib/Tk/Camel.xpm new file mode 100644 index 00000000000..ba33c0149ec --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Camel.xpm @@ -0,0 +1,41 @@ +/* XPM */ +static char *Camel[] = { +/* width height num_colors chars_per_pixel */ +" 32 32 2 1", +/* colors */ +". c #ffffff", +"# c #7f7f00", +/* pixels */ +"................................", +"................................", +"...................###..........", +".......####......######.........", +"....####.##.....########........", +"....########....#########.......", +"......######..###########.......", +"......#####..#############......", +".....######.##############......", +".....######.###############.....", +".....######################.....", +".....#######################....", +".....#######################....", +"......#######################...", +".......####################.#...", +"........###################.#...", +"........###############.###.#...", +"............#######.###.###.#...", +"............###.###.##...##.....", +"............###.###..#...##.....", +"............##.####..#....#.....", +"............##.###...#....#.....", +"............##.##...#.....#.....", +"............#...#...#.....#.....", +"............#....#..#.....#.....", +"............#.....#.#.....#.....", +"............#.....###.....#.....", +"...........##....##.#....#......", +"...........#..............#.....", +".........###.............#......" +"................................", +"................................", +}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Canvas.pm b/Master/tlpkg/tlperl.old/lib/Tk/Canvas.pm new file mode 100644 index 00000000000..210bc30bfc2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Canvas.pm @@ -0,0 +1,1436 @@ +package Tk::Canvas; +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #12 $ =~ /\D(\d+)\s*$/; + +use Tk qw($XS_VERSION); + +use base qw(Tk::Widget); +Construct Tk::Widget 'Canvas'; + +bootstrap Tk::Canvas; + +sub Tk_cmd { \&Tk::canvas } + +Tk::Methods('addtag','bbox','bind','canvasx','canvasy','coords','create', + 'dchars','delete','dtag','find','focus','gettags','icursor', + 'index','insert','itemcget','itemconfigure','lower','move', + 'postscript','raise','scale','scan','select','type','xview','yview'); + +use Tk::Submethods ( 'create' => [qw(arc bitmap grid group image line oval + polygon rectangle text window)], + 'scan' => [qw(mark dragto)], + 'select' => [qw(from clear item to)], + 'xview' => [qw(moveto scroll)], + 'yview' => [qw(moveto scroll)], + ); + +*CanvasBind = \&Tk::bind; +*CanvasFocus = \&Tk::focus; + +sub ClassInit +{ + my ($class,$mw) = @_; + $mw->XYscrollBind($class); + return $class; +} + +sub BalloonInfo +{ + my ($canvas,$balloon,$X,$Y,@opt) = @_; + my @tags = ($canvas->find('withtag', 'current'),$canvas->gettags('current')); + foreach my $opt (@opt) + { + my $info = $balloon->GetOption($opt,$canvas); + if ($opt =~ /^-(statusmsg|balloonmsg)$/ && UNIVERSAL::isa($info,'HASH')) + { + $balloon->Subclient($tags[0]); + foreach my $tag (@tags) + { + return $info->{$tag} if exists $info->{$tag}; + } + return ''; + } + return $info; + } +} + +sub get_corners +{ + my $c = shift; + my(@xview) = $c->xview; + my(@yview) = $c->yview; + my(@scrollregion) = @{$c->cget(-scrollregion)}; + return ( + $xview[0] * ($scrollregion[2]-$scrollregion[0]) + $scrollregion[0], + $yview[0] * ($scrollregion[3]-$scrollregion[1]) + $scrollregion[1], + $xview[1] * ($scrollregion[2]-$scrollregion[0]) + $scrollregion[0], + $yview[1] * ($scrollregion[3]-$scrollregion[1]) + $scrollregion[1], + ); +} + +# List of adobe glyph names. Converted from glyphlist.txt, downloaded +# from Adobe + +$Tk::psglyphs = {qw( + 0020 space + 0021 exclam + 0022 quotedbl + 0023 numbersign + 0024 dollar + 0025 percent + 0026 ampersand + 0027 quotesingle + 0028 parenleft + 0029 parenright + 002A asterisk + 002B plus + 002C comma + 002D hyphen + 002E period + 002F slash + 0030 zero + 0031 one + 0032 two + 0033 three + 0034 four + 0035 five + 0036 six + 0037 seven + 0038 eight + 0039 nine + 003A colon + 003B semicolon + 003C less + 003D equal + 003E greater + 003F question + 0040 at + 0041 A + 0042 B + 0043 C + 0044 D + 0045 E + 0046 F + 0047 G + 0048 H + 0049 I + 004A J + 004B K + 004C L + 004D M + 004E N + 004F O + 0050 P + 0051 Q + 0052 R + 0053 S + 0054 T + 0055 U + 0056 V + 0057 W + 0058 X + 0059 Y + 005A Z + 005B bracketleft + 005C backslash + 005D bracketright + 005E asciicircum + 005F underscore + 0060 grave + 0061 a + 0062 b + 0063 c + 0064 d + 0065 e + 0066 f + 0067 g + 0068 h + 0069 i + 006A j + 006B k + 006C l + 006D m + 006E n + 006F o + 0070 p + 0071 q + 0072 r + 0073 s + 0074 t + 0075 u + 0076 v + 0077 w + 0078 x + 0079 y + 007A z + 007B braceleft + 007C bar + 007D braceright + 007E asciitilde + 00A0 space + 00A1 exclamdown + 00A2 cent + 00A3 sterling + 00A4 currency + 00A5 yen + 00A6 brokenbar + 00A7 section + 00A8 dieresis + 00A9 copyright + 00AA ordfeminine + 00AB guillemotleft + 00AC logicalnot + 00AD hyphen + 00AE registered + 00AF macron + 00B0 degree + 00B1 plusminus + 00B2 twosuperior + 00B3 threesuperior + 00B4 acute + 00B5 mu + 00B6 paragraph + 00B7 periodcentered + 00B8 cedilla + 00B9 onesuperior + 00BA ordmasculine + 00BB guillemotright + 00BC onequarter + 00BD onehalf + 00BE threequarters + 00BF questiondown + 00C0 Agrave + 00C1 Aacute + 00C2 Acircumflex + 00C3 Atilde + 00C4 Adieresis + 00C5 Aring + 00C6 AE + 00C7 Ccedilla + 00C8 Egrave + 00C9 Eacute + 00CA Ecircumflex + 00CB Edieresis + 00CC Igrave + 00CD Iacute + 00CE Icircumflex + 00CF Idieresis + 00D0 Eth + 00D1 Ntilde + 00D2 Ograve + 00D3 Oacute + 00D4 Ocircumflex + 00D5 Otilde + 00D6 Odieresis + 00D7 multiply + 00D8 Oslash + 00D9 Ugrave + 00DA Uacute + 00DB Ucircumflex + 00DC Udieresis + 00DD Yacute + 00DE Thorn + 00DF germandbls + 00E0 agrave + 00E1 aacute + 00E2 acircumflex + 00E3 atilde + 00E4 adieresis + 00E5 aring + 00E6 ae + 00E7 ccedilla + 00E8 egrave + 00E9 eacute + 00EA ecircumflex + 00EB edieresis + 00EC igrave + 00ED iacute + 00EE icircumflex + 00EF idieresis + 00F0 eth + 00F1 ntilde + 00F2 ograve + 00F3 oacute + 00F4 ocircumflex + 00F5 otilde + 00F6 odieresis + 00F7 divide + 00F8 oslash + 00F9 ugrave + 00FA uacute + 00FB ucircumflex + 00FC udieresis + 00FD yacute + 00FE thorn + 00FF ydieresis + 0100 Amacron + 0101 amacron + 0102 Abreve + 0103 abreve + 0104 Aogonek + 0105 aogonek + 0106 Cacute + 0107 cacute + 0108 Ccircumflex + 0109 ccircumflex + 010A Cdotaccent + 010B cdotaccent + 010C Ccaron + 010D ccaron + 010E Dcaron + 010F dcaron + 0110 Dcroat + 0111 dcroat + 0112 Emacron + 0113 emacron + 0114 Ebreve + 0115 ebreve + 0116 Edotaccent + 0117 edotaccent + 0118 Eogonek + 0119 eogonek + 011A Ecaron + 011B ecaron + 011C Gcircumflex + 011D gcircumflex + 011E Gbreve + 011F gbreve + 0120 Gdotaccent + 0121 gdotaccent + 0122 Gcommaaccent + 0123 gcommaaccent + 0124 Hcircumflex + 0125 hcircumflex + 0126 Hbar + 0127 hbar + 0128 Itilde + 0129 itilde + 012A Imacron + 012B imacron + 012C Ibreve + 012D ibreve + 012E Iogonek + 012F iogonek + 0130 Idotaccent + 0131 dotlessi + 0132 IJ + 0133 ij + 0134 Jcircumflex + 0135 jcircumflex + 0136 Kcommaaccent + 0137 kcommaaccent + 0138 kgreenlandic + 0139 Lacute + 013A lacute + 013B Lcommaaccent + 013C lcommaaccent + 013D Lcaron + 013E lcaron + 013F Ldot + 0140 ldot + 0141 Lslash + 0142 lslash + 0143 Nacute + 0144 nacute + 0145 Ncommaaccent + 0146 ncommaaccent + 0147 Ncaron + 0148 ncaron + 0149 napostrophe + 014A Eng + 014B eng + 014C Omacron + 014D omacron + 014E Obreve + 014F obreve + 0150 Ohungarumlaut + 0151 ohungarumlaut + 0152 OE + 0153 oe + 0154 Racute + 0155 racute + 0156 Rcommaaccent + 0157 rcommaaccent + 0158 Rcaron + 0159 rcaron + 015A Sacute + 015B sacute + 015C Scircumflex + 015D scircumflex + 015E Scedilla + 015F scedilla + 0160 Scaron + 0161 scaron + 0162 Tcommaaccent + 0163 tcommaaccent + 0164 Tcaron + 0165 tcaron + 0166 Tbar + 0167 tbar + 0168 Utilde + 0169 utilde + 016A Umacron + 016B umacron + 016C Ubreve + 016D ubreve + 016E Uring + 016F uring + 0170 Uhungarumlaut + 0171 uhungarumlaut + 0172 Uogonek + 0173 uogonek + 0174 Wcircumflex + 0175 wcircumflex + 0176 Ycircumflex + 0177 ycircumflex + 0178 Ydieresis + 0179 Zacute + 017A zacute + 017B Zdotaccent + 017C zdotaccent + 017D Zcaron + 017E zcaron + 017F longs + 0192 florin + 01A0 Ohorn + 01A1 ohorn + 01AF Uhorn + 01B0 uhorn + 01E6 Gcaron + 01E7 gcaron + 01FA Aringacute + 01FB aringacute + 01FC AEacute + 01FD aeacute + 01FE Oslashacute + 01FF oslashacute + 0218 Scommaaccent + 0219 scommaaccent + 021A Tcommaaccent + 021B tcommaaccent + 02BC afii57929 + 02BD afii64937 + 02C6 circumflex + 02C7 caron + 02C9 macron + 02D8 breve + 02D9 dotaccent + 02DA ring + 02DB ogonek + 02DC tilde + 02DD hungarumlaut + 0300 gravecomb + 0301 acutecomb + 0303 tildecomb + 0309 hookabovecomb + 0323 dotbelowcomb + 0384 tonos + 0385 dieresistonos + 0386 Alphatonos + 0387 anoteleia + 0388 Epsilontonos + 0389 Etatonos + 038A Iotatonos + 038C Omicrontonos + 038E Upsilontonos + 038F Omegatonos + 0390 iotadieresistonos + 0391 Alpha + 0392 Beta + 0393 Gamma + 0394 Delta + 0395 Epsilon + 0396 Zeta + 0397 Eta + 0398 Theta + 0399 Iota + 039A Kappa + 039B Lambda + 039C Mu + 039D Nu + 039E Xi + 039F Omicron + 03A0 Pi + 03A1 Rho + 03A3 Sigma + 03A4 Tau + 03A5 Upsilon + 03A6 Phi + 03A7 Chi + 03A8 Psi + 03A9 Omega + 03AA Iotadieresis + 03AB Upsilondieresis + 03AC alphatonos + 03AD epsilontonos + 03AE etatonos + 03AF iotatonos + 03B0 upsilondieresistonos + 03B1 alpha + 03B2 beta + 03B3 gamma + 03B4 delta + 03B5 epsilon + 03B6 zeta + 03B7 eta + 03B8 theta + 03B9 iota + 03BA kappa + 03BB lambda + 03BC mu + 03BD nu + 03BE xi + 03BF omicron + 03C0 pi + 03C1 rho + 03C2 sigma1 + 03C3 sigma + 03C4 tau + 03C5 upsilon + 03C6 phi + 03C7 chi + 03C8 psi + 03C9 omega + 03CA iotadieresis + 03CB upsilondieresis + 03CC omicrontonos + 03CD upsilontonos + 03CE omegatonos + 03D1 theta1 + 03D2 Upsilon1 + 03D5 phi1 + 03D6 omega1 + 0401 afii10023 + 0402 afii10051 + 0403 afii10052 + 0404 afii10053 + 0405 afii10054 + 0406 afii10055 + 0407 afii10056 + 0408 afii10057 + 0409 afii10058 + 040A afii10059 + 040B afii10060 + 040C afii10061 + 040E afii10062 + 040F afii10145 + 0410 afii10017 + 0411 afii10018 + 0412 afii10019 + 0413 afii10020 + 0414 afii10021 + 0415 afii10022 + 0416 afii10024 + 0417 afii10025 + 0418 afii10026 + 0419 afii10027 + 041A afii10028 + 041B afii10029 + 041C afii10030 + 041D afii10031 + 041E afii10032 + 041F afii10033 + 0420 afii10034 + 0421 afii10035 + 0422 afii10036 + 0423 afii10037 + 0424 afii10038 + 0425 afii10039 + 0426 afii10040 + 0427 afii10041 + 0428 afii10042 + 0429 afii10043 + 042A afii10044 + 042B afii10045 + 042C afii10046 + 042D afii10047 + 042E afii10048 + 042F afii10049 + 0430 afii10065 + 0431 afii10066 + 0432 afii10067 + 0433 afii10068 + 0434 afii10069 + 0435 afii10070 + 0436 afii10072 + 0437 afii10073 + 0438 afii10074 + 0439 afii10075 + 043A afii10076 + 043B afii10077 + 043C afii10078 + 043D afii10079 + 043E afii10080 + 043F afii10081 + 0440 afii10082 + 0441 afii10083 + 0442 afii10084 + 0443 afii10085 + 0444 afii10086 + 0445 afii10087 + 0446 afii10088 + 0447 afii10089 + 0448 afii10090 + 0449 afii10091 + 044A afii10092 + 044B afii10093 + 044C afii10094 + 044D afii10095 + 044E afii10096 + 044F afii10097 + 0451 afii10071 + 0452 afii10099 + 0453 afii10100 + 0454 afii10101 + 0455 afii10102 + 0456 afii10103 + 0457 afii10104 + 0458 afii10105 + 0459 afii10106 + 045A afii10107 + 045B afii10108 + 045C afii10109 + 045E afii10110 + 045F afii10193 + 0462 afii10146 + 0463 afii10194 + 0472 afii10147 + 0473 afii10195 + 0474 afii10148 + 0475 afii10196 + 0490 afii10050 + 0491 afii10098 + 04D9 afii10846 + 05B0 afii57799 + 05B1 afii57801 + 05B2 afii57800 + 05B3 afii57802 + 05B4 afii57793 + 05B5 afii57794 + 05B6 afii57795 + 05B7 afii57798 + 05B8 afii57797 + 05B9 afii57806 + 05BB afii57796 + 05BC afii57807 + 05BD afii57839 + 05BE afii57645 + 05BF afii57841 + 05C0 afii57842 + 05C1 afii57804 + 05C2 afii57803 + 05C3 afii57658 + 05D0 afii57664 + 05D1 afii57665 + 05D2 afii57666 + 05D3 afii57667 + 05D4 afii57668 + 05D5 afii57669 + 05D6 afii57670 + 05D7 afii57671 + 05D8 afii57672 + 05D9 afii57673 + 05DA afii57674 + 05DB afii57675 + 05DC afii57676 + 05DD afii57677 + 05DE afii57678 + 05DF afii57679 + 05E0 afii57680 + 05E1 afii57681 + 05E2 afii57682 + 05E3 afii57683 + 05E4 afii57684 + 05E5 afii57685 + 05E6 afii57686 + 05E7 afii57687 + 05E8 afii57688 + 05E9 afii57689 + 05EA afii57690 + 05F0 afii57716 + 05F1 afii57717 + 05F2 afii57718 + 060C afii57388 + 061B afii57403 + 061F afii57407 + 0621 afii57409 + 0622 afii57410 + 0623 afii57411 + 0624 afii57412 + 0625 afii57413 + 0626 afii57414 + 0627 afii57415 + 0628 afii57416 + 0629 afii57417 + 062A afii57418 + 062B afii57419 + 062C afii57420 + 062D afii57421 + 062E afii57422 + 062F afii57423 + 0630 afii57424 + 0631 afii57425 + 0632 afii57426 + 0633 afii57427 + 0634 afii57428 + 0635 afii57429 + 0636 afii57430 + 0637 afii57431 + 0638 afii57432 + 0639 afii57433 + 063A afii57434 + 0640 afii57440 + 0641 afii57441 + 0642 afii57442 + 0643 afii57443 + 0644 afii57444 + 0645 afii57445 + 0646 afii57446 + 0647 afii57470 + 0648 afii57448 + 0649 afii57449 + 064A afii57450 + 064B afii57451 + 064C afii57452 + 064D afii57453 + 064E afii57454 + 064F afii57455 + 0650 afii57456 + 0651 afii57457 + 0652 afii57458 + 0660 afii57392 + 0661 afii57393 + 0662 afii57394 + 0663 afii57395 + 0664 afii57396 + 0665 afii57397 + 0666 afii57398 + 0667 afii57399 + 0668 afii57400 + 0669 afii57401 + 066A afii57381 + 066D afii63167 + 0679 afii57511 + 067E afii57506 + 0686 afii57507 + 0688 afii57512 + 0691 afii57513 + 0698 afii57508 + 06A4 afii57505 + 06AF afii57509 + 06BA afii57514 + 06D2 afii57519 + 06D5 afii57534 + 1E80 Wgrave + 1E81 wgrave + 1E82 Wacute + 1E83 wacute + 1E84 Wdieresis + 1E85 wdieresis + 1EF2 Ygrave + 1EF3 ygrave + 200C afii61664 + 200D afii301 + 200E afii299 + 200F afii300 + 2012 figuredash + 2013 endash + 2014 emdash + 2015 afii00208 + 2017 underscoredbl + 2018 quoteleft + 2019 quoteright + 201A quotesinglbase + 201B quotereversed + 201C quotedblleft + 201D quotedblright + 201E quotedblbase + 2020 dagger + 2021 daggerdbl + 2022 bullet + 2024 onedotenleader + 2025 twodotenleader + 2026 ellipsis + 202C afii61573 + 202D afii61574 + 202E afii61575 + 2030 perthousand + 2032 minute + 2033 second + 2039 guilsinglleft + 203A guilsinglright + 203C exclamdbl + 2044 fraction + 2070 zerosuperior + 2074 foursuperior + 2075 fivesuperior + 2076 sixsuperior + 2077 sevensuperior + 2078 eightsuperior + 2079 ninesuperior + 207D parenleftsuperior + 207E parenrightsuperior + 207F nsuperior + 2080 zeroinferior + 2081 oneinferior + 2082 twoinferior + 2083 threeinferior + 2084 fourinferior + 2085 fiveinferior + 2086 sixinferior + 2087 seveninferior + 2088 eightinferior + 2089 nineinferior + 208D parenleftinferior + 208E parenrightinferior + 20A1 colonmonetary + 20A3 franc + 20A4 lira + 20A7 peseta + 20AA afii57636 + 20AB dong + 20AC Euro + 2105 afii61248 + 2111 Ifraktur + 2113 afii61289 + 2116 afii61352 + 2118 weierstrass + 211C Rfraktur + 211E prescription + 2122 trademark + 2126 Omega + 212E estimated + 2135 aleph + 2153 onethird + 2154 twothirds + 215B oneeighth + 215C threeeighths + 215D fiveeighths + 215E seveneighths + 2190 arrowleft + 2191 arrowup + 2192 arrowright + 2193 arrowdown + 2194 arrowboth + 2195 arrowupdn + 21A8 arrowupdnbse + 21B5 carriagereturn + 21D0 arrowdblleft + 21D1 arrowdblup + 21D2 arrowdblright + 21D3 arrowdbldown + 21D4 arrowdblboth + 2200 universal + 2202 partialdiff + 2203 existential + 2205 emptyset + 2206 Delta + 2207 gradient + 2208 element + 2209 notelement + 220B suchthat + 220F product + 2211 summation + 2212 minus + 2215 fraction + 2217 asteriskmath + 2219 periodcentered + 221A radical + 221D proportional + 221E infinity + 221F orthogonal + 2220 angle + 2227 logicaland + 2228 logicalor + 2229 intersection + 222A union + 222B integral + 2234 therefore + 223C similar + 2245 congruent + 2248 approxequal + 2260 notequal + 2261 equivalence + 2264 lessequal + 2265 greaterequal + 2282 propersubset + 2283 propersuperset + 2284 notsubset + 2286 reflexsubset + 2287 reflexsuperset + 2295 circleplus + 2297 circlemultiply + 22A5 perpendicular + 22C5 dotmath + 2302 house + 2310 revlogicalnot + 2320 integraltp + 2321 integralbt + 2329 angleleft + 232A angleright + 2500 SF100000 + 2502 SF110000 + 250C SF010000 + 2510 SF030000 + 2514 SF020000 + 2518 SF040000 + 251C SF080000 + 2524 SF090000 + 252C SF060000 + 2534 SF070000 + 253C SF050000 + 2550 SF430000 + 2551 SF240000 + 2552 SF510000 + 2553 SF520000 + 2554 SF390000 + 2555 SF220000 + 2556 SF210000 + 2557 SF250000 + 2558 SF500000 + 2559 SF490000 + 255A SF380000 + 255B SF280000 + 255C SF270000 + 255D SF260000 + 255E SF360000 + 255F SF370000 + 2560 SF420000 + 2561 SF190000 + 2562 SF200000 + 2563 SF230000 + 2564 SF470000 + 2565 SF480000 + 2566 SF410000 + 2567 SF450000 + 2568 SF460000 + 2569 SF400000 + 256A SF540000 + 256B SF530000 + 256C SF440000 + 2580 upblock + 2584 dnblock + 2588 block + 258C lfblock + 2590 rtblock + 2591 ltshade + 2592 shade + 2593 dkshade + 25A0 filledbox + 25A1 H22073 + 25AA H18543 + 25AB H18551 + 25AC filledrect + 25B2 triagup + 25BA triagrt + 25BC triagdn + 25C4 triaglf + 25CA lozenge + 25CB circle + 25CF H18533 + 25D8 invbullet + 25D9 invcircle + 25E6 openbullet + 263A smileface + 263B invsmileface + 263C sun + 2640 female + 2642 male + 2660 spade + 2663 club + 2665 heart + 2666 diamond + 266A musicalnote + 266B musicalnotedbl + F6BE dotlessj + F6BF LL + F6C0 ll + F6C1 Scedilla + F6C2 scedilla + F6C3 commaaccent + F6C4 afii10063 + F6C5 afii10064 + F6C6 afii10192 + F6C7 afii10831 + F6C8 afii10832 + F6C9 Acute + F6CA Caron + F6CB Dieresis + F6CC DieresisAcute + F6CD DieresisGrave + F6CE Grave + F6CF Hungarumlaut + F6D0 Macron + F6D1 cyrBreve + F6D2 cyrFlex + F6D3 dblGrave + F6D4 cyrbreve + F6D5 cyrflex + F6D6 dblgrave + F6D7 dieresisacute + F6D8 dieresisgrave + F6D9 copyrightserif + F6DA registerserif + F6DB trademarkserif + F6DC onefitted + F6DD rupiah + F6DE threequartersemdash + F6DF centinferior + F6E0 centsuperior + F6E1 commainferior + F6E2 commasuperior + F6E3 dollarinferior + F6E4 dollarsuperior + F6E5 hypheninferior + F6E6 hyphensuperior + F6E7 periodinferior + F6E8 periodsuperior + F6E9 asuperior + F6EA bsuperior + F6EB dsuperior + F6EC esuperior + F6ED isuperior + F6EE lsuperior + F6EF msuperior + F6F0 osuperior + F6F1 rsuperior + F6F2 ssuperior + F6F3 tsuperior + F6F4 Brevesmall + F6F5 Caronsmall + F6F6 Circumflexsmall + F6F7 Dotaccentsmall + F6F8 Hungarumlautsmall + F6F9 Lslashsmall + F6FA OEsmall + F6FB Ogoneksmall + F6FC Ringsmall + F6FD Scaronsmall + F6FE Tildesmall + F6FF Zcaronsmall + F721 exclamsmall + F724 dollaroldstyle + F726 ampersandsmall + F730 zerooldstyle + F731 oneoldstyle + F732 twooldstyle + F733 threeoldstyle + F734 fouroldstyle + F735 fiveoldstyle + F736 sixoldstyle + F737 sevenoldstyle + F738 eightoldstyle + F739 nineoldstyle + F73F questionsmall + F760 Gravesmall + F761 Asmall + F762 Bsmall + F763 Csmall + F764 Dsmall + F765 Esmall + F766 Fsmall + F767 Gsmall + F768 Hsmall + F769 Ismall + F76A Jsmall + F76B Ksmall + F76C Lsmall + F76D Msmall + F76E Nsmall + F76F Osmall + F770 Psmall + F771 Qsmall + F772 Rsmall + F773 Ssmall + F774 Tsmall + F775 Usmall + F776 Vsmall + F777 Wsmall + F778 Xsmall + F779 Ysmall + F77A Zsmall + F7A1 exclamdownsmall + F7A2 centoldstyle + F7A8 Dieresissmall + F7AF Macronsmall + F7B4 Acutesmall + F7B8 Cedillasmall + F7BF questiondownsmall + F7E0 Agravesmall + F7E1 Aacutesmall + F7E2 Acircumflexsmall + F7E3 Atildesmall + F7E4 Adieresissmall + F7E5 Aringsmall + F7E6 AEsmall + F7E7 Ccedillasmall + F7E8 Egravesmall + F7E9 Eacutesmall + F7EA Ecircumflexsmall + F7EB Edieresissmall + F7EC Igravesmall + F7ED Iacutesmall + F7EE Icircumflexsmall + F7EF Idieresissmall + F7F0 Ethsmall + F7F1 Ntildesmall + F7F2 Ogravesmall + F7F3 Oacutesmall + F7F4 Ocircumflexsmall + F7F5 Otildesmall + F7F6 Odieresissmall + F7F8 Oslashsmall + F7F9 Ugravesmall + F7FA Uacutesmall + F7FB Ucircumflexsmall + F7FC Udieresissmall + F7FD Yacutesmall + F7FE Thornsmall + F7FF Ydieresissmall + F8E5 radicalex + F8E6 arrowvertex + F8E7 arrowhorizex + F8E8 registersans + F8E9 copyrightsans + F8EA trademarksans + F8EB parenlefttp + F8EC parenleftex + F8ED parenleftbt + F8EE bracketlefttp + F8EF bracketleftex + F8F0 bracketleftbt + F8F1 bracelefttp + F8F2 braceleftmid + F8F3 braceleftbt + F8F4 braceex + F8F5 integralex + F8F6 parenrighttp + F8F7 parenrightex + F8F8 parenrightbt + F8F9 bracketrighttp + F8FA bracketrightex + F8FB bracketrightbt + F8FC bracerighttp + F8FD bracerightmid + F8FE bracerightbt + FB00 ff + FB01 fi + FB02 fl + FB03 ffi + FB04 ffl + FB1F afii57705 + FB2A afii57694 + FB2B afii57695 + FB35 afii57723 + FB4B afii57700 +)}; + + +sub CreatePostscriptEncoding +{ + my ($encoding) = @_; + my $result = "/CurrentEncoding \[\n"; + for (my $i = 0; $i < 256; $i += 8) + { + for (my $j = 0; $j < 8; $j++) + { + my $ch; + Tk::catch { $ch = $encoding->decode(chr($i+$j),1) }; + if ($@) + { + $result .= '/space'; + } + else + { + my $hexcode = sprintf("%04X",ord($ch)); + $result .= '/'.((exists $Tk::psglyphs->{$hexcode}) ? $Tk::psglyphs->{$hexcode} : 'space'); + } + } + $result .= "\n"; + } + $result .= "\] def\n"; + return $result; +} + +# precalculate entire prolog when this file is loaded +# (to speed things up) +$Tk::ps_preamable = "%%BeginProlog\n". + CreatePostscriptEncoding(Tk::SystemEncoding()). <<'END'; +50 dict begin +% This is a standard prolog for Postscript generated by Tk's canvas +% widget. +% RCS: @(#) $Id: //depot/Tkutf8/Canvas/Canvas.pm#12 $ + +% The definitions below just define all of the variables used in +% any of the procedures here. This is needed for obscure reasons +% explained on p. 716 of the Postscript manual (Section H.2.7, +% "Initializing Variables," in the section on Encapsulated Postscript). + +/baseline 0 def +/stipimage 0 def +/height 0 def +/justify 0 def +/lineLength 0 def +/spacing 0 def +/stipple 0 def +/strings 0 def +/xoffset 0 def +/yoffset 0 def +/tmpstip null def + + +/cstringshow { + { + dup type /stringtype eq + { show } { glyphshow } + ifelse + } + forall +} bind def + + + +/cstringwidth { + 0 exch 0 exch + { + dup type /stringtype eq + { stringwidth } { + currentfont /Encoding get exch 1 exch put (\001) stringwidth + } + ifelse + exch 3 1 roll add 3 1 roll add exch + } + forall +} bind def + +% font ISOEncode font +% This procedure changes the encoding of a font from the default +% Postscript encoding to current system encoding. It's typically invoked just +% before invoking "setfont". The body of this procedure comes from +% Section 5.6.1 of the Postscript book. + +/ISOEncode { + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding CurrentEncoding def + currentdict + end + + % I'm not sure why it's necessary to use "definefont" on this new + % font, but it seems to be important; just use the name "Temporary" + % for the font. + + /Temporary exch definefont +} bind def + +% StrokeClip +% +% This procedure converts the current path into a clip area under +% the assumption of stroking. It's a bit tricky because some Postscript +% interpreters get errors during strokepath for dashed lines. If +% this happens then turn off dashes and try again. + +/StrokeClip { + {strokepath} stopped { + (This Postscript printer gets limitcheck overflows when) = + (stippling dashed lines; lines will be printed solid instead.) = + [] 0 setdash strokepath} if + clip +} bind def + +% desiredSize EvenPixels closestSize +% +% The procedure below is used for stippling. Given the optimal size +% of a dot in a stipple pattern in the current user coordinate system, +% compute the closest size that is an exact multiple of the device's +% pixel size. This allows stipple patterns to be displayed without +% aliasing effects. + +/EvenPixels { + % Compute exact number of device pixels per stipple dot. + dup 0 matrix currentmatrix dtransform + dup mul exch dup mul add sqrt + + % Round to an integer, make sure the number is at least 1, and compute + % user coord distance corresponding to this. + dup round dup 1 lt {pop 1} if + exch div mul +} bind def + +% width height string StippleFill -- +% +% Given a path already set up and a clipping region generated from +% it, this procedure will fill the clipping region with a stipple +% pattern. "String" contains a proper image description of the +% stipple pattern and "width" and "height" give its dimensions. Each +% stipple dot is assumed to be about one unit across in the current +% user coordinate system. This procedure trashes the graphics state. + +/StippleFill { + % The following code is needed to work around a NeWSprint bug. + + /tmpstip 1 index def + + % Change the scaling so that one user unit in user coordinates + % corresponds to the size of one stipple dot. + 1 EvenPixels dup scale + + % Compute the bounding box occupied by the path (which is now + % the clipping region), and round the lower coordinates down + % to the nearest starting point for the stipple pattern. Be + % careful about negative numbers, since the rounding works + % differently on them. + + pathbbox + 4 2 roll + 5 index div dup 0 lt {1 sub} if cvi 5 index mul 4 1 roll + 6 index div dup 0 lt {1 sub} if cvi 6 index mul 3 2 roll + + % Stack now: width height string y1 y2 x1 x2 + % Below is a doubly-nested for loop to iterate across this area + % in units of the stipple pattern size, going up columns then + % across rows, blasting out a stipple-pattern-sized rectangle at + % each position + + 6 index exch { + 2 index 5 index 3 index { + % Stack now: width height string y1 y2 x y + + gsave + 1 index exch translate + 5 index 5 index true matrix tmpstip imagemask + grestore + } for + pop + } for + pop pop pop pop pop +} bind def + +% -- AdjustColor -- +% Given a color value already set for output by the caller, adjusts +% that value to a grayscale or mono value if requested by the CL +% variable. + +/AdjustColor { + CL 2 lt { + currentgray + CL 0 eq { + .5 lt {0} {1} ifelse + } if + setgray + } if +} bind def + +% x y strings spacing xoffset yoffset justify stipple DrawText -- +% This procedure does all of the real work of drawing text. The +% color and font must already have been set by the caller, and the +% following arguments must be on the stack: +% +% x, y - Coordinates at which to draw text. +% strings - An array of strings, one for each line of the text item, +% in order from top to bottom. +% spacing - Spacing between lines. +% xoffset - Horizontal offset for text bbox relative to x and y: 0 for +% nw/w/sw anchor, -0.5 for n/center/s, and -1.0 for ne/e/se. +% yoffset - Vertical offset for text bbox relative to x and y: 0 for +% nw/n/ne anchor, +0.5 for w/center/e, and +1.0 for sw/s/se. +% justify - 0 for left justification, 0.5 for center, 1 for right justify. +% stipple - Boolean value indicating whether or not text is to be +% drawn in stippled fashion. If text is stippled, +% procedure StippleText must have been defined to call +% StippleFill in the right way. +% +% Also, when this procedure is invoked, the color and font must already +% have been set for the text. + +/DrawText { + /stipple exch def + /justify exch def + /yoffset exch def + /xoffset exch def + /spacing exch def + /strings exch def + + % First scan through all of the text to find the widest line. + + /lineLength 0 def + strings { + cstringwidth pop + dup lineLength gt {/lineLength exch def} {pop} ifelse + newpath + } forall + + % Compute the baseline offset and the actual font height. + + 0 0 moveto (TXygqPZ) false charpath + pathbbox dup /baseline exch def + exch pop exch sub /height exch def pop + newpath + + % Translate coordinates first so that the origin is at the upper-left + % corner of the text's bounding box. Remember that x and y for + % positioning are still on the stack. + + translate + lineLength xoffset mul + strings length 1 sub spacing mul height add yoffset mul translate + + % Now use the baseline and justification information to translate so + % that the origin is at the baseline and positioning point for the + % first line of text. + + justify lineLength mul baseline neg translate + + % Iterate over each of the lines to output it. For each line, + % compute its width again so it can be properly justified, then + % display it. + + strings { + dup cstringwidth pop + justify neg mul 0 moveto + stipple { + + + % The text is stippled, so turn it into a path and print + % by calling StippledText, which in turn calls StippleFill. + % Unfortunately, many Postscript interpreters will get + % overflow errors if we try to do the whole string at + % once, so do it a character at a time. + + gsave + /char (X) def + { + dup type /stringtype eq { + % This segment is a string. + { + char 0 3 -1 roll put + currentpoint + gsave + char true charpath clip StippleText + grestore + char stringwidth translate + moveto + } forall + } { + % This segment is glyph name + % Temporary override + currentfont /Encoding get exch 1 exch put + currentpoint + gsave (\001) true charpath clip StippleText + grestore + (\001) stringwidth translate + moveto + } ifelse + } forall + grestore + } {cstringshow} ifelse + 0 spacing neg translate + } forall +} bind def + +%%EndProlog +END + +1; +__END__ + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Checkbutton.pm b/Master/tlpkg/tlperl.old/lib/Tk/Checkbutton.pm new file mode 100644 index 00000000000..491d8cd2444 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Checkbutton.pm @@ -0,0 +1,42 @@ +package Tk::Checkbutton; +# Conversion from Tk4.0 button.tcl competed. +# Copyright (c) 1992-1994 The Regents of the University of California. +# Copyright (c) 1994 Sun Microsystems, Inc. +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or + + +use vars qw($VERSION); +$VERSION = '4.006'; # $Id: //depot/Tkutf8/Tk/Checkbutton.pm#6 $ + +# modify it under the same terms as Perl itself, subject +# to additional disclaimer in license.terms due to partial +# derivation from Tk4.0 sources. + +require Tk::Widget; +require Tk::Button; + +use base qw(Tk::Button); + +Construct Tk::Widget 'Checkbutton'; + +sub Tk_cmd { \&Tk::checkbutton } + + +sub ClassInit +{ + my ($class,$mw) = @_; + $mw->bind($class,'<Enter>', 'Enter'); + $mw->bind($class,'<Leave>', 'Leave'); + $mw->bind($class,'<1>', 'Invoke'); + $mw->bind($class,'<space>', 'Invoke'); + return $class; +} + +sub Invoke +{ + my $w = shift; + $w->invoke() unless($w->cget('-state') eq 'disabled'); +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Clipboard.pm b/Master/tlpkg/tlperl.old/lib/Tk/Clipboard.pm new file mode 100644 index 00000000000..b0eb0ea2b07 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Clipboard.pm @@ -0,0 +1,122 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::Clipboard; +use strict; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #8 $ =~ /\D(\d+)\s*$/; + +use AutoLoader qw(AUTOLOAD); +use Tk qw(catch); + +sub clipEvents +{ + return qw[Copy Cut Paste]; +} + +sub ClassInit +{ + my ($class,$mw) = @_; + foreach my $op ($class->clipEvents) + { + $mw->Tk::bind($class,"<<$op>>","clipboard$op"); + } + return $class; +} + +sub clipboardSet +{ + my $w = shift; + $w->clipboardClear; + $w->clipboardAppend(@_); +} + +sub clipboardCopy +{ + my $w = shift; + my $val = $w->getSelected; + if (defined $val) + { + $w->clipboardSet('--',$val); + } + return $val; +} + +sub clipboardCut +{ + my $w = shift; + my $val = $w->clipboardCopy; + if (defined $val) + { + $w->deleteSelected; + } + return $val; +} + +sub clipboardGet +{ + my $w = shift; + $w->SelectionGet('-selection','CLIPBOARD',@_); +} + +sub clipboardPaste +{ + my $w = shift; + local $@; + catch + { +## Different from Tcl/Tk version: +# if ($w->windowingsystem eq 'x11') +# { +# catch +# { +# $w->deleteSelected; +# }; +# } + $w->insert("insert", $w->clipboardGet); + $w->SeeInsert if $w->can('SeeInsert'); + }; +} + +sub clipboardOperations +{ + my @class = (); + my $mw = shift; + if (ref $mw) + { + $mw = $mw->DelegateFor('bind'); + } + else + { + push(@class,$mw); + $mw = shift; + } + while (@_) + { + my $op = shift; + $mw->Tk::bind(@class,"<<$op>>","clipboard$op"); + } +} + +# These methods work for Entry and Text +# and can be overridden where they don't work + +sub deleteSelected +{ + my $w = shift; + catch { $w->delete('sel.first','sel.last') }; +} + + +1; +__END__ + +sub getSelected +{ + my $w = shift; + my $val = Tk::catch { $w->get('sel.first','sel.last') }; + return $val; +} + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/CmdLine.pm b/Master/tlpkg/tlperl.old/lib/Tk/CmdLine.pm new file mode 100644 index 00000000000..2e821e826ae --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/CmdLine.pm @@ -0,0 +1,954 @@ +package Tk::CmdLine; # -*-Perl-*- + +#/----------------------------------------------------------------------------// +#/ Module: Tk/CmdLine.pm +#/ +#/ Purpose: +#/ +#/ Process standard X11 command line options and set initial resources. +#/ +#/ Author: ???? Date: ???? +#/ +#/ History: SEE POD +#/----------------------------------------------------------------------------// + +use vars qw($VERSION); +$VERSION = '4.006'; # $Id: //depot/Tkutf8/Tk/CmdLine.pm#6 $ + +use 5.004; + +use strict; + +use Config; + +my $OBJECT = undef; # define the current object + +#/----------------------------------------------------------------------------// +#/ Constructor +#/ Returns the object reference. +#/----------------------------------------------------------------------------// + +sub new # Tk::CmdLine::new() +{ + my $this = shift(@_); + my $class = ref($this) || $this; + + my $name = 'pTk'; + $name = $1 if (($0 =~ m/(?:^|[\/\\])([\w-]+)(?:\.\w+)?$/) && ($1 ne '-e')); + + my $self = { + name => $name, + config => { -name => $name }, + options => {}, + methods => {}, + command => [], + synchronous => 0, + iconic => 0, + motif => ($Tk::strictMotif || 0), + resources => {} }; + + return bless($self, $class); +} + +#/----------------------------------------------------------------------------// +#/ Process the arguments in a given array or in @ARGV. +#/ Returns the object reference. +#/----------------------------------------------------------------------------// + +sub Argument_ # Tk::CmdLine::Argument_($flag) # private method +{ + my $self = shift(@_); + my $flag = shift(@_); + unless ($self->{offset} < @{$self->{argv}}) + { + die 'Usage: ', $self->{name}, ' ... ', $flag, " <argument> ...\n"; + } + return splice(@{$self->{argv}}, $self->{offset}, 1); +} + +sub Config_ # Tk::CmdLine::Config_($flag, $name) # private method +{ + my $self = shift(@_); + my ($flag, $name) = @_; + my $val = $self->Argument_($flag); + push(@{$self->{command}}, $flag, $val); + $self->{config}->{"-$name"} = $val; +} + +sub Flag_ # Tk::CmdLine::Flag_($flag, $name) # private method +{ + my $self = shift(@_); + my ($flag, $name) = @_; + push(@{$self->{command}}, $flag); + $self->{$name} = 1; +} + +sub Option_ # Tk::CmdLine::Option_($flag, $name) # private method +{ + my $self = shift(@_); + my ($flag, $name) = @_; + my $val = $self->Argument_($flag); + push(@{$self->{command}}, $flag, $val); + $self->{options}->{"*$name"} = $val; +} + +sub Method_ # Tk::CmdLine::Method_($flag, $name) # private method +{ + my $self = shift(@_); + my ($flag, $name) = @_; + my $val = $self->Argument_($flag); + push(@{$self->{command}}, $flag, $val); + $self->{methods}->{$name} = $val; +} + +sub Resource_ # Tk::CmdLine::Resource_($flag, $name) # private method +{ + my $self = shift(@_); + my ($flag, $name) = @_; + my $val = $self->Argument_($flag); + if ($val =~ /^([^!:\s]+)*\s*:\s*(.*)$/) + { + push(@{$self->{command}}, $flag, $val); + $self->{options}->{$1} = $2; + } +} + +my %Method = ( + background => 'Option_', + bg => 'background', # alias + class => 'Config_', + display => 'screen', # alias + fg => 'foreground', # alias + fn => 'font', # alias + font => 'Option_', + foreground => 'Option_', + geometry => 'Method_', + iconic => 'Flag_', + iconposition => 'Method_', + motif => 'Flag_', + name => 'Config_', + screen => 'Config_', + synchronous => 'Flag_', + title => 'Config_', + xrm => 'Resource_' +); + +sub SetArguments # Tk::CmdLine::SetArguments([@argument]) +{ + my $self = (@_ # define the object as necessary + ? ((ref($_[0]) eq __PACKAGE__) + ? shift(@_) + : (($_[0] eq __PACKAGE__) ? shift(@_) : 1) && ($OBJECT ||= __PACKAGE__->new())) + : ($OBJECT ||= __PACKAGE__->new())); + $OBJECT = $self; # update the current object + $self->{argv} = (@_ ? [ @_ ] : \@ARGV); + $self->{offset} = 0; # its existence will denote that this method has been called + + my @option = (); + + while ($self->{offset} < @{$self->{argv}}) + { + last if ($self->{argv}->[$self->{offset}] eq '--'); + unless ( + (($self->{argv}->[$self->{offset}] =~ /^-{1,2}(\w+)$/) && (@option = $1)) || + (($self->{argv}->[$self->{offset}] =~ /^--(\w+)=(.*)$/) && (@option = ($1, $2)))) + { + ++$self->{offset}; + next; + } + + next if (!exists($Method{$option[0]}) && ++$self->{offset}); + + $option[0] = $Method{$option[0]} if exists($Method{$Method{$option[0]}}); + + my $method = $Method{$option[0]}; + + if (@option > 1) # replace --<option>=<value> with <value> + { + $self->{argv}->[$self->{offset}] = $option[1]; + } + else # remove the argument + { + splice(@{$self->{argv}}, $self->{offset}, 1); + } + + $self->$method(('-' . $option[0]), $option[0]); + } + + $self->{config}->{-class} ||= ucfirst($self->{config}->{-name}); + + delete($self->{argv}); # no longer needed + + return $self; +} + +use vars qw(&process); *process = \&SetArguments; # alias to keep old code happy + +#/----------------------------------------------------------------------------// +#/ Get a list of the arguments that have been processed by SetArguments(). +#/ Returns an array. +#/----------------------------------------------------------------------------// + +sub GetArguments # Tk::CmdLine::GetArguments() +{ + my $self = (@_ # define the object as necessary + ? ((ref($_[0]) eq __PACKAGE__) + ? shift(@_) + : (($_[0] eq __PACKAGE__) ? shift(@_) : 1) && ($OBJECT ||= __PACKAGE__->new())) + : ($OBJECT ||= __PACKAGE__->new())); + $OBJECT = $self; # update the current object + + $self->SetArguments() unless exists($self->{offset}); # set arguments if not yet done + + return @{$self->{command}}; +} + +#/----------------------------------------------------------------------------// +#/ Get the value of a configuration option (default: -class). +#/ Returns the option value. +#/----------------------------------------------------------------------------// + +sub cget # Tk::CmdLine::cget([$option]) +{ + my $self = (@_ # define the object as necessary + ? ((ref($_[0]) eq __PACKAGE__) + ? shift(@_) + : (($_[0] eq __PACKAGE__) ? shift(@_) : 1) && ($OBJECT ||= __PACKAGE__->new())) + : ($OBJECT ||= __PACKAGE__->new())); + $OBJECT = $self; # update the current object + my $option = shift(@_) || '-class'; + + $self->SetArguments() unless exists($self->{offset}); # set arguments if not yet done + + return (exists($self->{config}->{$option}) ? $self->{config}->{$option} : undef); +} + +#/----------------------------------------------------------------------------// + +sub CreateArgs # Tk::CmdLine::CreateArgs() +{ + my $self = (@_ # define the object as necessary + ? ((ref($_[0]) eq __PACKAGE__) + ? shift(@_) + : (($_[0] eq __PACKAGE__) ? shift(@_) : 1) && ($OBJECT ||= __PACKAGE__->new())) + : ($OBJECT ||= __PACKAGE__->new())); + $OBJECT = $self; # update the current object + + $self->SetArguments() unless exists($self->{offset}); # set arguments if not yet done + + return $self->{config}; +} + +#/----------------------------------------------------------------------------// + +sub Tk::MainWindow::apply_command_line +{ + my $mw = shift(@_); + + my $self = ($OBJECT ||= __PACKAGE__->new()); + + $self->SetArguments() unless exists($self->{offset}); # set arguments if not yet done + + foreach my $priority (keys(%{$self->{resources}})) + { + foreach my $resource (@{$self->{resources}->{$priority}}) + { + $mw->optionAdd(@{$resource}, $priority); + } + } + + foreach my $key (keys(%{$self->{options}})) + { + $mw->optionAdd($key => $self->{options}->{$key}, 'interactive'); + } + + foreach my $key (keys(%{$self->{methods}})) + { + $mw->$key($self->{methods}->{$key}); + } + + if ($self->{methods}->{geometry}) + { + if ($self->{methods}->{geometry} =~ /[+-]\d+[+-]\d+/) + { + $mw->positionfrom('user'); + } + if ($self->{methods}->{geometry} =~ /\d+x\d+/) + { + $mw->sizefrom('user'); + } + delete $self->{methods}->{geometry}; # XXX needed? + } + + $mw->Synchronize() if $self->{synchronous}; + + if ($self->{iconic}) + { + $mw->iconify(); + $self->{iconic} = 0; + } + + $Tk::strictMotif = ($self->{motif} || 0); + + # Both these are needed to reliably save state + # but 'hostname' is tricky to do portably. + # $mw->client(hostname()); + $mw->protocol('WM_SAVE_YOURSELF' => ['WMSaveYourself',$mw]); + $mw->command([ $self->{name}, @{$self->{command}} ]); +} + +#/----------------------------------------------------------------------------// +#/ Set the initial resources. +#/ Returns the object reference. +#/----------------------------------------------------------------------------// + +sub SetResources # Tk::CmdLine::SetResources((\@resource | $resource) [, $priority]) +{ + my $self = (@_ # define the object as necessary + ? ((ref($_[0]) eq __PACKAGE__) + ? shift(@_) + : (($_[0] eq __PACKAGE__) ? shift(@_) : 1) && ($OBJECT ||= __PACKAGE__->new())) + : ($OBJECT ||= __PACKAGE__->new())); + $OBJECT = $self; # update the current object + + $self->SetArguments() unless exists($self->{offset}); # set arguments if not yet done + return $self unless @_; + + my $data = shift(@_); + my $priority = shift(@_) || 'userDefault'; + + $self->{resources}->{$priority} = [] unless exists($self->{resources}->{$priority}); + + foreach my $resource ((ref($data) eq 'ARRAY') ? @{$data} : $data) + { + if (ref($resource) eq 'ARRAY') # resources in [ <pattern>, <value> ] format + { + push(@{$self->{resources}->{$priority}}, [ @{$resource} ]) + if (@{$resource} == 2); + } + else # resources in resource file format + { + push(@{$self->{resources}->{$priority}}, [ $1, $2 ]) + if ($resource =~ /^([^!:\s]+)*\s*:\s*(.*)$/); + } + } + + return $self; +} + +#/----------------------------------------------------------------------------// +#/ Load initial resources from one or more files (default: $XFILESEARCHPATH with +#/ priority 'startupFile' and $XUSERFILESEARCHPATH with priority 'userDefault'). +#/ Returns the object reference. +#/----------------------------------------------------------------------------// + +sub LoadResources # Tk::CmdLine::LoadResources([%options]) +{ + my $self = (@_ # define the object as necessary + ? ((ref($_[0]) eq __PACKAGE__) + ? shift(@_) + : (($_[0] eq __PACKAGE__) ? shift(@_) : 1) && ($OBJECT ||= __PACKAGE__->new())) + : ($OBJECT ||= __PACKAGE__->new())); + $OBJECT = $self; # update the current object + + $self->SetArguments() unless exists($self->{offset}); # set arguments if not yet done + + my %options = @_; + + my @file = (); + my $echo = (exists($options{-echo}) + ? (defined($options{-echo}) ? $options{-echo} : \*STDOUT) : undef); + + unless (%options && (exists($options{-file}) || exists($options{-symbol}))) + { + @file = ( + { -symbol => 'XFILESEARCHPATH', -priority => 'startupFile' }, + { -symbol => 'XUSERFILESEARCHPATH', -priority => 'userDefault' } ); + } + else + { + @file = { %options }; + } + + my $delimiter = (($^O eq 'MSWin32') ? ';' : ':'); + + foreach my $file (@file) + { + my $fileSpec = $file->{-spec} = undef; + if (exists($file->{-symbol})) + { + my $xpath = undef; + if ($file->{-symbol} eq 'XUSERFILESEARCHPATH') + { + $file->{-priority} ||= 'userDefault'; + foreach my $symbol (qw(XUSERFILESEARCHPATH XAPPLRESDIR HOME)) + { + last if (exists($ENV{$symbol}) && ($xpath = $ENV{$symbol})); + } + next unless defined($xpath); + } + else + { + $file->{-priority} ||= (($file->{-symbol} eq 'XFILESEARCHPATH') + ? 'startupFile' : 'userDefault'); + next unless ( + exists($ENV{$file->{-symbol}}) && ($xpath = $ENV{$file->{-symbol}})); + } + + unless (exists($self->{translation})) + { + $self->{translation} = { + '%l' => '', # ignored + '%C' => '', # ignored + '%S' => '', # ignored + '%L' => ($ENV{LANG} || 'C'), # language + '%T' => 'app-defaults', # type + '%N' => $self->{config}->{-class} # filename + }; + } + + my @postfix = map({ $_ . '/' . $self->{config}->{-class} } + ('/' . $self->{translation}->{'%L'}), ''); + + ITEM: foreach $fileSpec (split($Config{path_sep}, $xpath)) + { + if ($fileSpec =~ s/(%[A-Za-z])/$self->{translation}->{$1}/g) # File Pattern + { + if (defined($echo) && ($file->{-symbol} ne 'XFILESEARCHPATH')) + { + print $echo 'Checking ', $fileSpec, "\n"; + } + next unless ((-f $fileSpec) && (-r _) && (-s _)); + $file->{-spec} = $fileSpec; + last; + } + else # Directory - Check for <Directory>/$LANG/<Class>, <Directory>/<CLASS> + { + foreach my $postfix (@postfix) + { + my $fileSpec2 = $fileSpec . $postfix; + if (defined($echo) && ($file->{-symbol} ne 'XFILESEARCHPATH')) + { + print $echo 'Checking ', $fileSpec2, "\n"; + } + next unless ((-f $fileSpec2) && (-r _) && (-s _)); + $file->{-spec} = $fileSpec2; + last ITEM; + } + } + } + } + elsif (exists($file->{-file}) && ($fileSpec = $file->{-file})) + { + print $echo 'Checking ', $fileSpec, "\n" if defined($echo); + next unless ((-f $fileSpec) && (-r _) && (-s _)); + $file->{-spec} = $fileSpec; + } + } + + foreach my $file (@file) + { + next unless defined($file->{-spec}); + local *SPEC; + next unless open(SPEC,$file->{-spec}); + print $echo ' Loading ', $file->{-spec}, "\n" if defined($echo); + + my $resource = undef; + my @resource = (); + my $continuation = 0; + + while (defined(my $line = <SPEC>)) + { + chomp($line); + next if ($line =~ /^\s*$/); # skip blank lines + next if ($line =~ /^\s*!/); # skip comments + $continuation = ($line =~ s/\s*\\$/ /); # search for trailing backslash + unless (defined($resource)) # it is the first line + { + $resource = $line; + } + else # it is a continuation line + { + $line =~ s/^\s*//; # remove leading whitespace + $resource .= $line; + } + next if $continuation; + push(@resource, [ $1, $2 ]) if ($resource =~ /^([^:\s]+)*\s*:\s*(.*)$/); + $resource = undef; + } + + close(SPEC); + + if (defined($resource)) # special case - EOF after line with trailing backslash + { + push(@resource, [ $1, $2 ]) if ($resource =~ /^([^:\s]+)*\s*:\s*(.*)$/); + } + + $self->SetResources(\@resource, $file->{-priority}) if @resource; + } + + return $self; +} + +#/----------------------------------------------------------------------------// + +1; + +__END__ + +=cut + +=head1 NAME + +Tk::CmdLine - Process standard X11 command line options and set initial resources + +=for pm Tk/CmdLine.pm + +=for category Creating and Configuring Widgets + +=head1 SYNOPSIS + + Tk::CmdLine::SetArguments([@argument]); + + my $value = Tk::CmdLine::cget([$option]); + + Tk::CmdLine::SetResources((\@resource | $resource) [, $priority]); + + Tk::CmdLine::LoadResources( + [ -symbol => $symbol ] + [ -file => $fileSpec ] + [ -priority => $priority ] + [ -echo => $fileHandle ] ); + +=head1 DESCRIPTION + +Process standard X11 command line options and set initial resources. + +The X11R5 man page for X11 says: "Most X programs attempt to use the same names +for command line options and arguments. All applications written with the +X Toolkit Intrinsics automatically accept the following options: ...". +This module processes these command line options for perl/Tk applications +using the C<SetArguments>() function. + +This module can optionally be used to load initial resources explicitly via +function C<SetResources>(), or from specified files (default: the standard X11 +application-specific resource files) via function C<LoadResources>(). + +=head2 Command Line Options + +=over 4 + +=item B<-background> I<Color> | B<-bg> I<Color> + +Specifies the color to be used for the window background. + +=item B<-class> I<Class> + +Specifies the class under which resources for the application should be found. +This option is useful in shell aliases to distinguish between invocations +of an application, without resorting to creating links to alter the executable +file name. + +=item B<-display> I<Display> | B<-screen> I<Display> + +Specifies the name of the X server to be used. + +=item B<-font> I<Font> | B<-fn> I<Font> + +Specifies the font to be used for displaying text. + +=item B<-foreground> I<Color> | B<-fg> I<Color> + +Specifies the color to be used for text or graphics. + +=item B<-geometry> I<Geometry> + +Specifies the initial size and location of the I<first> +L<MainWindow|Tk::MainWindow>. + +=item B<-iconic> + +Indicates that the user would prefer that the application's windows initially +not be visible as if the windows had been immediately iconified by the user. +Window managers may choose not to honor the application's request. + +=item B<-motif> + +Specifies that the application should adhere as closely as possible to Motif +look-and-feel standards. For example, active elements such as buttons and +scrollbar sliders will not change color when the pointer passes over them. + +=item B<-name> I<Name> + +Specifies the name under which resources for the application should be found. +This option is useful in shell aliases to distinguish between invocations +of an application, without resorting to creating links to alter the executable +file name. + +=item B<-synchronous> + +Indicates that requests to the X server should be sent synchronously, instead of +asynchronously. Since Xlib normally buffers requests to the server, errors do +do not necessarily get reported immediately after they occur. This option turns +off the buffering so that the application can be debugged. It should never +be used with a working program. + +=item B<-title> I<TitleString> + +This option specifies the title to be used for this window. This information is +sometimes used by a window manager to provide some sort of header identifying +the window. + +=item B<-xrm> I<ResourceString> + +Specifies a resource pattern and value to override any defaults. It is also +very useful for setting resources that do not have explicit command line +arguments. + +The I<ResourceString> is of the form E<lt>I<pattern>E<gt>:E<lt>I<value>E<gt>, +that is (the first) ':' is used to determine which part is pattern and which +part is value. The (E<lt>I<pattern>E<gt>, E<lt>I<value>E<gt>) pair is entered +into the options database with B<optionAdd> (for each +L<MainWindow|Tk::MainWindow> configured), with I<interactive> priority. + +=back + +=head2 Initial Resources + +There are several mechanism for initializing the resource database to be used +by an X11 application. Resources may be defined in a $C<HOME>/.Xdefaults file, +a system application defaults file (e.g. +/usr/lib/X11/app-defaults/E<lt>B<CLASS>E<gt>), +or a user application defaults file (e.g. $C<HOME>/E<lt>B<CLASS>E<gt>). +The Tk::CmdLine functionality for setting initial resources concerns itself +with the latter two. + +Resource files contain data lines of the form +E<lt>I<pattern>E<gt>:E<lt>I<value>E<gt>. +They may also contain blank lines and comment lines (denoted +by a ! character as the first non-blank character). Refer to L<option|Tk::option> +for a description of E<lt>I<pattern>E<gt>:E<lt>I<value>E<gt>. + +=over 4 + +=item System Application Defaults Files + +System application defaults files may be specified via environment variable +$C<XFILESEARCHPATH> which, if set, contains a list of file patterns +(joined using the OS-dependent path delimiter, e.g. colon on B<UNIX>). + +=item User Application Defaults Files + +User application defaults files may be specified via environment variables +$C<XUSERFILESEARCHPATH>, $C<XAPPLRESDIR> or $C<HOME>. + +=back + +=head1 METHODS + +=over 4 + +=item B<SetArguments> - Tk::CmdLine::SetArguments([@argument]) + +Extract the X11 options contained in a specified array (@ARGV by default). + + Tk::CmdLine::SetArguments([@argument]) + +The X11 options may be specified using a single dash I<-> as per the X11 +convention, or using two dashes I<--> as per the POSIX standard (e.g. +B<-geometry> I<100x100>, B<-geometry> I<100x100> or B<-geometry=>I<100x100>). +The options may be interspersed with other options or arguments. +A I<--> by itself terminates option processing. + +By default, command line options are extracted from @ARGV the first time +a MainWindow is created. The Tk::MainWindow constructor indirectly invokes +C<SetArguments>() to do this. + +=item B<GetArguments> - Tk::CmdLine::GetArguments() + +Get a list of the X11 options that have been processed by C<SetArguments>(). +(C<GetArguments>() first invokes C<SetArguments>() if it has not already been invoked.) + +=item B<cget> - Tk::CmdLine::cget([$option]) + +Get the value of a configuration option specified via C<SetArguments>(). +(C<cget>() first invokes C<SetArguments>() if it has not already been invoked.) + + Tk::CmdLine::cget([$option]) + +The valid options are: B<-class>, B<-name>, B<-screen> and B<-title>. +If no option is specified, B<-class> is implied. + +A typical use of C<cget>() might be to obtain the application class in order +to define the name of a resource file to be loaded in via C<LoadResources>(). + + my $class = Tk::CmdLine::cget(); # process command line and return class + +=item B<SetResources> - Tk::CmdLine::SetResources((\@resource | $resource) [, $priority]) + +Set the initial resources. + + Tk::CmdLine::SetResources((\@resource | $resource) [, $priority]) + +A single resource may be specified using a string of the form +'E<lt>I<pattern>E<gt>:E<lt>I<value>E<gt>'. Multiple resources may be specified +by passing an array reference whose elements are either strings of the above +form, and/or anonymous arrays of the form [ E<lt>I<pattern>E<gt>, +E<lt>I<value>E<gt> ]. The optional second argument specifies the priority, +as defined in L<option|Tk::option>, to be associated with the resources +(default: I<userDefault>). + +Note that C<SetResources>() first invokes C<SetArguments>() if it has not already +been invoked. + +=item B<LoadResources> - Tk::CmdLine::LoadResources([%options]) + +Load initial resources from one or more files. + + Tk::CmdLine::LoadResources( + [ -symbol => $symbol ] + [ -file => $fileSpec ] + [ -priority => $priority ] + [ -echo => $fileHandle ] ); + +[ B<-symbol> =E<gt> $symbol ] specifies the name of an environment variable +that, if set, defines a list of one or more directories and/or file patterns +(joined using the OS-dependent path delimiter, e.g. colon on B<UNIX>). +$C<XUSERFILESEARCHPATH> is a special case. +If $C<XUSERFILESEARCHPATH> is not set, $C<XAPPLRESDIR> is checked instead. +If $C<XAPPLRESDIR> is not set, $C<HOME> is checked instead. + +An item is identified as a file pattern if it contains one or more /%[A-Za-z]/ +patterns. Only patterns B<%L>, B<%T> and B<%N> are currently recognized. All +others are replaced with the null string. Pattern B<%L> is translated into +$C<LANG>. Pattern B<%T> is translated into I<app-defaults>. Pattern B<%N> is +translated into the application class name. + +Each file pattern, after substitutions are applied, is assumed to define a +FileSpec to be examined. + +When a directory is specified, FileSpecs +E<lt>B<DIRECTORY>E<gt>/E<lt>B<LANG>E<gt>/E<lt>B<CLASS>E<gt> +and E<lt>B<DIRECTORY>E<gt>/E<lt>B<CLASS>E<gt> are defined, in that order. + +[ B<-file> =E<gt> $fileSpec ] specifies a resource file to be loaded in. +The file is silently skipped if if does not exist, or if it is not readable. + +[ B<-priority> =E<gt> $priority ] specifies the priority, as defined in +L<option|Tk::option>, to be associated with the resources +(default: I<userDefault>). + +[ B<-echo> =E<gt> $fileHandle ] may be used to specify that a line should be +printed to the corresponding FileHandle (default: \*STDOUT) everytime a file +is examined / loaded. + +If no B<-symbol> or B<-file> options are specified, C<LoadResources>() +processes symbol $C<XFILESEARCHPATH> with priority I<startupFile> and +$C<XUSERFILESEARCHPATH> with priority I<userDefault>. +(Note that $C<XFILESEARCHPATH> and $C<XUSERFILESEARCHPATH> are supposed to +contain only patterns. $C<XAPPLRESDIR> and $C<HOME> are supposed to be a single +directory. C<LoadResources>() does not check/care whether this is the case.) + +For each set of FileSpecs, C<LoadResources>() examines each FileSpec to +determine if the file exists and is readable. The first file that meets this +criteria is read in and C<SetResources>() is invoked. + +Note that C<LoadResources>() first invokes C<SetArguments>() if it has not already +been invoked. + +=back + +=head1 NOTES + +This module is an object-oriented module whose methods can be invoked as object +methods, class methods or regular functions. This is accomplished via an +internally-maintained object reference which is created as necessary, and which +always points to the last object used. C<SetArguments>(), C<SetResources>() and +C<LoadResources>() return the object reference. + +=head1 EXAMPLES + +=over + +=item 1 + +@ARGV is processed by Tk::CmdLine at MainWindow creation. + + use Tk; + + # <Process @ARGV - ignoring all X11-specific options> + + my $mw = MainWindow->new(); + + MainLoop(); + +=item 2 + +@ARGV is processed by Tk::CmdLine before MainWindow creation. +An @ARGV of (--geometry=100x100 -opt1 a b c -bg red) +is equal to (-opt1 a b c) after C<SetArguments>() is invoked. + + use Tk; + + Tk::CmdLine::SetArguments(); # Tk::CmdLine->SetArguments() works too + + # <Process @ARGV - not worrying about X11-specific options> + + my $mw = MainWindow->new(); + + MainLoop(); + +=item 3 + +Just like 2) except that default arguments are loaded first. + + use Tk; + + Tk::CmdLine::SetArguments(qw(-name test -iconic)); + Tk::CmdLine::SetArguments(); + + # <Process @ARGV - not worrying about X11-specific options> + + my $mw = MainWindow->new(); + + MainLoop(); + +=item 4 + +@ARGV is processed by Tk::CmdLine before MainWindow creation. +Standard resource files are loaded in before MainWindow creation. + + use Tk; + + Tk::CmdLine::SetArguments(); + + # <Process @ARGV - not worrying about X11-specific options> + + Tk::CmdLine::LoadResources(); + + my $mw = MainWindow->new(); + + MainLoop(); + +=item 5 + +@ARGV is processed by Tk::CmdLine before MainWindow creation. +Standard resource files are loaded in before MainWindow creation +using non-default priorities. + + use Tk; + + Tk::CmdLine::SetArguments(); + + # <Process @ARGV - not worrying about X11-specific options> + + Tk::CmdLine::LoadResources(-echo => \*STDOUT, + -priority => 65, -symbol => 'XFILESEARCHPATH' ); + Tk::CmdLine::LoadResources(-echo => \*STDOUT, + -priority => 75, -symbol => 'XUSERFILESEARCHPATH' ); + + my $mw = MainWindow->new(); + + MainLoop(); + +=item 6 + +@ARGV is processed by Tk::CmdLine before MainWindow creation. +Standard resource files are loaded in before MainWindow creation. +Individual resources are also loaded in before MainWindow creation. + + use Tk; + + Tk::CmdLine::SetArguments(); + + # <Process @ARGV - not worrying about X11-specific options> + + Tk::CmdLine::LoadResources(); + + Tk::CmdLine::SetResources( # set a single resource + '*Button*background: red', + 'widgetDefault' ); + + Tk::CmdLine::SetResources( # set multiple resources + [ '*Button*background: red', '*Button*foreground: blue' ], + 'widgetDefault' ); + + my $mw = MainWindow->new(); + + MainLoop(); + +=back + +=head1 ENVIRONMENT + +=over 4 + +=item B<HOME> (optional) + +Home directory which may contain user application defaults files as +$C<HOME>/$C<LANG>/E<lt>B<CLASS>E<gt> or $C<HOME>/E<lt>B<CLASS>E<gt>. + +=item B<LANG> (optional) + +The current language (default: I<C>). + +=item B<XFILESEARCHPATH> (optional) + +List of FileSpec patterns +(joined using the OS-dependent path delimiter, e.g. colon on B<UNIX>) +used in defining system application defaults files. + +=item B<XUSERFILESEARCHPATH> (optional) + +List of FileSpec patterns +(joined using the OS-dependent path delimiter, e.g. colon on B<UNIX>) +used in defining user application defaults files. + +=item B<XAPPLRESDIR> (optional) + +Directory containing user application defaults files as +$C<XAPPLRESDIR>/$C<LANG>/E<lt>B<CLASS>E<gt> or +$C<XAPPLRESDIR>/E<lt>B<CLASS>E<gt>. + +=back + +=head1 SEE ALSO + +L<MainWindow|Tk::MainWindow> +L<option|Tk::option> + +=head1 HISTORY + +=over 4 + +=item * + +1999.03.04 Ben Pavon E<lt>ben.pavon@hsc.hac.comE<gt> + +Rewritten as an object-oriented module. + +Allow one to process command line options in a specified array (@ARGV by default). +Eliminate restrictions on the format and location of the options within the array +(previously the X11 options could not be specified in POSIX format and had to be +at the beginning of the array). + +Added the C<SetResources>() and C<LoadResources>() functions to allow the definition +of resources prior to MainWindow creation. + +=item * + +2000.08.31 Ben Pavon E<lt>ben.pavon@hsc.hac.comE<gt> + +Added the C<GetArguments>() method which returns the list of arguments that +have been processed by C<SetArguments>(). + +Modified C<LoadResources>() to split the symbols using the OS-dependent +path delimiter defined in the B<Config> module. + +Modified C<LoadResources>() to eliminate a warning message when processing +patterns B<%l>, B<%C>, B<%S>. + +=back + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/ColorEdit.xpm b/Master/tlpkg/tlperl.old/lib/Tk/ColorEdit.xpm new file mode 100644 index 00000000000..ef3474cd869 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/ColorEdit.xpm @@ -0,0 +1,58 @@ +/* XPM */ +static char * ColorEditor_xpm[] = { +"48 48 6 1", +" c #0000FFFF0000", +". c #FFFFFFFF0000", +"X c #FFFF00000000", +"o c #000000000000", +"O c #0000FFFFFFFF", +"+ c #00000000FFFF", +" . . ......X..XXXXXXXXXXXXXXXX", +" . .X.X. X...XX.XXXXXXXXXXX", +" . . . ... ...XXXXXXXXXXXXXX", +" . . .. .....XX.XXXXXXXXXXXX", +" . .X.X...XXX..XXXXXXXXXXXX", +" .. . ....X...X.XXXXXXXXX", +" .. ..X.. . ..X..XXXXXXXX", +" .... ..X.X..X.XXXXXXX", +" ... .X. X...X...XX.XXX", +" . .. ... XX...XXXX..XXXX", +" ooo o ooo. . .. .X...X..X.XXXXX", +" oo oo oo. . . . .......X.X.XX", +" oo o oo . . .. ........XX.XXXX", +" oo ooo oo ooo Xooo.oo..... X XX.X", +" oo o oo oo o oo ooo o.. . X...X X", +" oo oo oo oo oo oo .oo . X.X.....XX ", +"O oo o oo oo oo oo oo oo. ... X..... .", +"O O oo oo oo o oo ooo o. oo . ... .X..X", +"O OOOooooO ooo ooo ooo oo ... ....... X ", +" O OOO . . .. ... ..", +"OOO OOOO OO O . .... . . .. .", +" + O O O O .. .. . .", +" O OOO OO . .. .... ", +"OOOOO O OO . .. . ... ", +"+OOOO OOOO OO O ... .. ..", +" O+OO OO O . ", +"OOOOOOOOoooooooOOOO ooo oo .... ", +"OO++ OOO ooO OoOO oo oo oo .. ", +"+OOOOOOOOooOOOo O O oo oo .", +"++OOO +oo+oOO O oo oo ooo ooooo ooo ooo oo. ", +"+OO O OOoooooO O o ooo oo oo o oo ooo o ", +"++++ O OooOOoO Ooo Ooo oo oo oo oo oo ", +"+++OOOO ooOOOoOOooOOooO oo oo oo oo oo ", +"++++++ Ooo OOoOOooOooo ooo ooo o oo o oo ", +"+++O+++oooooooOOOooOoooOooo ooo Oooo oo ", +"++++++++O++OOOO O OOOOOOO ", +"++O++++O+O+OOOOOOO O O OOOOOO O ", +"+++O+++OOO+OO OOOO O OO O O O ", +"++++++++O++O OO OO OO OOO OO O O ", +"+++++++++++++ OOOOOO OOOO OO OO ", +"+++++++++++++O+ +O OOOO OOO OOO OOO ", +"++++++++++++++ OOOOO O OOOOOOOOOO ", +"+++++++++++++ ++ OO +O OOOOO O O O ", +"+++++++++++++++O+++O+O+O OOOOOOOOOO O ", +"+++++++++++++O++++O++ O OOO O OOO OO ", +"++++++++++++++++O+++O+O+OOOO OOOO O OO ", +"+++++++++++++++++++O+++ +++O OOOOOO OO O ", +"++++++++++++++++++++++ +++ O OOOOOOOOO "}; + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/ColorEditor.pm b/Master/tlpkg/tlperl.old/lib/Tk/ColorEditor.pm new file mode 100644 index 00000000000..e84b0077410 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/ColorEditor.pm @@ -0,0 +1,761 @@ +package Tk::ColorSelect; +use strict; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #8 $ =~ /\D(\d+)\s*$/; + +use Tk qw(Ev); + +require Tk::Frame; + +use base qw(Tk::Frame); +Construct Tk::Widget 'ColorSelect'; + +sub Populate +{ + my ($middle,$args) = @_; + my($i, @a); + require Tk::Config; + my(@xlibpath) = map { s/^-L//; "$_/X11/rgb.txt" } + split /\s+/, $Tk::Config::xlib; + foreach $i (@xlibpath, + '/usr/local/lib/X11/rgb.txt', '/usr/lib/X11/rgb.txt', + '/usr/X11R6/lib/X11/rgb.txt', + '/usr/local/X11R5/lib/X11/rgb.txt', '/X11/R5/lib/X11/rgb.txt', + '/X11/R4/lib/rgb/rgb.txt', '/usr/openwin/lib/X11/rgb.txt') { + local *FOO; + next if ! open FOO, $i; + my $middle_left = $middle->Frame; + $middle_left->pack( + -side => 'left', + -padx => '0.25c', + -pady => '0.25c', + ); + my $names = $middle->Listbox( + -width => 20, + -height => 12, + -relief => 'sunken', + -borderwidth => 2, + -exportselection => 0, + ); + + $names->bind('<Double-1>' => [$middle,'color',Ev(['getSelected'])]); + + my $scroll = $middle->Scrollbar( + -orient => 'vertical', + -command => ['yview', $names], + -relief => 'sunken', + -borderwidth => 2, + ); + $names->configure(-yscrollcommand => ['set',$scroll]); + $names->pack(-in => $middle_left, -side => 'left'); + $scroll->pack(-in => $middle_left, -side => 'right', -fill => 'y'); + + while(<FOO>) { + chomp; + next if /^!/; + my @a = split; + my $color = join(' ', @a[3 .. $#a]); + my $hex; + eval { $hex = $middle->Hex($color); }; + if ($@) { + #print STDERR "unknown color: '$color'\n"; + if ($@ =~ /unknown color name "/) { + next; + } else { + chomp $@; + die $@; + } + } + if (!exists($Tk::ColorEditor::names{$hex}) || + length($Tk::ColorEditor::names{$hex}) > length($color)) { + $Tk::ColorEditor::names{$hex} = $color; + $names->insert('end', $color); + } + } + close FOO; + last; + } + + # Create the three scales for editing the color, and the entry for typing + # in a color value. + + my $middle_middle = $middle->Frame; + $middle_middle->pack(-side => 'left', -expand => 1, -fill => 'y'); + my $mcm1 = $middle_middle->Optionmenu(-variable => \$middle->{'color_space'}, + -command => [ $middle, 'color_space'], + -relief => 'raised', + -options => [ ['HSB color space' => 'hsb'], + ['RGB color space' => 'rgb'], + ['CMY color space' => 'cmy']]); + $mcm1->pack(-side => 'top', -fill => 'x'); + + my(@middle_middle, @label, @scale); + $middle_middle[0] = $middle_middle->Frame; + $middle_middle[1] = $middle_middle->Frame; + $middle_middle[2] = $middle_middle->Frame; + $middle_middle[3] = $middle_middle->Frame; + $middle_middle[0]->pack(-side => 'top', -expand => 1); + $middle_middle[1]->pack(-side => 'top', -expand => 1); + $middle_middle[2]->pack(-side => 'top', -expand => 1); + $middle_middle[3]->pack(-side => 'top', -expand => 1, -fill => 'x'); + $middle->{'Labels'} = ['zero','one','two']; + foreach $i (0..2) { + $label[$i] = $middle->Label(-textvariable => \$middle->{'Labels'}[$i]); + $scale[$i] = $middle->Scale( + -from => 0, + -to => 1000, + '-length' => '6c', + -orient => 'horizontal', + -command => [\&scale_changed, $middle], + ); + $scale[$i]->pack( + -in => $middle_middle[$i], + -side => 'top', + -anchor => 'w', + ); + $label[$i]->pack( + -in => $middle_middle[$i], + -side => 'top', + -anchor => 'w', + ); + } + my $nameLabel = $middle->Label(-text => 'Name:'); + $middle->{'Entry'} = ''; + my $name = $middle->Entry( + -relief => 'sunken', + -borderwidth => 2, + -textvariable => \$middle->{'Entry'}, + -width => 10, +# For some reason giving this font causes problems at end of t/create.t +# -font => '-*-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*' + ); + + $nameLabel->pack(-in => $middle_middle[3], -side => 'left'); + $name->pack( + -in => $middle_middle[3], + -side => 'right', + -expand => 1, + -fill => 'x', + ); + $name->bind('<Return>' => [ $middle, 'color', Ev(['get'])]); + + # Create the color display swatch on the right side of the window. + + my $middle_right = $middle->Frame; + $middle_right->pack( + -side => 'left', + -pady => '.25c', + -padx => '.25c', + -anchor => 's', + ); + my $swatch = $middle->Canvas( + -width => '2.5c', + -height => '5c', + ); + my $swatch_item = $swatch->create('oval', '.5c', '.3c', '2.26c', '4.76c'); + + my $value = $middle->Label( + -textvariable => \$middle->{'color'}, + -width => 13, + -font => '-*-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*' + ); + + $swatch->pack( + -in => $middle_right, + -side => 'top', + -expand => 1, + -fill => 'both', + ); + $value->pack(-in => $middle_right, -side => 'bottom', -pady => '.25c'); + + $middle->ConfigSpecs( + '-color_space' => ['METHOD', undef, undef, 'hsb'], + '-initialcolor' => '-color', + '-color' => ['METHOD', 'background', 'Background', + $middle->cget('-background')] + ); + + $middle->{'swatch'} = $swatch; + $middle->{'swatch_item'} = $swatch_item; + $middle->{'scale'} = [@scale]; + $middle->{'red'} = 0; + $middle->{'blue'} = 0; + $middle->{'green'} = 0; + +} + +sub Hex +{ + my $w = shift; + my @rgb = (@_ == 3) ? @_ : $w->rgb(@_); + sprintf('#%04x%04x%04x',@rgb) +} + +sub color_space { + + my($objref, $space) = @_; + + if (@_ > 1) + { + my %Labels = ( 'rgb' => [qw(Red Green Blue)], + 'cmy' => [qw(Cyan Magenta Yellow)], + 'hsb' => [qw(Hue Saturation Brightness)] ); + + # The procedure below is invoked when a new color space is selected. It + # changes the labels on the scales and re-loads the scales with the + # appropriate values for the current color in the new color space + + $space = 'hsb' unless (exists $Labels{$space}); + my $i; + for $i (0..2) + { + $objref->{'Labels'}[$i] = $Labels{$space}->[$i]; + } + $objref->{'color_space'} = $space; + $objref->afterIdle(['set_scales',$objref]) unless ($objref->{'pending'}++); + } + return $objref->{'color_space'}; +} # color_space + +sub hsvToRgb { + + # The procedure below converts an HSB value to RGB. It takes hue, + # saturation, and value components (floating-point, 0-1.0) as arguments, + # and returns a list containing RGB components (integers, 0-65535) as + # result. The code here is a copy of the code on page 616 of + # "Fundamentals of Interactive Computer Graphics" by Foley and Van Dam. + + my($hue, $sat, $value) = @_; + my($v, $i, $f, $p, $q, $t); + + $v = int(65535 * $value); + return ($v, $v, $v) if $sat == 0; + $hue *= 6; + $hue = 0 if $hue >= 6; + $i = int($hue); + $f = $hue - $i; + $p = int(65535 * $value * (1 - $sat)); + $q = int(65535 * $value * (1 - ($sat * $f))); + $t = int(65535 * $value * (1 - ($sat * (1 - $f)))); + return ($v, $t, $p) if $i == 0; + return ($q, $v, $p) if $i == 1; + return ($p, $v, $t) if $i == 2; + return ($p, $q, $v) if $i == 3; + return ($t, $p, $v) if $i == 4; + return ($v, $p, $q) if $i == 5; + +} # end hsvToRgb + +sub color +{ + my ($objref,$name) = @_; + if (@_ > 1 && defined($name) && length($name)) + { + if ($name eq 'cancel') { + $objref->{color} = undef; + return; + } + my ($format, $shift); + my ($red, $green, $blue); + + if ($name !~ /^#/) + { + ($red, $green, $blue) = $objref->{'swatch'}->rgb($name); + } + else + { + my $len = length $name; + if($len == 4) { $format = '#(.)(.)(.)'; $shift = 12; } + elsif($len == 7) { $format = '#(..)(..)(..)'; $shift = 8; } + elsif($len == 10) { $format = '#(...)(...)(...)'; $shift = 4; } + elsif($len == 13) { $format = '#(....)(....)(....)'; $shift = 0; } + else { + $objref->BackTrace( + "ColorEditor error: syntax error in color name \"$name\""); + return; + } + ($red,$green,$blue) = $name =~ /$format/; + # Looks like a call for 'pack' or similar rather than eval + eval "\$red = 0x$red; \$green = 0x$green; \$blue = 0x$blue;"; + $red = $red << $shift; + $green = $green << $shift; + $blue = $blue << $shift; + } + $objref->{'red'} = $red; + $objref->{'blue'} = $blue; + $objref->{'green'} = $green; + my $hex = sprintf('#%04x%04x%04x', $red, $green, $blue); + $objref->{'color'} = $hex; + $objref->{'Entry'} = $name; + $objref->afterIdle(['set_scales',$objref]) unless ($objref->{'pending'}++); + $objref->{'swatch'}->itemconfigure($objref->{'swatch_item'}, + -fill => $objref->{'color'}); + } + return $objref->{'color'}; +} + +sub rgbToHsv { + + # The procedure below converts an RGB value to HSB. It takes red, green, + # and blue components (0-65535) as arguments, and returns a list + # containing HSB components (floating-point, 0-1) as result. The code + # here is a copy of the code on page 615 of "Fundamentals of Interactive + # Computer Graphics" by Foley and Van Dam. + + my($red, $green, $blue) = @_; + my($max, $min, $sat, $range, $hue, $rc, $gc, $bc); + + $max = ($red > $green) ? (($blue > $red) ? $blue : $red) : + (($blue > $green) ? $blue : $green); + $min = ($red < $green) ? (($blue < $red) ? $blue : $red) : + (($blue < $green) ? $blue : $green); + $range = $max - $min; + if ($max == 0) { + $sat = 0; + } else { + $sat = $range / $max; + } + if ($sat == 0) { + $hue = 0; + } else { + $rc = ($max - $red) / $range; + $gc = ($max - $green) / $range; + $bc = ($max - $blue) / $range; + $hue = ($max == $red)?(0.166667*($bc - $gc)): + (($max == $green)?(0.166667*(2 + $rc - $bc)): + (0.166667*(4 + $gc - $rc))); + } + $hue += 1 if $hue < 0; + return ($hue, $sat, $max/65535); + +} # end rgbToHsv + +sub scale_changed { + + # The procedure below is invoked when one of the scales is adjusted. It + # propagates color information from the current scale readings to + # everywhere else that it is used. + + my($objref) = @_; + + return if $objref->{'updating'}; + my ($red, $green, $blue); + + if($objref->{'color_space'} eq 'rgb') { + $red = int($objref->{'scale'}->[0]->get * 65.535 + 0.5); + $green = int($objref->{'scale'}->[1]->get * 65.535 + 0.5); + $blue = int($objref->{'scale'}->[2]->get * 65.535 + 0.5); + } elsif($objref->{'color_space'} eq 'cmy') { + $red = int(65535 - $objref->{'scale'}->[0]->get * 65.535 + 0.5); + $green = int(65535 - $objref->{'scale'}->[1]->get * 65.535 + 0.5); + $blue = int(65535 - $objref->{'scale'}->[2]->get * 65.535 + 0.5); + } else { + ($red, $green, $blue) = hsvToRgb($objref->{'scale'}->[0]->get/1000.0, + $objref->{'scale'}->[1]->get/1000.0, + $objref->{'scale'}->[2]->get/1000.0); + } + $objref->{'red'} = $red; + $objref->{'blue'} = $blue; + $objref->{'green'} = $green; + $objref->color(sprintf('#%04x%04x%04x', $red, $green, $blue)); + $objref->idletasks; + +} # end scale_changed + +sub set_scales { + + my($objref) = @_; + $objref->{'pending'} = 0; + $objref->{'updating'} = 1; + + # The procedure below is invoked to update the scales from the current red, + # green, and blue intensities. It's invoked after a change in the color + # space and after a named color value has been loaded. + + my($red, $blue, $green) = ($objref->{'red'}, $objref->{'blue'}, + $objref->{'green'}); + + if($objref->{'color_space'} eq 'rgb') { + $objref->{'scale'}->[0]->set(int($red / 65.535 + 0.5)); + $objref->{'scale'}->[1]->set(int($green / 65.535 + 0.5)); + $objref->{'scale'}->[2]->set(int($blue / 65.535 + 0.5)); + } elsif($objref->{'color_space'} eq 'cmy') { + $objref->{'scale'}->[0]->set(int((65535 - $red) / 65.535 + 0.5)); + $objref->{'scale'}->[1]->set(int((65535 - $green) / 65.535 + 0.5)); + $objref->{'scale'}->[2]->set(int((65535 - $blue) / 65.535 + 0.5)); + } else { + my ($s1, $s2, $s3) = rgbToHsv($red, $green, $blue); + $objref->{'scale'}->[0]->set(int($s1 * 1000.0 + 0.5)); + $objref->{'scale'}->[1]->set(int($s2 * 1000.0 + 0.5)); + $objref->{'scale'}->[2]->set(int($s3 * 1000.0 + 0.5)); + } + $objref->{'updating'} = 0; + +} # end set_scales + +package Tk::ColorDialog; +require Tk::Toplevel; +use base qw(Tk::Toplevel); + +Construct Tk::Widget 'ColorDialog'; + +sub Accept +{ + my $cw = shift; + $cw->withdraw; + $cw->{'done'} = 1; +} + +sub Cancel +{ + my $cw = shift; +# $cw->configure(-color => undef); + $cw->configure(-color => 'cancel'); + $cw->Accept; +} + +sub Populate +{ + my ($cw,$args) = @_; + $cw->SUPER::Populate($args); + $cw->protocol('WM_DELETE_WINDOW' => [ 'Cancel' => $cw ]); + $cw->transient($cw->Parent->toplevel); + $cw->withdraw; + my $sel = $cw->ColorSelect; + my $accept = $cw->Button(-text => 'Accept', -command => ['Accept', $cw]); + my $cancel = $cw->Button(-text => 'Cancel', -command => ['Cancel', $cw]); + Tk::grid($sel); + Tk::grid($accept,$cancel); + $cw->ConfigSpecs(DEFAULT => [$sel]); +} + +sub Show +{ + my $cw = shift; + $cw->configure(@_) if @_; + $cw->Popup(); + $cw->waitVariable(\$cw->{'done'}); + $cw->withdraw; + return $cw->cget('-color'); +} + +package Tk::ColorEditor; + +use vars qw($VERSION $SET_PALETTE); +$VERSION = sprintf '4.%03d', q$Revision: #8 $ =~ /\D(\d+)\s*$/; + +use Tk qw(lsearch Ev); +use Tk::Toplevel; +use base qw(Tk::Toplevel); +use Tk::widgets qw(Pixmap); +Construct Tk::Widget 'ColorEditor'; + +%Tk::ColorEditor::names = (); + + +use Tk::Dialog; +use Tk::Pretty; + +BEGIN { $SET_PALETTE = 'Set Palette' }; + +use subs qw(color_space hsvToRgb rgbToHsv); + +# ColorEditor public methods. + +sub add_menu_item +{ + my $objref = shift; + my $value; + foreach $value (@_) + { + if ($value eq 'SEP') + { + $objref->{'mcm2'}->separator; + } + else + { + $objref->{'mcm2'}->command( -label => $value, + -command => [ 'configure', $objref, '-highlight' => $value ] ); + push @{$objref->{'highlight_list'}}, $value; + } + } +} + +sub set_title +{ + my ($w) = @_; + my $t = $w->{Configure}{'-title'} || '' ; + my $h = $w->{Configure}{'-highlight'} || ''; + $w->SUPER::title("$t $h Color Editor"); +} + +sub highlight +{ + my ($w,$h) = @_; + if (@_ > 1) + { + $w->{'update'}->configure( -text => "Apply $h Color" ); + my $state = ($h eq 'background') ? 'normal' : 'disabled'; + $w->{'palette'}->entryconfigure( $SET_PALETTE, -state => $state); + $w->{'highlight'} = $h; + $w->configure(-color => $w->Palette->{$h}); + $w->set_title; + } + return $w->{'highlight'}; +} + +sub title +{ + my ($w,$val) = @_; + $w->set_title if (@_ > 1); + return $w->{Configure}{'-title'}; +} + +sub delete_menu_item +{ + my $objref = shift; + my $value; + foreach $value (@_) + { + $objref->{'mcm2'}->delete($value); + my $list_ord = $value =~ /\d+/ ? $value : lsearch($objref->{'highlight_list'}, $value); + splice(@{$objref->{'highlight_list'}}, $list_ord, 1) if $list_ord != -1; + } +} + +sub delete_widgets { + + # Remove widgets from consideration by the color configurator. + # $widgets_ref points to widgets previously added via `configure'. + + my($objref, $widgets_ref) = @_; + + my($i, $found, $r1, $r2, @wl) = (0, 0, 0, 0, @{$objref->cget(-widgets)}); + foreach $r1 (@{$widgets_ref}) { + $i = -1; + $found = 0; + foreach $r2 (@wl) { + $i++; + next if $r1 != $r2; + $found = 1; + last; + } + splice(@wl, $i, 1) if $found; + } + $objref->configure(-widgets => [@wl]); + +} # end delete_widgets + +sub ApplyDefault +{ + my($objref) = @_; + my $cb = $objref->cget('-command'); + my $h; + foreach $h (@{$objref->{'highlight_list'}}) + { + next if $h =~ /TEAR_SEP|SEP/; + $cb->Call($h); + die unless (defined $cb); + } +} + +sub Populate +{ + + # ColorEditor constructor. + + my($cw, $args) = @_; + + $cw->SUPER::Populate($args); + $cw->withdraw; + + my $color_space = 'hsb'; # rgb, cmy, hsb + my(@highlight_list) = qw( + TEAR_SEP + foreground background SEP + activeForeground activeBackground SEP + highlightColor highlightBackground SEP + selectForeground selectBackground SEP + disabledForeground insertBackground selectColor troughColor + ); + + # Create the Usage Dialog; + + my $usage = $cw->Dialog( '-title' => 'ColorEditor Usage', + -justify => 'left', + -wraplength => '6i', + -text => "The Colors menu allows you to:\n\nSelect a color attribute such as \"background\" that you wish to colorize. Click on \"Apply\" to update that single color attribute.\n\nSelect one of three color spaces. All color spaces display a color value as a hexadecimal number under the oval color swatch that can be directly supplied on widget commands.\n\nApply Tk's default color scheme to the application. Useful if you've made a mess of things and want to start over!\n\nChange the application's color palette. Make sure \"background\" is selected as the color attribute, find a pleasing background color to apply to all current and future application widgets, then select \"Set Palette\".", + ); + + # Create the menu bar at the top of the window for the File, Colors + # and Help menubuttons. + + my $m0 = $cw->Frame(-relief => 'raised', -borderwidth => 2); + $m0->pack(-side => 'top', -fill => 'x'); + my $mf = $m0->Menubutton( + -text => 'File', + -underline => 0, + -bd => 1, + -relief => 'raised', + ); + $mf->pack(-side => 'left'); + my $close_command = [sub {shift->withdraw}, $cw]; + $mf->command( + -label => 'Close', + -underline => 0, + -command => $close_command, + -accelerator => 'Ctrl-w', + ); + $cw->bind('<Control-Key-w>' => $close_command); + $cw->protocol(WM_DELETE_WINDOW => $close_command); + + my $mc = $m0->Menubutton( + -text => 'Colors', + -underline => 0, + -bd => 1, + -relief => 'raised', + ); + $mc->pack(-side => 'left'); + my $color_attributes = 'Color Attributes'; + $mc->cascade(-label => $color_attributes, -underline => 6); + $mc->separator; + + $mc->command( + -label => 'Apply Default Colors', + -underline => 6, + -command => ['ApplyDefault',$cw] + ); + $mc->separator; + $mc->command( + -label => $SET_PALETTE, + -underline => 0, + -command => sub { $cw->setPalette($cw->cget('-color'))} + ); + + my $m1 = $mc->cget(-menu); + + my $mcm2 = $m1->Menu; + $m1->entryconfigure($color_attributes, -menu => $mcm2); + my $mh = $m0->Menubutton( + -text => 'Help', + -underline => 0, + -bd => 1, + -relief => 'raised', + ); + $mh->pack(-side => 'right'); + $mh->command( + -label => 'Usage', + -underline => 0, + -command => [sub {shift->Show}, $usage], + ); + + # Create the Apply button. + + my $bot = $cw->Frame(-relief => 'raised', -bd => 2); + $bot->pack(-side => 'bottom', -fill =>'x'); + my $update = $bot->Button( + -command => [ + sub { + my ($objref) = @_; + $objref->Callback(-command => ($objref->{'highlight'}, $objref->cget('-color'))); + $cw->{'done'} = 1; + }, $cw, + ], + ); + $update->pack(-pady => 1, -padx => '0.25c'); + + # Create the listbox that holds all of the color names in rgb.txt, if an + # rgb.txt file can be found. + + my $middle = $cw->ColorSelect(-relief => 'raised', -borderwidth => 2); + $middle->pack(-side => 'top', -fill => 'both'); + # Create the status window. + + my $status = $cw->Toplevel; + $status->withdraw; + $status->geometry('+0+0'); + my $status_l = $status->Label(-width => 50, -anchor => 'w'); + $status_l->pack(-side => 'top'); + + $cw->{'highlight_list'} = [@highlight_list]; + $cw->{'mcm2'} = $mcm2; + + foreach (@highlight_list) + { + next if /^TEAR_SEP$/; + $cw->add_menu_item($_); + } + + $cw->{'updating'} = 0; + $cw->{'pending'} = 0; + $cw->{'Status'} = $status; + $cw->{'Status_l'} = $status_l; + $cw->{'update'} = $update; + $cw->{'gwt_depth'} = 0; + $cw->{'palette'} = $mc; + + my $pixmap = $cw->Pixmap('-file' => Tk->findINC('ColorEdit.xpm')); + $cw->Icon(-image => $pixmap); + + $cw->ConfigSpecs( + DEFAULT => [$middle], + -widgets => ['PASSIVE', undef, undef, + [$cw->parent->Descendants]], + -display_status => ['PASSIVE', undef, undef, 0], + '-title' => ['METHOD', undef, undef, ''], + -command => ['CALLBACK', undef, undef, ['set_colors',$cw]], + '-highlight' => ['METHOD', undef, undef, 'background'], + -cursor => ['DESCENDANTS', 'cursor', 'Cursor', 'left_ptr'], + ); + +} # end Populate, ColorEditor constructor + +sub Show { + + my($objref, @args) = @_; + + Tk::ColorDialog::Show(@_); + +} # end show + +# ColorEditor default configurator procedure - can be redefined by the +# application. + +sub set_colors { + + # Configure all the widgets in $widgets for attribute $type and color + # $color. If $color is undef then reset all colors + # to the Tk defaults. + + my($objref, $type, $color) = @_; + my $display = $objref->cget('-display_status'); + + $objref->{'Status'}->title("Configure $type"); + $objref->{'Status'}->deiconify if $display; + my $widget; + my $reset = !defined($color); + + foreach $widget (@{$objref->cget('-widgets')}) { + if ($display) { + $objref->{'Status_l'}->configure( + -text => 'WIDGET: ' . $widget->PathName + ); + $objref->update; + } + eval {local $SIG{'__DIE__'}; $color = ($widget->configure("-\L${type}"))[3]} if $reset; + eval {local $SIG{'__DIE__'}; $widget->configure("-\L${type}" => $color)}; + } + + $objref->{'Status'}->withdraw if $display; + +} # end set_colors + +# ColorEditor private methods. + +1; + +__END__ + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Compound.pm b/Master/tlpkg/tlperl.old/lib/Tk/Compound.pm new file mode 100644 index 00000000000..9f1ccd64487 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Compound.pm @@ -0,0 +1,40 @@ +package Tk::Compound; +require Tk; +import Tk qw($XS_VERSION); +require Tk::Image; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Compound/Compound.pm#4 $ + +use base qw(Tk::Image); + +Construct Tk::Image 'Compound'; + +bootstrap Tk::Compound; + +sub Tk_image { 'compound' } + +Tk::Methods('add'); + +sub new +{ + my $package = shift; + my $widget = shift; + my $leaf = $package->Tk_image; + $package->InitClass($widget); + my $obj = $widget->image(create => $leaf,@_,-window => $widget); + return bless($obj,$package); +} + +BEGIN + { + foreach my $type (qw(line text image bitmap space)) + { + my $meth = ucfirst($type); + no strict qw 'refs'; + *{$meth} = sub { shift->add($type,@_) }; + } + } + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Config.pm b/Master/tlpkg/tlperl.old/lib/Tk/Config.pm new file mode 100644 index 00000000000..8346d9ede9a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Config.pm @@ -0,0 +1,12 @@ +package Tk::Config; +require Exporter; +use base qw(Exporter); +$VERSION = '804.027'; +$inc = '-I$(TKDIR)/pTk/mTk/xlib'; +$define = ''; +$xlib = ''; +$xinc = ''; +$gccopt = ' -Wall -Wno-implicit-int -Wno-comment -Wno-unused -D__USE_FIXED_PROTOTYPES__'; +$win_arch = 'MSWin32'; +@EXPORT = qw($VERSION $inc $define $xlib $xinc $gccopt $win_arch); +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Configure.pm b/Master/tlpkg/tlperl.old/lib/Tk/Configure.pm new file mode 100644 index 00000000000..26252ae4958 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Configure.pm @@ -0,0 +1,69 @@ +package Tk::Configure; +use vars qw($VERSION); +$VERSION = '4.008'; # $Id: //depot/Tkutf8/Tk/Configure.pm#8 $ + +use Carp; +use Tk::Pretty; + + +# Class that handles cget/configure for options that +# need translating from public form +# e.g. $cw->configure(-label => 'fred') +# into $cw->subwiget('label')->configure(-text => 'fred') +# Should probably do something clever with regexp's here + + +sub new +{ + my ($class,@args) = @_; + unshift(@args,'configure','cget') if (@args < 3); + return bless \@args,$class; +} + +sub cget +{ + croak('Wrong number of args to cget') unless (@_ == 2); + my ($alias,$key) = @_; + my ($set,$get,$widget,@args) = @$alias; + $widget->$get(@args); +} + +sub configure +{ + my $alias = shift; + shift if (@_); + my ($set,$get,$widget,@args) = @$alias; + if (wantarray) + { + my @results; + eval { @results = $widget->$set(@args,@_) }; + croak($@) if $@; + return @results; + } + else + { + my $results; + eval { $results = $widget->$set(@args,@_) }; + croak($@) if $@; + return $results; + } +} + +*TIESCALAR = \&new; +*TIEHASH = \&new; + +sub FETCH +{ + my $alias = shift; + my ($set,$get,$widget,@args) = @$alias; + return $widget->$get(@args,@_); +} + +sub STORE +{ + my $alias = shift; + my ($set,$get,$widget,@args) = @$alias; + $widget->$set(@args,@_); +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Credits b/Master/tlpkg/tlperl.old/lib/Tk/Credits new file mode 100644 index 00000000000..3ea9be43b7d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Credits @@ -0,0 +1,7 @@ +The two Camel/X 'logo' GIFs were produced by : + +Grafix, Sussex, UK, +44-1293-886725 + +For a very reasonable fee. We have rights to distribute them. + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Derived.pm b/Master/tlpkg/tlperl.old/lib/Tk/Derived.pm new file mode 100644 index 00000000000..c31c205d2fb --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Derived.pm @@ -0,0 +1,512 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::Derived; +require Tk::Widget; +require Tk::Configure; +use strict; +use Carp; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #10 $ =~ /\D(\d+)\s*$/; + +$Tk::Derived::Debug = 0; + +my $ENHANCED_CONFIGSPECS = 0; # disable for now + +use Tk qw(NORMAL_BG BLACK); + +sub Subwidget +{ + my $cw = shift; + my @result = (); + if (exists $cw->{SubWidget}) + { + if (@_) + { + foreach my $name (@_) + { + push(@result,$cw->{SubWidget}{$name}) if (exists $cw->{SubWidget}{$name}); + } + } + else + { + @result = values %{$cw->{SubWidget}}; + } + } + return (wantarray) ? @result : $result[0]; +} + +sub _makelist +{ + my $widget = shift; + my (@specs) = (ref $widget && ref $widget eq 'ARRAY') ? (@$widget) : ($widget); + return @specs; +} + +sub Subconfigure +{ + # This finds the widget or widgets to to which to apply a particular + # configure option + my ($cw,$opt) = @_; + my $config = $cw->ConfigSpecs; + my $widget; + my @subwidget = (); + my @arg = (); + if (defined $opt) + { + $widget = $config->{$opt}; + unless (defined $widget) + { + $widget = ($opt =~ /^-(.*)$/) ? $config->{$1} : $config->{-$opt}; + } + # Handle alias entries + if (defined($widget) && !ref($widget)) + { + $opt = $widget; + $widget = $config->{$widget}; + } + push(@arg,$opt) unless ($opt eq 'DEFAULT'); + } + $widget = $config->{DEFAULT} unless (defined $widget); + if (defined $widget) + { + $cw->BackTrace("Invalid ConfigSpecs $widget") unless (ref($widget) && (ref $widget eq 'ARRAY')); + $widget = $widget->[0]; + } + else + { + $widget = 'SELF'; + } + foreach $widget (_makelist($widget)) + { + $widget = 'SELF' if (ref($widget) && $widget == $cw); + if (ref $widget) + { + my $ref = ref $widget; + if ($ref eq 'ARRAY') + { + $widget = Tk::Configure->new(@$widget); + push(@subwidget,$widget) + } + elsif ($ref eq 'HASH') + { + foreach my $key (%$widget) + { + foreach my $sw (_makelist($widget->{$key})) + { + push(@subwidget,Tk::Configure->new($sw,$key)); + } + } + } + else + { + push(@subwidget,$widget) + } + } + elsif ($widget eq 'ADVERTISED') + { + push(@subwidget,$cw->Subwidget) + } + elsif ($widget eq 'DESCENDANTS') + { + push(@subwidget,$cw->Descendants) + } + elsif ($widget eq 'CHILDREN') + { + push(@subwidget,$cw->children) + } + elsif ($widget eq 'METHOD') + { + my ($method) = ($opt =~ /^-?(.*)$/); + push(@subwidget,Tk::Configure->new($method,$method,$cw)) + } + elsif ($widget eq 'SETMETHOD') + { + my ($method) = ($opt =~ /^-?(.*)$/); + push(@subwidget,Tk::Configure->new($method,'_cget',$cw,@arg)) + } + elsif ($widget eq 'SELF') + { + push(@subwidget,Tk::Configure->new('Tk::configure', 'Tk::cget', $cw,@arg)) + } + elsif ($widget eq 'PASSIVE') + { + push(@subwidget,Tk::Configure->new('_configure','_cget',$cw,@arg)) + } + elsif ($widget eq 'CALLBACK') + { + push(@subwidget,Tk::Configure->new('_callback','_cget',$cw,@arg)) + } + else + { + push(@subwidget,$cw->Subwidget($widget)); + } + } + $cw->BackTrace("No delegate subwidget '$widget' for $opt") unless (@subwidget); + return (wantarray) ? @subwidget : $subwidget[0]; +} + +sub _cget +{ + my ($cw,$opt) = @_; + $cw->BackTrace('Wrong number of args to cget') unless (@_ == 2); + return $cw->{Configure}{$opt} +} + +sub _configure +{ + my ($cw,$opt,$val) = @_; + $cw->BackTrace('Wrong number of args to configure') unless (@_ == 3); + $cw->{Configure}{$opt} = $val; +} + +sub _callback +{ + my ($cw,$opt,$val) = @_; + $cw->BackTrace('Wrong number of args to configure') unless (@_ == 3); + $val = Tk::Callback->new($val) if defined($val) && ref($val); + $cw->{Configure}{$opt} = $val; +} + +sub cget +{my ($cw,$opt) = @_; + my @result; + local $SIG{'__DIE__'}; + foreach my $sw ($cw->Subconfigure($opt)) + { + if (wantarray) + { + eval { @result = $sw->cget($opt) }; + } + else + { + eval { $result[0] = $sw->cget($opt) }; + } + last unless $@; + } + return wantarray ? @result : $result[0]; +} + +sub Configured +{ + # Called whenever a derived widget is re-configured + my ($cw,$args,$changed) = @_; + if (@_ > 1) + { + $cw->afterIdle(['ConfigChanged',$cw,$changed]) if (%$changed); + } + return exists $cw->{'Configure'}; +} + +sub configure +{ + # The default composite widget configuration method uses hash stored + # in the widget's hash to map configuration options + # onto subwidgets. + # + my @results = (); + my $cw = shift; + if (@_ <= 1) + { + # Enquiry cases + my $spec = $cw->ConfigSpecs; + if (@_) + { + # Return info on the nominated option + my $opt = $_[0]; + my $info = $spec->{$opt}; + unless (defined $info) + { + $info = ($opt =~ /^-(.*)$/) ? $spec->{$1} : $spec->{-$opt}; + } + if (defined $info) + { + if (ref $info) + { + # If the default slot is undef then ask subwidgets in turn + # for their default value until one accepts it. + if ($ENHANCED_CONFIGSPECS && !defined($info->[3])) + {local $SIG{'__DIE__'}; + my @def; + foreach my $sw ($cw->Subconfigure($opt)) + { + eval { @def = $sw->configure($opt) }; + last unless $@; + } + $info->[3] = $def[3]; + $info->[1] = $def[1] unless defined $info->[1]; + $info->[2] = $def[2] unless defined $info->[2]; + } + push(@results,$opt,$info->[1],$info->[2],$info->[3],$cw->cget($opt)); + } + else + { + # Real (core) Tk widgets return db name rather than option name + # for aliases so recurse to get that ... + my @real = $cw->configure($info); + push(@results,$opt,$real[1]); + } + } + else + { + push(@results,$cw->Subconfigure($opt)->configure($opt)); + } + } + else + { + my $opt; + my %results; + if (exists $spec->{'DEFAULT'}) + { + foreach $opt ($cw->Subconfigure('DEFAULT')->configure) + { + $results{$opt->[0]} = $opt; + } + } + foreach $opt (keys %$spec) + { + $results{$opt} = [$cw->configure($opt)] if ($opt ne 'DEFAULT'); + } + foreach $opt (sort keys %results) + { + push(@results,$results{$opt}); + } + } + } + else + { + my (%args) = @_; + my %changed = (); + my ($opt,$val); + my $config = $cw->TkHash('Configure'); + + while (($opt,$val) = each %args) + { + my $var = \$config->{$opt}; + my $old = $$var; + $$var = $val; + my $accepted = 0; + my $error = "No widget handles $opt"; + foreach my $subwidget ($cw->Subconfigure($opt)) + { + next unless (defined $subwidget); + eval {local $SIG{'__DIE__'}; $subwidget->configure($opt => $val) }; + if ($@) + { + my $val2 = (defined $val) ? $val : 'undef'; + $error = "Can't set $opt to `$val2' for $cw: " . $@; + undef $@; + } + else + { + $accepted = 1; + } + } + $cw->BackTrace($error) unless ($accepted); + $val = $$var; + $changed{$opt} = $val if (!defined $old || !defined $val || "$old" ne "$val"); + } + $cw->Configured(\%args,\%changed); + } + return (wantarray) ? @results : \@results; +} + +sub ConfigDefault +{ + my ($cw,$args) = @_; + + $cw->BackTrace('Bad args') unless (defined $args && ref $args eq 'HASH'); + + my $specs = $cw->ConfigSpecs; + # Should we enforce a Delagates(DEFAULT => ) as well ? + $specs->{'DEFAULT'} = ['SELF'] unless (exists $specs->{'DEFAULT'}); + + # + # This is a pain with Text or Entry as core widget, they don't + # inherit SELF's cursor. So comment it out for Tk402.001 + # + # $specs->{'-cursor'} = ['SELF',undef,undef,undef] unless (exists $specs->{'-cursor'}); + + # Now some hacks that cause colours to propogate down a composite widget + # tree - really needs more thought, other options adding such as active + # colours too and maybe fonts + + my $child = ($cw->children)[0]; # 1st child window (if any) + + unless (exists($specs->{'-background'})) + { + Tk::catch { $cw->Tk::cget('-background') }; + my (@bg) = $@ ? ('PASSIVE') : ('SELF'); + push(@bg,'CHILDREN') if $child; + $specs->{'-background'} = [\@bg,'background','Background',NORMAL_BG]; + } + unless (exists($specs->{'-foreground'})) + { + Tk::catch { $cw->Tk::cget('-foreground') }; + my (@fg) = $@ ? ('PASSIVE') : ('SELF'); + push(@fg,'CHILDREN') if $child; + $specs->{'-foreground'} = [\@fg,'foreground','Foreground',BLACK]; + } + $cw->ConfigAlias(-fg => '-foreground', -bg => '-background'); + + # Pre-scan args for aliases - this avoids defaulting + # options specified via alias + foreach my $opt (keys %$args) + { + my $info = $specs->{$opt}; + if (defined($info) && !ref($info)) + { + $args->{$info} = delete $args->{$opt}; + } + } + + # Now walk %$specs supplying defaults for all the options + # which have a defined default value, potentially looking up .Xdefaults database + # options for the name/class of the 'frame' + + foreach my $opt (keys %$specs) + { + if ($opt ne 'DEFAULT') + { + unless (exists $args->{$opt}) + { + my $info = $specs->{$opt}; + if (ref $info) + { + # Not an alias + if ($ENHANCED_CONFIGSPECS && !defined $info->[3]) + { + # configure inquire to fill in default slot from subwidget + $cw->configure($opt); + } + if (defined $info->[3]) + { + if (defined $info->[1] && defined $info->[2]) + { + # Should we do this on the Subconfigure widget instead? + # to match *Entry.Background + my $db = $cw->optionGet($info->[1],$info->[2]); + $info->[3] = $db if (defined $db); + } + $args->{$opt} = $info->[3]; + } + } + } + } + } +} + +sub ConfigSpecs +{ + my $cw = shift; + my $specs = $cw->TkHash('ConfigSpecs'); + while (@_) + { + my $key = shift; + my $val = shift; + $specs->{$key} = $val; + } + return $specs; +} + +sub _alias +{ + my ($specs,$opt,$main) = @_; + if (exists($specs->{$opt})) + { + unless (exists $specs->{$main}) + { + my $targ = $specs->{$opt}; + if (ref($targ)) + { + # opt is a real option + $specs->{$main} = $opt + } + else + { + # opt is itself an alias + # make main point to same place + $specs->{$main} = $targ unless $targ eq $main; + } + } + return 1; + } + return 0; +} + +sub ConfigAlias +{ + my $cw = shift; + my $specs = $cw->ConfigSpecs; + while (@_ >= 2) + { + my $opt = shift; + my $main = shift; + unless (_alias($specs,$opt,$main) || _alias($specs,$main,$opt)) + { + $cw->BackTrace("Neither $opt nor $main exist"); + } + } + $cw->BackTrace('Odd number of args to ConfigAlias') if (@_); +} + +sub Delegate +{ + my ($cw,$method,@args) = @_; + my $widget = $cw->DelegateFor($method); + if ($widget == $cw) + { + $method = "Tk::Widget::$method" + } + my @result; + if (wantarray) + { + @result = $widget->$method(@args); + } + else + { + $result[0] = $widget->$method(@args); + } + return (wantarray) ? @result : $result[0]; +} + +sub InitObject +{ + my ($cw,$args) = @_; + $cw->Populate($args); + $cw->ConfigDefault($args); +} + +sub ConfigChanged +{ + my ($cw,$args) = @_; +} + +sub Advertise +{ + my ($cw,$name,$widget) = @_; + confess 'No name' unless (defined $name); + croak 'No widget' unless (defined $widget); + my $hash = $cw->TkHash('SubWidget'); + $hash->{$name} = $widget; # advertise it + return $widget; +} + +sub Component +{ + my ($cw,$kind,$name,%args) = @_; + $args{'Name'} = "\l$name" if (defined $name && !exists $args{'Name'}); + # my $pack = delete $args{'-pack'}; + my $delegate = delete $args{'-delegate'}; + my $w = $cw->$kind(%args); # Create it + # $w->pack(@$pack) if (defined $pack); + $cw->Advertise($name,$w) if (defined $name); + $cw->Delegates(map(($_ => $w),@$delegate)) if (defined $delegate); + return $w; # and return it +} + +1; +__END__ + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Dialog.pm b/Master/tlpkg/tlperl.old/lib/Tk/Dialog.pm new file mode 100644 index 00000000000..8173f4a5acc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Dialog.pm @@ -0,0 +1,70 @@ +package Tk::Dialog; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Tk/Dialog.pm#4 $ + +# Dialog - a translation of `tk_dialog' from Tcl/Tk to TkPerl (based on +# John Stoffel's idea). +# +# Stephen O. Lidie, Lehigh University Computing Center. 94/12/27 +# lusol@Lehigh.EDU + +# Documentation after __END__ + +use Carp; +use strict; +use base qw(Tk::DialogBox); + +Construct Tk::Widget 'Dialog'; + +sub Populate +{ + + # Dialog object constructor. Uses `new' method from base class + # to create object container then creates the dialog toplevel. + + my($cw, $args) = @_; + + $cw->SUPER::Populate($args); + + my ($w_bitmap,$w_but,$pad1,$pad2); + + # Create the Toplevel window and divide it into top and bottom parts. + + my (@pl) = (-side => 'top', -fill => 'both'); + + ($pad1, $pad2) = + ([-padx => '3m', -pady => '3m'], [-padx => '3m', -pady => '2m']); + + + $cw->iconname('Dialog'); + + my $w_top = $cw->Subwidget('top'); + + # Fill the top part with the bitmap and message. + + @pl = (-side => 'left'); + + $w_bitmap = $w_top->Label(Name => 'bitmap'); + $w_bitmap->pack(@pl, @$pad1); + + my $w_msg = $w_top->Label( -wraplength => '3i', -justify => 'left' ); + + $w_msg->pack(-side => 'right', -expand => 1, -fill => 'both', @$pad1); + + $cw->Advertise(message => $w_msg); + $cw->Advertise(bitmap => $w_bitmap ); + + $cw->ConfigSpecs( -image => ['bitmap',undef,undef,undef], + -bitmap => ['bitmap',undef,undef,undef], + -font => ['message','font','Font', '-*-Times-Medium-R-Normal--*-180-*-*-*-*-*-*'], + DEFAULT => ['message',undef,undef,undef] + ); +} + +1; + +__END__ + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/DialogBox.pm b/Master/tlpkg/tlperl.old/lib/Tk/DialogBox.pm new file mode 100644 index 00000000000..13335404e15 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/DialogBox.pm @@ -0,0 +1,135 @@ +# +# DialogBox is similar to Dialog except that it allows any widget +# in the top frame. Widgets can be added with the add method. Currently +# there exists no way of deleting a widget once it has been added. + +package Tk::DialogBox; + +use strict; +use Carp; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #13 $ =~ /\D(\d+)\s*$/; + +use base qw(Tk::Toplevel); + +Tk::Widget->Construct('DialogBox'); + +sub Populate { + my ($cw, $args) = @_; + + $cw->SUPER::Populate($args); + my $buttons = delete $args->{'-buttons'}; + $buttons = ['OK'] unless defined $buttons; + my $default_button = delete $args->{'-default_button'}; + $default_button = $buttons->[0] unless defined $default_button; + + $cw->{'selected_button'} = ''; + $cw->transient($cw->Parent->toplevel); + $cw->withdraw; + if (@$buttons == 1) { + $cw->protocol('WM_DELETE_WINDOW' => sub { $cw->{'default_button'}->invoke }); + } else { + $cw->protocol('WM_DELETE_WINDOW' => sub {}); + } + + # create the two frames + my $top = $cw->Component('Frame', 'top'); + $top->configure(-relief => 'raised', -bd => 1) unless $Tk::platform eq 'MSWin32'; + my $bot = $cw->Component('Frame', 'bottom'); + $bot->configure(-relief => 'raised', -bd => 1) unless $Tk::platform eq 'MSWin32'; + $bot->pack(qw/-side bottom -fill both -ipady 3 -ipadx 3/); + $top->pack(qw/-side top -fill both -ipady 3 -ipadx 3 -expand 1/); + + # create a row of buttons in the bottom. + my $bl; # foreach my $var: perl > 5.003_08 + foreach $bl (@$buttons) + { + my $b = $bot->Button(-text => $bl, -command => sub { $cw->{'selected_button'} = "$bl" } ); + $b->bind('<Return>' => [ $b, 'Invoke']); + $cw->Advertise("B_$bl" => $b); + if ($Tk::platform eq 'MSWin32') + { + $b->configure(-width => 10, -pady => 0); + } + if ($bl eq $default_button) { + if ($Tk::platform eq 'MSWin32') { + $b->pack(-side => 'left', -expand => 1, -padx => 1, -pady => 1); + } else { + my $db = $bot->Frame(-relief => 'sunken', -bd => 1); + $b->raise($db); + $b->pack(-in => $db, -padx => '2', -pady => '2'); + $db->pack(-side => 'left', -expand => 1, -padx => 1, -pady => 1); + } + $cw->{'default_button'} = $b; + $cw->bind('<Return>' => [ $b, 'Invoke']); + } else { + $b->pack(-side => 'left', -expand => 1, -padx => 1, -pady => 1); + } + } + $cw->ConfigSpecs(-command => ['CALLBACK', undef, undef, undef ], + -foreground => ['DESCENDANTS', 'foreground','Foreground', 'black'], + -background => ['DESCENDANTS', 'background','Background', undef], + -focus => ['PASSIVE', undef, undef, undef], + -showcommand => ['CALLBACK', undef, undef, undef], + ); + $cw->Delegates('Construct',$top); +} + +sub add { + my ($cw, $wnam, @args) = @_; + my $w = $cw->Subwidget('top')->$wnam(@args); + $cw->Advertise("\L$wnam" => $w); + return $w; +} + +sub Wait +{ + my $cw = shift; + $cw->Callback(-showcommand => $cw); + $cw->waitVariable(\$cw->{'selected_button'}); + $cw->grabRelease; + $cw->withdraw; + $cw->Callback(-command => $cw->{'selected_button'}); +} + +sub Show { + + croak 'DialogBox: "Show" method requires at least 1 argument' + if scalar @_ < 1; + my $cw = shift; + my ($grab) = @_; + my $old_focus = $cw->focusSave; + my $old_grab = $cw->grabSave; + + shift if defined $grab && length $grab && ($grab =~ /global/); + $cw->Popup(@_); + + Tk::catch { + if (defined $grab && length $grab && ($grab =~ /global/)) { + $cw->grabGlobal; + } else { + $cw->grab; + } + }; + if (my $focusw = $cw->cget(-focus)) { + $focusw->focus; + } elsif (defined $cw->{'default_button'}) { + $cw->{'default_button'}->focus; + } else { + $cw->focus; + } + $cw->Wait; + &$old_focus; + &$old_grab; + return $cw->{'selected_button'}; +} + +sub Exit +{ + my $cw = shift; + #kill the dialogbox, by faking a 'DONE' + $cw->{'selected_button'} = $cw->{'default_button'}->cget(-text); +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/DirTree.pm b/Master/tlpkg/tlperl.old/lib/Tk/DirTree.pm new file mode 100644 index 00000000000..b2d996a94d0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/DirTree.pm @@ -0,0 +1,252 @@ +package Tk::DirTree; +# DirTree -- TixDirTree widget +# +# Derived from DirTree.tcl in Tix 4.1 +# +# Chris Dean <ctdean@cogit.com> + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #14 $ =~ /\D(\d+)\s*$/; + +use Tk; +use Tk::Derived; +use Tk::Tree; +use Cwd; +use DirHandle; + +use base qw(Tk::Derived Tk::Tree); +use strict; + +Construct Tk::Widget 'DirTree'; + + +sub Populate { + my( $cw, $args ) = @_; + + $cw->SUPER::Populate( $args ); + + $cw->ConfigSpecs( + -dircmd => [qw/CALLBACK dirCmd DirCmd DirCmd/], + -showhidden => [qw/PASSIVE showHidden ShowHidden 0/], + -image => [qw/PASSIVE image Image folder/], + -directory => [qw/SETMETHOD directory Directory ./], + -value => '-directory' ); + + $cw->configure( -separator => '/', -itemtype => 'imagetext' ); +} + +sub DirCmd { + my( $w, $dir, $showhidden ) = @_; + $dir .= "/" if $dir =~ /^[a-z]:$/i and $^O eq 'MSWin32'; + my $h = DirHandle->new( $dir ) or return(); + my @names = grep( $_ ne '.' && $_ ne '..', $h->read ); + @names = grep( ! /^[.]/, @names ) unless $showhidden; + return( @names ); +} + +*dircmd = \&DirCmd; + +sub fullpath +{ + my ($path) = @_; + my $cwd = getcwd(); + if (CORE::chdir($path)) + { + $path = getcwd(); + CORE::chdir($cwd) || die "Cannot cd back to $cwd:$!"; + } + else + { + warn "Cannot cd to $path:$!" + } + return $path; +} + +sub directory +{ + my ($w,$key,$val) = @_; + # We need a value for -image, so its being undefined + # is probably caused by order of handling config defaults + # so defer it. + $w->afterIdle([$w, 'set_dir' => $val]); +} + +sub set_dir { + my( $w, $val ) = @_; + my $fulldir = fullpath( $val ); + + my $parent = '/'; + if ($^O eq 'MSWin32') + { + if ($fulldir =~ s/^([a-z]:)//i) + { + $parent = $1; + } + } + $w->add_to_tree( $parent, $parent) unless $w->infoExists($parent); + + my @dirs = ($parent); + foreach my $name (split( /[\/\\]/, $fulldir )) { + next unless length $name; + push @dirs, $name; + my $dir = join( '/', @dirs ); + $dir =~ s|^//|/|; + $w->add_to_tree( $dir, $name, $parent ) + unless $w->infoExists( $dir ); + $parent = $dir; + } + + $w->OpenCmd( $parent ); + $w->setmode( $parent, 'close' ); +} +*chdir = \&set_dir; + + +sub OpenCmd { + my( $w, $dir ) = @_; + + my $parent = $dir; + $dir = '' if $dir eq '/'; + foreach my $name ($w->dirnames( $parent )) { + next if ($name eq '.' || $name eq '..'); + my $subdir = "$dir/$name"; + next unless -d $subdir; + if( $w->infoExists( $subdir ) ) { + $w->show( -entry => $subdir ); + } else { + $w->add_to_tree( $subdir, $name, $parent ); + } + } +} + +*opencmd = \&OpenCmd; + +sub add_to_tree { + my( $w, $dir, $name, $parent ) = @_; + + my $image = $w->cget('-image'); + if ( !UNIVERSAL::isa($image, 'Tk::Image') ) { + $image = $w->Getimage( $image ); + } + my $mode = 'none'; + $mode = 'open' if $w->has_subdir( $dir ); + + my @args = (-image => $image, -text => $name); + if( $parent ) { # Add in alphabetical order. + foreach my $sib ($w->infoChildren( $parent )) { + if( $sib gt $dir ) { + push @args, (-before => $sib); + last; + } + } + } + + $w->add( $dir, @args ); + $w->setmode( $dir, $mode ); +} + +sub has_subdir { + my( $w, $dir ) = @_; + foreach my $name ($w->dirnames( $dir )) { + next if ($name eq '.' || $name eq '..'); + next if ($name =~ /^\.+$/); + return( 1 ) if -d "$dir/$name"; + } + return( 0 ); +} + +sub dirnames { + my( $w, $dir ) = @_; + my @names = $w->Callback( '-dircmd', $dir, $w->cget( '-showhidden' ) ); + return( @names ); +} + +{ + package Tk::DirTreeDialog; + use base qw(Tk::Toplevel); + Construct Tk::Widget 'DirTreeDialog'; + + sub Populate { + my($w, $args) = @_; + $w->{curr_dir} = $args->{-initialdir}; + if (!defined $w->{curr_dir}) { + require Cwd; + $w->{curr_dir} = Cwd::cwd(); + } + if (defined $args->{-mustexist}) { + die "-mustexist is not yet implemented"; + } + my $title = $args->{-title} || "Choose directory:"; + delete $args->{-popover}; + + $w->title($title); + $w->{ok} = 0; # flag: "1" means OK, "-1" means cancelled + + # Create Frame widget before the DirTree widget, so it's always visible + # if the window gets resized. + my $f = $w->Frame->pack(-fill => "x", -side => "bottom"); + + my $d; + $d = $f->Scrolled('DirTree', + -scrollbars => 'osoe', + -width => 35, + -height => 20, + -selectmode => 'browse', + -exportselection => 1, + -browsecmd => sub { + $w->{curr_dir} = shift; + if ($^O ne 'MSWin32') { + $w->{curr_dir} =~ s|^//|/|; # bugfix + } + }, + + # With this version of -command a double-click will + # select the directory + -command => sub { $w->{ok} = 1 }, + + # With this version of -command a double-click will + # open a directory. Selection is only possible with + # the Ok button. + #-command => sub { $d->opencmd($_[0]) }, + )->pack(-fill => "both", -expand => 1); + # Set the initial directory + exists &Tk::DirTree::chdir ? $d->chdir($w->{curr_dir}) : $d->set_dir($w->{curr_dir}); + + $f->Button(-text => 'Ok', + -command => sub { $w->{ok} = 1 })->pack(-side => 'left'); + $f->Button(-text => 'Cancel', + -command => sub { $w->{ok} = -1 })->pack(-side => 'left'); + $w->OnDestroy(sub { $w->{ok} = -1 }); + } + + sub Show { + my $w = shift; + my $old_focus = $w->focusSave; + my $old_grab = $w->grabSave; + Tk::catch { + $w->grab; + }; + $w->waitVariable(\$w->{ok}); + my $ret = $w->{ok} == 1 ? $w->{curr_dir} : undef; + $w->grabRelease if Tk::Exists($w); + &$old_focus; + &$old_grab; + $w->destroy if Tk::Exists($w); + $ret; + } +} + +1; + +__END__ + +# Copyright (c) 1996, Expert Interface Technologies +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +# The file man.macros and some of the macros used by this file are +# copyrighted: (c) 1990 The Regents of the University of California. +# (c) 1994-1995 Sun Microsystems, Inc. +# The license terms of the Tcl/Tk distrobution are in the file +# license.tcl. + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Dirlist.pm b/Master/tlpkg/tlperl.old/lib/Tk/Dirlist.pm new file mode 100644 index 00000000000..f16ce021f41 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Dirlist.pm @@ -0,0 +1,113 @@ +package Tk::Dirlist; +require Tk::Derived; +require Tk::HList; +require DirHandle; +use Cwd; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Tk/Dirlist.pm#5 $ + +use base qw(Tk::Derived Tk::HList); +use strict; +Construct Tk::Widget 'Dirlist'; + +sub getimage +{ + my ($w,$key) = @_; + unless (exists $w->{$key}) + { + $w->{$key} = $w->Pixmap(-id => $key); + unless ($w->{$key}) + { + $w->{$key} = $w->Bitmap($key); + } + } + return $w->{$key}; +} + + +sub Populate +{ + my ($cw,$args) = @_; + $cw->configure(-separator => '/', -itemtype => 'imagetext'); + $cw->ConfigSpecs(-directory => ['SETMETHOD','directory','Directory','.']); +} + +sub fullpath +{ + my ($path) = @_; + my $cwd = getcwd; + if (chdir($path)) + { + $path = getcwd; + chdir($cwd); + } + else + { + warn "Cannot cd to $path:$!" + } +# print "$path\n"; + return $path; +} + +sub AddDir +{ + my ($w,$dir) = @_; + my $path = ''; + my $prefix = ''; + my $first = 0; + my $name; + foreach $name (split m#/#,$dir) + { + $first++; + if ($name eq '') + { + next unless ($first == 1); + $path = '/'; + $name = '/'; + } + else + { + $path .= $prefix; + $path .= $name; + $prefix = '/'; + } + unless ($w->info('exists' => $path)) + { +# print "Add $path\n"; + $w->add($path,-image => $w->getimage('folder'), -text => $name); + } + } +} + +sub choose_image +{ + my ($w,$path) = @_; + return 'folder' if (-d $path); + return 'srcfile' if ($path =~ /\.[ch]$/); + return 'textfile' if (-T $path); + return 'file'; +} + + +sub directory +{ + my ($w,$key,$val) = @_; + my $h = DirHandle->new($val); + $w->AddDir($val = fullpath($val)); + my $f; + $w->entryconfigure($val,-image => $w->getimage('act_fold')); + foreach $f (sort $h->read) + { + next if ($f =~ /^\.+$/); + my $path = "$val/$f"; + unless ($w->info('exists' => $path)) + { + my $image = $w->getimage($w->choose_image($path)); + $w->add($path,-image => $image, -text => $f); + } + } + $h->close; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/DragDrop.pm b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop.pm new file mode 100644 index 00000000000..bdc54f74367 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop.pm @@ -0,0 +1,332 @@ +package Tk::DragDrop; +require Tk::DragDrop::Common; +require Tk::Toplevel; +require Tk::Label; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #14 $ =~ /\D(\d+)\s*$/; + +use base qw(Tk::DragDrop::Common Tk::Toplevel); + +# This is a little tricky, ISA says 'Toplevel' but we +# define a Tk_cmd to actually build a 'Label', then +# use wmRelease in Populate to make it a toplevel. + +my $useWmRelease = Tk::Wm->can('release'); # ($^O ne 'MSWin32'); + +sub Tk_cmd { ($useWmRelease) ? \&Tk::label : \&Tk::toplevel } + +Construct Tk::Widget 'DragDrop'; + +use strict; +use vars qw(%type @types); +use Carp; + + +# There is a snag with having a token window and moving to +# exactly where cursor is - the cursor is "inside" the token +# window - hence it is not "inside" the dropsite window +# so we offset X,Y by OFFSET pixels. +sub OFFSET () {3} + +sub ClassInit +{ + my ($class,$mw) = @_; + $mw->bind($class,'<Map>','Mapped'); + $mw->bind($class,'<Any-KeyPress>','Done'); + $mw->bind($class,'<Any-ButtonRelease>','Drop'); + $mw->bind($class,'<Any-Motion>','Drag'); + return $class; +} + +sub Populate +{ + my ($token,$args) = @_; + my $parent = $token->parent; + if ($useWmRelease) + { + $token->wmRelease; + $token->ConfigSpecs(-text => ['SELF','text','Text',$parent->class]); + } + else + { + my $lab = $token->Label->pack(-expand => 1, -fill => 'both'); + bless $lab,ref($token); + $lab->bindtags([ref($token), $lab, $token, 'all']); + $token->ConfigSpecs(-text => [$lab,'text','Text',$parent->class], + DEFAULT => [$lab]); + } + $token->withdraw; + $token->overrideredirect(1); + $token->ConfigSpecs(-sitetypes => ['METHOD','siteTypes','SiteTypes',undef], + -startcommand => ['CALLBACK',undef,undef,undef], + -endcommand => ['CALLBACK',undef,undef,undef], + -predropcommand => ['CALLBACK',undef,undef,undef], + -postdropcommand => ['CALLBACK',undef,undef,undef], + -delta => ['PASSIVE','delta','Delta',10], + -cursor => ['SELF','cursor','Cursor','hand2'], + -handlers => ['SETMETHOD','handlers','Handlers',[[[$token,'SendText']]]], + -selection => ['SETMETHOD','selection','Selection','XdndSelection'], + -event => ['SETMETHOD','event','Event','<B1-Motion>'] + ); + $token->{InstallHandlers} = 0; + $args->{-borderwidth} = 3; + $args->{-relief} = 'flat'; + $args->{-takefocus} = 1; +} + +sub sitetypes +{ + my ($w,$val) = @_; + confess "Not a widget $w" unless (ref $w); + my $var = \$w->{Configure}{'-sitetypes'}; + if (@_ > 1) + { + if (defined $val) + { + $val = [$val] unless (ref $val); + my $type; + foreach $type (@$val) + { + Tk::DragDrop->import($type); + } + } + $$var = $val; + } + return (defined $$var) ? $$var : \@types; +} + +sub SendText +{ + my ($w,$offset,$max) = @_; + my $s = substr($w->cget('-text'),$offset); + $s = substr($s,0,$max) if (length($s) > $max); + return $s; +} + +sub handlers +{ + my ($token,$opt,$value) = @_; + $token->{InstallHandlers} = (defined($value) && @$value); + $token->{'handlers'} = $value; +} + +sub selection +{ + my ($token,$opt,$value) = @_; + my $handlers = $token->{'handlers'}; + $token->{InstallHandlers} = (defined($handlers) && @$handlers); +} + +sub event +{ + my ($w,$opt,$value) = @_; + # delete old bindings + $w->parent->Tk::bind($value,[$w,'StartDrag']); +} + +# + +sub FindSite +{ + my ($token,$X,$Y,$e) = @_; + my $site; + my $types = $token->sitetypes; + if (defined $types && @$types) + { + foreach my $type (@$types) + { + my $class = $type{$type}; + last if (defined($class) && ($site = $class->FindSite($token,$X,$Y))); + } + } + else + { + warn 'No sitetypes'; + } + my $new = $site || 'undef'; + my $over = $token->{'Over'}; + if ($over) + { + if (!$over->Match($site)) + { + $over->Leave($token,$e); + delete $token->{'Over'}; + } + } + if ($site) + { + unless ($token->{'Over'}) + { + $site->Enter($token,$e); + $token->{'Over'} = $site; + } + $site->Motion($token,$e) if (defined $site) + } + return $site; +} + +sub Mapped +{ + my ($token) = @_; + my $e = $token->parent->XEvent; + $token = $token->toplevel; + $token->grabGlobal; + $token->focus; + if (defined $e) + { + my $X = $e->X; + my $Y = $e->Y; + $token->MoveToplevelWindow($X+OFFSET,$Y+OFFSET); + $token->NewDrag; + $token->FindSite($X,$Y,$e); + } +} + +sub NewDrag +{ + my ($token) = @_; + my $types = $token->sitetypes; + if (defined $types && @$types) + { + my $type; + foreach $type (@$types) + { + my $class = $type{$type}; + if (defined $class) + { + $class->NewDrag($token); + } + } + } +} + +sub Drag +{ + my $token = shift; + my $e = $token->XEvent; + my $X = $e->X; + my $Y = $e->Y; + $token = $token->toplevel; + $token->MoveToplevelWindow($X+OFFSET,$Y+OFFSET); + $token->FindSite($X,$Y,$e); +} + +sub Done +{ + my $token = shift; + my $e = $token->XEvent; + $token = $token->toplevel; + my $over = delete $token->{'Over'}; + $over->Leave($token,$e) if (defined $over); + my $w = $token->parent; + eval {local $SIG{__DIE__}; $token->grabRelease }; + $token->withdraw; + delete $w->{'Dragging'}; + $w->update; +} + +sub AcceptDrop +{ + my ($token) = @_; + $token->configure(-relief => 'sunken'); + $token->{'Accepted'} = 1; +} + +sub RejectDrop +{ + my ($token) = @_; + $token->configure(-relief => 'flat'); + $token->{'Accepted'} = 0; +} + +sub HandleLoose +{ + my ($w,$seln) = @_; + return ''; +} + +sub InstallHandlers +{ + my ($token,$seln) = @_; + my $w = $token->parent; + $token->configure('-selection' => $seln) if $seln; + $seln = $token->cget('-selection'); + if ($token->{InstallHandlers}) + { + foreach my $h (@{$token->cget('-handlers')}) + { + $w->SelectionHandle('-selection' => $seln,@$h); + } + $token->{InstallHandlers} = 0; + } + if (!$w->IS($w->SelectionOwner('-selection'=>$seln))) + { + $w->SelectionOwn('-selection' => $seln, -command => [\&HandleLoose,$w,$seln]); + } +} + +sub Drop +{ + my $ewin = shift; + my $e = $ewin->XEvent; + my $token = $ewin->toplevel; + my $site = $token->FindSite($e->X,$e->Y,$e); + Tk::catch { $token->grabRelease }; + if (defined $site) + { + my $seln = $token->cget('-selection'); + unless ($token->Callback(-predropcommand => $seln, $site)) + { +# XXX This is ugly if the user restarts a drag within the 2000 ms: +# my $id = $token->after(2000,[$token,'Done']); + my $w = $token->parent; + $token->InstallHandlers; + $site->Drop($token,$seln,$e); + $token->Callback(-postdropcommand => $seln); + $token->Done; + } + } + else + { + $token->Done; + } + $token->Callback('-endcommand'); +} + +sub StartDrag +{ + my $token = shift; + my $w = $token->parent; + unless ($w->{'Dragging'}) + { + my $e = $w->XEvent; + my $X = $e->X; + my $Y = $e->Y; + my $was = $token->{'XY'}; + if ($was) + { + my $dx = $was->[0] - $X; + my $dy = $was->[1] - $Y; + if (sqrt($dx*$dx+$dy*$dy) > $token->cget('-delta')) + { + unless ($token->Callback('-startcommand',$token,$e)) + { + delete $token->{'XY'}; + $w->{'Dragging'} = $token; + $token->MoveToplevelWindow($X+OFFSET,$Y+OFFSET); + $token->raise; + $token->deiconify; + $token->FindSite($X,$Y,$e); + } + } + } + else + { + $token->{'XY'} = [$X,$Y]; + } + } +} + + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/Common.pm b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/Common.pm new file mode 100644 index 00000000000..2f7a33d4fb4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/Common.pm @@ -0,0 +1,59 @@ +package Tk::DragDrop::Common; + +use strict; +use Carp; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/DragDrop/DragDrop/Common.pm#4 $ + +sub Type +{ + my ($base,$name,$class) = @_; + no strict 'refs'; + my $hash = \%{"${base}::type"}; + my $array = \@{"${base}::types"}; + unless (exists $hash->{$name}) + { + push(@$array,$name); + $class = (caller(0))[0] unless (@_ > 2); + $hash->{$name} = $class; + # confess "Strange class $class for $base/$name" unless ($class =~ /^Tk/); + # print "$base $name is ",$class,"\n"; + } +} + +sub import +{ + my $class = shift; + no strict 'refs'; + my $types = \%{"${class}::type"}; + while (@_) + { + my $type = shift; + unless (exists $types->{$type}) + { + if ($type eq 'Local') + { + $class->Type($type,$class); + } + else + { + my ($kind) = $class =~ /([A-Z][a-z]+)$/; + my $file = Tk->findINC("DragDrop/${type}${kind}.pm"); + if (defined $file) + { + # print "Loading $file\n"; + require $file; + } + else + { + croak "Cannot find ${type}${kind}"; + } + } + } + } +} + +1; +__END__ + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/LocalDrop.pm b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/LocalDrop.pm new file mode 100644 index 00000000000..0f5028ae64c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/LocalDrop.pm @@ -0,0 +1,61 @@ +package Tk::DragDrop::Local; +use strict; +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/DragDrop/DragDrop/LocalDrop.pm#4 $ + +use base qw(Tk::DragDrop::Rect); +require Tk::DragDrop; + +my @toplevels; + +Tk::DragDrop->Type('Local'); + +sub XY +{ + my ($site,$event) = @_; + return ($event->X - $site->X,$event->Y - $site->Y); +} + +sub Apply +{ + my $site = shift; + my $name = shift; + my $cb = $site->{$name}; + if ($cb) + { + my $event = shift; + $cb->Call(@_,$site->XY($event)); + } +} + +sub Drop +{ + my ($site,$token,$seln,$event) = @_; + $site->Apply(-dropcommand => $event, $seln); + $site->Apply(-entercommand => $event, 0); + $token->Done; +} + +sub Enter +{ + my ($site,$token,$event) = @_; + $token->AcceptDrop; + $site->Apply(-entercommand => $event, 1); +} + +sub Leave +{ + my ($site,$token,$event) = @_; + $token->RejectDrop; + $site->Apply(-entercommand => $event, 0); +} + +sub Motion +{ + my ($site,$token,$event) = @_; + $site->Apply(-motioncommand => $event); +} + +1; + +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/Rect.pm b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/Rect.pm new file mode 100644 index 00000000000..04cfa8772f2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/Rect.pm @@ -0,0 +1,110 @@ +package Tk::DragDrop::Rect; +use strict; +use Carp; + +# Proxy class which represents sites to the dropping side + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #11 $ =~ /\D(\d+)\s*$/; + +# Some default methods when called site side +# XIDs and viewable-ness from widget + +# XID of ancestor +sub ancestor { ${shift->widget->toplevel->WindowId} } + +# XID of site window +sub win { ${shift->widget->WindowId} } + +# Is site window mapped +sub viewable { shift->widget->viewable } + +sub Over +{ + my ($site,$X,$Y) = @_; + + my $x = $site->X; + my $y = $site->Y; + my $w = $site->width; + my $h = $site->height; + my $val = ($X >= $x && $X < ($x + $w) && $Y >= $y && $Y < ($y + $h)); + + return 0 unless $val; + + my $widget = $site->widget; + + # Now XTranslateCoords from root window to site window's + # ancestor. Ancestors final descendant should be the site window. + # Like $win->containing but avoids a problem that dropper's "token" + # window may be the toplevel (child of root) that contains X,Y + # so if that is in another application ->containing does not + # give us a window. + my $id = $site->ancestor; + while (1) + { + my $cid = $widget->PointToWindow($X,$Y,$id); + last unless $cid; + $id = $cid; + } + return ($id == $site->win); +} + +sub FindSite +{ + my ($class,$widget,$X,$Y) = @_; + foreach my $site ($class->SiteList($widget)) + { + return $site if ($site->viewable && $site->Over($X,$Y)); + } + return undef; +} + +sub NewDrag +{ + my ($class,$widget) = @_; +} + +sub Match +{ + my ($site,$other) = @_; + return 0 unless (defined $other); + return 1 if ($site == $other); + return 0 unless (ref($site) eq ref($other)); + for ("$site") + { + if (/ARRAY/) + { + my $i; + return 0 unless (@$site == @$other); + for ($i = 0; $i < @$site; $i++) + { + return 0 unless ($site->[$i] == $other->[$i]); + } + return 1; + } + elsif (/SCALAR/) + { + return $site == $other; + } + elsif (/HASH/) + { + my $key; + foreach $key (keys %$site) + { + return 0 unless exists $other->{$key}; + return 0 unless ($other->{$key} eq $site->{$key}); + } + foreach $key (keys %$other) + { + return 0 unless exists $site->{$key}; + return 0 unless ($other->{$key} eq $site->{$key}); + } + return 1; + } + return 0; + } + return 0; +} + + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/SunConst.pm b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/SunConst.pm new file mode 100644 index 00000000000..66325466e68 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/SunConst.pm @@ -0,0 +1,34 @@ +package Tk::DragDrop::SunConst; +require Exporter; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/DragDrop/DragDrop/SunConst.pm#4 $ + +use base qw(Exporter); + +@EXPORT = qw(_enter _leave _motion + ENTERLEAVE MOTION DEFAULT_SITE + MOVE_FLAG ACK_FLAG TRANSIENT_FLAG FORWARDED_FLAG + ); + +# Event types +sub _enter () {7}; +sub _leave () {8}; +sub _motion () {6}; + +# Site flags + +sub ENTERLEAVE () {1<<0} +sub MOTION () {1<<1} +sub DEFAULT_SITE () {1<<2} + +# Trigger flags +sub MOVE_FLAG () {1<<0} +sub ACK_FLAG () {1<<1} +sub TRANSIENT_FLAG () {1<<2} +sub FORWARDED_FLAG () {1<<3} + +1; + +__END__ + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/SunDrop.pm b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/SunDrop.pm new file mode 100644 index 00000000000..422a08196ea --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/SunDrop.pm @@ -0,0 +1,200 @@ +package Tk::DragDrop::SunDrop; +require Tk::DragDrop::Rect; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #5 $ =~ /\D(\d+)\s*$/; + +use base qw(Tk::DragDrop::Rect); +use strict; +use Tk::DragDrop::SunConst; + +Tk::DragDrop->Type('Sun'); + +BEGIN + { + # Define the Rect API as members of the array + my @fields = qw(name win X Y width height flags ancestor widget); + my $i = 0; + no strict 'refs'; + for ($i=0; $i < @fields; $i++) + { + my $j = $i; + *{"$fields[$i]"} = sub { shift->[$j] }; + } + } + + +sub Preview +{ + my ($site,$token,$e,$kind,$flags) = (@_); + $token->BackTrace('No flags') unless defined $flags; + my $sflags = $site->flags; + return if ($kind == _motion && !($sflags & MOTION)); + return if ($kind != _motion && !($sflags & ENTERLEAVE)); + my $data = pack('LLSSLL',$kind,$e->t,$e->X,$e->Y,$site->name,$flags); + $token->SendClientMessage('_SUN_DRAGDROP_PREVIEW',$site->win,32,$data); +} + +sub Enter +{ + my ($site,$token,$e) = @_; + $token->AcceptDrop; + $site->Preview($token,$e,_enter,0); +} + +sub Leave +{ + my ($site,$token,$e) = @_; + $token->RejectDrop; + $site->Preview($token,$e,_leave,0); +} + +sub Motion +{ + my ($site,$token,$e) = @_; + $site->Preview($token,$e,_motion,0); +} + +sub HandleDone +{ + my ($token,$seln,$offset,$max) = @_; + $token->Done; + return ''; +} + +sub HandleAck +{ + my ($w,$seln,$offset,$max) = @_; + return ''; +} + +sub HandleItem +{ + my ($w,$seln,$offset,$max) = @_; + return undef; +} + +sub HandleCount +{ + my ($w,$seln,$offset,$max) = @_; + return 1; +} + +sub Drop +{ + my ($site,$token,$seln,$e) = @_; + my $w = $token->parent; + $w->SelectionHandle('-selection'=>$seln,'-type'=>'_SUN_DRAGDROP_ACK',[\&HandleAck,$token,$seln]); + $w->SelectionHandle('-selection'=>$seln,'-type'=>'_SUN_DRAGDROP_DONE',[\&HandleDone,$token,$seln]); + my $atom = $w->InternAtom($seln); + my $flags = ACK_FLAG | TRANSIENT_FLAG; + my $data = pack('LLSSLL',$atom,$e->t,$e->X,$e->Y,$site->name,$flags); + $w->SendClientMessage('_SUN_DRAGDROP_TRIGGER',$site->win,32,$data); +} + +sub FindSite +{ + my ($class,$token,$X,$Y) = @_; + $token->{'SunDD'} = [] unless exists $token->{'SunDD'}; + my $site = $class->SUPER::FindSite($token,$X,$Y); + if (!defined $site) + { + my $id = $token->PointToWindow($X,$Y); + while ($id) + { + my @prop; + Tk::catch { @prop = $token->property('get','_SUN_DRAGDROP_INTEREST', $id) }; + if (!$@ && shift(@prop) eq '_SUN_DRAGDROP_INTEREST' && shift(@prop) == 0) + { + # This is a "toplevel" which has some sites associated with it. + my ($bx,$by) = $token->WindowXY($id); + $token->{'SunDDSeen'} = {} unless exists $token->{'SunDDSeen'}; + return $site if $token->{'SunDDSeen'}{$id}; + $token->{'SunDDSeen'}{$id} = 1; + my $sites = $token->{'SunDD'}; + my $count = shift(@prop); + while (@prop && $count-- > 0) + { + my ($xid,$sn,$flags,$kind,$n) = splice(@prop,0,5); + if ($kind != 0) + { + warn "Don't understand site type $kind"; + last; + } + while (@prop >= 4 && $n-- > 0) + { + my ($x,$y,$w,$h) = splice(@prop,0,4); + push(@$sites,bless [$sn,$xid,$x+$bx,$y+$by,$w,$h,$flags,$id,$token],$class); + } + } + return $class->SUPER::FindSite($token,$X,$Y); + } + $id = $token->PointToWindow($X,$Y,$id) + } + } + return $site; +} + +my $busy = 0; + +sub NewDrag +{ + my ($class,$token) = @_; + delete $token->{'SunDD'} unless $busy; + delete $token->{'SunDDSeen'}; +} + +sub SiteList +{ + my ($class,$token) = @_; + return @{$token->{'SunDD'}}; +} + +1; +__END__ + +# this code is obsolete now that we look at properties ourselves +# which means we don't need dropsite manager running +# On Sun's running OpenLook the window manager or dropsite mananger +# watches for and caches site info in a special selection +# This code got sites from that +# + +sub SiteList +{ + my ($class,$token) = @_; + unless (1 || $busy || exists $token->{'SunDD'}) + { + Carp::confess('Already doing it!') if ($busy++); + my @data = (); + my @sites = (); + my $mw = $token->MainWindow; + $token->{'SunDD'} = \@sites; + Tk::catch { + @data = $mw->SelectionGet( '-selection'=>'_SUN_DRAGDROP_DSDM', '_SUN_DRAGDROP_SITE_RECTS'); + }; + if ($@) + { + $token->configure('-cursor'=>'hand2'); + $token->grab(-global); + } + else + { + while (@data) + { + my $version = shift(@data); + if ($version != 0) + { + warn "Unexpected site version $version"; + last; + } + push(@sites,bless [splice(@data,0,7)],$class); + } + } + $busy--; + } + return @{$token->{'SunDD'}}; +} + +1; + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/SunSite.pm b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/SunSite.pm new file mode 100644 index 00000000000..ab3f4f9793b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/SunSite.pm @@ -0,0 +1,107 @@ +package Tk::DragDrop::SunSite; +require Tk::DropSite; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #6 $ =~ /\D(\d+)\s*$/; + +use Tk::DragDrop::SunConst; +use base qw(Tk::DropSite); +use strict; + +Tk::DropSite->Type('Sun'); + +sub SunDrop +{ + my ($w,$site) = @_; + my $e = $w->XEvent; + my ($seln,$t,$x,$y,$id,$flags) = unpack('LLSSLL',$e->A); + $w->MakeAtom($seln); + if ($flags & &ACK_FLAG) + { + Tk::catch { $w->SelectionGet('-selection'=>$seln,'_SUN_DRAGDROP_ACK') }; + } + my @targ = $w->SelectionGet(-selection => $seln,'TARGETS'); + $site->Apply(-dropcommand => $x, $y, $seln, SunDrop => \@targ); + if ($flags & &TRANSIENT_FLAG) + { + Tk::catch { $w->SelectionGet('-selection'=>$seln,'_SUN_DRAGDROP_DONE') }; + } + $w->configure('-relief' => $w->{'_DND_RELIEF_'}) if (defined $w->{'_DND_RELIEF_'}); + $site->Apply(-entercommand => $x, $y, 0); +} + +sub SunPreview +{ + my ($w,$site) = @_; + my $event = $w->XEvent; + my ($kind,$t,$x,$y,$id,$flags) = unpack('LLSSLL',$event->A); + $x -= $site->X; + $y -= $site->Y; + if ($kind == _enter) + { + $site->Callback(-entercommand => 1, $x, $y); + } + elsif ($kind == _leave) + { + $site->Callback(-entercommand => 0, $x, $y); + } + elsif ($kind == _motion) + { + $site->Callback(-motioncommand => $x, $y); + } +} + +sub InitSite +{ + my ($class,$site) = @_; + my $w = $site->widget; + $w->BindClientMessage('_SUN_DRAGDROP_TRIGGER',[\&SunDrop,$site]); + $w->BindClientMessage('_SUN_DRAGDROP_PREVIEW',[\&SunPreview,$site]); +} + +sub NoteSites +{ + my ($class,$t,$sites) = @_; + my $count = @$sites; + my @data = (0,0); + my ($wrapper,$offset) = $t->wrapper; + if ($t->viewable) + { + my $s; + my $i = 0; + my @win; + my $bx = $t->rootx; + my $by = $t->rooty - $offset; + $t->MakeWindowExist; + foreach $s (@$sites) + { + my $w = $s->widget; + if ($w->viewable) + { + $w->MakeWindowExist; + $data[1]++; + push(@data,${$w->WindowId}); # XID + push(@data,$i++); # Our 'tag' + push(@data,ENTERLEAVE|MOTION); # Flags + push(@data,0); # Kind is 'rect' + push(@data,1); # Number of rects + push(@data,$s->X-$bx,$s->Y-$by,$s->width,$s->height); # The rect + } + } + } + if ($data[1]) + { + $t->property('set', + '_SUN_DRAGDROP_INTEREST', # name + '_SUN_DRAGDROP_INTEREST', # type + 32, # format + \@data,$wrapper); # the data + } + else + { + $t->property('delete','_SUN_DRAGDROP_INTEREST',$wrapper); + } +} + + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/Win32Drop.pm b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/Win32Drop.pm new file mode 100644 index 00000000000..08a4656ecce --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/Win32Drop.pm @@ -0,0 +1,8 @@ +package Tk::DragDrop::Win32Drop; +# Dummy placeholder for symetry + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/DragDrop/Win32Site/Win32Drop.pm#4 $ + +use Tk (); +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/Win32Site.pm b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/Win32Site.pm new file mode 100644 index 00000000000..f45d06bc92b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/Win32Site.pm @@ -0,0 +1,50 @@ +package Tk::DragDrop::Win32Site; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #8 $ =~ /\D(\d+)\s*$/; + +use Tk qw($XS_VERSION); +require DynaLoader; +require Tk::DropSite; + +use base qw(Tk::DropSite DynaLoader); + +bootstrap Tk::DragDrop::Win32Site; + +use strict; + +Tk::DropSite->Type('Win32'); + +sub WM_DROPFILES () {563} + +sub InitSite +{ + my ($class,$site) = @_; + my $w = $site->widget; + $w->BindClientMessage(WM_DROPFILES,[\&Win32Drop,$site]); + DragAcceptFiles($w,1); +} + +sub Win32Drop +{ + # print join(',',@_),"\n"; + my ($w,$site,$msg,$wParam,$lParam) = @_; + my ($x,$y,@files) = DropInfo($wParam); + my $cb = $site->{'-dropcommand'}; + $site->Apply(-entercommand => $x, $y, 1); + if ($cb) + { + foreach my $file (@files) + { + # print "$file @ $x,$y\n"; + $w->clipboardClear; + $w->clipboardAppend('--',$file); + $cb->Call('CLIPBOARD',Win32Drop => ['STRING'],$x,$y); + } + } + $site->Apply(-entercommand => $x, $y, 0); + return 0; +} + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/XDNDDrop.pm b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/XDNDDrop.pm new file mode 100644 index 00000000000..7376c8d69c5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/XDNDDrop.pm @@ -0,0 +1,145 @@ +package Tk::DragDrop::XDNDDrop; +use strict; +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #6 $ =~ /\D(\d+)\s*$/; +use base qw(Tk::DragDrop::Rect); + +sub XDND_PROTOCOL_VERSION () { 4 } + +Tk::DragDrop->Type('XDND'); + +sub NewDrag +{ + my ($class,$token) = @_; + $token->{$class} = {}; +} + +sub new +{ + my ($class,$token,$id,@prop) = @_; + my $ver = $token->InternAtom(shift(@prop)); + # warn "XDND version $ver ".join(' ',@prop)."\n"; + $ver = XDND_PROTOCOL_VERSION if $ver > XDND_PROTOCOL_VERSION; + my $site = bless { id => $id, token => $token, ver => $ver, state => 0, accept => \@prop}, $class; + my $w = $token->parent; + $w->BindClientMessage('XdndStatus',[$site => 'XdndStatus']); + $w->BindClientMessage('XdndFinished',[$site => 'XdndFinished']); + return $site; +} + +sub Drop +{ + my ($site,$token,$seln,$e) = @_; + my $w = $token->parent; + my $data = pack('LLLLL',oct($w->id),0,$e->t,0,0); + $w->SendClientMessage('XdndDrop',$site->{id},32,$data); +} + +sub FindSite +{ + my ($class,$token,$X,$Y) = @_; + my $id = $token->PointToWindow($X,$Y); + while ($id) + { + my @prop; + Tk::catch { @prop = $token->property('get','XdndAware', $id) }; + if (!$@ && shift(@prop) eq 'ATOM') + { + my $hash = $token->{$class}; + my $site = $hash->{$id}; + if (!defined $site) + { + $site = $class->new($token,$id,@prop); + $hash->{$id} = $site; + } + return $site; + } + $id = $token->PointToWindow($X,$Y,$id) + } + return undef; +} + +sub Enter +{ + my ($site,$token,$e) = @_; + my $w = $token->parent; + $token->InstallHandlers('XdndSelection'); + my $seln = $token->cget('-selection'); + my @targets = grep(!/^(TARGETS|MULTIPLE|TIMESTAMP)$/,reverse($token->SelectionGet('-selection'=> 'XdndSelection','TARGETS'))); + # print join(' ',@targets),"\n"; + my $flags = ($site->{ver} << 24); + my @atarg = map($token->InternAtom($_),@targets); + my $ntarg = @atarg; + if ($ntarg > 3) + { + $flags |= 1; + $w->property('set','XdndTypeList','ATOM',32,\@atarg); + splice(@atarg,3); + } + else + { + splice(@atarg,$ntarg,(0 x 3 - $ntarg)); + } + unshift(@atarg,oct($w->id),$flags); + # print join(' ',map(sprintf("%08X",$_),@atarg)),"\n"; + my $data = pack('LLLLL',@atarg); + $w->SendClientMessage('XdndEnter',$site->{id},32,$data); +} + +sub Leave +{ + my ($site,$token,$e) = @_; + my $w = $token->parent; + my $data = pack('LLLLL',oct($w->id), 0, 0, 0, 0); + $w->SendClientMessage('XdndLeave',$site->{id},32,$data); +} + +sub Motion +{ + my ($site,$token,$e) = @_; + my $X = $e->X; + my $Y = $e->Y; + my $w = $token->parent; + my $action = $token->InternAtom($site->{'action'} || 'XdndActionCopy'); + my @atarg = (oct($w->id),0,($X << 16) | $Y, $e->t, $action); + # print join(' ',map(sprintf("%08X",$_),@atarg)),"\n"; + my $data = pack('LLLLL',@atarg); + $w->SendClientMessage('XdndPosition',$site->{id},32,$data); +} + +sub XdndFinished +{ + my ($site) = @_; + my $token = $site->{token}; + # printf "XdndFinished $site\n", + $token->Done; +} + +sub XdndStatus +{ + my ($site) = @_; + my $token = $site->{token}; + my $w = $token->parent; + my $event = $w->XEvent; + my ($tid,$flags,$xy,$wh,$action) = unpack('LLLLL',$event->A); + $action = $w->GetAtomName($action) if $action; + $site->{flags} = $flags; + $site->{'X'} = $xy >> 16; + $site->{'Y'} = $xy & 0xFFFF; + $site->{'width'} = $wh >> 16; + $site->{'height'} = $wh & 0xFFFF; + #printf "XdndStatus $site targ=%x flags=%08X x=%d y=%d w=%d h=%d a=%s\n", + # $tid,$flags,$xy >> 16, $xy & 0xFFFF, $wh >> 16, $wh & 0xFFFF,$action; + if ($flags & 1) + { + $token->AcceptDrop; + } + else + { + $token->RejectDrop; + } +} + + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/XDNDSite.pm b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/XDNDSite.pm new file mode 100644 index 00000000000..4ac75d63c40 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/DragDrop/XDNDSite.pm @@ -0,0 +1,159 @@ +package Tk::DragDrop::XDNDSite; +use strict; +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #6 $ =~ /\D(\d+)\s*$/; +use base qw(Tk::DropSite); + +sub XDND_PROTOCOL_VERSION () { 4 } + +Tk::DropSite->Type('XDND'); + +sub InitSite +{my ($class,$site) = @_; + my $w = $site->widget; +} + +sub XdndEnter +{ + my ($t,$sites) = @_; + my $event = $t->XEvent; + my ($src,$flags,@types) = unpack('LLLLL',$event->A); + my $ver = ($flags >> 24) & 0xFF; + if ($flags & 1) + { + my @prop; + Tk::catch { @prop = $t->property('get','XdndTypeList',$src) }; + @types = @prop if (!$@ && shift(@prop) eq 'ATOM'); + } + else + { + $t->MakeAtom(@types); + } + # print "XdndEnter $src $ver @types\n"; + $t->{"XDND$src"} = { ver => $ver, types => \@types }; +} + +sub XdndLeave +{ + my ($t,$sites) = @_; + my $event = $t->XEvent; + my ($src,$flags,@types) = unpack('LLLLL',$event->A); + # print "XdndLeave $src\n"; + my $info = $t->{"XDND$src"}; + if ($info) + { + my $over = $info->{site}; + if ($over) + { + my $X = $info->{X}; + my $Y = $info->{Y}; + $over->Apply(-entercommand => $X, $Y, 0) + } + } + delete $t->{"XDND$src"}; +} + +sub XdndPosition +{ + my ($t,$sites) = @_; + my $event = $t->XEvent; + my ($src,$flags,$xy,$time,$action) = unpack('LLLLL',$event->A); + $t->MakeAtom($action); + my $X = $xy >> 16; + my $Y = $xy & 0xFFFF; + my $info = $t->{"XDND$src"}; + $info->{X} = $X; + $info->{Y} = $Y; + $info->{action} = $action; + $info->{t} = $time; + my ($id) = $t->wrapper; + my $sxy = 0; + my $swh = 0; + my $sflags = 0; + my $saction = 0; + my $over = $info->{site}; + foreach my $site (@$sites) + { + if ($site->Over($X,$Y)) + { + $sxy = ($site->X << 16) | $site->Y; + $swh = ($site->width << 16) | $site->height; + $saction = $action; + $sflags |= 1; + if ($over) + { + if ($over == $site) + { + $site->Apply(-motioncommand => $X, $Y); + } + else + { + $over->Apply(-entercommand => $X, $Y, 0); + $site->Apply(-entercommand => $X, $Y, 1); + } + } + else + { + $site->Apply(-entercommand => $X, $Y, 1); + } + $info->{site} = $site; + last; + } + } + unless ($sflags & 1) + { + if ($over) + { + $over->Apply(-entercommand => $X, $Y, 0) + } + delete $info->{site}; + } + my $data = pack('LLLLL',$id,$sflags,$sxy,$swh,$action); + $t->SendClientMessage('XdndStatus',$src,32,$data); +} + +sub XdndDrop +{ + my ($t,$sites) = @_; + my $event = $t->XEvent; + my ($src,$flags,$time,$res1,$res2) = unpack('LLLLL',$event->A); + my $info = $t->{"XDND$src"}; + my $sflags = 0; + my $action = 0; + if ($info) + { + $info->{t} = $time; + my $site = $info->{'site'}; + if ($site) + { + my $X = $info->{'X'}; + my $Y = $info->{'Y'}; + $action = $info->{action}; + $site->Apply(-dropcommand => $X, $Y, 'XdndSelection',$action,$info->{types}); + $site->Apply(-entercommand => $X, $Y, 0); + } + } + my ($id) = $t->wrapper; + my $data = pack('LLLLL',$id,$sflags,$action,0,0); + $t->SendClientMessage('XdndFinished',$src,32,$data); +} + +sub NoteSites +{my ($class,$t,$sites) = @_; + my ($wrapper) = $t->wrapper; + if (@$sites) + { + $t->BindClientMessage('XdndLeave',[\&XdndLeave,$sites]); + $t->BindClientMessage('XdndEnter',[\&XdndEnter,$sites]); + $t->BindClientMessage('XdndPosition',[\&XdndPosition,$sites]); + $t->BindClientMessage('XdndDrop',[\&XdndDrop,$sites]); + $t->property('set','XdndAware','ATOM',32,[XDND_PROTOCOL_VERSION],$wrapper); + } + else + { + $t->property('delete','XdndAware',$wrapper); + } +} + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/DropSite.pm b/Master/tlpkg/tlperl.old/lib/Tk/DropSite.pm new file mode 100644 index 00000000000..3519c108384 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/DropSite.pm @@ -0,0 +1,257 @@ +package Tk::DropSite; +require Tk::DragDrop::Common; +require Tk::DragDrop::Rect; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #7 $ =~ /\D(\d+)\s*$/; + +use base qw(Tk::DragDrop::Common Tk::DragDrop::Rect); + +Construct Tk::Widget 'DropSite'; + +use strict; +use vars qw(%type @types); + +Tk::DragDrop->Tk::DragDrop::Common::Type('Local'); + +my @toplevels; + +BEGIN +{ + # Are these really methods of Tk::DragDrop::Rect ? + no strict 'refs'; + foreach my $name (qw(x y X Y width height widget)) + { + my $key = $name; + *{"$key"} = sub { shift->{$key} }; + } +} + +# Dropping side API - really only here for Local drops +# inheritance is a mess right now. + +sub NewDrag +{ + my ($class,$token) = @_; + # No need to clear cached sites we see live data +} + +sub SiteList +{ + # this should be inheritable - so that receive side of XDND can re-use it. + my ($class,$widget) = @_; + my $t; + my @list; + foreach $t (@toplevels) + { + my $sites = $t->{'DropSites'}; + if ($sites) + { + $sites = $sites->{'Local'}; + push(@list,@{$sites}) if ($sites); + } + } + return @list; +} + +sub Apply +{ + my $site = shift; + my $name = shift; + my $cb = $site->{$name}; + if ($cb) + { + my $X = shift; + my $Y = shift; + $cb->Call(@_,$X - $site->X, $Y - $site->Y); + } +} + +sub Drop +{ + my ($site,$token,$seln,$event) = @_; + my $X = $event->X; + my $Y = $event->Y; + my @targ = $token->SelectionGet(-selection => $seln,'TARGETS'); + $site->Apply(-dropcommand => $X, $Y, $seln,'LocalDrop',\@targ); + $site->Apply(-entercommand => $X, $Y, 0); + $token->Done; +} + +sub Enter +{ + my ($site,$token,$event) = @_; + $token->AcceptDrop; + $site->Apply(-entercommand => $event->X, $event->Y, 1); +} + +sub Leave +{ + my ($site,$token,$event) = @_; + $token->RejectDrop; + $site->Apply(-entercommand => $event->X, $event->Y, 0); +} + +sub Motion +{ + my ($site,$token,$event) = @_; + $site->Apply(-motioncommand => $event->X, $event->Y); +} + +# This is receive side API. + +sub NoteSites +{ + my ($class,$t,$sites) = @_; + unless (grep($_ == $t,@toplevels)) + { + $Tk::DragDrop::types{'Local'} = $class if (@$sites); + push(@toplevels,$t); + $t->OnDestroy(sub { @toplevels = grep($_ != $t,@toplevels) }); + } +} + +sub UpdateDropSites +{ + my ($t) = @_; + $t->{'DropUpdate'} = 0; + foreach my $type (@types) + { + my $sites = $t->{'DropSites'}->{$type}; + if ($sites && @$sites) + { + my $class = $type{$type}; + $class->NoteSites($t,$sites); + } + } +} + +sub QueueDropSiteUpdate +{ + my $obj = shift; + my $class = ref($obj); + my $t = $obj->widget->toplevel; + unless ($t->{'DropUpdate'}) + { + $t->{'DropUpdate'} = 1; + $t->afterIdle(sub { UpdateDropSites($t) }); + } +} + +sub delete +{ + my ($obj) = @_; + my $w = $obj->widget; + $w->bindtags([grep($_ ne $obj,$w->bindtags)]); + my $t = $w->toplevel; + foreach my $type (@{$obj->{'-droptypes'}}) + { + my $a = $t->{'DropSites'}->{$type}; + @$a = grep($_ ne $obj,@$a); + } + $obj->QueueDropSiteUpdate; +} + +sub DropSiteUpdate +{ + # Note size of widget and arrange to update properties etc. + my $obj = shift; + my $w = $obj->widget; + $obj->{'x'} = $w->X; + $obj->{'y'} = $w->Y; + $obj->{'X'} = $w->rootx; + $obj->{'Y'} = $w->rooty; + $obj->{'width'} = $w->Width; + $obj->{'height'} = $w->Height; + $obj->QueueDropSiteUpdate; +} + +sub TopSiteUpdate +{ + my ($t) = @_; + foreach my $type (@types) + { + my $sites = $t->{'DropSites'}->{$type}; + if ($sites && @$sites) + { + my $site; + foreach $site (@$sites) + { + $site->DropSiteUpdate; + } + } + } +} + +sub Callback +{ + my $obj = shift; + my $key = shift; + my $cb = $obj->{$key}; + $cb->Call(@_) if (defined $cb); +} + +sub InitSite +{ + my ($class,$site) = @_; + # Tk::DragDrop->Type('Local'); +} + +sub new +{ + my ($class,$w,%args) = @_; + my $t = $w->toplevel; + $args{'widget'} = $w; + if (exists $args{'-droptypes'}) + { + # Convert single type to array-of-one + $args{'-droptypes'} = [$args{'-droptypes'}] unless (ref $args{'-droptypes'}); + } + else + { + # Default to all known types. + $args{'-droptypes'} = \@types; + } + my ($key,$val); + while (($key,$val) = each %args) + { + if ($key =~ /command$/) + { + $val = Tk::Callback->new($val); + $args{$key} = $val; + } + } + my $obj = bless \%args,$class; + unless (exists $t->{'DropSites'}) + { + $t->{'DropSites'} = {}; + $t->{'DropUpdate'} = 0; + } + my $type; + foreach $type (@{$args{'-droptypes'}}) + { + Tk::DropSite->import($type) unless (exists $type{$type}); + my $class = $type{$type}; + $class->InitSite($obj); + # Should this be indexed by type or class ? + unless (exists $t->{'DropSites'}->{$type}) + { + $t->{'DropSites'}->{$type} = []; + } + push(@{$t->{'DropSites'}->{$type}},$obj); + } + $w->OnDestroy([$obj,'delete']); + $obj->DropSiteUpdate; + $w->bindtags([$w->bindtags,$obj]); + $w->Tk::bind($obj,'<Map>',[$obj,'DropSiteUpdate']); + $w->Tk::bind($obj,'<Unmap>',[$obj,'DropSiteUpdate']); + $w->Tk::bind($obj,'<Configure>',[$obj,'DropSiteUpdate']); + $t->Tk::bind($class,'<Configure>',[\&TopSiteUpdate,$t]); + unless (grep($_ eq $class,$t->bindtags)) + { + $t->bindtags([$t->bindtags,$class]); + } + return $obj; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/DummyEncode.pm b/Master/tlpkg/tlperl.old/lib/Tk/DummyEncode.pm new file mode 100644 index 00000000000..5ead808405d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/DummyEncode.pm @@ -0,0 +1,46 @@ +package Tk::DummyEncode; + +use vars qw($VERSION); +$VERSION = '4.007'; # $Id: //depot/Tkutf8/Tk/DummyEncode.pm#7 $ + +sub getEncoding +{ + my ($class,$name) = @_; + return undef unless ($name =~ /(iso8859-1|X11ControlChars)/); + my $pkg = $name; + $pkg =~ s/\W+/_/g; + return bless {Name => $name},$class.'::'.$pkg; +} + +package Tk::DummyEncode::iso8859_1; +sub encode +{ + my ($obj,$uni,$chk) = @_; + $_[1] = '' if $chk; + return $uni; +} + +sub decode +{ + my ($obj,$byt,$chk) = @_; + $_[1] += '' if $chk; + return $byt; +} + +package Tk::DummyEncode::X11ControlChars; +sub encode +{ + my ($obj,$uni,$chk) = @_; + my $str = ''; + foreach my $ch (split(//,$uni)) + { + $str .= sprintf("\\x{%x}",ord($ch)); + } + $_[1] = '' if $chk; + return $str; +} + +1; + +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/English.pm b/Master/tlpkg/tlperl.old/lib/Tk/English.pm new file mode 100644 index 00000000000..de640376580 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/English.pm @@ -0,0 +1,307 @@ +package Tk::English; + +require Exporter; + +use vars qw($VERSION); +$VERSION = '4.006'; # $Id: //depot/Tkutf8/Tk/English.pm#6 $ + +use base qw(Exporter); + +# This file is generated automatically by pTk/makeenglish from Tk distribution. + + +@EXPORT = qw( + &ABOVE &ACTIVATE &ACTIVE &ADD &ADDTAG &ADJUST &AFTER &ALL &ANCHOR &APPEND + &APPLY &ARROW1 &ARROW2 &ASCII &ASPECT &AUTO &BASELINE &BBOX &BEFORE &BELOW + &BEVEL &BIND &BITMAP &BLANK &BOTH &BOTTOM &BUTT &CANVASX &CANVASY &CAPTURE + &CASCADE &CENTER &CGET &CHAR &CHARS &CHECKBUTTON &CHILDREN &CLEAR &CLIENT + &CLONE &CLOSEST &COLOR &COLORMAPWINDOWS &COLUMN &COLUMNCONFIGURE &COMMAND + &COMPARE &CONFIGURE &COORDS © &CREATE &CURRENT &CURSELECTION &DATA + &DCHARS &DEACTIVATE &DEBUG &DECORATIONS &DECREASING &DEFAULT &DEICONIFY + &DELETE &DELTA &DESELECT &DLINEINFO &DOWN &DRAGSITE &DRAGTO &DROPSITE &DTAG + &DUMP &ENCLOSED &END &ENTRY &ENTRYCGET &ENTRYCONFIGURE &EVAL &EXISTS &EXPAND + &FILL &FILLX &FILLY &FIND &FIRST &FLASH &FLAT &FOCUS &FOCUSMODEL &FOCUSNEXT + &FOCUSPREV &FORGET &FRACTION &FRAME &FROM &GENERATE &GEOMETRY &GEOMETRYINFO + &GET &GETTAGS &GRAVITY &GRAY &GRID &GROOVE &GROUP &HANDLE &HEAD &HEIGHT + &HIDDEN &HIDE &HORIZONTAL &ICONBITMAP &ICONIFY &ICONMASK &ICONNAME + &ICONPOSITION &ICONWINDOW &ICURSOR &IDENTIFY &IDLETASKS &IGNORE &IMAGE + &INCLUDES &INCREASING &INDEX &INFO &INSERT &INSIDE &INTEGER &INTERACTIVE + &INVOKE &ISMWMRUNNING &ITEM &ITEMCGET &ITEMCONFIGURE &LAST &LEFT &LINE + &LINECONFIGURE &LINEEND &LINES &LINESTART &LIST &LOCATION &LOWER &MARK &MAX + &MAXSIZE &MENUBAR &MINSIZE &MITER &MONOCHROME &MOVE &MOVETO &NAMES &NEAREST + &NEW &NEXT &NEXTRANGE &NONE &NORMAL &NOW &OFFSPRINGS &OUTSIDE &OVERLAPPING + &OVERRIDEREDIRECT &OWN &PADX &PADY &PAGECGET &PAGECONFIGURE &PAGES &PARENT + &PASSIVE &POSITION &POSITIONFROM &POST &POSTCASCADE &POSTSCRIPT &PRESENT + &PREV &PREVIOUS &PREVRANGE &PROGRAM &PROJECTING &PROPAGATE &PROTOCOL &PUT + &RADIOBUTTON &RAISE &RAISED &RANGE &RANGES &READ &READFILE &REAL &RECORD + &REDITHER &REFCOUNT &RELEASE &REMOVE &RESIZABLE &RIDGE &RIGHT &ROOT &ROUND + &ROW &ROWCONFIGURE &ROWS &SAVEUNDER &SCALE &SCAN &SCROLL &SEARCH &SEE + &SELECT &SELECTION &SEPARATOR &SET &SHOW &SIBLINGS &SIZE &SIZEFROM &SLAVES + &SLIDER &SOLID &SPACE &STATE &STATUS &SUNKEN &TAG &TAIL &TEAROFF &TEXT + &TITLE &TO &TOGGLE &TOP &TRACING &TRANSIENT &TRANSIENTFOR &TYPE &TYPES + &UNITS &UNPACK &UNPOST &UNSET &UP &USER &VARIABLE &VERTICAL &VISIBILITY + &WIDTH &WINDOW &WITHDRAW &WITHTAG &WORDEND &WORDSTART &WRITE &XVIEW + &YPOSITION &YVIEW +); +sub ABOVE () { 'above' } +sub ACTIVATE () { 'activate' } +sub ACTIVE () { 'active' } +sub ADD () { 'add' } +sub ADDTAG () { 'addtag' } +sub ADJUST () { 'adjust' } +sub AFTER () { 'after' } +sub ALL () { 'all' } +sub ANCHOR () { 'anchor' } +sub APPEND () { 'append' } +sub APPLY () { 'apply' } +sub ARROW1 () { 'arrow1' } +sub ARROW2 () { 'arrow2' } +sub ASCII () { 'ascii' } +sub ASPECT () { 'aspect' } +sub AUTO () { 'auto' } +sub BASELINE () { 'baseline' } +sub BBOX () { 'bbox' } +sub BEFORE () { 'before' } +sub BELOW () { 'below' } +sub BEVEL () { 'bevel' } +sub BIND () { 'bind' } +sub BITMAP () { 'bitmap' } +sub BLANK () { 'blank' } +sub BOTH () { 'both' } +sub BOTTOM () { 'bottom' } +sub BUTT () { 'butt' } +sub CANVASX () { 'canvasx' } +sub CANVASY () { 'canvasy' } +sub CAPTURE () { 'capture' } +sub CASCADE () { 'cascade' } +sub CENTER () { 'center' } +sub CGET () { 'cget' } +sub CHAR () { 'char' } +sub CHARS () { 'chars' } +sub CHECKBUTTON () { 'checkbutton' } +sub CHILDREN () { 'children' } +sub CLEAR () { 'clear' } +sub CLIENT () { 'client' } +sub CLONE () { 'clone' } +sub CLOSEST () { 'closest' } +sub COLOR () { 'color' } +sub COLORMAPWINDOWS () { 'colormapwindows' } +sub COLUMN () { 'column' } +sub COLUMNCONFIGURE () { 'columnconfigure' } +sub COMMAND () { 'command' } +sub COMPARE () { 'compare' } +sub CONFIGURE () { 'configure' } +sub COORDS () { 'coords' } +sub COPY () { 'copy' } +sub CREATE () { 'create' } +sub CURRENT () { 'current' } +sub CURSELECTION () { 'curselection' } +sub DATA () { 'data' } +sub DCHARS () { 'dchars' } +sub DEACTIVATE () { 'deactivate' } +sub DEBUG () { 'debug' } +sub DECORATIONS () { 'decorations' } +sub DECREASING () { 'decreasing' } +sub DEFAULT () { 'default' } +sub DEICONIFY () { 'deiconify' } +sub DELETE () { 'delete' } +sub DELTA () { 'delta' } +sub DESELECT () { 'deselect' } +sub DLINEINFO () { 'dlineinfo' } +sub DOWN () { 'down' } +sub DRAGSITE () { 'dragsite' } +sub DRAGTO () { 'dragto' } +sub DROPSITE () { 'dropsite' } +sub DTAG () { 'dtag' } +sub DUMP () { 'dump' } +sub ENCLOSED () { 'enclosed' } +sub END () { 'end' } +sub ENTRY () { 'entry' } +sub ENTRYCGET () { 'entrycget' } +sub ENTRYCONFIGURE () { 'entryconfigure' } +sub EVAL () { 'eval' } +sub EXISTS () { 'exists' } +sub EXPAND () { 'expand' } +sub FILL () { 'fill' } +sub FILLX () { 'fillx' } +sub FILLY () { 'filly' } +sub FIND () { 'find' } +sub FIRST () { 'first' } +sub FLASH () { 'flash' } +sub FLAT () { 'flat' } +sub FOCUS () { 'focus' } +sub FOCUSMODEL () { 'focusmodel' } +sub FOCUSNEXT () { 'focusnext' } +sub FOCUSPREV () { 'focusprev' } +sub FORGET () { 'forget' } +sub FRACTION () { 'fraction' } +sub FRAME () { 'frame' } +sub FROM () { 'from' } +sub GENERATE () { 'generate' } +sub GEOMETRY () { 'geometry' } +sub GEOMETRYINFO () { 'geometryinfo' } +sub GET () { 'get' } +sub GETTAGS () { 'gettags' } +sub GRAVITY () { 'gravity' } +sub GRAY () { 'gray' } +sub GRID () { 'grid' } +sub GROOVE () { 'groove' } +sub GROUP () { 'group' } +sub HANDLE () { 'handle' } +sub HEAD () { 'head' } +sub HEIGHT () { 'height' } +sub HIDDEN () { 'hidden' } +sub HIDE () { 'hide' } +sub HORIZONTAL () { 'horizontal' } +sub ICONBITMAP () { 'iconbitmap' } +sub ICONIFY () { 'iconify' } +sub ICONMASK () { 'iconmask' } +sub ICONNAME () { 'iconname' } +sub ICONPOSITION () { 'iconposition' } +sub ICONWINDOW () { 'iconwindow' } +sub ICURSOR () { 'icursor' } +sub IDENTIFY () { 'identify' } +sub IDLETASKS () { 'idletasks' } +sub IGNORE () { 'ignore' } +sub IMAGE () { 'image' } +sub INCLUDES () { 'includes' } +sub INCREASING () { 'increasing' } +sub INDEX () { 'index' } +sub INFO () { 'info' } +sub INSERT () { 'insert' } +sub INSIDE () { 'inside' } +sub INTEGER () { 'integer' } +sub INTERACTIVE () { 'interactive' } +sub INVOKE () { 'invoke' } +sub ISMWMRUNNING () { 'ismwmrunning' } +sub ITEM () { 'item' } +sub ITEMCGET () { 'itemcget' } +sub ITEMCONFIGURE () { 'itemconfigure' } +sub LAST () { 'last' } +sub LEFT () { 'left' } +sub LINE () { 'line' } +sub LINECONFIGURE () { 'lineconfigure' } +sub LINEEND () { 'lineend' } +sub LINES () { 'lines' } +sub LINESTART () { 'linestart' } +sub LIST () { 'list' } +sub LOCATION () { 'location' } +sub LOWER () { 'lower' } +sub MARK () { 'mark' } +sub MAX () { 'max' } +sub MAXSIZE () { 'maxsize' } +sub MENUBAR () { 'menubar' } +sub MINSIZE () { 'minsize' } +sub MITER () { 'miter' } +sub MONOCHROME () { 'monochrome' } +sub MOVE () { 'move' } +sub MOVETO () { 'moveto' } +sub NAMES () { 'names' } +sub NEAREST () { 'nearest' } +sub NEW () { 'new' } +sub NEXT () { 'next' } +sub NEXTRANGE () { 'nextrange' } +sub NONE () { 'none' } +sub NORMAL () { 'normal' } +sub NOW () { 'now' } +sub OFFSPRINGS () { 'offsprings' } +sub OUTSIDE () { 'outside' } +sub OVERLAPPING () { 'overlapping' } +sub OVERRIDEREDIRECT () { 'overrideredirect' } +sub OWN () { 'own' } +sub PADX () { 'padx' } +sub PADY () { 'pady' } +sub PAGECGET () { 'pagecget' } +sub PAGECONFIGURE () { 'pageconfigure' } +sub PAGES () { 'pages' } +sub PARENT () { 'parent' } +sub PASSIVE () { 'passive' } +sub POSITION () { 'position' } +sub POSITIONFROM () { 'positionfrom' } +sub POST () { 'post' } +sub POSTCASCADE () { 'postcascade' } +sub POSTSCRIPT () { 'postscript' } +sub PRESENT () { 'present' } +sub PREV () { 'prev' } +sub PREVIOUS () { 'previous' } +sub PREVRANGE () { 'prevrange' } +sub PROGRAM () { 'program' } +sub PROJECTING () { 'projecting' } +sub PROPAGATE () { 'propagate' } +sub PROTOCOL () { 'protocol' } +sub PUT () { 'put' } +sub RADIOBUTTON () { 'radiobutton' } +sub RAISE () { 'raise' } +sub RAISED () { 'raised' } +sub RANGE () { 'range' } +sub RANGES () { 'ranges' } +sub READ () { 'read' } +sub READFILE () { 'readfile' } +sub REAL () { 'real' } +sub RECORD () { 'record' } +sub REDITHER () { 'redither' } +sub REFCOUNT () { 'refcount' } +sub RELEASE () { 'release' } +sub REMOVE () { 'remove' } +sub RESIZABLE () { 'resizable' } +sub RIDGE () { 'ridge' } +sub RIGHT () { 'right' } +sub ROOT () { 'root' } +sub ROUND () { 'round' } +sub ROW () { 'row' } +sub ROWCONFIGURE () { 'rowconfigure' } +sub ROWS () { 'rows' } +sub SCALE () { 'scale' } +sub SCAN () { 'scan' } +sub SCROLL () { 'scroll' } +sub SEARCH () { 'search' } +sub SEE () { 'see' } +sub SELECT () { 'select' } +sub SELECTION () { 'selection' } +sub SEPARATOR () { 'separator' } +sub SET () { 'set' } +sub SHOW () { 'show' } +sub SIBLINGS () { 'siblings' } +sub SIZE () { 'size' } +sub SIZEFROM () { 'sizefrom' } +sub SLAVES () { 'slaves' } +sub SLIDER () { 'slider' } +sub SOLID () { 'solid' } +sub SPACE () { 'space' } +sub STATE () { 'state' } +sub STATUS () { 'status' } +sub SUNKEN () { 'sunken' } +sub TAG () { 'tag' } +sub TAIL () { 'tail' } +sub TEAROFF () { 'tearoff' } +sub TEXT () { 'text' } +sub TITLE () { 'title' } +sub TO () { 'to' } +sub TOGGLE () { 'toggle' } +sub TOP () { 'top' } +sub TRACING () { 'tracing' } +sub TRANSIENT () { 'transient' } +sub TRANSIENTFOR () { 'transientfor' } +sub TYPE () { 'type' } +sub TYPES () { 'types' } +sub UNITS () { 'units' } +sub UNPACK () { 'unpack' } +sub UNPOST () { 'unpost' } +sub UNSET () { 'unset' } +sub UP () { 'up' } +sub USER () { 'user' } +sub VARIABLE () { 'variable' } +sub VERTICAL () { 'vertical' } +sub VISIBILITY () { 'visibility' } +sub WIDTH () { 'width' } +sub WINDOW () { 'window' } +sub WITHDRAW () { 'withdraw' } +sub WITHTAG () { 'withtag' } +sub WORDEND () { 'wordend' } +sub WORDSTART () { 'wordstart' } +sub WRITE () { 'write' } +sub XVIEW () { 'xview' } +sub YPOSITION () { 'yposition' } +sub YVIEW () { 'yview' } + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Entry.pm b/Master/tlpkg/tlperl.old/lib/Tk/Entry.pm new file mode 100644 index 00000000000..51b3f0c6767 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Entry.pm @@ -0,0 +1,615 @@ +package Tk::Entry; + +# Converted from entry.tcl -- +# +# This file defines the default bindings for Tk entry widgets. +# +# @(#) entry.tcl 1.22 94/12/17 16:05:14 +# +# Copyright (c) 1992-1994 The Regents of the University of California. +# Copyright (c) 1994 Sun Microsystems, Inc. +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or + +use vars qw($VERSION); +use strict; +$VERSION = sprintf '4.%03d',q$Revision: #17 $ =~ /#(\d+)/; + +# modify it under the same terms as Perl itself, subject +# to additional disclaimer in license.terms due to partial +# derivation from Tk4.0 sources. + +use Tk::Widget (); +use Tk::Clipboard (); +use base qw(Tk::Clipboard Tk::Widget); + +import Tk qw(Ev $XS_VERSION); + +Construct Tk::Widget 'Entry'; + +bootstrap Tk::Entry; + +sub Tk_cmd { \&Tk::entry } + +Tk::Methods('bbox','delete','get','icursor','index','insert','scan', + 'selection','validate','xview'); + +use Tk::Submethods ( 'selection' => [qw(clear range adjust present to from)], + 'xview' => [qw(moveto scroll)], + ); + +sub wordstart +{my ($w,$pos) = @_; + my $string = $w->get; + $pos = $w->index('insert')-1 unless(defined $pos); + $string = substr($string,0,$pos); + $string =~ s/\S*$//; + length $string; +} + +sub wordend +{my ($w,$pos) = @_; + my $string = $w->get; + my $anc = length $string; + $pos = $w->index('insert') unless(defined $pos); + $string = substr($string,$pos); + $string =~ s/^(?:((?=\s)\s*|(?=\S)\S*))//x; + $anc - length($string); +} + +sub deltainsert +{ + my ($w,$d) = @_; + return $w->index('insert')+$d; +} + +# +# Bind -- +# This procedure is invoked the first time the mouse enters an +# entry widget or an entry widget receives the input focus. It creates +# all of the class bindings for entries. +# +# Arguments: +# event - Indicates which event caused the procedure to be invoked +# (Enter or FocusIn). It is used so that we can carry out +# the functions of that event in addition to setting up +# bindings. +sub ClassInit +{ + my ($class,$mw) = @_; + + $class->SUPER::ClassInit($mw); + + # <<Cut>>, <<Copy>> and <<Paste>> defined in Tk::Clipboard + $mw->bind($class,'<<Clear>>' => sub { + my $w = shift; + $w->delete("sel.first", "sel.last"); + }); + $mw->bind($class,'<<PasteSelection>>' => [sub { + my($w, $x) = @_; + # XXX logic in Tcl/Tk version screwed up? + if (!$Tk::strictMotif && !$Tk::mouseMoved) { + $w->Paste($x); + } + }, Ev('x')]); + + # Standard Motif bindings: + # The <Escape> binding is different from the Tcl/Tk version: + $mw->bind($class,'<Escape>','selectionClear'); + + $mw->bind($class,'<1>',['Button1',Ev('x'),Ev('y')]); + $mw->bind($class,'<ButtonRelease-1>',['Button1Release',Ev('x'),Ev('y')]); + $mw->bind($class,'<B1-Motion>',['Motion',Ev('x'),Ev('y')]); + + $mw->bind($class,'<Double-1>',['MouseSelect',Ev('x'),'word','sel.first']); + $mw->bind($class,'<Double-Shift-1>',['MouseSelect',Ev('x'),'word']); + $mw->bind($class,'<Triple-1>',['MouseSelect',Ev('x'),'line',0]); + $mw->bind($class,'<Triple-Shift-1>',['MouseSelect',Ev('x'),'line']); + + $mw->bind($class,'<Shift-1>','Shift_1'); + + + $mw->bind($class,'<B1-Leave>',['AutoScan',Ev('x')]); + $mw->bind($class,'<B1-Enter>','CancelRepeat'); + $mw->bind($class,'<Control-1>','Control_1'); + $mw->bind($class,'<Left>', ['SetCursor',Ev('deltainsert',-1)]); + $mw->bind($class,'<Right>',['SetCursor',Ev('deltainsert',1)]); + $mw->bind($class,'<Shift-Left>',['KeySelect',Ev('deltainsert',-1)]); + $mw->bind($class,'<Shift-Right>',['KeySelect',Ev('deltainsert',1)]); + $mw->bind($class,'<Control-Left>',['SetCursor',Ev(['wordstart'])]); + $mw->bind($class,'<Control-Right>',['SetCursor',Ev(['wordend'])]); + $mw->bind($class,'<Shift-Control-Left>',['KeySelect',Ev(['wordstart'])]); + $mw->bind($class,'<Shift-Control-Right>',['KeySelect',Ev(['wordend'])]); + $mw->bind($class,'<Home>',['SetCursor',0]); + $mw->bind($class,'<Shift-Home>',['KeySelect',0]); + $mw->bind($class,'<End>',['SetCursor','end']); + $mw->bind($class,'<Shift-End>',['KeySelect','end']); + $mw->bind($class,'<Delete>','Delete'); + + $mw->bind($class,'<BackSpace>','Backspace'); + + $mw->bind($class,'<Control-space>',['selectionFrom','insert']); + $mw->bind($class,'<Select>',['selectionFrom','insert']); + $mw->bind($class,'<Control-Shift-space>',['selectionAdjust','insert']); + $mw->bind($class,'<Shift-Select>',['selectionAdjust','insert']); + + $mw->bind($class,'<Control-slash>',['selectionRange',0,'end']); + $mw->bind($class,'<Control-backslash>','selectionClear'); + + # $class->clipboardOperations($mw,qw[Copy Cut Paste]); + + $mw->bind($class,'<KeyPress>', ['Insert',Ev('A')]); + + # Ignore all Alt, Meta, and Control keypresses unless explicitly bound. + # Otherwise, if a widget binding for one of these is defined, the + # <KeyPress> class binding will also fire and insert the character, + # which is wrong. Ditto for Return, and Tab. + + $mw->bind($class,'<Alt-KeyPress>' ,'NoOp'); + $mw->bind($class,'<Meta-KeyPress>' ,'NoOp'); + $mw->bind($class,'<Control-KeyPress>' ,'NoOp'); + $mw->bind($class,'<Return>' ,'NoOp'); + $mw->bind($class,'<KP_Enter>' ,'NoOp'); + $mw->bind($class,'<Tab>' ,'NoOp'); + if ($mw->windowingsystem =~ /^(?:classic|aqua)$/) + { + $mw->bind($class,'<Command-KeyPress>', 'NoOp'); + } + + # On Windows, paste is done using Shift-Insert. Shift-Insert already + # generates the <<Paste>> event, so we don't need to do anything here. + if ($Tk::platform ne 'MSWin32') + { + $mw->bind($class,'<Insert>','InsertSelection'); + } + + if (!$Tk::strictMotif) + { + # Additional emacs-like bindings: + $mw->bind($class,'<Control-a>',['SetCursor',0]); + $mw->bind($class,'<Control-b>',['SetCursor',Ev('deltainsert',-1)]); + $mw->bind($class,'<Control-d>',['delete','insert']); + $mw->bind($class,'<Control-e>',['SetCursor','end']); + $mw->bind($class,'<Control-f>',['SetCursor',Ev('deltainsert',1)]); + $mw->bind($class,'<Control-h>','Backspace'); + $mw->bind($class,'<Control-k>',['delete','insert','end']); + + $mw->bind($class,'<Control-t>','Transpose'); + + # XXX The original Tcl/Tk bindings use NextWord/PreviousWord instead + $mw->bind($class,'<Meta-b>',['SetCursor',Ev(['wordstart'])]); + $mw->bind($class,'<Meta-d>',['delete','insert',Ev(['wordend'])]); + $mw->bind($class,'<Meta-f>',['SetCursor',Ev(['wordend'])]); + $mw->bind($class,'<Meta-BackSpace>',['delete',Ev(['wordstart']),'insert']); + $mw->bind($class,'<Meta-Delete>',['delete',Ev(['wordstart']),'insert']); + + # A few additional bindings from John Ousterhout. +# XXX conflicts with <<Copy>>: $mw->bind($class,'<Control-w>',['delete',Ev(['wordstart']),'insert']); + $mw->bind($class,'<2>','Button_2'); + $mw->bind($class,'<B2-Motion>','B2_Motion'); +# XXX superseded by <<PasteSelection>>: $mw->bind($class,'<ButtonRelease-2>','ButtonRelease_2'); + } + return $class; +} + + +sub Shift_1 +{ + my $w = shift; + my $Ev = $w->XEvent; + $Tk::selectMode = 'char'; + $w->selectionAdjust('@' . $Ev->x) +} + + +sub Control_1 +{ + my $w = shift; + my $Ev = $w->XEvent; + $w->icursor('@' . $Ev->x) +} + + +sub Delete +{ + my $w = shift; + if ($w->selectionPresent) + { + $w->deleteSelected + } + else + { + $w->delete('insert') + } +} + + +sub InsertSelection +{ + my $w = shift; + eval {local $SIG{__DIE__}; $w->Insert($w->GetSelection)} +} + + +# Original is ::tk::EntryScanMark +sub Button_2 +{ + my $w = shift; + my $Ev = $w->XEvent; + $w->scan('mark',$Ev->x); + $Tk::x = $Ev->x; + $Tk::y = $Ev->y; + $Tk::mouseMoved = 0 +} + + +# Original is ::tk::EntryScanDrag +sub B2_Motion +{ + my $w = shift; + my $Ev = $w->XEvent; + # Make sure these exist, as some weird situations can trigger the + # motion binding without the initial press. [Tcl/Tk Bug #220269] + if (!defined $Tk::x) { $Tk::x = $Ev->x } + if (abs(($Ev->x-$Tk::x)) > 2) + { + $Tk::mouseMoved = 1 + } + $w->scan('dragto',$Ev->x) +} + + +# XXX Not needed anymore +sub ButtonRelease_2 +{ + my $w = shift; + my $Ev = $w->XEvent; + if (!$Tk::mouseMoved) + { + eval + {local $SIG{__DIE__}; + $w->insert('insert',$w->SelectionGet); + $w->SeeInsert; + } + } +} + +sub Button1Release +{ + shift->CancelRepeat; +} + +# ::tk::EntryClosestGap -- +# Given x and y coordinates, this procedure finds the closest boundary +# between characters to the given coordinates and returns the index +# of the character just after the boundary. +# +# Arguments: +# w - The entry window. +# x - X-coordinate within the window. +sub ClosestGap +{ + my($w, $x) = @_; + my $pos = $w->index('@'.$x); + my @bbox = $w->bbox($pos); + if ($x - $bbox[0] < $bbox[2] / 2) + { + return $pos; + } + $pos + 1; +} + +# Button1 -- +# This procedure is invoked to handle button-1 presses in entry +# widgets. It moves the insertion cursor, sets the selection anchor, +# and claims the input focus. +# +# Arguments: +# w - The entry window in which the button was pressed. +# x - The x-coordinate of the button press. +sub Button1 +{ + my $w = shift; + my $x = shift; + $Tk::selectMode = 'char'; + $Tk::mouseMoved = 0; + $Tk::pressX = $x; + $w->icursor($w->ClosestGap($x)); + $w->selectionFrom('insert'); + $w->selectionClear; + if ($w->cget('-state') ne 'disabled') + { + $w->focus() + } +} + +sub Motion +{ + my ($w,$x,$y) = @_; + $Tk::x = $x; # XXX ? + $w->MouseSelect($x); +} + +# MouseSelect -- +# This procedure is invoked when dragging out a selection with +# the mouse. Depending on the selection mode (character, word, +# line) it selects in different-sized units. This procedure +# ignores mouse motions initially until the mouse has moved from +# one character to another or until there have been multiple clicks. +# +# Arguments: +# w - The entry window in which the button was pressed. +# x - The x-coordinate of the mouse. +sub MouseSelect +{ + + my $w = shift; + my $x = shift; + return if UNIVERSAL::isa($w, 'Tk::Spinbox') and $w->{_element} ne 'entry'; + $Tk::selectMode = shift if (@_); + my $cur = $w->index($w->ClosestGap($x)); + return unless defined $cur; + my $anchor = $w->index('anchor'); + return unless defined $anchor; + $Tk::pressX ||= $x; # XXX Better use "if !defined $Tk::pressX"? + if (($cur != $anchor) || (abs($Tk::pressX - $x) >= 3)) + { + $Tk::mouseMoved = 1 + } + my $mode = $Tk::selectMode; + return unless $mode; + if ($mode eq 'char') + { + # The Tcl version uses selectionRange here XXX + if ($Tk::mouseMoved) + { + if ($cur < $anchor) + { + $w->selectionTo($cur) + } + else + { + $w->selectionTo($cur+1) + } + } + } + elsif ($mode eq 'word') + { + # The Tcl version uses tcl_wordBreakBefore/After here XXX + if ($cur < $w->index('anchor')) + { + $w->selectionRange($w->wordstart($cur),$w->wordend($anchor-1)) + } + else + { + $w->selectionRange($w->wordstart($anchor),$w->wordend($cur)) + } + } + elsif ($mode eq 'line') + { + $w->selectionRange(0,'end') + } + if (@_) + { + my $ipos = shift; + eval {local $SIG{__DIE__}; $w->icursor($ipos) }; + } + $w->idletasks; +} +# ::tk::EntryPaste -- +# This procedure sets the insertion cursor to the current mouse position, +# pastes the selection there, and sets the focus to the window. +# +# Arguments: +# w - The entry window. +# x - X position of the mouse. +sub Paste +{ + my($w, $x) = @_; + $w->icursor($w->ClosestGap($x)); + eval { local $SIG{__DIE__}; + $w->insert("insert", $w->GetSelection); + $w->SeeInsert; # Perl/Tk extension + }; + if ($w->cget(-state) ne 'disabled') + { + $w->focus; + } +} +# AutoScan -- +# This procedure is invoked when the mouse leaves an entry window +# with button 1 down. It scrolls the window left or right, +# depending on where the mouse is, and reschedules itself as an +# 'after' command so that the window continues to scroll until the +# mouse moves back into the window or the mouse button is released. +# +# Arguments: +# w - The entry window. +# x - The x-coordinate of the mouse when it left the window. +sub AutoScan +{ + my $w = shift; + my $x = shift; + return if !Tk::Exists($w); + if ($x >= $w->width) + { + $w->xview('scroll',2,'units') + } + elsif ($x < 0) + { + $w->xview('scroll',-2,'units') + } + else + { + return; + } + $w->MouseSelect($x); + $w->RepeatId($w->after(50,['AutoScan',$w,$x])) +} +# KeySelect +# This procedure is invoked when stroking out selections using the +# keyboard. It moves the cursor to a new position, then extends +# the selection to that position. +# +# Arguments: +# w - The entry window. +# new - A new position for the insertion cursor (the cursor hasn't +# actually been moved to this position yet). +sub KeySelect +{ + my $w = shift; + my $new = shift; + if (!$w->selectionPresent) + { + $w->selectionFrom('insert'); + $w->selectionTo($new) + } + else + { + $w->selectionAdjust($new) + } + $w->icursor($new); + $w->SeeInsert; +} +# Insert -- +# Insert a string into an entry at the point of the insertion cursor. +# If there is a selection in the entry, and it covers the point of the +# insertion cursor, then delete the selection before inserting. +# +# Arguments: +# w - The entry window in which to insert the string +# s - The string to insert (usually just a single character) +sub Insert +{ + my $w = shift; + my $s = shift; + return unless (defined $s && $s ne ''); + eval + {local $SIG{__DIE__}; + my $insert = $w->index('insert'); + if ($w->index('sel.first') <= $insert && $w->index('sel.last') >= $insert) + { + $w->deleteSelected + } + }; + $w->insert('insert',$s); + $w->SeeInsert +} +# Backspace -- +# Backspace over the character just before the insertion cursor. +# +# Arguments: +# w - The entry window in which to backspace. +sub Backspace +{ + my $w = shift; + if ($w->selectionPresent) + { + $w->deleteSelected + } + else + { + my $x = $w->index('insert')-1; + $w->delete($x) if ($x >= 0); + # XXX Missing repositioning part from Tcl/Tk source + } +} +# SeeInsert +# Make sure that the insertion cursor is visible in the entry window. +# If not, adjust the view so that it is. +# +# Arguments: +# w - The entry window. +sub SeeInsert +{ + my $w = shift; + my $c = $w->index('insert'); +# +# Probably a bug in your version of tcl/tk (I've not this problem +# when I test Entry in the widget demo for tcl/tk) +# index('\@0') give always 0. Consequence : +# if you make <Control-E> or <Control-F> view is adapted +# but with <Control-A> or <Control-B> view is not adapted +# + my $left = $w->index('@0'); + if ($left > $c) + { + $w->xview($c); + return; + } + my $x = $w->width; + while ($w->index('@' . $x) <= $c && $left < $c) + { + $left += 1; + $w->xview($left) + } +} +# SetCursor +# Move the insertion cursor to a given position in an entry. Also +# clears the selection, if there is one in the entry, and makes sure +# that the insertion cursor is visible. +# +# Arguments: +# w - The entry window. +# pos - The desired new position for the cursor in the window. +sub SetCursor +{ + my $w = shift; + my $pos = shift; + $w->icursor($pos); + $w->selectionClear; + $w->SeeInsert; +} +# Transpose +# This procedure implements the 'transpose' function for entry widgets. +# It tranposes the characters on either side of the insertion cursor, +# unless the cursor is at the end of the line. In this case it +# transposes the two characters to the left of the cursor. In either +# case, the cursor ends up to the right of the transposed characters. +# +# Arguments: +# w - The entry window. +sub Transpose +{ + my $w = shift; + my $i = $w->index('insert'); + $i++ if ($i < $w->index('end')); + my $first = $i-2; + return if ($first < 0); + my $str = $w->get; + my $new = substr($str,$i-1,1) . substr($str,$first,1); + $w->delete($first,$i); + $w->insert('insert',$new); + $w->SeeInsert; +} + +sub tabFocus +{ + my $w = shift; + $w->selectionRange(0,'end'); + $w->icursor('end'); + $w->SUPER::tabFocus; +} + +# ::tk::EntryGetSelection -- +# +# Returns the selected text of the entry with respect to the -show option. +# +# Arguments: +# w - The entry window from which the text to get +sub getSelected +{ + my $w = shift; + return undef unless $w->selectionPresent; + my $str = $w->get; + my $show = $w->cget('-show'); + $str = $show x length($str) if (defined $show); + my $s = $w->index('sel.first'); + my $e = $w->index('sel.last'); + return substr($str,$s,$e-$s); +} + + +1; + +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/ErrorDialog.pm b/Master/tlpkg/tlperl.old/lib/Tk/ErrorDialog.pm new file mode 100644 index 00000000000..19377eaeca4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/ErrorDialog.pm @@ -0,0 +1,125 @@ +package Tk::ErrorDialog; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #7 $ =~ /\D(\d+)\s*$/; + +use Tk (); +require Tk::Dialog; +use base qw(Tk::Toplevel); + + +# ErrorDialog - a translation of bgerror() from Tcl/Tk to Perl/Tk. +# +# Currently TkPerl background errors are sent to stdout/stderr; use this +# module if you want them in a window. You can also "roll your own" by +# supplying the routine Tk::Error. + +use strict; + +Construct Tk::Widget 'ErrorDialog'; + +my %options = ( -buttons => ['OK', 'Skip Messages', 'Stack trace'], + -bitmap => 'error' + ); +my $ED_OBJECT; + +sub import +{ + my $class = shift; + while (@_) + { + my $key = shift; + my $val = shift; + $options{$key} = $val; + } +} + +sub Populate { + + # ErrorDialog constructor. Uses `new' method from base class + # to create object container then creates the dialog toplevel and the + # traceback toplevel. + + my($cw, $args) = @_; + + my $dr = $cw->Dialog( + -title => 'Error in '.$cw->MainWindow->name, + -text => 'on-the-fly-text', + -bitmap => $options{'-bitmap'}, + -buttons => $options{'-buttons'}, + ); + $cw->minsize(1, 1); + $cw->title('Stack Trace for Error'); + $cw->iconname('Stack Trace'); + my $t_ok = $cw->Button( + -text => 'OK', + -command => [ + sub { + shift->withdraw; + }, $cw, + ] + ); + my $t_text = $cw->Text( + -relief => 'sunken', + -bd => 2, + -setgrid => 'true', + -width => 60, + -height => 20, + ); + my $t_scroll = $cw->Scrollbar( + -relief => 'sunken', + -command => ['yview', $t_text], + ); + $t_text->configure(-yscrollcommand => ['set', $t_scroll]); + $t_ok->pack(-side => 'bottom', -padx => '3m', -pady => '2m'); + $t_scroll->pack(-side => 'right', -fill => 'y'); + $t_text->pack(-side => 'left', -expand => 'yes', -fill => 'both'); + $cw->withdraw; + + $cw->Advertise(error_dialog => $dr); # advertise dialog widget + $cw->Advertise(text => $t_text); # advertise text widget + $cw->ConfigSpecs(-cleanupcode => [PASSIVE => undef, undef, undef], + -appendtraceback => [ PASSIVE => undef, undef, 1 ]); + $ED_OBJECT = $cw; + $cw->protocol('WM_DELETE_WINDOW' => sub {$cw->withdraw}); + return $cw; + +} # end Populate + +sub Tk::Error { + + # Post a dialog box with the error message and give the user a chance + # to see a more detailed stack trace. + + my($w, $error, @msgs) = @_; + + my $grab = $w->grab('current'); + $grab->Unbusy if (defined $grab); + + $w->ErrorDialog if not defined $ED_OBJECT; + + my($d, $t) = ($ED_OBJECT->Subwidget('error_dialog'), $ED_OBJECT->Subwidget('text')); +# chop $error; + $d->configure(-text => "Error: $error"); + $d->bell; + my $ans = $d->Show; + + $t->delete('0.0', 'end') if not $ED_OBJECT->{'-appendtraceback'}; + $t->insert('end', "\n"); + $t->mark('set', 'ltb', 'end'); + $t->insert('end', "--- Begin Traceback ---\n$error\n"); + my $msg; + for $msg (@msgs) { + $t->insert('end', "$msg\n"); + } + $t->yview('ltb'); + + $ED_OBJECT->deiconify if ($ans =~ /trace/i); + + my $c = $ED_OBJECT->{Configure}{'-cleanupcode'}; + &$c if defined $c; # execute any cleanup code if it was defined + $w->break if ($ans =~ /skip/i); + +} # end Tk::Error + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Event.pm b/Master/tlpkg/tlperl.old/lib/Tk/Event.pm new file mode 100644 index 00000000000..cecd57c54ae --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Event.pm @@ -0,0 +1,13 @@ +package Tk::Event; +use vars qw($VERSION $XS_VERSION @EXPORT_OK); +END { CleanupGlue() } +$VERSION = sprintf '4.%03d', q$Revision: #15 $ =~ /\D(\d+)\s*$/; +$XS_VERSION = '804.027'; +use base qw(Exporter); +use XSLoader; +@EXPORT_OK = qw($XS_VERSION DONT_WAIT WINDOW_EVENTS FILE_EVENTS + TIMER_EVENTS IDLE_EVENTS ALL_EVENTS); +XSLoader::load 'Tk::Event',$XS_VERSION; +require Tk::Event::IO; +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Event/IO.pm b/Master/tlpkg/tlperl.old/lib/Tk/Event/IO.pm new file mode 100644 index 00000000000..10b47e246ff --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Event/IO.pm @@ -0,0 +1,132 @@ +package Tk::Event::IO; +use strict; +use Carp; + +use vars qw($VERSION @EXPORT_OK); +$VERSION = sprintf '4.%03d', q$Revision: #8 $ =~ /\D(\d+)\s*$/; + +use base qw(Exporter); +use Symbol (); + +@EXPORT_OK = qw(READABLE WRITABLE); + +sub PrintArgs +{ + my $func = (caller(1))[3]; + print "$func(",join(',',@_),")\n"; +} + +sub PRINT +{ + my $obj = shift; + $obj->wait(WRITABLE); + my $h = $obj->handle; + return print $h @_; +} + +sub PRINTF +{ + my $obj = shift; + $obj->wait(WRITABLE); + my $h = $obj->handle; + return printf $h @_; +} + +sub WRITE +{ + my $obj = $_[0]; + $obj->wait(WRITABLE); + return syswrite($obj->handle,$_[1],$_[2]); +} + +my $depth = 0; +sub READLINE +{ + my $obj = shift; + $obj->wait(READABLE); + my $h = $obj->handle; + my $w = <$h>; + return $w; +} + +sub READ +{ + my $obj = $_[0]; + $obj->wait(READABLE); + my $h = $obj->handle; + return sysread($h,$_[1],$_[2],defined $_[3] ? $_[3] : 0); +} + +sub GETC +{ + my $obj = $_[0]; + $obj->wait(READABLE); + my $h = $obj->handle; + return getc($h); +} + +sub CLOSE +{ + my $obj = shift; + $obj->unwatch; + my $h = $obj->handle; + return close($h); +} + +sub EOF +{ + my $obj = shift; + my $h = $obj->handle; + return eof($h); +} + +sub FILENO +{ + my $obj = shift; + my $h = $obj->handle; + return fileno($h); +} + +sub imode +{ + my $mode = shift; + my $imode = ${{'readable' => READABLE(), + 'writable' => WRITABLE()}}{$mode}; + croak("Invalid handler type '$mode'") unless (defined $imode); + return $imode; +} + +sub fileevent +{ + my ($widget,$file,$mode,$cb) = @_; + my $imode = imode($mode); + unless (ref $file) + { + no strict 'refs'; + $file = Symbol::qualify($file,(caller)[0]); + $file = \*{$file}; + } + my $obj = tied(*$file); + unless ($obj && $obj->isa('Tk::Event::IO')) + { + $obj = tie *$file,'Tk::Event::IO', $file; + } + if (@_ == 3) + { + # query return the handler + return $obj->handler($imode); + } + else + { + # set the handler + my $h = $obj->handler($imode,$cb); + undef $obj; # Prevent warnings about untie with ref to object + unless ($h) + { + untie *$file; + } + } +} + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/FBox.pm b/Master/tlpkg/tlperl.old/lib/Tk/FBox.pm new file mode 100644 index 00000000000..fed7501aea4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/FBox.pm @@ -0,0 +1,1043 @@ +# -*- perl -*- +# +# tkfbox.tcl -- +# +# Implements the "TK" standard file selection dialog box. This +# dialog box is used on the Unix platforms whenever the tk_strictMotif +# flag is not set. +# +# The "TK" standard file selection dialog box is similar to the +# file selection dialog box on Win95(TM). The user can navigate +# the directories by clicking on the folder icons or by +# selecting the "Directory" option menu. The user can select +# files by clicking on the file icons or by entering a filename +# in the "Filename:" entry. +# +# Copyright (c) 1994-1996 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +# Translated to perl/Tk by Slaven Rezic <slaven@rezic.de>. +# + +#---------------------------------------------------------------------- +# +# F I L E D I A L O G +# +#---------------------------------------------------------------------- +# tkFDialog -- +# +# Implements the TK file selection dialog. This dialog is used when +# the tk_strictMotif flag is set to false. This procedure shouldn't +# be called directly. Call tk_getOpenFile or tk_getSaveFile instead. +# + +package Tk::FBox; +require Tk::Toplevel; + +use strict; +use vars qw($VERSION $updirImage $folderImage $fileImage); + +$VERSION = sprintf '4.%03d', q$Revision: #18 $ =~ /\D(\d+)\s*$/; + +use base qw(Tk::Toplevel); + +Construct Tk::Widget 'FBox'; + +sub import { + if (defined $_[1] and $_[1] eq 'as_default') { + local $^W = 0; + package Tk; + if ($Tk::VERSION < 804) { + *FDialog = \&Tk::FBox::FDialog; + *MotifFDialog = \&Tk::FBox::FDialog; + } else { + *tk_getOpenFile = sub { + Tk::FBox::FDialog("tk_getOpenFile", @_); + }; + *tk_getSaveFile = sub { + Tk::FBox::FDialog("tk_getSaveFile", @_); + }; + } + } +} + +# Note that -sortcmd is experimental and the interface is likely to change. +# Using -sortcmd is really strange :-( +# $top->getOpenFile(-sortcmd => sub { package Tk::FBox; uc $b cmp uc $a}); +# or, un-perlish, but useable (now activated in code): +# $top->getOpenFile(-sortcmd => sub { uc $_[1] cmp uc $_[0]}); + +sub Populate { + my($w, $args) = @_; + + require Tk::IconList; + require File::Basename; + require Cwd; + + $w->SUPER::Populate($args); + + # f1: the frame with the directory option menu + my $f1 = $w->Frame; + my $lab = $f1->Label(-text => 'Directory:', -underline => 0); + $w->{'dirMenu'} = my $dirMenu = + $f1->Optionmenu(-variable => \$w->{'selectPath'}, + -textvariable => \$w->{'selectPath'}, + -command => ['SetPath', $w]); + my $upBtn = $f1->Button; + if (!defined $updirImage->{$w->MainWindow}) { + $updirImage->{$w->MainWindow} = $w->Bitmap(-data => <<EOF); +#define updir_width 28 +#define updir_height 16 +static char updir_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, + 0x20, 0x40, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x01, 0x10, 0x00, 0x00, 0x01, + 0x10, 0x02, 0x00, 0x01, 0x10, 0x07, 0x00, 0x01, 0x90, 0x0f, 0x00, 0x01, + 0x10, 0x02, 0x00, 0x01, 0x10, 0x02, 0x00, 0x01, 0x10, 0x02, 0x00, 0x01, + 0x10, 0xfe, 0x07, 0x01, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, + 0xf0, 0xff, 0xff, 0x01}; +EOF + } + $upBtn->configure(-image => $updirImage->{$w->MainWindow}); + $dirMenu->configure(-takefocus => 1, -highlightthickness => 2); + $upBtn->pack(-side => 'right', -padx => 4, -fill => 'both'); + $lab->pack(-side => 'left', -padx => 4, -fill => 'both'); + $dirMenu->pack(-expand => 'yes', -fill => 'both', -padx => 4); + + $w->{'icons'} = my $icons = + $w->IconList(-command => ['OkCmd', $w, 'iconlist'], + ); + $icons->bind('<<ListboxSelect>>' => [$w, 'ListBrowse']); + + # f2: the frame with the OK button and the "file name" field + my $f2 = $w->Frame(-bd => 0); +#XXX File name => File names if multiple + my $f2_lab = $f2->Label(-text => 'File name:', -anchor => 'e', + -width => 14, -underline => 5, -pady => 0); + $w->{'ent'} = my $ent = $f2->Entry; + + # The font to use for the icons. The default Canvas font on Unix + # is just deviant. +# $w->{'icons'}{'font'} = $ent->cget(-font); + $w->{'icons'}->configure(-font => $ent->cget(-font)); + + # f3: the frame with the cancel button and the file types field + my $f3 = $w->Frame(-bd => 0); + + # The "File of types:" label needs to be grayed-out when + # -filetypes are not specified. The label widget does not support + # grayed-out text on monochrome displays. Therefore, we have to + # use a button widget to emulate a label widget (by setting its + # bindtags) + $w->{'typeMenuLab'} = my $typeMenuLab = $f3->Button + (-text => 'Files of type:', + -anchor => 'e', + -width => 14, + -underline => 9, + -bd => $f2_lab->cget(-bd), + -highlightthickness => $f2_lab->cget(-highlightthickness), + -relief => $f2_lab->cget(-relief), + -padx => $f2_lab->cget(-padx), + -pady => $f2_lab->cget(-pady), + -takefocus => 0, + ); + $typeMenuLab->bindtags([$typeMenuLab, 'Label', + $typeMenuLab->toplevel, 'all']); + $w->{'typeMenuBtn'} = my $typeMenuBtn = + $f3->Menubutton(-indicatoron => 1, -tearoff => 0); + $typeMenuBtn->configure(-takefocus => 1, + -highlightthickness => 2, + -relief => 'raised', + -bd => 2, + -anchor => 'w', + ); + + # the okBtn is created after the typeMenu so that the keyboard traversal + # is in the right order + $w->{'okBtn'} = my $okBtn = $f2->Button + (-text => 'OK', + -underline => 0, + -width => 6, + -default => 'active', + -pady => 3, + ); + my $cancelBtn = $f3->Button + (-text => 'Cancel', + -underline => 0, + -width => 6, + -default => 'normal', + -pady => 3, + ); + + # pack the widgets in f2 and f3 + $okBtn->pack(-side => 'right', -padx => 4, -anchor => 'e'); + $f2_lab->pack(-side => 'left', -padx => 4); + $ent->pack(-expand => 'yes', -fill => 'x', -padx => 2, -pady => 0); + $cancelBtn->pack(-side => 'right', -padx => 4, -anchor => 'w'); + $typeMenuLab->pack(-side => 'left', -padx => 4); + $typeMenuBtn->pack(-expand => 'yes', -fill => 'x', -side => 'right'); + + # Pack all the frames together. We are done with widget construction. + $f1->pack(-side => 'top', -fill => 'x', -pady => 4); + $f3->pack(-side => 'bottom', -fill => 'x'); + $f2->pack(-side => 'bottom', -fill => 'x'); + $icons->pack(-expand => 'yes', -fill => 'both', -padx => 4, -pady => 1); + + # Set up the event handlers + $ent->bind('<Return>',[$w,'ActivateEnt']); + $upBtn->configure(-command => ['UpDirCmd', $w]); + $okBtn->configure(-command => ['OkCmd', $w]); + $cancelBtn->configure(-command, ['CancelCmd', $w]); + + $w->bind('<Alt-d>',[$dirMenu,'focus']); + $w->bind('<Alt-t>',sub { + if ($typeMenuBtn->cget(-state) eq 'normal') { + $typeMenuBtn->focus; + } }); + $w->bind('<Alt-n>',[$ent,'focus']); + $w->bind('<KeyPress-Escape>',[$cancelBtn,'invoke']); + $w->bind('<Alt-c>',[$cancelBtn,'invoke']); + $w->bind('<Alt-o>',['InvokeBtn','Open']); + $w->bind('<Alt-s>',['InvokeBtn','Save']); + $w->protocol('WM_DELETE_WINDOW', ['CancelCmd', $w]); + $w->OnDestroy(['CancelCmd', $w]); + + # Build the focus group for all the entries + $w->FG_Create; + $w->FG_BindIn($ent, ['EntFocusIn', $w]); + $w->FG_BindOut($ent, ['EntFocusOut', $w]); + + $w->SetPath(_cwd()); + + $w->ConfigSpecs(-defaultextension => ['PASSIVE', undef, undef, undef], + -filetypes => ['PASSIVE', undef, undef, undef], + -initialdir => ['PASSIVE', undef, undef, undef], + -initialfile => ['PASSIVE', undef, undef, undef], +# -sortcmd => ['PASSIVE', undef, undef, sub { lc($a) cmp lc($b) }], + -sortcmd => ['PASSIVE', undef, undef, sub { lc($_[0]) cmp lc($_[1]) }], + -title => ['PASSIVE', undef, undef, undef], + -type => ['PASSIVE', undef, undef, 'open'], + -filter => ['PASSIVE', undef, undef, '*'], + -force => ['PASSIVE', undef, undef, 0], + -multiple => ['PASSIVE', undef, undef, 0], + 'DEFAULT' => [$icons], + ); + # So-far-failed attempt to break reference loops ... + $w->_OnDestroy(qw(dirMenu icons typeMenuLab typeMenuBtn okBtn ent updateId)); + $w; +} + +# -initialdir fix with ResolveFile +sub Show { + my $w = shift; + + $w->configure(@_); + + # Dialog boxes should be transient with respect to their parent, + # so that they will always stay on top of their parent window. However, + # some window managers will create the window as withdrawn if the parent + # window is withdrawn or iconified. Combined with the grab we put on the + # window, this can hang the entire application. Therefore we only make + # the dialog transient if the parent is viewable. + + if (Tk::Exists($w->Parent) && $w->Parent->viewable) { + $w->transient($w->Parent); + } + + # set the default directory and selection according to the -initial + # settings + { + my $initialdir = $w->cget(-initialdir); + if (defined $initialdir) { + my ($flag, $path, $file) = ResolveFile($initialdir, 'junk'); + if ($flag eq 'OK' or $flag eq 'FILE') { + $w->{'selectPath'} = $path; + } else { + $w->Error("\"$initialdir\" is not a valid directory"); + } + } + $w->{'selectFile'} = $w->cget(-initialfile); + } + + # Set -multiple to a one or zero value (not other boolean types + # like "yes") so we can use it in tests more easily. + if ($w->cget('-type') ne 'open') { + $w->configure(-multiple => 0); + } else { + $w->configure(-multiple => !!$w->cget('-multiple')); + } + $w->{'icons'}->configure(-multiple => $w->cget('-multiple')); + + # Initialize the file types menu + my $typeMenuBtn = $w->{'typeMenuBtn'}; + my $typeMenuLab = $w->{'typeMenuLab'}; + if (defined $w->cget('-filetypes')) { + my(@filetypes) = GetFileTypes($w->cget('-filetypes')); + my $typeMenu = $typeMenuBtn->cget(-menu); + $typeMenu->delete(0, 'end'); + foreach my $ft (@filetypes) { + my $title = $ft->[0]; + my $filter = join(' ', @{ $ft->[1] }); + $typeMenuBtn->command + (-label => $title, + -command => ['SetFilter', $w, $title, $filter], + ); + } + $w->SetFilter($filetypes[0]->[0], join(' ', @{ $filetypes[0]->[1] })); + $typeMenuBtn->configure(-state => 'normal'); + $typeMenuLab->configure(-state => 'normal'); + } else { +#XXX $w->configure(-filter => '*'); + $typeMenuBtn->configure(-state => 'disabled', + -takefocus => 0); + $typeMenuLab->configure(-state => 'disabled'); + } + $w->UpdateWhenIdle; + + { + my $title = $w->cget(-title); + if (!defined $title) { + my $type = $w->cget(-type); + $title = ($type eq 'dir') ? 'Choose Directory' + : ($type eq 'save') ? 'Save As' : 'Open'; + } + $w->title($title); + } + + # Withdraw the window, then update all the geometry information + # so we know how big it wants to be, then center the window in the + # display and de-iconify it. + $w->withdraw; + $w->idletasks; + if (0) + { + #XXX use Tk::Wm::Popup? or Tk::PlaceWindow? + my $x = int($w->screenwidth / 2 - $w->reqwidth / 2 - $w->parent->vrootx); + my $y = int($w->screenheight / 2 - $w->reqheight / 2 - $w->parent->vrooty); + $w->geometry("+$x+$y"); + $w->deiconify; + } + else + { + $w->Popup; + } + + # Set a grab and claim the focus too. +#XXX use Tk::setFocusGrab when it's available + my $oldFocus = $w->focusCurrent; + my $oldGrab = $w->grabCurrent; + my $grabStatus = $oldGrab->grabStatus if ($oldGrab); + $w->grab; + my $ent = $w->{'ent'}; + $ent->focus; + $ent->delete(0, 'end'); + if (defined $w->{'selectFile'} && $w->{'selectFile'} ne '') { + $ent->insert(0, $w->{'selectFile'}); + $ent->selectionRange(0,'end'); + $ent->icursor('end'); + } + + # 8. Wait for the user to respond, then restore the focus and + # return the index of the selected button. Restore the focus + # before deleting the window, since otherwise the window manager + # may take the focus away so we can't redirect it. Finally, + # restore any grab that was in effect. + $w->waitVariable(\$w->{'selectFilePath'}); + eval { + $oldFocus->focus if $oldFocus; + }; + if (Tk::Exists($w)) { # widget still exists + $w->grabRelease; + $w->withdraw; + } + if (Tk::Exists($oldGrab) && $oldGrab->viewable) { + if ($grabStatus eq 'global') { + $oldGrab->grabGlobal; + } else { + $oldGrab->grab; + } + } + return $w->{'selectFilePath'}; +} + +# tkFDialog_UpdateWhenIdle -- +# +# Creates an idle event handler which updates the dialog in idle +# time. This is important because loading the directory may take a long +# time and we don't want to load the same directory for multiple times +# due to multiple concurrent events. +# +sub UpdateWhenIdle { + my $w = shift; + if (exists $w->{'updateId'}) { + return; + } else { + $w->{'updateId'} = $w->after('idle', [$w, 'Update']); + } +} + +# tkFDialog_Update -- +# +# Loads the files and directories into the IconList widget. Also +# sets up the directory option menu for quick access to parent +# directories. +# +sub Update { + my $w = shift; + my $dataName = $w->name; + + # This proc may be called within an idle handler. Make sure that the + # window has not been destroyed before this proc is called + if (!Tk::Exists($w) || $w->class ne 'FBox') { + return; + } else { + delete $w->{'updateId'}; + } + unless (defined $folderImage->{$w->MainWindow}) { + require Tk::Pixmap; + $folderImage->{$w->MainWindow} = $w->Pixmap(-file => Tk->findINC('folder.xpm')); + $fileImage->{$w->MainWindow} = $w->Pixmap(-file => Tk->findINC('file.xpm')); + } + my $folder = $folderImage->{$w->MainWindow}; + my $file = $fileImage->{$w->MainWindow}; + my $appPWD = _cwd(); + if (!ext_chdir($w->{'selectPath'})) { + # We cannot change directory to $data(selectPath). $data(selectPath) + # should have been checked before tkFDialog_Update is called, so + # we normally won't come to here. Anyways, give an error and abort + # action. + $w->messageBox(-type => 'OK', + -message => 'Cannot change to the directory "' . + $w->{'selectPath'} . "\".\nPermission denied.", + -icon => 'warning', + ); + ext_chdir($appPWD); + return; + } + + # Turn on the busy cursor. BUG?? We haven't disabled X events, though, + # so the user may still click and cause havoc ... + my $ent = $w->{'ent'}; + my $entCursor = $ent->cget(-cursor); + my $dlgCursor = $w->cget(-cursor); + $ent->configure(-cursor => 'watch'); + $w->configure(-cursor => 'watch'); + $w->idletasks; + my $icons = $w->{'icons'}; + $icons->DeleteAll; + + # Make the dir & file list + my $cwd = _cwd(); + local *FDIR; + if (opendir(FDIR, $cwd)) { + my @files; +# my $sortcmd = $w->cget(-sortcmd); + my $sortcmd = sub { $w->cget(-sortcmd)->($a,$b) }; + my $flt = $w->cget(-filter); + my $fltcb; + if (ref $flt eq 'CODE') { + $fltcb = $flt; + } else { + $flt = _rx_to_glob($flt); + } + my $type_dir = $w->cget(-type) eq 'dir'; + foreach my $f (sort $sortcmd readdir(FDIR)) { + next if $f eq '.' or $f eq '..'; + next if $type_dir && ! -d "$cwd/$f"; # XXX use File::Spec? + if ($fltcb) { + next if !$fltcb->($w, $f, $cwd); + } else { + next if -f $f && $f !~ m!$flt!; + } + if (-d $f) { + $icons->Add($folder, $f); + } else { + push @files, $f; + } + } + closedir(FDIR); + $icons->Add($file, @files); + } + + $icons->Arrange; + + # Update the Directory: option menu + my @list; + my $dir = ''; + foreach my $subdir (TclFileSplit($w->{'selectPath'})) { + $dir = TclFileJoin($dir, $subdir); + push @list, $dir; + } + my $dirMenu = $w->{'dirMenu'}; + $dirMenu->configure(-options => \@list); + + # Restore the PWD to the application's PWD + ext_chdir($appPWD); + + # Restore the Save label + if ($w->cget(-type) eq 'save') { + $w->{'okBtn'}->configure(-text => 'Save'); + } + + # turn off the busy cursor. + $ent->configure(-cursor => $entCursor); + $w->configure(-cursor => $dlgCursor); +} + +# tkFDialog_SetPathSilently -- +# +# Sets data(selectPath) without invoking the trace procedure +# +sub SetPathSilently { + my($w, $path) = @_; + + $w->{'selectPath'} = $path; +} + +# This proc gets called whenever data(selectPath) is set +# +sub SetPath { + my $w = shift; + $w->{'selectPath'} = $_[0] if @_; + $w->UpdateWhenIdle; +} + +# This proc gets called whenever data(filter) is set +# +#XXX here's much more code in the tcl version ... check it out +sub SetFilter { + my($w, $title, $filter) = @_; + $w->configure(-filter => $filter); + $w->{'typeMenuBtn'}->configure(-text => $title, + -indicatoron => 1); + $w->{'icons'}->Subwidget('sbar')->set(0.0, 0.0); + $w->UpdateWhenIdle; +} + +# tkFDialogResolveFile -- +# +# Interpret the user's text input in a file selection dialog. +# Performs: +# +# (1) ~ substitution +# (2) resolve all instances of . and .. +# (3) check for non-existent files/directories +# (4) check for chdir permissions +# +# Arguments: +# context: the current directory you are in +# text: the text entered by the user +# defaultext: the default extension to add to files with no extension +# +# Return value: +# [list $flag $directory $file] +# +# flag = OK : valid input +# = PATTERN : valid directory/pattern +# = PATH : the directory does not exist +# = FILE : the directory exists but the file doesn't +# exist +# = CHDIR : Cannot change to the directory +# = ERROR : Invalid entry +# +# directory : valid only if flag = OK or PATTERN or FILE +# file : valid only if flag = OK or PATTERN +# +# directory may not be the same as context, because text may contain +# a subdirectory name +# +sub ResolveFile { + my($context, $text, $defaultext) = @_; + my $appPWD = _cwd(); + my $path = JoinFile($context, $text); + # If the file has no extension, append the default. Be careful not + # to do this for directories, otherwise typing a dirname in the box + # will give back "dirname.extension" instead of trying to change dir. + if (!-d $path && $path !~ /\..+$/ && defined $defaultext) { + $path = "$path$defaultext"; + } + # Cannot just test for existance here as non-existing files are + # not an error for getSaveFile type dialogs. + # return ('ERROR', $path, "") if (!-e $path); + my($directory, $file, $flag); + if (-e $path) { + if (-d $path) { + if (!ext_chdir($path)) { + return ('CHDIR', $path, ''); + } + $directory = _cwd(); + $file = ''; + $flag = 'OK'; + ext_chdir($appPWD); + } else { + my $dirname = File::Basename::dirname($path); + if (!ext_chdir($dirname)) { + return ('CHDIR', $dirname, ''); + } + $directory = _cwd(); + $file = File::Basename::basename($path); + $flag = 'OK'; + ext_chdir($appPWD); + } + } else { + my $dirname = File::Basename::dirname($path); + if (-e $dirname) { + if (!ext_chdir($dirname)) { + return ('CHDIR', $dirname, ''); + } + $directory = _cwd(); + $file = File::Basename::basename($path); + if ($file =~ /[*?]/) { + $flag = 'PATTERN'; + } else { + $flag = 'FILE'; + } + ext_chdir($appPWD); + } else { + $directory = $dirname; + $file = File::Basename::basename($path); + $flag = 'PATH'; + } + } + return ($flag,$directory,$file); +} + +# Gets called when the entry box gets keyboard focus. We clear the selection +# from the icon list . This way the user can be certain that the input in the +# entry box is the selection. +# +sub EntFocusIn { + my $w = shift; + my $ent = $w->{'ent'}; + if ($ent->get ne '') { + $ent->selectionRange(0, 'end'); + $ent->icursor('end'); + } else { + $ent->selectionClear; + } +#XXX is this missing in the tcl version, too??? $w->{'icons'}->Selection('clear'); + my $okBtn = $w->{'okBtn'}; + if ($w->cget(-type) ne 'save') { + $okBtn->configure(-text => 'Open'); + } else { + $okBtn->configure(-text => 'Save'); + } +} + +sub EntFocusOut { + my $w = shift; + $w->{'ent'}->selectionClear; +} + +# Gets called when user presses Return in the "File name" entry. +# +sub ActivateEnt { + my $w = shift; + my $ent = $w->{'ent'}; + my $text = $ent->get; + if ($w->cget(-multiple)) { + # For the multiple case we have to be careful to get the file + # names as a true list, watching out for a single file with a + # space in the name. Thus we query the IconList directly. + + $w->{'selectFile'} = []; + for my $item ($w->{'icons'}->Curselection) { + $w->VerifyFileName($w->{'icons'}->Get($item)); + } + } else { + $w->VerifyFileName($text); + } +} + +# Verification procedure +# +sub VerifyFileName { + my($w, $text) = @_; +#XXX leave this here? +# $text =~ s/^\s+//; +# $text =~ s/\s+$//; + my($flag, $path, $file) = ResolveFile($w->{'selectPath'}, $text, + $w->cget(-defaultextension)); + my $ent = $w->{'ent'}; + if ($flag eq 'OK') { + if ($file eq '') { + # user has entered an existing (sub)directory + $w->SetPath($path); + $ent->delete(0, 'end'); + } else { + $w->SetPathSilently($path); + if ($w->cget(-multiple)) { + push @{ $w->{'selectFile'} }, $file; + } else { + $w->{'selectFile'} = $file; + } + $w->Done; + } + } elsif ($flag eq 'PATTERN') { + $w->SetPath($path); + $w->configure(-filter => $file); + } elsif ($flag eq 'FILE') { + if ($w->cget(-type) eq 'open') { + $w->messageBox(-icon => 'warning', + -type => 'OK', + -message => 'File "' . TclFileJoin($path, $file) + . '" does not exist.'); + $ent->selectionRange(0, 'end'); + $ent->icursor('end'); + } elsif ($w->cget(-type) eq 'save') { + $w->SetPathSilently($path); + if ($w->cget(-multiple)) { + push @{ $w->{'selectFile'} }, $file; + } else { + $w->{'selectFile'} = $file; + } + $w->Done; + } + } elsif ($flag eq 'PATH') { + $w->messageBox(-icon => 'warning', + -type => 'OK', + -message => "Directory \'$path\' does not exist."); + $ent->selectionRange(0, 'end'); + $ent->icursor('end'); + } elsif ($flag eq 'CHDIR') { + $w->messageBox(-type => 'OK', + -message => "Cannot change to the directory \"$path\".\nPermission denied.", + -icon => 'warning'); + $ent->selectionRange(0, 'end'); + $ent->icursor('end'); + } elsif ($flag eq 'ERROR') { + $w->messageBox(-type => 'OK', + -message => "Invalid file name \"$path\".", + -icon => 'warning'); + $ent->selectionRange(0, 'end'); + $ent->icursor('end'); + } +} + +# Gets called when user presses the Alt-s or Alt-o keys. +# +sub InvokeBtn { + my($w, $key) = @_; + my $okBtn = $w->{'okBtn'}; + $okBtn->invoke if ($okBtn->cget(-text) eq $key); +} + +# Gets called when user presses the "parent directory" button +# +sub UpDirCmd { + my $w = shift; + $w->SetPath(File::Basename::dirname($w->{'selectPath'})) + unless ($w->{'selectPath'} eq '/'); +} + +# Join a file name to a path name. The "file join" command will break +# if the filename begins with ~ +sub JoinFile { + my($path, $file) = @_; + if ($file =~ /^~/ && -e "$path/$file") { + TclFileJoin($path, "./$file"); + } else { + TclFileJoin($path, $file); + } +} + +# XXX replace with File::Spec when perl/Tk depends on 5.005 +sub TclFileJoin { + my $path = ''; + foreach (@_) { + if (m|^/|) { + $path = $_; + } + elsif (m|^[a-z]:/|i) { # DOS-ish + $path = $_; + } elsif ($_ eq '~') { + $path = _get_homedir(); + } elsif (m|^~/(.*)|) { + $path = _get_homedir() . "/" . $1; + } elsif (m|^~([^/]+)(.*)|) { + my($user, $p) = ($1, $2); + my $dir = _get_homedir($user); + if (!defined $dir) { + $path = "~$user$p"; + } else { + $path = $dir . $p; + } + } elsif ($path eq '/' or $path eq '') { + $path .= $_; + } else { + $path .= "/$_"; + } + } + $path; +} + +sub TclFileSplit { + my $path = shift; + my @comp; + $path =~ s|/+|/|g; # strip multiple slashes + if ($path =~ m|^/|) { + push @comp, '/'; + $path = substr($path, 1); + } + push @comp, split /\//, $path; + @comp; +} + +# Gets called when user presses the "OK" button +# +sub OkCmd { + my $w = shift; + my $from = shift || "button"; + + my $filenames = []; + for my $item ($w->{'icons'}->Curselection) { + push @$filenames, $w->{'icons'}->Get($item); + } + + my $filename = $filenames->[0]; + if ($w->cget('-type') eq 'dir' && $from ne "iconlist") { + my $file = $filename eq '' ? $w->{'selectPath'} : JoinFile($w->{'selectPath'}, $filename); + $w->Done($file); + } elsif ((@$filenames && !$w->cget('-multiple')) || + ($w->cget('-multiple') && @$filenames == 1)) { + my $file = JoinFile($w->{'selectPath'}, $filename); + if (-d $file) { + $w->ListInvoke($filename); + return; + } + } + + $w->ActivateEnt; +} + +# Gets called when user presses the "Cancel" button +# +sub CancelCmd { + my $w = shift; + undef $w->{'selectFilePath'}; +} + +# Gets called when user browses the IconList widget (dragging mouse, arrow +# keys, etc) +# +sub ListBrowse { + my($w) = @_; + + my $text = []; + for my $item ($w->{'icons'}->Curselection) { + push @$text, $w->{'icons'}->Get($item); + } + return if @$text == 0; + my $isDir; + if (@$text > 1) { + my $newtext = []; + for my $file (@$text) { + my $fullfile = JoinFile($w->{'selectPath'}, $file); + if (!-d $fullfile) { + push @$newtext, $file; + } + } + $text = $newtext; + $isDir = 0; + } else { + my $file = JoinFile($w->{'selectPath'}, $text->[0]); + $isDir = -d $file; + } + my $ent = $w->{'ent'}; + my $okBtn = $w->{'okBtn'}; + if (!$isDir) { + $ent->delete(qw(0 end)); + $ent->insert(0, "@$text"); # XXX quote! + + if ($w->cget('-type') ne 'save') { + $okBtn->configure(-text => 'Open'); + } else { + $okBtn->configure(-text => 'Save'); + } + } else { + $okBtn->configure(-text => 'Open'); + } +} + +# Gets called when user invokes the IconList widget (double-click, +# Return key, etc) +# +sub ListInvoke { + my($w, @filenames) = @_; + return if !@filenames; + my $file = JoinFile($w->{'selectPath'}, $filenames[0]); + if (-d $file) { + my $appPWD = _cwd(); + if (!ext_chdir($file)) { + $w->messageBox(-type => 'OK', + -message => "Cannot change to the directory \"$file\".\nPermission denied.", + -icon => 'warning'); + } else { + ext_chdir($appPWD); + $w->SetPath($file); + } + } else { + if ($w->cget('-multiple')) { + $w->{'selectFile'} = [@filenames]; + } else { + $w->{'selectFile'} = $file; + } + $w->Done; + } +} + +# tkFDialog_Done -- +# +# Gets called when user has input a valid filename. Pops up a +# dialog box to confirm selection when necessary. Sets the +# tkPriv(selectFilePath) variable, which will break the "tkwait" +# loop in tkFDialog and return the selected filename to the +# script that calls tk_getOpenFile or tk_getSaveFile +# +sub Done { + my $w = shift; + my $selectFilePath = (@_) ? shift : ''; + if ($selectFilePath eq '') { + if ($w->cget('-multiple')) { + $selectFilePath = []; + for my $f (@{ $w->{'selectFile'} }) { + push @$selectFilePath, JoinFile($w->{'selectPath'}, $f); + } + } else { + $selectFilePath = JoinFile($w->{'selectPath'}, + $w->{'selectFile'}); + } + if ($w->cget(-type) eq 'save' and + -e $selectFilePath and + !$w->cget(-force)) { + my $reply = $w->messageBox + (-icon => 'warning', + -type => 'YesNo', + -message => "File \"$selectFilePath\" already exists.\nDo you want to overwrite it?"); + return unless (lc($reply) eq 'yes'); + } + } + $w->{'selectFilePath'} = ($selectFilePath ne '' ? $selectFilePath : undef); +} + +sub FDialog { + my $cmd = shift; + if ($cmd =~ /Save/) { + push @_, -type => 'save'; + } elsif ($cmd =~ /Directory/) { + push @_, -type => 'dir'; + } + Tk::DialogWrapper('FBox', $cmd, @_); +} + +# tkFDGetFileTypes -- +# +# Process the string given by the -filetypes option of the file +# dialogs. Similar to the C function TkGetFileFilters() on the Mac +# and Windows platform. +# +sub GetFileTypes { + my $in = shift; + my %fileTypes; + foreach my $t (@$in) { + if (@$t < 2 || @$t > 3) { + require Carp; + Carp::croak("bad file type \"$t\", should be \"typeName [extension ?extensions ...?] ?[macType ?macTypes ...?]?\""); + } + push @{ $fileTypes{$t->[0]} }, (ref $t->[1] eq 'ARRAY' + ? @{ $t->[1] } + : $t->[1]); + } + + my @types; + my %hasDoneType; + my %hasGotExt; + foreach my $t (@$in) { + my $label = $t->[0]; + my @exts; + + next if (exists $hasDoneType{$label}); + + my $name = "$label ("; + my $sep = ''; + foreach my $ext (@{ $fileTypes{$label} }) { + next if ($ext eq ''); + $ext =~ s/^\./*./; + if (!exists $hasGotExt{$label}->{$ext}) { + $name .= "$sep$ext"; + push @exts, $ext; + $hasGotExt{$label}->{$ext}++; + } + $sep = ','; + } + $name .= ')'; + push @types, [$name, \@exts]; + + $hasDoneType{$label}++; + } + + return @types; +} + +# ext_chdir -- +# +# Change directory with tilde substitution +# +sub ext_chdir { + my $dir = shift; + if ($dir eq '~') { + chdir _get_homedir(); + } elsif ($dir =~ m|^~/(.*)|) { + chdir _get_homedir() . "/" . $1; + } elsif ($dir =~ m|^~([^/]+(.*))|) { + chdir _get_homedir($1) . $2; + } else { + chdir $dir; + } +} + +# _get_homedir -- +# +# Get home directory of the current user +# +sub _get_homedir { + my($user) = @_; + if (!defined $user) { + eval { + local $SIG{__DIE__}; + (getpwuid($<))[7]; + } || $ENV{HOME} || undef; # chdir undef changes to home directory, too + } else { + eval { + local $SIG{__DIE__}; + (getpwnam($user))[7]; + }; + } +} + +sub _cwd { + #Cwd::cwd(); + Cwd::fastcwd(); # this is taint-safe +} + +sub _untaint { + my $s = shift; + $s =~ /^(.*)$/; + $1; +} + +sub _rx_to_glob { + my $arg = shift; + $arg = join('|', split(' ', $arg)); + $arg =~ s!([\.\+])!\\$1!g; + $arg =~ s!\*!.*!g; + $arg = "^" . $arg . "\$"; + if ($] >= 5.005) { + $arg = qr/$arg/; + } + $arg; +} + +1; + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/FileSelect.pm b/Master/tlpkg/tlperl.old/lib/Tk/FileSelect.pm new file mode 100644 index 00000000000..d2070049d82 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/FileSelect.pm @@ -0,0 +1,578 @@ +package Tk::FileSelect; + +use vars qw($VERSION @EXPORT_OK); +$VERSION = sprintf '4.%03d', q$Revision: #15 $ =~ /\D(\d+)\s*$/; +@EXPORT_OK = qw(glob_to_re); + +use Tk qw(Ev); +use strict; +use Carp; +use base qw(Tk::Toplevel); +use Tk::widgets qw(LabEntry Button Frame Listbox Scrollbar); +use File::Basename; + +Construct Tk::Widget 'FileSelect'; + +use vars qw(%error_text); +%error_text = ( + '-r' => 'is not readable by effective uid/gid', + '-w' => 'is not writeable by effective uid/gid', + '-x' => 'is not executable by effective uid/gid', + '-R' => 'is not readable by real uid/gid', + '-W' => 'is not writeable by real uid/gid', + '-X' => 'is not executable by real uid/gid', + '-o' => 'is not owned by effective uid/gid', + '-O' => 'is not owned by real uid/gid', + '-e' => 'does not exist', + '-z' => 'is not of size zero', + '-s' => 'does not exists or is of size zero', + '-f' => 'is not a file', + '-d' => 'is not a directory', + '-l' => 'is not a link', + '-S' => 'is not a socket', + '-p' => 'is not a named pipe', + '-b' => 'is not a block special file', + '-c' => 'is not a character special file', + '-u' => 'is not setuid', + '-g' => 'is not setgid', + '-k' => 'is not sticky', + '-t' => 'is not a terminal file', + '-T' => 'is not a text file', + '-B' => 'is not a binary file', + '-M' => 'has no modification date/time', + '-A' => 'has no access date/time', + '-C' => 'has no inode change date/time', + ); + +# Documentation after __END__ + +sub import { + if (defined $_[1] and $_[1] eq 'as_default') { + local $^W = 0; + package Tk; + if ($Tk::VERSION < 804) { + *FDialog = \&Tk::FileSelect::FDialog; + *MotifFDialog = \&Tk::FileSelect::FDialog; + } else { + *tk_getOpenFile = sub { + Tk::FileSelect::FDialog("tk_getOpenFile", @_); + }; + *tk_getSaveFile = sub { + Tk::FileSelect::FDialog("tk_getSaveFile", @_); + }; + } + } +} + +sub Cancel +{ + my ($cw) = @_; + $cw->{Selected} = undef; + $cw->withdraw unless $cw->cget('-transient'); +} + +sub Accept { + + # Accept the file or directory name if possible. + + my ($cw) = @_; + + my($path, $so) = ($cw->cget('-directory'), $cw->SelectionOwner); + my $leaf = undef; + my $leaves; + + if (defined $so and + $so == $cw->Subwidget('dir_list')->Subwidget('listbox')) { + $leaves = [$cw->Subwidget('dir_list')->getSelected]; + $leaves = [$cw->Subwidget('dir_entry')->get] if !scalar(@$leaves); + } else { + $leaves = [$cw->Subwidget('file_list')->getSelected]; + $leaves = [$cw->Subwidget('file_entry')->get] if !scalar(@$leaves); + } + + foreach $leaf (@$leaves) + { + if (defined $leaf and $leaf ne '') { + if (!$cw->cget('-create') || -e "$path/$leaf") + { + foreach (@{$cw->cget('-verify')}) { + my $r = ref $_; + if (defined $r and $r eq 'ARRAY') { + #local $_ = $leaf; # use strict var problem here + return if not &{$_->[0]}($cw, $path, $leaf, @{$_}[1..$#{$_}]); + } else { + my $s = eval "$_ '$path/$leaf'"; + print $@ if $@; + if (not $s) { + my $err; + if (substr($_,0,1) eq '!') + { + my $t = substr($_,1); + if (exists $error_text{$t}) + { + $err = $error_text{$t}; + $err =~ s/\b(?:no|not) //; + } + } + $err = $error_text{$_} unless defined $err; + $err = "failed '$_' test" unless defined $err; + $cw->Error("'$leaf' $err."); + return; + } + } + } # forend + } + else + { + unless (-w $path) + { + $cw->Error("Cannot write to $path"); + return; + } + } + $leaf = $path . '/' . $leaf; + } else { + $leaf = undef; + } + } + if (scalar(@$leaves)) + { + my $sm = $cw->Subwidget('file_list')->cget(-selectmode); + $cw->{Selected} = $leaves; + my $command = $cw->cget('-command'); + $command->Call(@{$cw->{Selected}}) if defined $command; + } + +} # end Accept + +sub Accept_dir +{ + my ($cw,$new) = @_; + my $dir = $cw->cget('-directory'); + $cw->configure(-directory => "$dir/$new"); +} + +sub Populate { + + my ($w, $args) = @_; + + require Tk::Listbox; + require Tk::Button; + require Tk::Dialog; + require Tk::Toplevel; + require Tk::LabEntry; + require Cwd; + + $w->SUPER::Populate($args); + $w->protocol('WM_DELETE_WINDOW' => ['Cancel', $w ]); + + $w->{'reread'} = 0; + $w->withdraw; + + # Create directory/filter entry, place at the top. + my $e = $w->Component( + LabEntry => 'dir_entry', + -textvariable => \$w->{DirectoryString}, + -labelVariable => \$w->{Configure}{-dirlabel}, + ); + $e->pack(-side => 'top', -expand => 0, -fill => 'x'); + $e->bind('<Return>' => [$w => 'validateDir', Ev(['get'])]); + + # Create file entry, place at the bottom. + $e = $w->Component( + LabEntry => 'file_entry', + -textvariable => \$w->{Configure}{-initialfile}, + -labelVariable => \$w->{Configure}{-filelabel}, + ); + $e->pack(-side => 'bottom', -expand => 0, -fill => 'x'); + $e->bind('<Return>' => [$w => 'validateFile', Ev(['get'])]); + $e->bind('<FocusIn>' => [$w => 'SelectionClear']); + + # Create directory scrollbox, place at the left-middle. + my $b = $w->Component( + ScrlListbox => 'dir_list', + -labelVariable => \$w->{Configure}{-dirlistlabel}, + -scrollbars => 'se', + ); + $b->pack(-side => 'left', -expand => 1, -fill => 'both'); + $b->bind('<Double-Button-1>' => [$w => 'Accept_dir', Ev(['getSelected'])]); + + # Add a label. + + my $f = $w->Frame(); + $f->pack(-side => 'right', -fill => 'y', -expand => 0); + $b = $f->Button('-textvariable' => \$w->{'Configure'}{'-acceptlabel'}, + -command => [ 'Accept', $w ], + ); + $b->pack(-side => 'top', -fill => 'x', -expand => 1); + $b = $f->Button('-textvariable' => \$w->{'Configure'}{'-cancellabel'}, + -command => [ 'Cancel', $w ], + ); + $b->pack(-side => 'top', -fill => 'x', -expand => 1); + $b = $f->Button('-textvariable' => \$w->{'Configure'}{'-resetlabel'}, + -command => [$w => 'configure','-directory','.'], + ); + $b->pack(-side => 'top', -fill => 'x', -expand => 1); + $b = $f->Button('-textvariable' => \$w->{'Configure'}{'-homelabel'}, + -command => [$w => 'configure','-directory',$ENV{'HOME'}], + ); + $b->pack(-side => 'top', -fill => 'x', -expand => 1); + + # Create file scrollbox, place at the right-middle. + + $b = $w->Component( + ScrlListbox => 'file_list', + -labelVariable => \$w->{Configure}{-filelistlabel}, + -scrollbars => 'se', + ); + $b->pack(-side => 'right', -expand => 1, -fill => 'both'); + $b->bind('<Double-1>' => [$w => 'Accept']); + + # Create -very dialog. + + my $v = $w->Component( + Dialog => 'dialog', + -title => 'Verify Error', + -bitmap => 'error', + -buttons => ['Dismiss'], + ); + + $w->ConfigSpecs( + -width => [ ['file_list','dir_list'], undef, undef, 14 ], + -height => [ ['file_list','dir_list'], undef, undef, 14 ], + -directory => [ 'METHOD', undef, undef, '.' ], + -initialdir => '-directory', + -filelabel => [ 'PASSIVE', 'fileLabel', 'FileLabel', 'File' ], + -initialfile => [ 'PASSIVE', undef, undef, '' ], + -filelistlabel => [ 'PASSIVE', undef, undef, 'Files' ], + -filter => [ 'METHOD', undef, undef, undef ], + -defaultextension => [ 'METHOD', undef, undef, undef ], + -regexp => [ 'METHOD', undef, undef, undef ], + -dirlistlabel => [ 'PASSIVE', undef, undef, 'Directories'], + -dirlabel => [ 'PASSIVE', undef, undef, 'Directory'], + '-accept' => [ 'CALLBACK',undef,undef, undef ], + -command => [ 'CALLBACK',undef,undef, undef ], + -transient => [ 'PASSIVE', undef, undef, 1 ], + -verify => [ 'PASSIVE', undef, undef, ['!-d'] ], + -create => [ 'PASSIVE', undef, undef, 0 ], + -acceptlabel => [ 'PASSIVE', undef, undef, 'Accept'], + -cancellabel => [ 'PASSIVE', undef, undef, 'Cancel'], + -resetlabel => [ 'PASSIVE', undef, undef, 'Reset'], + -homelabel => [ 'PASSIVE', undef, undef, 'Home'], + DEFAULT => [ 'file_list' ], + ); + $w->Delegates(DEFAULT => 'file_list'); + + return $w; + +} # end Populate + +sub translate + { + my ($bs,$ch) = @_; + return "\\$ch" if (length $bs); + return '.*' if ($ch eq '*'); + return '.' if ($ch eq '?'); + return "\\." if ($ch eq '.'); + return "\\/" if ($ch eq '/'); + return "\\\\" if ($ch eq '\\'); + return $ch; +} + +sub glob_to_re +{ + my $regex = shift; + $regex =~ s/(\\?)(.)/&translate($1,$2)/ge; + return sub { shift =~ /^${regex}$/ }; +} + +sub filter +{ + my ($cw,$val) = @_; + my $var = \$cw->{Configure}{'-filter'}; + if (@_ > 1 || !defined($$var)) + { + $val = '*' unless defined $val; + $$var = $val; + $cw->{'match'} = glob_to_re($val) unless defined $cw->{'match'}; + unless ($cw->{'reread'}++) + { + $cw->Busy; + $cw->afterIdle(['reread',$cw,$cw->cget('-directory')]) + } + } + return $$var; +} + +sub regexp +{ + my ($cw,$val) = @_; + my $var = \$cw->{Configure}{'-regexp'}; + if (@_ > 1) + { + $$var = $val; + $cw->{'match'} = (defined $val) ? sub { shift =~ m|^${val}$| } : sub { 1 }; + unless ($cw->{'reread'}++) + { + $cw->Busy; + $cw->afterIdle(['reread',$cw]) + } + } + return $$var; +} + +sub defaultextension +{ + my ($cw,$val) = @_; + if (@_ > 1) + { + $val = '' unless defined $val; + $val = ".$val" if ($val !~ /^\./); + $cw->filter("*$val"); + } + else + { + $val = $cw->filter; + my ($ext) = $val =~ /(\.[^\.]*)$/; + return $ext; + } +} + +sub directory +{ + my ($cw,$dir) = @_; + my $var = \$cw->{Configure}{'-directory'}; + if (@_ > 1 && defined $dir) + { + if (substr($dir,0,1) eq '~') + { + if (substr($dir,1,1) eq '/') + { + $dir = (defined $ENV{'HOME'} ? $ENV{'HOME'} : '') . substr($dir,1); + } + else + {my ($uid,$rest) = ($dir =~ m#^~([^/]+)(/.*$)#); + $dir = (getpwnam($uid))[7] . $rest; + } + } + my $revert_dir = sub + { + my $message = shift; + $$var = $cw->{OldDirectory}; + $cw->messageBox(-message => $message, -icon => 'error'); + if (!defined $$var) + { + # OldDirectory was never set, so force reread... + $$var = $cw->{OldDirectory} = Cwd::getcwd(); # XXX maybe use check like code below... + unless ($cw->{'reread'}++) + { + $cw->Busy; + $cw->afterIdle(['reread',$cw]) + } + } + $$var; + }; + $dir =~ s#([^/\\])[\\/]+$#$1#; + if (-d $dir) + { + unless (Tk::tainting()) + { + my $pwd = Cwd::getcwd(); + if (chdir( (defined($dir) ? $dir : '') ) ) + { + my $new = Cwd::getcwd(); + if ($new) + { + $dir = $new; + } + else + { + return $revert_dir->("Cannot getcwd in '$dir'"); + } + if (!chdir($pwd)) + { + return $revert_dir->("Cannot change directory to $pwd:\n$!"); + } + $$var = $dir; + } + else + { + return $revert_dir->("Cannot change directory to $dir:\n$!"); + } + $$var = $cw->{OldDirectory} = $dir; + } + unless ($cw->{'reread'}++) + { + $cw->Busy; + $cw->afterIdle(['reread',$cw]) + } + } + } + return $$var; +} + +sub reread +{ + my ($w) = @_; + my $dir = $w->cget('-directory'); + if (defined $dir) + { + if (!defined $w->cget('-filter') or $w->cget('-filter') eq '') + { + $w->configure('-filter', '*'); + } + my $dl = $w->Subwidget('dir_list'); + $dl->delete(0, 'end'); + $dl->selectionClear(0,'end'); + my $fl = $w->Subwidget('file_list'); + $fl->delete(0, 'end'); + local *DIR; + if (opendir(DIR, $dir)) + { + my $file = $w->cget('-initialfile'); + my $seen = 0; + my $accept = $w->cget('-accept'); + foreach my $f (sort(readdir(DIR))) + { + next if ($f eq '.'); + my $path = "$dir/$f"; + if (-d $path) + { + $dl->insert('end', $f); + } + else + { + if (&{$w->{match}}($f)) + { + if (!defined($accept) || $accept->Call($path)) + { + $seen = $fl->index('end') if ($file && $f eq $file); + $fl->insert('end', $f) + } + } + } + } + closedir(DIR); + if ($seen) + { + $fl->selectionSet($seen); + $fl->see($seen); + } + else + { + $w->configure(-initialfile => undef) unless $w->cget('-create'); + } + } + $w->{DirectoryString} = $dir . ($dir ne '/' ? '/' : '') . $w->cget('-filter'); + } + $w->{'reread'} = 0; + $w->Unbusy if $w->{'Busy'}; +} + +sub validateDir +{ + my ($cw,$name) = @_; + my ($leaf,$base) = fileparse($name); + if ($leaf =~ /[*?]/) + { + $cw->configure('-directory' => $base,'-filter' => $leaf); + } + else + { + $cw->configure('-directory' => $name); + } +} + +sub validateFile +{ + my ($cw,$name) = @_; + my $i = 0; + my $n = $cw->index('end'); + # See if it is an existing file + for ($i= 0; $i < $n; $i++) + { + my $f = $cw->get($i); + if ($f eq $name) + { + $cw->selection('set',$i); + $cw->Accept; + } + } + # otherwise allow if -create is set, directory is writable + # and it passes filter and accept criteria + if ($cw->cget('-create')) + { + my $path = $cw->cget('-directory'); + if (-w $path) + { + if (&{$cw->{match}}($name)) + { + my $accept = $cw->cget('-accept'); + my $full = "$path/$name"; + if (!defined($accept) || $accept->Call($full)) + { + $cw->{Selected} = [$full]; + $cw->Callback(-command => @{$cw->{Selected}}); + } + else + { + $cw->Error("$name is not 'acceptable'"); + } + } + else + { + $cw->Error("$name does not match '".$cw->cget('-filter').'\''); + } + } + else + { + $cw->Error("Directory '$path' is not writable"); + return; + } + } +} + +sub Error +{ + my $cw = shift; + my $msg = shift; + my $dlg = $cw->Subwidget('dialog'); + $dlg->configure(-text => $msg); + $dlg->Show; +} + +sub Show +{ + my ($cw,@args) = @_; + if ($cw->cget('-transient')) { + $cw->Popup(@args); + $cw->focus; + $cw->waitVariable(\$cw->{Selected}); + $cw->withdraw; + return defined($cw->{Selected}) + ? (wantarray) ? @{$cw->{Selected}} : $cw->{Selected}[0] + : undef; + } else { + $cw->Popup(@args); + } +} + +sub FDialog +{ + my($cmd, %args) = @_; + if ($cmd =~ /Save/) + { + $args{-create} = 1; + $args{-verify} = [qw(!-d -w)]; + } + delete $args{-filetypes}; + delete $args{-force}; + Tk::DialogWrapper('FileSelect',$cmd, %args); +} + +1; + +__END__ + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/FloatEntry.pm b/Master/tlpkg/tlperl.old/lib/Tk/FloatEntry.pm new file mode 100644 index 00000000000..eb6465dbe61 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/FloatEntry.pm @@ -0,0 +1,109 @@ +# Tranlation of FloatEnt.tcl in Tix4.1 + +# TODO/IDEA: +# o extract a widget (SimpleEntry?) without post/unpost methods +# and derive FloatEntry fron this widget. + +package Tk::FloatEntry; +use strict; + +BEGIN + { + use vars '$DEBUG'; + $DEBUG = (defined($ENV{USER}) and $ENV{USER} eq 'achx') ? 1 : 0; + print STDERR "tixGrid: debug = $DEBUG\n" if $DEBUG; + } + +require Tk; +require Tk::Widget; +require Tk::Derived; +require Tk::Entry; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/TixGrid/FloatEntry.pm#4 $ + +use base qw(Tk::Derived Tk::Entry); + +Construct Tk::Widget 'FloatEntry'; + +sub ClassInit + { + my ($class, $mw) = @_; + $class->SUPER::ClassInit($mw); + $mw->bind($class, '<Return>', 'invoke'); + $mw->bind($class, '<FocusIn>', 'FocusIn'); + $class; + } + +sub Populate + { + my ($e, $args) = @_; + $e->ConfigSpecs( + -value => ['METHOD', 'value', 'Value', undef], + -highlightthickness => [$e, 'highlightThickness', 'HighlightThickness', 0 ], + -command => ['CALLBACK', 'command', 'Command', undef], + ); + print "FloatEntry Init: $e\n" if $DEBUG; + $e; + } + +## option method + +sub value + { + my $e = shift; + unless (@_) + { + return $e->get + } + $e->delete(0,'end'); + $e->insert(0,$_[0]); + $e->selection('from', 0); + $e->selection('to', 'end'); + + } + +## public methods + +sub invoke + { + my ($e) = @_; + $e->Callback('-command', $e->get); + } + +sub post + { + my ($e, $x, $y, $dx, $dy) = @_; + + $dx = $e->reqwidth unless defined $dx; + $dy = $e->reqheight unless defined $dy; + + $e->place('-x'=>$x, '-y'=>$y, -width=>$dx, -height=>$dy, -bordermode=>'ignore'); + $e->raise; + $e->focus; + } + +sub unpost + { + my ($e) = @_; + $e->place('forget'); + } + +## bindings + +sub FocusIn + { + my ($e) = @_; + + # FIX: xxx only if entry has not already focus + { + $e->focus; + $e->selection('from', 0); + $e->selection('to', 'end'); + $e->icursor('end'); + } + } + +1; +__END__ + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Font.pm b/Master/tlpkg/tlperl.old/lib/Tk/Font.pm new file mode 100644 index 00000000000..bb1b52cc7c5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Font.pm @@ -0,0 +1,163 @@ +package Tk::Font; +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Tk/Font.pm#4 $ +require Tk::Widget; +use strict; +use Carp; +use overload '""' => 'as_string'; +sub as_string { return ${$_[0]} } + +*MainWindow = \&Tk::Widget::MainWindow; + +foreach my $key (qw(actual metrics measure configure)) + { + no strict 'refs'; + *{$key} = sub { shift->Tk::font($key,@_) }; + } + +Construct Tk::Widget 'Font'; + +my @xfield = qw(foundry family weight slant swidth adstyle pixel + point xres yres space avgwidth registry encoding); +my @tkfield = qw(family size weight slant underline overstrike); +my %tkfield = map { $_ => "-$_" } @tkfield; + +sub _xonly { my $old = '*'; return $old } + +sub Pixel +{ + my $me = shift; + my $old = $me->configure('-size'); + $old = '*' if ($old > 0); + if (@_) + { + $me->configure(-size => -$_[0]); + } + return $old; +} + +sub Point +{ + my $me = shift; + my $old = 10*$me->configure('-size'); + $old = '*' if ($old < 0); + if (@_) + { + $me->configure(-size => int($_[0]/10)); + } + return $old; +} + +foreach my $f (@tkfield,@xfield) + { + no strict 'refs'; + my $sub = "\u$f"; + unless (defined &{$sub}) + { + my $key = $tkfield{$f}; + if (defined $key) + { + *{$sub} = sub { shift->configure($key,@_) }; + } + else + { + *{$sub} = \&_xonly; + } + } + } + +sub new +{ + my $pkg = shift; + my $w = shift; + my $me; + if (scalar(@_) == 1) + { + $me = $w->Tk::font('create',@_); + } + else + { + croak 'Odd number of args' if @_ & 1; + my %attr; + while (@_) + { + my $k = shift; + my $v = shift; + my $t = (substr($k,0,1) eq '-') ? $k : $tkfield{$k}; + if (defined $t) + { + $attr{$t} = $v; + } + elsif ($k eq 'point') + { + $attr{'-size'} = -int($v/10+0.5); + } + elsif ($k eq 'pixel') + { + $attr{'-size'} = -$v; + } + else + { + carp "$k ignored" if $^W; + } + } + $me = $w->Tk::font('create',%attr); + } + return bless $me,$pkg; +} + +sub Pattern +{ + my $me = shift; + my @str; + foreach my $f (@xfield) + { + my $meth = "\u$f"; + my $str = $me->$meth(); + if ($f eq 'family') + { + $str =~ s/(?:Times\s+New\s+Roman|New York)/Times/i; + $str =~ s/(?:Courier\s+New|Monaco)/Courier/i; + $str =~ s/(?:Arial|Geneva)/Helvetica/i; + } + elsif ($f eq 'slant') + { + $str = substr($str,0,1); + } + elsif ($f eq 'weight') + { + $str = 'medium' if ($str eq 'normal'); + } + push(@str,$str); + } + return join('-', '', @str); +} + +sub Name +{ + my $me = shift; + return $$me if (!wantarray || ($^O eq 'MSWin32')); + my $max = shift || 128; + my $w = $me->MainWindow; + my $d = $w->Display; + return $d->XListFonts($me->Pattern,$max); +} + +sub Clone +{ + my $me = shift; + return ref($me)->new($me,$me->actual,@_); +} + +sub ascent +{ + return shift->metrics('-ascent'); +} + +sub descent +{ + return shift->metrics('-descent'); +} + +1; + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Frame.pm b/Master/tlpkg/tlperl.old/lib/Tk/Frame.pm new file mode 100644 index 00000000000..a5716cdf9bd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Frame.pm @@ -0,0 +1,378 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::Frame; +require Tk::Widget; +require Tk::Derived; +use AutoLoader; +use strict qw(vars); +use Carp; + +use base qw(Tk::Derived Tk::Widget); + +Construct Tk::Widget 'Frame'; + +use vars qw($VERSION); +$VERSION = '4.010'; # $Id: //depot/Tkutf8/Tk/Frame.pm#10 $ + +sub Tk_cmd { \&Tk::frame } + +sub CreateOptions +{ + return (shift->SUPER::CreateOptions,'-colormap','-visual','-container') +} + +sub Default +{ + my ($cw,$name,$widget) = @_; + confess 'No name' unless (defined $name); + croak 'No widget' unless (defined $widget); + $cw->Delegates(DEFAULT => $widget); + $cw->ConfigSpecs(DEFAULT => [$widget]); + $widget->pack('-expand' => 1, -fill => 'both') unless ($widget->manager); # Suspect + $cw->Advertise($name,$widget); +} + +sub ConfigDelegate +{ + my ($cw,$name,@skip) = @_; + my $sw = $cw->Subwidget($name); + my $sc; + my %skip = (); + foreach $sc (@skip) + { + $skip{$sc} = 1; + } + foreach $sc ($sw->configure) + { + my (@info) = @$sc; + next if (@info == 2); + my $option = $info[0]; + unless ($skip{$option}) + { + $option =~ s/^-(.*)/-$name\u$1/; + $info[0] = Tk::Configure->new($sw,$info[0]); + pop(@info); + $cw->ConfigSpecs($option => \@info); + } + } +} + +sub bind +{my ($cw,@args) = @_; + $cw->Delegate('bind',@args); +} + +sub menu +{my ($cw,@args) = @_; + $cw->Delegate('menu',@args); +} + +sub focus +{my ($cw,@args) = @_; + $cw->Delegate('focus',@args); +} + +#sub bindtags +#{my ($cw,@args) = @_; +# $cw->Delegate('bindtags',@args); +#} + +sub selection +{my ($cw,@args) = @_; + $cw->Delegate('selection',@args); +} + +sub autoLabel { 1 } + +sub Populate +{ + my ($cw,$args) = @_; + if ($cw->autoLabel) + { + $cw->ConfigSpecs('-labelPack' => [ 'METHOD', undef, undef, undef]); + $cw->ConfigSpecs('-labelVariable' => [ 'METHOD', undef, undef, undef]); + $cw->ConfigSpecs('-label' => [ 'METHOD', undef, undef, undef]); + $cw->labelPack([]) if grep /^-label\w+/, keys %$args; + } +} + +sub Menubar +{ + my $frame = shift; + my $menu = $frame->cget('-menu'); + if (defined $menu) + { + $menu->configure(@_) if @_; + } + else + { + $menu = $frame->Menu(-type => 'menubar',@_); + $frame->configure('-menu' => $menu); + } + $frame->Advertise('menubar' => $menu); + return $menu; +} + +1; + +__END__ + +sub labelPack +{ + my ($cw,$val) = @_; + my $w = $cw->Subwidget('label'); + my @result = (); + if (@_ > 1) + { + if (defined($w) && !defined($val)) + { + $w->packForget; + } + elsif (defined($val) && !defined ($w)) + { + require Tk::Label; + $w = Tk::Label->new($cw,-textvariable => $cw->labelVariable); + $cw->Advertise('label' => $w); + $cw->ConfigDelegate('label',qw(-text -textvariable)); + } + if (defined($val) && defined($w)) + { + my %pack = @$val; + unless (exists $pack{-side}) + { + $pack{-side} = 'top' unless (exists $pack{-side}); + } + unless (exists $pack{-fill}) + { + $pack{-fill} = 'x' if ($pack{-side} =~ /(top|bottom)/); + $pack{-fill} = 'y' if ($pack{-side} =~ /(left|right)/); + } + unless (exists($pack{'-before'}) || exists($pack{'-after'})) + { + my $before = ($cw->packSlaves)[0]; + $pack{'-before'} = $before if (defined $before); + } + $w->pack(%pack); + } + } + @result = $w->packInfo if (defined $w); + return (wantarray) ? @result : \@result; +} + +sub labelVariable +{ + my ($cw,$val) = @_; + my $var = \$cw->{Configure}{'-labelVariable'}; + if (@_ > 1 && defined $val) + { + $$var = $val; + $$val = '' unless (defined $$val); + my $w = $cw->Subwidget('label'); + unless (defined $w) + { + $cw->labelPack([]); + $w = $cw->Subwidget('label'); + } + $w->configure(-textvariable => $val); + } + return $$var; +} + +sub label +{ + my ($cw,$val) = @_; + my $var = $cw->cget('-labelVariable'); + if (@_ > 1 && defined $val) + { + if (!defined $var) + { + $var = \$cw->{Configure}{'-label'}; + $cw->labelVariable($var); + } + $$var = $val; + } + return (defined $var) ? $$var : undef;; +} + +sub queuePack +{ + my ($cw) = @_; + unless ($cw->{'pack_pending'}) + { + $cw->{'pack_pending'} = 1; + $cw->afterIdle([$cw,'packscrollbars']); + } +} + +sub sbset +{ + my ($cw,$sb,$ref,@args) = @_; + $sb->set(@args); + $cw->queuePack if (@args == 2 && $sb->Needed != $$ref); +} + +sub freeze_on_map +{ + my ($w) = @_; + unless ($w->Tk::bind('Freeze','<Map>')) + { + $w->Tk::bind('Freeze','<Map>',['packPropagate' => 0]) + } + $w->AddBindTag('Freeze'); +} + +sub AddScrollbars +{ + require Tk::Scrollbar; + my ($cw,$w) = @_; + my $def = ''; + my ($x,$y) = ('',''); + my $s = 0; + my $c; + $cw->freeze_on_map; + foreach $c ($w->configure) + { + my $opt = $c->[0]; + if ($opt eq '-yscrollcommand') + { + my $slice = Tk::Frame->new($cw,Name => 'ysbslice'); + my $ysb = Tk::Scrollbar->new($slice,-orient => 'vertical', -command => [ 'yview', $w ]); + my $size = $ysb->cget('-width'); + my $corner = Tk::Frame->new($slice,Name=>'corner','-relief' => 'raised', + '-width' => $size, '-height' => $size); + $ysb->pack(-side => 'left', -fill => 'y'); + $cw->Advertise('yscrollbar' => $ysb); + $cw->Advertise('corner' => $corner); + $cw->Advertise('ysbslice' => $slice); + $corner->{'before'} = $ysb->PathName; + $slice->{'before'} = $w->PathName; + $y = 'w'; + $s = 1; + } + elsif ($opt eq '-xscrollcommand') + { + my $xsb = Tk::Scrollbar->new($cw,-orient => 'horizontal', -command => [ 'xview', $w ]); + $cw->Advertise('xscrollbar' => $xsb); + $xsb->{'before'} = $w->PathName; + $x = 's'; + $s = 1; + } + } + if ($s) + { + $cw->Advertise('scrolled' => $w); + $cw->ConfigSpecs('-scrollbars' => ['METHOD','scrollbars','Scrollbars',$x.$y]); + } +} + +sub packscrollbars +{ + my ($cw) = @_; + my $opt = $cw->cget('-scrollbars'); + my $slice = $cw->Subwidget('ysbslice'); + my $xsb = $cw->Subwidget('xscrollbar'); + my $corner = $cw->Subwidget('corner'); + my $w = $cw->Subwidget('scrolled'); + my $xside = (($opt =~ /n/) ? 'top' : 'bottom'); + my $havex = 0; + my $havey = 0; + $opt =~ s/r//; + $cw->{'pack_pending'} = 0; + if (defined $slice) + { + my $reqy; + my $ysb = $cw->Subwidget('yscrollbar'); + if ($opt =~ /(o)?[we]/ && (($reqy = !defined($1)) || $ysb->Needed)) + { + my $yside = (($opt =~ /w/) ? 'left' : 'right'); + $slice->pack(-side => $yside, -fill => 'y',-before => $slice->{'before'}); + $havey = 1; + if ($reqy) + { + $w->configure(-yscrollcommand => ['set', $ysb]); + } + else + { + $w->configure(-yscrollcommand => ['sbset', $cw, $ysb, \$cw->{'packysb'}]); + } + } + else + { + $w->configure(-yscrollcommand => undef) unless $opt =~ s/[we]//; + $slice->packForget; + } + $cw->{'packysb'} = $havey; + } + if (defined $xsb) + { + my $reqx; + if ($opt =~ /(o)?[ns]/ && (($reqx = !defined($1)) || $xsb->Needed)) + { + $xsb->pack(-side => $xside, -fill => 'x',-before => $xsb->{'before'}); + $havex = 1; + if ($reqx) + { + $w->configure(-xscrollcommand => ['set', $xsb]); + } + else + { + $w->configure(-xscrollcommand => ['sbset', $cw, $xsb, \$cw->{'packxsb'}]); + } + } + else + { + $w->configure(-xscrollcommand => undef) unless $opt =~ s/[ns]//; + $xsb->packForget; + } + $cw->{'packxsb'} = $havex; + } + if (defined $corner) + { + if ($havex && $havey && defined $corner->{'before'}) + { + my $anchor = $opt; + $anchor =~ s/o//g; + $corner->configure(-height => $xsb->ReqHeight); + $corner->pack(-before => $corner->{'before'}, -side => $xside, + -anchor => $anchor, -fill => 'x'); + } + else + { + $corner->packForget; + } + } +} + +sub scrollbars +{ + my ($cw,$opt) = @_; + my $var = \$cw->{'-scrollbars'}; + if (@_ > 1) + { + my $old = $$var; + if (!defined $old || $old ne $opt) + { + $$var = $opt; + $cw->queuePack; + } + } + return $$var; +} + +sub FindMenu +{ + my ($w,$char) = @_; + my $child; + my $match; + foreach $child ($w->children) + { + next unless (ref $child); + $match = $child->FindMenu($char); + return $match if (defined $match); + } + return undef; +} + + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/HList.pm b/Master/tlpkg/tlperl.old/lib/Tk/HList.pm new file mode 100644 index 00000000000..02792208243 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/HList.pm @@ -0,0 +1,680 @@ +package Tk::HList; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #14 $ =~ /\D(\d+)\s*$/; + +use Tk qw(Ev $XS_VERSION); + +use base qw(Tk::Widget); + +Construct Tk::Widget 'HList'; +sub Tk::Widget::ScrlHList { shift->Scrolled('HList'=>@_) } + +bootstrap Tk::HList; + +sub Tk_cmd { \&Tk::hlist } + +sub CreateArgs +{ + my ($package,$parent,$args) = @_; + my @result = $package->SUPER::CreateArgs($parent,$args); + my $columns = delete $args->{-columns}; + push(@result, '-columns' => $columns) if (defined $columns); + return @result; +} + +Tk::Methods qw(add addchild anchor column + delete dragsite dropsite entrycget + entryconfigure geometryinfo indicator header hide item info + nearest see select selection show xview yview); + +use Tk::Submethods ( 'delete' => [qw(all entry offsprings siblings)], + 'header' => [qw(configure cget create delete exists size)], + 'indicator' => [qw(configure cget create delete exists size)], + 'info' => [qw(anchor bbox children data dragsite + dropsite exists hidden item next parent prev + selection)], + 'item' => [qw(configure cget create delete exists)], + 'selection' => [qw(clear get includes set)], + 'anchor' => [qw(clear set)], + 'column' => [qw(width)], + 'hide' => [qw(entry)], + ); + + +sub ClassInit +{ + my ($class,$mw) = @_; + + $mw->bind($class,'<ButtonPress-1>',[ 'Button1' ] ); + $mw->bind($class,'<Shift-ButtonPress-1>',[ 'ShiftButton1' ] ); + $mw->bind($class,'<Control-ButtonRelease-1>','Control_ButtonRelease_1'); + $mw->bind($class,'<ButtonRelease-1>','ButtonRelease_1'); + $mw->bind($class,'<Double-ButtonRelease-1>','NoOp'); + $mw->bind($class,'<B1-Motion>',[ 'Button1Motion' ] ); + $mw->bind($class,'<B1-Leave>',[ 'AutoScan' ] ); + + $mw->bind($class,'<Double-ButtonPress-1>',['Double1']); + + $mw->bind($class,'<Control-B1-Motion>','Control_B1_Motion'); + $mw->bind($class,'<Control-ButtonPress-1>',['CtrlButton1']); + $mw->bind($class,'<Control-Double-ButtonPress-1>',['CtrlButton1']); + + $mw->bind($class,'<B1-Enter>','B1_Enter'); + + $mw->bind($class,'<Up>',['UpDown', 'prev']); + $mw->bind($class,'<Down>',['UpDown', 'next']); + + $mw->bind($class,'<Shift-Up>',['ShiftUpDown', 'prev']); + $mw->bind($class,'<Shift-Down>',['ShiftUpDown', 'next']); + + $mw->bind($class,'<Left>', ['LeftRight', 'left']); + $mw->bind($class,'<Right>',['LeftRight', 'right']); + + $mw->PriorNextBind($class); + $mw->MouseWheelBind($class); + + $mw->bind($class,'<Return>', ['KeyboardActivate']); + $mw->bind($class,'<space>', ['KeyboardBrowse']); + $mw->bind($class,'<Home>', ['KeyboardHome']); + $mw->bind($class,'<End>', ['KeyboardEnd']); + + $mw->YMouseWheelBind($class); + $mw->XMouseWheelBind($class); + + return $class; +} + +sub Control_ButtonRelease_1 +{ +} + +sub ButtonRelease_1 +{ + my $w = shift; + my $Ev = $w->XEvent; + $w->CancelRepeat + if($w->cget('-selectmode') ne 'dragdrop'); + $w->ButtonRelease1($Ev); +} + +sub Control_B1_Motion +{ +} + +sub B1_Enter +{ + my $w = shift; + my $Ev = $w->XEvent; + $w->CancelRepeat + if($w->cget('-selectmode') ne 'dragdrop'); +} + +sub Button1 +{ + my $w = shift; + my $Ev = $w->XEvent; + + delete $w->{'shiftanchor'}; + delete $w->{tixindicator}; + + $w->focus() if($w->cget('-takefocus')); + + my $mode = $w->cget('-selectmode'); + + if ($mode eq 'dragdrop') + { + # $w->Send_WaitDrag($Ev->y); + return; + } + + my $ent = $w->GetNearest($Ev->y, 1); + + if (!defined($ent) || !length($ent)) + { + $w->selectionClear; + $w->anchorClear; + return; + } + + my @info = $w->info('item',$Ev->x, $Ev->y); + if (@info) + { + die 'Assert' unless $info[0] eq $ent; + } + else + { + @info = $ent; + } + + if (defined($info[1]) && $info[1] eq 'indicator') + { + $w->{tixindicator} = $ent; + $w->Callback(-indicatorcmd => $ent, '<Arm>'); + } + else + { + my $browse = 0; + + if ($mode eq 'single') + { + $w->anchorSet($ent); + } + elsif ($mode eq 'browse') + { + $w->anchorSet($ent); + $w->selectionClear; + $w->selectionSet($ent); + $browse = 1; + } + elsif ($mode eq 'multiple') + { + $w->selectionClear; + $w->anchorSet($ent); + $w->selectionSet($ent); + $browse = 1; + } + elsif ($mode eq 'extended') + { + $w->anchorSet($ent); + $w->selectionClear; + $w->selectionSet($ent); + $browse = 1; + } + + if ($browse) + { + $w->Callback(-browsecmd => @info); + } + } +} + +sub ShiftButton1 +{ + my $w = shift; + my $Ev = $w->XEvent; + + my $to = $w->GetNearest($Ev->y, 1); + + delete $w->{'shiftanchor'}; + delete $w->{tixindicator}; + + return unless (defined($to) and length($to)); + + my $mode = $w->cget('-selectmode'); + + if($mode eq 'extended' or $mode eq 'multiple') + { + my $from = $w->info('anchor'); + if(defined $from) + { + $w->selectionClear; + $w->selectionSet($from, $to); + } + else + { + $w->anchorSet($to); + $w->selectionClear; + $w->selectionSet($to); + } + } +} + +sub GetNearest +{ + my ($w,$y,$undefafterend) = @_; + my $ent = $w->nearest($y); + if (defined $ent) + { + if ($undefafterend) + { + my $borderwidth = $w->cget('-borderwidth'); + my $highlightthickness = $w->cget('-highlightthickness'); + my $bottomy = ($w->infoBbox($ent))[3]; + $bottomy += $borderwidth + $highlightthickness; + if ($w->header('exist', 0)) + { + $bottomy += $w->header('height'); + } + if ($y > $bottomy) + { + #print "$y > $bottomy\n"; + return undef; + } + } + my $state = $w->entrycget($ent, '-state'); + return $ent if (!defined($state) || $state ne 'disabled'); + } + return undef; +} + +sub ButtonRelease1 +{ + my ($w, $Ev) = @_; + + delete $w->{'shiftanchor'}; + + my $mode = $w->cget('-selectmode'); + + if($mode eq 'dragdrop') + { +# $w->Send_DoneDrag(); + return; + } + + my ($x, $y) = ($Ev->x, $Ev->y); + my $ent = $w->GetNearest($y, 1); + + if (!defined($ent) and $mode eq 'single') + { + my $ent = $w->info('selection'); + if (defined $ent) + { + $w->anchorSet($ent); + } + } + return unless (defined($ent) and length($ent)); + + if (exists $w->{tixindicator}) + { + return unless delete($w->{tixindicator}) eq $ent; + my @info = $w->info('item',$Ev->x, $Ev->y); + if(defined($info[1]) && $info[1] eq 'indicator') + { + $w->Callback(-indicatorcmd => $ent, '<Activate>'); + } + else + { + $w->Callback(-indicatorcmd => $ent, '<Disarm>'); + } + return; + } + + if($mode eq 'single' || $mode eq 'browse') + { + $w->anchorSet($ent); + $w->selectionClear; + $w->selectionSet($ent); + + } + elsif($mode eq 'multiple') + { + $w->selectionSet($ent); + } + elsif($mode eq 'extended') + { + $w->selectionSet($ent); + } + + $w->Callback(-browsecmd =>$ent); +} + +sub Button1Motion +{ + my $w = shift; + my $Ev = $w->XEvent; + return unless defined $Ev; + + delete $w->{'shiftanchor'}; + + my $mode = $w->cget('-selectmode'); + + if ($mode eq 'dragdrop') + { +# $w->Send_StartDrag(); + return; + } + + my $ent; + if (defined $w->info('anchor')) + { + $ent = $w->GetNearest($Ev->y); + } + else + { + $ent = $w->GetNearest($Ev->y, 1); + } + return unless (defined($ent) and length($ent)); + + if(exists $w->{tixindicator}) + { + my $event_type = $w->{tixindicator} eq $ent ? '<Arm>' : '<Disarm>'; + $w->Callback(-indicatorcmd => $w->{tixindicator}, $event_type ); + return; + } + + if ($mode eq 'single') + { + $w->anchorSet($ent); + } + elsif ($mode eq 'multiple' || $mode eq 'extended') + { + my $from = $w->info('anchor'); + if(defined $from) + { + $w->selectionClear; + $w->selectionSet($from, $ent); + } + else + { + $w->anchorSet($ent); + $w->selectionClear; + $w->selectionSet($ent); + } + } + + if ($mode ne 'single') + { + $w->Callback(-browsecmd =>$ent); + } +} + +sub Double1 +{ + my $w = shift; + my $Ev = $w->XEvent; + + delete $w->{'shiftanchor'}; + + my $ent = $w->GetNearest($Ev->y, 1); + + return unless (defined($ent) and length($ent)); + + $w->anchorSet($ent) + unless(defined $w->info('anchor')); + + $w->selectionSet($ent); + + $w->Callback(-command => $ent); +} + +sub CtrlButton1 +{ + my $w = shift; + my $Ev = $w->XEvent; + + delete $w->{'shiftanchor'}; + + my $ent = $w->GetNearest($Ev->y, 1); + + return unless (defined($ent) and length($ent)); + + my $mode = $w->cget('-selectmode'); + + if($mode eq 'extended') + { + $w->anchorSet($ent) unless( defined $w->info('anchor') ); + + if($w->select('includes', $ent)) + { + $w->select('clear', $ent); + } + else + { + $w->selectionSet($ent); + } + $w->Callback(-browsecmd =>$ent); + } +} + +sub UpDown +{ + my $w = shift; + my $spec = shift; + + my $done = 0; + my $anchor = $w->info('anchor'); + + delete $w->{'shiftanchor'}; + + unless( defined $anchor ) + { + $anchor = ($w->info('children'))[0] || ''; + + return unless (defined($anchor) and length($anchor)); + + if($w->entrycget($anchor, '-state') ne 'disabled') + { + # That's a good anchor + $done = 1; + } + else + { + # We search for the first non-disabled entry (downward) + $spec = 'next'; + } + } + + my $ent = $anchor; + + # Find the prev/next non-disabled entry + # + while(!$done) + { + $ent = $w->info($spec, $ent); + last unless( defined $ent ); + next if( $w->entrycget($ent, '-state') eq 'disabled' ); + next if( $w->info('hidden', $ent) ); + last; + } + + unless( defined $ent ) + { + $w->yview('scroll', $spec eq 'prev' ? -1 : 1, 'unit'); + return; + } + + $w->anchorSet($ent); + $w->see($ent); + + if($w->cget('-selectmode') ne 'single') + { + $w->selectionClear; + $w->selection('set', $ent); + $w->Callback(-browsecmd =>$ent); + } +} + +sub ShiftUpDown +{ + my $w = shift; + my $spec = shift; + + my $mode = $w->cget('-selectmode'); + + return $w->UpDown($spec) + if($mode eq 'single' || $mode eq 'browse'); + + my $anchor = $w->info('anchor'); + + return $w->UpDown($spec) unless (defined($anchor) and length($anchor)); + + my $done = 0; + + $w->{'shiftanchor'} = $anchor unless( $w->{'shiftanchor'} ); + + my $ent = $w->{'shiftanchor'}; + + while( !$done ) + { + $ent = $w->info($spec, $ent); + last unless( defined $ent ); + next if( $w->entrycget($ent, '-state') eq 'disabled' ); + next if( $w->info('hidden', $ent) ); + last; + } + + unless( $ent ) + { + $w->yview('scroll', $spec eq 'prev' ? -1 : 1, 'unit'); + return; + } + + $w->selectionClear; + $w->selection('set', $anchor, $ent); + $w->see($ent); + + $w->{'shiftanchor'} = $ent; + + $w->Callback(-browsecmd =>$ent); +} + +sub LeftRight +{ + my $w = shift; + my $spec = shift; + + delete $w->{'shiftanchor'}; + + my $anchor = $w->info('anchor'); + + unless(defined $anchor) + { + $anchor = ($w->info('children'))[0] || ''; + } + + my $done = 0; + my $ent = $anchor; + + while(!$done) + { + my $e = $ent; + + if($spec eq 'left') + { + $ent = $w->info('parent', $e); + + $ent = $w->info('prev', $e) + unless(defined $ent && $w->entrycget($ent, '-state') ne 'disabled') + } + else + { + $ent = ($w->info('children', $e))[0]; + + $ent = $w->info('next', $e) + unless(defined $ent && $w->entrycget($ent, '-state') ne 'disabled') + } + + last unless( defined $ent ); + last if($w->entrycget($ent, '-state') ne 'disabled'); + } + + unless( defined $ent ) + { + $w->xview('scroll', $spec eq 'left' ? -1 : 1, 'unit'); + return; + } + + $w->anchorSet($ent); + $w->see($ent); + + if($w->cget('-selectmode') ne 'single') + { + $w->selectionClear; + $w->selectionSet($ent); + + $w->Callback(-browsecmd =>$ent); + } +} + +sub KeyboardHome +{ + my $w = shift; + $w->yview('moveto' => 0); + $w->xview('moveto' => 0); +} + +sub KeyboardEnd +{ + my $w = shift; + $w->yview('moveto' => 1); + $w->xview('moveto' => 0); +} + +sub KeyboardActivate +{ + my $w = shift; + + my $anchor = $w->info('anchor'); + + return unless (defined($anchor) and length($anchor)); + + if($w->cget('-selectmode')) + { + $w->selectionClear; + $w->selectionSet($anchor); + } + + $w->Callback(-command => $anchor); +} + +sub KeyboardBrowse +{ + my $w = shift; + + my $anchor = $w->info('anchor'); + + return unless (defined($anchor) and length($anchor)); + + if ($w->indicatorExists($anchor)) + { + $w->Callback(-indicatorcmd => $anchor); + } + + if($w->cget('-selectmode')) + { + $w->selectionClear; + $w->selectionSet($anchor); + } + $w->Callback(-browsecmd =>$anchor); +} + +sub AutoScan +{ + my ($w,$x,$y) = @_; + + return if ($w->cget('-selectmode') eq 'dragdrop'); + if (@_ < 3) + { + my $Ev = $w->XEvent; + return unless defined $Ev; + $y = $Ev->y; + $x = $Ev->x; + } + + if($y >= $w->height) + { + $w->yview('scroll', 1, 'units'); + } + elsif($y < 0) + { + $w->yview('scroll', -1, 'units'); + } + elsif($x >= $w->width) + { + $w->xview('scroll', 2, 'units'); + } + elsif($x < 0) + { + $w->xview('scroll', -2, 'units'); + } + else + { + return; + } + $w->RepeatId($w->SUPER::after(50,[ AutoScan => $w, $x, $y ])); + $w->Button1Motion; +} + +sub children +{ + # Tix has core-tk window(s) which are not a widget(s) + # the generic code returns these as an "undef" + my $w = shift; + my @info = grep(defined($_),$w->winfo('children')); + @info; +} + +1; + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/IO.pm b/Master/tlpkg/tlperl.old/lib/Tk/IO.pm new file mode 100644 index 00000000000..771e9f7103a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/IO.pm @@ -0,0 +1,182 @@ +package Tk::IO; +use strict; +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/IO/IO.pm#4 $ + +require 5.002; +use Tk::Event qw($XS_VERSION); + +use Carp; +use base qw(DynaLoader IO::Handle); + +bootstrap Tk::IO; + +my %fh2obj; +my %obj2fh; + +sub new +{ + my ($package,%args) = @_; + # Do whatever IO::Handle does + my $fh = $package->SUPER::new; + %{*$fh} = (); # The hash is used for configure options + ${*$fh} = ''; # The scalar is used as the 'readable' buffer + @{*$fh} = (); # The array + $fh->configure(%args); + return $fh; +} + +sub pending +{ + my $fh = shift; + return ${*$fh}; +} + +sub cget +{ + my ($fh,$key) = @_; + return ${*$fh}{$key}; +} + +sub configure +{ + my ($fh,%args) = @_; + my $key; + foreach $key (keys %args) + { + my $val = $args{$key}; + $val = Tk::Callback->new($val) if ($key =~ /command$/); + ${*$fh}{$key} = $val; + } +} + +sub killpg +{ + my ($fh,$sig) = @_; + my $pid = $fh->pid; + croak 'No child' unless (defined $pid); + kill($sig,-$pid); +} + +sub kill +{ + my ($fh,$sig) = @_; + my $pid = $fh->pid; + croak 'No child' unless (defined $pid); + kill($sig,$pid) || croak "Cannot kill($sig,$pid):$!"; +} + +sub readable +{ + my $fh = shift; + my $count = sysread($fh,${*$fh},1,length(${*$fh})); + if ($count < 0) + { + if (exists ${*$fh}{-errorcommand}) + { + ${*$fh}{-errorcommand}->Call($!); + } + else + { + warn "Cannot read $fh:$!"; + $fh->close; + } + } + elsif ($count) + { + if (exists ${*$fh}{-linecommand}) + { + my $eol = index(${*$fh},"\n"); + if ($eol >= 0) + { + my $line = substr(${*$fh},0,++$eol); + substr(${*$fh},0,$eol) = ''; + ${*$fh}{-linecommand}->Call($line); + } + } + } + else + { + $fh->close; + } +} + +sub pid +{ + my $fh = shift; + return ${*$fh}{-pid}; +} + +sub command +{ + my $fh = shift; + my $cmd = ${*$fh}{'-exec'}; + return (wantarray) ? @$cmd : $cmd; +} + +sub exec +{ + my $fh = shift; + my $pid = open($fh,'-|'); + if ($pid) + { + ${*$fh} = '' unless (defined ${*$fh}); + ${*$fh}{'-exec'} = [@_]; + ${*$fh}{'-pid'} = $pid; + if (exists ${*$fh}{-linecommand}) + { + my $w = ${*$fh}{-widget}; + $w = 'Tk' unless (defined $w); + $w->fileevent($fh,'readable',[$fh,'readable']); + ${*$fh}{_readable} = $w; + } + else + { + croak Tk::Pretty::Pretty(\%{*$fh}); + } + return $pid; + } + else + { + # make STDERR same as STDOUT here + setpgrp; + exec(@_) || die 'Cannot exec ',join(' ',@_),":$!"; + } +} + +sub wait +{ + my $fh = shift; + my $code; + my $ch = delete ${*$fh}{-childcommand}; + ${*$fh}{-childcommand} = Tk::Callback->new(sub { $code = shift }); + Tk::Event::DoOneEvent(0) until (defined $code); + if (defined $ch) + { + ${*$fh}{-childcommand} = $ch; + $ch->Call($code,$fh) + } + return $code; +} + +sub close +{ + my $fh = shift; + my $code; + if (defined fileno($fh)) + { + my $w = delete ${*$fh}{_readable}; + $w->fileevent($fh,'readable','') if (defined $w); + $code = close($fh); + if (exists ${*$fh}{-childcommand}) + { + ${*$fh}{-childcommand}->Call($?,$fh); + } + } + return $code; +} + +1; +__END__ + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/IconList.pm b/Master/tlpkg/tlperl.old/lib/Tk/IconList.pm new file mode 100644 index 00000000000..1972809ea2a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/IconList.pm @@ -0,0 +1,712 @@ +# -*- perl -*- +# +# tkfbox.tcl -- +# +# Implements the "TK" standard file selection dialog box. This +# dialog box is used on the Unix platforms whenever the tk_strictMotif +# flag is not set. +# +# The "TK" standard file selection dialog box is similar to the +# file selection dialog box on Win95(TM). The user can navigate +# the directories by clicking on the folder icons or by +# selectinf the "Directory" option menu. The user can select +# files by clicking on the file icons or by entering a filename +# in the "Filename:" entry. +# +# Copyright (c) 1994-1996 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +# Translated to perk/Tk and modified by Slaven Rezic <slaven@rezic.de>. +# + +#---------------------------------------------------------------------- +# +# I C O N L I S T +# +# This is a pseudo-widget that implements the icon list inside the +# tkFDialog dialog box. +# +#---------------------------------------------------------------------- +# tkIconList -- +# +# Creates an IconList widget. +# + +package Tk::IconList; +require Tk::Frame; + +use vars qw($VERSION); +$VERSION = '4.007'; # $Id: //depot/Tkutf8/Tk/IconList.pm#7 $ + +use Tk qw(Ev); +use strict; +use Carp; + +use base 'Tk::Frame'; + +Construct Tk::Widget 'IconList'; + +# tkIconList_Create -- +# +# Creates an IconList widget by assembling a canvas widget and a +# scrollbar widget. Sets all the bindings necessary for the IconList's +# operations. +# +sub Populate { + my($w, $args) = @_; + $w->SUPER::Populate($args); + + my $sbar = $w->Component('Scrollbar' => 'sbar', + -orient => 'horizontal', + -highlightthickness => 0, + -takefocus => 0, + ); + # make sure that the size does not exceed handhelds' dimensions + my($sw,$sh) = ($w->screenwidth, $w->screenheight); + my $canvas = $w->Component('Canvas' => 'canvas', + -bd => 2, + -relief => 'sunken', + -width => ($sw > 420 ? 400 : $sw-20), + -height => ($sh > 160 ? 120 : $sh-40), + -takefocus => 1, + ); + $sbar->pack(-side => 'bottom', -fill => 'x', -padx => 2); + $canvas->pack(-expand => 'yes', -fill => 'both'); + $sbar->configure(-command => ['xview', $canvas]); + $canvas->configure(-xscrollcommand => ['set', $sbar]); + + # Initializes the max icon/text width and height and other variables + $w->{'maxIW'} = 1; + $w->{'maxIH'} = 1; + $w->{'maxTW'} = 1; + $w->{'maxTH'} = 1; + $w->{'numItems'} = 0; +#XXX curItem never used delete $w->{'curItem'}; + $w->{'noScroll'} = 1; + $w->{'selection'} = []; + $w->{'index,anchor'} = ''; + + # Creates the event bindings. + $canvas->Tk::bind('<Configure>', sub { $w->Arrange } ); + $canvas->Tk::bind('<1>', [$w,'Btn1',Ev('x'),Ev('y')]); + $canvas->Tk::bind('<B1-Motion>', [$w,'Motion1',Ev('x'),Ev('y')]); + $canvas->Tk::bind('<Control-B1-Motion>', 'NoOp'); + $canvas->Tk::bind('<Shift-B1-Motion>', 'NoOp'); + $canvas->Tk::bind('<Control-1>', [$w,'CtrlBtn1',Ev('x'),Ev('y')]); + $canvas->Tk::bind('<Shift-1>', [$w,'ShiftBtn1',Ev('x'),Ev('y')]); + $canvas->Tk::bind('<Double-ButtonRelease-1>', [$w,'Double1',Ev('x'),Ev('y')]); + $canvas->Tk::bind('<Control-Double-ButtonRelease-1>', 'NoOp'); + $canvas->Tk::bind('<Shift-Double-ButtonRelease-1>', 'NoOp'); + $canvas->Tk::bind('<ButtonRelease-1>', [$w,'CancelRepeat']); + $canvas->Tk::bind('<B1-Leave>', [$w,'Leave1',Ev('x'),Ev('y')]); + $canvas->Tk::bind('<B1-Enter>', [$w,'CancelRepeat']); + $canvas->Tk::bind('<Up>', [$w,'UpDown', -1]); + $canvas->Tk::bind('<Down>', [$w,'UpDown', 1]); + $canvas->Tk::bind('<Left>', [$w,'LeftRight',-1]); + $canvas->Tk::bind('<Right>', [$w,'LeftRight', 1]); + $canvas->Tk::bind('<Return>', [$w,'ReturnKey']); + $canvas->Tk::bind('<KeyPress>', [$w,'KeyPress',Ev('A')]); + $canvas->Tk::bind('<Control-KeyPress>', 'NoOp'); + $canvas->Tk::bind('<Alt-KeyPress>', 'NoOp'); + $canvas->Tk::bind('<Meta-KeyPress>', 'NoOp'); +#XXX bad.... +# $canvas->Tk::bind('<FocusIn>', sub { $w->FocusIn }); +# $canvas->Tk::bind('<FocusOut>', sub { $w->FocusOut }); + + # additional bindings not in tkfbox.tcl + $canvas->Tk::bind('<2>',['scan','mark',Ev('x'),Ev('y')]); + $canvas->Tk::bind('<B2-Motion>',['scan','dragto',Ev('x'),Ev('y')]); + # Remove the standard Canvas bindings + $canvas->bindtags([$canvas, $canvas->toplevel, 'all']); + # ... and define some again + $canvas->Tk::bind('<Home>', ['xview','moveto',0]); + $canvas->Tk::bind('<End>', ['xview','moveto',1]); + + $w->ConfigSpecs(-browsecmd => + ['METHOD', 'browseCommand', 'BrowseCommand', undef], + -command => + ['CALLBACK', 'command', 'Command', undef], + -font => + ['PASSIVE', 'font', 'Font', undef], + -foreground => + ['PASSIVE', 'foreground', 'Foreground', undef], + -fg => '-foreground', + -multiple => + ['PASSIVE', 'multiple', 'Multiple', 0], + -selectmode => + ['PASSIVE', 'selectMode', 'SelectMode', 'browse'], + -selectbackground => + ['PASSIVE', 'selectBackground', 'Foreground', '#a0a0ff'], + ); + + $w; +} + +# compatibility for old -browsecmd options +sub browsecmd { + my $w = shift; + if (@_) { + $w->{Configure}{'-browsecmd'} = $_[0]; + $w->bind('<<ListboxSelect>>' => $_[0]); + } + $w->{Configure}{'-browsecmd'}; +} + +sub Index { + my($w, $i) = @_; + if (!$w->{'list'}) { $w->{'list'} = [] } + if ($i =~ /^-?[0-9]+$/) { + if ($i < 0) { + $i = 0; + } + if ($i > @{ $w->{'list'} }) { + $i = @{ $w->{'list'} } - 1; + } + return $i; + } elsif ($i eq 'active') { + return $w->{'index,active'}; + } elsif ($i eq 'anchor') { + return $w->{'index,anchor'}; + } elsif ($i eq 'end') { + return @{ $w->{'list'} }; + } elsif ($i =~ /@(-?[0-9]+),(-?[0-9]+)/) { + my($x, $y) = ($1, $2); + my $canvas = $w->Subwidget('canvas'); + my $item = $canvas->find('closest', $x, $y); + if (defined $item) { + return $canvas->itemcget($item, '-tags')->[1]; + } else { + return ""; + } + } else { + croak "Unrecognized Index parameter `$i', use active, anchor, end, \@x,y, or x"; + } +} + +sub Selection { + my($w, $op, @args) = @_; + if ($op eq 'anchor') { + if (@args == 1) { + $w->{'index,anchor'} = $w->Index($args[0]); + } else { + return $w->{'index,anchor'}; + } + } elsif ($op eq 'clear') { + my($first, $last); + if (@args == 2) { + ($first, $last) = @args; + } elsif (@args == 1) { + $first = $last = $args[0]; + } else { + croak "wrong # args: should be Selection('clear', first, ?last?)" + } + $first = $w->Index($first); + $last = $w->Index($last); + if ($first > $last) { + ($first, $last) = ($last, $first); + } + my $ind = 0; + for my $item (@{ $w->{'selection'} }) { + if ($item >= $first) { + $first = $ind; + last; + } + $ind++; # XXX seems to be missing in the Tcl version + } + $ind = @{ $w->{'selection'} } - 1; + for(; $ind >= 0; $ind--) { + my $item = $w->{'selection'}->[$ind]; + if ($item <= $last) { + $last = $ind; + last; + } + } + if ($first > $last) { + return; + } + splice @{ $w->{'selection'} }, $first, $last-$first+1; + $w->event('generate', '<<ListboxSelect>>'); + $w->DrawSelection; + } elsif ($op eq 'includes') { + my $index; + for (@{ $w->{'selection'} }) { + if ($args[0] eq $_) { + return 1; + } + } + return 0; + } elsif ($op eq 'set') { + my($first, $last); + if (@args == 2) { + ($first, $last) = @args; + } elsif (@args == 1) { + $first = $last = $args[0]; + } else { + croak "wrong # args: should be Selection('set', first, ?last?)"; + } + + $first = $w->Index($first); + $last = $w->Index($last); + if ($first > $last) { + ($first, $last) = ($last, $first); + } + for(my $i = $first; $i <= $last; $i++) { + push @{ $w->{'selection'} }, $i; + } + # lsort -integer -unique + my %sel = map { ($_ => 1) } @{ $w->{'selection'} }; + @{ $w->{'selection'} } = sort { $a <=> $b } keys %sel; + $w->event('generate', '<<ListboxSelect>>'); + $w->DrawSelection; + } else { + croak "Unrecognized Selection parameter `$op', use anchor, clear, includes, or set"; + } +} + +# XXX why lower case 's' here and upper in DrawSelection? +sub Curselection { + my $w = shift; + @{ $w->{'selection'} }; +} + +sub DrawSelection { + my $w = shift; + my $canvas = $w->Subwidget('canvas'); + $canvas->delete('selection'); + my $selBg = $w->cget('-selectbackground'); + for my $item (@{ $w->{'selection'} }) { + my $rTag = $w->{'list'}->[$item][2]; + my($iTag, $tTag, $text, $serial) = @{ $w->{'itemList'}{$rTag} }; + my @bbox = $canvas->bbox($tTag); + # XXX don't hardcode colors + $canvas->createRectangle + (@bbox, -fill => $selBg, -outline => $selBg, -tags => 'selection'); + } + $canvas->lower('selection'); +} + +# Returns the selected item +# +sub Get { + my($w, $item) = @_; + my $rTag = $w->{'list'}->[$item][2]; + my($iTag, $tTag, $text, $serial) = @{ $w->{'itemList'}{$rTag} }; + $text; +} + + +# tkIconList_AutoScan -- +# +# This procedure is invoked when the mouse leaves an entry window +# with button 1 down. It scrolls the window up, down, left, or +# right, depending on where the mouse left the window, and reschedules +# itself as an "after" command so that the window continues to scroll until +# the mouse moves back into the window or the mouse button is released. +# +# Arguments: +# w - The IconList window. +# +sub AutoScan { + my $w = shift; + return unless ($w->exists); + return if ($w->{'noScroll'}); + my($x, $y); + $x = $Tk::x; + $y = $Tk::y; + my $canvas = $w->Subwidget('canvas'); + if ($x >= $canvas->width) { + $canvas->xview('scroll', 1, 'units'); + } elsif ($x < 0) { + $canvas->xview('scroll', -1, 'units'); + } elsif ($y >= $canvas->height) { + # do nothing + } elsif ($y < 0) { + # do nothing + } else { + return; + } + $w->Motion1($x, $y); + $w->RepeatId($w->after(50, ['AutoScan', $w])); +} + +# Deletes all the items inside the canvas subwidget and reset the IconList's +# state. +# +sub DeleteAll { + my $w = shift; + my $canvas = $w->Subwidget('canvas'); + $canvas->delete('all'); + delete $w->{'selected'}; + delete $w->{'rect'}; + delete $w->{'list'}; + delete $w->{'itemList'}; + $w->{'maxIW'} = 1; + $w->{'maxIH'} = 1; + $w->{'maxTW'} = 1; + $w->{'maxTH'} = 1; + $w->{'numItems'} = 0; +#XXX curItem never used delete $w->{'curItem'}; + $w->{'noScroll'} = 1; + $w->{'selection'} = []; + $w->{'index,anchor'} = ''; + $w->Subwidget('sbar')->set(0.0, 1.0); + $canvas->xview('moveto', 0); +} + +# Adds an icon into the IconList with the designated image and items +# +sub Add { + my($w, $image, @items) = @_; + my $canvas = $w->Subwidget('canvas'); + my $font = $w->cget(-font); + my $fg = $w->cget(-foreground); + foreach my $text (@items) { + my $iTag = $canvas->createImage + (0, 0, -image => $image, -anchor => 'nw', + -tags => ['icon', $w->{numItems}, 'item'.$w->{numItems}], + ); + my $tTag = $canvas->createText + (0, 0, -text => $text, -anchor => 'nw', + (defined $fg ? (-fill => $fg) : ()), + (defined $font ? (-font => $font) : ()), + -tags => ['text', $w->{numItems}, 'item'.$w->{numItems}], + ); + my $rTag = $canvas->createRectangle + (0, 0, 0, 0, + -fill => undef, + -outline => undef, + -tags => ['rect', $w->{numItems}, 'item'.$w->{numItems}], + ); + my(@b) = $canvas->bbox($iTag); + my $iW = $b[2] - $b[0]; + my $iH = $b[3] - $b[1]; + $w->{'maxIW'} = $iW if ($w->{'maxIW'} < $iW); + $w->{'maxIH'} = $iH if ($w->{'maxIH'} < $iH); + @b = $canvas->bbox($tTag); + my $tW = $b[2] - $b[0]; + my $tH = $b[3] - $b[1]; + $w->{'maxTW'} = $tW if ($w->{'maxTW'} < $tW); + $w->{'maxTH'} = $tH if ($w->{'maxTH'} < $tH); + push @{ $w->{'list'} }, [$iTag, $tTag, $rTag, $iW, $iH, $tW, $tH, + $w->{'numItems'}]; + $w->{'itemList'}{$rTag} = [$iTag, $tTag, $text, $w->{'numItems'}]; + $w->{'textList'}{$w->{'numItems'}} = lc($text); + ++$w->{'numItems'}; + } +} + +# Places the icons in a column-major arrangement. +# +sub Arrange { + my $w = shift; + my $canvas = $w->Subwidget('canvas'); + my $sbar = $w->Subwidget('sbar'); + unless (exists $w->{'list'}) { + if (defined $canvas && Tk::Exists($canvas)) { + $w->{'noScroll'} = 1; + $sbar->configure(-command => sub { }); + } + return; + } + + my $W = $canvas->width; + my $H = $canvas->height; + my $pad = $canvas->cget(-highlightthickness) + $canvas->cget(-bd); + $pad = 2 if ($pad < 2); + $W -= $pad*2; + $H -= $pad*2; + my $dx = $w->{'maxIW'} + $w->{'maxTW'} + 8; + my $dy; + if ($w->{'maxTH'} > $w->{'maxIH'}) { + $dy = $w->{'maxTH'}; + } else { + $dy = $w->{'maxIH'}; + } + $dy += 2; + my $shift = $w->{'maxIW'} + 4; + my $x = $pad * 2; + my $y = $pad; + my $usedColumn = 0; + foreach my $sublist (@{ $w->{'list'} }) { + $usedColumn = 1; + my($iTag, $tTag, $rTag, $iW, $iH, $tW, $tH) = @$sublist; + my $i_dy = ($dy - $iH) / 2; + my $t_dy = ($dy - $tH) / 2; + $canvas->coords($iTag, $x, $y + $i_dy); + $canvas->coords($tTag, $x + $shift, $y + $t_dy); + $canvas->coords($rTag, $x, $y, $x + $dx, $y + $dy); + $y += $dy; + if ($y + $dy > $H) { + $y = $pad; + $x += $dx; + $usedColumn = 0; + } + } + my $sW; + if ($usedColumn) { + $sW = $x + $dx; + } else { + $sW = $x; + } + if ($sW < $W) { + $canvas->configure(-scrollregion => [$pad, $pad, $sW, $H]); + $sbar->configure(-command => sub { }); + $canvas->xview(moveto => 0); + $w->{'noScroll'} = 1; + } else { + $canvas->configure(-scrollregion => [$pad, $pad, $sW, $H]); + $sbar->configure(-command => ['xview', $canvas]); + $w->{'noScroll'} = 0; + } + $w->{'itemsPerColumn'} = int(($H - $pad) / $dy); + $w->{'itemsPerColumn'} = 1 if ($w->{'itemsPerColumn'} < 1); +#XXX $w->Select($w->{'list'}[$w->{'curItem'}][2], 0) +# if (exists $w->{'curItem'}); + $w->DrawSelection; # missing in Tcl XXX +} + +# Gets called when the user invokes the IconList (usually by double-clicking +# or pressing the Return key). +# +sub Invoke { + my $w = shift; + $w->Callback(-command => $w->{'selected'}) if (@{ $w->{'selection'} }); +} + +# tkIconList_See -- +# +# If the item is not (completely) visible, scroll the canvas so that +# it becomes visible. +sub See { + my($w, $rTag) = @_; + return if ($w->{'noScroll'}); + return if ($rTag < 0 || $rTag >= @{ $w->{'list'} }); + my $canvas = $w->Subwidget('canvas'); + my(@sRegion) = @{ $canvas->cget('-scrollregion') }; + return unless (@sRegion); + my(@bbox) = $canvas->bbox('item'.$rTag); + my $pad = $canvas->cget(-highlightthickness) + $canvas->cget(-bd); + my $x1 = $bbox[0]; + my $x2 = $bbox[2]; + $x1 -= $pad * 2; + $x2 -= $pad; + my $cW = $canvas->width - $pad * 2; + my $scrollW = $sRegion[2] - $sRegion[0] + 1; + my $dispX = int(($canvas->xview)[0] * $scrollW); + my $oldDispX = $dispX; + # check if out of the right edge + $dispX = $x2 - $cW if ($x2 - $dispX >= $cW); + # check if out of the left edge + $dispX = $x1 if ($x1 - $dispX < 0); + if ($oldDispX != $dispX) { + my $fraction = $dispX / $scrollW; + $canvas->xview('moveto', $fraction); + } +} + +sub Btn1 { + my($w, $x, $y) = @_; + + my $canvas = $w->Subwidget('canvas'); + $canvas->CanvasFocus; + $x = int($canvas->canvasx($x)); + $y = int($canvas->canvasy($y)); + my $i = $w->Index('@'.$x.','.$y); + return if ($i eq ''); + $w->Selection('clear', 0, 'end'); + $w->Selection('set', $i); + $w->Selection('anchor', $i); +} + +sub CtrlBtn1 { + my($w, $x, $y) = @_; + + if ($w->cget(-multiple)) { + my $canvas = $w->Subwidget('canvas'); + $canvas->CanvasFocus; + my $x = int($canvas->canvasx($x)); + my $y = int($canvas->canvasy($y)); + my $i = $w->Index('@'.$x.','.$y); + return if ($i eq ''); + if ($w->Selection('includes', $i)) { + $w->Selection('clear', $i); + } else { + $w->Selection('set', $i); + $w->Selection('anchor', $i); + } + } +} + +sub ShiftBtn1 { + my($w, $x, $y) = @_; + + if ($w->cget(-multiple)) { + my $canvas = $w->Subwidget('canvas'); + $canvas->CanvasFocus; + my $x = int($canvas->canvasx($x)); + my $y = int($canvas->canvasy($y)); + my $i = $w->Index('@'.$x.','.$y); + return if ($i eq ''); + my $a = $w->Index('anchor'); + if ($a eq '') { + $a = $i; + } + $w->Selection('clear', 0, 'end'); + $w->Selection('set', $a, $i); + } +} + +# Gets called on button-1 motions +# +sub Motion1 { + my($w, $x, $y) = @_; + $Tk::x = $x; + $Tk::y = $y; + my $canvas = $w->Subwidget('canvas'); + $canvas->CanvasFocus; + $x = int($canvas->canvasx($x)); + $y = int($canvas->canvasy($y)); + my $i = $w->Index('@'.$x.','.$y); + return if ($i eq ''); + $w->Selection('clear', 0, 'end'); + $w->Selection('set', $i); +} + +sub Double1 { + my($w, $x, $y) = @_; + $w->Invoke if (@{ $w->{'selection'} }); +} + +sub ReturnKey { + my $w = shift; + $w->Invoke; +} + +sub Leave1 { + my($w, $x, $y) = @_; + $Tk::x = $x; + $Tk::y = $y; + $w->AutoScan; +} + +sub FocusIn { + my $w = shift; + return unless (exists $w->{'list'}); + if (@{ $w->{'selection'} }) { + $w->DrawSelection; + } +} + +sub FocusOut { + my $w = shift; + $w->Selection('clear', 0, 'end'); +} + +# tkIconList_UpDown -- +# +# Moves the active element up or down by one element +# +# Arguments: +# w - The IconList widget. +# amount - +1 to move down one item, -1 to move back one item. +# +sub UpDown { + my($w, $amount) = @_; + return unless (exists $w->{'list'}); + my $i; + my(@curr) = $w->Curselection; + if (!@curr) { + $i = 0; + } else { + $i = $w->Index('anchor'); + return if ($i eq ''); + $i += $amount; + } + $w->Selection('clear', 0, 'end'); + $w->Selection('set', $i); + $w->Selection('anchor', $i); + $w->See($i); +} + +# tkIconList_LeftRight -- +# +# Moves the active element left or right by one column +# +# Arguments: +# w - The IconList widget. +# amount - +1 to move right one column, -1 to move left one column. +# +sub LeftRight { + my($w, $amount) = @_; + return unless (exists $w->{'list'}); + my $i; + my(@curr) = $w->Curselection; + if (!@curr) { + $i = 0; + } else { + $i = $w->Index('anchor'); + return if ($i eq ''); + $i += $amount*$w->{'itemsPerColumn'}; + } + $w->Selection('clear', 0, 'end'); + $w->Selection('set', $i); + $w->Selection('anchor', $i); + $w->See($i); +} + +#---------------------------------------------------------------------- +# Accelerator key bindings +#---------------------------------------------------------------------- +# tkIconList_KeyPress -- +# +# Gets called when user enters an arbitrary key in the listbox. +# +sub KeyPress { + my($w, $key) = @_; + $w->{'_ILAccel'} .= $key; + $w->Goto($w->{'_ILAccel'}); + eval { + $w->afterCancel($w->{'_ILAccel_afterid'}); + }; + $w->{'_ILAccel_afterid'} = $w->after(500, ['Reset', $w]); +} + +sub Goto { + my($w, $text) = @_; + return unless (exists $w->{'list'}); + return if (not defined $text or $text eq ''); +#XXX curItem never used my $start = (!exists $w->{'curItem'} ? 0 : $w->{'curItem'}); + my $start = 0; + $text = lc($text); + my $theIndex = -1; + my $less = 0; + my $len = length($text); + my $i = $start; + # Search forward until we find a filename whose prefix is an exact match + # with $text + while (1) { + my $sub = substr($w->{'textList'}{$i}, 0, $len); + if ($text eq $sub) { + $theIndex = $i; + last; + } + ++$i; + $i = 0 if ($i == $w->{'numItems'}); + last if ($i == $start); + } + if ($theIndex > -1) { + $w->Selection(qw(clear 0 end)); + $w->Selection('set', $theIndex); + $w->Selection('anchor', $theIndex); + $w->See($theIndex); + } +} + +sub Reset { + my $w = shift; + undef $w->{'_ILAccel'}; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Image.pm b/Master/tlpkg/tlperl.old/lib/Tk/Image.pm new file mode 100644 index 00000000000..0f41c387fc2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Image.pm @@ -0,0 +1,74 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::Image; + +# This module does for images what Tk::Widget does for widgets: +# provides a base class for them to inherit from. +require DynaLoader; + +use base qw(DynaLoader Tk); # but are they ? + +use vars qw($VERSION); +$VERSION = '4.011'; # $Id: //depot/Tkutf8/Tk/Image.pm#11 $ + +sub new +{ + my $package = shift; + my $widget = shift; + $package->InitClass($widget); + my $leaf = $package->Tk_image; + my $obj = $widget->Tk::image('create',$leaf,@_); + $obj = $widget->_object($obj) unless (ref $obj); + return bless $obj,$package; +} + +sub Install +{ + # Dynamically loaded image types can install standard images here + my ($class,$mw) = @_; +} + +sub ClassInit +{ + # Carry out class bindings (or whatever) + my ($package,$mw) = @_; + return $package; +} + +require Tk::Submethods; + +Direct Tk::Submethods ('image' => [qw(delete width height type)]); + +sub Tk::Widget::imageNames +{ + my $w = shift; + $w->image('names',@_); +} + +sub Tk::Widget::imageTypes +{ + my $w = shift; + map("\u$_",$w->image('types',@_)); +} + +sub Construct +{ + my ($base,$name) = @_; + my $class = (caller(0))[0]; + + # Hack for broken ->isa in perl5.6.0 + delete ${"$class\::"}{'::ISA::CACHE::'} if $] == 5.006; + + *{"Tk::Widget::$name"} = sub { $class->new(@_) }; +} + +# This is here to prevent AUTOLOAD trying to find it. +sub DESTROY +{ + my $i = shift; + # maybe do image delete ??? +} + + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/ItemStyle.pm b/Master/tlpkg/tlperl.old/lib/Tk/ItemStyle.pm new file mode 100644 index 00000000000..85c6c11a76c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/ItemStyle.pm @@ -0,0 +1,38 @@ +package Tk::ItemStyle; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Tk/ItemStyle.pm#4 $ + +require Tk; +use base qw(Tk); +require Tk::Widget; +Construct Tk::Widget 'ItemStyle'; + +Tk::Methods ('delete'); + +sub new +{ + my $package = shift; + my $widget = shift; + my $type = shift; + my %args = @_; + $args{'-refwindow'} = $widget unless exists $args{'-refwindow'}; + $package->InitClass($widget); + my $obj = $widget->itemstyle($type, %args); + return bless $obj,$package; +} + +sub Install +{ + # Dynamically loaded image types can install standard images here + my ($class,$mw) = @_; +} + +sub ClassInit +{ + # Carry out class bindings (or whatever) + my ($package,$mw) = @_; + return $package; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/JPEG.pm b/Master/tlpkg/tlperl.old/lib/Tk/JPEG.pm new file mode 100644 index 00000000000..9e0ef771f77 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/JPEG.pm @@ -0,0 +1,50 @@ +package Tk::JPEG; +require DynaLoader; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #2$ =~ /\D(\d+)\s*$/; +use Tk 800.015; +require Tk::Image; +require Tk::Photo; +require DynaLoader; + +use vars qw($VERSION $XS_VERSION); + +@ISA = qw(DynaLoader); + +$XS_VERSION = $Tk::VERSION; +bootstrap Tk::JPEG; + +1; + +__END__ + +=head1 NAME + +Tk::JPEG - JPEG loader for Tk::Photo + +=head1 SYNOPSIS + + use Tk; + use Tk::JPEG; + + my $image = $widget->Photo('-format' => 'jpeg', -file => 'something.jpg'); + + +=head1 DESCRIPTION + +This is an extension for Tk800.015 and later which supplies +JPEG format loader for Photo image type. + +This version also works with Tk804 series. + +JPEG access is via release 5 of the The Independent JPEG Group's (IJG) +free JPEG software. + +=head1 AUTHOR + +Nick Ing-Simmons E<lt>nick@ing-simmons.netE<gt> + +=cut + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/LabEntry.pm b/Master/tlpkg/tlperl.old/lib/Tk/LabEntry.pm new file mode 100644 index 00000000000..64cb392fa8c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/LabEntry.pm @@ -0,0 +1,31 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package Tk::LabEntry; + +use vars qw($VERSION); +$VERSION = '4.006'; # $Id: //depot/Tkutf8/Tk/LabEntry.pm#6 $ + +use base qw(Tk::Frame); +use Tk::widgets qw(Frame Label Entry); + +Construct Tk::Widget 'LabEntry'; + +sub Populate +{ + require Tk::Entry; + # LabeledEntry constructor. + # + my($cw, $args) = @_; + $cw->SUPER::Populate($args); + # Advertised subwidgets: entry. + my $e = $cw->Entry(); + $e->pack('-expand' => 1, '-fill' => 'both'); + $cw->Advertise('entry' => $e ); + $cw->ConfigSpecs(DEFAULT => [$e]); + $cw->Delegates(DEFAULT => $e); + $cw->AddScrollbars($e) if (exists $args->{-scrollbars}); +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/LabFrame.pm b/Master/tlpkg/tlperl.old/lib/Tk/LabFrame.pm new file mode 100644 index 00000000000..6fcab1acc56 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/LabFrame.pm @@ -0,0 +1,138 @@ +# +# Labeled frame. Derives from Tk::Frame, but intercepts the labeling +# part. + +package Tk::LabFrame; + +use vars qw($VERSION); +$VERSION = '4.010'; # $Id: //depot/Tkutf8/Tixish/LabFrame.pm#11 $ + +use Tk; +use base qw(Tk::Frame); +Tk::Widget->Construct('LabFrame'); + +sub autoLabel { 0 } + +sub Populate { + my ($cw, $args) = @_; + + $cw->{m_geoMgr} = ""; + + my $border = $cw->Component( + Frame => 'border', + -relief => 'groove', + -bd => 2, + ); + + my $pad = $border->Frame; + $cw->Advertise(pad => $pad); + + my $frame = $border->Frame; + $cw->Advertise(frame => $frame); + + my $label = $cw->Component(Label => 'label'); + + $cw->SUPER::Populate($args); + + $cw->Delegates(DEFAULT => $frame); + $cw->ConfigSpecs( + -background => [[qw/SELF ADVERTISED/], + qw/background Background/], + -borderwidth => [$border, qw/borderWidth Border 2/], + -font => [$label, qw/font Font/], + -foreground => [$label, qw/foreground Foreground black/], + -label => [{-text => $label}, qw/label Label/], + -labelside => [qw/METHOD labelSide LabelSide acrosstop/], + -labelvariable => [{-textvariable => $label}], + -relief => [$border, qw/relief Relief groove/], + DEFAULT => [$frame] + ); + return $cw; +} + +use Tk::Submethods( + form => [qw/check forget grid info slaves/], + grid => [qw/bbox columnconfigure configure forget info location + propagate rowconfigure remove size slaves/], + pack => [qw/forget info propagate slaves/], + place => [qw/forget info slaves/] +); + +sub labelside { + my ($cw, $side) = @_; + return $cw->{Configure}{-labelside} unless $side; + + my $border = $cw->Subwidget('border'); + my $pad = $cw->Subwidget('pad'); + my $frame = $cw->Subwidget('frame'); + my $label = $cw->Subwidget('label'); + + ## packForget/formForget as appropriate + foreach ($border, $label, $pad, $frame) { + $_->formForget if $cw->{m_geoMgr} eq "form"; + $_->packForget if ($cw->{m_geoMgr} eq "pack" && $_->ismapped); + } + + if ($side eq "acrosstop") { + + my $y = $label->reqheight / 2; + my $ph = $y - ($border->cget(-bd)); + $ph = 0 if $ph < 0; + + $label->form(qw/-top 0 -left 4 -padx 6 -pady 2/); + $border->form(-top => $y, + qw/-bottom -1 -left 0 -right -1 -padx 2 -pady 2/); + $pad->form(-bottom => $ph, + qw/-top 0 -left 0 -right -1/); + $frame->form(-top => $pad, + qw/-bottom -1 -left 0 -right -1 -fill both/); + $cw->{m_geoMgr} = "form"; + + } else { + + $label->pack(-side => $side); + $frame->pack(-expand => 1, -fill => 'both'); + $border->pack(-side => $side, -expand => 1, -fill => 'both'); + $cw->{m_geoMgr} = "pack"; + } +} + +sub form { + my $cw = shift; + $cw = $cw->Subwidget('frame') + if (@_ && $_[0] =~ /^(?:slaves)$/); + $cw->SUPER::form(@_); +} + +sub grid { + my $cw = shift; + $cw = $cw->Subwidget('frame') if (@_ && $_[0] =~ + /^(?:bbox + |columnconfigure + |location + |propagate + |rowconfigure + |size + |slaves) + $/x); + $cw->SUPER::grid(@_); +} + + +sub pack { + my $cw = shift; + $cw = $cw->Subwidget('frame') + if (@_ && $_[0] =~ /^(?:propagate|slaves)$/); + $cw->SUPER::pack(@_); +} + +sub place { + my $cw = shift; + $cw = $cw->Subwidget('frame') + if (@_ && $_[0] =~ /^(?:slaves)$/); + $cw->SUPER::place(@_); +} + +1; + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/LabRadio.pm b/Master/tlpkg/tlperl.old/lib/Tk/LabRadio.pm new file mode 100644 index 00000000000..69e07b12f01 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/LabRadio.pm @@ -0,0 +1,63 @@ +# Class LabeledRadiobutton + +package Tk::LabRadiobutton; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Tk/LabRadio.pm#4 $ + +require Tk::Frame; +use base qw(Tk::Frame); + +Construct Tk::Widget 'LabRadiobutton'; + + +# Although there is no fundamental reason why -radiobuttons +# should be fixed at create time converting to METHOD form +# is extra work an this can serve as an example of CreateArgs +# checking. + +sub CreateArgs +{ + my ($package,$parent,$args) = @_; + $parent->BackTrace("Must specify -radiobuttons for $package") + unless (defined $args->{'-radiobuttons'}); + return $package->SUPER::CreateArgs($parent,$args); +} + +sub Populate +{ + require Tk::Radiobutton; + + my ($cw,$args) = @_; + $cw->SUPER::Populate($args); + + # LabeledRadiobutton(s) constructor. + # + # Advertised subwidgets: the name(s) of your radiobutton(s). + + + + my (@widgets) = (); + + my $rl; + foreach $rl (@{$args->{'-radiobuttons'}}) + { + my $r = $cw->Component( Radiobutton => $rl, + -text => $rl, + -value => $rl ); + $r->pack(-side => 'left', -expand => 1, -fill => 'both'); + push(@widgets,$r); + $cw->{Configure}{-value} = $rl; + } + + $cw->BackTrace('No buttons') unless (@widgets); + + $cw->ConfigSpecs('-variable' => [ \@widgets, undef, undef, \$cw->{Configure}{-value} ], + '-radiobuttons' => [ 'PASSIVE', undef, undef, undef ], + '-value' => [ 'PASSIVE', undef, undef, $cw->{Configure}{-value} ], + 'DEFAULT' => [ \@widgets ] + ); +} + + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Label.pm b/Master/tlpkg/tlperl.old/lib/Tk/Label.pm new file mode 100644 index 00000000000..ebea1741c2f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Label.pm @@ -0,0 +1,21 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package Tk::Label; +require Tk; + + +use vars qw($VERSION); +$VERSION = '4.006'; # $Id: //depot/Tkutf8/Tk/Label.pm#6 $ + +use base qw(Tk::Widget); + +Construct Tk::Widget 'Label'; + +sub Tk_cmd { \&Tk::label } + +1; + + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Labelframe.pm b/Master/tlpkg/tlperl.old/lib/Tk/Labelframe.pm new file mode 100644 index 00000000000..14c577b5e35 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Labelframe.pm @@ -0,0 +1,16 @@ +package Tk::Labelframe; +use strict; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #2 $ =~ /#(\d+)/; + +# New widget which is a kind of Frame with a label ... + +use base qw(Tk::Frame); + +Construct Tk::Widget 'Labelframe'; + +sub Tk_cmd { \&Tk::labelframe } + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Listbox.pm b/Master/tlpkg/tlperl.old/lib/Tk/Listbox.pm new file mode 100644 index 00000000000..249a8eed7f4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Listbox.pm @@ -0,0 +1,910 @@ +# Converted from listbox.tcl -- +# +# This file defines the default bindings for Tk listbox widgets. +# +# @(#) listbox.tcl 1.7 94/12/17 16:05:18 +# +# Copyright (c) 1994 The Regents of the University of California. +# Copyright (c) 1994 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +# Modifications from standard Listbox.pm +# -------------------------------------- +# 27-JAN-2001 Alasdair Allan +# Modified for local use by adding tied scalar and arrays +# Implemented TIESCALAR, TIEARRAY, FETCH, FETCHSIZE, STORE, CLEAR & EXTEND +# 31-JAN-2001 Alasdair Allan +# Made changes suggested by Tim Jenness +# 03-FEB-2001 Alasdair Allan +# Modified STORE for tied scalars to clear and select elements +# 06-FEB-2001 Alasdair Allan +# Added POD documentation for tied listbox +# 13-FEB-2001 Alasdair Allan +# Implemented EXISTS, DELETE, PUSH, POP, SHIFT & UNSHIFT for tied arrays +# 14-FEB-2001 Alasdair Allan +# Implemented SPLICE for tied arrays, all tied functionality in place +# 16-FEB-2001 Alasdair Allan +# Tweak to STORE interface for tied scalars +# 23-FEB-2001 Alasdair Allan +# Added flag to FETCH for tied scalars, modified to return hashes +# 24-FEB-2001 Alasdair Allan +# Updated Pod documentation +# + +package Tk::Listbox; + +use vars qw($VERSION @Selection $Prev); +use strict; +$VERSION = sprintf '4.%03d', q$Revision: #14 $ =~ /\D(\d+)\s*$/; + +use Tk qw(Ev $XS_VERSION); +use Tk::Clipboard (); +use AutoLoader; + +use base qw(Tk::Clipboard Tk::Widget); + +Construct Tk::Widget 'Listbox'; + +bootstrap Tk::Listbox; + +sub Tk_cmd { \&Tk::listbox } + +Tk::Methods('activate','bbox','curselection','delete','get','index', + 'insert','itemcget','itemconfigure','nearest','scan','see', + 'selection','size','xview','yview'); + +use Tk::Submethods ( 'selection' => [qw(anchor clear includes set)], + 'scan' => [qw(mark dragto)], + 'xview' => [qw(moveto scroll)], + 'yview' => [qw(moveto scroll)], + ); + +*Getselected = \&getSelected; + +sub clipEvents +{ + return qw[Copy]; +} + +sub BalloonInfo +{ + my ($listbox,$balloon,$X,$Y,@opt) = @_; + my $e = $listbox->XEvent; + return if !$e; + my $index = $listbox->index('@' . $e->x . ',' . $e->y); + foreach my $opt (@opt) + { + my $info = $balloon->GetOption($opt,$listbox); + if ($opt =~ /^-(statusmsg|balloonmsg)$/ && UNIVERSAL::isa($info,'ARRAY')) + { + $balloon->Subclient($index); + if (defined $info->[$index]) + { + return $info->[$index]; + } + return ''; + } + return $info; + } +} + +sub ClassInit +{ + my ($class,$mw) = @_; + $class->SUPER::ClassInit($mw); + # Standard Motif bindings: + $mw->bind($class,'<1>',[sub { + my $w = shift; + if (Tk::Exists($w)) { + $w->BeginSelect(@_); + } + }, Ev('index',Ev('@'))]); + $mw->bind($class, '<Double-1>' => \&Tk::NoOp); + $mw->bind($class,'<B1-Motion>',['Motion',Ev('index',Ev('@'))]); + $mw->bind($class,'<ButtonRelease-1>','ButtonRelease_1'); + ; + $mw->bind($class,'<Shift-1>',['BeginExtend',Ev('index',Ev('@'))]); + $mw->bind($class,'<Control-1>',['BeginToggle',Ev('index',Ev('@'))]); + + $mw->bind($class,'<B1-Leave>',['AutoScan',Ev('x'),Ev('y')]); + $mw->bind($class,'<B1-Enter>','CancelRepeat'); + $mw->bind($class,'<Up>',['UpDown',-1]); + $mw->bind($class,'<Shift-Up>',['ExtendUpDown',-1]); + $mw->bind($class,'<Down>',['UpDown',1]); + $mw->bind($class,'<Shift-Down>',['ExtendUpDown',1]); + + $mw->XscrollBind($class); + $mw->bind($class,'<Prior>', sub { + my $w = shift; + $w->yview('scroll',-1,'pages'); + $w->activate('@0,0'); + }); + $mw->bind($class,'<Next>', sub { + my $w = shift; + $w->yview('scroll',1,'pages'); + $w->activate('@0,0'); + }); + $mw->bind($class,'<Control-Prior>', ['xview', 'scroll', -1, 'pages']); + $mw->bind($class,'<Control-Next>', ['xview', 'scroll', 1, 'pages']); + # <Home> and <End> defined in XscrollBind + $mw->bind($class,'<Control-Home>','Cntrl_Home'); + ; + $mw->bind($class,'<Shift-Control-Home>',['DataExtend',0]); + $mw->bind($class,'<Control-End>','Cntrl_End'); + ; + $mw->bind($class,'<Shift-Control-End>',['DataExtend','end']); + # XXX What about <<Copy>>? Already handled in Tk::Clipboard? + # $class->clipboardOperations($mw,'Copy'); + $mw->bind($class,'<space>',['BeginSelect',Ev('index','active')]); + $mw->bind($class,'<Select>',['BeginSelect',Ev('index','active')]); + $mw->bind($class,'<Control-Shift-space>',['BeginExtend',Ev('index','active')]); + $mw->bind($class,'<Shift-Select>',['BeginExtend',Ev('index','active')]); + $mw->bind($class,'<Escape>','Cancel'); + $mw->bind($class,'<Control-slash>','SelectAll'); + $mw->bind($class,'<Control-backslash>','Cntrl_backslash'); + ; + # Additional Tk bindings that aren't part of the Motif look and feel: + $mw->bind($class,'<2>',['scan','mark',Ev('x'),Ev('y')]); + $mw->bind($class,'<B2-Motion>',['scan','dragto',Ev('x'),Ev('y')]); + + $mw->MouseWheelBind($class); # XXX Both needed? + $mw->YMouseWheelBind($class); + return $class; +} + +1; +__END__ + +sub TIEARRAY { + my ( $class, $obj, %options ) = @_; + return bless { + OBJECT => \$obj, + OPTION => \%options }, $class; +} + + + +sub TIESCALAR { + my ( $class, $obj, %options ) = @_; + return bless { + OBJECT => \$obj, + OPTION => \%options }, $class; +} + +# FETCH +# ----- +# Return either the full contents or only the selected items in the +# box depending on whether we tied it to an array or scalar respectively +sub FETCH { + my $class = shift; + + my $self = ${$class->{OBJECT}}; + my %options = %{$class->{OPTION}} if defined $class->{OPTION};; + + # Define the return variable + my $result; + + # Check whether we are have a tied array or scalar quantity + if ( @_ ) { + my $i = shift; + # The Tk:: Listbox has been tied to an array, we are returning + # an array list of the current items in the Listbox + $result = $self->get($i); + } else { + # The Tk::Listbox has been tied to a scalar, we are returning a + # reference to an array or hash containing the currently selected items + my ( @array, %hash ); + + if ( defined $options{ReturnType} ) { + + # THREE-WAY SWITCH + if ( $options{ReturnType} eq "index" ) { + $result = [$self->curselection]; + } elsif ( $options{ReturnType} eq "element" ) { + foreach my $selection ( $self->curselection ) { + push(@array,$self->get($selection)); } + $result = \@array; + } elsif ( $options{ReturnType} eq "both" ) { + foreach my $selection ( $self->curselection ) { + %hash = ( %hash, $selection => $self->get($selection)); } + $result = \%hash; + } + } else { + # return elements (default) + foreach my $selection ( $self->curselection ) { + push(@array,$self->get($selection)); } + $result = \@array; + } + } + return $result; +} + +# FETCHSIZE +# --------- +# Return the number of elements in the Listbox when tied to an array +sub FETCHSIZE { + my $class = shift; + return ${$class->{OBJECT}}->size(); +} + +# STORE +# ----- +# If tied to an array we will modify the Listbox contents, while if tied +# to a scalar we will select and clear elements. +sub STORE { + + if ( scalar(@_) == 2 ) { + # we have a tied scalar + my ( $class, $selected ) = @_; + my $self = ${$class->{OBJECT}}; + my %options = %{$class->{OPTION}} if defined $class->{OPTION};; + + # clear currently selected elements + $self->selectionClear(0,'end'); + + # set selected elements + if ( defined $options{ReturnType} ) { + + # THREE-WAY SWITCH + if ( $options{ReturnType} eq "index" ) { + for ( my $i=0; $i < scalar(@$selected) ; $i++ ) { + for ( my $j=0; $j < $self->size() ; $j++ ) { + if( $j == $$selected[$i] ) { + $self->selectionSet($j); last; } + } + } + } elsif ( $options{ReturnType} eq "element" ) { + for ( my $k=0; $k < scalar(@$selected) ; $k++ ) { + for ( my $l=0; $l < $self->size() ; $l++ ) { + if( $self->get($l) eq $$selected[$k] ) { + $self->selectionSet($l); last; } + } + } + } elsif ( $options{ReturnType} eq "both" ) { + foreach my $key ( keys %$selected ) { + $self->selectionSet($key) + if $$selected{$key} eq $self->get($key); + } + } + } else { + # return elements (default) + for ( my $k=0; $k < scalar(@$selected) ; $k++ ) { + for ( my $l=0; $l < $self->size() ; $l++ ) { + if( $self->get($l) eq $$selected[$k] ) { + $self->selectionSet($l); last; } + } + } + } + + } else { + # we have a tied array + my ( $class, $index, $value ) = @_; + my $self = ${$class->{OBJECT}}; + + # check size of current contents list + my $sizeof = $self->size(); + + if ( $index <= $sizeof ) { + # Change a current listbox entry + $self->delete($index); + $self->insert($index, $value); + } else { + # Add a new value + if ( defined $index ) { + $self->insert($index, $value); + } else { + $self->insert("end", $value); + } + } + } +} + +# CLEAR +# ----- +# Empty the Listbox of contents if tied to an array +sub CLEAR { + my $class = shift; + ${$class->{OBJECT}}->delete(0, 'end'); +} + +# EXTEND +# ------ +# Do nothing and be happy about it +sub EXTEND { } + +# PUSH +# ---- +# Append elements onto the Listbox contents +sub PUSH { + my ( $class, @list ) = @_; + ${$class->{OBJECT}}->insert('end', @list); +} + +# POP +# --- +# Remove last element of the array and return it +sub POP { + my $class = shift; + + my $value = ${$class->{OBJECT}}->get('end'); + ${$class->{OBJECT}}->delete('end'); + return $value; +} + +# SHIFT +# ----- +# Removes the first element and returns it +sub SHIFT { + my $class = shift; + + my $value = ${$class->{OBJECT}}->get(0); + ${$class->{OBJECT}}->delete(0); + return $value +} + +# UNSHIFT +# ------- +# Insert elements at the beginning of the Listbox +sub UNSHIFT { + my ( $class, @list ) = @_; + ${$class->{OBJECT}}->insert(0, @list); +} + +# DELETE +# ------ +# Delete element at specified index +sub DELETE { + my ( $class, @list ) = @_; + + my $value = ${$class->{OBJECT}}->get(@list); + ${$class->{OBJECT}}->delete(@list); + return $value; +} + +# EXISTS +# ------ +# Returns true if the index exist, and undef if not +sub EXISTS { + my ( $class, $index ) = @_; + return undef unless ${$class->{OBJECT}}->get($index); +} + +# SPLICE +# ------ +# Performs equivalent of splice on the listbox contents +sub SPLICE { + my $class = shift; + + my $self = ${$class->{OBJECT}}; + + # check for arguments + my @elements; + if ( scalar(@_) == 0 ) { + # none + @elements = $self->get(0,'end'); + $self->delete(0,'end'); + return wantarray ? @elements : $elements[scalar(@elements)-1];; + + } elsif ( scalar(@_) == 1 ) { + # $offset + my ( $offset ) = @_; + if ( $offset < 0 ) { + my $start = $self->size() + $offset; + if ( $start > 0 ) { + @elements = $self->get($start,'end'); + $self->delete($start,'end'); + return wantarray ? @elements : $elements[scalar(@elements)-1]; + } else { + return undef; + } + } else { + @elements = $self->get($offset,'end'); + $self->delete($offset,'end'); + return wantarray ? @elements : $elements[scalar(@elements)-1]; + } + + } elsif ( scalar(@_) == 2 ) { + # $offset and $length + my ( $offset, $length ) = @_; + if ( $offset < 0 ) { + my $start = $self->size() + $offset; + my $end = $self->size() + $offset + $length - 1; + if ( $start > 0 ) { + @elements = $self->get($start,$end); + $self->delete($start,$end); + return wantarray ? @elements : $elements[scalar(@elements)-1]; + } else { + return undef; + } + } else { + @elements = $self->get($offset,$offset+$length-1); + $self->delete($offset,$offset+$length-1); + return wantarray ? @elements : $elements[scalar(@elements)-1]; + } + + } else { + # $offset, $length and @list + my ( $offset, $length, @list ) = @_; + if ( $offset < 0 ) { + my $start = $self->size() + $offset; + my $end = $self->size() + $offset + $length - 1; + if ( $start > 0 ) { + @elements = $self->get($start,$end); + $self->delete($start,$end); + $self->insert($start,@list); + return wantarray ? @elements : $elements[scalar(@elements)-1]; + } else { + return undef; + } + } else { + @elements = $self->get($offset,$offset+$length-1); + $self->delete($offset,$offset+$length-1); + $self->insert($offset,@list); + return wantarray ? @elements : $elements[scalar(@elements)-1]; + } + } +} + +# ---- + +# +# Bind -- +# This procedure is invoked the first time the mouse enters a listbox +# widget or a listbox widget receives the input focus. It creates +# all of the class bindings for listboxes. +# +# Arguments: +# event - Indicates which event caused the procedure to be invoked +# (Enter or FocusIn). It is used so that we can carry out +# the functions of that event in addition to setting up +# bindings. + +sub xyIndex +{ + my $w = shift; + my $Ev = $w->XEvent; + return $w->index($Ev->xy); +} + +sub ButtonRelease_1 +{ + my $w = shift; + my $Ev = $w->XEvent; + $w->CancelRepeat; + $w->activate($Ev->xy); +} + + +sub Cntrl_Home +{ + my $w = shift; + my $Ev = $w->XEvent; + $w->activate(0); + $w->see(0); + $w->selectionClear(0,'end'); + $w->selectionSet(0); + $w->eventGenerate("<<ListboxSelect>>"); +} + + +sub Cntrl_End +{ + my $w = shift; + my $Ev = $w->XEvent; + $w->activate('end'); + $w->see('end'); + $w->selectionClear(0,'end'); + $w->selectionSet('end'); + $w->eventGenerate("<<ListboxSelect>>"); +} + + +sub Cntrl_backslash +{ + my $w = shift; + my $Ev = $w->XEvent; + if ($w->cget('-selectmode') ne 'browse') + { + $w->selectionClear(0,'end'); + $w->eventGenerate("<<ListboxSelect>>"); + } +} + +# BeginSelect -- +# +# This procedure is typically invoked on button-1 presses. It begins +# the process of making a selection in the listbox. Its exact behavior +# depends on the selection mode currently in effect for the listbox; +# see the Motif documentation for details. +# +# Arguments: +# w - The listbox widget. +# el - The element for the selection operation (typically the +# one under the pointer). Must be in numerical form. +sub BeginSelect +{ + my $w = shift; + my $el = shift; + if ($w->cget('-selectmode') eq 'multiple') + { + if ($w->selectionIncludes($el)) + { + $w->selectionClear($el) + } + else + { + $w->selectionSet($el) + } + } + else + { + $w->selectionClear(0,'end'); + $w->selectionSet($el); + $w->selectionAnchor($el); + @Selection = (); + $Prev = $el + } + $w->focus if ($w->cget('-takefocus')); + $w->eventGenerate("<<ListboxSelect>>"); +} +# Motion -- +# +# This procedure is called to process mouse motion events while +# button 1 is down. It may move or extend the selection, depending +# on the listbox's selection mode. +# +# Arguments: +# w - The listbox widget. +# el - The element under the pointer (must be a number). +sub Motion +{ + my $w = shift; + my $el = shift; + if (defined($Prev) && $el == $Prev) + { + return; + } + my $anchor = $w->index('anchor'); + my $mode = $w->cget('-selectmode'); + if ($mode eq 'browse') + { + $w->selectionClear(0,'end'); + $w->selectionSet($el); + $Prev = $el; + $w->eventGenerate("<<ListboxSelect>>"); + } + elsif ($mode eq 'extended') + { + my $i = $Prev; + if (!defined $i || $i eq '') + { + $i = $el; + $w->selectionSet($el); + } + if ($w->selectionIncludes('anchor')) + { + $w->selectionClear($i,$el); + $w->selectionSet('anchor',$el) + } + else + { + $w->selectionClear($i,$el); + $w->selectionClear('anchor',$el) + } + if (!@Selection) + { + @Selection = $w->curselection; + } + while ($i < $el && $i < $anchor) + { + if (Tk::lsearch(\@Selection,$i) >= 0) + { + $w->selectionSet($i) + } + $i++ + } + while ($i > $el && $i > $anchor) + { + if (Tk::lsearch(\@Selection,$i) >= 0) + { + $w->selectionSet($i) + } + $i-- + } + $Prev = $el; + $w->eventGenerate("<<ListboxSelect>>"); + } +} +# BeginExtend -- +# +# This procedure is typically invoked on shift-button-1 presses. It +# begins the process of extending a selection in the listbox. Its +# exact behavior depends on the selection mode currently in effect +# for the listbox; see the Motif documentation for details. +# +# Arguments: +# w - The listbox widget. +# el - The element for the selection operation (typically the +# one under the pointer). Must be in numerical form. +sub BeginExtend +{ + my $w = shift; + my $el = shift; + if ($w->cget('-selectmode') eq 'extended' && $w->selectionIncludes('anchor')) + { + $w->Motion($el) + } + else + { + # No selection yet; simulate the begin-select operation. + $w->BeginSelect($el); + } +} +# BeginToggle -- +# +# This procedure is typically invoked on control-button-1 presses. It +# begins the process of toggling a selection in the listbox. Its +# exact behavior depends on the selection mode currently in effect +# for the listbox; see the Motif documentation for details. +# +# Arguments: +# w - The listbox widget. +# el - The element for the selection operation (typically the +# one under the pointer). Must be in numerical form. +sub BeginToggle +{ + my $w = shift; + my $el = shift; + if ($w->cget('-selectmode') eq 'extended') + { + @Selection = $w->curselection(); + $Prev = $el; + $w->selectionAnchor($el); + if ($w->selectionIncludes($el)) + { + $w->selectionClear($el) + } + else + { + $w->selectionSet($el) + } + $w->eventGenerate("<<ListboxSelect>>"); + } +} +# AutoScan -- +# This procedure is invoked when the mouse leaves an entry window +# with button 1 down. It scrolls the window up, down, left, or +# right, depending on where the mouse left the window, and reschedules +# itself as an "after" command so that the window continues to scroll until +# the mouse moves back into the window or the mouse button is released. +# +# Arguments: +# w - The entry window. +# x - The x-coordinate of the mouse when it left the window. +# y - The y-coordinate of the mouse when it left the window. +sub AutoScan +{ + my $w = shift; + return if !Tk::Exists($w); + my $x = shift; + my $y = shift; + if ($y >= $w->height) + { + $w->yview('scroll',1,'units') + } + elsif ($y < 0) + { + $w->yview('scroll',-1,'units') + } + elsif ($x >= $w->width) + { + $w->xview('scroll',2,'units') + } + elsif ($x < 0) + { + $w->xview('scroll',-2,'units') + } + else + { + return; + } + $w->Motion($w->index("@" . $x . ',' . $y)); + $w->RepeatId($w->after(50,'AutoScan',$w,$x,$y)); +} +# UpDown -- +# +# Moves the location cursor (active element) up or down by one element, +# and changes the selection if we're in browse or extended selection +# mode. +# +# Arguments: +# w - The listbox widget. +# amount - +1 to move down one item, -1 to move back one item. +sub UpDown +{ + my $w = shift; + my $amount = shift; + $w->activate($w->index('active')+$amount); + $w->see('active'); + my $mode = $w->cget('-selectmode'); + if ($mode eq 'browse') + { + $w->selectionClear(0,'end'); + $w->selectionSet('active'); + $w->eventGenerate("<<ListboxSelect>>"); + } + elsif ($mode eq 'extended') + { + $w->selectionClear(0,'end'); + $w->selectionSet('active'); + $w->selectionAnchor('active'); + $Prev = $w->index('active'); + @Selection = (); + $w->eventGenerate("<<ListboxSelect>>"); + } +} +# ExtendUpDown -- +# +# Does nothing unless we're in extended selection mode; in this +# case it moves the location cursor (active element) up or down by +# one element, and extends the selection to that point. +# +# Arguments: +# w - The listbox widget. +# amount - +1 to move down one item, -1 to move back one item. +sub ExtendUpDown +{ + my $w = shift; + my $amount = shift; + if ($w->cget('-selectmode') ne 'extended') + { + return; + } + my $active = $w->index('active'); + if (!@Selection) + { + $w->selectionSet($active); + @Selection = $w->curselection; + } + $w->activate($active + $amount); + $w->see('active'); + $w->Motion($w->index('active')) +} +# DataExtend +# +# This procedure is called for key-presses such as Shift-KEndData. +# If the selection mode isn't multiple or extend then it does nothing. +# Otherwise it moves the active element to el and, if we're in +# extended mode, extends the selection to that point. +# +# Arguments: +# w - The listbox widget. +# el - An integer element number. +sub DataExtend +{ + my $w = shift; + my $el = shift; + my $mode = $w->cget('-selectmode'); + if ($mode eq 'extended') + { + $w->activate($el); + $w->see($el); + if ($w->selectionIncludes('anchor')) + { + $w->Motion($el) + } + } + elsif ($mode eq 'multiple') + { + $w->activate($el); + $w->see($el) + } +} +# Cancel +# +# This procedure is invoked to cancel an extended selection in +# progress. If there is an extended selection in progress, it +# restores all of the items between the active one and the anchor +# to their previous selection state. +# +# Arguments: +# w - The listbox widget. +sub Cancel +{ + my $w = shift; + if ($w->cget('-selectmode') ne 'extended' || !defined $Prev) + { + return; + } + my $first = $w->index('anchor'); + my $last = $Prev; + if ($first > $last) + { + ($first, $last) = ($last, $first); + } + $w->selectionClear($first,$last); + while ($first <= $last) + { + if (Tk::lsearch(\@Selection,$first) >= 0) + { + $w->selectionSet($first) + } + $first++ + } + $w->eventGenerate("<<ListboxSelect>>"); +} +# SelectAll +# +# This procedure is invoked to handle the "select all" operation. +# For single and browse mode, it just selects the active element. +# Otherwise it selects everything in the widget. +# +# Arguments: +# w - The listbox widget. +sub SelectAll +{ + my $w = shift; + my $mode = $w->cget('-selectmode'); + if ($mode eq 'single' || $mode eq 'browse') + { + $w->selectionClear(0,'end'); + $w->selectionSet('active') + } + else + { + $w->selectionSet(0,'end') + } + $w->eventGenerate("<<ListboxSelect>>"); +} + +# Perl/Tk extensions: +sub SetList +{ + my $w = shift; + $w->delete(0,'end'); + $w->insert('end',@_); +} + +sub deleteSelected +{ + my $w = shift; + my $i; + foreach $i (reverse $w->curselection) + { + $w->delete($i); + } +} + +sub clipboardPaste +{ + my $w = shift; + my $index = $w->index('active') || $w->index($w->XEvent->xy); + my $str; + eval {local $SIG{__DIE__}; $str = $w->clipboardGet }; + return if $@; + foreach (split("\n",$str)) + { + $w->insert($index++,$_); + } +} + +sub getSelected +{ + my ($w) = @_; + my $i; + my (@result) = (); + foreach $i ($w->curselection) + { + push(@result,$w->get($i)); + } + return (wantarray) ? @result : $result[0]; +} + + + +1; +__END__ + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/MMtry.pm b/Master/tlpkg/tlperl.old/lib/Tk/MMtry.pm new file mode 100644 index 00000000000..3ef2f8868ab --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/MMtry.pm @@ -0,0 +1,54 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::MMtry; +use Config; +require Exporter; + +use vars qw($VERSION @EXPORT); +$VERSION = sprintf '4.%03d', q$Revision: #9 $ =~ /\D(\d+)\s*$/; + +use base qw(Exporter); +@EXPORT = qw(try_compile try_run); +use strict; +use File::Basename; +use File::Spec; + +my $stderr_too = ($^O eq 'MSWin32') ? '' : '2>&1'; + +sub try_compile +{ + my ($file,$inc,$lib) = @_; + $inc = [] unless $inc; + $lib = [] unless $lib; + my $out = basename($file,'.c').$Config{'exe_ext'}; + warn "Test Compiling $file\n"; + my $msgs = `$Config{'cc'} -o $out $Config{'ccflags'} @$inc $file @$lib $stderr_too`; + my $ok = ($? == 0); +# warn $msgs if $msgs; + unlink($out) if (-f $out); + return $ok; +} + +sub try_run +{ + my ($file,$inc,$lib) = @_; + $inc = [] unless $inc; + $lib = [] unless $lib; + my $out = basename($file,'.c').$Config{'exe_ext'}; + warn "Test Compile/Run $file\n"; + my $msgs = `$Config{'cc'} -o $out $Config{'ccflags'} @$inc $file @$lib $stderr_too`; + my $ok = ($? == 0); +# warn "$Config{'cc'} -o $out $Config{'ccflags'} @$inc $file @$lib:\n$msgs" if $msgs; + if ($ok) + { + my $path = File::Spec->rel2abs($out); + $msgs = `$path $stderr_too`; + $ok = ($? == 0); +# warn "$path:$msgs" if $msgs; + } + unlink($out) if (-f $out); + return $ok; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/MMutil.pm b/Master/tlpkg/tlperl.old/lib/Tk/MMutil.pm new file mode 100644 index 00000000000..84f3aa862f5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/MMutil.pm @@ -0,0 +1,600 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::MMutil; +use ExtUtils::MakeMaker; +use Cwd; +use Config; +use Carp; +use File::Basename; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #21 $ =~ /\D(\d+)\s*$/; + +# warn __FILE__." $VERSION\n"; + +use Tk::MakeDepend; + +use Tk::Config qw(!$VERSION); +use vars qw($IsWin32); + +*IsWin32 = \$main::IsWin32; +$IsWin32 = ($^O eq 'MSWin32' || $Config{'ccflags'} =~ /-D_?WIN32_?/) + unless defined $IsWin32; + +@MYEXPORT = qw(pasthru perldepend cflags const_config constants installbin c_o xs_o makefile manifypods); + +sub arch_prune +{ + my $hash = shift; + foreach (keys %$hash) + { + if ($win_arch eq 'x') + { + delete $hash->{$_} if /Win[A-Z0-9]/ or /OS2/ or /ImgUtil/ or /^x/; + } + elsif ($win_arch eq 'open32') + { + delete $hash->{$_} if /Unix|Mwm/ and not /tclUnix/; + delete $hash->{$_} if /winMain|dllMain/; + } + elsif ($win_arch eq 'pm') + { + delete $hash->{$_} + if /Unix|Mwm/ and not + /tclUnix|Unix(3d|Button|Dialog|Color|Embed|Focus|Font|Menu|Scrlbr|Send|Int\.|Scale)/; + delete $hash->{$_} if /os2Main|dllMain|tkOS2Dll|^x(colors\.c|gc\.)/; + delete $hash->{$_} if /ImgUtil|tkWin[A-Z0-9]/ and not /OS2/; + } + elsif ($win_arch eq 'MSWin32') + { + delete $hash->{$_} if /Mwm/ and not /tclUnix/; + delete $hash->{$_} if /winMain|dllMain/; + # delete $hash->{$_} if /^Xrm/; + } + } +} + +sub mTk_postamble +{ + my ($self) = @_; + my $dep = "config :: \$(C_FILES) \$(H_FILES)\n\t$self->{NOECHO}\$(NOOP)\n"; + my $mTk = $self->{'MTK'}; + $dep .= "# Begin Munging dependencies\n"; + foreach my $file (sort keys %$mTk) + { + $dep .= "$file : ".$mTk->{$file}." \$(TKDIR)/pTk/Tcl-pTk\n"; + $dep .= "\t\$(PERL) \$(TKDIR)/pTk/Tcl-pTk ".$mTk->{$file}." $file\n"; + } + $dep .= "# End Munging dependencies\n\n"; + return $dep; +} + +sub mTk_CHO +{ + my $self = shift; + my $mTk = shift; + my $exc = shift; + my %c; + my %h; + foreach (@{$self->{H}}) { $h{$_} = 1 } + foreach (@{$self->{C}}) { $c{$_} = 1 } + foreach (keys %$mTk) + { + if (/\.c$/) + { + $c{$_} = 1; + } + elsif (/\.h$/) + { + $h{$_} = 1; + } + } + foreach (keys %$exc) + { + if (/\.c$/) + { + delete $c{$_}; + } + elsif (/\.h$/) + { + delete $h{$_}; + } + } + while (@_) + { + my $name = shift; + cluck("No $name") unless (exists $c{$name}); + delete $c{$name} + } + arch_prune(\%h); + arch_prune(\%c); + $self->{'H'} = [sort keys %h]; + $self->{'C'} = [sort keys %c]; + my(@o_files) = @{$self->{C}}; + $self->{O_FILES} = [grep s/\.c(pp|xx|c)?$/$self->{OBJ_EXT}/i, @o_files] ; + $self->{'MTK'} = $mTk; + my $tk = installed_tk(); + my $perl = $self->{'PERL'}; + if ($IsWin32 && !-f $perl && -f "$perl.exe") + { + print "perl=$perl X=$^X\n"; + $perl = "$perl.exe"; + $self->{'PERL'} = $perl; + } + foreach my $file (sort keys %$mTk) + { + unless (-f $file && -M $file < -M $mTk->{$file}) + { + warn "Extracting $file\n"; + system($perl,"$tk/pTk/Tcl-pTk",$mTk->{$file},$file); + } + } +} + +my %visited; + +sub abspath +{ + my $dir = shift; + my $here = getcwd() || die "Cannot get current directory:$!"; + if (chdir($dir)) + { + $dir = getcwd(); + chdir($here) || die "Cannot cd back to $here:$!"; + } + return $dir; +} + +sub relpath +{ + my ($path,$dir) = @_; + unless (defined $dir) + { + $dir = (-d $path) ? $path : dirname($path); + } + if (defined $dir and -d $dir) + { + if ($path =~ m#^\Q$dir\E([/\\]?.*)$#) + { + my $base = $1; + my $here = getcwd; + if ($here =~ m#^\Q$dir\E([/\\]?.*)#) + { + my $depth = reverse($1); + if ($depth) + { + $depth =~ s,[^/\\]+,..,g; + } + else + { + $depth = '.' ; + } + $depth =~ s,[/\\]+$,,; + $base =~ s,^[/\\]+,,; + $depth .= "/$base" if ($base); + if (-e $depth) + { + # print "$path is $depth from $here\n"; + return $depth; + } + else + { + warn "Cannot find $depth\n"; + } + } + else + { + unless(exists $visited{$here}) + { + $visited{$here} = 1; + warn "$here does not start with $dir\n"; + warn "i.e. building outside Tk itself\n"; + } + } + } + else + { + die "'$path' not under '$dir'\n"; + } + } + else + { + die "Cannot get directory for $path\n"; + } + return $path; +} + +use strict; + +sub upgrade_pic +{ + my $flags = ''; + die 'upgrade_pic is obsolete'; + return $flags; +} + +sub pasthru +{ + my $self = shift; + my $str = $self->MM::pasthru; + if ($str =~ s/^\s+INC=.*\n//m) + { + $str = "# - Do NOT pasthru INC for Tk - it is computed by subdir\n$str" + } + if ($str =~ s/\bLIB="\$\(LIB\)"//) + { + $str = qq[# - Drop LIB="\$(LIB)" - not used\n$str]; + } + $str = "#Tk::MMutil pasthru\n$str"; + return $str; +} + +sub perldepend +{ + my $self = shift; + my $str = $self->MM::perldepend; + my $name; + my %c; + foreach my $file (@{$self->{'C'}}) + { + $c{$file} = 1; + } + foreach my $file (keys %{$self->{'XS'}}) + { + $c{$file} = 1; + delete $c{$self->{'XS'}{$file}}; + } + my @files = grep(-f $_,sort(keys %c)); + if (@files) + { + my $tk = installed_tk(); + my @inc = split(/\s+/,$self->{'INC'}); + my @def = split(/\s+/,$self->{'DEFINE'}); + push(@def,qw(-DWIN32 -D__WIN32__)) if ($IsWin32); + if ($^O eq 'cygwin') + { + push(@def,qw(-D__CYGWIN__)); + if ($win_arch eq 'MSWin32') + { + push(@def,qw(-D__WIN32__)) unless $self->{'DEFINE'} =~ /-D__WIN32__/; + push(@def,qw(-DWIN32)) if $self->{'NAME'} eq 'Tk::pTk'; + } + elsif ($win_arch eq 'x') + { + push(@def,qw(-U_WIN32)); + } + } + foreach (@inc) + { + s/\$\(TKDIR\)/$tk/g; + warn "Odd:$_" if /\$\(/; + } + $str .= Tk::MakeDepend::command_line(@inc,@def,@files) unless ($ENV{'TKNOMAKEDEPEND'}); + } + return $str; +} + +sub const_config +{ + my $self = shift; + my $name; + foreach $name (grep /(%|\.(old|bak|q4|orig|rej))$/,keys %{$self->{PM}}) + { + delete $self->{PM}->{$name}; + } + my $flags = $self->{'CCCDLFLAGS'}; + $flags =~ s/(-[fK]?\s*)pic\b/${1}PIC/; + $self->{'CCCDLFLAGS'} = $flags; + if ($^O eq 'MSWin32' && $Config{'ccflags'} =~ /-DPERL_OBJECT/) + { + $self->{'LDFLAGS'} =~ s/-(debug|pdb:\w+)\s+//g; + $self->{'LDDLFLAGS'} =~ s/-(debug|pdb:\w+)\s+//g; + } + elsif ($^O eq 'darwin' ) + { + $self->{'LDDLFLAGS'} =~ s/-flat_namespace//; + $self->{'LDDLFLAGS'} =~ s/-undefined\s+suppress//; + if ( -e "$Config{'archlib'}/CORE/$Config{'libperl'}" ) { + $self->{'LDDLFLAGS'} .= " -L\${PERL_ARCHLIB}/CORE -lperl "; + } + elsif ( -e "/System/Library/Perl/darwin/CORE/libperl.dylib" ) { + $self->{'LDDLFLAGS'} .= " -L/System/Library/Perl/darwin/CORE -lperl "; + } + else { + warn "Can't find libperl.dylib"; + } + $self->{'LDFLAGS'} =~ s/-flat_namespace//; + $self->{'LDFLAGS'} =~ s/-undefined\s+suppress//; + } elsif ($^O =~ /(openbsd)/i) + { + # -Bforcearchive is bad news for Tk - we don't want all of libpTk.a in all .so-s. + $self->{'LDDLFLAGS'} =~ s/-Bforcearchive\s*//g; + } + return $self->MM::const_config; +} + +sub constants +{ + my $self = shift; + local $_ = $self->MM::constants; + s/(\.SUFFIXES)/$1:\n$1/; + $_ .= "\nGCCOPT = $Tk::Config::gccopt\n"; + if ($IsWin32) + { + } + $_; +} + +sub cflags +{ + my $self = shift; + local $_ = $self->MM::cflags; + if (0 && $IsWin32) + { + if ($Config::Config{cc} =~ /^bcc/i) { + # s/(CCFLAGS\s*=)/$1/; + } + else { + s/(CCFLAGS\s*=)/$1 \$(cflags) \$(cvarsdll)/; + s/(OPTIMIZE\s*=).*/$1 \$(cdebug)/; + } + } + $_; +} + +sub c_o +{ + my $self = shift; + local $_ = $self->MM::c_o; + s/\$\(DEFINE\)/\$(DEFINE) \$(GCCOPT)/g; + $_; +} + +sub xs_o +{ + my $self = shift; + local $_ = $self->MM::xs_o; + s/\$\(DEFINE\)/\$(DEFINE) \$(GCCOPT)/g; + $_; +} + +sub manifypods +{ + my $self = shift; + # Maybe always call UNIX version - we HTMLize them later + local $_ = $self->MM::manifypods; + if ($] >= 5.00565) + { + s/(POD2MAN_EXE.*pod2man.*)/$1 --center "perl\/Tk Documentation" --release "Tk\$(VERSION)"/; + } + elsif ($] >= 5.003) + { + s/(POD2MAN_EXE.*pod2man.*)/$1 -center "perl\/Tk Documentation" -release "Tk\$(VERSION)"/; + } + else + { + s/(POD2MAN_EXE.*pod2man.*)/$1 -center \\"perl\/Tk Documentation\\" -release \\"Tk\$(VERSION)\\"/; + } + s/\bpod::/Tk::/mg; + s/\bpTk:://mg; + $_; +} + +sub findINC +{ + my $file = shift; + my $dir; + foreach $dir (@INC) + { + my $try = "$dir/$file"; + return $try if (-f $try); + } + die "Cannot find $file in \@INC\n"; +} + + +sub makefile +{ + my $self = shift; + my $str = $self->MM::makefile; + my $mm = findINC('Tk/MMutil.pm'); + my $cf = findINC('Tk/Config.pm'); + $str =~ s/(\$\(CONFIGDEP\))/$1 $cf $mm/; + $str =~ s/\$\(OBJECT\)\s*:.*\n//; + return $str; +} + +sub installed_tk +{ + my $tk; + my $dir; + foreach $dir (@INC) + { + if (-f "$dir/tkGlue.h") + { + $tk = relpath($dir); + last; + } + my $try = "$dir/Tk"; + if (-f "$try/tkGlue.h") + { + $tk = relpath($try,$dir); + last; + } + } + die "Cannot find perl/Tk include files\n" unless (defined $tk); + $tk =~ s,^(\./)+,,; + return $tk; +} + +sub installbin +{ + my ($self) = @_; + my $str = $self->MM::installbin; + my $prog = 'perl'; # $self->{'MAP_TARGET'} || 'perl'; + my $inc = findINC('Tk/MMutil.pm'); + $inc =~ s,/Tk/MMutil.pm$,,; + $inc = relpath($inc); + $str =~ s/^\tcp\s/\t\$(PERL) -I$inc -MTk::install -e installbin $prog /mg; + return $str; +} + +sub findpTk +{ + my $ptk; + my $dir; + foreach $dir (map(abspath($_),@_),@INC) + { + my $try = "$dir/pTk"; + if (-d $try && (-f "$try/Lang.h" || -f "$try/libpTk\$(LIB_EXT)")) + { + $ptk = relpath($try,$dir); + last; + } + } + confess "Cannot locate pTk\n" unless (defined $ptk); + return $ptk; +} + +sub find_subdir +{ + my %dir; + opendir(DIR,'.') || die "Cannot opendir:$!"; + foreach my $dir (readdir(DIR)) + { + next if $dir =~ /^\.\.?$/; + next if -l $dir; + next unless -d $dir; + if (-f "$dir/Makefile.PL") + { + my $exc = ($win_arch eq 'x') ? 'Unix' : 'Win'; + if (-f "$dir/Not${exc}.exc") + { + warn "Skip $dir on $win_arch\n" + } + else + { + $dir{$dir} = 1 + } + } + } + closedir(DIR); + return \%dir; +} + +sub TkExtMakefile +{ + my (%att) = @_; + if ($Config{'ccflags'} =~ /-DPERL_OBJECT/) + { + $att{'CAPI'} = 'TRUE' unless exists $att{'CAPI'}; + } + unless (exists $att{'DIR'}) + { + my $dir = find_subdir(); + $att{'DIR'} = [sort(keys %$dir)]; + } + unless (exists $att{'NAME'}) + { + my $dir = getcwd; + my ($pack) = $dir =~ m#/([^/]+)$#; + if (defined $pack) + { + $att{NAME} = 'Tk::'.$pack; + } + else + { + warn "No Name and cannot deduce from '$dir'"; + } + } + my $tk = installed_tk(); + $att{'macro'} = {} unless (exists $att{'macro'}); + $att{'macro'}{'TKDIR'} = $tk; + my @opt = ('VERSION' => $Tk::Config::VERSION, + 'XS_VERSION' => $Tk::Config::VERSION); + push(@opt,'clean' => {} ) unless (exists $att{'clean'}); + $att{'clean'}->{FILES} = '' unless (exists $att{'clean'}->{FILES}); + $att{'clean'}->{FILES} .= ' *.bak'; + unless (exists($att{'linkext'}) && $att{linkext}{LINKTYPE} eq '') + { + my $ptk = findpTk($tk); + my @tm = (findINC('Tk/typemap')); + unshift(@tm,@{$att{'TYPEMAPS'}}) if (exists $att{'TYPEMAPS'}); + $att{'TYPEMAPS'} = \@tm; + my $i = delete ($att{'INC'}); + $i = (defined $i) ? "$i $inc" : $inc; + if (delete $att{'dynamic_ptk'}) + { + push(@opt, + 'MYEXTLIB' => "$ptk/libpTk\$(LIB_EXT)", +# 'dynamic_lib' => { INST_DYNAMIC_DEP => "$ptk/libpTk\$(LIB_EXT)" } + ); + } + # Several loadable widgets use things from -lm + # if platform does not have a shared -lm need to link against it + if ($Config{libs} =~/-lm\b/) + { + my $libs = $att{'LIBS'}->[0]; + $att{'LIBS'}->[0] = "$libs -lm" unless $libs =~ /-lm\b/; + } + if ($IsWin32 && $Config{'cc'} =~ /^bcc/) + { + # Borland compiler is very dumb at finding files + $i = "-I$tk $i"; + $i = "-I$ptk $i"; + } + if ($IsWin32 && $Config{'cc'} =~ /^gcc/i) + { + my $base = $Config{'libpth'}; + $base =~ s#lib$#i386-mingw32/lib#; + my $extra = "-L$base -lcomdlg32 -lgdi32"; + my $libs = $att{'LIBS'}->[0]; + $att{'LIBS'}->[0] = "$extra $libs"; + } + if ($^O eq 'cygwin') + { + # NOTE: use gcc -shared instead of dllwrap (ld2), + # dllwrap tries to resolve all symbols, even those + # that are brought in from libraries like libpTk.a + push(@opt,'LD' => 'gcc -shared'); + if ($win_arch eq 'MSWin32') + { + my $extra = "-L/lib/w32api -lcomdlg32 -lgdi32"; + my $libs = $att{'LIBS'}->[0]; + $att{'LIBS'}->[0] = "$extra $libs"; + $att{'DEFINE'} .= ' -D__WIN32__ -D_WIN32'; + $att{'DEFINE'} .= ' -DWIN32' if($att{'NAME'} eq 'Tk::pTk'); + } + elsif ($win_arch eq 'x') + { + $att{'DEFINE'} .= ' -U_WIN32'; + } + } + if (delete $att{'ptk_include'}) + { + $i = "-I$ptk $i" unless ($ptk eq '.'); + } + else + { + $i = "-I$tk $i" unless ($tk eq '.'); + } + push(@opt,'DEFINE' => $define, 'INC' => $i); + } + WriteMakefile(@opt, %att); +} + +sub import +{ + no strict 'refs'; + my $class = shift; + my @list = (@_) ? @_ : @{"${class}::MYEXPORT"}; + my $name; + foreach $name (@list) + { + *{"MY::$name"} = \&{"$name"}; + } +} + + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/MainWindow.pm b/Master/tlpkg/tlperl.old/lib/Tk/MainWindow.pm new file mode 100644 index 00000000000..5384ccb560b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/MainWindow.pm @@ -0,0 +1,213 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::MainWindow; +use base qw(Tk::Toplevel); +BEGIN { @MainWindow::ISA = 'Tk::MainWindow' } + +use strict; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #12 $ =~ /\D(\d+)\s*$/; + +use Tk::CmdLine; +use Tk qw(catch); +require Tk::Toplevel; + +use Carp; + +$| = 1; + +my $pid = $$; + +my %Windows = (); + +sub CreateArgs +{ + my ($class,$args) = @_; + my $cmd = Tk::CmdLine->CreateArgs(); + my $key; + foreach $key (keys %$cmd) + { + $args->{$key} = $cmd->{$key} unless exists $args->{$key}; + } + my %result = $class->SUPER::CreateArgs(undef,$args); + my $name = delete($args->{'-name'}); + unless (Tk::tainting) + { + $ENV{'DISPLAY'} = ':0' unless (exists $ENV{'DISPLAY'}); + $result{'-screen'} = $ENV{'DISPLAY'} unless exists $result{'-screen'}; + } + return (-name => "\l$name",%result); +} + +sub new +{ + my $package = shift; + if (@_ > 0 && $_[0] =~ /:\d+(\.\d+)?$/) + { + carp "Usage $package->new(-screen => '$_[0]' ...)" if $^W; + unshift(@_,'-screen'); + } + croak('Odd number of args'."$package->new(" . join(',',@_) .')') if @_ % 2; + my %args = @_; + + my $top = eval { bless Create($package->CreateArgs(\%args)), $package }; + croak($@ . "$package->new(" . join(',',@_) .')') if ($@); + $top->apply_command_line; + $top->InitBindings; + $top->SetBindtags; + $top->InitObject(\%args); + eval { $top->configure(%args) }; + croak "$@" if ($@); + if (($top->positionfrom||'') ne 'user' and ($top->sizefrom||'') ne 'user') { + my $geometry = $top->optionGet(qw(geometry Geometry)); + if ($geometry) { + $top->geometry($geometry); + } + } + $Windows{$top} = $top; + return $top; +} + +sub _Destroyed +{ + my $top = shift; + $top->SUPER::_Destroyed; + delete $Windows{$top}; +} + +sub InitBindings +{ + my $mw = shift; + $mw->bind('all','<Tab>','focusNext'); + # <<LeftTab>> is named <<PrevWindow>> in Tcl/Tk + $mw->eventAdd(qw[<<LeftTab>> <Shift-Tab>]); + # This is needed for XFree86 systems + catch { $mw->eventAdd(qw[<<LeftTab>> <ISO_Left_Tab>]) }; + # This seems to be correct on *some* HP systems. + catch { $mw->eventAdd(qw[<<LeftTab>> <hpBackTab>]) }; + $mw->bind('all','<<LeftTab>>','focusPrev'); + if ($mw->windowingsystem eq 'x11') + { + $mw->eventAdd(qw[<<Cut>> <Control-Key-x> <Key-F20> <Meta-Key-w>]); + $mw->eventAdd(qw[<<Copy>> <Control-Key-c> <Key-F16> <Control-Key-w>]); + $mw->eventAdd(qw[<<Paste>> <Control-Key-v> <Key-F18> <Control-Key-y>]); + $mw->eventAdd(qw[<<PasteSelection>> <ButtonRelease-2>]); + $mw->eventAdd(qw[<<Undo>> <Control-Key-z> <Key-Undo> <Key-F14> + <Control-Key-underscore>]); + $mw->eventAdd(qw[<<Redo>> <Control-Key-y> <Shift-Key-Undo> <Key-F12> <Shift-Key-F14>]); + } + elsif ($mw->windowingsystem eq 'win32') + { + $mw->eventAdd(qw[<<Cut>> <Control-Key-x> <Shift-Key-Delete>]); + $mw->eventAdd(qw[<<Copy>> <Control-Key-c> <Control-Key-Insert>]); + $mw->eventAdd(qw[<<Paste>> <Control-Key-v> <Shift-Key-Insert>]); + $mw->eventAdd(qw[<<Undo>> <Control-Key-z>]); + $mw->eventAdd(qw[<<Redo>> <Control-Key-y>]); + } + elsif ($mw->windowingsystem eq 'aqua') + { + $mw->eventAdd(qw[<<Cut>> <Command-Key-x> <Key-F2>]); + $mw->eventAdd(qw[<<Copy>> <Command-Key-c> <Key-F3>]); + $mw->eventAdd(qw[<<Paste>> <Command-Key-v> <Key-F4>]); + $mw->eventAdd(qw[<<PasteSelection>> <ButtonRelease-2>]); + $mw->eventAdd(qw[<<Clear>> <Clear>]); + $mw->eventAdd(qw[<<Undo>> <Command-Key-z>]); + $mw->eventAdd(qw[<<Redo>> <Command-Key-y>]); + } + elsif ($mw->windowingsystem eq 'classic') + { + $mw->eventAdd(qw[<<Cut>> <Control-Key-x> <Key-F2>]); + $mw->eventAdd(qw[<<Copy>> <Control-Key-c> <Key-F3>]); + $mw->eventAdd(qw[<<Paste>> <Control-Key-v> <Key-F4>]); + $mw->eventAdd(qw[<<PasteSelection>> <ButtonRelease-2>]); + $mw->eventAdd(qw[<<Clear>> <Clear>]); + $mw->eventAdd(qw[<<Undo>> <Control-Key-z> <Key-F1>]); + $mw->eventAdd(qw[<<Redo>> <Control-Key-Z>]); + } + + # FIXME - Should these move to Menubutton ? + my $c = ($Tk::platform eq 'unix') ? 'all' : 'Tk::Menubutton'; + $mw->bind($c,'<Alt-KeyPress>',['TraverseToMenu',Tk::Ev('K')]); + $mw->bind($c,'<F10>','FirstMenu'); +} + +sub Existing +{ + my @Windows; + foreach my $name (keys %Windows) + { + my $obj = $Windows{$name}; + if (Tk::Exists($obj)) + { + push(@Windows,$obj); + } + else + { + delete $Windows{$name}; + } + } + return @Windows; +} + +END +{ + if (Tk::IsParentProcess()) + { + foreach my $top (values %Windows) + { + if ($top->IsWidget) + { + # Tk data structuctures are still in place + # this can occur if non-callback perl code did a 'die'. + # It will also handle some cases of non-Tk 'exit' being called + # Destroy this mainwindow and hence is descendants ... + $top->destroy; + } + } + } +} + +sub CmdLine { return shift->command } + +sub WMSaveYourself +{ + my $mw = shift; + my @args = @{$mw->command}; +# warn 'preWMSaveYourself:'.join(' ',@args)."\n"; + @args = ($0) unless (@args); + my $i = 1; + while ($i < @args) + { + if ($args[$i] eq '-iconic') + { + splice(@args,$i,1); + } + elsif ($args[$i] =~ /^-(geometry|iconposition)$/) + { + splice(@args,$i,2); + } + } + + my @ip = $mw->wm('iconposition'); +# print 'ip ',join(',',@ip),"\n"; + my $icon = $mw->iconwindow; + if (defined($icon)) + { + @ip = $icon->geometry =~ /\d+x\d+([+-]\d+)([+-]\d+)/; + } + splice(@args,1,0,'-iconposition' => join(',',@ip)) if (@ip == 2); + + splice(@args,1,0,'-iconic') if ($mw->state() eq 'iconic'); + + splice(@args,1,0,'-geometry' => $mw->geometry); +# warn 'postWMSaveYourself:'.join(' ',@args)."\n"; + $mw->command([@args]); +} + +1; + +__END__ + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Tk/MakeDepend.pm b/Master/tlpkg/tlperl.old/lib/Tk/MakeDepend.pm new file mode 100644 index 00000000000..bfb7b43ccbc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/MakeDepend.pm @@ -0,0 +1,292 @@ +package Tk::MakeDepend; +use strict; +use vars qw(%define); +use Config; + +my @include; + +use Carp; + +$SIG{__DIE__} = \&Carp::confess; + + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #13 $ =~ /\D(\d+)\s*$/; + +sub scan_file; + +sub do_include +{ + my ($inc,$dep,@include) = @_; + foreach my $dir (@include) + { + my $path = "$dir/$inc"; + if (-f $path) + { + scan_file($path,$dep) unless exists $dep->{$path}; + return; + } + } + warn "Cannot find '$inc' assume made\n"; + $dep->{$inc} = 1; +} + +sub remove_comment +{ + s#^\s*/\*.*?\*/\s*##g; +} + + +sub term +{ + remove_comment(); + return !term() if s/^\s*!//; + return exists($define{$1}) if s/^\s*defined\s*\(([_A-Za-z][_\w]*)\s*\)//; + return exists($define{$1}) if s/^\s*defined\s*([_A-Za-z][_\w]*)//; + return eval "$1" if s/^\s*(0x[0-9a-f]+)//i; + return $1 if s/^\s*(\d+)//; + return $define{$1} || 0 if s/^\s*([_A-Za-z][_\w]*)//; + if (s/^\s*\(//) + { + my $val = expression(0); + warn "Missing ')'\n" unless s/^\s*\)//; + return $val; + } + warn "Invalid term:$_"; + return undef; +} + +my %pri = ( '&&' => 4, + '||' => 3, + '>=' => 2, '<=' => 2, '<' => 2, '>' => 2, + '==' => 1, '!=' => 1 ); + +sub expression +{ + my $pri = shift; + # printf STDERR "%d# expr . $_\n"; + my $invert = 0; + my $lhs = term() || 0; + remove_comment(); + while (/^\s*(&&|\|\||>=?|<=?|==|!=)/) + { + my $op = $1; + last unless ($pri{$op} >= $pri); + s/^\s*\Q$op\E//; + # printf STDERR "%d# $lhs $op . $_\n"; + my $rhs = expression($pri{$op}) || 0; + my $e = "$lhs $op $rhs"; + $lhs = eval "$e" || 0; + die "'$e' $@" if $@; + remove_comment(); + } + return $lhs; +} + +sub do_if +{ + my ($key,$expr) = @_; + chomp($expr); + if ($key eq 'ifdef' || $key eq 'ifndef') + { + if ($expr =~ /^\s*(\w+)/) + { + my $val = exists $define{$1}; + $val = !$val if ($key eq 'ifndef'); +# printf STDERR "%d from $key $expr\n",$val; + return $val; + } + } + else + { + local $_ = $expr; + my $val = expression(0) != 0; + warn "trailing: $_" if /\S/; + #printf STDERR "%d from $key $expr\n",$val; + return $val; + } +} + +sub scan_file +{ + no strict 'refs'; + my ($file,$dep) = @_; + open($file,"<$file") || die "Cannot open $file:$!"; + local $_; + my ($srcdir) = $file =~ m#^(.*)[\\/][^\\/]*$#; + $srcdir = '.' unless defined $srcdir; + my $live = 1; + $dep->{$file} = 1; + my @stack; + while (<$file>) + { + $_ .= <$file> while (s/\\\n/ /); + if (/^\s*#\s*(\w+)\s*(.*?)\s*$/) + { + my $ol = $live; + my $key = $1; + my $rest = $2; + if ($key =~ /^if(.*)$/) + { + push(@stack,$live); + $live &&= do_if($key,$rest); + } + elsif ($key eq 'elif') + { + $live = ($live) ? 0 : $stack[-1]; + $live &&= do_if('if',$rest); + } + elsif ($key eq 'else') + { + $live = ($live) ? 0 : $stack[-1]; + } + elsif ($key eq 'endif') + { + if (@stack) + { + $live = pop(@stack); + } + else + { + die "$file:$.: Mismatched #endif\n"; + } + } + elsif ($live) + { + if ($key eq 'include') + { + do_include($1,$dep,$srcdir,@include) if $rest =~ /^"(.*)"/; + } + elsif ($key eq 'define') + { + if ($rest =~ /^\s*([_A-Za-z][\w_]*)\s*(.*)$/) + { + my $sym = $1; + my $val = $2 || 1; + $val =~ s#\s*/\*.*?\*/\s*# #g; + $define{$sym} = $val; + } + else + { + warn "ignore '$key $rest'\n"; + } + } + elsif ($key eq 'undef') + { + if ($rest =~ /^\s*([_A-Za-z][\w_]*)/) + { + delete $define{$1}; + } + } + elsif ($key =~ /^(line|pragma)$/) + { + + } + else + { + warn "ignore '$key $rest'\n"; + } + } + # printf STDERR "$file:$.: %d $key $rest\n",$live if ($ol != $live); + } + else + { + # print if $live; + } + } + close($file); + if (@stack) + { + warn "$file:$.: unclosed #if\n"; + } +} + +sub command_line +{ + @include = (); + local %define = ('__STDC__' => 1 ); + my $data = ''; + my @files; + while (@_ && $_[-1] !~ /^-/) + { + unshift(@files,pop(@_)); + } + my $flags = $Config{ccflags}; + $flags =~ s/^\s+|\s+$//g; + my @opt = (@_, split(/\s+/,$flags)); + while (@opt) + { + local $_ = shift(@opt); + if (/^-I(.*)$/) + { + push @include,$1; + } + elsif (/^-D([^=]+)(?:=(.*))?$/) + { + $define{$1} = $2 || 1; + } + elsif (/^-U(.*)$/) + { + delete $define{$1}; + } + elsif (/^(-.*)$/) + { + # Some option + if ($opt[0] !~ /^-/) + { + # next arg does not start with '-' assume it + # belongs to this option and discard it silently + shift(@opt); + } + } + else + { + # We got confused + warn "Ignoring $1\n"; + } + } + # force /usr/include to be last element of @include + push @include, $Config{'usrinc'} + if (defined $Config{'usrinc'} and $Config{'usrinc'} ne ''); + # warn "Include:@include\n"; + while (@files) + { + local $_ = shift(@files); + unless (/^(.*)\.[^\.]+$/) + { + warn "Skip $_"; + next; + } + local %define = %define; + my $base = $1; + my $file = $_; + my %dep; + warn "Finding dependencies for $file\n"; + scan_file($_,\%dep); + my $str = "\n$base\$(OBJ_EXT) : $base.c"; + delete $dep{$file}; + my @dep = (sort(keys %dep)); + while (@dep) + { + my $dep = shift(@dep); + $dep =~ s#^\./##; + if (length($str)+length($dep) > 70) + { + $data .= "$str \\\n"; + $str = ' '; + } + else + { + $str .= ' '; + } + $str .= $dep; + } + $data .= "$str\n"; + } + return $data; +} + +1; +__END__ + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Menu.pm b/Master/tlpkg/tlperl.old/lib/Tk/Menu.pm new file mode 100644 index 00000000000..91e9aceed61 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Menu.pm @@ -0,0 +1,1145 @@ +# Converted from menu.tcl -- +# +# This file defines the default bindings for Tk menus and menubuttons. +# It also implements keyboard traversal of menus and implements a few +# other utility procedures related to menus. +# +# @(#) menu.tcl 1.34 94/12/19 17:09:09 +# +# Copyright (c) 1992-1994 The Regents of the University of California. +# Copyright (c) 1994 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +package Tk::Menu; +require Tk; +require Tk::Widget; +require Tk::Wm; +require Tk::Derived; +require Tk::Menu::Item; + + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #21 $ =~ /\D(\d+)\s*$/; + +use strict; + +use base qw(Tk::Wm Tk::Derived Tk::Widget); + +Construct Tk::Widget 'Menu'; + +sub Tk_cmd { \&Tk::_menu } + +Tk::Methods('activate','add','clone','delete','entrycget','entryconfigure', + 'index','insert','invoke','post','postcascade','type', + 'unpost','yposition'); + +import Tk qw(Ev); + +sub CreateArgs +{ + my ($package,$parent,$args) = @_; + # Remove from hash %$args any configure-like + # options which only apply at create time (e.g. -class for Frame) + # return these as a list of -key => value pairs + my @result = (); + my $opt; + foreach $opt (qw(-type -screen -visual -colormap)) + { + my $val = delete $args->{$opt}; + push(@result, $opt => $val) if (defined $val); + } + return @result; +} + +sub InitObject +{ + my ($menu,$args) = @_; + my $menuitems = delete $args->{-menuitems}; + $menu->SUPER::InitObject($args); + $menu->ConfigSpecs(-foreground => ['SELF']); + if (defined $menuitems) + { + # If any other args do configure now + if (%$args) + { + $menu->configure(%$args); + %$args = (); + } + $menu->AddItems(@$menuitems) + } +} + +sub AddItems +{ + my $menu = shift; + ITEM: + while (@_) + { + my $item = shift; + if (!ref($item)) + { + $menu->separator; # A separator + } + else + { + my ($kind,$name,%minfo) = ( @$item ); + my $invoke = delete $minfo{'-invoke'}; + if (defined $name) + { + $minfo{-label} = $name unless defined($minfo{-label}); + $menu->$kind(%minfo); + } + else + { + $menu->BackTrace("Don't recognize " . join(' ',@$item)); + } + } # A non-separator + } +} + +# +#------------------------------------------------------------------------- +# Elements of tkPriv that are used in this file: +# +# cursor - Saves the -cursor option for the posted menubutton. +# focus - Saves the focus during a menu selection operation. +# Focus gets restored here when the menu is unposted. +# inMenubutton - The name of the menubutton widget containing +# the mouse, or an empty string if the mouse is +# not over any menubutton. +# popup - If a menu has been popped up via tk_popup, this +# gives the name of the menu. Otherwise this +# value is empty. +# postedMb - Name of the menubutton whose menu is currently +# posted, or an empty string if nothing is posted +# A grab is set on this widget. +# relief - Used to save the original relief of the current +# menubutton. +# window - When the mouse is over a menu, this holds the +# name of the menu; it's cleared when the mouse +# leaves the menu. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Overall note: +# This file is tricky because there are four different ways that menus +# can be used: +# +# 1. As a pulldown from a menubutton. This is the most common usage. +# In this style, the variable tkPriv(postedMb) identifies the posted +# menubutton. +# 2. As a torn-off menu copied from some other menu. In this style +# tkPriv(postedMb) is empty, and the top-level menu is no +# override-redirect. +# 3. As an option menu, triggered from an option menubutton. In thi +# style tkPriv(postedMb) identifies the posted menubutton. +# 4. As a popup menu. In this style tkPriv(postedMb) is empty and +# the top-level menu is override-redirect. +# +# The various binding procedures use the state described above to +# distinguish the various cases and take different actions in each +# case. +#------------------------------------------------------------------------- +# Bind -- +# This procedure is invoked the first time the mouse enters a menubutton +# widget or a menubutton widget receives the input focus. It creates +# all of the class bindings for both menubuttons and menus. +# +# Arguments: +# w - The widget that was just entered or just received +# the input focus. +# event - Indicates which event caused the procedure to be invoked +# (Enter or FocusIn). It is used so that we can carry out +# the functions of that event in addition to setting up +# bindings. +sub ClassInit +{ + my ($class,$mw) = @_; + # Must set focus when mouse enters a menu, in order to allow + # mixed-mode processing using both the mouse and the keyboard. + $mw->bind($class,'<FocusIn>', 'NoOp'); + $mw->bind($class,'<Enter>', 'Enter'); + $mw->bind($class,'<Leave>', ['Leave',Ev('X'),Ev('Y'),Ev('s')]); + $mw->bind($class,'<Motion>', ['Motion',Ev('x'),Ev('y'),Ev('s')]); + $mw->bind($class,'<ButtonPress>','ButtonDown'); + $mw->bind($class,'<ButtonRelease>',['Invoke',1]); + $mw->bind($class,'<space>',['Invoke',0]); + $mw->bind($class,'<Return>',['Invoke',0]); + $mw->bind($class,'<Escape>','Escape'); + $mw->bind($class,'<Left>','LeftArrow'); + $mw->bind($class,'<Right>','RightArrow'); + $mw->bind($class,'<Up>','UpArrow'); + $mw->bind($class,'<Down>','DownArrow'); + $mw->bind($class,'<KeyPress>', ['TraverseWithinMenu',Ev('K')]); + $mw->bind($class,'<Alt-KeyPress>', ['TraverseWithinMenu',Ev('K')]); + return $class; +} + +sub UpArrow +{ + my $menu = shift; + if ($menu->cget('-type') eq 'menubar') + { + $menu->NextMenu('left'); + } + else + { + $menu->NextEntry(-1); + } +} + +sub DownArrow +{ + my $menu = shift; + if ($menu->cget('-type') eq 'menubar') + { + $menu->NextMenu('right'); + } + else + { + $menu->NextEntry(1); + } +} + +sub LeftArrow +{ + my $menu = shift; + if ($menu->cget('-type') eq 'menubar') + { + $menu->NextEntry(-1); + } + else + { + $menu->NextMenu('left'); + } +} + +sub RightArrow +{ + my $menu = shift; + if ($menu->cget('-type') eq 'menubar') + { + $menu->NextEntry(1); + } + else + { + $menu->NextMenu('right'); + } +} + + + +# Unpost -- +# This procedure unposts a given menu, plus all of its ancestors up +# to (and including) a menubutton, if any. It also restores various +# values to what they were before the menu was posted, and releases +# a grab if there's a menubutton involved. Special notes: +# 1. It's important to unpost all menus before releasing the grab, so +# that any Enter-Leave events (e.g. from menu back to main +# application) have mode NotifyGrab. +# 2. Be sure to enclose various groups of commands in "catch" so that +# the procedure will complete even if the menubutton or the menu +# or the grab window has been deleted. +# +# Arguments: +# menu - Name of a menu to unpost. Ignored if there +# is a posted menubutton. +sub Unpost +{ + my $menu = shift; + my $mb = $Tk::postedMb; + + # Restore focus right away (otherwise X will take focus away when + # the menu is unmapped and under some window managers (e.g. olvwm) + # we'll lose the focus completely). + + eval {local $SIG{__DIE__}; $Tk::focus->focus() } if (defined $Tk::focus); + undef $Tk::focus; + + # Unpost menu(s) and restore some stuff that's dependent on + # what was posted. + eval {local $SIG{__DIE__}; + if (defined $mb) + { + $menu = $mb->cget('-menu'); + $menu->unpost(); + $Tk::postedMb = undef; + $mb->configure('-cursor',$Tk::cursor); + $mb->configure('-relief',$Tk::relief) + } + elsif (defined $Tk::popup) + { + $Tk::popup->unpost(); + my $grab = $Tk::popup->grabCurrent; + $grab->grabRelease if (defined $grab); + + undef $Tk::popup; + } + elsif (defined $menu && ref $menu && + $menu->cget('-type') ne 'menubar' && + $menu->cget('-type') ne 'tearoff' + ) + { + # We're in a cascaded sub-menu from a torn-off menu or popup. + # Unpost all the menus up to the toplevel one (but not + # including the top-level torn-off one) and deactivate the + # top-level torn off menu if there is one. + while (1) + { + my $parent = $menu->parent; + last if (!$parent->IsMenu || !$parent->ismapped); + $parent->postcascade('none'); + $parent->GenerateMenuSelect; + $parent->activate('none'); + my $type = $parent->cget('-type'); + last if ($type eq 'menubar' || $type eq 'tearoff'); + $menu = $parent + } + $menu->unpost() if ($menu->cget('-type') ne 'menubar'); + } + }; + warn "$@" if ($@); + if ($Tk::tearoff || $Tk::menubar) + { + # Release grab, if any. + if (defined $menu && ref $menu) + { + my $grab = $menu->grabCurrent; + $grab->grabRelease if (defined $grab); + } + RestoreOldGrab(); + if ($Tk::menubar) + { + $Tk::menubar->configure(-cursor => $Tk::cursor); + undef $Tk::menubar; + } + if ($Tk::platform ne 'unix') + { + undef $Tk::tearoff; + } + } +} + +sub RestoreOldGrab +{ + if (defined $Tk::oldGrab) + { + eval + { + local $SIG{__DIE__}; + if ($Tk::grabStatus eq 'global') + { + $Tk::oldGrab->grabGlobal; + } + else + { + $Tk::oldGrab->grab; + } + }; + undef $Tk::oldGrab; + } +} + +sub typeIS +{my $w = shift; + my $type = $w->type(shift); + return defined $type && $type eq shift; +} + +# Motion -- +# This procedure is called to handle mouse motion events for menus. +# It does two things. First, it resets the active element in the +# menu, if the mouse is over the menu. Second, if a mouse button +# is down, it posts and unposts cascade entries to match the mouse +# position. +# +# Arguments: +# menu - The menu window. +# y - The y position of the mouse. +# state - Modifier state (tells whether buttons are down). +sub Motion +{ + my $menu = shift; + my $x = shift; + my $y = shift; + my $state = shift; + my $t = $menu->cget('-type'); + + if ($menu->IS($Tk::window)) + { + if ($menu->cget('-type') eq 'menubar') + { +# if (defined($Tk::focus) && $Tk::focus != $menu) + { + $menu->activate("\@$x,$y"); + $menu->GenerateMenuSelect; + } + } + else + { + $menu->activate("\@$x,$y"); + $menu->GenerateMenuSelect; + } + } + if (($state & 0x1f00) != 0) + { + $menu->postcascade('active') + } +} +# ButtonDown -- +# Handles button presses in menus. There are a couple of tricky things +# here: +# 1. Change the posted cascade entry (if any) to match the mouse position. +# 2. If there is a posted menubutton, must grab to the menubutton so +# that it can track mouse motions over other menubuttons and change +# the posted menu. +# 3. If there's no posted menubutton (e.g. because we're a torn-off menu +# or one of its descendants) must grab to the top-level menu so that +# we can track mouse motions across the entire menu hierarchy. + +# +# Arguments: +# menu - The menu window. +sub ButtonDown +{ + my $menu = shift; + $menu->postcascade('active'); + if (defined $Tk::postedMb) + { + $Tk::postedMb->grabGlobal + } + else + { + while ($menu->cget('-type') eq 'normal' + && $menu->parent->IsMenu + && $menu->parent->ismapped + ) + { + $menu = $menu->parent; + } + + if (!defined $Tk::menuBar) + { + $Tk::menuBar = $menu; + $Tk::cursor = $menu->cget('-cursor'); + $menu->configure(-cursor => 'arrow'); + } + + # Don't update grab information if the grab window isn't changing. + # Otherwise, we'll get an error when we unpost the menus and + # restore the grab, since the old grab window will not be viewable + # anymore. + + $menu->SaveGrabInfo unless ($menu->IS($menu->grabCurrent)); + + # Must re-grab even if the grab window hasn't changed, in order + # to release the implicit grab from the button press. + + $menu->grabGlobal if ($Tk::platform eq 'unix'); + } +} + +sub Enter +{ + my $w = shift; + my $ev = $w->XEvent; + $Tk::window = $w; + if ($w->cget('-type') eq 'tearoff') + { + if ($ev->m ne 'NotifyUngrab') + { + $w->SetFocus if ($Tk::platform eq 'unix'); + } + } + $w->Motion($ev->x, $ev->y, $ev->s); +} + +# Leave -- +# This procedure is invoked to handle Leave events for a menu. It +# deactivates everything unless the active element is a cascade element +# and the mouse is now over the submenu. +# +# Arguments: +# menu - The menu window. +# rootx, rooty - Root coordinates of mouse. +# state - Modifier state. +sub Leave +{ + my $menu = shift; + my $rootx = shift; + my $rooty = shift; + my $state = shift; + undef $Tk::window; + return if ($menu->index('active') eq 'none'); + if ($menu->typeIS('active','cascade')) + { + my $c = $menu->Containing($rootx,$rooty); + return if (defined $c && $menu->entrycget('active','-menu')->IS($c)); + } + $menu->activate('none'); + $menu->GenerateMenuSelect; +} + +# Invoke -- +# This procedure is invoked when button 1 is released over a menu. +# It invokes the appropriate menu action and unposts the menu if +# it came from a menubutton. +# +# Arguments: +# w - Name of the menu widget. +sub Invoke +{ + my $w = shift; + my $release = shift; + + if ($release && !defined($Tk::window)) + { + # Mouse was pressed over a menu without a menu button, then + # dragged off the menu (possibly with a cascade posted) and + # released. Unpost everything and quit. + + $w->postcascade('none'); + $w->activate('none'); + $w->eventGenerate('<<MenuSelect>>'); + $w->Unpost; + return; + } + + my $type = $w->type('active'); + if ($w->typeIS('active','cascade')) + { + $w->postcascade('active'); + my $menu = $w->entrycget('active','-menu'); + $menu->FirstEntry() if (defined $menu); + } + elsif ($w->typeIS('active','tearoff')) + { + $w->Unpost(); + $w->tearOffMenu(); + } + elsif ($w->typeIS('active','menubar')) + { + $w->postcascade('none'); + $w->activate('none'); + $w->eventGenerate('<<MenuSelect>>'); + $w->Unpost; + } + else + { + $w->Unpost(); + $w->invoke('active') + } +} +# Escape -- +# This procedure is invoked for the Cancel (or Escape) key. It unposts +# the given menu and, if it is the top-level menu for a menu button, +# unposts the menu button as well. +# +# Arguments: +# menu - Name of the menu window. +sub Escape +{ + my $menu = shift; + my $parent = $menu->parent; + if (!$parent->IsMenu) + { + $menu->Unpost() + } + elsif ($parent->cget('-type') eq 'menubar') + { + $menu->Unpost; + RestoreOldGrab(); + } + else + { + $menu->NextMenu(-1) + } +} +# LeftRight -- +# This procedure is invoked to handle "left" and "right" traversal +# motions in menus. It traverses to the next menu in a menu bar, +# or into or out of a cascaded menu. +# +# Arguments: +# menu - The menu that received the keyboard +# event. +# direction - Direction in which to move: "left" or "right" +sub NextMenu +{ + my $menu = shift; + my $direction = shift; + # First handle traversals into and out of cascaded menus. + my $count; + if ($direction eq 'right') + { + $count = 1; + if ($menu->typeIS('active','cascade')) + { + $menu->postcascade('active'); + my $m2 = $menu->entrycget('active','-menu'); + $m2->FirstEntry if (defined $m2); + return; + } + else + { + my $parent = $menu->parent; + while ($parent->PathName ne '.') + { + if ($parent->IsMenu && $parent->cget('-type') eq 'menubar') + { + $parent->SetFocus; + $parent->NextEntry(1); + return; + } + $parent = $parent->parent; + } + } + } + else + { + $count = -1; + my $m2 = $menu->parent; + if ($m2->IsMenu) + { + if ($m2->cget('-type') ne 'menubar') + { + $menu->activate('none'); + $menu->GenerateMenuSelect; + $m2->SetFocus; + # This code unposts any posted submenu in the parent. + my $tmp = $m2->index('active'); + $m2->activate('none'); + $m2->activate($tmp); + return; + } + } + } + # Can't traverse into or out of a cascaded menu. Go to the next + # or previous menubutton, if that makes sense. + + my $m2 = $menu->parent; + if ($m2->IsMenu) + { + if ($m2->cget('-type') eq 'menubar') + { + $m2->SetFocus; + $m2->NextEntry(-1); + return; + } + } + + my $w = $Tk::postedMb; + return unless defined $w; + my @buttons = $w->parent->children; + my $length = @buttons; + my $i = Tk::lsearch(\@buttons,$w)+$count; + my $mb; + while (1) + { + while ($i < 0) + { + $i += $length + } + while ($i >= $length) + { + $i += -$length + } + $mb = $buttons[$i]; + last if ($mb->IsMenubutton && $mb->cget('-state') ne 'disabled' + && defined($mb->cget('-menu')) + && $mb->cget('-menu')->index('last') ne 'none' + ); + return if ($mb == $w); + $i += $count + } + $mb->PostFirst(); +} +# NextEntry -- +# Activate the next higher or lower entry in the posted menu, +# wrapping around at the ends. Disabled entries are skipped. +# +# Arguments: +# menu - Menu window that received the keystroke. +# count - 1 means go to the next lower entry, +# -1 means go to the next higher entry. +sub NextEntry +{ + my $menu = shift; + my $count = shift; + if ($menu->index('last') eq 'none') + { + return; + } + my $length = $menu->index('last')+1; + my $quitAfter = $length; + my $active = $menu->index('active'); + my $i = ($active eq 'none') ? 0 : $active+$count; + while (1) + { + return if ($quitAfter <= 0); + while ($i < 0) + { + $i += $length + } + while ($i >= $length) + { + $i += -$length + } + my $state = eval {local $SIG{__DIE__}; $menu->entrycget($i,'-state') }; + last if (defined($state) && $state ne 'disabled'); + return if ($i == $active); + $i += $count; + $quitAfter -= 1; + } + $menu->activate($i); + $menu->GenerateMenuSelect; + if ($menu->cget('-type') eq 'menubar' && $menu->type($i) eq 'cascade') + { + my $cascade = $menu->entrycget($i, '-menu'); + $menu->postcascade($i); + $cascade->FirstEntry if (defined $cascade); + } +} + + +# tkTraverseWithinMenu +# This procedure implements keyboard traversal within a menu. It +# searches for an entry in the menu that has "char" underlined. If +# such an entry is found, it is invoked and the menu is unposted. +# +# Arguments: +# w - The name of the menu widget. +# char - The character to look for; case is +# ignored. If the string is empty then +# nothing happens. +sub TraverseWithinMenu +{ + my $w = shift; + my $char = shift; + return unless (defined $char); + $char = "\L$char"; + my $last = $w->index('last'); + return if ($last eq 'none'); + for (my $i = 0;$i <= $last;$i += 1) + { + my $label = eval {local $SIG{__DIE__}; $w->entrycget($i,'-label') }; + next unless defined($label); + my $ul = $w->entrycget($i,'-underline'); + if (defined $ul && $ul >= 0) + { + $label = substr("\L$label",$ul,1); + if (defined($label) && $label eq $char) + { + if ($w->type($i) eq 'cascade') + { + $w->postcascade($i); + $w->activate($i); + my $m2 = $w->entrycget($i,'-menu'); + $m2->FirstEntry if (defined $m2); + } + else + { + $w->Unpost(); + $w->invoke($i); + } + return; + } + } + } +} + +sub FindMenu +{ + my ($menu,$char) = @_; + if ($menu->cget('-type') eq 'menubar') + { + if (!defined($char) || $char eq '') + { + $menu->FirstEntry; + } + else + { + $menu->TraverseWithinMenu($char); + } + return $menu; + } + return undef; +} + + +# FirstEntry -- +# Given a menu, this procedure finds the first entry that isn't +# disabled or a tear-off or separator, and activates that entry. +# However, if there is already an active entry in the menu (e.g., +# because of a previous call to tkPostOverPoint) then the active +# entry isn't changed. This procedure also sets the input focus +# to the menu. +# +# Arguments: +# menu - Name of the menu window (possibly empty). +sub FirstEntry +{ + my $menu = shift; + return if (!defined($menu) || $menu eq '' || !ref($menu)); + $menu->SetFocus; + return if ($menu->index('active') ne 'none'); + my $last = $menu->index('last'); + return if ($last eq 'none'); + for (my $i = 0;$i <= $last;$i += 1) + { + my $state = eval {local $SIG{__DIE__}; $menu->entrycget($i,'-state') }; + if (defined $state && $state ne 'disabled' && !$menu->typeIS($i,'tearoff')) + { + $menu->activate($i); + $menu->GenerateMenuSelect; + if ($menu->type($i) eq 'cascade') + { + my $cascade = $menu->entrycget($i,'-menu'); + if (defined $cascade) + { + $menu->postcascade($i); + $cascade->FirstEntry; + } + } + return; + } + } +} + +# FindName -- +# Given a menu and a text string, return the index of the menu entry +# that displays the string as its label. If there is no such entry, +# return an empty string. This procedure is tricky because some names +# like "active" have a special meaning in menu commands, so we can't +# always use the "index" widget command. +# +# Arguments: +# menu - Name of the menu widget. +# s - String to look for. +sub FindName +{ + my $menu = shift; + my $s = shift; + my $i = undef; + if ($s !~ /^active$|^last$|^none$|^[0-9]|^@/) + { + $i = eval {local $SIG{__DIE__}; $menu->index($s) }; + return $i; + } + my $last = $menu->index('last'); + return if ($last eq 'none'); + for ($i = 0;$i <= $last;$i += 1) + { + my $label = eval {local $SIG{__DIE__}; $menu->entrycget($i,'-label') }; + return $i if (defined $label && $label eq $s); + } + return undef; +} +# PostOverPoint -- +# This procedure posts a given menu such that a given entry in the +# menu is centered over a given point in the root window. It also +# activates the given entry. +# +# Arguments: +# menu - Menu to post. +# x, y - Root coordinates of point. +# entry - Index of entry within menu to center over (x,y). +# If omitted or specified as {}, then the menu's +# upper-left corner goes at (x,y). +sub PostOverPoint +{ + my $menu = shift; + my $x = shift; + my $y = shift; + my $entry = shift; + if (defined $entry) + { + if ($entry == $menu->index('last')) + { + $y -= ($menu->yposition($entry)+$menu->height)/2; + } + else + { + $y -= ($menu->yposition($entry)+$menu->yposition($entry+1))/2; + } + $x -= $menu->reqwidth/2; + } + $menu->post($x,$y); + if (defined($entry) && $menu->entrycget($entry,'-state') ne 'disabled') + { + $menu->activate($entry); + $menu->GenerateMenuSelect; + } +} +# tk_popup -- +# This procedure pops up a menu and sets things up for traversing +# the menu and its submenus. +# +# Arguments: +# menu - Name of the menu to be popped up. +# x, y - Root coordinates at which to pop up the +# menu. +# entry - Index of a menu entry to center over (x,y). +# If omitted or specified as {}, then menu's +# upper-left corner goes at (x,y). +sub Post +{ + my $menu = shift; + return unless (defined $menu); + my $x = shift; + my $y = shift; + my $entry = shift; + Unpost(undef) if (defined($Tk::popup) || defined($Tk::postedMb)); + $menu->PostOverPoint($x,$y,$entry); + $menu->grabGlobal; + $Tk::popup = $menu; + $Tk::focus = $menu->focusCurrent; + $menu->focus(); +} + +sub SetFocus +{ + my $menu = shift; + $Tk::focus = $menu->focusCurrent if (!defined($Tk::focus)); + $menu->focus; +} + +sub GenerateMenuSelect +{ + my $menu = shift; + $Tk::activeMenu = $menu; + $Tk::activeItem = $menu->index('active'); + $menu->eventGenerate('<<MenuSelect>>'); # FIXME +} + +# Converted from tearoff.tcl -- +# +# This file contains procedures that implement tear-off menus. +# +# @(#) tearoff.tcl 1.3 94/12/17 16:05:25 +# +# Copyright (c) 1994 The Regents of the University of California. +# Copyright (c) 1994 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +# tkTearoffMenu -- +# Given the name of a menu, this procedure creates a torn-off menu +# that is identical to the given menu (including nested submenus). +# The new torn-off menu exists as a toplevel window managed by the +# window manager. The return value is the name of the new menu. +# +# Arguments: +# w - The menu to be torn-off (duplicated). +sub tearOffMenu +{ + my $w = shift; + my $x = (@_) ? shift : 0; + my $y = (@_) ? shift : 0; + + $x = $w->rootx if $x == 0; + $y = $w->rooty if $y == 0; + + # Find a unique name to use for the torn-off menu. Find the first + # ancestor of w that is a toplevel but not a menu, and use this as + # the parent of the new menu. This guarantees that the torn off + # menu will be on the same screen as the original menu. By making + # it a child of the ancestor, rather than a child of the menu, it + # can continue to live even if the menu is deleted; it will go + # away when the toplevel goes away. + + my $parent = $w->parent; + while ($parent->toplevel != $parent || $parent->IsMenu) + { + $parent = $parent->parent; + } + my $menu = $w->clone($parent->PathName,'tearoff'); + + # Pick a title for the new menu by looking at the parent of the + # original: if the parent is a menu, then use the text of the active + # entry. If it's a menubutton then use its text. + my $title = $w->cget('-title'); + # print ref($w),' ',$w->PathName," $w\n"; + unless (defined $title && length($title)) + { + $parent = $w->parent; + if ($parent) + { + if ($parent->IsMenubutton) + { + $title = $parent->cget('-text'); + } + elsif ($parent->IsMenu) + { + $title = $parent->entrycget('active','-label'); + } + } + } + $menu->title($title) if (defined $title && length($title)); + $menu->post($x,$y); + # Set tkPriv(focus) on entry: otherwise the focus will get lost + # after keyboard invocation of a sub-menu (it will stay on the + # submenu). + + + # This seems to conflict with <Enter> class binding above + # if this fires before the class binding the wrong thing + # will get saved in $Tk::focus + # $menu->bind('<Enter>','EnterFocus'); + $menu->Callback('-tearoffcommand'); + return $menu; +} + +# tkMenuDup -- +# Given a menu (hierarchy), create a duplicate menu (hierarchy) +# in a given window. +# +# Arguments: +# src - Source window. Must be a menu. It and its +# menu descendants will be duplicated at path. +# path - Name to use for topmost menu in duplicate +# hierarchy. + +sub tkMenuDup +{ + my ($src,$path,$type) = @_; + my ($pname,$name) = $path =~ /^(.*)\.([^\.]*)$/; + ($name) = $src->PathName =~ /^.*\.([^\.]*)$/ unless $name; + my $parent = ($pname) ? $src->Widget($pname) : $src->MainWindow; + my %args = (Name => $name, -type => $type); + foreach my $option ($src->configure()) + { + next if (@$option == 2); + $args{$$option[0]} = $$option[4] unless exists $args{$$option[0]}; + } + my $dst = ref($src)->new($parent,%args); + # print "MenuDup $src $path $name $type ->",$dst->PathName,"\n"; + $_[1] = $dst; + if ($type eq 'tearoff') + { + $dst->transient($parent->toplevel); + } + my $last = $src->index('last'); + if ($last ne 'none') + { + for (my $i = $src->cget('-tearoff'); $i <= $last; $i++) + { + my $type = $src->type($i); + if (defined $type) + { + my @args = (); + foreach my $option ($src->entryconfigure($i)) + { + next if (@$option == 2); + push(@args,$$option[0],$$option[4]) if (defined $$option[4]); + } + $dst->add($type,@args); + } + } + } + # Duplicate the binding tags and bindings from the source menu. + my @bindtags = $src->bindtags; + $path = $src->PathName; + foreach (@bindtags) + { + $_ = $dst if ($_ eq $path); + } + $dst->bindtags([@bindtags]); + foreach my $event ($src->bind) + { + my $cb = $src->bind($event); +# print "$event => $cb\n"; + $dst->bind($event,$cb->Substitute($src,$dst)); + } + return $dst; +} + + + +# Some convenience methods + +sub separator { require Tk::Menu::Item; shift->Separator(@_); } +sub cascade { require Tk::Menu::Item; shift->Cascade(@_); } +sub checkbutton { require Tk::Menu::Item; shift->Checkbutton(@_); } +sub radiobutton { require Tk::Menu::Item; shift->Radiobutton(@_); } + +sub command +{ + my ($menu,%args) = @_; + require Tk::Menu::Item; + if (exists $args{-button}) + { + # Backward compatible stuff from 'Menubar' + my $button = delete $args{-button}; + $button = ['Misc', -underline => 0 ] unless (defined $button); + my @bargs = (); + ($button,@bargs) = @$button if (ref($button) && ref $button eq 'ARRAY'); + $menu = $menu->Menubutton(-label => $button, @bargs); + } + $menu->Command(%args); +} + +sub Menubutton +{ + my ($menu,%args) = @_; + my $name = delete($args{'-text'}) || $args{'-label'};; + $args{'-label'} = $name if (defined $name); + my $items = delete $args{'-menuitems'}; + foreach my $opt (qw(-pack -after -before -side -padx -ipadx -pady -ipady -fill)) + { + delete $args{$opt}; + } + if (defined($name) && !defined($args{-underline})) + { + my $underline = ($name =~ s/^(.*)~/$1/) ? length($1): undef; + if (defined($underline) && ($underline >= 0)) + { + $args{-underline} = $underline; + $args{-label} = $name; + } + } + my $hash = $menu->TkHash('MenuButtons'); + my $mb = $hash->{$name}; + if (defined $mb) + { + delete $args{'-tearoff'}; # too late! + $mb->configure(%args) if %args; + } + else + { + $mb = $menu->cascade(%args); + $hash->{$name} = $mb; + } + $mb->menu->AddItems(@$items) if defined($items) && @$items; + return $mb; +} + +sub BalloonInfo +{ + my ($menu,$balloon,$X,$Y,@opt) = @_; + my $i = $menu->index('active'); + if ($i eq 'none') + { + my $y = $Y - $menu->rooty; + $i = $menu->index("\@$y"); + } + foreach my $opt (@opt) + { + my $info = $balloon->GetOption($opt,$menu); + if ($opt =~ /^-(statusmsg|balloonmsg)$/ && UNIVERSAL::isa($info,'ARRAY')) + { + $balloon->Subclient($i); + return '' if $i eq 'none'; + return ${$info}[$i] || ''; + } + return $info; + } +} + +1; + +__END__ + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Menu/Item.pm b/Master/tlpkg/tlperl.old/lib/Tk/Menu/Item.pm new file mode 100644 index 00000000000..403052ef5bd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Menu/Item.pm @@ -0,0 +1,180 @@ +package Tk::Menu::Item; + +require Tk::Menu; + +use Carp; +use strict; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Tk/Menu/Item.pm#4 $ + +sub PreInit +{ + # Dummy (virtual) method + my ($class,$menu,$minfo) = @_; +} + +sub new +{ + my ($class,$menu,%minfo) = @_; + my $kind = $class->kind; + my $name = $minfo{'-label'}; + if (defined $kind) + { + my $invoke = delete $minfo{'-invoke'}; + if (defined $name) + { + # Use ~ in name/label to set -underline + if (defined($minfo{-label}) && !defined($minfo{-underline})) + { + my $cleanlabel = $minfo{-label}; + my $underline = ($cleanlabel =~ s/^(.*)~/$1/) ? length($1): undef; + if (defined($underline) && ($underline >= 0)) + { + $minfo{-underline} = $underline; + $name = $cleanlabel if ($minfo{-label} eq $name); + $minfo{-label} = $cleanlabel; + } + } + } + else + { + $name = $minfo{'-bitmap'} || $minfo{'-image'}; + croak('No -label') unless defined($name); + $minfo{'-label'} = $name; + } + $class->PreInit($menu,\%minfo); + $menu->add($kind,%minfo); + $menu->invoke('last') if ($invoke); + } + else + { + $menu->add('separator'); + } + return bless [$menu,$name],$class; +} + +sub configure +{ + my $obj = shift; + my ($menu,$name) = @$obj; + my %args = @_; + $obj->[1] = $args{'-label'} if exists $args{'-label'}; + $menu->entryconfigure($name,@_); +} + +sub cget +{ + my $obj = shift; + my ($menu,$name) = @$obj; + $menu->entrycget($name,@_); +} + +sub parentMenu +{ + my $obj = shift; + return $obj->[0]; +} + +# Default "kind" is a command +sub kind { return 'command' } + +# Now the derived packages + +package Tk::Menu::Separator; +use base qw(Tk::Menu::Item); +Construct Tk::Menu 'Separator'; +sub kind { return undef } + +package Tk::Menu::Button; +use base qw(Tk::Menu::Item); +Construct Tk::Menu 'Button'; +Construct Tk::Menu 'Command'; + +#package Tk::Menu::Command; +#use base qw(Tk::Menu::Button); +#Construct Tk::Menu 'Command'; + +package Tk::Menu::Cascade; +use base qw(Tk::Menu::Item); +Construct Tk::Menu 'Cascade'; +sub kind { return 'cascade' } +use Carp; + +sub PreInit +{ + my ($class,$menu,$minfo) = @_; + my $tearoff = delete $minfo->{-tearoff}; + my $items = delete $minfo->{-menuitems}; + my $widgetvar = delete $minfo->{-menuvar}; + my $command = delete $minfo->{-postcommand}; + my $name = delete $minfo->{'Name'}; + $name = $minfo->{'-label'} unless defined $name; + my @args = (); + push(@args, '-tearoff' => $tearoff) if (defined $tearoff); + push(@args, '-menuitems' => $items) if (defined $items); + push(@args, '-postcommand' => $command) if (defined $command); + my $submenu = $minfo->{'-menu'}; + unless (defined $submenu) + { + $minfo->{'-menu'} = $submenu = $menu->Menu(Name => $name, @args); + } + $$widgetvar = $submenu if (defined($widgetvar) && ref($widgetvar)); +} + +sub menu +{ + my ($self,%args) = @_; + my $w = $self->parentMenu; + my $menu = $self->cget('-menu'); + if (!defined $menu) + { + require Tk::Menu; + $w->ColorOptions(\%args); + my $name = $self->cget('-label'); + warn "Had to (re-)reate menu for $name"; + $menu = $w->Menu(Name => $name, %args); + $self->configure('-menu'=>$menu); + } + else + { + $menu->configure(%args) if %args; + } + return $menu; +} + +# Some convenience methods + +sub separator { shift->menu->Separator(@_); } +sub command { shift->menu->Command(@_); } +sub cascade { shift->menu->Cascade(@_); } +sub checkbutton { shift->menu->Checkbutton(@_); } +sub radiobutton { shift->menu->Radiobutton(@_); } + +sub pack +{ + my $w = shift; + if ($^W) + { + require Carp; + Carp::carp("Cannot 'pack' $w - done automatically") + } +} + +package Tk::Menu::Checkbutton; +use base qw(Tk::Menu::Item); +Construct Tk::Menu 'Checkbutton'; +sub kind { return 'checkbutton' } + +package Tk::Menu::Radiobutton; +use base qw(Tk::Menu::Item); +Construct Tk::Menu 'Radiobutton'; +sub kind { return 'radiobutton' } + +package Tk::Menu::Item; + +1; +__END__ + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Menubar.pm b/Master/tlpkg/tlperl.old/lib/Tk/Menubar.pm new file mode 100644 index 00000000000..54b745130bf --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Menubar.pm @@ -0,0 +1,15 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::Menubar; +use strict; + +use vars qw($VERSION); +$VERSION = '4.006'; # $Id: //depot/Tkutf8/Tk/Menubar.pm#6 $ + +use Tk::Frame; +use Tk::Menu; +# use Carp; +# carp "Tk::Menubar is obsolete" if $^W; + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Menubutton.pm b/Master/tlpkg/tlperl.old/lib/Tk/Menubutton.pm new file mode 100644 index 00000000000..59456b2dea2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Menubutton.pm @@ -0,0 +1,398 @@ +# Converted from menu.tcl -- +# +# This file defines the default bindings for Tk menus and menubuttons. +# It also implements keyboard traversal of menus and implements a few +# other utility procedures related to menus. +# +# @(#) menu.tcl 1.34 94/12/19 17:09:09 +# +# Copyright (c) 1992-1994 The Regents of the University of California. +# Copyright (c) 1994 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + + +package Tk::Menubutton; +require Tk; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Menubutton/Menubutton.pm#4 $ + +use base qw(Tk::Widget); + +Construct Tk::Widget 'Menubutton'; + +import Tk qw(&Ev $XS_VERSION); + +bootstrap Tk::Menubutton; + +sub Tk_cmd { \&Tk::menubutton } + +sub InitObject +{ + my ($mb,$args) = @_; + my $menuitems = delete $args->{-menuitems}; + my $tearoff = delete $args->{-tearoff}; + $mb->SUPER::InitObject($args); + if ((defined($menuitems) || defined($tearoff)) && %$args) + { + $mb->configure(%$args); + %$args = (); + } + $mb->menu(-tearoff => $tearoff) if (defined $tearoff); + $mb->AddItems(@$menuitems) if (defined $menuitems) +} + + +# +#------------------------------------------------------------------------- +# Elements of tkPriv that are used in this file: +# +# cursor - Saves the -cursor option for the posted menubutton. +# focus - Saves the focus during a menu selection operation. +# Focus gets restored here when the menu is unposted. +# inMenubutton - The name of the menubutton widget containing +# the mouse, or an empty string if the mouse is +# not over any menubutton. +# popup - If a menu has been popped up via tk_popup, this +# gives the name of the menu. Otherwise this +# value is empty. +# postedMb - Name of the menubutton whose menu is currently +# posted, or an empty string if nothing is posted +# A grab is set on this widget. +# relief - Used to save the original relief of the current +# menubutton. +# window - When the mouse is over a menu, this holds the +# name of the menu; it's cleared when the mouse +# leaves the menu. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Overall note: +# This file is tricky because there are four different ways that menus +# can be used: +# +# 1. As a pulldown from a menubutton. This is the most common usage. +# In this style, the variable tkPriv(postedMb) identifies the posted +# menubutton. +# 2. As a torn-off menu copied from some other menu. In this style +# tkPriv(postedMb) is empty, and the top-level menu is no +# override-redirect. +# 3. As an option menu, triggered from an option menubutton. In thi +# style tkPriv(postedMb) identifies the posted menubutton. +# 4. As a popup menu. In this style tkPriv(postedMb) is empty and +# the top-level menu is override-redirect. +# +# The various binding procedures use the state described above to +# distinguish the various cases and take different actions in each +# case. +#------------------------------------------------------------------------- +# Menu::Bind -- +# This procedure is invoked the first time the mouse enters a menubutton +# widget or a menubutton widget receives the input focus. It creates +# all of the class bindings for both menubuttons and menus. +# +# Arguments: +# w - The widget that was just entered or just received +# the input focus. +# event - Indicates which event caused the procedure to be invoked +# (Enter or FocusIn). It is used so that we can carry out +# the functions of that event in addition to setting up +# bindings. +sub ClassInit +{ + my ($class,$mw) = @_; + $mw->bind($class,'<FocusIn>','NoOp'); + $mw->bind($class,'<Enter>','Enter'); + $mw->bind($class,'<Leave>','Leave'); + $mw->bind($class,'<1>','ButtonDown'); + $mw->bind($class,'<Motion>',['Motion','up',Ev('X'),Ev('Y')]); + $mw->bind($class,'<B1-Motion>',['Motion','down',Ev('X'),Ev('Y')]); + $mw->bind($class,'<ButtonRelease-1>','ButtonUp'); + $mw->bind($class,'<space>','PostFirst'); + $mw->bind($class,'<Return>','PostFirst'); + return $class; +} + +sub ButtonDown +{my $w = shift; + my $Ev = $w->XEvent; + $Tk::inMenubutton->Post($Ev->X,$Ev->Y) if (defined $Tk::inMenubutton); +} + +sub PostFirst +{ + my $w = shift; + my $menu = $w->cget('-menu'); + $w->Post(); + $menu->FirstEntry() if (defined $menu); +} + + +# Enter -- +# This procedure is invoked when the mouse enters a menubutton +# widget. It activates the widget unless it is disabled. Note: +# this procedure is only invoked when mouse button 1 is *not* down. +# The procedure B1Enter is invoked if the button is down. +# +# Arguments: +# w - The name of the widget. +sub Enter +{ + my $w = shift; + $Tk::inMenubutton->Leave if (defined $Tk::inMenubutton); + $Tk::inMenubutton = $w; + if ($w->cget('-state') ne 'disabled') + { + $w->configure('-state','active') + } +} + +sub Leave +{ + my $w = shift; + $Tk::inMenubutton = undef; + return unless Tk::Exists($w); + if ($w->cget('-state') eq 'active') + { + $w->configure('-state','normal') + } +} +# Post -- +# Given a menubutton, this procedure does all the work of posting +# its associated menu and unposting any other menu that is currently +# posted. +# +# Arguments: +# w - The name of the menubutton widget whose menu +# is to be posted. +# x, y - Root coordinates of cursor, used for positioning +# option menus. If not specified, then the center +# of the menubutton is used for an option menu. +sub Post +{ + my $w = shift; + my $x = shift; + my $y = shift; + return if ($w->cget('-state') eq 'disabled'); + return if (defined $Tk::postedMb && $w == $Tk::postedMb); + my $menu = $w->cget('-menu'); + return unless (defined($menu) && $menu->index('last') ne 'none'); + + my $tearoff = $Tk::platform eq 'unix' || $menu->cget('-type') eq 'tearoff'; + + my $wpath = $w->PathName; + my $mpath = $menu->PathName; + unless (index($mpath,"$wpath.") == 0) + { + die "Cannot post $mpath : not a descendant of $wpath"; + } + + my $cur = $Tk::postedMb; + if (defined $cur) + { + Tk::Menu->Unpost(undef); # fixme + } + $Tk::cursor = $w->cget('-cursor'); + $Tk::relief = $w->cget('-relief'); + $w->configure('-cursor','arrow'); + $w->configure('-relief','raised'); + $Tk::postedMb = $w; + $Tk::focus = $w->focusCurrent; + $menu->activate('none'); + $menu->GenerateMenuSelect; + # If this looks like an option menubutton then post the menu so + # that the current entry is on top of the mouse. Otherwise post + # the menu just below the menubutton, as for a pull-down. + + eval + {local $SIG{'__DIE__'}; + my $dir = $w->cget('-direction'); + if ($dir eq 'above') + { + $menu->post($w->rootx, $w->rooty - $menu->ReqHeight); + } + elsif ($dir eq 'below') + { + $menu->post($w->rootx, $w->rooty + $w->Height); + } + elsif ($dir eq 'left') + { + my $x = $w->rootx - $menu->ReqWidth; + my $y = int((2*$w->rooty + $w->Height) / 2); + if ($w->cget('-indicatoron') == 1 && defined($w->cget('-textvariable'))) + { + $menu->PostOverPoint($x,$y,$menu->FindName($w->cget('-text'))) + } + else + { + $menu->post($x,$y); + } + } + elsif ($dir eq 'right') + { + my $x = $w->rootx + $w->Width; + my $y = int((2*$w->rooty + $w->Height) / 2); + if ($w->cget('-indicatoron') == 1 && defined($w->cget('-textvariable'))) + { + $menu->PostOverPoint($x,$y,$menu->FindName($w->cget('-text'))) + } + else + { + $menu->post($x,$y); + } + } + else + { + if ($w->cget('-indicatoron') == 1 && defined($w->cget('-textvariable'))) + { + if (!defined($y)) + { + $x = $w->rootx+$w->width/2; + $y = $w->rooty+$w->height/2 + } + $menu->PostOverPoint($x,$y,$menu->FindName($w->cget('-text'))) + } + else + { + $menu->post($w->rootx,$w->rooty+$w->height); + } + } + }; + if ($@) + { + Tk::Menu->Unpost; + die $@ + } + + $Tk::tearoff = $tearoff; + if ($tearoff) + { + $menu->focus; + $w->SaveGrabInfo; + $w->grabGlobal; + } +} +# Motion -- +# This procedure handles mouse motion events inside menubuttons, and +# also outside menubuttons when a menubutton has a grab (e.g. when a +# menu selection operation is in progress). +# +# Arguments: +# w - The name of the menubutton widget. +# upDown - "down" means button 1 is pressed, "up" means +# it isn't. +# rootx, rooty - Coordinates of mouse, in (virtual?) root window. +sub Motion +{ + my $w = shift; + my $upDown = shift; + my $rootx = shift; + my $rooty = shift; + return if (defined($Tk::inMenubutton) && $Tk::inMenubutton == $w); + my $new = $w->Containing($rootx,$rooty); + if (defined($Tk::inMenubutton)) + { + if (!defined($new) || ($new != $Tk::inMenubutton && $w->toplevel != $new->toplevel)) + { + $Tk::inMenubutton->Leave(); + } + } + if (defined($new) && $new->IsMenubutton && $new->cget('-indicatoron') == 0 && + $w->cget('-indicatoron') == 0) + { + if ($upDown eq 'down') + { + $new->Post($rootx,$rooty); + } + else + { + $new->Enter(); + } + } +} +# ButtonUp -- +# This procedure is invoked to handle button 1 releases for menubuttons. +# If the release happens inside the menubutton then leave its menu +# posted with element 0 activated. Otherwise, unpost the menu. +# +# Arguments: +# w - The name of the menubutton widget. + +sub ButtonUp { + my $w = shift; + + my $tearoff = $Tk::platform eq 'unix' || (defined($w->cget('-menu')) && + $w->cget('-menu')->cget('-type') eq 'tearoff'); + if ($tearoff && (defined($Tk::postedMb) && $Tk::postedMb == $w) + && (defined($Tk::inMenubutton) && $Tk::inMenubutton == $w)) { + $Tk::postedMb->cget(-menu)->FirstEntry(); + } else { + Tk::Menu->Unpost(undef); + } +} # end ButtonUp + +# Some convenience methods + +sub menu +{ + my ($w,%args) = @_; + my $menu = $w->cget('-menu'); + if (!defined $menu) + { + require Tk::Menu; + $w->ColorOptions(\%args) if ($Tk::platform eq 'unix'); + $menu = $w->Menu(%args); + $w->configure('-menu'=>$menu); + } + else + { + $menu->configure(%args); + } + return $menu; +} + +sub separator { require Tk::Menu::Item; shift->menu->Separator(@_); } +sub command { require Tk::Menu::Item; shift->menu->Command(@_); } +sub cascade { require Tk::Menu::Item; shift->menu->Cascade(@_); } +sub checkbutton { require Tk::Menu::Item; shift->menu->Checkbutton(@_); } +sub radiobutton { require Tk::Menu::Item; shift->menu->Radiobutton(@_); } + +sub AddItems +{ + shift->menu->AddItems(@_); +} + +sub entryconfigure +{ + shift->menu->entryconfigure(@_); +} + +sub entrycget +{ + shift->menu->entrycget(@_); +} + +sub FindMenu +{ + my $child = shift; + my $char = shift; + my $ul = $child->cget('-underline'); + if (defined $ul && $ul >= 0 && $child->cget('-state') ne 'disabled') + { + my $char2 = $child->cget('-text'); + $char2 = substr("\L$char2",$ul,1) if (defined $char2); + if (!defined($char) || $char eq '' || (defined($char2) && "\l$char" eq $char2)) + { + $child->PostFirst; + return $child; + } + } + return undef; +} + +1; + +__END__ + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Message.pm b/Master/tlpkg/tlperl.old/lib/Tk/Message.pm new file mode 100644 index 00000000000..63b0f170097 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Message.pm @@ -0,0 +1,20 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::Message; +use strict; + +use vars qw($VERSION); +$VERSION = '4.006'; # $Id: //depot/Tkutf8/Tk/Message.pm#6 $ + +require Tk::Widget; + +use base qw(Tk::Widget); + +Construct Tk::Widget 'Message'; + +sub Tk_cmd { \&Tk::message } + +1; +__END__ + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/NBFrame.pm b/Master/tlpkg/tlperl.old/lib/Tk/NBFrame.pm new file mode 100644 index 00000000000..0e45251f852 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/NBFrame.pm @@ -0,0 +1,20 @@ +package Tk::NBFrame; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/NBFrame/NBFrame.pm#4 $ + +use Tk qw($XS_VERSION); + +use base qw(Tk::Widget); + +Construct Tk::Widget 'NBFrame'; + +bootstrap Tk::NBFrame; + +sub Tk_cmd { \&Tk::nbframe } + +Tk::Methods qw(activate add delete focus info geometryinfo identify + move pagecget pageconfigure); + +1; + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/NoteBook.pm b/Master/tlpkg/tlperl.old/lib/Tk/NoteBook.pm new file mode 100644 index 00000000000..64db87a80d3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/NoteBook.pm @@ -0,0 +1,452 @@ +package Tk::NoteBook; +# +# Implementation of NoteBook widget. +# Derived from NoteBook.tcl in Tix 4.0 + +# Contributed by Rajappa Iyer <rsi@earthling.net> +# Hacked by Nick for 'menu' traversal. +# Restructured by Nick + +use vars qw($VERSION); + +$VERSION = sprintf '4.%03d', q$Revision: #9 $ =~ /\D(\d+)\s*$/; +require Tk::NBFrame; + +use base qw(Tk::Derived Tk::NBFrame); +Tk::Widget->Construct('NoteBook'); +use strict; + +use Tk qw(Ev); + +use Carp; +require Tk::Frame; + +sub TraverseToNoteBook; + +sub ClassInit +{ + my ($class,$mw) = @_; + # class binding does not work right due to extra level of + # widget hierachy + $mw->bind($class,'<ButtonPress-1>', ['MouseDown',Ev('x'),Ev('y')]); + $mw->bind($class,'<ButtonRelease-1>', ['MouseUp',Ev('x'),Ev('y')]); + + $mw->bind($class,'<B1-Motion>', ['MouseDown',Ev('x'),Ev('y')]); + $mw->bind($class,'<Left>', ['FocusNext','prev']); + $mw->bind($class,'<Right>', ['FocusNext','next']); + + $mw->bind($class,'<Return>', 'SetFocusByKey'); + $mw->bind($class,'<space>', 'SetFocusByKey'); + return $class; +} + +sub raised +{ + return shift->{'topchild'}; +} + +sub Populate +{ + my ($w, $args) = @_; + + $w->SUPER::Populate($args); + $w->{'pad-x1'} = undef; + $w->{'pad-x2'} = undef; + $w->{'pad-y1'} = undef; + $w->{'pad-y2'} = undef; + + $w->{'windows'} = []; + $w->{'nWindows'} = 0; + $w->{'minH'} = 1; + $w->{'minW'} = 1; + + $w->{'counter'} = 0; + $w->{'resize'} = 0; + + $w->ConfigSpecs(-ipadx => ['PASSIVE', 'ipadX', 'Pad', 0], + -ipady => ['PASSIVE', 'ipadY', 'Pad', 0], + -takefocus => ['SELF', 'takeFocus', 'TakeFocus', 0], + -dynamicgeometry => ['PASSIVE', 'dynamicGeometry', 'DynamicGeometry', 0]); + + # SetBindings + $w->bind('<Configure>','MasterGeomProc'); + + $args->{-slave} = 1; + $args->{-takefocus} = 1; + $args->{-relief} = 'raised'; + + $w->QueueResize; +} + + +#--------------------------- +# Public methods +#--------------------------- + +sub page_widget +{ + my $w = shift; + $w->{'_pages_'} = {} unless exists $w->{'_pages_'}; + my $h = $w->{'_pages_'}; + if (@_) + { + my $name = shift; + if (@_) + { + my $cw = shift; + if (defined $cw) + { + $h->{$name} = $cw; + } + else + { + return delete $h->{$name}; + } + } + return $h->{$name}; + } + else + { + return (values %$h); + } +} + +sub add +{ + my ($w, $child, %args) = @_; + + croak("$child already exists") if defined $w->page_widget($child); + + my $f = Tk::Frame->new($w,Name => $child,-relief => 'raised'); + + my $ccmd = delete $args{-createcmd}; + my $rcmd = delete $args{-raisecmd}; + $f->{-createcmd} = Tk::Callback->new($ccmd) if (defined $ccmd); + $f->{-raisecmd} = Tk::Callback->new($rcmd) if (defined $rcmd); + + # manage our geometry + $w->ManageGeometry($f); + # create default bindings + $f->bind('<Configure>',[$w,'ClientGeomProc','-configure', $f]); + $f->bind('<Destroy>', [$w,'delete',$child,1]); + $w->page_widget($child,$f); + $w->{'nWindows'}++; + push(@{$w->{'windows'}}, $child); + $w->SUPER::add($child,%args); + return $f; +} + +sub raise +{ + my ($w, $child) = @_; + return unless defined $child; + if ($w->pagecget($child, -state) eq 'normal') + { + $w->activate($child); + $w->focus($child); + my $childw = $w->page_widget($child); + if ($childw) + { + if (defined $childw->{-createcmd}) + { + $childw->{-createcmd}->Call($childw); + delete $childw->{-createcmd}; + } + # hide the original visible window + my $oldtop = $w->{'topchild'}; + if (defined($oldtop) && ($oldtop ne $child)) + { + $w->page_widget($oldtop)->UnmapWindow; + } + $w->{'topchild'} = $child; + my $myW = $w->Width; + my $myH = $w->Height; + + if (!defined $w->{'pad-x1'}) { + $w->InitTabSize; + } + + my $cW = $myW - $w->{'pad-x1'} - $w->{'pad-x2'} - 2 * (defined $w->{-ipadx} ? $w->{-ipadx} : 0); + my $cH = $myH - $w->{'pad-y1'} - $w->{'pad-y2'} - 2 * (defined $w->{-ipady} ? $w->{-ipady} : 0); + my $cX = $w->{'pad-x1'} + (defined $w->{-ipadx} ? $w->{-ipadx} : 0); + my $cY = $w->{'pad-y1'} + (defined $w->{-ipady} ? $w->{-ipady} : 0); + + if ($cW > 0 && $cH > 0) + { + $childw->MoveResizeWindow($cX, $cY, $cW, $cH); + $childw->MapWindow; + $childw->raise; + } + if ((not defined $oldtop) || ($oldtop ne $child)) + { + if (defined $childw->{-raisecmd}) + { + $childw->{-raisecmd}->Call($childw); + } + } + } + } +} + +sub pageconfigure +{ + my ($w, $child, %args) = @_; + my $childw = $w->page_widget($child); + if (defined $childw) + { + my $ccmd = delete $args{-createcmd}; + my $rcmd = delete $args{-raisecmd}; + $childw->{-createcmd} = Tk::Callback->new($ccmd) if (defined $ccmd); + $childw->{-raisecmd} = Tk::Callback->new($rcmd) if (defined $rcmd); + $w->SUPER::pageconfigure($child, %args) if (keys %args); + } +} + +sub pages { + my ($w) = @_; + return @{$w->{'windows'}}; +} + +sub pagecget +{ + my ($w, $child, $opt) = @_; + my $childw = $w->page_widget($child); + if (defined $childw) + { + return $childw->{-createcmd} if ($opt =~ /-createcmd/); + return $childw->{-raisecmd} if ($opt =~ /-raisecmd/); + return $w->SUPER::pagecget($child, $opt); + } + else + { + carp "page $child does not exist"; + } +} + +sub delete +{ + my ($w, $child, $destroy) = @_; + my $childw = $w->page_widget($child,undef); + if (defined $childw) + { + $childw->bind('<Destroy>', undef); + $childw->destroy; + @{$w->{'windows'}} = grep($_ !~ /$child/, @{$w->{'windows'}}); + $w->{'nWindows'}--; + $w->SUPER::delete($child); + # see if the child to be deleted was the top child + if ((defined $w->{'topchild'}) && ($w->{'topchild'} eq $child)) + { + delete $w->{'topchild'}; + if ( @{$w->{'windows'}}) + { + $w->raise($w->{'windows'}[0]); + } + } + } + else + { + carp "page $child does not exist" unless $destroy; + } +} + +#--------------------------------------- +# Private methods +#--------------------------------------- + +sub MouseDown { + my ($w, $x, $y) = @_; + my $name = $w->identify($x, $y); + $w->focus($name); + $w->{'down'} = $name; +} + +sub MouseUp { + my ($w, $x, $y) = @_; + my $name = $w->identify($x, $y); + if ((defined $name) && (defined $w->{'down'}) && + ($name eq $w->{'down'}) && + ($w->pagecget($name, -state) eq 'normal')) { + $w->raise($name); + } else { + $w->focus($name); + } +} + +sub FocusNext { + my ($w, $dir) = @_; + my $name; + + if (not defined $w->info('focus')) { + $name = $w->info('active'); + $w->focus($name); + } else { + $name = $w->info('focus' . $dir); + $w->focus($name); + } +} + +sub SetFocusByKey { + my ($w) = @_; + + my $name = $w->info('focus'); + if (defined $name) { + if ($w->pagecget($name, -state) eq 'normal') { + $w->raise($name); + $w->activate($name); + } + } +} + +sub NoteBookFind { + my ($w, $char) = @_; + + my $page; + foreach $page (@{$w->{'windows'}}) { + my $i = $w->pagecget($page, -underline); + my $c = substr($page, $i, 1); + if ($char =~ /$c/) { + if ($w->pagecget($page, -state) ne 'disabled') { + return $page; + } + } + } + return undef; +} + +# This is called by TraveseToMenu when an <Alt-Keypress> occurs +# See the code in Tk.pm +sub FindMenu { + my ($w, $char) = @_; + + my $page; + foreach $page (@{$w->{'windows'}}) { + my $i = $w->pagecget($page, -underline); + my $l = $w->pagecget($page, -label); + next if (not defined $l); + my $c = substr($l, $i, 1); + if ($char =~ /$c/i) { + if ($w->pagecget($page, -state) ne 'disabled') { + $w->raise($page); + return $w; + } + } + } + return undef; +} + + +sub MasterGeomProc +{ + my ($w) = @_; + if (Tk::Exists($w)) + { + $w->{'resize'} = 0 unless (defined $w->{'resize'}); + $w->QueueResize; + } +} + +sub SlaveGeometryRequest +{ + my $w = shift; + if (Tk::Exists($w)) + { + $w->QueueResize; + } +} + +sub LostSlave { + my ($w, $s) = @_; + $s->UnmapWindow; +} + +sub ClientGeomProc +{ + my ($w, $flag, $client) = @_; + $w->QueueResize if (Tk::Exists($w)); + if ($flag =~ /-lostslave/) + { + carp "Geometry Management Error: Another geometry manager has taken control of $client. This error is usually caused because a widget has been created in the wrong frame: it should have been created inside $client instead of $w"; + } +} + +sub QueueResize +{ + my $w = shift; + $w->afterIdle(['Resize', $w]) unless ($w->{'resize'}++); +} + +sub Resize { + + my ($w) = @_; + + return unless Tk::Exists($w) && $w->{'nWindows'} && $w->{'resize'}; + + $w->InitTabSize; + + $w->{'resize'} = 0; + my $reqW = $w->{-width} || 0; + my $reqH = $w->{-height} || 0; + + if ($reqW * $reqH == 0) + { + if ((not defined $w->{-dynamicgeometry}) || + ($w->{-dynamicgeometry} == 0)) { + $reqW = 1; + $reqH = 1; + + my $childw; + foreach $childw ($w->page_widget) + { + my $cW = $childw->ReqWidth; + my $cH = $childw->ReqHeight; + $reqW = $cW if ($reqW < $cW); + $reqH = $cH if ($reqH < $cH); + } + } else { + if (defined $w->{'topchild'}) { + my $topw = $w->page_widget($w->{'topchild'}); + $reqW = $topw->ReqWidth; + $reqH = $topw->ReqHeight; + } else { + $reqW = 1; + $reqH = 1; + } + } + $reqW += $w->{'pad-x1'} + $w->{'pad-x2'} + 2 * (defined $w->{-ipadx} ? $w->{-ipadx} : 0); + $reqH += $w->{'pad-y1'} + $w->{'pad-y2'} + 2 * (defined $w->{-ipady} ? $w->{-ipady} : 0); + $reqW = ($reqW > $w->{'minW'}) ? $reqW : $w->{'minW'}; + $reqH = ($reqH > $w->{'minH'}) ? $reqH : $w->{'minH'}; + } + if (($w->ReqWidth != $reqW) || + ($w->ReqHeight != $reqH)) { + $w->{'counter'} = 0 if (not defined $w->{'counter'}); + if ($w->{'counter'} < 50) { + $w->{'counter'}++; + $w->GeometryRequest($reqW, $reqH); + $w->afterIdle([$w,'Resize']); + $w->{'resize'} = 1; + return; + } + } + $w->{'counter'} = 0; + $w->raise($w->{'topchild'} || ${$w->{'windows'}}[0]); + $w->{'resize'} = 0; +} + +sub InitTabSize { + my ($w) = @_; + my ($tW, $tH) = $w->geometryinfo; + $w->{'pad-x1'} = 2; + $w->{'pad-x2'} = 2; + $w->{'pad-y1'} = $tH + (defined $w->{'-ipadx'} ? $w->{'-ipadx'} : 0) + 1; + $w->{'pad-y2'} = 2; + $w->{'minW'} = $tW; + $w->{'minH'} = $tH; +} + +1; + +__END__ + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Optionmenu.pm b/Master/tlpkg/tlperl.old/lib/Tk/Optionmenu.pm new file mode 100644 index 00000000000..7c0e81766db --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Optionmenu.pm @@ -0,0 +1,130 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::Optionmenu; +require Tk::Menubutton; +require Tk::Menu; +use Carp; + +use vars qw($VERSION); +$VERSION = '4.013'; # $Id: //depot/Tkutf8/Tk/Optionmenu.pm#13 $ + +use base qw(Tk::Derived Tk::Menubutton); + +use strict; + +Construct Tk::Widget 'Optionmenu'; + +sub Populate +{ + my ($w,$args) = @_; + $w->SUPER::Populate($args); + $args->{-indicatoron} = 1; + my $menu = $w->menu(-tearoff => 0); + + # Should we allow -menubackground etc. as in -label* of Frame ? + + $w->ConfigSpecs(-command => ['CALLBACK',undef,undef,undef], + -options => ['METHOD', undef, undef, undef], + -variable=> ['PASSIVE', undef, undef, undef], + -font => [['SELF',$menu], undef, undef, undef], + -foreground => [['SELF', 'CHILDREN'], undef, undef, undef], + + -takefocus => [ qw/SELF takefocus Takefocus 1/ ], + -highlightthickness => [ qw/SELF highlightThickness HighlightThickness 1/ ], + -relief => [ qw/SELF relief Relief raised/ ], + + ); + + # configure -variable and -command now so that when -options + # is set by main-line configure they are there to be set/called. + + my $tvar = delete $args->{-textvariable}; + my $vvar = delete $args->{-variable}; + if (!defined($vvar)) + { + if (defined $tvar) + { + $vvar = $tvar; + } + else + { + my $new; + $vvar = \$new; + } + } + $tvar = $vvar if (!defined($tvar)); + $w->configure(-textvariable => $tvar, -variable => $vvar); + $w->configure(-command => $vvar) if ($vvar = delete $args->{-command}); +} + +sub setOption +{ + my ($w, $label, $val) = @_; + my $tvar = $w->cget(-textvariable); + my $vvar = $w->cget(-variable); + if (@_ == 2) + { + $val = $label; + } + $$tvar = $label if $tvar; + $$vvar = $val if $vvar; + $w->Callback(-command => $val); +} + +sub addOptions +{ + my $w = shift; + my $menu = $w->menu; + my $tvar = $w->cget(-textvariable); + my $vvar = $w->cget(-variable); + my $oldt = $$tvar; + my $width = $w->cget('-width'); + my %hash; + my $first; + while (@_) + { + my $val = shift; + my $label = $val; + if (ref $val) + { + if ($vvar == $tvar) + { + my $new = $label; + $w->configure(-textvariable => ($tvar = \$new)); + } + ($label, $val) = @$val; + } + my $len = length($label); + $width = $len if (!defined($width) || $len > $width); + $menu->command(-label => $label, -command => [ $w , 'setOption', $label, $val ]); + $hash{$label} = $val; + $first = $label unless defined $first; + } + if (!defined($oldt) || !exists($hash{$oldt})) + { + $w->setOption($first, $hash{$first}) if defined $first; + } + $w->configure('-width' => $width); +} + +sub options +{ + my ($w,$opts) = @_; + if (@_ > 1) + { + $w->menu->delete(0,'end'); + $w->addOptions(@$opts); + } + else + { + return $w->_cget('-options'); + } +} + +1; + +__END__ + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/PNG.pm b/Master/tlpkg/tlperl.old/lib/Tk/PNG.pm new file mode 100644 index 00000000000..1ecb4001d17 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/PNG.pm @@ -0,0 +1,43 @@ +package Tk::PNG; +require DynaLoader; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #3 $ =~ /\D(\d+)\s*$/; + +use Tk 800.005; +require Tk::Image; +require Tk::Photo; + +use base qw(DynaLoader); + +bootstrap Tk::PNG $Tk::VERSION; + +1; + +__END__ + +=head1 NAME + +Tk::PNG - PNG loader for Tk::Photo + +=head1 SYNOPSIS + + use Tk; + use Tk::PNG; + + my $image = $widget->Photo('-format' => 'png', -file => 'something.png'); + + +=head1 DESCRIPTION + +This is an extension for Tk800.* which supplies +PNG format loader for Photo image type. + + +=head1 AUTHOR + +Nick Ing-Simmons E<lt>nick@ing-simmons.netE<gt> + +=cut + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Pane.pm b/Master/tlpkg/tlperl.old/lib/Tk/Pane.pm new file mode 100644 index 00000000000..36c5203a42d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Pane.pm @@ -0,0 +1,544 @@ +# Tk::Pane.pm +# +# Copyright (c) 1997-1998 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package Tk::Pane; + +use vars qw($VERSION); +$VERSION = '4.007'; # $Id: //depot/Tkutf8/Tk/Pane.pm#7 $ + +use Tk; +use Tk::Widget; +use Tk::Derived; +use Tk::Frame; + +use strict; + +use base qw(Tk::Derived Tk::Frame); + +Construct Tk::Widget 'Pane'; + +use Tk::Submethods( + grid => [qw/bbox columnconfigure location propagate rowconfigure size slaves/], + pack => [qw/propagate slaves/] +); + +sub ClassInit { + my ($class,$mw) = @_; + $mw->bind($class,'<Configure>',['QueueLayout',4]); + $mw->bind($class,'<FocusIn>', 'NoOp'); + return $class; +} + +sub Populate { + my $pan = shift; + + my $frame = $pan->Component(Frame => "frame"); + + $pan->afterIdle(['Manage',$pan,$frame]); + $pan->afterIdle(['QueueLayout',$pan,1]); + + $pan->Delegates( + DEFAULT => $frame, + # FIXME + # These are a hack to avoid an existing bug in Tk::Widget::DelegateFor + # which has been reported and should be fixed in the next Tk release + see => $pan, + xview => $pan, + yview => $pan, + ); + + $pan->ConfigSpecs( + DEFAULT => [$frame], + -sticky => [PASSIVE => undef, undef, undef], + -gridded => [PASSIVE => undef, undef, undef], + -xscrollcommand => [CALLBACK => undef, undef, undef], + -yscrollcommand => [CALLBACK => undef, undef, undef], + ); + + + $pan; +} + + +sub grid { + my $w = shift; + $w = $w->Subwidget('frame') + if (@_ && $_[0] =~ /^(?: bbox + |columnconfigure + |location + |propagate + |rowconfigure + |size + |slaves)$/x); + $w->SUPER::grid(@_); +} + +sub slave { + my $w = shift; + $w->Subwidget('frame'); +} + +sub pack { + my $w = shift; + $w = $w->Subwidget('frame') + if (@_ && $_[0] =~ /^(?:propagate|slaves)$/x); + $w->SUPER::pack(@_); +} + +sub QueueLayout { + shift if ref $_[1]; + my($m,$why) = @_; + $m->afterIdle(['Layout',$m]) unless ($m->{LayoutPending}); + $m->{LayoutPending} |= $why; +} + +sub AdjustXY { + my($w,$Wref,$X,$st,$scrl,$getx) = @_; + my $W = $$Wref; + + if($w >= $W) { + my $v = 0; + if($getx) { + $v |= 1 if $st =~ /[Ww]/; + $v |= 2 if $st =~ /[Ee]/; + } + else { + $v |= 1 if $st =~ /[Nn]/; + $v |= 2 if $st =~ /[Ss]/; + } + + if($v == 0) { + $X = int(($w - $W) / 2); + } + elsif($v == 1) { + $X = 0; + } + elsif($v == 2) { + $X = int($w - $W); + } + else { + $X = 0; + $$Wref = $w; + } + $scrl->Call(0,1) + if $scrl; + } + elsif($scrl) { + $X = 0 + if $X > 0; + $X = $w - $W + if(($X + $W) < $w); + $scrl->Call(-$X / $W,(-$X + $w) / $W); + } + else { + $X = 0; + $$Wref = $w; + } + + return $X; +} + +sub Layout { + my $pan = shift; + my $why = $pan->{LayoutPending}; + + my $slv = $pan->Subwidget('frame'); + + return unless $slv; + + my $H = $slv->ReqHeight; + my $W = $slv->ReqWidth; + my $X = $slv->x; + my $Y = $slv->y; + my $w = $pan->width; + my $h = $pan->height; + my $yscrl = $pan->{Configure}{'-yscrollcommand'}; + my $xscrl = $pan->{Configure}{'-xscrollcommand'}; + + $yscrl = undef + if(defined($yscrl) && UNIVERSAL::isa($yscrl, 'SCALAR') && !defined($$yscrl)); + $xscrl = undef + if(defined($xscrl) && UNIVERSAL::isa($xscrl, 'SCALAR') && !defined($$xscrl)); + + if($why & 1) { + $h = $pan->{Configure}{'-height'} || 0 + unless($h > 1); + $w = $pan->{Configure}{'-width'} || 0 + unless($w > 1); + + $h = $H + unless($h > 1 || defined($yscrl)); + $w = $W + unless($w > 1 || defined($xscrl)); + + $w = 100 if $w <= 1; + $h = 100 if $h <= 1; + + $pan->GeometryRequest($w,$h); + } + + my $st = $pan->{Configure}{'-sticky'} || ''; + + $pan->{LayoutPending} = 0; + + $slv->MoveResizeWindow( + AdjustXY($w,\$W,$X,$st,$xscrl,1), + AdjustXY($h,\$H,$Y,$st,$yscrl,0), + $W,$H + ); +} + +sub SlaveGeometryRequest { + my ($m,$s) = @_; + $m->QueueLayout(1); +} + +sub LostSlave { + my($m,$s) = @_; + $m->{Slave} = undef; +} + +sub Manage { + my $m = shift; + my $s = shift; + + $m->{Slave} = $s; + $m->ManageGeometry($s); + $s->MapWindow; + $m->QueueLayout(2); +} + +sub xview { + my $pan = shift; + + unless(@_) { + my $scrl = $pan->{Configure}{'-xscrollcommand'}; + return (0,1) unless $scrl; + my $slv = $pan->Subwidget('frame'); + my $sw = $slv->ReqWidth; + my $ldx = $pan->rootx - $slv->rootx; + my $rdx = $ldx + $pan->width; + $ldx = $ldx <= 0 ? 0 : $ldx / $sw; + $rdx = $rdx >= $sw ? 1 : $rdx / $sw; + return( $ldx , $rdx); + } + elsif(@_ == 1) { + my $widget = shift; + my $slv = $pan->Subwidget('frame'); + xyview(1,$pan, + moveto => ($widget->rootx - $slv->rootx) / $slv->ReqWidth); + } + else { + xyview(1,$pan,@_); + } +} + +sub yview { + my $pan = shift; + + unless(@_) { + my $scrl = $pan->{Configure}{'-yscrollcommand'}; + return (0,1) unless $scrl; + my $slv = $pan->Subwidget('frame'); + my $sh = $slv->ReqHeight; + my $tdy = $pan->rooty - $slv->rooty; + my $bdy = $tdy + $pan->height; + $tdy = $tdy <= 0 ? 0 : $tdy / $sh; + $bdy = $bdy >= $sh ? 1 : $bdy / $sh; + return( $tdy, $bdy); + } + elsif(@_ == 1) { + my $widget = shift; + my $slv = $pan->Subwidget('frame'); + xyview(0,$pan, + moveto => ($widget->rooty - $slv->rooty) / $slv->ReqHeight); + } + else { + xyview(0,$pan,@_); + } +} + +sub xyview { + my($horz,$pan,$cmd,$val,$mul) = @_; + my $slv = $pan->Subwidget('frame'); + return unless $slv; + + my($XY,$WH,$wh,$scrl,@a); + + if($horz) { + $XY = $slv->x; + $WH = $slv->ReqWidth; + $wh = $pan->width; + $scrl = $pan->{Configure}{'-xscrollcommand'}; + } + else { + $XY = $slv->y; + $WH = $slv->ReqHeight; + $wh = $pan->height; + $scrl = $pan->{Configure}{'-yscrollcommand'}; + } + + $scrl = undef + if(UNIVERSAL::isa($scrl, 'SCALAR') && !defined($$scrl)); + + if($WH < $wh) { + $scrl->Call(0,1); + return; + } + + if($cmd eq 'scroll') { + my $dxy = 0; + + my $gridded = $pan->{Configure}{'-gridded'} || ''; + my $do_gridded = ($gridded eq 'both' + || (!$horz == ($gridded ne 'x'))) ? 1 : 0; + + if($do_gridded && $mul eq 'pages') { + my $ch = ($slv->children)[0]; + if(defined($ch) && $ch->manager eq 'grid') { + @a = $horz + ? (1-$XY,int($slv->width / 2)) + : (int($slv->height / 2),1-$XY); + my $rc = ($slv->gridLocation(@a))[$horz ? 0 : 1]; + my $mrc = ($slv->gridSize)[$horz ? 0 : 1]; + $rc += $val; + $rc = 0 if $rc < 0; + $rc = $mrc if $rc > $mrc; + my $gsl; + while($rc >= 0 && $rc < $mrc) { + $gsl = ($slv->gridSlaves(-row => $rc))[0]; + last + if defined $gsl; + $rc += $val; + } + if(defined $gsl) { + @a = $horz ? ($rc,0) : (0,$rc); + $XY = 0 - ($slv->gridBbox(@a))[$horz ? 0 : 1]; + } + else { + $XY = $val > 0 ? $wh - $WH : 0; + } + $dxy = $val; $val = 0; + } + } + $dxy = $mul eq 'pages' ? ($horz ? $pan->width : $pan->height) : 10 + unless $dxy; + $XY -= $dxy * $val; + } + elsif($cmd eq 'moveto') { + $XY = -int($WH * $val); + } + + $XY = $wh - $WH + if($XY < ($wh - $WH)); + $XY = 0 + if $XY > 0; + + @a = $horz + ? ( $XY, $slv->y) + : ($slv->x, $XY); + + $slv->MoveWindow(@a); + + $scrl->Call(-$XY / $WH,(-$XY + $wh) / $WH); +} + +sub see { + my $pan = shift; + my $widget = shift; + my %opt = @_; + my $slv = $pan->Subwidget('frame'); + + my $anchor = defined $opt{'-anchor'} ? $opt{'-anchor'} : ""; + + if($pan->{Configure}{'-yscrollcommand'}) { + my $yanchor = lc(($anchor =~ /([NnSs]?)/)[0] || ""); + my $pty = $pan->rooty; + my $ph = $pan->height; + my $pby = $pty + $ph; + my $ty = $widget->rooty; + my $wh = $widget->height; + my $by = $ty + $wh; + my $h = $slv->ReqHeight; + + if($yanchor eq 'n' || ($yanchor ne 's' && ($wh >= $h || $ty < $pty))) { + my $y = $ty - $slv->rooty; + $pan->yview(moveto => $y / $h); + } + elsif($yanchor eq 's' || $by > $pby) { + my $y = $by - $ph - $slv->rooty; + $pan->yview(moveto => $y / $h); + } + } + + if($pan->{Configure}{'-xscrollcommand'}) { + my $xanchor = lc(($anchor =~ /([WwEe]?)/)[0] || ""); + my $ptx = $pan->rootx; + my $pw = $pan->width; + my $pbx = $ptx + $pw; + my $tx = $widget->rootx; + my $ww = $widget->width; + my $bx = $tx + $ww; + my $w = $slv->ReqWidth; + + if($xanchor eq 'w' || ( $xanchor ne 'e' && ($ww >= $w || $tx < $ptx))) { + my $x = $tx - $slv->rootx; + $pan->xview(moveto => $x / $w); + } + elsif($xanchor eq 'e' || $bx > $pbx) { + my $x = $bx - $pw - $slv->rootx; + $pan->xview(moveto => $x / $w); + } + } +} + +1; + +__END__ + +=head1 NAME + +Tk::Pane - A window panner + +=for category Derived Widgets + +=head1 SYNOPSIS + + use Tk::Pane; + + $pane = $mw->Scrolled(Pane, Name => 'fred', + -scrollbars => 'soe', + -sticky => 'we', + -gridded => 'y' + ); + + $pane->Frame; + + $pane->pack; + +=head1 DESCRIPTION + +B<Tk::Pane> provides a scrollable frame widget. Once created it can be +treated as a frame, except it is scrollable. + +=head1 OPTIONS + +=over 4 + +=item B<-gridded> =E<gt> I<direction> + +Specifies if the top and left edges of the pane should snap to a +grid column. This option is only useful if the widgets in the pane +are managed by the I<grid> geometry manager. Possible values are +B<x>, B<y> and B<xy>. + +=item B<-sticky> =E<gt> I<style> + +If Pane is larger than its requested dimensions, this option may be used to +position (or stretch) the slave within its cavity. I<Style> is a string that +contains zero or more of the characters n, s, e or w. The string can optionally +contains spaces or commas, but they are ignored. Each letter refers to a side +(north, south, east, or west) that the slave will "stick" to. If both n and s +(or e and w) are specified, the slave will be stretched to fill the entire +height (or width) of its cavity. + +=back + +=head1 METHODS + +=over 4 + +=item I<$pane>-E<gt>B<see>(I<$widget> ?,I<options>?) + +Adjusts the view so that I<$widget> is visable. Aditional parameters in +I<options-value> pairs can be passed, each I<option-value> pair must be +one of the following + +=over 8 + +=item B<-anchor> =E<gt> I<anchor> + +Specifies how to make the widget visable. If not given then as much of +the widget as possible is made visable. + +Possible values are B<n>, B<s>, B<w>, B<e>, B<nw>, B<ne>, B<sw> and B<se>. +This will cause an edge on the widget to be aligned with the corresponding +edge on the pane. for example B<nw> will cause the top left of the widget +to be placed at the top left of the pane. B<s> will cause the bottom of the +widget to be placed at the bottom of the pane, and as much of the widget +as possible made visable in the x direction. + +=back + +=item I<$pane>-E<gt>B<xview> + +Returns a list containing two elements, both of which are real fractions +between 0 and 1. The first element gives the position of the left of the +window, relative to the Pane as a whole (0.5 means it is halfway through the +Pane, for example). The second element gives the position of the right of the +window, relative to the Pane as a whole. + +=item I<$pane>-E<gt>B<xview>(I<$widget>) + +Adjusts the view in the window so that I<widget> is displayed at the left of +the window. + +=item I<$pane>-E<gt>B<xview>(B<moveto> =E<gt> I<fraction>) + +Adjusts the view in the window so that I<fraction> of the total width of the +Pane is off-screen to the left. fraction must be a fraction between 0 and 1. + +=item I<$pane>-E<gt>B<xview>(B<scroll> =E<gt> I<number>, I<what>) + +This command shifts the view in the window left or right according to I<number> +and I<what>. I<Number> must be an integer. I<What> must be either B<units> or +B<pages> or an abbreviation of one of these. If I<what> is B<units>, the view +adjusts left or right by I<number>*10 screen units on the display; if it is +B<pages> then the view adjusts by number screenfuls. If number is negative then +widgets farther to the left become visible; if it is positive then widgets +farther to the right become visible. + +=item I<$pane>-E<gt>B<yview> + +Returns a list containing two elements, both of which are real fractions +between 0 and 1. The first element gives the position of the top of the +window, relative to the Pane as a whole (0.5 means it is halfway through the +Pane, for example). The second element gives the position of the bottom of the +window, relative to the Pane as a whole. + +=item I<$pane>-E<gt>B<yview>(I<$widget>) + +Adjusts the view in the window so that I<widget> is displayed at the top of the +window. + +=item I<$pane>-E<gt>B<yview>(B<moveto> =E<gt> I<fraction>) + +Adjusts the view in the window so that I<fraction> of the total width of the +Pane is off-screen to the top. fraction must be a fraction between 0 and 1. + +=item I<$pane>-E<gt>B<yview>(B<scroll> =E<gt> I<number>, I<what>) + +This command shifts the view in the window up or down according to I<number> +and I<what>. I<Number> must be an integer. I<What> must be either B<units> or +B<pages> or an abbreviation of one of these. If I<what> is B<units>, the view +adjusts up or down by I<number>*10 screen units on the display; if it is +B<pages> then the view adjusts by number screenfuls. If number is negative then +widgets farther up become visible; if it is positive then widgets farther down +become visible. + +=back + +=head1 AUTHOR + +Graham Barr E<lt>F<gbarr@pobox.com>E<gt> + +=head1 COPYRIGHT + +Copyright (c) 1997-1998 Graham Barr. All rights reserved. +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Panedwindow.pm b/Master/tlpkg/tlperl.old/lib/Tk/Panedwindow.pm new file mode 100644 index 00000000000..d984b648897 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Panedwindow.pm @@ -0,0 +1,221 @@ +package Tk::Panedwindow; +use strict; + +use vars qw/$VERSION/; +$VERSION = sprintf '4.%03d', q$Revision: #3 $ =~ /#(\d+)/; + +# A Panedwindow widget (similar to Adjuster). + +use Tk qw/Ev/; +use base qw/Tk::Widget/; + +Construct Tk::Widget 'Panedwindow'; + +sub Tk_cmd { \&Tk::panedwindow } + +Tk::Methods('add', 'forget', 'identify', 'proxy', 'sash', 'panes'); + +use Tk::Submethods ( + 'proxy' => [qw/coord forget place/], + 'sash' => [qw/coord mark place/], +); + +sub ClassInit { + + my ($class,$mw) = @_; + + $class->SUPER::ClassInit($mw); + + $mw->bind($class, '<Button-1>' => ['MarkSash' => Ev('x'), Ev('y'), 1]); + $mw->bind($class, '<Button-2>' => ['MarkSash' => Ev('x'), Ev('y'), 0]); + $mw->bind($class, '<B1-Motion>' => ['DragSash' => Ev('x'), Ev('y'), 1]); + $mw->bind($class, '<B2-Motion>' => ['DragSash' => Ev('x'), Ev('y'), 0]); + $mw->bind($class, '<ButtonRelease-1>' => ['ReleaseSash' => 1]); + $mw->bind($class, '<ButtonRelease-2>' => ['ReleaseSash' => 0]); + $mw->bind($class, '<Motion>' => ['Motion' => Ev('x'), Ev('y')]); + $mw->bind($class, '<Leave>' => ['Leave']); + + return $class; + +} # end ClassInit + +sub MarkSash { + + # MarkSash + # + # Handle marking the correct sash for possible dragging + # + # Arguments: + # w the widget + # x widget local x coord + # y widget local y coord + # proxy whether this should be a proxy sash + # Results: + # None + + my ($w, $x, $y, $proxy) = @_; + + my @what = $w->identify($x, $y); + if ( @what == 2 ) { + my ($index, $which) = @what[0 .. 1]; + if (not $Tk::strictMotif or $which eq 'handle') { + $w->sashMark($index, $x, $y) if not $proxy; + $w->{_sash} = $index; + my ($sx, $sy) = $w->sashCoord($index); + $w->{_dx} = $sx - $x; + $w->{_dy} = $sy - $y; + } + } + +} # end MarkSash + +sub DragSash { + + # DragSash + # + # Handle dragging of the correct sash + # + # Arguments: + # w the widget + # x widget local x coord + # y widget local y coord + # proxy whether this should be a proxy sash + # Results: + # Moves sash + + my ($w, $x, $y, $proxy) = @_; + + if ( exists $w->{_sash} ) { + if ($proxy) { + $w->proxyPlace($x + $w->{_dx}, $y + $w->{_dy}); + } else { + $w->sashPlace($w->{_sash}, $x + $w->{_dx}, $y + $w->{_dy}); + } + } + +} # end DragSash + +sub ReleaseSash { + + # ReleaseSash + # + # Handle releasing of the sash + # + # Arguments: + # w the widget + # proxy whether this should be a proxy sash + # Results: + # Returns ... + + my ($w, $proxy) = @_; + + if ( exists $w->{_sash} ) { + if ($proxy) { + my ($x, $y) = $w->proxyCoord; + $w->sashPlace($w->{_sash}, $x, $y); + $w->proxyForget; + } + delete $w->{'_sash', '_dx', '_dy'}; + } + +} # end ReleaseSash + +sub Motion { + + # Motion + # + # Handle motion on the widget. This is used to change the cursor + # when the user moves over the sash area. + # + # Arguments: + # w the widget + # x widget local x coord + # y widget local y coord + # Results: + # May change the cursor. Sets up a timer to verify that we are still + # over the widget. + + my ($w, $x, $y) = @_; + + my @id = $w->identify($x, $y); + if ( (@id == 2) and + (not $Tk::strictMotif or $id[1] eq 'handle') ) { + if ( not exists $w->{_panecursor} ) { + $w->{_panecursor} = $w->cget(-cursor); + if ( not defined $w->cget(-sashcursor) ) { + if ( $w->cget(-orient) eq 'horizontal' ) { + $w->configure(-cursor => 'sb_h_double_arrow'); + } else { + $w->configure(-cursor => 'sb_v_double_arrow'); + } + } else { + $w->configure(-cursor => $w->cget(-sashcursor)); + } + if ( exists $w->{_pwAfterId} ) { + $w->afterCancel($w->{_pwAfterId}); + } + $w->{_pwAfterId} = $w->after(150 => ['Cursor' => $w]); + } + return + } + if ( exists $w->{_panecursor} ) { + $w->configure(-cursor => $w->{_panecursor}); + delete $w->{_panecursor}; + } + +} # end Motion + +sub Cursor { + + # Cursor + # + # Handles returning the normal cursor when we are no longer over the + # sash area. This needs to be done this way, because the panedwindow + # won't see Leave events when the mouse moves from the sash to a + # paned child, although the child does receive an Enter event. + # + # Arguments: + # w the widget + # Results: + # May restore the default cursor, or schedule a timer to do it. + + my ($w) = @_; + + if ( exists $w->{_panecursor} ) { + if ( $w->containing($w->pointerx, $w->pointery) == $w ) { + $w->{_pwAfterId} = $w->after(150 => ['Cursor' => $w]); + } else { + $w->configure(-cursor => $w->{_panecursor}); + delete $w->{_panecursor}; + if ( exists $w->{_pwAfterId} ) { + $w->afterCancel($w->{_pwAfterId}); + delete $w->{_pwAfterId}; + } + } + } + +} # end Cursor + +sub Leave { + + # Leave + # + # Return to default cursor when leaving the pw widget. + # + # Arguments: + # w the widget + # Results: + # Restores the default cursor + + my ($w) = @_; + + if ( exists $w->{_panecursor} ) { + $w->configure(-cursor => $w->{_panecursor}); + delete $w->{_panecursor}; + } + +} # end Leave + + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Photo.pm b/Master/tlpkg/tlperl.old/lib/Tk/Photo.pm new file mode 100644 index 00000000000..a596dc4d78b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Photo.pm @@ -0,0 +1,22 @@ +package Tk::Photo; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', 4+q$Revision: #4 $ =~ /\D(\d+)\s*$/; + +use Tk qw($XS_VERSION); + +use base qw(Tk::Image); + +Construct Tk::Image 'Photo'; + +sub Tk_image { 'photo' } + +Tk::Methods('blank','copy','data','formats','get','put','read', + 'redither','transparency','write'); + +use Tk::Submethods ( + 'transparency' => [qw/get set/], +); + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Pixmap.pm b/Master/tlpkg/tlperl.old/lib/Tk/Pixmap.pm new file mode 100644 index 00000000000..3fbc3179b56 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Pixmap.pm @@ -0,0 +1,19 @@ +package Tk::Pixmap; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/TixPixmap/Pixmap.pm#4 $ + +use Tk qw($XS_VERSION); + +use Tk::Image (); + +use base qw(Tk::Image); + +Construct Tk::Image 'Pixmap'; + +bootstrap Tk::Pixmap; + +sub Tk_image { 'pixmap' } + +1; + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Pretty.pm b/Master/tlpkg/tlperl.old/lib/Tk/Pretty.pm new file mode 100644 index 00000000000..7e442a4bcbc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Pretty.pm @@ -0,0 +1,93 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::Pretty; +require Exporter; + +use vars qw($VERSION @EXPORT); +$VERSION = '4.006'; # $Id: //depot/Tkutf8/Tk/Pretty.pm#6 $ + +use base qw(Exporter); + +@EXPORT = qw(Pretty PrintArgs); + +sub pretty_list +{ + join(',',map(&Pretty($_),@_)); +} + +sub Pretty +{ + return pretty_list(@_) if (@_ > 1); + my $obj = shift; + return 'undef' unless defined($obj); + my $type = "$obj"; + return $type if ($type =~ /=HASH/ && exists($obj->{"_Tcl_CmdInfo_\0"})); + my $result = ''; + if (ref $obj) + { + my $class; + if ($type =~ /^([^=]+)=(.*)$/) + { + $class = $1; + $type = $2; + $result .= 'bless('; + } + if ($type =~ /^ARRAY/) + { + $result .= '['; + $result .= pretty_list(@$obj); + $result .= ']'; + } + elsif ($type =~ /^HASH/) + { + $result .= '{'; + if (%$obj) + { + my ($key, $value); + while (($key,$value) = each %$obj) + { + $result .= $key . '=>' . Pretty($value) . ','; + } + chop($result); + } + $result .= '}'; + } + elsif ($type =~ /^REF/) + { + $result .= "\\" . Pretty($$obj); + } + elsif ($type =~ /^SCALAR/) + { + $result .= Pretty($$obj); + } + else + { + $result .= $type; + } + $result .= ",$class)" if (defined $class); + } + else + { + if ($obj =~ /^-?[0-9]+(.[0-9]*(e[+-][0-9]+)?)?$/ || + $obj =~ /^[A-Z_][A-Za-z_0-9]*$/ || + $obj =~ /^[a-z_][A-Za-z_0-9]*[A-Z_][A-Za-z_0-9]*$/ + ) + { + $result .= $obj; + } + else + { + $result .= "'" . $obj . "'"; + } + } + return $result; +} + +sub PrintArgs +{ + my $name = (caller(1))[3]; + print "$name(",Pretty(@_),")\n"; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/ProgressBar.pm b/Master/tlpkg/tlperl.old/lib/Tk/ProgressBar.pm new file mode 100644 index 00000000000..206d843ea13 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/ProgressBar.pm @@ -0,0 +1,498 @@ +package Tk::ProgressBar; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #10 $ =~ /\D(\d+)\s*$/; + +use Tk; +use Tk::Canvas; +use Tk::Trace; +use Carp; +use strict; + +use base qw(Tk::Derived Tk::Canvas); + +Construct Tk::Widget 'ProgressBar'; + +sub ClassInit { + my ($class,$mw) = @_; + + $class->SUPER::ClassInit($mw); + + $mw->bind($class,'<Configure>', ['_layoutRequest',1]); +} + + +sub Populate { + my($c,$args) = @_; + + $c->ConfigSpecs( + -width => [PASSIVE => undef, undef, 0], + '-length' => [PASSIVE => undef, undef, 0], + -from => [PASSIVE => undef, undef, 0], + -to => [PASSIVE => undef, undef, 100], + -blocks => [PASSIVE => undef, undef, 10], + -padx => [PASSIVE => 'padX', 'Pad', 0], + -pady => [PASSIVE => 'padY', 'Pad', 0], + -gap => [PASSIVE => undef, undef, 1], + -colors => [PASSIVE => undef, undef, undef], + -relief => [SELF => 'relief', 'Relief', 'sunken'], + -value => [METHOD => undef, undef, undef], + -variable => [METHOD => undef, undef, undef], + -anchor => [METHOD => 'anchor', 'Anchor', 'w'], + -resolution + => [PASSIVE => undef, undef, 1.0], + -highlightthickness + => [SELF => 'highlightThickness','HighlightThickness',0], + -troughcolor + => [PASSIVE => 'troughColor', 'Background', 'grey55'], + ); + _layoutRequest($c,1); + $c->OnDestroy(['Destroyed' => $c]); +} + +sub anchor { + my $c = shift; + my $var = \$c->{Configure}{'-anchor'}; + my $old = $$var; + + if(@_) { + my $new = shift; + croak "bad anchor position \"$new\": must be n, s, w or e" + unless $new =~ /^[news]$/; + $$var = $new; + } + + $old; +} + +sub _layoutRequest { + my $c = shift; + my $why = shift; + $c->afterIdle(['_arrange',$c]) unless $c->{'layout_pending'}; + $c->{'layout_pending'} |= $why; +} + +sub _arrange { + my $c = shift; + my $why = $c->{'layout_pending'}; + + $c->{'layout_pending'} = 0; + + my $w = $c->Width; + my $h = $c->Height; + my $bw = $c->cget('-borderwidth') + $c->cget('-highlightthickness'); + my $x = abs(int($c->{Configure}{'-padx'})) + $bw; + my $y = abs(int($c->{Configure}{'-pady'})) + $bw; + my $value = $c->value; + my $from = $c->{Configure}{'-from'}; + my $to = $c->{Configure}{'-to'}; + my $horz = $c->{Configure}{'-anchor'} =~ /[ew]/i ? 1 : 0; + my $dir = $c->{Configure}{'-anchor'} =~ /[se]/i ? -1 : 1; + + my($minv,$maxv) = $from < $to ? ($from,$to) : ($to,$from); + + if($w == 1 && $h == 1) { + my $bw = $c->cget('-borderwidth'); + my $defw = 10 + $y*2 + $bw *2; + my $defl = ($maxv - $minv) + $x*2 + $bw*2; + + $h = $c->pixels($c->{Configure}{'-length'}) || $defl; + $w = $c->pixels($c->{Configure}{'-width'}) || $defw; + + ($w,$h) = ($h,$w) if $horz; + $c->GeometryRequest($w,$h); + $c->parent->update; + $c->update; + + $w = $c->Width; + $h = $c->Height; + } + + $w -= $x*2; + $h -= $y*2; + + my $length = $horz ? $w : $h; + my $width = $horz ? $h : $w; + + my $blocks = int($c->{Configure}{'-blocks'}); + my $gap = int($c->{Configure}{'-gap'}); + + $blocks = 1 if $blocks < 1; + + my $gwidth = $gap * ( $blocks - 1); + my $bwidth = ($length - $gwidth) / $blocks; + + if($bwidth < 3 || $blocks <= 1 || $gap <= 0) { + $blocks = 1; + $bwidth = $length; + $gap = 0; + } + + if($why & 1) { + my $colors = $c->{Configure}{'-colors'} || []; + my $bdir = $from < $to ? $dir : 0 - $dir; + + $c->delete($c->find('all')); + + $c->createRectangle(0,0,$w+$x*2,$h+$y*2, + -fill => $c->{Configure}{'-troughcolor'}, + -width => 0, + -outline => undef); + + $c->{'cover'} = $c->createRectangle($x,$y,$w,$h, + -fill => $c->{Configure}{'-troughcolor'}, + -width => 0, + -outline => undef); + + my($x0,$y0,$x1,$y1); + + if($horz) { + if($bdir > 0) { + ($x0,$y0) = ($x - $gap,$y); + } + else { + ($x0,$y0) = ($length + $x + $gap,$y); + } + ($x1,$y1) = ($x0,$y0 + $width); + } + else { + if($bdir > 0) { + ($x0,$y0) = ($x,$y - $gap); + } + else { + ($x0,$y0) = ($x,$length + $y + $gap); + } + ($x1,$y1) = ($x0 + $width,$y0); + } + + my $blks = $blocks; + my $dval = ($maxv - $minv) / $blocks; + my $color = $c->cget('-foreground'); + my $pos = 0; + my $val = $minv; + + while($val < $maxv) { + my($bw,$nval); + + while(($pos < @$colors) && $colors->[$pos] <= $val) { + $color = $colors->[$pos+1]; + $pos += 2; + } + + if($blocks == 1) { + $nval = defined($colors->[$pos]) + ? $colors->[$pos] : $maxv; + $bw = (($nval - $val) / ($maxv - $minv)) * $length; + } + else { + $bw = $bwidth; + $nval = $val + $dval if($blocks > 1); + } + + if($horz) { + if($bdir > 0) { + $x0 = $x1 + $gap; + $x1 = $x0 + $bw; + } + else { + $x1 = $x0 - $gap; + $x0 = $x1 - $bw; + } + } + else { + if($bdir > 0) { + $y0 = $y1 + $gap; + $y1 = $y0 + $bw; + } + else { + $y1 = $y0 - $gap; + $y0 = $y1 - $bw; + } + } + + $c->createRectangle($x0,$y0,$x1,$y1, + -fill => $color, + -width => 0, + -outline => undef + ); + $val = $nval; + } + } + + my $cover = $c->{'cover'}; + my $ddir = $from > $to ? 1 : -1; + + if(($value <=> $to) == (0-$ddir)) { + $c->lower($cover); + } + elsif(($value <=> $from) == $ddir) { + $c->raise($cover); + my $x1 = $horz ? $x + $length : $x + $width; + my $y1 = $horz ? $y + $width : $y + $length; + $c->coords($cover,$x,$y,$x1,$y1); + } + else { + my $step; + $value = int($value / $step) * $step + if(defined($step = $c->{Configure}{'-resolution'}) && $step > 0); + + $maxv = $minv+1 + if $minv == $maxv; + + my $range = $maxv - $minv; + my $bval = $range / $blocks; + my $offset = abs($value - $from); + my $ioff = int($offset / $bval); + my $start = $ioff * ($bwidth + $gap); + $start += ($offset - ($ioff * $bval)) / $bval * $bwidth; + + my($x0,$x1,$y0,$y1); + + if($horz) { + $y0 = $y; + $y1 = $y + $h; + if($dir > 0) { + $x0 = $x + $start; + $x1 = $x + $w; + } + else { + $x0 = $x; + $x1 = $w + $x - $start; + } + } + else { + $x0 = $x; + $x1 = $x + $w; + if($dir > 0) { + $y0 = $y + $start; + $y1 = $y + $h; + } + else { + $y0 = $y; + $y1 = $h + $y - $start; + } + } + + + $c->raise($cover); + $c->coords($cover,$x0,$y0,$x1,$y1); + } +} + +sub value { + my $c = shift; + my $val = defined($c->{'-variable'}) + ? $c->{'-variable'} + : \$c->{'-value'}; + my $old = defined($$val) ? $$val : $c->{Configure}{'-from'}; + + if(@_) { + my $value = shift; + $$val = defined($value) ? $value : $c->{Configure}{'-from'}; + _layoutRequest($c,2); + } + + $old; +} + +sub variable { + my $c = shift; + my $oldvarref = $c->{'-variable'}; + my $oldval = $$oldvarref if $oldvarref; + if(@_) { + my $varref = shift; + if ($oldvarref) + { + $c->traceVdelete($oldvarref); + } + $c->{'-variable'} = $varref; + $c->traceVariable($varref, 'w', sub { $c->value($_[1]) }); + $$varref = $oldval; + _layoutRequest($c,2); + } + $oldval; +} + +sub Destroyed +{ + my $c = shift; + my $var = delete $c->{'-variable'}; + $c->traceVdelete($var); +} + +1; +__END__ + +=head1 NAME + +Tk::ProgressBar - A graphical progress bar + +=for category Derived Widgets + +=head1 SYNOPSIS + + use Tk::ProgressBar; + + $progress = $parent->ProgressBar( + -width => 200, + -length => 20, + -anchor => 's', + -from => 0, + -to => 100, + -blocks => 10, + -colors => [0, 'green', 50, 'yellow' , 80, 'red'], + -variable => \$percent_done + ); + + $progress->value($position); + +=head1 DESCRIPTION + +B<Tk::ProgressBar> provides a widget which will show a graphical representation +of a value, given maximum and minimum reference values. + +=head1 STANDARD OPTIONS + +The following standard widget options are supported: + +=over 4 + +=item B<-borderwidth> + +=item B<-highlightthickness> + +Defaults to 0. + +=item B<-padx> + +Defaults to 0. + +=item B<-pady> + +Defaults to 0. + +=item B<-relief> + +Defaults to C<sunken> + +=item B<-troughcolor> + +The color to be used for the background (trough) of the progress bar. +Default is to use grey55. + +=back + +=head1 WIDGET-SPECIFIC OPTIONS + +=over 4 + +=item B<-anchor> + +This can be used to position the start point of the bar. Default +is 'w' (horizontal bar starting from the left). A vertical bar can be +configured by using either 's' or 'n'. + +=item B<-blocks> + +This controls the number of blocks to be used to construct the progress +bar. The default is to break the bar into 10 blocks. + +=item B<-colors> + +Controls the colors to be used for different positions of the progress bar. +The colors should be supplied as a reference to an array containing pairs +of positions and colors. + + -colors => [ 0, 'green', 50, 'red' ] + +means that for the range 0 to 50 the progress bar should be green +and for higher values it should be red. + + +=item B<-from> + +This sets the lower limit of the progress bar. If the bar is set to a +value below the lower limt no bar will be displayed. Defaults to 0. +See the C<-to> description for more information. + +=item B<-gap> + +This is the spacing (in pixels) between each block. Defaults to 1. +Use 0 to get a continuous bar. + + +=item B<-length> + +Specifies the desired long dimension of the ProgressBar in screen +units (i.e. any of the forms acceptable to Tk_GetPixels). For vertical +ProgressBars this is the ProgressBars height; for horizontal scales it +is the ProgressBars width. The default length is calculated from the +values of C<-padx>, C<-borderwidth>, C<-highlightthickness> and the +difference between C<-from> and C<-to>. + + +=item B<-resolution> + +A real value specifying the resolution for the scale. If this value is greater +than zero then the scale's value will always be rounded to an even multiple of +this value, as will tick marks and the endpoints of the scale. If the value is +less than zero then no rounding occurs. Defaults to 1 (i.e., the value will be +integral). + +=item B<-to> + +This sets the upper limit of the progress bar. If a value is specified +(for example, using the C<value> method) that lies above this value the +full progress bar will be displayed. Defaults to 100. + + + +=item B<-variable> + +Specifies the reference to a scalar variable to link to the ProgressBar. +Whenever the value of the variable changes, the ProgressBar will upate +to reflect this value. (See also the B<value> method below.) + +=item B<-value> + +The can be used to set the current position of the progress bar +when used in conjunction with the standard C<configure>. It is +usually recommended to use the B<value> method instead. + + +=item B<-width> + +Specifies the desired narrow dimension of the ProgressBar in screen +units (i.e. any of the forms acceptable to Tk_GetPixels). For +vertical ProgressBars this is the ProgressBars width; for horizontal +bars this is the ProgressBars height. The default width is derived +from the values of C<-borderwidth> and C<-pady> and C<-highlightthickness>. + +=back + +=head1 WIDGET METHODS + +=over 4 + +=item I<$ProgressBar>-E<gt>B<value>(?I<value>?) + +If I<value> is omitted, returns the current value of the ProgressBar. If +I<value> is given, the value of the ProgressBar is set. If I<$value> is +given but undefined the value of the option B<-from> is used. + +=back + + +=head1 AUTHOR + +Graham Barr E<lt>F<gbarr@pobox.com>E<gt> + +=head1 COPYRIGHT + +Copyright (c) 1997-1998 Graham Barr. All rights reserved. +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=cut + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/README.Adjust b/Master/tlpkg/tlperl.old/lib/Tk/README.Adjust new file mode 100644 index 00000000000..8c3eba45717 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/README.Adjust @@ -0,0 +1,77 @@ +Subject: Adjuster +Date: Wed, 16 Dec 1998 22:23:23 +0100 +From: Stephen Kun <stephen.kun@is.gaertner.de> +To: Nick Ing-Simmons <nick@ni-s.u-net.com> + + + + +3. How do I find out whether slave is a pack or grid master or if it is not a +master (for setting packPropagate(0)) +Currently I set both on the slave. + +4. In setting position of drag bar, I do a lot of calcs for each motion event. +Some could be done one for first, then used again for subsequent calls, eg: +borderwidth of master, etc. +I've now partially done this and store them on the widget. + +5. Do I need XSync and idletasks calls in Adjuster.pm? +XSync causes a bug. idletasks doesn't make any difference in practice, from +what I can see. I've commented both out. +Bug when using XSync: + Run pack_adj_4r + Shorten whole window from right so that left window edge crosses leftmost + adjuster. Buttons on other adjusters disappear + +6. Sometimes the effect given by the Restore method, is undesirable. Eg. +for multi-columns. Then when you expand say the 1st column, the size of the +col at the end gets reduced to 0 width when the Adjuster forces itself in. +Then when you reduce the size of the first column again, the end col is still +0 width. +Better would be: +a) put the restore functionality on a flag OR +b) when a col is reduced because of a Restore, it saves previous width of +its slave, and attempts to restore it when the space becomes availabe. (Sounds +impracticable.) +I've implemented a) with default ON. In the documentation I'll recommend the +default for the 1st Adjuster, then OFF for the remaining. + +8. What about a packAdjustForget? Given that Adjuster doesn't work well for +grid anyway, and doesn't consider other managers, that wouldn't be too bad. +I'm not going to do this, but someone mentioned it a while ago. I can +see me probably wanting it too at some point. +Are you for the idea? + +10. Grid doesn't work well with Adjuster, didn't before either. I think +this has to do with grid, rather than adjuster. You get the same effect +if you grid a row of widgets, then reduce the width of the window. +Bugs demonstrated by grid_adj_4l: +a) there's never an Unmap event for the adjuster. +b) after adjusting, widgets protrude into border on right. +c) grid('Propagate', 0) on MainWindow has no effect - window shrinks/grows + when widgets are adjusted +d) widgets shuffle to correct position on startup +I don't recommend use of grid with Adjust! + +11. Have taken out __END__ temporarily for testing +Will put it back before publishing on the mailing list. + +12. Why do the adjusters in my testcases come out grey? That's not the +default background. + +13. Could packAdjust return ($adj, $w). Could then do: + my $canv = $top->Canvas()->packAdjust(); +OR + my ($adj, $canv) = $top->Canvas()->packAdjust(); +Latter is good if you want to configure or unpack adjuster later. +I realise this is very Kludgy, but there's no other way to get the +Adjuster from packAdjust. +I suppose the workaround of creating the Adjuster yourself is OK. When +you do it by hand though, there's more chance of making mistakes, eg +forgetting the -side (which defaults then to 'top') which would cause havoc. +What's your opinion. + +14. Run the script adj_button_bug: You can't reduce size of button. +Button can be expanded, but as soon as focus enters button, it springs back +to its original size. Why? +It's not important though. diff --git a/Master/tlpkg/tlperl.old/lib/Tk/ROText.pm b/Master/tlpkg/tlperl.old/lib/Tk/ROText.pm new file mode 100644 index 00000000000..cc5634f5475 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/ROText.pm @@ -0,0 +1,43 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::ROText; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #10 $ =~ /\D(\d+)\s*$/; + +use Tk::Text; +use base qw(Tk::Derived Tk::Text); + +Construct Tk::Widget 'ROText'; + +sub clipEvents +{ + return qw[Copy]; +} + +sub ClassInit +{ + my ($class,$mw) = @_; + my $val = $class->bindRdOnly($mw); + my $cb = $mw->bind($class,'<Next>'); + $mw->bind($class,'<space>',$cb) if (defined $cb); + $cb = $mw->bind($class,'<Prior>'); + $mw->bind($class,'<BackSpace>',$cb) if (defined $cb); + $class->clipboardOperations($mw,'Copy'); + return $val; +} + +sub Populate { + my($self,$args) = @_; + $self->SUPER::Populate($args); + my $m = $self->menu->entrycget($self->menu->index('Search'), '-menu'); + $m->delete($m->index('Replace')); +} + +sub Tk::Widget::ScrlROText { shift->Scrolled('ROText' => @_) } + +1; + +__END__ + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Radiobutton.pm b/Master/tlpkg/tlperl.old/lib/Tk/Radiobutton.pm new file mode 100644 index 00000000000..d09d41b4208 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Radiobutton.pm @@ -0,0 +1,45 @@ +# Conversion from Tk4.0 button.tcl competed. +# Copyright (c) 1992-1994 The Regents of the University of California. +# Copyright (c) 1994 Sun Microsystems, Inc. +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or + +package Tk::Radiobutton; + +use vars qw($VERSION); +$VERSION = '4.006'; # $Id: //depot/Tkutf8/Tk/Radiobutton.pm#6 $ + +# modify it under the same terms as Perl itself, subject +# to additional disclaimer in license.terms due to partial +# derivation from Tk4.0 sources. + +require Tk::Button; + + +use base qw(Tk::Button); +Construct Tk::Widget 'Radiobutton'; + +sub Tk_cmd { \&Tk::radiobutton } + +sub CreateOptions +{ + return (shift->SUPER::CreateOptions,'-variable'); +} + +sub ClassInit +{ + my ($class,$mw) = @_; + $mw->bind($class,'<Enter>', 'Enter'); + $mw->bind($class,'<Leave>', 'Leave'); + $mw->bind($class,'<1>', 'Invoke'); + $mw->bind($class,'<space>', 'Invoke'); + return $class; +} + +sub Invoke +{ + my $w = shift; + $w->invoke() unless($w->cget('-state') eq 'disabled'); +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Region.pm b/Master/tlpkg/tlperl.old/lib/Tk/Region.pm new file mode 100644 index 00000000000..3e02bd2ff49 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Region.pm @@ -0,0 +1,182 @@ +package Tk::Region; + +# Ideas in progress do not document ... + +use strict; + +use vars qw($VERSION); +$VERSION = '4.006'; # $Id: //depot/Tkutf8/Tk/Region.pm#6 $ + +use Tk::Widget (); + +Construct Tk::Widget 'Region'; + +my %index = (-widget => 1, '-x' => 2, '-y' => 3, -width => 4, -height => 5); + +sub _attr +{ + my ($obj,$key,$val) = @_; + if (@_ > 2) + { + $obj->{$key} = $val; + } + return $obj->{$key} +} + +foreach my $name (qw(widget x y width height)) + { + my $key = "-$name"; + no strict 'refs'; + *{$name} = sub { shift->_attr($key,@_) }; + } + +sub new +{ + my $class = shift; + my $widget = shift; + my $obj = bless [\%index,$widget,0,0,0,0],$class; + $obj->configure(@_); +} + +sub cfgDefault +{ + my ($class,$key) = @_; + return undef; +} + +sub cfgName +{ + my ($class,$key) = @_; + $key =~ s/^-//; + return lcfirst($key); +} + +sub cfgClass +{ + return ucfirst(shift->cfgName(@_)); +} + +sub configure +{ + my $obj = shift; + my @results; + if (@_ > 1) + { + while (@_) + { + my $key = shift; + my $val = shift; + if (exists $obj->{$key}) + { + $obj->{$key} = $val; + } + else + { + my ($meth) = $key =~ /^-(\w+)$/; + croak("Invalid option $key") unless $obj->can($meth); + $obj->$meth($val); + } + } + } + elsif (@_ == 1) + { + my $key = shift; + my $value = $obj->cget($key); + push(@results,$key,$obj->cfgName($key),$obj->cfgClass($key),$obj->cfgDefault($key),$value); + } + else + { + foreach my $key (sort keys %$obj) + { + push(@results,scalar($obj->configure($key))) + } + } + return wantarray ? @results : \@results; +} + +sub cget +{ + my $obj = shift; + my $key = shift; + return $obj->{$key} if exists $obj->{$key}; + my ($meth) = $key =~ /^-(\w+)$/; + croak("Invalid option $key") unless $obj->can($meth); + return $obj->$meth(); +} + +sub bbox +{ + my $obj = shift; + my @results; + if (@_) + { + my $ref = (@_ == 1) ? shift : \@_; + my ($x1,$y1,$x2,$y2) = (ref $ref) ? @$ref : split(/\s+/,$ref); + ($x2,$x1) = ($x1,$x2) if ($x2 < $x1); + ($y2,$y1) = ($y1,$y2) if ($y2 < $y1); + $obj->width($x2-$x1); + $obj->height($y2-$y1); + $obj->x($x1); + $obj->y($y1); + } + else + { + my $x = $obj->x; + my $y = $obj->x; + push(@results,$x,$y,$x+$obj->width,$y+$obj->height); + } + return wantarray ? @results : \@results; +} + +sub rootx +{ + my $obj = shift; + if (@_) + { + my $x = shift; + $obj->x($x-$obj->widget->rootx); + } + return $obj->widget->rootx + $obj->{'-x'} +} + +sub rooty +{ + my $obj = shift; + if (@_) + { + my $y = shift; + $obj->y($y-$obj->widget->rootx); + } + return $obj->widget->rooty + $obj->{'-y'} +} + +sub rootxy +{ + my $obj = shift; + if (@_) + { + $obj->rootx(shift); + $obj->rooty(shift); + } + my @results = ($obj->rootx,$obj->rooty); + return wantarray ? @results : \@results; +} + +sub rootbbox +{ + my $obj = shift; + my ($x1,$y1) = $obj->rootxy; + my $x2 = $x1+$obj->width; + my $y2 = $y1+$obj->height; + my @results = ($x1,$y1,$x2,$y2); + return wantarray ? @results : \@results; +} + + +*Width = \&width; +*Height = \&height; +*X = \&rootx; +*Y = \&rooty; + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Reindex.pm b/Master/tlpkg/tlperl.old/lib/Tk/Reindex.pm new file mode 100644 index 00000000000..05e8e1fc1fc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Reindex.pm @@ -0,0 +1,225 @@ +package Tk::Reindex; + + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/TextList/Reindex.pm#4 $ + +use Tk; +use base qw(Tk::Derived); + + +sub Populate +{ + my ($w, $args) = @_; + + $w->_callbase('Populate',$args); + + $w->ConfigSpecs(-linestart => ["PASSIVE", "lineStart", "LineStart", 0], + -toindexcmd => ["CALLBACK", "toIndexCmd", "ToIndexCmd" , [\&to_index,$w]], + -fromindexcmd => ["CALLBACK", "fromIndexCmd","FromIndexCmd", [\&from_index,$w]]); +} + +sub import +{ + my($module,$base)=@_; + my $pkg=(caller)[0]; + + no strict 'refs'; + *{"${pkg}::_reindexbase"}=sub{$base}; +} + +sub _callbase +{ + my($w,$sub)=(shift,shift); + my $supersub=$w->_reindexbase()."::$sub"; + $w->$supersub(@_); +} + +BEGIN +{ + # list of subroutines and index argument number (-1 as first element means return value) + my %subs=('bbox' => [0], + 'compare' => [0,2], + 'delete' => [0,1], + 'dlineinfo' => [0], + 'dump' => \&_find_dump_index, + 'get' => [0,1], + 'index' => [-1,0], + 'insert' => [0], + 'mark' => \&_find_mark_index, + 'search' => \&_find_search_index, + 'see' => [0], + 'tag' => \&_find_tag_index, + 'window' => [1], + 'image' => [1], + ); + + foreach my $sub (keys %subs) + { + my $args=$subs{$sub}; + my $argsub=ref $args eq 'CODE'?$args:sub{$args}; + my $newsub=sub + { + my($w)=shift; + my(@iargs)=grep($_<=$#_,@{$argsub->(@_)}); + my $iret=shift @iargs if @iargs && $iargs[0]==-1; + my(@args)=@_; + @args[@iargs]=$w->Callback(-toindexcmd,@args[@iargs]); + my(@ret)=$w->_callbase($sub,@args); + @ret=$w->Callback(-fromindexcmd,@ret) if $iret; + wantarray?@ret:$ret[0]; + }; + no strict 'refs'; + *{$sub}=$newsub; + } +} + +sub to_index +{ + my $w=shift; + my $offset=$w->cget(-linestart)+1; + my(@args)=@_; + foreach (@args) + { + s/^\d+(?=\.)/$&+$offset/e; + } + @args; +} + +sub from_index +{ + my $w=shift; + my $offset=$w->cget(-linestart)+1; + my(@args)=@_; + foreach (@args) + { + s/^\d+(?=\.)/$&-$offset/e + } + @args; +} + +sub _find_dump_index +{ + my $idx=_count_options(@_); + [$idx,$idx+1]; +} + +sub _find_search_index +{ + my $idx=_count_options(@_); + [$idx+1,$idx+2]; +} + +sub _count_options +{ + my $idx=0; + while($_[$idx]=~/^-/g) + { + $idx++; + $idx++ if $' eq 'count' or $' eq 'command'; + last if $' eq '-'; + } + $idx; +} + +sub _find_tag_index +{ + return [1] if $_[0] eq 'names'; + return [2,3] if $_[0]=~/^(add|remove|nextrange|prevrange)$/; + return [-1] if $_[0] eq 'ranges'; + return []; +} + +sub _find_mark_index +{ + return [2] if $_[0] eq 'set'; + return [1] if $_[0] eq 'next' or $_[0] eq 'previous'; + return []; +} + +1; + +=head1 NAME + +Tk::Reindex - change the base index of Text-like widgets + +=for category Derived Widgets + +=head1 SYNOPSIS + + use Tk::ReindexedText; + $t1=$w->ReindexedText(-linestart => 2); + + use Tk::ReindexedROText; + $t2=$w->ReindexedROText(-linestart => 0); + +=head1 DESCRIPTION + +Creates a new widget class based on B<Text>-like widgets that can +redefine the line number base (normally B<Text> widgets start line +numbers at 1), or possibly other manipulations on indexes. + +=head1 STANDARD OPTIONS + +The newly-defined widget takes all the same options as the base +widget, which defaults to B<Text>. + +=head1 WIDGET-SPECIFIC OPTIONS + +=item Name: B<lineStart> + +=item Class: B<LineStart> + +=item Switch: B<-linestart> + +Sets the line number of the first line in the B<Text> widget. The +default B<-toindexcmd> and B<-fromindexcmd> use this configuration +option. + +-item Name: B<toIndexCmd> B<fromIndexCmd> + +-item Class: B<ToIndexCmd> B<FromIndexCmd> + +-item Switch: B<-toindexcmd> B<-fromindexcmd> + +These two options specify callbacks that are called with a list of +indexes and are responsible for translating them to/from indexes that +the base B<Text> widget can understand. The callback is passed the +widget followed by a list of indexes, and should return a list of +translated indexes. B<-toindexcmd> should translate from 'user' +indexes to 'native' B<Text>-compatible indexes, and B<-fromindexcmd> +should translate from 'native' indexes to 'user' indexes. + +The default callbacks simply add/subtract the offset given by the +B<-linestart> option for all indexes in 'line.character' format. + +It would probably be prudent to make these functions inverses of each +other. + +=head1 CLASS METHODS + +=item import + +To make new Reindex widgets, this function should be called via B<use> +with the name of the Text-like base class that you are extending with +"Reindex" capability. 'use base(Tk::Reindex Tk::nameofbasewidget)' +should also be specified for that widget. + +=head1 BUGS + +I've used the word "indexes" instead of "indices" throughout the +documentation. + +All the built-in perl code for widget bindings & methods will use the +new 'user' indexes. Which means all this index manipulation might +might break code that is trying to parse/manipulate indexes. Or even +assume that '1.0' is the beginning index. B<Tk::Text::Contents> comes +to mind. + +=head1 AUTHOR + +Andrew Allen <ada@fc.hp.com> + +This code may be distributed under the same conditions as Perl. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Tk/ReindexedROText.pm b/Master/tlpkg/tlperl.old/lib/Tk/ReindexedROText.pm new file mode 100644 index 00000000000..8c293f5fa61 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/ReindexedROText.pm @@ -0,0 +1,13 @@ +use strict; +package Tk::ReindexedROText; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/TextList/ReindexedROText.pm#4 $ + +use Tk::Reindex qw(Tk::ROText); +use base qw(Tk::Reindex Tk::ROText); +Construct Tk::Widget 'ReindexedROText'; + +1; + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/ReindexedText.pm b/Master/tlpkg/tlperl.old/lib/Tk/ReindexedText.pm new file mode 100644 index 00000000000..c16a6fe7fd7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/ReindexedText.pm @@ -0,0 +1,13 @@ +use strict; +package Tk::ReindexedText; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/TextList/ReindexedText.pm#4 $ + +use Tk::Reindex qw(Tk::Text); +use base qw(Tk::Reindex Tk::Text); +Construct Tk::Widget 'ReindexedText'; + +1; + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Scale.pm b/Master/tlpkg/tlperl.old/lib/Tk/Scale.pm new file mode 100644 index 00000000000..57c7bb11aa1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Scale.pm @@ -0,0 +1,278 @@ +# Converted from scale.tcl -- +# +# This file defines the default bindings for Tk scale widgets. +# +# @(#) scale.tcl 1.3 94/12/17 16:05:23 +# +# Copyright (c) 1994 The Regents of the University of California. +# Copyright (c) 1994 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +package Tk::Scale; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Scale/Scale.pm#4 $ + +use Tk qw($XS_VERSION); +use AutoLoader; + +use base qw(Tk::Widget); + +Construct Tk::Widget 'Scale'; + +bootstrap Tk::Scale; + +sub Tk_cmd { \&Tk::scale } + +Tk::Methods('coords','get','identify','set'); + + +import Tk qw(Ev); + +# +# Bind -- +# This procedure below invoked the first time the mouse enters a +# scale widget or a scale widget receives the input focus. It creates +# all of the class bindings for scales. +# +# Arguments: +# event - Indicates which event caused the procedure to be invoked +# (Enter or FocusIn). It is used so that we can carry out +# the functions of that event in addition to setting up +# bindings. +sub ClassInit +{ + my ($class,$mw) = @_; + + $mw->bind($class,'<Enter>',['Enter',Ev('x'),Ev('y')]); + $mw->bind($class,'<Motion>',['Activate',Ev('x'),Ev('y')]); + $mw->bind($class,'<Leave>','Leave'); + + $mw->bind($class,'<1>',['ButtonDown',Ev('x'),Ev('y')]); + $mw->bind($class,'<B1-Motion>',['Drag',Ev('x'),Ev('y')]); + $mw->bind($class,'<B1-Leave>','NoOp'); + $mw->bind($class,'<B1-Enter>','NoOp'); + $mw->bind($class,'<ButtonRelease-1>',['ButtonUp',Ev('x'),Ev('y')]); + + $mw->bind($class,'<2>',['ButtonDown',Ev('x'),Ev('y')]); + $mw->bind($class,'<B2-Motion>',['Drag',Ev('x'),Ev('y')]); + $mw->bind($class,'<B2-Leave>','NoOp'); + $mw->bind($class,'<B2-Enter>','NoOp'); + $mw->bind($class,'<ButtonRelease-2>',['ButtonUp',Ev('x'),Ev('y')]); + + $mw->bind($class,'<Control-1>',['ControlPress',Ev('x'),Ev('y')]); + + $mw->bind($class,'<Up>',['Increment','up','little','noRepeat']); + $mw->bind($class,'<Down>',['Increment','down','little','noRepeat']); + $mw->bind($class,'<Left>',['Increment','up','little','noRepeat']); + $mw->bind($class,'<Right>',['Increment','down','little','noRepeat']); + + $mw->bind($class,'<Control-Up>',['Increment','up','big','noRepeat']); + $mw->bind($class,'<Control-Down>',['Increment','down','big','noRepeat']); + $mw->bind($class,'<Control-Left>',['Increment','up','big','noRepeat']); + $mw->bind($class,'<Control-Right>',['Increment','down','big','noRepeat']); + + $mw->bind($class,'<Home>',['set',Ev('cget','-from')]); + $mw->bind($class,'<End>',['set',Ev('cget','-to')]); + return $class; +} + +1; + +__END__ + +# Activate -- +# This procedure is invoked to check a given x-y position in the +# scale and activate the slider if the x-y position falls within +# the slider. +# +# Arguments: +# w - The scale widget. +# x, y - Mouse coordinates. +sub Activate +{ + my $w = shift; + my $x = shift; + my $y = shift; + return if ($w->cget('-state') eq 'disabled'); + my $ident = $w->identify($x,$y); + if (defined($ident) && $ident eq 'slider') + { + $w->configure(-state => 'active') + } + else + { + $w->configure(-state => 'normal') + } +} + +sub Leave +{ + my ($w) = @_; + $w->configure('-activebackground',$w->{'activeBg'}) if ($Tk::strictMotif); + $w->configure('-state','normal') if ($w->cget('-state') eq 'active'); +} + +sub Enter +{ + my ($w,$x,$y) = @_; + if ($Tk::strictMotif) + { + $w->{'activeBg'} = $w->cget('-activebackground'); + $w->configure('-activebackground',$w->cget('-background')); + } + $w->Activate($x,$y); +} + +sub ButtonUp +{ + my ($w,$x,$y) = @_; + $w->CancelRepeat(); + $w->EndDrag(); + $w->Activate($x,$y) +} + + +# ButtonDown -- +# This procedure is invoked when a button is pressed in a scale. It +# takes different actions depending on where the button was pressed. +# +# Arguments: +# w - The scale widget. +# x, y - Mouse coordinates of button press. +sub ButtonDown +{ + my $w = shift; + my $x = shift; + my $y = shift; + $Tk::dragging = 0; + $el = $w->identify($x,$y); + return unless ($el); + if ($el eq 'trough1') + { + $w->Increment('up','little','initial') + } + elsif ($el eq 'trough2') + { + $w->Increment('down','little','initial') + } + elsif ($el eq 'slider') + { + $Tk::dragging = 1; + my @coords = $w->coords(); + $Tk::deltaX = $x-$coords[0]; + $Tk::deltaY = $y-$coords[1]; + } +} +# Drag -- +# This procedure is called when the mouse is dragged with +# mouse button 1 down. If the drag started inside the slider +# (i.e. the scale is active) then the scale's value is adjusted +# to reflect the mouse's position. +# +# Arguments: +# w - The scale widget. +# x, y - Mouse coordinates. +sub Drag +{ + my $w = shift; + my $x = shift; + my $y = shift; + if (!$Tk::dragging) + { + return; + } + $w->set($w->get($x-$Tk::deltaX,$y-$Tk::deltaY)) +} +# EndDrag -- +# This procedure is called to end an interactive drag of the +# slider. It just marks the drag as over. +# Arguments: +# w - The scale widget. +sub EndDrag +{ + my $w = shift; + if (!$Tk::dragging) + { + return; + } + $Tk::dragging = 0; +} +# Increment -- +# This procedure is invoked to increment the value of a scale and +# to set up auto-repeating of the action if that is desired. The +# way the value is incremented depends on the "dir" and "big" +# arguments. +# +# Arguments: +# w - The scale widget. +# dir - "up" means move value towards -from, "down" means +# move towards -to. +# big - Size of increments: "big" or "little". +# repeat - Whether and how to auto-repeat the action: "noRepeat" +# means don't auto-repeat, "initial" means this is the +# first action in an auto-repeat sequence, and "again" +# means this is the second repetition or later. +sub Increment +{ + my $w = shift; + my $dir = shift; + my $big = shift; + my $repeat = shift; + my $inc; + if ($big eq 'big') + { + $inc = $w->cget('-bigincrement'); + if ($inc == 0) + { + $inc = abs(($w->cget('-to')-$w->cget('-from')))/10.0 + } + if ($inc < $w->cget('-resolution')) + { + $inc = $w->cget('-resolution') + } + } + else + { + $inc = $w->cget('-resolution') + } + if (($w->cget('-from') > $w->cget('-to')) ^ ($dir eq 'up')) + { + $inc = -$inc + } + $w->set($w->get()+$inc); + if ($repeat eq 'again') + { + $w->RepeatId($w->after($w->cget('-repeatinterval'),'Increment',$w,$dir,$big,'again')); + } + elsif ($repeat eq 'initial') + { + $w->RepeatId($w->after($w->cget('-repeatdelay'),'Increment',$w,$dir,$big,'again')); + } +} +# ControlPress -- +# This procedure handles button presses that are made with the Control +# key down. Depending on the mouse position, it adjusts the scale +# value to one end of the range or the other. +# +# Arguments: +# w - The scale widget. +# x, y - Mouse coordinates where the button was pressed. +sub ControlPress +{ + my ($w,$x,$y) = @_; + my $el = $w->identify($x,$y); + return unless ($el); + if ($el eq 'trough1') + { + $w->set($w->cget('-from')) + } + elsif ($el eq 'trough2') + { + $w->set($w->cget('-to')) + } +} + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Scrollbar.pm b/Master/tlpkg/tlperl.old/lib/Tk/Scrollbar.pm new file mode 100644 index 00000000000..6b416e04b30 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Scrollbar.pm @@ -0,0 +1,429 @@ +# Conversion from Tk4.0 scrollbar.tcl competed. +package Tk::Scrollbar; + +use vars qw($VERSION); +$VERSION = '4.010'; # $Id: //depot/Tkutf8/Scrollbar/Scrollbar.pm#10 $ + +use Tk qw($XS_VERSION Ev); +use AutoLoader; + +use base qw(Tk::Widget); + +#use strict; +#use vars qw($pressX $pressY @initValues $initPos $activeBg); + +Construct Tk::Widget 'Scrollbar'; + +bootstrap Tk::Scrollbar; + +sub Tk_cmd { \&Tk::scrollbar } + +Tk::Methods('activate','delta','fraction','get','identify','set'); + +sub Needed +{ + my ($sb) = @_; + my @val = $sb->get; + return 1 unless (@val == 2); + return 1 if $val[0] != 0.0; + return 1 if $val[1] != 1.0; + return 0; +} + + +sub ClassInit +{ + my ($class,$mw) = @_; + $mw->bind($class, '<Enter>', 'Enter'); + $mw->bind($class, '<Motion>', 'Motion'); + $mw->bind($class, '<Leave>', 'Leave'); + + $mw->bind($class, '<1>', 'ButtonDown'); + $mw->bind($class, '<B1-Motion>', ['Drag', Ev('x'), Ev('y')]); + $mw->bind($class, '<ButtonRelease-1>', 'ButtonUp'); + $mw->bind($class, '<B1-Leave>', 'NoOp'); # prevent generic <Leave> + $mw->bind($class, '<B1-Enter>', 'NoOp'); # prevent generic <Enter> + $mw->bind($class, '<Control-1>', 'ScrlTopBottom'); + + $mw->bind($class, '<2>', 'ButtonDown'); + $mw->bind($class, '<B2-Motion>', ['Drag', Ev('x'), Ev('y')]); + $mw->bind($class, '<ButtonRelease-2>', 'ButtonUp'); + $mw->bind($class, '<B2-Leave>', 'NoOp'); # prevent generic <Leave> + $mw->bind($class, '<B2-Enter>', 'NoOp'); # prevent generic <Enter> + $mw->bind($class, '<Control-2>', 'ScrlTopBottom'); + + $mw->bind($class, '<Up>', ['ScrlByUnits','v',-1]); + $mw->bind($class, '<Down>', ['ScrlByUnits','v', 1]); + $mw->bind($class, '<Control-Up>', ['ScrlByPages','v',-1]); + $mw->bind($class, '<Control-Down>', ['ScrlByPages','v', 1]); + + $mw->bind($class, '<Left>', ['ScrlByUnits','h',-1]); + $mw->bind($class, '<Right>', ['ScrlByUnits','h', 1]); + $mw->bind($class, '<Control-Left>', ['ScrlByPages','h',-1]); + $mw->bind($class, '<Control-Right>', ['ScrlByPages','h', 1]); + + $mw->bind($class, '<Prior>', ['ScrlByPages','hv',-1]); + $mw->bind($class, '<Next>', ['ScrlByPages','hv', 1]); + + # X11 mousewheel - honour for horizontal too. + $mw->bind($class, '<4>', ['ScrlByUnits','hv',-5]); + $mw->bind($class, '<5>', ['ScrlByUnits','hv', 5]); + + $mw->bind($class, '<Home>', ['ScrlToPos', 0]); + $mw->bind($class, '<End>', ['ScrlToPos', 1]); + + $mw->bind($class, '<4>', ['ScrlByUnits','v',-3]); + $mw->bind($class, '<5>', ['ScrlByUnits','v', 3]); + + return $class; + +} + +1; + +__END__ + +sub Enter +{ + my $w = shift; + my $e = $w->XEvent; + if ($Tk::strictMotif) + { + my $bg = $w->cget('-background'); + $activeBg = $w->cget('-activebackground'); + $w->configure('-activebackground' => $bg); + } + $w->activate($w->identify($e->x,$e->y)); +} + +sub Leave +{ + my $w = shift; + if ($Tk::strictMotif) + { + $w->configure('-activebackground' => $activeBg) if (defined $activeBg) ; + } + $w->activate(''); +} + +sub Motion +{ + my $w = shift; + my $e = $w->XEvent; + $w->activate($w->identify($e->x,$e->y)); +} + +# tkScrollButtonDown -- +# This procedure is invoked when a button is pressed in a scrollbar. +# It changes the way the scrollbar is displayed and takes actions +# depending on where the mouse is. +# +# Arguments: +# w - The scrollbar widget. +# x, y - Mouse coordinates. + +sub ButtonDown +{my $w = shift; + my $e = $w->XEvent; + my $element = $w->identify($e->x,$e->y); + $w->configure('-activerelief' => 'sunken'); + if ($e->b == 1 and + (defined($element) && $element eq 'slider')) + { + $w->StartDrag($e->x,$e->y); + } + elsif ($e->b == 2 and + (defined($element) && $element =~ /^(trough[12]|slider)$/o)) + { + my $pos = $w->fraction($e->x, $e->y); + my($head, $tail) = $w->get; + my $len = $tail - $head; + + $head = $pos - $len/2; + $tail = $pos + $len/2; + if ($head < 0) { + $head = 0; + $tail = $len; + } + elsif ($tail > 1) { + $head = 1 - $len; + $tail = 1; + } + $w->ScrlToPos($head); + $w->set($head, $tail); + + $w->StartDrag($e->x,$e->y); + } + else + { + $w->Select($element,'initial'); + } +} + +# tkScrollButtonUp -- +# This procedure is invoked when a button is released in a scrollbar. +# It cancels scans and auto-repeats that were in progress, and restores +# the way the active element is displayed. +# +# Arguments: +# w - The scrollbar widget. +# x, y - Mouse coordinates. + +sub ButtonUp +{my $w = shift; + my $e = $w->XEvent; + $w->CancelRepeat; + $w->configure('-activerelief' => 'raised'); + $w->EndDrag($e->x,$e->y); + $w->activate($w->identify($e->x,$e->y)); +} + +# tkScrollSelect -- +# This procedure is invoked when button 1 is pressed over the scrollbar. +# It invokes one of several scrolling actions depending on where in +# the scrollbar the button was pressed. +# +# Arguments: +# w - The scrollbar widget. +# element - The element of the scrollbar that was selected, such +# as "arrow1" or "trough2". Shouldn't be "slider". +# repeat - Whether and how to auto-repeat the action: "noRepeat" +# means don't auto-repeat, "initial" means this is the +# first action in an auto-repeat sequence, and "again" +# means this is the second repetition or later. + +sub Select +{ + my $w = shift; + my $element = shift; + my $repeat = shift; + return unless defined ($element); + if ($element eq 'arrow1') + { + $w->ScrlByUnits('hv',-1); + } + elsif ($element eq 'trough1') + { + $w->ScrlByPages('hv',-1); + } + elsif ($element eq 'trough2') + { + $w->ScrlByPages('hv', 1); + } + elsif ($element eq 'arrow2') + { + $w->ScrlByUnits('hv', 1); + } + else + { + return; + } + + if ($repeat eq 'again') + { + $w->RepeatId($w->after($w->cget('-repeatinterval'),['Select',$w,$element,'again'])); + } + elsif ($repeat eq 'initial') + { + $w->RepeatId($w->after($w->cget('-repeatdelay'),['Select',$w,$element,'again'])); + } +} + +# tkScrollStartDrag -- +# This procedure is called to initiate a drag of the slider. It just +# remembers the starting position of the slider. +# +# Arguments: +# w - The scrollbar widget. +# x, y - The mouse position at the start of the drag operation. + +sub StartDrag +{ + my($w,$x,$y) = @_; + return unless (defined ($w->cget('-command'))); + $pressX = $x; + $pressY = $y; + @initValues = $w->get; + my $iv0 = $initValues[0]; + if (@initValues == 2) + { + $initPos = $iv0; + } + elsif ($iv0 == 0) + { + $initPos = 0; + } + else + { + $initPos = $initValues[2]/$initValues[0]; + } +} + +# tkScrollDrag -- +# This procedure is called for each mouse motion even when the slider +# is being dragged. It notifies the associated widget if we're not +# jump scrolling, and it just updates the scrollbar if we are jump +# scrolling. +# +# Arguments: +# w - The scrollbar widget. +# x, y - The current mouse position. + +sub Drag +{ + my($w,$x,$y) = @_; + return if !defined $initPos; + my $delta = $w->delta($x-$pressX, $y-$pressY); + if ($w->cget('-jump')) + { + if (@initValues == 2) + { + $w->set($initValues[0]+$delta, $initValues[1]+$delta); + } + else + { + $delta = sprintf "%d", $delta * $initValues[0]; # round() + $initValues[2] += $delta; + $initValues[3] += $delta; + $w->set(@initValues[2,3]); + } + } + else + { + $w->ScrlToPos($initPos+$delta); + } +} + +# tkScrollEndDrag -- +# This procedure is called to end an interactive drag of the slider. +# It scrolls the window if we're in jump mode, otherwise it does nothing. +# +# Arguments: +# w - The scrollbar widget. +# x, y - The mouse position at the end of the drag operation. + +sub EndDrag +{ + my($w,$x,$y) = @_; + return if (!defined $initPos); + if ($w->cget('-jump')) + { + my $delta = $w->delta($x-$pressX, $y-$pressY); + $w->ScrlToPos($initPos+$delta); + } + undef $initPos; +} + +# tkScrlByUnits -- +# This procedure tells the scrollbar's associated widget to scroll up +# or down by a given number of units. It notifies the associated widget +# in different ways for old and new command syntaxes. +# +# Arguments: +# w - The scrollbar widget. +# orient - Which kinds of scrollbars this applies to: "h" for +# horizontal, "v" for vertical, "hv" for both. +# amount - How many units to scroll: typically 1 or -1. + +sub ScrlByUnits +{my $w = shift; + my $orient = shift; + my $amount = shift; + my $cmd = $w->cget('-command'); + return unless (defined $cmd); + return if (index($orient,substr($w->cget('-orient'),0,1)) < 0); + my @info = $w->get; + if (@info == 2) + { + $cmd->Call('scroll',$amount,'units'); + } + else + { + $cmd->Call($info[2]+$amount); + } +} + +# tkScrlByPages -- +# This procedure tells the scrollbar's associated widget to scroll up +# or down by a given number of screenfuls. It notifies the associated +# widget in different ways for old and new command syntaxes. +# +# Arguments: +# w - The scrollbar widget. +# orient - Which kinds of scrollbars this applies to: "h" for +# horizontal, "v" for vertical, "hv" for both. +# amount - How many screens to scroll: typically 1 or -1. + +sub ScrlByPages +{ + my $w = shift; + my $orient = shift; + my $amount = shift; + my $cmd = $w->cget('-command'); + return unless (defined $cmd); + return if (index($orient,substr($w->cget('-orient'),0,1)) < 0); + my @info = $w->get; + if (@info == 2) + { + $cmd->Call('scroll',$amount,'pages'); + } + else + { + $cmd->Call($info[2]+$amount*($info[1]-1)); + } +} + +# tkScrlToPos -- +# This procedure tells the scrollbar's associated widget to scroll to +# a particular location, given by a fraction between 0 and 1. It notifies +# the associated widget in different ways for old and new command syntaxes. +# +# Arguments: +# w - The scrollbar widget. +# pos - A fraction between 0 and 1 indicating a desired position +# in the document. + +sub ScrlToPos +{ + my $w = shift; + my $pos = shift; + my $cmd = $w->cget('-command'); + return unless (defined $cmd); + my @info = $w->get; + if (@info == 2) + { + $cmd->Call('moveto',$pos); + } + else + { + $cmd->Call(int($info[0]*$pos)); + } +} + +# tkScrlTopBottom +# Scroll to the top or bottom of the document, depending on the mouse +# position. +# +# Arguments: +# w - The scrollbar widget. +# x, y - Mouse coordinates within the widget. + +sub ScrlTopBottom +{ + my $w = shift; + my $e = $w->XEvent; + my $element = $w->identify($e->x,$e->y); + return unless ($element); + if ($element =~ /1$/) + { + $w->ScrlToPos(0); + } + elsif ($element =~ /2$/) + { + $w->ScrlToPos(1); + } +} + + + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Spinbox.pm b/Master/tlpkg/tlperl.old/lib/Tk/Spinbox.pm new file mode 100644 index 00000000000..673a1e181ce --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Spinbox.pm @@ -0,0 +1,115 @@ +package Tk::Spinbox; +use strict; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d',q$Revision: #6 $ =~ /#(\d+)/; + +use base 'Tk::Entry'; + +sub Tk_cmd { \&Tk::spinbox } + +# Also inherits Entry's methods +Tk::Methods( "identify", "invoke", "set" ); +use Tk::Submethods ( 'selection' => ["element"] ); + +Construct Tk::Widget 'Spinbox'; + +sub ClassInit +{ + my ($class,$mw) = @_; + + $class->SUPER::ClassInit($mw); + + $mw->bind($class, '<Up>', [invoke => 'buttonup']); + $mw->bind($class, '<4>', [invoke => 'buttonup']); + $mw->bind($class, '<Down>',[invoke => 'buttondown']); + $mw->bind($class, '<5>', [invoke => 'buttondown']); + + return $class; +} + +sub Invoke +{ + my ($w,$elem) = @_; + unless ($w->{_outside}) + { + $w->invoke($elem); + $w->{_repeated}++; + } + my $delay = $w->cget('-repeatinterval'); + if ($delay > 0) + { + $w->RepeatId($w->after($delay,[Invoke => $w,$elem])); + } +} + +sub Button1 +{ + my ($w,$x,$y) = @_; + my $elem = $w->identify($x,$y); + $w->{_element} = $elem || 'entry'; + if ($w->{_element} eq 'entry') + { + $w->SUPER::Button1($x,$y); + } + elsif ($w->cget('-state') ne 'disabled') + { + $w->selectionElement($elem); + $w->{_repeated} = 0; + $w->{_outside} = 0; + $w->{_relief} = $w->cget("-${elem}relief"); + $w->CancelRepeat; + my $delay = $w->cget('-repeatdelay'); + $w->RepeatId($w->after($delay,[Invoke => $w,$elem])) if $delay > 0; + } +} + +sub Motion +{ + my ($w,$x,$y) = @_; + my $elem = $w->identify($x,$y); + $w->{_element} = $elem || 'entry' unless $w->{_element}; + if ($w->{_element} eq 'entry') + { + $w->SUPER::Motion($x,$y); + } + else + { + if (!defined($elem) || $elem ne $w->{_element}) + { + # Moved outside the button + unless ($w->{_outside}) + { + $w->{_outside} = 1; + $w->selectionElement('none'); + } + } + elsif ($w->{_outside}) + { + # Moved back over the button + $w->selectionElement($elem); + $w->{_outside} = 0; + } + } +} + +sub Button1Release +{ + my ($w,$x,$y) = @_; + $w->SUPER::Button1Release($x,$y); + my $elem = $w->{_element}; + if (defined($elem) && $elem ne 'entry') + { + my $repeated = $w->{_repeated}; + if (defined($repeated) && !$repeated) + { + $w->invoke($elem); + } + my $relief = delete $w->{_relief}; + $w->configure("-${elem}relief",$relief) if $relief + } + $w->selectionElement('none'); +} + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Stats.pm b/Master/tlpkg/tlperl.old/lib/Tk/Stats.pm new file mode 100644 index 00000000000..39bedfb1a47 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Stats.pm @@ -0,0 +1,26 @@ +package Tk::Stats; + +($lu,$ls) = times; + + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Tk/Stats.pm#4 $ + +sub stats + { + my ($u,$s) = times; + my $du = $u-$lu; + my $ds = $s-$ls; + $ls = $s; + $lu = $u; + print sprintf(' dt=%4.2f du=%4.2f ds=%4.2f',$du+$ds,$du,$ds); + print sprintf(' t=%4.2f u=%4.2f s=%4.2f',$u+$s,$u,$s); + print ' ',shift,"\n"; + } + +sub import +{ + stats($_[1]); +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Submethods.pm b/Master/tlpkg/tlperl.old/lib/Tk/Submethods.pm new file mode 100644 index 00000000000..a2b8e3bd186 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Submethods.pm @@ -0,0 +1,46 @@ +package Tk::Submethods; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Tk/Submethods.pm#4 $ + +sub import +{ + my $class = shift; + no strict 'refs'; + my $package = caller(0); + while (@_) + { + my $fn = shift; + my $sm = shift; + foreach my $sub (@{$sm}) + { + my ($suffix) = $sub =~ /(\w+)$/; + my $pfn = $package.'::'.$fn; + *{$pfn."\u$suffix"} = sub { shift->$pfn($sub,@_) }; + } + } +} + +sub Direct +{ + my $class = shift; + no strict 'refs'; + my $package = caller(0); + while (@_) + { + my $fn = shift; + my $sm = shift; + my $sub; + foreach $sub (@{$sm}) + { + # eval "sub ${package}::${sub} { shift->$fn('$sub',\@_) }"; + *{$package.'::'.$sub} = sub { shift->$fn($sub,@_) }; + } + } +} + +1; + +__END__ + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Tk/TList.pm b/Master/tlpkg/tlperl.old/lib/Tk/TList.pm new file mode 100644 index 00000000000..65ce18796bb --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/TList.pm @@ -0,0 +1,416 @@ +package Tk::TList; + +use vars qw($VERSION); +$VERSION = '4.006'; # $Id: //depot/Tkutf8/TList/TList.pm#6 $ + +use Tk qw(Ev $XS_VERSION); + +use base qw(Tk::Widget); + +use strict; + +Construct Tk::Widget 'TList'; + +bootstrap Tk::TList; + +sub Tk_cmd { \&Tk::tlist } + +Tk::Methods qw(insert index anchor delete dragsite dropsite entrycget + entryconfigure info nearest see selection xview yview); + +use Tk::Submethods ( 'delete' => [qw(all entry offsprings siblings)], + 'info' => [qw(anchor dragsite dropsite selection)], + 'selection' => [qw(clear get includes set)], + 'anchor' => [qw(clear set)], + 'dragsite' => [qw(clear set)], + 'dropsite' => [qw(clear set)], + ); + +sub ClassInit +{ + my ($class,$mw) = @_; + + $mw->bind($class,'<ButtonPress-1>',[ 'Button1' ] ); + $mw->bind($class,'<Shift-ButtonPress-1>',[ 'ShiftButton1' ] ); + $mw->bind($class,'<Control-ButtonRelease-1>','Control_ButtonRelease_1'); + $mw->bind($class,'<ButtonRelease-1>','ButtonRelease_1'); + $mw->bind($class,'<B1-Motion>',[ 'Button1Motion' ] ); + $mw->bind($class,'<B1-Leave>',[ 'AutoScan' ] ); + + $mw->bind($class,'<Double-ButtonPress-1>',['Double1']); + + $mw->bind($class,'<Control-B1-Motion>','Control_B1_Motion'); + $mw->bind($class,'<Control-ButtonPress-1>',['CtrlButton1']); + $mw->bind($class,'<Control-Double-ButtonPress-1>',['CtrlButton1']); + + $mw->bind($class,'<B1-Enter>','B1_Enter'); + + $mw->bind($class,'<Up>', ['DirKey', 'up']); + $mw->bind($class,'<Down>',['DirKey', 'down']); + + $mw->bind($class,'<Left>', ['DirKey', 'left']); + $mw->bind($class,'<Right>',['DirKey', 'right']); + + $mw->bind($class,'<Prior>','Prior'); + $mw->bind($class,'<Next>','Next'); + + $mw->bind($class,'<Return>', ['KeyboardActivate']); + $mw->bind($class,'<space>', ['KeyboardBrowse']); + + return $class; +} + +sub Control_ButtonRelease_1 +{ +} + + +sub ButtonRelease_1 +{ + my $w = shift; + my $Ev = $w->XEvent; + $w->CancelRepeat + if($w->cget('-selectmode') ne 'dragdrop'); + $w->ButtonRelease1($Ev); +} + + +sub Control_B1_Motion +{ +} + + +sub B1_Enter +{ + my $w = shift; + my $Ev = $w->XEvent; + $w->CancelRepeat + if($w->cget('-selectmode') ne 'dragdrop'); +} + + +sub Prior +{ +shift->yview('scroll', -1, 'pages') +} + + +sub Next +{ +shift->yview('scroll', 1, 'pages') +} + + +sub Button1 +{ + my $w = shift; + my $Ev = $w->XEvent; + + delete $w->{'shiftanchor'}; + + $w->focus() + if($w->cget('-takefocus')); + + my $mode = $w->cget('-selectmode'); + + if ($mode eq 'dragdrop') + { + # $w->Send_WaitDrag($Ev->y); + return; + } + + my $ent = $w->GetNearest($Ev->x, $Ev->y); + + return unless defined $ent; + + my $browse = 0; + + if($mode eq 'single') + { + $w->anchor('set', $ent); + } + elsif($mode eq 'browse') + { + $w->anchor('set', $ent); + $w->selection('clear' ); + $w->selection('set', $ent); + $browse = 1; + } + elsif($mode eq 'multiple') + { + $w->selection('clear'); + $w->anchor('set', $ent); + $w->selection('set', $ent); + $browse = 1; + } + elsif($mode eq 'extended') + { + $w->anchor('set', $ent); + $w->selection('clear'); + $w->selection('set', $ent); + $browse = 1; + } + + $w->Callback(-browsecmd => $ent) if ($browse); +} + +sub ShiftButton1 +{ + my $w = shift; + my $Ev = $w->XEvent; + + my $to = $w->GetNearest($Ev->x,$Ev->y); + + delete $w->{'shiftanchor'}; + + return unless defined $to; + + my $mode = $w->cget('-selectmode'); + + if ($mode eq 'extended') + { + my $from = $w->info('anchor'); + if (defined $from) + { + $w->selection('clear'); + $w->selection('set', $from, $to); + } + else + { + $w->anchor('set', $to); + $w->selection('clear'); + $w->selection('set', $to); + } + } +} + +sub GetNearest +{ + my ($w,$x,$y) = @_; + my $ent = $w->nearest($x,$y); + if (defined $ent) + { + my $state = $w->entrycget($ent, '-state'); + return $ent if (!defined($state) || $state ne 'disabled'); + } + return undef; +} + +sub ButtonRelease1 +{ + my ($w, $Ev) = @_; + + delete $w->{'shiftanchor'}; + + my $mode = $w->cget('-selectmode'); + + if($mode eq 'dragdrop') + { +# $w->Send_DoneDrag(); + return; + } + + my ($x, $y) = ($Ev->x, $Ev->y); + my $ent = $w->GetNearest($x,$y); + + return unless defined $ent; + + if($x < 0 || $y < 0 || $x > $w->width || $y > $w->height) + { + $w->selection('clear'); + + return if($mode eq 'single' || $mode eq 'browse') + + } + else + { + if($mode eq 'single' || $mode eq 'browse') + { + $w->anchor('set', $ent); + $w->selection('clear'); + $w->selection('set', $ent); + + } + elsif($mode eq 'multiple') + { + $w->selection('set', $ent); + } + elsif($mode eq 'extended') + { + $w->selection('set', $ent); + } + } + + $w->Callback(-browsecmd =>$ent); +} + +sub Button1Motion +{ + my $w = shift; + my $Ev = $w->XEvent; + + delete $w->{'shiftanchor'}; + + my $mode = $w->cget('-selectmode'); + + if ($mode eq 'dragdrop') + { +# $w->Send_StartDrag(); + return; + } + + my $ent = $w->GetNearest($Ev->x,$Ev->y); + + return unless defined $ent; + + if($mode eq 'single') + { + $w->anchor('set', $ent); + } + elsif($mode eq 'multiple' || $mode eq 'extended') + { + my $from = $w->info('anchor'); + if (defined $from) + { + $w->selection('clear'); + $w->selection('set', $from, $ent); + } + else + { + $w->anchor('set', $ent); + $w->selection('clear'); + $w->selection('set', $ent); + } + } + + if($mode ne 'single') + { + $w->Callback(-browsecmd =>$ent); + } +} + +sub Double1 +{ + my $w = shift; + my $Ev = $w->XEvent; + + delete $w->{'shiftanchor'}; + + my $ent = $w->GetNearest($Ev->x,$Ev->y); + + return unless defined $ent; + + $w->anchor('set', $ent) unless defined($w->info('anchor')); + + $w->selection('set', $ent); + $w->Callback(-command => $ent); +} + +sub CtrlButton1 +{ + my $w = shift; + my $Ev = $w->XEvent; + + delete $w->{'shiftanchor'}; + + my $ent = $w->GetNearest($Ev->x,$Ev->y); + + return unless defined $ent; + + my $mode = $w->cget('-selectmode'); + + if($mode eq 'extended') + { + $w->anchor('set', $ent) unless defined( $w->info('anchor') ); + + if($w->selection('includes', $ent)) + { + $w->selection('clear', $ent); + } + else + { + $w->selection('set', $ent); + } + $w->Callback(-browsecmd =>$ent); + } +} + +sub DirKey +{ + my ($w,$dir) = @_; + my $anchor = $w->info('anchor'); + + my $new = (defined $anchor) ? $w->info($dir,$anchor) : 0; + + $w->anchorSet($new); + $w->see($new); +} + +sub KeyboardActivate +{ + my $w = shift; + + my $anchor = $w->info('anchor'); + + return unless defined $anchor; + + if($w->cget('-selectmode')) + { + $w->selection('clear'); + $w->selection('set', $anchor); + } + $w->Callback(-command => $anchor); +} + +sub KeyboardBrowse +{ + my $w = shift; + + my $anchor = $w->info('anchor'); + + return unless defined $anchor; + + if($w->cget('-selectmode')) + { + $w->selection('clear'); + $w->selection('set', $anchor); + } + $w->Callback(-browsecmd =>$anchor); +} + +sub AutoScan +{ + my $w = shift; + + return if($w->cget('-selectmode') eq 'dragdrop'); + + my $Ev = $w->XEvent; + my $y = $Ev->y; + my $x = $Ev->x; + + if($y >= $w->height) + { + $w->yview('scroll', 1, 'units'); + } + elsif($y < 0) + { + $w->yview('scroll', -1, 'units'); + } + elsif($x >= $w->width) + { + $w->xview('scroll', 2, 'units'); + } + elsif($x < 0) + { + $w->xview('scroll', -2, 'units'); + } + else + { + return; + } + $w->RepeatId($w->after(50,[AutoScan => $w])); + $w->Button1Motion; +} + +1; + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Table.pm b/Master/tlpkg/tlperl.old/lib/Tk/Table.pm new file mode 100644 index 00000000000..8fa9e5af4a9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Table.pm @@ -0,0 +1,598 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::Table; +use strict; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #12 $ =~ /\D(\d+)\s*$/; + +use Tk::Pretty; +use AutoLoader; +use base qw(Tk::Frame); + +Construct Tk::Widget 'Table'; + +# Constants for QueueLayout flags +sub _SlaveSize () { 1 } # Slave has asked for change of width or height +sub _SlaveChange () { 2 } # We lost or gained a slave +sub _ViewChange () { 4 } # xview or yview called +sub _ConfigEvent () { 8 } # Table has changed size +sub _ScrollBars () { 32 } # Scrollabrs came or went +sub _RowColCount () { 16 } # rows or columns configured + + +sub ClassInit +{ + my ($class,$mw) = @_; + $mw->bind($class,'<Configure>',['QueueLayout',_ConfigEvent]); + $mw->bind($class,'<FocusIn>', 'NoOp'); + $mw->XYscrollBind($class); + return $class; +} + +sub _view +{ + my ($t,$s,$page,$a,$op,$num,$type) = @_; + if ($op eq 'moveto') + { + $$s = int(@$a*$num); + } + else + { + $num *= ($page/2) if ($type eq 'pages'); + $$s += $num; + } + $$s = 0 if ($$s < 0); + $t->QueueLayout(_ViewChange); +} + +sub xview +{ + my $t = shift; + $t->_view(\$t->{Left},$t->cget('-columns'),$t->{Width},@_); +} + +sub yview +{ + my $t = shift; + $t->_view(\$t->{Top},$t->cget('-rows'),$t->{Height},@_); +} + +sub FocusChildren +{ + my $t = shift; + return () if ($t->cget('-takefocus')); + return $t->SUPER::FocusChildren; +} + +sub Populate +{ + my ($t,$args) = @_; + $t->SUPER::Populate($args); + $t->ConfigSpecs('-scrollbars' => [METHOD => 'scrollbars','Scrollbars','nw'], + '-takefocus' => [SELF => 'takeFocus','TakeFocus',1], + '-rows' => [METHOD => 'rows','Rows',10], + '-fixedrows' => [METHOD => 'fixedRows','FixedRows',0], + '-columns' => [METHOD => 'columns','Columns',10], + '-fixedcolumns' => [METHOD => 'fixedColumn','FixedColumns',0], + '-highlightthickness' => [SELF => 'highlightThickness','HighlightThickness',2] + ); + $t->_init; +} + +sub sizeN +{ + my ($n,$a) = @_; + my $max = 0; + my $i = 0; + my $sum = 0; + while ($i < @$a && $i < $n) + { + my $n = $a->[$i++]; + $a->[$i-1] = $n = 0 unless (defined $n); + $sum += $n; + } + $max = $sum if ($sum > $max); + while ($i < @$a) + { + $sum = $sum-$a->[$i-$n]+$a->[$i]; + $max = $sum if ($sum > $max); + $i++; + } + return $max; +} + +sub total +{ + my ($a) = @_; + my $total = 0; + my $x; + foreach $x (@{$a}) + { + $total += $x; + } + return $total; +} + +sub constrain +{ + my ($sb,$a,$pixels,$fixed) = @_; + my $n = $$sb+$fixed; + my $total = 0; + my $i; + $n = @$a if ($n > @$a); + $n = $fixed if ($n < $fixed); + for ($i= 0; $i < $fixed; $i++) + { + (defined($a->[$i])) && ($total += $a->[$i]); + } + for ($i=$n; $total < $pixels && $i < @$a; $i++) + { + $a->[$i] ||= 0; + $total += $a->[$i]; + } + while ($n > $fixed) + { + if (($total += $a->[--$n]) > $pixels) + { + $n++; + last; + } + } + $$sb = $n-$fixed; +} + +sub Layout +{ + my ($t) = @_; + return unless Tk::Exists($t); + my $rows = @{$t->{Row}}; + my $bw = $t->cget(-highlightthickness); + my $frows = $t->cget(-fixedrows); + my $fcols = $t->cget(-fixedcolumns); + my $sb = $t->cget(-scrollbars); + my $H = $t->Height; + my $W = $t->Width; + my $tadj = $bw; + my $badj = $bw; + my $ladj = $bw; + my $radj = $bw; + my @xs = ($W,0,0,0); + my @ys = (0,$H,0,0); + my $xsb; + my $ysb; + + my $why = $t->{LayoutPending}; + $t->{LayoutPending} = 0; + + if ($sb =~ /[ns]/) + { + $t->{xsb} = $t->Scrollbar(-orient => 'horizontal', -command => ['xview' => $t]) unless (defined $t->{xsb}); + $xsb = $t->{xsb}; + $xs[3] = $xsb->ReqHeight; + if ($sb =~ /n/) + { + $xs[1] = $tadj; + $tadj += $xs[3]; + } + else + { + $badj += $xs[3]; + $xs[1] = $H-$badj; + } + } + else + { + $t->{xsb}->UnmapWindow if (defined $t->{xsb}); + } + + if ($sb =~ /[ew]/) + { + $t->{ysb} = $t->Scrollbar(-orient => 'vertical', -command => ['yview' => $t]) unless (defined $t->{ysb}); + $ysb = $t->{ysb}; + $ys[2] = $ysb->ReqWidth; + if ($sb =~ /w/) + { + $ys[0] = $ladj; + $ladj += $ys[2]; + } + else + { + $radj += $ys[2]; + $ys[0] = $W-$radj; + } + } + else + { + $t->{ysb}->UnmapWindow if (defined $t->{ysb}); + } + + constrain(\$t->{Top}, $t->{Height},$H-($tadj+$badj),$frows); + constrain(\$t->{Left},$t->{Width}, $W-($ladj+$radj),$fcols); + + my $top = $t->{Top}+$frows; + my $left = $t->{Left}+$fcols; + + if ($why & (_ScrollBars|_RowColCount|_SlaveSize)) + { + # Width and/or Height of element or + # number of rows and/or columns or + # scrollbar presence has changed + my $w = sizeN($t->cget('-columns'),$t->{Width})+$radj+$ladj; + my $h = sizeN($t->cget('-rows'),$t->{Height})+$tadj+$badj; + $t->GeometryRequest($w,$h); + } + + if ($rows) + { + my $cols = @{$t->{Width}}; + my $yhwm = $top-$frows; + my $xhwm = $left-$fcols; + my $y = $tadj; + my $r; + for ($r = 0; $r < $rows; $r++) + { + my $h = $t->{Height}[$r]; + next unless defined $h; + if (($r < $top && $r >= $frows) || ($y+$h > $H-$badj)) + { + if (defined $t->{Row}[$r]) + { + my $c; + for ($c = 0; $c < @{$t->{Row}[$r]}; $c++) + { + my $s = $t->{Row}[$r][$c]; + if (defined $s) + { + $s->UnmapWindow; + if ($why & 1) + { + my $w = $t->{Width}[$c]; + $s->ResizeWindow($w,$h); + } + } + } + } + } + else + { + my $hwm = $left-$fcols; + my $sh = 0; + my $x = $ladj; + my $c; + $ys[1] = $y if ($y < $ys[1] && $r >= $frows); + for ($c = 0; $c <$cols; $c++) + { + my $s = $t->{Row}[$r][$c]; + my $w = $t->{Width}[$c]; + if (($c < $left && $c >= $fcols) || ($x+$w > $W-$radj) ) + { + if (defined $s) + { + $s->UnmapWindow; + $s->ResizeWindow($w,$h) if ($why & 1); + } + } + else + { + $xs[0] = $x if ($x < $xs[0] && $c >= $fcols); + if (defined $s) + { + if ($why & 1) + { + $s->MoveResizeWindow($x,$y,$w,$h); + } + else + { + $s->MoveWindow($x,$y); + } + $s->MapWindow; + } + $x += $w; + if ($c >= $fcols) + { + $hwm++; + $sh += $w + } + } + } + $xhwm = $hwm if ($hwm > $xhwm); + $xs[2] = $sh if ($sh > $xs[2]); + $y += $h; + if ($r >= $frows) + { + $ys[3] += $h; + $yhwm++; + } + } + } + $t->{Bottom} = $yhwm; + $t->{Right} = $xhwm; + if (defined $xsb && $xs[2] > 0) + { + $xsb->MoveResizeWindow(@xs); + $cols -= $fcols; + if ($cols > 0) + { + $xsb->set($t->{Left}/$cols,$t->{Right}/$cols); + $xsb->MapWindow; + } + } + if (defined $ysb && $ys[3] > 0) + { + $ysb->MoveResizeWindow(@ys); + $rows -= $frows; + if ($rows > 0) + { + $ysb->set($t->{Top}/$rows,$t->{Bottom}/$rows); + $ysb->MapWindow; + } + } + } +} + +sub QueueLayout +{ + my ($m,$why) = @_; + $m->afterIdle(['Layout',$m]) unless ($m->{LayoutPending}); + $m->{LayoutPending} |= $why; +} + +sub SlaveGeometryRequest +{ + my ($m,$s) = @_; + my ($row,$col) = @{$m->{Slave}{$s->PathName}}; + my $sw = $s->ReqWidth; + my $sh = $s->ReqHeight; + my $sz = 0; + if ($sw > $m->{Width}[$col]) + { + $m->{Width}[$col] = $sw; + $m->QueueLayout(_SlaveSize); + $sz++; + } + if ( (not defined ($m->{Height}[$row])) or $sh > $m->{Height}[$row]) + { + $m->{Height}[$row] = $sh; + $m->QueueLayout(_SlaveSize); + $sz++; + } + if (!$sz) + { + $s->ResizeWindow($m->{Width}[$col],$m->{Height}[$row]); + } +} + +sub get +{ + my ($t,$row,$col) = @_; + return $t->{Row}[$row][$col]; +} + +sub LostSlave +{ + my ($t,$s) = @_; + my $info = delete $t->{Slave}{$s->PathName}; + if (defined $info) + { + my ($row,$col) = @$info; + $t->{Row}[$row][$col] = undef; + $s->UnmapWindow; + } + else + { + $t->BackTrace('Cannot find' . $s->PathName); + } + $t->QueueLayout(_SlaveChange); +} + +sub clear { + my $self = shift; + my $rows = $self->cget(-rows); + my $cols = $self->cget(-columns); + foreach my $r (1 .. $rows) { + foreach my $c (1 .. $cols) { + my $old = $self->get( $r, $c ); + next unless $old; + $self->LostSlave($old); + $old->destroy; + } + } + $self->_init; + $self->QueueLayout(_SlaveSize); +} + +sub _init { + my $self = shift; + $self->{'Width'} = []; + $self->{'Height'} = []; + $self->{'Row'} = []; + $self->{'Slave'} = {}; + $self->{'Top'} = 0; + $self->{'Left'} = 0; + $self->{'Bottom'} = 0; + $self->{'Right'} = 0; + $self->{LayoutPending} = 0; +} + +sub put +{ + my ($t,$row,$col,$w) = @_; + $w = $t->Label(-text => $w) unless (ref $w); + $t->ManageGeometry($w); + unless (defined $t->{Row}[$row]) + { + $t->{Row}[$row] = []; + $t->{Height}[$row] = 0; + } + unless (defined $t->{Width}[$col]) + { + $t->{Width}[$col] = 0; + } + my $old = $t->{Row}[$row][$col]; + if (defined $old) + { + $old->UnmanageGeometry; + $t->LostSlave($old); + } + $t->{Row}[$row][$col] = $w; + $t->{Slave}{$w->PathName} = [$row,$col]; + $t->SlaveGeometryRequest($w); + $t->QueueLayout(_SlaveChange); + return $old; +} + +# +# configure methods +# + +sub scrollbars +{ + my ($t,$v) = @_; + if (@_ > 1) + { + $t->_configure(-scrollbars => $v); + $t->QueueLayout(_ScrollBars); + } + return $t->_cget('-scrollbars'); +} + +sub rows +{ + my ($t,$r) = @_; + if (@_ > 1) + { + $t->_configure(-rows => $r); + if ($t->{Row} && @{$t->{Row}} > $r) + { + for my $y ($r .. $#{$t->{Row}}) + { + for my $s (@{$t->{Row}[$y]}) + { + $s->destroy if $s; + } + } + splice @{ $t->{Row} }, $r; + } + $t->QueueLayout(_RowColCount); + } + return $t->_cget('-rows'); +} + +sub fixedrows +{ + my ($t,$r) = @_; + if (@_ > 1) + { + $t->_configure(-fixedrows => $r); + $t->QueueLayout(_RowColCount); + } + return $t->_cget('-fixedrows'); +} + +sub columns +{ + my ($t,$r) = @_; + if (@_ > 1) + { + $t->_configure(-columns => $r); + if ($t->{Row}) + { + for my $row (@{$t->{Row}}) + { + for my $s (@$row[$r .. $#$row]) + { + $s->destroy if $s; + } + { # FIXME? - Steve was getting warnings : + # splice() offset past end of array + local $^W = 0; + splice @$row, $r; + } + } + } + $t->QueueLayout(_RowColCount); + } + return $t->_cget('-columns'); +} + +sub fixedcolumns +{ + my ($t,$r) = @_; + if (@_ > 1) + { + $t->_configure(-fixedcolumns => $r); + $t->QueueLayout(_RowColCount); + } + return $t->_cget('-fixedcolumns'); +} + +1; +__END__ +sub Create +{ + my $t = shift; + my $r = shift; + my $c = shift; + my $kind = shift; + $t->put($r,$c,$t->$kind(@_)); +} + +sub totalColumns +{ + scalar @{shift->{'Width'}}; +} + +sub totalRows +{ + scalar @{shift->{'Height'}}; +} + +sub Posn +{ + my ($t,$s) = @_; + my $info = $t->{Slave}{$s->PathName}; + return (wantarray) ? @$info : $info; +} + +sub see +{ + my $t = shift; + my ($row,$col) = (@_ == 2) ? @_ : @{$t->{Slave}{$_[0]->PathName}}; + my $see = 1; + if (($row -= $t->cget('-fixedrows')) >= 0) + { + if ($row < $t->{Top}) + { + $t->{Top} = $row; + $t->QueueLayout(_ViewChange); + $see = 0; + } + elsif ($row >= $t->{Bottom}) + { + $t->{Top} += ($row - $t->{Bottom}+1); + $t->QueueLayout(_ViewChange); + $see = 0; + } + } + if (($col -= $t->cget('-fixedcolumns')) >= 0) + { + if ($col < $t->{Left}) + { + $t->{Left} = $col; + $t->QueueLayout(_ViewChange); + $see = 0; + } + elsif ($col >= $t->{Right}) + { + $t->{Left} += ($col - $t->{Right}+1); + $t->QueueLayout(_ViewChange); + $see = 0; + } + } + return $see; +} + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Text.pm b/Master/tlpkg/tlperl.old/lib/Tk/Text.pm new file mode 100644 index 00000000000..fe0aa0bf4c1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Text.pm @@ -0,0 +1,1653 @@ +# text.tcl -- +# +# This file defines the default bindings for Tk text widgets. +# +# @(#) text.tcl 1.18 94/12/17 16:05:26 +# +# Copyright (c) 1992-1994 The Regents of the University of California. +# Copyright (c) 1994 Sun Microsystems, Inc. +# perl/Tk version: +# Copyright (c) 1995-2004 Nick Ing-Simmons +# Copyright (c) 1999 Greg London +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +package Tk::Text; +use AutoLoader; +use Carp; +use strict; + +use Text::Tabs; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #24 $ =~ /\D(\d+)\s*$/; + +use Tk qw(Ev $XS_VERSION); +use base qw(Tk::Clipboard Tk::Widget); + +Construct Tk::Widget 'Text'; + +bootstrap Tk::Text; + +sub Tk_cmd { \&Tk::text } + +sub Tk::Widget::ScrlText { shift->Scrolled('Text' => @_) } + +Tk::Methods('bbox','compare','debug','delete','dlineinfo','dump','edit', + 'get','image','index','insert','mark','scan','search', + 'see','tag','window','xview','yview'); + +use Tk::Submethods ( 'mark' => [qw(gravity names next previous set unset)], + 'scan' => [qw(mark dragto)], + 'tag' => [qw(add bind cget configure delete lower + names nextrange prevrange raise ranges remove)], + 'window' => [qw(cget configure create names)], + 'image' => [qw(cget configure create names)], + 'xview' => [qw(moveto scroll)], + 'yview' => [qw(moveto scroll)], + 'edit' => [qw(modified redo reset separator undo)], + ); + +sub Tag; +sub Tags; + +sub bindRdOnly +{ + + my ($class,$mw) = @_; + + # Standard Motif bindings: + $mw->bind($class,'<Meta-B1-Motion>','NoOp'); + $mw->bind($class,'<Meta-1>','NoOp'); + $mw->bind($class,'<Alt-KeyPress>','NoOp'); + $mw->bind($class,'<Escape>','unselectAll'); + + $mw->bind($class,'<1>',['Button1',Ev('x'),Ev('y')]); + $mw->bind($class,'<B1-Motion>','B1_Motion' ) ; + $mw->bind($class,'<B1-Leave>','B1_Leave' ) ; + $mw->bind($class,'<B1-Enter>','CancelRepeat'); + $mw->bind($class,'<ButtonRelease-1>','CancelRepeat'); + $mw->bind($class,'<Control-1>',['markSet','insert',Ev('@')]); + + $mw->bind($class,'<Double-1>','selectWord' ) ; + $mw->bind($class,'<Triple-1>','selectLine' ) ; + $mw->bind($class,'<Shift-1>','adjustSelect' ) ; + $mw->bind($class,'<Double-Shift-1>',['SelectTo',Ev('@'),'word']); + $mw->bind($class,'<Triple-Shift-1>',['SelectTo',Ev('@'),'line']); + + $mw->bind($class,'<Left>',['SetCursor',Ev('index','insert-1c')]); + $mw->bind($class,'<Shift-Left>',['KeySelect',Ev('index','insert-1c')]); + $mw->bind($class,'<Control-Left>',['SetCursor',Ev('index','insert-1c wordstart')]); + $mw->bind($class,'<Shift-Control-Left>',['KeySelect',Ev('index','insert-1c wordstart')]); + + $mw->bind($class,'<Right>',['SetCursor',Ev('index','insert+1c')]); + $mw->bind($class,'<Shift-Right>',['KeySelect',Ev('index','insert+1c')]); + $mw->bind($class,'<Control-Right>',['SetCursor',Ev('index','insert+1c wordend')]); + $mw->bind($class,'<Shift-Control-Right>',['KeySelect',Ev('index','insert wordend')]); + + $mw->bind($class,'<Up>',['SetCursor',Ev('UpDownLine',-1)]); + $mw->bind($class,'<Shift-Up>',['KeySelect',Ev('UpDownLine',-1)]); + $mw->bind($class,'<Control-Up>',['SetCursor',Ev('PrevPara','insert')]); + $mw->bind($class,'<Shift-Control-Up>',['KeySelect',Ev('PrevPara','insert')]); + + $mw->bind($class,'<Down>',['SetCursor',Ev('UpDownLine',1)]); + $mw->bind($class,'<Shift-Down>',['KeySelect',Ev('UpDownLine',1)]); + $mw->bind($class,'<Control-Down>',['SetCursor',Ev('NextPara','insert')]); + $mw->bind($class,'<Shift-Control-Down>',['KeySelect',Ev('NextPara','insert')]); + + $mw->bind($class,'<Home>',['SetCursor','insert linestart']); + $mw->bind($class,'<Shift-Home>',['KeySelect','insert linestart']); + $mw->bind($class,'<Control-Home>',['SetCursor','1.0']); + $mw->bind($class,'<Control-Shift-Home>',['KeySelect','1.0']); + + $mw->bind($class,'<End>',['SetCursor','insert lineend']); + $mw->bind($class,'<Shift-End>',['KeySelect','insert lineend']); + $mw->bind($class,'<Control-End>',['SetCursor','end-1char']); + $mw->bind($class,'<Control-Shift-End>',['KeySelect','end-1char']); + + $mw->bind($class,'<Prior>',['SetCursor',Ev('ScrollPages',-1)]); + $mw->bind($class,'<Shift-Prior>',['KeySelect',Ev('ScrollPages',-1)]); + $mw->bind($class,'<Control-Prior>',['xview','scroll',-1,'page']); + + $mw->bind($class,'<Next>',['SetCursor',Ev('ScrollPages',1)]); + $mw->bind($class,'<Shift-Next>',['KeySelect',Ev('ScrollPages',1)]); + $mw->bind($class,'<Control-Next>',['xview','scroll',1,'page']); + + $mw->bind($class,'<Shift-Tab>', 'NoOp'); # Needed only to keep <Tab> binding from triggering; does not have to actually do anything. + $mw->bind($class,'<Control-Tab>','focusNext'); + $mw->bind($class,'<Control-Shift-Tab>','focusPrev'); + + $mw->bind($class,'<Control-space>',['markSet','anchor','insert']); + $mw->bind($class,'<Select>',['markSet','anchor','insert']); + $mw->bind($class,'<Control-Shift-space>',['SelectTo','insert','char']); + $mw->bind($class,'<Shift-Select>',['SelectTo','insert','char']); + $mw->bind($class,'<Control-slash>','selectAll'); + $mw->bind($class,'<Control-backslash>','unselectAll'); + + if (!$Tk::strictMotif) + { + $mw->bind($class,'<Control-a>', ['SetCursor','insert linestart']); + $mw->bind($class,'<Control-b>', ['SetCursor','insert-1c']); + $mw->bind($class,'<Control-e>', ['SetCursor','insert lineend']); + $mw->bind($class,'<Control-f>', ['SetCursor','insert+1c']); + $mw->bind($class,'<Meta-b>', ['SetCursor','insert-1c wordstart']); + $mw->bind($class,'<Meta-f>', ['SetCursor','insert wordend']); + $mw->bind($class,'<Meta-less>', ['SetCursor','1.0']); + $mw->bind($class,'<Meta-greater>', ['SetCursor','end-1c']); + + $mw->bind($class,'<Control-n>', ['SetCursor',Ev('UpDownLine',1)]); + $mw->bind($class,'<Control-p>', ['SetCursor',Ev('UpDownLine',-1)]); + + $mw->bind($class,'<2>',['Button2',Ev('x'),Ev('y')]); + $mw->bind($class,'<B2-Motion>',['Motion2',Ev('x'),Ev('y')]); + } + $mw->bind($class,'<Destroy>','Destroy'); + $mw->bind($class, '<3>', ['PostPopupMenu', Ev('X'), Ev('Y')] ); + $mw->YMouseWheelBind($class); + $mw->XMouseWheelBind($class); + + $mw->MouseWheelBind($class); + + return $class; +} + +sub selectAll +{ + my ($w) = @_; + $w->tagAdd('sel','1.0','end'); +} + +sub unselectAll +{ + my ($w) = @_; + $w->tagRemove('sel','1.0','end'); +} + +sub adjustSelect +{ + my ($w) = @_; + my $Ev = $w->XEvent; + $w->ResetAnchor($Ev->xy); + $w->SelectTo($Ev->xy,'char') +} + +sub selectLine +{ + my ($w) = @_; + my $Ev = $w->XEvent; + $w->SelectTo($Ev->xy,'line'); + Tk::catch { $w->markSet('insert','sel.first') }; +} + +sub selectWord +{ + my ($w) = @_; + my $Ev = $w->XEvent; + $w->SelectTo($Ev->xy,'word'); + Tk::catch { $w->markSet('insert','sel.first') } +} + +sub ClassInit +{ + my ($class,$mw) = @_; + $class->SUPER::ClassInit($mw); + + $class->bindRdOnly($mw); + + $mw->bind($class,'<Tab>', 'insertTab'); + $mw->bind($class,'<Control-i>', ['Insert',"\t"]); + $mw->bind($class,'<Return>', ['Insert',"\n"]); + $mw->bind($class,'<Delete>','Delete'); + $mw->bind($class,'<BackSpace>','Backspace'); + $mw->bind($class,'<Insert>', \&ToggleInsertMode ) ; + $mw->bind($class,'<KeyPress>',['InsertKeypress',Ev('A')]); + + $mw->bind($class,'<F1>', 'clipboardColumnCopy'); + $mw->bind($class,'<F2>', 'clipboardColumnCut'); + $mw->bind($class,'<F3>', 'clipboardColumnPaste'); + + # Additional emacs-like bindings: + + if (!$Tk::strictMotif) + { + $mw->bind($class,'<Control-d>',['delete','insert']); + $mw->bind($class,'<Control-k>','deleteToEndofLine') ; + $mw->bind($class,'<Control-o>','openLine'); + $mw->bind($class,'<Control-t>','Transpose'); + $mw->bind($class,'<Meta-d>',['delete','insert','insert wordend']); + $mw->bind($class,'<Meta-BackSpace>',['delete','insert-1c wordstart','insert']); + + # A few additional bindings of my own. + $mw->bind($class,'<Control-h>','deleteBefore'); + $mw->bind($class,'<ButtonRelease-2>','ButtonRelease2'); + } +#JD# $Tk::prevPos = undef; + return $class; +} + +sub insertTab +{ + my ($w) = @_; + $w->Insert("\t"); + $w->focus; + $w->break +} + +sub deleteToEndofLine +{ + my ($w) = @_; + if ($w->compare('insert','==','insert lineend')) + { + $w->delete('insert') + } + else + { + $w->delete('insert','insert lineend') + } +} + +sub openLine +{ + my ($w) = @_; + $w->insert('insert',"\n"); + $w->markSet('insert','insert-1c') +} + +sub Button2 +{ + my ($w,$x,$y) = @_; + $w->scan('mark',$x,$y); + $Tk::x = $x; + $Tk::y = $y; + $Tk::mouseMoved = 0; +} + +sub Motion2 +{ + my ($w,$x,$y) = @_; + $Tk::mouseMoved = 1 if ($x != $Tk::x || $y != $Tk::y); + $w->scan('dragto',$x,$y) if ($Tk::mouseMoved); +} + +sub ButtonRelease2 +{ + my ($w) = @_; + my $Ev = $w->XEvent; + if (!$Tk::mouseMoved) + { + Tk::catch { $w->insert($Ev->xy,$w->SelectionGet) } + } +} + +sub InsertSelection +{ + my ($w) = @_; + Tk::catch { $w->Insert($w->SelectionGet) } +} + +sub Backspace +{ + my ($w) = @_; + my $sel = Tk::catch { $w->tag('nextrange','sel','1.0','end') }; + if (defined $sel) + { + $w->delete('sel.first','sel.last'); + return; + } + $w->deleteBefore; +} + +sub deleteBefore +{ + my ($w) = @_; + if ($w->compare('insert','!=','1.0')) + { + $w->delete('insert-1c'); + $w->see('insert') + } +} + +sub Delete +{ + my ($w) = @_; + my $sel = Tk::catch { $w->tag('nextrange','sel','1.0','end') }; + if (defined $sel) + { + $w->delete('sel.first','sel.last') + } + else + { + $w->delete('insert'); + $w->see('insert') + } +} + +# Button1 -- +# This procedure is invoked to handle button-1 presses in text +# widgets. It moves the insertion cursor, sets the selection anchor, +# and claims the input focus. +# +# Arguments: +# w - The text window in which the button was pressed. +# x - The x-coordinate of the button press. +# y - The x-coordinate of the button press. +sub Button1 +{ + my ($w,$x,$y) = @_; + $Tk::selectMode = 'char'; + $Tk::mouseMoved = 0; + $w->SetCursor('@'.$x.','.$y); + $w->markSet('anchor','insert'); + $w->focus() if ($w->cget('-state') eq 'normal'); +} + +sub B1_Motion +{ + my ($w) = @_; + return unless defined $Tk::mouseMoved; + my $Ev = $w->XEvent; + $Tk::x = $Ev->x; + $Tk::y = $Ev->y; + $w->SelectTo($Ev->xy) +} + +sub B1_Leave +{ + my ($w) = @_; + my $Ev = $w->XEvent; + $Tk::x = $Ev->x; + $Tk::y = $Ev->y; + $w->AutoScan; +} + +# SelectTo -- +# This procedure is invoked to extend the selection, typically when +# dragging it with the mouse. Depending on the selection mode (character, +# word, line) it selects in different-sized units. This procedure +# ignores mouse motions initially until the mouse has moved from +# one character to another or until there have been multiple clicks. +# +# Arguments: +# w - The text window in which the button was pressed. +# index - Index of character at which the mouse button was pressed. +sub SelectTo +{ + my ($w, $index, $mode)= @_; + $Tk::selectMode = $mode if defined ($mode); + my $cur = $w->index($index); + my $anchor = Tk::catch { $w->index('anchor') }; + if (!defined $anchor) + { + $w->markSet('anchor',$anchor = $cur); + $Tk::mouseMoved = 0; + } + elsif ($w->compare($cur,'!=',$anchor)) + { + $Tk::mouseMoved = 1; + } + $Tk::selectMode = 'char' unless (defined $Tk::selectMode); + $mode = $Tk::selectMode; + my ($first,$last); + if ($mode eq 'char') + { + if ($w->compare($cur,'<','anchor')) + { + $first = $cur; + $last = 'anchor'; + } + else + { + $first = 'anchor'; + $last = $cur + } + } + elsif ($mode eq 'word') + { + if ($w->compare($cur,'<','anchor')) + { + $first = $w->index("$cur wordstart"); + $last = $w->index('anchor - 1c wordend') + } + else + { + $first = $w->index('anchor wordstart'); + $last = $w->index("$cur wordend") + } + } + elsif ($mode eq 'line') + { + if ($w->compare($cur,'<','anchor')) + { + $first = $w->index("$cur linestart"); + $last = $w->index('anchor - 1c lineend + 1c') + } + else + { + $first = $w->index('anchor linestart'); + $last = $w->index("$cur lineend + 1c") + } + } + if ($Tk::mouseMoved || $Tk::selectMode ne 'char') + { + $w->tagRemove('sel','1.0',$first); + $w->tagAdd('sel',$first,$last); + $w->tagRemove('sel',$last,'end'); + $w->idletasks; + } +} +# AutoScan -- +# This procedure is invoked when the mouse leaves a text window +# with button 1 down. It scrolls the window up, down, left, or right, +# depending on where the mouse is (this information was saved in +# tkPriv(x) and tkPriv(y)), and reschedules itself as an 'after' +# command so that the window continues to scroll until the mouse +# moves back into the window or the mouse button is released. +# +# Arguments: +# w - The text window. +sub AutoScan +{ + my ($w) = @_; + if ($Tk::y >= $w->height) + { + $w->yview('scroll',2,'units') + } + elsif ($Tk::y < 0) + { + $w->yview('scroll',-2,'units') + } + elsif ($Tk::x >= $w->width) + { + $w->xview('scroll',2,'units') + } + elsif ($Tk::x < 0) + { + $w->xview('scroll',-2,'units') + } + else + { + return; + } + $w->SelectTo('@' . $Tk::x . ','. $Tk::y); + $w->RepeatId($w->after(50,['AutoScan',$w])); +} +# SetCursor +# Move the insertion cursor to a given position in a text. Also +# clears the selection, if there is one in the text, and makes sure +# that the insertion cursor is visible. +# +# Arguments: +# w - The text window. +# pos - The desired new position for the cursor in the window. +sub SetCursor +{ + my ($w,$pos) = @_; + $pos = 'end - 1 chars' if $w->compare($pos,'==','end'); + $w->markSet('insert',$pos); + $w->unselectAll; + $w->see('insert'); +} +# KeySelect +# This procedure is invoked when stroking out selections using the +# keyboard. It moves the cursor to a new position, then extends +# the selection to that position. +# +# Arguments: +# w - The text window. +# new - A new position for the insertion cursor (the cursor has not +# actually been moved to this position yet). +sub KeySelect +{ + my ($w,$new) = @_; + my ($first,$last); + if (!defined $w->tag('ranges','sel')) + { + # No selection yet + $w->markSet('anchor','insert'); + if ($w->compare($new,'<','insert')) + { + $w->tagAdd('sel',$new,'insert') + } + else + { + $w->tagAdd('sel','insert',$new) + } + } + else + { + # Selection exists + if ($w->compare($new,'<','anchor')) + { + $first = $new; + $last = 'anchor' + } + else + { + $first = 'anchor'; + $last = $new + } + $w->tagRemove('sel','1.0',$first); + $w->tagAdd('sel',$first,$last); + $w->tagRemove('sel',$last,'end') + } + $w->markSet('insert',$new); + $w->see('insert'); + $w->idletasks; +} +# ResetAnchor -- +# Set the selection anchor to whichever end is farthest from the +# index argument. One special trick: if the selection has two or +# fewer characters, just leave the anchor where it is. In this +# case it does not matter which point gets chosen for the anchor, +# and for the things like Shift-Left and Shift-Right this produces +# better behavior when the cursor moves back and forth across the +# anchor. +# +# Arguments: +# w - The text widget. +# index - Position at which mouse button was pressed, which determines +# which end of selection should be used as anchor point. +sub ResetAnchor +{ + my ($w,$index) = @_; + if (!defined $w->tag('ranges','sel')) + { + $w->markSet('anchor',$index); + return; + } + my $a = $w->index($index); + my $b = $w->index('sel.first'); + my $c = $w->index('sel.last'); + if ($w->compare($a,'<',$b)) + { + $w->markSet('anchor','sel.last'); + return; + } + if ($w->compare($a,'>',$c)) + { + $w->markSet('anchor','sel.first'); + return; + } + my ($lineA,$chA) = split(/\./,$a); + my ($lineB,$chB) = split(/\./,$b); + my ($lineC,$chC) = split(/\./,$c); + if ($lineB < $lineC+2) + { + my $total = length($w->get($b,$c)); + if ($total <= 2) + { + return; + } + if (length($w->get($b,$a)) < $total/2) + { + $w->markSet('anchor','sel.last') + } + else + { + $w->markSet('anchor','sel.first') + } + return; + } + if ($lineA-$lineB < $lineC-$lineA) + { + $w->markSet('anchor','sel.last') + } + else + { + $w->markSet('anchor','sel.first') + } +} + +######################################################################## +sub markExists +{ + my ($w, $markname)=@_; + my $mark_exists=0; + my @markNames_list = $w->markNames; + foreach my $mark (@markNames_list) + { if ($markname eq $mark) {$mark_exists=1;last;} } + return $mark_exists; +} + +######################################################################## +sub OverstrikeMode +{ + my ($w,$mode) = @_; + + $w->{'OVERSTRIKE_MODE'} =0 unless exists($w->{'OVERSTRIKE_MODE'}); + + $w->{'OVERSTRIKE_MODE'}=$mode if (@_ > 1); + + return $w->{'OVERSTRIKE_MODE'}; +} + +######################################################################## +# pressed the <Insert> key, just above 'Del' key. +# this toggles between insert mode and overstrike mode. +sub ToggleInsertMode +{ + my ($w)=@_; + $w->OverstrikeMode(!$w->OverstrikeMode); +} + +######################################################################## +sub InsertKeypress +{ + my ($w,$char)=@_; + return unless length($char); + if ($w->OverstrikeMode) + { + my $current=$w->get('insert'); + $w->delete('insert') unless($current eq "\n"); + } + $w->Insert($char); +} + +######################################################################## +sub GotoLineNumber +{ + my ($w,$line_number) = @_; + $line_number=~ s/^\s+|\s+$//g; + return if $line_number =~ m/\D/; + my ($last_line,$junk) = split(/\./, $w->index('end')); + if ($line_number > $last_line) {$line_number = $last_line; } + $w->{'LAST_GOTO_LINE'} = $line_number; + $w->markSet('insert', $line_number.'.0'); + $w->see('insert'); +} + +######################################################################## +sub GotoLineNumberPopUp +{ + my ($w)=@_; + my $popup = $w->{'GOTO_LINE_NUMBER_POPUP'}; + + unless (defined($w->{'LAST_GOTO_LINE'})) + { + my ($line,$col) = split(/\./, $w->index('insert')); + $w->{'LAST_GOTO_LINE'} = $line; + } + + ## if anything is selected when bring up the pop-up, put it in entry window. + my $selected; + eval { $selected = $w->SelectionGet(-selection => "PRIMARY"); }; + unless ($@) + { + if (defined($selected) and length($selected)) + { + unless ($selected =~ /\D/) + { + $w->{'LAST_GOTO_LINE'} = $selected; + } + } + } + unless (defined($popup)) + { + require Tk::DialogBox; + $popup = $w->DialogBox(-buttons => [qw[Ok Cancel]],-title => "Goto Line Number", -popover => $w, + -command => sub { $w->GotoLineNumber($w->{'LAST_GOTO_LINE'}) if $_[0] eq 'Ok'}); + $w->{'GOTO_LINE_NUMBER_POPUP'}=$popup; + $popup->resizable('no','no'); + my $frame = $popup->Frame->pack(-fill => 'x'); + $frame->Label(-text=>'Enter line number: ')->pack(-side => 'left'); + my $entry = $frame->Entry(-background=>'white', -width=>25, + -textvariable => \$w->{'LAST_GOTO_LINE'})->pack(-side =>'left',-fill => 'x'); + $popup->Advertise(entry => $entry); + } + $popup->Popup; + $popup->Subwidget('entry')->focus; + $popup->Wait; +} + +######################################################################## + +sub getSelected +{ + shift->GetTextTaggedWith('sel'); +} + +sub deleteSelected +{ + shift->DeleteTextTaggedWith('sel'); +} + +sub GetTextTaggedWith +{ + my ($w,$tag) = @_; + + my @ranges = $w->tagRanges($tag); + my $range_total = @ranges; + my $return_text=''; + + # if nothing selected, then ignore + if ($range_total == 0) {return $return_text;} + + # for every range-pair, get selected text + while(@ranges) + { + my $first = shift(@ranges); + my $last = shift(@ranges); + my $text = $w->get($first , $last); + if(defined($text)) + {$return_text = $return_text . $text;} + # if there is more tagged text, separate with an end of line character + if(@ranges) + {$return_text = $return_text . "\n";} + } + return $return_text; +} + +######################################################################## +sub DeleteTextTaggedWith +{ + my ($w,$tag) = @_; + my @ranges = $w->tagRanges($tag); + my $range_total = @ranges; + + # if nothing tagged with that tag, then ignore + if ($range_total == 0) {return;} + + # insert marks where selections are located + # marks will move with text even as text is inserted and deleted + # in a previous selection. + for (my $i=0; $i<$range_total; $i++) + { $w->markSet('mark_tag_'.$i => $ranges[$i]); } + + # for every selected mark pair, insert new text and delete old text + for (my $i=0; $i<$range_total; $i=$i+2) + { + my $first = $w->index('mark_tag_'.$i); + my $last = $w->index('mark_tag_'.($i+1)); + + my $text = $w->delete($first , $last); + } + + # delete the marks + for (my $i=0; $i<$range_total; $i++) + { $w->markUnset('mark_tag_'.$i); } +} + + +######################################################################## +sub FindAll +{ + my ($w,$mode, $case, $pattern ) = @_; + ### 'sel' tags accumulate, need to remove any previous existing + $w->unselectAll; + + my $match_length=0; + my $start_index; + my $end_index = '1.0'; + + while(defined($end_index)) + { + if ($case eq '-nocase') + { + $start_index = $w->search( + $mode, + $case, + -count => \$match_length, + "--", + $pattern , + $end_index, + 'end'); + } + else + { + $start_index = $w->search( + $mode, + -count => \$match_length, + "--", + $pattern , + $end_index, + 'end'); + } + + unless(defined($start_index) && $start_index) {last;} + + my ($line,$col) = split(/\./, $start_index); + $col = $col + $match_length; + $end_index = $line.'.'.$col; + $w->tagAdd('sel', $start_index, $end_index); + } +} + +######################################################################## +# get current selected text and search for the next occurrence +sub FindSelectionNext +{ + my ($w) = @_; + my $selected; + eval {$selected = $w->SelectionGet(-selection => "PRIMARY"); }; + return if($@); + return unless (defined($selected) and length($selected)); + + $w->FindNext('-forward', '-exact', '-case', $selected); +} + +######################################################################## +# get current selected text and search for the previous occurrence +sub FindSelectionPrevious +{ + my ($w) = @_; + my $selected; + eval {$selected = $w->SelectionGet(-selection => "PRIMARY"); }; + return if($@); + return unless (defined($selected) and length($selected)); + + $w->FindNext('-backward', '-exact', '-case', $selected); +} + + + +######################################################################## +sub FindNext +{ + my ($w,$direction, $mode, $case, $pattern ) = @_; + + ## if searching forward, start search at end of selected block + ## if backward, start search from start of selected block. + ## dont want search to find currently selected text. + ## tag 'sel' may not be defined, use eval loop to trap error + eval { + if ($direction eq '-forward') + { + $w->markSet('insert', 'sel.last'); + $w->markSet('current', 'sel.last'); + } + else + { + $w->markSet('insert', 'sel.first'); + $w->markSet('current', 'sel.first'); + } + }; + + my $saved_index=$w->index('insert'); + + # remove any previous existing tags + $w->unselectAll; + + my $match_length=0; + my $start_index; + + if ($case eq '-nocase') + { + $start_index = $w->search( + $direction, + $mode, + $case, + -count => \$match_length, + "--", + $pattern , + 'insert'); + } + else + { + $start_index = $w->search( + $direction, + $mode, + -count => \$match_length, + "--", + $pattern , + 'insert'); + } + + unless(defined($start_index)) { return 0; } + if(length($start_index) == 0) { return 0; } + + my ($line,$col) = split(/\./, $start_index); + $col = $col + $match_length; + my $end_index = $line.'.'.$col; + $w->tagAdd('sel', $start_index, $end_index); + + $w->see($start_index); + + if ($direction eq '-forward') + { + $w->markSet('insert', $end_index); + $w->markSet('current', $end_index); + } + else + { + $w->markSet('insert', $start_index); + $w->markSet('current', $start_index); + } + + my $compared_index = $w->index('insert'); + + my $ret_val; + if ($compared_index eq $saved_index) + {$ret_val=0;} + else + {$ret_val=1;} + return $ret_val; +} + +######################################################################## +sub FindAndReplaceAll +{ + my ($w,$mode, $case, $find, $replace ) = @_; + $w->markSet('insert', '1.0'); + $w->unselectAll; + while($w->FindNext('-forward', $mode, $case, $find)) + { + $w->ReplaceSelectionsWith($replace); + } +} + +######################################################################## +sub ReplaceSelectionsWith +{ + my ($w,$new_text ) = @_; + + my @ranges = $w->tagRanges('sel'); + my $range_total = @ranges; + + # if nothing selected, then ignore + if ($range_total == 0) {return}; + + # insert marks where selections are located + # marks will move with text even as text is inserted and deleted + # in a previous selection. + for (my $i=0; $i<$range_total; $i++) + {$w->markSet('mark_sel_'.$i => $ranges[$i]); } + + # for every selected mark pair, insert new text and delete old text + my ($first, $last); + for (my $i=0; $i<$range_total; $i=$i+2) + { + $first = $w->index('mark_sel_'.$i); + $last = $w->index('mark_sel_'.($i+1)); + + ########################################################################## + # eventually, want to be able to get selected text, + # support regular expression matching, determine replace_text + # $replace_text = $selected_text=~m/$new_text/ (or whatever would work) + # will have to pass in mode and case flags. + # this would allow a regular expression search and replace to be performed + # example, look for "line (\d+):" and replace with "$1 >" or similar + ########################################################################## + + $w->insert($last, $new_text); + $w->delete($first, $last); + + } + ############################################################ + # set the insert cursor to the end of the last insertion mark + $w->markSet('insert',$w->index('mark_sel_'.($range_total-1))); + + # delete the marks + for (my $i=0; $i<$range_total; $i++) + { $w->markUnset('mark_sel_'.$i); } +} +######################################################################## +sub FindAndReplacePopUp +{ + my ($w)=@_; + $w->findandreplacepopup(0); +} + +######################################################################## +sub FindPopUp +{ + my ($w)=@_; + $w->findandreplacepopup(1); +} + +######################################################################## + +sub findandreplacepopup +{ + my ($w,$find_only)=@_; + + my $pop = $w->Toplevel; + $pop->transient($w->toplevel); + if ($find_only) + { $pop->title("Find"); } + else + { $pop->title("Find and/or Replace"); } + my $frame = $pop->Frame->pack(-anchor=>'nw'); + + $frame->Label(-text=>"Direction:") + ->grid(-row=> 1, -column=>1, -padx=> 20, -sticky => 'nw'); + my $direction = '-forward'; + $frame->Radiobutton( + -variable => \$direction, + -text => 'forward',-value => '-forward' ) + ->grid(-row=> 2, -column=>1, -padx=> 20, -sticky => 'nw'); + $frame->Radiobutton( + -variable => \$direction, + -text => 'backward',-value => '-backward' ) + ->grid(-row=> 3, -column=>1, -padx=> 20, -sticky => 'nw'); + + $frame->Label(-text=>"Mode:") + ->grid(-row=> 1, -column=>2, -padx=> 20, -sticky => 'nw'); + my $mode = '-exact'; + $frame->Radiobutton( + -variable => \$mode, -text => 'exact',-value => '-exact' ) + ->grid(-row=> 2, -column=>2, -padx=> 20, -sticky => 'nw'); + $frame->Radiobutton( + -variable => \$mode, -text => 'regexp',-value => '-regexp' ) + ->grid(-row=> 3, -column=>2, -padx=> 20, -sticky => 'nw'); + + $frame->Label(-text=>"Case:") + ->grid(-row=> 1, -column=>3, -padx=> 20, -sticky => 'nw'); + my $case = '-case'; + $frame->Radiobutton( + -variable => \$case, -text => 'case',-value => '-case' ) + ->grid(-row=> 2, -column=>3, -padx=> 20, -sticky => 'nw'); + $frame->Radiobutton( + -variable => \$case, -text => 'nocase',-value => '-nocase' ) + ->grid(-row=> 3, -column=>3, -padx=> 20, -sticky => 'nw'); + + ###################################################### + my $find_entry = $pop->Entry(-width=>25); + $find_entry->focus; + + my $donext = sub {$w->FindNext ($direction,$mode,$case,$find_entry->get())}; + + $find_entry -> pack(-anchor=>'nw', '-expand' => 'yes' , -fill => 'x'); # autosizing + + ###### if any $w text is selected, put it in the find entry + ###### could be more than one text block selected, get first selection + my @ranges = $w->tagRanges('sel'); + if (@ranges) + { + my $first = shift(@ranges); + my $last = shift(@ranges); + + # limit to one line + my ($first_line, $first_col) = split(/\./,$first); + my ($last_line, $last_col) = split(/\./,$last); + unless($first_line == $last_line) + {$last = $first. ' lineend';} + + $find_entry->insert('insert', $w->get($first , $last)); + } + else + { + my $selected; + eval {$selected=$w->SelectionGet(-selection => "PRIMARY"); }; + if($@) {} + elsif (defined($selected)) + {$find_entry->insert('insert', $selected);} + } + + $find_entry->icursor(0); + + my ($replace_entry,$button_replace,$button_replace_all); + unless ($find_only) + { + $replace_entry = $pop->Entry(-width=>25); + + $replace_entry -> pack(-anchor=>'nw', '-expand' => 'yes' , -fill => 'x'); + } + + + my $button_find = $pop->Button(-text=>'Find', -command => $donext, -default => 'active') + -> pack(-side => 'left'); + + my $button_find_all = $pop->Button(-text=>'Find All', + -command => sub {$w->FindAll($mode,$case,$find_entry->get());} ) + ->pack(-side => 'left'); + + unless ($find_only) + { + $button_replace = $pop->Button(-text=>'Replace', -default => 'normal', + -command => sub {$w->ReplaceSelectionsWith($replace_entry->get());} ) + -> pack(-side =>'left'); + $button_replace_all = $pop->Button(-text=>'Replace All', + -command => sub {$w->FindAndReplaceAll + ($mode,$case,$find_entry->get(),$replace_entry->get());} ) + ->pack(-side => 'left'); + } + + + my $button_cancel = $pop->Button(-text=>'Cancel', + -command => sub {$pop->destroy()} ) + ->pack(-side => 'left'); + + $find_entry->bind("<Return>" => [$button_find, 'invoke']); + $find_entry->bind("<Escape>" => [$button_cancel, 'invoke']); + + $find_entry->bind("<Return>" => [$button_find, 'invoke']); + $find_entry->bind("<Escape>" => [$button_cancel, 'invoke']); + + $pop->resizable('yes','no'); + return $pop; +} + +# paste clipboard into current location +sub clipboardPaste +{ + my ($w) = @_; + local $@; + Tk::catch { $w->Insert($w->clipboardGet) }; +} + +######################################################################## +# Insert -- +# Insert a string into a text at the point of the insertion cursor. +# If there is a selection in the text, and it covers the point of the +# insertion cursor, then delete the selection before inserting. +# +# Arguments: +# w - The text window in which to insert the string +# string - The string to insert (usually just a single character) +sub Insert +{ + my ($w,$string) = @_; + return unless (defined $string && $string ne ''); + #figure out if cursor is inside a selection + my @ranges = $w->tagRanges('sel'); + if (@ranges) + { + while (@ranges) + { + my ($first,$last) = splice(@ranges,0,2); + if ($w->compare($first,'<=','insert') && $w->compare($last,'>=','insert')) + { + $w->ReplaceSelectionsWith($string); + return; + } + } + } + # paste it at the current cursor location + $w->insert('insert',$string); + $w->see('insert'); +} + +# UpDownLine -- +# Returns the index of the character one *display* line above or below the +# insertion cursor. There are two tricky things here. First, +# we want to maintain the original column across repeated operations, +# even though some lines that will get passed through do not have +# enough characters to cover the original column. Second, do not +# try to scroll past the beginning or end of the text. +# +# This may have some weirdness associated with a proportional font. Ie. +# the insertion cursor will zigzag up or down according to the width of +# the character at destination. +# +# Arguments: +# w - The text window in which the cursor is to move. +# n - The number of lines to move: -1 for up one line, +# +1 for down one line. +sub UpDownLine +{ +my ($w,$n) = @_; +$w->see('insert'); +my $i = $w->index('insert'); + +my ($line,$char) = split(/\./,$i); + +my $testX; #used to check the "new" position +my $testY; #used to check the "new" position + +(my $bx, my $by, my $bw, my $bh) = $w->bbox($i); +(my $lx, my $ly, my $lw, my $lh) = $w->dlineinfo($i); + +if ( ($n == -1) and ($by <= $bh) ) + { + #On first display line.. so scroll up and recalculate.. + $w->yview('scroll', -1, 'units'); + unless (($w->yview)[0]) { + #first line of entire text - keep same position. + return $i; + } + ($bx, $by, $bw, $bh) = $w->bbox($i); + ($lx, $ly, $lw, $lh) = $w->dlineinfo($i); + } +elsif ( ($n == 1) and + ($ly + $lh) > ( $w->height - 2*$w->cget(-bd) - 2*$w->cget(-highlightthickness) ) ) + { + #On last display line.. so scroll down and recalculate.. + $w->yview('scroll', 1, 'units'); + ($bx, $by, $bw, $bh) = $w->bbox($i); + ($lx, $ly, $lw, $lh) = $w->dlineinfo($i); + } + +# Calculate the vertical position of the next display line +my $Yoffset = 0; +$Yoffset = $by - $ly + 1 if ($n== -1); +$Yoffset = $ly + $lh + 1 - $by if ($n == 1); +$Yoffset*=$n; +$testY = $by + $Yoffset; + +# Save the original 'x' position of the insert cursor if: +# 1. This is the first time through -- or -- +# 2. The insert cursor position has changed from the previous +# time the up or down key was pressed -- or -- +# 3. The cursor has reached the beginning or end of the widget. + +if (not defined $w->{'origx'} or ($w->{'lastindex'} != $i) ) + { + $w->{'origx'} = $bx; + } + +# Try to keep the same column if possible +$testX = $w->{'origx'}; + +# Get the coordinates of the possible new position +my $testindex = $w->index('@'.$testX.','.$testY ); +$w->see($testindex); +my ($nx,$ny,$nw,$nh) = $w->bbox($testindex); + +# Which side of the character should we position the cursor - +# mainly for a proportional font +if ($testX > $nx+$nw/2) + { + $testX = $nx+$nw+1; + } + +my $newindex = $w->index('@'.$testX.','.$testY ); + +if ( $w->compare($newindex,'==','end - 1 char') and ($ny == $ly ) ) + { + # Then we are trying to the 'end' of the text from + # the same display line - don't do that + return $i; + } + +$w->{'lastindex'} = $newindex; +$w->see($newindex); +return $newindex; +} + +# PrevPara -- +# Returns the index of the beginning of the paragraph just before a given +# position in the text (the beginning of a paragraph is the first non-blank +# character after a blank line). +# +# Arguments: +# w - The text window in which the cursor is to move. +# pos - Position at which to start search. +sub PrevPara +{ + my ($w,$pos) = @_; + $pos = $w->index("$pos linestart"); + while (1) + { + if ($w->get("$pos - 1 line") eq "\n" && $w->get($pos) ne "\n" || $pos eq '1.0' ) + { + my $string = $w->get($pos,"$pos lineend"); + if ($string =~ /^(\s)+/) + { + my $off = length($1); + $pos = $w->index("$pos + $off chars") + } + if ($w->compare($pos,'!=','insert') || $pos eq '1.0') + { + return $pos; + } + } + $pos = $w->index("$pos - 1 line") + } +} +# NextPara -- +# Returns the index of the beginning of the paragraph just after a given +# position in the text (the beginning of a paragraph is the first non-blank +# character after a blank line). +# +# Arguments: +# w - The text window in which the cursor is to move. +# start - Position at which to start search. +sub NextPara +{ + my ($w,$start) = @_; + my $pos = $w->index("$start linestart + 1 line"); + while ($w->get($pos) ne "\n") + { + if ($w->compare($pos,'==','end')) + { + return $w->index('end - 1c'); + } + $pos = $w->index("$pos + 1 line") + } + while ($w->get($pos) eq "\n" ) + { + $pos = $w->index("$pos + 1 line"); + if ($w->compare($pos,'==','end')) + { + return $w->index('end - 1c'); + } + } + my $string = $w->get($pos,"$pos lineend"); + if ($string =~ /^(\s+)/) + { + my $off = length($1); + return $w->index("$pos + $off chars"); + } + return $pos; +} +# ScrollPages -- +# This is a utility procedure used in bindings for moving up and down +# pages and possibly extending the selection along the way. It scrolls +# the view in the widget by the number of pages, and it returns the +# index of the character that is at the same position in the new view +# as the insertion cursor used to be in the old view. +# +# Arguments: +# w - The text window in which the cursor is to move. +# count - Number of pages forward to scroll; may be negative +# to scroll backwards. +sub ScrollPages +{ + my ($w,$count) = @_; + my @bbox = $w->bbox('insert'); + $w->yview('scroll',$count,'pages'); + if (!@bbox) + { + return $w->index('@' . int($w->height/2) . ',' . 0); + } + my $x = int($bbox[0]+$bbox[2]/2); + my $y = int($bbox[1]+$bbox[3]/2); + return $w->index('@' . $x . ',' . $y); +} + +sub Contents +{ + my $w = shift; + if (@_) + { + $w->delete('1.0','end'); + $w->insert('end',shift) while (@_); + } + else + { + return $w->get('1.0','end'); + } +} + +sub Destroy +{ + my ($w) = @_; + delete $w->{_Tags_}; +} + +sub Transpose +{ + my ($w) = @_; + my $pos = 'insert'; + $pos = $w->index("$pos + 1 char") if ($w->compare($pos,'!=',"$pos lineend")); + return if ($w->compare("$pos - 1 char",'==','1.0')); + my $new = $w->get("$pos - 1 char").$w->get("$pos - 2 char"); + $w->delete("$pos - 2 char",$pos); + $w->insert('insert',$new); + $w->see('insert'); +} + +sub Tag +{ + my $w = shift; + my $name = shift; + Carp::confess('No args') unless (ref $w and defined $name); + $w->{_Tags_} = {} unless (exists $w->{_Tags_}); + unless (exists $w->{_Tags_}{$name}) + { + require Tk::Text::Tag; + $w->{_Tags_}{$name} = 'Tk::Text::Tag'->new($w,$name); + } + $w->{_Tags_}{$name}->configure(@_) if (@_); + return $w->{_Tags_}{$name}; +} + +sub Tags +{ + my ($w,$name) = @_; + my @result = (); + foreach $name ($w->tagNames(@_)) + { + push(@result,$w->Tag($name)); + } + return @result; +} + +sub TIEHANDLE +{ + my ($class,$obj) = @_; + return $obj; +} + +sub PRINT +{ + my $w = shift; + # Find out whether 'end' is displayed at the moment + # Retrieve the position of the bottom of the window as + # a fraction of the entire contents of the Text widget + my $yview = ($w->yview)[1]; + + # If $yview is 1.0 this means that 'end' is visible in the window + my $update = 0; + $update = 1 if $yview == 1.0; + + # Loop over all input strings + while (@_) + { + $w->insert('end',shift); + } + # Move the window to see the end of the text if required + $w->see('end') if $update; +} + +sub PRINTF +{ + my $w = shift; + $w->PRINT(sprintf(shift,@_)); +} + +sub WhatLineNumberPopUp +{ + my ($w)=@_; + my ($line,$col) = split(/\./,$w->index('insert')); + $w->messageBox(-type => 'Ok', -title => "What Line Number", + -message => "The cursor is on line $line (column is $col)"); +} + +sub MenuLabels +{ + return qw[~File ~Edit ~Search ~View]; +} + +sub SearchMenuItems +{ + my ($w) = @_; + return [ + ['command'=>'~Find', -command => [$w => 'FindPopUp']], + ['command'=>'Find ~Next', -command => [$w => 'FindSelectionNext']], + ['command'=>'Find ~Previous', -command => [$w => 'FindSelectionPrevious']], + ['command'=>'~Replace', -command => [$w => 'FindAndReplacePopUp']] + ]; +} + +sub EditMenuItems +{ + my ($w) = @_; + my @items = (); + foreach my $op ($w->clipEvents) + { + push(@items,['command' => "~$op", -command => [ $w => "clipboard$op"]]); + } + push(@items, + '-', + ['command'=>'Select All', -command => [$w => 'selectAll']], + ['command'=>'Unselect All', -command => [$w => 'unselectAll']], + ); + return \@items; +} + +sub ViewMenuItems +{ + my ($w) = @_; + my $v; + tie $v,'Tk::Configure',$w,'-wrap'; + return [ + ['command'=>'Goto ~Line...', -command => [$w => 'GotoLineNumberPopUp']], + ['command'=>'~Which Line?', -command => [$w => 'WhatLineNumberPopUp']], + ['cascade'=> 'Wrap', -tearoff => 0, -menuitems => [ + [radiobutton => 'Word', -variable => \$v, -value => 'word'], + [radiobutton => 'Character', -variable => \$v, -value => 'char'], + [radiobutton => 'None', -variable => \$v, -value => 'none'], + ]], + ]; +} + +######################################################################## +sub clipboardColumnCopy +{ + my ($w) = @_; + $w->Column_Copy_or_Cut(0); +} + +sub clipboardColumnCut +{ + my ($w) = @_; + $w->Column_Copy_or_Cut(1); +} + +######################################################################## +sub Column_Copy_or_Cut +{ + my ($w, $cut) = @_; + my @ranges = $w->tagRanges('sel'); + my $range_total = @ranges; + # this only makes sense if there is one selected block + unless ($range_total==2) + { + $w->bell; + return; + } + + my $selection_start_index = shift(@ranges); + my $selection_end_index = shift(@ranges); + + my ($start_line, $start_column) = split(/\./, $selection_start_index); + my ($end_line, $end_column) = split(/\./, $selection_end_index); + + # correct indices for tabs + my $string; + $string = $w->get($start_line.'.0', $start_line.'.0 lineend'); + $string = substr($string, 0, $start_column); + $string = expand($string); + my $tab_start_column = length($string); + + $string = $w->get($end_line.'.0', $end_line.'.0 lineend'); + $string = substr($string, 0, $end_column); + $string = expand($string); + my $tab_end_column = length($string); + + my $length = $tab_end_column - $tab_start_column; + + $selection_start_index = $start_line . '.' . $tab_start_column; + $selection_end_index = $end_line . '.' . $tab_end_column; + + # clear the clipboard + $w->clipboardClear; + my ($clipstring, $startstring, $endstring); + my $padded_string = ' 'x$tab_end_column; + for(my $line = $start_line; $line <= $end_line; $line++) + { + $string = $w->get($line.'.0', $line.'.0 lineend'); + $string = expand($string) . $padded_string; + $clipstring = substr($string, $tab_start_column, $length); + #$clipstring = unexpand($clipstring); + $w->clipboardAppend($clipstring."\n"); + + if ($cut) + { + $startstring = substr($string, 0, $tab_start_column); + $startstring = unexpand($startstring); + $start_column = length($startstring); + + $endstring = substr($string, 0, $tab_end_column ); + $endstring = unexpand($endstring); + $end_column = length($endstring); + + $w->delete($line.'.'.$start_column, $line.'.'.$end_column); + } + } +} + +######################################################################## + +sub clipboardColumnPaste +{ + my ($w) = @_; + my @ranges = $w->tagRanges('sel'); + my $range_total = @ranges; + if ($range_total) + { + warn " there cannot be any selections during clipboardColumnPaste. \n"; + $w->bell; + return; + } + + my $clipboard_text; + eval + { + $clipboard_text = $w->SelectionGet(-selection => "CLIPBOARD"); + }; + + return unless (defined($clipboard_text)); + return unless (length($clipboard_text)); + my $string; + + my $current_index = $w->index('insert'); + my ($current_line, $current_column) = split(/\./,$current_index); + $string = $w->get($current_line.'.0', $current_line.'.'.$current_column); + $string = expand($string); + $current_column = length($string); + + my @clipboard_lines = split(/\n/,$clipboard_text); + my $length; + my $end_index; + my ($delete_start_column, $delete_end_column, $insert_column_index); + foreach my $line (@clipboard_lines) + { + if ($w->OverstrikeMode) + { + #figure out start and end indexes to delete, compensating for tabs. + $string = $w->get($current_line.'.0', $current_line.'.0 lineend'); + $string = expand($string); + $string = substr($string, 0, $current_column); + $string = unexpand($string); + $delete_start_column = length($string); + + $string = $w->get($current_line.'.0', $current_line.'.0 lineend'); + $string = expand($string); + $string = substr($string, 0, $current_column + length($line)); + chomp($string); # dont delete a "\n" on end of line. + $string = unexpand($string); + $delete_end_column = length($string); + + + + $w->delete( + $current_line.'.'.$delete_start_column , + $current_line.'.'.$delete_end_column + ); + } + + $string = $w->get($current_line.'.0', $current_line.'.0 lineend'); + $string = expand($string); + $string = substr($string, 0, $current_column); + $string = unexpand($string); + $insert_column_index = length($string); + + $w->insert($current_line.'.'.$insert_column_index, unexpand($line)); + $current_line++; + } + +} + +# Backward compatibility +sub GetMenu +{ + carp((caller(0))[3]." is deprecated") if $^W; + shift->menu +} + +1; +__END__ + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Text/Tag.pm b/Master/tlpkg/tlperl.old/lib/Tk/Text/Tag.pm new file mode 100644 index 00000000000..827278eb88c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Text/Tag.pm @@ -0,0 +1,46 @@ +package Tk::Text::Tag; +require Tk::Text; + +use overload '""' => \&name; + + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Text/Text/Tag.pm#4 $ + +sub _apply +{ + my $self = shift; + my $meth = shift; + $self->widget->tag($meth => $self->name,@_); +} + +sub name +{ + return shift->[0]; +} + +sub widget +{ + return shift->[1]; +} + +BEGIN +{ + my $meth; + foreach $meth (qw(cget configure bind add)) + { + *{$meth} = sub { shift->_apply($meth,@_) } + } +} + +sub new +{ + my $class = shift; + my $widget = shift; + my $name = shift; + my $obj = bless [$name,$widget],$class; + $obj->configure(@_) if (@_); + return $obj; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/TextEdit.pm b/Master/tlpkg/tlperl.old/lib/Tk/TextEdit.pm new file mode 100644 index 00000000000..e1ff20b6149 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/TextEdit.pm @@ -0,0 +1,509 @@ +# Copyright (c) 1999 Greg Bartels. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +# Special thanks to Nick Ing-Simmons for pushing a lot of +# my text edit functionality into Text.pm and TextUndo.pm +# otherwise, this module would have been monstrous. + +# Andy Worhal had it wrong, its "fifteen megabytes of fame" +# -Greg Bartels + +package Tk::TextEdit; + + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Tk/TextEdit.pm#4 $ + +use Tk qw (Ev); +use AutoLoader; + +use Text::Tabs; + +use base qw(Tk::TextUndo); + +Construct Tk::Widget 'TextEdit'; + +####################################################################### +####################################################################### +sub ClassInit +{ + my ($class,$mw) = @_; + $class->SUPER::ClassInit($mw); + + $mw->bind($class,'<F5>', 'IndentSelectedLines'); + $mw->bind($class,'<F6>', 'UnindentSelectedLines'); + + $mw->bind($class,'<F7>', 'CommentSelectedLines'); + $mw->bind($class,'<F8>', 'UncommentSelectedLines'); + + return $class; +} + +# 8 horizontal pixels in the "space" character in default font. +my $tab_multiplier = 8; + +sub debug_code_f1 +{ + my $w=shift; +} + +sub debug_code_f2 +{ + my $w=shift; +} + +####################################################################### +####################################################################### +sub InitObject +{ + my ($w) = @_; + $w->SUPER::InitObject; + + $w->{'INDENT_STRING'} = "\t"; # Greg mode=>"\t", Nick mode=>" " + $w->{'LINE_COMMENT_STRING'} = "#"; # assuming perl comments + + my %pair_descriptor_hash = + ( + 'PARENS' => [ 'multiline', '(', ')', "[()]" ], + 'CURLIES' => [ 'multiline', '{', '}', "[{}]" ], + 'BRACES' => [ 'multiline', '[', ']', "[][]" ], + 'DOUBLEQUOTE' => [ 'singleline', "\"","\"" ], + 'SINGLEQUOTE' => [ 'singleline', "'","'" ], + ); + + $w->{'HIGHLIGHT_PAIR_DESCRIPTOR_HASH_REF'}=\%pair_descriptor_hash; + + $w->tagConfigure + ('CURSOR_HIGHLIGHT_PARENS', -foreground=>'white', -background=>'violet'); + $w->tagConfigure + ('CURSOR_HIGHLIGHT_CURLIES', -foreground=>'white', -background=>'blue'); + $w->tagConfigure + ('CURSOR_HIGHLIGHT_BRACES', -foreground=>'white', -background=>'purple'); + $w->tagConfigure + ('CURSOR_HIGHLIGHT_DOUBLEQUOTE', -foreground=>'black', -background=>'green'); + $w->tagConfigure + ('CURSOR_HIGHLIGHT_SINGLEQUOTE', -foreground=>'black', -background=>'grey'); + + $w->tagConfigure('BLOCK_HIGHLIGHT_PARENS', -background=>'red'); + $w->tagConfigure('BLOCK_HIGHLIGHT_CURLIES', -background=>'orange'); + $w->tagConfigure('BLOCK_HIGHLIGHT_BRACES', -background=>'red'); + $w->tagConfigure('BLOCK_HIGHLIGHT_DOUBLEQUOTE', -background=>'red'); + $w->tagConfigure('BLOCK_HIGHLIGHT_SINGLEQUOTE', -background=>'red'); + + $w->tagRaise('BLOCK_HIGHLIGHT_PARENS','CURSOR_HIGHLIGHT_PARENS'); + $w->tagRaise('BLOCK_HIGHLIGHT_CURLIES','CURSOR_HIGHLIGHT_CURLIES'); + $w->tagRaise('BLOCK_HIGHLIGHT_BRACES','CURSOR_HIGHLIGHT_BRACES'); + $w->tagRaise('BLOCK_HIGHLIGHT_DOUBLEQUOTE','CURSOR_HIGHLIGHT_DOUBLEQUOTE'); + $w->tagRaise('BLOCK_HIGHLIGHT_SINGLEQUOTE','CURSOR_HIGHLIGHT_SINGLEQUOTE'); + + $w->{'UPDATE_WIDGET_PERIOD'}=300; # how much time between each call. + $w->{'WINDOW_PLUS_AND_MINUS_VALUE'}=80; + $w->SetGUICallbackIndex(0); + $w->schedule_next_callback; + +} + +####################################################################### + +sub cancel_current_gui_callback_and_restart_from_beginning +{ + my ($w)=@_; + if(defined($w->{'UPDATE_WIDGET_AFTER_REFERENCE'})) + {$w->{'UPDATE_WIDGET_AFTER_REFERENCE'}->cancel();} + $w->SetGUICallbackIndex(0); + + $w->schedule_next_callback; +} + +sub schedule_next_callback +{ + my ($w)=@_; + return if $w->NoMoreGUICallbacksToCall; #stops infinite recursive call. + $w->{'UPDATE_WIDGET_AFTER_REFERENCE'} = $w->after + ($w->{'UPDATE_WIDGET_PERIOD'}, + sub + { + $w->CallNextGUICallback; + $w->schedule_next_callback; + } + ); + +} + + +####################################################################### +# use these methods to pass the TextEdit widget an anonymous array +# of code references. +# any time the widget changes that requires the display to be updated, +# then these code references will be scheduled in sequence for calling. +# splitting them up allows them to be prioritized by order, +# and prevents the widget from "freezing" too long if they were +# one large callback. scheduling them apart allows the widget time +# to respond to user inputs. +####################################################################### +sub SetGUICallbacks +{ + my ($w,$callback_array_ref) = @_; + $w->{GUI_CALLBACK_ARRAY_REF}=$callback_array_ref; + $w->SetGUICallbackIndex(0); +} + +sub GetGUICallbacks +{ + return shift->{GUI_CALLBACK_ARRAY_REF}; +} + +sub SetGUICallbackIndex +{ + my ($w, $val)=@_; + $w->{GUI_CALLBACK_ARRAY_INDEX}=$val; +} + +sub GetGUICallbackIndex +{ + return shift->{GUI_CALLBACK_ARRAY_INDEX}; +} + +sub IncrementGUICallbackIndex +{ + shift->{GUI_CALLBACK_ARRAY_INDEX} += 1; +} + +sub NoMoreGUICallbacksToCall +{ + my ($w) = @_; + return 0 unless defined ($w->{GUI_CALLBACK_ARRAY_REF}); + return 0 unless defined ($w->{GUI_CALLBACK_ARRAY_INDEX}); + my $arr_ref = $w->{GUI_CALLBACK_ARRAY_REF}; + my $arr_ind = $w->{GUI_CALLBACK_ARRAY_INDEX}; + return $arr_ind >= @$arr_ref; +} + +sub CallNextGUICallback +{ + my ($w) = @_; + return if $w->NoMoreGUICallbacksToCall; + my $arr_ref = $w->{GUI_CALLBACK_ARRAY_REF}; + my $arr_ind = $w->{GUI_CALLBACK_ARRAY_INDEX}; + &{$arr_ref->[$arr_ind]}; + $w->IncrementGUICallbackIndex; +} + + +####################################################################### +####################################################################### + +sub insert +{ + my $w = shift; + $w->SUPER::insert(@_); + $w->cancel_current_gui_callback_and_restart_from_beginning; +} + +sub delete +{ + my $w = shift; + $w->SUPER::delete(@_); + $w->cancel_current_gui_callback_and_restart_from_beginning; +} + +sub SetCursor +{ + my $w = shift; + $w->SUPER::SetCursor(@_); + $w->cancel_current_gui_callback_and_restart_from_beginning; +} + +sub OverstrikeMode +{ + my ($w,$mode) = @_; + if (defined($mode)) + { + $w->SUPER::OverstrikeMode($mode); + $w->cancel_current_gui_callback_and_restart_from_beginning; + } + return $w->SUPER::OverstrikeMode; +} + + +####################################################################### +# use yview on scrollbar to get fractional coordinates. +# scale this by the total length of the text to find the +# approximate start line of widget and end line of widget. +####################################################################### +sub GetScreenWindowCoordinates +{ + my $w = shift; + my ($top_frac, $bot_frac) = $w->yview; + my $end_index = $w->index('end'); + my ($lines,$columns) = split (/\./,$end_index); + my $window = $w->{'WINDOW_PLUS_AND_MINUS_VALUE'}; + my $top_line = int(($top_frac * $lines) - $window); + $top_line = 0 if ($top_line < 0); + my $bot_line = int(($bot_frac * $lines) + $window); + $bot_line = $lines if ($bot_line > $lines); + my $top_index = $top_line . '.0'; + my $bot_index = $bot_line . '.0'; + + $_[0] = $top_index; + $_[1] = $bot_index; +} + +######################################################################## +# take two indices as inputs. +# if they are on the same line or same column (accounting for tabs) +# then return 1 +# else return 0 +# (assume indices passed in are in line.column format) +######################################################################## +sub IndicesLookGood +{ + my ($w, $start, $end, $singleline) = @_; + + return 0 unless ( (defined($start)) and (defined($end))); + + my ($start_line, $start_column) = split (/\./,$start); + my ($end_line, $end_column) = split (/\./,$end); + + ########################## + # good if on the same line + ########################## + return 1 if ($start_line == $end_line); + + ########################## + # if not on same line and its a singleline, its bad + ########################## + return 0 if $singleline; + + + # get both lines, convert the tabs to spaces, and get the new column. + # see if they line up or not. + my $string; + $string = $w->get($start_line.'.0', $start_line.'.0 lineend'); + $string = substr($string, 0, $start_column+1); + $string = expand($string); + $start_column = length($string); + + $string = $w->get($end_line.'.0', $end_line.'.0 lineend'); + $string = substr($string, 0, $end_column +1); + $string = expand($string); + $end_column = length($string); + + ########################## + # good if on the same column (adjusting for tabs) + ########################## + return 1 if ($start_column == $end_column); + + # otherwise its bad + return 0; +} + +######################################################################## +# if searching backward, count paranthesis until find a start parenthesis +# which does not have a forward match. +# +# (<= search backward will return this index +# () +# START X HERE +# ( ( ) () ) +# )<== search forward will return this index +# +# if searching forward, count paranthesis until find a end parenthesis +# which does not have a rearward match. +######################################################################## +sub searchForBaseCharacterInPair +{ + my + ( + $w, $top_index, $searchfromindex, $bot_index, + $direction, $startchar, $endchar, $charpair + )=@_; + my ($plus_one_char, $search_end_index, $index_offset, $done_index); + if ($direction eq '-forward') + { + $plus_one_char = $endchar; + $search_end_index = $bot_index; + $index_offset = ' +1c'; + $done_index = $w->index('end'); + } + else + { + $plus_one_char = $startchar; + $search_end_index = $top_index; + $index_offset = ''; + $done_index = '1.0'; + } + + my $at_done_index = 0; + my $count = 0; + my $char; + while(1) + { + $searchfromindex = $w->search + ($direction, '-regexp', $charpair, $searchfromindex, $search_end_index ); + + last unless(defined($searchfromindex)); + $char = $w->get($searchfromindex, $w->index($searchfromindex.' +1c')); + if ($char eq $plus_one_char) + {$count += 1;} + else + {$count -= 1;} + last if ($count==1); + # boundary condition exists when first char in widget is the match char + # need to be able to determine if search tried to go past index '1.0' + # if so, set index to undef and return. + if ( $at_done_index ) + { + $searchfromindex = undef; + last; + } + $at_done_index = 1 if ($searchfromindex eq $done_index); + $searchfromindex=$w->index($searchfromindex . $index_offset); + } + return $searchfromindex; +} + +######################################################################## +# highlight a character pair that most closely brackets the cursor. +# allows you to pick and choose which ones you want to do. +######################################################################## + +sub HighlightParenthesisAroundCursor +{ + my ($w)=@_; + $w->HighlightSinglePairBracketingCursor + ( '(', ')', '[()]', 'CURSOR_HIGHLIGHT_PARENS','BLOCK_HIGHLIGHT_PARENS',0); +} + +sub HighlightCurlyBracesAroundCursor +{ + my ($w)=@_; + $w->HighlightSinglePairBracketingCursor + ( '{', '}', '[{}]', 'CURSOR_HIGHLIGHT_CURLIES','BLOCK_HIGHLIGHT_CURLIES',0); +} + +sub HighlightBracesAroundCursor +{ + my ($w)=@_; + $w->HighlightSinglePairBracketingCursor + ( '[', ']','[][]', 'CURSOR_HIGHLIGHT_BRACES','BLOCK_HIGHLIGHT_BRACES',0); +} + +sub HighlightDoubleQuotesAroundCursor +{ + my ($w)=@_; + $w->HighlightSinglePairBracketingCursor + ( "\"", "\"", "\"", 'CURSOR_HIGHLIGHT_DOUBLEQUOTE','BLOCK_HIGHLIGHT_DOUBLEQUOTE',1); +} + +sub HighlightSingleQuotesAroundCursor +{ + my ($w)=@_; + $w->HighlightSinglePairBracketingCursor + ( "'", "'", "'", 'CURSOR_HIGHLIGHT_SINGLEQUOTE','BLOCK_HIGHLIGHT_SINGLEQUOTE',1); +} + +######################################################################## +# highlight all the character pairs that most closely bracket the cursor. +######################################################################## +sub HighlightAllPairsBracketingCursor +{ + my ($w)=@_; + $w->HighlightParenthesisAroundCursor; + $w->HighlightCurlyBracesAroundCursor; + $w->HighlightBracesAroundCursor; + $w->HighlightDoubleQuotesAroundCursor; + $w->HighlightSingleQuotesAroundCursor; +} + +######################################################################## +# search for a pair of matching characters that bracket the +# cursor and tag them with the given tagname. +# startchar might be '[' +# endchar would then be ']' +# tagname is a name of a tag, which has already been +# configured to highlight however the user wants them to behave. +# error tagname is the tag to highlight the chars with if there +# is a problem of some kind. +# singleline indicates whether the character pairs must occur +# on a single line. quotation marks are single line characters usually. +######################################################################## +sub HighlightSinglePairBracketingCursor +{ + my + ( + $w, $startchar, $endchar, $charpair, + $good_tagname, $bad_tagname, $single_line + ) = @_; + $single_line=0 unless defined($single_line); + $w->tagRemove($good_tagname, '1.0','end'); + $w->tagRemove($bad_tagname, '1.0','end'); + my $top_index; my $bot_index; + my $cursor = $w->index('insert'); + if ($single_line) + { + $top_index = $w->index($cursor.' linestart'); + $bot_index = $w->index($cursor.' lineend'); + } + else + { + $w->GetScreenWindowCoordinates($top_index, $bot_index); + } + + # search backward for the startchar + # $top_index, $searchfromindex, $bot_index, + # $direction, $startchar, $endchar, $charpair + + my $startindex = $w->searchForBaseCharacterInPair + ( + $top_index, $cursor, $bot_index, + '-backward', $startchar, $endchar, $charpair + ); + + # search forward for the endchar + my $endindex = $w->searchForBaseCharacterInPair + ( + $top_index, $cursor, $bot_index, + '-forward', $startchar, $endchar, $charpair + ); + return unless ((defined $startindex) and (defined $endindex)); + + my $final_tag = $bad_tagname; + if ($w->IndicesLookGood( $startindex, $endindex, $single_line)) + { + $final_tag = $good_tagname; + } + + $w->tagAdd($final_tag, $startindex, $w->index($startindex.'+1c') ); + $w->tagAdd($final_tag, $endindex, $w->index( $endindex.'+1c') ); +} + +#################################################################### +sub IndentSelectedLines +{ + my($w)=@_; + $w->insertStringAtStartOfSelectedLines($w->{'INDENT_STRING'}); +} + +sub UnindentSelectedLines +{ + my($w)=@_; + $w->deleteStringAtStartOfSelectedLines($w->{'INDENT_STRING'}); +} + +sub CommentSelectedLines +{ + my($w)=@_; + $w->insertStringAtStartOfSelectedLines($w->{'LINE_COMMENT_STRING'}); +} + +sub UncommentSelectedLines +{ + my($w)=@_; + $w->deleteStringAtStartOfSelectedLines($w->{'LINE_COMMENT_STRING'}); +} + + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/TextList.pm b/Master/tlpkg/tlperl.old/lib/Tk/TextList.pm new file mode 100644 index 00000000000..77a48fdf8ce --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/TextList.pm @@ -0,0 +1,985 @@ +# Copyright (c) 1999 Greg London. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +# code for bindings taken from Listbox.pm + +# comments specifying method functionality taken from +# "Perl/Tk Pocket Reference" by Stephen Lidie. + +####################################################################### +# this module uses a text module as its base class to create a list box. +# this will allow list box functionality to also have all the functionality +# of the Text widget. +# +# note that most methods use an element number to indicate which +# element in the list to work on. +# the exception to this is the tag and mark methods which +# are dual natured. These methods may accept either the +# normal element number, or they will also take a element.char index, +# which would be useful for applying tags to part of a line in the list. +# +####################################################################### + +package Tk::TextList; + +use strict; +use vars qw($VERSION); +$VERSION = '4.005'; # $Id: //depot/Tkutf8/TextList/TextList.pm#5 $ + +#XXXdel: use Tk::Reindex qw(Tk::ROText); #XXXdel: ReindexedROText); + +use base qw(Tk::Derived Tk::ReindexedROText ); + +use Tk qw (Ev); + +#XXX del: use base qw(Tk::ReindexedROText); + +Construct Tk::Widget 'TextList'; + +####################################################################### +# the following line causes Populate to get called +# @ISA = qw(Tk::Derived ... ); +####################################################################### +sub Populate +{ + my ($w,$args)=@_; + my $option=delete $args->{'-selectmode'}; + $w->SUPER::Populate($args); + $w->ConfigSpecs( -selectmode => ['PASSIVE','selectMode','SelectMode','browse'], + -takefocus => ['PASSIVE','takeFocus','TakeFocus',1], + -spacing3 => ['SELF', undef, undef, 3], + -insertwidth => ['SELF', undef, undef, 0], + ); + +} + +####################################################################### +####################################################################### +sub ClassInit +{ + my ($class,$mw) = @_; + + # Standard Motif bindings: + $mw->bind($class,'<1>',['BeginSelect',Ev('index',Ev('@'))]); + $mw->bind($class,'<B1-Motion>',['Motion',Ev('index',Ev('@'))]); + $mw->bind($class,'<ButtonRelease-1>','ButtonRelease_1'); + + $mw->bind($class,'<Shift-1>',['BeginExtend',Ev('index',Ev('@'))]); + $mw->bind($class,'<Control-1>',['BeginToggle',Ev('index',Ev('@'))]); + + $mw->bind($class,'<B1-Leave>',['AutoScan',Ev('x'),Ev('y')]); + $mw->bind($class,'<B1-Enter>','CancelRepeat'); + $mw->bind($class,'<Up>',['UpDown',-1]); + $mw->bind($class,'<Shift-Up>',['ExtendUpDown',-1]); + $mw->bind($class,'<Down>',['UpDown',1]); + $mw->bind($class,'<Shift-Down>',['ExtendUpDown',1]); + + $mw->XscrollBind($class); + $mw->PriorNextBind($class); + + $mw->bind($class,'<Control-Home>','Cntrl_Home'); + + $mw->bind($class,'<Shift-Control-Home>',['DataExtend',0]); + $mw->bind($class,'<Control-End>','Cntrl_End'); + + $mw->bind($class,'<Shift-Control-End>',['DataExtend','end']); + $class->clipboardOperations($mw,'Copy'); + $mw->bind($class,'<space>',['BeginSelect',Ev('index','active')]); + $mw->bind($class,'<Select>',['BeginSelect',Ev('index','active')]); + $mw->bind($class,'<Control-Shift-space>',['BeginExtend',Ev('index','active')]); + $mw->bind($class,'<Shift-Select>',['BeginExtend',Ev('index','active')]); + $mw->bind($class,'<Escape>','Cancel'); + $mw->bind($class,'<Control-slash>','SelectAll'); + $mw->bind($class,'<Control-backslash>','Cntrl_backslash'); + ; + # Additional Tk bindings that aren't part of the Motif look and feel: + $mw->bind($class,'<2>',['scan','mark',Ev('x'),Ev('y')]); + $mw->bind($class,'<B2-Motion>',['scan','dragto',Ev('x'),Ev('y')]); + + $mw->bind($class,'<FocusIn>' , ['tagConfigure','_ACTIVE_TAG', -underline=>1]); + $mw->bind($class,'<FocusOut>', ['tagConfigure','_ACTIVE_TAG', -underline=>0]); + + return $class; +} + +####################################################################### +# set the active element to index +# "active" is a text "mark" which underlines the marked text. +####################################################################### +sub activate +{ + my($w,$element)=@_; + $element= $w->index($element).'.0'; + $w->SUPER::tag('remove', '_ACTIVE_TAG', '1.0','end'); + $w->SUPER::tag('add', '_ACTIVE_TAG', + $element.' linestart', $element.' lineend'); + $w->SUPER::mark('set', 'active', $element); +} + + +####################################################################### +# bbox returns a list (x,y,width,height) giving an approximate +# bounding box of character given by index +####################################################################### +sub bbox +{ + my($w,$element)=@_; + $element=$w->index($element).'.0' unless ($element=~/./); + return $w->SUPER::bbox($element); +} + +####################################################################### +# returns a list of indices of all elements currently selected +####################################################################### +sub curselection +{ + my ($w)=@_; + my @ranges = $w->SUPER::tag('ranges', 'sel'); + my @selection_list; + while (@ranges) + { + my ($first,$firstcol) = split(/\./,shift(@ranges)); + my ($last,$lastcol) = split(/\./,shift(@ranges)); + + ######################################################################### + # if previous selection ended on the same line that this selection starts, + # then fiddle the numbers so that this line number isnt included twice. + ######################################################################### + if (defined($selection_list[-1]) and ($first == $selection_list[-1])) + { + $first++; # count this selection starting from the next line. + } + + if ($lastcol==0) + { + $last-=1; + } + + ######################################################################### + # if incrementing $first causes it to be greater than $last, + # then do nothing, + # else add (first .. last) to list + ######################################################################### + unless ($first>$last) + { + push(@selection_list, $first .. $last); + } + } + return @selection_list; +} + + +####################################################################### +# deletes range of elements from element1 to element2 +# defaults to element1 +####################################################################### +sub delete +{ + my ($w, $element1, $element2)=@_; + $element1=$w->index($element1); + $element2=$element1 unless(defined($element2)); + $element2=$w->index($element2); + $w->SUPER::delete($element1.'.0' , $element2.'.0 lineend'); +} + +####################################################################### +# deletes range of characters from index1 to index2 +# defaults to index1+1c +# index is line.char notation. +####################################################################### +sub deleteChar +{ + my ($w, $index1, $index2)=@_; + $index1=$w->index($index1); + $index2=$index1.' +1c' unless(defined($index2)); + $index2=$w->index($index2); + $w->SUPER::delete($index1, $index2); +} + +####################################################################### +# returns as a list contents of elements from $element1 to $element2 +# defaults to element1. +####################################################################### +sub get +{ + my ($w, $element1, $element2)=@_; + $element1=$w->index($element1); + $element2=$element1 unless(defined($element2)); + $element2=$w->index($element2); + my @getlist; + for(my $i=$element1; $i<=$element2; $i++) + { + push(@getlist, $w->SUPER::get($i.'.0 linestart', $i.'.0 lineend')); + } + + return @getlist; +} + +####################################################################### +# return text between index1 and index2 which are line.char notation. +# return value is a single string. index2 defaults to index1+1c +# index is line.char notation. +###################################################################### +sub getChar +{ + my $w=shift; + return $w->SUPER::get(@_); +} + +####################################################################### +# returns index in number notation +# this method returns an element number, ie the 5th element. +####################################################################### +sub index +{ + my ($w,$element)=@_; + return undef unless(defined($element)); + $element .= '.0' unless $element=~/\D/; + $element = $w->SUPER::index($element); + my($line,$col)=split(/\./,$element); + return $line; +} + +####################################################################### +# returns index in line.char notation +# this method returns an index specific to a character within an element +####################################################################### +sub indexChar +{ + my $w=shift; + return $w->SUPER::index(@_); +} + + +####################################################################### +# inserts specified elements just before element at index +####################################################################### +sub insert +{ + my $w=shift; + my $element=shift; + $element=$w->index($element); + my $item; + while (@_) + { + $item = shift(@_); + $item .= "\n"; + $w->SUPER::insert($element++.'.0', $item); + } +} + +####################################################################### +# inserts string just before character at index. +# index is line.char notation. +####################################################################### +sub insertChar +{ + my $w=shift; + $w->SUPER::insert(@_); +} + + + +####################################################################### +# returns index of element nearest to y-coordinate +# +# currently not defined +####################################################################### +#sub nearest +#{ +# return undef; +#} + +####################################################################### +# Sets the selection anchor to element at index +####################################################################### +sub selectionAnchor +{ + my ($w, $element)=@_; + $element=$w->index($element); + $w->SUPER::mark('set', 'anchor', $element.'.0'); +} + +####################################################################### +# deselects elements between index1 and index2, inclusive +####################################################################### +sub selectionClear +{ + my ($w, $element1, $element2)=@_; + $element1=$w->index($element1); + $element2=$element1 unless(defined($element2)); + $element2=$w->index($element2); + $w->SUPER::tag('remove', 'sel', $element1.'.0', $element2.'.0 lineend +1c'); +} + +####################################################################### +# returns 1 if element at index is selected, 0 otherwise. +####################################################################### +sub selectionIncludes +{ + my ($w, $element)=@_; + $element=$w->index($element); + my @list = $w->curselection; + my $line; + foreach $line (@list) + { + if ($line == $element) {return 1;} + } + return 0; +} + +####################################################################### +# adds all elements between element1 and element2 inclusive to selection +####################################################################### +sub selectionSet +{ + my ($w, $element1, $element2)=@_; + $element1=$w->index($element1); + $element2=$element1 unless(defined($element2)); + $element2=$w->index($element2); + $w->SUPER::tag('add', 'sel', $element1.'.0', $element2.'.0 lineend +1c'); +} + +####################################################################### +# for ->selection(option,args) calling convention +####################################################################### +sub selection +{ +# my ($w,$sub)=(shift,"selection".ucfirst(shift)); +# no strict 'refs'; +# # can't use $w->$sub, since it might call overridden method-- bleh +# &($sub)($w,@_); +} + + +####################################################################### +# adjusts the view in window so element at index is completely visible +####################################################################### +sub see +{ + my ($w, $element)=@_; + $element=$w->index($element); + $w->SUPER::see($element.'.0'); +} + +####################################################################### +# returns number of elements in listbox +####################################################################### +sub size +{ + my ($w)=@_; + my $element = $w->index('end'); + # theres a weird thing with the 'end' mark sometimes being on a line + # with text, and sometimes being on a line all by itself + my ($text) = $w->get($element); + if (length($text) == 0) + {$element -= 1;} + return $element; +} + + + +####################################################################### +# add a tag based on element numbers +####################################################################### +sub tagAdd +{ + my ($w, $tagName, $element1, $element2)=@_; + $element1=$w->index($element1); + $element1.='.0'; + + $element2=$element1.' lineend' unless(defined($element2)); + $element2=$w->index($element2); + $element2.='.0 lineend +1c'; + + $w->SUPER::tag('add', $tagName, $element1, $element2); +} + +####################################################################### +# add a tag based on line.char indexes +####################################################################### +sub tagAddChar +{ + my $w=shift; + $w->SUPER::tag('add',@_); +} + + +####################################################################### +# remove a tag based on element numbers +####################################################################### +sub tagRemove +{ + my ($w, $tagName, $element1, $element2)=@_; + $element1=$w->index($element1); + $element1.='.0'; + + $element2=$element1.' lineend' unless(defined($element2)); + $element2=$w->index($element2); + $element2.='.0 lineend +1c'; + + $w->SUPER::tag('remove', 'sel', $element1, $element2); +} + +####################################################################### +# remove a tag based on line.char indexes +####################################################################### +sub tagRemoveChar +{ + my $w=shift; + $w->SUPER::tag('remove', @_); +} + + + + +####################################################################### +# perform tagNextRange based on element numbers +####################################################################### +sub tagNextRange +{ + my ($w, $tagName, $element1, $element2)=@_; + $element1=$w->index($element1); + $element1.='.0'; + + $element2=$element1 unless(defined($element2)); + $element2=$w->index($element2); + $element2.='.0 lineend +1c'; + + my $index = $w->SUPER::tag('nextrange', 'sel', $element1, $element2); + my ($line,$col)=split(/\./,$index); + return $line; +} + +####################################################################### +# perform tagNextRange based on line.char indexes +####################################################################### +sub tagNextRangeChar +{ + my $w=shift; + $w->SUPER::tag('nextrange', @_); +} + +####################################################################### +# perform tagPrevRange based on element numbers +####################################################################### +sub tagPrevRange +{ + my ($w, $tagName, $element1, $element2)=@_; + $element1=$w->index($element1); + $element1.='.0'; + + $element2=$element1 unless(defined($element2)); + $element2=$w->index($element2); + $element2.='.0 lineend +1c'; + + my $index = $w->SUPER::tag('prevrange', 'sel', $element1, $element2); + my ($line,$col)=split(/\./,$index); + return $line; +} + +####################################################################### +# perform tagPrevRange based on line.char indexes +####################################################################### +sub tagPrevRangeChar +{ + my $w=shift; + $w->SUPER::tag('prevrange', @_); +} + + + +####################################################################### +# perform markSet based on element numbers +####################################################################### +sub markSet +{ + my ($w,$mark,$element1)=@_; + $element1=$w->index($element1); + $element1.='.0'; + $w->SUPER::mark('set', $element1,$mark); +} + +####################################################################### +# perform markSet based on line.char indexes +####################################################################### +sub markSetChar +{ + my $w=shift; + $w->SUPER::mark('set', @_); +} + +####################################################################### +# perform markNext based on element numbers +####################################################################### +sub markNext +{ + my ($w,$element1)=@_; + $element1=$w->index($element1); + $element1.='.0'; + return $w->SUPER::mark('next', $element1); +} + +####################################################################### +# perform markNext based on line.char indexes +####################################################################### +sub markNextChar +{ + my $w=shift; + $w->SUPER::mark('next', @_); +} + + +####################################################################### +# perform markPrevious based on element numbers +####################################################################### +sub markPrevious +{ + my ($w,$element1)=@_; + $element1=$w->index($element1); + $element1.='.0'; + return $w->SUPER::mark('previous', $element1); +} + +####################################################################### +# perform markPrevious based on line.char indexes +####################################################################### +sub markPreviousChar +{ + my $w=shift; + $w->SUPER::mark('previous', @_); +} + + + + +sub ButtonRelease_1 +{ + my $w = shift; + my $Ev = $w->XEvent; + $w->CancelRepeat; + $w->activate($Ev->xy); +} + + +sub Cntrl_Home +{ + my $w = shift; + my $Ev = $w->XEvent; + $w->activate(0); + $w->see(0); + $w->selectionClear(0,'end'); + $w->selectionSet(0) +} + + +sub Cntrl_End +{ + my $w = shift; + my $Ev = $w->XEvent; + $w->activate('end'); + $w->see('end'); + $w->selectionClear(0,'end'); + $w->selectionSet('end') +} + + +sub Cntrl_backslash +{ + my $w = shift; + my $Ev = $w->XEvent; + if ($w->cget('-selectmode') ne 'browse') + { + $w->selectionClear(0,'end'); + } +} + +# BeginSelect -- +# +# This procedure is typically invoked on button-1 presses. It begins +# the process of making a selection in the listbox. Its exact behavior +# depends on the selection mode currently in effect for the listbox; +# see the Motif documentation for details. +# +# Arguments: +# w - The listbox widget. +# el - The element for the selection operation (typically the +# one under the pointer). Must be in numerical form. +sub BeginSelect +{ + my $w = shift; + my $el = shift; + if ($w->cget('-selectmode') eq 'multiple') + { + if ($w->selectionIncludes($el)) + { + $w->selectionClear($el) + } + else + { + $w->selectionSet($el) + } + } + else + { + $w->selectionClear(0,'end'); + $w->selectionSet($el); + $w->selectionAnchor($el); + my @list = (); + $w->{'SELECTION_LIST_REF'} = \@list; + $w->{'PREVIOUS_ELEMENT'} = $el + } + $w->focus if ($w->cget('-takefocus')); +} +# Motion -- +# +# This procedure is called to process mouse motion events while +# button 1 is down. It may move or extend the selection, depending +# on the listbox's selection mode. +# +# Arguments: +# w - The listbox widget. +# el - The element under the pointer (must be a number). +sub Motion +{ + my $w = shift; + my $el = shift; + if (defined($w->{'PREVIOUS_ELEMENT'}) && $el == $w->{'PREVIOUS_ELEMENT'}) + { + return; + } + + # if no selections, select current + if($w->curselection==0) + { + $w->activate($el); + $w->selectionSet($el); + $w->selectionAnchor($el); + $w->{'PREVIOUS_ELEMENT'}=$el; + return; + } + + my $anchor = $w->index('anchor'); + my $mode = $w->cget('-selectmode'); + if ($mode eq 'browse') + { + $w->selectionClear(0,'end'); + $w->selectionSet($el); + $w->{'PREVIOUS_ELEMENT'} = $el; + } + elsif ($mode eq 'extended') + { + my $i = $w->{'PREVIOUS_ELEMENT'}; + if ($w->selectionIncludes('anchor')) + { + $w->selectionClear($i,$el); + $w->selectionSet('anchor',$el) + } + else + { + $w->selectionClear($i,$el); + $w->selectionClear('anchor',$el) + } + while ($i < $el && $i < $anchor) + { + if (Tk::lsearch($w->{'SELECTION_LIST_REF'},$i) >= 0) + { + $w->selectionSet($i) + } + $i += 1 + } + while ($i > $el && $i > $anchor) + { + if (Tk::lsearch($w->{'SELECTION_LIST_REF'},$i) >= 0) + { + $w->selectionSet($i) + } + $i += -1 + } + $w->{'PREVIOUS_ELEMENT'} = $el + } +} +# BeginExtend -- +# +# This procedure is typically invoked on shift-button-1 presses. It +# begins the process of extending a selection in the listbox. Its +# exact behavior depends on the selection mode currently in effect +# for the listbox; see the Motif documentation for details. +# +# Arguments: +# w - The listbox widget. +# el - The element for the selection operation (typically the +# one under the pointer). Must be in numerical form. +sub BeginExtend +{ + my $w = shift; + my $el = shift; + + # if no selections, select current + if($w->curselection==0) + { + $w->activate($el); + $w->selectionSet($el); + $w->selectionAnchor($el); + $w->{'PREVIOUS_ELEMENT'}=$el; + return; + } + + if ($w->cget('-selectmode') eq 'extended' && $w->selectionIncludes('anchor')) + { + $w->Motion($el) + } +} +# BeginToggle -- +# +# This procedure is typically invoked on control-button-1 presses. It +# begins the process of toggling a selection in the listbox. Its +# exact behavior depends on the selection mode currently in effect +# for the listbox; see the Motif documentation for details. +# +# Arguments: +# w - The listbox widget. +# el - The element for the selection operation (typically the +# one under the pointer). Must be in numerical form. +sub BeginToggle +{ + my $w = shift; + my $el = shift; + if ($w->cget('-selectmode') eq 'extended') + { + my @list = $w->curselection(); + $w->{'SELECTION_LIST_REF'} = \@list; + $w->{'PREVIOUS_ELEMENT'} = $el; + $w->selectionAnchor($el); + if ($w->selectionIncludes($el)) + { + $w->selectionClear($el) + } + else + { + $w->selectionSet($el) + } + } +} +# AutoScan -- +# This procedure is invoked when the mouse leaves an entry window +# with button 1 down. It scrolls the window up, down, left, or +# right, depending on where the mouse left the window, and reschedules +# itself as an "after" command so that the window continues to scroll until +# the mouse moves back into the window or the mouse button is released. +# +# Arguments: +# w - The entry window. +# x - The x-coordinate of the mouse when it left the window. +# y - The y-coordinate of the mouse when it left the window. +sub AutoScan +{ + my $w = shift; + my $x = shift; + my $y = shift; + if ($y >= $w->height) + { + $w->yview('scroll',1,'units') + } + elsif ($y < 0) + { + $w->yview('scroll',-1,'units') + } + elsif ($x >= $w->width) + { + $w->xview('scroll',2,'units') + } + elsif ($x < 0) + { + $w->xview('scroll',-2,'units') + } + else + { + return; + } + $w->Motion($w->index("@" . $x . ',' . $y)); + $w->RepeatId($w->after(50,'AutoScan',$w,$x,$y)); +} +# UpDown -- +# +# Moves the location cursor (active element) up or down by one element, +# and changes the selection if we're in browse or extended selection +# mode. +# +# Arguments: +# w - The listbox widget. +# amount - +1 to move down one item, -1 to move back one item. +sub UpDown +{ + my $w = shift; + my $amount = shift; + $w->activate($w->index('active')+$amount); + $w->see('active'); + my $selectmode = $w->cget('-selectmode'); + if ($selectmode eq 'browse') + { + $w->selectionClear(0,'end'); + $w->selectionSet('active') + } + elsif ($selectmode eq 'extended') + { + $w->selectionClear(0,'end'); + $w->selectionSet('active'); + $w->selectionAnchor('active'); + $w->{'PREVIOUS_ELEMENT'} = $w->index('active'); + my @list = (); + $w->{'SELECTION_LIST_REF'}=\@list; + } +} +# ExtendUpDown -- +# +# Does nothing unless we're in extended selection mode; in this +# case it moves the location cursor (active element) up or down by +# one element, and extends the selection to that point. +# +# Arguments: +# w - The listbox widget. +# amount - +1 to move down one item, -1 to move back one item. +sub ExtendUpDown +{ + my $w = shift; + my $amount = shift; + if ($w->cget('-selectmode') ne 'extended') + { + return; + } + $w->activate($w->index('active')+$amount); + $w->see('active'); + $w->Motion($w->index('active')) +} +# DataExtend +# +# This procedure is called for key-presses such as Shift-KEndData. +# If the selection mode isn't multiple or extend then it does nothing. +# Otherwise it moves the active element to el and, if we're in +# extended mode, extends the selection to that point. +# +# Arguments: +# w - The listbox widget. +# el - An integer element number. +sub DataExtend +{ + my $w = shift; + my $el = shift; + my $mode = $w->cget('-selectmode'); + if ($mode eq 'extended') + { + $w->activate($el); + $w->see($el); + if ($w->selectionIncludes('anchor')) + { + $w->Motion($el) + } + } + elsif ($mode eq 'multiple') + { + $w->activate($el); + $w->see($el) + } +} +# Cancel +# +# This procedure is invoked to cancel an extended selection in +# progress. If there is an extended selection in progress, it +# restores all of the items between the active one and the anchor +# to their previous selection state. +# +# Arguments: +# w - The listbox widget. +sub Cancel +{ + my $w = shift; + if ($w->cget('-selectmode') ne 'extended' || !defined $w->{'PREVIOUS_ELEMENT'}) + { + return; + } + my $first = $w->index('anchor'); + my $last = $w->{'PREVIOUS_ELEMENT'}; + if ($first > $last) + { + ($first,$last)=($last,$first); + } + $w->selectionClear($first,$last); + while ($first <= $last) + { + if (Tk::lsearch($w->{'SELECTION_LIST_REF'},$first) >= 0) + { + $w->selectionSet($first) + } + $first += 1 + } +} +# SelectAll +# +# This procedure is invoked to handle the "select all" operation. +# For single and browse mode, it just selects the active element. +# Otherwise it selects everything in the widget. +# +# Arguments: +# w - The listbox widget. +sub SelectAll +{ + my $w = shift; + my $mode = $w->cget('-selectmode'); + if ($mode eq 'single' || $mode eq 'browse') + { + $w->selectionClear(0,'end'); + $w->selectionSet('active') + } + else + { + $w->selectionSet(0,'end') + } +} + +sub SetList +{ + my $w = shift; + $w->delete(0,'end'); + $w->insert('end',@_); +} + +sub deleteSelected +{ + my $w = shift; + my $i; + foreach $i (reverse $w->curselection) + { + $w->delete($i); + } +} + +sub clipboardPaste +{ + my $w = shift; + my $element = $w->index('active') || $w->index($w->XEvent->xy); + my $str; + eval {local $SIG{__DIE__}; $str = $w->clipboardGet }; + return if $@; + foreach (split("\n",$str)) + { + $w->insert($element++,$_); + } +} + +sub getSelected +{ + my ($w) = @_; + my $i; + my (@result) = (); + foreach $i ($w->curselection) + { + push(@result,$w->get($i)); + } + return (wantarray) ? @result : $result[0]; +} + + + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/TextUndo.pm b/Master/tlpkg/tlperl.old/lib/Tk/TextUndo.pm new file mode 100644 index 00000000000..066e4027a3a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/TextUndo.pm @@ -0,0 +1,1022 @@ +# Copyright (c) 1995-2004 Nick Ing-Simmons. +# Copyright (c) 1999 Greg London. +# All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::TextUndo; + +use vars qw($VERSION $DoDebug); +$VERSION = '4.013'; # $Id: //depot/Tkutf8/Tk/TextUndo.pm#15 $ +$DoDebug = 0; + +use Tk qw (Ev); +use AutoLoader; + +use Tk::Text (); +use base qw(Tk::Text); + +Construct Tk::Widget 'TextUndo'; + +sub ClassInit +{ + my ($class,$mw) = @_; + $mw->bind($class,'<<Undo>>','undo'); + $mw->bind($class,'<<Redo>>','redo'); + + return $class->SUPER::ClassInit($mw); +} + + +#################################################################### +# methods for manipulating the undo and redo stacks. +# no one should directly access the stacks except for these methods. +# everyone else must access the stacks through these methods. +#################################################################### +sub ResetUndo +{ + my ($w) = @_; + delete $w->{UNDO}; + delete $w->{REDO}; +} + +sub PushUndo +{ + my $w = shift; + $w->{UNDO} = [] unless (exists $w->{UNDO}); + push(@{$w->{UNDO}},@_); +} + +sub PushRedo +{ + my $w = shift; + $w->{REDO} = [] unless (exists $w->{REDO}); + push(@{$w->{REDO}},@_); +} + +sub PopUndo +{ + my ($w) = @_; + return pop(@{$w->{UNDO}}) if defined $w->{UNDO}; + return undef; +} + +sub PopRedo +{ + my ($w) = @_; + return pop(@{$w->{REDO}}) if defined $w->{REDO}; + return undef; +} + +sub ShiftRedo +{ + my ($w) = @_; + return shift(@{$w->{REDO}}) if defined $w->{REDO}; + return undef; +} + +sub numberChanges +{ + my ($w) = @_; + return 0 unless (exists $w->{'UNDO'}) and (defined($w->{'UNDO'})); + return scalar(@{$w->{'UNDO'}}); +} + +sub SizeRedo +{ + my ($w) = @_; + return 0 unless exists $w->{'REDO'}; + return scalar(@{$w->{'REDO'}}); +} + +sub getUndoAtIndex +{ + my ($w,$index) = @_; + return undef unless (exists $w->{UNDO}); + return $w->{UNDO}[$index]; +} + +sub getRedoAtIndex +{ + my ($w,$index) = @_; + return undef unless (exists $w->{REDO}); + return $w->{REDO}[$index]; +} + +#################################################################### +# type "hello there" +# hello there_ +# hit UNDO +# hello_ +# type "out" +# hello out_ +# pressing REDO should not do anything +# pressing UNDO should make "out" disappear. +# pressing UNDO should make "there" reappear. +# pressing UNDO should make "there" disappear. +# pressing UNDO should make "hello" disappear. +# +# if there is anything in REDO stack and +# the OperationMode is normal, (i.e. not in the middle of an ->undo or ->redo) +# then before performing the current operation +# take the REDO stack, and put it on UNDO stack +# such that UNDO/REDO keystrokes will still make logical sense. +# +# call this method at the beginning of any overloaded method +# which adds operations to the undo or redo stacks. +# it will perform all the magic needed to handle the redo stack. +#################################################################### +sub CheckForRedoShuffle +{ + my ($w) = @_; + my $size_redo = $w->SizeRedo; + return unless $size_redo && ($w->OperationMode eq 'normal'); + # local $DoDebug = 1; + + # we are about to 'do' something new, but have something in REDO stack. + # The REDOs may conflict with new ops, but we want to preserve them. + # So convert them to UNDOs - effectively do them and their inverses + # so net effect on the widget is no-change. + + $w->dump_array('StartShuffle'); + + $w->OperationMode('REDO_MAGIC'); + $w->MarkSelectionsSavePositions; + + my @pvtundo; + + # go through REDO array from end downto 0, i.e. pseudo pop + # then pretend we did 'redo' get inverse, and push into UNDO array + # and 'do' the op. + for (my $i=$size_redo-1; $i>=0 ; $i--) + { + my ($op,@args) = @{$w->getRedoAtIndex($i)}; + my $op_undo = $op .'_UNDO'; + # save the inverse of the op on the UNDO array + # do this before the re-doing the op - after a 'delete' we cannot see + # text we deleted! + my $undo = $w->$op_undo(@args); + $w->PushUndo($undo); + # We must 'do' the operation now so if this is an insert + # the text and tags are available for inspection in delete_UNDO, and + # indices reflect changes. + $w->$op(@args); + # Save the undo that will reverse what we just did - it is + # on the undo stack but will be tricky to find + push(@pvtundo,$undo); + } + + # Now shift each item off REDO array until empty + # push each item onto UNDO array - this reverses the order + # and we are not altering buffer so we cannot look in the + # buffer to compute inverses - which is why we saved them above + + while ($w->SizeRedo) + { + my $ref = $w->ShiftRedo; + $w->PushUndo($ref); + } + + # Finally undo whatever we did to compensate for doing it + # and get buffer back to state it was before we started. + while (@pvtundo) + { + my ($op,@args) = @{pop(@pvtundo)}; + $w->$op(@args); + } + + $w->RestoreSelectionsMarkedSaved; + $w->OperationMode('normal'); + $w->dump_array('EndShuffle'); +} + +# sets/returns undo/redo/normal operation mode +sub OperationMode +{ + my ($w,$mode) = @_; + $w->{'OPERATION_MODE'} = $mode if (@_ > 1); + $w->{'OPERATION_MODE'} = 'normal' unless exists($w->{'OPERATION_MODE'}); + return $w->{'OPERATION_MODE'}; +} + +#################################################################### +# dump the undo and redo stacks to the screen. +# used for debug purposes. +sub dump_array +{ + return unless $DoDebug; + my ($w,$why) = @_; + print "At $why:\n"; + foreach my $key ('UNDO','REDO') + { + if (defined($w->{$key})) + { + print " $key array is:\n"; + my $array = $w->{$key}; + foreach my $ref (@$array) + { + my @items; + foreach my $item (@$ref) + { + my $loc = $item; + $loc =~ tr/\n/\^/; + push(@items,$loc); + } + print " [",join(',',@items),"]\n"; + } + } + } + print "\n"; +} + + +############################################################ +############################################################ +# these are a group of methods used to indicate the start and end of +# several operations that are to be undo/redo 'ed in a single step. +# +# in other words, "glob" a bunch of operations together. +# +# for example, a search and replace should be undone with a single +# keystroke, rather than one keypress undoes the insert and another +# undoes the delete. +# all other methods should access the count via these methods. +# no other method should directly access the {GLOB_COUNT} value directly +############################################################# +############################################################# + +sub AddOperation +{ + my ($w,@operation) = @_; + my $mode = $w->OperationMode; + + if ($mode eq 'normal') + {$w->PushUndo([@operation]);} + elsif ($mode eq 'undo') + {$w->PushRedo([@operation]);} + elsif ($mode eq 'redo') + {$w->PushUndo([@operation]);} + else + {die "invalid destination '$mode', must be one of 'normal', 'undo' or 'redo'";} +} + +sub addGlobStart # add it to end of undo list +{ + my ($w, $who) = @_; + unless (defined($who)) {$who = (caller(1))[3];} + $w->CheckForRedoShuffle; + $w->dump_array('Start'.$who); + $w->AddOperation('GlobStart', $who) ; +} + +sub addGlobEnd # add it to end of undo list +{ + my ($w, $who) = @_; + unless (defined($who)) {$who = (caller(1))[3];} + my $topundo = $w->getUndoAtIndex(-1); + if ($topundo->[0] eq 'GlobStart') + { + $w->PopUndo; + } + else + { + my $nxtundo = $w->getUndoAtIndex(-2); + if ($nxtundo->[0] eq 'GlobStart') + { + $w->PopUndo; + $w->PopUndo; + $w->PushUndo($topundo); + } + else + { + $w->AddOperation('GlobEnd', $who); + } + } + $w->dump_array('End'.$who); +} + +sub GlobStart +{ + my ($w, $who) = @_; + unless (defined($w->{GLOB_COUNT})) {$w->{GLOB_COUNT}=0;} + if ($w->OperationMode eq 'normal') + { + $w->PushUndo($w->GlobStart_UNDO($who)); + } + $w->{GLOB_COUNT} = $w->{GLOB_COUNT} + 1; +} + +sub GlobStart_UNDO +{ + my ($w, $who) = @_; + $who = 'GlobEnd_UNDO' unless defined($who); + return ['GlobEnd',$who]; +} + +sub GlobEnd +{ + my ($w, $who) = @_; + unless (defined($w->{GLOB_COUNT})) {$w->{GLOB_COUNT}=0;} + if ($w->OperationMode eq 'normal') + { + $w->PushUndo($w->GlobStart_UNDO($who)); + } + $w->{GLOB_COUNT} = $w->{GLOB_COUNT} - 1; +} + +sub GlobEnd_UNDO +{ + my ($w, $who) = @_; + $who = 'GlobStart_UNDO' unless defined($who); + return ['GlobStart',$who]; +} + +sub GlobCount +{ + my ($w,$count) = @_; + unless ( exists($w->{'GLOB_COUNT'}) and defined($w->{'GLOB_COUNT'}) ) + { + $w->{'GLOB_COUNT'}=0; + } + if (defined($count)) + { + $w->{'GLOB_COUNT'}=$count; + } + return $w->{'GLOB_COUNT'}; +} + +#################################################################### +# two methods should be used by applications to access undo and redo +# capability, namely, $w->undo; and $w->redo; methods. +# these methods undo and redo the last operation, respectively. +#################################################################### +sub undo +{ + my ($w) = @_; + $w->dump_array('Start'.'undo'); + unless ($w->numberChanges) {$w->bell; return;} # beep and return if empty + $w->GlobCount(0); #initialize to zero + $w->OperationMode('undo'); + do + { + my ($op,@args) = @{$w->PopUndo}; # get undo operation, convert ref to array + my $undo_op = $op .'_UNDO'; + $w->PushRedo($w->$undo_op(@args)); # find out how to undo it + $w->$op(@args); # do the operation + } while($w->GlobCount and $w->numberChanges); + $w->OperationMode('normal'); + $w->dump_array('End'.'undo'); +} + +sub redo +{ + my ($w) = @_; + unless ($w->SizeRedo) {$w->bell; return;} # beep and return if empty + $w->OperationMode('redo'); + $w->GlobCount(0); #initialize to zero + do + { + my ($op,@args) = @{$w->PopRedo}; # get op from redo stack, convert to list + my $undo_op = $op .'_UNDO'; + $w->PushUndo($w->$undo_op(@args)); # figure out how to undo operation + $w->$op(@args); # do the operation + } while($w->GlobCount and $w->SizeRedo); + $w->OperationMode('normal'); +} + + +############################################################ +# override low level subroutines so that they work with UNDO/REDO capability. +# every overridden subroutine must also have a corresponding *_UNDO subroutine. +# the *_UNDO method takes the same parameters in and returns an array reference +# which is how to undo itself. +# note that the *_UNDO must receive absolute indexes. +# ->insert receives 'markname' as the starting index. +# ->insert must convert 'markname' using $absindex=$w->index('markname') +# and pass $absindex to ->insert_UNDO. +############################################################ + +sub insert +{ + my $w = shift; + $w->markSet('insert', $w->index(shift) ); + while(@_) + { + my $index1 = $w->index('insert'); + my $string = shift; + my $taglist_ref = shift if @_; + + if ($w->OperationMode eq 'normal') + { + $w->CheckForRedoShuffle; + $w->PushUndo($w->insert_UNDO($index1,$string,$taglist_ref)); + } + $w->markSet('notepos' => $index1); + $w->SUPER::insert($index1,$string,$taglist_ref); + $w->markSet('insert', $w->index('notepos')); + } +} + +sub insert_UNDO +{ + my $w = shift; + my $index = shift; + my $string = ''; + # This possible call: ->insert (index, string, tag, string, tag...); + # if more than one string, keep reading strings in (discarding tags) + # until all strings are read in and $string contains entire text inserted. + while (@_) + { + $string .= shift; + my $tags = shift if (@_); + } + # calculate index + # possible things to insert: + # carriage return + # single character (not CR) + # single line of characters (not ending in CR) + # single line of characters ending with a CR + # multi-line characters. last line does not end with CR + # multi-line characters, last line does end with CR. + my ($line,$col) = split(/\./,$index); + if ($string =~ /\n(.*)$/) + { + $line += $string =~ tr/\n/\n/; + $col = length($1); + } + else + { + $col += length($string); + } + return ['delete', $index, $line.'.'.$col]; +} + +sub delete +{ + my ($w, $start, $stop) = @_; + unless(defined($stop)) + { $stop = $start .'+1c'; } + my $index1 = $w->index($start); + my $index2 = $w->index($stop); + if ($w->OperationMode eq 'normal') + { + $w->CheckForRedoShuffle; + $w->PushUndo($w->delete_UNDO($index1,$index2)); + } + $w->SUPER::delete($index1,$index2); + # why call SetCursor - it has side effects + # which cause a whole slew if save/restore hassles ? + $w->SetCursor($index1); +} + +sub delete_UNDO +{ + my ($w, $index1, $index2) = @_; + my %tags; + my @result = ( 'insert' => $index1 ); + my $str = ''; + + ############################################################### + # get tags in range and return them in a format that + # can be inserted. + # $text->insert('1.0', $string1, [tag1,tag2], $string2, [tag2, tag3]); + # note, have to break tags up into sequential order + # in reference to _all_ tags. + ############################################################### + + $w->dump('-text','-tag', -command => sub { + my ($kind,$value,$posn) = @_; + if ($kind eq 'text') + { + $str .= $value; + } + else + { + push(@result,$str,[keys %tags]) if (length $str); + $str = ''; + if ($kind eq 'tagon') + { + $tags{$value} = 1; + } + elsif ($kind eq 'tagoff') + { + delete $tags{$value}; + } + } + }, $index1, $index2); + push(@result,$str,[keys %tags]) if (length $str); + return \@result; +} + +############################################################ +# override subroutines which are collections of low level +# routines executed in sequence. +# wrap a globstart and globend around the SUPER:: version of routine. +############################################################ + +sub ReplaceSelectionsWith +{ + my $w = shift; + $w->addGlobStart; + $w->SUPER::ReplaceSelectionsWith(@_); + $w->addGlobEnd; +} + +sub FindAndReplaceAll +{ + my $w = shift; + $w->addGlobStart; + $w->SUPER::FindAndReplaceAll(@_); + $w->addGlobEnd; +} + +sub clipboardCut +{ + my $w = shift; + $w->addGlobStart; + $w->SUPER::clipboardCut(@_); + $w->addGlobEnd; +} + +sub clipboardPaste +{ + my $w = shift; + $w->addGlobStart; + $w->SUPER::clipboardPaste(@_); + $w->addGlobEnd; +} + +sub clipboardColumnCut +{ + my $w = shift; + $w->addGlobStart; + $w->SUPER::clipboardColumnCut(@_); + $w->addGlobEnd; +} + +sub clipboardColumnPaste +{ + my $w = shift; + $w->addGlobStart; + $w->SUPER::clipboardColumnPaste(@_); + $w->addGlobEnd; +} + +# Greg: this method is more tightly coupled to the base class +# than I would prefer, but I know of no other way to do it. + +sub Insert +{ + my ($w,$char)=@_; + return if $char eq ''; + $w->addGlobStart; + $w->SUPER::Insert($char); + $w->addGlobEnd; + $w->see('insert'); +} + + +sub InsertKeypress +{ + my ($w,$char)=@_; + return if $char eq ''; + if ($char =~ /^\S$/ and !$w->OverstrikeMode and !$w->tagRanges('sel')) + { + my $index = $w->index('insert'); + my $undo_item = $w->getUndoAtIndex(-1); + if (defined($undo_item) && + ($undo_item->[0] eq 'delete') && + ($undo_item->[2] == $index) + ) + { + $w->SUPER::insert($index,$char); + $undo_item->[2] = $w->index('insert'); + return; + } + } + $w->addGlobStart; + $w->SUPER::InsertKeypress($char); + $w->addGlobEnd; +} + +############################################################ +sub TextUndoFileProgress +{ + my ($w,$action,$filename,$count,$val,$total) = @_; + return unless(defined($filename) and defined($count)); + + my $popup = $w->{'FILE_PROGRESS_POP_UP'}; + unless (defined($popup)) + { + $w->update; + $popup = $w->Toplevel(-title => "File Progress",-popover => $w); + $popup->transient($w->toplevel); + $popup->withdraw; + $popup->resizable('no','no'); + $popup->Label(-textvariable => \$popup->{ACTION})->pack; + $popup->Label(-textvariable => \$popup->{FILENAME})->pack; + $popup->Label(-textvariable => \$popup->{COUNT})->pack; + my $f = $popup->Frame(-height => 10, -border => 2, -relief => 'sunken')->pack(-fill => 'x'); + my $i = $f->Frame(-background => 'blue', -relief => 'raised', -border => 2); + $w->{'FILE_PROGRESS_POP_UP'} = $popup; + $popup->{PROGBAR} = $i; + } + $popup->{ACTION} = $action; + $popup->{COUNT} = "lines: $count"; + $popup->{FILENAME} = "Filename: $filename"; + if (defined($val) && defined($total) && $total != 0) + { + $popup->{PROGBAR}->place('-x' => 0, '-y' => 0, -relheight => 1, -relwidth => $val/$total); + } + else + { + $popup->{PROGBAR}->placeForget; + } + + $popup->idletasks; + unless ($popup->viewable) + { + $w->idletasks; + $w->toplevel->deiconify unless $w->viewable; + $popup->Popup; + } + $popup->update; + return $popup; +} + +sub FileName +{ + my ($w,$filename) = @_; + if (@_ > 1) + { + $w->{'FILENAME'}=$filename; + } + return $w->{'FILENAME'}; +} + +sub PerlIO_layers +{ + my ($w,$layers) = @_; + $w->{PERLIO_LAYERS} = $layers if @_ > 1; + return $w->{PERLIO_LAYERS} || '' ; +} + +sub ConfirmDiscard +{ + my ($w)=@_; + if ($w->numberChanges) + { + my $ans = $w->messageBox(-icon => 'warning', + -type => 'YesNoCancel', -default => 'Yes', + -message => +"The text has been modified without being saved. +Save edits?"); + return 0 if $ans eq 'Cancel'; + return 0 if ($ans eq 'Yes' && !$w->Save); + } + return 1; +} + +################################################################################ +# if the file has been modified since being saved, a pop up window will be +# created, asking the user to confirm whether or not to exit. +# this allows the user to return to the application and save the file. +# the code would look something like this: +# +# if ($w->user_wants_to_exit) +# {$w->ConfirmExit;} +# +# it is also possible to trap attempts to delete the main window. +# this allows the ->ConfirmExit method to be called when the main window +# is attempted to be deleted. +# +# $mw->protocol('WM_DELETE_WINDOW'=> +# sub{$w->ConfirmExit;}); +# +# finally, it might be desirable to trap Control-C signals at the +# application level so that ->ConfirmExit is also called. +# +# $SIG{INT}= sub{$w->ConfirmExit;}; +# +################################################################################ + +sub ConfirmExit +{ + my ($w) = @_; + $w->toplevel->destroy if $w->ConfirmDiscard; +} + +sub Save +{ + my ($w,$filename) = @_; + $filename = $w->FileName unless defined $filename; + return $w->FileSaveAsPopup unless defined $filename; + my $layers = $w->PerlIO_layers; + if (open(my $file,">$layers",$filename)) + { + my $status; + my $count=0; + my $index = '1.0'; + my $progress; + my ($lines) = $w->index('end - 1 chars') =~ /^(\d+)\./; + while ($w->compare($index,'<','end')) + { +# my $end = $w->index("$index + 1024 chars"); + my $end = $w->index("$index lineend +1c"); + print $file $w->get($index,$end); + $index = $end; + if (($count++%1000) == 0) + { + $progress = $w->TextUndoFileProgress (Saving => $filename,$count,$count,$lines); + } + } + $progress->withdraw if defined $progress; + if (close($file)) + { + $w->ResetUndo; + $w->FileName($filename); + return 1; + } + } + else + { + $w->BackTrace("Cannot open $filename:$!"); + } + return 0; +} + +sub Load +{ + my ($w,$filename) = @_; + $filename = $w->FileName unless (defined($filename)); + return 0 unless defined $filename; + my $layers = $w->PerlIO_layers; + if (open(my $file,"<$layers",$filename)) + { + $w->MainWindow->Busy; + $w->EmptyDocument; + my $count=1; + my $progress; + while (<$file>) + { + $w->SUPER::insert('end',$_); + if (($count++%1000) == 0) + { + $progress = $w->TextUndoFileProgress (Loading => $filename, + $count,tell($file),-s $filename); + } + } + close($file); + $progress->withdraw if defined $progress; + $w->markSet('insert' => '1.0'); + $w->FileName($filename); + $w->MainWindow->Unbusy; + } + else + { + $w->BackTrace("Cannot open $filename:$!"); + } +} + +sub IncludeFile +{ + my ($w,$filename) = @_; + unless (defined($filename)) + {$w->BackTrace("filename not specified"); return;} + my $layers = $w->PerlIO_layers; + if (open(my $file,"<$layers",$filename)) + { + $w->Busy; + my $count=1; + $w->addGlobStart; + my $progress; + while (<$file>) + { + $w->insert('insert',$_); + if (($count++%1000) == 0) + { + $progress = $w->TextUndoFileProgress(Including => $filename, + $count,tell($file),-s $filename); + } + } + $progress->withdraw if defined $progress; + $w->addGlobEnd; + close($file); + $w->Unbusy; + } + else + { + $w->BackTrace("Cannot open $filename:$!"); + } +} + +# clear document without pushing it into UNDO array, (use SUPER::delete) +# (using plain delete(1.0,end) on a really big document fills up the undo array) +# and then clear the Undo and Redo stacks. +sub EmptyDocument +{ + my ($w) = @_; + $w->SUPER::delete('1.0','end'); + $w->ResetUndo; + $w->FileName(undef); +} + +sub ConfirmEmptyDocument +{ + my ($w)=@_; + $w->EmptyDocument if $w->ConfirmDiscard; +} + +sub FileMenuItems +{ + my ($w) = @_; + return [ + ["command"=>'~Open', -command => [$w => 'FileLoadPopup']], + ["command"=>'~Save', -command => [$w => 'Save' ]], + ["command"=>'Save ~As', -command => [$w => 'FileSaveAsPopup']], + ["command"=>'~Include', -command => [$w => 'IncludeFilePopup']], + ["command"=>'~Clear', -command => [$w => 'ConfirmEmptyDocument']], + "-",@{$w->SUPER::FileMenuItems} + ] +} + +sub EditMenuItems +{ + my ($w) = @_; + + return [ + ["command"=>'Undo', -command => [$w => 'undo']], + ["command"=>'Redo', -command => [$w => 'redo']], + "-",@{$w->SUPER::EditMenuItems} + ]; +} + +sub CreateFileSelect +{ + my $w = shift; + my $k = shift; + my $name = $w->FileName; + my @types = (['All Files', '*']); + my $dir = undef; + if (defined $name) + { + require File::Basename; + my $sfx; + ($name,$dir,$sfx) = File::Basename::fileparse($name,'\..*'); + # + # it should never happen where we have a file suffix and + # no file name... but fileparse() screws this up with dotfiles. + # + if (length($sfx) && !length($name)) { ($name, $sfx) = ($sfx, $name) } + + if (defined($sfx) && length($sfx)) + { + unshift(@types,['Similar Files',[$sfx]]); + $name .= $sfx; + } + } + return $w->$k(-initialdir => $dir, -initialfile => $name, + -filetypes => \@types, @_); +} + +sub FileLoadPopup +{ + my ($w)=@_; + my $name = $w->CreateFileSelect('getOpenFile',-title => 'File Load'); + return $w->Load($name) if defined($name) and length($name); + return 0; +} + +sub IncludeFilePopup +{ + my ($w)=@_; + my $name = $w->CreateFileSelect('getOpenFile',-title => 'File Include'); + return $w->IncludeFile($name) if defined($name) and length($name); + return 0; +} + +sub FileSaveAsPopup +{ + my ($w)=@_; + my $name = $w->CreateFileSelect('getSaveFile',-title => 'File Save As'); + return $w->Save($name) if defined($name) and length($name); + return 0; +} + + +sub MarkSelectionsSavePositions +{ + my ($w)=@_; + $w->markSet('MarkInsertSavePosition','insert'); + my @ranges = $w->tagRanges('sel'); + my $i = 0; + while (@ranges) + { + my ($start,$end) = splice(@ranges,0,2); + $w->markSet( 'MarkSelectionsSavePositions_'.++$i, $start); + $w->markSet( 'MarkSelectionsSavePositions_'.++$i, $end); + $w->tagRemove('sel',$start,$end); + } +} + +sub RestoreSelectionsMarkedSaved +{ + my ($w)=@_; + my $i = 1; + my %mark_hash; + foreach my $mark ($w->markNames) + { + $mark_hash{$mark}=1; + } + while(1) + { + my $markstart = 'MarkSelectionsSavePositions_'.$i++; + last unless(exists($mark_hash{$markstart})); + my $indexstart = $w->index($markstart); + my $markend = 'MarkSelectionsSavePositions_'.$i++; + last unless(exists($mark_hash{$markend})); + my $indexend = $w->index($markend); + $w->tagAdd('sel',$indexstart, $indexend); + $w->markUnset($markstart, $markend); + } + $w->markSet('insert','MarkInsertSavePosition'); +} + +#################################################################### +# selected lines may be discontinous sequence. +sub GetMarkedSelectedLineNumbers +{ + my ($w) = @_; + + my $i = 1; + my %mark_hash; + my @ranges; + foreach my $mark ($w->markNames) + { + $mark_hash{$mark}=1; + } + + while(1) + { + my $markstart = 'MarkSelectionsSavePositions_'.$i++; + last unless(exists($mark_hash{$markstart})); + my $indexstart = $w->index($markstart); + my $markend = 'MarkSelectionsSavePositions_'.$i++; + last unless(exists($mark_hash{$markend})); + my $indexend = $w->index($markend); + + push(@ranges, $indexstart, $indexend); + } + + my @selection_list; + while (@ranges) + { + my ($first) = split(/\./,shift(@ranges)); + my ($last) = split(/\./,shift(@ranges)); + # if previous selection ended on the same line that this selection starts, + # then fiddle the numbers so that this line number isnt included twice. + if (defined($selection_list[-1]) and ($first == $selection_list[-1])) + { + # if this selection ends on the same line its starts, then skip this sel + next if ($first == $last); + $first++; # count this selection starting from the next line. + } + push(@selection_list, $first .. $last); + } + return @selection_list; +} + +sub insertStringAtStartOfSelectedLines +{ + my ($w,$insert_string)=@_; + $w->addGlobStart; + $w->MarkSelectionsSavePositions; + foreach my $line ($w->GetMarkedSelectedLineNumbers) + { + $w->insert($line.'.0', $insert_string); + } + $w->RestoreSelectionsMarkedSaved; + $w->addGlobEnd; +} + +sub deleteStringAtStartOfSelectedLines +{ + my ($w,$insert_string)=@_; + $w->addGlobStart; + $w->MarkSelectionsSavePositions; + my $length = length($insert_string); + foreach my $line ($w->GetMarkedSelectedLineNumbers) + { + my $start = $line.'.0'; + my $end = $line.'.'.$length; + my $current_text = $w->get($start, $end); + next unless ($current_text eq $insert_string); + $w->delete($start, $end); + } + $w->RestoreSelectionsMarkedSaved; + $w->addGlobEnd; +} + + +1; +__END__ + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Tiler.pm b/Master/tlpkg/tlperl.old/lib/Tk/Tiler.pm new file mode 100644 index 00000000000..1256612f801 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Tiler.pm @@ -0,0 +1,203 @@ +# Copyright (c) 1995-2004 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +# An example of a geometry manager "widget" in perl +package Tk::Tiler; +require Tk; +require Tk::Frame; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #12 $ =~ /\D(\d+)\s*$/; + +use base qw(Tk::Frame); + +Construct Tk::Widget 'Tiler'; +sub Tk::Widget::ScrlTiler { shift->Scrolled('Tiler' => @_) } + +use Tk::Pretty; + +sub FocusChildren +{ + return (wantarray) ? () : 0; +} + +sub Populate +{ + my ($obj,$args) = @_; + $obj->SUPER::Populate($args); + $obj->{Slaves} = []; + $obj->{LayoutPending} = 0; + $obj->{Start} = 0; + $obj->{Sw} = 0; + $obj->{Sh} = 0; + $obj->ConfigSpecs('-takefocus' => ['SELF', 'takeFocus','TakeFocus',1], + '-highlightthickness' => ['SELF', 'highlightThickness','HighlightThickness',2], + '-yscrollcommand' => ['CALLBACK',undef,undef,undef], + '-columns' => ['PASSIVE','columns','Columns',5], + '-rows' => ['PASSIVE','rows','Rows',10] + ); + return $obj; +} + +sub change_size +{ + my ($w) = shift; + my $r = $w->cget('-rows'); + my $c = $w->cget('-columns'); + my $bw = $w->cget(-highlightthickness); + if (defined $r && defined $c) + { + $w->GeometryRequest($c*$w->{Sw}+2*$bw,$r*$w->{Sh}+2*$bw); + } +} + +sub Layout +{ + my $m = shift; + my $bw = $m->cget(-highlightthickness); + my $why = $m->{LayoutPending}; + $m->{LayoutPending} = 0; + my $W = $m->Width; + my $H = $m->Height; + my $w = $m->{Sw} || 1; # max width of slave + my $h = $m->{Sh} || 1; # max height of slave + my $x = $bw; + my $y = $bw; + my $start = 0; + # Set size and position of slaves + my $rows = $m->{Rows} = int(($H-2*$bw)/$h) || 1; + my $cols = $m->{Cols} = int(($W-2*$bw)/$w) || 1; + my $need = $m->{Need} = int( (@{$m->{Slaves}}+$cols-1)/$cols ); + $m->{Start} = ($need - $rows) if ($m->{Start} + $rows > $need); + + $m->{Start} = 0 if ($m->{Start} < 0); + my $row = 0; + my @posn = (); + my $s; + foreach $s (@{$m->{Slaves}}) + { + if ($row < $m->{Start}) + { + $s->UnmapWindow; + $x += $w; + if ($x+$w+$bw > $W) + { + $x = $bw; + $row++; + } + } + elsif ($y+$h+$bw > $H) + { + $s->UnmapWindow; + $s->ResizeWindow($w,$h) if ($why & 1); + } + else + { + push(@posn,[$s,$x,$y]); + $x += $w; + if ($x+$w+$bw > $W) + { + $x = $bw; + $y += $h; + $row++; + } + } + $s->ResizeWindow($w,$h) if ($why & 1); + } + $row++ if ($x > $bw); + if (defined $m->{Prev} && $m->{Prev} > $m->{Start}) + { + @posn = reverse(@posn); + } + while (@posn) + { + my $posn = shift(@posn); + my ($s,$x,$y) = (@$posn); + $s->MoveWindow($x,$y); + $s->MapWindow; + } + $m->{Prev} = $m->{Start}; + $m->Callback(-yscrollcommand => $m->{Start}/$need,$row/$need) if $need; +} + +sub QueueLayout +{ + my ($m,$why) = @_; + $m->afterIdle(['Layout',$m]) unless ($m->{LayoutPending}); + $m->{LayoutPending} |= $why; +} + +sub SlaveGeometryRequest +{ + my ($m,$s) = @_; + my $sw = $s->ReqWidth; + my $sh = $s->ReqHeight; + my $sz = 0; + if ($sw > $m->{Sw}) + { + $m->{Sw} = $sw; + $m->QueueLayout(1); + $sz++; + } + if ($sh > $m->{Sh}) + { + $m->{Sh} = $sh; + $m->QueueLayout(1); + $sz++; + } + $m->change_size if ($sz); +} + +sub LostSlave +{ + my ($m,$s) = @_; + @{$m->{Slaves}} = grep($_ != $s,@{$m->{Slaves}}); + $m->QueueLayout(2); +} + +sub Manage +{ + my $m = shift; + my $s; + foreach $s (@_) + { + $m->ManageGeometry($s); + push(@{$m->{Slaves}},$s); + $m->SlaveGeometryRequest($s); + } + $m->QueueLayout(2 | 1); +} + +sub moveto + { + my ($m,$frac) = (@_); + $m->{Start} = int($m->{Need} * $frac); + $m->QueueLayout(4); + } + +sub scroll + { + my ($m,$delta,$type) = @_; + $delta *= $m->{Rows}/2 if ($type eq 'pages'); + $m->{Start} += $delta; + $m->QueueLayout(4); + } + +sub yview { my $w = shift; my $c = shift; $w->$c(@_) } + +sub FocusIn +{ + my ($w) = @_; +# print 'Focus ',$w->PathName,"\n"; +} + +sub ClassInit +{ + my ($class,$mw) = @_; + $mw->bind($class,'<Configure>',['QueueLayout',8]); + $mw->bind($class,'<FocusIn>', 'NoOp'); + $mw->YscrollBind($class); + return $class; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/TixGrid.pm b/Master/tlpkg/tlperl.old/lib/Tk/TixGrid.pm new file mode 100644 index 00000000000..2dd238095f3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/TixGrid.pm @@ -0,0 +1,1597 @@ + +# TODO: +# +# o How to get into state 's0' 'b0' so cursor keys start +# working (compare with Tk/Widget XYscrollBind +# o the options -browsecmd and -command callback are not +# not implemented (as in Tix) +# o privateData 'state' used only once (check again Grid.tcl) +# o FloatEntry 'sometimes not activeted immediately on selection +# o check also Leave Binding. Looks like entry does get unpost'ed + +package Tk::TixGrid; + +BEGIN + { + use vars '$DEBUG'; + $DEBUG = (defined($ENV{USER}) and $ENV{USER} eq 'ach') ? 1 : 0; + print STDERR "tixGrid: debug = $DEBUG\n" if $DEBUG; + } + +use strict; +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #9 $ =~ /\D(\d+)\s*$/; + +use Tk qw(Ev $XS_VERSION); +use Tk::Widget; +use Carp; + +# carp "\n".__PACKAGE__.' is deprecated' unless defined($Test::ntest); + +use base 'Tk::Widget'; + +Construct Tk::Widget 'TixGrid'; + +bootstrap Tk::TixGrid; + +sub Tk_cmd { \&Tk::tixGrid } + +sub Tk::Widget::SrclTixGrid { shift->Scrolled('TixGrid' => @_) } + +Tk::Methods qw(anchor bdtype delete entrycget entryconfigure format index + move set size unset xview yview + dragsite dropsite geometryinfo info + nearest see selection sort ); + +use Tk::Submethods + ( + 'anchor' => [ qw(get set) ], + 'delete' => [ qw(column row) ], + 'info' => [ qw(bbox exists anchor) ], + 'move' => [ qw(column row) ], + 'selection' => [ qw(adjust clear includes set) ], + 'size' => [ qw(column row) ], + 'format' => [ qw(grid border) ], + ); + +# edit subcommand is special. It justs invokes tcl code: +# +# edit set x y -> tixGrid:EditCell $w, x, y +# edit apply -> tixGrid:EditApply + +# xxx Create an edit sub? +# sub edit { .... } + +sub editSet + { + die "wrong args. Should be \$w->editSet(x,y)\n" unless @_ == 3; + my ($w, $x, $y) = @_; + $w->EditCell($x, $y); + } + +sub editApply + { + die "wrong args. Should be \$w->editApply()\n" unless @_ == 1; + my ($w) = @_; + $w->EditApply() + } + + +#################################################### +## +## For button 2 scrolling. So TixGrid has 'standard' +## standard scrolling interface +## + +#sub scanMark +# { +# die "wrong # args: \$w->scanMark(x,y)\n" unless @_ == 3; +# my ($w) = @_; +# $w->{__scanMarkXY__} = [ @_[1,2] ]; +# return ""; +# } +# +#sub scanDragto +# { +# die "wrong # args: \$w->scanDragto(x,y)\n" unless @_ == 3; +# my ($w, $x, $y) = @_; +# my ($ox, $oy) = @{ $w->{__scanMarkXY__} }; +# +# #... +# +# return ""; +# } + +### end button 2 scrolling stuff #################### + + +# Grid.tcl -- +# +# This file defines the default bindings for Tix Grid widgets. +# +# Copyright (c) 1996, Expert Interface Technologies +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +# Bindings translated to perl/Tk by Achim Bohnet <ach@mpe.mpg.de> + +sub ClassInit + { + my ($class, $mw) = @_; + $class->SUPER::ClassInit($mw); + + $mw->XYscrollBind($class); + + ## + ## Button bindings + ## + + $mw->bind($class, '<ButtonPress-1>', ['Button_1', Ev('x'), Ev('y')]); + $mw->bind($class, '<Shift-ButtonPress-1>', ['Shift_Button_1', Ev('x'), Ev('y')]); + $mw->bind($class, '<Control-ButtonPress-1>',['Control_Button_1', Ev('x'), Ev('y')]); + $mw->bind($class, '<ButtonRelease-1>', ['ButtonRelease_1', Ev('x'), Ev('y')]); + $mw->bind($class, '<Double-ButtonPress-1>', ['Double_1', Ev('x'), Ev('y')]); + $mw->bind($class, '<B1-Motion>','Button_Motion'); + $mw->bind($class, '<Control-B1-Motion>','Control_Button_Motion'); + $mw->bind($class, '<B1-Leave>','Button_Leave'); + $mw->bind($class, '<Double-ButtonPress-1>', ['Double_1', Ev('x'), Ev('y')]); + $mw->bind($class, '<B1-Enter>', ['B1_Enter', Ev('x'), Ev('y')]); + $mw->bind($class, '<Control-B1-Leave>','Control_Button_Leave'); + $mw->bind($class, '<Control-B1-Enter>', ['Control_B1_Enter', Ev('x'), Ev('y')]); + + ## + ## Keyboard bindings + ## + + $mw->bind($class, '<Up>', ['DirKey', 'up' ]); + $mw->bind($class, '<Down>', ['DirKey', 'down' ]); + $mw->bind($class, '<Left>', ['DirKey', 'left' ]); + $mw->bind($class, '<Right>', ['DirKey', 'right' ]); + + $mw->PriorNextBind($class); + + $mw->bind($class, '<Return>', 'Return'); + $mw->bind($class, '<space>', 'Space' ); + + return $class; + } + +#---------------------------------------------------------------------- +# +# +# Mouse bindings +# +# +#---------------------------------------------------------------------- + +sub Button_1 + { + my $w = shift; + + return if $w->cget('-state') eq 'disabled'; + $w->SetFocus; + $w->ChgState(@_, + [ + '0'=>'1', + ] + ); + } + +sub Shift_Button_1 + { + my $w = shift; + + return if $w->cget('-state') eq 'disabled'; + $w->SetFocus; + +# $w->ChgState(@_, +# [ +# ] +# ); + } + +sub Control_Button_1 + { + my $w = shift; + + return if $w->cget('-state') eq 'disabled'; + $w->SetFocus; + + $w->ChgState(@_, + [ + 's0' => 's1', + 'b0' => 'b1', + 'm0' => 'm1', + 'e0' => 'e10', + ] + ); + } + +sub ButtonRelease_1 + { + shift->ChgState(@_, + [ + '2' => '5', + '4' => '3', + ] + ); + } + +sub B1_Motion + { + shift->ChgState(@_, + [ + '2' => '4', + '4' => '4', + ] + ); + } + + +sub Control_B1_Motion + { + shift->ChgState(@_, + [ + 's2' => 's4', + 's4' => 's4', + 'b2' => 'b4', + 'b4' => 'b4', + 'm2' => 'm4', + 'm5' => 'm4', + ] + ); + } + + +sub Double_1 + { + shift->ChgState(@_, + [ + 's0' => 's7', + 'b0' => 'b7', + ] + ); + } + + +sub B1_Leave + { + shift->ChgState(@_, + [ + 's2' => 's5', + 's4' => 's5', + 'b2' => 'b5', + 'b4' => 'b5', + 'm2' => 'm8', + 'm5' => 'm8', + 'e2' => 'e8', + 'e5' => 'e8', + ] + ); + } + + +sub B1_Enter + { + shift->ChgState(@_, + [ + 's5' => 's4', + 's6' => 's4', + 'b5' => 'b4', + 'b6' => 'b4', + 'm8' => 'm4', + 'm9' => 'm4', + 'e8' => 'e4', + 'e9' => 'e4', + ] + ); + } + + +sub Control_B1_Leave + { + shift->ChgState(@_, + [ + 's2' => 's5', + 's4' => 's5', + 'b2' => 'b5', + 'b4' => 'b5', + 'm2' => 'm8', + 'm5' => 'm8', + ] + ); + } + + +sub Control_B1_Enter + { + shift->ChgState(@_, + [ + 's5' => 's4', + 's6' => 's4', + 'b5' => 'b4', + 'b6' => 'b4', + 'm8' => 'm4', + 'm9' => 'm4', + ] + ); + } + + +sub AutoScan + { + shift->ChgState(@_, + [ + 's5' => 's9', + 's6' => 's9', + 'b5' => 'b9', + 'b6' => 'b9', + 'm8' => 'm9', + 'm9' => 'm9', + 'e8' => 'm9', + 'e9' => 'm9', + ] + ); + } + +#---------------------------------------------------------------------- +# +# +# Key bindings +# +# +#---------------------------------------------------------------------- + +sub DirKey + { + my ($w, $key) = @_; + + return if $w->cget('-state') eq 'disabled'; + +print STDERR "$w->DirKey($key)\n" if $DEBUG; + $w->ChgState($key, + [ + 's0' => 's8', + 'b0' => 'b8', + ] + ); + } + + +sub Return + { + my ($w) = @_; + + return if $w->cget('-state') eq 'disabled'; + + $w->ChgState( + [ + 's0' => 's9', + 'b0' => 'b9', + ] + ); + } + + +sub Space + { + my ($w) = @_; + + return if $w->cget('-state') eq 'disabled'; + + $w->ChgState( + [ + 's0' => 's10', + 'b0' => 'b10', + ] + ); + } + + +#---------------------------------------------------------------------- +# +# STATE MANIPULATION +# +# +#---------------------------------------------------------------------- + +sub GetState + { + my ($w) = @_; + my $data = $w->privateData(); + $data->{state} = 0 unless exists $data->{state}; + return $data->{state}; +} + +sub Button_Motion +{ + my $w = shift; + my $Ev = $w->XEvent; + $Tk::x = $Ev->x; + $Tk::y = $Ev->y; + $Tk::X = $Ev->X; + $Tk::Y = $Ev->Y; + $w->B1_Motion($Tk::x, $Tk::y); +} + + +sub Control_Button_Motion +{ + my $w = shift; + my $Ev = $w->XEvent; + $Tk::x = $Ev->x; + $Tk::y = $Ev->y; + $Tk::X = $Ev->X; + $Tk::Y = $Ev->Y; + $w->Control_B1_Motion($Tk::x, $Tk::y); +} + + +sub Button_Leave +{ + my $w = shift; + my $Ev = $w->XEvent; + $Tk::x = $Ev->x; + $Tk::y = $Ev->y; + $Tk::X = $Ev->X; + $Tk::Y = $Ev->Y; + $w->B1_Leave(); +} + + +sub Control_Button_Leave +{ + my $w = shift; + my $Ev = $w->XEvent; + $Tk::x = $Ev->x; + $Tk::y = $Ev->y; + $Tk::X = $Ev->X; + $Tk::Y = $Ev->Y; + $w->Control_B1_Leave(); +} + + +sub SetState + { + my ($w, $state) = @_; + $w->privateData()->{state} = $state; + } + +sub GoState + { + my ($w, $state) = (shift, shift); + print STDERR 'Gostate: ', $w->GetState, " --> $state, " if $DEBUG; + $w->SetState($state); + my $method = "GoState_$state"; + + print STDERR 'args=(', join(',',@_), ')'. + "\t(",$w->cget('-selectmode'). + ',',$w->cget('-selectunit').")\n" if $DEBUG; + + if (0) + { + $@ = ''; + %@ = (); # Workaround to prevent spurious loss of $@ + eval { $w->$method(@_) }; + print STDERR "Error Gostate: '$state': ", $@ if $@; + return undef; + } + + $w->$method(@_); + return undef + } + +## +## ChgState is a fancy case statement +## + +sub ChgState + { + my $w = shift; + my $map = pop; + print STDERR 'ChgState(', join(',',@_,'['), join(',',@$map,),']) ' if $DEBUG; + my $state = $w->GetState; + + my ($match, $to); + while (@$map) + { + $match = shift @$map; + $to = shift @$map; + if ($match eq $state) + { + print STDERR "$state --> $to \n" if $DEBUG; + $w->GoState($to, @_); + return; + } + } + print STDERR "*no* chg for $state\n" if $DEBUG; + } + + +#---------------------------------------------------------------------- +# SELECTION ROUTINES +#---------------------------------------------------------------------- + +#proc tixGrid:SelectSingle {w ent} { +# $w selection set [lindex $ent 0] [lindex $ent 1] +# tixGrid:CallBrowseCmd $w $ent +#} + +sub SelectSingle + { + my ($w, $n1, $n2) = @_; + $w->selection('set', $n1, $n2); + $w->Callback('-browsecmd' => $n1, $n2); + } + +#---------------------------------------------------------------------- +# SINGLE SELECTION +#---------------------------------------------------------------------- + +sub GoState_0 + { + my ($w) = @_; + my $list = $w->privateData()->{list}; + return unless defined $list; + + foreach my $cmd (@$list) + { + # XXX should do more something like $w->Callback'('__pending_cmds__'); + eval $cmd; # XXX why in tcl in global context (binding?) + } + undef(@$list); # XXX should really delete? Maybe on needed in TCL + } + +# XXXX how to translate global context +# what does unset +#proc tixGrid:GoState-0 {w} { +# set list $w:_list +# global $list +# +# if [info exists $list] { +# foreach cmd [set $list] { +# uplevel #0 $cmd +# } +# if [info exists $list] { +# unset $list +# } +# } +#} + +sub GoState_1 + { + my ($w, $x, $y) = @_; + + my @ent = $w->mynearest($x,$y); + if (@ent) + { + $w->SetAnchor(@ent); + } + $w->CheckEdit; + $w->selection('clear', 0, 0, 'max', 'max'); + + if ($w->cget('-selectmode') ne 'single') + { + $w->SelectSingle(@ent); + } + $w->GoState(2); + } + +sub GoState_2 + { + my ($w) = @_; + } + +sub GoState_3 + { + my ($w, $x, $y) = @_; + + my @ent = $w->mynearest($x,$y); + if (@ent) + { + $w->SelectSingle(@ent); + } + $w->GoState(0); + + } + +sub GoState_4 + { + my ($w, $x, $y) = @_; + + my (@ent) = $w->mynearest($x,$y); + my $mode = $w->cget('-selectmode'); + + if ($mode eq 'single') + { + $w->SetAnchor(@ent); + } + elsif ($mode eq 'browse') + { + $w->SetAnchor(@ent); + $w->selection('clear', 0, 0, 'max', 'max'); + $w->SelectSingle(@ent); + } + elsif ($mode eq 'multiple' || + $mode eq 'extended') + { + my (@anchor) = $w->anchor('get'); + $w->selection('adjust', @anchor[0,1], @ent[0,1]); + } + } + +sub GoState_5 + { + my ($w, $x, $y) = @_; + + my @ent = $w->mynearest($x,$y); + if (@ent) + { + $w->SelectSingle(@ent); + $w->SetEdit(@ent); + } + $w->GoState(0); + + } + +############################################## +# BUG xxx +# return scalar instead of errors + +sub mynearest { shift->split_s2a('nearest', @_); } +sub myanchorGet { shift->split_s2a('anchor', 'get', @_); } + +sub split_s2a + { + my $w = shift; + my $method = shift; + my @ent = $w->$method(@_); + if (@ent == 1) + { +my $tmp = $ent[0]; + @ent = split(/ /, $ent[0]) if @ent == 1; +print STDERR join('|',"$method splitted '$tmp' =>",@ent,"\n") if $DEBUG; + } + else + { +#print STDERR join("|","$method splitted is okay :",@ent,"\n") if $DEBUG; + } + return @ent; + } + +############################################## + + +sub GoState_s5 + { + shift->StartScan(); + } + + +sub GoState_s6 + { + shift->DoScan(); + } + + +sub GoState_s7 + { + my ($w, $x, $y) = @_; + + my @ent = $w->mynearest($x, $y); + if (@ent) + { + $w->selection('clear'); + $w->selection('set', @ent); + $w->Callback('-command' => @ent); + } + $w->GoState('s0'); + } + + +sub GoState_s8 + { + my ($w, $key) = @_; + + ## BUGS .... + ## - anchor is bad, only bbox, exists8 + ## - looks like anchor is 1-dim: set anchor 0 + ## - method see unknown (even when defined with Tk::Method) + + my (@anchor) = $w->info('anchor'); + if (@anchor) + { + @anchor = (); + } + else + { + @anchor = $w->info($key, @anchor); + } + + $w->anchor('set', @anchor); + $w->see(@anchor); + + $w->GoState('s0'); + } + +#proc tixGrid:GoState-s8 {w key} { +# set anchor [$w info anchor] +# +# if {$anchor == ""} { +# set anchor 0 +# } else { +# set anchor [$w info $key $anchor] +# } +# +# $w anchor set $anchor +# $w see $anchor +# tixGrid:GoState s0 $w +#} + + +sub GoState_s9 + { + my ($w, $key) = @_; + +#print STDERR "GoState_s9 is not implemented\n"; + + my (@anchor) = $w->info('anchor'); + unless (@anchor) + { + @anchor = (); + $w->anchor('set', @anchor); + $w->see(@anchor); + } + + unless ($w->info('anchor')) + { + # ! may not have any elements + # + $w->Callback('-command' => $w->info('anchor')); + $w->selection('clear'); + $w->selection('set', @anchor); + } + + $w->GoState('s0'); + } + + +sub GoState_s10 + { + my ($w, $key) = @_; + + my (@anchor) = $w->info('anchor'); + if (@anchor) + { + @anchor = (); + $w->anchor('set', @anchor); + $w->see(@anchor); + } + + unless ($w->info('anchor')) + { + # ! may not have any elements + # + $w->Callback('-browsecmd' => $w->info('anchor')); + $w->selection('clear'); + $w->selection('set', @anchor); + } + + $w->GoState('s0'); + } + + +#---------------------------------------------------------------------- +# BROWSE SELECTION +#---------------------------------------------------------------------- + +sub GoState_b0 + { + my ($w) = @_; + } + +sub GoState_b1 + { + my ($w, $x, $y) = @_; + + my (@ent) = $w->mynearest($x, $y); + if (@ent) + { + $w->anchor('set', @ent); + $w->selection('clear'); + $w->selection('set', @ent); + $w->Callback('-browsecmd' => @ent); + } + + $w->GoState('b2'); + } + +sub GoState_b2 + { + my ($w) = @_; + } + +sub GoState_b3 + { + my ($w) = @_; + + my (@ent) = $w->info('anchor'); + if (@ent) + { + $w->selection('clear'); + $w->selection('set', @ent); + $w->selection('set', @ent); + $w->Callback('-browsecmd' => @ent); + } + + $w->GoState('b0'); + } + + +sub GoState_b4 + { + my ($w, $x, $y) = @_; + + my (@ent) = $w->mynearest($x, $y); + if (@ent) + { + $w->anchor('set', @ent); + $w->selection('clear'); + $w->selection('set', @ent); + $w->Callback('-browsecmd' => @ent); + } + } + + +sub GoState_b5 { shift->StartScan(); } + + +sub GoState_b6 { shift->DoScan(); } + + +sub GoState_b7 + { + my ($w, $x, $y) = @_; + + my (@ent) = $w->mynearest($x, $y); + if (@ent) + { + $w->selection('clear'); + $w->selection('set', @ent); + $w->Callback('-command' => @ent); + } + $w->GoState('b0'); + } + + +sub GoState_b8 + { + my ($w, $key) = @_; + + my (@anchor) = $w->info('anchor'); + if (@anchor) + { + @anchor = $w->info('key', @anchor); + } + else + { + @anchor = (0,0); # ????? + } + + $w->anchor('set', @anchor); + $w->selection('clear'); + $w->selection('set', @anchor); + $w->see(@anchor); + + $w->Callback('-browsecmd' => @anchor); + $w->GoState('b0'); + } + + +sub GoState_b9 + { + my ($w) = @_; + + my (@anchor) = $w->info('anchor'); + unless (@anchor) + { + @anchor = (0,0); + $w->anchor('set', @anchor); + $w->see(@anchor); + } + + if ($w->info('anchor')) + { + # ! may not have any elements + # + $w->Callback('-command' => $w->info('anchor')); + $w->selection('clear'); + $w->selection('set', @anchor); + } + + $w->GoState('b0'); + } + + +sub GoState_b10 + { + my ($w) = @_; + + my (@anchor) = $w->info('anchor'); + unless (@anchor) + { + @anchor = (0,0); + $w->anchor('set', @anchor); + $w->see(@anchor); + } + + if ($w->info('anchor')) + { + # ! may not have any elements + # + $w->Callback('-browsecmd' => $w->info('anchor')); + $w->selection('clear'); + $w->selection('set', @anchor); + } + + $w->GoState('b0'); + } + +#---------------------------------------------------------------------- +# MULTIPLE SELECTION +#---------------------------------------------------------------------- + + +sub GoState_m0 + { + my ($w) = @_; + } + +sub GoState_m1 + { + my ($w, $x, $y) = @_; + + my (@ent) = $w->mynearest($x,$y); + if (@ent) + { + $w->anchor('set', @ent); + $w->selection('clear'); + $w->selection('set', @ent); + $w->Callback('-browsecmd' => @ent); + } + + $w->GoState('m2'); + } + +sub GoState_m2 + { + my ($w) = @_; + } + +sub GoState_m3 + { + my ($w) = @_; + + my (@ent) = $w->info('anchor'); + if (@ent) + { + $w->Callback('-browsecmd' => @ent); + } + + $w->GoState('m0'); + } + + +sub GoState_m4 + { + my ($w, $x, $y) = @_; + + my (@from) = $w->info('anchor'); + my (@to) = $w->mynearest($x, $y); + if (@to) + { + $w->selection('clear'); + $w->selection('set', @from, @to); + $w->Callback('-browsecmd' => @to); + } + $w->GoState('m5'); + } + +sub GoState_m5 + { + my ($w) = @_; + } + +sub GoState_m6 + { + my ($w, $x, $y) = @_; + + my (@ent) = $w->mynearest($x, $y); + if (@ent) + { + $w->Callback('-browsecmd' => @ent); + } + $w->GoState('m0'); + } + +sub GoState_m7 + { + my ($w, $x, $y) = @_; + + my (@from) = $w->info('anchor'); + my (@to) = $w->mynearest($x, $y); + unless (@from) + { + @from = @to; + $w->anchor('set', @from); + } + if (@to) + { + $w->selection('clear'); + $w->selection('set', @from, @to); + $w->Callback('-browsecmd' => @to); + } + $w->GoState('m5'); + } + + +sub GoState_m8 { shift->StartScan() } + + +sub GoState_m9 { shift->DoScan() } + + +sub GoState_xm7 + { + my ($w, $x, $y) = @_; + + my (@ent) = $w->mynearest($x, $y); + if (@ent) + { + $w->selection('clear'); + $w->selection('set', @ent); + $w->Callback('-browsecmd' => @ent); + } + $w->GoState('m0'); + } + +#---------------------------------------------------------------------- +# EXTENDED SELECTION +#---------------------------------------------------------------------- + +sub GoState_e0 + { + my ($w) = @_; + } + +sub GoState_e1 + { + my ($w, $x, $y) = @_; + my (@ent) = $w->mynearest($x, $y); + if (@ent) + { + $w->anchor('set', @ent); + $w->selection('clear'); + $w->selection('set', @ent); + $w->Callback('-browsecmd' => @ent); + } + $w->GoState('e2'); + } + + +sub GoState_e2 + { + my ($w) = @_; + } + +sub GoState_e3 + { + my ($w) = @_; + + my (@ent) = $w->info('anchor'); + if (@ent) + { + $w->Callback('-browsecmd' => @ent); + } + $w->GoState('e0'); + } + +sub GoState_e4 + { + my ($w, $x, $y) = @_; + + my (@from) = $w->info('anchor'); + my (@to) = $w->mynearest($x, $y); + if (@to) + { + $w->selection('clear'); + $w->selection('set', @from, @to); + $w->Callback('-browsecmd' => @to); + } + $w->GoState('e5'); + } + +sub GoState_e5 + { + my ($w) = @_; + } + +sub GoState_e6 + { + my ($w, $x, $y) = @_; + + my (@ent) = $w->mynearest($x, $y); + if (@ent) + { + $w->Callback('-browsecmd' => @ent); + } + $w->GoState('e0'); + } + +sub GoState_e7 + { + my ($w, $x, $y) = @_; + + my (@from) = $w->info('anchor'); + my (@to) = $w->mynearest($x, $y); + unless (@from) + { + @from = @to; + $w->anchor('set', @from); + } + if (@to) + { + $w->selection('clear'); + $w->selection('set', @from, @to); + $w->Callback('-browsecmd' => @to); + } + $w->GoState('e5'); + } + +sub GoState_e8 { shift->StartScan(); } + +sub GoState_e9 { shift->DoScan(); } + +sub GoState_e10 + { + my ($w, $x, $y) = @_; + + my (@ent) = $w->mynearest($x, $y); + if (@ent) + { + if ($w->info('anchor')) + { + $w->anchor('set', @ent); + } + if ($w->selection('includes', @ent)) + { + $w->selection('clear', @ent); + } + else + { + $w->selection('set', @ent); + } + $w->Callback('-browsecmd' => @ent); + } + $w->GoState('e2'); + } + +sub GoState_xe7 + { + my ($w, $x, $y) = @_; + + my (@ent) = $w->mynearest($x, $y); + if (@ent) + { + $w->selection('clear'); + $w->selection('set', @ent); + $w->Callback('-command' => @ent); + } + $w->GoState('e0'); + } + + +#---------------------------------------------------------------------- +# HODGE PODGE +#---------------------------------------------------------------------- + +sub GoState_12 + { + my ($w, $x, $y) = @_; + + $w->CancelRepeat; # xxx will not work + $w->GoState(5, $x, $y); + } +#proc tixGrid:GoState-12 {w x y} { +# tkCancelRepeat +# tixGrid:GoState 5 $w $x $y +#} + +sub GoState_13 + { + # FIX: a) $ent or @ent, b) 13 is never called!!? same in Grid.tcl + my ($w, @ent, @oldEnt) = @_; + + my $data = $w->MainWindow->privateData('Tix'); + $data->{indicator} = \@ent; + $data->{oldEntry} = \@oldEnt; + $w->IndicatorCmd('<Arm>', @ent); + } +# set tkPriv(tix,oldEnt) $oldEnt +# tixGrid:IndicatorCmd $w <Arm> $ent +#} + +sub GoState_14 + { + my ($w, $x, $y) = @_; + + my $data = $w->MainWindow->privateData('Tix'); + if ($w->InsideArmedIndicator($x, $y)) + { + $w->anchor('set', @{ $data->{indicator} }); + $w->selection('clear'); + $w->selection('set', @{ $data->{indicator} }); + $w->IndicatorCmd('<Activate>', @{ $data->{indicator} }); + } + else + { + $w->IndicatorCmd('<Disarm>', @{ $data->{indicator} }); + } + delete($data->{indicator}); + $w->GoState(0); + } + +sub GoState_16 + { + my ($w, @ent) = @_; + + return unless (@ent); + if ($w->cget('-selectmode') ne 'single') + { + $w->Select(@ent); + $w->Browse(@ent); + } + } + +sub GoState_18 + { + my ($w) = @_; + + $w->CancelRepeat; ## xxx + $w->GoState(6, $Tk::x, $Tk::y); + } + +sub GoState_20 + { + my ($w, $x, $y) = @_; + + my $data = $w->MainWindow->privateData('Tix'); + if ($w->InsideArmedIndicator($x, $y)) + { + $w->IndicatorCmd('<Arm>', $data->{'indicator'}); + } + else + { + $w->GoState(21, $x, $y); + } + } + +sub GoState_21 + { + my ($w, $x, $y) = @_; + + my $data = $w->MainWindow->privateData('Tix'); + unless ($w->InsideArmedIndicator($x, $y)) + { + $w->IndicatorCmd('<Disarm>', $data->{'indicator'}); + } + else + { + $w->GoState(20, $x, $y); + } + } + +sub GoState_22 + { + my ($w) = @_; + my $data = $w->MainWindow->privateData('Tix'); + if (@{ $data->{oldEntry} }) + { + $w->anchor('set', @{ $data->{oldEntry} }); + } + else + { + $w->anchor('clear'); + } + $w->GoState(0); + } + + +#---------------------------------------------------------------------- +# callback actions +#---------------------------------------------------------------------- + +sub SetAnchor + { + my ($w, @ent) = @_; + + if (@ent) + { + $w->anchor('set', @ent); +# $w->see(@ent); + } + } + +# xxx check @ent of @$ent +sub Select + { + my ($w, @ent) = @_; + $w->selection('clear'); + $w->selection('set', @ent) + } + +# xxx check new After handling +sub StartScan + { + my ($w) = @_; + $Tk::afterId = $w->after(50, [AutoScan, $w]); + } + +sub DoScan + { + my ($w) = @_; + my $x = $Tk::x; + my $y = $Tk::y; + my $X = $Tk::X; + my $Y = $Tk::Y; + + my $out = 0; + if ($y >= $w->height) + { + $w->yview('scroll', 1, 'units'); + $out = 1; + } + if ($y < 0) + { + $w->yview('scroll', -1, 'units'); + $out = 1; + } + if ($x >= $w->width) + { + $w->xview('scroll', 2, 'units'); + $out = 1; + } + if ($x < 0) + { + $w->xview('scroll', -2, 'units'); + $out = 1; + } + if ($out) + { + $Tk::afterId = $w->after(50, ['AutoScan', $w]); + } + } + + +#proc tixGrid:CallBrowseCmd {w ent} { +# return +# +# set browsecmd [$w cget -browsecmd] +# if {$browsecmd != ""} { +# set bind(specs) {%V} +# set bind(%V) $ent +# +# tixEvalCmdBinding $w $browsecmd bind $ent +# } +#} + +#proc tixGrid:CallCommand {w ent} { +# set command [$w cget -command] +# if {$command != ""} { +# set bind(specs) {%V} +# set bind(%V) $ent +# +# tixEvalCmdBinding $w $command bind $ent +# } +#} + +# tixGrid:EditCell -- +# +# This command is called when "$w edit set $x $y" is called. It causes +# an SetEdit call when the grid's state is 0. +# + +sub EditCell + { + my ($w, $x, $y) = @_; + my $list = $w->privateData()->{'list'}; + if ($w->GetState == 0) + { + $w->SetEdit($x, $y); # xxx really correct ? once 2, once 4 args? + } + else + { + push(@$list, [ $w, 'SetEdit', $x, $y]); + } + } +#proc tixGrid:EditCell {w x y} { +# set list $w:_list +# global $list +# +# case [tixGrid:GetState $w] { +# {0} { +# tixGrid:SetEdit $w [list $x $y] +# } +# default { +# lappend $list [list tixGrid:SetEdit $w [list $x $y]] +# } +# } +#} + + +# tixGrid:EditApply -- +# +# This command is called when "$w edit apply $x $y" is called. It causes +# an CheckEdit call when the grid's state is 0. +# + +sub EditApply + { + my ($w) = @_; + my $list = $w->privateData()->{'list'}; + if ($w->GetState eq 0) + { + $w->CheckEdit; # xxx really correct ? once 2, once 4 args? + } + else + { + push(@$list, $w->CheckEdit); + } + } +#proc tixGrid:EditApply {w} { +# set list $w:_list +# global $list +# +# case [tixGrid:GetState $w] { +# {0} { +# tixGrid:CheckEdit $w +# } +# default { +# lappend $list [list tixGrid:CheckEdit $w] +# } +# } +#} + +# tixGrid:CheckEdit -- +# +# This procedure is called when the user sets the focus on a cell. +# If another cell is being edited, apply the changes of that cell. +# + +sub CheckEdit + { + my ($w) = @_; + my $edit = $w->privateData->{editentry}; + if (Tk::Exists($edit)) + { + # If it -command is not empty, it is being used for another cell. + # Invoke it so that the other cell can be updated. + # + if (defined $edit->cget('-command')) + { + $edit->invoke; # xxx no args?? + } + } + } + +sub SetFocus + { + my ($w) = @_; + if ($w->cget('-takefocus')) + { +$w->focus; +# # xxx translation of if ![string match $w.* [focus -displayof $w]] { +# my $hasfocus = $w->focus(-displayof => $w)->pathname; +# my $pathname = $w->pathname; +# if ($hasfocus =~ /\Q$pathname\E.*/) +# { +# $w->focus +# } + } + } + + +# tixGrid:SetEdit -- +# +# Puts a floatentry on top of an editable entry. +# + +sub SetEdit + { + my ($w, $px, $py) = @_; + + $w->CheckEdit; + + my $efc = $w->cget('-editnotifycmd'); + return unless ( defined($efc) && length($efc) ); + + unless ($w->Callback('-editnotifycmd' => $px, $py)) + { + print STDERR "editnotifycmd not defined or returned false\n"; + return; + } + + my $oldvalue; + if ($w->info('exists', $px, $py)) + { + # if entry doesn't support -text option. Can't edit it. + # + # If the application wants to force editing of an entry, it could + # delete or replace the entry in the editnotifyCmd procedure. + # + Tk::catch { $oldvalue = $w->entrycget($px, $py, '-text'); }; + if ($@) + { + return; + } + } + else + { + $oldvalue = ''; + } + + my @bbox = $w->info('bbox', $px, $py); + + my $edit = $w->privateData()->{__EDIT__}; + unless (Tk::Exists($edit)) + { + require Tk::FloatEntry; + $edit = $w->FloatEntry(); + $w->privateData()->{__EDIT__} = $edit; + } + $edit->configure(-command=>[\&DoneEdit, $w, $px, $py]); + $edit->post(@bbox); + $edit->configure(-value=>$oldvalue); +} + + +sub DoneEdit + { + my ($w, $x, $y, @args) = @_; + + my $edit = $w->privateData()->{__EDIT__}; + $edit->configure(-command=>undef); + $edit->unpost; + + # FIX xxx + # set value [tixEvent value] + my $value = $edit->get; + if ($w->info('exists', $x, $y)) + { + Tk::catch { $w->entryconfigure($x, $y, -text=>$value) }; + if ($@) + { + return + } + } + elsif ( length($value) ) + { + # This needs to be catch'ed because the default itemtype may + # not support the -text option + # + Tk::catch { $w->set($x,$y,-text $value); }; + if ($@) + { + return; + } + } + else + { + return; + } + $w->Callback('-editdonecmd' => $x, $y); + } + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Tk.xbm b/Master/tlpkg/tlperl.old/lib/Tk/Tk.xbm new file mode 100644 index 00000000000..136d4793037 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Tk.xbm @@ -0,0 +1,44 @@ +#define Tk.xbm_width 61 +#define Tk.xbm_height 61 +static unsigned char Tk.xbm_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0xf8, 0x0e, 0x00, 0x00, + 0x00, 0xe0, 0x1e, 0x00, 0xbe, 0x3e, 0x00, 0x00, 0x00, 0xfb, 0x1e, 0x00, + 0xfe, 0x7f, 0x00, 0x00, 0x80, 0xdf, 0x0f, 0x00, 0xff, 0xbf, 0x00, 0x00, + 0x80, 0xe0, 0x3d, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x47, 0x7f, 0x80, + 0xff, 0xfd, 0x01, 0x00, 0x00, 0x7f, 0x3e, 0xc0, 0xff, 0xf1, 0x01, 0x00, + 0x00, 0x30, 0x7f, 0xf0, 0xfe, 0xb3, 0x03, 0x00, 0x00, 0xf8, 0x3e, 0x7c, + 0xff, 0xcf, 0x07, 0x00, 0x00, 0x78, 0x37, 0xfc, 0x7b, 0xc3, 0x07, 0x00, + 0x00, 0xfc, 0x3d, 0xfe, 0x3c, 0x25, 0x0e, 0x00, 0x00, 0xfc, 0x3e, 0x5f, + 0x18, 0x41, 0x0b, 0x00, 0x00, 0x5c, 0x3f, 0x5f, 0xf0, 0x59, 0x1b, 0x00, + 0x00, 0xdc, 0x9f, 0x3f, 0xe8, 0xbe, 0x17, 0x00, 0x00, 0xbc, 0x9f, 0x2f, + 0xa8, 0x5b, 0x15, 0x00, 0x00, 0xdc, 0xdf, 0x25, 0x48, 0x7a, 0x34, 0x00, + 0x00, 0x7c, 0xce, 0x1f, 0x20, 0x2c, 0x36, 0x00, 0x00, 0x7c, 0xa7, 0x1f, + 0xcc, 0x09, 0xf0, 0x00, 0x00, 0xfc, 0xae, 0x1f, 0x49, 0x05, 0xf6, 0x00, + 0x00, 0xfc, 0xac, 0x3f, 0xf8, 0x11, 0xf6, 0x00, 0x00, 0xf8, 0x8d, 0x3f, + 0x8e, 0x0e, 0xd6, 0x01, 0x00, 0xf8, 0x9c, 0x7e, 0xd7, 0x5b, 0xff, 0x03, + 0x00, 0x70, 0x83, 0x5f, 0xcf, 0xfd, 0xbf, 0x01, 0x00, 0xe0, 0xc3, 0x3b, + 0xc7, 0xff, 0x3f, 0x03, 0x00, 0xe0, 0xcf, 0xbf, 0xe3, 0xff, 0x97, 0x03, + 0x00, 0x80, 0xfb, 0x7f, 0xfb, 0xff, 0x17, 0x01, 0x00, 0x80, 0xef, 0xff, + 0xb3, 0x6f, 0x17, 0x03, 0x00, 0x00, 0xff, 0xff, 0xdf, 0x3f, 0x17, 0x03, + 0x00, 0x00, 0x88, 0xff, 0xbf, 0x3f, 0x1b, 0x03, 0x00, 0x00, 0x00, 0x7b, + 0x3d, 0x1f, 0x9f, 0x01, 0x00, 0x00, 0x80, 0x1f, 0x7f, 0x1f, 0x9e, 0x00, + 0x00, 0x00, 0x80, 0x1f, 0x3f, 0x0f, 0x1e, 0x00, 0x00, 0x00, 0x80, 0x1f, + 0x1f, 0x0f, 0x1e, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x1f, 0x0e, 0x1e, 0x00, + 0x00, 0xfe, 0x81, 0x8f, 0x1f, 0x0f, 0x1c, 0x00, 0x00, 0x98, 0x81, 0xc7, + 0x1f, 0x0e, 0x18, 0x00, 0x00, 0x98, 0x01, 0xc7, 0x0f, 0x0a, 0x18, 0x00, + 0xfc, 0x98, 0x99, 0xc7, 0x07, 0x0e, 0x18, 0x00, 0x8c, 0x99, 0x8d, 0xc7, + 0x02, 0x0e, 0x18, 0x00, 0x8c, 0x99, 0x07, 0xc3, 0x03, 0x03, 0x18, 0x00, + 0x8c, 0x99, 0x07, 0xc7, 0x01, 0x03, 0x28, 0x00, 0x8c, 0x99, 0x0d, 0x03, + 0x03, 0x01, 0x08, 0x00, 0xfc, 0x98, 0x19, 0x03, 0x86, 0x01, 0x18, 0x00, + 0x0c, 0x00, 0x00, 0x03, 0xc4, 0x01, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x03, + 0x88, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x03, 0x90, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x30, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0x01, + 0xf0, 0x01, 0x08, 0x00, 0x00, 0x00, 0x80, 0x01, 0xf8, 0x01, 0x18, 0x00, + 0x00, 0x00, 0xc0, 0x01, 0x9e, 0x03, 0x04, 0x00, 0x00, 0x00, 0xc0, 0x01, + 0xb3, 0x01, 0x04, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x01, 0x18, 0x00, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Tk.xpm b/Master/tlpkg/tlperl.old/lib/Tk/Tk.xpm new file mode 100644 index 00000000000..7880a637f39 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Tk.xpm @@ -0,0 +1,41 @@ +/* XPM */ +static char *Tk[] = { +/* width height num_colors chars_per_pixel */ +" 32 32 2 1", +/* colors */ +"# c #008080", +"a c #ff0000", +/* pixels */ +"################################", +"################################", +"################################", +"################################", +"################################", +"################################", +"##########aaaaaaaa##############", +"#######aaaaaaaaaaaa#######aa####", +"#####aaaaaaaaaaaaaa######aaa####", +"####aaaaaaaaaaaaaaaa####aaaa####", +"####aaaaaaa######aa####aaaa#####", +"###aaaa#########aaa###aaaa######", +"###aaaa#########aa###aaaa#######", +"######aa#######aa####aaa########", +"##############aaa###aaaa########", +"#############aaa###aaaa##aaa####", +"#############aa####aaa#aaaaa####", +"############aaa###aaa#aaaaaa####", +"###########aaa####aa#aa#aaa#####", +"###########aaa###aa#aa#aaa######", +"##########aaa####aaaaaaaa#aa####", +"##########aaa####aaaaaaa##aa####", +"#########aaaa####aaaaaaaaaa#####", +"#########aaa#####aa##aaaaa######", +"#########aaa##########aa########", +"################################", +"################################", +"################################", +"################################", +"################################", +"################################", +"################################" +}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/TkXSUB.def b/Master/tlpkg/tlperl.old/lib/Tk/TkXSUB.def new file mode 100644 index 00000000000..8f60974226e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/TkXSUB.def @@ -0,0 +1,62 @@ +MkXSUB("Tk::bind", XS_Tk_bind, XStoBind, Tk_BindObjCmd) +MkXSUB("Tk::pack", XS_Tk_pack, XStoAfterSub, Tk_PackObjCmd) +MkXSUB("Tk::grid", XS_Tk_grid, XStoGrid, Tk_GridObjCmd) +MkXSUB("Tk::place", XS_Tk_place, XStoAfterSub, Tk_PlaceObjCmd) +MkXSUB("Tk::form", XS_Tk_form, XStoAfterSub, Tix_FormCmd) +MkXSUB("Tk::itemstyle", XS_Tk_itemstyle, XStoTclCmd, Tix_ItemStyleCmd) +MkXSUB("Tk::winfo", XS_Tk_winfo, XStoSubCmd, Tk_WinfoObjCmd) +MkXSUB("Tk::font", XS_Tk_font, XStoFont, Tk_FontObjCmd) +MkXSUB("Tk::wm", XS_Tk_wm, XStoAfterSub, Tk_WmObjCmd) +MkXSUB("Tk::grab", XS_Tk_grab, XStoSubCmd, Tk_GrabObjCmd) +MkXSUB("Tk::focus", XS_Tk_focus, XStoSubCmd, Tk_FocusObjCmd) +MkXSUB("Tk::event", XS_Tk_event, XStoEvent, Tk_EventObjCmd) +MkXSUB("Tk::property", XS_Tk_property, XStoSubCmd, Tk_PropertyCmd) +MkXSUB("Tk::clipboard", XS_Tk_clipboard, XStoDisplayof, Tk_ClipboardObjCmd) +MkXSUB("Tk::bell", XS_Tk_bell, XStoDisplayof, Tk_BellObjCmd) +MkXSUB("Tk::bindtags", XS_Tk_bindtags, XStoTk, Tk_BindtagsObjCmd) +MkXSUB("Tk::destroy", XS_Tk_destroy, XStoTk, Tk_DestroyObjCmd) +MkXSUB("Tk::raise", XS_Tk_raise, XStoTk, Tk_RaiseObjCmd) +MkXSUB("Tk::lower", XS_Tk_lower, XStoTk, Tk_LowerObjCmd) +MkXSUB("Tk::option", XS_Tk_option, XStoOption, Tk_OptionObjCmd) +MkXSUB("Tk::image", XS_Tk_image, XStoImage, Tk_ImageObjCmd) +MkXSUB("Tk::selection", XS_Tk_selection, XStoTk, Tk_SelectionObjCmd) + +#if defined(__WIN32__) || defined(MAC_TCL) +MkXSUB("Tk::tk_chooseColor", XS_Tk_tk_chooseColor, XStoTk, Tk_ChooseColorObjCmd) +MkXSUB("Tk::tk_chooseDirectory", XS_Tk_tk_chooseDirectory, XStoTk, Tk_ChooseDirectoryObjCmd) +MkXSUB("Tk::tk_getOpenFile", XS_Tk_tk_getOpenFile, XStoTk, Tk_GetOpenFileObjCmd) +MkXSUB("Tk::tk_getSaveFile", XS_Tk_tk_getSaveFile, XStoTk, Tk_GetSaveFileObjCmd) +#endif +#if defined(__WIN32__) +MkXSUB("Tk::tk_messageBox", XS_Tk_tk_messageBox, XStoTk, Tk_MessageBoxObjCmd) +#endif + +MkXSUB("Tk::tk", XS_Tk_tk, XStoTclCmd, Tk_TkObjCmd) + +#if 0 +MkXSUB("Tk::exit", XS_Tk_exit, XStoNoWindow, Tcl_ExitCmd) +MkXSUB("Tk::fileevent", XS_Tk_fileevent, XStoNoWindow, Tcl_FileeventCmd) +#endif +MkXSUB("Tk::after", XS_Tk_after, XStoNoWindow, Tcl_AfterObjCmd) +#ifndef WIN32 +MkXSUB("Tk::send", XS_Tk_send, XStoTclCmd, Tk_SendCmd) +#endif + +MkXSUB("Tk::button", XS_Tk_button, XStoTclCmdNull, Tk_ButtonObjCmd) +MkXSUB("Tk::checkbutton", XS_Tk_checkbutton, XStoTclCmdNull, Tk_CheckbuttonObjCmd) +MkXSUB("Tk::label", XS_Tk_label, XStoTclCmdNull, Tk_LabelObjCmd) +MkXSUB("Tk::radiobutton", XS_Tk_radiobutton, XStoTclCmdNull, Tk_RadiobuttonObjCmd) +MkXSUB("Tk::_menu", XS_Tk__menu, XStoTclCmdNull, 0) + +MkXSUB("Tk::message", XS_Tk_message, XStoTclCmd, Tk_MessageObjCmd) +MkXSUB("Tk::frame", XS_Tk_frame, XStoTclCmd, Tk_FrameObjCmd) +MkXSUB("Tk::labelframe", XS_Tk_labelframe, XStoTclCmd, Tk_LabelframeObjCmd) +MkXSUB("Tk::panedwindow", XS_Tk_panedwindow, XStoTclCmd, Tk_PanedWindowObjCmd) +MkXSUB("Tk::toplevel", XS_Tk_toplevel, XStoTclCmd, Tk_ToplevelObjCmd) +MkXSUB("Tk::update", XS_Tk_update, XStoTclCmd, Tk_UpdateObjCmd) +MkXSUB("Tk::tkwait", XS_Tk_tkwait, XStoTclCmd, Tk_TkwaitObjCmd) +MkXSUB("Tk::configure", XS_Tk_configure, XStoWidget, newSVpv("configure",0)) +MkXSUB("Tk::cget", XS_Tk_cget, XStoWidget, newSVpv("cget",0)) + + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Toplevel.pm b/Master/tlpkg/tlperl.old/lib/Tk/Toplevel.pm new file mode 100644 index 00000000000..7bcd156d475 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Toplevel.pm @@ -0,0 +1,211 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::Toplevel; +use AutoLoader; + +use vars qw($VERSION); +$VERSION = '4.006'; # $Id: //depot/Tkutf8/Tk/Toplevel.pm#6 $ + +use base qw(Tk::Wm Tk::Frame); + +Construct Tk::Widget 'Toplevel'; + +sub Tk_cmd { \&Tk::toplevel } + +sub CreateOptions +{ + return (shift->SUPER::CreateOptions,'-screen','-use') +} + +sub Populate +{ + my ($cw,$arg) = @_; + $cw->SUPER::Populate($arg); + $cw->ConfigSpecs('-title',['METHOD',undef,undef,$cw->class]); +} + +sub Icon +{ + my ($top,%args) = @_; + my $icon = $top->iconwindow; + my $state = $top->state; + if ($state ne 'withdrawn') + { + $top->withdraw; + $top->update; # Let attributes propogate + } + unless (defined $icon) + { + $icon = Tk::Toplevel->new($top,'-borderwidth' => 0,'-class'=>'Icon'); + $icon->withdraw; + # Fake Populate + my $lab = $icon->Component('Label' => 'icon'); + $lab->pack('-expand'=>1,'-fill' => 'both'); + $icon->ConfigSpecs(DEFAULT => ['DESCENDANTS']); + # Now do tail of InitObject + $icon->ConfigDefault(\%args); + # And configure that new would have done + $top->iconwindow($icon); + $top->update; + $lab->DisableButtonEvents; + $lab->update; + } + $top->iconimage($args{'-image'}) if (exists $args{'-image'}); + $icon->configure(%args); + $icon->idletasks; # Let size request propogate + $icon->geometry($icon->ReqWidth . 'x' . $icon->ReqHeight); + $icon->update; # Let attributes propogate + $top->deiconify if ($state eq 'normal'); + $top->iconify if ($state eq 'iconic'); +} + +sub menu +{ + my $w = shift; + my $menu; + $menu = $w->cget('-menu'); + unless (defined $menu) + { + $w->configure(-menu => ($menu = $w->SUPER::menu)) + } + $menu->configure(@_) if @_; + return $menu; +} + + +1; +__END__ + +#---------------------------------------------------------------------- +# +# Focus Group +# +# Focus groups are used to handle the user's focusing actions inside a +# toplevel. +# +# One example of using focus groups is: when the user focuses on an +# entry, the text in the entry is highlighted and the cursor is put to +# the end of the text. When the user changes focus to another widget, +# the text in the previously focused entry is validated. +# + +#---------------------------------------------------------------------- +# tkFocusGroup_Create -- +# +# Create a focus group. All the widgets in a focus group must be +# within the same focus toplevel. Each toplevel can have only +# one focus group, which is identified by the name of the +# toplevel widget. +# +sub FG_Create { + my $t = shift; + unless (exists $t->{'_fg'}) { + $t->{'_fg'} = 1; + $t->bind('<FocusIn>', sub { + my $w = shift; + my $Ev = $w->XEvent; + $t->FG_In($w, $Ev->d); + } + ); + $t->bind('<FocusOut>', sub { + my $w = shift; + my $Ev = $w->XEvent; + $t->FG_Out($w, $Ev->d); + } + ); + $t->bind('<Destroy>', sub { + my $w = shift; + my $Ev = $w->XEvent; + $t->FG_Destroy($w); + } + ); + # <Destroy> is not sufficient to break loops if never mapped. + $t->OnDestroy([$t,'FG_Destroy']); + } +} + +# tkFocusGroup_BindIn -- +# +# Add a widget into the "FocusIn" list of the focus group. The $cmd will be +# called when the widget is focused on by the user. +# +sub FG_BindIn { + my($t, $w, $cmd) = @_; + $t->Error("focus group \"$t\" doesn't exist") unless (exists $t->{'_fg'}); + $t->{'_FocusIn'}{$w} = Tk::Callback->new($cmd); +} + +# tkFocusGroup_BindOut -- +# +# Add a widget into the "FocusOut" list of the focus group. The +# $cmd will be called when the widget loses the focus (User +# types Tab or click on another widget). +# +sub FG_BindOut { + my($t, $w, $cmd) = @_; + $t->Error("focus group \"$t\" doesn't exist") unless (exists $t->{'_fg'}); + $t->{'_FocusOut'}{$w} = Tk::Callback->new($cmd); +} + +# tkFocusGroup_Destroy -- +# +# Cleans up when members of the focus group is deleted, or when the +# toplevel itself gets deleted. +# +sub FG_Destroy { + my($t, $w) = @_; + if (!defined($w) || $t == $w) { + delete $t->{'_fg'}; + delete $t->{'_focus'}; + delete $t->{'_FocusOut'}; + delete $t->{'_FocusIn'}; + } else { + if (exists $t->{'_focus'}) { + delete $t->{'_focus'} if ($t->{'_focus'} == $w); + } + delete $t->{'_FocusIn'}{$w}; + delete $t->{'_FocusOut'}{$w}; + } +} + +# tkFocusGroup_In -- +# +# Handles the <FocusIn> event. Calls the FocusIn command for the newly +# focused widget in the focus group. +# +sub FG_In { + my($t, $w, $detail) = @_; + if (defined $t->{'_focus'} and $t->{'_focus'} eq $w) { + # This is already in focus + return; + } else { + $t->{'_focus'} = $w; + $t->{'_FocusIn'}{$w}->Call if exists $t->{'_FocusIn'}{$w}; + } +} + +# tkFocusGroup_Out -- +# +# Handles the <FocusOut> event. Checks if this is really a lose +# focus event, not one generated by the mouse moving out of the +# toplevel window. Calls the FocusOut command for the widget +# who loses its focus. +# +sub FG_Out { + my($t, $w, $detail) = @_; + if ($detail ne 'NotifyNonlinear' and $detail ne 'NotifyNonlinearVirtual') { + # This is caused by mouse moving out of the window + return; + } + unless (exists $t->{'_FocusOut'}{$w}) { + return; + } else { + $t->{'_FocusOut'}{$w}->Call; + delete $t->{'_focus'}; + } +} + +1; + +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Trace.pm b/Master/tlpkg/tlperl.old/lib/Tk/Trace.pm new file mode 100644 index 00000000000..1e38e79a065 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Trace.pm @@ -0,0 +1,405 @@ +package Tk::Trace; + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #7 $ =~ /\D(\d+)\s*$/; + +use Carp; +use Tie::Watch; +use strict; + +# The %TRACE hash is indexed by stringified variable reference. Each hash +# bucket contains an array reference having two elements: +# +# ->[0] = a reference to the variable's Tie::Watch object +# ->[1] = a hash reference with these keys: -fetch, -store, -destroy +# ->{key} = [ active flag, [ callback list ] ] +# where each callback is a normalized callback array reference +# +# Thus, each trace type (r w u ) may have multiple traces. + +my %TRACE; # watchpoints indexed by stringified ref + +my %OP = ( # trace to Tie::Watch operation map + r => '-fetch', + w => '-store', + u => '-destroy', +); + +sub fetch { + + # fetch() wraps the user's callback with necessary tie() bookkeeping + # and invokes the callback with the proper arguments. It expects: + # + # $_[0] = Tie::Watch object + # $_[1] = undef for a scalar, an index/key for an array/hash + # + # The user's callback is passed these arguments: + # + # $_[0] = undef for a scalar, index/key for array/hash + # $_[1] = current value + # $_[2] = operation 'r' + # $_[3 .. $#_] = optional user callback arguments + # + # The user callback returns the final value to assign the variable. + + my $self = shift; # Tie::Watch object + my $val = $self->Fetch(@_); # get variable's current value + my $aref = $self->Args('-fetch'); # argument reference + my $call = $TRACE{$aref->[0]}->[1]->{-fetch}; # active flag/callbacks + return $val unless $call->[0]; # if fetch inactive + + my $final_val; + foreach my $aref (reverse @$call[ 1 .. $#{@$call} ] ) { + my ( @args_copy ) = @$aref; + my $sub = shift @args_copy; # user's callback + unshift @_, undef if scalar @_ == 0; # undef "index" for a scalar + my @args = @_; # save for post-callback work + $args[1] = &$sub(@_, $val, 'r', @args_copy); # invoke user callback + shift @args unless defined $args[0]; # drop scalar "index" + $final_val = $self->Store(@args); # update variable's value + } + $final_val; + +} # end fetch + +sub store { + + # store() wraps the user's callback with necessary tie() bookkeeping + # and invokes the callback with the proper arguments. It expects: + # + # $_[0] = Tie::Watch object + # $_[1] = new value for a scalar, index/key for an array/hash + # $_[2] = undef for a scalar, new value for an array/hash + # + # The user's callback is passed these arguments: + # + # $_[0] = undef for a scalar, index/key for array/hash + # $_[1] = new value + # $_[2] = operation 'w' + # $_[3 .. $#_] = optional user callback arguments + # + # The user callback returns the final value to assign the variable. + + my $self = shift; # Tie::Watch object + my $val = $self->Store(@_); # store variable's new value + my $aref = $self->Args('-store'); # argument reference + my $call = $TRACE{$aref->[0]}->[1]->{-store}; # active flag/callbacks + return $val unless $call->[0]; # if store inactive + + foreach my $aref ( reverse @$call[ 1 .. $#{@$call} ] ) { + my ( @args_copy ) = @$aref; + my $sub = shift @args_copy; # user's callback + unshift @_, undef if scalar @_ == 1; # undef "index" for a scalar + my @args = @_; # save for post-callback work + $args[1] = &$sub(@_, 'w', @args_copy); # invoke user callback + shift @args unless defined $args[0]; # drop scalar "index" + $self->Store(@args); # update variable's value + } + +} # end store + +sub destroy { + + # destroy() wraps the user's callback with necessary tie() bookkeeping + # and invokes the callback with the proper arguments. It expects: + # + # $_[0] = Tie::Watch object + # + # The user's callback is passed these arguments: + # + # $_[0] = undef for a scalar, index/key for array/hash + # $_[1] = final value + # $_[2] = operation 'u' + # $_[3 .. $#_] = optional user callback arguments + + my $self = shift; # Tie::Watch object + my $val = $self->Fetch(@_); # variable's final value + my $aref = $self->Args('-destroy'); # argument reference + my $call = $TRACE{$aref->[0]}->[1]->{-destroy}; # active flag/callbacks + return $val unless $call->[0]; # if destroy inactive + + foreach my $aref ( reverse @$call[ 1 .. $#{@$call} ] ) { + my ( @args_copy ) = @$aref; + my $sub = shift @args_copy; # user's callback + my $val = $self->Fetch(@_); # get final value + &$sub(undef, $val, 'u', @args_copy); # invoke user callback + $self->Destroy(@_); # destroy variable + } + +} # end destroy + +sub Tk::Widget::traceVariable { + + my( $parent, $vref, $op, $callback ) = @_; + + { + $^W = 0; + croak "Illegal parent '$parent', not a widget" unless ref $parent; + croak "Illegal variable '$vref', not a reference" unless ref $vref; + croak "Illegal trace operation '$op'" unless $op; + croak "Illegal trace operation '$op'" if $op =~ /[^rwu]/; + croak "Illegal callback ($callback)" unless $callback; + } + + # Need to add our internal callback to user's callback arg list + # so we can call ours first, followed by the user's callback and + # any user arguments. Trace callbacks are activated as requied. + + my $trace = $TRACE{$vref}; + if ( not defined $trace ) { + my $watch = Tie::Watch->new( + -variable => $vref, + -fetch => [ \&fetch, $vref ], + -store => [ \&store, $vref ], + -destroy => [ \&destroy, $vref ], + ); + $trace = $TRACE{$vref} = + [$watch, + { + -fetch => [ 0 ], + -store => [ 0 ], + -destroy => [ 0 ], + } + ]; + } + + $callback = [ $callback ] if ref $callback eq 'CODE'; + + foreach my $o (split '', $op) { + push @{$trace->[1]->{$OP{$o}}}, $callback; + $trace->[1]->{$OP{$o}}->[0] = 1; # activate + } + + return $trace; # for peeking + +} # end traceVariable + +sub Tk::Widget::traceVdelete { + + my ( $parent, $vref, $op_not_honored, $callabck_not_honored ) = @_; + + if ( defined $TRACE{$vref}->[0] ) { + $$vref = $TRACE{$vref}->[0]->Fetch; + $TRACE{$vref}->[0]->Unwatch; + delete $TRACE{$vref}; + } + +} # end traceVdelete + +sub Tk::Widget::traceVinfo { + + my ( $parent, $vref ) = @_; + + return ( defined $TRACE{$vref}->[0] ) ? $TRACE{$vref}->[0]->Info : undef; + +} # end traceVinfo + +=head1 NAME + +Tk::Trace - emulate Tcl/Tk B<trace> functions. + +=head1 SYNOPSIS + + use Tk::Trace + + $mw->traceVariable(\$v, 'wru' => [\&update_meter, $scale]); + %vinfo = $mw->traceVinfo(\$v); + print "Trace info :\n ", join("\n ", @{$vinfo{-legible}}), "\n"; + $mw->traceVdelete(\$v); + +=head1 DESCRIPTION + +This class module emulates the Tcl/Tk B<trace> family of commands by +binding subroutines of your devising to Perl variables using simple +B<Tie::Watch> features. + +Callback format is patterned after the Perl/Tk scheme: supply either a +code reference, or, supply an array reference and pass the callback +code reference in the first element of the array, followed by callback +arguments. + +User callbacks are passed these arguments: + + $_[0] = undef for a scalar, index/key for array/hash + $_[1] = variable's current (read), new (write), final (undef) value + $_[2] = operation (r, w, or u) + $_[3 .. $#_] = optional user callback arguments + +As a Trace user, you have an important responsibility when writing your +callback, since you control the final value assigned to the variable. +A typical callback might look like: + + sub callback { + my($index, $value, $op, @args) = @_; + return if $op eq 'u'; + # .... code which uses $value ... + return $value; # variable's final value + } + +Note that the callback's return value becomes the variable's final value, +for either read or write traces. + +For write operations, the variable is updated with its new value before +the callback is invoked. + +Multiple read, write and undef callbacks can be attached to a variable, +which are invoked in reverse order of creation. + +=head1 METHODS + +=over 4 + +=item $mw->traceVariable(varRef, op => callback); + +B<varRef> is a reference to the scalar, array or hash variable you +wish to trace. B<op> is the trace operation, and can be any combination +of B<r> for read, B<w> for write, and B<u> for undef. B<callback> is a +standard Perl/Tk callback, and is invoked, depending upon the value of +B<op>, whenever the variable is read, written, or destroyed. + +=item %vinfo = $mw->traceVinfo(varRef); + +Returns a hash detailing the internals of the Trace object, with these +keys: + + %vinfo = ( + -variable => varRef + -debug => '0' + -shadow => '1' + -value => 'HELLO SCALAR' + -destroy => callback + -fetch => callback + -store => callback + -legible => above data formatted as a list of string, for printing + ); + +For array and hash Trace objects, the B<-value> key is replaced with a +B<-ptr> key which is a reference to the parallel array or hash. +Additionally, for an array or hash, there are key/value pairs for +all the variable specific callbacks. + +=item $mw->traceVdelete(\$v); + +Stop tracing the variable. + +=back + +=head1 EXAMPLES + + # Trace a Scale's variable and move a meter in unison. + + use Tk; + use Tk::widgets qw/Trace/; + + $pi = 3.1415926; + $mw = MainWindow->new; + $c = $mw->Canvas( qw/-width 200 -height 110 -bd 2 -relief sunken/ )->grid; + $c->createLine( qw/100 100 10 100 -tag meter -arrow last -width 5/ ); + $s = $mw->Scale( qw/-orient h -from 0 -to 100 -variable/ => \$v )->grid; + $mw->Label( -text => 'Slide Me for 5 Seconds' )->grid; + + $mw->traceVariable( \$v, 'w' => [ \&update_meter, $s ] ); + + $mw->after( 5000 => sub { + print "Untrace time ...\n"; + %vinfo = $s->traceVinfo( \$v ); + print "Watch info :\n ", join("\n ", @{$vinfo{-legible}}), "\n"; + $c->traceVdelete( \$v ); + }); + + MainLoop; + + sub update_meter { + my( $index, $value, $op, @args ) = @_; + return if $op eq 'u'; + $min = $s->cget( -from ); + $max = $s->cget( -to ); + $pos = $value / abs( $max - $min ); + $x = 100.0 - 90.0 * ( cos( $pos * $pi ) ); + $y = 100.0 - 90.0 * ( sin( $pos * $pi ) ); + $c->coords( qw/meter 100 100/, $x, $y ); + return $value; + } + + # Predictive text entry. + + use Tk; + use Tk::widgets qw/ LabEntry Trace /; + use strict; + + my @words = qw/radio television telephone turntable microphone/; + + my $mw = MainWindow->new; + + my $e = $mw->LabEntry( + qw/ -label Thing -width 40 /, + -labelPack => [ qw/ -side left / ], + -textvariable => \my $thing, + ); + my $t = $mw->Text( qw/ -height 10 -width 50 / );; + + $t->pack( $e, qw/ -side top / ); + + $e->focus; + $e->traceVariable( \$thing, 'w', [ \&trace_thing, $e, $t ] ); + + foreach my $k ( 1 .. 12 ) { + $e->bind( "<F${k}>" => [ \&ins, $t, Ev('K') ] ); + } + $e->bind( '<Return>' => + sub { + print "$thing\n"; + $_[0]->delete( 0, 'end' ); + } + ); + + MainLoop; + + sub trace_thing { + + my( $index, $value, $op, $e, $t ) = @_; + + return unless $value; + + $t->delete( qw/ 1.0 end / ); + foreach my $w ( @words ) { + if ( $w =~ /^$value/ ) { + $t->insert( 'end', "$w\n" ); + } + } + + return $value; + + } # end trace_thing + + sub ins { + + my( $e, $t, $K ) = @_; + + my( $index ) = $K =~ /^F(\d+)$/; + + $e->delete( 0, 'end' ); + $e->insert( 'end', $t->get( "$index.0", "$index.0 lineend" ) ); + $t->delete( qw/ 1.0 end / ); + + } # end ins + +=head1 HISTORY + + Stephen.O.Lidie@Lehigh.EDU, Lehigh University Computing Center, 2000/08/01 + . Version 1.0, for Tk800.022. + + sol0@Lehigh.EDU, Lehigh University Computing Center, 2003/09/22 + . Version 1.1, for Tk804.025, add support for multiple traces of the same + type on the same variable. + +=head1 COPYRIGHT + +Copyright (C) 2000 - 2003 Stephen O. Lidie. All rights reserved. + +This program is free software; you can redistribute it and/or modify it under +the same terms as Perl itself. + +=cut + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Tree.pm b/Master/tlpkg/tlperl.old/lib/Tk/Tree.pm new file mode 100644 index 00000000000..6d4f76b0c63 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Tree.pm @@ -0,0 +1,228 @@ +package Tk::Tree; +# Tree -- TixTree widget +# +# Derived from Tree.tcl in Tix 4.1 +# +# Chris Dean <ctdean@cogit.com> + +use vars qw($VERSION); +$VERSION = '4.005'; # $Id: //depot/Tkutf8/Tixish/Tree.pm#5 $ + +use Tk (); +use Tk::Derived; +use Tk::HList; +use base qw(Tk::Derived Tk::HList); +use strict; + +Construct Tk::Widget 'Tree'; + +sub Tk::Widget::ScrlTree { shift->Scrolled('Tree' => @_) } + +sub Populate +{ + my( $w, $args ) = @_; + + $w->SUPER::Populate( $args ); + + $w->ConfigSpecs( + -ignoreinvoke => ['PASSIVE', 'ignoreInvoke', 'IgnoreInvoke', 0], + -opencmd => ['CALLBACK', 'openCmd', 'OpenCmd', 'OpenCmd' ], + -indicatorcmd => ['CALLBACK', 'indicatorCmd', 'IndicatorCmd', 'IndicatorCmd'], + -closecmd => ['CALLBACK', 'closeCmd', 'CloseCmd', 'CloseCmd'], + -indicator => ['SELF', 'indicator', 'Indicator', 1], + -indent => ['SELF', 'indent', 'Indent', 20], + -width => ['SELF', 'width', 'Width', 20], + -itemtype => ['SELF', 'itemtype', 'Itemtype', 'imagetext'], + -foreground => ['SELF'], + ); +} + +sub autosetmode +{ + my( $w ) = @_; + $w->setmode(); +} + +sub IndicatorCmd +{ + my( $w, $ent, $event ) = @_; + + my $mode = $w->getmode( $ent ); + + if ( $event eq '<Arm>' ) + { + if ($mode eq 'open' ) + { + $w->_indicator_image( $ent, 'plusarm' ); + } + else + { + $w->_indicator_image( $ent, 'minusarm' ); + } + } + elsif ( $event eq '<Disarm>' ) + { + if ($mode eq 'open' ) + { + $w->_indicator_image( $ent, 'plus' ); + } + else + { + $w->_indicator_image( $ent, 'minus' ); + } + } + elsif( $event eq '<Activate>' ) + { + $w->Activate( $ent, $mode ); + $w->Callback( -browsecmd => $ent ); + } +} + +sub close +{ + my( $w, $ent ) = @_; + my $mode = $w->getmode( $ent ); + $w->Activate( $ent, $mode ) if( $mode eq 'close' ); +} + +sub open +{ + my( $w, $ent ) = @_; + my $mode = $w->getmode( $ent ); + $w->Activate( $ent, $mode ) if( $mode eq 'open' ); +} + +sub getmode +{ + my( $w, $ent ) = @_; + + return( 'none' ) unless $w->indicatorExists( $ent ); + + my $img = $w->_indicator_image( $ent ); + return( 'open' ) if( $img eq 'plus' || $img eq 'plusarm' ); + return( 'close' ); +} + +sub setmode +{ + my ($w,$ent,$mode) = @_; + unless (defined $mode) + { + $mode = 'none'; + my @args; + push(@args,$ent) if defined $ent; + my @children = $w->infoChildren( @args ); + if ( @children ) + { + $mode = 'close'; + foreach my $c (@children) + { + $mode = 'open' if $w->infoHidden( $c ); + $w->setmode( $c ); + } + } + } + + if (defined $ent) + { + if ( $mode eq 'open' ) + { + $w->_indicator_image( $ent, 'plus' ); + } + elsif ( $mode eq 'close' ) + { + $w->_indicator_image( $ent, 'minus' ); + } + elsif( $mode eq 'none' ) + { + $w->_indicator_image( $ent, undef ); + } + } +} + +sub Activate +{ + my( $w, $ent, $mode ) = @_; + if ( $mode eq 'open' ) + { + $w->Callback( -opencmd => $ent ); + $w->_indicator_image( $ent, 'minus' ); + } + elsif ( $mode eq 'close' ) + { + $w->Callback( -closecmd => $ent ); + $w->_indicator_image( $ent, 'plus' ); + } + else + { + + } +} + +sub OpenCmd +{ + my( $w, $ent ) = @_; + # The default action + foreach my $kid ($w->infoChildren( $ent )) + { + $w->show( -entry => $kid ); + } +} + +sub CloseCmd +{ + my( $w, $ent ) = @_; + + # The default action + foreach my $kid ($w->infoChildren( $ent )) + { + $w->hide( -entry => $kid ); + } +} + +sub Command +{ + my( $w, $ent ) = @_; + + return if $w->{Configure}{-ignoreInvoke}; + + $w->Activate( $ent, $w->getmode( $ent ) ) if $w->indicatorExists( $ent ); +} + +sub _indicator_image +{ + my( $w, $ent, $image ) = @_; + my $data = $w->privateData(); + if (@_ > 2) + { + if (defined $image) + { + $w->indicatorCreate( $ent, -itemtype => 'image' ) + unless $w->indicatorExists($ent); + $data->{$ent} = $image; + $w->indicatorConfigure( $ent, -image => $w->Getimage( $image ) ); + } + else + { + $w->indicatorDelete( $ent ) if $w->indicatorExists( $ent ); + delete $data->{$ent}; + } + } + return $data->{$ent}; +} + +1; + +__END__ + +# Copyright (c) 1996, Expert Interface Technologies +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +# The file man.macros and some of the macros used by this file are +# copyrighted: (c) 1990 The Regents of the University of California. +# (c) 1994-1995 Sun Microsystems, Inc. +# The license terms of the Tcl/Tk distrobution are in the file +# license.tcl. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Widget.pm b/Master/tlpkg/tlperl.old/lib/Tk/Widget.pm new file mode 100644 index 00000000000..e94c037e6fe --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Widget.pm @@ -0,0 +1,1510 @@ +# Copyright (c) 1995-2004 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::Widget; +use vars qw($VERSION @DefaultMenuLabels); +$VERSION = sprintf '4.%03d', q$Revision: #30 $ =~ /\D(\d+)\s*$/; + +require Tk; +use AutoLoader; +use strict; +use Carp; +use base qw(DynaLoader Tk); + +# stubs for 'autoloaded' widget classes +sub Button; +sub Canvas; +sub Checkbutton; +sub Entry; +sub Frame; +sub Label; +sub Labelframe; +sub Listbox; +sub Menu; +sub Menubutton; +sub Message; +sub Panedwindow; +sub Radiobutton; +sub Scale; +sub Scrollbar; +sub Spinbox; +sub Text; +sub Toplevel; + +sub Pixmap; +sub Bitmap; +sub Photo; + +sub ScrlListbox; +sub Optionmenu; + +sub import +{ + my $package = shift; + carp 'use Tk::Widget () to pre-load widgets is deprecated' if (@_); + my $need; + foreach $need (@_) + { + unless (defined &{$need}) + { + require "Tk/${need}.pm"; + } + croak "Cannot locate $need" unless (defined &{$need}); + } +} + +@DefaultMenuLabels = qw[~File ~Help]; + +# Some tidy-ness functions for winfo stuff + +sub True { 1 } +sub False { 0 } + +use Tk::Submethods( 'grab' => [qw(current status release -global)], + 'focus' => [qw(-force -lastfor)], + 'pack' => [qw(configure forget info propagate slaves)], + 'grid' => [qw(bbox columnconfigure configure forget info location propagate rowconfigure size slaves)], + 'form' => [qw(check configure forget grid info slaves)], + 'event' => [qw(add delete generate info)], + 'place' => [qw(configure forget info slaves)], + 'wm' => [qw(capture release)], + 'font' => [qw(actual configure create delete families measure metrics names subfonts)] + ); + +BEGIN { + # FIXME - these don't work in the compiler + *IsMenu = \&False; + *IsMenubutton = \&False; + *configure_self = \&Tk::configure; + *cget_self = \&Tk::cget; +} + + + +Direct Tk::Submethods ( + 'winfo' => [qw(cells class colormapfull depth exists + geometry height id ismapped manager name parent reqheight + reqwidth rootx rooty screen screencells screendepth screenheight + screenmmheight screenmmwidth screenvisual screenwidth visual + visualsavailable vrootheight viewable vrootwidth vrootx vrooty + width x y toplevel children pixels pointerx pointery pointerxy + server fpixels rgb )], + 'tk' => [qw(appname caret scaling useinputmethods windowingsystem)]); + + +sub DESTROY +{ + my $w = shift; + $w->destroy if ($w->IsWidget); +} + +sub Install +{ + # Dynamically loaded widgets add their core commands + # to the Tk base class here + my ($package,$mw) = @_; +} + +sub ClassInit +{ + # Carry out class bindings (or whatever) + my ($package,$mw) = @_; + return $package; +} + +sub CreateOptions +{ + return (); +} + +sub CreateArgs +{ + my ($package,$parent,$args) = @_; + # Remove from hash %$args any configure-like + # options which only apply at create time (e.g. -colormap for Frame), + # or which may as well be applied right away + # return these as a list of -key => value pairs + # Augment same hash with default values for missing mandatory options, + # allthough this can be done later in InitObject. + + # Honour -class => if present, we have hacked Tk_ConfigureWidget to + # allow -class to be passed to any widget. + my @result = (); + my $class = delete $args->{'-class'}; + ($class) = $package =~ /([A-Z][A-Z0-9_]*)$/i unless (defined $class); + @result = (-class => "\u$class") if (defined $class); + foreach my $opt ($package->CreateOptions) + { + push(@result, $opt => delete $args->{$opt}) if exists $args->{$opt}; + } + return @result; +} + +sub InitObject +{ + my ($obj,$args) = @_; + # per object initialization, for example populating + # with sub-widgets, adding a few object bindings to augment + # inherited class bindings, changing binding tags. + # Also another chance to mess with %$args before configure... +} + +sub SetBindtags +{ + my ($obj) = @_; + $obj->bindtags([ref($obj),$obj,$obj->toplevel,'all']); +} + +sub new +{ + local $SIG{'__DIE__'} = \&Carp::croak; + my $package = shift; + my $parent = shift; + $package->InitClass($parent); + $parent->BackTrace("Odd number of args to $package->new(...)") unless ((@_ % 2) == 0); + my %args = @_; + my @args = $package->CreateArgs($parent,\%args); + my $cmd = $package->Tk_cmd; + my $pname = $parent->PathName; + $pname = '' if ($pname eq '.'); + my $leaf = delete $args{'Name'}; + if (defined $leaf) + { + $leaf =~ s/[^a-z0-9_#]+/_/ig; + $leaf = lcfirst($leaf); + } + else + { + ($leaf) = "\L$package" =~ /([a-z][a-z0-9_]*)$/; + } + my $lname = $pname . '.' . $leaf; + # create a hash indexed by leaf name to speed up + # creation of a lot of sub-widgets of the same type + # e.g. entries in Table + my $nhash = $parent->TkHash('_names_'); + $nhash->{$leaf} = 0 unless (exists $nhash->{$leaf}); + while (defined ($parent->Widget($lname))) + { + $lname = $pname . '.' . $leaf . ++$nhash->{$leaf}; + } + my $obj = eval { &$cmd($parent, $lname, @args) }; + confess $@ if $@; + unless (ref $obj) + { + die "No value from $cmd $lname" unless defined $obj; + warn "$cmd '$lname' returned '$obj'" unless $obj eq $lname; + $obj = $parent->Widget($lname = $obj); + die "$obj from $lname" unless ref $obj; + } + bless $obj,$package; + $obj->SetBindtags; + my $notice = $parent->can('NoticeChild'); + $parent->$notice($obj,\%args) if $notice; + $obj->InitObject(\%args); +# ASkludge(\%args,1); + $obj->configure(%args) if (%args); +# ASkludge(\%args,0); + return $obj; +} + +sub DelegateFor +{ + my ($w,$method) = @_; + while(exists $w->{'Delegates'}) + { + my $delegate = $w->{'Delegates'}; + my $widget = $delegate->{$method}; + $widget = $delegate->{DEFAULT} unless (defined $widget); + $widget = $w->Subwidget($widget) if (defined $widget && !ref $widget); + last unless (defined $widget); + last if $widget == $w; + $w = $widget; + } + return $w; +} + +sub Delegates +{ + my $cw = shift; + my $specs = $cw->TkHash('Delegates'); + while (@_) + { + my $key = shift; + my $val = shift; + $specs->{$key} = $val; + } + return $specs; +} + +sub Construct +{ + my ($base,$name) = @_; + my $class = (caller(0))[0]; + no strict 'refs'; + + # Hack for broken ->isa in perl5.6.0 + delete ${"$class\::"}{'::ISA::CACHE::'} if $] == 5.006; + + # Pre ->isa scheme + *{$base.'::Is'.$name} = \&False; + *{$class.'::Is'.$name} = \&True; + + # DelegateFor trickyness is to allow Frames and other derived things + # to force creation in a delegate e.g. a ScrlText with embeded windows + # need those windows to be children of the Text to get clipping right + # and not of the Frame which contains the Text and the scrollbars. + *{$base.'::'."$name"} = sub { $class->new(shift->DelegateFor('Construct'),@_) }; +} + +sub IS +{ + return (defined $_[1]) && $_[0] == $_[1]; +} + +sub _AutoloadTkWidget +{ + my ($self,$method) = @_; + my $what = "Tk::Widget::$method"; + unless (defined &$what) + { + require "Tk/$method.pm"; + } + return $what; +} + +# require UNIVERSAL; don't load .pm use XS code from perl core though + +sub AUTOLOAD +{ + # Take a copy into a 'my' variable so we can recurse + my $what = $Tk::Widget::AUTOLOAD; + my $save = $@; + my $name; + # warn "AUTOLOAD $what ".(ref($_[0]) || $_[0])."\n"; + # Braces used to preserve $1 et al. + { + my ($pkg,$func) = $what =~ /(.*)::([^:]+)$/; + confess("Attempt to load '$what'") unless defined($pkg) && $func =~ /^[\w:]+$/; + $pkg =~ s#::#/#g; + if (defined($name=$INC{"$pkg.pm"})) + { + $name =~ s#^(.*)$pkg\.pm$#$1auto/$pkg/$func.al#; + } + else + { + $name = "auto/$what.al"; + $name =~ s#::#/#g; + } + } + # This may fail, catch error and prevent user's __DIE__ handler + # from triggering as well... + eval {local $SIG{'__DIE__'}; require $name}; + if ($@) + { + croak $@ unless ($@ =~ /Can't locate\s+(?:file\s+)?'?\Q$name\E'?/); + my($package,$method) = ($what =~ /^(.*)::([^:]*)$/); + if (ref $_[0] && !$_[0]->can($method) + && $_[0]->can('Delegate') + && $method !~ /^(ConfigSpecs|Delegates)/ ) + { + my $delegate = $_[0]->Delegates; + if (%$delegate || tied %$delegate) + { + my $widget = $delegate->{$method}; + $widget = $delegate->{DEFAULT} unless (defined $widget); + if (defined $widget) + { + my $subwidget = (ref $widget) ? $widget : $_[0]->Subwidget($widget); + if (defined $subwidget) + { + no strict 'refs'; + # print "AUTOLOAD: $what\n"; + *{$what} = sub { shift->Delegate($method,@_) }; + } + else + { + croak "No delegate subwidget '$widget' for $what"; + } + } + } + } + if (!defined(&$what) && ref($_[0]) && $method =~ /^[A-Z]\w+$/) + { + # Use ->can as ->isa is broken in perl5.6.0 + my $sub = UNIVERSAL::can($_[0],'_AutoloadTkWidget'); + if ($sub) + { + carp "Assuming 'require Tk::$method;'" unless $_[0]->can($method); + $what = $_[0]->$sub($method) + } + } + } + $@ = $save; + $DB::sub = $what; # Tell debugger what is going on... + unless (defined &$what) + { + no strict 'refs'; + *{$what} = sub { croak("Failed to AUTOLOAD '$what'") }; + } + goto &$what; +} + +sub _Destroyed +{ + my $w = shift; + my $a = delete $w->{'_Destroy_'}; + if (ref($a)) + { + while (@$a) + { + my $ent = pop(@$a); + if (ref $ent) + { + eval {local $SIG{'__DIE__'}; $ent->Call }; + } + else + { + delete $w->{$ent}; + } + } + } +} + +sub _OnDestroy +{ + my $w = shift; + $w->{'_Destroy_'} = [] unless (exists $w->{'_Destroy_'}); + push(@{$w->{'_Destroy_'}},@_); +} + +sub OnDestroy +{ + my $w = shift; + $w->_OnDestroy(Tk::Callback->new(@_)); +} + +sub TkHash +{ + my ($w,$key) = @_; + return $w->{$key} if exists $w->{$key}; + my $hash = $w->{$key} = {}; + $w->_OnDestroy($key); + return $hash; +} + +sub privateData +{ + my $w = shift; + my $p = shift || caller; + $w->{$p} ||= {}; +} + +my @image_types; +my %image_method; + +sub ImageMethod +{ + shift if (@_ & 1); + while (@_) + { + my ($name,$method) = splice(@_,0,2); + push(@image_types,$name); + $image_method{$name} = $method; + } +} + +sub Getimage +{ + my ($w, $name) = @_; + my $mw = $w->MainWindow; + croak "Usage \$widget->Getimage('name')" unless defined($name); + my $images = ($mw->{'__Images__'} ||= {}); + + return $images->{$name} if $images->{$name}; + + ImageMethod(xpm => 'Pixmap', + gif => 'Photo', + ppm => 'Photo', + xbm => 'Bitmap' ) unless @image_types; + + foreach my $type (@image_types) + { + my $method = $image_method{$type}; + my $file = Tk->findINC( "$name.$type" ); + next unless( $file && $method ); + my $sub = $w->can($method); + unless (defined &$sub) + { + require Tk::widgets; + Tk::widgets->import($method); + } + $images->{$name} = $w->$method( -file => $file ); + return $images->{$name}; + } + + # Try built-in bitmaps + $images->{$name} = $w->Pixmap( -id => $name ); + return $images->{$name}; +} + +sub SaveGrabInfo +{ + my $w = shift; + $Tk::oldGrab = $w->grabCurrent; + if (defined $Tk::oldGrab) + { + $Tk::grabStatus = $Tk::oldGrab->grabStatus; + } +} + +sub grabSave +{ + my ($w) = @_; + my $grab = $w->grabCurrent; + return sub {} if (!defined $grab); + my $method = ($grab->grabStatus eq 'global') ? 'grabGlobal' : 'grab'; + return sub { eval {local $SIG{'__DIE__'}; $grab->$method() } }; +} + +sub focusCurrent +{ + my ($w) = @_; + $w->Tk::focus('-displayof'); +} + +sub focusSave +{ + my ($w) = @_; + my $focus = $w->focusCurrent; + return sub {} if (!defined $focus); + return sub { eval {local $SIG{'__DIE__'}; $focus->focus } }; +} + +# This is supposed to replicate Tk::after behaviour, +# but does auto-cancel when widget is deleted. +require Tk::After; + +sub afterCancel +{ + my ($w,$what) = @_; + if (defined $what) + { + return $what->cancel if ref($what); + carp "dubious cancel of $what" if 0 && $^W; + $w->Tk::after('cancel' => $what); + } +} + +sub afterIdle +{ + my $w = shift; + return Tk::After->new($w,'idle','once',@_); +} + +sub afterInfo { + my ($w, $id) = @_; + if (defined $id) { + return ($id->[4], $id->[2], $id->[3]); + } else { + return sort( keys %{$w->{_After_}} ); + } +} + +sub after +{ + my $w = shift; + my $t = shift; + if (@_) + { + if ($t ne 'cancel') + { + require Tk::After; + return Tk::After->new($w,$t,'once',@_) + } + while (@_) + { + my $what = shift; + $w->afterCancel($what); + } + } + else + { + $w->Tk::after($t); + } +} + +sub repeat +{ + require Tk::After; + my $w = shift; + my $t = shift; + return Tk::After->new($w,$t,'repeat',@_); +} + +sub FindMenu +{ + # default FindMenu is that there is no menu. + return undef; +} + +sub XEvent { shift->{'_XEvent_'} } + +sub propertyRoot +{ + my $w = shift; + return $w->property(@_,'root'); +} + +# atom, atomname, containing, interps, pathname +# don't work this way - there is no window arg +# So we pretend there was an call the C versions from Tk.xs + +sub atom { shift->InternAtom(@_) } +sub atomname { shift->GetAtomName(@_) } +sub containing { shift->Containing(@_) } + +# interps not done yet +# pathname not done yet + +# walk and descendants adapted from Stephen's composite +# versions as they only use core features they can go here. +# hierachy is reversed in that descendants calls walk rather +# than vice versa as this avoids building a list. +# Walk should possibly be enhanced so allow early termination +# like '-prune' of find. + +sub Walk +{ + # Traverse a widget hierarchy while executing a subroutine. + my($cw, $proc, @args) = @_; + my $subwidget; + foreach $subwidget ($cw->children) + { + $subwidget->Walk($proc,@args); + &$proc($subwidget, @args); + } +} # end walk + +sub Descendants +{ + # Return a list of widgets derived from a parent widget and all its + # descendants of a particular class. + # If class is not passed returns the entire widget hierarchy. + + my($widget, $class) = @_; + my(@widget_tree) = (); + + $widget->Walk( + sub { my ($widget,$list,$class) = @_; + push(@$list, $widget) if (!defined($class) or $class eq $widget->class); + }, + \@widget_tree, $class + ); + return @widget_tree; +} + +sub Palette +{ + my $w = shift->MainWindow; + unless (exists $w->{_Palette_}) + { + my %Palette = (); + my $c = $w->Checkbutton(); + my $e = $w->Entry(); + my $s = $w->Scrollbar(); + $Palette{'activeBackground'} = ($c->configure('-activebackground'))[3] ; + $Palette{'activeForeground'} = ($c->configure('-activeforeground'))[3]; + $Palette{'background'} = ($c->configure('-background'))[3]; + $Palette{'disabledForeground'} = ($c->configure('-disabledforeground'))[3]; + $Palette{'foreground'} = ($c->configure('-foreground'))[3]; + $Palette{'highlightBackground'} = ($c->configure('-highlightbackground'))[3]; + $Palette{'highlightColor'} = ($c->configure('-highlightcolor'))[3]; + $Palette{'insertBackground'} = ($e->configure('-insertbackground'))[3]; + $Palette{'selectColor'} = ($c->configure('-selectcolor'))[3]; + $Palette{'selectBackground'} = ($e->configure('-selectbackground'))[3]; + $Palette{'selectForeground'} = ($e->configure('-selectforeground'))[3]; + $Palette{'troughColor'} = ($s->configure('-troughcolor'))[3]; + $c->destroy; + $e->destroy; + $s->destroy; + $w->{_Palette_} = \%Palette; + } + return $w->{_Palette_}; +} + +# tk_setPalette -- +# Changes the default color scheme for a Tk application by setting +# default colors in the option database and by modifying all of the +# color options for existing widgets that have the default value. +# +# Arguments: +# The arguments consist of either a single color name, which +# will be used as the new background color (all other colors will +# be computed from this) or an even number of values consisting of +# option names and values. The name for an option is the one used +# for the option database, such as activeForeground, not -activeforeground. +sub setPalette +{ + my $w = shift->MainWindow; + my %new = (@_ == 1) ? (background => $_[0]) : @_; + my $priority = delete($new{'priority'}) || 'widgetDefault'; + + # Create an array that has the complete new palette. If some colors + # aren't specified, compute them from other colors that are specified. + + die 'must specify a background color' if (!exists $new{background}); + $new{'foreground'} = 'black' unless (exists $new{foreground}); + my @bg = $w->rgb($new{'background'}); + my @fg = $w->rgb($new{'foreground'}); + my $darkerBg = sprintf('#%02x%02x%02x',9*$bg[0]/2560,9*$bg[1]/2560,9*$bg[2]/2560); + foreach my $i ('activeForeground','insertBackground','selectForeground','highlightColor') + { + $new{$i} = $new{'foreground'} unless (exists $new{$i}); + } + unless (exists $new{'disabledForeground'}) + { + $new{'disabledForeground'} = sprintf('#%02x%02x%02x',(3*$bg[0]+$fg[0])/1024,(3*$bg[1]+$fg[1])/1024,(3*$bg[2]+$fg[2])/1024); + } + $new{'highlightBackground'} = $new{'background'} unless (exists $new{'highlightBackground'}); + + unless (exists $new{'activeBackground'}) + { + my @light; + # Pick a default active background that is lighter than the + # normal background. To do this, round each color component + # up by 15% or 1/3 of the way to full white, whichever is + # greater. + foreach my $i (0, 1, 2) + { + $light[$i] = $bg[$i]/256; + my $inc1 = $light[$i]*15/100; + my $inc2 = (255-$light[$i])/3; + if ($inc1 > $inc2) + { + $light[$i] += $inc1 + } + else + { + $light[$i] += $inc2 + } + $light[$i] = 255 if ($light[$i] > 255); + } + $new{'activeBackground'} = sprintf('#%02x%02x%02x',@light); + } + $new{'selectBackground'} = $darkerBg unless (exists $new{'selectBackground'}); + $new{'troughColor'} = $darkerBg unless (exists $new{'troughColor'}); + $new{'selectColor'} = '#b03060' unless (exists $new{'selectColor'}); + + # Before doing this, make sure that the Tk::Palette variable holds + # the default values of all options, so that tkRecolorTree can + # be sure to only change options that have their default values. + # If the variable exists, then it is already correct (it was created + # the last time this procedure was invoked). If the variable + # doesn't exist, fill it in using the defaults from a few widgets. + my $Palette = $w->Palette; + + # Walk the widget hierarchy, recoloring all existing windows. + $w->RecolorTree(\%new); + # Change the option database so that future windows will get the + # same colors. + foreach my $option (keys %new) + { + $w->option('add',"*$option",$new{$option},$priority); + # Save the options in the global variable Tk::Palette, for use the + # next time we change the options. + $Palette->{$option} = $new{$option}; + } +} + +# tkRecolorTree -- +# This procedure changes the colors in a window and all of its +# descendants, according to information provided by the colors +# argument. It only modifies colors that have their default values +# as specified by the Tk::Palette variable. +# +# Arguments: +# w - The name of a window. This window and all its +# descendants are recolored. +# colors - The name of an array variable in the caller, +# which contains color information. Each element +# is named after a widget configuration option, and +# each value is the value for that option. +sub RecolorTree +{ + my ($w,$colors) = @_; + local ($@); + my $Palette = $w->Palette; + foreach my $dbOption (keys %$colors) + { + my $option = "-\L$dbOption"; + my $value; + eval {local $SIG{'__DIE__'}; $value = $w->cget($option) }; + if (defined $value) + { + if ($value eq $Palette->{$dbOption}) + { + $w->configure($option,$colors->{$dbOption}); + } + } + } + foreach my $child ($w->children) + { + $child->RecolorTree($colors); + } +} +# tkDarken -- +# Given a color name, computes a new color value that darkens (or +# brightens) the given color by a given percent. +# +# Arguments: +# color - Name of starting color. +# perecent - Integer telling how much to brighten or darken as a +# percent: 50 means darken by 50%, 110 means brighten +# by 10%. +sub Darken +{ + my ($w,$color,$percent) = @_; + my @l = $w->rgb($color); + my $red = $l[0]/256; + my $green = $l[1]/256; + my $blue = $l[2]/256; + $red = int($red*$percent/100); + $red = 255 if ($red > 255); + $green = int($green*$percent/100); + $green = 255 if ($green > 255); + $blue = int($blue*$percent/100); + $blue = 255 if ($blue > 255); + sprintf('#%02x%02x%02x',$red,$green,$blue) +} +# tk_bisque -- +# Reset the Tk color palette to the old "bisque" colors. +# +# Arguments: +# None. +sub bisque +{ + shift->setPalette('activeBackground' => '#e6ceb1', + 'activeForeground' => 'black', + 'background' => '#ffe4c4', + 'disabledForeground' => '#b0b0b0', + 'foreground' => 'black', + 'highlightBackground' => '#ffe4c4', + 'highlightColor' => 'black', + 'insertBackground' => 'black', + 'selectColor' => '#b03060', + 'selectBackground' => '#e6ceb1', + 'selectForeground' => 'black', + 'troughColor' => '#cdb79e' + ); +} + +sub PrintConfig +{ + require Tk::Pretty; + my ($w) = (@_); + my $c; + foreach $c ($w->configure) + { + print Tk::Pretty::Pretty(@$c),"\n"; + } +} + +sub BusyRecurse +{ + my ($restore,$w,$cursor,$recurse,$top) = @_; + my $c = $w->cget('-cursor'); + my @tags = $w->bindtags; + if ($top || defined($c)) + { + push(@$restore, sub { return unless Tk::Exists($w); $w->configure(-cursor => $c); $w->bindtags(\@tags) }); + $w->configure(-cursor => $cursor); + } + else + { + push(@$restore, sub { return unless Tk::Exists($w); $w->bindtags(\@tags) }); + } + $w->bindtags(['Busy',@tags]); + if ($recurse) + { + foreach my $child ($w->children) + { + BusyRecurse($restore,$child,$cursor,1,0); + } + } + return $restore; +} + +sub Busy +{ + my ($w,@args) = @_; + return unless $w->viewable; + my($sub, %args); + for(my $i=0; $i<=$#args; $i++) + { + if (ref $args[$i] eq 'CODE') + { + if (defined $sub) + { + croak "Multiple code definitions not allowed in Tk::Widget::Busy"; + } + $sub = $args[$i]; + } + else + { + $args{$args[$i]} = $args[$i+1]; $i++; + } + } + my $cursor = delete $args{'-cursor'}; + my $recurse = delete $args{'-recurse'}; + $cursor = 'watch' unless defined $cursor; + unless (exists $w->{'Busy'}) + { + my @old = ($w->grabSave); + my $key; + my @config; + foreach $key (keys %args) + { + push(@config,$key => $w->Tk::cget($key)); + } + if (@config) + { + push(@old, sub { $w->Tk::configure(@config) }); + $w->Tk::configure(%args); + } + unless ($w->Tk::bind('Busy')) + { + $w->Tk::bind('Busy','<Any-KeyPress>',[_busy => 1]); + $w->Tk::bind('Busy','<Any-KeyRelease>',[_busy => 0]); + $w->Tk::bind('Busy','<Any-ButtonPress>',[_busy => 1]); + $w->Tk::bind('Busy','<Any-ButtonRelease>',[_busy => 0]); + $w->Tk::bind('Busy','<Any-Motion>',[_busy => 0]); + } + $w->{'Busy'} = BusyRecurse(\@old,$w,$cursor,$recurse,1); + } + my $g = $w->grabCurrent; + if (defined $g) + { + # warn "$g has the grab"; + $g->grabRelease; + } + $w->update; + eval {local $SIG{'__DIE__'}; $w->grab }; + $w->update; + if ($sub) + { + eval { $sub->() }; + my $err = $@; + $w->Unbusy(-recurse => $recurse); + die $err if $err; + } +} + +sub _busy +{ + my ($w,$f) = @_; + $w->bell if $f; + $w->break; +} + +sub Unbusy +{ + my ($w) = @_; + $w->update; + $w->grabRelease if Tk::Exists($w); + my $old = delete $w->{'Busy'}; + if (defined $old) + { + local $SIG{'__DIE__'}; + eval { &{pop(@$old)} } while (@$old); + } + $w->update if Tk::Exists($w); +} + +sub waitVisibility +{ + my ($w) = shift; + $w->tkwait('visibility',$w); +} + +sub waitVariable +{ + my ($w) = shift; + $w->tkwait('variable',@_); +} + +sub waitWindow +{ + my ($w) = shift; + $w->tkwait('window',$w); +} + +sub EventWidget +{ + my ($w) = @_; + return $w->{'_EventWidget_'}; +} + +sub Popwidget +{ + my ($ew,$method,$w,@args) = @_; + $w->{'_EventWidget_'} = $ew; + $w->$method(@args); +} + +sub ColorOptions +{ + my ($w,$args) = @_; + my $opt; + $args = {} unless (defined $args); + foreach $opt (qw(-foreground -background -disabledforeground + -activebackground -activeforeground + )) + { + $args->{$opt} = $w->cget($opt) unless (exists $args->{$opt}) + } + return (wantarray) ? %$args : $args; +} + +sub XscrollBind +{ + my ($mw,$class) = @_; + $mw->bind($class,'<Left>', ['xview','scroll',-1,'units']); + $mw->bind($class,'<Control-Left>', ['xview','scroll',-1,'pages']); + $mw->bind($class,'<Control-Prior>',['xview','scroll',-1,'pages']); + $mw->bind($class,'<Right>', ['xview','scroll',1,'units']); + $mw->bind($class,'<Control-Right>',['xview','scroll',1,'pages']); + $mw->bind($class,'<Control-Next>', ['xview','scroll',1,'pages']); + + $mw->bind($class,'<Home>', ['xview','moveto',0]); + $mw->bind($class,'<End>', ['xview','moveto',1]); + $mw->XMouseWheelBind($class); +} + +sub PriorNextBind +{ + my ($mw,$class) = @_; + $mw->bind($class,'<Next>', ['yview','scroll',1,'pages']); + $mw->bind($class,'<Prior>', ['yview','scroll',-1,'pages']); +} + +sub XMouseWheelBind +{ + my ($mw,$class) = @_; + # <4> and <5> are how mousewheel looks on X + # <4> and <5> are how mousewheel looks on X + $mw->bind($class,'<Shift-4>', ['xview','scroll',-1,'units']); + $mw->bind($class,'<Shift-5>', ['xview','scroll',1,'units']); + $mw->bind($class,'<Button-6>', ['xview','scroll',-1,'units']); + $mw->bind($class,'<Button-7>', ['xview','scroll',1,'units']); +} + +sub YMouseWheelBind +{ + my ($mw,$class) = @_; + # <4> and <5> are how mousewheel looks on X + $mw->bind($class,'<4>', ['yview','scroll',-1,'units']); + $mw->bind($class,'<5>', ['yview','scroll',1,'units']); +} + +sub YscrollBind +{ + my ($mw,$class) = @_; + $mw->PriorNextBind($class); + $mw->bind($class,'<Up>', ['yview','scroll',-1,'units']); + $mw->bind($class,'<Down>', ['yview','scroll',1,'units']); + $mw->YMouseWheelBind($class); +} + +sub XYscrollBind +{ + my ($mw,$class) = @_; + $mw->YscrollBind($class); + $mw->XscrollBind($class); + # <4> and <5> are how mousewheel looks on X +} + +sub MouseWheelBind +{ + my($mw,$class) = @_; + + # The MouseWheel will typically only fire on Windows. However, one + # could use the "event generate" command to produce MouseWheel + # events on other platforms. + + $mw->Tk::bind($class, '<MouseWheel>', + [ sub { $_[0]->yview('scroll',-($_[1]/120)*3,'units') }, Tk::Ev("D")]); + + if ($Tk::platform eq 'unix') + { + # Support for mousewheels on Linux/Unix commonly comes through mapping + # the wheel to the extended buttons. If you have a mousewheel, find + # Linux configuration info at: + # http://www.inria.fr/koala/colas/mouse-wheel-scroll/ + $mw->Tk::bind($class, '<4>', + sub { $_[0]->yview('scroll', -3, 'units') + unless $Tk::strictMotif; + }); + $mw->Tk::bind($class, '<5>', + sub { $_[0]->yview('scroll', 3, 'units') + unless $Tk::strictMotif; + }); + } +} + +sub ScrlListbox +{ + my $parent = shift; + return $parent->Scrolled('Listbox',-scrollbars => 'w', @_); +} + +sub AddBindTag +{ + my ($w,$tag) = @_; + my $t; + my @tags = $w->bindtags; + foreach $t (@tags) + { + return if $t eq $tag; + } + $w->bindtags([@tags,$tag]); +} + +sub Callback +{ + my $w = shift; + my $name = shift; + my $cb = $w->cget($name); + if (defined $cb) + { + return $cb->Call(@_) if (ref $cb); + return $w->$cb(@_); + } + return (wantarray) ? () : undef; +} + +sub packAdjust +{ +# print 'packAdjust(',join(',',@_),")\n"; + require Tk::Adjuster; + my ($w,%args) = @_; + my $delay = delete($args{'-delay'}); + $delay = 1 unless (defined $delay); + $w->pack(%args); + %args = $w->packInfo; + my $adj = Tk::Adjuster->new($args{'-in'}, + -widget => $w, -delay => $delay, -side => $args{'-side'}); + $adj->packed($w,%args); + return $w; +} + +sub gridAdjust +{ + require Tk::Adjuster; + my ($w,%args) = @_; + my $delay = delete($args{'-delay'}); + $delay = 1 unless (defined $delay); + $w->grid(%args); + %args = $w->gridInfo; + my $adj = Tk::Adjuster->new($args{'-in'},-widget => $w, -delay => $delay); + $adj->gridded($w,%args); + return $w; +} + +sub place +{ + local $SIG{'__DIE__'} = \&Carp::croak; + my $w = shift; + if (@_ && $_[0] =~ /^(?:configure|forget|info|slaves)$/x) + { + $w->Tk::place(@_); + } + else + { + # Two things going on here: + # 1. Add configure on the front so that we can drop leading '-' + $w->Tk::place('configure',@_); + # 2. Return the widget rather than nothing + return $w; + } +} + +sub pack +{ + local $SIG{'__DIE__'} = \&Carp::croak; + my $w = shift; + if (@_ && $_[0] =~ /^(?:configure|forget|info|propagate|slaves)$/x) + { + # maybe array/scalar context issue with slaves + $w->Tk::pack(@_); + } + else + { + # Two things going on here: + # 1. Add configure on the front so that we can drop leading '-' + $w->Tk::pack('configure',@_); + # 2. Return the widget rather than nothing + return $w; + } +} + +sub grid +{ + local $SIG{'__DIE__'} = \&Carp::croak; + my $w = shift; + if (@_ && $_[0] =~ /^(?:bbox|columnconfigure|configure|forget|info|location|propagate|rowconfigure|size|slaves)$/x) + { + my $opt = shift; + Tk::grid($opt,$w,@_); + } + else + { + # Two things going on here: + # 1. Add configure on the front so that we can drop leading '-' + Tk::grid('configure',$w,@_); + # 2. Return the widget rather than nothing + return $w; + } +} + +sub form +{ + local $SIG{'__DIE__'} = \&Carp::croak; + my $w = shift; + if (@_ && $_[0] =~ /^(?:configure|check|forget|grid|info|slaves)$/x) + { + $w->Tk::form(@_); + } + else + { + # Two things going on here: + # 1. Add configure on the front so that we can drop leading '-' + $w->Tk::form('configure',@_); + # 2. Return the widget rather than nothing + return $w; + } +} + +sub Scrolled +{ + my ($parent,$kind,%args) = @_; + $kind = 'Pane' if $kind eq 'Frame'; + # Find args that are Frame create time args + my @args = Tk::Frame->CreateArgs($parent,\%args); + my $name = delete $args{'Name'}; + push(@args,'Name' => $name) if (defined $name); + my $cw = $parent->Frame(@args); + @args = (); + # Now remove any args that Frame can handle + foreach my $k ('-scrollbars',map($_->[0],$cw->configure)) + { + push(@args,$k,delete($args{$k})) if (exists $args{$k}) + } + # Anything else must be for target widget - pass at widget create time + my $w = $cw->$kind(%args); + # Now re-set %args to be ones Frame can handle + %args = @args; + $cw->ConfigSpecs('-scrollbars' => ['METHOD','scrollbars','Scrollbars','se'], + '-background' => [$w,'background','Background'], + '-foreground' => [$w,'foreground','Foreground'], + ); + $cw->AddScrollbars($w); + $cw->Default("\L$kind" => $w); + $cw->Delegates('bind' => $w, 'bindtags' => $w, 'menu' => $w); + $cw->ConfigDefault(\%args); + $cw->configure(%args); + return $cw; +} + +sub Populate +{ + my ($cw,$args) = @_; +} + +sub ForwardEvent +{ + my $self = shift; + my $to = shift; + $to->PassEvent($self->XEvent); +} + +# Save / Return abstract event type as in Tix. +sub EventType +{ + my $w = shift; + $w->{'_EventType_'} = $_[0] if @_; + return $w->{'_EventType_'}; +} + +sub PostPopupMenu +{ + my ($w, $X, $Y) = @_; + if (@_ < 3) + { + my $e = $w->XEvent; + $X = $e->X; + $Y = $e->Y; + } + my $menu = $w->menu; + $menu->Post($X,$Y) if defined $menu; +} + +sub FillMenu +{ + my ($w,$menu,@labels) = @_; + foreach my $lab (@labels) + { + my $method = $lab.'MenuItems'; + $method =~ s/~//g; + $method =~ s/[\s-]+/_/g; + if ($w->can($method)) + { + $menu->Menubutton(-label => $lab, -tearoff => 0, -menuitems => $w->$method()); + } + } + return $menu; +} + +sub menu +{ + my ($w,$menu) = @_; + if (@_ > 1) + { + $w->_OnDestroy('_MENU_') unless exists $w->{'_MENU_'}; + $w->{'_MENU_'} = $menu; + } + return unless defined wantarray; + unless (exists $w->{'_MENU_'}) + { + $w->_OnDestroy('_MENU_'); + $w->{'_MENU_'} = $menu = $w->Menu(-tearoff => 0); + $w->FillMenu($menu,$w->MenuLabels); + } + return $w->{'_MENU_'}; +} + +sub MenuLabels +{ + return @DefaultMenuLabels; +} + +sub FileMenuItems +{ + my ($w) = @_; + return [ ["command"=>'E~xit', -command => [ $w, 'WmDeleteWindow']]]; +} + +sub WmDeleteWindow +{ + shift->toplevel->WmDeleteWindow +} + +sub BalloonInfo +{ + my ($widget,$balloon,$X,$Y,@opt) = @_; + foreach my $opt (@opt) + { + my $info = $balloon->GetOption($opt,$widget); + return $info if defined $info; + } +} + +sub ConfigSpecs { + + my $w = shift; + + return map { ( $_->[0], [ $w, @$_[ 1 .. 4 ] ] ) } $w->configure; + +} + +*GetSelection = + ($Tk::platform eq 'unix' + ? sub + { + my $w = shift; + my $sel = @_ ? shift : "PRIMARY"; + my $txt = eval { local $SIG{__DIE__}; + $w->SelectionGet(-selection => $sel, -type => "UTF8_STRING") + }; + if ($@) + { + $txt = eval { local $SIG{__DIE__}; + $w->SelectionGet(-selection => $sel) + }; + if ($@) + { + die "could not find default selection"; + } + } + $txt; + } + : sub + { + my $w = shift; + my $sel = @_ ? shift : "PRIMARY"; + my $txt = eval { local $SIG{__DIE__}; + $w->SelectionGet(-selection => $sel) + }; + if ($@) + { + die "could not find default selection"; + } + $txt; + } + ); + +1; +__END__ + +sub bindDump { + + # Dump lots of good binding information. This pretty-print subroutine + # is, essentially, the following code in disguise: + # + # print "Binding information for $w\n"; + # foreach my $tag ($w->bindtags) { + # printf "\n Binding tag '$tag' has these bindings:\n"; + # foreach my $binding ($w->bind($tag)) { + # printf " $binding\n"; + # } + # } + + my ($w) = @_; + + my (@bindtags) = $w->bindtags; + my $digits = length( scalar @bindtags ); + my ($spc1, $spc2) = ($digits + 33, $digits + 35); + my $format1 = "%${digits}d."; + my $format2 = ' ' x ($digits + 2); + my $n = 0; + + my @out; + push @out, sprintf( "\n## Binding information for '%s', %s ##", $w->PathName, $w ); + + foreach my $tag (@bindtags) { + my (@bindings) = $w->bind($tag); + $n++; # count this bindtag + + if ($#bindings == -1) { + push @out, sprintf( "\n$format1 Binding tag '$tag' has no bindings.\n", $n ); + } else { + push @out, sprintf( "\n$format1 Binding tag '$tag' has these bindings:\n", $n ); + + foreach my $binding ( @bindings ) { + my $callback = $w->bind($tag, $binding); + push @out, sprintf( "$format2%27s : %-40s\n", $binding, $callback ); + + if ($callback =~ /SCALAR/) { + if (ref $$callback) { + push @out, sprintf( "%s %s\n", ' ' x $spc1, $$callback ); + } else { + push @out, sprintf( "%s '%s'\n", ' ' x $spc1, $$callback ); + } + } elsif ($callback =~ /ARRAY/) { + if (ref $callback->[0]) { + push @out, sprintf( "%s %s\n", ' ' x $spc1, $callback->[0], "\n" ); + } else { + push @out, sprintf( "%s '%s'\n", ' ' x $spc1, $callback->[0], "\n" ); + } + foreach my $arg (@$callback[1 .. $#{@$callback}]) { + if (ref $arg) { + push @out, sprintf( "%s %-40s", ' ' x $spc2, $arg ); + } else { + push @out, sprintf( "%s '%s'", ' ' x $spc2, $arg ); + } + + if (ref $arg eq 'Tk::Ev') { + if ($arg =~ /SCALAR/) { + push @out, sprintf( ": '$$arg'" ); + } else { + push @out, sprintf( ": '%s'", join("' '", @$arg) ); + } + } + + push @out, sprintf( "\n" ); + } # forend callback arguments + } # ifend callback + + } # forend all bindings for one tag + + } # ifend have bindings + + } # forend all tags + push @out, sprintf( "\n" ); + return @out; + +} # end bindDump + + +sub ASkludge +{ + my ($hash,$sense) = @_; + foreach my $key (%$hash) + { + if ($key =~ /-.*variable/ && ref($hash->{$key}) eq 'SCALAR') + { + if ($sense) + { + my $val = ${$hash->{$key}}; + require Tie::Scalar; + tie ${$hash->{$key}},'Tie::StdScalar'; + ${$hash->{$key}} = $val; + } + else + { + untie ${$hash->{$key}}; + } + } + } +} + + + +# clipboardKeysyms -- +# This procedure is invoked to identify the keys that correspond to +# the "copy", "cut", and "paste" functions for the clipboard. +# +# Arguments: +# copy - Name of the key (keysym name plus modifiers, if any, +# such as "Meta-y") used for the copy operation. +# cut - Name of the key used for the cut operation. +# paste - Name of the key used for the paste operation. +# +# This method is obsolete use clipboardOperations and abstract +# event types instead. See Clipboard.pm and Mainwindow.pm + +sub clipboardKeysyms +{ + my @class = (); + my $mw = shift; + if (ref $mw) + { + $mw = $mw->DelegateFor('bind'); + } + else + { + push(@class,$mw); + $mw = shift; + } + if (@_) + { + my $copy = shift; + $mw->Tk::bind(@class,"<$copy>",'clipboardCopy') if (defined $copy); + } + if (@_) + { + my $cut = shift; + $mw->Tk::bind(@class,"<$cut>",'clipboardCut') if (defined $cut); + } + if (@_) + { + my $paste = shift; + $mw->Tk::bind(@class,"<$paste>",'clipboardPaste') if (defined $paste); + } +} + +sub pathname +{ + my ($w,$id) = @_; + my $x = $w->winfo('pathname',-displayof => oct($id)); + return $x->PathName; +} diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Wm.pm b/Master/tlpkg/tlperl.old/lib/Tk/Wm.pm new file mode 100644 index 00000000000..ffbe4877857 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Wm.pm @@ -0,0 +1,174 @@ +# Copyright (c) 1995-2003 Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +package Tk::Wm; +use AutoLoader; + +require Tk::Widget; +*AUTOLOAD = \&Tk::Widget::AUTOLOAD; + +use strict qw(vars); + +# There are issues with this stuff now we have Tix's wm release/capture +# as toplevel-ness is now dynamic. + + +use vars qw($VERSION); +$VERSION = sprintf '4.%03d', q$Revision: #14 $ =~ /\D(\d+)\s*$/; + +use Tk::Submethods; + +*{Tk::Wm::wmGrid} = sub { shift->wm("grid", @_) }; +*{Tk::Wm::wmTracing} = sub { shift->wm("tracing", @_) }; + +Direct Tk::Submethods ('wm' => [qw(aspect attributes client colormapwindows command + deiconify focusmodel frame geometry group + iconbitmap iconify iconimage iconmask iconname + iconwindow maxsize minsize overrideredirect positionfrom + protocol resizable sizefrom state title transient + withdraw wrapper)]); + +sub SetBindtags +{ + my ($obj) = @_; + $obj->bindtags([ref($obj),$obj,'all']); +} + +sub Populate +{ + my ($cw,$args) = @_; + $cw->ConfigSpecs('-overanchor' => ['PASSIVE',undef,undef,undef], + '-popanchor' => ['PASSIVE',undef,undef,undef], + '-popover' => ['PASSIVE',undef,undef,undef] + ); +} + +sub MoveResizeWindow +{ + my ($w,$x,$y,$width,$height) = @_; + $w->withdraw; + $w->geometry($width.'x'.$height); + $w->MoveToplevelWindow($x,$y); + $w->deiconify; +} + +sub WmDeleteWindow +{ + my ($w) = @_; + my $cb = $w->protocol('WM_DELETE_WINDOW'); + if (defined $cb) + { + $cb->Call; + } + else + { + $w->destroy; + } +} + + +1; + +__END__ + + +sub Post +{ + my ($w,$X,$Y) = @_; + $X = int($X); + $Y = int($Y); + $w->positionfrom('user'); + $w->geometry("+$X+$Y"); + # $w->MoveToplevelWindow($X,$Y); + $w->deiconify; + $w->raise; +} + +sub AnchorAdjust +{ + my ($anchor,$X,$Y,$w,$h) = @_; + $anchor = 'c' unless (defined $anchor); + $Y += ($anchor =~ /s/) ? $h : ($anchor =~ /n/) ? 0 : $h/2; + $X += ($anchor =~ /e/) ? $w : ($anchor =~ /w/) ? 0 : $w/2; + return ($X,$Y); +} + +sub Popup +{ + my $w = shift; + $w->configure(@_) if @_; + $w->idletasks; + my ($mw,$mh) = ($w->reqwidth,$w->reqheight); + my ($rx,$ry,$rw,$rh) = (0,0,0,0); + my $base = $w->cget('-popover'); + my $outside = 0; + if (defined $base) + { + if ($base eq 'cursor') + { + ($rx,$ry) = $w->pointerxy; + } + else + { + $rx = $base->rootx; + $ry = $base->rooty; + $rw = $base->Width; + $rh = $base->Height; + } + } + else + { + my $sc = ($w->parent) ? $w->parent->toplevel : $w; + $rx = -$sc->vrootx; + $ry = -$sc->vrooty; + $rw = $w->screenwidth; + $rh = $w->screenheight; + } + my ($X,$Y) = AnchorAdjust($w->cget('-overanchor'),$rx,$ry,$rw,$rh); + ($X,$Y) = AnchorAdjust($w->cget('-popanchor'),$X,$Y,-$mw,-$mh); + # adjust to not cross screen borders + if ($X < 0) { $X = 0 } + if ($Y < 0) { $Y = 0 } + if ($mw > $w->screenwidth) { $X = 0 } + if ($mh > $w->screenheight) { $Y = 0 } + $w->Post($X,$Y); + $w->waitVisibility; +} + +sub FullScreen +{ + my $w = shift; + my $over = (@_) ? shift : 0; + my $width = $w->screenwidth; + my $height = $w->screenheight; + $w->GeometryRequest($width,$height); + $w->overrideredirect($over & 1); + $w->Post(0,0); + $w->update; + if ($over & 2) + { + my $x = $w->rootx; + my $y = $w->rooty; + $width -= 2*$x; + $height -= $x + $y; + $w->GeometryRequest($width,$height); + $w->update; + } +} + +sub iconposition +{ + my $w = shift; + if (@_ == 1) + { + return $w->wm('iconposition',$1,$2) if $_[0] =~ /^(\d+),(\d+)$/; + if ($_[0] =~ /^([+-])(\d+)([+-])(\d+)$/) + { + my $x = ($1 eq '-') ? $w->screenwidth-$2 : $2; + my $y = ($3 eq '-') ? $w->screenheight-$4 : $4; + return $w->wm('iconposition',$x,$y); + } + } + $w->wm('iconposition',@_); +} + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/X.pm b/Master/tlpkg/tlperl.old/lib/Tk/X.pm new file mode 100644 index 00000000000..06eefbf6bd9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/X.pm @@ -0,0 +1,398 @@ +package Tk::X; + +use strict; +use Carp; +use vars qw($VERSION @EXPORT $AUTOLOAD); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Xlib/X/X.pm#4 $ +use Tk qw($XS_VERSION); + +require Exporter; +require DynaLoader; +require AutoLoader; + + +use base qw(Exporter DynaLoader); +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. +@EXPORT = qw( + Above + AllTemporary + AllocAll + AllocNone + AllowExposures + AlreadyGrabbed + Always + AnyButton + AnyKey + AnyModifier + AnyPropertyType + ArcChord + ArcPieSlice + AsyncBoth + AsyncKeyboard + AsyncPointer + AutoRepeatModeDefault + AutoRepeatModeOff + AutoRepeatModeOn + BadAccess + BadAlloc + BadAtom + BadColor + BadCursor + BadDrawable + BadFont + BadGC + BadIDChoice + BadImplementation + BadLength + BadMatch + BadName + BadPixmap + BadRequest + BadValue + BadWindow + Below + BottomIf + Button1 + Button1Mask + Button1MotionMask + Button2 + Button2Mask + Button2MotionMask + Button3 + Button3Mask + Button3MotionMask + Button4 + Button4Mask + Button4MotionMask + Button5 + Button5Mask + Button5MotionMask + ButtonMotionMask + ButtonPress + ButtonPressMask + ButtonRelease + ButtonReleaseMask + CWBackPixel + CWBackPixmap + CWBackingPixel + CWBackingPlanes + CWBackingStore + CWBitGravity + CWBorderPixel + CWBorderPixmap + CWBorderWidth + CWColormap + CWCursor + CWDontPropagate + CWEventMask + CWHeight + CWOverrideRedirect + CWSaveUnder + CWSibling + CWStackMode + CWWidth + CWWinGravity + CWX + CWY + CapButt + CapNotLast + CapProjecting + CapRound + CenterGravity + CirculateNotify + CirculateRequest + ClientMessage + ClipByChildren + ColormapChangeMask + ColormapInstalled + ColormapNotify + ColormapUninstalled + Complex + ConfigureNotify + ConfigureRequest + ControlMapIndex + ControlMask + Convex + CoordModeOrigin + CoordModePrevious + CopyFromParent + CreateNotify + CurrentTime + CursorShape + DefaultBlanking + DefaultExposures + DestroyAll + DestroyNotify + DirectColor + DisableAccess + DisableScreenInterval + DisableScreenSaver + DoBlue + DoGreen + DoRed + DontAllowExposures + DontPreferBlanking + EastGravity + EnableAccess + EnterNotify + EnterWindowMask + EvenOddRule + Expose + ExposureMask + FamilyChaos + FamilyDECnet + FamilyInternet + FillOpaqueStippled + FillSolid + FillStippled + FillTiled + FirstExtensionError + FocusChangeMask + FocusIn + FocusOut + FontChange + FontLeftToRight + FontRightToLeft + ForgetGravity + GCArcMode + GCBackground + GCCapStyle + GCClipMask + GCClipXOrigin + GCClipYOrigin + GCDashList + GCDashOffset + GCFillRule + GCFillStyle + GCFont + GCForeground + GCFunction + GCGraphicsExposures + GCJoinStyle + GCLastBit + GCLineStyle + GCLineWidth + GCPlaneMask + GCStipple + GCSubwindowMode + GCTile + GCTileStipXOrigin + GCTileStipYOrigin + GXand + GXandInverted + GXandReverse + GXclear + GXcopy + GXcopyInverted + GXequiv + GXinvert + GXnand + GXnoop + GXnor + GXor + GXorInverted + GXorReverse + GXset + GXxor + GrabFrozen + GrabInvalidTime + GrabModeAsync + GrabModeSync + GrabNotViewable + GrabSuccess + GraphicsExpose + GravityNotify + GrayScale + HostDelete + HostInsert + IncludeInferiors + InputFocus + InputOnly + InputOutput + IsUnmapped + IsUnviewable + IsViewable + JoinBevel + JoinMiter + JoinRound + KBAutoRepeatMode + KBBellDuration + KBBellPercent + KBBellPitch + KBKey + KBKeyClickPercent + KBLed + KBLedMode + KeyPress + KeyPressMask + KeyRelease + KeyReleaseMask + KeymapNotify + KeymapStateMask + LASTEvent + LSBFirst + LastExtensionError + LeaveNotify + LeaveWindowMask + LedModeOff + LedModeOn + LineDoubleDash + LineOnOffDash + LineSolid + LockMapIndex + LockMask + LowerHighest + MSBFirst + MapNotify + MapRequest + MappingBusy + MappingFailed + MappingKeyboard + MappingModifier + MappingNotify + MappingPointer + MappingSuccess + Mod1MapIndex + Mod1Mask + Mod2MapIndex + Mod2Mask + Mod3MapIndex + Mod3Mask + Mod4MapIndex + Mod4Mask + Mod5MapIndex + Mod5Mask + MotionNotify + NoEventMask + NoExpose + NoSymbol + Nonconvex + None + NorthEastGravity + NorthGravity + NorthWestGravity + NotUseful + NotifyAncestor + NotifyDetailNone + NotifyGrab + NotifyHint + NotifyInferior + NotifyNonlinear + NotifyNonlinearVirtual + NotifyNormal + NotifyPointer + NotifyPointerRoot + NotifyUngrab + NotifyVirtual + NotifyWhileGrabbed + Opposite + OwnerGrabButtonMask + ParentRelative + PlaceOnBottom + PlaceOnTop + PointerMotionHintMask + PointerMotionMask + PointerRoot + PointerWindow + PreferBlanking + PropModeAppend + PropModePrepend + PropModeReplace + PropertyChangeMask + PropertyDelete + PropertyNewValue + PropertyNotify + PseudoColor + RaiseLowest + ReparentNotify + ReplayKeyboard + ReplayPointer + ResizeRedirectMask + ResizeRequest + RetainPermanent + RetainTemporary + RevertToNone + RevertToParent + RevertToPointerRoot + ScreenSaverActive + ScreenSaverReset + SelectionClear + SelectionNotify + SelectionRequest + SetModeDelete + SetModeInsert + ShiftMapIndex + ShiftMask + SouthEastGravity + SouthGravity + SouthWestGravity + StaticColor + StaticGravity + StaticGray + StippleShape + StructureNotifyMask + SubstructureNotifyMask + SubstructureRedirectMask + Success + SyncBoth + SyncKeyboard + SyncPointer + TileShape + TopIf + TrueColor + UnmapGravity + UnmapNotify + Unsorted + VisibilityChangeMask + VisibilityFullyObscured + VisibilityNotify + VisibilityPartiallyObscured + VisibilityUnobscured + WestGravity + WhenMapped + WindingRule + XYBitmap + XYPixmap + X_H + X_PROTOCOL + X_PROTOCOL_REVISION + YSorted + YXBanded + YXSorted + ZPixmap +); + +sub AUTOLOAD { + # This AUTOLOAD is used to 'autoload' constants from the constant() + # XS function. If a constant is not found then control is passed + # to the AUTOLOAD in AutoLoader. + + my $constname; + ($constname = $AUTOLOAD) =~ s/.*:://; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($! != 0) { + if ($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + croak "Your vendor has not defined X macro $constname"; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + +bootstrap Tk::X; + +# Preloaded methods go here. + +# Autoload methods go after =cut, and are processed by the autosplit program. + +1; +__END__ +# Below is the stub of documentation for your module. You better edit it! + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Tk/X11/X.h b/Master/tlpkg/tlperl.old/lib/Tk/X11/X.h new file mode 100644 index 00000000000..95db07f903f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/X11/X.h @@ -0,0 +1,677 @@ +/* + * $XConsortium: X.h,v 1.66 88/09/06 15:55:56 jim Exp $ + */ + +/* Definitions for the X window system likely to be used by applications */ + +#ifndef X_H +#define X_H + +/*********************************************************** +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +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 names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, 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. + +******************************************************************/ +#define X_PROTOCOL 11 /* current protocol version */ +#define X_PROTOCOL_REVISION 0 /* current minor version */ + +#if defined(MAC_TCL) || defined(MAC_OSX_TK) +# define Cursor XCursor +# define Region XRegion +#endif + +/* Resources */ + +#ifdef _WIN64 +typedef __int64 XID; +#else +typedef unsigned long XID; +#endif + +typedef XID Window; +typedef XID Drawable; +typedef XID Font; +typedef XID Pixmap; +typedef XID Cursor; +typedef XID Colormap; +typedef XID GContext; +typedef XID KeySym; + +typedef unsigned long Mask; + +typedef unsigned long Atom; + +typedef unsigned long VisualID; + +typedef unsigned long Time; + +typedef unsigned long KeyCode; /* In order to use IME, the Macintosh needs + * to pack 3 bytes into the keyCode field in + * the XEvent. In the real X.h, a KeyCode is + * defined as a short, which wouldn't be big + * enough. */ + +/***************************************************************** + * RESERVED RESOURCE AND CONSTANT DEFINITIONS + *****************************************************************/ + +#define None 0L /* universal null resource or null atom */ + +#define ParentRelative 1L /* background pixmap in CreateWindow + and ChangeWindowAttributes */ + +#define CopyFromParent 0L /* border pixmap in CreateWindow + and ChangeWindowAttributes + special VisualID and special window + class passed to CreateWindow */ + +#define PointerWindow 0L /* destination window in SendEvent */ +#define InputFocus 1L /* destination window in SendEvent */ + +#define PointerRoot 1L /* focus window in SetInputFocus */ + +#define AnyPropertyType 0L /* special Atom, passed to GetProperty */ + +#define AnyKey 0L /* special Key Code, passed to GrabKey */ + +#define AnyButton 0L /* special Button Code, passed to GrabButton */ + +#define AllTemporary 0L /* special Resource ID passed to KillClient */ + +#define CurrentTime 0L /* special Time */ + +#define NoSymbol 0L /* special KeySym */ + +/***************************************************************** + * EVENT DEFINITIONS + *****************************************************************/ + +/* Input Event Masks. Used as event-mask window attribute and as arguments + to Grab requests. Not to be confused with event names. */ + +#define NoEventMask 0L +#define KeyPressMask (1L<<0) +#define KeyReleaseMask (1L<<1) +#define ButtonPressMask (1L<<2) +#define ButtonReleaseMask (1L<<3) +#define EnterWindowMask (1L<<4) +#define LeaveWindowMask (1L<<5) +#define PointerMotionMask (1L<<6) +#define PointerMotionHintMask (1L<<7) +#define Button1MotionMask (1L<<8) +#define Button2MotionMask (1L<<9) +#define Button3MotionMask (1L<<10) +#define Button4MotionMask (1L<<11) +#define Button5MotionMask (1L<<12) +#define ButtonMotionMask (1L<<13) +#define KeymapStateMask (1L<<14) +#define ExposureMask (1L<<15) +#define VisibilityChangeMask (1L<<16) +#define StructureNotifyMask (1L<<17) +#define ResizeRedirectMask (1L<<18) +#define SubstructureNotifyMask (1L<<19) +#define SubstructureRedirectMask (1L<<20) +#define FocusChangeMask (1L<<21) +#define PropertyChangeMask (1L<<22) +#define ColormapChangeMask (1L<<23) +#define OwnerGrabButtonMask (1L<<24) + +/* Event names. Used in "type" field in XEvent structures. Not to be +confused with event masks above. They start from 2 because 0 and 1 +are reserved in the protocol for errors and replies. */ + +#define KeyPress 2 +#define KeyRelease 3 +#define ButtonPress 4 +#define ButtonRelease 5 +#define MotionNotify 6 +#define EnterNotify 7 +#define LeaveNotify 8 +#define FocusIn 9 +#define FocusOut 10 +#define KeymapNotify 11 +#define Expose 12 +#define GraphicsExpose 13 +#define NoExpose 14 +#define VisibilityNotify 15 +#define CreateNotify 16 +#define DestroyNotify 17 +#define UnmapNotify 18 +#define MapNotify 19 +#define MapRequest 20 +#define ReparentNotify 21 +#define ConfigureNotify 22 +#define ConfigureRequest 23 +#define GravityNotify 24 +#define ResizeRequest 25 +#define CirculateNotify 26 +#define CirculateRequest 27 +#define PropertyNotify 28 +#define SelectionClear 29 +#define SelectionRequest 30 +#define SelectionNotify 31 +#define ColormapNotify 32 +#define ClientMessage 33 +#define MappingNotify 34 +#define LASTEvent 35 /* must be bigger than any event # */ + + +/* Key masks. Used as modifiers to GrabButton and GrabKey, results of QueryPointer, + state in various key-, mouse-, and button-related events. */ + +#define ShiftMask (1<<0) +#define LockMask (1<<1) +#define ControlMask (1<<2) +#define Mod1Mask (1<<3) +#define Mod2Mask (1<<4) +#define Mod3Mask (1<<5) +#define Mod4Mask (1<<6) +#define Mod5Mask (1<<7) + +/* modifier names. Used to build a SetModifierMapping request or + to read a GetModifierMapping request. These correspond to the + masks defined above. */ +#define ShiftMapIndex 0 +#define LockMapIndex 1 +#define ControlMapIndex 2 +#define Mod1MapIndex 3 +#define Mod2MapIndex 4 +#define Mod3MapIndex 5 +#define Mod4MapIndex 6 +#define Mod5MapIndex 7 + + +/* button masks. Used in same manner as Key masks above. Not to be confused + with button names below. */ + +#define Button1Mask (1<<8) +#define Button2Mask (1<<9) +#define Button3Mask (1<<10) +#define Button4Mask (1<<11) +#define Button5Mask (1<<12) + +#define AnyModifier (1<<15) /* used in GrabButton, GrabKey */ + + +/* button names. Used as arguments to GrabButton and as detail in ButtonPress + and ButtonRelease events. Not to be confused with button masks above. + Note that 0 is already defined above as "AnyButton". */ + +#define Button1 1 +#define Button2 2 +#define Button3 3 +#define Button4 4 +#define Button5 5 + +/* Notify modes */ + +#define NotifyNormal 0 +#define NotifyGrab 1 +#define NotifyUngrab 2 +#define NotifyWhileGrabbed 3 + +#define NotifyHint 1 /* for MotionNotify events */ + +/* Notify detail */ + +#define NotifyAncestor 0 +#define NotifyVirtual 1 +#define NotifyInferior 2 +#define NotifyNonlinear 3 +#define NotifyNonlinearVirtual 4 +#define NotifyPointer 5 +#define NotifyPointerRoot 6 +#define NotifyDetailNone 7 + +/* Visibility notify */ + +#define VisibilityUnobscured 0 +#define VisibilityPartiallyObscured 1 +#define VisibilityFullyObscured 2 + +/* Circulation request */ + +#define PlaceOnTop 0 +#define PlaceOnBottom 1 + +/* protocol families */ + +#define FamilyInternet 0 +#define FamilyDECnet 1 +#define FamilyChaos 2 + +/* Property notification */ + +#define PropertyNewValue 0 +#define PropertyDelete 1 + +/* Color Map notification */ + +#define ColormapUninstalled 0 +#define ColormapInstalled 1 + +/* GrabPointer, GrabButton, GrabKeyboard, GrabKey Modes */ + +#define GrabModeSync 0 +#define GrabModeAsync 1 + +/* GrabPointer, GrabKeyboard reply status */ + +#define GrabSuccess 0 +#define AlreadyGrabbed 1 +#define GrabInvalidTime 2 +#define GrabNotViewable 3 +#define GrabFrozen 4 + +/* AllowEvents modes */ + +#define AsyncPointer 0 +#define SyncPointer 1 +#define ReplayPointer 2 +#define AsyncKeyboard 3 +#define SyncKeyboard 4 +#define ReplayKeyboard 5 +#define AsyncBoth 6 +#define SyncBoth 7 + +/* Used in SetInputFocus, GetInputFocus */ + +#define RevertToNone (int)None +#define RevertToPointerRoot (int)PointerRoot +#define RevertToParent 2 + +/***************************************************************** + * ERROR CODES + *****************************************************************/ + +#define Success 0 /* everything's okay */ +#define BadRequest 1 /* bad request code */ +#define BadValue 2 /* int parameter out of range */ +#define BadWindow 3 /* parameter not a Window */ +#define BadPixmap 4 /* parameter not a Pixmap */ +#define BadAtom 5 /* parameter not an Atom */ +#define BadCursor 6 /* parameter not a Cursor */ +#define BadFont 7 /* parameter not a Font */ +#define BadMatch 8 /* parameter mismatch */ +#define BadDrawable 9 /* parameter not a Pixmap or Window */ +#define BadAccess 10 /* depending on context: + - key/button already grabbed + - attempt to free an illegal + cmap entry + - attempt to store into a read-only + color map entry. + - attempt to modify the access control + list from other than the local host. + */ +#define BadAlloc 11 /* insufficient resources */ +#define BadColor 12 /* no such colormap */ +#define BadGC 13 /* parameter not a GC */ +#define BadIDChoice 14 /* choice not in range or already used */ +#define BadName 15 /* font or color name doesn't exist */ +#define BadLength 16 /* Request length incorrect */ +#define BadImplementation 17 /* server is defective */ + +#define FirstExtensionError 128 +#define LastExtensionError 255 + +/***************************************************************** + * WINDOW DEFINITIONS + *****************************************************************/ + +/* Window classes used by CreateWindow */ +/* Note that CopyFromParent is already defined as 0 above */ + +#define InputOutput 1 +#define InputOnly 2 + +/* Window attributes for CreateWindow and ChangeWindowAttributes */ + +#define CWBackPixmap (1L<<0) +#define CWBackPixel (1L<<1) +#define CWBorderPixmap (1L<<2) +#define CWBorderPixel (1L<<3) +#define CWBitGravity (1L<<4) +#define CWWinGravity (1L<<5) +#define CWBackingStore (1L<<6) +#define CWBackingPlanes (1L<<7) +#define CWBackingPixel (1L<<8) +#define CWOverrideRedirect (1L<<9) +#define CWSaveUnder (1L<<10) +#define CWEventMask (1L<<11) +#define CWDontPropagate (1L<<12) +#define CWColormap (1L<<13) +#define CWCursor (1L<<14) + +/* ConfigureWindow structure */ + +#define CWX (1<<0) +#define CWY (1<<1) +#define CWWidth (1<<2) +#define CWHeight (1<<3) +#define CWBorderWidth (1<<4) +#define CWSibling (1<<5) +#define CWStackMode (1<<6) + + +/* Bit Gravity */ + +#define ForgetGravity 0 +#define NorthWestGravity 1 +#define NorthGravity 2 +#define NorthEastGravity 3 +#define WestGravity 4 +#define CenterGravity 5 +#define EastGravity 6 +#define SouthWestGravity 7 +#define SouthGravity 8 +#define SouthEastGravity 9 +#define StaticGravity 10 + +/* Window gravity + bit gravity above */ + +#define UnmapGravity 0 + +/* Used in CreateWindow for backing-store hint */ + +#define NotUseful 0 +#define WhenMapped 1 +#define Always 2 + +/* Used in GetWindowAttributes reply */ + +#define IsUnmapped 0 +#define IsUnviewable 1 +#define IsViewable 2 + +/* Used in ChangeSaveSet */ + +#define SetModeInsert 0 +#define SetModeDelete 1 + +/* Used in ChangeCloseDownMode */ + +#define DestroyAll 0 +#define RetainPermanent 1 +#define RetainTemporary 2 + +/* Window stacking method (in configureWindow) */ + +#define Above 0 +#define Below 1 +#define TopIf 2 +#define BottomIf 3 +#define Opposite 4 + +/* Circulation direction */ + +#define RaiseLowest 0 +#define LowerHighest 1 + +/* Property modes */ + +#define PropModeReplace 0 +#define PropModePrepend 1 +#define PropModeAppend 2 + +/***************************************************************** + * GRAPHICS DEFINITIONS + *****************************************************************/ + +/* graphics functions, as in GC.alu */ + +#define GXclear 0x0 /* 0 */ +#define GXand 0x1 /* src AND dst */ +#define GXandReverse 0x2 /* src AND NOT dst */ +#define GXcopy 0x3 /* src */ +#define GXandInverted 0x4 /* NOT src AND dst */ +#define GXnoop 0x5 /* dst */ +#define GXxor 0x6 /* src XOR dst */ +#define GXor 0x7 /* src OR dst */ +#define GXnor 0x8 /* NOT src AND NOT dst */ +#define GXequiv 0x9 /* NOT src XOR dst */ +#define GXinvert 0xa /* NOT dst */ +#define GXorReverse 0xb /* src OR NOT dst */ +#define GXcopyInverted 0xc /* NOT src */ +#define GXorInverted 0xd /* NOT src OR dst */ +#define GXnand 0xe /* NOT src OR NOT dst */ +#define GXset 0xf /* 1 */ + +/* LineStyle */ + +#define LineSolid 0 +#define LineOnOffDash 1 +#define LineDoubleDash 2 + +/* capStyle */ + +#define CapNotLast 0 +#define CapButt 1 +#define CapRound 2 +#define CapProjecting 3 + +/* joinStyle */ + +#define JoinMiter 0 +#define JoinRound 1 +#define JoinBevel 2 + +/* fillStyle */ + +#define FillSolid 0 +#define FillTiled 1 +#define FillStippled 2 +#define FillOpaqueStippled 3 + +/* fillRule */ + +#define EvenOddRule 0 +#define WindingRule 1 + +/* subwindow mode */ + +#define ClipByChildren 0 +#define IncludeInferiors 1 + +/* SetClipRectangles ordering */ + +#define Unsorted 0 +#define YSorted 1 +#define YXSorted 2 +#define YXBanded 3 + +/* CoordinateMode for drawing routines */ + +#define CoordModeOrigin 0 /* relative to the origin */ +#define CoordModePrevious 1 /* relative to previous point */ + +/* Polygon shapes */ + +#define Complex 0 /* paths may intersect */ +#define Nonconvex 1 /* no paths intersect, but not convex */ +#define Convex 2 /* wholly convex */ + +/* Arc modes for PolyFillArc */ + +#define ArcChord 0 /* join endpoints of arc */ +#define ArcPieSlice 1 /* join endpoints to center of arc */ + +/* GC components: masks used in CreateGC, CopyGC, ChangeGC, OR'ed into + GC.stateChanges */ + +#define GCFunction (1L<<0) +#define GCPlaneMask (1L<<1) +#define GCForeground (1L<<2) +#define GCBackground (1L<<3) +#define GCLineWidth (1L<<4) +#define GCLineStyle (1L<<5) +#define GCCapStyle (1L<<6) +#define GCJoinStyle (1L<<7) +#define GCFillStyle (1L<<8) +#define GCFillRule (1L<<9) +#define GCTile (1L<<10) +#define GCStipple (1L<<11) +#define GCTileStipXOrigin (1L<<12) +#define GCTileStipYOrigin (1L<<13) +#define GCFont (1L<<14) +#define GCSubwindowMode (1L<<15) +#define GCGraphicsExposures (1L<<16) +#define GCClipXOrigin (1L<<17) +#define GCClipYOrigin (1L<<18) +#define GCClipMask (1L<<19) +#define GCDashOffset (1L<<20) +#define GCDashList (1L<<21) +#define GCArcMode (1L<<22) + +#define GCLastBit 22 +/***************************************************************** + * FONTS + *****************************************************************/ + +/* used in QueryFont -- draw direction */ + +#define FontLeftToRight 0 +#define FontRightToLeft 1 + +#define FontChange 255 + +/***************************************************************** + * IMAGING + *****************************************************************/ + +/* ImageFormat -- PutImage, GetImage */ + +#define XYBitmap 0 /* depth 1, XYFormat */ +#define XYPixmap 1 /* depth == drawable depth */ +#define ZPixmap 2 /* depth == drawable depth */ + +/***************************************************************** + * COLOR MAP STUFF + *****************************************************************/ + +/* For CreateColormap */ + +#define AllocNone 0 /* create map with no entries */ +#define AllocAll 1 /* allocate entire map writeable */ + + +/* Flags used in StoreNamedColor, StoreColors */ + +#define DoRed (1<<0) +#define DoGreen (1<<1) +#define DoBlue (1<<2) + +/***************************************************************** + * CURSOR STUFF + *****************************************************************/ + +/* QueryBestSize Class */ + +#define CursorShape 0 /* largest size that can be displayed */ +#define TileShape 1 /* size tiled fastest */ +#define StippleShape 2 /* size stippled fastest */ + +/***************************************************************** + * KEYBOARD/POINTER STUFF + *****************************************************************/ + +#define AutoRepeatModeOff 0 +#define AutoRepeatModeOn 1 +#define AutoRepeatModeDefault 2 + +#define LedModeOff 0 +#define LedModeOn 1 + +/* masks for ChangeKeyboardControl */ + +#define KBKeyClickPercent (1L<<0) +#define KBBellPercent (1L<<1) +#define KBBellPitch (1L<<2) +#define KBBellDuration (1L<<3) +#define KBLed (1L<<4) +#define KBLedMode (1L<<5) +#define KBKey (1L<<6) +#define KBAutoRepeatMode (1L<<7) + +#define MappingSuccess 0 +#define MappingBusy 1 +#define MappingFailed 2 + +#define MappingModifier 0 +#define MappingKeyboard 1 +#define MappingPointer 2 + +/***************************************************************** + * SCREEN SAVER STUFF + *****************************************************************/ + +#define DontPreferBlanking 0 +#define PreferBlanking 1 +#define DefaultBlanking 2 + +#define DisableScreenSaver 0 +#define DisableScreenInterval 0 + +#define DontAllowExposures 0 +#define AllowExposures 1 +#define DefaultExposures 2 + +/* for ForceScreenSaver */ + +#define ScreenSaverReset 0 +#define ScreenSaverActive 1 + +/***************************************************************** + * HOSTS AND CONNECTIONS + *****************************************************************/ + +/* for ChangeHosts */ + +#define HostInsert 0 +#define HostDelete 1 + +/* for ChangeAccessControl */ + +#define EnableAccess 1 +#define DisableAccess 0 + +/* Display classes used in opening the connection + * Note that the statically allocated ones are even numbered and the + * dynamically changeable ones are odd numbered */ + +#define StaticGray 0 +#define GrayScale 1 +#define StaticColor 2 +#define PseudoColor 3 +#define TrueColor 4 +#define DirectColor 5 + + +/* Byte order used in imageByteOrder and bitmapBitOrder */ + +#define LSBFirst 0 +#define MSBFirst 1 + +#if defined(MAC_TCL) || defined(MAC_OSX_TK) +# undef Cursor +# undef Region +#endif + +#endif /* X_H */ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/X11/Xatom.h b/Master/tlpkg/tlperl.old/lib/Tk/X11/Xatom.h new file mode 100644 index 00000000000..485a4236db8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/X11/Xatom.h @@ -0,0 +1,79 @@ +#ifndef XATOM_H +#define XATOM_H 1 + +/* THIS IS A GENERATED FILE + * + * Do not change! Changing this file implies a protocol change! + */ + +#define XA_PRIMARY ((Atom) 1) +#define XA_SECONDARY ((Atom) 2) +#define XA_ARC ((Atom) 3) +#define XA_ATOM ((Atom) 4) +#define XA_BITMAP ((Atom) 5) +#define XA_CARDINAL ((Atom) 6) +#define XA_COLORMAP ((Atom) 7) +#define XA_CURSOR ((Atom) 8) +#define XA_CUT_BUFFER0 ((Atom) 9) +#define XA_CUT_BUFFER1 ((Atom) 10) +#define XA_CUT_BUFFER2 ((Atom) 11) +#define XA_CUT_BUFFER3 ((Atom) 12) +#define XA_CUT_BUFFER4 ((Atom) 13) +#define XA_CUT_BUFFER5 ((Atom) 14) +#define XA_CUT_BUFFER6 ((Atom) 15) +#define XA_CUT_BUFFER7 ((Atom) 16) +#define XA_DRAWABLE ((Atom) 17) +#define XA_FONT ((Atom) 18) +#define XA_INTEGER ((Atom) 19) +#define XA_PIXMAP ((Atom) 20) +#define XA_POINT ((Atom) 21) +#define XA_RECTANGLE ((Atom) 22) +#define XA_RESOURCE_MANAGER ((Atom) 23) +#define XA_RGB_COLOR_MAP ((Atom) 24) +#define XA_RGB_BEST_MAP ((Atom) 25) +#define XA_RGB_BLUE_MAP ((Atom) 26) +#define XA_RGB_DEFAULT_MAP ((Atom) 27) +#define XA_RGB_GRAY_MAP ((Atom) 28) +#define XA_RGB_GREEN_MAP ((Atom) 29) +#define XA_RGB_RED_MAP ((Atom) 30) +#define XA_STRING ((Atom) 31) +#define XA_VISUALID ((Atom) 32) +#define XA_WINDOW ((Atom) 33) +#define XA_WM_COMMAND ((Atom) 34) +#define XA_WM_HINTS ((Atom) 35) +#define XA_WM_CLIENT_MACHINE ((Atom) 36) +#define XA_WM_ICON_NAME ((Atom) 37) +#define XA_WM_ICON_SIZE ((Atom) 38) +#define XA_WM_NAME ((Atom) 39) +#define XA_WM_NORMAL_HINTS ((Atom) 40) +#define XA_WM_SIZE_HINTS ((Atom) 41) +#define XA_WM_ZOOM_HINTS ((Atom) 42) +#define XA_MIN_SPACE ((Atom) 43) +#define XA_NORM_SPACE ((Atom) 44) +#define XA_MAX_SPACE ((Atom) 45) +#define XA_END_SPACE ((Atom) 46) +#define XA_SUPERSCRIPT_X ((Atom) 47) +#define XA_SUPERSCRIPT_Y ((Atom) 48) +#define XA_SUBSCRIPT_X ((Atom) 49) +#define XA_SUBSCRIPT_Y ((Atom) 50) +#define XA_UNDERLINE_POSITION ((Atom) 51) +#define XA_UNDERLINE_THICKNESS ((Atom) 52) +#define XA_STRIKEOUT_ASCENT ((Atom) 53) +#define XA_STRIKEOUT_DESCENT ((Atom) 54) +#define XA_ITALIC_ANGLE ((Atom) 55) +#define XA_X_HEIGHT ((Atom) 56) +#define XA_QUAD_WIDTH ((Atom) 57) +#define XA_WEIGHT ((Atom) 58) +#define XA_POINT_SIZE ((Atom) 59) +#define XA_RESOLUTION ((Atom) 60) +#define XA_COPYRIGHT ((Atom) 61) +#define XA_NOTICE ((Atom) 62) +#define XA_FONT_NAME ((Atom) 63) +#define XA_FAMILY_NAME ((Atom) 64) +#define XA_FULL_NAME ((Atom) 65) +#define XA_CAP_HEIGHT ((Atom) 66) +#define XA_WM_CLASS ((Atom) 67) +#define XA_WM_TRANSIENT_FOR ((Atom) 68) + +#define XA_LAST_PREDEFINED ((Atom) 68) +#endif /* XATOM_H */ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/X11/Xfuncproto.h b/Master/tlpkg/tlperl.old/lib/Tk/X11/Xfuncproto.h new file mode 100644 index 00000000000..a59379b3b65 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/X11/Xfuncproto.h @@ -0,0 +1,60 @@ +/* $XConsortium: Xfuncproto.h,v 1.7 91/05/13 20:49:21 rws Exp $ */ +/* + * Copyright 1989, 1991 by the Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, 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. + * + */ + +/* Definitions to make function prototypes manageable */ + +#ifndef _XFUNCPROTO_H_ +#define _XFUNCPROTO_H_ + +#ifndef NeedFunctionPrototypes +#define NeedFunctionPrototypes 1 +#endif /* NeedFunctionPrototypes */ + +#ifndef NeedVarargsPrototypes +#define NeedVarargsPrototypes 0 +#endif /* NeedVarargsPrototypes */ + +#if NeedFunctionPrototypes + +#ifndef NeedNestedPrototypes +#define NeedNestedPrototypes 1 +#endif /* NeedNestedPrototypes */ + +#ifndef _Xconst +#define _Xconst const +#endif /* _Xconst */ + +#ifndef NeedWidePrototypes +#ifdef NARROWPROTO +#define NeedWidePrototypes 0 +#else +#define NeedWidePrototypes 1 /* default to make interropt. easier */ +#endif +#endif /* NeedWidePrototypes */ + +#endif /* NeedFunctionPrototypes */ + +#ifdef __cplusplus +#define _XFUNCPROTOBEGIN extern "C" { +#define _XFUNCPROTOEND } +#endif + +#ifndef _XFUNCPROTOBEGIN +#define _XFUNCPROTOBEGIN +#define _XFUNCPROTOEND +#endif /* _XFUNCPROTOBEGIN */ + +#endif /* _XFUNCPROTO_H_ */ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/X11/Xlib.h b/Master/tlpkg/tlperl.old/lib/Tk/X11/Xlib.h new file mode 100644 index 00000000000..0a9e3ddd45d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/X11/Xlib.h @@ -0,0 +1,1214 @@ +/* $XConsortium: Xlib.h,v 11.221 93/07/02 14:13:28 gildea Exp $ */ +/* + * Copyright 1985, 1986, 1987, 1991 by the Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, 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. + * + * X Window System is a Trademark of MIT. + * + */ + + +/* + * Xlib.h - Header definition and support file for the C subroutine + * interface library (Xlib) to the X Window System Protocol (V11). + * Structures and symbols starting with "_" are private to the library. + */ +#ifndef _XLIB_H_ +#define _XLIB_H_ + +#define XlibSpecificationRelease 5 + +#if !defined(MAC_TCL) && !defined(MAC_OSX_TK) +# include <X11/X.h> +#endif +#ifdef MAC_TCL +# include <X.h> +# define Cursor XCursor +# define Region XRegion +#endif +#ifdef MAC_OSX_TK +# include <X11/X.h> +# define Cursor XCursor +# define Region XRegion +#endif + +/* applications should not depend on these two headers being included! */ +#ifdef MAC_TCL +#include <Xfuncproto.h> +#else +#include <X11/Xfuncproto.h> +#endif + +#ifndef X_WCHAR +#ifdef X_NOT_STDC_ENV +#define X_WCHAR +#endif +#endif + +#ifndef X_WCHAR +#include <stddef.h> +#else +/* replace this with #include or typedef appropriate for your system */ +typedef unsigned long wchar_t; +#endif + +typedef char *XPointer; + +#define Bool int +#if defined(MAC_TCL) || defined(MAC_OSX_TK) +/* Use define rather than typedef, since may need to undefine this later */ +#define Status int +#else +typedef int Status; +#endif +#define True 1 +#define False 0 + +#define QueuedAlready 0 +#define QueuedAfterReading 1 +#define QueuedAfterFlush 2 + +#define ConnectionNumber(dpy) ((dpy)->fd) +#define RootWindow(dpy, scr) (((dpy)->screens[(scr)]).root) +#define DefaultScreen(dpy) ((dpy)->default_screen) +#define DefaultRootWindow(dpy) (((dpy)->screens[(dpy)->default_screen]).root) +#define DefaultVisual(dpy, scr) (((dpy)->screens[(scr)]).root_visual) +#define DefaultGC(dpy, scr) (((dpy)->screens[(scr)]).default_gc) +#define BlackPixel(dpy, scr) (((dpy)->screens[(scr)]).black_pixel) +#define WhitePixel(dpy, scr) (((dpy)->screens[(scr)]).white_pixel) +#define AllPlanes ((unsigned long)~0L) +#define QLength(dpy) ((dpy)->qlen) +#define DisplayWidth(dpy, scr) (((dpy)->screens[(scr)]).width) +#define DisplayHeight(dpy, scr) (((dpy)->screens[(scr)]).height) +#define DisplayWidthMM(dpy, scr)(((dpy)->screens[(scr)]).mwidth) +#define DisplayHeightMM(dpy, scr)(((dpy)->screens[(scr)]).mheight) +#define DisplayPlanes(dpy, scr) (((dpy)->screens[(scr)]).root_depth) +#define DisplayCells(dpy, scr) (DefaultVisual((dpy), (scr))->map_entries) +#define ScreenCount(dpy) ((dpy)->nscreens) +#define ServerVendor(dpy) ((dpy)->vendor) +#define ProtocolVersion(dpy) ((dpy)->proto_major_version) +#define ProtocolRevision(dpy) ((dpy)->proto_minor_version) +#define VendorRelease(dpy) ((dpy)->release) +#define DisplayString(dpy) ((dpy)->display_name) +#define DefaultDepth(dpy, scr) (((dpy)->screens[(scr)]).root_depth) +#define DefaultColormap(dpy, scr)(((dpy)->screens[(scr)]).cmap) +#define BitmapUnit(dpy) ((dpy)->bitmap_unit) +#define BitmapBitOrder(dpy) ((dpy)->bitmap_bit_order) +#define BitmapPad(dpy) ((dpy)->bitmap_pad) +#define ImageByteOrder(dpy) ((dpy)->byte_order) +#define NextRequest(dpy) ((dpy)->request + 1) +#define LastKnownRequestProcessed(dpy) ((dpy)->last_request_read) + +/* macros for screen oriented applications (toolkit) */ +#define ScreenOfDisplay(dpy, scr)(&((dpy)->screens[(scr)])) +#define DefaultScreenOfDisplay(dpy) (&((dpy)->screens[(dpy)->default_screen])) +#define DisplayOfScreen(s) ((s)->display) +#define RootWindowOfScreen(s) ((s)->root) +#define BlackPixelOfScreen(s) ((s)->black_pixel) +#define WhitePixelOfScreen(s) ((s)->white_pixel) +#define DefaultColormapOfScreen(s)((s)->cmap) +#define DefaultDepthOfScreen(s) ((s)->root_depth) +#define DefaultGCOfScreen(s) ((s)->default_gc) +#define DefaultVisualOfScreen(s)((s)->root_visual) +#define WidthOfScreen(s) ((s)->width) +#define HeightOfScreen(s) ((s)->height) +#define WidthMMOfScreen(s) ((s)->mwidth) +#define HeightMMOfScreen(s) ((s)->mheight) +#define PlanesOfScreen(s) ((s)->root_depth) +#define CellsOfScreen(s) (DefaultVisualOfScreen((s))->map_entries) +#define MinCmapsOfScreen(s) ((s)->min_maps) +#define MaxCmapsOfScreen(s) ((s)->max_maps) +#define DoesSaveUnders(s) ((s)->save_unders) +#define DoesBackingStore(s) ((s)->backing_store) +#define EventMaskOfScreen(s) ((s)->root_input_mask) + +/* + * Extensions need a way to hang private data on some structures. + */ +typedef struct _XExtData { + int number; /* number returned by XRegisterExtension */ + struct _XExtData *next; /* next item on list of data for structure */ + int (*free_private)(); /* called to free private storage */ + XPointer private_data; /* data private to this extension. */ +} XExtData; + +/* + * This file contains structures used by the extension mechanism. + */ +typedef struct { /* public to extension, cannot be changed */ + int extension; /* extension number */ + int major_opcode; /* major op-code assigned by server */ + int first_event; /* first event number for the extension */ + int first_error; /* first error number for the extension */ +} XExtCodes; + +/* + * Data structure for retrieving info about pixmap formats. + */ + +typedef struct { + int depth; + int bits_per_pixel; + int scanline_pad; +} XPixmapFormatValues; + + +/* + * Data structure for setting graphics context. + */ +typedef struct { + int function; /* logical operation */ + unsigned long plane_mask;/* plane mask */ + unsigned long foreground;/* foreground pixel */ + unsigned long background;/* background pixel */ + int line_width; /* line width */ + int line_style; /* LineSolid, LineOnOffDash, LineDoubleDash */ + int cap_style; /* CapNotLast, CapButt, + CapRound, CapProjecting */ + int join_style; /* JoinMiter, JoinRound, JoinBevel */ + int fill_style; /* FillSolid, FillTiled, + FillStippled, FillOpaeueStippled */ + int fill_rule; /* EvenOddRule, WindingRule */ + int arc_mode; /* ArcChord, ArcPieSlice */ + Pixmap tile; /* tile pixmap for tiling operations */ + Pixmap stipple; /* stipple 1 plane pixmap for stipping */ + int ts_x_origin; /* offset for tile or stipple operations */ + int ts_y_origin; + Font font; /* default text font for text operations */ + int subwindow_mode; /* ClipByChildren, IncludeInferiors */ + Bool graphics_exposures;/* boolean, should exposures be generated */ + int clip_x_origin; /* origin for clipping */ + int clip_y_origin; + Pixmap clip_mask; /* bitmap clipping; other calls for rects */ + int dash_offset; /* patterned/dashed line information */ + char dashes; +} XGCValues; + +/* + * Graphics context. The contents of this structure are implementation + * dependent. A GC should be treated as opaque by application code. + */ + +typedef XGCValues *GC; + +/* + * Visual structure; contains information about colormapping possible. + */ +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + VisualID visualid; /* visual id of this visual */ +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ class of screen (monochrome, etc.) */ +#else + int class; /* class of screen (monochrome, etc.) */ +#endif + unsigned long red_mask, green_mask, blue_mask; /* mask values */ + int bits_per_rgb; /* log base 2 of distinct color values */ + int map_entries; /* color map entries */ +} Visual; + +/* + * Depth structure; contains information for each possible depth. + */ +typedef struct { + int depth; /* this depth (Z) of the depth */ + int nvisuals; /* number of Visual types at this depth */ + Visual *visuals; /* list of visuals possible at this depth */ +} Depth; + +/* + * Information about the screen. The contents of this structure are + * implementation dependent. A Screen should be treated as opaque + * by application code. + */ +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + struct _XDisplay *display;/* back pointer to display structure */ + Window root; /* Root window id. */ + int width, height; /* width and height of screen */ + int mwidth, mheight; /* width and height of in millimeters */ + int ndepths; /* number of depths possible */ + Depth *depths; /* list of allowable depths on the screen */ + int root_depth; /* bits per pixel */ + Visual *root_visual; /* root visual */ + GC default_gc; /* GC for the root root visual */ + Colormap cmap; /* default color map */ + unsigned long white_pixel; + unsigned long black_pixel; /* White and Black pixel values */ + int max_maps, min_maps; /* max and min color maps */ + int backing_store; /* Never, WhenMapped, Always */ + Bool save_unders; + long root_input_mask; /* initial root input mask */ +} Screen; + +/* + * Format structure; describes ZFormat data the screen will understand. + */ +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + int depth; /* depth of this image format */ + int bits_per_pixel; /* bits/pixel at this depth */ + int scanline_pad; /* scanline must padded to this multiple */ +} ScreenFormat; + +/* + * Data structure for setting window attributes. + */ +typedef struct { + Pixmap background_pixmap; /* background or None or ParentRelative */ + unsigned long background_pixel; /* background pixel */ + Pixmap border_pixmap; /* border of the window */ + unsigned long border_pixel; /* border pixel value */ + int bit_gravity; /* one of bit gravity values */ + int win_gravity; /* one of the window gravity values */ + int backing_store; /* NotUseful, WhenMapped, Always */ + unsigned long backing_planes;/* planes to be preseved if possible */ + unsigned long backing_pixel;/* value to use in restoring planes */ + Bool save_under; /* should bits under be saved? (popups) */ + long event_mask; /* set of events that should be saved */ + long do_not_propagate_mask; /* set of events that should not propagate */ + Bool override_redirect; /* boolean value for override-redirect */ + Colormap colormap; /* color map to be associated with window */ + Cursor cursor; /* cursor to be displayed (or None) */ +} XSetWindowAttributes; + +typedef struct { + int x, y; /* location of window */ + int width, height; /* width and height of window */ + int border_width; /* border width of window */ + int depth; /* depth of window */ + Visual *visual; /* the associated visual structure */ + Window root; /* root of screen containing window */ +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ InputOutput, InputOnly*/ +#else + int class; /* InputOutput, InputOnly*/ +#endif + int bit_gravity; /* one of bit gravity values */ + int win_gravity; /* one of the window gravity values */ + int backing_store; /* NotUseful, WhenMapped, Always */ + unsigned long backing_planes;/* planes to be preserved if possible */ + unsigned long backing_pixel;/* value to be used when restoring planes */ + Bool save_under; /* boolean, should bits under be saved? */ + Colormap colormap; /* color map to be associated with window */ + Bool map_installed; /* boolean, is color map currently installed*/ + int map_state; /* IsUnmapped, IsUnviewable, IsViewable */ + long all_event_masks; /* set of events all people have interest in*/ + long your_event_mask; /* my event mask */ + long do_not_propagate_mask; /* set of events that should not propagate */ + Bool override_redirect; /* boolean value for override-redirect */ + Screen *screen; /* back pointer to correct screen */ +} XWindowAttributes; + +/* + * Data structure for host setting; getting routines. + * + */ + +typedef struct { + int family; /* for example FamilyInternet */ + int length; /* length of address, in bytes */ + char *address; /* pointer to where to find the bytes */ +} XHostAddress; + +/* + * Data structure for "image" data, used by image manipulation routines. + */ +typedef struct _XImage { + int width, height; /* size of image */ + int xoffset; /* number of pixels offset in X direction */ + int format; /* XYBitmap, XYPixmap, ZPixmap */ + char *data; /* pointer to image data */ + int byte_order; /* data byte order, LSBFirst, MSBFirst */ + int bitmap_unit; /* quant. of scanline 8, 16, 32 */ + int bitmap_bit_order; /* LSBFirst, MSBFirst */ + int bitmap_pad; /* 8, 16, 32 either XY or ZPixmap */ + int depth; /* depth of image */ + int bytes_per_line; /* accelarator to next line */ + int bits_per_pixel; /* bits per pixel (ZPixmap) */ + unsigned long red_mask; /* bits in z arrangment */ + unsigned long green_mask; + unsigned long blue_mask; + XPointer obdata; /* hook for the object routines to hang on */ + struct funcs { /* image manipulation routines */ + struct _XImage *(*create_image)(); +#if NeedFunctionPrototypes + int (*destroy_image) (struct _XImage *); + unsigned long (*get_pixel) (struct _XImage *, int, int); + int (*put_pixel) (struct _XImage *, int, int, unsigned long); + struct _XImage *(*sub_image)(struct _XImage *, int, int, unsigned int, unsigned int); + int (*add_pixel) (struct _XImage *, long); +#else + int (*destroy_image)(); + unsigned long (*get_pixel)(); + int (*put_pixel)(); + struct _XImage *(*sub_image)(); + int (*add_pixel)(); +#endif + } f; +} XImage; + +/* + * Data structure for XReconfigureWindow + */ +typedef struct { + int x, y; + int width, height; + int border_width; + Window sibling; + int stack_mode; +} XWindowChanges; + +/* + * Data structure used by color operations + */ +typedef struct { + unsigned long pixel; + unsigned short red, green, blue; + char flags; /* do_red, do_green, do_blue */ + char pad; +} XColor; + +/* + * Data structures for graphics operations. On most machines, these are + * congruent with the wire protocol structures, so reformatting the data + * can be avoided on these architectures. + */ +typedef struct { + short x1, y1, x2, y2; +} XSegment; + +typedef struct { + short x, y; +} XPoint; + +typedef struct { + short x, y; + unsigned short width, height; +} XRectangle; + +typedef struct { + short x, y; + unsigned short width, height; + short angle1, angle2; +} XArc; + + +/* Data structure for XChangeKeyboardControl */ + +typedef struct { + int key_click_percent; + int bell_percent; + int bell_pitch; + int bell_duration; + int led; + int led_mode; + int key; + int auto_repeat_mode; /* On, Off, Default */ +} XKeyboardControl; + +/* Data structure for XGetKeyboardControl */ + +typedef struct { + int key_click_percent; + int bell_percent; + unsigned int bell_pitch, bell_duration; + unsigned long led_mask; + int global_auto_repeat; + char auto_repeats[32]; +} XKeyboardState; + +/* Data structure for XGetMotionEvents. */ + +typedef struct { + Time time; + short x, y; +} XTimeCoord; + +/* Data structure for X{Set,Get}ModifierMapping */ + +typedef struct { + int max_keypermod; /* The server's max # of keys per modifier */ + KeyCode *modifiermap; /* An 8 by max_keypermod array of modifiers */ +} XModifierKeymap; + + +/* + * Display datatype maintaining display specific data. + * The contents of this structure are implementation dependent. + * A Display should be treated as opaque by application code. + */ +typedef struct _XDisplay { + XExtData *ext_data; /* hook for extension to hang data */ + struct _XFreeFuncs *free_funcs; /* internal free functions */ + int fd; /* Network socket. */ + int conn_checker; /* ugly thing used by _XEventsQueued */ + int proto_major_version;/* maj. version of server's X protocol */ + int proto_minor_version;/* minor version of servers X protocol */ + char *vendor; /* vendor of the server hardware */ + XID resource_base; /* resource ID base */ + XID resource_mask; /* resource ID mask bits */ + XID resource_id; /* allocator current ID */ + int resource_shift; /* allocator shift to correct bits */ + XID (*resource_alloc)(); /* allocator function */ + int byte_order; /* screen byte order, LSBFirst, MSBFirst */ + int bitmap_unit; /* padding and data requirements */ + int bitmap_pad; /* padding requirements on bitmaps */ + int bitmap_bit_order; /* LeastSignificant or MostSignificant */ + int nformats; /* number of pixmap formats in list */ + ScreenFormat *pixmap_format; /* pixmap format list */ + int vnumber; /* Xlib's X protocol version number. */ + int release; /* release of the server */ + struct _XSQEvent *head, *tail; /* Input event queue. */ + int qlen; /* Length of input event queue */ + unsigned long last_request_read; /* seq number of last event read */ + unsigned long request; /* sequence number of last request. */ + char *last_req; /* beginning of last request, or dummy */ + char *buffer; /* Output buffer starting address. */ + char *bufptr; /* Output buffer index pointer. */ + char *bufmax; /* Output buffer maximum+1 address. */ + unsigned max_request_size; /* maximum number 32 bit words in request*/ + struct _XrmHashBucketRec *db; + int (*synchandler)(); /* Synchronization handler */ + char *display_name; /* "host:display" string used on this connect*/ + int default_screen; /* default screen for operations */ + int nscreens; /* number of screens on this server*/ + Screen *screens; /* pointer to list of screens */ + unsigned long motion_buffer; /* size of motion buffer */ + unsigned long flags; /* internal connection flags */ + int min_keycode; /* minimum defined keycode */ + int max_keycode; /* maximum defined keycode */ + KeySym *keysyms; /* This server's keysyms */ + XModifierKeymap *modifiermap; /* This server's modifier keymap */ + int keysyms_per_keycode;/* number of rows */ + char *xdefaults; /* contents of defaults from server */ + char *scratch_buffer; /* place to hang scratch buffer */ + unsigned long scratch_length; /* length of scratch buffer */ + int ext_number; /* extension number on this display */ + struct _XExten *ext_procs; /* extensions initialized on this display */ + /* + * the following can be fixed size, as the protocol defines how + * much address space is available. + * While this could be done using the extension vector, there + * may be MANY events processed, so a search through the extension + * list to find the right procedure for each event might be + * expensive if many extensions are being used. + */ + Bool (*event_vec[128])(); /* vector for wire to event */ + int (*wire_vec[128])(); /* vector for event to wire */ + KeySym lock_meaning; /* for XLookupString */ + struct _XLockInfo *lock; /* multi-thread state, display lock */ + struct _XInternalAsync *async_handlers; /* for internal async */ + unsigned long bigreq_size; /* max size of big requests */ + struct _XLockPtrs *lock_fns; /* pointers to threads functions */ + /* things above this line should not move, for binary compatibility */ + struct _XKeytrans *key_bindings; /* for XLookupString */ + Font cursor_font; /* for XCreateFontCursor */ + struct _XDisplayAtoms *atoms; /* for XInternAtom */ + unsigned int mode_switch; /* keyboard group modifiers */ + struct _XContextDB *context_db; /* context database */ + Bool (**error_vec)(); /* vector for wire to error */ + /* + * Xcms information + */ + struct { + XPointer defaultCCCs; /* pointer to an array of default XcmsCCC */ + XPointer clientCmaps; /* pointer to linked list of XcmsCmapRec */ + XPointer perVisualIntensityMaps; + /* linked list of XcmsIntensityMap */ + } cms; + struct _XIMFilter *im_filters; + struct _XSQEvent *qfree; /* unallocated event queue elements */ + unsigned long next_event_serial_num; /* inserted into next queue elt */ + int (*savedsynchandler)(); /* user synchandler when Xlib usurps */ +} Display; + +#if NeedFunctionPrototypes /* prototypes require event type definitions */ +#undef _XEVENT_ +#endif +#ifndef _XEVENT_ + +#define XMaxTransChars 4 + +/* + * Definitions of specific events. + */ +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window it is reported relative to */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + unsigned int keycode; /* detail */ + Bool same_screen; /* same screen flag */ + char trans_chars[XMaxTransChars]; + /* translated characters */ + int nbytes; +} XKeyEvent; +typedef XKeyEvent XKeyPressedEvent; +typedef XKeyEvent XKeyReleasedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window it is reported relative to */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + unsigned int button; /* detail */ + Bool same_screen; /* same screen flag */ +} XButtonEvent; +typedef XButtonEvent XButtonPressedEvent; +typedef XButtonEvent XButtonReleasedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + char is_hint; /* detail */ + Bool same_screen; /* same screen flag */ +} XMotionEvent; +typedef XMotionEvent XPointerMovedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + int mode; /* NotifyNormal, NotifyGrab, NotifyUngrab */ + int detail; + /* + * NotifyAncestor, NotifyVirtual, NotifyInferior, + * NotifyNonlinear,NotifyNonlinearVirtual + */ + Bool same_screen; /* same screen flag */ + Bool focus; /* boolean focus */ + unsigned int state; /* key or button mask */ +} XCrossingEvent; +typedef XCrossingEvent XEnterWindowEvent; +typedef XCrossingEvent XLeaveWindowEvent; + +typedef struct { + int type; /* FocusIn or FocusOut */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* window of event */ + int mode; /* NotifyNormal, NotifyGrab, NotifyUngrab */ + int detail; + /* + * NotifyAncestor, NotifyVirtual, NotifyInferior, + * NotifyNonlinear,NotifyNonlinearVirtual, NotifyPointer, + * NotifyPointerRoot, NotifyDetailNone + */ +} XFocusChangeEvent; +typedef XFocusChangeEvent XFocusInEvent; +typedef XFocusChangeEvent XFocusOutEvent; + +/* generated on EnterWindow and FocusIn when KeyMapState selected */ +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + char key_vector[32]; +} XKeymapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int x, y; + int width, height; + int count; /* if non-zero, at least this many more */ +} XExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Drawable drawable; + int x, y; + int width, height; + int count; /* if non-zero, at least this many more */ + int major_code; /* core is CopyArea or CopyPlane */ + int minor_code; /* not defined in the core */ +} XGraphicsExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Drawable drawable; + int major_code; /* core is CopyArea or CopyPlane */ + int minor_code; /* not defined in the core */ +} XNoExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int state; /* Visibility state */ +} XVisibilityEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; /* parent of the window */ + Window window; /* window id of window created */ + int x, y; /* window location */ + int width, height; /* size of window */ + int border_width; /* border width */ + Bool override_redirect; /* creation should be overridden */ +} XCreateWindowEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; +} XDestroyWindowEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Bool from_configure; +} XUnmapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Bool override_redirect; /* boolean, is override set... */ +} XMapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; +} XMapRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Window parent; + int x, y; + Bool override_redirect; +} XReparentEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int x, y; + int width, height; + int border_width; + Window above; + Bool override_redirect; +} XConfigureEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int x, y; +} XGravityEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int width, height; +} XResizeRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; + int x, y; + int width, height; + int border_width; + Window above; + int detail; /* Above, Below, TopIf, BottomIf, Opposite */ + unsigned long value_mask; +} XConfigureRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int place; /* PlaceOnTop, PlaceOnBottom */ +} XCirculateEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; + int place; /* PlaceOnTop, PlaceOnBottom */ +} XCirculateRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom atom; + Time time; + int state; /* NewValue, Deleted */ +} XPropertyEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom selection; + Time time; +} XSelectionClearEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window owner; + Window requestor; + Atom selection; + Atom target; + Atom property; + Time time; +} XSelectionRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window requestor; + Atom selection; + Atom target; + Atom property; /* ATOM or None */ + Time time; +} XSelectionEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Colormap colormap; /* COLORMAP or None */ +#if defined(__cplusplus) || defined(c_plusplus) + Bool c_new; /* C++ */ +#else + Bool new; +#endif + int state; /* ColormapInstalled, ColormapUninstalled */ +} XColormapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom message_type; + int format; + union { + char b[20]; + short s[10]; + long l[5]; + } data; +} XClientMessageEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* unused */ + int request; /* one of MappingModifier, MappingKeyboard, + MappingPointer */ + int first_keycode; /* first keycode */ + int count; /* defines range of change w. first_keycode*/ +} XMappingEvent; + +typedef struct { + int type; + Display *display; /* Display the event was read from */ + XID resourceid; /* resource id */ + unsigned long serial; /* serial number of failed request */ + unsigned char error_code; /* error code of failed request */ + unsigned char request_code; /* Major op-code of failed request */ + unsigned char minor_code; /* Minor op-code of failed request */ +} XErrorEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display;/* Display the event was read from */ + Window window; /* window on which event was requested in event mask */ +} XAnyEvent; + +/* + * this union is defined so Xlib can always use the same sized + * event structure internally, to avoid memory fragmentation. + */ +typedef union _XEvent { + int type; /* must not be changed; first element */ + XAnyEvent xany; + XKeyEvent xkey; + XButtonEvent xbutton; + XMotionEvent xmotion; + XCrossingEvent xcrossing; + XFocusChangeEvent xfocus; + XExposeEvent xexpose; + XGraphicsExposeEvent xgraphicsexpose; + XNoExposeEvent xnoexpose; + XVisibilityEvent xvisibility; + XCreateWindowEvent xcreatewindow; + XDestroyWindowEvent xdestroywindow; + XUnmapEvent xunmap; + XMapEvent xmap; + XMapRequestEvent xmaprequest; + XReparentEvent xreparent; + XConfigureEvent xconfigure; + XGravityEvent xgravity; + XResizeRequestEvent xresizerequest; + XConfigureRequestEvent xconfigurerequest; + XCirculateEvent xcirculate; + XCirculateRequestEvent xcirculaterequest; + XPropertyEvent xproperty; + XSelectionClearEvent xselectionclear; + XSelectionRequestEvent xselectionrequest; + XSelectionEvent xselection; + XColormapEvent xcolormap; + XClientMessageEvent xclient; + XMappingEvent xmapping; + XErrorEvent xerror; + XKeymapEvent xkeymap; + long pad[24]; +} XEvent; +#endif + +#define XAllocID(dpy) ((*(dpy)->resource_alloc)((dpy))) + +/* + * per character font metric information. + */ +typedef struct { + short lbearing; /* origin to left edge of raster */ + short rbearing; /* origin to right edge of raster */ + short width; /* advance to next char's origin */ + short ascent; /* baseline to top edge of raster */ + short descent; /* baseline to bottom edge of raster */ + unsigned short attributes; /* per char flags (not predefined) */ +} XCharStruct; + +/* + * To allow arbitrary information with fonts, there are additional properties + * returned. + */ +typedef struct { + Atom name; + unsigned long card32; +} XFontProp; + +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + Font fid; /* Font id for this font */ + unsigned direction; /* hint about direction the font is painted */ + unsigned min_char_or_byte2;/* first character */ + unsigned max_char_or_byte2;/* last character */ + unsigned min_byte1; /* first row that exists */ + unsigned max_byte1; /* last row that exists */ + Bool all_chars_exist;/* flag if all characters have non-zero size*/ + unsigned default_char; /* char to print for undefined character */ + int n_properties; /* how many properties there are */ + XFontProp *properties; /* pointer to array of additional properties*/ + XCharStruct min_bounds; /* minimum bounds over all existing char*/ + XCharStruct max_bounds; /* maximum bounds over all existing char*/ + XCharStruct *per_char; /* first_char to last_char information */ + int ascent; /* log. extent above baseline for spacing */ + int descent; /* log. descent below baseline for spacing */ +} XFontStruct; + +/* + * PolyText routines take these as arguments. + */ +typedef struct { + char *chars; /* pointer to string */ + int nchars; /* number of characters */ + int delta; /* delta between strings */ + Font font; /* font to print it in, None don't change */ +} XTextItem; + +typedef struct { /* normal 16 bit characters are two bytes */ + unsigned char byte1; + unsigned char byte2; +} XChar2b; + +typedef struct { + XChar2b *chars; /* two byte characters */ + int nchars; /* number of characters */ + int delta; /* delta between strings */ + Font font; /* font to print it in, None don't change */ +} XTextItem16; + + +typedef union { Display *display; + GC gc; + Visual *visual; + Screen *screen; + ScreenFormat *pixmap_format; + XFontStruct *font; } XEDataObject; + +typedef struct { + XRectangle max_ink_extent; + XRectangle max_logical_extent; +} XFontSetExtents; + +typedef struct _XFontSet *XFontSet; + +typedef struct { + char *chars; + int nchars; + int delta; + XFontSet font_set; +} XmbTextItem; + +typedef struct { + wchar_t *chars; + int nchars; + int delta; + XFontSet font_set; +} XwcTextItem; + +typedef void (*XIMProc)(); + +typedef struct _XIM *XIM; +typedef struct _XIC *XIC; + +typedef unsigned long XIMStyle; + +typedef struct { + unsigned short count_styles; + XIMStyle *supported_styles; +} XIMStyles; + +#define XIMPreeditArea 0x0001L +#define XIMPreeditCallbacks 0x0002L +#define XIMPreeditPosition 0x0004L +#define XIMPreeditNothing 0x0008L +#define XIMPreeditNone 0x0010L +#define XIMStatusArea 0x0100L +#define XIMStatusCallbacks 0x0200L +#define XIMStatusNothing 0x0400L +#define XIMStatusNone 0x0800L + +#define XNVaNestedList "XNVaNestedList" +#define XNClientWindow "clientWindow" +#define XNInputStyle "inputStyle" +#define XNFocusWindow "focusWindow" +#define XNResourceName "resourceName" +#define XNResourceClass "resourceClass" +#define XNGeometryCallback "geometryCallback" +#define XNFilterEvents "filterEvents" +#define XNPreeditStartCallback "preeditStartCallback" +#define XNPreeditDoneCallback "preeditDoneCallback" +#define XNPreeditDrawCallback "preeditDrawCallback" +#define XNPreeditCaretCallback "preeditCaretCallback" +#define XNPreeditAttributes "preeditAttributes" +#define XNStatusStartCallback "statusStartCallback" +#define XNStatusDoneCallback "statusDoneCallback" +#define XNStatusDrawCallback "statusDrawCallback" +#define XNStatusAttributes "statusAttributes" +#define XNArea "area" +#define XNAreaNeeded "areaNeeded" +#define XNSpotLocation "spotLocation" +#define XNColormap "colorMap" +#define XNStdColormap "stdColorMap" +#define XNForeground "foreground" +#define XNBackground "background" +#define XNBackgroundPixmap "backgroundPixmap" +#define XNFontSet "fontSet" +#define XNLineSpace "lineSpace" +#define XNCursor "cursor" + +#define XBufferOverflow -1 +#define XLookupNone 1 +#define XLookupChars 2 +#define XLookupKeySym 3 +#define XLookupBoth 4 + +#if NeedFunctionPrototypes +typedef void *XVaNestedList; +#else +typedef XPointer XVaNestedList; +#endif + +typedef struct { + XPointer client_data; + XIMProc callback; +} XIMCallback; + +typedef unsigned long XIMFeedback; + +#define XIMReverse 1 +#define XIMUnderline (1<<1) +#define XIMHighlight (1<<2) +#define XIMPrimary (1<<5) +#define XIMSecondary (1<<6) +#define XIMTertiary (1<<7) + +typedef struct _XIMText { + unsigned short length; + XIMFeedback *feedback; + Bool encoding_is_wchar; + union { + char *multi_byte; + wchar_t *wide_char; + } string; +} XIMText; + +typedef struct _XIMPreeditDrawCallbackStruct { + int caret; /* Cursor offset within pre-edit string */ + int chg_first; /* Starting change position */ + int chg_length; /* Length of the change in character count */ + XIMText *text; +} XIMPreeditDrawCallbackStruct; + +typedef enum { + XIMForwardChar, XIMBackwardChar, + XIMForwardWord, XIMBackwardWord, + XIMCaretUp, XIMCaretDown, + XIMNextLine, XIMPreviousLine, + XIMLineStart, XIMLineEnd, + XIMAbsolutePosition, + XIMDontChange +} XIMCaretDirection; + +typedef enum { + XIMIsInvisible, /* Disable caret feedback */ + XIMIsPrimary, /* UI defined caret feedback */ + XIMIsSecondary /* UI defined caret feedback */ +} XIMCaretStyle; + +typedef struct _XIMPreeditCaretCallbackStruct { + int position; /* Caret offset within pre-edit string */ + XIMCaretDirection direction; /* Caret moves direction */ + XIMCaretStyle style; /* Feedback of the caret */ +} XIMPreeditCaretCallbackStruct; + +typedef enum { + XIMTextType, + XIMBitmapType +} XIMStatusDataType; + +typedef struct _XIMStatusDrawCallbackStruct { + XIMStatusDataType type; + union { + XIMText *text; + Pixmap bitmap; + } data; +} XIMStatusDrawCallbackStruct; + +typedef int (*XErrorHandler) ( /* WARNING, this type not in Xlib spec */ +#if NeedFunctionPrototypes + Display* /* display */, + XErrorEvent* /* error_event */ +#endif +); + +_XFUNCPROTOBEGIN + + + +#include "../../../pTk/tkIntXlibDecls.h" + +_XFUNCPROTOEND + +#if defined(MAC_TCL) || defined(MAC_OSX_TK) +# undef Cursor +#endif + +#endif /* _XLIB_H_ */ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/X11/Xutil.h b/Master/tlpkg/tlperl.old/lib/Tk/X11/Xutil.h new file mode 100644 index 00000000000..af44e0e9c2e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/X11/Xutil.h @@ -0,0 +1,855 @@ +/* $XConsortium: Xutil.h,v 11.73 91/07/30 16:21:37 rws Exp $ */ + +/*********************************************************** +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +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 names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, 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. + +******************************************************************/ + +#ifndef _XUTIL_H_ +#define _XUTIL_H_ + +/* You must include <X11/Xlib.h> before including this file */ + +#if defined(MAC_TCL) || defined(MAC_OSX_TK) +# define Region XRegion +#endif + +/* + * Bitmask returned by XParseGeometry(). Each bit tells if the corresponding + * value (x, y, width, height) was found in the parsed string. + */ +#define NoValue 0x0000 +#define XValue 0x0001 +#define YValue 0x0002 +#define WidthValue 0x0004 +#define HeightValue 0x0008 +#define AllValues 0x000F +#define XNegative 0x0010 +#define YNegative 0x0020 + +/* + * new version containing base_width, base_height, and win_gravity fields; + * used with WM_NORMAL_HINTS. + */ +typedef struct { + long flags; /* marks which fields in this structure are defined */ + int x, y; /* obsolete for new window mgrs, but clients */ + int width, height; /* should set so old wm's don't mess up */ + int min_width, min_height; + int max_width, max_height; + int width_inc, height_inc; + struct { + int x; /* numerator */ + int y; /* denominator */ + } min_aspect, max_aspect; + int base_width, base_height; /* added by ICCCM version 1 */ + int win_gravity; /* added by ICCCM version 1 */ +} XSizeHints; + +/* + * The next block of definitions are for window manager properties that + * clients and applications use for communication. + */ + +/* flags argument in size hints */ +#define USPosition (1L << 0) /* user specified x, y */ +#define USSize (1L << 1) /* user specified width, height */ + +#define PPosition (1L << 2) /* program specified position */ +#define PSize (1L << 3) /* program specified size */ +#define PMinSize (1L << 4) /* program specified minimum size */ +#define PMaxSize (1L << 5) /* program specified maximum size */ +#define PResizeInc (1L << 6) /* program specified resize increments */ +#define PAspect (1L << 7) /* program specified min and max aspect ratios */ +#define PBaseSize (1L << 8) /* program specified base for incrementing */ +#define PWinGravity (1L << 9) /* program specified window gravity */ + +/* obsolete */ +#define PAllHints (PPosition|PSize|PMinSize|PMaxSize|PResizeInc|PAspect) + + + +typedef struct { + long flags; /* marks which fields in this structure are defined */ + Bool input; /* does this application rely on the window manager to + get keyboard input? */ + int initial_state; /* see below */ + Pixmap icon_pixmap; /* pixmap to be used as icon */ + Window icon_window; /* window to be used as icon */ + int icon_x, icon_y; /* initial position of icon */ + Pixmap icon_mask; /* icon mask bitmap */ + XID window_group; /* id of related window group */ + /* this structure may be extended in the future */ +} XWMHints; + +/* definition for flags of XWMHints */ + +#define InputHint (1L << 0) +#define StateHint (1L << 1) +#define IconPixmapHint (1L << 2) +#define IconWindowHint (1L << 3) +#define IconPositionHint (1L << 4) +#define IconMaskHint (1L << 5) +#define WindowGroupHint (1L << 6) +#define AllHints (InputHint|StateHint|IconPixmapHint|IconWindowHint| \ +IconPositionHint|IconMaskHint|WindowGroupHint) + +/* definitions for initial window state */ +#define WithdrawnState 0 /* for windows that are not mapped */ +#define NormalState 1 /* most applications want to start this way */ +#define IconicState 3 /* application wants to start as an icon */ + +/* + * Obsolete states no longer defined by ICCCM + */ +#define DontCareState 0 /* don't know or care */ +#define ZoomState 2 /* application wants to start zoomed */ +#define InactiveState 4 /* application believes it is seldom used; */ + /* some wm's may put it on inactive menu */ + + +/* + * new structure for manipulating TEXT properties; used with WM_NAME, + * WM_ICON_NAME, WM_CLIENT_MACHINE, and WM_COMMAND. + */ +typedef struct { + unsigned char *value; /* same as Property routines */ + Atom encoding; /* prop type */ + int format; /* prop data format: 8, 16, or 32 */ + unsigned long nitems; /* number of data items in value */ +} XTextProperty; + +#define XNoMemory -1 +#define XLocaleNotSupported -2 +#define XConverterNotFound -3 + +typedef enum { + XStringStyle, /* STRING */ + XCompoundTextStyle, /* COMPOUND_TEXT */ + XTextStyle, /* text in owner's encoding (current locale)*/ + XStdICCTextStyle /* STRING, else COMPOUND_TEXT */ +} XICCEncodingStyle; + +typedef struct { + int min_width, min_height; + int max_width, max_height; + int width_inc, height_inc; +} XIconSize; + +typedef struct { + char *res_name; + char *res_class; +} XClassHint; + +/* + * These macros are used to give some sugar to the image routines so that + * naive people are more comfortable with them. + */ +#define XDestroyImage(ximage) \ + ((*((ximage)->f.destroy_image))((ximage))) +#define XGetPixel(ximage, x, y) \ + ((*((ximage)->f.get_pixel))((ximage), (x), (y))) +#define XPutPixel(ximage, x, y, pixel) \ + ((*((ximage)->f.put_pixel))((ximage), (x), (y), (pixel))) +#define XSubImage(ximage, x, y, width, height) \ + ((*((ximage)->f.sub_image))((ximage), (x), (y), (width), (height))) +#define XAddPixel(ximage, value) \ + ((*((ximage)->f.add_pixel))((ximage), (value))) + +/* + * Compose sequence status structure, used in calling XLookupString. + */ +typedef struct _XComposeStatus { + XPointer compose_ptr; /* state table pointer */ + int chars_matched; /* match state */ +} XComposeStatus; + +/* + * Keysym macros, used on Keysyms to test for classes of symbols + */ +#define IsKeypadKey(keysym) \ + (((unsigned)(keysym) >= XK_KP_Space) && ((unsigned)(keysym) <= XK_KP_Equal)) + +#define IsCursorKey(keysym) \ + (((unsigned)(keysym) >= XK_Home) && ((unsigned)(keysym) < XK_Select)) + +#define IsPFKey(keysym) \ + (((unsigned)(keysym) >= XK_KP_F1) && ((unsigned)(keysym) <= XK_KP_F4)) + +#define IsFunctionKey(keysym) \ + (((unsigned)(keysym) >= XK_F1) && ((unsigned)(keysym) <= XK_F35)) + +#define IsMiscFunctionKey(keysym) \ + (((unsigned)(keysym) >= XK_Select) && ((unsigned)(keysym) <= XK_Break)) + +#define IsModifierKey(keysym) \ + ((((unsigned)(keysym) >= XK_Shift_L) && ((unsigned)(keysym) <= XK_Hyper_R)) \ + || ((unsigned)(keysym) == XK_Mode_switch) \ + || ((unsigned)(keysym) == XK_Num_Lock)) +/* + * opaque reference to Region data type + */ +typedef struct _XRegion *Region; + +/* Return values from XRectInRegion() */ + +#define RectangleOut 0 +#define RectangleIn 1 +#define RectanglePart 2 + + +/* + * Information used by the visual utility routines to find desired visual + * type from the many visuals a display may support. + */ + +typedef struct { + Visual *visual; + VisualID visualid; + int screen; + int depth; +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ */ +#else + int class; +#endif + unsigned long red_mask; + unsigned long green_mask; + unsigned long blue_mask; + int colormap_size; + int bits_per_rgb; +} XVisualInfo; + +#define VisualNoMask 0x0 +#define VisualIDMask 0x1 +#define VisualScreenMask 0x2 +#define VisualDepthMask 0x4 +#define VisualClassMask 0x8 +#define VisualRedMaskMask 0x10 +#define VisualGreenMaskMask 0x20 +#define VisualBlueMaskMask 0x40 +#define VisualColormapSizeMask 0x80 +#define VisualBitsPerRGBMask 0x100 +#define VisualAllMask 0x1FF + +/* + * This defines a window manager property that clients may use to + * share standard color maps of type RGB_COLOR_MAP: + */ +typedef struct { + Colormap colormap; + unsigned long red_max; + unsigned long red_mult; + unsigned long green_max; + unsigned long green_mult; + unsigned long blue_max; + unsigned long blue_mult; + unsigned long base_pixel; + VisualID visualid; /* added by ICCCM version 1 */ + XID killid; /* added by ICCCM version 1 */ +} XStandardColormap; + +#define ReleaseByFreeingColormap ((XID) 1L) /* for killid field above */ + + +/* + * return codes for XReadBitmapFile and XWriteBitmapFile + */ +#define BitmapSuccess 0 +#define BitmapOpenFailed 1 +#define BitmapFileInvalid 2 +#define BitmapNoMemory 3 + +/**************************************************************** + * + * Context Management + * + ****************************************************************/ + + +/* Associative lookup table return codes */ + +#define XCSUCCESS 0 /* No error. */ +#define XCNOMEM 1 /* Out of memory */ +#define XCNOENT 2 /* No entry in table */ + +typedef int XContext; + +#define XUniqueContext() ((XContext) XrmUniqueQuark()) +#define XStringToContext(string) ((XContext) XrmStringToQuark(string)) + +_XFUNCPROTOBEGIN + +/* The following declarations are alphabetized. */ + +extern XClassHint *XAllocClassHint ( +#if NeedFunctionPrototypes + void +#endif +); + +extern XIconSize *XAllocIconSize ( +#if NeedFunctionPrototypes + void +#endif +); + +extern XSizeHints *XAllocSizeHints ( +#if NeedFunctionPrototypes + void +#endif +); + +extern XStandardColormap *XAllocStandardColormap ( +#if NeedFunctionPrototypes + void +#endif +); + +extern XWMHints *XAllocWMHints ( +#if NeedFunctionPrototypes + void +#endif +); + +extern void XClipBox( +#if NeedFunctionPrototypes + Region /* r */, + XRectangle* /* rect_return */ +#endif +); + +extern Region XCreateRegion( +#if NeedFunctionPrototypes + void +#endif +); + +extern char *XDefaultString( +#if NeedFunctionPrototypes + void +#endif +); + +extern int XDeleteContext( +#if NeedFunctionPrototypes + Display* /* display */, + XID /* rid */, + XContext /* context */ +#endif +); + +extern void XDestroyRegion( +#if NeedFunctionPrototypes + Region /* r */ +#endif +); + +extern void XEmptyRegion( +#if NeedFunctionPrototypes + Region /* r */ +#endif +); + +extern void XEqualRegion( +#if NeedFunctionPrototypes + Region /* r1 */, + Region /* r2 */ +#endif +); + +extern int XFindContext( +#if NeedFunctionPrototypes + Display* /* display */, + XID /* rid */, + XContext /* context */, + XPointer* /* data_return */ +#endif +); + +extern int XGetClassHint( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XClassHint* /* class_hints_return */ +#endif +); + +extern int XGetIconSizes( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XIconSize** /* size_list_return */, + int* /* count_return */ +#endif +); + +extern int XGetNormalHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */ +#endif +); + +extern int XGetRGBColormaps( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XStandardColormap** /* stdcmap_return */, + int* /* count_return */, + Atom /* property */ +#endif +); + +extern int XGetSizeHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + Atom /* property */ +#endif +); + +extern int XGetStandardColormap( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XStandardColormap* /* colormap_return */, + Atom /* property */ +#endif +); + +extern int XGetTextProperty( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* window */, + XTextProperty* /* text_prop_return */, + Atom /* property */ +#endif +); + + +extern int XGetWMClientMachine( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern XWMHints *XGetWMHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */ +#endif +); + +extern int XGetWMIconName( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern int XGetWMName( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern int XGetWMNormalHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + long* /* supplied_return */ +#endif +); + +extern int XGetWMSizeHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + long* /* supplied_return */, + Atom /* property */ +#endif +); + +extern int XGetZoomHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* zhints_return */ +#endif +); + +extern void XIntersectRegion( +#if NeedFunctionPrototypes + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +#endif +); + +extern int XLookupString( +#if NeedFunctionPrototypes + XKeyEvent* /* event_struct */, + char* /* buffer_return */, + int /* bytes_buffer */, + KeySym* /* keysym_return */, + XComposeStatus* /* status_in_out */ +#endif +); + +extern int XMatchVisualInfo( +#if NeedFunctionPrototypes + Display* /* display */, + int /* screen */, + int /* depth */, + int /* class */, + XVisualInfo* /* vinfo_return */ +#endif +); + +extern void XOffsetRegion( +#if NeedFunctionPrototypes + Region /* r */, + int /* dx */, + int /* dy */ +#endif +); + +extern Bool XPointInRegion( +#if NeedFunctionPrototypes + Region /* r */, + int /* x */, + int /* y */ +#endif +); + +extern Region XPolygonRegion( +#if NeedFunctionPrototypes + XPoint* /* points */, + int /* n */, + int /* fill_rule */ +#endif +); + +extern int XRectInRegion( +#if NeedFunctionPrototypes + Region /* r */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */ +#endif +); + +extern int XSaveContext( +#if NeedFunctionPrototypes + Display* /* display */, + XID /* rid */, + XContext /* context */, + _Xconst char* /* data */ +#endif +); + +extern void XSetClassHint( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XClassHint* /* class_hints */ +#endif +); + +extern void XSetIconSizes( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XIconSize* /* size_list */, + int /* count */ +#endif +); + +extern void XSetNormalHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */ +#endif +); + +extern void XSetRGBColormaps( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XStandardColormap* /* stdcmaps */, + int /* count */, + Atom /* property */ +#endif +); + +extern void XSetSizeHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */, + Atom /* property */ +#endif +); + +extern void XSetStandardProperties( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + _Xconst char* /* window_name */, + _Xconst char* /* icon_name */, + Pixmap /* icon_pixmap */, + char** /* argv */, + int /* argc */, + XSizeHints* /* hints */ +#endif +); + +extern void XSetTextProperty( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */, + Atom /* property */ +#endif +); + +extern void XSetWMHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XWMHints* /* wm_hints */ +#endif +); + +extern void XSetWMIconName( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */ +#endif +); + +extern void XSetWMName( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */ +#endif +); + +extern void XSetWMNormalHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */ +#endif +); + +extern void XSetWMProperties( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XTextProperty* /* window_name */, + XTextProperty* /* icon_name */, + char** /* argv */, + int /* argc */, + XSizeHints* /* normal_hints */, + XWMHints* /* wm_hints */, + XClassHint* /* class_hints */ +#endif +); + +extern void XmbSetWMProperties( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + _Xconst char* /* window_name */, + _Xconst char* /* icon_name */, + char** /* argv */, + int /* argc */, + XSizeHints* /* normal_hints */, + XWMHints* /* wm_hints */, + XClassHint* /* class_hints */ +#endif +); + +extern void XSetWMSizeHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */, + Atom /* property */ +#endif +); + +extern void XSetRegion( +#if NeedFunctionPrototypes + Display* /* display */, + GC /* gc */, + Region /* r */ +#endif +); + +extern void XSetStandardColormap( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XStandardColormap* /* colormap */, + Atom /* property */ +#endif +); + +extern void XSetZoomHints( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* w */, + XSizeHints* /* zhints */ +#endif +); + +extern void XShrinkRegion( +#if NeedFunctionPrototypes + Region /* r */, + int /* dx */, + int /* dy */ +#endif +); + +extern void XSubtractRegion( +#if NeedFunctionPrototypes + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +#endif +); + +extern int XmbTextListToTextProperty( +#if NeedFunctionPrototypes + Display* /* display */, + char** /* list */, + int /* count */, + XICCEncodingStyle /* style */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern int XwcTextListToTextProperty( +#if NeedFunctionPrototypes + Display* /* display */, + wchar_t** /* list */, + int /* count */, + XICCEncodingStyle /* style */, + XTextProperty* /* text_prop_return */ +#endif +); + +extern void XwcFreeStringList( +#if NeedFunctionPrototypes + wchar_t** /* list */ +#endif +); + +extern int XTextPropertyToStringList( +#if NeedFunctionPrototypes + XTextProperty* /* text_prop */, + char*** /* list_return */, + int* /* count_return */ +#endif +); + +extern int XmbTextPropertyToTextList( +#if NeedFunctionPrototypes + Display* /* display */, + XTextProperty* /* text_prop */, + char*** /* list_return */, + int* /* count_return */ +#endif +); + +extern int XwcTextPropertyToTextList( +#if NeedFunctionPrototypes + Display* /* display */, + XTextProperty* /* text_prop */, + wchar_t*** /* list_return */, + int* /* count_return */ +#endif +); + +extern void XUnionRectWithRegion( +#if NeedFunctionPrototypes + XRectangle* /* rectangle */, + Region /* src_region */, + Region /* dest_region_return */ +#endif +); + +extern void XUnionRegion( +#if NeedFunctionPrototypes + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +#endif +); + +extern int XWMGeometry( +#if NeedFunctionPrototypes + Display* /* display */, + int /* screen_number */, + _Xconst char* /* user_geometry */, + _Xconst char* /* default_geometry */, + unsigned int /* border_width */, + XSizeHints* /* hints */, + int* /* x_return */, + int* /* y_return */, + int* /* width_return */, + int* /* height_return */, + int* /* gravity_return */ +#endif +); + +extern void XXorRegion( +#if NeedFunctionPrototypes + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +#endif +); + +_XFUNCPROTOEND + +#if defined(MAC_TCL) || defined(MAC_OSX_TK) +# undef Region +#endif + +#endif /* _XUTIL_H_ */ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/X11/cursorfont.h b/Master/tlpkg/tlperl.old/lib/Tk/X11/cursorfont.h new file mode 100644 index 00000000000..617274fa806 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/X11/cursorfont.h @@ -0,0 +1,79 @@ +/* $XConsortium: cursorfont.h,v 1.2 88/09/06 16:44:27 jim Exp $ */ +#define XC_num_glyphs 154 +#define XC_X_cursor 0 +#define XC_arrow 2 +#define XC_based_arrow_down 4 +#define XC_based_arrow_up 6 +#define XC_boat 8 +#define XC_bogosity 10 +#define XC_bottom_left_corner 12 +#define XC_bottom_right_corner 14 +#define XC_bottom_side 16 +#define XC_bottom_tee 18 +#define XC_box_spiral 20 +#define XC_center_ptr 22 +#define XC_circle 24 +#define XC_clock 26 +#define XC_coffee_mug 28 +#define XC_cross 30 +#define XC_cross_reverse 32 +#define XC_crosshair 34 +#define XC_diamond_cross 36 +#define XC_dot 38 +#define XC_dotbox 40 +#define XC_double_arrow 42 +#define XC_draft_large 44 +#define XC_draft_small 46 +#define XC_draped_box 48 +#define XC_exchange 50 +#define XC_fleur 52 +#define XC_gobbler 54 +#define XC_gumby 56 +#define XC_hand1 58 +#define XC_hand2 60 +#define XC_heart 62 +#define XC_icon 64 +#define XC_iron_cross 66 +#define XC_left_ptr 68 +#define XC_left_side 70 +#define XC_left_tee 72 +#define XC_leftbutton 74 +#define XC_ll_angle 76 +#define XC_lr_angle 78 +#define XC_man 80 +#define XC_middlebutton 82 +#define XC_mouse 84 +#define XC_pencil 86 +#define XC_pirate 88 +#define XC_plus 90 +#define XC_question_arrow 92 +#define XC_right_ptr 94 +#define XC_right_side 96 +#define XC_right_tee 98 +#define XC_rightbutton 100 +#define XC_rtl_logo 102 +#define XC_sailboat 104 +#define XC_sb_down_arrow 106 +#define XC_sb_h_double_arrow 108 +#define XC_sb_left_arrow 110 +#define XC_sb_right_arrow 112 +#define XC_sb_up_arrow 114 +#define XC_sb_v_double_arrow 116 +#define XC_shuttle 118 +#define XC_sizing 120 +#define XC_spider 122 +#define XC_spraycan 124 +#define XC_star 126 +#define XC_target 128 +#define XC_tcross 130 +#define XC_top_left_arrow 132 +#define XC_top_left_corner 134 +#define XC_top_right_corner 136 +#define XC_top_side 138 +#define XC_top_tee 140 +#define XC_trek 142 +#define XC_ul_angle 144 +#define XC_umbrella 146 +#define XC_ur_angle 148 +#define XC_watch 150 +#define XC_xterm 152 diff --git a/Master/tlpkg/tlperl.old/lib/Tk/X11/keysym.h b/Master/tlpkg/tlperl.old/lib/Tk/X11/keysym.h new file mode 100644 index 00000000000..027afe08d5f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/X11/keysym.h @@ -0,0 +1,39 @@ +/* $XConsortium: keysym.h,v 1.13 91/03/13 20:09:49 rws Exp $ */ + +/*********************************************************** +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +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 names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, 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. + +******************************************************************/ + +/* default keysyms */ +#define XK_MISCELLANY +#define XK_LATIN1 +#define XK_LATIN2 +#define XK_LATIN3 +#define XK_LATIN4 +#define XK_GREEK + +#ifdef MAC_TCL +#include <keysymdef.h> +#else +#include <X11/keysymdef.h> +#endif diff --git a/Master/tlpkg/tlperl.old/lib/Tk/X11/keysymdef.h b/Master/tlpkg/tlperl.old/lib/Tk/X11/keysymdef.h new file mode 100644 index 00000000000..b22d41b3385 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/X11/keysymdef.h @@ -0,0 +1,1169 @@ +/* $XConsortium: keysymdef.h,v 1.15 93/04/02 10:57:36 rws Exp $ */ + +/*********************************************************** +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +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 names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, 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. + +******************************************************************/ + +#define XK_VoidSymbol 0xFFFFFF /* void symbol */ + +#ifdef XK_MISCELLANY +/* + * TTY Functions, cleverly chosen to map to ascii, for convenience of + * programming, but could have been arbitrary (at the cost of lookup + * tables in client code. + */ + +#define XK_BackSpace 0xFF08 /* back space, back char */ +#define XK_Tab 0xFF09 +#define XK_Linefeed 0xFF0A /* Linefeed, LF */ +#define XK_Clear 0xFF0B +#define XK_Return 0xFF0D /* Return, enter */ +#define XK_Pause 0xFF13 /* Pause, hold */ +#define XK_Scroll_Lock 0xFF14 +#define XK_Sys_Req 0xFF15 +#define XK_Escape 0xFF1B +#define XK_Delete 0xFFFF /* Delete, rubout */ + + + +/* International & multi-key character composition */ + +#define XK_Multi_key 0xFF20 /* Multi-key character compose */ + +/* Japanese keyboard support */ + +#define XK_Kanji 0xFF21 /* Kanji, Kanji convert */ +#define XK_Muhenkan 0xFF22 /* Cancel Conversion */ +#define XK_Henkan_Mode 0xFF23 /* Start/Stop Conversion */ +#define XK_Henkan 0xFF23 /* Alias for Henkan_Mode */ +#define XK_Romaji 0xFF24 /* to Romaji */ +#define XK_Hiragana 0xFF25 /* to Hiragana */ +#define XK_Katakana 0xFF26 /* to Katakana */ +#define XK_Hiragana_Katakana 0xFF27 /* Hiragana/Katakana toggle */ +#define XK_Zenkaku 0xFF28 /* to Zenkaku */ +#define XK_Hankaku 0xFF29 /* to Hankaku */ +#define XK_Zenkaku_Hankaku 0xFF2A /* Zenkaku/Hankaku toggle */ +#define XK_Touroku 0xFF2B /* Add to Dictionary */ +#define XK_Massyo 0xFF2C /* Delete from Dictionary */ +#define XK_Kana_Lock 0xFF2D /* Kana Lock */ +#define XK_Kana_Shift 0xFF2E /* Kana Shift */ +#define XK_Eisu_Shift 0xFF2F /* Alphanumeric Shift */ +#define XK_Eisu_toggle 0xFF30 /* Alphanumeric toggle */ + +/* Cursor control & motion */ + +#define XK_Home 0xFF50 +#define XK_Left 0xFF51 /* Move left, left arrow */ +#define XK_Up 0xFF52 /* Move up, up arrow */ +#define XK_Right 0xFF53 /* Move right, right arrow */ +#define XK_Down 0xFF54 /* Move down, down arrow */ +#define XK_Prior 0xFF55 /* Prior, previous */ +#define XK_Page_Up 0xFF55 +#define XK_Next 0xFF56 /* Next */ +#define XK_Page_Down 0xFF56 +#define XK_End 0xFF57 /* EOL */ +#define XK_Begin 0xFF58 /* BOL */ + +/* Special Windows keyboard keys */ + +#define XK_Win_L 0xFF5B /* Left-hand Windows */ +#define XK_Win_R 0xFF5C /* Right-hand Windows */ +#define XK_App 0xFF5D /* Menu key */ + +/* Misc Functions */ + +#define XK_Select 0xFF60 /* Select, mark */ +#define XK_Print 0xFF61 +#define XK_Execute 0xFF62 /* Execute, run, do */ +#define XK_Insert 0xFF63 /* Insert, insert here */ +#define XK_Undo 0xFF65 /* Undo, oops */ +#define XK_Redo 0xFF66 /* redo, again */ +#define XK_Menu 0xFF67 +#define XK_Find 0xFF68 /* Find, search */ +#define XK_Cancel 0xFF69 /* Cancel, stop, abort, exit */ +#define XK_Help 0xFF6A /* Help, ? */ +#define XK_Break 0xFF6B +#define XK_Mode_switch 0xFF7E /* Character set switch */ +#define XK_script_switch 0xFF7E /* Alias for mode_switch */ +#define XK_Num_Lock 0xFF7F + +/* Keypad Functions, keypad numbers cleverly chosen to map to ascii */ + +#define XK_KP_Space 0xFF80 /* space */ +#define XK_KP_Tab 0xFF89 +#define XK_KP_Enter 0xFF8D /* enter */ +#define XK_KP_F1 0xFF91 /* PF1, KP_A, ... */ +#define XK_KP_F2 0xFF92 +#define XK_KP_F3 0xFF93 +#define XK_KP_F4 0xFF94 +#define XK_KP_Home 0xFF95 +#define XK_KP_Left 0xFF96 +#define XK_KP_Up 0xFF97 +#define XK_KP_Right 0xFF98 +#define XK_KP_Down 0xFF99 +#define XK_KP_Prior 0xFF9A +#define XK_KP_Page_Up 0xFF9A +#define XK_KP_Next 0xFF9B +#define XK_KP_Page_Down 0xFF9B +#define XK_KP_End 0xFF9C +#define XK_KP_Begin 0xFF9D +#define XK_KP_Insert 0xFF9E +#define XK_KP_Delete 0xFF9F +#define XK_KP_Equal 0xFFBD /* equals */ +#define XK_KP_Multiply 0xFFAA +#define XK_KP_Add 0xFFAB +#define XK_KP_Separator 0xFFAC /* separator, often comma */ +#define XK_KP_Subtract 0xFFAD +#define XK_KP_Decimal 0xFFAE +#define XK_KP_Divide 0xFFAF + +#define XK_KP_0 0xFFB0 +#define XK_KP_1 0xFFB1 +#define XK_KP_2 0xFFB2 +#define XK_KP_3 0xFFB3 +#define XK_KP_4 0xFFB4 +#define XK_KP_5 0xFFB5 +#define XK_KP_6 0xFFB6 +#define XK_KP_7 0xFFB7 +#define XK_KP_8 0xFFB8 +#define XK_KP_9 0xFFB9 + + + +/* + * Auxilliary Functions; note the duplicate definitions for left and right + * function keys; Sun keyboards and a few other manufactures have such + * function key groups on the left and/or right sides of the keyboard. + * We've not found a keyboard with more than 35 function keys total. + */ + +#define XK_F1 0xFFBE +#define XK_F2 0xFFBF +#define XK_F3 0xFFC0 +#define XK_F4 0xFFC1 +#define XK_F5 0xFFC2 +#define XK_F6 0xFFC3 +#define XK_F7 0xFFC4 +#define XK_F8 0xFFC5 +#define XK_F9 0xFFC6 +#define XK_F10 0xFFC7 +#define XK_F11 0xFFC8 +#define XK_L1 0xFFC8 +#define XK_F12 0xFFC9 +#define XK_L2 0xFFC9 +#define XK_F13 0xFFCA +#define XK_L3 0xFFCA +#define XK_F14 0xFFCB +#define XK_L4 0xFFCB +#define XK_F15 0xFFCC +#define XK_L5 0xFFCC +#define XK_F16 0xFFCD +#define XK_L6 0xFFCD +#define XK_F17 0xFFCE +#define XK_L7 0xFFCE +#define XK_F18 0xFFCF +#define XK_L8 0xFFCF +#define XK_F19 0xFFD0 +#define XK_L9 0xFFD0 +#define XK_F20 0xFFD1 +#define XK_L10 0xFFD1 +#define XK_F21 0xFFD2 +#define XK_R1 0xFFD2 +#define XK_F22 0xFFD3 +#define XK_R2 0xFFD3 +#define XK_F23 0xFFD4 +#define XK_R3 0xFFD4 +#define XK_F24 0xFFD5 +#define XK_R4 0xFFD5 +#define XK_F25 0xFFD6 +#define XK_R5 0xFFD6 +#define XK_F26 0xFFD7 +#define XK_R6 0xFFD7 +#define XK_F27 0xFFD8 +#define XK_R7 0xFFD8 +#define XK_F28 0xFFD9 +#define XK_R8 0xFFD9 +#define XK_F29 0xFFDA +#define XK_R9 0xFFDA +#define XK_F30 0xFFDB +#define XK_R10 0xFFDB +#define XK_F31 0xFFDC +#define XK_R11 0xFFDC +#define XK_F32 0xFFDD +#define XK_R12 0xFFDD +#define XK_F33 0xFFDE +#define XK_R13 0xFFDE +#define XK_F34 0xFFDF +#define XK_R14 0xFFDF +#define XK_F35 0xFFE0 +#define XK_R15 0xFFE0 + +/* Modifiers */ + +#define XK_Shift_L 0xFFE1 /* Left shift */ +#define XK_Shift_R 0xFFE2 /* Right shift */ +#define XK_Control_L 0xFFE3 /* Left control */ +#define XK_Control_R 0xFFE4 /* Right control */ +#define XK_Caps_Lock 0xFFE5 /* Caps lock */ +#define XK_Shift_Lock 0xFFE6 /* Shift lock */ + +#define XK_Meta_L 0xFFE7 /* Left meta */ +#define XK_Meta_R 0xFFE8 /* Right meta */ +#define XK_Alt_L 0xFFE9 /* Left alt */ +#define XK_Alt_R 0xFFEA /* Right alt */ +#define XK_Super_L 0xFFEB /* Left super */ +#define XK_Super_R 0xFFEC /* Right super */ +#define XK_Hyper_L 0xFFED /* Left hyper */ +#define XK_Hyper_R 0xFFEE /* Right hyper */ +#endif /* XK_MISCELLANY */ + +/* + * Latin 1 + * Byte 3 = 0 + */ +#ifdef XK_LATIN1 +#define XK_space 0x020 +#define XK_exclam 0x021 +#define XK_quotedbl 0x022 +#define XK_numbersign 0x023 +#define XK_dollar 0x024 +#define XK_percent 0x025 +#define XK_ampersand 0x026 +#define XK_apostrophe 0x027 +#define XK_quoteright 0x027 /* deprecated */ +#define XK_parenleft 0x028 +#define XK_parenright 0x029 +#define XK_asterisk 0x02a +#define XK_plus 0x02b +#define XK_comma 0x02c +#define XK_minus 0x02d +#define XK_period 0x02e +#define XK_slash 0x02f +#define XK_0 0x030 +#define XK_1 0x031 +#define XK_2 0x032 +#define XK_3 0x033 +#define XK_4 0x034 +#define XK_5 0x035 +#define XK_6 0x036 +#define XK_7 0x037 +#define XK_8 0x038 +#define XK_9 0x039 +#define XK_colon 0x03a +#define XK_semicolon 0x03b +#define XK_less 0x03c +#define XK_equal 0x03d +#define XK_greater 0x03e +#define XK_question 0x03f +#define XK_at 0x040 +#define XK_A 0x041 +#define XK_B 0x042 +#define XK_C 0x043 +#define XK_D 0x044 +#define XK_E 0x045 +#define XK_F 0x046 +#define XK_G 0x047 +#define XK_H 0x048 +#define XK_I 0x049 +#define XK_J 0x04a +#define XK_K 0x04b +#define XK_L 0x04c +#define XK_M 0x04d +#define XK_N 0x04e +#define XK_O 0x04f +#define XK_P 0x050 +#define XK_Q 0x051 +#define XK_R 0x052 +#define XK_S 0x053 +#define XK_T 0x054 +#define XK_U 0x055 +#define XK_V 0x056 +#define XK_W 0x057 +#define XK_X 0x058 +#define XK_Y 0x059 +#define XK_Z 0x05a +#define XK_bracketleft 0x05b +#define XK_backslash 0x05c +#define XK_bracketright 0x05d +#define XK_asciicircum 0x05e +#define XK_underscore 0x05f +#define XK_grave 0x060 +#define XK_quoteleft 0x060 /* deprecated */ +#define XK_a 0x061 +#define XK_b 0x062 +#define XK_c 0x063 +#define XK_d 0x064 +#define XK_e 0x065 +#define XK_f 0x066 +#define XK_g 0x067 +#define XK_h 0x068 +#define XK_i 0x069 +#define XK_j 0x06a +#define XK_k 0x06b +#define XK_l 0x06c +#define XK_m 0x06d +#define XK_n 0x06e +#define XK_o 0x06f +#define XK_p 0x070 +#define XK_q 0x071 +#define XK_r 0x072 +#define XK_s 0x073 +#define XK_t 0x074 +#define XK_u 0x075 +#define XK_v 0x076 +#define XK_w 0x077 +#define XK_x 0x078 +#define XK_y 0x079 +#define XK_z 0x07a +#define XK_braceleft 0x07b +#define XK_bar 0x07c +#define XK_braceright 0x07d +#define XK_asciitilde 0x07e + +#define XK_nobreakspace 0x0a0 +#define XK_exclamdown 0x0a1 +#define XK_cent 0x0a2 +#define XK_sterling 0x0a3 +#define XK_currency 0x0a4 +#define XK_yen 0x0a5 +#define XK_brokenbar 0x0a6 +#define XK_section 0x0a7 +#define XK_diaeresis 0x0a8 +#define XK_copyright 0x0a9 +#define XK_ordfeminine 0x0aa +#define XK_guillemotleft 0x0ab /* left angle quotation mark */ +#define XK_notsign 0x0ac +#define XK_hyphen 0x0ad +#define XK_registered 0x0ae +#define XK_macron 0x0af +#define XK_degree 0x0b0 +#define XK_plusminus 0x0b1 +#define XK_twosuperior 0x0b2 +#define XK_threesuperior 0x0b3 +#define XK_acute 0x0b4 +#define XK_mu 0x0b5 +#define XK_paragraph 0x0b6 +#define XK_periodcentered 0x0b7 +#define XK_cedilla 0x0b8 +#define XK_onesuperior 0x0b9 +#define XK_masculine 0x0ba +#define XK_guillemotright 0x0bb /* right angle quotation mark */ +#define XK_onequarter 0x0bc +#define XK_onehalf 0x0bd +#define XK_threequarters 0x0be +#define XK_questiondown 0x0bf +#define XK_Agrave 0x0c0 +#define XK_Aacute 0x0c1 +#define XK_Acircumflex 0x0c2 +#define XK_Atilde 0x0c3 +#define XK_Adiaeresis 0x0c4 +#define XK_Aring 0x0c5 +#define XK_AE 0x0c6 +#define XK_Ccedilla 0x0c7 +#define XK_Egrave 0x0c8 +#define XK_Eacute 0x0c9 +#define XK_Ecircumflex 0x0ca +#define XK_Ediaeresis 0x0cb +#define XK_Igrave 0x0cc +#define XK_Iacute 0x0cd +#define XK_Icircumflex 0x0ce +#define XK_Idiaeresis 0x0cf +#define XK_ETH 0x0d0 +#define XK_Eth 0x0d0 /* deprecated */ +#define XK_Ntilde 0x0d1 +#define XK_Ograve 0x0d2 +#define XK_Oacute 0x0d3 +#define XK_Ocircumflex 0x0d4 +#define XK_Otilde 0x0d5 +#define XK_Odiaeresis 0x0d6 +#define XK_multiply 0x0d7 +#define XK_Ooblique 0x0d8 +#define XK_Ugrave 0x0d9 +#define XK_Uacute 0x0da +#define XK_Ucircumflex 0x0db +#define XK_Udiaeresis 0x0dc +#define XK_Yacute 0x0dd +#define XK_THORN 0x0de +#define XK_Thorn 0x0de /* deprecated */ +#define XK_ssharp 0x0df +#define XK_agrave 0x0e0 +#define XK_aacute 0x0e1 +#define XK_acircumflex 0x0e2 +#define XK_atilde 0x0e3 +#define XK_adiaeresis 0x0e4 +#define XK_aring 0x0e5 +#define XK_ae 0x0e6 +#define XK_ccedilla 0x0e7 +#define XK_egrave 0x0e8 +#define XK_eacute 0x0e9 +#define XK_ecircumflex 0x0ea +#define XK_ediaeresis 0x0eb +#define XK_igrave 0x0ec +#define XK_iacute 0x0ed +#define XK_icircumflex 0x0ee +#define XK_idiaeresis 0x0ef +#define XK_eth 0x0f0 +#define XK_ntilde 0x0f1 +#define XK_ograve 0x0f2 +#define XK_oacute 0x0f3 +#define XK_ocircumflex 0x0f4 +#define XK_otilde 0x0f5 +#define XK_odiaeresis 0x0f6 +#define XK_division 0x0f7 +#define XK_oslash 0x0f8 +#define XK_ugrave 0x0f9 +#define XK_uacute 0x0fa +#define XK_ucircumflex 0x0fb +#define XK_udiaeresis 0x0fc +#define XK_yacute 0x0fd +#define XK_thorn 0x0fe +#define XK_ydiaeresis 0x0ff +#endif /* XK_LATIN1 */ + +/* + * Latin 2 + * Byte 3 = 1 + */ + +#ifdef XK_LATIN2 +#define XK_Aogonek 0x1a1 +#define XK_breve 0x1a2 +#define XK_Lstroke 0x1a3 +#define XK_Lcaron 0x1a5 +#define XK_Sacute 0x1a6 +#define XK_Scaron 0x1a9 +#define XK_Scedilla 0x1aa +#define XK_Tcaron 0x1ab +#define XK_Zacute 0x1ac +#define XK_Zcaron 0x1ae +#define XK_Zabovedot 0x1af +#define XK_aogonek 0x1b1 +#define XK_ogonek 0x1b2 +#define XK_lstroke 0x1b3 +#define XK_lcaron 0x1b5 +#define XK_sacute 0x1b6 +#define XK_caron 0x1b7 +#define XK_scaron 0x1b9 +#define XK_scedilla 0x1ba +#define XK_tcaron 0x1bb +#define XK_zacute 0x1bc +#define XK_doubleacute 0x1bd +#define XK_zcaron 0x1be +#define XK_zabovedot 0x1bf +#define XK_Racute 0x1c0 +#define XK_Abreve 0x1c3 +#define XK_Lacute 0x1c5 +#define XK_Cacute 0x1c6 +#define XK_Ccaron 0x1c8 +#define XK_Eogonek 0x1ca +#define XK_Ecaron 0x1cc +#define XK_Dcaron 0x1cf +#define XK_Dstroke 0x1d0 +#define XK_Nacute 0x1d1 +#define XK_Ncaron 0x1d2 +#define XK_Odoubleacute 0x1d5 +#define XK_Rcaron 0x1d8 +#define XK_Uring 0x1d9 +#define XK_Udoubleacute 0x1db +#define XK_Tcedilla 0x1de +#define XK_racute 0x1e0 +#define XK_abreve 0x1e3 +#define XK_lacute 0x1e5 +#define XK_cacute 0x1e6 +#define XK_ccaron 0x1e8 +#define XK_eogonek 0x1ea +#define XK_ecaron 0x1ec +#define XK_dcaron 0x1ef +#define XK_dstroke 0x1f0 +#define XK_nacute 0x1f1 +#define XK_ncaron 0x1f2 +#define XK_odoubleacute 0x1f5 +#define XK_udoubleacute 0x1fb +#define XK_rcaron 0x1f8 +#define XK_uring 0x1f9 +#define XK_tcedilla 0x1fe +#define XK_abovedot 0x1ff +#endif /* XK_LATIN2 */ + +/* + * Latin 3 + * Byte 3 = 2 + */ + +#ifdef XK_LATIN3 +#define XK_Hstroke 0x2a1 +#define XK_Hcircumflex 0x2a6 +#define XK_Iabovedot 0x2a9 +#define XK_Gbreve 0x2ab +#define XK_Jcircumflex 0x2ac +#define XK_hstroke 0x2b1 +#define XK_hcircumflex 0x2b6 +#define XK_idotless 0x2b9 +#define XK_gbreve 0x2bb +#define XK_jcircumflex 0x2bc +#define XK_Cabovedot 0x2c5 +#define XK_Ccircumflex 0x2c6 +#define XK_Gabovedot 0x2d5 +#define XK_Gcircumflex 0x2d8 +#define XK_Ubreve 0x2dd +#define XK_Scircumflex 0x2de +#define XK_cabovedot 0x2e5 +#define XK_ccircumflex 0x2e6 +#define XK_gabovedot 0x2f5 +#define XK_gcircumflex 0x2f8 +#define XK_ubreve 0x2fd +#define XK_scircumflex 0x2fe +#endif /* XK_LATIN3 */ + + +/* + * Latin 4 + * Byte 3 = 3 + */ + +#ifdef XK_LATIN4 +#define XK_kra 0x3a2 +#define XK_kappa 0x3a2 /* deprecated */ +#define XK_Rcedilla 0x3a3 +#define XK_Itilde 0x3a5 +#define XK_Lcedilla 0x3a6 +#define XK_Emacron 0x3aa +#define XK_Gcedilla 0x3ab +#define XK_Tslash 0x3ac +#define XK_rcedilla 0x3b3 +#define XK_itilde 0x3b5 +#define XK_lcedilla 0x3b6 +#define XK_emacron 0x3ba +#define XK_gcedilla 0x3bb +#define XK_tslash 0x3bc +#define XK_ENG 0x3bd +#define XK_eng 0x3bf +#define XK_Amacron 0x3c0 +#define XK_Iogonek 0x3c7 +#define XK_Eabovedot 0x3cc +#define XK_Imacron 0x3cf +#define XK_Ncedilla 0x3d1 +#define XK_Omacron 0x3d2 +#define XK_Kcedilla 0x3d3 +#define XK_Uogonek 0x3d9 +#define XK_Utilde 0x3dd +#define XK_Umacron 0x3de +#define XK_amacron 0x3e0 +#define XK_iogonek 0x3e7 +#define XK_eabovedot 0x3ec +#define XK_imacron 0x3ef +#define XK_ncedilla 0x3f1 +#define XK_omacron 0x3f2 +#define XK_kcedilla 0x3f3 +#define XK_uogonek 0x3f9 +#define XK_utilde 0x3fd +#define XK_umacron 0x3fe +#endif /* XK_LATIN4 */ + +/* + * Katakana + * Byte 3 = 4 + */ + +#ifdef XK_KATAKANA +#define XK_overline 0x47e +#define XK_kana_fullstop 0x4a1 +#define XK_kana_openingbracket 0x4a2 +#define XK_kana_closingbracket 0x4a3 +#define XK_kana_comma 0x4a4 +#define XK_kana_conjunctive 0x4a5 +#define XK_kana_middledot 0x4a5 /* deprecated */ +#define XK_kana_WO 0x4a6 +#define XK_kana_a 0x4a7 +#define XK_kana_i 0x4a8 +#define XK_kana_u 0x4a9 +#define XK_kana_e 0x4aa +#define XK_kana_o 0x4ab +#define XK_kana_ya 0x4ac +#define XK_kana_yu 0x4ad +#define XK_kana_yo 0x4ae +#define XK_kana_tsu 0x4af +#define XK_kana_tu 0x4af /* deprecated */ +#define XK_prolongedsound 0x4b0 +#define XK_kana_A 0x4b1 +#define XK_kana_I 0x4b2 +#define XK_kana_U 0x4b3 +#define XK_kana_E 0x4b4 +#define XK_kana_O 0x4b5 +#define XK_kana_KA 0x4b6 +#define XK_kana_KI 0x4b7 +#define XK_kana_KU 0x4b8 +#define XK_kana_KE 0x4b9 +#define XK_kana_KO 0x4ba +#define XK_kana_SA 0x4bb +#define XK_kana_SHI 0x4bc +#define XK_kana_SU 0x4bd +#define XK_kana_SE 0x4be +#define XK_kana_SO 0x4bf +#define XK_kana_TA 0x4c0 +#define XK_kana_CHI 0x4c1 +#define XK_kana_TI 0x4c1 /* deprecated */ +#define XK_kana_TSU 0x4c2 +#define XK_kana_TU 0x4c2 /* deprecated */ +#define XK_kana_TE 0x4c3 +#define XK_kana_TO 0x4c4 +#define XK_kana_NA 0x4c5 +#define XK_kana_NI 0x4c6 +#define XK_kana_NU 0x4c7 +#define XK_kana_NE 0x4c8 +#define XK_kana_NO 0x4c9 +#define XK_kana_HA 0x4ca +#define XK_kana_HI 0x4cb +#define XK_kana_FU 0x4cc +#define XK_kana_HU 0x4cc /* deprecated */ +#define XK_kana_HE 0x4cd +#define XK_kana_HO 0x4ce +#define XK_kana_MA 0x4cf +#define XK_kana_MI 0x4d0 +#define XK_kana_MU 0x4d1 +#define XK_kana_ME 0x4d2 +#define XK_kana_MO 0x4d3 +#define XK_kana_YA 0x4d4 +#define XK_kana_YU 0x4d5 +#define XK_kana_YO 0x4d6 +#define XK_kana_RA 0x4d7 +#define XK_kana_RI 0x4d8 +#define XK_kana_RU 0x4d9 +#define XK_kana_RE 0x4da +#define XK_kana_RO 0x4db +#define XK_kana_WA 0x4dc +#define XK_kana_N 0x4dd +#define XK_voicedsound 0x4de +#define XK_semivoicedsound 0x4df +#define XK_kana_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_KATAKANA */ + +/* + * Arabic + * Byte 3 = 5 + */ + +#ifdef XK_ARABIC +#define XK_Arabic_comma 0x5ac +#define XK_Arabic_semicolon 0x5bb +#define XK_Arabic_question_mark 0x5bf +#define XK_Arabic_hamza 0x5c1 +#define XK_Arabic_maddaonalef 0x5c2 +#define XK_Arabic_hamzaonalef 0x5c3 +#define XK_Arabic_hamzaonwaw 0x5c4 +#define XK_Arabic_hamzaunderalef 0x5c5 +#define XK_Arabic_hamzaonyeh 0x5c6 +#define XK_Arabic_alef 0x5c7 +#define XK_Arabic_beh 0x5c8 +#define XK_Arabic_tehmarbuta 0x5c9 +#define XK_Arabic_teh 0x5ca +#define XK_Arabic_theh 0x5cb +#define XK_Arabic_jeem 0x5cc +#define XK_Arabic_hah 0x5cd +#define XK_Arabic_khah 0x5ce +#define XK_Arabic_dal 0x5cf +#define XK_Arabic_thal 0x5d0 +#define XK_Arabic_ra 0x5d1 +#define XK_Arabic_zain 0x5d2 +#define XK_Arabic_seen 0x5d3 +#define XK_Arabic_sheen 0x5d4 +#define XK_Arabic_sad 0x5d5 +#define XK_Arabic_dad 0x5d6 +#define XK_Arabic_tah 0x5d7 +#define XK_Arabic_zah 0x5d8 +#define XK_Arabic_ain 0x5d9 +#define XK_Arabic_ghain 0x5da +#define XK_Arabic_tatweel 0x5e0 +#define XK_Arabic_feh 0x5e1 +#define XK_Arabic_qaf 0x5e2 +#define XK_Arabic_kaf 0x5e3 +#define XK_Arabic_lam 0x5e4 +#define XK_Arabic_meem 0x5e5 +#define XK_Arabic_noon 0x5e6 +#define XK_Arabic_ha 0x5e7 +#define XK_Arabic_heh 0x5e7 /* deprecated */ +#define XK_Arabic_waw 0x5e8 +#define XK_Arabic_alefmaksura 0x5e9 +#define XK_Arabic_yeh 0x5ea +#define XK_Arabic_fathatan 0x5eb +#define XK_Arabic_dammatan 0x5ec +#define XK_Arabic_kasratan 0x5ed +#define XK_Arabic_fatha 0x5ee +#define XK_Arabic_damma 0x5ef +#define XK_Arabic_kasra 0x5f0 +#define XK_Arabic_shadda 0x5f1 +#define XK_Arabic_sukun 0x5f2 +#define XK_Arabic_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_ARABIC */ + +/* + * Cyrillic + * Byte 3 = 6 + */ +#ifdef XK_CYRILLIC +#define XK_Serbian_dje 0x6a1 +#define XK_Macedonia_gje 0x6a2 +#define XK_Cyrillic_io 0x6a3 +#define XK_Ukrainian_ie 0x6a4 +#define XK_Ukranian_je 0x6a4 /* deprecated */ +#define XK_Macedonia_dse 0x6a5 +#define XK_Ukrainian_i 0x6a6 +#define XK_Ukranian_i 0x6a6 /* deprecated */ +#define XK_Ukrainian_yi 0x6a7 +#define XK_Ukranian_yi 0x6a7 /* deprecated */ +#define XK_Cyrillic_je 0x6a8 +#define XK_Serbian_je 0x6a8 /* deprecated */ +#define XK_Cyrillic_lje 0x6a9 +#define XK_Serbian_lje 0x6a9 /* deprecated */ +#define XK_Cyrillic_nje 0x6aa +#define XK_Serbian_nje 0x6aa /* deprecated */ +#define XK_Serbian_tshe 0x6ab +#define XK_Macedonia_kje 0x6ac +#define XK_Byelorussian_shortu 0x6ae +#define XK_Cyrillic_dzhe 0x6af +#define XK_Serbian_dze 0x6af /* deprecated */ +#define XK_numerosign 0x6b0 +#define XK_Serbian_DJE 0x6b1 +#define XK_Macedonia_GJE 0x6b2 +#define XK_Cyrillic_IO 0x6b3 +#define XK_Ukrainian_IE 0x6b4 +#define XK_Ukranian_JE 0x6b4 /* deprecated */ +#define XK_Macedonia_DSE 0x6b5 +#define XK_Ukrainian_I 0x6b6 +#define XK_Ukranian_I 0x6b6 /* deprecated */ +#define XK_Ukrainian_YI 0x6b7 +#define XK_Ukranian_YI 0x6b7 /* deprecated */ +#define XK_Cyrillic_JE 0x6b8 +#define XK_Serbian_JE 0x6b8 /* deprecated */ +#define XK_Cyrillic_LJE 0x6b9 +#define XK_Serbian_LJE 0x6b9 /* deprecated */ +#define XK_Cyrillic_NJE 0x6ba +#define XK_Serbian_NJE 0x6ba /* deprecated */ +#define XK_Serbian_TSHE 0x6bb +#define XK_Macedonia_KJE 0x6bc +#define XK_Byelorussian_SHORTU 0x6be +#define XK_Cyrillic_DZHE 0x6bf +#define XK_Serbian_DZE 0x6bf /* deprecated */ +#define XK_Cyrillic_yu 0x6c0 +#define XK_Cyrillic_a 0x6c1 +#define XK_Cyrillic_be 0x6c2 +#define XK_Cyrillic_tse 0x6c3 +#define XK_Cyrillic_de 0x6c4 +#define XK_Cyrillic_ie 0x6c5 +#define XK_Cyrillic_ef 0x6c6 +#define XK_Cyrillic_ghe 0x6c7 +#define XK_Cyrillic_ha 0x6c8 +#define XK_Cyrillic_i 0x6c9 +#define XK_Cyrillic_shorti 0x6ca +#define XK_Cyrillic_ka 0x6cb +#define XK_Cyrillic_el 0x6cc +#define XK_Cyrillic_em 0x6cd +#define XK_Cyrillic_en 0x6ce +#define XK_Cyrillic_o 0x6cf +#define XK_Cyrillic_pe 0x6d0 +#define XK_Cyrillic_ya 0x6d1 +#define XK_Cyrillic_er 0x6d2 +#define XK_Cyrillic_es 0x6d3 +#define XK_Cyrillic_te 0x6d4 +#define XK_Cyrillic_u 0x6d5 +#define XK_Cyrillic_zhe 0x6d6 +#define XK_Cyrillic_ve 0x6d7 +#define XK_Cyrillic_softsign 0x6d8 +#define XK_Cyrillic_yeru 0x6d9 +#define XK_Cyrillic_ze 0x6da +#define XK_Cyrillic_sha 0x6db +#define XK_Cyrillic_e 0x6dc +#define XK_Cyrillic_shcha 0x6dd +#define XK_Cyrillic_che 0x6de +#define XK_Cyrillic_hardsign 0x6df +#define XK_Cyrillic_YU 0x6e0 +#define XK_Cyrillic_A 0x6e1 +#define XK_Cyrillic_BE 0x6e2 +#define XK_Cyrillic_TSE 0x6e3 +#define XK_Cyrillic_DE 0x6e4 +#define XK_Cyrillic_IE 0x6e5 +#define XK_Cyrillic_EF 0x6e6 +#define XK_Cyrillic_GHE 0x6e7 +#define XK_Cyrillic_HA 0x6e8 +#define XK_Cyrillic_I 0x6e9 +#define XK_Cyrillic_SHORTI 0x6ea +#define XK_Cyrillic_KA 0x6eb +#define XK_Cyrillic_EL 0x6ec +#define XK_Cyrillic_EM 0x6ed +#define XK_Cyrillic_EN 0x6ee +#define XK_Cyrillic_O 0x6ef +#define XK_Cyrillic_PE 0x6f0 +#define XK_Cyrillic_YA 0x6f1 +#define XK_Cyrillic_ER 0x6f2 +#define XK_Cyrillic_ES 0x6f3 +#define XK_Cyrillic_TE 0x6f4 +#define XK_Cyrillic_U 0x6f5 +#define XK_Cyrillic_ZHE 0x6f6 +#define XK_Cyrillic_VE 0x6f7 +#define XK_Cyrillic_SOFTSIGN 0x6f8 +#define XK_Cyrillic_YERU 0x6f9 +#define XK_Cyrillic_ZE 0x6fa +#define XK_Cyrillic_SHA 0x6fb +#define XK_Cyrillic_E 0x6fc +#define XK_Cyrillic_SHCHA 0x6fd +#define XK_Cyrillic_CHE 0x6fe +#define XK_Cyrillic_HARDSIGN 0x6ff +#endif /* XK_CYRILLIC */ + +/* + * Greek + * Byte 3 = 7 + */ + +#ifdef XK_GREEK +#define XK_Greek_ALPHAaccent 0x7a1 +#define XK_Greek_EPSILONaccent 0x7a2 +#define XK_Greek_ETAaccent 0x7a3 +#define XK_Greek_IOTAaccent 0x7a4 +#define XK_Greek_IOTAdiaeresis 0x7a5 +#define XK_Greek_OMICRONaccent 0x7a7 +#define XK_Greek_UPSILONaccent 0x7a8 +#define XK_Greek_UPSILONdieresis 0x7a9 +#define XK_Greek_OMEGAaccent 0x7ab +#define XK_Greek_accentdieresis 0x7ae +#define XK_Greek_horizbar 0x7af +#define XK_Greek_alphaaccent 0x7b1 +#define XK_Greek_epsilonaccent 0x7b2 +#define XK_Greek_etaaccent 0x7b3 +#define XK_Greek_iotaaccent 0x7b4 +#define XK_Greek_iotadieresis 0x7b5 +#define XK_Greek_iotaaccentdieresis 0x7b6 +#define XK_Greek_omicronaccent 0x7b7 +#define XK_Greek_upsilonaccent 0x7b8 +#define XK_Greek_upsilondieresis 0x7b9 +#define XK_Greek_upsilonaccentdieresis 0x7ba +#define XK_Greek_omegaaccent 0x7bb +#define XK_Greek_ALPHA 0x7c1 +#define XK_Greek_BETA 0x7c2 +#define XK_Greek_GAMMA 0x7c3 +#define XK_Greek_DELTA 0x7c4 +#define XK_Greek_EPSILON 0x7c5 +#define XK_Greek_ZETA 0x7c6 +#define XK_Greek_ETA 0x7c7 +#define XK_Greek_THETA 0x7c8 +#define XK_Greek_IOTA 0x7c9 +#define XK_Greek_KAPPA 0x7ca +#define XK_Greek_LAMDA 0x7cb +#define XK_Greek_LAMBDA 0x7cb +#define XK_Greek_MU 0x7cc +#define XK_Greek_NU 0x7cd +#define XK_Greek_XI 0x7ce +#define XK_Greek_OMICRON 0x7cf +#define XK_Greek_PI 0x7d0 +#define XK_Greek_RHO 0x7d1 +#define XK_Greek_SIGMA 0x7d2 +#define XK_Greek_TAU 0x7d4 +#define XK_Greek_UPSILON 0x7d5 +#define XK_Greek_PHI 0x7d6 +#define XK_Greek_CHI 0x7d7 +#define XK_Greek_PSI 0x7d8 +#define XK_Greek_OMEGA 0x7d9 +#define XK_Greek_alpha 0x7e1 +#define XK_Greek_beta 0x7e2 +#define XK_Greek_gamma 0x7e3 +#define XK_Greek_delta 0x7e4 +#define XK_Greek_epsilon 0x7e5 +#define XK_Greek_zeta 0x7e6 +#define XK_Greek_eta 0x7e7 +#define XK_Greek_theta 0x7e8 +#define XK_Greek_iota 0x7e9 +#define XK_Greek_kappa 0x7ea +#define XK_Greek_lamda 0x7eb +#define XK_Greek_lambda 0x7eb +#define XK_Greek_mu 0x7ec +#define XK_Greek_nu 0x7ed +#define XK_Greek_xi 0x7ee +#define XK_Greek_omicron 0x7ef +#define XK_Greek_pi 0x7f0 +#define XK_Greek_rho 0x7f1 +#define XK_Greek_sigma 0x7f2 +#define XK_Greek_finalsmallsigma 0x7f3 +#define XK_Greek_tau 0x7f4 +#define XK_Greek_upsilon 0x7f5 +#define XK_Greek_phi 0x7f6 +#define XK_Greek_chi 0x7f7 +#define XK_Greek_psi 0x7f8 +#define XK_Greek_omega 0x7f9 +#define XK_Greek_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_GREEK */ + +/* + * Technical + * Byte 3 = 8 + */ + +#ifdef XK_TECHNICAL +#define XK_leftradical 0x8a1 +#define XK_topleftradical 0x8a2 +#define XK_horizconnector 0x8a3 +#define XK_topintegral 0x8a4 +#define XK_botintegral 0x8a5 +#define XK_vertconnector 0x8a6 +#define XK_topleftsqbracket 0x8a7 +#define XK_botleftsqbracket 0x8a8 +#define XK_toprightsqbracket 0x8a9 +#define XK_botrightsqbracket 0x8aa +#define XK_topleftparens 0x8ab +#define XK_botleftparens 0x8ac +#define XK_toprightparens 0x8ad +#define XK_botrightparens 0x8ae +#define XK_leftmiddlecurlybrace 0x8af +#define XK_rightmiddlecurlybrace 0x8b0 +#define XK_topleftsummation 0x8b1 +#define XK_botleftsummation 0x8b2 +#define XK_topvertsummationconnector 0x8b3 +#define XK_botvertsummationconnector 0x8b4 +#define XK_toprightsummation 0x8b5 +#define XK_botrightsummation 0x8b6 +#define XK_rightmiddlesummation 0x8b7 +#define XK_lessthanequal 0x8bc +#define XK_notequal 0x8bd +#define XK_greaterthanequal 0x8be +#define XK_integral 0x8bf +#define XK_therefore 0x8c0 +#define XK_variation 0x8c1 +#define XK_infinity 0x8c2 +#define XK_nabla 0x8c5 +#define XK_approximate 0x8c8 +#define XK_similarequal 0x8c9 +#define XK_ifonlyif 0x8cd +#define XK_implies 0x8ce +#define XK_identical 0x8cf +#define XK_radical 0x8d6 +#define XK_includedin 0x8da +#define XK_includes 0x8db +#define XK_intersection 0x8dc +#define XK_union 0x8dd +#define XK_logicaland 0x8de +#define XK_logicalor 0x8df +#define XK_partialderivative 0x8ef +#define XK_function 0x8f6 +#define XK_leftarrow 0x8fb +#define XK_uparrow 0x8fc +#define XK_rightarrow 0x8fd +#define XK_downarrow 0x8fe +#endif /* XK_TECHNICAL */ + +/* + * Special + * Byte 3 = 9 + */ + +#ifdef XK_SPECIAL +#define XK_blank 0x9df +#define XK_soliddiamond 0x9e0 +#define XK_checkerboard 0x9e1 +#define XK_ht 0x9e2 +#define XK_ff 0x9e3 +#define XK_cr 0x9e4 +#define XK_lf 0x9e5 +#define XK_nl 0x9e8 +#define XK_vt 0x9e9 +#define XK_lowrightcorner 0x9ea +#define XK_uprightcorner 0x9eb +#define XK_upleftcorner 0x9ec +#define XK_lowleftcorner 0x9ed +#define XK_crossinglines 0x9ee +#define XK_horizlinescan1 0x9ef +#define XK_horizlinescan3 0x9f0 +#define XK_horizlinescan5 0x9f1 +#define XK_horizlinescan7 0x9f2 +#define XK_horizlinescan9 0x9f3 +#define XK_leftt 0x9f4 +#define XK_rightt 0x9f5 +#define XK_bott 0x9f6 +#define XK_topt 0x9f7 +#define XK_vertbar 0x9f8 +#endif /* XK_SPECIAL */ + +/* + * Publishing + * Byte 3 = a + */ + +#ifdef XK_PUBLISHING +#define XK_emspace 0xaa1 +#define XK_enspace 0xaa2 +#define XK_em3space 0xaa3 +#define XK_em4space 0xaa4 +#define XK_digitspace 0xaa5 +#define XK_punctspace 0xaa6 +#define XK_thinspace 0xaa7 +#define XK_hairspace 0xaa8 +#define XK_emdash 0xaa9 +#define XK_endash 0xaaa +#define XK_signifblank 0xaac +#define XK_ellipsis 0xaae +#define XK_doubbaselinedot 0xaaf +#define XK_onethird 0xab0 +#define XK_twothirds 0xab1 +#define XK_onefifth 0xab2 +#define XK_twofifths 0xab3 +#define XK_threefifths 0xab4 +#define XK_fourfifths 0xab5 +#define XK_onesixth 0xab6 +#define XK_fivesixths 0xab7 +#define XK_careof 0xab8 +#define XK_figdash 0xabb +#define XK_leftanglebracket 0xabc +#define XK_decimalpoint 0xabd +#define XK_rightanglebracket 0xabe +#define XK_marker 0xabf +#define XK_oneeighth 0xac3 +#define XK_threeeighths 0xac4 +#define XK_fiveeighths 0xac5 +#define XK_seveneighths 0xac6 +#define XK_trademark 0xac9 +#define XK_signaturemark 0xaca +#define XK_trademarkincircle 0xacb +#define XK_leftopentriangle 0xacc +#define XK_rightopentriangle 0xacd +#define XK_emopencircle 0xace +#define XK_emopenrectangle 0xacf +#define XK_leftsinglequotemark 0xad0 +#define XK_rightsinglequotemark 0xad1 +#define XK_leftdoublequotemark 0xad2 +#define XK_rightdoublequotemark 0xad3 +#define XK_prescription 0xad4 +#define XK_minutes 0xad6 +#define XK_seconds 0xad7 +#define XK_latincross 0xad9 +#define XK_hexagram 0xada +#define XK_filledrectbullet 0xadb +#define XK_filledlefttribullet 0xadc +#define XK_filledrighttribullet 0xadd +#define XK_emfilledcircle 0xade +#define XK_emfilledrect 0xadf +#define XK_enopencircbullet 0xae0 +#define XK_enopensquarebullet 0xae1 +#define XK_openrectbullet 0xae2 +#define XK_opentribulletup 0xae3 +#define XK_opentribulletdown 0xae4 +#define XK_openstar 0xae5 +#define XK_enfilledcircbullet 0xae6 +#define XK_enfilledsqbullet 0xae7 +#define XK_filledtribulletup 0xae8 +#define XK_filledtribulletdown 0xae9 +#define XK_leftpointer 0xaea +#define XK_rightpointer 0xaeb +#define XK_club 0xaec +#define XK_diamond 0xaed +#define XK_heart 0xaee +#define XK_maltesecross 0xaf0 +#define XK_dagger 0xaf1 +#define XK_doubledagger 0xaf2 +#define XK_checkmark 0xaf3 +#define XK_ballotcross 0xaf4 +#define XK_musicalsharp 0xaf5 +#define XK_musicalflat 0xaf6 +#define XK_malesymbol 0xaf7 +#define XK_femalesymbol 0xaf8 +#define XK_telephone 0xaf9 +#define XK_telephonerecorder 0xafa +#define XK_phonographcopyright 0xafb +#define XK_caret 0xafc +#define XK_singlelowquotemark 0xafd +#define XK_doublelowquotemark 0xafe +#define XK_cursor 0xaff +#endif /* XK_PUBLISHING */ + +/* + * APL + * Byte 3 = b + */ + +#ifdef XK_APL +#define XK_leftcaret 0xba3 +#define XK_rightcaret 0xba6 +#define XK_downcaret 0xba8 +#define XK_upcaret 0xba9 +#define XK_overbar 0xbc0 +#define XK_downtack 0xbc2 +#define XK_upshoe 0xbc3 +#define XK_downstile 0xbc4 +#define XK_underbar 0xbc6 +#define XK_jot 0xbca +#define XK_quad 0xbcc +#define XK_uptack 0xbce +#define XK_circle 0xbcf +#define XK_upstile 0xbd3 +#define XK_downshoe 0xbd6 +#define XK_rightshoe 0xbd8 +#define XK_leftshoe 0xbda +#define XK_lefttack 0xbdc +#define XK_righttack 0xbfc +#endif /* XK_APL */ + +/* + * Hebrew + * Byte 3 = c + */ + +#ifdef XK_HEBREW +#define XK_hebrew_doublelowline 0xcdf +#define XK_hebrew_aleph 0xce0 +#define XK_hebrew_bet 0xce1 +#define XK_hebrew_beth 0xce1 /* deprecated */ +#define XK_hebrew_gimel 0xce2 +#define XK_hebrew_gimmel 0xce2 /* deprecated */ +#define XK_hebrew_dalet 0xce3 +#define XK_hebrew_daleth 0xce3 /* deprecated */ +#define XK_hebrew_he 0xce4 +#define XK_hebrew_waw 0xce5 +#define XK_hebrew_zain 0xce6 +#define XK_hebrew_zayin 0xce6 /* deprecated */ +#define XK_hebrew_chet 0xce7 +#define XK_hebrew_het 0xce7 /* deprecated */ +#define XK_hebrew_tet 0xce8 +#define XK_hebrew_teth 0xce8 /* deprecated */ +#define XK_hebrew_yod 0xce9 +#define XK_hebrew_finalkaph 0xcea +#define XK_hebrew_kaph 0xceb +#define XK_hebrew_lamed 0xcec +#define XK_hebrew_finalmem 0xced +#define XK_hebrew_mem 0xcee +#define XK_hebrew_finalnun 0xcef +#define XK_hebrew_nun 0xcf0 +#define XK_hebrew_samech 0xcf1 +#define XK_hebrew_samekh 0xcf1 /* deprecated */ +#define XK_hebrew_ayin 0xcf2 +#define XK_hebrew_finalpe 0xcf3 +#define XK_hebrew_pe 0xcf4 +#define XK_hebrew_finalzade 0xcf5 +#define XK_hebrew_finalzadi 0xcf5 /* deprecated */ +#define XK_hebrew_zade 0xcf6 +#define XK_hebrew_zadi 0xcf6 /* deprecated */ +#define XK_hebrew_qoph 0xcf7 +#define XK_hebrew_kuf 0xcf7 /* deprecated */ +#define XK_hebrew_resh 0xcf8 +#define XK_hebrew_shin 0xcf9 +#define XK_hebrew_taw 0xcfa +#define XK_hebrew_taf 0xcfa /* deprecated */ +#define XK_Hebrew_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_HEBREW */ + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/X11/license.terms b/Master/tlpkg/tlperl.old/lib/Tk/X11/license.terms new file mode 100644 index 00000000000..03ca6fcb319 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/X11/license.terms @@ -0,0 +1,39 @@ +This software is copyrighted by the Regents of the University of +California, Sun Microsystems, Inc., and other parties. The following +terms apply to all files associated with the software unless explicitly +disclaimed in individual files. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + +GOVERNMENT USE: If you are acquiring this software on behalf of the +U.S. government, the Government shall have only "Restricted Rights" +in the software and related documentation as defined in the Federal +Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you +are acquiring the software on behalf of the Department of Defense, the +software shall be classified as "Commercial Computer Software" and the +Government shall have only "Restricted Rights" as defined in Clause +252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the +authors grant the U.S. Government and others acting in its behalf +permission to use and distribute the software in accordance with the +terms specified in this license. diff --git a/Master/tlpkg/tlperl.old/lib/Tk/X11Font.pm b/Master/tlpkg/tlperl.old/lib/Tk/X11Font.pm new file mode 100644 index 00000000000..870dfd4b7dc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/X11Font.pm @@ -0,0 +1,184 @@ +package Tk::X11Font; +use vars qw($VERSION); +$VERSION = '4.007'; # $Id: //depot/Tkutf8/Tk/X11Font.pm#7 $ + +require Tk::Widget; +require Tk::Xlib; +use strict; + +Construct Tk::Widget 'X11Font'; + +my @field = qw(foundry family weight slant swidth adstyle pixel + point xres yres space avgwidth registry encoding); + +map { eval "sub \u$_ { shift->elem('$_', \@_) }" } @field; + +use overload '""' => 'as_string'; + +sub new +{ + my $pkg = shift; + my $w = shift; + + my %me = (); + my $d = $w->Display; + + local $_; + + if(scalar(@_) == 1) + { + my $pattern = shift; + + if($pattern =~ /\A(-[^-]*){14}\Z/) + { + @me{@field} = split(/-/, substr($pattern,1)); + } + else + { + $me{Name} = $pattern; + + if($pattern =~ /^[^-]?-([^-]*-){2,}/) + { + my $f = $d->XListFonts($pattern,1); + + if($f && $f =~ /\A(-[^-]*){14}/) + { + my @f = split(/-/, substr($f,1)); + my @n = split(/-/, $pattern); + my %f = (); + my $i = 0; + + shift @n if($pattern =~ /\A-/); + + while(@n && @f) + { + if($n[0] eq '*') + { + shift @n; + } + elsif($n[0] eq $f[0]) + { + $f{$field[$i]} = shift @n; + } + $i++; + shift @f; + } + + %me = %f + unless(@n); + } + } + } + } + else + { + %me = @_; + } + + map { $me{$_} ||= '*' } @field; + + $me{Display} = $d; + $me{MainWin} = $w->MainWindow; + + bless \%me, $pkg; +} + +sub Pattern +{ + my $me = shift; + return join('-', '',@{$me}{@field}); +} + +sub Name +{ + my $me = shift; + my $max = wantarray ? shift || 128 : 1; + + if ($^O eq 'MSWin32' or ($^O eq 'cygwin' and $Tk::platform eq 'MSWin32')) + { + my $name = $me->{Name}; + if (!defined $name) + { + my $fm = $me->{'family'} || 'system'; + my $sz = -int($me->{'point'}/10) || -($me->{'pixel'}) || 12; + my @opt = (-family => $fm, -size => $sz ); + my $wt = $me->{'weight'}; + if (defined $wt) + { + $wt = 'normal' unless $wt =~ /bold/i; + push(@opt,-weight => lc($wt)); + } + my $sl = $me->{'slant'}; + if (defined $sl) + { + $sl = ($sl =~ /^[io]/) ? 'italic' : 'roman'; + push(@opt,-slant => $sl); + } + $name = join(' ',@opt); + } + return $name; + } + else + { + my $name = $me->{Name} || + join('-', '',@{$me}{@field}); + return $me->{Display}->XListFonts($name,$max); + } +} + +sub as_string +{ + return shift->Name; +} + +sub elem +{ + my $me = shift; + my $elem = shift; + + return undef + if(exists $me->{'Name'}); + + my $old = $me->{$elem}; + + $me->{$elem} = shift + if(@_); + + $old; +} + +sub Clone +{ + my $me = shift; + + $me = bless { %$me }, ref($me); + + unless(exists $me->{'Name'}) + { + while(@_) + { + my $k = shift; + my $v = shift || $me->{MainWin}->BackTrace('Tk::Font->Clone( key => value, ... )'); + $me->{$k} = $v; + } + } + + $me; +} + +sub ascent +{ + my $me = shift; + my $name = $me->Name; + $me->{MainWin}->fontMetrics($name, '-ascent'); +} + +sub descent +{ + my $me = shift; + my $name = $me->Name; + $me->{MainWin}->fontMetrics($name, '-descent'); +} + +1; + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Xcamel.gif b/Master/tlpkg/tlperl.old/lib/Tk/Xcamel.gif Binary files differnew file mode 100644 index 00000000000..cb88bc0afd8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Xcamel.gif diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Xlib.pm b/Master/tlpkg/tlperl.old/lib/Tk/Xlib.pm new file mode 100644 index 00000000000..1432361dc18 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Xlib.pm @@ -0,0 +1,15 @@ +package Tk::Xlib; +require DynaLoader; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Xlib/Xlib.pm#4 $ + +use Tk qw($XS_VERSION); +use Exporter; + +use base qw(DynaLoader Exporter); +@EXPORT_OK = qw(XDrawString XLoadFont XDrawRectangle); + +bootstrap Tk::Xlib; + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/Xrm.pm b/Master/tlpkg/tlperl.old/lib/Tk/Xrm.pm new file mode 100644 index 00000000000..271ad59a237 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/Xrm.pm @@ -0,0 +1,11 @@ +package Tk::Xrm; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Tk/Xrm.pm#4 $ + +use Tk (); +1; +__END__ + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/act_folder.xbm b/Master/tlpkg/tlperl.old/lib/Tk/act_folder.xbm new file mode 100644 index 00000000000..fc82949945b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/act_folder.xbm @@ -0,0 +1,5 @@ +#define act_folder_width 16 +#define act_folder_height 10 +static unsigned char act_folder_bits[] = { + 0xfc, 0x00, 0xaa, 0x0f, 0x55, 0x15, 0xeb, 0xff, 0x15, 0x80, 0x0b, 0x40, + 0x05, 0x20, 0x03, 0x10, 0x01, 0x08, 0xff, 0x07}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/act_folder.xpm b/Master/tlpkg/tlperl.old/lib/Tk/act_folder.xpm new file mode 100644 index 00000000000..0e7d682713a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/act_folder.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static char * act_folder_xpm[] = { +/* width height num_colors chars_per_pixel */ +"16 12 4 1", +/* colors */ +" s None c None", +". c black", +"X c yellow", +"o c #5B5B57574646", +/* pixels */ +" .... ", +" .XXXX. ", +" .XXXXXX. ", +"............. ", +".oXoXoXoXoXo. ", +".XoX............", +".oX.XXXXXXXXXXX.", +".Xo.XXXXXXXXXX. ", +".o.XXXXXXXXXXX. ", +".X.XXXXXXXXXXX. ", +"..XXXXXXXXXX.. ", +"............. "}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/anim.gif b/Master/tlpkg/tlperl.old/lib/Tk/anim.gif Binary files differnew file mode 100644 index 00000000000..96a50b701be --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/anim.gif diff --git a/Master/tlpkg/tlperl.old/lib/Tk/arrowdownwin.xbm b/Master/tlpkg/tlperl.old/lib/Tk/arrowdownwin.xbm new file mode 100644 index 00000000000..ea43fc75e7a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/arrowdownwin.xbm @@ -0,0 +1,5 @@ +#define arrowdownwin2_width 9 +#define arrowdownwin2_height 13 +static char arrowdownwin2_bits[] = { + 0x00,0xfe,0x00,0xfe,0x00,0xfe,0x00,0xfe,0x00,0xfe,0x7c,0xfe,0x38,0xfe,0x10, + 0xfe,0x00,0xfe,0x00,0xfe,0x00,0xfe,0x00,0xfe,0x00,0xfe}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/balArrow.xbm b/Master/tlpkg/tlperl.old/lib/Tk/balArrow.xbm new file mode 100644 index 00000000000..ee0664a4727 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/balArrow.xbm @@ -0,0 +1,4 @@ +#define balArrow_width 6 +#define balArrow_height 6 +static char balArrow_bits[] = { + 0x1f, 0x07, 0x07, 0x09, 0x11, 0x20}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/cbxarrow.xbm b/Master/tlpkg/tlperl.old/lib/Tk/cbxarrow.xbm new file mode 100644 index 00000000000..ae4054488b9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/cbxarrow.xbm @@ -0,0 +1,6 @@ +#define cbxarrow_width 11 +#define cbxarrow_height 14 +static char cbxarrow_bits[] = { + 0x00, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, + 0xfe, 0x03, 0xfc, 0x01, 0xf8, 0x00, 0x70, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xfe, 0x03, 0xfe, 0x03}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/file.xbm b/Master/tlpkg/tlperl.old/lib/Tk/file.xbm new file mode 100644 index 00000000000..7bf12bb4c9f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/file.xbm @@ -0,0 +1,5 @@ +#define file_width 12 +#define file_height 12 +static unsigned char file_bits[] = { + 0xfe, 0x00, 0x02, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0xfe, 0x03}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/file.xpm b/Master/tlpkg/tlperl.old/lib/Tk/file.xpm new file mode 100644 index 00000000000..10cc24f9a1e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/file.xpm @@ -0,0 +1,18 @@ +/* XPM */ +static char * file_xpm[] = { +"12 12 3 1", +" s None c None", +". c #000000000000", +"X c white", +" ........ ", +" .XXXXXX. ", +" .XXXXXX... ", +" .XXXXXXXX. ", +" .XXXXXXXX. ", +" .XXXXXXXX. ", +" .XXXXXXXX. ", +" .XXXXXXXX. ", +" .XXXXXXXX. ", +" .XXXXXXXX. ", +" .XXXXXXXX. ", +" .......... "}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/folder.xbm b/Master/tlpkg/tlperl.old/lib/Tk/folder.xbm new file mode 100644 index 00000000000..0398f0de777 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/folder.xbm @@ -0,0 +1,5 @@ +#define folder_width 16 +#define folder_height 10 +static unsigned char folder_bits[] = { + 0xfc, 0x00, 0x02, 0x07, 0x01, 0x08, 0x01, 0x08, 0x01, 0x08, 0x01, 0x08, + 0x01, 0x08, 0x01, 0x08, 0x01, 0x08, 0xff, 0x07}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/folder.xpm b/Master/tlpkg/tlperl.old/lib/Tk/folder.xpm new file mode 100644 index 00000000000..fda7c15a549 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/folder.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static char * folder_xpm[] = { +/* width height num_colors chars_per_pixel */ +"16 12 3 1", +/* colors */ +" s None c None", +". c black", +"X c #f0ff80", +/* pixels */ +" .... ", +" .XXXX. ", +" .XXXXXX. ", +"............. ", +".XXXXXXXXXXX. ", +".XXXXXXXXXXX. ", +".XXXXXXXXXXX. ", +".XXXXXXXXXXX. ", +".XXXXXXXXXXX. ", +".XXXXXXXXXXX. ", +".XXXXXXXXXXX. ", +"............. "}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/icon.gif b/Master/tlpkg/tlperl.old/lib/Tk/icon.gif Binary files differnew file mode 100644 index 00000000000..dfe6b6621f2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/icon.gif diff --git a/Master/tlpkg/tlperl.old/lib/Tk/install.pm b/Master/tlpkg/tlperl.old/lib/Tk/install.pm new file mode 100644 index 00000000000..2392dc84fca --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/install.pm @@ -0,0 +1,37 @@ +package Tk::install; +require Exporter; + +use vars qw($VERSION @EXPORT); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Tk/install.pm#4 $ + +use base qw(Exporter); +@EXPORT = qw(installbin); + +use Config; + +sub installbin +{ + my $prog = shift(@ARGV); + my $start = $Config{'startperl'}; + my $perl = $Config{'perl'} || 'perl'; + $start =~ s/$perl$/$prog/; + while (($src,$dst) = splice(@ARGV,0,2)) + { + open(SRC,"<$src") || die "Cannot open $src:$!"; + my $line = <SRC>; + $line =~ s/^#!\s*\S+/$start/; + warn $line; + chmod(0755,$dst) if (-f $dst); + open(DST,">$dst") || die "Cannot open $dst:$!"; + print "installbin $src => $dst\n"; + do + { + print DST $line; + } while (defined($line = <SRC>)); + close(SRC); + close(DST); + chmod(0555,$dst); + } +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/license.terms b/Master/tlpkg/tlperl.old/lib/Tk/license.terms new file mode 100644 index 00000000000..6a5d3728366 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/license.terms @@ -0,0 +1,35 @@ +This software is copyrighted by the Regents of the University of +California, Sun Microsystems, Inc., and other parties. The following +terms apply to all files associated with the software unless explicitly +disclaimed in individual files. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + +RESTRICTED RIGHTS: Use, duplication or disclosure by the government +is subject to the restrictions as set forth in subparagraph (c) (1) (ii) +of the Rights in Technical Data and Computer Software Clause as DFARS +252.227-7013 and FAR 52.227-19. +0 in license.terms +0 in license.terms +0 in license.terms diff --git a/Master/tlpkg/tlperl.old/lib/Tk/openfile.xbm b/Master/tlpkg/tlperl.old/lib/Tk/openfile.xbm new file mode 100644 index 00000000000..859e2e57608 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/openfile.xbm @@ -0,0 +1,5 @@ +#define openfile_width 16 +#define openfile_height 12 +static unsigned char openfile_bits[] = { + 0x00, 0x00, 0xfc, 0x00, 0x02, 0x07, 0x01, 0x08, 0xc1, 0xff, 0xa1, 0xaa, + 0x51, 0x55, 0xa9, 0x2a, 0x55, 0x15, 0xab, 0x0a, 0xff, 0x07, 0x00, 0x00}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/openfolder.xbm b/Master/tlpkg/tlperl.old/lib/Tk/openfolder.xbm new file mode 100644 index 00000000000..59ee624efd0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/openfolder.xbm @@ -0,0 +1,5 @@ +#define openfolder_width 16 +#define openfolder_height 10 +static unsigned char openfolder_bits[] = { + 0xfc, 0x00, 0x02, 0x07, 0x01, 0x08, 0xc1, 0xff, 0x21, 0x80, 0x11, 0x40, + 0x09, 0x20, 0x05, 0x10, 0x03, 0x08, 0xff, 0x07}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/openfolder.xpm b/Master/tlpkg/tlperl.old/lib/Tk/openfolder.xpm new file mode 100644 index 00000000000..191fe1e72bc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/openfolder.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static char * openfolder_xpm[] = { +/* width height num_colors chars_per_pixel */ +"16 12 3 1", +/* colors */ +" s None c None", +". c black", +"X c #f0ff80", +/* pixels */ +" .... ", +" .XXXX. ", +" .XXXXXX. ", +"............. ", +".XXXXXXXXXXX. ", +".XXX............", +".XX.XXXXXXXXXXX.", +".XX.XXXXXXXXXX. ", +".X.XXXXXXXXXXX. ", +".X.XXXXXXXXXXX. ", +"..XXXXXXXXXX.. ", +"............. "}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/prolog.ps b/Master/tlpkg/tlperl.old/lib/Tk/prolog.ps new file mode 100644 index 00000000000..409e06a65a0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/prolog.ps @@ -0,0 +1,284 @@ +%%BeginProlog +50 dict begin + +% This is a standard prolog for Postscript generated by Tk's canvas +% widget. +% SCCS: @(#) prolog.ps 1.5 96/02/17 17:45:11 + +% The definitions below just define all of the variables used in +% any of the procedures here. This is needed for obscure reasons +% explained on p. 716 of the Postscript manual (Section H.2.7, +% "Initializing Variables," in the section on Encapsulated Postscript). + +/baseline 0 def +/stipimage 0 def +/height 0 def +/justify 0 def +/lineLength 0 def +/spacing 0 def +/stipple 0 def +/strings 0 def +/xoffset 0 def +/yoffset 0 def +/tmpstip null def + +% Define the array ISOLatin1Encoding (which specifies how characters are +% encoded for ISO-8859-1 fonts), if it isn't already present (Postscript +% level 2 is supposed to define it, but level 1 doesn't). + +systemdict /ISOLatin1Encoding known not { + /ISOLatin1Encoding [ + /space /space /space /space /space /space /space /space + /space /space /space /space /space /space /space /space + /space /space /space /space /space /space /space /space + /space /space /space /space /space /space /space /space + /space /exclam /quotedbl /numbersign /dollar /percent /ampersand + /quoteright + /parenleft /parenright /asterisk /plus /comma /minus /period /slash + /zero /one /two /three /four /five /six /seven + /eight /nine /colon /semicolon /less /equal /greater /question + /at /A /B /C /D /E /F /G + /H /I /J /K /L /M /N /O + /P /Q /R /S /T /U /V /W + /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore + /quoteleft /a /b /c /d /e /f /g + /h /i /j /k /l /m /n /o + /p /q /r /s /t /u /v /w + /x /y /z /braceleft /bar /braceright /asciitilde /space + /space /space /space /space /space /space /space /space + /space /space /space /space /space /space /space /space + /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent + /dieresis /space /ring /cedilla /space /hungarumlaut /ogonek /caron + /space /exclamdown /cent /sterling /currency /yen /brokenbar /section + /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen + /registered /macron + /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph + /periodcentered + /cedillar /onesuperior /ordmasculine /guillemotright /onequarter + /onehalf /threequarters /questiondown + /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla + /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex + /Idieresis + /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply + /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn + /germandbls + /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla + /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex + /idieresis + /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide + /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn + /ydieresis + ] def +} if + +% font ISOEncode font +% This procedure changes the encoding of a font from the default +% Postscript encoding to ISOLatin1. It's typically invoked just +% before invoking "setfont". The body of this procedure comes from +% Section 5.6.1 of the Postscript book. + +/ISOEncode { + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding ISOLatin1Encoding def + currentdict + end + + % I'm not sure why it's necessary to use "definefont" on this new + % font, but it seems to be important; just use the name "Temporary" + % for the font. + + /Temporary exch definefont +} bind def + +% StrokeClip +% +% This procedure converts the current path into a clip area under +% the assumption of stroking. It's a bit tricky because some Postscript +% interpreters get errors during strokepath for dashed lines. If +% this happens then turn off dashes and try again. + +/StrokeClip { + {strokepath} stopped { + (This Postscript printer gets limitcheck overflows when) = + (stippling dashed lines; lines will be printed solid instead.) = + [] 0 setdash strokepath} if + clip +} bind def + +% desiredSize EvenPixels closestSize +% +% The procedure below is used for stippling. Given the optimal size +% of a dot in a stipple pattern in the current user coordinate system, +% compute the closest size that is an exact multiple of the device's +% pixel size. This allows stipple patterns to be displayed without +% aliasing effects. + +/EvenPixels { + % Compute exact number of device pixels per stipple dot. + dup 0 matrix currentmatrix dtransform + dup mul exch dup mul add sqrt + + % Round to an integer, make sure the number is at least 1, and compute + % user coord distance corresponding to this. + dup round dup 1 lt {pop 1} if + exch div mul +} bind def + +% width height string StippleFill -- +% +% Given a path already set up and a clipping region generated from +% it, this procedure will fill the clipping region with a stipple +% pattern. "String" contains a proper image description of the +% stipple pattern and "width" and "height" give its dimensions. Each +% stipple dot is assumed to be about one unit across in the current +% user coordinate system. This procedure trashes the graphics state. + +/StippleFill { + % The following code is needed to work around a NeWSprint bug. + + /tmpstip 1 index def + + % Change the scaling so that one user unit in user coordinates + % corresponds to the size of one stipple dot. + 1 EvenPixels dup scale + + % Compute the bounding box occupied by the path (which is now + % the clipping region), and round the lower coordinates down + % to the nearest starting point for the stipple pattern. Be + % careful about negative numbers, since the rounding works + % differently on them. + + pathbbox + 4 2 roll + 5 index div dup 0 lt {1 sub} if cvi 5 index mul 4 1 roll + 6 index div dup 0 lt {1 sub} if cvi 6 index mul 3 2 roll + + % Stack now: width height string y1 y2 x1 x2 + % Below is a doubly-nested for loop to iterate across this area + % in units of the stipple pattern size, going up columns then + % across rows, blasting out a stipple-pattern-sized rectangle at + % each position + + 6 index exch { + 2 index 5 index 3 index { + % Stack now: width height string y1 y2 x y + + gsave + 1 index exch translate + 5 index 5 index true matrix tmpstip imagemask + grestore + } for + pop + } for + pop pop pop pop pop +} bind def + +% -- AdjustColor -- +% Given a color value already set for output by the caller, adjusts +% that value to a grayscale or mono value if requested by the CL +% variable. + +/AdjustColor { + CL 2 lt { + currentgray + CL 0 eq { + .5 lt {0} {1} ifelse + } if + setgray + } if +} bind def + +% x y strings spacing xoffset yoffset justify stipple DrawText -- +% This procedure does all of the real work of drawing text. The +% color and font must already have been set by the caller, and the +% following arguments must be on the stack: +% +% x, y - Coordinates at which to draw text. +% strings - An array of strings, one for each line of the text item, +% in order from top to bottom. +% spacing - Spacing between lines. +% xoffset - Horizontal offset for text bbox relative to x and y: 0 for +% nw/w/sw anchor, -0.5 for n/center/s, and -1.0 for ne/e/se. +% yoffset - Vertical offset for text bbox relative to x and y: 0 for +% nw/n/ne anchor, +0.5 for w/center/e, and +1.0 for sw/s/se. +% justify - 0 for left justification, 0.5 for center, 1 for right justify. +% stipple - Boolean value indicating whether or not text is to be +% drawn in stippled fashion. If text is stippled, +% procedure StippleText must have been defined to call +% StippleFill in the right way. +% +% Also, when this procedure is invoked, the color and font must already +% have been set for the text. + +/DrawText { + /stipple exch def + /justify exch def + /yoffset exch def + /xoffset exch def + /spacing exch def + /strings exch def + + % First scan through all of the text to find the widest line. + + /lineLength 0 def + strings { + stringwidth pop + dup lineLength gt {/lineLength exch def} {pop} ifelse + newpath + } forall + + % Compute the baseline offset and the actual font height. + + 0 0 moveto (TXygqPZ) false charpath + pathbbox dup /baseline exch def + exch pop exch sub /height exch def pop + newpath + + % Translate coordinates first so that the origin is at the upper-left + % corner of the text's bounding box. Remember that x and y for + % positioning are still on the stack. + + translate + lineLength xoffset mul + strings length 1 sub spacing mul height add yoffset mul translate + + % Now use the baseline and justification information to translate so + % that the origin is at the baseline and positioning point for the + % first line of text. + + justify lineLength mul baseline neg translate + + % Iterate over each of the lines to output it. For each line, + % compute its width again so it can be properly justified, then + % display it. + + strings { + dup stringwidth pop + justify neg mul 0 moveto + stipple { + + % The text is stippled, so turn it into a path and print + % by calling StippledText, which in turn calls StippleFill. + % Unfortunately, many Postscript interpreters will get + % overflow errors if we try to do the whole string at + % once, so do it a character at a time. + + gsave + /char (X) def + { + char 0 3 -1 roll put + currentpoint + gsave + char true charpath clip StippleText + grestore + char stringwidth translate + moveto + } forall + grestore + } {show} ifelse + 0 spacing neg translate + } forall +} bind def + +%%EndProlog diff --git a/Master/tlpkg/tlperl.old/lib/Tk/reindex.pl b/Master/tlpkg/tlperl.old/lib/Tk/reindex.pl new file mode 100644 index 00000000000..7af5cc1d13f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/reindex.pl @@ -0,0 +1,33 @@ +#!/bin/perl + +use lib qw(/home1/gbartels/textlist); +use Tk; + +use Tk::TextReindex qw(Tk::ROText ROTextReindex); + +$mw=new MainWindow; + +my $idx; + +$w=$mw->ROTextReindex()->pack(-side => "top"); +$t=$mw->Label(-textvariable => \$idx)->pack(-side => "bottom"); + +$w->bind('<Key>',sub{$idx=$w->index("insert")}); + +$w->insert('end',"abcd\n"); +$w->insert('end',"efgh\n"); +$w->insert('end',"mnop\n"); +$w->insert('end',"qrst\n"); +$w->insert('end',"uvwx\n"); + +$w->insert('2.0',"ijkl\n"); + +my $string = $w->get('4.0'); + + +my $result = "reading index 4.0 : expect string to equal >q<, actual value is $string \n"; +$w->insert('end',$result); + +print $result; + +MainLoop; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/srcfile.xpm b/Master/tlpkg/tlperl.old/lib/Tk/srcfile.xpm new file mode 100644 index 00000000000..06a40a96c84 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/srcfile.xpm @@ -0,0 +1,18 @@ +/* XPM */ +static char * srcfile_xpm[] = { +"12 12 3 1", +" s None c None", +". c #000000000000", +"X c gray91", +" ........ ", +" .XXXXXX. ", +" .XXXXXX... ", +" .XXXXXXXX. ", +" .XX...XXX. ", +" .X.XXX.XX. ", +" .X.XXXXXX. ", +" .X.XXXXXX. ", +" .XX....XX. ", +" .XXXXXXXX. ", +" .XXXXXXXX. ", +" .......... "}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/textfile.xpm b/Master/tlpkg/tlperl.old/lib/Tk/textfile.xpm new file mode 100644 index 00000000000..8fa8d2f9032 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/textfile.xpm @@ -0,0 +1,18 @@ +/* XPM */ +static char * textfile_xpm[] = { +"12 12 3 1", +" s None c None", +". c #000000000000", +"X c #E0E0FFFFE0E0", +" ........ ", +" .XXXXXX. ", +" .XXXXXX... ", +" .X....XXX. ", +" .XXXXXXXX. ", +" .X...XXXX. ", +" .XXXXXXXX. ", +" .X.....XX. ", +" .XXXXXXXX. ", +" .X.....XX. ", +" .XXXXXXXX. ", +" .......... "}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/tkGlue.def b/Master/tlpkg/tlperl.old/lib/Tk/tkGlue.def new file mode 100644 index 00000000000..2f1662c71c2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/tkGlue.def @@ -0,0 +1,130 @@ +#ifdef CAN_PROTOTYPE +#define XSdec(x) XS(x) +#else +#define XSdec(x) void x() +#endif + +#define TKXSRETURN(off) \ + STMT_START { \ + IV ptkAdj = (off); \ + XSRETURN(ptkAdj); \ + } STMT_END + +#ifndef PATCHLEVEL +#include <patchlevel.h> +#endif + +#if defined(PATCHLEVEL) && (PATCHLEVEL < 5) +#define PL_sv_undef sv_undef +#define PL_tainting tainting +#define PL_tainted tainted +#define PL_stack_base stack_base +#define PL_stack_sp stack_sp +#define PL_curcop curcop +#endif + +#ifndef CopSTASH +#define CopSTASH(c) c->cop_stash +#define CopSTASH_set(c,h) (CopSTASH(c) = h) +#endif + +#ifndef dTHX +#define dTHR int maybeTHR +#endif + +#ifndef dTHXs +#ifdef PERL_IMPLICIT_SYS +#define dTHXs dTHX +#else +#define dTHR int maybeTHR +#endif +#endif + +#ifndef ERRSV +#define ERRSV GvSV(errgv) +#endif + +#ifndef aTHX_ +#define aTHX_ +#endif + +#ifndef pTHX_ +#define pTHX_ +#endif + +#ifdef dirty +#undef dirty +#endif +#ifdef bufptr +#undef bufptr +#endif +#ifdef colors +#undef colors +#endif +#ifdef JOIN +#undef JOIN +#endif + +#ifdef na +#if PATCHLEVEL >= 5 +#undef na +#endif +#endif + + +#define Tcl_Interp HV +#define LangCallback SV +#define Var SV * +#define LangResultSave AV +struct Lang_CmdInfo; +#define Tcl_Command struct Lang_CmdInfo * +struct WrappedRegExp; +#define Tcl_RegExp struct WrappedRegExp * +#define Tcl_Obj SV +#define Tcl_DString SV * + +#ifndef PerlIO +#define PerlIO FILE +#define PerlIO_stderr() stderr +#define PerlIO_printf fprintf +#define PerlIO_flush(f) Fflush(f) +#define PerlIO_vprintf(f,fmt,a) vfprintf(f,fmt,a) +#define PerlIO_putc(f,c) fputc(c,f) +#define PerlIO_fileno(f) fileno(f) + +/* Now our interface to Configure's FILE_xxx macros */ + +#ifdef USE_STDIO_PTR +#define PerlIO_has_cntptr(f) 1 +#define PerlIO_get_ptr(f) FILE_ptr(f) +#define PerlIO_get_cnt(f) FILE_cnt(f) + +#ifdef FILE_CNT_LVALUE +#define PerlIO_canset_cnt(f) 1 +#ifdef FILE_PTR_LVALUE +#define PerlIO_fast_gets(f) 1 +#endif +#define PerlIO_set_cnt(f,c) (FILE_cnt(f) = (c)) +#else +#define PerlIO_canset_cnt(f) 0 +#define PerlIO_set_cnt(f,c) abort() +#endif + +#ifdef FILE_PTR_LVALUE +#define PerlIO_set_ptrcnt(f,p,c) (FILE_ptr(f) = (p), PerlIO_set_cnt(f,c)) +#else +#define PerlIO_set_ptrcnt(f,p,c) abort() +#endif + +#else /* USE_STDIO_PTR */ + +#define PerlIO_has_cntptr(f) 0 +#define PerlIO_get_cnt(f) (abort(),0) +#define PerlIO_get_ptr(f) (abort(),0) +#define PerlIO_set_cnt(f,c) abort() +#define PerlIO_set_ptrcnt(f,p,c) abort() + +#endif /* USE_STDIO_PTR */ + +#endif + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/tkGlue.h b/Master/tlpkg/tlperl.old/lib/Tk/tkGlue.h new file mode 100644 index 00000000000..31a7f861700 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/tkGlue.h @@ -0,0 +1,79 @@ +#ifndef _TKGLUE +#define _TKGLUE + +#ifndef BASEEXT +#define BASEEXT "Tk" +#endif + +#ifndef _TKOPTION +#include "pTk/tkOption.h" +#include "pTk/tkOption_f.h" +#endif + +typedef struct EventAndKeySym + {XEvent event; + KeySym keySym; + Tcl_Interp *interp; + Tk_Window tkwin; + SV *window; + } EventAndKeySym; + +typedef struct Lang_CmdInfo + {Tcl_CmdInfo Tk; + Tcl_Interp *interp; + Tk_Window tkwin; + SV *image; + Tk_Font tkfont; + } Lang_CmdInfo; + +#include "vtab.def" + + +#define VTABLE_INIT() IMPORT_VTABLES + +extern Lang_CmdInfo *WindowCommand _ANSI_ARGS_((SV *win,HV **hptr, int moan)); +extern Tk_Window SVtoWindow _ANSI_ARGS_((SV *win)); +extern Tk_Font SVtoFont _ANSI_ARGS_((SV *win)); +extern int Call_Tk _ANSI_ARGS_((Lang_CmdInfo *info,int argc, SV **args)); +extern HV *InterpHv _ANSI_ARGS_((Tcl_Interp *interp,int fatal)); +extern SV *WidgetRef _ANSI_ARGS_((Tcl_Interp *interp, char *path)); +extern SV *ObjectRef _ANSI_ARGS_((Tcl_Interp *interp, char *path)); +extern SV *TkToWidget _ANSI_ARGS_((Tk_Window tkwin,Tcl_Interp **pinterp)); +extern SV *FindTkVarName _ANSI_ARGS_((CONST char *varName,int flags)); +extern void EnterWidgetMethods _ANSI_ARGS_((char *package, ...)); +extern SV *MakeReference _ANSI_ARGS_((SV * sv)); +extern Tk_Window TkToMainWindow _ANSI_ARGS_((Tk_Window tkwin)); +extern void Lang_TkSubCommand _ANSI_ARGS_ ((char *name, Tcl_ObjCmdProc *proc)); +extern void Lang_TkCommand _ANSI_ARGS_ ((char *name, Tcl_ObjCmdProc *proc)); +extern SV *XEvent_Info _((EventAndKeySym *obj,char *s)); +extern EventAndKeySym *SVtoEventAndKeySym _((SV *arg)); +extern int XSTkCommand _ANSI_ARGS_((CV *cv, int mwcd, Tcl_ObjCmdProc *proc, int items, SV **args)); + +extern XS(XStoWidget); + +EXTERN void ClearErrorInfo _ANSI_ARGS_((SV *interp)); +EXTERN Tk_Window mainWindow; +EXTERN void DumpStack _ANSI_ARGS_((CONST char *who)); +EXTERN void Boot_Glue (pTHX); +EXTERN void Boot_Tix (pTHX); +EXTERN void install_vtab _ANSI_ARGS_((char *name, void *table, size_t size)); +extern SV *TagIt _((SV *sv, char *type)); +extern void Font_DESTROY _((SV *sv)); +struct pTkCheckChain; +extern void Tk_CheckHash _((SV *sv,struct pTkCheckChain *chain)); + +extern int has_highbit(CONST char *s,int l); +extern SV * sv_maybe_utf8(SV *sv); +extern SV * Lang_SystemEncoding(void); + +#ifndef WIN32 +#define HWND void * +#endif +EXTERN HWND SVtoHWND _ANSI_ARGS_((SV *win)); + +#ifdef WIN32 +#include "pTk/tkWinInt.h" +#endif + +#endif + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/tkGlue.m b/Master/tlpkg/tlperl.old/lib/Tk/tkGlue.m new file mode 100644 index 00000000000..922d1426a55 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/tkGlue.m @@ -0,0 +1,74 @@ +#ifndef _TKGLUE_VM +#define _TKGLUE_VM +#include "tkGlue_f.h" +#ifndef NO_VTABLES +#ifndef Call_Tk +# define Call_Tk (*TkglueVptr->V_Call_Tk) +#endif + +#ifndef EnterWidgetMethods +# define EnterWidgetMethods (*TkglueVptr->V_EnterWidgetMethods) +#endif + +#ifndef FindTkVarName +# define FindTkVarName (*TkglueVptr->V_FindTkVarName) +#endif + +#ifndef InterpHv +# define InterpHv (*TkglueVptr->V_InterpHv) +#endif + +#ifndef Lang_TkCommand +# define Lang_TkCommand (*TkglueVptr->V_Lang_TkCommand) +#endif + +#ifndef Lang_TkSubCommand +# define Lang_TkSubCommand (*TkglueVptr->V_Lang_TkSubCommand) +#endif + +#ifndef MakeReference +# define MakeReference (*TkglueVptr->V_MakeReference) +#endif + +#ifndef ObjectRef +# define ObjectRef (*TkglueVptr->V_ObjectRef) +#endif + +#ifndef SVtoFont +# define SVtoFont (*TkglueVptr->V_SVtoFont) +#endif + +#ifndef SVtoHWND +# define SVtoHWND (*TkglueVptr->V_SVtoHWND) +#endif + +#ifndef SVtoWindow +# define SVtoWindow (*TkglueVptr->V_SVtoWindow) +#endif + +#ifndef TkToMainWindow +# define TkToMainWindow (*TkglueVptr->V_TkToMainWindow) +#endif + +#ifndef TkToWidget +# define TkToWidget (*TkglueVptr->V_TkToWidget) +#endif + +#ifndef WidgetRef +# define WidgetRef (*TkglueVptr->V_WidgetRef) +#endif + +#ifndef WindowCommand +# define WindowCommand (*TkglueVptr->V_WindowCommand) +#endif + +#ifndef XSTkCommand +# define XSTkCommand (*TkglueVptr->V_XSTkCommand) +#endif + +#ifndef install_vtab +# define install_vtab (*TkglueVptr->V_install_vtab) +#endif + +#endif /* NO_VTABLES */ +#endif /* _TKGLUE_VM */ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/tkGlue.t b/Master/tlpkg/tlperl.old/lib/Tk/tkGlue.t new file mode 100644 index 00000000000..ff689ff5539 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/tkGlue.t @@ -0,0 +1,70 @@ +#ifdef _TKGLUE +#ifndef Call_Tk +VFUNC(int,Call_Tk,V_Call_Tk,_ANSI_ARGS_((Lang_CmdInfo *info,int argc, SV **args))) +#endif /* #ifndef Call_Tk */ + +#ifndef EnterWidgetMethods +VFUNC(void,EnterWidgetMethods,V_EnterWidgetMethods,_ANSI_ARGS_((char *package, ...))) +#endif /* #ifndef EnterWidgetMethods */ + +#ifndef FindTkVarName +VFUNC(SV *,FindTkVarName,V_FindTkVarName,_ANSI_ARGS_((CONST char *varName,int flags))) +#endif /* #ifndef FindTkVarName */ + +#ifndef InterpHv +VFUNC(HV *,InterpHv,V_InterpHv,_ANSI_ARGS_((Tcl_Interp *interp,int fatal))) +#endif /* #ifndef InterpHv */ + +#ifndef Lang_TkCommand +VFUNC(void,Lang_TkCommand,V_Lang_TkCommand,_ANSI_ARGS_((char *name, Tcl_ObjCmdProc *proc))) +#endif /* #ifndef Lang_TkCommand */ + +#ifndef Lang_TkSubCommand +VFUNC(void,Lang_TkSubCommand,V_Lang_TkSubCommand,_ANSI_ARGS_((char *name, Tcl_ObjCmdProc *proc))) +#endif /* #ifndef Lang_TkSubCommand */ + +#ifndef MakeReference +VFUNC(SV *,MakeReference,V_MakeReference,_ANSI_ARGS_((SV * sv))) +#endif /* #ifndef MakeReference */ + +#ifndef ObjectRef +VFUNC(SV *,ObjectRef,V_ObjectRef,_ANSI_ARGS_((Tcl_Interp *interp, char *path))) +#endif /* #ifndef ObjectRef */ + +#ifndef SVtoFont +VFUNC(Tk_Font,SVtoFont,V_SVtoFont,_ANSI_ARGS_((SV *win))) +#endif /* #ifndef SVtoFont */ + +#ifndef SVtoHWND +VFUNC(HWND,SVtoHWND,V_SVtoHWND,_ANSI_ARGS_((SV *win))) +#endif /* #ifndef SVtoHWND */ + +#ifndef SVtoWindow +VFUNC(Tk_Window,SVtoWindow,V_SVtoWindow,_ANSI_ARGS_((SV *win))) +#endif /* #ifndef SVtoWindow */ + +#ifndef TkToMainWindow +VFUNC(Tk_Window,TkToMainWindow,V_TkToMainWindow,_ANSI_ARGS_((Tk_Window tkwin))) +#endif /* #ifndef TkToMainWindow */ + +#ifndef TkToWidget +VFUNC(SV *,TkToWidget,V_TkToWidget,_ANSI_ARGS_((Tk_Window tkwin,Tcl_Interp **pinterp))) +#endif /* #ifndef TkToWidget */ + +#ifndef WidgetRef +VFUNC(SV *,WidgetRef,V_WidgetRef,_ANSI_ARGS_((Tcl_Interp *interp, char *path))) +#endif /* #ifndef WidgetRef */ + +#ifndef WindowCommand +VFUNC(Lang_CmdInfo *,WindowCommand,V_WindowCommand,_ANSI_ARGS_((SV *win,HV **hptr, int moan))) +#endif /* #ifndef WindowCommand */ + +#ifndef XSTkCommand +VFUNC(int,XSTkCommand,V_XSTkCommand,_ANSI_ARGS_((CV *cv, int mwcd, Tcl_ObjCmdProc *proc, int items, SV **args))) +#endif /* #ifndef XSTkCommand */ + +#ifndef install_vtab +VFUNC(void,install_vtab,V_install_vtab,_ANSI_ARGS_((char *name, void *table, size_t size))) +#endif /* #ifndef install_vtab */ + +#endif /* _TKGLUE */ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/tkGlue_f.h b/Master/tlpkg/tlperl.old/lib/Tk/tkGlue_f.h new file mode 100644 index 00000000000..8255c08dc3f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/tkGlue_f.h @@ -0,0 +1,14 @@ +#ifndef TKGLUE_VT +#define TKGLUE_VT +typedef struct TkglueVtab +{ + unsigned (*tabSize)(void); +#define VFUNC(type,name,mem,args) type (*mem) args; +#define VVAR(type,name,mem) type (*mem); +#include "tkGlue.t" +#undef VFUNC +#undef VVAR +} TkglueVtab; +extern TkglueVtab *TkglueVptr; +extern TkglueVtab *TkglueVGet(void); +#endif /* TKGLUE_VT */ diff --git a/Master/tlpkg/tlperl.old/lib/Tk/tranicon.gif b/Master/tlpkg/tlperl.old/lib/Tk/tranicon.gif Binary files differnew file mode 100644 index 00000000000..dc7d494c572 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/tranicon.gif diff --git a/Master/tlpkg/tlperl.old/lib/Tk/typemap b/Master/tlpkg/tlperl.old/lib/Tk/typemap new file mode 100644 index 00000000000..29138850ab3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/typemap @@ -0,0 +1,96 @@ +TYPEMAP +Tk_Window T_TK_WINDOW +Tk_Image T_TK_IMAGE +TkWindow * T_TKWINDOW +Display * T_IVOBJ +Screen * T_IVOBJ +Visual * T_IVOBJ +Window T_IVOBJ +Colormap T_IVOBJ +GC T_IVOBJ +Font T_IVOBJ +Atom T_IV +HANDLE T_IV +BOOL T_IV +HWND T_TK_HWND +FILE * T_NIO +hash_ptr * T_PTR +Tk_3DBorder T_IVOBJ +Tk_Uid T_TK_UID +Tcl_Interp * T_TK_INTERP +Tk_Font T_TK_FONT +EventAndKeySym * T_TK_XEVENT +LangCallback * T_TK_CALLBACK +LangFontInfo * T_PVOBJ +const char * T_PV + +INPUT +T_PVOBJ + if (sv_isobject($arg)) { + STRLEN sz; + $var = ($type) SvPV((SV*)SvRV($arg),sz); + if (sz != sizeof(*$var)) + croak(\"$arg too small (%d) for $var $type (%d)\",sz,sizeof(*$var)); + } + else + croak(\"$var is not an object\") + +T_TK_WINDOW + $var = SVtoWindow($arg) + +T_TK_CALLBACK + $var = LangMakeCallback($arg) + + +T_TK_HWND + $var = SVtoHWND($arg) + +T_TK_XEVENT + $var = SVtoEventAndKeySym($arg) + +T_TK_FONT + $var = SVtoFont($arg) + +T_TK_IMAGE + $var = SVtoImage($arg) + +T_TKWINDOW + $var = (TkWindow *) SVtoWindow($arg) + +T_TK_INTERP + $var = WindowCommand($arg,NULL,1)->interp + +T_TK_UID + $var = Tk_GetUid(SvPV($arg,na)) + +T_IVOBJ + if (sv_isa($arg, \"${ntype}\")) { + $var = INT2PTR($type, SvIV(SvRV($arg))); + } + else { + $var = ($type) NULL; + croak(\"$var is not of type ${ntype}\"); + } + +T_NIO + if (sv_isa($arg, \"${Package}\")) { + $var = IoIFP(sv_2io(SvRV($arg))); + } + else + croak(\"$var is not of type ${Package}\") + + +OUTPUT +T_IVOBJ + sv_setref_iv($arg, \"${ntype}\", PTR2IV($var)); + +T_TK_UID + sv_setpv($arg,$var); + +T_TK_WINDOW + SvSetMagicSV($arg,TkToWidget($var,NULL)); + +T_TKWINDOW + SvSetMagicSV($arg,TkToWidget((Tk_Window) $var,NULL)); + + diff --git a/Master/tlpkg/tlperl.old/lib/Tk/vtab.def b/Master/tlpkg/tlperl.old/lib/Tk/vtab.def new file mode 100644 index 00000000000..7663df7d6f4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/vtab.def @@ -0,0 +1,90 @@ +#define IMPORT_VTABLE(ptr,type,name) do { \ + ptr = INT2PTR(type *,SvIV(get_sv(name,GV_ADDWARN|GV_ADD))); \ + if ((*ptr->tabSize)() != sizeof(type)) { \ + Perl_warn(aTHX_ "%s wrong size for %s",name,#type); \ + } \ + } while (0) + +#ifdef WIN32 +#define DECLARE_VTABLES \ +LangVtab *LangVptr; \ +TcldeclsVtab *TcldeclsVptr; \ +TkVtab *TkVptr; \ +TkdeclsVtab *TkdeclsVptr; \ +TkeventVtab *TkeventVptr; \ +TkglueVtab *TkglueVptr; \ +TkintVtab *TkintVptr; \ +TkintdeclsVtab *TkintdeclsVptr; \ +TkintplatdeclsVtab *TkintplatdeclsVptr;\ +TkintxlibdeclsVtab *TkintxlibdeclsVptr;\ +TkoptionVtab *TkoptionVptr; \ +TkplatdeclsVtab *TkplatdeclsVptr + +#define IMPORT_VTABLES do { \ +IMPORT_VTABLE(LangVptr , LangVtab,"Tk::LangVtab"); \ +IMPORT_VTABLE(TcldeclsVptr , TcldeclsVtab,"Tk::TcldeclsVtab"); \ +IMPORT_VTABLE(TkVptr , TkVtab,"Tk::TkVtab"); \ +IMPORT_VTABLE(TkdeclsVptr , TkdeclsVtab,"Tk::TkdeclsVtab"); \ +IMPORT_VTABLE(TkeventVptr , TkeventVtab,"Tk::TkeventVtab"); \ +IMPORT_VTABLE(TkglueVptr , TkglueVtab,"Tk::TkglueVtab"); \ +IMPORT_VTABLE(TkintVptr , TkintVtab,"Tk::TkintVtab"); \ +IMPORT_VTABLE(TkintdeclsVptr , TkintdeclsVtab,"Tk::TkintdeclsVtab"); \ +IMPORT_VTABLE(TkintplatdeclsVptr,TkintplatdeclsVtab,"Tk::TkintplatdeclsVtab"); \ +IMPORT_VTABLE(TkintxlibdeclsVptr,TkintxlibdeclsVtab,"Tk::TkintxlibdeclsVtab"); \ +IMPORT_VTABLE(TkoptionVptr , TkoptionVtab,"Tk::TkoptionVtab"); \ +IMPORT_VTABLE(TkplatdeclsVptr , TkplatdeclsVtab,"Tk::TkplatdeclsVtab"); \ +} while (0) +#else +#define DECLARE_VTABLES \ +LangVtab *LangVptr; \ +TcldeclsVtab *TcldeclsVptr; \ +TkVtab *TkVptr; \ +TkdeclsVtab *TkdeclsVptr; \ +TkeventVtab *TkeventVptr; \ +TkglueVtab *TkglueVptr; \ +TkintVtab *TkintVptr; \ +TkintdeclsVtab *TkintdeclsVptr; \ +TkoptionVtab *TkoptionVptr; \ +XlibVtab *XlibVptr + +#define IMPORT_VTABLES do { \ +IMPORT_VTABLE(LangVptr , LangVtab,"Tk::LangVtab"); \ +IMPORT_VTABLE(TcldeclsVptr , TcldeclsVtab,"Tk::TcldeclsVtab"); \ +IMPORT_VTABLE(TkVptr , TkVtab,"Tk::TkVtab"); \ +IMPORT_VTABLE(TkdeclsVptr , TkdeclsVtab,"Tk::TkdeclsVtab"); \ +IMPORT_VTABLE(TkeventVptr , TkeventVtab,"Tk::TkeventVtab"); \ +IMPORT_VTABLE(TkglueVptr , TkglueVtab,"Tk::TkglueVtab"); \ +IMPORT_VTABLE(TkintVptr , TkintVtab,"Tk::TkintVtab"); \ +IMPORT_VTABLE(TkintdeclsVptr , TkintdeclsVtab,"Tk::TkintdeclsVtab"); \ +IMPORT_VTABLE(TkoptionVptr , TkoptionVtab,"Tk::TkoptionVtab"); \ +IMPORT_VTABLE(XlibVptr , XlibVtab,"Tk::XlibVtab"); \ +} while (0) +#endif +#define DECLARE_TIX \ +TixVtab *TixVptr; \ +TixintVtab *TixintVptr + +#define IMPORT_TIX do { \ +IMPORT_VTABLE(TixVptr , TixVtab,"Tk::TixVtab"); \ +IMPORT_VTABLE(TixintVptr , TixintVtab,"Tk::TixintVtab"); \ +} while (0) +#define DECLARE_PHOTO \ +ImgintVtab *ImgintVptr; \ +TkimgphotoVtab *TkimgphotoVptr + +#define IMPORT_PHOTO do { \ +IMPORT_VTABLE(ImgintVptr , ImgintVtab,"Tk::ImgintVtab"); \ +IMPORT_VTABLE(TkimgphotoVptr , TkimgphotoVtab,"Tk::TkimgphotoVtab"); \ +} while (0) +#define DECLARE_EVENT \ +TkeventVtab *TkeventVptr + +#define IMPORT_EVENT do { \ +IMPORT_VTABLE(TkeventVptr , TkeventVtab,"Tk::TkeventVtab"); \ +} while (0) +#define DECLARE_TIXXPM \ +TiximgxpmVtab *TiximgxpmVptr + +#define IMPORT_TIXXPM do { \ +IMPORT_VTABLE(TiximgxpmVptr , TiximgxpmVtab,"Tk::TiximgxpmVtab"); \ +} while (0) diff --git a/Master/tlpkg/tlperl.old/lib/Tk/widgets.pm b/Master/tlpkg/tlperl.old/lib/Tk/widgets.pm new file mode 100644 index 00000000000..0d628027810 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/widgets.pm @@ -0,0 +1,21 @@ +package Tk::widgets; +use Carp; + +use vars qw($VERSION); +$VERSION = '4.004'; # $Id: //depot/Tkutf8/Tk/widgets.pm#4 $ + +sub import +{ + my $class = shift; + foreach (@_) + { + local $SIG{__DIE__} = \&Carp::croak; + # carp "$_ already loaded" if (exists $INC{"Tk/$_.pm"}); + require "Tk/$_.pm"; + } +} + +1; +__END__ + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Tk/win.xbm b/Master/tlpkg/tlperl.old/lib/Tk/win.xbm new file mode 100644 index 00000000000..13c05e8c2d7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/win.xbm @@ -0,0 +1,6 @@ +#define win.xbm_width 16 +#define win.xbm_height 16 +static char win.xbm_bits[] = { + 0xff, 0xff, 0x0d, 0xb0, 0xff, 0xff, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0xff, 0xff}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/winfolder.xpm b/Master/tlpkg/tlperl.old/lib/Tk/winfolder.xpm new file mode 100644 index 00000000000..73fe734c6d0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/winfolder.xpm @@ -0,0 +1,39 @@ +/* XPM */ +static char *winfolder[] = { +/* width height num_colors chars_per_pixel */ +" 17 15 17 1", +/* colors */ +" c none", +". c #000000", +"# c #808080", +"a c #800000", +"b c #808000", +"c c #008000", +"d c #008080", +"e c #000080", +"f c #800080", +"g c #ffffff", +"h c #c0c0c0", +"i c #ff0000", +"j c #ffff00", +"k c #00ff00", +"l c #00ffff", +"m c #0000ff", +"n c #ff00ff", +/* pixels */ +" ", +" ##### ", +" #hjhjh# ", +" #hjhjhjh###### ", +" #gggggggggggg#. ", +" #gjhjhjhjhjhj#. ", +" #ghjhjhjhjhjh#. ", +" #gjhjhjhjhjhj#. ", +" #ghjhjhjhjhjh#. ", +" #gjhjhjhjhjhj#. ", +" #ghjhjhjhjhjh#. ", +" #gjhjhjhjhjhj#. ", +" ##############. ", +" .............. ", +" ", +}; diff --git a/Master/tlpkg/tlperl.old/lib/Tk/wintext.xpm b/Master/tlpkg/tlperl.old/lib/Tk/wintext.xpm new file mode 100644 index 00000000000..50b2d5587dd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Tk/wintext.xpm @@ -0,0 +1,42 @@ +/* XPM */ +static char *wintext[] = { +/* width height num_colors chars_per_pixel */ +" 15 18 17 1", +/* colors */ +" c None", +". c #000000", +"# c #808080", +"a c #800000", +"b c #808000", +"c c #008000", +"d c #008080", +"e c #000080", +"f c #800080", +"g c #ffffff", +"h c #c0c0c0", +"i c #ff0000", +"j c #ffff00", +"k c #00ff00", +"l c #00ffff", +"m c #0000ff", +"n c #ff00ff", +/* pixels */ +" ", +" . . . . . ", +" .g#g#g#g#g. ", +" #g.g.g.g.g.g. ", +" #ggggggggggh. ", +" #ggggggggggh. ", +" #gg...g..ggh. ", +" #ggggggggggh. ", +" #gg......ggh. ", +" #ggggggggggh. ", +" #gg......ggh. ", +" #ggggggggggh. ", +" #gg......ggh. ", +" #ggggggggggh. ", +" #ggggggggggh. ", +" #hhhhhhhhhhh. ", +" ........... ", +" " +}; diff --git a/Master/tlpkg/tlperl.old/lib/UNIVERSAL.pm b/Master/tlpkg/tlperl.old/lib/UNIVERSAL.pm new file mode 100644 index 00000000000..7b7bfc4058a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/UNIVERSAL.pm @@ -0,0 +1,147 @@ +package UNIVERSAL; + +our $VERSION = '1.01'; + +# UNIVERSAL should not contain any extra subs/methods beyond those +# that it exists to define. The use of Exporter below is a historical +# accident that can't be fixed without breaking code. Note that we +# *don't* set @ISA here, don't want all classes/objects inheriting from +# Exporter. It's bad enough that all classes have a import() method +# whenever UNIVERSAL.pm is loaded. +require Exporter; +*import = \&Exporter::import; +@EXPORT_OK = qw(isa can VERSION); + +1; +__END__ + +=head1 NAME + +UNIVERSAL - base class for ALL classes (blessed references) + +=head1 SYNOPSIS + + $is_io = $fd->isa("IO::Handle"); + $is_io = Class->isa("IO::Handle"); + + $sub = $obj->can("print"); + $sub = Class->can("print"); + + use UNIVERSAL qw( isa can VERSION ); + $yes = isa $ref, "HASH" ; + $sub = can $ref, "fandango" ; + $ver = VERSION $obj ; + +=head1 DESCRIPTION + +C<UNIVERSAL> is the base class which all bless references will inherit from, +see L<perlobj>. + +C<UNIVERSAL> provides the following methods and functions: + +=over 4 + +=item C<< $obj->isa( TYPE ) >> + +=item C<< CLASS->isa( TYPE ) >> + +=item C<isa( VAL, TYPE )> + +Where + +=over 4 + +=item C<TYPE> + +is a package name + +=item C<$obj> + +is a blessed reference or a string containing a package name + +=item C<CLASS> + +is a package name + +=item C<VAL> + +is any of the above or an unblessed reference + +=back + +When used as an instance or class method (C<< $obj->isa( TYPE ) >>), +C<isa> returns I<true> if $obj is blessed into package C<TYPE> or +inherits from package C<TYPE>. + +When used as a class method (C<< CLASS->isa( TYPE ) >>: sometimes +referred to as a static method), C<isa> returns I<true> if C<CLASS> +inherits from (or is itself) the name of the package C<TYPE> or +inherits from package C<TYPE>. + +When used as a function, like + + use UNIVERSAL qw( isa ) ; + $yes = isa $h, "HASH"; + $yes = isa "Foo", "Bar"; + +or + + require UNIVERSAL ; + $yes = UNIVERSAL::isa $a, "ARRAY"; + +C<isa> returns I<true> in the same cases as above and also if C<VAL> is an +unblessed reference to a perl variable of type C<TYPE>, such as "HASH", +"ARRAY", or "Regexp". + +=item C<< $obj->can( METHOD ) >> + +=item C<< CLASS->can( METHOD ) >> + +=item C<can( VAL, METHOD )> + +C<can> checks if the object or class has a method called C<METHOD>. If it does +then a reference to the sub is returned. If it does not then I<undef> is +returned. This includes methods inherited or imported by C<$obj>, C<CLASS>, or +C<VAL>. + +C<can> cannot know whether an object will be able to provide a method +through AUTOLOAD, so a return value of I<undef> does not necessarily mean +the object will not be able to handle the method call. To get around +this some module authors use a forward declaration (see L<perlsub>) +for methods they will handle via AUTOLOAD. For such 'dummy' subs, C<can> +will still return a code reference, which, when called, will fall through +to the AUTOLOAD. If no suitable AUTOLOAD is provided, calling the coderef +will cause an error. + +C<can> can be called as a class (static) method, an object method, or a +function. + +When used as a function, if C<VAL> is a blessed reference or package name which +has a method called C<METHOD>, C<can> returns a reference to the subroutine. +If C<VAL> is not a blessed reference, or if it does not have a method +C<METHOD>, I<undef> is returned. + +=item C<VERSION ( [ REQUIRE ] )> + +C<VERSION> will return the value of the variable C<$VERSION> in the +package the object is blessed into. If C<REQUIRE> is given then +it will do a comparison and die if the package version is not +greater than or equal to C<REQUIRE>. + +C<VERSION> can be called as either a class (static) method, an object +method or a function. + + +=back + +=head1 EXPORTS + +None by default. + +You may request the import of all three functions (C<isa>, C<can>, and +C<VERSION>), however it isn't usually necessary to do so. Perl magically +makes these functions act as methods on all objects. The one exception is +C<isa>, which is useful as a function when operating on non-blessed +references. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Win32.pm b/Master/tlpkg/tlperl.old/lib/Win32.pm new file mode 100644 index 00000000000..e55bfee4dfe --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32.pm @@ -0,0 +1,712 @@ +package Win32; + +BEGIN { + use strict; + use vars qw|$VERSION @ISA @EXPORT @EXPORT_OK|; + + require Exporter; + require DynaLoader; + + @ISA = qw|Exporter DynaLoader|; + $VERSION = '0.2601'; + + @EXPORT = qw( + NULL + WIN31_CLASS + OWNER_SECURITY_INFORMATION + GROUP_SECURITY_INFORMATION + DACL_SECURITY_INFORMATION + SACL_SECURITY_INFORMATION + MB_ICONHAND + MB_ICONQUESTION + MB_ICONEXCLAMATION + MB_ICONASTERISK + MB_ICONWARNING + MB_ICONERROR + MB_ICONINFORMATION + MB_ICONSTOP + ); + @EXPORT_OK = qw( + GetOSName + SW_HIDE + SW_SHOWNORMAL + SW_SHOWMINIMIZED + SW_SHOWMAXIMIZED + SW_SHOWNOACTIVATE + + CSIDL_DESKTOP + CSIDL_PROGRAMS + CSIDL_PERSONAL + CSIDL_FAVORITES + CSIDL_STARTUP + CSIDL_RECENT + CSIDL_SENDTO + CSIDL_STARTMENU + CSIDL_MYMUSIC + CSIDL_MYVIDEO + CSIDL_DESKTOPDIRECTORY + CSIDL_NETHOOD + CSIDL_FONTS + CSIDL_TEMPLATES + CSIDL_COMMON_STARTMENU + CSIDL_COMMON_PROGRAMS + CSIDL_COMMON_STARTUP + CSIDL_COMMON_DESKTOPDIRECTORY + CSIDL_APPDATA + CSIDL_PRINTHOOD + CSIDL_LOCAL_APPDATA + CSIDL_COMMON_FAVORITES + CSIDL_INTERNET_CACHE + CSIDL_COOKIES + CSIDL_HISTORY + CSIDL_COMMON_APPDATA + CSIDL_WINDOWS + CSIDL_SYSTEM + CSIDL_PROGRAM_FILES + CSIDL_MYPICTURES + CSIDL_PROFILE + CSIDL_PROGRAM_FILES_COMMON + CSIDL_COMMON_TEMPLATES + CSIDL_COMMON_DOCUMENTS + CSIDL_COMMON_ADMINTOOLS + CSIDL_ADMINTOOLS + CSIDL_COMMON_MUSIC + CSIDL_COMMON_PICTURES + CSIDL_COMMON_VIDEO + CSIDL_RESOURCES + CSIDL_RESOURCES_LOCALIZED + CSIDL_CDBURN_AREA + ); +} + +# Routines available in core: +# Win32::GetLastError +# Win32::LoginName +# Win32::NodeName +# Win32::DomainName +# Win32::FsType +# Win32::GetCwd +# Win32::GetOSVersion +# Win32::FormatMessage ERRORCODE +# Win32::Spawn COMMAND, ARGS, PID +# Win32::GetTickCount +# Win32::IsWinNT +# Win32::IsWin95 + +# We won't bother with the constant stuff, too much of a hassle. Just hard +# code it here. + +sub NULL { 0 } +sub WIN31_CLASS { &NULL } + +sub OWNER_SECURITY_INFORMATION { 0x00000001 } +sub GROUP_SECURITY_INFORMATION { 0x00000002 } +sub DACL_SECURITY_INFORMATION { 0x00000004 } +sub SACL_SECURITY_INFORMATION { 0x00000008 } + +sub MB_ICONHAND { 0x00000010 } +sub MB_ICONQUESTION { 0x00000020 } +sub MB_ICONEXCLAMATION { 0x00000030 } +sub MB_ICONASTERISK { 0x00000040 } +sub MB_ICONWARNING { 0x00000030 } +sub MB_ICONERROR { 0x00000010 } +sub MB_ICONINFORMATION { 0x00000040 } +sub MB_ICONSTOP { 0x00000010 } + +# +# Newly added constants. These have an empty prototype, unlike the +# the ones above, which aren't prototyped for compatibility reasons. +# +sub SW_HIDE () { 0 } +sub SW_SHOWNORMAL () { 1 } +sub SW_SHOWMINIMIZED () { 2 } +sub SW_SHOWMAXIMIZED () { 3 } +sub SW_SHOWNOACTIVATE () { 4 } + +sub CSIDL_DESKTOP () { 0x0000 } # <desktop> +sub CSIDL_PROGRAMS () { 0x0002 } # Start Menu\Programs +sub CSIDL_PERSONAL () { 0x0005 } # "My Documents" folder +sub CSIDL_FAVORITES () { 0x0006 } # <user name>\Favorites +sub CSIDL_STARTUP () { 0x0007 } # Start Menu\Programs\Startup +sub CSIDL_RECENT () { 0x0008 } # <user name>\Recent +sub CSIDL_SENDTO () { 0x0009 } # <user name>\SendTo +sub CSIDL_STARTMENU () { 0x000B } # <user name>\Start Menu +sub CSIDL_MYMUSIC () { 0x000D } # "My Music" folder +sub CSIDL_MYVIDEO () { 0x000E } # "My Videos" folder +sub CSIDL_DESKTOPDIRECTORY () { 0x0010 } # <user name>\Desktop +sub CSIDL_NETHOOD () { 0x0013 } # <user name>\nethood +sub CSIDL_FONTS () { 0x0014 } # windows\fonts +sub CSIDL_TEMPLATES () { 0x0015 } +sub CSIDL_COMMON_STARTMENU () { 0x0016 } # All Users\Start Menu +sub CSIDL_COMMON_PROGRAMS () { 0x0017 } # All Users\Start Menu\Programs +sub CSIDL_COMMON_STARTUP () { 0x0018 } # All Users\Startup +sub CSIDL_COMMON_DESKTOPDIRECTORY () { 0x0019 } # All Users\Desktop +sub CSIDL_APPDATA () { 0x001A } # Application Data, new for NT4 +sub CSIDL_PRINTHOOD () { 0x001B } # <user name>\PrintHood +sub CSIDL_LOCAL_APPDATA () { 0x001C } # non roaming, user\Local Settings\Application Data +sub CSIDL_COMMON_FAVORITES () { 0x001F } +sub CSIDL_INTERNET_CACHE () { 0x0020 } +sub CSIDL_COOKIES () { 0x0021 } +sub CSIDL_HISTORY () { 0x0022 } +sub CSIDL_COMMON_APPDATA () { 0x0023 } # All Users\Application Data +sub CSIDL_WINDOWS () { 0x0024 } # GetWindowsDirectory() +sub CSIDL_SYSTEM () { 0x0025 } # GetSystemDirectory() +sub CSIDL_PROGRAM_FILES () { 0x0026 } # C:\Program Files +sub CSIDL_MYPICTURES () { 0x0027 } # "My Pictures", new for Win2K +sub CSIDL_PROFILE () { 0x0028 } # USERPROFILE +sub CSIDL_PROGRAM_FILES_COMMON () { 0x002B } # C:\Program Files\Common +sub CSIDL_COMMON_TEMPLATES () { 0x002D } # All Users\Templates +sub CSIDL_COMMON_DOCUMENTS () { 0x002E } # All Users\Documents +sub CSIDL_COMMON_ADMINTOOLS () { 0x002F } # All Users\Start Menu\Programs\Administrative Tools +sub CSIDL_ADMINTOOLS () { 0x0030 } # <user name>\Start Menu\Programs\Administrative Tools +sub CSIDL_COMMON_MUSIC () { 0x0035 } # All Users\My Music +sub CSIDL_COMMON_PICTURES () { 0x0036 } # All Users\My Pictures +sub CSIDL_COMMON_VIDEO () { 0x0037 } # All Users\My Video +sub CSIDL_RESOURCES () { 0x0038 } # %windir%\Resources\, For theme and other windows resources. +sub CSIDL_RESOURCES_LOCALIZED () { 0x0039 } # %windir%\Resources\<LangID>, for theme and other windows specific resources. +sub CSIDL_CDBURN_AREA () { 0x003B } # <user name>\Local Settings\Application Data\Microsoft\CD Burning + +### This method is just a simple interface into GetOSVersion(). More +### specific or demanding situations should use that instead. + +my ($found_os, $found_desc); + +sub GetOSName { + my ($os,$desc,$major, $minor, $build, $id)=("",""); + unless (defined $found_os) { + # If we have a run this already, we have the results cached + # If so, return them + + # Use the standard API call to determine the version + ($desc, $major, $minor, $build, $id) = Win32::GetOSVersion(); + + # If id==0 then its a win32s box -- Meaning Win3.11 + unless($id) { + $os = 'Win32s'; + } + else { + # Magic numbers from MSDN documentation of OSVERSIONINFO + # Most version names can be parsed from just the id and minor + # version + $os = { + 1 => { + 0 => "95", + 10 => "98", + 90 => "Me" + }, + 2 => { + 0 => "NT4", + 1 => "XP/.Net", + 2 => "2003", + 51 => "NT3.51" + } + }->{$id}->{$minor}; + } + + # This _really_ shouldnt happen. At least not for quite a while + # Politely warn and return undef + unless (defined $os) { + warn qq[Windows version [$id:$major:$minor] unknown!]; + return undef; + } + + my $tag = ""; + + # But distinguising W2k and Vista from NT4 requires looking at the major version + if ($os eq "NT4") { + $os = {5 => "2000", 6 => "Vista"}->{$major} || "NT4"; + } + + # For the rest we take a look at the build numbers and try to deduce + # the exact release name, but we put that in the $desc + elsif ($os eq "95") { + if ($build eq '67109814') { + $tag = '(a)'; + } + elsif ($build eq '67306684') { + $tag = '(b1)'; + } + elsif ($build eq '67109975') { + $tag = '(b2)'; + } + } + elsif ($os eq "98" && $build eq '67766446') { + $tag = '(2nd ed)'; + } + + if (length $tag) { + if (length $desc) { + $desc = "$tag $desc"; + } + else { + $desc = $tag; + } + } + + # cache the results, so we dont have to do this again + $found_os = "Win$os"; + $found_desc = $desc; + } + + return wantarray ? ($found_os, $found_desc) : $found_os; +} + +bootstrap Win32; + +1; + +__END__ + +=head1 NAME + +Win32 - Interfaces to some Win32 API Functions + +=head1 DESCRIPTION + +Perl on Win32 contains several functions to access Win32 APIs. Some +are included in Perl itself (on Win32) and some are only available +after explicitly requesting the Win32 module with: + + use Win32; + +The builtin functions are marked as [CORE] and the other ones +as [EXT] in the following alphabetical listing. + +=head2 Alphabetical Listing of Win32 Functions + +=over + +=item Win32::AbortSystemShutdown(MACHINE) + +[EXT] Aborts a system shutdown (started by the +InitiateSystemShutdown function) on the specified MACHINE. + +=item Win32::BuildNumber() + +[CORE] Returns the ActivePerl build number. This function is +only available in the ActivePerl binary distribution. + +=item Win32::CopyFile(FROM, TO, OVERWRITE) + +[CORE] The Win32::CopyFile() function copies an existing file to a new +file. All file information like creation time and file attributes will +be copied to the new file. However it will B<not> copy the security +information. If the destination file already exists it will only be +overwritten when the OVERWRITE parameter is true. But even this will +not overwrite a read-only file; you have to unlink() it first +yourself. + +=item Win32::DomainName() + +[CORE] Returns the name of the Microsoft Network domain that the +owner of the current perl process is logged into. This function does +B<not> work on Windows 9x. + +=item Win32::ExpandEnvironmentStrings(STRING) + +[EXT] Takes STRING and replaces all referenced environment variable +names with their defined values. References to environment variables +take the form C<%VariableName%>. Case is ignored when looking up the +VariableName in the environment. If the variable is not found then the +original C<%VariableName%> text is retained. Has the same effect +as the following: + + $string =~ s/%([^%]*)%/$ENV{$1} || "%$1%"/eg + +=item Win32::FormatMessage(ERRORCODE) + +[CORE] Converts the supplied Win32 error number (e.g. returned by +Win32::GetLastError()) to a descriptive string. Analogous to the +perror() standard-C library function. Note that C<$^E> used +in a string context has much the same effect. + + C:\> perl -e "$^E = 26; print $^E;" + The specified disk or diskette cannot be accessed + +=item Win32::FsType() + +[CORE] Returns the name of the filesystem of the currently active +drive (like 'FAT' or 'NTFS'). In list context it returns three values: +(FSTYPE, FLAGS, MAXCOMPLEN). FSTYPE is the filesystem type as +before. FLAGS is a combination of values of the following table: + + 0x00000001 supports case-sensitive filenames + 0x00000002 preserves the case of filenames + 0x00000004 supports Unicode in filenames + 0x00000008 preserves and enforces ACLs + 0x00000010 supports file-based compression + 0x00000020 supports disk quotas + 0x00000040 supports sparse files + 0x00000080 supports reparse points + 0x00000100 supports remote storage + 0x00008000 is a compressed volume (e.g. DoubleSpace) + 0x00010000 supports object identifiers + 0x00020000 supports the Encrypted File System (EFS) + +MAXCOMPLEN is the maximum length of a filename component (the part +between two backslashes) on this file system. + +=item Win32::FreeLibrary(HANDLE) + +[EXT] Unloads a previously loaded dynamic-link library. The HANDLE is +no longer valid after this call. See L<LoadLibrary|Win32::LoadLibrary(LIBNAME)> +for information on dynamically loading a library. + +=item Win32::GetArchName() + +[EXT] Use of this function is deprecated. It is equivalent with +$ENV{PROCESSOR_ARCHITECTURE}. This might not work on Win9X. + +=item Win32::GetChipName() + +[EXT] Returns the processor type: 386, 486 or 586 for Intel processors, +21064 for the Alpha chip. + +=item Win32::GetCwd() + +[CORE] Returns the current active drive and directory. This function +does not return a UNC path, since the functionality required for such +a feature is not available under Windows 95. + +=item Win32::GetFileVersion(FILENAME) + +[EXT] Returns the file version number from the VERSIONINFO resource of +the executable file or DLL. This is a tuple of four 16 bit numbers. +In list context these four numbers will be returned. In scalar context +they are concatenated into a string, separated by dots. + +=item Win32::GetFolderPath(FOLDER [, CREATE]) + +[EXT] Returns the full pathname of one of the Windows special folders. +The folder will be created if it doesn't exist and the optional CREATE +argument is true. The following FOLDER constants are defined by the +Win32 module, but only exported on demand: + + CSIDL_ADMINTOOLS + CSIDL_APPDATA + CSIDL_CDBURN_AREA + CSIDL_COMMON_ADMINTOOLS + CSIDL_COMMON_APPDATA + CSIDL_COMMON_DESKTOPDIRECTORY + CSIDL_COMMON_DOCUMENTS + CSIDL_COMMON_FAVORITES + CSIDL_COMMON_MUSIC + CSIDL_COMMON_PICTURES + CSIDL_COMMON_PROGRAMS + CSIDL_COMMON_STARTMENU + CSIDL_COMMON_STARTUP + CSIDL_COMMON_TEMPLATES + CSIDL_COMMON_VIDEO + CSIDL_COOKIES + CSIDL_DESKTOP + CSIDL_DESKTOPDIRECTORY + CSIDL_FAVORITES + CSIDL_FONTS + CSIDL_HISTORY + CSIDL_INTERNET_CACHE + CSIDL_LOCAL_APPDATA + CSIDL_MYMUSIC + CSIDL_MYPICTURES + CSIDL_MYVIDEO + CSIDL_NETHOOD + CSIDL_PERSONAL + CSIDL_PRINTHOOD + CSIDL_PROFILE + CSIDL_PROGRAMS + CSIDL_PROGRAM_FILES + CSIDL_PROGRAM_FILES_COMMON + CSIDL_RECENT + CSIDL_RESOURCES + CSIDL_RESOURCES_LOCALIZED + CSIDL_SENDTO + CSIDL_STARTMENU + CSIDL_STARTUP + CSIDL_SYSTEM + CSIDL_TEMPLATES + CSIDL_WINDOWS + +Note that not all folders are defined on all versions of Windows. + +Please refer to the MSDN documentation of the CSIDL constants, +currently available at: + +http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/enums/csidl.asp + +=item Win32::GetFullPathName(FILENAME) + +[CORE] GetFullPathName combines the FILENAME with the current drive +and directory name and returns a fully qualified (aka, absolute) +path name. In list context it returns two elements: (PATH, FILE) where +PATH is the complete pathname component (including trailing backslash) +and FILE is just the filename part. Note that no attempt is made to +convert 8.3 components in the supplied FILENAME to longnames or +vice-versa. Compare with Win32::GetShortPathName and +Win32::GetLongPathName. + +=item Win32::GetLastError() + +[CORE] Returns the last error value generated by a call to a Win32 API +function. Note that C<$^E> used in a numeric context amounts to the +same value. + +=item Win32::GetLongPathName(PATHNAME) + +[CORE] Returns a representation of PATHNAME composed of longname +components (if any). The result may not necessarily be longer +than PATHNAME. No attempt is made to convert PATHNAME to the +absolute path. Compare with Win32::GetShortPathName and +Win32::GetFullPathName. + +=item Win32::GetNextAvailDrive() + +[CORE] Returns a string in the form of "<d>:" where <d> is the first +available drive letter. + +=item Win32::GetOSVersion() + +[CORE] Returns the list (STRING, MAJOR, MINOR, BUILD, ID), where the +elements are, respectively: An arbitrary descriptive string, the major +version number of the operating system, the minor version number, the +build number, and a digit indicating the actual operating system. +For the ID, the values are 0 for Win32s, 1 for Windows 9X/Me and 2 for +Windows NT/2000/XP/2003. In scalar context it returns just the ID. + +Currently known values for ID MAJOR and MINOR are as follows: + + OS ID MAJOR MINOR + Win32s 0 - - + Windows 95 1 4 0 + Windows 98 1 4 10 + Windows Me 1 4 90 + Windows NT 3.51 2 3 51 + Windows NT 4 2 4 0 + Windows 2000 2 5 0 + Windows XP 2 5 1 + Windows Server 2003 2 5 2 + Windows Vista 2 6 0 + +On Windows NT 4 SP6 and later this function returns the following +additional values: SPMAJOR, SPMINOR, SUITEMASK, PRODUCTTYPE. + +SPMAJOR and SPMINOR are are the version numbers of the latest +installed service pack. + +SUITEMASK is a bitfield identifying the product suites available on +the system. Known bits are: + + VER_SUITE_SMALLBUSINESS 0x00000001 + VER_SUITE_ENTERPRISE 0x00000002 + VER_SUITE_BACKOFFICE 0x00000004 + VER_SUITE_COMMUNICATIONS 0x00000008 + VER_SUITE_TERMINAL 0x00000010 + VER_SUITE_SMALLBUSINESS_RESTRICTED 0x00000020 + VER_SUITE_EMBEDDEDNT 0x00000040 + VER_SUITE_DATACENTER 0x00000080 + VER_SUITE_SINGLEUSERTS 0x00000100 + VER_SUITE_PERSONAL 0x00000200 + VER_SUITE_BLADE 0x00000400 + VER_SUITE_EMBEDDED_RESTRICTED 0x00000800 + VER_SUITE_SECURITY_APPLIANCE 0x00001000 + +The VER_SUITE_xxx names are listed here to crossreference the Microsoft +documentation. The Win32 module does not provide symbolic names for these +constants. + +PRODUCTTYPE provides additional information about the system. It should +be one of the following integer values: + + 1 - Workstation (NT 4, 2000 Pro, XP Home, XP Pro) + 2 - Domaincontroller + 3 - Server + +=item Win32::GetOSName() + +[EXT] In scalar context returns the name of the Win32 operating system +being used. In list context returns a two element list of the OS name +and whatever edition information is known about the particular build +(for Win9X boxes) and whatever service packs have been installed. +The latter is roughly equivalent to the first item returned by +GetOSVersion() in list context. + +Currently the possible values for the OS name are + + Win32s Win95 Win98 WinMe WinNT3.51 WinNT4 Win2000 WinXP/.Net Win2003 + +This routine is just a simple interface into GetOSVersion(). More +specific or demanding situations should use that instead. Another +option would be to use POSIX::uname(), however the latter appears to +report only the OS family name and not the specific OS. In scalar +context it returns just the ID. + +The name "WinXP/.Net" is used for historical reasons only, to maintain +backwards compatibility of the Win32 module. Windows .NET Server has +been renamed as Windows 2003 Server before final release and uses a +different major/minor version number than Windows XP. + +=item Win32::GetShortPathName(PATHNAME) + +[CORE] Returns a representation of PATHNAME that is composed of short +(8.3) path components where available. For path components where the +file system has not generated the short form the returned path will +use the long form, so this function might still for instance return a +path containing spaces. Compare with Win32::GetFullPathName and +Win32::GetLongPathName. + +=item Win32::GetProcAddress(INSTANCE, PROCNAME) + +[EXT] Returns the address of a function inside a loaded library. The +information about what you can do with this address has been lost in +the mist of time. Use the Win32::API module instead of this deprecated +function. + +=item Win32::GetTickCount() + +[CORE] Returns the number of milliseconds elapsed since the last +system boot. Resolution is limited to system timer ticks (about 10ms +on WinNT and 55ms on Win9X). + +=item Win32::GuidGen() + +[EXT] Creates a globally unique 128 bit integer that can be used as a +persistent identifier in a distributed setting. To a very high degree +of certainty this function returns a unique value. No other +invocation, on the same or any other system (networked or not), should +return the same value. + +The return value is formatted according to OLE conventions, as groups +of hex digits with surrounding braces. For example: + + {09531CF1-D0C7-4860-840C-1C8C8735E2AD} + +=item Win32::InitiateSystemShutdown + +(MACHINE, MESSAGE, TIMEOUT, FORCECLOSE, REBOOT) + +[EXT] Shutsdown the specified MACHINE, notifying users with the +supplied MESSAGE, within the specified TIMEOUT interval. Forces +closing of all documents without prompting the user if FORCECLOSE is +true, and reboots the machine if REBOOT is true. This function works +only on WinNT. + +=item Win32::IsAdminUser() + +[EXT] Returns non zero if the account in whose security context the +current process/thread is running belongs to the local group of +Administrators in the built-in system domain; returns 0 if not. +Returns the undefined value and prints a warning if an error occurred. +This function always returns 1 on Win9X. + +=item Win32::IsWinNT() + +[CORE] Returns non zero if the Win32 subsystem is Windows NT. + +=item Win32::IsWin95() + +[CORE] Returns non zero if the Win32 subsystem is Windows 95. + +=item Win32::LoadLibrary(LIBNAME) + +[EXT] Loads a dynamic link library into memory and returns its module +handle. This handle can be used with Win32::GetProcAddress and +Win32::FreeLibrary. This function is deprecated. Use the Win32::API +module instead. + +=item Win32::LoginName() + +[CORE] Returns the username of the owner of the current perl process. + +=item Win32::LookupAccountName(SYSTEM, ACCOUNT, DOMAIN, SID, SIDTYPE) + +[EXT] Looks up ACCOUNT on SYSTEM and returns the domain name the SID and +the SID type. + +=item Win32::LookupAccountSID(SYSTEM, SID, ACCOUNT, DOMAIN, SIDTYPE) + +[EXT] Looks up SID on SYSTEM and returns the account name, domain name, +and the SID type. + +=item Win32::MsgBox(MESSAGE [, FLAGS [, TITLE]]) + +[EXT] Create a dialogbox containing MESSAGE. FLAGS specifies the +required icon and buttons according to the following table: + + 0 = OK + 1 = OK and Cancel + 2 = Abort, Retry, and Ignore + 3 = Yes, No and Cancel + 4 = Yes and No + 5 = Retry and Cancel + + MB_ICONSTOP "X" in a red circle + MB_ICONQUESTION question mark in a bubble + MB_ICONEXCLAMATION exclamation mark in a yellow triangle + MB_ICONINFORMATION "i" in a bubble + +TITLE specifies an optional window title. The default is "Perl". + +The function returns the menu id of the selected push button: + + 0 Error + + 1 OK + 2 Cancel + 3 Abort + 4 Retry + 5 Ignore + 6 Yes + 7 No + +=item Win32::NodeName() + +[CORE] Returns the Microsoft Network node-name of the current machine. + +=item Win32::RegisterServer(LIBRARYNAME) + +[EXT] Loads the DLL LIBRARYNAME and calls the function DllRegisterServer. + +=item Win32::SetChildShowWindow(SHOWWINDOW) + +[CORE] Sets the I<ShowMode> of child processes started by system(). +By default system() will create a new console window for child +processes if Perl itself is not running from a console. Calling +SetChildShowWindow(0) will make these new console windows invisible. +Calling SetChildShowWindow() without arguments reverts system() to the +default behavior. The return value of SetChildShowWindow() is the +previous setting or C<undef>. + +[EXT] The following symbolic constants for SHOWWINDOW are available +(but not exported) from the Win32 module: SW_HIDE, SW_SHOWNORMAL, +SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED and SW_SHOWNOACTIVATE. + +=item Win32::SetCwd(NEWDIRECTORY) + +[CORE] Sets the current active drive and directory. This function does not +work with UNC paths, since the functionality required to required for +such a feature is not available under Windows 95. + +=item Win32::SetLastError(ERROR) + +[CORE] Sets the value of the last error encountered to ERROR. This is +that value that will be returned by the Win32::GetLastError() +function. + +=item Win32::Sleep(TIME) + +[CORE] Pauses for TIME milliseconds. The timeslices are made available +to other processes and threads. + +=item Win32::Spawn(COMMAND, ARGS, PID) + +[CORE] Spawns a new process using the supplied COMMAND, passing in +arguments in the string ARGS. The pid of the new process is stored in +PID. This function is deprecated. Please use the Win32::Process module +instead. + +=item Win32::UnregisterServer(LIBRARYNAME) + +[EXT] Loads the DLL LIBRARYNAME and calls the function +DllUnregisterServer. + +=back + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Win32/API.pm b/Master/tlpkg/tlperl.old/lib/Win32/API.pm new file mode 100644 index 00000000000..e1bac5cda48 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/API.pm @@ -0,0 +1,745 @@ +package Win32::API; + +# See the bottom of this file for the POD documentation. Search for the +# string '=head'. + +####################################################################### +# +# Win32::API - Perl Win32 API Import Facility +# +# Version: 0.47 +# Date: 12 Nov 2007 +# Author: Aldo Calpini <dada@perl.it> +# Maintainer: Cosimo Streppone <cosimo@cpan.org> +# +# Changes for gcc/cygwin: Daniel Risacher <magnus@alum.mit.edu> +# ported from 0.41 based on Daniel's patch by Reini Urban <rurban@x-ray.at> +# +# $Id: API.pm,v 1.0 2001/10/30 13:57:31 dada Exp $ +# +####################################################################### + +require Exporter; # to export the constants to the main:: space +require DynaLoader; # to dynuhlode the module. +@ISA = qw( Exporter DynaLoader ); + +use vars qw( $DEBUG ); +$DEBUG = 0; + +sub DEBUG { + if ($Win32::API::DEBUG) { + printf @_ if @_ or return 1; + } else { + return 0; + } +} + +use Win32::API::Type; +use Win32::API::Struct; +BEGIN { + if ($^O eq 'cygwin') { + require File::Basename; + } +} + +####################################################################### +# STATIC OBJECT PROPERTIES +# +$VERSION = '0.47'; + +#### some package-global hash to +#### keep track of the imported +#### libraries and procedures +my %Libraries = (); +my %Procedures = (); + + +####################################################################### +# dynamically load in the API extension module. +# +bootstrap Win32::API; + +####################################################################### +# PUBLIC METHODS +# +sub new { + my($class, $dll, $proc, $in, $out) = @_; + my $hdll; + my $self = {}; + + if ($^O eq 'cygwin' and $dll ne File::Basename::basename($dll)) { + # need to convert $dll to win32 path + # isn't there an API for this? + my $newdll = `cygpath -w "$dll"`; + chomp $newdll; + DEBUG "(PM)new: converted '$dll' to\n '$newdll'\n"; + $dll = $newdll; + } + + #### avoid loading a library more than once + if(exists($Libraries{$dll})) { + DEBUG "Win32::API::new: Library '$dll' already loaded, handle=$Libraries{$dll}\n"; + $hdll = $Libraries{$dll}; + } else { + DEBUG "Win32::API::new: Loading library '$dll'\n"; + $hdll = Win32::API::LoadLibrary($dll); +# $Libraries{$dll} = $hdll; + } + + #### if the dll can't be loaded, set $! to Win32's GetLastError() + if(!$hdll) { + $! = Win32::GetLastError(); + DEBUG "FAILED Loading library '$dll': $!\n"; + delete $Libraries{$dll}; + return undef; + } + + #### determine if we have a prototype or not + if( (not defined $in) and (not defined $out) ) { + ($proc, $self->{in}, $self->{intypes}, $self->{out}) = parse_prototype( $proc ); + return undef unless $proc; + $self->{proto} = 1; + } else { + $self->{in} = []; + if(ref($in) eq 'ARRAY') { + foreach (@$in) { + push(@{ $self->{in} }, type_to_num($_)); + } + } else { + my @in = split '', $in; + foreach (@in) { + push(@{ $self->{in} }, type_to_num($_)); + } + } + $self->{out} = type_to_num($out); + } + + #### first try to import the function of given name... + my $hproc = Win32::API::GetProcAddress($hdll, $proc); + + #### ...then try appending either A or W (for ASCII or Unicode) + if(!$hproc) { + my $tproc = $proc; + $tproc .= (IsUnicode() ? "W" : "A"); + # print "Win32::API::new: procedure not found, trying '$tproc'...\n"; + $hproc = Win32::API::GetProcAddress($hdll, $tproc); + } + + #### ...if all that fails, set $! accordingly + if(!$hproc) { + $! = Win32::GetLastError(); + DEBUG "FAILED GetProcAddress for Proc '$proc': $!\n"; + return undef; + } + DEBUG "GetProcAddress('$proc') = '$hproc'\n"; + + #### ok, let's stuff the object + $self->{procname} = $proc; + $self->{dll} = $hdll; + $self->{dllname} = $dll; + $self->{proc} = $hproc; + + #### keep track of the imported function + $Libraries{$dll} = $hdll; + $Procedures{$dll}++; + + DEBUG "Object blessed!\n"; + + #### cast the spell + bless($self, $class); + return $self; +} + +sub Import { + my($class, $dll, $proc, $in, $out) = @_; + $Imported{"$dll:$proc"} = Win32::API->new($dll, $proc, $in, $out) or return 0; + my $P = (caller)[0]; + eval qq( + sub ${P}::$Imported{"$dll:$proc"}->{procname} { \$Win32::API::Imported{"$dll:$proc"}->Call(\@_); } + ); + return $@ ? 0 : 1; +} + + +####################################################################### +# PRIVATE METHODS +# +sub DESTROY { + my($self) = @_; + + #### decrease this library's procedures reference count + $Procedures{$self->{dllname}}--; + + #### once it reaches 0, free it + if($Procedures{$self->{dllname}} == 0) { + DEBUG "Win32::API::DESTROY: Freeing library '$self->{dllname}'\n"; + Win32::API::FreeLibrary($Libraries{$self->{dllname}}); + delete($Libraries{$self->{dllname}}); + } +} + +sub type_to_num { + my $type = shift; + my $out = shift; + my $num; + + if( $type eq 'N' + or $type eq 'n' + or $type eq 'l' + or $type eq 'L' + ) { + $num = 1; + } elsif($type eq 'P' + or $type eq 'p' + ) { + $num = 2; + } elsif($type eq 'I' + or $type eq 'i' + ) { + $num = 3; + } elsif($type eq 'f' + or $type eq 'F' + ) { + $num = 4; + } elsif($type eq 'D' + or $type eq 'd' + ) { + $num = 5; + } elsif($type eq 'c' + or $type eq 'C' + ) { + $num = 6; + } else { + $num = 0; + } + unless(defined $out) { + if( $type eq 's' + or $type eq 'S' + ) { + $num = 51; + } elsif($type eq 'b' + or $type eq 'B' + ) { + $num = 22; + } elsif($type eq 'k' + or $type eq 'K' + ) { + $num = 101; + } + } + return $num; +} + +sub parse_prototype { + my($proto) = @_; + + my @in_params = (); + my @in_types = (); + if($proto =~ /^\s*(\S+)\s+(\S+)\s*\(([^\)]*)\)/) { + my $ret = $1; + my $proc = $2; + my $params = $3; + + $params =~ s/^\s+//; + $params =~ s/\s+$//; + + DEBUG "(PM)parse_prototype: got PROC '%s'\n", $proc; + DEBUG "(PM)parse_prototype: got PARAMS '%s'\n", $params; + + foreach my $param (split(/\s*,\s*/, $params)) { + my($type, $name); + if($param =~ /(\S+)\s+(\S+)/) { + ($type, $name) = ($1, $2); + } + + if(Win32::API::Type::is_known($type)) { + if(Win32::API::Type::is_pointer($type)) { + DEBUG "(PM)parse_prototype: IN='%s' PACKING='%s' API_TYPE=%d\n", + $type, + Win32::API::Type->packing( $type ), + type_to_num('P'); + push(@in_params, type_to_num('P')); + } else { + DEBUG "(PM)parse_prototype: IN='%s' PACKING='%s' API_TYPE=%d\n", + $type, + Win32::API::Type->packing( $type ), + type_to_num( Win32::API::Type->packing( $type ) ); + push(@in_params, type_to_num( Win32::API::Type->packing( $type ) )); + } + } elsif( Win32::API::Struct::is_known( $type ) ) { + DEBUG "(PM)parse_prototype: IN='%s' PACKING='%s' API_TYPE=%d\n", + $type, 'S', type_to_num('S'); + push(@in_params, type_to_num('S')); + } else { + warn "Win32::API::parse_prototype: WARNING unknown parameter type '$type'"; + push(@in_params, type_to_num('I')); + } + push(@in_types, $type); + + } + DEBUG "parse_prototype: IN=[ @in_params ]\n"; + + + + if(Win32::API::Type::is_known($ret)) { + if(Win32::API::Type::is_pointer($ret)) { + DEBUG "parse_prototype: OUT='%s' PACKING='%s' API_TYPE=%d\n", + $ret, + Win32::API::Type->packing( $ret ), + type_to_num('P'); + return ( $proc, \@in_params, \@in_types, type_to_num('P') ); + } else { + DEBUG "parse_prototype: OUT='%s' PACKING='%s' API_TYPE=%d\n", + $ret, + Win32::API::Type->packing( $ret ), + type_to_num( Win32::API::Type->packing( $ret ) ); + return ( $proc, \@in_params, \@in_types, type_to_num(Win32::API::Type->packing($ret)) ); + } + } else { + warn "Win32::API::parse_prototype: WARNING unknown output parameter type '$ret'"; + return ( $proc, \@in_params, \@in_types, type_to_num('I') ); + } + + } else { + warn "Win32::API::parse_prototype: bad prototype '$proto'"; + return undef; + } +} + +1; + +__END__ + +####################################################################### +# DOCUMENTATION +# + +=head1 NAME + +Win32::API - Perl Win32 API Import Facility + +=head1 SYNOPSIS + + #### Method 1: with prototype + + use Win32::API; + $function = Win32::API->new( + 'mydll, 'int sum_integers(int a, int b)', + ); + $return = $function->Call(3, 2); + + #### Method 2: with parameter list + + use Win32::API; + $function = Win32::API->new( + 'mydll', 'sum_integers', 'II', 'I', + ); + $return = $function->Call(3, 2); + + #### Method 3: with Import + + use Win32::API; + Win32::API->Import( + 'mydll', 'int sum_integers(int a, int b)', + ); + $return = sum_integers(3, 2); + + +=for LATER-UNIMPLEMENTED + #### or + use Win32::API mydll => 'int sum_integers(int a, int b)'; + $return = sum_integers(3, 2); + + +=head1 ABSTRACT + +With this module you can import and call arbitrary functions +from Win32's Dynamic Link Libraries (DLL), without having +to write an XS extension. Note, however, that this module +can't do anything (parameters input and output is limited +to simpler cases), and anyway a regular XS extension is +always safer and faster. + +The current version of Win32::API is available at my website: + + http://dada.perl.it/ + +It's also available on your nearest CPAN mirror (but allow a few days +for worldwide spreading of the latest version) reachable at: + + http://www.perl.com/CPAN/authors/Aldo_Calpini/ + +A short example of how you can use this module (it just gets the PID of +the current process, eg. same as Perl's internal C<$$>): + + use Win32::API; + Win32::API->Import("kernel32", "int GetCurrentProcessId()"); + $PID = GetCurrentProcessId(); + +The possibilities are nearly infinite (but not all are good :-). +Enjoy it. + + +=head1 CREDITS + +All the credits go to Andrea Frosini +for the neat assembler trick that makes this thing work. +I've also used some work by Dave Roth for the prototyping stuff. +A big thank you also to Gurusamy Sarathy for his +unvaluable help in XS development, and to all the Perl community for +being what it is. + + +=head1 DESCRIPTION + +To use this module put the following line at the beginning of your script: + + use Win32::API; + +You can now use the C<new()> function of the Win32::API module to create a +new Win32::API object (see L<IMPORTING A FUNCTION>) and then invoke the +C<Call()> method on this object to perform a call to the imported API +(see L<CALLING AN IMPORTED FUNCTION>). + +Starting from version 0.40, you can also avoid creating a Win32::API object +and instead automatically define a Perl sub with the same name of the API +function you're importing. The details of the API definitions are the same, +just the call is different: + + my $GetCurrentProcessId = Win32::API->new( + "kernel32", "int GetCurrentProcessId()" + ); + my $PID = $GetCurrentProcessId->Call(); + + #### vs. + + Win32::API->Import("kernel32", "int GetCurrentProcessId()"); + $PID = GetCurrentProcessId(); + +Note that C<Import> returns 1 on success and 0 on failure (in which case you +can check the content of C<$^E>). + +=head2 IMPORTING A FUNCTION + +You can import a function from a 32 bit Dynamic Link Library (DLL) file +with the C<new()> function. This will create a Perl object that contains the +reference to that function, which you can later C<Call()>. + +What you need to know is the prototype of the function you're going to import +(eg. the definition of the function expressed in C syntax). + +Starting from version 0.40, there are 2 different approaches for this step: +(the preferred) one uses the prototype directly, while the other (now deprecated) +one uses Win32::API's internal representation for parameters. + +=head2 IMPORTING A FUNCTION BY PROTOTYPE + +You need to pass 2 parameters: + +=over 4 + +=item 1. +The name of the library from which you want to import the function. + +=item 2. +The C prototype of the function. + +=back + +See L<Win32::API::Type> for a list of the known parameter types and +L<Win32::API::Struct> for information on how to define a structure. + +=head2 IMPORTING A FUNCTION WITH A PARAMETER LIST + +You need to pass 4 parameters: + +=over 4 + +=item 1. +The name of the library from which you want to import the function. + +=item 2. +The name of the function (as exported by the library). + +=item 3. +The number and types of the arguments the function expects as input. + +=item 4. +The type of the value returned by the function. + +=back + +To better explain their meaning, let's suppose that we +want to import and call the Win32 API C<GetTempPath()>. +This function is defined in C as: + + DWORD WINAPI GetTempPathA( DWORD nBufferLength, LPSTR lpBuffer ); + +This is documented in the B<Win32 SDK Reference>; you can look +for it on the Microsoft's WWW site, or in your C compiler's +documentation, if you own one. + +=over 4 + +=item B<1.> + +The first parameter is the name of the library file that +exports this function; our function resides in the F<KERNEL32.DLL> +system file. +When specifying this name as parameter, the F<.DLL> extension +is implicit, and if no path is given, the file is searched through +a couple of directories, including: + +=over 4 + +=item 1. The directory from which the application loaded. + +=item 2. The current directory. + +=item 3. The Windows system directory (eg. c:\windows\system or system32). + +=item 4. The Windows directory (eg. c:\windows). + +=item 5. The directories that are listed in the PATH environment variable. + +=back + +So, you don't have to write F<C:\windows\system\kernel32.dll>; +only F<kernel32> is enough: + + $GetTempPath = new Win32::API('kernel32', ... + +=item B<2.> + +Now for the second parameter: the name of the function. +It must be written exactly as it is exported +by the library (case is significant here). +If you are using Windows 95 or NT 4.0, you can use the B<Quick View> +command on the DLL file to see the function it exports. +Remember that you can only import functions from 32 bit DLLs: +in Quick View, the file's characteristics should report +somewhere "32 bit word machine"; as a rule of thumb, +when you see that all the exported functions are in upper case, +the DLL is a 16 bit one and you can't use it. +If their capitalization looks correct, then it's probably a 32 bit +DLL. + +Also note that many Win32 APIs are exported twice, with the addition of +a final B<A> or B<W> to their name, for - respectively - the ASCII +and the Unicode version. +When a function name is not found, Win32::API will actually append +an B<A> to the name and try again; if the extension is built on a +Unicode system, then it will try with the B<W> instead. +So our function name will be: + + $GetTempPath = new Win32::API('kernel32', 'GetTempPath', ... + +In our case C<GetTempPath> is really loaded as C<GetTempPathA>. + +=item B<3.> + +The third parameter, the input parameter list, specifies how many +arguments the function wants, and their types. It can be passed as +a single string, in which each character represents one parameter, +or as a list reference. The following forms are valid: + + "abcd" + [a, b, c, d] + \@LIST + +But those are not: + + (a, b, c, d) + @LIST + +The number of characters, or elements in the list, specifies the number +of parameters, and each character or element specifies the type of an +argument; allowed types are: + +=over 4 + +=item C<I>: +value is an integer (int) + +=item C<N>: +value is a number (long) + +=item C<F>: +value is a floating point number (float) + +=item C<D>: +value is a double precision number (double) + +=item C<C>: +value is a char (char) + +=item C<P>: +value is a pointer (to a string, structure, etc...) + +=item C<S>: +value is a Win32::API::Struct object (see below) + +=item C<K>: +value is a Win32::API::Callback object (see L<Win32::API::Callback>) + +=back + +Our function needs two parameters: a number (C<DWORD>) and a pointer to a +string (C<LPSTR>): + + $GetTempPath = new Win32::API('kernel32', 'GetTempPath', 'NP', ... + +=item B<4.> + +The fourth and final parameter is the type of the value returned by the +function. It can be one of the types seen above, plus another type named B<V> +(for C<void>), used for functions that do not return a value. +In our example the value returned by GetTempPath() is a C<DWORD>, so +our return type will be B<N>: + + $GetTempPath = new Win32::API('kernel32', 'GetTempPath', 'NP', 'N'); + +Now the line is complete, and the GetTempPath() API is ready to be used +in Perl. Before calling it, you should test that $GetTempPath is +C<defined>, otherwise either the function or the library could not be +loaded; in this case, C<$!> will be set to the error message reported +by Windows. +Our definition, with error checking added, should then look like this: + + $GetTempPath = new Win32::API('kernel32', 'GetTempPath', 'NP', 'N'); + if(not defined $GetTempPath) { + die "Can't import API GetTempPath: $!\n"; + } + +=back + +=head2 CALLING AN IMPORTED FUNCTION + +To effectively make a call to an imported function you must use the +Call() method on the Win32::API object you created. +Continuing with the example from the previous paragraph, +the GetTempPath() API can be called using the method: + + $GetTempPath->Call(... + +Of course, parameters have to be passed as defined in the import phase. +In particular, if the number of parameters does not match (in the example, +if GetTempPath() is called with more or less than two parameters), +Perl will C<croak> an error message and C<die>. + +The two parameters needed here are the length of the buffer +that will hold the returned temporary path, and a pointer to the +buffer itself. +For numerical parameters, you can use either a constant expression +or a variable, while B<for pointers you must use a variable name> (no +Perl references, just a plain variable name). +Also note that B<memory must be allocated before calling the function>, +just like in C. +For example, to pass a buffer of 80 characters to GetTempPath(), +it must be initialized before with: + + $lpBuffer = " " x 80; + +This allocates a string of 80 characters. If you don't do so, you'll +probably get C<Runtime exception> errors, and generally nothing will +work. The call should therefore include: + + $lpBuffer = " " x 80; + $GetTempPath->Call(80, $lpBuffer); + +And the result will be stored in the $lpBuffer variable. +Note that you don't need to pass a reference to the variable +(eg. you B<don't need> C<\$lpBuffer>), even if its value will be set +by the function. + +A little problem here is that Perl does not trim the variable, +so $lpBuffer will still contain 80 characters in return; the exceeding +characters will be spaces, because we said C<" " x 80>. + +In this case we're lucky enough, because the value returned by +the GetTempPath() function is the length of the string, so to get +the actual temporary path we can write: + + $lpBuffer = " " x 80; + $return = $GetTempPath->Call(80, $lpBuffer); + $TempPath = substr($lpBuffer, 0, $return); + +If you don't know the length of the string, you can usually +cut it at the C<\0> (ASCII zero) character, which is the string +delimiter in C: + + $TempPath = ((split(/\0/, $lpBuffer))[0]; + # or + $lpBuffer =~ s/\0.*$//; + +=head2 USING STRUCTURES + +Starting from version 0.40, Win32::API comes with a support package +named Win32::API::Struct. The package is loaded automatically with +Win32::API, so you don't need to use it explicitly. + +With this module you can conveniently define structures and use +them as parameters to Win32::API functions. A short example follows: + + + # the 'POINT' structure is defined in C as: + # typedef struct { + # LONG x; + # LONG y; + # } POINT; + + + #### define the structure + Win32::API::Struct->typedef( POINT => qw{ + LONG x; + LONG y; + }); + + #### import an API that uses this structure + Win32::API->Import('user32', 'BOOL GetCursorPos(LPPOINT lpPoint)'); + + #### create a 'POINT' object + my $pt = Win32::API::Struct->new('POINT'); + + #### call the function passing our structure object + GetCursorPos($pt); + + #### and now, access its members + print "The cursor is at: $pt->{x}, $pt->{y}\n"; + +Note that this works only when the function wants a +B<pointer to a structure>: as you can see, our structure is named +'POINT', but the API used 'LPPOINT'. 'LP' is automatically added at +the beginning of the structure name when feeding it to a Win32::API +call. + +For more information, see also L<Win32::API::Struct>. + +If you don't want (or can't) use the Win32::API::Struct facility, +you can still use the low-level approach to use structures: + + +=over 4 + +=item 1. +you have to pack() the required elements in a variable: + + $lpPoint = pack('LL', 0, 0); # store two LONGs + +=item 2. to access the values stored in a structure, unpack() it as required: + + ($x, $y) = unpack('LL', $lpPoint); # get the actual values + +=back + +The rest is left as an exercise to the reader... + +=head1 AUTHOR + +Aldo Calpini ( I<dada@perl.it> ). + +=head1 MAINTAINER + +Cosimo Streppone ( I<cosimo@cpan.org> ) + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Win32/API.pm.orig b/Master/tlpkg/tlperl.old/lib/Win32/API.pm.orig new file mode 100644 index 00000000000..9e4accd8bf6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/API.pm.orig @@ -0,0 +1,741 @@ +package Win32::API;
+
+# See the bottom of this file for the POD documentation. Search for the
+# string '=head'.
+
+#######################################################################
+#
+# Win32::API - Perl Win32 API Import Facility
+#
+# Version: 0.47
+# Date: 12 Nov 2007
+# Author: Aldo Calpini <dada@perl.it>
+# Maintainer: Cosimo Streppone <cosimo@cpan.org>
+#
+# Changes for gcc/cygwin: Daniel Risacher <magnus@alum.mit.edu>
+# ported from 0.41 based on Daniel's patch by Reini Urban <rurban@x-ray.at>
+#
+# $Id: API.pm,v 1.0 2001/10/30 13:57:31 dada Exp $
+#
+#######################################################################
+
+require Exporter; # to export the constants to the main:: space
+require DynaLoader; # to dynuhlode the module.
+@ISA = qw( Exporter DynaLoader );
+
+use vars qw( $DEBUG );
+$DEBUG = 0;
+
+sub DEBUG {
+ if ($Win32::API::DEBUG) {
+ printf @_ if @_ or return 1;
+ } else {
+ return 0;
+ }
+}
+
+use Win32::API::Type;
+use Win32::API::Struct;
+use File::Basename ();
+
+#######################################################################
+# STATIC OBJECT PROPERTIES
+#
+$VERSION = '0.47';
+
+#### some package-global hash to
+#### keep track of the imported
+#### libraries and procedures
+my %Libraries = ();
+my %Procedures = ();
+
+
+#######################################################################
+# dynamically load in the API extension module.
+#
+bootstrap Win32::API;
+
+#######################################################################
+# PUBLIC METHODS
+#
+sub new {
+ my($class, $dll, $proc, $in, $out) = @_;
+ my $hdll;
+ my $self = {};
+
+ if ($^O eq 'cygwin' and $dll ne File::Basename::basename($dll)) {
+ # need to convert $dll to win32 path
+ # isn't there an API for this?
+ my $newdll = `cygpath -w "$dll"`;
+ chomp $newdll;
+ DEBUG "(PM)new: converted '$dll' to\n '$newdll'\n";
+ $dll = $newdll;
+ }
+
+ #### avoid loading a library more than once
+ if(exists($Libraries{$dll})) {
+ DEBUG "Win32::API::new: Library '$dll' already loaded, handle=$Libraries{$dll}\n";
+ $hdll = $Libraries{$dll};
+ } else {
+ DEBUG "Win32::API::new: Loading library '$dll'\n";
+ $hdll = Win32::API::LoadLibrary($dll);
+# $Libraries{$dll} = $hdll;
+ }
+
+ #### if the dll can't be loaded, set $! to Win32's GetLastError()
+ if(!$hdll) {
+ $! = Win32::GetLastError();
+ DEBUG "FAILED Loading library '$dll': $!\n";
+ delete $Libraries{$dll};
+ return undef;
+ }
+
+ #### determine if we have a prototype or not
+ if( (not defined $in) and (not defined $out) ) {
+ ($proc, $self->{in}, $self->{intypes}, $self->{out}) = parse_prototype( $proc );
+ return undef unless $proc;
+ $self->{proto} = 1;
+ } else {
+ $self->{in} = [];
+ if(ref($in) eq 'ARRAY') {
+ foreach (@$in) {
+ push(@{ $self->{in} }, type_to_num($_));
+ }
+ } else {
+ my @in = split '', $in;
+ foreach (@in) {
+ push(@{ $self->{in} }, type_to_num($_));
+ }
+ }
+ $self->{out} = type_to_num($out);
+ }
+
+ #### first try to import the function of given name...
+ my $hproc = Win32::API::GetProcAddress($hdll, $proc);
+
+ #### ...then try appending either A or W (for ASCII or Unicode)
+ if(!$hproc) {
+ my $tproc = $proc;
+ $tproc .= (IsUnicode() ? "W" : "A");
+ # print "Win32::API::new: procedure not found, trying '$tproc'...\n";
+ $hproc = Win32::API::GetProcAddress($hdll, $tproc);
+ }
+
+ #### ...if all that fails, set $! accordingly
+ if(!$hproc) {
+ $! = Win32::GetLastError();
+ DEBUG "FAILED GetProcAddress for Proc '$proc': $!\n";
+ return undef;
+ }
+ DEBUG "GetProcAddress('$proc') = '$hproc'\n";
+
+ #### ok, let's stuff the object
+ $self->{procname} = $proc;
+ $self->{dll} = $hdll;
+ $self->{dllname} = $dll;
+ $self->{proc} = $hproc;
+
+ #### keep track of the imported function
+ $Libraries{$dll} = $hdll;
+ $Procedures{$dll}++;
+
+ DEBUG "Object blessed!\n";
+
+ #### cast the spell
+ bless($self, $class);
+ return $self;
+}
+
+sub Import {
+ my($class, $dll, $proc, $in, $out) = @_;
+ $Imported{"$dll:$proc"} = Win32::API->new($dll, $proc, $in, $out) or return 0;
+ my $P = (caller)[0];
+ eval qq(
+ sub ${P}::$Imported{"$dll:$proc"}->{procname} { \$Win32::API::Imported{"$dll:$proc"}->Call(\@_); }
+ );
+ return $@ ? 0 : 1;
+}
+
+
+#######################################################################
+# PRIVATE METHODS
+#
+sub DESTROY {
+ my($self) = @_;
+
+ #### decrease this library's procedures reference count
+ $Procedures{$self->{dllname}}--;
+
+ #### once it reaches 0, free it
+ if($Procedures{$self->{dllname}} == 0) {
+ DEBUG "Win32::API::DESTROY: Freeing library '$self->{dllname}'\n";
+ Win32::API::FreeLibrary($Libraries{$self->{dllname}});
+ delete($Libraries{$self->{dllname}});
+ }
+}
+
+sub type_to_num {
+ my $type = shift;
+ my $out = shift;
+ my $num;
+
+ if( $type eq 'N'
+ or $type eq 'n'
+ or $type eq 'l'
+ or $type eq 'L'
+ ) {
+ $num = 1;
+ } elsif($type eq 'P'
+ or $type eq 'p'
+ ) {
+ $num = 2;
+ } elsif($type eq 'I'
+ or $type eq 'i'
+ ) {
+ $num = 3;
+ } elsif($type eq 'f'
+ or $type eq 'F'
+ ) {
+ $num = 4;
+ } elsif($type eq 'D'
+ or $type eq 'd'
+ ) {
+ $num = 5;
+ } elsif($type eq 'c'
+ or $type eq 'C'
+ ) {
+ $num = 6;
+ } else {
+ $num = 0;
+ }
+ unless(defined $out) {
+ if( $type eq 's'
+ or $type eq 'S'
+ ) {
+ $num = 51;
+ } elsif($type eq 'b'
+ or $type eq 'B'
+ ) {
+ $num = 22;
+ } elsif($type eq 'k'
+ or $type eq 'K'
+ ) {
+ $num = 101;
+ }
+ }
+ return $num;
+}
+
+sub parse_prototype {
+ my($proto) = @_;
+
+ my @in_params = ();
+ my @in_types = ();
+ if($proto =~ /^\s*(\S+)\s+(\S+)\s*\(([^\)]*)\)/) {
+ my $ret = $1;
+ my $proc = $2;
+ my $params = $3;
+
+ $params =~ s/^\s+//;
+ $params =~ s/\s+$//;
+
+ DEBUG "(PM)parse_prototype: got PROC '%s'\n", $proc;
+ DEBUG "(PM)parse_prototype: got PARAMS '%s'\n", $params;
+
+ foreach my $param (split(/\s*,\s*/, $params)) {
+ my($type, $name);
+ if($param =~ /(\S+)\s+(\S+)/) {
+ ($type, $name) = ($1, $2);
+ }
+
+ if(Win32::API::Type::is_known($type)) {
+ if(Win32::API::Type::is_pointer($type)) {
+ DEBUG "(PM)parse_prototype: IN='%s' PACKING='%s' API_TYPE=%d\n",
+ $type,
+ Win32::API::Type->packing( $type ),
+ type_to_num('P');
+ push(@in_params, type_to_num('P'));
+ } else {
+ DEBUG "(PM)parse_prototype: IN='%s' PACKING='%s' API_TYPE=%d\n",
+ $type,
+ Win32::API::Type->packing( $type ),
+ type_to_num( Win32::API::Type->packing( $type ) );
+ push(@in_params, type_to_num( Win32::API::Type->packing( $type ) ));
+ }
+ } elsif( Win32::API::Struct::is_known( $type ) ) {
+ DEBUG "(PM)parse_prototype: IN='%s' PACKING='%s' API_TYPE=%d\n",
+ $type, 'S', type_to_num('S');
+ push(@in_params, type_to_num('S'));
+ } else {
+ warn "Win32::API::parse_prototype: WARNING unknown parameter type '$type'";
+ push(@in_params, type_to_num('I'));
+ }
+ push(@in_types, $type);
+
+ }
+ DEBUG "parse_prototype: IN=[ @in_params ]\n";
+
+
+
+ if(Win32::API::Type::is_known($ret)) {
+ if(Win32::API::Type::is_pointer($ret)) {
+ DEBUG "parse_prototype: OUT='%s' PACKING='%s' API_TYPE=%d\n",
+ $ret,
+ Win32::API::Type->packing( $ret ),
+ type_to_num('P');
+ return ( $proc, \@in_params, \@in_types, type_to_num('P') );
+ } else {
+ DEBUG "parse_prototype: OUT='%s' PACKING='%s' API_TYPE=%d\n",
+ $ret,
+ Win32::API::Type->packing( $ret ),
+ type_to_num( Win32::API::Type->packing( $ret ) );
+ return ( $proc, \@in_params, \@in_types, type_to_num(Win32::API::Type->packing($ret)) );
+ }
+ } else {
+ warn "Win32::API::parse_prototype: WARNING unknown output parameter type '$ret'";
+ return ( $proc, \@in_params, \@in_types, type_to_num('I') );
+ }
+
+ } else {
+ warn "Win32::API::parse_prototype: bad prototype '$proto'";
+ return undef;
+ }
+}
+
+1;
+
+__END__
+
+#######################################################################
+# DOCUMENTATION
+#
+
+=head1 NAME
+
+Win32::API - Perl Win32 API Import Facility
+
+=head1 SYNOPSIS
+
+ #### Method 1: with prototype
+
+ use Win32::API;
+ $function = Win32::API->new(
+ 'mydll, 'int sum_integers(int a, int b)',
+ );
+ $return = $function->Call(3, 2);
+
+ #### Method 2: with parameter list
+
+ use Win32::API;
+ $function = Win32::API->new(
+ 'mydll', 'sum_integers', 'II', 'I',
+ );
+ $return = $function->Call(3, 2);
+
+ #### Method 3: with Import
+
+ use Win32::API;
+ Win32::API->Import(
+ 'mydll', 'int sum_integers(int a, int b)',
+ );
+ $return = sum_integers(3, 2);
+
+
+=for LATER-UNIMPLEMENTED
+ #### or
+ use Win32::API mydll => 'int sum_integers(int a, int b)';
+ $return = sum_integers(3, 2);
+
+
+=head1 ABSTRACT
+
+With this module you can import and call arbitrary functions
+from Win32's Dynamic Link Libraries (DLL), without having
+to write an XS extension. Note, however, that this module
+can't do anything (parameters input and output is limited
+to simpler cases), and anyway a regular XS extension is
+always safer and faster.
+
+The current version of Win32::API is available at my website:
+
+ http://dada.perl.it/
+
+It's also available on your nearest CPAN mirror (but allow a few days
+for worldwide spreading of the latest version) reachable at:
+
+ http://www.perl.com/CPAN/authors/Aldo_Calpini/
+
+A short example of how you can use this module (it just gets the PID of
+the current process, eg. same as Perl's internal C<$$>):
+
+ use Win32::API;
+ Win32::API->Import("kernel32", "int GetCurrentProcessId()");
+ $PID = GetCurrentProcessId();
+
+The possibilities are nearly infinite (but not all are good :-).
+Enjoy it.
+
+
+=head1 CREDITS
+
+All the credits go to Andrea Frosini
+for the neat assembler trick that makes this thing work.
+I've also used some work by Dave Roth for the prototyping stuff.
+A big thank you also to Gurusamy Sarathy for his
+unvaluable help in XS development, and to all the Perl community for
+being what it is.
+
+
+=head1 DESCRIPTION
+
+To use this module put the following line at the beginning of your script:
+
+ use Win32::API;
+
+You can now use the C<new()> function of the Win32::API module to create a
+new Win32::API object (see L<IMPORTING A FUNCTION>) and then invoke the
+C<Call()> method on this object to perform a call to the imported API
+(see L<CALLING AN IMPORTED FUNCTION>).
+
+Starting from version 0.40, you can also avoid creating a Win32::API object
+and instead automatically define a Perl sub with the same name of the API
+function you're importing. The details of the API definitions are the same,
+just the call is different:
+
+ my $GetCurrentProcessId = Win32::API->new(
+ "kernel32", "int GetCurrentProcessId()"
+ );
+ my $PID = $GetCurrentProcessId->Call();
+
+ #### vs.
+
+ Win32::API->Import("kernel32", "int GetCurrentProcessId()");
+ $PID = GetCurrentProcessId();
+
+Note that C<Import> returns 1 on success and 0 on failure (in which case you
+can check the content of C<$^E>).
+
+=head2 IMPORTING A FUNCTION
+
+You can import a function from a 32 bit Dynamic Link Library (DLL) file
+with the C<new()> function. This will create a Perl object that contains the
+reference to that function, which you can later C<Call()>.
+
+What you need to know is the prototype of the function you're going to import
+(eg. the definition of the function expressed in C syntax).
+
+Starting from version 0.40, there are 2 different approaches for this step:
+(the preferred) one uses the prototype directly, while the other (now deprecated)
+one uses Win32::API's internal representation for parameters.
+
+=head2 IMPORTING A FUNCTION BY PROTOTYPE
+
+You need to pass 2 parameters:
+
+=over 4
+
+=item 1.
+The name of the library from which you want to import the function.
+
+=item 2.
+The C prototype of the function.
+
+=back
+
+See L<Win32::API::Type> for a list of the known parameter types and
+L<Win32::API::Struct> for information on how to define a structure.
+
+=head2 IMPORTING A FUNCTION WITH A PARAMETER LIST
+
+You need to pass 4 parameters:
+
+=over 4
+
+=item 1.
+The name of the library from which you want to import the function.
+
+=item 2.
+The name of the function (as exported by the library).
+
+=item 3.
+The number and types of the arguments the function expects as input.
+
+=item 4.
+The type of the value returned by the function.
+
+=back
+
+To better explain their meaning, let's suppose that we
+want to import and call the Win32 API C<GetTempPath()>.
+This function is defined in C as:
+
+ DWORD WINAPI GetTempPathA( DWORD nBufferLength, LPSTR lpBuffer );
+
+This is documented in the B<Win32 SDK Reference>; you can look
+for it on the Microsoft's WWW site, or in your C compiler's
+documentation, if you own one.
+
+=over 4
+
+=item B<1.>
+
+The first parameter is the name of the library file that
+exports this function; our function resides in the F<KERNEL32.DLL>
+system file.
+When specifying this name as parameter, the F<.DLL> extension
+is implicit, and if no path is given, the file is searched through
+a couple of directories, including:
+
+=over 4
+
+=item 1. The directory from which the application loaded.
+
+=item 2. The current directory.
+
+=item 3. The Windows system directory (eg. c:\windows\system or system32).
+
+=item 4. The Windows directory (eg. c:\windows).
+
+=item 5. The directories that are listed in the PATH environment variable.
+
+=back
+
+So, you don't have to write F<C:\windows\system\kernel32.dll>;
+only F<kernel32> is enough:
+
+ $GetTempPath = new Win32::API('kernel32', ...
+
+=item B<2.>
+
+Now for the second parameter: the name of the function.
+It must be written exactly as it is exported
+by the library (case is significant here).
+If you are using Windows 95 or NT 4.0, you can use the B<Quick View>
+command on the DLL file to see the function it exports.
+Remember that you can only import functions from 32 bit DLLs:
+in Quick View, the file's characteristics should report
+somewhere "32 bit word machine"; as a rule of thumb,
+when you see that all the exported functions are in upper case,
+the DLL is a 16 bit one and you can't use it.
+If their capitalization looks correct, then it's probably a 32 bit
+DLL.
+
+Also note that many Win32 APIs are exported twice, with the addition of
+a final B<A> or B<W> to their name, for - respectively - the ASCII
+and the Unicode version.
+When a function name is not found, Win32::API will actually append
+an B<A> to the name and try again; if the extension is built on a
+Unicode system, then it will try with the B<W> instead.
+So our function name will be:
+
+ $GetTempPath = new Win32::API('kernel32', 'GetTempPath', ...
+
+In our case C<GetTempPath> is really loaded as C<GetTempPathA>.
+
+=item B<3.>
+
+The third parameter, the input parameter list, specifies how many
+arguments the function wants, and their types. It can be passed as
+a single string, in which each character represents one parameter,
+or as a list reference. The following forms are valid:
+
+ "abcd"
+ [a, b, c, d]
+ \@LIST
+
+But those are not:
+
+ (a, b, c, d)
+ @LIST
+
+The number of characters, or elements in the list, specifies the number
+of parameters, and each character or element specifies the type of an
+argument; allowed types are:
+
+=over 4
+
+=item C<I>:
+value is an integer (int)
+
+=item C<N>:
+value is a number (long)
+
+=item C<F>:
+value is a floating point number (float)
+
+=item C<D>:
+value is a double precision number (double)
+
+=item C<C>:
+value is a char (char)
+
+=item C<P>:
+value is a pointer (to a string, structure, etc...)
+
+=item C<S>:
+value is a Win32::API::Struct object (see below)
+
+=item C<K>:
+value is a Win32::API::Callback object (see L<Win32::API::Callback>)
+
+=back
+
+Our function needs two parameters: a number (C<DWORD>) and a pointer to a
+string (C<LPSTR>):
+
+ $GetTempPath = new Win32::API('kernel32', 'GetTempPath', 'NP', ...
+
+=item B<4.>
+
+The fourth and final parameter is the type of the value returned by the
+function. It can be one of the types seen above, plus another type named B<V>
+(for C<void>), used for functions that do not return a value.
+In our example the value returned by GetTempPath() is a C<DWORD>, so
+our return type will be B<N>:
+
+ $GetTempPath = new Win32::API('kernel32', 'GetTempPath', 'NP', 'N');
+
+Now the line is complete, and the GetTempPath() API is ready to be used
+in Perl. Before calling it, you should test that $GetTempPath is
+C<defined>, otherwise either the function or the library could not be
+loaded; in this case, C<$!> will be set to the error message reported
+by Windows.
+Our definition, with error checking added, should then look like this:
+
+ $GetTempPath = new Win32::API('kernel32', 'GetTempPath', 'NP', 'N');
+ if(not defined $GetTempPath) {
+ die "Can't import API GetTempPath: $!\n";
+ }
+
+=back
+
+=head2 CALLING AN IMPORTED FUNCTION
+
+To effectively make a call to an imported function you must use the
+Call() method on the Win32::API object you created.
+Continuing with the example from the previous paragraph,
+the GetTempPath() API can be called using the method:
+
+ $GetTempPath->Call(...
+
+Of course, parameters have to be passed as defined in the import phase.
+In particular, if the number of parameters does not match (in the example,
+if GetTempPath() is called with more or less than two parameters),
+Perl will C<croak> an error message and C<die>.
+
+The two parameters needed here are the length of the buffer
+that will hold the returned temporary path, and a pointer to the
+buffer itself.
+For numerical parameters, you can use either a constant expression
+or a variable, while B<for pointers you must use a variable name> (no
+Perl references, just a plain variable name).
+Also note that B<memory must be allocated before calling the function>,
+just like in C.
+For example, to pass a buffer of 80 characters to GetTempPath(),
+it must be initialized before with:
+
+ $lpBuffer = " " x 80;
+
+This allocates a string of 80 characters. If you don't do so, you'll
+probably get C<Runtime exception> errors, and generally nothing will
+work. The call should therefore include:
+
+ $lpBuffer = " " x 80;
+ $GetTempPath->Call(80, $lpBuffer);
+
+And the result will be stored in the $lpBuffer variable.
+Note that you don't need to pass a reference to the variable
+(eg. you B<don't need> C<\$lpBuffer>), even if its value will be set
+by the function.
+
+A little problem here is that Perl does not trim the variable,
+so $lpBuffer will still contain 80 characters in return; the exceeding
+characters will be spaces, because we said C<" " x 80>.
+
+In this case we're lucky enough, because the value returned by
+the GetTempPath() function is the length of the string, so to get
+the actual temporary path we can write:
+
+ $lpBuffer = " " x 80;
+ $return = $GetTempPath->Call(80, $lpBuffer);
+ $TempPath = substr($lpBuffer, 0, $return);
+
+If you don't know the length of the string, you can usually
+cut it at the C<\0> (ASCII zero) character, which is the string
+delimiter in C:
+
+ $TempPath = ((split(/\0/, $lpBuffer))[0];
+ # or
+ $lpBuffer =~ s/\0.*$//;
+
+=head2 USING STRUCTURES
+
+Starting from version 0.40, Win32::API comes with a support package
+named Win32::API::Struct. The package is loaded automatically with
+Win32::API, so you don't need to use it explicitly.
+
+With this module you can conveniently define structures and use
+them as parameters to Win32::API functions. A short example follows:
+
+
+ # the 'POINT' structure is defined in C as:
+ # typedef struct {
+ # LONG x;
+ # LONG y;
+ # } POINT;
+
+
+ #### define the structure
+ Win32::API::Struct->typedef( POINT => qw{
+ LONG x;
+ LONG y;
+ });
+
+ #### import an API that uses this structure
+ Win32::API->Import('user32', 'BOOL GetCursorPos(LPPOINT lpPoint)');
+
+ #### create a 'POINT' object
+ my $pt = Win32::API::Struct->new('POINT');
+
+ #### call the function passing our structure object
+ GetCursorPos($pt);
+
+ #### and now, access its members
+ print "The cursor is at: $pt->{x}, $pt->{y}\n";
+
+Note that this works only when the function wants a
+B<pointer to a structure>: as you can see, our structure is named
+'POINT', but the API used 'LPPOINT'. 'LP' is automatically added at
+the beginning of the structure name when feeding it to a Win32::API
+call.
+
+For more information, see also L<Win32::API::Struct>.
+
+If you don't want (or can't) use the Win32::API::Struct facility,
+you can still use the low-level approach to use structures:
+
+
+=over 4
+
+=item 1.
+you have to pack() the required elements in a variable:
+
+ $lpPoint = pack('LL', 0, 0); # store two LONGs
+
+=item 2. to access the values stored in a structure, unpack() it as required:
+
+ ($x, $y) = unpack('LL', $lpPoint); # get the actual values
+
+=back
+
+The rest is left as an exercise to the reader...
+
+=head1 AUTHOR
+
+Aldo Calpini ( I<dada@perl.it> ).
+
+=head1 MAINTAINER
+
+Cosimo Streppone ( I<cosimo@cpan.org> )
+
+=cut
diff --git a/Master/tlpkg/tlperl.old/lib/Win32/API/Callback.pm b/Master/tlpkg/tlperl.old/lib/Win32/API/Callback.pm new file mode 100644 index 00000000000..22de9d4f46a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/API/Callback.pm @@ -0,0 +1,174 @@ +package Win32::API::Callback; + +# See the bottom of this file for the POD documentation. Search for the +# string '=head'. + +####################################################################### +# +# Win32::API::Callback - Perl Win32 API Import Facility +# +# Author: Aldo Calpini <dada@perl.it> +# Maintainer: Cosimo Streppone <cosimo@cpan.org> +# +# $Id: Callback.pm,v 1.0 2001/10/30 13:57:31 dada Exp $ +# +####################################################################### + +$VERSION = '0.47'; + +require Exporter; # to export the constants to the main:: space +require DynaLoader; # to dynuhlode the module. +@ISA = qw( Exporter DynaLoader ); + +sub DEBUG { + if ($WIN32::API::DEBUG) { + printf @_ if @_ or return 1; + } else { + return 0; + } +} + +use Win32::API; +use Win32::API::Type; +use Win32::API::Struct; + +####################################################################### +# This AUTOLOAD is used to 'autoload' constants from the constant() +# XS function. If a constant is not found then control is passed +# to the AUTOLOAD in AutoLoader. +# + +sub AUTOLOAD { + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + #reset $! to zero to reset any current errors. + $!=0; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($! != 0) { + if ($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } else { + ($pack,$file,$line) = caller; + die "Your vendor has not defined Win32::API::Callback macro $constname, used at $file line $line."; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + + +####################################################################### +# dynamically load in the API extension module. +# +bootstrap Win32::API::Callback; + +####################################################################### +# PUBLIC METHODS +# +sub new { + my($class, $proc, $in, $out) = @_; + my %self = (); + + # printf "(PM)Callback::new: got proc='%s', in='%s', out='%s'\n", $proc, $in, $out; + + $self{in} = []; + if(ref($in) eq 'ARRAY') { + foreach (@$in) { + push(@{ $self{in} }, Win32::API::type_to_num($_)); + } + } else { + my @in = split '', $in; + foreach (@in) { + push(@{ $self{in} }, Win32::API::type_to_num($_)); + } + } + $self{out} = Win32::API::type_to_num($out); + $self{sub} = $proc; + my $self = bless \%self, $class; + + DEBUG "(PM)Callback::new: calling CallbackCreate($self)...\n"; + my $hproc = CallbackCreate($self); + + DEBUG "(PM)Callback::new: hproc=$hproc\n"; + + #### ...if that fails, set $! accordingly + if(!$hproc) { + $! = Win32::GetLastError(); + return undef; + } + + #### ok, let's stuff the object + $self->{code} = $hproc; + $self->{sub} = $proc; + + #### cast the spell + return $self; +} + +sub MakeStruct { + my($self, $n, $addr) = @_; + DEBUG "(PM)Win32::API::Callback::MakeStruct: got self='$self'\n"; + my $struct = Win32::API::Struct->new($self->{intypes}->[$n]); + $struct->FromMemory($addr); + return $struct; +} + +1; + +__END__ + +####################################################################### +# DOCUMENTATION +# + +=head1 NAME + +Win32::API::Callback - Callback support for Win32::API + +=head1 SYNOPSIS + + use Win32::API; + use Win32::API::Callback; + + my $callback = Win32::API::Callback->new( + sub { my($a, $b) = @_; return $a+$b; }, + "NN", "N", + ); + + Win32::API->Import( + 'mydll', 'two_integers_cb', 'KNN', 'N', + ); + + $sum = two_integers_cb( $callback, 3, 2 ); + + +=head1 FOREWORDS + +=over 4 + +=item * +Support for this module is B<highly experimental> at this point. + +=item * +I won't be surprised if it doesn't work for you. + +=item * +Feedback is very appreciated. + +=item * +Documentation is in the work. Either see the SYNOPSIS above +or the samples in the F<samples> directory. + +=back + +=head1 AUTHOR + +Aldo Calpini ( I<dada@perl.it> ). + +=head1 MAINTAINER + +Cosimo Streppone ( I<cosimo@cpan.org> ). + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/Win32/API/Struct.pm b/Master/tlpkg/tlperl.old/lib/Win32/API/Struct.pm new file mode 100644 index 00000000000..05a4c8c60a5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/API/Struct.pm @@ -0,0 +1,532 @@ +package Win32::API::Struct; + +# See the bottom of this file for the POD documentation. Search for the +# string '=head'. + +####################################################################### +# +# Win32::API::Struct - Perl Win32 API struct Facility +# +# Author: Aldo Calpini <dada@perl.it> +# Maintainer: Cosimo Streppone <cosimo@cpan.org> +# +# $Id: Struct.pm,v 1.0 2001/10/30 13:57:31 dada Exp $ +####################################################################### + +$VERSION = '0.47'; + +use Win32::API::Type; + +use Carp; + +require Exporter; # to export the constants to the main:: space +require DynaLoader; # to dynuhlode the module. +@ISA = qw( Exporter DynaLoader ); + +my %Known = (); + +sub DEBUG { + if ($Win32::API::DEBUG) { + printf @_ if @_ or return 1; + } else { + return 0; + } +} + +sub typedef { + my $class = shift; + my $struct = shift; + my($type, $name); + my $self = { + align => undef, + typedef => [], + }; + while(defined($type = shift)) { + $name = shift; + $name =~ s/;$//; + push( @{ $self->{typedef} }, [ recognize($type, $name) ] ); + } + + $Known{$struct} = $self; + return 1; +} + + +sub recognize { + my($type, $name) = @_; + my($size, $packing); + if(exists $Known{$type}) { + $packing = ">"; + return $name, $packing, $type; + } else { + $packing = Win32::API::Type::packing($type); + return undef unless defined $packing; + if($name =~ s/\[(.*)\]$//) { + $size = $1; + $packing = $packing."*".$size; + } + DEBUG "(PM)Struct::recognize got '$name', '$type' -> '$packing'\n"; + return $name, $packing, $type; + } +} + +sub new { + my $class = shift; + my($type, $name); + my $self = { + typedef => [], + }; + if($#_ == 0) { + if(exists $Known{$_[0]}) { + DEBUG "(PM)Struct::new: got '$_[0]'\n"; + $self->{typedef} = $Known{$_[0]}->{typedef}; + foreach my $member (@{ $self->{typedef} }) { + ($name, $packing, $type) = @$member; + if($packing eq '>') { + $self->{$name} = Win32::API::Struct->new($type); + } + } + $self->{__typedef__} = $_[0]; + } else { + carp "Unknown Win32::API::Struct '$_[0]'"; + return undef; + } + } else { + while(defined($type = shift)) { + $name = shift; + # print "new: found member $name ($type)\n"; + if(not exists $Win32::API::Type::Known{$type}) { + warn "Unknown Win32::API::Struct type '$type'"; + return undef; + } else { + push( @{ $self->{typedef} }, [ $name, $Win32::API::Type::Known{$type}, $type ] ); + } + } + } + return bless $self; +} + +sub members { + my $self = shift; + return map {$_->[0]} @{ $self->{typedef} }; +} + +sub sizeof { + my $self = shift; + my $size = 0; + my $align = 0; + my $first = undef; + foreach my $member (@{ $self->{typedef} }) { + my($name, $packing, $type) = @$member; + + if(ref( $self->{$name} ) eq "Win32::API::Struct") { + $size += $self->{$name}->sizeof(); + # $align = $self->{$name}->sizeof() if $self->{$name}->sizeof() > $align; + } else { + if($packing =~ /\w\*(\d+)/) { + $size += Win32::API::Type::sizeof($type) * $1; + $first = Win32::API::Type::sizeof($type) * $1 unless defined $first; + DEBUG "(PM)Struct::sizeof: sizeof with member($name) now = ". $size. "\n"; + } else { + $size += Win32::API::Type::sizeof($type); + $first = Win32::API::Type::sizeof($type) unless defined $first; + $align = Win32::API::Type::sizeof($type) + if Win32::API::Type::sizeof($type) > $align; + DEBUG "(PM)Struct::sizeof: sizeof with member($name) now = ". $size. "\n"; + } + } + } + DEBUG "(PM)Struct::sizeof first=$first align=$align\n"; + #DEBUG "(PM)Struct::sizeof returning %d\n", $first + (scalar(@{ $self->{typedef} })-1) * $align; + #return $first + (scalar(@{ $self->{typedef} })-1) * $align; + DEBUG "(PM)Struct::sizeof returning %d\n", scalar(@{ $self->{typedef} }) * $align; + if(defined $align and $align > 0) { + return scalar(@{ $self->{typedef} }) * $align; + } else { + return $size; + } + return $size; +} + +sub align { + my $self = shift; + my $align = shift; + + if(not defined $align) { + return $self->{align} unless $self->{align} eq 'auto'; + $align = 0; + foreach my $member (@{ $self->{typedef} }) { + my($name, $packing, $type) = @$member; + + if(ref( $self->{$name} ) eq "Win32::API::Struct") { + #### ???? + } else { + if($packing =~ /\w\*(\d+)/) { + #### ???? + } else { + $align = Win32::API::Type::sizeof($type) + if Win32::API::Type::sizeof($type) > $align; + } + } + } + return $align; + } else { + $self->{align} = $align; + + } +} + +sub getPack { + my $self = shift; + my $packing = ""; + my($type, $name); + my @items = (); + my @recipients = (); + + my $align = $self->align(); + + foreach my $member (@{ $self->{typedef} }) { + ($name, $type, $orig) = @$member; + if($type eq '>') { + my($subpacking, $subitems, $subrecipients) = $self->{$name}->getPack(); + + DEBUG "(PM)Struct::getPack($self->{__typedef__}) ++ $subpacking\n"; + + $packing .= $subpacking; + push(@items, @$subitems); + push(@recipients, @$subrecipients); + } else { + if($type =~ /\w\*(\d+)/) { + my $size = $1; + $type = "a$size"; + } + + DEBUG "(PM)Struct::getPack($self->{__typedef__}) ++ $type\n"; + + if($type eq 'p') { + $type = "L"; + push(@items, Win32::API::PointerTo($self->{$name})); + } else { + push(@items, $self->{$name}); + } + $packing .= $type; + + if($Win32::API::Type::PackSize{$type} < $align) { + $packing .= ("x" x ($align - $Win32::API::Type::PackSize{$type})); + } + + push(@recipients, $self); + } + } + DEBUG "(PM)Struct::getPack: $self->{__typedef__}(buffer) = pack($packing, @items)\n"; + return($packing, [@items], [@recipients]); +} + + +sub Pack { + my $self = shift; + my($packing, $items, $recipients) = $self->getPack(); + DEBUG "(PM)Struct::Pack: $self->{__typedef__}(buffer) = pack($packing, @$items)\n"; + $self->{buffer} = pack($packing, @$items); + if(DEBUG) { + for my $i (0..$self->sizeof-1) { + printf " %3d: 0x%02x\n", $i, ord(substr($self->{buffer}, $i, 1)); + } + } + $self->{buffer_recipients} = $recipients +} + +sub getUnpack { + my $self = shift; + my $packing = ""; + my($type, $name); + my @items = (); + my $align = $self->align(); + foreach my $member (@{ $self->{typedef} }) { + ($name, $type, $orig) = @$member; + if($type eq '>') { + my($subpacking, @subitems) = $self->{$name}->getUnpack(); + + DEBUG "(PM)Struct::getUnpack($self->{__typedef__}) ++ $subpacking\n"; + $packing .= $subpacking; + + + push(@items, @subitems); + } else { + if($type =~ /\w\*(\d+)/) { + my $size = $1; + $type = "Z$size"; + } + + #if($type eq 'p') { + # $packing .= 'Z*'; + # DEBUG "(PM)Struct::getUnpack($self->{__typedef__}) ++ Z*\n"; + #} else { + $packing .= $type; + DEBUG "(PM)Struct::getUnpack($self->{__typedef__}) ++ $type\n"; + #} + if($type ne 'p' and $type !~ /^Z(\d+)/ and $Win32::API::Type::PackSize{$type} < $align) { + DEBUG "(PM)Struct::getUnpack %s(%d) < %d\n", + $type, $Win32::API::Type::PackSize{$type}, $align + ; + $packing .= ("x" x ($align - $Win32::API::Type::PackSize{$type})); + } + + push(@items, $name); + } + } + DEBUG "(PM)Struct::getUnpack($self->{__typedef__}): unpack($packing, @items)\n"; + return($packing, @items); +} + +sub Unpack { + my $self = shift; + my($packing, @items) = $self->getUnpack(); + my @itemvalue = unpack($packing, $self->{buffer}); + DEBUG "(PM)Struct::Unpack: unpack($packing, buffer) = @itemvalue\n"; + foreach my $i (0..$#items) { + my $recipient = $self->{buffer_recipients}->[$i]; + DEBUG "(PM)Struct::Unpack: %s(%s) = '%s' (0x%08x)\n", + $recipient->{__typedef__}, + $items[$i], + $itemvalue[$i], + $itemvalue[$i], + ; + $recipient->{$items[$i]} = $itemvalue[$i]; + DEBUG "(PM)Struct::Unpack: self.$items[$i] = $self->{$items[$i]}\n"; + } +} + +sub FromMemory { + my($self, $addr) = @_; + DEBUG "(PM)Struct::FromMemory: doing Pack\n"; + $self->Pack(); + DEBUG "(PM)Struct::FromMemory: doing GetMemory( 0x%08x, %d )\n", $addr, $self->sizeof; + $self->{buffer} = Win32::API::ReadMemory( $addr, $self->sizeof ); + $self->Unpack(); + DEBUG "(PM)Struct::FromMemory: doing Unpack\n"; + DEBUG "(PM)Struct::FromMemory: structure is now:\n"; + $self->Dump() if DEBUG; + DEBUG "\n"; +} + +sub Dump { + my $self = shift; + my $prefix = shift; + foreach my $member (@{ $self->{typedef} }) { + ($name, $packing, $type) = @$member; + if( ref($self->{$name}) ) { + $self->{$name}->Dump($name); + } else { + printf "%-20s %-20s %-20s\n", $prefix, $name, $self->{$name}; + } + } +} + + +sub is_known { + my $name = shift; + if(exists $Known{ $name }) { + return 1; + } else { + if($name =~ s/^LP//) { + return exists $Known{ $name }; + } + return 0; + } +} + +sub TIEHASH { + return Win32::API::Struct::new(@_); +} + +sub EXISTS { + +} + +sub FETCH { + my $self = shift; + my $key = shift; + + if($key eq 'sizeof') { + return $self->sizeof; + } + my @members = map { $_->[0] } @{ $self->{typedef} }; + if(grep(/^\Q$key\E$/, @members)) { + return $self->{$key}; + } else { + warn "'$key' is not a member of Win32::API::Struct $self->{__typedef__}"; + } +} + +sub STORE { + my $self = shift; + my($key, $val) = @_; + my @members = map { $_->[0] } @{ $self->{typedef} }; + if(grep(/^\Q$key\E$/, @members)) { + $self->{$key} = $val; + } else { + warn "'$key' is not a member of Win32::API::Struct $self->{__typedef__}"; + } +} + +sub FIRSTKEY { + my $self = shift; + my @members = map { $_->[0] } @{ $self->{typedef} }; + return $members[0]; +} + +sub NEXTKEY { + my $self = shift; + my $key = shift; + my @members = map { $_->[0] } @{ $self->{typedef} }; + for my $i (0..$#members-1) { + return $members[$i+1] if $members[$i] eq $key; + } + return undef; +} + +1; + +####################################################################### +# DOCUMENTATION +# + +=head1 NAME + +Win32::API::Struct - C struct support package for Win32::API + +=head1 SYNOPSIS + + use Win32::API; + + Win32::API::Struct->typedef( 'POINT', qw( + LONG x; + LONG y; + )); + + my $Point = Win32::API::Struct->new( 'POINT' ); + $Point->{x} = 1024; + $Point->{y} = 768; + + #### alternatively + + tie %Point, 'Win32::API::Struct', 'POINT'; + $Point{x} = 1024; + $Point{y} = 768; + + +=head1 ABSTRACT + +This module enables you to define C structs for use with +Win32::API. + +See L<Win32::API> for more info about its usage. + +=head1 DESCRIPTION + +This module is automatically imported by Win32::API, so you don't +need to 'use' it explicitly. The main methods are C<typedef> and +C<new>, which are documented below. + +=over 4 + +=item C<typedef NAME, TYPE, MEMBER, TYPE, MEMBER, ...> + +This method defines a structure named C<NAME>. The definition consists +of types and member names, just like in C. In fact, most of the +times you can cut the C definition for a structure and paste it +verbatim to your script, enclosing it in a C<qw()> block. The +function takes care of removing the semicolon after the member +name. + +The synopsis example could be written like this: + + Win32::API::Struct->typedef('POINT', 'LONG', 'x', 'LONG', 'y'); + +But it could also be written like this (note the indirect object +syntax), which is pretty cool: + + typedef Win32::API::Struct POINT => qw{ + LONG x; + LONG y; + }; + +Also note that C<typedef> automatically defines an 'LPNAME' type, +which holds a pointer to your structure. In the example above, +'LPPOINT' is also defined and can be used in a call to a +Win32::API (in fact, this is what you're really going to use when +doing API calls). + +=item C<new NAME> + +This creates a structure (a Win32::API::Struct object) of the +type C<NAME> (it must have been defined with C<typedef>). In Perl, +when you create a structure, all the members are undefined. But +when you use that structure in C (eg. a Win32::API call), you +can safely assume that they will be treated as zero (or NULL). + +=item C<sizeof> + +This returns the size, in bytes, of the structure. Acts just like +the C function of the same name. It is particularly useful for +structures that need a member to be initialized to the structure's +own size. + +=item C<align [SIZE]> + +Sets or returns the structure alignment (eg. how the structure is +stored in memory). This is a very advanced option, and you normally +don't need to mess with it. +All structures in the Win32 Platform SDK should work without it. +But if you define your own structure, you may need to give it an +explicit alignment. In most cases, passing a C<SIZE> of 'auto' +should keep the world happy. + +=back + +=head2 THE C<tie> INTERFACE + +Instead of creating an object with the C<new> method, you can +tie a hash, which will hold the desired structure, using the +C<tie> builtin function: + + tie %structure, Win32::API::Struct => 'NAME'; + +The differences between the tied and non-tied approaches are: + +=over 4 + +=item * +with tied structures, you can access members directly as +hash lookups, eg. + + # tied # non-tied + $Point{x} vs. $Point->{x} + +=item * +with tied structures, when you try to fetch or store a +member that is not part of the structure, it will result +in a warning, eg. + + print $Point{z}; + # this will warn: 'z' is not a member of Win32::API::Struct POINT + +=item * +when you pass a tied structure as a Win32::API parameter, +remember to backslash it, eg. + + # tied # non-tied + GetCursorPos( \%Point ) vs. GetCursorPos( $Point ) + +=back + +=head1 AUTHOR + +Aldo Calpini ( I<dada@perl.it> ). + +=head1 MAINTAINER + +Cosimo Streppone ( I<cosimo@cpan.org> ). + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Win32/API/Test.pm b/Master/tlpkg/tlperl.old/lib/Win32/API/Test.pm new file mode 100644 index 00000000000..6cbeed6bfac --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/API/Test.pm @@ -0,0 +1,120 @@ +# +# Win32::API::Test - Test helper package for Win32::API +# +# Version: 0.01 +# Date: 23 Dec 2006 +# Author: Cosimo Streppone <cosimo@cpan.org> +# +# $Id: API.pm,v 1.0 2001/10/30 13:57:31 dada Exp $ +# +package Win32::API::Test; + +sub compiler_name () { + use Config; + my $cc = $Config{ccname}; + if($cc eq 'cl' || $cc eq 'cl.exe') + { + $cc = 'cl'; + } + return($cc); +} + +sub compiler_version () { + use Config; + my $ver = $Config{ccversion} || 0; + if( $ver =~ /^(\d+\.\d+)/ ) + { + $ver = 0 + $1; + } + return($ver); +} + +# +# Run the compiler and get version from there... +# User might be running a compiler different from +# that used to build perl. +# For example, Cosimo does. For testing, of course. +# +# *** +# *** IT DOES NOT WORK NOW. +# *** FOR REASONS I DON'T KNOW, CL.EXE OUTPUTS ITS +# *** VERSION STRING IN THE FIRST TWO LINES THAT +# *** I'M NOT ABLE TO CATCH... +# *** +# +sub compiler_version_from_shell () { + my $cc = compiler_name(); + my $ver; + # MSVC + if($cc eq 'cl') + { + my @ver = `$cc`; + my $ver = join('',@ver); + print 'VER:'.$ver.':'."\n"; + if($ver =~ /Version (\d[\d\.]+)/ms ) + { + $ver = $1; + } + } + # GCC + elsif($cc eq 'cc' || $cc eq 'gcc' || $cc eq 'winegcc' ) + { + $ver = join('', `$cc --version`); + if($ver =~ /gcc.*(\d[\d+]+)/ms ) + { + $ver = $1; + } + } + # Borland C + elsif($cc eq 'bcc32' || $cc eq 'bcc') + { + $ver = join('', `$cc`); + if($ver =~ /Borland C\+\+ (\d[\d\.]+)/ms ) + { + $ver = $1; + } + } + return($ver); +} + +sub find_test_dll () { + require File::Spec; + my $dll_name = $_[0]; + my @paths = qw(.. ../t ../t/dll . ./dll ./t/dll); + while(my $path = shift @paths) + { + $dll = File::Spec->catfile($path, $dll_name); + return $dll if -s $dll; + } + return(undef); +} + +1; + +__END__ + + +####################################################################### +# DOCUMENTATION +# + +=head1 NAME + +Win32::API::Test - Test helper package for Win32::API + +=head1 SYNOPSIS + + my $test_dll = Win32::API::Test::find_test_dll('API_test.dll'); + +Check the t/*.t test scripts for more details. + +=head1 DESCRIPTION + +Simple package to hold Win32::API test suite helper functions. +No more, no less. + +=head1 AUTHOR + +Cosimo Streppone ( I<cosimo@cpan.org> ) + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Win32/API/Type.pm b/Master/tlpkg/tlperl.old/lib/Win32/API/Type.pm new file mode 100644 index 00000000000..334b0b731e1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/API/Type.pm @@ -0,0 +1,446 @@ +package Win32::API::Type; + +# See the bottom of this file for the POD documentation. Search for the +# string '=head'. + +####################################################################### +# +# Win32::API::Type - Perl Win32 API type definitions +# +# Author: Aldo Calpini <dada@perl.it> +# Maintainer: Cosimo Streppone <cosimo@cpan.org> +# +# $Id: Type.pm,v 1.0 2001/10/30 13:57:31 dada Exp $ +####################################################################### + +$VERSION = '0.47'; + +use Carp; + +require Exporter; # to export the constants to the main:: space +require DynaLoader; # to dynuhlode the module. +@ISA = qw( Exporter DynaLoader ); + +use vars qw( %Known %PackSize %Modifier %Pointer ); + +sub DEBUG { + if ($Win32::API::DEBUG) { + printf @_ if @_ or return 1; + } else { + return 0; + } +} + +%Known = (); +%PackSize = (); +%Modifier = (); +%Pointer = (); + +# Initialize data structures at startup. +# Aldo wants to keep the <DATA> approach. +# +my $section = 'nothing'; +foreach (<DATA>) { + next if /^\s*#/ or /^\s*$/; + chomp; + if( /\[(.+)\]/) { + $section = $1; + next; + } + if($section eq 'TYPE') { + my($name, $packing) = split(/\s+/); + # DEBUG "(PM)Type::INIT: Known('$name') => '$packing'\n"; + $Known{$name} = $packing; + } elsif($section eq 'PACKSIZE') { + my($packing, $size) = split(/\s+/); + # DEBUG "(PM)Type::INIT: PackSize('$packing') => '$size'\n"; + $PackSize{$packing} = $size; + } elsif($section eq 'MODIFIER') { + my($modifier, $mapto) = split(/\s+/, $_, 2); + my %maps = (); + foreach my $item (split(/\s+/, $mapto)) { + my($k, $v) = split(/=/, $item); + $maps{$k} = $v; + } + # DEBUG "(PM)Type::INIT: Modifier('$modifier') => '%maps'\n"; + $Modifier{$modifier} = { %maps }; + } elsif($section eq 'POINTER') { + my($pointer, $pointto) = split(/\s+/); + # DEBUG "(PM)Type::INIT: Pointer('$pointer') => '$pointto'\n"; + $Pointer{$pointer} = $pointto; + } +} +close(DATA); + +sub new { + my $class = shift; + my($type) = @_; + my $packing = packing($type); + my $size = sizeof($type); + my $self = { + type => $type, + packing => $packing, + size => $size, + }; + return bless $self; +} + +sub typedef { + my $class = shift; + my($name, $type) = @_; + my $packing = packing($type, $name); + DEBUG "(PM)Type::typedef: packing='$packing'\n"; + my $size = sizeof($type); + $Known{$name} = $packing; + return 1; +} + + +sub is_known { + my $self = shift; + my $type = shift; + $type = $self unless defined $type; + if(ref($type) =~ /Win32::API::Type/) { + return 1; + } else { + return defined packing($type); + } +} + +sub sizeof { + my $self = shift; + my $type = shift; + $type = $self unless defined $type; + if(ref($type) =~ /Win32::API::Type/) { + return $self->{size}; + } else { + my $packing = packing($type); + if($packing =~ /(\w)\*(\d+)/) { + return $PackSize{ $1 } * $2; + } else { + return $PackSize{ $packing }; + } + } +} + +sub packing { + # DEBUG "(PM)Type::packing: called by ". join("::", (caller(1))[0,3]). "\n"; + my $self = shift; + my $is_pointer = 0; + if(ref($self) =~ /Win32::API::Type/) { + # DEBUG "(PM)Type::packing: got an object\n"; + return $self->{packing}; + } + my $type = ($self eq 'Win32::API::Type') ? shift : $self; + my $name = shift; + + # DEBUG "(PM)Type::packing: got '$type', '$name'\n"; + my($modifier, $size, $packing); + if(exists $Pointer{$type}) { + # DEBUG "(PM)Type::packing: got '$type', is really '$Pointer{$type}'\n"; + $type = $Pointer{$type}; + $is_pointer = 1; + } elsif($type =~ /(\w+)\s+(\w+)/) { + $modifier = $1; + $type = $2; + # DEBUG "(PM)packing: got modifier '$modifier', type '$type'\n"; + } + + $type =~ s/\*$//; + + if(exists $Known{$type}) { + if(defined $name and $name =~ s/\[(.*)\]$//) { + $size = $1; + $packing = $Known{$type}[0]."*".$size; + # DEBUG "(PM)Type::packing: composite packing: '$packing' '$size'\n"; + } else { + $packing = $Known{$type}; + if($is_pointer and $packing eq 'c') { + $packing = "p"; + } + # DEBUG "(PM)Type::packing: simple packing: '$packing'\n"; + } + if(defined $modifier and exists $Modifier{$modifier}->{$type}) { + # DEBUG "(PM)Type::packing: applying modifier '$modifier' -> '$Modifier{$modifier}->{$type}'\n"; + $packing = $Modifier{$modifier}->{$type}; + } + return $packing; + } else { + # DEBUG "(PM)Type::packing: NOT FOUND\n"; + return undef; + } +} + + +sub is_pointer { + my $self = shift; + my $type = shift; + $type = $self unless defined $type; + if(ref($type) =~ /Win32::API::Type/) { + return 1; + } else { + if($type =~ /\*$/) { + return 1; + } else { + return exists $Pointer{$type}; + } + } +} + +sub Pack { + my $type = $_[0]; + + if(packing($type) eq 'c' and is_pointer($type)) { + $_[1] = pack("Z*", $_[1]); + return $_[1]; + } + $_[1] = pack( packing($type), $_[1]); + return $_[1]; +} + +sub Unpack { + my $type = $_[0]; + if(packing($type) eq 'c' and is_pointer($type)) { + DEBUG "(PM)Type::Unpack: got packing 'c', is a pointer, unpacking 'Z*' '$_[1]'\n"; + $_[1] = unpack("Z*", $_[1]); + DEBUG "(PM)Type::Unpack: returning '$_[1]'\n"; + return $_[1]; + } + DEBUG "(PM)Type::Unpack: unpacking '".packing($type)."' '$_[1]'\n"; + $_[1] = unpack( packing($type), $_[1]); + DEBUG "(PM)Type::Unpack: returning '$_[1]'\n"; + return $_[1]; +} + +1; + +####################################################################### +# DOCUMENTATION +# + +=head1 NAME + +Win32::API::Type - C type support package for Win32::API + +=head1 SYNOPSIS + + use Win32::API; + + Win32::API::Type->typedef( 'my_number', 'LONG' ); + + +=head1 ABSTRACT + +This module is a support package for Win32::API that implements +C types for the import with prototype functionality. + +See L<Win32::API> for more info about its usage. + +=head1 DESCRIPTION + +This module is automatically imported by Win32::API, so you don't +need to 'use' it explicitly. These are the methods of this package: + +=over 4 + +=item C<typedef NAME, TYPE> + +This method defines a new type named C<NAME>. This actually just +creates an alias for the already-defined type C<TYPE>, which you +can use as a parameter in a Win32::API call. + +=item C<sizeof TYPE> + +This returns the size, in bytes, of C<TYPE>. Acts just like +the C function of the same name. + +=item C<is_known TYPE> + +Returns true if C<TYPE> is known by Win32::API::Type, false +otherwise. + +=back + +=head2 SUPPORTED TYPES + +This module should recognize all the types defined in the +Win32 Platform SDK header files. +Please see the source for this module, in the C<__DATA__> section, +for the full list. + +=head1 AUTHOR + +Aldo Calpini ( I<dada@perl.it> ). + +=head1 MAINTAINER + +Cosimo Streppone ( I<cosimo@cpan.org> ). + +=cut + + +__DATA__ + +[TYPE] +ATOM s +BOOL L +BOOLEAN c +BYTE C +CHAR c +COLORREF L +DWORD L +DWORD32 L +DWORD64 Q +FLOAT f +HACCEL L +HANDLE L +HBITMAP L +HBRUSH L +HCOLORSPACE L +HCONV L +HCONVLIST L +HCURSOR L +HDC L +HDDEDATA L +HDESK L +HDROP L +HDWP L +HENHMETAFILE L +HFILE L +HFONT L +HGDIOBJ L +HGLOBAL L +HHOOK L +HICON L +HIMC L +HINSTANCE L +HKEY L +HKL L +HLOCAL L +HMENU L +HMETAFILE L +HMODULE L +HPALETTE L +HPEN L +HRGN L +HRSRC L +HSZ L +HWINSTA L +HWND L +INT i +INT32 i +INT64 q +LANGID s +LCID L +LCSCSTYPE L +LCSGAMUTMATCH L +LCTYPE L +LONG l +LONG32 l +LONG64 q +LONGLONG q +LPARAM L +LRESULT L +REGSAM L +SC_HANDLE L +SC_LOCK L +SERVICE_STATUS_HANDLE L +SHORT s +SIZE_T L +SSIZE_T L +TBYTE c +TCHAR C +UCHAR C +UINT I +UINT_PTR L +UINT32 I +UINT64 Q +ULONG L +ULONG32 L +ULONG64 Q +ULONGLONG Q +USHORT S +WCHAR S +WORD S +WPARAM L +VOID c + +int i +long l +float f +double d +char c + +#CRITICAL_SECTION 24 -- a structure +#LUID ? 8 -- a structure +#VOID 0 +#CONST 4 +#FILE_SEGMENT_ELEMENT 8 -- a structure + +[PACKSIZE] +c 1 +C 1 +d 8 +f 4 +i 4 +I 4 +l 4 +L 4 +q 8 +Q 8 +s 2 +S 2 +p 4 + +[MODIFIER] +unsigned int=I long=L short=S char=C + +[POINTER] +INT_PTR INT +LPBOOL BOOL +LPBYTE BYTE +LPCOLORREF COLORREF +LPCSTR CHAR +#LPCTSTR CHAR or WCHAR +LPCTSTR CHAR +LPCVOID any +LPCWSTR WCHAR +LPDWORD DWORD +LPHANDLE HANDLE +LPINT INT +LPLONG LONG +LPSTR CHAR +#LPTSTR CHAR or WCHAR +LPTSTR CHAR +LPVOID VOID +LPWORD WORD +LPWSTR WCHAR + +PBOOL BOOL +PBOOLEAN BOOL +PBYTE BYTE +PCHAR CHAR +PCSTR CSTR +PCWCH CWCH +PCWSTR CWSTR +PDWORD DWORD +PFLOAT FLOAT +PHANDLE HANDLE +PHKEY HKEY +PINT INT +PLCID LCID +PLONG LONG +PSHORT SHORT +PSTR CHAR +#PTBYTE TBYTE -- +#PTCHAR TCHAR -- +#PTSTR CHAR or WCHAR +PTSTR CHAR +PUCHAR UCHAR +PUINT UINT +PULONG ULONG +PUSHORT USHORT +PVOID VOID +PWCHAR WCHAR +PWORD WORD +PWSTR WCHAR diff --git a/Master/tlpkg/tlperl.old/lib/Win32/ChangeNotify.pm b/Master/tlpkg/tlperl.old/lib/Win32/ChangeNotify.pm new file mode 100644 index 00000000000..a86682da376 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/ChangeNotify.pm @@ -0,0 +1,198 @@ +#--------------------------------------------------------------------- +package Win32::ChangeNotify; +# +# Copyright 1998 Christopher J. Madsen +# +# Created: 3 Feb 1998 from the ActiveWare version +# (c) 1995 Microsoft Corporation. All rights reserved. +# Developed by ActiveWare Internet Corp., http://www.ActiveWare.com +# +# Other modifications (c) 1997 by Gurusamy Sarathy <gsar@activestate.com> +# +# Author: Christopher J. Madsen <cjm@pobox.com> +# Version: 1.02 (13-Jun-1999) +# +# This program is free software; you can redistribute it and/or modify +# it under the same terms as Perl itself. +# +# 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 either the +# GNU General Public License or the Artistic License for more details. +# +# Monitor directory for changes +#--------------------------------------------------------------------- +# 1.04 -Minor changes by Yves Orton to fix the trueness of $subtree (Dec 2002) + +$VERSION = '1.05'; + +use Carp; +use Win32::IPC 1.00 '/./'; # Import everything +require Exporter; +require DynaLoader; + +@ISA = qw(Exporter DynaLoader Win32::IPC); +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. +@EXPORT = qw( + FILE_NOTIFY_CHANGE_ATTRIBUTES + FILE_NOTIFY_CHANGE_DIR_NAME + FILE_NOTIFY_CHANGE_FILE_NAME + FILE_NOTIFY_CHANGE_LAST_WRITE + FILE_NOTIFY_CHANGE_SECURITY + FILE_NOTIFY_CHANGE_SIZE + INFINITE +); +@EXPORT_OK = qw( + wait_all wait_any +); + +sub AUTOLOAD { + # This AUTOLOAD is used to 'autoload' constants from the constant() + # XS function. + + my $constname; + ($constname = $AUTOLOAD) =~ s/.*:://; + if ($constname =~ /^(?:FILE_NOTIFY_CHANGE_|INFINITE)/) { + local $! = 0; + my $val = constant($constname); + croak("$constname is not defined by Win32::ChangeNotify") if $! != 0; + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; + } +} # end AUTOLOAD + +bootstrap Win32::ChangeNotify; + +sub new { + my ($class,$path,$subtree,$filter) = @_; + + if ($filter =~ /\A[\s|A-Z_]+\Z/i) { + $filter = 0; + foreach (split(/[\s|]+/, $_[3])) { + $filter |= constant("FILE_NOTIFY_CHANGE_" . uc $_); + carp "Invalid filter $_" if $!; + } + } + _new($class,$path,$subtree,$filter); +} # end new + +sub Close { &close } + +sub FindFirst { $_[0] = Win32::ChangeNotify->_new(@_[1..3]); } + +sub FindNext { &reset } + +1; +__END__ + +=head1 NAME + +Win32::ChangeNotify - Monitor events related to files and directories + +=head1 SYNOPSIS + + require Win32::ChangeNotify; + + $notify = Win32::ChangeNotify->new($Path,$WatchSubTree,$Events); + $notify->wait or warn "Something failed: $!\n"; + # There has been a change. + +=head1 DESCRIPTION + +This module allows the user to use a Win32 change notification event +object from Perl. This allows the Perl program to monitor events +relating to files and directory trees. + +Unfortunately, the Win32 API which implements this feature does not +provide any indication of I<what> triggered the notification (as far +as I know). If you're monitoring a directory for file changes, and +you need to know I<which> file changed, you'll have to find some other +way of determining that. Depending on exactly what you're trying to +do, you may be able to check file timestamps to find recently changed +files. Or, you may need to cache the directory contents somewhere and +compare the current contents to your cached copy when you receive a +change notification. + +The C<wait> method and C<wait_all> & C<wait_any> functions are +inherited from the L<"Win32::IPC"> module. + +=head2 Methods + +=over 4 + +=item $notify = Win32::ChangeNotify->new($path, $subtree, $filter) + +Constructor for a new ChangeNotification object. C<$path> is the +directory to monitor. If C<$subtree> is true, then all directories +under C<$path> will be monitored. C<$filter> indicates what events +should trigger a notification. It should be a string containing any +of the following flags (separated by whitespace and/or C<|>). + + ATTRIBUTES Any attribute change + DIR_NAME Any directory name change + FILE_NAME Any file name change (creating/deleting/renaming) + LAST_WRITE Any change to a file's last write time + SECURITY Any security descriptor change + SIZE Any change in a file's size + +(C<$filter> can also be an integer composed from the +C<FILE_NOTIFY_CHANGE_*> constants.) + +=item $notify->close + +Shut down monitoring. You could just C<undef $notify> instead (but +C<close> works even if there are other copies of the object). This +happens automatically when your program exits. + +=item $notify->reset + +Resets the ChangeNotification object after a change has been detected. +The object will become signalled again after the next change. (It is +OK to call this immediately after C<new>, but it is not required.) + +=item $notify->wait + +See L<"Win32::IPC">. Remember to call C<reset> afterwards if you want +to continue monitoring. + +=back + +=head2 Deprecated Functions and Methods + +B<Win32::ChangeNotify> still supports the ActiveWare syntax, but its +use is deprecated. + +=over 4 + +=item FindFirst($Obj,$PathName,$WatchSubTree,$Filter) + +Use + + $Obj = Win32::ChangeNotify->new($PathName,$WatchSubTree,$Filter) + +instead. + +=item $obj->FindNext() + +Use C<$obj-E<gt>reset> instead. + +=item $obj->Close() + +Use C<$obj-E<gt>close> instead. + +=back + +=head1 AUTHOR + +Christopher J. Madsen E<lt>F<cjm@pobox.com>E<gt> + +Loosely based on the original module by ActiveWare Internet Corp., +F<http://www.ActiveWare.com> + +=cut + +# Local Variables: +# tmtrack-file-task: "Win32::ChangeNotify" +# End: diff --git a/Master/tlpkg/tlperl.old/lib/Win32/Client.pl b/Master/tlpkg/tlperl.old/lib/Win32/Client.pl new file mode 100644 index 00000000000..6ae585b7c91 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/Client.pl @@ -0,0 +1,63 @@ +use strict; +use Win32::Pipe; + +#### +# You may notice that named pipe names are case INsensitive! +#### + +my $PipeName = "\\\\.\\pipe\\TEST this LoNG Named Pipe!"; + +print "I am falling asleep for few seconds, so that we give time\nFor the server to get up and running.\n"; +sleep(4); +print "\nOpening a pipe ...\n"; + +if (my $Pipe = Win32::Pipe->new($PipeName)) { + print "\n\nPipe has been opened, writing data to it...\n"; + print "-------------------------------------------\n"; + $Pipe->Write("\n" . Win32::Pipe::Credit() . "\n\n"); + while () { + print "\nCommands:\n"; + print " FILE:xxxxx Dumps the file xxxxx.\n"; + print " Credit Dumps the credit screen.\n"; + print " Quit Quits this client (server remains running).\n"; + print " Exit Exits both client and server.\n"; + print " -----------------------------------------\n"; + + my $In = <STDIN>; + chop($In); + + if ((my $File = $In) =~ s/^file:(.*)/$1/i){ + if (-s $File) { + if (open(FILE, "< $File")) { + while ($File = <FILE>) { + $In .= $File; + }; + close(FILE); + } + } + } + + if ($In =~ /^credit$/i){ + $In = "\n" . Win32::Pipe::Credit() . "\n\n"; + } + + unless ($Pipe->Write($In)) { + print "Writing to pipe failed.\n"; + last; + } + + if ($In =~ /^(exit|quit)$/i) { + print "\nATTENTION: Closing due to user request.\n"; + last; + } + } + print "Closing...\n"; + $Pipe->Close(); +} +else { + my($Error, $ErrorText) = Win32::Pipe::Error(); + print "Error:$Error \"$ErrorText\"\n"; + sleep(4); +} + +print "Done...\n"; diff --git a/Master/tlpkg/tlperl.old/lib/Win32/Clipboard.pm b/Master/tlpkg/tlperl.old/lib/Win32/Clipboard.pm new file mode 100644 index 00000000000..ba4038a5ade --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/Clipboard.pm @@ -0,0 +1,369 @@ +package Win32::Clipboard; +####################################################################### +# +# Win32::Clipboard - Interaction with the Windows clipboard +# +# Version: 0.52 +# Author: Aldo Calpini <dada@perl.it> +# +# Modified by: Hideyo Imazu <himazu@gmail.com> +# +####################################################################### + +require Exporter; # to export the constants to the main:: space +require DynaLoader; # to dynuhlode the module. + +@ISA = qw( Exporter DynaLoader ); +@EXPORT = qw( + CF_TEXT + CF_BITMAP + CF_METAFILEPICT + CF_SYLK + CF_DIF + CF_TIFF + CF_OEMTEXT + CF_DIB + CF_PALETTE + CF_PENDATA + CF_RIFF + CF_WAVE + CF_UNICODETEXT + CF_ENHMETAFILE + CF_HDROP + CF_LOCALE +); + +####################################################################### +# This AUTOLOAD is used to 'autoload' constants from the constant() +# XS function. If a constant is not found then control is passed +# to the AUTOLOAD in AutoLoader. +# + +sub AUTOLOAD { + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + #reset $! to zero to reset any current errors. + local $! = 0; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($! != 0) { + if ($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } else { + my ($pack, $file, $line) = caller; + die "Win32::Clipboard::$constname is not defined, used at $file line $line."; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + + +####################################################################### +# STATIC OBJECT PROPERTIES +# +$VERSION = "0.5201"; + +####################################################################### +# FUNCTIONS +# + +sub new { + my($class, $value) = @_; + my $self = "I'm the Clipboard!"; + Set($value) if defined($value); + return bless(\$self); +} + +sub Version { + return $VERSION; +} + +sub Get { + if( IsBitmap() ) { return GetBitmap(); } + elsif( IsFiles() ) { return GetFiles(); } + else { return GetText(); } +} + +sub TIESCALAR { + my $class = shift; + my $value = shift; + Set($value) if defined $value; + my $self = "I'm the Clipboard!"; + return bless \$self, $class; +} + +sub FETCH { Get() } +sub STORE { shift; Set(@_) } + +sub DESTROY { + my($self) = @_; + undef $self; + StopClipboardViewer(); +} + +END { + StopClipboardViewer(); +} + +####################################################################### +# dynamically load in the Clipboard.pll module. +# + +bootstrap Win32::Clipboard; + +####################################################################### +# a little hack to use the module itself as a class. +# + +sub main::Win32::Clipboard { + my($value) = @_; + my $self={}; + my $result = Win32::Clipboard::Set($value) if defined($value); + return bless($self, "Win32::Clipboard"); +} + +1; + +__END__ + +=head1 NAME + +Win32::Clipboard - Interaction with the Windows clipboard + +=head1 SYNOPSIS + + use Win32::Clipboard; + + $CLIP = Win32::Clipboard(); + + print "Clipboard contains: ", $CLIP->Get(), "\n"; + + $CLIP->Set("some text to copy into the clipboard"); + + $CLIP->Empty(); + + $CLIP->WaitForChange(); + print "Clipboard has changed!\n"; + + +=head1 DESCRIPTION + +This module lets you interact with the Windows clipboard: you can get its content, +set it, empty it, or let your script sleep until it changes. +This version supports 3 formats for clipboard data: + +=over 4 + +=item * +text (C<CF_TEXT>) + +The clipboard contains some text; this is the B<only> format you can use to set +clipboard data; you get it as a single string. + +Example: + + $text = Win32::Clipboard::GetText(); + print $text; + +=item * +bitmap (C<CF_DIB>) + +The clipboard contains an image, either a bitmap or a picture copied in the +clipboard from a graphic application. The data you get is a binary buffer +ready to be written to a bitmap (BMP format) file. + +Example: + + $image = Win32::Clipboard::GetBitmap(); + open BITMAP, ">some.bmp"; + binmode BITMAP; + print BITMAP $image; + close BITMAP; + +=item * +list of files (C<CF_HDROP>) + +The clipboard contains files copied or cutted from an Explorer-like +application; you get a list of filenames. + +Example: + + @files = Win32::Clipboard::GetFiles(); + print join("\n", @files); + +=back + +=head2 REFERENCE + +All the functions can be used either with their full name (eg. B<Win32::Clipboard::Get>) +or as methods of a C<Win32::Clipboard> object. +For the syntax, refer to L</SYNOPSIS> above. Note also that you can create a clipboard +object and set its content at the same time with: + + $CLIP = Win32::Clipboard("blah blah blah"); + +or with the more common form: + + $CLIP = new Win32::Clipboard("blah blah blah"); + +If you prefer, you can even tie the Clipboard to a variable like this: + + tie $CLIP, 'Win32::Clipboard'; + + print "Clipboard content: $CLIP\n"; + + $CLIP = "some text to copy to the clipboard..."; + +In this case, you can still access other methods using the tied() function: + + tied($CLIP)->Empty; + print "got the picture" if tied($CLIP)->IsBitmap; + +=over 4 + +=item Empty() + +Empty the clipboard. + +=for html <P> + +=item EnumFormats() + +Returns an array of identifiers describing the format for the data currently in the +clipboard. Formats can be standard ones (described in the L</CONSTANTS> section) or +application-defined custom ones. See also IsFormatAvailable(). + +=for html <P> + +=item Get() + +Returns the clipboard content; note that the result depends on the nature of +clipboard data; to ensure that you get only the desired format, you should use +GetText(), GetBitmap() or GetFiles() instead. Get() is in fact implemented as: + + if( IsBitmap() ) { return GetBitmap(); } + elsif( IsFiles() ) { return GetFiles(); } + else { return GetText(); } + +See also IsBitmap(), IsFiles(), IsText(), EnumFormats() and IsFormatAvailable() +to check the clipboard format before getting data. + +=for html <P> + +=item GetAs(FORMAT) + +Returns the clipboard content in the desired FORMAT (can be one of the constants +defined in the L</CONSTANTS> section or a custom format). Note that the only +meaningful identifiers are C<CF_TEXT>, C<CF_DIB> and C<CF_HDROP>; any other +format is treated as a string. + +=for html <P> + +=item GetBitmap() + +Returns the clipboard content as an image, or C<undef> on errors. + +=for html <P> + +=item GetFiles() + +Returns the clipboard content as a list of filenames, or C<undef> on errors. + +=for html <P> + +=item GetFormatName(FORMAT) + +Returns the name of the specified custom clipboard format, or C<undef> on errors; +note that you cannot get the name of the standard formats (described in the +L</CONSTANTS> section). + +=for html <P> + +=item GetText() + +Returns the clipboard content as a string, or C<undef> on errors. + +=for html <P> + +=item IsBitmap() + +Returns a boolean value indicating if the clipboard contains an image. +See also GetBitmap(). + +=for html <P> + +=item IsFiles() + +Returns a boolean value indicating if the clipboard contains a list of +files. See also GetFiles(). + +=for html <P> + +=item IsFormatAvailable(FORMAT) + +Checks if the clipboard data matches the specified FORMAT (one of the constants +described in the L</CONSTANTS> section); returns zero if the data does not match, +a nonzero value if it matches. + +=for html <P> + +=item IsText() + +Returns a boolean value indicating if the clipboard contains text. +See also GetText(). + +=for html <P> + +=item Set(VALUE) + +Set the clipboard content to the specified string. + +=for html <P> + +=item WaitForChange([TIMEOUT]) + +This function halts the script until the clipboard content changes. If you specify +a C<TIMEOUT> value (in milliseconds), the function will return when this timeout +expires, even if the clipboard hasn't changed. If no value is given, it will wait +indefinitely. Returns 1 if the clipboard has changed, C<undef> on errors. + +=back + +=head2 CONSTANTS + +These constants are the standard clipboard formats recognized by Win32::Clipboard: + + CF_TEXT 1 + CF_DIB 8 + CF_HDROP 15 + +The following formats are B<not recognized> by Win32::Clipboard; they are, +however, exported constants and can eventually be used with the EnumFormats(), +IsFormatAvailable() and GetAs() functions: + + CF_BITMAP 2 + CF_METAFILEPICT 3 + CF_SYLK 4 + CF_DIF 5 + CF_TIFF 6 + CF_OEMTEXT 7 + CF_PALETTE 9 + CF_PENDATA 10 + CF_RIFF 11 + CF_WAVE 12 + CF_UNICODETEXT 13 + CF_ENHMETAFILE 14 + CF_LOCALE 16 + +=head1 AUTHOR + +This version was released by Hideyo Imazu <F<himazu@gmail.com>>. + +Aldo Calpini <F<dada@perl.it>> was the former maintainer. + +Original XS porting by Gurusamy Sarathy <F<gsar@activestate.com>>. + +=cut + + diff --git a/Master/tlpkg/tlperl.old/lib/Win32/Console.pm b/Master/tlpkg/tlperl.old/lib/Win32/Console.pm new file mode 100644 index 00000000000..1e3876a6a33 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/Console.pm @@ -0,0 +1,1463 @@ +####################################################################### +# +# Win32::Console - Win32 Console and Character Mode Functions +# +####################################################################### + +package Win32::Console; + +require Exporter; +require DynaLoader; + +$VERSION = "0.07"; + +@ISA= qw( Exporter DynaLoader ); +@EXPORT = qw( + BACKGROUND_BLUE + BACKGROUND_GREEN + BACKGROUND_INTENSITY + BACKGROUND_RED + CAPSLOCK_ON + CONSOLE_TEXTMODE_BUFFER + CTRL_BREAK_EVENT + CTRL_C_EVENT + ENABLE_ECHO_INPUT + ENABLE_LINE_INPUT + ENABLE_MOUSE_INPUT + ENABLE_PROCESSED_INPUT + ENABLE_PROCESSED_OUTPUT + ENABLE_WINDOW_INPUT + ENABLE_WRAP_AT_EOL_OUTPUT + ENHANCED_KEY + FILE_SHARE_READ + FILE_SHARE_WRITE + FOREGROUND_BLUE + FOREGROUND_GREEN + FOREGROUND_INTENSITY + FOREGROUND_RED + LEFT_ALT_PRESSED + LEFT_CTRL_PRESSED + NUMLOCK_ON + GENERIC_READ + GENERIC_WRITE + RIGHT_ALT_PRESSED + RIGHT_CTRL_PRESSED + SCROLLLOCK_ON + SHIFT_PRESSED + STD_INPUT_HANDLE + STD_OUTPUT_HANDLE + STD_ERROR_HANDLE + $FG_BLACK + $FG_GRAY + $FG_BLUE + $FG_LIGHTBLUE + $FG_RED + $FG_LIGHTRED + $FG_GREEN + $FG_LIGHTGREEN + $FG_MAGENTA + $FG_LIGHTMAGENTA + $FG_CYAN + $FG_LIGHTCYAN + $FG_BROWN + $FG_YELLOW + $FG_LIGHTGRAY + $FG_WHITE + $BG_BLACK + $BG_GRAY + $BG_BLUE + $BG_LIGHTBLUE + $BG_RED + $BG_LIGHTRED + $BG_GREEN + $BG_LIGHTGREEN + $BG_MAGENTA + $BG_LIGHTMAGENTA + $BG_CYAN + $BG_LIGHTCYAN + $BG_BROWN + $BG_YELLOW + $BG_LIGHTGRAY + $BG_WHITE + $ATTR_NORMAL + $ATTR_INVERSE + @CONSOLE_COLORS +); + + +####################################################################### +# This AUTOLOAD is used to 'autoload' constants from the constant() +# XS function. If a constant is not found then control is passed +# to the AUTOLOAD in AutoLoader. +# + +sub AUTOLOAD { + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + #reset $! to zero to reset any current errors. + local $! = 0; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($! != 0) { +# if ($! =~ /Invalid/) { +# $AutoLoader::AUTOLOAD = $AUTOLOAD; +# goto &AutoLoader::AUTOLOAD; +# } else { + ($pack, $file, $line) = caller; undef $pack; + die "Symbol Win32::Console::$constname not defined, used at $file line $line."; +# } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + + +####################################################################### +# STATIC OBJECT PROPERTIES +# + +# %HandlerRoutineStack = (); +# $HandlerRoutineRegistered = 0; + +####################################################################### +# PUBLIC METHODS +# + +#======== +sub new { +#======== + my($class, $param1, $param2) = @_; + + my $self = {}; + + if (defined($param1) + and ($param1 == constant("STD_INPUT_HANDLE", 0) + or $param1 == constant("STD_OUTPUT_HANDLE", 0) + or $param1 == constant("STD_ERROR_HANDLE", 0))) + { + $self->{'handle'} = _GetStdHandle($param1); + } + else { + $param1 = constant("GENERIC_READ", 0) | constant("GENERIC_WRITE", 0) unless $param1; + $param2 = constant("FILE_SHARE_READ", 0) | constant("FILE_SHARE_WRITE", 0) unless $param2; + $self->{'handle'} = _CreateConsoleScreenBuffer($param1, $param2, + constant("CONSOLE_TEXTMODE_BUFFER", 0)); + } + bless $self, $class; + return $self; +} + +#============ +sub Display { +#============ + my($self) = @_; + return undef unless ref($self); + return _SetConsoleActiveScreenBuffer($self->{'handle'}); +} + +#=========== +sub Select { +#=========== + my($self, $type) = @_; + return undef unless ref($self); + return _SetStdHandle($type, $self->{'handle'}); +} + +#=========== +sub SetIcon { +#=========== + my($self, $icon) = @_; + $icon = $self unless ref($self); + return _SetConsoleIcon($icon); +} + +#========== +sub Title { +#========== + my($self, $title) = @_; + $title = $self unless ref($self); + + if (defined($title)) { + return _SetConsoleTitle($title); + } + else { + return _GetConsoleTitle(); + } +} + +#============== +sub WriteChar { +#============== + my($self, $text, $col, $row) = @_; + return undef unless ref($self); + return _WriteConsoleOutputCharacter($self->{'handle'},$text,$col,$row); +} + +#============= +sub ReadChar { +#============= + my($self, $size, $col, $row) = @_; + return undef unless ref($self); + + my $buffer = (" " x $size); + if (_ReadConsoleOutputCharacter($self->{'handle'}, $buffer, $size, $col, $row)) { + return $buffer; + } + else { + return undef; + } +} + +#============== +sub WriteAttr { +#============== + my($self, $attr, $col, $row) = @_; + return undef unless ref($self); + return _WriteConsoleOutputAttribute($self->{'handle'}, $attr, $col, $row); +} + +#============= +sub ReadAttr { +#============= + my($self, $size, $col, $row) = @_; + return undef unless ref($self); + return _ReadConsoleOutputAttribute($self->{'handle'}, $size, $col, $row); +} + +#========== +sub Write { +#========== + my($self,$string) = @_; + return undef unless ref($self); + return _WriteConsole($self->{'handle'}, $string); +} + +#============= +sub ReadRect { +#============= + my($self, $left, $top, $right, $bottom) = @_; + return undef unless ref($self); + + my $col = $right - $left + 1; + my $row = $bottom - $top + 1; + + my $buffer = (" " x ($col*$row*4)); + if (_ReadConsoleOutput($self->{'handle'}, $buffer, + $col, $row, 0, 0, + $left, $top, $right, $bottom)) + { + return $buffer; + } + else { + return undef; + } +} + +#============== +sub WriteRect { +#============== + my($self, $buffer, $left, $top, $right, $bottom) = @_; + return undef unless ref($self); + + my $col = $right - $left + 1; + my $row = $bottom - $top + 1; + + return _WriteConsoleOutput($self->{'handle'}, $buffer, + $col, $row, 0, 0, + $left, $top, $right, $bottom); +} + +#=========== +sub Scroll { +#=========== + my($self, $left1, $top1, $right1, $bottom1, + $col, $row, $char, $attr, + $left2, $top2, $right2, $bottom2) = @_; + return undef unless ref($self); + + return _ScrollConsoleScreenBuffer($self->{'handle'}, + $left1, $top1, $right1, $bottom1, + $col, $row, $char, $attr, + $left2, $top2, $right2, $bottom2); +} + +#============== +sub MaxWindow { +#============== + my($self, $flag) = @_; + return undef unless ref($self); + + if (not defined($flag)) { + my @info = _GetConsoleScreenBufferInfo($self->{'handle'}); + return $info[9], $info[10]; + } + else { + return _GetLargestConsoleWindowSize($self->{'handle'}); + } +} + +#========= +sub Info { +#========= + my($self) = @_; + return undef unless ref($self); + return _GetConsoleScreenBufferInfo($self->{'handle'}); +} + +#=========== +sub Window { +#=========== + my($self, $flag, $left, $top, $right, $bottom) = @_; + return undef unless ref($self); + + if (not defined($flag)) { + my @info = _GetConsoleScreenBufferInfo($self->{'handle'}); + return $info[5], $info[6], $info[7], $info[8]; + } + else { + return _SetConsoleWindowInfo($self->{'handle'}, $flag, $left, $top, $right, $bottom); + } +} + +#============== +sub GetEvents { +#============== + my($self) = @_; + return undef unless ref($self); + return _GetNumberOfConsoleInputEvents($self->{'handle'}); +} + +#========== +sub Flush { +#========== + my($self) = @_; + return undef unless ref($self); + return _FlushConsoleInputBuffer($self->{'handle'}); +} + +#============== +sub InputChar { +#============== + my($self, $number) = @_; + return undef unless ref($self); + + $number = 1 unless defined($number); + + my $buffer = (" " x $number); + if (_ReadConsole($self->{'handle'}, $buffer, $number) == $number) { + return $buffer; + } + else { + return undef; + } +} + +#========== +sub Input { +#========== + my($self) = @_; + return undef unless ref($self); + return _ReadConsoleInput($self->{'handle'}); +} + +#============== +sub PeekInput { +#============== + my($self) = @_; + return undef unless ref($self); + return _PeekConsoleInput($self->{'handle'}); +} + +#=============== +sub WriteInput { +#=============== + my($self) = shift; + return undef unless ref($self); + return _WriteConsoleInput($self->{'handle'}, @_); +} + +#========= +sub Mode { +#========= + my($self, $mode) = @_; + return undef unless ref($self); + if (defined($mode)) { + return _SetConsoleMode($self->{'handle'}, $mode); + } + else { + return _GetConsoleMode($self->{'handle'}); + } +} + +#======== +sub Cls { +#======== + my($self, $attr) = @_; + return undef unless ref($self); + + $attr = $ATTR_NORMAL unless defined($attr); + + my ($x, $y) = $self->Size(); + my($left, $top, $right ,$bottom) = $self->Window(); + my $vx = $right - $left; + my $vy = $bottom - $top; + $self->FillChar(" ", $x*$y, 0, 0); + $self->FillAttr($attr, $x*$y, 0, 0); + $self->Cursor(0, 0); + $self->Window(1, 0, 0, $vx, $vy); +} + +#========= +sub Attr { +#========= + my($self, $attr) = @_; + return undef unless ref($self); + + if (not defined($attr)) { + return (_GetConsoleScreenBufferInfo($self->{'handle'}))[4]; + } + else { + return _SetConsoleTextAttribute($self->{'handle'}, $attr); + } +} + +#=========== +sub Cursor { +#=========== + my($self, $col, $row, $size, $visi) = @_; + return undef unless ref($self); + + my $curr_row = 0; + my $curr_col = 0; + my $curr_size = 0; + my $curr_visi = 0; + my $return = 0; + my $discard = 0; + + + if (defined($col)) { + $row = -1 if not defined($row); + if ($col == -1 or $row == -1) { + ($discard, $discard, $curr_col, $curr_row) = _GetConsoleScreenBufferInfo($self->{'handle'}); + $col=$curr_col if $col==-1; + $row=$curr_row if $row==-1; + } + $return += _SetConsoleCursorPosition($self->{'handle'}, $col, $row); + if (defined($size) and defined($visi)) { + if ($size == -1 or $visi == -1) { + ($curr_size, $curr_visi) = _GetConsoleCursorInfo($self->{'handle'}); + $size = $curr_size if $size == -1; + $visi = $curr_visi if $visi == -1; + } + $size = 1 if $size < 1; + $size = 99 if $size > 99; + $return += _SetConsoleCursorInfo($self->{'handle'}, $size, $visi); + } + return $return; + } + else { + ($discard, $discard, $curr_col, $curr_row) = _GetConsoleScreenBufferInfo($self->{'handle'}); + ($curr_size, $curr_visi) = _GetConsoleCursorInfo($self->{'handle'}); + return ($curr_col, $curr_row, $curr_size, $curr_visi); + } +} + +#========= +sub Size { +#========= + my($self, $col, $row) = @_; + return undef unless ref($self); + + if (not defined($col)) { + ($col, $row) = _GetConsoleScreenBufferInfo($self->{'handle'}); + return ($col, $row); + } + else { + $row = -1 if not defined($row); + if ($col == -1 or $row == -1) { + ($curr_col, $curr_row) = _GetConsoleScreenBufferInfo($self->{'handle'}); + $col=$curr_col if $col==-1; + $row=$curr_row if $row==-1; + } + return _SetConsoleScreenBufferSize($self->{'handle'}, $col, $row); + } +} + +#============= +sub FillAttr { +#============= + my($self, $attr, $number, $col, $row) = @_; + return undef unless ref($self); + + $number = 1 unless $number; + + if (!defined($col) or !defined($row) or $col == -1 or $row == -1) { + ($discard, $discard, + $curr_col, $curr_row) = _GetConsoleScreenBufferInfo($self->{'handle'}); + $col = $curr_col if !defined($col) or $col == -1; + $row = $curr_row if !defined($row) or $row == -1; + } + return _FillConsoleOutputAttribute($self->{'handle'}, $attr, $number, $col, $row); +} + +#============= +sub FillChar { +#============= + my($self, $char, $number, $col, $row) = @_; + return undef unless ref($self); + + if (!defined($col) or !defined($row) or $col == -1 or $row == -1) { + ($discard, $discard, + $curr_col, $curr_row) = _GetConsoleScreenBufferInfo($self->{'handle'}); + $col = $curr_col if !defined($col) or $col == -1; + $row = $curr_row if !defined($row) or $row == -1; + } + return _FillConsoleOutputCharacter($self->{'handle'}, $char, $number, $col, $row); +} + +#============ +sub InputCP { +#============ + my($self, $codepage) = @_; + $codepage = $self if (defined($self) and ref($self) ne "Win32::Console"); + if (defined($codepage)) { + return _SetConsoleCP($codepage); + } + else { + return _GetConsoleCP(); + } +} + +#============= +sub OutputCP { +#============= + my($self, $codepage) = @_; + $codepage = $self if (defined($self) and ref($self) ne "Win32::Console"); + if (defined($codepage)) { + return _SetConsoleOutputCP($codepage); + } + else { + return _GetConsoleOutputCP(); + } +} + +#====================== +sub GenerateCtrlEvent { +#====================== + my($self, $type, $pid) = @_; + $type = constant("CTRL_C_EVENT", 0) unless defined($type); + $pid = 0 unless defined($pid); + return _GenerateConsoleCtrlEvent($type, $pid); +} + +#=================== +#sub SetCtrlHandler { +#=================== +# my($name, $add) = @_; +# $add = 1 unless defined($add); +# my @nor = keys(%HandlerRoutineStack); +# if ($add == 0) { +# foreach $key (@nor) { +# delete $HandlerRoutineStack{$key}, last if $HandlerRoutineStack{$key}==$name; +# } +# $HandlerRoutineRegistered--; +# } else { +# if ($#nor == -1) { +# my $r = _SetConsoleCtrlHandler(); +# if (!$r) { +# print "WARNING: SetConsoleCtrlHandler failed...\n"; +# } +# } +# $HandlerRoutineRegistered++; +# $HandlerRoutineStack{$HandlerRoutineRegistered} = $name; +# } +#} + +#=================== +sub get_Win32_IPC_HANDLE { # So Win32::IPC can wait on a console handle +#=================== + $_[0]->{'handle'}; +} + +######################################################################## +# PRIVATE METHODS +# + +#================ +#sub CtrlHandler { +#================ +# my($ctrltype) = @_; +# my $routine; +# my $result = 0; +# CALLEM: foreach $routine (sort { $b <=> $a } keys %HandlerRoutineStack) { +# #print "CtrlHandler: calling $HandlerRoutineStack{$routine}($ctrltype)\n"; +# $result = &{"main::".$HandlerRoutineStack{$routine}}($ctrltype); +# last CALLEM if $result; +# } +# return $result; +#} + +#============ +sub DESTROY { +#============ + my($self) = @_; + _CloseHandle($self->{'handle'}); +} + +####################################################################### +# dynamically load in the Console.pll module. +# + +bootstrap Win32::Console; + +####################################################################### +# ADDITIONAL CONSTANTS EXPORTED IN THE MAIN NAMESPACE +# + +$FG_BLACK = 0; +$FG_GRAY = constant("FOREGROUND_INTENSITY",0); +$FG_BLUE = constant("FOREGROUND_BLUE",0); +$FG_LIGHTBLUE = constant("FOREGROUND_BLUE",0)| + constant("FOREGROUND_INTENSITY",0); +$FG_RED = constant("FOREGROUND_RED",0); +$FG_LIGHTRED = constant("FOREGROUND_RED",0)| + constant("FOREGROUND_INTENSITY",0); +$FG_GREEN = constant("FOREGROUND_GREEN",0); +$FG_LIGHTGREEN = constant("FOREGROUND_GREEN",0)| + constant("FOREGROUND_INTENSITY",0); +$FG_MAGENTA = constant("FOREGROUND_RED",0)| + constant("FOREGROUND_BLUE",0); +$FG_LIGHTMAGENTA = constant("FOREGROUND_RED",0)| + constant("FOREGROUND_BLUE",0)| + constant("FOREGROUND_INTENSITY",0); +$FG_CYAN = constant("FOREGROUND_GREEN",0)| + constant("FOREGROUND_BLUE",0); +$FG_LIGHTCYAN = constant("FOREGROUND_GREEN",0)| + constant("FOREGROUND_BLUE",0)| + constant("FOREGROUND_INTENSITY",0); +$FG_BROWN = constant("FOREGROUND_RED",0)| + constant("FOREGROUND_GREEN",0); +$FG_YELLOW = constant("FOREGROUND_RED",0)| + constant("FOREGROUND_GREEN",0)| + constant("FOREGROUND_INTENSITY",0); +$FG_LIGHTGRAY = constant("FOREGROUND_RED",0)| + constant("FOREGROUND_GREEN",0)| + constant("FOREGROUND_BLUE",0); +$FG_WHITE = constant("FOREGROUND_RED",0)| + constant("FOREGROUND_GREEN",0)| + constant("FOREGROUND_BLUE",0)| + constant("FOREGROUND_INTENSITY",0); + +$BG_BLACK = 0; +$BG_GRAY = constant("BACKGROUND_INTENSITY",0); +$BG_BLUE = constant("BACKGROUND_BLUE",0); +$BG_LIGHTBLUE = constant("BACKGROUND_BLUE",0)| + constant("BACKGROUND_INTENSITY",0); +$BG_RED = constant("BACKGROUND_RED",0); +$BG_LIGHTRED = constant("BACKGROUND_RED",0)| + constant("BACKGROUND_INTENSITY",0); +$BG_GREEN = constant("BACKGROUND_GREEN",0); +$BG_LIGHTGREEN = constant("BACKGROUND_GREEN",0)| + constant("BACKGROUND_INTENSITY",0); +$BG_MAGENTA = constant("BACKGROUND_RED",0)| + constant("BACKGROUND_BLUE",0); +$BG_LIGHTMAGENTA = constant("BACKGROUND_RED",0)| + constant("BACKGROUND_BLUE",0)| + constant("BACKGROUND_INTENSITY",0); +$BG_CYAN = constant("BACKGROUND_GREEN",0)| + constant("BACKGROUND_BLUE",0); +$BG_LIGHTCYAN = constant("BACKGROUND_GREEN",0)| + constant("BACKGROUND_BLUE",0)| + constant("BACKGROUND_INTENSITY",0); +$BG_BROWN = constant("BACKGROUND_RED",0)| + constant("BACKGROUND_GREEN",0); +$BG_YELLOW = constant("BACKGROUND_RED",0)| + constant("BACKGROUND_GREEN",0)| + constant("BACKGROUND_INTENSITY",0); +$BG_LIGHTGRAY = constant("BACKGROUND_RED",0)| + constant("BACKGROUND_GREEN",0)| + constant("BACKGROUND_BLUE",0); +$BG_WHITE = constant("BACKGROUND_RED",0)| + constant("BACKGROUND_GREEN",0)| + constant("BACKGROUND_BLUE",0)| + constant("BACKGROUND_INTENSITY",0); + +$ATTR_NORMAL = $FG_LIGHTGRAY|$BG_BLACK; +$ATTR_INVERSE = $FG_BLACK|$BG_LIGHTGRAY; + +for my $fg ($FG_BLACK, $FG_GRAY, $FG_BLUE, $FG_GREEN, + $FG_CYAN, $FG_RED, $FG_MAGENTA, $FG_BROWN, + $FG_LIGHTBLUE, $FG_LIGHTGREEN, $FG_LIGHTCYAN, + $FG_LIGHTRED, $FG_LIGHTMAGENTA, $FG_YELLOW, + $FG_LIGHTGRAY, $FG_WHITE) +{ + for my $bg ($BG_BLACK, $BG_GRAY, $BG_BLUE, $BG_GREEN, + $BG_CYAN, $BG_RED, $BG_MAGENTA, $BG_BROWN, + $BG_LIGHTBLUE, $BG_LIGHTGREEN, $BG_LIGHTCYAN, + $BG_LIGHTRED, $BG_LIGHTMAGENTA, $BG_YELLOW, + $BG_LIGHTGRAY, $BG_WHITE) + { + push(@CONSOLE_COLORS, $fg|$bg); + } +} + +# Preloaded methods go here. + +#Currently Autoloading is not implemented in Perl for win32 +# Autoload methods go after __END__, and are processed by the autosplit program. + +1; + +__END__ + +=head1 NAME + +Win32::Console - Win32 Console and Character Mode Functions + + +=head1 DESCRIPTION + +This module implements the Win32 console and character mode +functions. They give you full control on the console input and output, +including: support of off-screen console buffers (eg. multiple screen +pages) + +=over + +=item * + +reading and writing of characters, attributes and whole portions of +the screen + +=item * + +complete processing of keyboard and mouse events + +=item * + +some very funny additional features :) + +=back + +Those functions should also make possible a port of the Unix's curses +library; if there is anyone interested (and/or willing to contribute) +to this project, e-mail me. Thank you. + + +=head1 REFERENCE + + +=head2 Methods + +=over + +=item Alloc + +Allocates a new console for the process. Returns C<undef> on errors, a +nonzero value on success. A process cannot be associated with more +than one console, so this method will fail if there is already an +allocated console. Use Free to detach the process from the console, +and then call Alloc to create a new console. See also: C<Free> + +Example: + + $CONSOLE->Alloc(); + +=item Attr [attr] + +Gets or sets the current console attribute. This attribute is used by +the Write method. + +Example: + + $attr = $CONSOLE->Attr(); + $CONSOLE->Attr($FG_YELLOW | $BG_BLUE); + +=item Close + +Closes a shortcut object. Note that it is not "strictly" required to +close the objects you created, since the Win32::Shortcut objects are +automatically closed when the program ends (or when you elsehow +destroy such an object). + +Example: + + $LINK->Close(); + +=item Cls [attr] + +Clear the console, with the specified I<attr> if given, or using +ATTR_NORMAL otherwise. + +Example: + + $CONSOLE->Cls(); + $CONSOLE->Cls($FG_WHITE | $BG_GREEN); + +=item Cursor [x, y, size, visible] + +Gets or sets cursor position and appearance. Returns C<undef> on +errors, or a 4-element list containing: I<x>, I<y>, I<size>, +I<visible>. I<x> and I<y> are the current cursor position; ... + +Example: + + ($x, $y, $size, $visible) = $CONSOLE->Cursor(); + + # Get position only + ($x, $y) = $CONSOLE->Cursor(); + + $CONSOLE->Cursor(40, 13, 50, 1); + + # Set position only + $CONSOLE->Cursor(40, 13); + + # Set size and visibility without affecting position + $CONSOLE->Cursor(-1, -1, 50, 1); + +=item Display + +Displays the specified console on the screen. Returns C<undef> on errors, +a nonzero value on success. + +Example: + + $CONSOLE->Display(); + +=item FillAttr [attribute, number, col, row] + +Fills the specified number of consecutive attributes, beginning at +I<col>, I<row>, with the value specified in I<attribute>. Returns the +number of attributes filled, or C<undef> on errors. See also: +C<FillChar>. + +Example: + + $CONSOLE->FillAttr($FG_BLACK | $BG_BLACK, 80*25, 0, 0); + +=item FillChar char, number, col, row + +Fills the specified number of consecutive characters, beginning at +I<col>, I<row>, with the character specified in I<char>. Returns the +number of characters filled, or C<undef> on errors. See also: +C<FillAttr>. + +Example: + + $CONSOLE->FillChar("X", 80*25, 0, 0); + +=item Flush + +Flushes the console input buffer. All the events in the buffer are +discarded. Returns C<undef> on errors, a nonzero value on success. + +Example: + + $CONSOLE->Flush(); + +=item Free + +Detaches the process from the console. Returns C<undef> on errors, a +nonzero value on success. See also: C<Alloc>. + +Example: + + $CONSOLE->Free(); + +=item GenerateCtrlEvent [type, processgroup] + +Sends a break signal of the specified I<type> to the specified +I<processgroup>. I<type> can be one of the following constants: + + CTRL_BREAK_EVENT + CTRL_C_EVENT + +they signal, respectively, the pressing of Control + Break and of +Control + C; if not specified, it defaults to CTRL_C_EVENT. +I<processgroup> is the pid of a process sharing the same console. If +omitted, it defaults to 0 (the current process), which is also the +only meaningful value that you can pass to this function. Returns +C<undef> on errors, a nonzero value on success. + +Example: + + # break this script now + $CONSOLE->GenerateCtrlEvent(); + +=item GetEvents + +Returns the number of unread input events in the console's input +buffer, or C<undef> on errors. See also: C<Input>, C<InputChar>, +C<PeekInput>, C<WriteInput>. + +Example: + + $events = $CONSOLE->GetEvents(); + +=item Info + +Returns an array of informations about the console (or C<undef> on +errors), which contains: + +=over + +=item * + +columns (X size) of the console buffer. + +=item * + +rows (Y size) of the console buffer. + +=item * + +current column (X position) of the cursor. + +=item * + +current row (Y position) of the cursor. + +=item * + +current attribute used for C<Write>. + +=item * + +left column (X of the starting point) of the current console window. + +=item * + +top row (Y of the starting point) of the current console window. + +=item * + +right column (X of the final point) of the current console window. + +=item * + +bottom row (Y of the final point) of the current console window. + +=item * + +maximum number of columns for the console window, given the current +buffer size, font and the screen size. + +=item * + +maximum number of rows for the console window, given the current +buffer size, font and the screen size. + +=back + +See also: C<Attr>, C<Cursor>, C<Size>, C<Window>, C<MaxWindow>. + +Example: + + @info = $CONSOLE->Info(); + print "Cursor at $info[3], $info[4].\n"; + +=item Input + +Reads an event from the input buffer. Returns a list of values, which +depending on the event's nature are: + +=over + +=item keyboard event + +The list will contain: + +=over + +=item * + +event type: 1 for keyboard + +=item * + +key down: TRUE if the key is being pressed, FALSE if the key is being released + +=item * + +repeat count: the number of times the key is being held down + +=item * + +virtual keycode: the virtual key code of the key + +=item * + +virtual scancode: the virtual scan code of the key + +=item * + +char: the ASCII code of the character (if the key is a character key, 0 otherwise) + +=item * + +control key state: the state of the control keys (SHIFTs, CTRLs, ALTs, etc.) + +=back + +=item mouse event + +The list will contain: + +=over + +=item * + +event type: 2 for mouse + +=item * + +mouse pos. X: X coordinate (column) of the mouse location + +=item * + +mouse pos. Y: Y coordinate (row) of the mouse location + +=item * + +button state: the mouse button(s) which are pressed + +=item * + +control key state: the state of the control keys (SHIFTs, CTRLs, ALTs, etc.) + +=item * + +event flags: the type of the mouse event + +=back + +=back + +This method will return C<undef> on errors. Note that the events +returned are depending on the input C<Mode> of the console; for example, +mouse events are not intercepted unless ENABLE_MOUSE_INPUT is +specified. See also: C<GetEvents>, C<InputChar>, C<Mode>, +C<PeekInput>, C<WriteInput>. + +Example: + + @event = $CONSOLE->Input(); + +=item InputChar number + +Reads and returns I<number> characters from the console input buffer, +or C<undef> on errors. See also: C<Input>, C<Mode>. + +Example: + + $key = $CONSOLE->InputChar(1); + +=item InputCP [codepage] + +Gets or sets the input code page used by the console. Note that this +doesn't apply to a console object, but to the standard input +console. This attribute is used by the Write method. See also: +C<OutputCP>. + +Example: + + $codepage = $CONSOLE->InputCP(); + $CONSOLE->InputCP(437); + + # you may want to use the non-instanciated form to avoid confuzion :) + $codepage = Win32::Console::InputCP(); + Win32::Console::InputCP(437); + +=item MaxWindow + +Returns the size of the largest possible console window, based on the +current font and the size of the display. The result is C<undef> on +errors, otherwise a 2-element list containing col, row. + +Example: + + ($maxCol, $maxRow) = $CONSOLE->MaxWindow(); + +=item Mode [flags] + +Gets or sets the input or output mode of a console. I<flags> can be a +combination of the following constants: + + ENABLE_LINE_INPUT + ENABLE_ECHO_INPUT + ENABLE_PROCESSED_INPUT + ENABLE_WINDOW_INPUT + ENABLE_MOUSE_INPUT + ENABLE_PROCESSED_OUTPUT + ENABLE_WRAP_AT_EOL_OUTPUT + +For more informations on the meaning of those flags, please refer to +the L<"Microsoft's Documentation">. + +Example: + + $mode = $CONSOLE->Mode(); + $CONSOLE->Mode(ENABLE_MOUSE_INPUT | ENABLE_PROCESSED_INPUT); + +=item MouseButtons + +Returns the number of the buttons on your mouse, or C<undef> on errors. + +Example: + + print "Your mouse has ", $CONSOLE->MouseButtons(), " buttons.\n"; + +=item new Win32::Console standard_handle + +=item new Win32::Console [accessmode, sharemode] + +Creates a new console object. The first form creates a handle to a +standard channel, I<standard_handle> can be one of the following: + + STD_OUTPUT_HANDLE + STD_ERROR_HANDLE + STD_INPUT_HANDLE + +The second form, instead, creates a console screen buffer in memory, +which you can access for reading and writing as a normal console, and +then redirect on the standard output (the screen) with C<Display>. In +this case, you can specify one or both of the following values for +I<accessmode>: + + GENERIC_READ + GENERIC_WRITE + +which are the permissions you will have on the created buffer, and one +or both of the following values for I<sharemode>: + + FILE_SHARE_READ + FILE_SHARE_WRITE + +which affect the way the console can be shared. If you don't specify +any of those parameters, all 4 flags will be used. + +Example: + + $STDOUT = new Win32::Console(STD_OUTPUT_HANDLE); + $STDERR = new Win32::Console(STD_ERROR_HANDLE); + $STDIN = new Win32::Console(STD_INPUT_HANDLE); + + $BUFFER = new Win32::Console(); + $BUFFER = new Win32::Console(GENERIC_READ | GENERIC_WRITE); + +=item OutputCP [codepage] + +Gets or sets the output code page used by the console. Note that this +doesn't apply to a console object, but to the standard output console. +See also: C<InputCP>. + +Example: + + $codepage = $CONSOLE->OutputCP(); + $CONSOLE->OutputCP(437); + + # you may want to use the non-instanciated form to avoid confuzion :) + $codepage = Win32::Console::OutputCP(); + Win32::Console::OutputCP(437); + +=item PeekInput + +Does exactly the same as C<Input>, except that the event read is not +removed from the input buffer. See also: C<GetEvents>, C<Input>, +C<InputChar>, C<Mode>, C<WriteInput>. + +Example: + + @event = $CONSOLE->PeekInput(); + +=item ReadAttr [number, col, row] + +Reads the specified I<number> of consecutive attributes, beginning at +I<col>, I<row>, from the console. Returns the attributes read (a +variable containing one character for each attribute), or C<undef> on +errors. You can then pass the returned variable to C<WriteAttr> to +restore the saved attributes on screen. See also: C<ReadChar>, +C<ReadRect>. + +Example: + + $colors = $CONSOLE->ReadAttr(80*25, 0, 0); + +=item ReadChar [number, col, row] + +Reads the specified I<number> of consecutive characters, beginning at +I<col>, I<row>, from the console. Returns a string containing the +characters read, or C<undef> on errors. You can then pass the +returned variable to C<WriteChar> to restore the saved characters on +screen. See also: C<ReadAttr>, C<ReadRect>. + +Example: + + $chars = $CONSOLE->ReadChar(80*25, 0, 0); + +=item ReadRect left, top, right, bottom + +Reads the content (characters and attributes) of the rectangle +specified by I<left>, I<top>, I<right>, I<bottom> from the console. +Returns a string containing the rectangle read, or C<undef> on errors. +You can then pass the returned variable to C<WriteRect> to restore the +saved rectangle on screen (or on another console). See also: +C<ReadAttr>, C<ReadChar>. + +Example: + + $rect = $CONSOLE->ReadRect(0, 0, 80, 25); + +=item Scroll left, top, right, bottom, col, row, char, attr, + [cleft, ctop, cright, cbottom] + +Moves a block of data in a console buffer; the block is identified by +I<left>, I<top>, I<right>, I<bottom>, while I<row>, I<col> identify +the new location of the block. The cells left empty as a result of +the move are filled with the character I<char> and attribute I<attr>. +Optionally you can specify a clipping region with I<cleft>, I<ctop>, +I<cright>, I<cbottom>, so that the content of the console outside this +rectangle are unchanged. Returns C<undef> on errors, a nonzero value +on success. + +Example: + + # scrolls the screen 10 lines down, filling with black spaces + $CONSOLE->Scroll(0, 0, 80, 25, 0, 10, " ", $FG_BLACK | $BG_BLACK); + +=item Select standard_handle + +Redirects a standard handle to the specified console. +I<standard_handle> can have one of the following values: + + STD_INPUT_HANDLE + STD_OUTPUT_HANDLE + STD_ERROR_HANDLE + +Returns C<undef> on errors, a nonzero value on success. + +Example: + + $CONSOLE->Select(STD_OUTPUT_HANDLE); + +=item SetIcon icon_file + +Sets the icon in the title bar of the current console window. + +Example: + + $CONSOLE->SetIcon("C:/My/Path/To/Custom.ico"); + +=item Size [col, row] + +Gets or sets the console buffer size. + +Example: + + ($x, $y) = $CONSOLE->Size(); + $CONSOLE->Size(80, 25); + +=item Title [title] + +Gets or sets the title of the current console window. + +Example: + + $title = $CONSOLE->Title(); + $CONSOLE->Title("This is a title"); + +=item Window [flag, left, top, right, bottom] + +Gets or sets the current console window size. If called without +arguments, returns a 4-element list containing the current window +coordinates in the form of I<left>, I<top>, I<right>, I<bottom>. To +set the window size, you have to specify an additional I<flag> +parameter: if it is 0 (zero), coordinates are considered relative to +the current coordinates; if it is non-zero, coordinates are absolute. + +Example: + + ($left, $top, $right, $bottom) = $CONSOLE->Window(); + $CONSOLE->Window(1, 0, 0, 80, 50); + +=item Write string + +Writes I<string> on the console, using the current attribute, that you +can set with C<Attr>, and advancing the cursor as needed. This isn't +so different from Perl's "print" statement. Returns the number of +characters written or C<undef> on errors. See also: C<WriteAttr>, +C<WriteChar>, C<WriteRect>. + +Example: + + $CONSOLE->Write("Hello, world!"); + +=item WriteAttr attrs, col, row + +Writes the attributes in the string I<attrs>, beginning at I<col>, +I<row>, without affecting the characters that are on screen. The +string attrs can be the result of a C<ReadAttr> function, or you can +build your own attribute string; in this case, keep in mind that every +attribute is treated as a character, not a number (see example). +Returns the number of attributes written or C<undef> on errors. See +also: C<Write>, C<WriteChar>, C<WriteRect>. + +Example: + + $CONSOLE->WriteAttr($attrs, 0, 0); + + # note the use of chr()... + $attrs = chr($FG_BLACK | $BG_WHITE) x 80; + $CONSOLE->WriteAttr($attrs, 0, 0); + +=item WriteChar chars, col, row + +Writes the characters in the string I<attr>, beginning at I<col>, I<row>, +without affecting the attributes that are on screen. The string I<chars> +can be the result of a C<ReadChar> function, or a normal string. Returns +the number of characters written or C<undef> on errors. See also: +C<Write>, C<WriteAttr>, C<WriteRect>. + +Example: + + $CONSOLE->WriteChar("Hello, worlds!", 0, 0); + +=item WriteInput (event) + +Pushes data in the console input buffer. I<(event)> is a list of values, +for more information see C<Input>. The string chars can be the result of +a C<ReadChar> function, or a normal string. Returns the number of +characters written or C<undef> on errors. See also: C<Write>, +C<WriteAttr>, C<WriteRect>. + +Example: + + $CONSOLE->WriteInput(@event); + +=item WriteRect rect, left, top, right, bottom + +Writes a rectangle of characters and attributes (contained in I<rect>) +on the console at the coordinates specified by I<left>, I<top>, +I<right>, I<bottom>. I<rect> can be the result of a C<ReadRect> +function. Returns C<undef> on errors, otherwise a 4-element list +containing the coordinates of the affected rectangle, in the format +I<left>, I<top>, I<right>, I<bottom>. See also: C<Write>, +C<WriteAttr>, C<WriteChar>. + +Example: + + $CONSOLE->WriteRect($rect, 0, 0, 80, 25); + +=back + + +=head2 Constants + +The following constants are exported in the main namespace of your +script using Win32::Console: + + BACKGROUND_BLUE + BACKGROUND_GREEN + BACKGROUND_INTENSITY + BACKGROUND_RED + CAPSLOCK_ON + CONSOLE_TEXTMODE_BUFFER + ENABLE_ECHO_INPUT + ENABLE_LINE_INPUT + ENABLE_MOUSE_INPUT + ENABLE_PROCESSED_INPUT + ENABLE_PROCESSED_OUTPUT + ENABLE_WINDOW_INPUT + ENABLE_WRAP_AT_EOL_OUTPUT + ENHANCED_KEY + FILE_SHARE_READ + FILE_SHARE_WRITE + FOREGROUND_BLUE + FOREGROUND_GREEN + FOREGROUND_INTENSITY + FOREGROUND_RED + LEFT_ALT_PRESSED + LEFT_CTRL_PRESSED + NUMLOCK_ON + GENERIC_READ + GENERIC_WRITE + RIGHT_ALT_PRESSED + RIGHT_CTRL_PRESSED + SCROLLLOCK_ON + SHIFT_PRESSED + STD_INPUT_HANDLE + STD_OUTPUT_HANDLE + STD_ERROR_HANDLE + +Additionally, the following variables can be used: + + $FG_BLACK + $FG_GRAY + $FG_BLUE + $FG_LIGHTBLUE + $FG_RED + $FG_LIGHTRED + $FG_GREEN + $FG_LIGHTGREEN + $FG_MAGENTA + $FG_LIGHTMAGENTA + $FG_CYAN + $FG_LIGHTCYAN + $FG_BROWN + $FG_YELLOW + $FG_LIGHTGRAY + $FG_WHITE + + $BG_BLACK + $BG_GRAY + $BG_BLUE + $BG_LIGHTBLUE + $BG_RED + $BG_LIGHTRED + $BG_GREEN + $BG_LIGHTGREEN + $BG_MAGENTA + $BG_LIGHTMAGENTA + $BG_CYAN + $BG_LIGHTCYAN + $BG_BROWN + $BG_YELLOW + $BG_LIGHTGRAY + $BG_WHITE + + $ATTR_NORMAL + $ATTR_INVERSE + +ATTR_NORMAL is set to gray foreground on black background (DOS's +standard colors). + + +=head2 Microsoft's Documentation + +Documentation for the Win32 Console and Character mode Functions can +be found on Microsoft's site at this URL: + +http://www.microsoft.com/msdn/sdk/platforms/doc/sdk/win32/sys/src/conchar.htm + +A reference of the available functions is at: + +http://www.microsoft.com/msdn/sdk/platforms/doc/sdk/win32/sys/src/conchar_34.htm + + +=head1 AUTHOR + +Aldo Calpini <a.calpini@romagiubileo.it> + +=head1 CREDITS + +Thanks to: Jesse Dougherty, Dave Roth, ActiveWare, and the +Perl-Win32-Users community. + +=head1 DISCLAIMER + +This program is FREE; you can redistribute, modify, disassemble, or +even reverse engineer this software at your will. Keep in mind, +however, that NOTHING IS GUARANTEED to work and everything you do is +AT YOUR OWN RISK - I will not take responsibility for any damage, loss +of money and/or health that may arise from the use of this program! + +This is distributed under the terms of Larry Wall's Artistic License. diff --git a/Master/tlpkg/tlperl.old/lib/Win32/Event.pm b/Master/tlpkg/tlperl.old/lib/Win32/Event.pm new file mode 100644 index 00000000000..5faddf5a76e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/Event.pm @@ -0,0 +1,104 @@ +#--------------------------------------------------------------------- +package Win32::Event; +# +# Copyright 1998 Christopher J. Madsen +# +# Author: Christopher J. Madsen <cjm@pobox.com> +# Created: 3 Feb 1998 from the ActiveWare version +# Version: 1.00 (6-Feb-1998) +# +# This program is free software; you can redistribute it and/or modify +# it under the same terms as Perl itself. +# +# 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 either the +# GNU General Public License or the Artistic License for more details. +# +# Use Win32 event objects for synchronization +#--------------------------------------------------------------------- + +$VERSION = '1.01'; + +use Win32::IPC 1.00 '/./'; # Import everything +require Exporter; +require DynaLoader; + +@ISA = qw(Exporter DynaLoader Win32::IPC); +@EXPORT_OK = qw( + wait_all wait_any INFINITE +); + +bootstrap Win32::Event; + +1; +__END__ + +=head1 NAME + +Win32::Event - Use Win32 event objects from Perl + +=head1 SYNOPSIS + + use Win32::Event; + + $event = Win32::Event->new($manual,$initial,$name); + $event->wait(); + +=head1 DESCRIPTION + +This module allows access to the Win32 event objects. The C<wait> +method and C<wait_all> & C<wait_any> functions are inherited from the +L<"Win32::IPC"> module. + +=head2 Methods + +=over 4 + +=item $event = Win32::Event->new([$manual, [$initial, [$name]]]) + +Constructor for a new event object. If C<$manual> is true, you must +manually reset the event after it is signalled (the default is false). +If C<$initial> is true, the initial state of the object is signalled +(default false). If C<$name> is omitted, creates an unnamed event +object. + +If C<$name> signifies an existing event object, then C<$manual> and +C<$initial> are ignored and the object is opened. If this happens, +C<$^E> will be set to 183 (ERROR_ALREADY_EXISTS). + +=item $event = Win32::Event->open($name) + +Constructor for opening an existing event object. + +=item $event->pulse + +Signal the C<$event> and then immediately reset it. If C<$event> is a +manual-reset event, releases all threads currently blocking on it. If +it's an auto-reset event, releases just one thread. + +If no threads are waiting, just resets the event. + +=item $event->reset + +Reset the C<$event> to nonsignalled. + +=item $event->set + +Set the C<$event> to signalled. + +=item $event->wait([$timeout]) + +Wait for C<$event> to be signalled. See L<"Win32::IPC">. + +=back + +=head1 AUTHOR + +Christopher J. Madsen E<lt>F<cjm@pobox.com>E<gt> + +=cut + +# Local Variables: +# tmtrack-file-task: "Win32::Event" +# End: diff --git a/Master/tlpkg/tlperl.old/lib/Win32/EventLog.pm b/Master/tlpkg/tlperl.old/lib/Win32/EventLog.pm new file mode 100644 index 00000000000..141821556e7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/EventLog.pm @@ -0,0 +1,471 @@ +# +# EventLog.pm +# +# Creates an object oriented interface to the Windows NT Evenlog +# Written by Jesse Dougherty +# + +package Win32::EventLog; + +use strict; +use vars qw($VERSION $AUTOLOAD @ISA @EXPORT $GetMessageText); +$VERSION = '0.074'; + +require Exporter; +require DynaLoader; + +die "The Win32::Eventlog module works only on Windows NT" + unless Win32::IsWinNT(); + +@ISA= qw(Exporter DynaLoader); +@EXPORT = qw( + EVENTLOG_AUDIT_FAILURE + EVENTLOG_AUDIT_SUCCESS + EVENTLOG_BACKWARDS_READ + EVENTLOG_END_ALL_PAIRED_EVENTS + EVENTLOG_END_PAIRED_EVENT + EVENTLOG_ERROR_TYPE + EVENTLOG_FORWARDS_READ + EVENTLOG_INFORMATION_TYPE + EVENTLOG_PAIRED_EVENT_ACTIVE + EVENTLOG_PAIRED_EVENT_INACTIVE + EVENTLOG_SEEK_READ + EVENTLOG_SEQUENTIAL_READ + EVENTLOG_START_PAIRED_EVENT + EVENTLOG_SUCCESS + EVENTLOG_WARNING_TYPE +); + +$GetMessageText=0; + +sub AUTOLOAD { + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + # reset $! to zero to reset any current errors. + local $! = 0; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($!) { + if ($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + my ($pack,$file,$line) = caller; + die "Unknown Win32::EventLog macro $constname, at $file line $line.\n"; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + +# +# new() +# +# Win32::EventLog->new("source name", "ServerName"); +# +sub new { + die "usage: PACKAGE->new(SOURCENAME[, SERVERNAME])\n" unless @_ > 1; + my ($class,$source,$server) = @_; + my $handle; + + # Create new handle + if ($source !~ /\\/) { + OpenEventLog($handle, $server, $source); + } + else { + OpenBackupEventLog($handle, $server, $source); + } + return bless {handle => $handle, + Source => $source, + Computer => $server} => $class; +} + +sub DESTROY {shift->Close} + +# +# Open (the rather braindead old way) +# A variable initialized to empty must be supplied as the first +# arg, followed by whatever new() takes +# +sub Open { + $_[0] = Win32::EventLog->new($_[1],$_[2]); +} + +sub OpenBackup { + my ($class,$source,$server) = @_; + OpenBackupEventLog(my $handle, $server, $source); + return bless {handle => $handle, + Source => $source, + Computer => $server} => $class; +} + +sub Backup { + die " usage: OBJECT->Backup(FILENAME)\n" unless @_ == 2; + my ($self,$file) = @_; + return BackupEventLog($self->{handle}, $file); +} + +sub Close { + my $self = shift; + CloseEventLog($self->{handle}); + $self->{handle} = 0; +} + +# Read +# Note: the EventInfo arguement requires a hash reference. +sub Read { + my $self = shift; + + die "usage: OBJECT->Read(FLAGS, RECORDOFFSET, HASHREF)\n" unless @_ == 3; + + my ($readflags,$recordoffset) = @_; + # The following is stolen shamelessly from Wyt's tests for the registry. + my $result = ReadEventLog($self->{handle}, $readflags, $recordoffset, + my $header, my $source, my $computer, my $sid, + my $data, my $strings); + my ($length, + $reserved, + $recordnumber, + $timegenerated, + $timewritten, + $eventid, + $eventtype, + $numstrings, + $eventcategory, + $reservedflags, + $closingrecordnumber, + $stringoffset, + $usersidlength, + $usersidoffset, + $datalength, + $dataoffset) = unpack('l6s4l6', $header); + + # make a hash out of the values returned from ReadEventLog. + my %h = ( Source => $source, + Computer => $computer, + Length => $datalength, + Category => $eventcategory, + RecordNumber => $recordnumber, + TimeGenerated => $timegenerated, + Timewritten => $timewritten, + EventID => $eventid, + EventType => $eventtype, + ClosingRecordNumber => $closingrecordnumber, + User => $sid, + Strings => $strings, + Data => $data, + ); + + # get the text message here + if ($result and $GetMessageText) { + GetEventLogText($source, $eventid, $strings, $numstrings, my $message); + $h{Message} = $message; + } + + if (ref($_[2]) eq 'HASH') { + %{$_[2]} = %h; # this needed for Read(...,\%foo) case + } + else { + $_[2] = \%h; + } + return $result; +} + +sub GetMessageText { + my $self = shift; + local $^W; + GetEventLogText($self->{Source}, + $self->{EventID}, + $self->{Strings}, + $self->{Strings} =~ tr/\0/\0/, + my $message); + + $self->{Message} = $message; + return $message; +} + +sub Report { + die "usage: OBJECT->Report( HASHREF )\n" unless @_ == 2; + my ($self,$EventInfo) = @_; + + die "Win32::EventLog::Report requires a hash reference as arg 2\n" + unless ref($EventInfo) eq "HASH"; + + my $computer = $EventInfo->{Computer} ? $EventInfo->{Computer} + : $self->{Computer}; + my $source = exists($EventInfo->{Source}) ? $EventInfo->{Source} + : $self->{Source}; + + return WriteEventLog($computer, $source, $EventInfo->{EventType}, + $EventInfo->{Category}, $EventInfo->{EventID}, 0, + $EventInfo->{Data}, split(/\0/, $EventInfo->{Strings})); + +} + +sub GetOldest { + my $self = shift; + die "usage: OBJECT->GetOldest( SCALAREF )\n" unless @_ == 1; + return GetOldestEventLogRecord($self->{handle},$_[0]); +} + +sub GetNumber { + my $self = shift; + die "usage: OBJECT->GetNumber( SCALARREF )\n" unless @_ == 1; + return GetNumberOfEventLogRecords($self->{handle}, $_[0]); +} + +sub Clear { + my ($self,$file) = @_; + die "usage: OBJECT->Clear( FILENAME )\n" unless @_ == 2; + return ClearEventLog($self->{handle}, $file); +} + +bootstrap Win32::EventLog; + +1; +__END__ + +=head1 NAME + +Win32::EventLog - Process Win32 Event Logs from Perl + +=head1 SYNOPSIS + + use Win32::EventLog + $handle=Win32::EventLog->new("Application"); + +=head1 DESCRIPTION + +This module implements most of the functionality available from the +Win32 API for accessing and manipulating Win32 Event Logs. The access +to the EventLog routines is divided into those that relate to an +EventLog object and its associated methods and those that relate other +EventLog tasks (like adding an EventLog record). + +=head1 The EventLog Object and its Methods + +The following methods are available to open, read, close and backup +EventLogs. + +=over 4 + +=item Win32::EventLog->new(SOURCENAME [,SERVERNAME]); + +The new() method creates a new EventLog object and returns a handle +to it. This hande is then used to call the methods below. + +The method is overloaded in that if the supplied SOURCENAME +argument contains one or more literal '\' characters (an illegal +character in a SOURCENAME), it assumes that you are trying to open +a backup eventlog and uses SOURCENAME as the backup eventlog to +open. Note that when opening a backup eventlog, the SERVERNAME +argument is ignored (as it is in the underlying Win32 API). For +EventLogs on remote machines, the SOURCENAME parameter must +therefore be specified as a UNC path. + +=item $handle->Backup(FILENAME); + +The Backup() method backs up the EventLog represented by $handle. It +takes a single arguemt, FILENAME. When $handle represents an +EventLog on a remote machine, FILENAME is filename on the remote +machine and cannot be a UNC path (i.e you must use F<C:\TEMP\App.EVT>). +The method will fail if the log file already exists. + +=item $handle->Read(FLAGS, OFFSET, HASHREF); + +The Read() method read an EventLog entry from the EventLog represented +by $handle. + +=item $handle->Close(); + +The Close() method closes the EventLog represented by $handle. After +Close() has been called, any further attempt to use the EventLog +represented by $handle will fail. + +=item $handle->GetOldest(SCALARREF); + +The GetOldest() method number of the the oldest EventLog record in +the EventLog represented by $handle. This is required to correctly +compute the OFFSET required by the Read() method. + +=item $handle->GetNumber(SCALARREF); + +The GetNumber() method returns the number of EventLog records in +the EventLog represented by $handle. The number of the most recent +record in the EventLog is therefore computed by + + $handle->GetOldest($oldest); + $handle->GetNumber($lastRec); + $lastRecOffset=$oldest+$lastRec; + +=item $handle->Clear(FILENAME); + +The Clear() method clears the EventLog represented by $handle. If +you provide a non-null FILENAME, the EventLog will be backed up +into FILENAME before the EventLog is cleared. The method will fail +if FILENAME is specified and the file refered to exists. Note also +that FILENAME specifies a file local to the machine on which the +EventLog resides and cannot be specified as a UNC name. + +=item $handle->Report(HASHREF); + +The Report() method generates an EventLog entry. The HASHREF should +contain the following keys: + +=over 4 + +=item C<Computer> + +The C<Computer> field specfies which computer you want the EventLog +entry recorded. If this key doesn't exist, the server name used to +create the $handle is used. + +=item C<Source> + +The C<Source> field specifies the source that generated the EventLog +entry. If this key doesn't exist, the source name used to create the +$handle is used. + +=item C<EventType> + +The C<EventType> field should be one of the constants + +=over 4 + +=item C<EVENTLOG_ERROR_TYPE> + +An Error event is being logged. + +=item C<EVENTLOG_WARNING_TYPE> + +A Warning event is being logged. + +=item C<EVENTLOG_INFORMATION_TYPE> + +An Information event is being logged. + +=item C<EVENTLOG_AUDIT_SUCCESS> + +A Success Audit event is being logged (typically in the Security +EventLog). + +=item C<EVENTLOG_AUDIT_FAILURE> + +A Failure Audit event is being logged (typically in the Security +EventLog). + +=back + +These constants are exported into the main namespace by default. + +=item C<Category> + +The C<Category> field can have any value you want. It is specific to +the particular Source. + +=item C<EventID> + +The C<EventID> field should contain the ID of the message that this +event pertains too. This assumes that you have an associated message +file (indirectly referenced by the field C<Source>). + +=item C<Data> + +The C<Data> field contains raw data associated with this event. + +=item C<Strings> + +The C<Strings> field contains the single string that itself contains +NUL terminated sub-strings. This are used with the EventID to generate +the message as seen from (for example) the Event Viewer application. + +=back + +=back + +=head1 Other Win32::EventLog functions. + +The following functions are part of the Win32::EventLog package but +are not callable from an EventLog object. + +=over 4 + +=item GetMessageText(HASHREF); + +The GetMessageText() function assumes that HASHREF was obtained by +a call to C<$handle-E<gt>Read()>. It returns the formatted string that +represents the fully resolved text of the EventLog message (such as +would be seen in the Windows NT Event Viewer). For convenience, the +key 'Message' in the supplied HASHREF is also set to the return value +of this function. + +If you set the variable $Win32::EventLog::GetMessageText to 1 then +each call to C<$handle-E<gt>Read()> will call this function automatically. + +=back + +=head1 Example 1 + +The following example illustrates the way in which the EventLog module +can be used. It opens the System EventLog and reads through it from +oldest to newest records. For each record from the B<Source> EventLog +it extracts the full text of the Entry and prints the EventLog message +text out. + + use Win32::EventLog; + + $handle=Win32::EventLog->new("System", $ENV{ComputerName}) + or die "Can't open Application EventLog\n"; + $handle->GetNumber($recs) + or die "Can't get number of EventLog records\n"; + $handle->GetOldest($base) + or die "Can't get number of oldest EventLog record\n"; + + while ($x < $recs) { + $handle->Read(EVENTLOG_FORWARDS_READ|EVENTLOG_SEEK_READ, + $base+$x, + $hashRef) + or die "Can't read EventLog entry #$x\n"; + if ($hashRef->{Source} eq "EventLog") { + Win32::EventLog::GetMessageText($hashRef); + print "Entry $x: $hashRef->{Message}\n"; + } + $x++; + } + +=head1 Example 2 + +To backup and clear the EventLogs on a remote machine, do the following :- + + use Win32::EventLog; + + $myServer="\\\\my-server"; # your servername here. + my($date)=join("-", ((split(/\s+/, scalar(localtime)))[0,1,2,4])); + my($dest); + + for my $eventLog ("Application", "System", "Security") { + $handle=Win32::EventLog->new($eventLog, $myServer) + or die "Can't open Application EventLog on $myServer\n"; + + $dest="C:\\BackupEventLogs\\$eventLog\\$date.evt"; + $handle->Backup($dest) + or warn "Could not backup and clear the $eventLog EventLog on $myServer ($^E)\n"; + + $handle->Close; + } + +Note that only the Clear method is required. Note also that if the +file $dest exists, the function will fail. + +=head1 BUGS + +None currently known. + +The test script for 'make test' should be re-written to use the +EventLog object. + +=head1 AUTHOR + +Original code by Jesse Dougherty for HiP Communications. Additional +fixes and updates attributed to Martin Pauley +<martin.pauley@ulsterbank.ltd.uk>) and Bret Giddings (bret@essex.ac.uk). diff --git a/Master/tlpkg/tlperl.old/lib/Win32/File.pm b/Master/tlpkg/tlperl.old/lib/Win32/File.pm new file mode 100644 index 00000000000..d67a25448c8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/File.pm @@ -0,0 +1,118 @@ +package Win32::File; + +# +# File.pm +# Written by Douglas_Lankshear@ActiveWare.com +# +# subsequent hacks: +# Gurusamy Sarathy +# + +$VERSION = '0.05'; + +require Exporter; +require DynaLoader; + +@ISA= qw( Exporter DynaLoader ); +@EXPORT = qw( + ARCHIVE + COMPRESSED + DIRECTORY + HIDDEN + NORMAL + OFFLINE + READONLY + SYSTEM + TEMPORARY + ); +@EXPORT_OK = qw(GetAttributes SetAttributes); + +=head1 NAME + +Win32::File - manage file attributes in perl + +=head1 SYNOPSIS + + use Win32::File; + +=head1 DESCRIPTION + +This module offers the retrieval and setting of file attributes. + +=head1 Functions + +=head2 NOTE + +All of the functions return FALSE (0) if they fail, unless otherwise noted. +The function names are exported into the caller's namespace by request. + +=over 10 + +=item GetAttributes(filename, returnedAttributes) + +Gets the attributes of a file or directory. returnedAttributes will be set +to the OR-ed combination of the filename attributes. + +=item SetAttributes(filename, newAttributes) + +Sets the attributes of a file or directory. newAttributes must be an OR-ed +combination of the attributes. + +=back + +=head1 Constants + +The following constants are exported by default. + +=over 10 + +=item ARCHIVE + +=item COMPRESSED + +=item DIRECTORY + +=item HIDDEN + +=item NORMAL + +=item OFFLINE + +=item READONLY + +=item SYSTEM + +=item TEMPORARY + +=back + +=cut + +sub AUTOLOAD +{ + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + #reset $! to zero to reset any current errors. + local $! = 0; + my $val = constant($constname); + if($! != 0) + { + if($! =~ /Invalid/) + { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else + { + ($pack,$file,$line) = caller; + die "Your vendor has not defined Win32::File macro $constname, used in $file at line $line."; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + +bootstrap Win32::File; + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Win32/FileSecurity.pm b/Master/tlpkg/tlperl.old/lib/Win32/FileSecurity.pm new file mode 100644 index 00000000000..6c6e5865336 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/FileSecurity.pm @@ -0,0 +1,308 @@ +package Win32::FileSecurity; + +# +# FileSecurity.pm +# By Monte Mitzelfelt, monte@conchas.nm.org +# Larry Wall's Artistic License applies to all related Perl +# and C code for this module +# Thanks to the guys at ActiveWare! +# ver 0.67 ALPHA 1997.07.07 +# + +require Exporter; +require DynaLoader; +use Carp ; + +$VERSION = '1.04'; + +require Win32 unless defined &Win32::IsWinNT; +croak "The Win32::FileSecurity module works only on Windows NT" unless Win32::IsWinNT(); + +@ISA= qw( Exporter DynaLoader ); + +require Exporter ; +require DynaLoader ; + +@ISA = qw(Exporter DynaLoader) ; +@EXPORT_OK = qw( + Get + Set + EnumerateRights + MakeMask + DELETE + READ_CONTROL + WRITE_DAC + WRITE_OWNER + SYNCHRONIZE + STANDARD_RIGHTS_REQUIRED + STANDARD_RIGHTS_READ + STANDARD_RIGHTS_WRITE + STANDARD_RIGHTS_EXECUTE + STANDARD_RIGHTS_ALL + SPECIFIC_RIGHTS_ALL + ACCESS_SYSTEM_SECURITY + MAXIMUM_ALLOWED + GENERIC_READ + GENERIC_WRITE + GENERIC_EXECUTE + GENERIC_ALL + F + FULL + R + READ + C + CHANGE + A + ADD + ) ; + +sub AUTOLOAD { + local($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + #reset $! to zero to reset any current errors. + local $! = 0; + $val = constant($constname); + if($! != 0) { + if($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + ($pack,$file,$line) = caller; + die "Your vendor has not defined Win32::FileSecurity macro " + ."$constname, used in $file at line $line."; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + +bootstrap Win32::FileSecurity; + +1; + +__END__ + +=head1 NAME + +Win32::FileSecurity - manage FileSecurity Discretionary Access Control Lists in perl + +=head1 SYNOPSIS + + use Win32::FileSecurity; + +=head1 DESCRIPTION + +This module offers control over the administration of system FileSecurity DACLs. +You may want to use Get and EnumerateRights to get an idea of what mask values +correspond to what rights as viewed from File Manager. + +=head1 CONSTANTS + + DELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNER, + SYNCHRONIZE, STANDARD_RIGHTS_REQUIRED, + STANDARD_RIGHTS_READ, STANDARD_RIGHTS_WRITE, + STANDARD_RIGHTS_EXECUTE, STANDARD_RIGHTS_ALL, + SPECIFIC_RIGHTS_ALL, ACCESS_SYSTEM_SECURITY, + MAXIMUM_ALLOWED, GENERIC_READ, GENERIC_WRITE, + GENERIC_EXECUTE, GENERIC_ALL, F, FULL, R, READ, + C, CHANGE + +=head1 FUNCTIONS + +=head2 NOTE: + +All of the functions return false if they fail, unless otherwise noted. +Errors returned via $! containing both Win32 GetLastError() and a text message +indicating Win32 function that failed. + +=over 10 + +=item constant( $name, $set ) + +Stores the value of named constant $name into $set. +Same as C<$set = Win32::FileSecurity::NAME_OF_CONSTANT();>. + +=item Get( $filename, \%permisshash ) + +Gets the DACLs of a file or directory. + +=item Set( $filename, \%permisshash ) + +Sets the DACL for a file or directory. + +=item EnumerateRights( $mask, \@rightslist ) + +Turns the bitmask in $mask into a list of strings in @rightslist. + +=item MakeMask( qw( DELETE READ_CONTROL ) ) + +Takes a list of strings representing constants and returns a bitmasked +integer value. + +=back + +=head2 %permisshash + +Entries take the form $permisshash{USERNAME} = $mask ; + +=head1 EXAMPLE1 + + # Gets the rights for all files listed on the command line. + use Win32::FileSecurity qw(Get EnumerateRights); + + foreach( @ARGV ) { + next unless -e $_ ; + if ( Get( $_, \%hash ) ) { + while( ($name, $mask) = each %hash ) { + print "$name:\n\t"; + EnumerateRights( $mask, \@happy ) ; + print join( "\n\t", @happy ), "\n"; + } + } + else { + print( "Error #", int( $! ), ": $!" ) ; + } + } + +=head1 EXAMPLE2 + + # Gets existing DACL and modifies Administrator rights + use Win32::FileSecurity qw(MakeMask Get Set); + + # These masks show up as Full Control in File Manager + $file = MakeMask( qw( FULL ) ); + + $dir = MakeMask( qw( + FULL + GENERIC_ALL + ) ); + + foreach( @ARGV ) { + s/\\$//; + next unless -e; + Get( $_, \%hash ) ; + $hash{Administrator} = ( -d ) ? $dir : $file ; + Set( $_, \%hash ) ; + } + +=head1 COMMON MASKS FROM CACLS AND WINFILE + +=head2 READ + + MakeMask( qw( FULL ) ); # for files + MakeMask( qw( READ GENERIC_READ GENERIC_EXECUTE ) ); # for directories + +=head2 CHANGE + + MakeMask( qw( CHANGE ) ); # for files + MakeMask( qw( CHANGE GENERIC_WRITE GENERIC_READ GENERIC_EXECUTE ) ); # for directories + +=head2 ADD & READ + + MakeMask( qw( ADD GENERIC_READ GENERIC_EXECUTE ) ); # for directories only! + +=head2 FULL + + MakeMask( qw( FULL ) ); # for files + MakeMask( qw( FULL GENERIC_ALL ) ); # for directories + +=head1 RESOURCES + +From Microsoft: check_sd + http://premium.microsoft.com/download/msdn/samples/2760.exe + +(thanks to Guert Schimmel at Sybase for turning me on to this one) + +=head1 VERSION + +1.03 ALPHA 97-12-14 + +=head1 REVISION NOTES + +=over 10 + +=item 1.03 ALPHA 1998.01.11 + +Imported diffs from 0.67 (parent) version + +=item 1.02 ALPHA 1997.12.14 + +Pod fixes, @EXPORT list additions <gsar@activestate.com> + +Fix unitialized vars on unknown ACLs <jmk@exc.bybyte.de> + +=item 1.01 ALPHA 1997.04.25 + +CORE Win32 version imported from 0.66 <gsar@activestate.com> + +=item 0.67 ALPHA 1997.07.07 + +Kludged bug in mapping bits to separate ACE's. Notably, this screwed +up CHANGE access by leaving out a delete bit in the +C<INHERIT_ONLY_ACE | OBJECT_INHERIT_ACE> Access Control Entry. + +May need to rethink... + +=item 0.66 ALPHA 1997.03.13 + +Fixed bug in memory allocation check + +=item 0.65 ALPHA 1997.02.25 + +Tested with 5.003 build 303 + +Added ISA exporter, and @EXPORT_OK + +Added F, FULL, R, READ, C, CHANGE as composite pre-built mask names. + +Added server\ to keys returned in hash from Get + +Made constants and MakeMask case insensitive (I don't know why I did that) + +Fixed mask comparison in ListDacl and Enumerate Rights from simple & mask +to exact bit match ! ( ( x & y ) ^ x ) makes sure all bits in x +are set in y + +Fixed some "wild" pointers + +=item 0.60 ALPHA 1996.07.31 + +Now suitable for file and directory permissions + +Included ListDacl.exe in bundle for debugging + +Added "intuitive" inheritance for directories, basically functions like FM +triggered by presence of GENERIC_ rights this may need to change + +see EXAMPLE2 + +Changed from AddAccessAllowedAce to AddAce for control over inheritance + +=item 0.51 ALPHA 1996.07.20 + +Fixed memory allocation bug + +=item 0.50 ALPHA 1996.07.29 + +Base functionality + +Using AddAccessAllowedAce + +Suitable for file permissions + +=back + +=head1 KNOWN ISSUES / BUGS + +=over 10 + +=item 1 + +May not work on remote drives. + +=item 2 + +Errors croak, don't return via $! as documented. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Win32/IPC.pm b/Master/tlpkg/tlperl.old/lib/Win32/IPC.pm new file mode 100644 index 00000000000..c97279b24c5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/IPC.pm @@ -0,0 +1,195 @@ +#--------------------------------------------------------------------- +package Win32::IPC; +# +# Copyright 1998 Christopher J. Madsen +# +# Created: 3 Feb 1998 from the ActiveWare version +# (c) 1995 Microsoft Corporation. All rights reserved. +# Developed by ActiveWare Internet Corp., http://www.ActiveWare.com +# +# Other modifications (c) 1997 by Gurusamy Sarathy <gsar@activestate.com> +# +# Author: Christopher J. Madsen <cjm@pobox.com> +# Version: 1.03 (11-Jul-2003) +# +# This program is free software; you can redistribute it and/or modify +# it under the same terms as Perl itself. +# +# 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 either the +# GNU General Public License or the Artistic License for more details. +# +# Base class for Win32 synchronization objects +#--------------------------------------------------------------------- + +$VERSION = '1.03'; + +require Exporter; +require DynaLoader; +use strict; +use vars qw($AUTOLOAD $VERSION @ISA @EXPORT @EXPORT_OK); + +@ISA = qw(Exporter DynaLoader); +@EXPORT = qw( + INFINITE + WaitForMultipleObjects +); +@EXPORT_OK = qw( + wait_any wait_all +); + +sub AUTOLOAD { + # This AUTOLOAD is used to 'autoload' constants from the constant() + # XS function. + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + local $! = 0; + my $val = constant($constname); + if ($! != 0) { + my ($pack,$file,$line) = caller; + die "Your vendor has not defined Win32::IPC macro $constname, used at $file line $line."; + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} # end AUTOLOAD + +bootstrap Win32::IPC; + +# How's this for cryptic? Use wait_any or wait_all! +sub WaitForMultipleObjects +{ + my $result = (($_[1] ? wait_all($_[0], $_[2]) + : wait_any($_[0], $_[2])) + ? 1 + : 0); + @{$_[0]} = (); # Bug for bug compatibility! Use wait_any or wait_all! + $result; +} # end WaitForMultipleObjects + +1; +__END__ + +=head1 NAME + +Win32::IPC - Base class for Win32 synchronization objects + +=head1 SYNOPSIS + + use Win32::Event 1.00 qw(wait_any); + #Create objects. + + wait_any(@ListOfObjects,$timeout); + +=head1 DESCRIPTION + +This module is loaded by the other Win32 synchronization modules. You +shouldn't need to load it yourself. It supplies the wait functions to +those modules. + +The synchronization modules are L<"Win32::ChangeNotify">, +L<"Win32::Event">, L<"Win32::Mutex">, & L<"Win32::Semaphore">. + +In addition, you can use C<wait_any> and C<wait_all> with +L<"Win32::Console"> and L<"Win32::Process"> objects. (However, those +modules do not export the wait functions; you must load one of the +synchronization modules (or just Win32::IPC)). + +=head2 Methods + +B<Win32::IPC> supplies one method to all synchronization objects. + +=over 4 + +=item $obj->wait([$timeout]) + +Waits for C<$obj> to become signalled. C<$timeout> is the maximum time +to wait (in milliseconds). If C<$timeout> is omitted, waits forever. +If C<$timeout> is 0, returns immediately. + +Returns: + + +1 The object is signalled + -1 The object is an abandoned mutex + 0 Timed out + undef An error occurred + +=back + +=head2 Functions + +=over 4 + +=item wait_any(@objects, [$timeout]) + +Waits for at least one of the C<@objects> to become signalled. +C<$timeout> is the maximum time to wait (in milliseconds). If +C<$timeout> is omitted, waits forever. If C<$timeout> is 0, returns +immediately. + +The return value indicates which object ended the wait: + + +N $object[N-1] is signalled + -N $object[N-1] is an abandoned mutex + 0 Timed out + undef An error occurred + +If more than one object became signalled, the one with the lowest +index is used. + +=item wait_all(@objects, [$timeout]) + +This is the same as C<wait_any>, but it waits for all the C<@objects> +to become signalled. The return value indicates the last object to +become signalled, and is negative if at least one of the C<@objects> +is an abandoned mutex. + +=back + +=head2 Deprecated Functions and Methods + +B<Win32::IPC> still supports the ActiveWare syntax, but its use is +deprecated. + +=over 4 + +=item INFINITE + +Constant value for an infinite timeout. Omit the C<$timeout> argument +instead. + +=item WaitForMultipleObjects(\@objects, $wait_all, $timeout) + +Warning: C<WaitForMultipleObjects> erases C<@objects>! +Use C<wait_all> or C<wait_any> instead. + +=item $obj->Wait($timeout) + +Similar to C<not $obj-E<gt>wait($timeout)>. + +=back + +=head1 INTERNALS + +The C<wait_any> and C<wait_all> functions support two kinds of +objects. Objects derived from C<Win32::IPC> are expected to consist +of a reference to a scalar containing the Win32 HANDLE as an IV. + +Other objects (for which C<UNIVERSAL::isa($object, "Win32::IPC")> is +false), are expected to implement a C<get_Win32_IPC_HANDLE> method. +When called in scalar context with no arguments, this method should +return a Win32 HANDLE (as an IV) suitable for passing to the Win32 +WaitForMultipleObjects API function. + +=head1 AUTHOR + +Christopher J. Madsen E<lt>F<cjm@pobox.com>E<gt> + +Loosely based on the original module by ActiveWare Internet Corp., +F<http://www.ActiveWare.com> + +=cut + +# Local Variables: +# tmtrack-file-task: "Win32::IPC" +# End: diff --git a/Master/tlpkg/tlperl.old/lib/Win32/Internet.pm b/Master/tlpkg/tlperl.old/lib/Win32/Internet.pm new file mode 100644 index 00000000000..f6dac3130af --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/Internet.pm @@ -0,0 +1,3009 @@ +####################################################################### +# +# Win32::Internet - Perl Module for Internet Extensions +# ^^^^^^^^^^^^^^^ +# This module creates an object oriented interface to the Win32 +# Internet Functions (WININET.DLL). +# +# Version: 0.08 (14 Feb 1997) +# Version: 0.081 (25 Sep 1999) +# Version: 0.082 (04 Sep 2001) +# +####################################################################### + +# changes: +# - fixed 2 bugs in Option(s) related subs +# - works with build 30x also + +package Win32::Internet; + +require Exporter; # to export the constants to the main:: space +require DynaLoader; # to dynuhlode the module. + +# use Win32::WinError; # for windows constants. + +@ISA= qw( Exporter DynaLoader ); +@EXPORT = qw( + HTTP_ADDREQ_FLAG_ADD + HTTP_ADDREQ_FLAG_REPLACE + HTTP_QUERY_ALLOW + HTTP_QUERY_CONTENT_DESCRIPTION + HTTP_QUERY_CONTENT_ID + HTTP_QUERY_CONTENT_LENGTH + HTTP_QUERY_CONTENT_TRANSFER_ENCODING + HTTP_QUERY_CONTENT_TYPE + HTTP_QUERY_COST + HTTP_QUERY_CUSTOM + HTTP_QUERY_DATE + HTTP_QUERY_DERIVED_FROM + HTTP_QUERY_EXPIRES + HTTP_QUERY_FLAG_REQUEST_HEADERS + HTTP_QUERY_FLAG_SYSTEMTIME + HTTP_QUERY_LANGUAGE + HTTP_QUERY_LAST_MODIFIED + HTTP_QUERY_MESSAGE_ID + HTTP_QUERY_MIME_VERSION + HTTP_QUERY_PRAGMA + HTTP_QUERY_PUBLIC + HTTP_QUERY_RAW_HEADERS + HTTP_QUERY_RAW_HEADERS_CRLF + HTTP_QUERY_REQUEST_METHOD + HTTP_QUERY_SERVER + HTTP_QUERY_STATUS_CODE + HTTP_QUERY_STATUS_TEXT + HTTP_QUERY_URI + HTTP_QUERY_USER_AGENT + HTTP_QUERY_VERSION + HTTP_QUERY_WWW_LINK + ICU_BROWSER_MODE + ICU_DECODE + ICU_ENCODE_SPACES_ONLY + ICU_ESCAPE + ICU_NO_ENCODE + ICU_NO_META + ICU_USERNAME + INTERNET_FLAG_PASSIVE + INTERNET_FLAG_ASYNC + INTERNET_HYPERLINK + INTERNET_FLAG_KEEP_CONNECTION + INTERNET_FLAG_MAKE_PERSISTENT + INTERNET_FLAG_NO_AUTH + INTERNET_FLAG_NO_AUTO_REDIRECT + INTERNET_FLAG_NO_CACHE_WRITE + INTERNET_FLAG_NO_COOKIES + INTERNET_FLAG_READ_PREFETCH + INTERNET_FLAG_RELOAD + INTERNET_FLAG_RESYNCHRONIZE + INTERNET_FLAG_TRANSFER_ASCII + INTERNET_FLAG_TRANSFER_BINARY + INTERNET_INVALID_PORT_NUMBER + INTERNET_INVALID_STATUS_CALLBACK + INTERNET_OPEN_TYPE_DIRECT + INTERNET_OPEN_TYPE_PROXY + INTERNET_OPEN_TYPE_PROXY_PRECONFIG + INTERNET_OPTION_CONNECT_BACKOFF + INTERNET_OPTION_CONNECT_RETRIES + INTERNET_OPTION_CONNECT_TIMEOUT + INTERNET_OPTION_CONTROL_SEND_TIMEOUT + INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT + INTERNET_OPTION_DATA_SEND_TIMEOUT + INTERNET_OPTION_DATA_RECEIVE_TIMEOUT + INTERNET_OPTION_HANDLE_SIZE + INTERNET_OPTION_LISTEN_TIMEOUT + INTERNET_OPTION_PASSWORD + INTERNET_OPTION_READ_BUFFER_SIZE + INTERNET_OPTION_USER_AGENT + INTERNET_OPTION_USERNAME + INTERNET_OPTION_VERSION + INTERNET_OPTION_WRITE_BUFFER_SIZE + INTERNET_SERVICE_FTP + INTERNET_SERVICE_GOPHER + INTERNET_SERVICE_HTTP + INTERNET_STATUS_CLOSING_CONNECTION + INTERNET_STATUS_CONNECTED_TO_SERVER + INTERNET_STATUS_CONNECTING_TO_SERVER + INTERNET_STATUS_CONNECTION_CLOSED + INTERNET_STATUS_HANDLE_CLOSING + INTERNET_STATUS_HANDLE_CREATED + INTERNET_STATUS_NAME_RESOLVED + INTERNET_STATUS_RECEIVING_RESPONSE + INTERNET_STATUS_REDIRECT + INTERNET_STATUS_REQUEST_COMPLETE + INTERNET_STATUS_REQUEST_SENT + INTERNET_STATUS_RESOLVING_NAME + INTERNET_STATUS_RESPONSE_RECEIVED + INTERNET_STATUS_SENDING_REQUEST +); + + +####################################################################### +# This AUTOLOAD is used to 'autoload' constants from the constant() +# XS function. If a constant is not found then control is passed +# to the AUTOLOAD in AutoLoader. +# + +sub AUTOLOAD { + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + #reset $! to zero to reset any current errors. + local $! = 0; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($! != 0) { + + # [dada] This results in an ugly Autoloader error + #if ($! =~ /Invalid/) { + # $AutoLoader::AUTOLOAD = $AUTOLOAD; + # goto &AutoLoader::AUTOLOAD; + #} else { + + # [dada] ... I prefer this one :) + + ($pack,$file,$line) = caller; undef $pack; + die "Win32::Internet::$constname is not defined, used at $file line $line."; + + #} + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + + +####################################################################### +# STATIC OBJECT PROPERTIES +# +$VERSION = "0.082"; + +%callback_code = (); +%callback_info = (); + + +####################################################################### +# PUBLIC METHODS +# + +#======== ### CLASS CONSTRUCTOR +sub new { +#======== + my($class, $useragent, $opentype, $proxy, $proxybypass, $flags) = @_; + my $self = {}; + + if(ref($useragent) and ref($useragent) eq "HASH") { + $opentype = $useragent->{'opentype'}; + $proxy = $useragent->{'proxy'}; + $proxybypass = $useragent->{'proxybypass'}; + $flags = $useragent->{'flags'}; + my $myuseragent = $useragent->{'useragent'}; + undef $useragent; + $useragent = $myuseragent; + } + + $useragent = "Perl-Win32::Internet/".$VERSION unless defined($useragent); + $opentype = constant("INTERNET_OPEN_TYPE_DIRECT",0) unless defined($opentype); + $proxy = "" unless defined($proxy); + $proxybypass = "" unless defined($proxybypass); + $flags = 0 unless defined($flags); + + + my $handle = InternetOpen($useragent, $opentype, $proxy, $proxybypass, $flags); + if ($handle) { + $self->{'connections'} = 0; + $self->{'pasv'} = 0; + $self->{'handle'} = $handle; + $self->{'useragent'} = $useragent; + $self->{'proxy'} = $proxy; + $self->{'proxybypass'} = $proxybypass; + $self->{'flags'} = $flags; + $self->{'Type'} = "Internet"; + + # [dada] I think it's better to call SetStatusCallback explicitly... + #if($flags & constant("INTERNET_FLAG_ASYNC",0)) { + # my $callbackresult=InternetSetStatusCallback($handle); + # if($callbackresult==&constant("INTERNET_INVALID_STATUS_CALLBACK",0)) { + # $self->{'Error'} = -2; + # } + #} + + bless $self; + } else { + $self->{'handle'} = undef; + bless $self; + } + $self; +} + + +#============ +sub OpenURL { +#============ + my($self,$new,$URL) = @_; + return undef unless ref($self); + + my $newhandle=InternetOpenUrl($self->{'handle'},$URL,"",0,0,0); + if(!$newhandle) { + $self->{'Error'} = "Cannot open URL."; + return undef; + } else { + $self->{'connections'}++; + $_[1] = _new($newhandle); + $_[1]->{'Type'} = "URL"; + $_[1]->{'URL'} = $URL; + return $newhandle; + } +} + + +#================ +sub TimeConvert { +#================ + my($self, $sec, $min, $hour, $day, $mon, $year, $wday, $rfc) = @_; + return undef unless ref($self); + + if(!defined($rfc)) { + return InternetTimeToSystemTime($sec); + } else { + return InternetTimeFromSystemTime($sec, $min, $hour, + $day, $mon, $year, + $wday, $rfc); + } +} + + +#======================= +sub QueryDataAvailable { +#======================= + my($self) = @_; + return undef unless ref($self); + + return InternetQueryDataAvailable($self->{'handle'}); +} + + +#============= +sub ReadFile { +#============= + my($self, $buffersize) = @_; + return undef unless ref($self); + + my $howmuch = InternetQueryDataAvailable($self->{'handle'}); + $buffersize = $howmuch unless defined($buffersize); + return InternetReadFile($self->{'handle'}, ($howmuch<$buffersize) ? $howmuch + : $buffersize); +} + + +#=================== +sub ReadEntireFile { +#=================== + my($handle) = @_; + my $content = ""; + my $buffersize = 16000; + my $howmuch = 0; + my $buffer = ""; + + $handle = $handle->{'handle'} if defined($handle) and ref($handle); + + $howmuch = InternetQueryDataAvailable($handle); + # print "\nReadEntireFile: $howmuch bytes to read...\n"; + + while($howmuch>0) { + $buffer = InternetReadFile($handle, ($howmuch<$buffersize) ? $howmuch + : $buffersize); + # print "\nReadEntireFile: ", length($buffer), " bytes read...\n"; + + if(!defined($buffer)) { + return undef; + } else { + $content .= $buffer; + } + $howmuch = InternetQueryDataAvailable($handle); + # print "\nReadEntireFile: still $howmuch bytes to read...\n"; + + } + return $content; +} + + +#============= +sub FetchURL { +#============= + # (OpenURL+Read+Close)... + my($self, $URL) = @_; + return undef unless ref($self); + + my $newhandle = InternetOpenUrl($self->{'handle'}, $URL, "", 0, 0, 0); + if(!$newhandle) { + $self->{'Error'} = "Cannot open URL."; + return undef; + } else { + my $content = ReadEntireFile($newhandle); + InternetCloseHandle($newhandle); + return $content; + } +} + + +#================ +sub Connections { +#================ + my($self) = @_; + return undef unless ref($self); + + return $self->{'connections'} if $self->{'Type'} eq "Internet"; + return undef; +} + + +#================ +sub GetResponse { +#================ + my($num, $text) = InternetGetLastResponseInfo(); + return $text; +} + +#=========== +sub Option { +#=========== + my($self, $option, $value) = @_; + return undef unless ref($self); + + my $retval = 0; + + $option = constant("INTERNET_OPTION_USER_AGENT", 0) unless defined($option); + + if(!defined($value)) { + $retval = InternetQueryOption($self->{'handle'}, $option); + } else { + $retval = InternetSetOption($self->{'handle'}, $option, $value); + } + return $retval; +} + + +#============== +sub UserAgent { +#============== + my($self, $value) = @_; + return undef unless ref($self); + + return Option($self, constant("INTERNET_OPTION_USER_AGENT", 0), $value); +} + + +#============= +sub Username { +#============= + my($self, $value) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "HTTP" and $self->{'Type'} ne "FTP") { + $self->{'Error'} = "Username() only on FTP or HTTP sessions."; + return undef; + } + + return Option($self, constant("INTERNET_OPTION_USERNAME", 0), $value); +} + + +#============= +sub Password { +#============= + my($self, $value)=@_; + return undef unless ref($self); + + if($self->{'Type'} ne "HTTP" and $self->{'Type'} ne "FTP") { + $self->{'Error'} = "Password() only on FTP or HTTP sessions."; + return undef; + } + + return Option($self, constant("INTERNET_OPTION_PASSWORD", 0), $value); +} + + +#=================== +sub ConnectTimeout { +#=================== + my($self, $value) = @_; + return undef unless ref($self); + + return Option($self, constant("INTERNET_OPTION_CONNECT_TIMEOUT", 0), $value); +} + + +#=================== +sub ConnectRetries { +#=================== + my($self, $value) = @_; + return undef unless ref($self); + + return Option($self, constant("INTERNET_OPTION_CONNECT_RETRIES", 0), $value); +} + + +#=================== +sub ConnectBackoff { +#=================== + my($self,$value)=@_; + return undef unless ref($self); + + return Option($self, constant("INTERNET_OPTION_CONNECT_BACKOFF", 0), $value); +} + + +#==================== +sub DataSendTimeout { +#==================== + my($self,$value) = @_; + return undef unless ref($self); + + return Option($self, constant("INTERNET_OPTION_DATA_SEND_TIMEOUT", 0), $value); +} + + +#======================= +sub DataReceiveTimeout { +#======================= + my($self, $value) = @_; + return undef unless ref($self); + + return Option($self, constant("INTERNET_OPTION_DATA_RECEIVE_TIMEOUT", 0), $value); +} + + +#========================== +sub ControlReceiveTimeout { +#========================== + my($self, $value) = @_; + return undef unless ref($self); + + return Option($self, constant("INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT", 0), $value); +} + + +#======================= +sub ControlSendTimeout { +#======================= + my($self, $value) = @_; + return undef unless ref($self); + + return Option($self, constant("INTERNET_OPTION_CONTROL_SEND_TIMEOUT", 0), $value); +} + + +#================ +sub QueryOption { +#================ + my($self, $option) = @_; + return undef unless ref($self); + + return InternetQueryOption($self->{'handle'}, $option); +} + + +#============== +sub SetOption { +#============== + my($self, $option, $value) = @_; + return undef unless ref($self); + + return InternetSetOption($self->{'handle'}, $option, $value); +} + + +#============= +sub CrackURL { +#============= + my($self, $URL, $flags) = @_; + return undef unless ref($self); + + $flags = constant("ICU_ESCAPE", 0) unless defined($flags); + + my @newurl = InternetCrackUrl($URL, $flags); + + if(!defined($newurl[0])) { + $self->{'Error'} = "Cannot crack URL."; + return undef; + } else { + return @newurl; + } +} + + +#============== +sub CreateURL { +#============== + my($self, $scheme, $hostname, $port, + $username, $password, + $path, $extrainfo, $flags) = @_; + return undef unless ref($self); + + if(ref($scheme) and ref($scheme) eq "HASH") { + $flags = $hostname; + $hostname = $scheme->{'hostname'}; + $port = $scheme->{'port'}; + $username = $scheme->{'username'}; + $password = $scheme->{'password'}; + $path = $scheme->{'path'}; + $extrainfo = $scheme->{'extrainfo'}; + my $myscheme = $scheme->{'scheme'}; + undef $scheme; + $scheme = $myscheme; + } + + $hostname = "" unless defined($hostname); + $port = 0 unless defined($port); + $username = "" unless defined($username); + $password = "" unless defined($password); + $path = "" unless defined($path); + $extrainfo = "" unless defined($extrainfo); + $flags = constant("ICU_ESCAPE", 0) unless defined($flags); + + my $newurl = InternetCreateUrl($scheme, $hostname, $port, + $username, $password, + $path, $extrainfo, $flags); + if(!defined($newurl)) { + $self->{'Error'} = "Cannot create URL."; + return undef; + } else { + return $newurl; + } +} + + +#==================== +sub CanonicalizeURL { +#==================== + my($self, $URL, $flags) = @_; + return undef unless ref($self); + + my $newurl = InternetCanonicalizeUrl($URL, $flags); + if(!defined($newurl)) { + $self->{'Error'} = "Cannot canonicalize URL."; + return undef; + } else { + return $newurl; + } +} + + +#=============== +sub CombineURL { +#=============== + my($self, $baseURL, $relativeURL, $flags) = @_; + return undef unless ref($self); + + my $newurl = InternetCombineUrl($baseURL, $relativeURL, $flags); + if(!defined($newurl)) { + $self->{'Error'} = "Cannot combine URL(s)."; + return undef; + } else { + return $newurl; + } +} + + +#====================== +sub SetStatusCallback { +#====================== + my($self) = @_; + return undef unless ref($self); + + my $callback = InternetSetStatusCallback($self->{'handle'}); + print "callback=$callback, constant=",constant("INTERNET_INVALID_STATUS_CALLBACK", 0), "\n"; + if($callback == constant("INTERNET_INVALID_STATUS_CALLBACK", 0)) { + return undef; + } else { + return $callback; + } +} + + +#====================== +sub GetStatusCallback { +#====================== + my($self, $context) = @_; + $context = $self if not defined $context; + return($callback_code{$context}, $callback_info{$context}); +} + + +#========== +sub Error { +#========== + my($self) = @_; + return undef unless ref($self); + + require Win32 unless defined &Win32::GetLastError; + my $errtext = ""; + my $tmp = ""; + my $errnum = Win32::GetLastError(); + + if($errnum < 12000) { + $errtext = Win32::FormatMessage($errnum); + $errtext =~ s/[\r\n]//g; + } elsif($errnum == 12003) { + ($tmp, $errtext) = InternetGetLastResponseInfo(); + chomp $errtext; + 1 while($errtext =~ s/(.*)\n//); # the last line should be significative... + # otherwise call GetResponse() to get it whole + } elsif($errnum >= 12000) { + $errtext = FormatMessage($errnum); + $errtext =~ s/[\r\n]//g; + } else { + $errtext="Error"; + } + if($errnum == 0 and defined($self->{'Error'})) { + if($self->{'Error'} == -2) { + $errnum = -2; + $errtext = "Asynchronous operations not available."; + } else { + $errnum = -1; + $errtext = $self->{'Error'}; + } + } + return (wantarray)? ($errnum, $errtext) : "\[".$errnum."\] ".$errtext; +} + + +#============ +sub Version { +#============ + my $dll = InternetDllVersion(); + $dll =~ s/\0//g; + return (wantarray)? ($Win32::Internet::VERSION, $dll) + : $Win32::Internet::VERSION."/".$dll; +} + + +#========== +sub Close { +#========== + my($self, $handle) = @_; + if(!defined($handle)) { + return undef unless ref($self); + $handle = $self->{'handle'}; + } + InternetCloseHandle($handle); +} + + + +####################################################################### +# FTP CLASS METHODS +# + +#======== ### FTP CONSTRUCTOR +sub FTP { +#======== + my($self, $new, $server, $username, $password, $port, $pasv, $context) = @_; + return undef unless ref($self); + + if(ref($server) and ref($server) eq "HASH") { + $port = $server->{'port'}; + $username = $server->{'username'}; + $password = $password->{'host'}; + my $myserver = $server->{'server'}; + $pasv = $server->{'pasv'}; + $context = $server->{'context'}; + undef $server; + $server = $myserver; + } + + $server = "" unless defined($server); + $username = "anonymous" unless defined($username); + $password = "" unless defined($password); + $port = 21 unless defined($port); + $context = 0 unless defined($context); + + $pasv = $self->{'pasv'} unless defined $pasv; + $pasv = $pasv ? constant("INTERNET_FLAG_PASSIVE",0) : 0; + + my $newhandle = InternetConnect($self->{'handle'}, $server, $port, + $username, $password, + constant("INTERNET_SERVICE_FTP", 0), + $pasv, $context); + if($newhandle) { + $self->{'connections'}++; + $_[1] = _new($newhandle); + $_[1]->{'Type'} = "FTP"; + $_[1]->{'Mode'} = "bin"; + $_[1]->{'pasv'} = $pasv; + $_[1]->{'username'} = $username; + $_[1]->{'password'} = $password; + $_[1]->{'server'} = $server; + return $newhandle; + } else { + return undef; + } +} + +#======== +sub Pwd { +#======== + my($self) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "FTP" or !defined($self->{'handle'})) { + $self->{'Error'} = "Pwd() only on FTP sessions."; + return undef; + } + + return FtpGetCurrentDirectory($self->{'handle'}); +} + + +#======= +sub Cd { +#======= + my($self, $path) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "FTP" || !defined($self->{'handle'})) { + $self->{'Error'} = "Cd() only on FTP sessions."; + return undef; + } + + my $retval = FtpSetCurrentDirectory($self->{'handle'}, $path); + if(!defined($retval)) { + return undef; + } else { + return $path; + } +} +#==================== +sub Cwd { Cd(@_); } +sub Chdir { Cd(@_); } +#==================== + + +#========== +sub Mkdir { +#========== + my($self, $path) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "FTP" or !defined($self->{'handle'})) { + $self->{'Error'} = "Mkdir() only on FTP sessions."; + return undef; + } + + my $retval = FtpCreateDirectory($self->{'handle'}, $path); + $self->{'Error'} = "Can't create directory." unless defined($retval); + return $retval; +} +#==================== +sub Md { Mkdir(@_); } +#==================== + + +#========= +sub Mode { +#========= + my($self, $value) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "FTP" or !defined($self->{'handle'})) { + $self->{'Error'} = "Mode() only on FTP sessions."; + return undef; + } + + if(!defined($value)) { + return $self->{'Mode'}; + } else { + my $modesub = ($value =~ /^a/i) ? "Ascii" : "Binary"; + $self->$modesub($_[0]); + } + return $self->{'Mode'}; +} + + +#========== +sub Rmdir { +#========== + my($self, $path) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "FTP" or !defined($self->{'handle'})) { + $self->{'Error'} = "Rmdir() only on FTP sessions."; + return undef; + } + my $retval = FtpRemoveDirectory($self->{'handle'}, $path); + $self->{'Error'} = "Can't remove directory." unless defined($retval); + return $retval; +} +#==================== +sub Rd { Rmdir(@_); } +#==================== + + +#========= +sub Pasv { +#========= + my($self, $value) = @_; + return undef unless ref($self); + + if(defined($value) and $self->{'Type'} eq "Internet") { + if($value == 0) { + $self->{'pasv'} = 0; + } else { + $self->{'pasv'} = 1; + } + } + return $self->{'pasv'}; +} + +#========= +sub List { +#========= + my($self, $pattern, $retmode) = @_; + return undef unless ref($self); + + my $retval = ""; + my $size = ""; + my $attr = ""; + my $ctime = ""; + my $atime = ""; + my $mtime = ""; + my $csec = 0; my $cmin = 0; my $chou = 0; my $cday = 0; my $cmon = 0; my $cyea = 0; + my $asec = 0; my $amin = 0; my $ahou = 0; my $aday = 0; my $amon = 0; my $ayea = 0; + my $msec = 0; my $mmin = 0; my $mhou = 0; my $mday = 0; my $mmon = 0; my $myea = 0; + my $newhandle = 0; + my $nextfile = 1; + my @results = (); + my ($filename, $altname, $file); + + if($self->{'Type'} ne "FTP") { + $self->{'Error'} = "List() only on FTP sessions."; + return undef; + } + + $pattern = "" unless defined($pattern); + $retmode = 1 unless defined($retmode); + + if($retmode == 2) { + + ( $newhandle,$filename, $altname, $size, $attr, + $csec, $cmin, $chou, $cday, $cmon, $cyea, + $asec, $amin, $ahou, $aday, $amon, $ayea, + $msec, $mmin, $mhou, $mday, $mmon, $myea + ) = FtpFindFirstFile($self->{'handle'}, $pattern, 0, 0); + + if(!$newhandle) { + $self->{'Error'} = "Can't read FTP directory."; + return undef; + } else { + + while($nextfile) { + $ctime = join(",", ($csec, $cmin, $chou, $cday, $cmon, $cyea)); + $atime = join(",", ($asec, $amin, $ahou, $aday, $amon, $ayea)); + $mtime = join(",", ($msec, $mmin, $mhou, $mday, $mmon, $myea)); + push(@results, $filename, $altname, $size, $attr, $ctime, $atime, $mtime); + + ( $nextfile, $filename, $altname, $size, $attr, + $csec, $cmin, $chou, $cday, $cmon, $cyea, + $asec, $amin, $ahou, $aday, $amon, $ayea, + $msec, $mmin, $mhou, $mday, $mmon, $myea + ) = InternetFindNextFile($newhandle); + + } + InternetCloseHandle($newhandle); + return @results; + + } + + } elsif($retmode == 3) { + + ( $newhandle,$filename, $altname, $size, $attr, + $csec, $cmin, $chou, $cday, $cmon, $cyea, + $asec, $amin, $ahou, $aday, $amon, $ayea, + $msec, $mmin, $mhou, $mday, $mmon, $myea + ) = FtpFindFirstFile($self->{'handle'}, $pattern, 0, 0); + + if(!$newhandle) { + $self->{'Error'} = "Can't read FTP directory."; + return undef; + + } else { + + while($nextfile) { + $ctime = join(",", ($csec, $cmin, $chou, $cday, $cmon, $cyea)); + $atime = join(",", ($asec, $amin, $ahou, $aday, $amon, $ayea)); + $mtime = join(",", ($msec, $mmin, $mhou, $mday, $mmon, $myea)); + $file = { "name" => $filename, + "altname" => $altname, + "size" => $size, + "attr" => $attr, + "ctime" => $ctime, + "atime" => $atime, + "mtime" => $mtime, + }; + push(@results, $file); + + ( $nextfile, $filename, $altname, $size, $attr, + $csec, $cmin, $chou, $cday, $cmon, $cyea, + $asec, $amin, $ahou, $aday, $amon, $ayea, + $msec, $mmin, $mhou, $mday, $mmon, $myea + ) = InternetFindNextFile($newhandle); + + } + InternetCloseHandle($newhandle); + return @results; + } + + } else { + + ($newhandle, $filename) = FtpFindFirstFile($self->{'handle'}, $pattern, 0, 0); + + if(!$newhandle) { + $self->{'Error'} = "Can't read FTP directory."; + return undef; + + } else { + + while($nextfile) { + push(@results, $filename); + + ($nextfile, $filename) = InternetFindNextFile($newhandle); + # print "List.no more files\n" if !$nextfile; + + } + InternetCloseHandle($newhandle); + return @results; + } + } +} +#==================== +sub Ls { List(@_); } +sub Dir { List(@_); } +#==================== + + +#================= +sub FileAttrInfo { +#================= + my($self,$attr) = @_; + my @attrinfo = (); + push(@attrinfo, "READONLY") if $attr & 1; + push(@attrinfo, "HIDDEN") if $attr & 2; + push(@attrinfo, "SYSTEM") if $attr & 4; + push(@attrinfo, "DIRECTORY") if $attr & 16; + push(@attrinfo, "ARCHIVE") if $attr & 32; + push(@attrinfo, "NORMAL") if $attr & 128; + push(@attrinfo, "TEMPORARY") if $attr & 256; + push(@attrinfo, "COMPRESSED") if $attr & 2048; + return (wantarray)? @attrinfo : join(" ", @attrinfo); +} + + +#=========== +sub Binary { +#=========== + my($self) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "FTP") { + $self->{'Error'} = "Binary() only on FTP sessions."; + return undef; + } + $self->{'Mode'} = "bin"; + return undef; +} +#====================== +sub Bin { Binary(@_); } +#====================== + + +#========== +sub Ascii { +#========== + my($self) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "FTP") { + $self->{'Error'} = "Ascii() only on FTP sessions."; + return undef; + } + $self->{'Mode'} = "asc"; + return undef; +} +#===================== +sub Asc { Ascii(@_); } +#===================== + + +#======== +sub Get { +#======== + my($self, $remote, $local, $overwrite, $flags, $context) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "FTP") { + $self->{'Error'} = "Get() only on FTP sessions."; + return undef; + } + my $mode = ($self->{'Mode'} eq "asc" ? 1 : 2); + + $remote = "" unless defined($remote); + $local = $remote unless defined($local); + $overwrite = 0 unless defined($overwrite); + $flags = 0 unless defined($flags); + $context = 0 unless defined($context); + + my $retval = FtpGetFile($self->{'handle'}, + $remote, + $local, + $overwrite, + $flags, + $mode, + $context); + $self->{'Error'} = "Can't get file." unless defined($retval); + return $retval; +} + + +#=========== +sub Rename { +#=========== + my($self, $oldname, $newname) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "FTP") { + $self->{'Error'} = "Rename() only on FTP sessions."; + return undef; + } + + my $retval = FtpRenameFile($self->{'handle'}, $oldname, $newname); + $self->{'Error'} = "Can't rename file." unless defined($retval); + return $retval; +} +#====================== +sub Ren { Rename(@_); } +#====================== + + +#=========== +sub Delete { +#=========== + my($self, $filename) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "FTP") { + $self->{'Error'} = "Delete() only on FTP sessions."; + return undef; + } + my $retval = FtpDeleteFile($self->{'handle'}, $filename); + $self->{'Error'} = "Can't delete file." unless defined($retval); + return $retval; +} +#====================== +sub Del { Delete(@_); } +#====================== + + +#======== +sub Put { +#======== + my($self, $local, $remote, $context) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "FTP") { + $self->{'Error'} = "Put() only on FTP sessions."; + return undef; + } + my $mode = ($self->{'Mode'} eq "asc" ? 1 : 2); + + $context = 0 unless defined($context); + + my $retval = FtpPutFile($self->{'handle'}, $local, $remote, $mode, $context); + $self->{'Error'} = "Can't put file." unless defined($retval); + return $retval; +} + + +####################################################################### +# HTTP CLASS METHODS +# + +#========= ### HTTP CONSTRUCTOR +sub HTTP { +#========= + my($self, $new, $server, $username, $password, $port, $flags, $context) = @_; + return undef unless ref($self); + + if(ref($server) and ref($server) eq "HASH") { + my $myserver = $server->{'server'}; + $username = $server->{'username'}; + $password = $password->{'host'}; + $port = $server->{'port'}; + $flags = $server->{'flags'}; + $context = $server->{'context'}; + undef $server; + $server = $myserver; + } + + $server = "" unless defined($server); + $username = "anonymous" unless defined($username); + $password = "" unless defined($password); + $port = 80 unless defined($port); + $flags = 0 unless defined($flags); + $context = 0 unless defined($context); + + my $newhandle = InternetConnect($self->{'handle'}, $server, $port, + $username, $password, + constant("INTERNET_SERVICE_HTTP", 0), + $flags, $context); + if($newhandle) { + $self->{'connections'}++; + $_[1] = _new($newhandle); + $_[1]->{'Type'} = "HTTP"; + $_[1]->{'username'} = $username; + $_[1]->{'password'} = $password; + $_[1]->{'server'} = $server; + $_[1]->{'accept'} = "text/*\0image/gif\0image/jpeg\0\0"; + return $newhandle; + } else { + return undef; + } +} + + +#================ +sub OpenRequest { +#================ + # alternatively to Request: + # it creates a new HTTP_Request object + # you can act upon it with AddHeader, SendRequest, ReadFile, QueryInfo, Close, ... + + my($self, $new, $path, $method, $version, $referer, $accept, $flags, $context) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "HTTP") { + $self->{'Error'} = "OpenRequest() only on HTTP sessions."; + return undef; + } + + if(ref($path) and ref($path) eq "HASH") { + $method = $path->{'method'}; + $version = $path->{'version'}; + $referer = $path->{'referer'}; + $accept = $path->{'accept'}; + $flags = $path->{'flags'}; + $context = $path->{'context'}; + my $mypath = $path->{'path'}; + undef $path; + $path = $mypath; + } + + $method = "GET" unless defined($method); + $path = "/" unless defined($path); + $version = "HTTP/1.0" unless defined($version); + $referer = "" unless defined($referer); + $accept = $self->{'accept'} unless defined($accept); + $flags = 0 unless defined($flags); + $context = 0 unless defined($context); + + $path = "/".$path if substr($path,0,1) ne "/"; + # accept string list needs to be terminated by double-NULL + $accept .= "\0\0" unless $accept =~ /\0\0\z/; + + my $newhandle = HttpOpenRequest($self->{'handle'}, + $method, + $path, + $version, + $referer, + $accept, + $flags, + $context); + if($newhandle) { + $_[1] = _new($newhandle); + $_[1]->{'Type'} = "HTTP_Request"; + $_[1]->{'method'} = $method; + $_[1]->{'request'} = $path; + $_[1]->{'accept'} = $accept; + return $newhandle; + } else { + return undef; + } +} + +#================ +sub SendRequest { +#================ + my($self, $postdata) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "HTTP_Request") { + $self->{'Error'} = "SendRequest() only on HTTP requests."; + return undef; + } + + $postdata = "" unless defined($postdata); + + return HttpSendRequest($self->{'handle'}, "", $postdata); +} + + +#============== +sub AddHeader { +#============== + my($self, $header, $flags) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "HTTP_Request") { + $self->{'Error'} = "AddHeader() only on HTTP requests."; + return undef; + } + + $flags = constant("HTTP_ADDREQ_FLAG_ADD", 0) if (!defined($flags) or $flags == 0); + + return HttpAddRequestHeaders($self->{'handle'}, $header, $flags); +} + + +#============== +sub QueryInfo { +#============== + my($self, $header, $flags) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "HTTP_Request") { + $self->{'Error'}="QueryInfo() only on HTTP requests."; + return undef; + } + + $flags = constant("HTTP_QUERY_CUSTOM", 0) if (!defined($flags) and defined($header)); + my @queryresult = HttpQueryInfo($self->{'handle'}, $flags, $header); + return (wantarray)? @queryresult : join(" ", @queryresult); +} + + +#============ +sub Request { +#============ + # HttpOpenRequest+HttpAddHeaders+HttpSendRequest+InternetReadFile+HttpQueryInfo + my($self, $path, $method, $version, $referer, $accept, $flags, $postdata) = @_; + return undef unless ref($self); + + if($self->{'Type'} ne "HTTP") { + $self->{'Error'} = "Request() only on HTTP sessions."; + return undef; + } + + if(ref($path) and ref($path) eq "HASH") { + $method = $path->{'method'}; + $version = $path->{'version'}; + $referer = $path->{'referer'}; + $accept = $path->{'accept'}; + $flags = $path->{'flags'}; + $postdata = $path->{'postdata'}; + my $mypath = $path->{'path'}; + undef $path; + $path = $mypath; + } + + my $content = ""; + my $result = ""; + my @queryresult = (); + my $statuscode = ""; + my $headers = ""; + + $path = "/" unless defined($path); + $method = "GET" unless defined($method); + $version = "HTTP/1.0" unless defined($version); + $referer = "" unless defined($referer); + $accept = $self->{'accept'} unless defined($accept); + $flags = 0 unless defined($flags); + $postdata = "" unless defined($postdata); + + $path = "/".$path if substr($path,0,1) ne "/"; + # accept string list needs to be terminated by double-NULL + $accept .= "\0\0" unless $accept =~ /\0\0\z/; + + my $newhandle = HttpOpenRequest($self->{'handle'}, + $method, + $path, + $version, + $referer, + $accept, + $flags, + 0); + + if($newhandle) { + + $result = HttpSendRequest($newhandle, "", $postdata); + + if(defined($result)) { + $statuscode = HttpQueryInfo($newhandle, + constant("HTTP_QUERY_STATUS_CODE", 0), ""); + $headers = HttpQueryInfo($newhandle, + constant("HTTP_QUERY_RAW_HEADERS_CRLF", 0), ""); + $content = ReadEntireFile($newhandle); + + InternetCloseHandle($newhandle); + + return($statuscode, $headers, $content); + } else { + return undef; + } + } else { + return undef; + } +} + + +####################################################################### +# END OF THE PUBLIC METHODS +# + + +#========= ### SUB-CLASSES CONSTRUCTOR +sub _new { +#========= + my $self = {}; + if ($_[0]) { + $self->{'handle'} = $_[0]; + bless $self; + } else { + undef($self); + } + $self; +} + + +#============ ### CLASS DESTRUCTOR +sub DESTROY { +#============ + my($self) = @_; + # print "Closing handle $self->{'handle'}...\n"; + InternetCloseHandle($self->{'handle'}); + # [dada] rest in peace +} + + +#============= +sub callback { +#============= + my($name, $status, $info) = @_; + $callback_code{$name} = $status; + $callback_info{$name} = $info; +} + +####################################################################### +# dynamically load in the Internet.pll module. +# + +bootstrap Win32::Internet; + +# Preloaded methods go here. + +#Currently Autoloading is not implemented in Perl for win32 +# Autoload methods go after __END__, and are processed by the autosplit program. + +1; +__END__ + +=head1 NAME + +Win32::Internet - Access to WININET.DLL functions + +=head1 INTRODUCTION + +This extension to Perl implements the Win32 Internet APIs (found in +F<WININET.DLL>). They give a complete support for HTTP, FTP and GOPHER +connections. + +See the L<"Version History"> and the L<"Functions Table"> for a list +of the currently supported features. You should also get a copy of the +L<"Microsoft Win32 Internet Functions"> documentation. + +=head1 REFERENCE + +To use this module, first add the following line at the beginning of +your script: + + use Win32::Internet; + +Then you have to open an Internet connection with this command: + + $Connection = new Win32::Internet(); + +This is required to use any of the function of this module. It will +create an Internet object in Perl on which you can act upon with the +L<"General Internet Functions"> explained later. + +The objects available are: + +=over + +=item * + +Internet connections (the main object, see C<new>) + +=item * + +URLs (see C<OpenURL>) + +=item * + +FTP sessions (see C<FTP>) + +=item * + +HTTP sessions (see C<HTTP>) + +=item * + +HTTP requests (see C<OpenRequest>) + +=back + +As in the good Perl tradition, there are in this extension different +ways to do the same thing; there are, in fact, different levels of +implementation of the Win32 Internet Functions. Some routines use +several Win32 API functions to perform a complex task in a single +call; they are simpler to use, but of course less powerful. + +There are then other functions that implement nothing more and nothing +less than the corresponding API function, so you can use all of their +power, but with some additional programming steps. + +To make an example, there is a function called C<FetchURL> that you +can use to fetch the content of any HTTP, FTP or GOPHER URL with this +simple commands: + + $INET = new Win32::Internet(); + $file = $INET->FetchURL("http://www.yahoo.com"); + +You can have the same result (and this is actually what is done by +C<FetchURL>) this way: + + $INET = new Win32::Internet(); + $URL = $INET->OpenURL("http://www.yahoo.com"); + $file = $URL->ReadFile(); + $URL->Close(); + +Or, you can open a complete HTTP session: + + $INET = new Win32::Internet(); + $HTTP = $INET->HTTP("www.yahoo.com", "anonymous", "dada@divinf.it"); + ($statuscode, $headers, $file) = $HTTP->Request("/"); + $HTTP->Close(); + +Finally, you can choose to manage even the HTTP request: + + $INET = new Win32::Internet(); + $HTTP = $INET->HTTP("www.yahoo.com", "anonymous", "dada@divinf.it"); + $HTTP->OpenRequest($REQ, "/"); + $REQ->AddHeader("If-Modified-Since: Saturday, 16-Nov-96 15:58:50 GMT"); + $REQ->SendRequest(); + $statuscode = $REQ->QueryInfo("",HTTP_QUERY_STATUS_CODE); + $lastmodified = $REQ->QueryInfo("Last-Modified"); + $file = $REQ->ReadEntireFile(); + $REQ->Close(); + $HTTP->Close(); + +To open and control a complete FTP session, type: + + $Connection->FTP($Session, "ftp://ftp.activeware.com", "anonymous", "dada\@divinf.it"); + +This will create an FTP object in Perl to which you can apply the L<"FTP +functions"> provided by the package: + + $Session->Cd("/ntperl/perl5.001m/CurrentBuild"); + $Session->Ascii(); + $Session->Get("110-i86.zip"); + $Session->Close(); + +For a more complete example, see the TEST.PL file that comes with the +package. + +=head2 General Internet Functions + +B<General Note> + +All methods assume that you have the line: + + use Win32::Internet; + +somewhere before the method calls, and that you have an Internet +object called $INET which was created using this call: + + $INET = new Win32::Internet(); + +See C<new> for more information. + +B<Methods> + +=over + +=item CanonicalizeURL URL, [flags] + +Converts a URL to a canonical format, which includes converting unsafe +characters to escape sequences. Returns the canonicalized URL or +C<undef> on errors. For the possible values of I<flags>, refer to the +L<"Microsoft Win32 Internet Functions"> document. See also +C<CombineURL> and C<OpenURL>. + +Example: + + $cURL = $INET->CanonicalizeURL($URL); + $URL = $INET->CanonicalizeURL($cURL, ICU_DECODE); + +=item Close + +=item Close object + +Closes an Internet connection. This can be applied to any +Win32::Internet object (Internet connections, URLs, FTP sessions, +etc.). Note that it is not "strictly" required to close the +connections you create, since the Win32::Internet objects are +automatically closed when the program ends (or when you elsehow +destroy such an object). + +Example: + + $INET->Close(); + $FTP->Close(); + $INET->Close($FTP); # same as above... + +=item CombineURL baseURL, relativeURL, [flags] + +Combines a base and relative URL into a single URL. Returns the +(canonicalized) combined URL or C<undef> on errors. For the possible +values of I<flags>, refer to the L<"Microsoft Win32 Internet +Functions"> document. See also C<CombineURL> and C<OpenURL>. + +Example: + + $URL = $INET->CombineURL("http://www.divinf.it/dada/perl/internet", ".."); + +=item ConnectBackoff [value] + +Reads or sets the delay value, in milliseconds, to wait between +connection retries. If no I<value> parameter is specified, the +current value is returned; otherwise, the delay between retries is set +to I<value>. See also C<ConnectTimeout>, C<ConnectRetries>, +C<QueryOption> and C<SetOption>. + +Example: + + $HTTP->ConnectBackoff(2000); + $backoff = $HTTP->ConnectBackoff(); + +=item ConnectRetries [value] + +Reads or sets the number of times a connection is retried before +considering it failed. If no I<value> parameter is specified, the +current value is returned; otherwise, the number of retries is set to +I<value>. The default value for C<ConnectRetries> is 5. See also +C<ConnectBackoff>, C<ConnectTimeout>, C<QueryOption> and C<SetOption>. + +Example: + + $HTTP->ConnectRetries(20); + $retries = $HTTP->ConnectRetries(); + +=item ConnectTimeout [value] + +Reads or sets the timeout value (in milliseconds) before a connection +is considered failed. If no I<value> parameter is specified, the +current value is returned; otherwise, the timeout is set to I<value>. +The default value for C<ConnectTimeout> is infinite. See also +C<ConnectBackoff>, C<ConnectRetries>, C<QueryOption> and C<SetOption>. + +Example: + + $HTTP->ConnectTimeout(10000); + $timeout = $HTTP->ConnectTimeout(); + +=item ControlReceiveTimeout [value] + +Reads or sets the timeout value (in milliseconds) to use for non-data +(control) receive requests before they are canceled. Currently, this +value has meaning only for C<FTP> sessions. If no I<value> parameter +is specified, the current value is returned; otherwise, the timeout is +set to I<value>. The default value for C<ControlReceiveTimeout> is +infinite. See also C<ControlSendTimeout>, C<QueryOption> and +C<SetOption>. + +Example: + + $HTTP->ControlReceiveTimeout(10000); + $timeout = $HTTP->ControlReceiveTimeout(); + +=item ControlSendTimeout [value] + +Reads or sets the timeout value (in milliseconds) to use for non-data +(control) send requests before they are canceled. Currently, this +value has meaning only for C<FTP> sessions. If no I<value> parameter +is specified, the current value is returned; otherwise, the timeout is +set to I<value>. The default value for C<ControlSendTimeout> is +infinite. See also C<ControlReceiveTimeout>, C<QueryOption> and +C<SetOption>. + +Example: + + $HTTP->ControlSendTimeout(10000); + $timeout = $HTTP->ControlSendTimeout(); + +=item CrackURL URL, [flags] + +Splits an URL into its component parts and returns them in an array. +Returns C<undef> on errors, otherwise the array will contain the +following values: I<scheme, host, port, username, password, path, +extrainfo>. + +For example, the URL "http://www.divinf.it/index.html#top" can be +splitted in: + + http, www.divinf.it, 80, anonymous, dada@divinf.it, /index.html, #top + +If you don't specify a I<flags> parameter, ICU_ESCAPE will be used by +default; for the possible values of I<flags> refer to the L<"Microsoft +Win32 Internet Functions"> documentation. See also C<CreateURL>. + +Example: + + @parts=$INET->CrackURL("http://www.activeware.com"); + ($scheme, $host, $port, $user, $pass, $path, $extra) = + $INET->CrackURL("http://www.divinf.it:80/perl-win32/index.sht#feedback"); + +=item CreateURL scheme, hostname, port, username, password, path, extrainfo, [flags] + +=item CreateURL hashref, [flags] + +Creates a URL from its component parts. Returns C<undef> on errors, +otherwise the created URL. + +If you pass I<hashref> (a reference to an hash array), the following +values are taken from the array: + + %hash=( + "scheme" => "scheme", + "hostname" => "hostname", + "port" => port, + "username" => "username", + "password" => "password", + "path" => "path", + "extrainfo" => "extrainfo", + ); + +If you don't specify a I<flags> parameter, ICU_ESCAPE will be used by +default; for the other possible values of I<flags> refer to the +L<"Microsoft Win32 Internet Functions"> documentation. See also +C<CrackURL>. + +Example: + + $URL=$I->CreateURL("http", "www.divinf.it", 80, "", "", "/perl-win32/index.sht", "#feedback"); + $URL=$I->CreateURL(\%params); + +=item DataReceiveTimeout [value] + +Reads or sets the timeout value (in milliseconds) to use for data +receive requests before they are canceled. If no I<value> parameter +is specified, the current value is returned; otherwise, the timeout is +set to I<value>. The default value for DataReceiveTimeout is +infinite. See also C<DataSendTimeout>, C<QueryOption> and +C<SetOption>. + +Example: + + $HTTP->DataReceiveTimeout(10000); + $timeout = $HTTP->DataReceiveTimeout(); + +=item DataSendTimeout [value] + +Reads or sets the timeout value (in milliseconds) to use for data send +requests before they are canceled. If no I<value> parameter is +specified, the current value is returned; otherwise, the timeout is +set to I<value>. The default value for DataSendTimeout is infinite. +See also C<DataReceiveTimeout>, C<QueryOption> and C<SetOption>. + +Example: + + $HTTP->DataSendTimeout(10000); + $timeout = $HTTP->DataSendTimeout(); + +=item Error + +Returns the last recorded error in the form of an array or string +(depending upon the context) containing the error number and an error +description. Can be applied on any Win32::Internet object (FTP +sessions, etc.). There are 3 types of error you can encounter; they +are recognizable by the error number returned: + +=over + +=item * -1 + +A "trivial" error has occurred in the package. For example, you tried +to use a method on the wrong type of object. + +=item * 1 .. 11999 + +A generic error has occurred and the Win32::GetLastError error message +is returned. + +=item * 12000 and higher + +An Internet error has occurred; the extended Win32 Internet API error +message is returned. + +=back + +See also C<GetResponse>. + +Example: + + die $INET->Error(), qq(\n); + ($ErrNum, $ErrText) = $INET->Error(); + +=item FetchURL URL + +Fetch the content of an HTTP, FTP or GOPHER URL. Returns the content +of the file read (or C<undef> if there was an error and nothing was +read). See also C<OpenURL> and C<ReadFile>. + +Example: + + $file = $INET->FetchURL("http://www.yahoo.com/"); + $file = $INET->FetchURL("ftp://www.activeware.com/contrib/internet.zip"); + +=item FTP ftpobject, server, username, password, [port, pasv, context] + +=item FTP ftpobject, hashref + +Opens an FTP connection to server logging in with the given +I<username> and I<password>. + +The parameters and their values are: + +=over + +=item * server + +The server to connect to. Default: I<none>. + +=item * username + +The username used to login to the server. Default: anonymous. + +=item * password + +The password used to login to the server. Default: I<none>. + +=item * port + +The port of the FTP service on the server. Default: 21. + +=item * pasv + +If it is a value other than 0, use passive transfer mode. Default is +taken from the parent Internet connection object; you can set this +value with the C<Pasv> method. + +=item * context + +A number to identify this operation if it is asynchronous. See +C<SetStatusCallback> and C<GetStatusCallback> for more info on +asynchronous operations. Default: I<none>. + +=back + +If you pass I<hashref> (a reference to an hash array), the following +values are taken from the array: + + %hash=( + "server" => "server", + "username" => "username", + "password" => "password", + "port" => port, + "pasv" => pasv, + "context" => context, + ); + +This method returns C<undef> if the connection failed, a number +otherwise. You can then call any of the L<"FTP functions"> as methods +of the newly created I<ftpobject>. + +Example: + + $result = $INET->FTP($FTP, "ftp.activeware.com", "anonymous", "dada\@divinf.it"); + # and then for example... + $FTP->Cd("/ntperl/perl5.001m/CurrentBuild"); + + $params{"server"} = "ftp.activeware.com"; + $params{"password"} = "dada\@divinf.it"; + $params{"pasv"} = 0; + $result = $INET->FTP($FTP,\%params); + +=item GetResponse + +Returns the text sent by a remote server in response to the last +function executed. It applies on any Win32::Internet object, +particularly of course on L<FTP sessions|"FTP functions">. See also +the C<Error> function. + +Example: + + print $INET->GetResponse(); + $INET->FTP($FTP, "ftp.activeware.com", "anonymous", "dada\@divinf.it"); + print $FTP->GetResponse(); + +=item GetStatusCallback context + +Returns information about the progress of the asynchronous operation +identified by I<context>; those informations consist of two values: a +status code (one of the INTERNET_STATUS_* L<"Constants">) and an +additional value depending on the status code; for example, if the +status code returned is INTERNET_STATUS_HANDLE_CREATED, the second +value will hold the handle just created. For more informations on +those values, please refer to the L<"Microsoft Win32 Internet +Functions"> documentation. See also C<SetStatusCallback>. + +Example: + + ($status, $info) = $INET->GetStatusCallback(1); + +=item HTTP httpobject, server, username, password, [port, flags, context] + +=item HTTP httpobject, hashref + +Opens an HTTP connection to I<server> logging in with the given +I<username> and I<password>. + +The parameters and their values are: + +=over + +=item * server + +The server to connect to. Default: I<none>. + +=item * username + +The username used to login to the server. Default: anonymous. + +=item * password + +The password used to login to the server. Default: I<none>. + +=item * port + +The port of the HTTP service on the server. Default: 80. + +=item * flags + +Additional flags affecting the behavior of the function. Default: +I<none>. + +=item * context + +A number to identify this operation if it is asynchronous. See +C<SetStatusCallback> and C<GetStatusCallback> for more info on +asynchronous operations. Default: I<none>. + +=back + +Refer to the L<"Microsoft Win32 Internet Functions"> documentation for +more details on those parameters. + +If you pass I<hashref> (a reference to an hash array), the following +values are taken from the array: + + %hash=( + "server" => "server", + "username" => "username", + "password" => "password", + "port" => port, + "flags" => flags, + "context" => context, + ); + +This method returns C<undef> if the connection failed, a number +otherwise. You can then call any of the L<"HTTP functions"> as +methods of the newly created I<httpobject>. + +Example: + + $result = $INET->HTTP($HTTP,"www.activeware.com","anonymous","dada\@divinf.it"); + # and then for example... + ($statuscode, $headers, $file) = $HTTP->Request("/gifs/camel.gif"); + + $params{"server"} = "www.activeware.com"; + $params{"password"} = "dada\@divinf.it"; + $params{"flags"} = INTERNET_FLAG_RELOAD; + $result = $INET->HTTP($HTTP,\%params); + +=item new Win32::Internet [useragent, opentype, proxy, proxybypass, flags] + +=item new Win32::Internet [hashref] + +Creates a new Internet object and initializes the use of the Internet +functions; this is required before any of the functions of this +package can be used. Returns C<undef> if the connection fails, a number +otherwise. The parameters and their values are: + +=over + +=item * useragent + +The user agent passed to HTTP requests. See C<OpenRequest>. Default: +Perl-Win32::Internet/I<version>. + +=item * opentype + +How to access to the Internet (eg. directly or using a proxy). +Default: INTERNET_OPEN_TYPE_DIRECT. + +=item * proxy + +Name of the proxy server (or servers) to use. Default: I<none>. + +=item * proxybypass + +Optional list of host names or IP addresses, or both, that are known +locally. Default: I<none>. + +=item * flags + +Additional flags affecting the behavior of the function. Default: +I<none>. + +=back + +Refer to the L<"Microsoft Win32 Internet Functions"> documentation for +more details on those parameters. If you pass I<hashref> (a reference to +an hash array), the following values are taken from the array: + + %hash=( + "useragent" => "useragent", + "opentype" => "opentype", + "proxy" => "proxy", + "proxybypass" => "proxybypass", + "flags" => flags, + ); + +Example: + + $INET = new Win32::Internet(); + die qq(Cannot connect to Internet...\n) if ! $INET; + + $INET = new Win32::Internet("Mozilla/3.0", INTERNET_OPEN_TYPE_PROXY, "www.microsoft.com", ""); + + $params{"flags"} = INTERNET_FLAG_ASYNC; + $INET = new Win32::Internet(\%params); + +=item OpenURL urlobject, URL + +Opens a connection to an HTTP, FTP or GOPHER Uniform Resource Location +(URL). Returns C<undef> on errors or a number if the connection was +succesful. You can then retrieve the URL content by applying the +methods C<QueryDataAvailable> and C<ReadFile> on the newly created +I<urlobject>. See also C<FetchURL>. + +Example: + + $INET->OpenURL($URL, "http://www.yahoo.com/"); + $bytes = $URL->QueryDataAvailable(); + $file = $URL->ReadEntireFile(); + $URL->Close(); + +=item Password [password] + +Reads or sets the password used for an C<FTP> or C<HTTP> connection. +If no I<password> parameter is specified, the current value is +returned; otherwise, the password is set to I<password>. See also +C<Username>, C<QueryOption> and C<SetOption>. + +Example: + + $HTTP->Password("splurfgnagbxam"); + $password = $HTTP->Password(); + +=item QueryDataAvailable + +Returns the number of bytes of data that are available to be read +immediately by a subsequent call to C<ReadFile> (or C<undef> on +errors). Can be applied to URL or HTTP request objects. See +C<OpenURL> or C<OpenRequest>. + +Example: + + $INET->OpenURL($URL, "http://www.yahoo.com/"); + $bytes = $URL->QueryDataAvailable(); + +=item QueryOption option + +Queries an Internet option. For the possible values of I<option>, +refer to the L<"Microsoft Win32 Internet Functions"> document. See +also C<SetOption>. + +Example: + + $value = $INET->QueryOption(INTERNET_OPTION_CONNECT_TIMEOUT); + $value = $HTTP->QueryOption(INTERNET_OPTION_USERNAME); + +=item ReadEntireFile + +Reads all the data available from an opened URL or HTTP request +object. Returns what have been read or C<undef> on errors. See also +C<OpenURL>, C<OpenRequest> and C<ReadFile>. + +Example: + + $INET->OpenURL($URL, "http://www.yahoo.com/"); + $file = $URL->ReadEntireFile(); + +=item ReadFile bytes + +Reads I<bytes> bytes of data from an opened URL or HTTP request +object. Returns what have been read or C<undef> on errors. See also +C<OpenURL>, C<OpenRequest>, C<QueryDataAvailable> and +C<ReadEntireFile>. + +B<Note:> be careful to keep I<bytes> to an acceptable value (eg. don't +tell him to swallow megabytes at once...). C<ReadEntireFile> in fact +uses C<QueryDataAvailable> and C<ReadFile> in a loop to read no more +than 16k at a time. + +Example: + + $INET->OpenURL($URL, "http://www.yahoo.com/"); + $chunk = $URL->ReadFile(16000); + +=item SetOption option, value + +Sets an Internet option. For the possible values of I<option>, refer to +the L<"Microsoft Win32 Internet Functions"> document. See also +C<QueryOption>. + +Example: + + $INET->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,10000); + $HTTP->SetOption(INTERNET_OPTION_USERNAME,"dada"); + +=item SetStatusCallback + +Initializes the callback routine used to return data about the +progress of an asynchronous operation. + +Example: + + $INET->SetStatusCallback(); + +This is one of the step required to perform asynchronous operations; +the complete procedure is: + + # use the INTERNET_FLAG_ASYNC when initializing + $params{'flags'}=INTERNET_FLAG_ASYNC; + $INET = new Win32::Internet(\%params); + + # initialize the callback routine + $INET->SetStatusCallback(); + + # specify the context parameter (the last 1 in this case) + $INET->HTTP($HTTP, "www.yahoo.com", "anonymous", "dada\@divinf.it", 80, 0, 1); + +At this point, control returns immediately to Perl and $INET->Error() +will return 997, which means an asynchronous I/O operation is +pending. Now, you can call + + $HTTP->GetStatusCallback(1); + +in a loop to verify what's happening; see also C<GetStatusCallback>. + +=item TimeConvert time + +=item TimeConvert seconds, minute, hours, day, month, year, + day_of_week, RFC + +The first form takes a HTTP date/time string and returns the date/time +converted in the following array: I<seconds, minute, hours, day, +month, year, day_of_week>. + +The second form does the opposite (or at least it should, because +actually seems to be malfunctioning): it takes the values and returns +an HTTP date/time string, in the RFC format specified by the I<RFC> +parameter (OK, I didn't find yet any accepted value in the range +0..2000, let me know if you have more luck with it). + +Example: + + ($sec, $min, $hour, $day, $mday, $year, $wday) = + $INET->TimeConvert("Sun, 26 Jan 1997 20:01:52 GMT"); + + # the opposite DOESN'T WORK! which value should $RFC have??? + $time = $INET->TimeConvert(52, 1, 20, 26, 1, 1997, 0, $RFC); + +=item UserAgent [name] + +Reads or sets the user agent used for HTTP requests. If no I<name> +parameter is specified, the current value is returned; otherwise, the +user agent is set to I<name>. See also C<QueryOption> and +C<SetOption>. + +Example: + + $INET->UserAgent("Mozilla/3.0"); + $useragent = $INET->UserAgent(); + +=item Username [name] + +Reads or sets the username used for an C<FTP> or C<HTTP> connection. +If no I<name> parameter is specified, the current value is returned; +otherwise, the username is set to I<name>. See also C<Password>, +C<QueryOption> and SetOption. + +Example: + + $HTTP->Username("dada"); + $username = $HTTP->Username(); + +=item Version + +Returns the version numbers for the Win32::Internet package and the +WININET.DLL version, as an array or string, depending on the context. +The string returned will contain "package_version/DLL_version", while +the array will contain: "package_version", "DLL_version". + +Example: + + $version = $INET->Version(); # should return "0.06/4.70.1215" + @version = $INET->Version(); # should return ("0.06", "4.70.1215") + +=back + + +=head2 FTP Functions + +B<General Note> + +All methods assume that you have the following lines: + + use Win32::Internet; + $INET = new Win32::Internet(); + $INET->FTP($FTP, "hostname", "username", "password"); + +somewhere before the method calls; in other words, we assume that you +have an Internet object called $INET and an open FTP session called +$FTP. + +See C<new> and C<FTP> for more information. + + +B<Methods> + +=over + +=item Ascii + +=item Asc + +Sets the ASCII transfer mode for this FTP session. It will be applied +to the subsequent C<Get> functions. See also the C<Binary> and +C<Mode> function. + +Example: + + $FTP->Ascii(); + +=item Binary + +=item Bin + +Sets the binary transfer mode for this FTP session. It will be +applied to the subsequent C<Get> functions. See also the C<Ascii> and +C<Mode> function. + +Example: + + $FTP->Binary(); + +=item Cd path + +=item Cwd path + +=item Chdir path + +Changes the current directory on the FTP remote host. Returns I<path> +or C<undef> on error. + +Example: + + $FTP->Cd("/pub"); + +=item Delete file + +=item Del file + +Deletes a file on the FTP remote host. Returns C<undef> on error. + +Example: + + $FTP->Delete("110-i86.zip"); + +=item Get remote, [local, overwrite, flags, context] + +Gets the I<remote> FTP file and saves it locally in I<local>. If +I<local> is not specified, it will be the same name as I<remote>. +Returns C<undef> on error. The parameters and their values are: + +=over + +=item * remote + +The name of the remote file on the FTP server. Default: I<none>. + +=item * local + +The name of the local file to create. Default: remote. + +=item * overwrite + +If 0, overwrites I<local> if it exists; with any other value, the +function fails if the I<local> file already exists. Default: 0. + +=item * flags + +Additional flags affecting the behavior of the function. Default: +I<none>. + +=item * context + +A number to identify this operation if it is asynchronous. See +C<SetStatusCallback> and C<GetStatusCallback> for more info on +asynchronous operations. Default: I<none>. + +=back + +Refer to the L<"Microsoft Win32 Internet Functions"> documentation for +more details on those parameters. + +Example: + + $FTP->Get("110-i86.zip"); + $FTP->Get("/pub/perl/languages/CPAN/00index.html", "CPAN_index.html"); + +=item List [pattern, listmode] + +=item Ls [pattern, listmode] + +=item Dir [pattern, listmode] + +Returns a list containing the files found in this directory, +eventually matching the given I<pattern> (which, if omitted, is +considered "*.*"). The content of the returned list depends on the +I<listmode> parameter, which can have the following values: + +=over + +=item * listmode=1 (or omitted) + +the list contains the names of the files found. Example: + + @files = $FTP->List(); + @textfiles = $FTP->List("*.txt"); + foreach $file (@textfiles) { + print "Name: ", $file, "\n"; + } + +=item * listmode=2 + +the list contains 7 values for each file, which respectively are: + +=over + +=item * the file name + +=item * the DOS short file name, aka 8.3 + +=item * the size + +=item * the attributes + +=item * the creation time + +=item * the last access time + +=item * the last modified time + +=back + +Example: + + @files = $FTP->List("*.*", 2); + for($i=0; $i<=$#files; $i+=7) { + print "Name: ", @files[$i], "\n"; + print "Size: ", @files[$i+2], "\n"; + print "Attr: ", @files[$i+3], "\n"; + } + +=item * listmode=3 + +the list contains a reference to an hash array for each found file; +each hash contains: + +=over + +=item * name => the file name + +=item * altname => the DOS short file name, aka 8.3 + +=item * size => the size + +=item * attr => the attributes + +=item * ctime => the creation time + +=item * atime => the last access time + +=item * mtime => the last modified time + +=back + +Example: + + @files = $FTP->List("*.*", 3); + foreach $file (@files) { + print $file->{'name'}, " ", $file->{'size'}, " ", $file->{'attr'}, "\n"; + } + +B<Note:> all times are reported as strings of the following format: +I<second, hour, minute, day, month, year>. + +Example: + + $file->{'mtime'} == "0,10,58,9,12,1996" stands for 09 Dec 1996 at 10:58:00 + +=back + +=item Mkdir name + +=item Md name + +Creates a directory on the FTP remote host. Returns C<undef> on error. + +Example: + + $FTP->Mkdir("NextBuild"); + +=item Mode [mode] + +If called with no arguments, returns the current transfer mode for +this FTP session ("asc" for ASCII or "bin" for binary). The I<mode> +argument can be "asc" or "bin", in which case the appropriate transfer +mode is selected. See also the Ascii and Binary functions. Returns +C<undef> on errors. + +Example: + + print "Current mode is: ", $FTP->Mode(); + $FTP->Mode("asc"); # ... same as $FTP->Ascii(); + +=item Pasv [mode] + +If called with no arguments, returns 1 if the current FTP session has +passive transfer mode enabled, 0 if not. + +You can call it with a I<mode> parameter (0/1) only as a method of a +Internet object (see C<new>), in which case it will set the default +value for the next C<FTP> objects you create (read: set it before, +because you can't change this value once you opened the FTP session). + +Example: + + print "Pasv is: ", $FTP->Pasv(); + + $INET->Pasv(1); + $INET->FTP($FTP,"ftp.activeware.com", "anonymous", "dada\@divinf.it"); + $FTP->Pasv(0); # this will be ignored... + +=item Put local, [remote, context] + +Upload the I<local> file to the FTP server saving it under the name +I<remote>, which if if omitted is the same name as I<local>. Returns +C<undef> on error. + +I<context> is a number to identify this operation if it is asynchronous. +See C<SetStatusCallback> and C<GetStatusCallback> for more info on +asynchronous operations. + +Example: + + $FTP->Put("internet.zip"); + $FTP->Put("d:/users/dada/temp.zip", "/temp/dada.zip"); + +=item Pwd + +Returns the current directory on the FTP server or C<undef> on errors. + +Example: + + $path = $FTP->Pwd(); + +=item Rename oldfile, newfile + +=item Ren oldfile, newfile + +Renames a file on the FTP remote host. Returns C<undef> on error. + +Example: + + $FTP->Rename("110-i86.zip", "68i-011.zip"); + +=item Rmdir name + +=item Rd name + +Removes a directory on the FTP remote host. Returns C<undef> on error. + +Example: + + $FTP->Rmdir("CurrentBuild"); + +=back + +=head2 HTTP Functions + +B<General Note> + +All methods assume that you have the following lines: + + use Win32::Internet; + $INET = new Win32::Internet(); + $INET->HTTP($HTTP, "hostname", "username", "password"); + +somewhere before the method calls; in other words, we assume that you +have an Internet object called $INET and an open HTTP session called +$HTTP. + +See C<new> and C<HTTP> for more information. + + +B<Methods> + +=over + +=item AddHeader header, [flags] + +Adds HTTP request headers to an HTTP request object created with +C<OpenRequest>. For the possible values of I<flags> refer to the +L<"Microsoft Win32 Internet Functions"> document. + +Example: + + $HTTP->OpenRequest($REQUEST,"/index.html"); + $REQUEST->AddHeader("If-Modified-Since: Sunday, 17-Nov-96 11:40:03 GMT"); + $REQUEST->AddHeader("Accept: text/html\r\n", HTTP_ADDREQ_FLAG_REPLACE); + +=item OpenRequest requestobject, [path, method, version, referer, accept, flags, context] + +=item OpenRequest requestobject, hashref + +Opens an HTTP request. Returns C<undef> on errors or a number if the +connection was succesful. You can then use one of the C<AddHeader>, +C<SendRequest>, C<QueryInfo>, C<QueryDataAvailable> and C<ReadFile> +methods on the newly created I<requestobject>. The parameters and +their values are: + +=over + +=item * path + +The object to request. This is generally a file name, an executable +module, etc. Default: / + +=item * method + +The method to use; can actually be GET, POST, HEAD or PUT. Default: +GET + +=item * version + +The HTTP version. Default: HTTP/1.0 + +=item * referer + +The URL of the document from which the URL in the request was +obtained. Default: I<none> + +=item * accept + +A single string with "\0" (ASCII zero) delimited list of content +types accepted. The string must be terminated by "\0\0". +Default: "text/*\0image/gif\0image/jpeg\0\0" + +=item * flags + +Additional flags affecting the behavior of the function. Default: +I<none> + +=item * context + +A number to identify this operation if it is asynchronous. See +C<SetStatusCallback> and C<GetStatusCallback> for more info on +asynchronous operations. Default: I<none> + +=back + +Refer to the L<"Microsoft Win32 Internet Functions"> documentation for +more details on those parameters. If you pass I<hashref> (a reference to +an hash array), the following values are taken from the array: + + %hash=( + "path" => "path", + "method" => "method", + "version" => "version", + "referer" => "referer", + "accept" => "accept", + "flags" => flags, + "context" => context, + ); + +See also C<Request>. + +Example: + + $HTTP->OpenRequest($REQUEST, "/index.html"); + $HTTP->OpenRequest($REQUEST, "/index.html", "GET", "HTTP/0.9"); + + $params{"path"} = "/index.html"; + $params{"flags"} = " + $HTTP->OpenRequest($REQUEST, \%params); + +=item QueryInfo header, [flags] + +Queries information about an HTTP request object created with +C<OpenRequest>. You can specify an I<header> (for example, +"Content-type") and/or one or more I<flags>. If you don't specify +I<flags>, HTTP_QUERY_CUSTOM will be used by default; this means that +I<header> should contain a valid HTTP header name. For the possible +values of I<flags> refer to the L<"Microsoft Win32 Internet +Functions"> document. + +Example: + + $HTTP->OpenRequest($REQUEST,"/index.html"); + $statuscode = $REQUEST->QueryInfo("", HTTP_QUERY_STATUS_CODE); + $headers = $REQUEST->QueryInfo("", HTTP_QUERY_RAW_HEADERS_CRLF); # will get all the headers + $length = $REQUEST->QueryInfo("Content-length"); + +=item Request [path, method, version, referer, accept, flags] + +=item Request hashref + +Performs an HTTP request and returns an array containing the status +code, the headers and the content of the file. It is a one-step +procedure that makes an C<OpenRequest>, a C<SendRequest>, some +C<QueryInfo>, C<ReadFile> and finally C<Close>. For a description of +the parameters, see C<OpenRequest>. + +Example: + + ($statuscode, $headers, $file) = $HTTP->Request("/index.html"); + ($s, $h, $f) = $HTTP->Request("/index.html", "GET", "HTTP/1.0"); + +=item SendRequest [postdata] + +Send an HTTP request to the destination server. I<postdata> are any +optional data to send immediately after the request header; this is +generally used for POST or PUT requests. See also C<OpenRequest>. + +Example: + + $HTTP->OpenRequest($REQUEST, "/index.html"); + $REQUEST->SendRequest(); + + # A POST request... + $HTTP->OpenRequest($REQUEST, "/cgi-bin/somescript.pl", "POST"); + + #This line is a must -> (thanks Philip :) + $REQUEST->AddHeader("Content-Type: application/x-www-form-urlencoded"); + + $REQUEST->SendRequest("key1=value1&key2=value2&key3=value3"); + +=back + + +=head1 APPENDIX + + +=head2 Microsoft Win32 Internet Functions + +Complete documentation for the Microsoft Win32 Internet Functions can +be found, in both HTML and zipped Word format, at this address: + + http://www.microsoft.com/intdev/sdk/docs/wininet/ + +=head2 Functions Table + +This table reports the correspondence between the functions offered by +WININET.DLL and their implementation in the Win32::Internet +extension. Functions showing a "---" are not currently +implemented. Functions enclosed in parens ( ) aren't implemented +straightforwardly, but in a higher-level routine, eg. together with +other functions. + + WININET.DLL Win32::Internet + + InternetOpen new Win32::Internet + InternetConnect FTP / HTTP + InternetCloseHandle Close + InternetQueryOption QueryOption + InternetSetOption SetOption + InternetSetOptionEx --- + InternetSetStatusCallback SetStatusCallback + InternetStatusCallback GetStatusCallback + InternetConfirmZoneCrossing --- + InternetTimeFromSystemTime TimeConvert + InternetTimeToSystemTime TimeConvert + InternetAttemptConnect --- + InternetReadFile ReadFile + InternetSetFilePointer --- + InternetFindNextFile (List) + InternetQueryDataAvailable QueryDataAvailable + InternetGetLastResponseInfo GetResponse + InternetWriteFile --- + InternetCrackUrl CrackURL + InternetCreateUrl CreateURL + InternetCanonicalizeUrl CanonicalizeURL + InternetCombineUrl CombineURL + InternetOpenUrl OpenURL + FtpFindFirstFile (List) + FtpGetFile Get + FtpPutFile Put + FtpDeleteFile Delete + FtpRenameFile Rename + FtpOpenFile --- + FtpCreateDirectory Mkdir + FtpRemoveDirectory Rmdir + FtpSetCurrentDirectory Cd + FtpGetCurrentDirectory Pwd + HttpOpenRequest OpenRequest + HttpAddRequestHeaders AddHeader + HttpSendRequest SendRequest + HttpQueryInfo QueryInfo + InternetErrorDlg --- + + +Actually, I don't plan to add support for Gopher, Cookie and Cache +functions. I will if there will be consistent requests to do so. + +There are a number of higher-level functions in the Win32::Internet +that simplify some usual procedures, calling more that one WININET API +function. This table reports those functions and the relative WININET +functions they use. + + Win32::Internet WININET.DLL + + FetchURL InternetOpenUrl + InternetQueryDataAvailable + InternetReadFile + InternetCloseHandle + + ReadEntireFile InternetQueryDataAvailable + InternetReadFile + + Request HttpOpenRequest + HttpSendRequest + HttpQueryInfo + InternetQueryDataAvailable + InternetReadFile + InternetCloseHandle + + List FtpFindFirstFile + InternetFindNextFile + + +=head2 Constants + +Those are the constants exported by the package in the main namespace +(eg. you can use them in your scripts); for their meaning and proper +use, refer to the Microsoft Win32 Internet Functions document. + + HTTP_ADDREQ_FLAG_ADD + HTTP_ADDREQ_FLAG_REPLACE + HTTP_QUERY_ALLOW + HTTP_QUERY_CONTENT_DESCRIPTION + HTTP_QUERY_CONTENT_ID + HTTP_QUERY_CONTENT_LENGTH + HTTP_QUERY_CONTENT_TRANSFER_ENCODING + HTTP_QUERY_CONTENT_TYPE + HTTP_QUERY_COST + HTTP_QUERY_CUSTOM + HTTP_QUERY_DATE + HTTP_QUERY_DERIVED_FROM + HTTP_QUERY_EXPIRES + HTTP_QUERY_FLAG_REQUEST_HEADERS + HTTP_QUERY_FLAG_SYSTEMTIME + HTTP_QUERY_LANGUAGE + HTTP_QUERY_LAST_MODIFIED + HTTP_QUERY_MESSAGE_ID + HTTP_QUERY_MIME_VERSION + HTTP_QUERY_PRAGMA + HTTP_QUERY_PUBLIC + HTTP_QUERY_RAW_HEADERS + HTTP_QUERY_RAW_HEADERS_CRLF + HTTP_QUERY_REQUEST_METHOD + HTTP_QUERY_SERVER + HTTP_QUERY_STATUS_CODE + HTTP_QUERY_STATUS_TEXT + HTTP_QUERY_URI + HTTP_QUERY_USER_AGENT + HTTP_QUERY_VERSION + HTTP_QUERY_WWW_LINK + ICU_BROWSER_MODE + ICU_DECODE + ICU_ENCODE_SPACES_ONLY + ICU_ESCAPE + ICU_NO_ENCODE + ICU_NO_META + ICU_USERNAME + INTERNET_FLAG_PASSIVE + INTERNET_FLAG_ASYNC + INTERNET_FLAG_HYPERLINK + INTERNET_FLAG_KEEP_CONNECTION + INTERNET_FLAG_MAKE_PERSISTENT + INTERNET_FLAG_NO_AUTH + INTERNET_FLAG_NO_AUTO_REDIRECT + INTERNET_FLAG_NO_CACHE_WRITE + INTERNET_FLAG_NO_COOKIES + INTERNET_FLAG_READ_PREFETCH + INTERNET_FLAG_RELOAD + INTERNET_FLAG_RESYNCHRONIZE + INTERNET_FLAG_TRANSFER_ASCII + INTERNET_FLAG_TRANSFER_BINARY + INTERNET_INVALID_PORT_NUMBER + INTERNET_INVALID_STATUS_CALLBACK + INTERNET_OPEN_TYPE_DIRECT + INTERNET_OPEN_TYPE_PROXY + INTERNET_OPEN_TYPE_PROXY_PRECONFIG + INTERNET_OPTION_CONNECT_BACKOFF + INTERNET_OPTION_CONNECT_RETRIES + INTERNET_OPTION_CONNECT_TIMEOUT + INTERNET_OPTION_CONTROL_SEND_TIMEOUT + INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT + INTERNET_OPTION_DATA_SEND_TIMEOUT + INTERNET_OPTION_DATA_RECEIVE_TIMEOUT + INTERNET_OPTION_HANDLE_TYPE + INTERNET_OPTION_LISTEN_TIMEOUT + INTERNET_OPTION_PASSWORD + INTERNET_OPTION_READ_BUFFER_SIZE + INTERNET_OPTION_USER_AGENT + INTERNET_OPTION_USERNAME + INTERNET_OPTION_VERSION + INTERNET_OPTION_WRITE_BUFFER_SIZE + INTERNET_SERVICE_FTP + INTERNET_SERVICE_GOPHER + INTERNET_SERVICE_HTTP + INTERNET_STATUS_CLOSING_CONNECTION + INTERNET_STATUS_CONNECTED_TO_SERVER + INTERNET_STATUS_CONNECTING_TO_SERVER + INTERNET_STATUS_CONNECTION_CLOSED + INTERNET_STATUS_HANDLE_CLOSING + INTERNET_STATUS_HANDLE_CREATED + INTERNET_STATUS_NAME_RESOLVED + INTERNET_STATUS_RECEIVING_RESPONSE + INTERNET_STATUS_REDIRECT + INTERNET_STATUS_REQUEST_COMPLETE + INTERNET_STATUS_REQUEST_SENT + INTERNET_STATUS_RESOLVING_NAME + INTERNET_STATUS_RESPONSE_RECEIVED + INTERNET_STATUS_SENDING_REQUEST + + +=head1 VERSION HISTORY + +=over + +=item * 0.082 (4 Sep 2001) + +=over + +=item * + +Fix passive FTP mode. INTERNET_FLAG_PASSIVE was misspelled in earlier +versions (as INTERNET_CONNECT_FLAG_PASSIVE) and wouldn't work. Found +by Steve Raynesford <stever@evolvecomm.com>. + +=back + +=item * 0.081 (25 Sep 1999) + +=over + +=item * + +Documentation converted to pod format by Jan Dubois <JanD@ActiveState.com>. + +=item * + +Minor changes from Perl 5.005xx compatibility. + +=back + +=item * 0.08 (14 Feb 1997) + +=over + +=item * + +fixed 2 more bugs in Option(s) related subs (thanks to Brian +Helterline!). + +=item * + +Error() now gets error messages directly from WININET.DLL. + +=item * + +The PLL file now comes in 2 versions, one for Perl version 5.001 +(build 100) and one for Perl version 5.003 (build 300 and +higher). Everybody should be happy now :) + +=item * + +added an installation program. + +=back + +=item * 0.07 (10 Feb 1997) + +=over + +=item * + +fixed a bug in Version() introduced with 0.06... + +=item * + +completely reworked PM file, fixed *lots* of minor bugs, and removed +almost all the warnings with "perl -w". + +=back + +=item * 0.06 (26 Jan 1997) + +=over + +=item * + +fixed another hideous bug in "new" (the 'class' parameter was still +missing). + +=item * + +added support for asynchronous operations (work still in embryo). + +=item * + +removed the ending \0 (ASCII zero) from the DLL version returned by +"Version". + +=item * + +added a lot of constants. + +=item * + +added safefree() after every safemalloc() in C... wonder why I didn't +it before :) + +=item * + +added TimeConvert, which actually works one way only. + +=back + +=item * 0.05f (29 Nov 1996) + +=over + +=item * + +fixed a bug in "new" (parameters passed were simply ignored). + +=item * + +fixed another bug: "Chdir" and "Cwd" were aliases of RMDIR instead of +CD.. + +=back + +=item * 0.05 (29 Nov 1996) + +=over + +=item * + +added "CrackURL" and "CreateURL". + +=item * + +corrected an error in TEST.PL (there was a GetUserAgent instead of +UserAgent). + +=back + +=item * 0.04 (25 Nov 1996) + +=over + +=item * + +added "Version" to retrieve package and DLL versions. + +=item * + +added proxies and other options to "new". + +=item * + +changed "OpenRequest" and "Request" to read parameters from a hash. + +=item * + +added "SetOption/QueryOption" and a lot of relative functions +(connect, username, password, useragent, etc.). + +=item * + +added "CanonicalizeURL" and "CombineURL". + +=item * + +"Error" covers a wider spectrum of errors. + +=back + +=item * 0.02 (18 Nov 1996) + +=over + +=item * + +added support for HTTP sessions and requests. + +=back + +=item * 0.01 (11 Nov 1996) + +=over + +=item * + +fetching of HTTP, FTP and GOPHER URLs. + +=item * + +complete set of commands to manage an FTP session. + +=back + +=back + +=head1 AUTHOR + +Version 0.08 (14 Feb 1997) by Aldo Calpini <a.calpini@romagiubileo.it> + + +=head1 CREDITS + +Win32::Internet is based on the Win32::Registry code written by Jesse +Dougherty. + +Additional thanks to: Carl Tichler for his help in the initial +development; Tore Haraldsen, Brian Helterline for the bugfixes; Dave +Roth for his great source code examples. + + +=head1 DISCLAIMER + +This program is FREE; you can redistribute, modify, disassemble, or +even reverse engineer this software at your will. Keep in mind, +however, that NOTHING IS GUARANTEED to work and everything you do is +AT YOUR OWN RISK - I will not take responsability for any damage, loss +of money and/or health that may arise from the use of this program! + +This is distributed under the terms of Larry Wall's Artistic License. diff --git a/Master/tlpkg/tlperl.old/lib/Win32/Job.pm b/Master/tlpkg/tlperl.old/lib/Win32/Job.pm new file mode 100644 index 00000000000..3350f76400d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/Job.pm @@ -0,0 +1,370 @@ +package Win32::Job; + +use strict; +use base qw(DynaLoader); +use vars qw($VERSION); + +$VERSION = '0.01'; + +use constant WIN32s => 0; +use constant WIN9X => 1; +use constant WINNT => 2; + +require Win32 unless defined &Win32::GetOSVersion; +my @ver = Win32::GetOSVersion; +die "Win32::Job is not supported on $ver[0]" unless ( + $ver[4] == WINNT and ( + $ver[1] > 5 or + ($ver[1] == 5 and $ver[2] > 0) or + ($ver[1] == 5 and $ver[2] == 0 and $ver[3] >= 0) + ) +); + +Win32::Job->bootstrap($VERSION); + +1; + +__END__ + +=head1 NAME + +Win32::Job - Run sub-processes in a "job" environment + +=head1 SYNOPSIS + + use Win32::Job; + + my $job = Win32::Job->new; + + # Run 'perl Makefile.PL' for 10 seconds + $job->spawn($Config{perlpath}, "perl Makefile.PL"); + $job->run(10); + +=head1 PLATFORMS + +Win32::Job requires Windows 2000 or later. Windows 95, 98, NT, and Me are not +supported. + +=head1 DESCRIPTION + +Windows 2000 introduced the concept of a "job": a collection of processes +which can be controlled as a single unit. For example, you can reliably kill a +process and all of its children by launching the process in a job, then +telling Windows to kill all processes in the job. Win32::Job makes this +feature available to Perl. + +For example, imagine you want to allow 2 minutes for a process to complete. +If you have control over the child process, you can probably just run it in +the background, then poll every second to see if it has finished. + +That's fine as long as the child process doesn't spawn any child processes. +What if it does? If you wrote the child process yourself and made an effort to +clean up your child processes before terminating, you don't have to worry. +If not, you will leave hanging processes (called "zombie" processes in Unix). + +With Win32::Job, just create a new Job, then use the job to spawn the child +process. All I<its> children will also be created in the new Job. When you +time out, just call the job's kill() method and the entire process tree will +be terminated. + +=head1 Using Win32::Job + +The following methods are available: + +=over 4 + +=item 1 + +new() + + new(); + +Creates a new Job object using the Win32 API call CreateJobObject(). The job +is created with a default security context, and is unnamed. + +Note: this method returns C<undef> if CreateJobObject() fails. Look at C<$^E> +for more detailed error information. + +=item 2 + +spawn() + + spawn($exe, $args, \%opts); + +Creates a new process and associates it with the Job. The process is initially +suspended, and can be resumed with one of the other methods. Uses the Win32 +API call CreateProcess(). Returns the PID of the newly created process. + +Note: this method returns C<undef> if CreateProcess() fails. See C<$^E> for +more detailed error information. One reason this will fail is if the calling +process is itself part of a job, and the job's security context does not allow +child processes to be created in a different job context than the parent. + +The arguments are described here: + +=over 4 + +=item 1 + +$exe + +The executable program to run. This may be C<undef>, in which case the first +argument in $args is the program to run. + +If this has path information in it, it is used "as is" and passed to +CreateProcess(), which interprets it as either an absolute path, or a +path relative to the current drive and directory. If you did not specify an +extension, ".exe" is assumed. + +If there are no path separators (either backslashes or forward slashes), +then Win32::Job will search the current directory and your PATH, looking +for the file. In addition, if you did not specify an extension, then +Win32::Job checks ".exe", ".com", and ".bat" in order. If it finds a ".bat" +file, Win32::Job will actually call F<cmd.exe> and prepend "cmd.exe" to the +$args. + +For example, assuming a fairly normal PATH: + + spawn(q{c:\winnt\system\cmd.exe}, q{cmd /C "echo %PATH%"}) + exefile: c:\winnt\system\cmd.exe + cmdline: cmd /C "echo %PATH%" + + spawn("cmd.exe", q{cmd /C "echo %PATH%"}) + exefile: c:\winnt\system\cmd.exe + cmdline: cmd /C "echo %PATH%" + +=item 2 + +$args + +The commandline to pass to the executable program. The first word will be +C<argv[0]> to an EXE file, so you should repeat the command name in $args. + +For example: + + $job->spawn($Config{perlpath}, "perl foo.pl"); + +In this case, the "perl" is ignored, since perl.exe doesn't use it. + +=item 3 + +%opts + +A hash reference for advanced options. This parameter is optional. +the following keys are recognized: + +=over 4 + +=item cwd + +A string specifying the current directory of the new process. + +By default, the process shares the parent's current directory, C<.>. + +=item new_console + +A boolean; if true, the process is started in a new console window. + +By default, the process shares the parent's console. This has no effect on GUI +programs which do not interact with the console. + +=item window_attr + +Either C<minimized>, which displays the new window minimized; C<maximimzed>, +which shows the new window maximized; or C<hidden>, which does not display the +new window. + +By default, the window is displayed using its application's defaults. + +=item new_group + +A boolean; if true, the process is the root of a new process group. This +process group includes all descendents of the child. + +By default, the process is in the parent's process group (but in a new job). + +=item no_window + +A boolean; if true, the process is run without a console window. This flag is +only valid when starting a console application, otherwise it is ignored. If you +are launching a GUI application, use the C<window_attr> tag instead. + +By default, the process shares its parent's console. + +=item stdin + +An open input filehandle, or the name of an existing file. The resulting +filehandle will be used for the child's standard input handle. + +By default, the child process shares the parent's standard input. + +=item stdout + +An open output filehandle or filename (will be opened for append). The +resulting filehandle will be used for the child's standard output handle. + +By default, the child process shares the parent's standard output. + +=item stderr + +An open output filehandle or filename (will be opened for append). The +resulting filehandle will be used for the child's standard error handle. + +By default, the child process shares the parent's standard error. + +=back + +Unrecognized keys are ignored. + +=back + +=item 3 + +run() + + run($timeout, $which); + +Provides a simple way to run the programs with a time limit. The +$timeout is in seconds with millisecond accuracy. This call blocks for +up to $timeout seconds, or until the processes finish. + +The $which parameter specifies whether to wait for I<all> processes to +complete within the $timeout, or whether to wait for I<any> process to +complete. You should set this to a boolean, where a true value means to +wait for I<all> the processes to complete, and a false value to wait +for I<any>. If you do not specify $which, it defaults to true (C<all>). + +Returns a boolean indicating whether the processes exited by themselves, +or whether the time expired. A true return value means the processes +exited normally; a false value means one or more processes was killed +will $timeout. + +You can get extended information on process exit codes using the +status() method. + +For example, this is how to build two perl modules at the same time, +with a 5 minute timeout: + + use Win32::Job; + $job = Win32::Job->new; + $job->spawn("cmd", q{cmd /C "cd Mod1 && nmake"}); + $job->spawn("cmd", q{cmd /C "cd Mod2 && nmake"}); + $ok = $job->run(5 * 60); + print "Mod1 and Mod2 built ok!\n" if $ok; + +=item 4 + +watch() + + watch(\&handler, $interval, $which); + + handler($job); + +Provides more fine-grained control over how to stop the programs. You specify +a callback and an interval in seconds, and Win32::Job will call the "watchdog" +function at this interval, either until the processes finish or your watchdog +tells Win32::Job to stop. You must return a value indicating whether to stop: a +true value means to terminate the processes immediately. + +The $which parameter has the same meaning as run()'s. + +Returns a boolean with the same meaning as run()'s. + +The handler may do anything it wants. One useful application of the watch() +method is to check the filesize of the output file, and terminate the Job if +the file becomes larger than a certain limit: + + use Win32::Job; + $job = Win32::Job->new; + $job->spawn("cmd", q{cmd /C "cd Mod1 && nmake"}, { + stdin => 'NUL', # the NUL device + stdout => 'stdout.log', + stderr => 'stdout.log', + }); + $ok = $job->watch(sub { + return 1 if -s "stdout.log" > 1_000_000; + }, 1); + print "Mod1 built ok!\n" if $ok; + +=item 5 + +status() + + status() + +Returns a hash containing information about the processes in the job. +Only returns valid information I<after> calling either run() or watch(); +returns an empty hash if you have not yet called them. May be called from a +watch() callback, in which case the C<exitcode> field should be ignored. + +The keys of the hash are the process IDs; the values are a subhash +containing the following keys: + +=over 4 + +=item exitcode + +The exit code returned by the process. If the process was killed because +of a timeout, the value is 293. + +=item time + +The time accumulated by the process. This is yet another subhash containing +the subkeys (i) C<user>, the amount of time the process spent in user +space; (ii) C<kernel>, the amount of time the process spent in kernel space; +and (iii) C<elapsed>, the total time the process was running. + +=back + +=item 6 + +kill() + + kill(); + +Kills all processes and subprocesses in the Job. Has no return value. +Sets the exit code to all processes killed to 293, which you can check +for in the status() return value. + +=back + +=head1 SEE ALSO + +For more information about jobs, see Microsoft's online help at + + http://msdn.microsoft.com/ + +For other modules which do similar things (but not as well), see: + +=over 4 + +=item 1 + +Win32::Process + +Low-level access to creating processes in Win32. See L<Win32::Process>. + +=item 2 + +Win32::Console + +Low-level access to consoles in Win32. See L<Win32::Console>. + +=item 3 + +Win32::ProcFarm + +Manage pools of threads to perform CPU-intensive tasks on Windows. See +L<Win32::ProcFarm>. + +=back + +=head1 AUTHOR + +ActiveState (support@ActiveState.com) + +=head1 COPYRIGHT + +Copyright (c) 2002, ActiveState Corporation. All Rights Reserved. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Win32/Mutex.pm b/Master/tlpkg/tlperl.old/lib/Win32/Mutex.pm new file mode 100644 index 00000000000..801c2d35cda --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/Mutex.pm @@ -0,0 +1,125 @@ +#--------------------------------------------------------------------- +package Win32::Mutex; +# +# Copyright 1998 Christopher J. Madsen +# +# Created: 3 Feb 1998 from the ActiveWare version +# (c) 1995 Microsoft Corporation. All rights reserved. +# Developed by ActiveWare Internet Corp., http://www.ActiveWare.com +# +# Other modifications (c) 1997 by Gurusamy Sarathy <gsar@activestate.com> +# +# Author: Christopher J. Madsen <cjm@pobox.com> +# Version: 1.00 (6-Feb-1998) +# +# This program is free software; you can redistribute it and/or modify +# it under the same terms as Perl itself. +# +# 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 either the +# GNU General Public License or the Artistic License for more details. +# +# Use Win32 mutex objects for synchronization +#--------------------------------------------------------------------- + +$VERSION = '1.02'; + +use Win32::IPC 1.00 '/./'; # Import everything +require Exporter; +require DynaLoader; + +@ISA = qw(Exporter DynaLoader Win32::IPC); +@EXPORT_OK = qw( + wait_all wait_any +); + +bootstrap Win32::Mutex; + +sub Create { $_[0] = Win32::Mutex->new(@_[1..2]) } +sub Open { $_[0] = Win32::Mutex->open($_[1]) } +sub Release { &release } + +1; +__END__ + +=head1 NAME + +Win32::Mutex - Use Win32 mutex objects from Perl + +=head1 SYNOPSIS + + require Win32::Mutex; + + $mutex = Win32::Mutex->new($initial,$name); + $mutex->wait; + +=head1 DESCRIPTION + +This module allows access to the Win32 mutex objects. The C<wait> +method and C<wait_all> & C<wait_any> functions are inherited from the +L<"Win32::IPC"> module. + +=head2 Methods + +=over 4 + +=item $mutex = Win32::Mutex->new([$initial, [$name]]) + +Constructor for a new mutex object. If C<$initial> is true, requests +immediate ownership of the mutex (default false). If C<$name> is +omitted, creates an unnamed mutex object. + +If C<$name> signifies an existing mutex object, then C<$initial> is +ignored and the object is opened. If this happens, C<$^E> will be set +to 183 (ERROR_ALREADY_EXISTS). + +=item $mutex = Win32::Mutex->open($name) + +Constructor for opening an existing mutex object. + +=item $mutex->release + +Release ownership of a C<$mutex>. You should have obtained ownership +of the mutex through C<new> or one of the wait functions. Returns +true if successful. + +=item $mutex->wait([$timeout]) + +Wait for ownership of C<$mutex>. See L<"Win32::IPC">. + +=back + +=head2 Deprecated Functions and Methods + +B<Win32::Mutex> still supports the ActiveWare syntax, but its use is +deprecated. + +=over 4 + +=item Create($MutObj,$Initial,$Name) + +Use C<$MutObj = Win32::Mutex-E<gt>new($Initial,$Name)> instead. + +=item Open($MutObj,$Name) + +Use C<$MutObj = Win32::Mutex-E<gt>open($Name)> instead. + +=item $MutObj->Release() + +Use C<$MutObj-E<gt>release> instead. + +=back + +=head1 AUTHOR + +Christopher J. Madsen E<lt>F<cjm@pobox.com>E<gt> + +Loosely based on the original module by ActiveWare Internet Corp., +F<http://www.ActiveWare.com> + +=cut + +# Local Variables: +# tmtrack-file-task: "Win32::Mutex" +# End: diff --git a/Master/tlpkg/tlperl.old/lib/Win32/NetAdmin.pm b/Master/tlpkg/tlperl.old/lib/Win32/NetAdmin.pm new file mode 100644 index 00000000000..ace31a619e4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/NetAdmin.pm @@ -0,0 +1,419 @@ +package Win32::NetAdmin; + +# +#NetAdmin.pm +#Written by Douglas_Lankshear@ActiveWare.com +# + +$VERSION = '0.08'; + +require Exporter; +require DynaLoader; + +require Win32 unless defined &Win32::IsWinNT; +die "The Win32::NetAdmin module works only on Windows NT" unless Win32::IsWinNT(); + +@ISA= qw( Exporter DynaLoader ); +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. +@EXPORT = qw( + DOMAIN_ALIAS_RID_ACCOUNT_OPS + DOMAIN_ALIAS_RID_ADMINS + DOMAIN_ALIAS_RID_BACKUP_OPS + DOMAIN_ALIAS_RID_GUESTS + DOMAIN_ALIAS_RID_POWER_USERS + DOMAIN_ALIAS_RID_PRINT_OPS + DOMAIN_ALIAS_RID_REPLICATOR + DOMAIN_ALIAS_RID_SYSTEM_OPS + DOMAIN_ALIAS_RID_USERS + DOMAIN_GROUP_RID_ADMINS + DOMAIN_GROUP_RID_GUESTS + DOMAIN_GROUP_RID_USERS + DOMAIN_USER_RID_ADMIN + DOMAIN_USER_RID_GUEST + FILTER_TEMP_DUPLICATE_ACCOUNT + FILTER_NORMAL_ACCOUNT + FILTER_INTERDOMAIN_TRUST_ACCOUNT + FILTER_WORKSTATION_TRUST_ACCOUNT + FILTER_SERVER_TRUST_ACCOUNT + SV_TYPE_WORKSTATION + SV_TYPE_SERVER + SV_TYPE_SQLSERVER + SV_TYPE_DOMAIN_CTRL + SV_TYPE_DOMAIN_BAKCTRL + SV_TYPE_TIMESOURCE + SV_TYPE_AFP + SV_TYPE_NOVELL + SV_TYPE_DOMAIN_MEMBER + SV_TYPE_PRINT + SV_TYPE_PRINTQ_SERVER + SV_TYPE_DIALIN + SV_TYPE_DIALIN_SERVER + SV_TYPE_XENIX_SERVER + SV_TYPE_NT + SV_TYPE_WFW + SV_TYPE_POTENTIAL_BROWSER + SV_TYPE_BACKUP_BROWSER + SV_TYPE_MASTER_BROWSER + SV_TYPE_DOMAIN_MASTER + SV_TYPE_DOMAIN_ENUM + SV_TYPE_SERVER_UNIX + SV_TYPE_SERVER_MFPN + SV_TYPE_SERVER_NT + SV_TYPE_SERVER_OSF + SV_TYPE_SERVER_VMS + SV_TYPE_WINDOWS + SV_TYPE_DFS + SV_TYPE_ALTERNATE_XPORT + SV_TYPE_LOCAL_LIST_ONLY + SV_TYPE_ALL + UF_TEMP_DUPLICATE_ACCOUNT + UF_NORMAL_ACCOUNT + UF_INTERDOMAIN_TRUST_ACCOUNT + UF_WORKSTATION_TRUST_ACCOUNT + UF_SERVER_TRUST_ACCOUNT + UF_MACHINE_ACCOUNT_MASK + UF_ACCOUNT_TYPE_MASK + UF_DONT_EXPIRE_PASSWD + UF_SETTABLE_BITS + UF_SCRIPT + UF_ACCOUNTDISABLE + UF_HOMEDIR_REQUIRED + UF_LOCKOUT + UF_PASSWD_NOTREQD + UF_PASSWD_CANT_CHANGE + USE_FORCE + USE_LOTS_OF_FORCE + USE_NOFORCE + USER_PRIV_MASK + USER_PRIV_GUEST + USER_PRIV_USER + USER_PRIV_ADMIN +); + +@EXPORT_OK = qw( + GetError + GetDomainController + GetAnyDomainController + UserCreate + UserDelete + UserGetAttributes + UserSetAttributes + UserChangePassword + UsersExist + GetUsers + GroupCreate + GroupDelete + GroupGetAttributes + GroupSetAttributes + GroupAddUsers + GroupDeleteUsers + GroupIsMember + GroupGetMembers + LocalGroupCreate + LocalGroupDelete + LocalGroupGetAttributes + LocalGroupSetAttributes + LocalGroupIsMember + LocalGroupGetMembers + LocalGroupGetMembersWithDomain + LocalGroupAddUsers + LocalGroupDeleteUsers + GetServers + GetTransports + LoggedOnUsers + GetAliasFromRID + GetUserGroupFromRID + GetServerDisks +); +$EXPORT_TAGS{ALL}= \@EXPORT_OK; + +=head1 NAME + +Win32::NetAdmin - manage network groups and users in perl + +=head1 SYNOPSIS + + use Win32::NetAdmin; + +=head1 DESCRIPTION + +This module offers control over the administration of groups and users over a +network. + +=head1 FUNCTIONS + +=head2 NOTE + +All of the functions return false if they fail, unless otherwise noted. +When a function fails call Win32::NetAdmin::GetError() rather than +GetLastError() or $^E to retrieve the error code. + +C<server> is optional for all the calls below. If not given the local machine is +assumed. + +=over 10 + +=item GetError() + +Returns the error code of the last call to this module. + +=item GetDomainController(server, domain, returnedName) + +Returns the name of the domain controller for server. + +=item GetAnyDomainController(server, domain, returnedName) + +Returns the name of any domain controller for a domain that is directly trusted +by the server. + +=item UserCreate(server, userName, password, passwordAge, privilege, homeDir, comment, flags, scriptPath) + +Creates a user on server with password, passwordAge, privilege, homeDir, comment, +flags, and scriptPath. + +=item UserDelete(server, user) + +Deletes a user from server. + +=item UserGetAttributes(server, userName, password, passwordAge, privilege, homeDir, comment, flags, scriptPath) + +Gets password, passwordAge, privilege, homeDir, comment, flags, and scriptPath +for user. + +=item UserSetAttributes(server, userName, password, passwordAge, privilege, homeDir, comment, flags, scriptPath) + +Sets password, passwordAge, privilege, homeDir, comment, flags, and scriptPath +for user. + +=item UserChangePassword(domainname, username, oldpassword, newpassword) + +Changes a users password. Can be run under any account. + +=item UsersExist(server, userName) + +Checks if a user exists. + +=item GetUsers(server, filter, userRef) + +Fills userRef with user names if it is an array reference and with the user +names and the full names if it is a hash reference. + +=item GroupCreate(server, group, comment) + +Creates a group. + +=item GroupDelete(server, group) + +Deletes a group. + +=item GroupGetAttributes(server, groupName, comment) + +Gets the comment. + +=item GroupSetAttributes(server, groupName, comment) + +Sets the comment. + +=item GroupAddUsers(server, groupName, users) + +Adds a user to a group. + +=item GroupDeleteUsers(server, groupName, users) + +Deletes a users from a group. + +=item GroupIsMember(server, groupName, user) + +Returns TRUE if user is a member of groupName. + +=item GroupGetMembers(server, groupName, userArrayRef) + +Fills userArrayRef with the members of groupName. + +=item LocalGroupCreate(server, group, comment) + +Creates a local group. + +=item LocalGroupDelete(server, group) + +Deletes a local group. + +=item LocalGroupGetAttributes(server, groupName, comment) + +Gets the comment. + +=item LocalGroupSetAttributes(server, groupName, comment) + +Sets the comment. + +=item LocalGroupIsMember(server, groupName, user) + +Returns TRUE if user is a member of groupName. + +=item LocalGroupGetMembers(server, groupName, userArrayRef) + +Fills userArrayRef with the members of groupName. + +=item LocalGroupGetMembersWithDomain(server, groupName, userRef) + +This function is similar LocalGroupGetMembers but accepts an array or +a hash reference. Unlike LocalGroupGetMembers it returns each user name +as C<DOMAIN\USERNAME>. If a hash reference is given, the function +returns to each user or group name the type (group, user, alias etc.). +The possible types are as follows: + + $SidTypeUser = 1; + $SidTypeGroup = 2; + $SidTypeDomain = 3; + $SidTypeAlias = 4; + $SidTypeWellKnownGroup = 5; + $SidTypeDeletedAccount = 6; + $SidTypeInvalid = 7; + $SidTypeUnknown = 8; + +=item LocalGroupAddUsers(server, groupName, users) + +Adds a user to a group. + +=item LocalGroupDeleteUsers(server, groupName, users) + +Deletes a users from a group. + +=item GetServers(server, domain, flags, serverRef) + +Gets an array of server names or an hash with the server names and the +comments as seen in the Network Neighborhood or the server manager. +For flags, see SV_TYPE_* constants. + +=item GetTransports(server, transportRef) + +Enumerates the network transports of a computer. If transportRef is an array +reference, it is filled with the transport names. If transportRef is a hash +reference then a hash of hashes is filled with the data for the transports. + +=item LoggedOnUsers(server, userRef) + +Gets an array or hash with the users logged on at the specified computer. If +userRef is a hash reference, the value is a semikolon separated string of +username, logon domain and logon server. + +=item GetAliasFromRID(server, RID, returnedName) + +=item GetUserGroupFromRID(server, RID, returnedName) + +Retrieves the name of an alias (i.e local group) or a user group for a RID +from the specified server. These functions can be used for example to get the +account name for the administrator account if it is renamed or localized. + +Possible values for C<RID>: + + DOMAIN_ALIAS_RID_ACCOUNT_OPS + DOMAIN_ALIAS_RID_ADMINS + DOMAIN_ALIAS_RID_BACKUP_OPS + DOMAIN_ALIAS_RID_GUESTS + DOMAIN_ALIAS_RID_POWER_USERS + DOMAIN_ALIAS_RID_PRINT_OPS + DOMAIN_ALIAS_RID_REPLICATOR + DOMAIN_ALIAS_RID_SYSTEM_OPS + DOMAIN_ALIAS_RID_USERS + DOMAIN_GROUP_RID_ADMINS + DOMAIN_GROUP_RID_GUESTS + DOMAIN_GROUP_RID_USERS + DOMAIN_USER_RID_ADMIN + DOMAIN_USER_RID_GUEST + +=item GetServerDisks(server, arrayRef) + +Returns an array with the disk drives of the specified server. The array +contains two-character strings (drive letter followed by a colon). + +=back + +=head1 EXAMPLE + + # Simple script using Win32::NetAdmin to set the login script for + # all members of the NT group "Domain Users". Only works if you + # run it on the PDC. (From Robert Spier <rspier@seas.upenn.edu>) + # + # FILTER_TEMP_DUPLICATE_ACCOUNTS + # Enumerates local user account data on a domain controller. + # + # FILTER_NORMAL_ACCOUNT + # Enumerates global user account data on a computer. + # + # FILTER_INTERDOMAIN_TRUST_ACCOUNT + # Enumerates domain trust account data on a domain controller. + # + # FILTER_WORKSTATION_TRUST_ACCOUNT + # Enumerates workstation or member server account data on a domain + # controller. + # + # FILTER_SERVER_TRUST_ACCOUNT + # Enumerates domain controller account data on a domain controller. + + + use Win32::NetAdmin qw(GetUsers GroupIsMember + UserGetAttributes UserSetAttributes); + + my %hash; + GetUsers("", FILTER_NORMAL_ACCOUNT , \%hash) + or die "GetUsers() failed: $^E"; + + foreach (keys %hash) { + my ($password, $passwordAge, $privilege, + $homeDir, $comment, $flags, $scriptPath); + if (GroupIsMember("", "Domain Users", $_)) { + print "Updating $_ ($hash{$_})\n"; + UserGetAttributes("", $_, $password, $passwordAge, $privilege, + $homeDir, $comment, $flags, $scriptPath) + or die "UserGetAttributes() failed: $^E"; + $scriptPath = "dnx_login.bat"; # this is the new login script + UserSetAttributes("", $_, $password, $passwordAge, $privilege, + $homeDir, $comment, $flags, $scriptPath) + or die "UserSetAttributes() failed: $^E"; + } + } + +=cut + +sub AUTOLOAD { + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + #reset $! to zero to reset any current errors. + local $! = 0; + my $val = constant($constname); + if ($! != 0) { + if ($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + ($pack,$file,$line) = caller; + die "Your vendor has not defined Win32::NetAdmin macro $constname, used in $file at line $line."; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + +$SidTypeUser = 1; +$SidTypeGroup = 2; +$SidTypeDomain = 3; +$SidTypeAlias = 4; +$SidTypeWellKnownGroup = 5; +$SidTypeDeletedAccount = 6; +$SidTypeInvalid = 7; +$SidTypeUnknown = 8; + +sub GetError() { + our $__lastError; + $__lastError; +} + +bootstrap Win32::NetAdmin; + +1; +__END__ + diff --git a/Master/tlpkg/tlperl.old/lib/Win32/NetResource.pm b/Master/tlpkg/tlperl.old/lib/Win32/NetResource.pm new file mode 100644 index 00000000000..04ac87acabd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/NetResource.pm @@ -0,0 +1,456 @@ +package Win32::NetResource; + +require Exporter; +require DynaLoader; +require AutoLoader; + +$VERSION = '0.053'; + +@ISA = qw(Exporter DynaLoader); +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. +@EXPORT = qw( + RESOURCEDISPLAYTYPE_DOMAIN + RESOURCEDISPLAYTYPE_FILE + RESOURCEDISPLAYTYPE_GENERIC + RESOURCEDISPLAYTYPE_GROUP + RESOURCEDISPLAYTYPE_SERVER + RESOURCEDISPLAYTYPE_SHARE + RESOURCEDISPLAYTYPE_TREE + RESOURCETYPE_ANY + RESOURCETYPE_DISK + RESOURCETYPE_PRINT + RESOURCETYPE_UNKNOWN + RESOURCEUSAGE_CONNECTABLE + RESOURCEUSAGE_CONTAINER + RESOURCEUSAGE_RESERVED + RESOURCE_CONNECTED + RESOURCE_GLOBALNET + RESOURCE_REMEMBERED + STYPE_DISKTREE + STYPE_PRINTQ + STYPE_DEVICE + STYPE_IPC + STYPE_SPECIAL + SHARE_NETNAME_PARMNUM + SHARE_TYPE_PARMNUM + SHARE_REMARK_PARMNUM + SHARE_PERMISSIONS_PARMNUM + SHARE_MAX_USES_PARMNUM + SHARE_CURRENT_USES_PARMNUM + SHARE_PATH_PARMNUM + SHARE_PASSWD_PARMNUM + SHARE_FILE_SD_PARMNUM +); + +@EXPORT_OK = qw( + GetSharedResources + AddConnection + CancelConnection + WNetGetLastError + GetError + GetUNCName + NetShareAdd + NetShareCheck + NetShareDel + NetShareGetInfo + NetShareSetInfo +); + +=head1 NAME + +Win32::NetResource - manage network resources in perl + +=head1 SYNOPSIS + + use Win32::NetResource; + + $ShareInfo = { + 'path' => "C:\\MyShareDir", + 'netname' => "MyShare", + 'remark' => "It is good to share", + 'passwd' => "", + 'current-users' =>0, + 'permissions' => 0, + 'maxusers' => -1, + 'type' => 0, + }; + + Win32::NetResource::NetShareAdd( $ShareInfo,$parm ) + or die "unable to add share"; + + +=head1 DESCRIPTION + +This module offers control over the network resources of Win32.Disks, +printers etc can be shared over a network. + +=head1 DATA TYPES + +There are two main data types required to control network resources. +In Perl these are represented by hash types. + +=over 4 + +=item %NETRESOURCE + + KEY VALUE + + 'Scope' => Scope of an Enumeration + RESOURCE_CONNECTED, + RESOURCE_GLOBALNET, + RESOURCE_REMEMBERED. + + 'Type' => The type of resource to Enum + RESOURCETYPE_ANY All resources + RESOURCETYPE_DISK Disk resources + RESOURCETYPE_PRINT Print resources + + 'DisplayType' => The way the resource should be displayed. + RESOURCEDISPLAYTYPE_DOMAIN + The object should be displayed as a domain. + RESOURCEDISPLAYTYPE_GENERIC + The method used to display the object does not matter. + RESOURCEDISPLAYTYPE_SERVER + The object should be displayed as a server. + RESOURCEDISPLAYTYPE_SHARE + The object should be displayed as a sharepoint. + + 'Usage' => Specifies the Resources usage: + RESOURCEUSAGE_CONNECTABLE + RESOURCEUSAGE_CONTAINER. + + 'LocalName' => Name of the local device the resource is + connected to. + + 'RemoteName' => The network name of the resource. + + 'Comment' => A string comment. + + 'Provider' => Name of the provider of the resource. + +=back + +=item %SHARE_INFO + +This hash represents the SHARE_INFO_502 struct. + +=over 4 + + KEY VALUE + 'netname' => Name of the share. + 'type' => type of share. + 'remark' => A string comment. + 'permissions' => Permissions value + 'maxusers' => the max # of users. + 'current-users' => the current # of users. + 'path' => The path of the share. + 'passwd' => A password if one is req'd + +=back + +=head1 FUNCTIONS + +=head2 NOTE + +All of the functions return false if they fail. + +=over 4 + +=item GetSharedResources(\@Resources,dwType,\%NetResource = NULL) + +Creates a list in @Resources of %NETRESOURCE hash references. + +The return value indicates whether there was an error in accessing +any of the shared resources. All the shared resources that were +encountered (until the point of an error, if any) are pushed into +@Resources as references to %NETRESOURCE hashes. See example +below. The \%NetResource argument is optional. If it is not supplied, +the root (that is, the topmost container) of the network is assumed, +and all network resources available from the toplevel container will +be enumerated. + +=item AddConnection(\%NETRESOURCE,$Password,$UserName,$Connection) + +Makes a connection to a network resource specified by %NETRESOURCE + +=item CancelConnection($Name,$Connection,$Force) + +Cancels a connection to a network resource connected to local device +$name.$Connection is either 1 - persistent connection or 0, non-persistent. + +=item WNetGetLastError($ErrorCode,$Description,$Name) + +Gets the Extended Network Error. + +=item GetError( $ErrorCode ) + +Gets the last Error for a Win32::NetResource call. + +=item GetUNCName( $UNCName, $LocalPath ); + +Returns the UNC name of the disk share connected to $LocalPath in $UNCName. +$LocalPath should be a drive based path. e.g. "C:\\share\\subdir" + +=back + +=head2 NOTE + +$servername is optional for all the calls below. (if not given the +local machine is assumed.) + +=over 4 + +=item NetShareAdd(\%SHARE,$parm_err,$servername = NULL ) + +Add a share for sharing. + +=item NetShareCheck($device,$type,$servername = NULL ) + +Check if a directory or a device is available for connection from the +network through a share. This includes all directories that are +reachable through a shared directory or device, meaning that if C:\foo +is shared, C:\foo\bar is also available for sharing. This means that +this function is pretty useless, given that by default every disk +volume has an administrative share such as "C$" associated with its +root directory. + +$device must be a drive name, directory, or a device. For example, +"C:", "C:\dir", "LPT1", "D$", "IPC$" are all valid as the $device +argument. $type is an output argument that will be set to one of +the following constants that describe the type of share: + + STYPE_DISKTREE Disk drive + STYPE_PRINTQ Print queue + STYPE_DEVICE Communication device + STYPE_IPC Interprocess communication (IPC) + STYPE_SPECIAL Special share reserved for interprocess + communication (IPC$) or remote administration + of the server (ADMIN$). Can also refer to + administrative shares such as C$, D$, etc. + +=item NetShareDel( $netname, $servername = NULL ) + +Remove a share from a machines list of shares. + +=item NetShareGetInfo( $netname, \%SHARE,$servername=NULL ) + +Get the %SHARE_INFO information about the share $netname on the +server $servername. + +=item NetShareSetInfo( $netname,\%SHARE,$parm_err,$servername=NULL) + +Set the information for share $netname. + +=back + +=head1 EXAMPLE + +=over 4 + +=item Enumerating all resources on the network + + # + # This example displays all the share points in the entire + # visible part of the network. + # + + use strict; + use Win32::NetResource qw(:DEFAULT GetSharedResources GetError); + my $resources = []; + unless(GetSharedResources($resources, RESOURCETYPE_ANY)) { + my $err; + GetError($err); + warn Win32::FormatMessage($err); + } + + foreach my $href (@$resources) { + next if ($$href{DisplayType} != RESOURCEDISPLAYTYPE_SHARE); + print "-----\n"; + foreach( keys %$href){ + print "$_: $href->{$_}\n"; + } + } + +=item Enumerating all resources on a particular host + + # + # This example displays all the share points exported by the local + # host. + # + + use strict; + use Win32::NetResource qw(:DEFAULT GetSharedResources GetError); + if (GetSharedResources(my $resources, RESOURCETYPE_ANY, + { RemoteName => "\\\\" . Win32::NodeName() })) + { + foreach my $href (@$resources) { + print "-----\n"; + foreach(keys %$href) { print "$_: $href->{$_}\n"; } + } + } + +=back + +=head1 AUTHOR + +Jesse Dougherty for Hip Communications. + +Additional general cleanups and bug fixes by Gurusamy Sarathy <gsar@activestate.com>. + +=cut + +sub AUTOLOAD { + # This AUTOLOAD is used to 'autoload' constants from the constant() + # XS function. If a constant is not found then control is passed + # to the AUTOLOAD in AutoLoader. + + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + #reset $! to zero to reset any current errors. + local $! = 0; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($! != 0) { + if ($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + ($pack,$file,$line) = caller; + die "Your vendor has not defined Win32::NetResource macro $constname, used at $file line $line. +"; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + +sub AddConnection +{ + my $h = $_[0]; + die "AddConnection: HASH reference required" unless ref($h) eq "HASH"; + + # + # The last four items *must* not be deallocated until the + # _AddConnection() completes (since the packed structure is + # pointing into these values. + # + my $netres = pack( 'i4 p4', $h->{Scope}, + $h->{Type}, + $h->{DisplayType}, + $h->{Usage}, + $h->{LocalName}, + $h->{RemoteName}, + $h->{Comment}, + $h->{Provider}); + _AddConnection($netres,$_[1],$_[2],$_[3]); +} + +#use Data::Dumper; + +sub GetSharedResources +{ + die "GetSharedResources: ARRAY reference required" + if defined $_[0] and ref($_[0]) ne "ARRAY"; + + my $aref = []; + + # Get the shared resources. + + my $ret; + + if (@_ > 2 and $_[2]) { + my $netres = pack('i4 p4', @{$_[2]}{qw(Scope + Type + DisplayType + Usage + LocalName + RemoteName + Comment + Provider)}); + $ret = _GetSharedResources( $aref , $_[1], $netres ); + } + else { + $ret = _GetSharedResources( $aref , $_[1] ); + } + + # build the array of hashes in $_[0] +# print Dumper($aref); + foreach ( @$aref ) { + my %hash; + @hash{'Scope', + 'Type', + 'DisplayType', + 'Usage', + 'LocalName', + 'RemoteName', + 'Comment', + 'Provider'} = split /\001/, $_; + push @{$_[0]}, \%hash; + } + + $ret; +} + +sub NetShareAdd +{ + my $shareinfo = _hash2SHARE( $_[0] ); + _NetShareAdd($shareinfo,$_[1], $_[2] || ""); +} + +sub NetShareGetInfo +{ + my ($netinfo,$val); + $val = _NetShareGetInfo( $_[0],$netinfo,$_[2] || ""); + %{$_[1]} = %{_SHARE2hash( $netinfo )}; + $val; +} + +sub NetShareSetInfo +{ + my $shareinfo = _hash2SHARE( $_[1] ); + _NetShareSetInfo( $_[0],$shareinfo,$_[2],$_[3] || ""); +} + + +# These are private functions to work with the ShareInfo structure. +# please note that the implementation of these calls requires the +# SHARE_INFO_502 level of information. + +sub _SHARE2hash +{ + my %hash = (); + @hash{'type', + 'permissions', + 'maxusers', + 'current-users', + 'remark', + 'netname', + 'path', + 'passwd'} = unpack('i4 A257 A81 A257 A257',$_[0]); + + return \%hash; +} + +sub _hash2SHARE +{ + my $h = $_[0]; + die "Argument must be a HASH reference" unless ref($h) eq "HASH"; + + return pack 'i4 a257 a81 a257 a257', + @$h{'type', + 'permissions', + 'maxusers', + 'current-users', + 'remark', + 'netname', + 'path', + 'passwd'}; +} + + +bootstrap Win32::NetResource; + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Win32/ODBC.pm b/Master/tlpkg/tlperl.old/lib/Win32/ODBC.pm new file mode 100644 index 00000000000..a51616388ea --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/ODBC.pm @@ -0,0 +1,1493 @@ +package Win32::ODBC; + +$VERSION = '0.032'; + +# Win32::ODBC.pm +# +==========================================================+ +# | | +# | ODBC.PM package | +# | --------------- | +# | | +# | Copyright (c) 1996, 1997 Dave Roth. All rights reserved. | +# | This program is free software; you can redistribute | +# | it and/or modify it under the same terms as Perl itself. | +# | | +# +==========================================================+ +# +# +# based on original code by Dan DeMaggio (dmag@umich.edu) +# +# Use under GNU General Public License or Larry Wall's "Artistic License" +# +# Check the README.TXT file that comes with this package for details about +# it's history. +# + +require Exporter; +require DynaLoader; + +$ODBCPackage = "Win32::ODBC"; +$ODBCPackage::Version = 970208; +$::ODBC = $ODBCPackage; +$CacheConnection = 0; + + # Reserve ODBC in the main namespace for US! +*ODBC::=\%Win32::ODBC::; + + +@ISA= qw( Exporter DynaLoader ); + # Items to export into callers namespace by default. Note: do not export + # names by default without a very good reason. Use EXPORT_OK instead. + # Do not simply export all your public functions/methods/constants. +@EXPORT = qw( + ODBC_ADD_DSN + ODBC_REMOVE_DSN + ODBC_CONFIG_DSN + ODBC_ADD_SYS_DSN + ODBC_REMOVE_SYS_DSN + ODBC_CONFIG_SYS_DSN + + SQL_DONT_CLOSE + SQL_DROP + SQL_CLOSE + SQL_UNBIND + SQL_RESET_PARAMS + + SQL_FETCH_NEXT + SQL_FETCH_FIRST + SQL_FETCH_LAST + SQL_FETCH_PRIOR + SQL_FETCH_ABSOLUTE + SQL_FETCH_RELATIVE + SQL_FETCH_BOOKMARK + + SQL_COLUMN_COUNT + SQL_COLUMN_NAME + SQL_COLUMN_TYPE + SQL_COLUMN_LENGTH + SQL_COLUMN_PRECISION + SQL_COLUMN_SCALE + SQL_COLUMN_DISPLAY_SIZE + SQL_COLUMN_NULLABLE + SQL_COLUMN_UNSIGNED + SQL_COLUMN_MONEY + SQL_COLUMN_UPDATABLE + SQL_COLUMN_AUTO_INCREMENT + SQL_COLUMN_CASE_SENSITIVE + SQL_COLUMN_SEARCHABLE + SQL_COLUMN_TYPE_NAME + SQL_COLUMN_TABLE_NAME + SQL_COLUMN_OWNER_NAME + SQL_COLUMN_QUALIFIER_NAME + SQL_COLUMN_LABEL + SQL_COLATT_OPT_MAX + SQL_COLUMN_DRIVER_START + SQL_COLATT_OPT_MIN + SQL_ATTR_READONLY + SQL_ATTR_WRITE + SQL_ATTR_READWRITE_UNKNOWN + SQL_UNSEARCHABLE + SQL_LIKE_ONLY + SQL_ALL_EXCEPT_LIKE + SQL_SEARCHABLE + ); + #The above are included for backward compatibility + + +sub new +{ + my ($n, $self); + my ($type) = shift; + my ($DSN) = shift; + my (@Results) = @_; + + if (ref $DSN){ + @Results = ODBCClone($DSN->{'connection'}); + }else{ + @Results = ODBCConnect($DSN, @Results); + } + @Results = processError(-1, @Results); + if (! scalar(@Results)){ + return undef; + } + $self = bless {}; + $self->{'connection'} = $Results[0]; + $ErrConn = $Results[0]; + $ErrText = $Results[1]; + $ErrNum = 0; + $self->{'DSN'} = $DSN; + $self; +} + +#### +# Close this ODBC session (or all sessions) +#### +sub Close +{ + my ($self, $Result) = shift; + $Result = DESTROY($self); + $self->{'connection'} = -1; + return $Result; +} + +#### +# Auto-Kill an instance of this module +#### +sub DESTROY +{ + my ($self) = shift; + my (@Results) = (0); + if($self->{'connection'} > -1){ + @Results = ODBCDisconnect($self->{'connection'}); + @Results = processError($self, @Results); + if ($Results[0]){ + undef $self->{'DSN'}; + undef @{$self->{'fnames'}}; + undef %{$self->{'field'}}; + undef %{$self->{'connection'}}; + } + } + return $Results[0]; +} + + +sub sql{ + return (Sql(@_)); +} + +#### +# Submit an SQL Execute statement for processing +#### +sub Sql{ + my ($self, $Sql, @Results) = @_; + @Results = ODBCExecute($self->{'connection'}, $Sql); + return updateResults($self, @Results); +} + +#### +# Retrieve data from a particular field +#### +sub Data{ + + # Change by JOC 06-APR-96 + # Altered by Dave Roth <dave@roth.net> 96.05.07 + my($self) = shift; + my(@Fields) = @_; + my(@Results, $Results, $Field); + + if ($self->{'Dirty'}){ + GetData($self); + $self->{'Dirty'} = 0; + } + @Fields = @{$self->{'fnames'}} if (! scalar(@Fields)); + foreach $Field (@Fields) { + if (wantarray) { + push(@Results, data($self, $Field)); + } else { + $Results .= data($self, $Field); + } + } + return wantarray ? @Results : $Results; +} + +sub DataHash{ + my($self, @Results) = @_; + my(%Results, $Element); + + if ($self->{'Dirty'}){ + GetData($self); + $self->{'Dirty'} = 0; + } + @Results = @{$self->{'fnames'}} if (! scalar(@Results)); + foreach $Element (@Results) { + $Results{$Element} = data($self, $Element); + } + + return %Results; +} + +#### +# Retrieve data from the data buffer +#### +sub data +{ $_[0]->{'data'}->{$_[1]}; } + + +sub fetchrow{ + return (FetchRow(@_)); +} +#### +# Put a row from an ODBC data set into data buffer +#### +sub FetchRow{ + my ($self, @Results) = @_; + my ($item, $num, $sqlcode); + # Added by JOC 06-APR-96 + # $num = 0; + $num = 0; + undef $self->{'data'}; + + + @Results = ODBCFetch($self->{'connection'}, @Results); + if (! (@Results = processError($self, @Results))){ + #### + # There should be an innocuous error "No records remain" + # This indicates no more records in the dataset + #### + return undef; + } + # Set the Dirty bit so we will go and extract data via the + # ODBCGetData function. Otherwise use the cache. + $self->{'Dirty'} = 1; + + # Return the array of field Results. + return @Results; +} + +sub GetData{ + my($self) = @_; + my @Results; + my $num = 0; + + @Results = ODBCGetData($self->{'connection'}); + if (!(@Results = processError($self, @Results))){ + return undef; + } + #### + # This is a special case. Do not call processResults + #### + ClearError(); + foreach (@Results){ + s/ +$// if defined $_; # HACK + $self->{'data'}->{ ${$self->{'fnames'}}[$num] } = $_; + $num++; + } + # return is a hack to interface with a assoc array. + return wantarray? (1, 1): 1; +} + +#### +# See if any more ODBC Results Sets +# Added by Brian Dunfordshore <Brian_Dunfordshore@bridge.com> +# 96.07.10 +#### +sub MoreResults{ + my ($self) = @_; + + my(@Results) = ODBCMoreResults($self->{'connection'}); + return (processError($self, @Results))[0]; +} + +#### +# Retrieve the catalog from the current DSN +# NOTE: All Field names are uppercase!!! +#### +sub Catalog{ + my ($self) = shift; + my ($Qualifier, $Owner, $Name, $Type) = @_; + my (@Results) = ODBCTableList($self->{'connection'}, $Qualifier, $Owner, $Name, $Type); + + # If there was an error return 0 else 1 + return (updateResults($self, @Results) != 1); +} + +#### +# Return an array of names from the catalog for the current DSN +# TableList($Qualifier, $Owner, $Name, $Type) +# Return: (array of names of tables) +# NOTE: All Field names are uppercase!!! +#### +sub TableList{ + my ($self) = shift; + my (@Results) = @_; + if (! scalar(@Results)){ + @Results = ("", "", "%", "TABLE"); + } + + if (! Catalog($self, @Results)){ + return undef; + } + undef @Results; + while (FetchRow($self)){ + push(@Results, Data($self, "TABLE_NAME")); + } + return sort(@Results); +} + + +sub fieldnames{ + return (FieldNames(@_)); +} +#### +# Return an array of fieldnames extracted from the current dataset +#### +sub FieldNames { $self = shift; return @{$self->{'fnames'}}; } + + +#### +# Closes this connection. This is used mostly for testing. You should +# probably use Close(). +#### +sub ShutDown{ + my($self) = @_; + print "\nClosing connection $self->{'connection'}..."; + $self->Close(); + print "\nDone\n"; +} + +#### +# Return this connection number +#### +sub Connection{ + my($self) = @_; + return $self->{'connection'}; +} + +#### +# Returns the current connections that are in use. +#### +sub GetConnections{ + return ODBCGetConnections(); +} + +#### +# Set the Max Buffer Size for this connection. This determines just how much +# ram can be allocated when a fetch() is performed that requires a HUGE amount +# of memory. The default max is 10k and the absolute max is 100k. +# This will probably never be used but I put it in because I noticed a fetch() +# of a MEMO field in an Access table was something like 4Gig. Maybe I did +# something wrong, but after checking several times I decided to impliment +# this limit thingie. +#### +sub SetMaxBufSize{ + my($self, $Size) = @_; + my(@Results) = ODBCSetMaxBufSize($self->{'connection'}, $Size); + return (processError($self, @Results))[0]; +} + +#### +# Returns the Max Buffer Size for this connection. See SetMaxBufSize(). +#### +sub GetMaxBufSize{ + my($self) = @_; + my(@Results) = ODBCGetMaxBufSize($self->{'connection'}); + return (processError($self, @Results))[0]; +} + + +#### +# Returns the DSN for this connection as an associative array. +#### +sub GetDSN{ + my($self, $DSN) = @_; + if(! ref($self)){ + $DSN = $self; + $self = 0; + } + if (! $DSN){ + $self = $self->{'connection'}; + } + my(@Results) = ODBCGetDSN($self, $DSN); + return (processError($self, @Results)); +} + +#### +# Returns an associative array of $XXX{'DSN'}=Description +#### +sub DataSources{ + my($self, $DSN) = @_; + if(! ref $self){ + $DSN = $self; + $self = 0; + } + my(@Results) = ODBCDataSources($DSN); + return (processError($self, @Results)); +} + +#### +# Returns an associative array of $XXX{'Driver Name'}=Driver Attributes +#### +sub Drivers{ + my($self) = @_; + if(! ref $self){ + $self = 0; + } + my(@Results) = ODBCDrivers(); + return (processError($self, @Results)); +} + +#### +# Returns the number of Rows that were affected by the previous SQL command. +#### +sub RowCount{ + my($self, $Connection) = @_; + if (! ref($self)){ + $Connection = $self; + $self = 0; + } + if (! $Connection){$Connection = $self->{'connection'};} + my(@Results) = ODBCRowCount($Connection); + return (processError($self, @Results))[0]; +} + +#### +# Returns the Statement Close Type -- how does ODBC Close a statment. +# Types: +# SQL_DROP +# SQL_CLOSE +# SQL_UNBIND +# SQL_RESET_PARAMS +#### +sub GetStmtCloseType{ + my($self, $Connection) = @_; + if (! ref($self)){ + $Connection = $self; + $self = 0; + } + if (! $Connection){$Connection = $self->{'connection'};} + my(@Results) = ODBCGetStmtCloseType($Connection); + return (processError($self, @Results)); +} + +#### +# Sets the Statement Close Type -- how does ODBC Close a statment. +# Types: +# SQL_DROP +# SQL_CLOSE +# SQL_UNBIND +# SQL_RESET_PARAMS +# Returns the newly set value. +#### +sub SetStmtCloseType{ + my($self, $Type, $Connection) = @_; + if (! ref($self)){ + $Connection = $Type; + $Type = $self; + $self = 0; + } + if (! $Connection){$Connection = $self->{'connection'};} + my(@Results) = ODBCSetStmtCloseType($Connection, $Type); + return (processError($self, @Results))[0]; +} + +sub ColAttributes{ + my($self, $Type, @Field) = @_; + my(%Results, @Results, $Results, $Attrib, $Connection, $Temp); + if (! ref($self)){ + $Type = $Field; + $Field = $self; + $self = 0; + } + $Connection = $self->{'connection'}; + if (! scalar(@Field)){ @Field = $self->fieldnames;} + foreach $Temp (@Field){ + @Results = ODBCColAttributes($Connection, $Temp, $Type); + ($Attrib) = processError($self, @Results); + if (wantarray){ + $Results{$Temp} = $Attrib; + }else{ + $Results .= "$Temp"; + } + } + return wantarray? %Results:$Results; +} + +sub GetInfo{ + my($self, $Type) = @_; + my($Connection, @Results); + if(! ref $self){ + $Type = $self; + $self = 0; + $Connection = 0; + }else{ + $Connection = $self->{'connection'}; + } + @Results = ODBCGetInfo($Connection, $Type); + return (processError($self, @Results))[0]; +} + +sub GetConnectOption{ + my($self, $Type) = @_; + my(@Results); + if(! ref $self){ + $Type = $self; + $self = 0; + } + @Results = ODBCGetConnectOption($self->{'connection'}, $Type); + return (processError($self, @Results))[0]; +} + +sub SetConnectOption{ + my($self, $Type, $Value) = @_; + if(! ref $self){ + $Value = $Type; + $Type = $self; + $self = 0; + } + my(@Results) = ODBCSetConnectOption($self->{'connection'}, $Type, $Value); + return (processError($self, @Results))[0]; +} + + +sub Transact{ + my($self, $Type) = @_; + my(@Results); + if(! ref $self){ + $Type = $self; + $self = 0; + } + @Results = ODBCTransact($self->{'connection'}, $Type); + return (processError($self, @Results))[0]; +} + + +sub SetPos{ + my($self, @Results) = @_; + @Results = ODBCSetPos($self->{'connection'}, @Results); + $self->{'Dirty'} = 1; + return (processError($self, @Results))[0]; +} + +sub ConfigDSN{ + my($self) = shift @_; + my($Type, $Connection); + if(! ref $self){ + $Type = $self; + $Connection = 0; + $self = 0; + }else{ + $Type = shift @_; + $Connection = $self->{'connection'}; + } + my($Driver, @Attributes) = @_; + @Results = ODBCConfigDSN($Connection, $Type, $Driver, @Attributes); + return (processError($self, @Results))[0]; +} + + +sub Version{ + my($self, @Packages) = @_; + my($Temp, @Results); + if (! ref($self)){ + push(@Packages, $self); + } + my($ExtName, $ExtVersion) = Info(); + if (! scalar(@Packages)){ + @Packages = ("ODBC.PM", "ODBC.PLL"); + } + foreach $Temp (@Packages){ + if ($Temp =~ /pll/i){ + push(@Results, "ODBC.PM:$Win32::ODBC::Version"); + }elsif ($Temp =~ /pm/i){ + push(@Results, "ODBC.PLL:$ExtVersion"); + } + } + return @Results; +} + + +sub SetStmtOption{ + my($self, $Option, $Value) = @_; + if(! ref $self){ + $Value = $Option; + $Option = $self; + $self = 0; + } + my(@Results) = ODBCSetStmtOption($self->{'connection'}, $Option, $Value); + return (processError($self, @Results))[0]; +} + +sub GetStmtOption{ + my($self, $Type) = @_; + if(! ref $self){ + $Type = $self; + $self = 0; + } + my(@Results) = ODBCGetStmtOption($self->{'connection'}, $Type); + return (processError($self, @Results))[0]; +} + +sub GetFunctions{ + my($self, @Results)=@_; + @Results = ODBCGetFunctions($self->{'connection'}, @Results); + return (processError($self, @Results)); +} + +sub DropCursor{ + my($self) = @_; + my(@Results) = ODBCDropCursor($self->{'connection'}); + return (processError($self, @Results))[0]; +} + +sub SetCursorName{ + my($self, $Name) = @_; + my(@Results) = ODBCSetCursorName($self->{'connection'}, $Name); + return (processError($self, @Results))[0]; +} + +sub GetCursorName{ + my($self) = @_; + my(@Results) = ODBCGetCursorName($self->{'connection'}); + return (processError($self, @Results))[0]; +} + +sub GetSQLState{ + my($self) = @_; + my(@Results) = ODBCGetSQLState($self->{'connection'}); + return (processError($self, @Results))[0]; +} + + +# ----------- R e s u l t P r o c e s s i n g F u n c t i o n s ---------- +#### +# Generic processing of data into associative arrays +#### +sub updateResults{ + my ($self, $Error, @Results) = @_; + + undef %{$self->{'field'}}; + + ClearError($self); + if ($Error){ + SetError($self, $Results[0], $Results[1]); + return ($Error); + } + + @{$self->{'fnames'}} = @Results; + + foreach (0..$#{$self->{'fnames'}}){ + s/ +$//; + $self->{'field'}->{${$self->{'fnames'}}[$_]} = $_; + } + return undef; +} + +# ---------------------------------------------------------------------------- +# ----------------- D e b u g g i n g F u n c t i o n s -------------------- + +sub Debug{ + my($self, $iDebug, $File) = @_; + my(@Results); + if (! ref($self)){ + if (defined $self){ + $File = $iDebug; + $iDebug = $self; + } + $Connection = 0; + $self = 0; + }else{ + $Connection = $self->{'connection'}; + } + push(@Results, ($Connection, $iDebug)); + push(@Results, $File) if ($File ne ""); + @Results = ODBCDebug(@Results); + return (processError($self, @Results))[0]; +} + +#### +# Prints out the current dataset (used mostly for testing) +#### +sub DumpData { + my($self) = @_; my($f, $goo); + + # Changed by JOC 06-Apr-96 + # print "\nDumping Data for connection: $conn->{'connection'}\n"; + print "\nDumping Data for connection: $self->{'connection'}\n"; + print "Error: \""; + print $self->Error(); + print "\"\n"; + if (! $self->Error()){ + foreach $f ($self->FieldNames){ + print $f . " "; + $goo .= "-" x length($f); + $goo .= " "; + } + print "\n$goo\n"; + while ($self->FetchRow()){ + foreach $f ($self->FieldNames){ + print $self->Data($f) . " "; + } + print "\n"; + } + } +} + +sub DumpError{ + my($self) = @_; + my($ErrNum, $ErrText, $ErrConn); + my($Temp); + + print "\n---------- Error Report: ----------\n"; + if (ref $self){ + ($ErrNum, $ErrText, $ErrConn) = $self->Error(); + ($Temp = $self->GetDSN()) =~ s/.*DSN=(.*?);.*/$1/i; + print "Errors for \"$Temp\" on connection " . $self->{'connection'} . ":\n"; + }else{ + ($ErrNum, $ErrText, $ErrConn) = Error(); + print "Errors for the package:\n"; + } + + print "Connection Number: $ErrConn\nError number: $ErrNum\nError message: \"$ErrText\"\n"; + print "-----------------------------------\n"; + +} + +#### +# Submit an SQL statement and print data about it (used mostly for testing) +#### +sub Run{ + my($self, $Sql) = @_; + + print "\nExcecuting connection $self->{'connection'}\nsql statement: \"$Sql\"\n"; + $self->Sql($Sql); + print "Error: \""; + print $self->error; + print "\"\n"; + print "--------------------\n\n"; +} + +# ---------------------------------------------------------------------------- +# ----------- E r r o r P r o c e s s i n g F u n c t i o n s ------------ + +#### +# Process Errors returned from a call to ODBCxxxx(). +# It is assumed that the Win32::ODBC function returned the following structure: +# ($ErrorNumber, $ResultsText, ...) +# $ErrorNumber....0 = No Error +# >0 = Error Number +# $ResultsText.....if no error then this is the first Results element. +# if error then this is the error text. +#### +sub processError{ + my($self, $Error, @Results) = @_; + if ($Error){ + SetError($self, $Results[0], $Results[1]); + undef @Results; + } + return @Results; +} + +#### +# Return the last recorded error message +#### +sub error{ + return (Error(@_)); +} + +sub Error{ + my($self) = @_; + if(ref($self)){ + if($self->{'ErrNum'}){ + my($State) = ODBCGetSQLState($self->{'connection'}); + return (wantarray)? ($self->{'ErrNum'}, $self->{'ErrText'}, $self->{'connection'}, $State) :"[$self->{'ErrNum'}] [$self->{'connection'}] [$State] \"$self->{'ErrText'}\""; + } + }elsif ($ErrNum){ + return (wantarray)? ($ErrNum, $ErrText, $ErrConn):"[$ErrNum] [$ErrConn] \"$ErrText\""; + } + return undef +} + +#### +# SetError: +# Assume that if $self is not a reference then it is just a placeholder +# and should be ignored. +#### +sub SetError{ + my($self, $Num, $Text, $Conn) = @_; + if (ref $self){ + $self->{'ErrNum'} = $Num; + $self->{'ErrText'} = $Text; + $Conn = $self->{'connection'} if ! $Conn; + } + $ErrNum = $Num; + $ErrText = $Text; + + #### + # Test Section Begin + #### +# $! = ($Num, $Text); + #### + # Test Section End + #### + + $ErrConn = $Conn; +} + +sub ClearError{ + my($self, $Num, $Text) = @_; + if (ref $self){ + undef $self->{'ErrNum'}; + undef $self->{'ErrText'}; + }else{ + undef $ErrConn; + undef $ErrNum; + undef $ErrText; + } + ODBCCleanError(); + return 1; +} + + +sub GetError{ + my($self, $Connection) = @_; + my(@Results); + if (! ref($self)){ + $Connection = $self; + $self = 0; + }else{ + if (! defined($Connection)){ + $Connection = $self->{'connection'}; + } + } + + @Results = ODBCGetError($Connection); + return @Results; +} + + + + +# ---------------------------------------------------------------------------- +# ------------------ A U T O L O A D F U N C T I O N ----------------------- + +sub AUTOLOAD { + # This AUTOLOAD is used to 'autoload' constants from the constant() + # XS function. If a constant is not found then control is passed + # to the AUTOLOAD in AutoLoader. + + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + #reset $! to zero to reset any current errors. + local $! = 0; + $val = constant($constname); + + if ($! != 0) { + if ($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + + # Added by JOC 06-APR-96 + # $pack = 0; + $pack = 0; + ($pack,$file,$line) = caller; + print "Your vendor has not defined Win32::ODBC macro $constname, used in $file at line $line."; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + + + # -------------------------------------------------------------- + # + # + # Make sure that we shutdown ODBC and free memory even if we are + # using perlis.dll on Win32 platform! +END{ +# ODBCShutDown() unless $CacheConnection; +} + + +bootstrap Win32::ODBC; + +# Preloaded methods go here. + +# Autoload methods go after __END__, and are processed by the autosplit program. + +1; +__END__ + +=head1 NAME + +Win32::ODBC - ODBC Extension for Win32 + +=head1 SYNOPSIS + +To use this module, include the following statement at the top of your +script: + + use Win32::ODBC; + +Next, create a data connection to your DSN: + + $Data = new Win32::ODBC("MyDSN"); + +B<NOTE>: I<MyDSN> can be either the I<DSN> as defined in the ODBC +Administrator, I<or> it can be an honest-to-God I<DSN Connect String>. + + Example: "DSN=My Database;UID=Brown Cow;PWD=Moo;" + +You should check to see if C<$Data> is indeed defined, otherwise there +has been an error. + +You can now send SQL queries and retrieve info to your heart's +content! See the description of the methods provided by this module +below and also the file F<TEST.PL> as referred to in L<INSTALLATION +NOTES> to see how it all works. + +Finally, B<MAKE SURE> that you close your connection when you are +finished: + + $Data->Close(); + +=head1 DESCRIPTION + +=head2 Background + +This is a hack of Dan DeMaggio's <dmag@umich.edu> F<NTXS.C> ODBC +implementation. I have recoded and restructured most of it including +most of the F<ODBC.PM> package, but its very core is still based on +Dan's code (thanks Dan!). + +The history of this extension is found in the file F<HISTORY.TXT> that +comes with the original archive (see L<INSTALLATION NOTES> below). + +=head2 Benefits + +And what are the benefits of this module? + +=over + +=item * + +The number of ODBC connections is limited by memory and ODBC itself +(have as many as you want!). + +=item * + +The working limit for the size of a field is 10,240 bytes, but you can +increase that limit (if needed) to a max of 2,147,483,647 bytes. (You +can always recompile to increase the max limit.) + +=item * + +You can open a connection by either specifing a DSN or a connection +string! + +=item * + +You can open and close the connections in any order! + +=item * + +Other things that I can not think of right now... :) + +=back + +=head1 CONSTANTS + +This package defines a number of constants. You may refer to each of +these constants using the notation C<ODBC::xxxxx>, where C<xxxxx> is +the constant. + +Example: + + print ODBC::SQL_SQL_COLUMN_NAME, "\n"; + +=head1 SPECIAL NOTATION + +For the method documentation that follows, an B<*> following the +method parameters indicates that that method is new or has been +modified for this version. + +=head1 CONSTRUCTOR + +=over + +=item new ( ODBC_OBJECT | DSN [, (OPTION1, VALUE1), (OPTION2, VALUE2) ...] ) +* + +Creates a new ODBC connection based on C<DSN>, or, if you specify an +already existing ODBC object, then a new ODBC object will be created +but using the ODBC Connection specified by C<ODBC_OBJECT>. (The new +object will be a new I<hstmt> using the I<hdbc> connection in +C<ODBC_OBJECT>.) + +C<DSN> is I<Data Source Name> or a proper C<ODBCDriverConnect> string. + +You can specify SQL Connect Options that are implemented before the +actual connection to the DSN takes place. These option/values are the +same as specified in C<GetConnectOption>/C<SetConnectOption> (see +below) and are defined in the ODBC API specs. + +Returns a handle to the database on success, or I<undef> on failure. + +=back + +=head1 METHODS + +=over + +=item Catalog ( QUALIFIER, OWNER, NAME, TYPE ) + +Tells ODBC to create a data set that contains table information about +the DSN. Use C<Fetch> and C<Data> or C<DataHash> to retrieve the data. +The returned format is: + + [Qualifier] [Owner] [Name] [Type] + +Returns I<true> on error. + +=item ColAttributes ( ATTRIBUTE [, FIELD_NAMES ] ) + +Returns the attribute C<ATTRIBUTE> on each of the fields in the list +C<FIELD_NAMES> in the current record set. If C<FIELD_NAMES> is empty, +then all fields are assumed. The attributes are returned as an +associative array. + +=item ConfigDSN ( OPTION, DRIVER, ATTRIBUTE1 [, ATTRIBUTE2, ATTRIBUTE3, ... +] ) + +Configures a DSN. C<OPTION> takes on one of the following values: + + ODBC_ADD_DSN.......Adds a new DSN. + ODBC_MODIFY_DSN....Modifies an existing DSN. + ODBC_REMOVE_DSN....Removes an existing DSN. + + ODBC_ADD_SYS_DSN.......Adds a new System DSN. + ODBC_MODIFY_SYS_DSN....Modifies an existing System DSN. + ODBC_REMOVE_SYS_DSN....Removes an existing System DSN. + +You must specify the driver C<DRIVER> (which can be retrieved by using +C<DataSources> or C<Drivers>). + +C<ATTRIBUTE1> B<should> be I<"DSN=xxx"> where I<xxx> is the name of +the DSN. Other attributes can be any DSN attribute such as: + + "UID=Cow" + "PWD=Moo" + "Description=My little bitty Data Source Name" + +Returns I<true> on success, I<false> on failure. + +B<NOTE 1>: If you use C<ODBC_ADD_DSN>, then you must include at least +I<"DSN=xxx"> and the location of the database. + +Example: For MS Access databases, you must specify the +I<DatabaseQualifier>: + + "DBQ=c:\\...\\MyDatabase.mdb" + +B<NOTE 2>: If you use C<ODBC_MODIFY_DSN>, then you need only specify +the I<"DNS=xxx"> attribute. Any other attribute you include will be +changed to what you specify. + +B<NOTE 3>: If you use C<ODBC_REMOVE_DSN>, then you need only specify +the I<"DSN=xxx"> attribute. + +=item Connection () + +Returns the connection number associated with the ODBC connection. + +=item Close () + +Closes the ODBC connection. No return value. + +=item Data ( [ FIELD_NAME ] ) + +Returns the contents of column name C<FIELD_NAME> or the current row +(if nothing is specified). + +=item DataHash ( [ FIELD1, FIELD2, ... ] ) + +Returns the contents for C<FIELD1, FIELD2, ...> or the entire row (if +nothing is specified) as an associative array consisting of: + + {Field Name} => Field Data + +=item DataSources () + +Returns an associative array of Data Sources and ODBC remarks about them. +They are returned in the form of: + + $ArrayName{'DSN'}=Driver + +where I<DSN> is the Data Source Name and ODBC Driver used. + +=item Debug ( [ 1 | 0 ] ) + +Sets the debug option to on or off. If nothing is specified, then +nothing is changed. + +Returns the debugging value (I<1> or I<0>). + +=item Drivers () + +Returns an associative array of ODBC Drivers and their attributes. +They are returned in the form of: + + $ArrayName{'DRIVER'}=Attrib1;Attrib2;Attrib3;... + +where I<DRIVER> is the ODBC Driver Name and I<AttribX> are the +driver-defined attributes. + +=item DropCursor ( [ CLOSE_TYPE ] ) + +Drops the cursor associated with the ODBC object. This forces the +cursor to be deallocated. This overrides C<SetStmtCloseType>, but the +ODBC object does not lose the C<StmtCloseType> setting. C<CLOSE_TYPE> +can be any valid C<SmtpCloseType> and will perform a close on the stmt +using the specified close type. + +Returns I<true> on success, I<false> on failure. + +=item DumpData () + +Dumps to the screen the fieldnames and all records of the current data +set. Used primarily for debugging. No return value. + +=item Error () + +Returns the last encountered error. The returned value is context +dependent: + +If called in a I<scalar> context, then a I<3-element array> is +returned: + + ( ERROR_NUMBER, ERROR_TEXT, CONNECTION_NUMBER ) + +If called in a I<string> context, then a I<string> is returned: + + "[ERROR_NUMBER] [CONNECTION_NUMBER] [ERROR_TEXT]" + +If debugging is on then two more variables are returned: + + ( ..., FUNCTION, LEVEL ) + +where C<FUNCTION> is the name of the function in which the error +occurred, and C<LEVEL> represents extra information about the error +(usually the location of the error). + +=item FetchRow ( [ ROW [, TYPE ] ] ) + +Retrieves the next record from the keyset. When C<ROW> and/or C<TYPE> +are specified, the call is made using C<SQLExtendedFetch> instead of +C<SQLFetch>. + +B<NOTE 1>: If you are unaware of C<SQLExtendedFetch> and its +implications, stay with just regular C<FetchRow> with no parameters. + +B<NOTE 2>: The ODBC API explicitly warns against mixing calls to +C<SQLFetch> and C<SQLExtendedFetch>; use one or the other but not +both. + +If I<ROW> is specified, it moves the keyset B<RELATIVE> C<ROW> number +of rows. + +If I<ROW> is specified and C<TYPE> is B<not>, then the type used is +B<RELATIVE>. + +Returns I<true> when another record is available to read, and I<false> +when there are no more records. + +=item FieldNames () + +Returns an array of fieldnames found in the current data set. There is +no guarantee on order. + +=item GetConnections () + +Returns an array of connection numbers showing what connections are +currently open. + +=item GetConnectOption ( OPTION ) + +Returns the value of the specified connect option C<OPTION>. Refer to +ODBC documentation for more information on the options and values. + +Returns a string or scalar depending upon the option specified. + +=item GetCursorName () + +Returns the name of the current cursor as a string or I<undef>. + +=item GetData () + +Retrieves the current row from the dataset. This is not generally +used by users; it is used internally. + +Returns an array of field data where the first element is either +I<false> (if successful) and I<true> (if B<not> successful). + +=item getDSN ( [ DSN ] ) + +Returns an associative array indicating the configuration for the +specified DSN. + +If no DSN is specified then the current connection is used. + +The returned associative array consists of: + + keys=DSN keyword; values=Keyword value. $Data{$Keyword}=Value + +=item GetFunctions ( [ FUNCTION1, FUNCTION2, ... ] ) + +Returns an associative array indicating the ability of the ODBC Driver +to support the specified functions. If no functions are specified, +then a 100 element associative array is returned containing all +possible functions and their values. + +C<FUNCTION> must be in the form of an ODBC API constant like +C<SQL_API_SQLTRANSACT>. + +The returned array will contain the results like: + + $Results{SQL_API_SQLTRANSACT}=Value + +Example: + + $Results = $O->GetFunctions( + $O->SQL_API_SQLTRANSACT, + SQL_API_SQLSETCONNECTOPTION + ); + $ConnectOption = $Results{SQL_API_SQLSETCONNECTOPTION}; + $Transact = $Results{SQL_API_SQLTRANSACT}; + +=item GetInfo ( OPTION ) + +Returns a string indicating the value of the particular +option specified. + +=item GetMaxBufSize () + +Returns the current allocated limit for I<MaxBufSize>. For more info, +see C<SetMaxBufSize>. + +=item GetSQLState () * + +Returns a string indicating the SQL state as reported by ODBC. The SQL +state is a code that the ODBC Manager or ODBC Driver returns after the +execution of a SQL function. This is helpful for debugging purposes. + +=item GetStmtCloseType ( [ CONNECTION ] ) + +Returns a string indicating the type of closure that will be used +everytime the I<hstmt> is freed. See C<SetStmtCloseType> for details. + +By default, the connection of the current object will be used. If +C<CONNECTION> is a valid connection number, then it will be used. + +=item GetStmtOption ( OPTION ) + +Returns the value of the specified statement option C<OPTION>. Refer +to ODBC documentation for more information on the options and values. + +Returns a string or scalar depending upon the option specified. + +=item MoreResults () + +This will report whether there is data yet to be retrieved from the +query. This can happen if the query was a multiple select. + +Example: + + "SELECT * FROM [foo] SELECT * FROM [bar]" + +B<NOTE>: Not all drivers support this. + +Returns I<1> if there is more data, I<undef> otherwise. + +=item RowCount ( CONNECTION ) + +For I<UPDATE>, I<INSERT> and I<DELETE> statements, the returned value +is the number of rows affected by the request or I<-1> if the number +of affected rows is not available. + +B<NOTE 1>: This function is not supported by all ODBC drivers! Some +drivers do support this but not for all statements (e.g., it is +supported for I<UPDATE>, I<INSERT> and I<DELETE> commands but not for +the I<SELECT> command). + +B<NOTE 2>: Many data sources cannot return the number of rows in a +result set before fetching them; for maximum interoperability, +applications should not rely on this behavior. + +Returns the number of affected rows, or I<-1> if not supported by the +driver in the current context. + +=item Run ( SQL ) + +Executes the SQL command B<SQL> and dumps to the screen info about +it. Used primarily for debugging. + +No return value. + +=item SetConnectOption ( OPTION ) * + +Sets the value of the specified connect option B<OPTION>. Refer to +ODBC documentation for more information on the options and values. + +Returns I<true> on success, I<false> otherwise. + +=item SetCursorName ( NAME ) * + +Sets the name of the current cursor. + +Returns I<true> on success, I<false> otherwise. + +=item SetPos ( ROW [, OPTION, LOCK ] ) * + +Moves the cursor to the row C<ROW> within the current keyset (B<not> +the current data/result set). + +Returns I<true> on success, I<false> otherwise. + +=item SetMaxBufSize ( SIZE ) + +This sets the I<MaxBufSize> for a particular connection. This will +most likely never be needed but... + +The amount of memory that is allocated to retrieve the field data of a +record is dynamic and changes when it need to be larger. I found that +a memo field in an MS Access database ended up requesting 4 Gig of +space. This was a bit much so there is an imposed limit (2,147,483,647 +bytes) that can be allocated for data retrieval. + +Since it is possible that someone has a database with field data +greater than 10,240, you can use this function to increase the limit +up to a ceiling of 2,147,483,647 (recompile if you need more). + +Returns the max number of bytes. + +=item SetStmtCloseType ( TYPE [, CONNECTION ] ) + +Sets a particular I<hstmt> close type for the connection. This is the +same as C<ODBCFreeStmt(hstmt, TYPE)>. By default, the connection of +the current object will be used. If C<CONNECTION> is a valid +connection number, then it will be used. + +C<TYPE> may be one of: + + SQL_CLOSE + SQL_DROP + SQL_UNBIND + SQL_RESET_PARAMS + +Returns a string indicating the newly set type. + +=item SetStmtOption ( OPTION ) * + +Sets the value of the specified statement option C<OPTION>. Refer to +ODBC documentation for more information on the options and values. + +Returns I<true> on success, I<false> otherwise. + +=item ShutDown () + +Closes the ODBC connection and dumps to the screen info about +it. Used primarily for debugging. + +No return value. + +=item Sql ( SQL_STRING ) + +Executes the SQL command C<SQL_STRING> on the current connection. + +Returns I<?> on success, or an error number on failure. + +=item TableList ( QUALIFIER, OWNER, NAME, TYPE ) + +Returns the catalog of tables that are available in the DSN. For an +unknown parameter, just specify the empty string I<"">. + +Returns an array of table names. + +=item Transact ( TYPE ) * + +Forces the ODBC connection to perform a I<rollback> or I<commit> +transaction. + +C<TYPE> may be one of: + + SQL_COMMIT + SQL_ROLLBACK + +B<NOTE>: This only works with ODBC drivers that support transactions. +Your driver supports it if I<true> is returned from: + + $O->GetFunctions($O->SQL_API_SQLTRANSACT)[1] + +(See C<GetFunctions> for more details.) + +Returns I<true> on success, I<false> otherwise. + +=item Version ( PACKAGES ) + +Returns an array of version numbers for the requested packages +(F<ODBC.pm> or F<ODBC.PLL>). If the list C<PACKAGES> is empty, then +all version numbers are returned. + +=back + +=head1 LIMITATIONS + +What known problems does this thing have? + +=over + +=item * + +If the account under which the process runs does not have write +permission on the default directory (for the process, not the ODBC +DSN), you will probably get a runtime error during a +C<SQLConnection>. I don't think that this is a problem with the code, +but more like a problem with ODBC. This happens because some ODBC +drivers need to write a temporary file. I noticed this using the MS +Jet Engine (Access Driver). + +=item * + +This module has been neither optimized for speed nor optimized for +memory consumption. + +=back + +=head1 INSTALLATION NOTES + +If you wish to use this module with a build of Perl other than +ActivePerl, you may wish to fetch the original source distribution for +this module at: + + ftp://ftp.roth.net:/pub/ntperl/ODBC/970208/Bin/Win32_ODBC_Build_CORE.zip + +or one of the other archives at that same location. See the included +README for hints on installing this module manually, what to do if you +get a I<parse exception>, and a pointer to a test script for this +module. + +=head1 OTHER DOCUMENTATION + +Find a FAQ for Win32::ODBC at: + + http://www.roth.net/odbc/odbcfaq.htm + +=head1 AUTHOR + +Dave Roth <rothd@roth.net> + +=head1 CREDITS + +Based on original code by Dan DeMaggio <dmag@umich.edu> + +=head1 DISCLAIMER + +I do not guarantee B<ANYTHING> with this package. If you use it you +are doing so B<AT YOUR OWN RISK>! I may or may not support this +depending on my time schedule. + +=head1 HISTORY + +Last Modified 1999.09.25. + +=head1 COPYRIGHT + +Copyright (c) 1996-1998 Dave Roth. All rights reserved. + +Courtesy of Roth Consulting: http://www.roth.net/consult/ + +Use under GNU General Public License. Details can be found at: +http://www.gnu.org/copyleft/gpl.html + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Win32/PerfLib.pm b/Master/tlpkg/tlperl.old/lib/Win32/PerfLib.pm new file mode 100644 index 00000000000..2b773d68f4b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/PerfLib.pm @@ -0,0 +1,538 @@ +package Win32::PerfLib; + +use strict; +use Carp; +use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD); + +require Exporter; +require DynaLoader; +require AutoLoader; + +@ISA = qw(Exporter DynaLoader); + +@EXPORT = qw( + PERF_100NSEC_MULTI_TIMER + PERF_100NSEC_MULTI_TIMER_INV + PERF_100NSEC_TIMER + PERF_100NSEC_TIMER_INV + PERF_AVERAGE_BASE + PERF_AVERAGE_BULK + PERF_AVERAGE_TIMER + PERF_COUNTER_BASE + PERF_COUNTER_BULK_COUNT + PERF_COUNTER_COUNTER + PERF_COUNTER_DELTA + PERF_COUNTER_ELAPSED + PERF_COUNTER_FRACTION + PERF_COUNTER_HISTOGRAM + PERF_COUNTER_HISTOGRAM_TYPE + PERF_COUNTER_LARGE_DELTA + PERF_COUNTER_LARGE_QUEUELEN_TYPE + PERF_COUNTER_LARGE_RAWCOUNT + PERF_COUNTER_LARGE_RAWCOUNT_HEX + PERF_COUNTER_MULTI_BASE + PERF_COUNTER_MULTI_TIMER + PERF_COUNTER_MULTI_TIMER_INV + PERF_COUNTER_NODATA + PERF_COUNTER_QUEUELEN + PERF_COUNTER_QUEUELEN_TYPE + PERF_COUNTER_RATE + PERF_COUNTER_RAWCOUNT + PERF_COUNTER_RAWCOUNT_HEX + PERF_COUNTER_TEXT + PERF_COUNTER_TIMER + PERF_COUNTER_TIMER_INV + PERF_COUNTER_VALUE + PERF_DATA_REVISION + PERF_DATA_VERSION + PERF_DELTA_BASE + PERF_DELTA_COUNTER + PERF_DETAIL_ADVANCED + PERF_DETAIL_EXPERT + PERF_DETAIL_NOVICE + PERF_DETAIL_WIZARD + PERF_DISPLAY_NOSHOW + PERF_DISPLAY_NO_SUFFIX + PERF_DISPLAY_PERCENT + PERF_DISPLAY_PER_SEC + PERF_DISPLAY_SECONDS + PERF_ELAPSED_TIME + PERF_INVERSE_COUNTER + PERF_MULTI_COUNTER + PERF_NO_INSTANCES + PERF_NO_UNIQUE_ID + PERF_NUMBER_DECIMAL + PERF_NUMBER_DEC_1000 + PERF_NUMBER_HEX + PERF_OBJECT_TIMER + PERF_RAW_BASE + PERF_RAW_FRACTION + PERF_SAMPLE_BASE + PERF_SAMPLE_COUNTER + PERF_SAMPLE_FRACTION + PERF_SIZE_DWORD + PERF_SIZE_LARGE + PERF_SIZE_VARIABLE_LEN + PERF_SIZE_ZERO + PERF_TEXT_ASCII + PERF_TEXT_UNICODE + PERF_TIMER_100NS + PERF_TIMER_TICK + PERF_TYPE_COUNTER + PERF_TYPE_NUMBER + PERF_TYPE_TEXT + PERF_TYPE_ZERO + ); + +$VERSION = '0.05'; + +sub AUTOLOAD { + + my $constname; + ($constname = $AUTOLOAD) =~ s/.*:://; + local $! = 0; + my $val = constant($constname); + if ($! != 0) { + if ($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + croak "Your vendor has not defined Win32::PerfLib macro $constname"; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + +bootstrap Win32::PerfLib $VERSION; + +# Preloaded methods go here. + +sub new +{ + my $proto = shift; + my $class = ref($proto) || $proto; + my $comp = shift; + my $handle; + my $self = {}; + if(PerfLibOpen($comp,$handle)) + { + $self->{handle} = $handle; + bless $self, $class; + return $self; + } + else + { + return undef; + } + +} + +sub Close +{ + my $self = shift; + return PerfLibClose($self->{handle}); +} + +sub DESTROY +{ + my $self = shift; + if(!PerfLibClose($self->{handle})) + { + croak "Error closing handle!\n"; + } +} + +sub GetCounterNames +{ + my($machine,$href) = @_; + if(ref $href ne "HASH") + { + croak("usage: Win32::PerfLib::GetCounterNames(machine,hashRef)\n"); + } + my($data,@data,$num,$name); + my $retval = PerfLibGetNames($machine,$data); + if($retval) + { + @data = split(/\0/, $data); + while(@data) + { + $num = shift @data; + $name = shift @data; + $href->{$num} = $name; + } + } + $retval; +} + +sub GetCounterHelp +{ + my($machine,$href) = @_; + if(ref $href ne "HASH") + { + croak("usage: Win32::PerfLib::GetCounterHelp(machine,hashRef)\n"); + } + my($data,@data,$num,$name); + my $retval = PerfLibGetHelp($machine,$data); + if($retval) + { + @data = split(/\0/, $data); + while(@data) + { + $num = shift @data; + $name = shift @data; + $href->{$num} = $name; + } + } + $retval; +} + +sub GetObjectList +{ + my $self = shift; + my $object = shift; + my $data = shift; + if(ref $data ne "HASH") + { + croak("reference isn't a hash reference!\n"); + } + return PerfLibGetObjects($self->{handle}, $object, $data); +} + +sub GetCounterType +{ + my $type = shift; + my $retval; + if( &Win32::PerfLib::PERF_100NSEC_MULTI_TIMER == $type ) + { + $retval = "PERF_100NSEC_MULTI_TIMER"; + } + elsif( &Win32::PerfLib::PERF_100NSEC_MULTI_TIMER_INV == $type ) + { + $retval = "PERF_100NSEC_MULTI_TIMER_INV"; + } + elsif( &Win32::PerfLib::PERF_100NSEC_TIMER == $type ) + { + $retval = "PERF_100NSEC_TIMER"; + } + elsif( &Win32::PerfLib::PERF_100NSEC_TIMER_INV == $type ) + { + $retval = "PERF_100NSEC_TIMER_INV"; + } + elsif( &Win32::PerfLib::PERF_AVERAGE_BASE == $type ) + { + $retval = "PERF_AVERAGE_BASE"; + } + elsif( &Win32::PerfLib::PERF_AVERAGE_BULK == $type ) + { + $retval = "PERF_AVERAGE_BULK"; + } + elsif( &Win32::PerfLib::PERF_AVERAGE_TIMER == $type ) + { + $retval = "PERF_AVERAGE_TIMER"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_BULK_COUNT == $type ) + { + $retval = "PERF_COUNTER_BULK_COUNT"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_COUNTER == $type ) + { + $retval = "PERF_COUNTER_COUNTER"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_DELTA == $type ) + { + $retval = "PERF_COUNTER_DELTA"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_LARGE_DELTA == $type ) + { + $retval = "PERF_COUNTER_LARGE_DELTA"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_LARGE_QUEUELEN_TYPE == $type ) + { + $retval = "PERF_COUNTER_LARGE_QUEUELEN_TYPE"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_LARGE_RAWCOUNT == $type ) + { + $retval = "PERF_COUNTER_LARGE_RAWCOUNT"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_LARGE_RAWCOUNT_HEX == $type ) + { + $retval = "PERF_COUNTER_LARGE_RAWCOUNT_HEX"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_MULTI_BASE == $type ) + { + $retval = "PERF_COUNTER_MULTI_BASE"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_MULTI_TIMER == $type ) + { + $retval = "PERF_COUNTER_MULTI_TIMER"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_MULTI_TIMER_INV == $type ) + { + $retval = "PERF_COUNTER_MULTI_TIMER_INV"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_NODATA == $type ) + { + $retval = "PERF_COUNTER_NODATA"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_QUEUELEN_TYPE == $type ) + { + $retval = "PERF_COUNTER_QUEUELEN_TYPE"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_RAWCOUNT == $type ) + { + $retval = "PERF_COUNTER_RAWCOUNT"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_RAWCOUNT_HEX == $type ) + { + $retval = "PERF_COUNTER_RAWCOUNT_HEX"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_TEXT == $type ) + { + $retval = "PERF_COUNTER_TEXT"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_TIMER == $type ) + { + $retval = "PERF_COUNTER_TIMER"; + } + elsif( &Win32::PerfLib::PERF_COUNTER_TIMER_INV == $type ) + { + $retval = "PERF_COUNTER_TIMER_INV"; + } + elsif( &Win32::PerfLib::PERF_ELAPSED_TIME == $type ) + { + $retval = "PERF_ELAPSED_TIME"; + } + elsif( &Win32::PerfLib::PERF_RAW_BASE == $type ) + { + $retval = "PERF_RAW_BASE"; + } + elsif( &Win32::PerfLib::PERF_RAW_FRACTION == $type ) + { + $retval = "PERF_RAW_FRACTION"; + } + elsif( &Win32::PerfLib::PERF_SAMPLE_BASE == $type ) + { + $retval = "PERF_SAMPLE_BASE"; + } + elsif( &Win32::PerfLib::PERF_SAMPLE_COUNTER == $type ) + { + $retval = "PERF_SAMPLE_COUNTER"; + } + elsif( &Win32::PerfLib::PERF_SAMPLE_FRACTION == $type ) + { + $retval = "PERF_SAMPLE_FRACTION"; + } + $retval; +} + + + +1; +__END__ + +=head1 NAME + +Win32::PerfLib - accessing the Windows NT Performance Counter + +=head1 SYNOPSIS + + use Win32::PerfLib; + my $server = ""; + Win32::PerfLib::GetCounterNames($server, \%counter); + %r_counter = map { $counter{$_} => $_ } keys %counter; + # retrieve the id for process object + $process_obj = $r_counter{Process}; + # retrieve the id for the process ID counter + $process_id = $r_counter{'ID Process'}; + + # create connection to $server + $perflib = new Win32::PerfLib($server); + $proc_ref = {}; + # get the performance data for the process object + $perflib->GetObjectList($process_obj, $proc_ref); + $perflib->Close(); + $instance_ref = $proc_ref->{Objects}->{$process_obj}->{Instances}; + foreach $p (sort keys %{$instance_ref}) + { + $counter_ref = $instance_ref->{$p}->{Counters}; + foreach $i (keys %{$counter_ref}) + { + if($counter_ref->{$i}->{CounterNameTitleIndex} == $process_id) + { + printf( "% 6d %s\n", $counter_ref->{$i}->{Counter}, + $instance_ref->{$p}->{Name} + ); + } + } + } + +=head1 DESCRIPTION + +This module allows to retrieve the performance counter of any computer +(running Windows NT) in the network. + +=head1 FUNCTIONS + +=head2 NOTE + +All of the functions return false if they fail, unless otherwise noted. +If the $server argument is undef the local machine is assumed. + +=over 10 + +=item Win32::PerfLib::GetCounterNames($server,$hashref) + +Retrieves the counter names and their indices from the registry and stores them +in the hash reference + +=item Win32::PerfLib::GetCounterHelp($server,$hashref) + +Retrieves the counter help strings and their indices from the registry and +stores them in the hash reference + +=item $perflib = Win32::PerfLib->new ($server) + +Creates a connection to the performance counters of the given server + +=item $perflib->GetObjectList($objectid,$hashref) + +retrieves the object and counter list of the given performance object. + +=item $perflib->Close($hashref) + +closes the connection to the performance counters + +=item Win32::PerfLib::GetCounterType(countertype) + +converts the counter type to readable string as referenced in L<calc.html> so +that it is easier to find the appropriate formula to calculate the raw counter +data. + +=back + +=head1 Datastructures + +The performance data is returned in the following data structure: + +=over 10 + +=item Level 1 + + $hashref = { + 'NumObjectTypes' => VALUE + 'Objects' => HASHREF + 'PerfFreq' => VALUE + 'PerfTime' => VALUE + 'PerfTime100nSec' => VALUE + 'SystemName' => STRING + 'SystemTime' => VALUE + } + +=item Level 2 + +The hash reference $hashref->{Objects} has the returned object ID(s) as keys and +a hash reference to the object counter data as value. Even there is only one +object requested in the call to GetObjectList there may be more than one object +in the result. + + $hashref->{Objects} = { + <object1> => HASHREF + <object2> => HASHREF + ... + } + +=item Level 3 + +Each returned object ID has object-specific performance information. If an +object has instances like the process object there is also a reference to +the instance information. + + $hashref->{Objects}->{<object1>} = { + 'DetailLevel' => VALUE + 'Instances' => HASHREF + 'Counters' => HASHREF + 'NumCounters' => VALUE + 'NumInstances' => VALUE + 'ObjectHelpTitleIndex' => VALUE + 'ObjectNameTitleIndex' => VALUE + 'PerfFreq' => VALUE + 'PerfTime' => VALUE + } + +=item Level 4 + +If there are instance information for the object available they are stored in +the 'Instances' hashref. If the object has no instances there is an 'Counters' +key instead. The instances or counters are numbered. + + $hashref->{Objects}->{<object1>}->{Instances} = { + <1> => HASHREF + <2> => HASHREF + ... + <n> => HASHREF + } + or + $hashref->{Objects}->{<object1>}->{Counters} = { + <1> => HASHREF + <2> => HASHREF + ... + <n> => HASHREF + } + +=item Level 5 + + $hashref->{Objects}->{<object1>}->{Instances}->{<1>} = { + Counters => HASHREF + Name => STRING + ParentObjectInstance => VALUE + ParentObjectTitleIndex => VALUE + } + or + $hashref->{Objects}->{<object1>}->{Counters}->{<1>} = { + Counter => VALUE + CounterHelpTitleIndex => VALUE + CounterNameTitleIndex => VALUE + CounterSize => VALUE + CounterType => VALUE + DefaultScale => VALUE + DetailLevel => VALUE + Display => STRING + } + +=item Level 6 + + $hashref->{Objects}->{<object1>}->{Instances}->{<1>}->{Counters} = { + <1> => HASHREF + <2> => HASHREF + ... + <n> => HASHREF + } + +=item Level 7 + + $hashref->{Objects}->{<object1>}->{Instances}->{<1>}->{Counters}->{<1>} = { + Counter => VALUE + CounterHelpTitleIndex => VALUE + CounterNameTitleIndex => VALUE + CounterSize => VALUE + CounterType => VALUE + DefaultScale => VALUE + DetailLevel => VALUE + Display => STRING + } + +Depending on the B<CounterType> there are calculations to do (see calc.html). + +=back + +=head1 AUTHOR + +Jutta M. Klebe, jmk@bybyte.de + +=head1 SEE ALSO + +perl(1). + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Win32/Pipe.pm b/Master/tlpkg/tlperl.old/lib/Win32/Pipe.pm new file mode 100644 index 00000000000..a99d5a0da08 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/Pipe.pm @@ -0,0 +1,414 @@ +package Win32::Pipe; + +$VERSION = '0.022'; + +# Win32::Pipe.pm +# +==========================================================+ +# | | +# | PIPE.PM package | +# | --------------- | +# | Release v96.05.11 | +# | | +# | Copyright (c) 1996 Dave Roth. All rights reserved. | +# | This program is free software; you can redistribute | +# | it and/or modify it under the same terms as Perl itself. | +# | | +# +==========================================================+ +# +# +# Use under GNU General Public License or Larry Wall's "Artistic License" +# +# Check the README.TXT file that comes with this package for details about +# it's history. +# + +require Exporter; +require DynaLoader; + +@ISA= qw( Exporter DynaLoader ); + # Items to export into callers namespace by default. Note: do not export + # names by default without a very good reason. Use EXPORT_OK instead. + # Do not simply export all your public functions/methods/constants. +@EXPORT = qw(); + +$ErrorNum = 0; +$ErrorText = ""; + +sub new +{ + my ($self, $Pipe); + my ($Type, $Name, $Time) = @_; + + if (! $Time){ + $Time = DEFAULT_WAIT_TIME(); + } + $Pipe = PipeCreate($Name, $Time); + if ($Pipe){ + $self = bless {}; + $self->{'Pipe'} = $Pipe; + }else{ + ($ErrorNum, $ErrorText) = PipeError(); + return undef; + } + $self; +} + +sub Write{ + my($self, $Data) = @_; + $Data = PipeWrite($self->{'Pipe'}, $Data); + return $Data; +} + +sub Read{ + my($self) = @_; + my($Data); + $Data = PipeRead($self->{'Pipe'}); + return $Data; +} + +sub Error{ + my($self) = @_; + my($MyError, $MyErrorText, $Temp); + if (! ref($self)){ + undef $Temp; + }else{ + $Temp = $self->{'Pipe'}; + } + ($MyError, $MyErrorText) = PipeError($Temp); + return wantarray? ($MyError, $MyErrorText):"[$MyError] \"$MyErrorText\""; +} + + +sub Close{ + my ($self) = shift; + PipeClose($self->{'Pipe'}); + $self->{'Pipe'} = 0; +} + +sub Connect{ + my ($self) = @_; + my ($Result); + $Result = PipeConnect($self->{'Pipe'}); + return $Result; +} + +sub Disconnect{ + my ($self, $iPurge) = @_; + my ($Result); + if (! $iPurge){ + $iPurge = 1; + } + $Result = PipeDisconnect($self->{'Pipe'}, $iPurge); + return $Result; +} + +sub BufferSize{ + my($self) = @_; + my($Result) = PipeBufferSize($self->{'Pipe'}); + return $Result; +} + +sub ResizeBuffer{ + my($self, $Size) = @_; + my($Result) = PipeResizeBuffer($self->{'Pipe'}, $Size); + return $Result; +} + + +#### +# Auto-Kill an instance of this module +#### +sub DESTROY +{ + my ($self) = shift; + Close($self); +} + + +sub Credit{ + my($Name, $Version, $Date, $Author, $CompileDate, $CompileTime, $Credits) = Win32::Pipe::Info(); + my($Out, $iWidth); + $iWidth = 60; + $Out .= "\n"; + $Out .= " +". "=" x ($iWidth). "+\n"; + $Out .= " |". Center("", $iWidth). "|\n"; + $Out .= " |" . Center("", $iWidth). "|\n"; + $Out .= " |". Center("$Name", $iWidth). "|\n"; + $Out .= " |". Center("-" x length("$Name"), $iWidth). "|\n"; + $Out .= " |". Center("", $iWidth). "|\n"; + + $Out .= " |". Center("Version $Version ($Date)", $iWidth). "|\n"; + $Out .= " |". Center("by $Author", $iWidth). "|\n"; + $Out .= " |". Center("Compiled on $CompileDate at $CompileTime.", $iWidth). "|\n"; + $Out .= " |". Center("", $iWidth). "|\n"; + $Out .= " |". Center("Credits:", $iWidth). "|\n"; + $Out .= " |". Center(("-" x length("Credits:")), $iWidth). "|\n"; + foreach $Temp (split("\n", $Credits)){ + $Out .= " |". Center("$Temp", $iWidth). "|\n"; + } + $Out .= " |". Center("", $iWidth). "|\n"; + $Out .= " +". "=" x ($iWidth). "+\n"; + return $Out; +} + +sub Center{ + local($Temp, $Width) = @_; + local($Len) = ($Width - length($Temp)) / 2; + return " " x int($Len) . $Temp . " " x (int($Len) + (($Len != int($Len))? 1:0)); +} + +# ------------------ A U T O L O A D F U N C T I O N --------------------- + +sub AUTOLOAD { + # This AUTOLOAD is used to 'autoload' constants from the constant() + # XS function. If a constant is not found then control is passed + # to the AUTOLOAD in AutoLoader. + + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + #reset $! to zero to reset any current errors. + local $! = 0; + $val = constant($constname, @_ ? $_[0] : 0); + + if ($! != 0) { + if ($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + + # Added by JOC 06-APR-96 + # $pack = 0; + $pack = 0; + ($pack,$file,$line) = caller; + print "Your vendor has not defined Win32::Pipe macro $constname, used in $file at line $line."; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + +bootstrap Win32::Pipe; + +1; +__END__ + +=head1 NAME + +Win32::Pipe - Win32 Named Pipe + +=head1 SYNOPSIS + +To use this extension, follow these basic steps. First, you need to +'use' the pipe extension: + + use Win32::Pipe; + +Then you need to create a server side of a named pipe: + + $Pipe = new Win32::Pipe("My Pipe Name"); + +or if you are going to connect to pipe that has already been created: + + $Pipe = new Win32::Pipe("\\\\server\\pipe\\My Pipe Name"); + + NOTE: The "\\\\server\\pipe\\" is necessary when connecting + to an existing pipe! If you are accessing the same + machine you could use "\\\\.\\pipe\\" but either way + works fine. + +You should check to see if C<$Pipe> is indeed defined otherwise there +has been an error. + +Whichever end is the server, it must now wait for a connection... + + $Result = $Pipe->Connect(); + + NOTE: The client end does not do this! When the client creates + the pipe it has already connected! + +Now you can read and write data from either end of the pipe: + + $Data = $Pipe->Read(); + + $Result = $Pipe->Write("Howdy! This is cool!"); + +When the server is finished it must disconnect: + + $Pipe->Disconnect(); + +Now the server could C<Connect> again (and wait for another client) or +it could destroy the named pipe... + + $Data->Close(); + +The client should C<Close> in order to properly end the session. + +=head1 DESCRIPTION + +=head2 General Use + +This extension gives Win32 Perl the ability to use Named Pipes. Why? +Well considering that Win32 Perl does not (yet) have the ability to +C<fork> I could not see what good the C<pipe(X,Y)> was. Besides, where +I am as an admin I must have several perl daemons running on several +NT Servers. It dawned on me one day that if I could pipe all these +daemons' output to my workstation (across the net) then it would be +much easier to monitor. This was the impetus for an extension using +Named Pipes. I think that it is kinda cool. :) + +=head2 Benefits + +And what are the benefits of this module? + +=over + +=item * + +You may create as many named pipes as you want (uh, well, as many as +your resources will allow). + +=item * + +Currently there is a limit of 256 instances of a named pipe (once a +pipe is created you can have 256 client/server connections to that +name). + +=item * + +The default buffer size is 512 bytes; this can be altered by the +C<ResizeBuffer> method. + +=item * + +All named pipes are byte streams. There is currently no way to alter a +pipe to be message based. + +=item * + +Other things that I cannot think of right now... :) + +=back + +=head1 CONSTRUCTOR + +=over + +=item new ( NAME ) + +Creates a named pipe if used in server context or a connection to the +specified named pipe if used in client context. Client context is +determined by prepending $Name with "\\\\". + +Returns I<true> on success, I<false> on failure. + +=back + +=head1 METHODS + +=over + +=item BufferSize () + +Returns the size of the instance of the buffer of the named pipe. + +=item Connect () + +Tells the named pipe to create an instance of the named pipe and wait +until a client connects. Returns I<true> on success, I<false> on +failure. + +=item Close () + +Closes the named pipe. + +=item Disconnect () + +Disconnects (and destroys) the instance of the named pipe from the +client. Returns I<true> on success, I<false> on failure. + +=item Error () + +Returns the last error messages pertaining to the named pipe. If used +in context to the package. Returns a list containing C<ERROR_NUMBER> +and C<ERROR_TEXT>. + +=item Read () + +Reads from the named pipe. Returns data read from the pipe on success, +undef on failure. + +=item ResizeBuffer ( SIZE ) + +Sets the size of the buffer of the instance of the named pipe to +C<SIZE>. Returns the size of the buffer on success, I<false> on +failure. + +=item Write ( DATA ) + +Writes C<DATA> to the named pipe. Returns I<true> on success, I<false> +on failure. + +=back + +=head1 LIMITATIONS + +What known problems does this thing have? + +=over + +=item * + +If someone is waiting on a C<Read> and the other end terminates then +you will wait for one B<REALLY> long time! (If anyone has an idea on +how I can detect the termination of the other end let me know!) + +=item * + +All pipes are blocking. I am considering using threads and callbacks +into Perl to perform async IO but this may be too much for my time +stress. ;) + +=item * + +There is no security placed on these pipes. + +=item * + +This module has neither been optimized for speed nor optimized for +memory consumption. This may run into memory bloat. + +=back + +=head1 INSTALLATION NOTES + +If you wish to use this module with a build of Perl other than +ActivePerl, you may wish to fetch the source distribution for this +module. The source is included as part of the C<libwin32> bundle, +which you can find in any CPAN mirror here: + + modules/by-authors/Gurusamy_Sarathy/libwin32-0.151.tar.gz + +The source distribution also contains a pair of sample client/server +test scripts. For the latest information on this module, consult the +following web site: + + http://www.roth.net/perl + +=head1 AUTHOR + +Dave Roth <rothd@roth.net> + +=head1 DISCLAIMER + +I do not guarantee B<ANYTHING> with this package. If you use it you +are doing so B<AT YOUR OWN RISK>! I may or may not support this +depending on my time schedule. + +=head1 COPYRIGHT + +Copyright (c) 1996 Dave Roth. All rights reserved. +This program is free software; you can redistribute +it and/or modify it under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Win32/Process.pm b/Master/tlpkg/tlperl.old/lib/Win32/Process.pm new file mode 100644 index 00000000000..f07169b4080 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/Process.pm @@ -0,0 +1,217 @@ +package Win32::Process; + +require Exporter; +require DynaLoader; +@ISA = qw(Exporter DynaLoader); + +$VERSION = '0.10'; + +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. +@EXPORT = qw( + CREATE_DEFAULT_ERROR_MODE + CREATE_NEW_CONSOLE + CREATE_NEW_PROCESS_GROUP + CREATE_NO_WINDOW + CREATE_SEPARATE_WOW_VDM + CREATE_SUSPENDED + CREATE_UNICODE_ENVIRONMENT + DEBUG_ONLY_THIS_PROCESS + DEBUG_PROCESS + DETACHED_PROCESS + HIGH_PRIORITY_CLASS + IDLE_PRIORITY_CLASS + INFINITE + NORMAL_PRIORITY_CLASS + REALTIME_PRIORITY_CLASS + THREAD_PRIORITY_ABOVE_NORMAL + THREAD_PRIORITY_BELOW_NORMAL + THREAD_PRIORITY_ERROR_RETURN + THREAD_PRIORITY_HIGHEST + THREAD_PRIORITY_IDLE + THREAD_PRIORITY_LOWEST + THREAD_PRIORITY_NORMAL + THREAD_PRIORITY_TIME_CRITICAL +); + +@EXPORT_OK = qw( + STILL_ACTIVE +); + +sub AUTOLOAD { + # This AUTOLOAD is used to 'autoload' constants from the constant() + # XS function. + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + local $! = 0; + my $val = constant($constname); + if ($! != 0) { + my ($pack,$file,$line) = caller; + die "Your vendor has not defined Win32::Process macro $constname, used at $file line $line."; + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} # end AUTOLOAD + +bootstrap Win32::Process; + +# Win32::IPC > 1.02 uses the get_Win32_IPC_HANDLE method: +*get_Win32_IPC_HANDLE = \&get_process_handle; + +1; +__END__ + +=head1 NAME + +Win32::Process - Create and manipulate processes. + +=head1 SYNOPSIS + + use Win32::Process; + use Win32; + + sub ErrorReport{ + print Win32::FormatMessage( Win32::GetLastError() ); + } + + Win32::Process::Create($ProcessObj, + "C:\\winnt\\system32\\notepad.exe", + "notepad temp.txt", + 0, + NORMAL_PRIORITY_CLASS, + ".")|| die ErrorReport(); + + $ProcessObj->Suspend(); + $ProcessObj->Resume(); + $ProcessObj->Wait(INFINITE); + +=head1 DESCRIPTION + +This module provides access to the process control functions in the +Win32 API. + +=head1 METHODS + +=over 8 + +=item Win32::Process::Create($obj,$appname,$cmdline,$iflags,$cflags,$curdir) + +Creates a new process. + + Args: + + $obj container for process object + $appname full path name of executable module + $cmdline command line args + $iflags flag: inherit calling processes handles or not + $cflags flags for creation (see exported vars below) + $curdir working dir of new process + +Returns non-zero on success, 0 on failure. + +=item Win32::Process::Open($obj,$pid,$iflags) + +Creates a handle Perl can use to an existing process as identified by $pid. +The $iflags is the inherit flag that is passed to OpenProcess. Currently +Win32::Process objects created using Win32::Process::Open cannot Suspend +or Resume the process. All other calls should work. + +Win32::Process::Open returns non-zero on success, 0 on failure. + +=item Win32::Process::KillProcess($pid, $exitcode) + +Terminates any process identified by $pid. $exitcode will be set to +the exit code of the process. + +=item $ProcessObj->Suspend() + +Suspend the process associated with the $ProcessObj. + +=item $ProcessObj->Resume() + +Resume a suspended process. + +=item $ProcessObj->Kill($exitcode) + +Kill the associated process, have it terminate with exit code $ExitCode. + +=item $ProcessObj->GetPriorityClass($class) + +Get the priority class of the process. + +=item $ProcessObj->SetPriorityClass($class) + +Set the priority class of the process (see exported values below for +options). + +=item $ProcessObj->GetProcessAffinityMask($processAffinityMask, $systemAffinityMask) + +Get the process affinity mask. This is a bitvector in which each bit +represents the processors that a process is allowed to run on. + +=item $ProcessObj->SetProcessAffinityMask($processAffinityMask) + +Set the process affinity mask. Only available on Windows NT. + +=item $ProcessObj->GetExitCode($exitcode) + +Retrieve the exitcode of the process. Will return STILL_ACTIVE if the +process is still running. The STILL_ACTIVE constant is only exported +by explicit request. + +=item $ProcessObj->Wait($timeout) + +Wait for the process to die. $timeout should be specified in milliseconds. +To wait forever, specify the constant C<INFINITE>. + +=item $ProcessObj->GetProcessID() + +Returns the Process ID. + +=item Win32::Process::GetCurrentProcessID() + +Returns the current process ID, which is the same as $$. But not on cygwin, +where $$ is the cygwin-internal PID and not the windows PID. +On cygwin GetCurrentProcessID() returns the windows PID as needed for all +the Win32::Process functions. + +=back + +=head1 EXPORTS + +The following constants are exported by default: + + CREATE_DEFAULT_ERROR_MODE + CREATE_NEW_CONSOLE + CREATE_NEW_PROCESS_GROUP + CREATE_NO_WINDOW + CREATE_SEPARATE_WOW_VDM + CREATE_SUSPENDED + CREATE_UNICODE_ENVIRONMENT + DEBUG_ONLY_THIS_PROCESS + DEBUG_PROCESS + DETACHED_PROCESS + HIGH_PRIORITY_CLASS + IDLE_PRIORITY_CLASS + INFINITE + NORMAL_PRIORITY_CLASS + REALTIME_PRIORITY_CLASS + THREAD_PRIORITY_ABOVE_NORMAL + THREAD_PRIORITY_BELOW_NORMAL + THREAD_PRIORITY_ERROR_RETURN + THREAD_PRIORITY_HIGHEST + THREAD_PRIORITY_IDLE + THREAD_PRIORITY_LOWEST + THREAD_PRIORITY_NORMAL + THREAD_PRIORITY_TIME_CRITICAL + +The following additional constants are exported by request only: + + STILL_ACTIVE + +=cut + +# Local Variables: +# tmtrack-file-task: "Win32::Process" +# End: diff --git a/Master/tlpkg/tlperl.old/lib/Win32/Registry.pm b/Master/tlpkg/tlperl.old/lib/Win32/Registry.pm new file mode 100644 index 00000000000..c83fca5a3b1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/Registry.pm @@ -0,0 +1,547 @@ +package Win32::Registry; + +=head1 NAME + +Win32::Registry - accessing the Windows registry [obsolete, use Win32::TieRegistry] + +=head1 SYNOPSIS + + use Win32::Registry; + my $tips; + $::HKEY_LOCAL_MACHINE->Open("SOFTWARE\\Microsoft\\Windows" + ."\\CurrentVersion\\Explorer\\Tips", $tips) + or die "Can't open tips: $^E"; + my ($type, $value); + $tips->QueryValueEx("18", $type, $value) or die "No tip #18: $^E"; + print "Here's a tip: $value\n"; + +=head1 DESCRIPTION + + NOTE: This module provides a very klunky interface to access the + Windows registry, and is not currently being developed actively. It + only exists for backward compatibility with old code that uses it. + For more powerful and flexible ways to access the registry, use + Win32::TieRegistry. + +Win32::Registry provides an object oriented interface to the Windows +Registry. + +The following "root" registry objects are exported to the main:: name +space. Additional keys must be opened by calling the provided methods +on one of these. + + $HKEY_CLASSES_ROOT + $HKEY_CURRENT_USER + $HKEY_LOCAL_MACHINE + $HKEY_USERS + $HKEY_PERFORMANCE_DATA + $HKEY_CURRENT_CONFIG + $HKEY_DYN_DATA + +=cut + +use strict; +require Exporter; +require DynaLoader; +use Win32::WinError; + +require Win32 unless defined &Win32::GetLastError; + +use vars qw($VERSION $AUTOLOAD @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); + +$VERSION = '0.07'; + +@ISA = qw( Exporter DynaLoader ); +@EXPORT = qw( + HKEY_CLASSES_ROOT + HKEY_CURRENT_USER + HKEY_LOCAL_MACHINE + HKEY_PERFORMANCE_DATA + HKEY_CURRENT_CONFIG + HKEY_DYN_DATA + HKEY_USERS + KEY_ALL_ACCESS + KEY_CREATE_LINK + KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + KEY_EXECUTE + KEY_NOTIFY + KEY_QUERY_VALUE + KEY_READ + KEY_SET_VALUE + KEY_WRITE + REG_BINARY + REG_CREATED_NEW_KEY + REG_DWORD + REG_DWORD_BIG_ENDIAN + REG_DWORD_LITTLE_ENDIAN + REG_EXPAND_SZ + REG_FULL_RESOURCE_DESCRIPTOR + REG_LEGAL_CHANGE_FILTER + REG_LEGAL_OPTION + REG_LINK + REG_MULTI_SZ + REG_NONE + REG_NOTIFY_CHANGE_ATTRIBUTES + REG_NOTIFY_CHANGE_LAST_SET + REG_NOTIFY_CHANGE_NAME + REG_NOTIFY_CHANGE_SECURITY + REG_OPENED_EXISTING_KEY + REG_OPTION_BACKUP_RESTORE + REG_OPTION_CREATE_LINK + REG_OPTION_NON_VOLATILE + REG_OPTION_RESERVED + REG_OPTION_VOLATILE + REG_REFRESH_HIVE + REG_RESOURCE_LIST + REG_RESOURCE_REQUIREMENTS_LIST + REG_SZ + REG_WHOLE_HIVE_VOLATILE +); + +@EXPORT_OK = qw( + RegCloseKey + RegConnectRegistry + RegCreateKey + RegCreateKeyEx + RegDeleteKey + RegDeleteValue + RegEnumKey + RegEnumValue + RegFlushKey + RegGetKeySecurity + RegLoadKey + RegNotifyChangeKeyValue + RegOpenKey + RegOpenKeyEx + RegQueryInfoKey + RegQueryValue + RegQueryValueEx + RegReplaceKey + RegRestoreKey + RegSaveKey + RegSetKeySecurity + RegSetValue + RegSetValueEx + RegUnLoadKey +); +$EXPORT_TAGS{ALL}= \@EXPORT_OK; + +bootstrap Win32::Registry; + +sub import { + my $pkg = shift; + if ($_[0] && "Win32" eq $_[0]) { + Exporter::export($pkg, "Win32", @EXPORT_OK); + shift; + } + Win32::Registry->export_to_level(1+$Exporter::ExportLevel, $pkg, @_); +} + +####################################################################### +# This AUTOLOAD is used to 'autoload' constants from the constant() +# XS function. If a constant is not found then control is passed +# to the AUTOLOAD in AutoLoader. + +sub AUTOLOAD { + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + #reset $! to zero to reset any current errors. + local $! = 0; + my $val = constant($constname, 0); + if ($! != 0) { + if ($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + my ($pack,$file,$line) = caller; + die "Unknown constant $constname in Win32::Registry " + . "at $file line $line.\n"; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + +####################################################################### +# _new is a private constructor, not intended for public use. +# + +sub _new { + my $self; + if ($_[0]) { + $self->{'handle'} = $_[0]; + bless $self; + } + $self; +} + +#define the basic registry objects to be exported. +#these had to be hardwired unfortunately. +# XXX Yuck! + +{ + package main; + use vars qw( + $HKEY_CLASSES_ROOT + $HKEY_CURRENT_USER + $HKEY_LOCAL_MACHINE + $HKEY_USERS + $HKEY_PERFORMANCE_DATA + $HKEY_CURRENT_CONFIG + $HKEY_DYN_DATA + ); +} + +$::HKEY_CLASSES_ROOT = _new(&HKEY_CLASSES_ROOT); +$::HKEY_CURRENT_USER = _new(&HKEY_CURRENT_USER); +$::HKEY_LOCAL_MACHINE = _new(&HKEY_LOCAL_MACHINE); +$::HKEY_USERS = _new(&HKEY_USERS); +$::HKEY_PERFORMANCE_DATA = _new(&HKEY_PERFORMANCE_DATA); +$::HKEY_CURRENT_CONFIG = _new(&HKEY_CURRENT_CONFIG); +$::HKEY_DYN_DATA = _new(&HKEY_DYN_DATA); + +=head2 Methods + +The following methods are supported. Note that subkeys can be +specified as a path name, separated by backslashes (which may +need to be doubled if you put them in double quotes). + +=over 8 + +=item Open + + $reg_obj->Open($sub_key_name, $sub_reg_obj); + +Opens a subkey of a registry object, returning the new registry object +in $sub_reg_obj. + +=cut + +sub Open { + my $self = shift; + die 'usage: $obj->Open($sub_key_name, $sub_reg_obj)' if @_ != 2; + + my ($subkey) = @_; + my ($result,$subhandle); + + $result = RegOpenKey($self->{'handle'},$subkey,$subhandle); + $_[1] = _new($subhandle); + + return 0 unless $_[1]; + $! = Win32::GetLastError() unless $result; + return $result; +} + +=item Close + + $reg_obj->Close(); + +Closes an open registry key. + +=cut + +sub Close { + my $self = shift; + die 'usage: $obj->Close()' if @_ != 0; + + return unless exists $self->{'handle'}; + my $result = RegCloseKey($self->{'handle'}); + if ($result) { + delete $self->{'handle'}; + } + else { + $! = Win32::GetLastError(); + } + return $result; +} + +sub DESTROY { + my $self = shift; + return unless exists $self->{'handle'}; + RegCloseKey($self->{'handle'}); + delete $self->{'handle'}; +} + + +=item Connect + + $reg_obj->Connect($node_name, $new_reg_obj); + +Connects to a remote Registry on the node specified by $node_name, +returning it in $new_reg_obj. Returns false if it fails. + +=cut + +sub Connect { + my $self = shift; + die 'usage: $obj->Connect($node_name, $new_reg_obj)' if @_ != 2; + + my ($node) = @_; + my ($result,$subhandle); + + $result = RegConnectRegistry ($node, $self->{'handle'}, $subhandle); + $_[1] = _new($subhandle); + + return 0 unless $_[1]; + $! = Win32::GetLastError() unless $result; + return $result; +} + +=item Create + + $reg_obj->Create($sub_key_name, $new_reg_obj); + +Opens the subkey specified by $sub_key_name, returning the new registry +object in $new_reg_obj. If the specified subkey doesn't exist, it is +created. + +=cut + +sub Create { + my $self = shift; + die 'usage: $obj->Create($sub_key_name, $new_reg_obj)' if @_ != 2; + + my ($subkey) = @_; + my ($result,$subhandle); + + $result = RegCreateKey($self->{'handle'},$subkey,$subhandle); + $_[1] = _new ($subhandle); + + return 0 unless $_[1]; + $! = Win32::GetLastError() unless $result; + return $result; +} + +=item SetValue + + $reg_obj->SetValue($sub_key_name, $type, $value); + +Sets the default value for a subkey specified by $sub_key_name. + +=cut + +sub SetValue { + my $self = shift; + die 'usage: $obj->SetValue($subkey, $type, $value)' if @_ != 3; + my $result = RegSetValue($self->{'handle'}, @_); + $! = Win32::GetLastError() unless $result; + return $result; +} + +=item SetValueEx + + $reg_obj->SetValueEx($value_name, $reserved, $type, $value); + +Sets the value for the value name identified by $value_name +in the key specified by $reg_obj. + +=cut + +sub SetValueEx { + my $self = shift; + die 'usage: $obj->SetValueEx($value_name, $reserved, $type, $value)' if @_ != 4; + my $result = RegSetValueEx($self->{'handle'}, @_); + $! = Win32::GetLastError() unless $result; + return $result; +} + +=item QueryValue + + $reg_obj->QueryValue($sub_key_name, $value); + +Gets the default value of the subkey specified by $sub_key_name. + +=cut + +sub QueryValue { + my $self = shift; + die 'usage: $obj->QueryValue($sub_key_name, $value)' if @_ != 2; + my $result = RegQueryValue($self->{'handle'}, $_[0], $_[1]); + $! = Win32::GetLastError() unless $result; + return $result; +} + +=item QueryKey + + $reg_obj->QueryKey($classref, $number_of_subkeys, $number_of_values); + +Gets information on a key specified by $reg_obj. + +=cut + +sub QueryKey { + my $garbage; + my $self = shift; + die 'usage: $obj->QueryKey($classref, $number_of_subkeys, $number_of_values)' + if @_ != 3; + + my $result = RegQueryInfoKey($self->{'handle'}, $_[0], + $garbage, $garbage, $_[1], + $garbage, $garbage, $_[2], + $garbage, $garbage, $garbage, $garbage); + + $! = Win32::GetLastError() unless $result; + return $result; +} + +=item QueryValueEx + + $reg_obj->QueryValueEx($value_name, $type, $value); + +Gets the value for the value name identified by $value_name +in the key specified by $reg_obj. + +=cut + +sub QueryValueEx { + my $self = shift; + die 'usage: $obj->QueryValueEx($value_name, $type, $value)' if @_ != 3; + my $result = RegQueryValueEx($self->{'handle'}, $_[0], undef, $_[1], $_[2]); + $! = Win32::GetLastError() unless $result; + return $result; +} + +=item GetKeys + + my @keys; + $reg_obj->GetKeys(\@keys); + +Populates the supplied array reference with the names of all the keys +within the registry object $reg_obj. + +=cut + +sub GetKeys { + my $self = shift; + die 'usage: $obj->GetKeys($arrayref)' if @_ != 1 or ref($_[0]) ne 'ARRAY'; + + my ($result, $i, $keyname); + $keyname = "DummyVal"; + $i = 0; + $result = 1; + + while ( $result ) { + $result = RegEnumKey( $self->{'handle'},$i++, $keyname ); + if ($result) { + push( @{$_[0]}, $keyname ); + } + } + return(1); +} + +=item GetValues + + my %values; + $reg_obj->GetValues(\%values); + +Populates the supplied hash reference with entries of the form + + $value_name => [ $value_name, $type, $data ] + +for each value in the registry object $reg_obj. + +=cut + +sub GetValues { + my $self = shift; + die 'usage: $obj->GetValues($hashref)' if @_ != 1; + + my ($result,$name,$type,$data,$i); + $name = "DummyVal"; + $i = 0; + while ( $result=RegEnumValue( $self->{'handle'}, + $i++, + $name, + undef, + $type, + $data )) + { + $_[0]->{$name} = [ $name, $type, $data ]; + } + return(1); +} + +=item DeleteKey + + $reg_obj->DeleteKey($sub_key_name); + +Deletes a subkey specified by $sub_key_name from the registry. + +=cut + +sub DeleteKey { + my $self = shift; + die 'usage: $obj->DeleteKey($sub_key_name)' if @_ != 1; + my $result = RegDeleteKey($self->{'handle'}, @_); + $! = Win32::GetLastError() unless $result; + return $result; +} + +=item DeleteValue + + $reg_obj->DeleteValue($value_name); + +Deletes a value identified by $value_name from the registry. + +=cut + +sub DeleteValue { + my $self = shift; + die 'usage: $obj->DeleteValue($value_name)' if @_ != 1; + my $result = RegDeleteValue($self->{'handle'}, @_); + $! = Win32::GetLastError() unless $result; + return $result; +} + +=item Save + + $reg_obj->Save($filename); + +Saves the hive specified by $reg_obj to a file. + +=cut + +sub Save { + my $self = shift; + die 'usage: $obj->Save($filename)' if @_ != 1; + my $result = RegSaveKey($self->{'handle'}, @_); + $! = Win32::GetLastError() unless $result; + return $result; +} + +=item Load + + $reg_obj->Load($sub_key_name, $file_name); + +Loads a key specified by $sub_key_name from a file. + +=cut + +sub Load { + my $self = shift; + die 'usage: $obj->Load($sub_key_name, $file_name)' if @_ != 2; + my $result = RegLoadKey($self->{'handle'}, @_); + $! = Win32::GetLastError() unless $result; + return $result; +} + +=item UnLoad + + $reg_obj->Unload($sub_key_name); + +Unloads a registry hive. + +=cut + +sub UnLoad { + my $self = shift; + die 'usage: $obj->UnLoad($sub_key_name)' if @_ != 1; + my $result = RegUnLoadKey($self->{'handle'}, @_); + $! = Win32::GetLastError() unless $result; + return $result; +} + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Win32/Semaphore.pm b/Master/tlpkg/tlperl.old/lib/Win32/Semaphore.pm new file mode 100644 index 00000000000..2e2096eb6ed --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/Semaphore.pm @@ -0,0 +1,128 @@ +#--------------------------------------------------------------------- +package Win32::Semaphore; +# +# Copyright 1998 Christopher J. Madsen +# +# Created: 3 Feb 1998 from the ActiveWare version +# (c) 1995 Microsoft Corporation. All rights reserved. +# Developed by ActiveWare Internet Corp., http://www.ActiveWare.com +# +# Other modifications (c) 1997 by Gurusamy Sarathy <gsar@activestate.com> +# +# Author: Christopher J. Madsen <cjm@pobox.com> +# Version: 1.00 (6-Feb-1998) +# +# This program is free software; you can redistribute it and/or modify +# it under the same terms as Perl itself. +# +# 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 either the +# GNU General Public License or the Artistic License for more details. +# +# Use Win32 semaphore objects for synchronization +#--------------------------------------------------------------------- + +$VERSION = '1.02'; + +use Win32::IPC 1.00 '/./'; # Import everything +require Exporter; +require DynaLoader; + +@ISA = qw(Exporter DynaLoader Win32::IPC); +@EXPORT_OK = qw( + wait_all wait_any +); + +bootstrap Win32::Semaphore; + +sub Create { $_[0] = new('Win32::Semaphore',@_[1..3]) } +sub Open { $_[0] = Win32::Semaphore->open($_[1]) } +sub Release { &release } + +1; +__END__ + +=head1 NAME + +Win32::Semaphore - Use Win32 semaphore objects from Perl + +=head1 SYNOPSIS + require Win32::Semaphore; + + $sem = Win32::Semaphore->new($initial,$maximum,$name); + $sem->wait; + +=head1 DESCRIPTION + +This module allows access to Win32 semaphore objects. The C<wait> +method and C<wait_all> & C<wait_any> functions are inherited from the +L<"Win32::IPC"> module. + +=head2 Methods + +=over 4 + +=item $semaphore = Win32::Semaphore->new($initial, $maximum, [$name]) + +Constructor for a new semaphore object. C<$initial> is the initial +count, and C<$maximum> is the maximum count for the semaphore. If +C<$name> is omitted, creates an unnamed semaphore object. + +If C<$name> signifies an existing semaphore object, then C<$initial> +and C<$maximum> are ignored and the object is opened. If this +happens, C<$^E> will be set to 183 (ERROR_ALREADY_EXISTS). + +=item $semaphore = Win32::Semaphore->open($name) + +Constructor for opening an existing semaphore object. + +=item $semaphore->release([$increment, [$previous]]) + +Increment the count of C<$semaphore> by C<$increment> (default 1). +If C<$increment> plus the semaphore's current count is more than its +maximum count, the count is not changed. Returns true if the +increment is successful. + +The semaphore's count (before incrementing) is stored in the second +argument (if any). + +It is not necessary to wait on a semaphore before calling C<release>, +but you'd better know what you're doing. + +=item $semaphore->wait([$timeout]) + +Wait for C<$semaphore>'s count to be nonzero, then decrement it by 1. +See L<"Win32::IPC">. + +=back + +=head2 Deprecated Functions and Methods + +B<Win32::Semaphore> still supports the ActiveWare syntax, but its use +is deprecated. + +=over 4 + +=item Win32::Semaphore::Create($SemObject,$Initial,$Max,$Name) + +Use C<$SemObject = Win32::Semaphore-E<gt>new($Initial,$Max,$Name)> instead. + +=item Win32::Semaphore::Open($SemObject, $Name) + +Use C<$SemObject = Win32::Semaphore-E<gt>open($Name)> instead. + +=item $SemObj->Release($Count,$LastVal) + +Use C<$SemObj-E<gt>release($Count,$LastVal)> instead. + +=back + +=head1 AUTHOR + +Christopher J. Madsen E<lt>F<cjm@pobox.com>E<gt> + +Loosely based on the original module by ActiveWare Internet Corp., +F<http://www.ActiveWare.com> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Win32/Server.pl b/Master/tlpkg/tlperl.old/lib/Win32/Server.pl new file mode 100644 index 00000000000..ecfb91ba864 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/Server.pl @@ -0,0 +1,48 @@ +use strict; +use Win32::Pipe; + +my $PipeName = "TEST this long named pipe!"; +my $NewSize = 2048; +my $iMessage; + +while () { + print "Creating pipe \"$PipeName\".\n"; + if (my $Pipe = new Win32::Pipe($PipeName)) { + my $PipeSize = $Pipe->BufferSize(); + print "This pipe's current size is $PipeSize byte" . (($PipeSize == 1)? "":"s") . ".\nWe shall change it to $NewSize ..."; + print +(($Pipe->ResizeBuffer($NewSize) == $NewSize)? "Successful":"Unsucessful") . "!\n\n"; + + print "\n\nR e a d y f o r r e a d i n g :\n"; + print "-----------------------------------\n"; + + print "Openning the pipe...\n"; + while ($Pipe->Connect()) { + while () { + ++$iMessage; + print "Reading Message #$iMessage: "; + my $In = $Pipe->Read(); + unless ($In) { + print "Recieved no data, closing connection....\n"; + last; + } + if ($In =~ /^quit/i){ + print "\n\nQuitting this connection....\n"; + last; + } + elsif ($In =~ /^exit/i){ + print "\n\nExitting.....\n"; + exit; + } + else{ + print "\"$In\"\n"; + } + } + print "Disconnecting...\n"; + $Pipe->Disconnect(); + } + print "Closing...\n"; + $Pipe->Close(); + } +} + +print "You can't get here...\n"; diff --git a/Master/tlpkg/tlperl.old/lib/Win32/Service.pm b/Master/tlpkg/tlperl.old/lib/Win32/Service.pm new file mode 100644 index 00000000000..0ae33b13ef8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/Service.pm @@ -0,0 +1,103 @@ +package Win32::Service; + +# +# Service.pm +# Written by Douglas_Lankshear@ActiveWare.com +# +# subsequently hacked by Gurusamy Sarathy <gsar@activestate.com> +# + +$VERSION = '0.05'; + +require Exporter; +require DynaLoader; + +require Win32 unless defined &Win32::IsWinNT; +die "The Win32::Service module works only on Windows NT" unless Win32::IsWinNT(); + +@ISA= qw( Exporter DynaLoader ); +@EXPORT_OK = + qw( + StartService + StopService + GetStatus + PauseService + ResumeService + GetServices + ); + +=head1 NAME + +Win32::Service - manage system services in perl + +=head1 SYNOPSIS + + use Win32::Service; + +=head1 DESCRIPTION + +This module offers control over the administration of system services. + +=head1 FUNCTIONS + +=head2 NOTE: + +All of the functions return false if they fail, unless otherwise noted. +If hostName is an empty string, the local machine is assumed. + +=over 10 + +=item StartService(hostName, serviceName) + +Start the service serviceName on machine hostName. + +=item StopService(hostName, serviceName) + +Stop the service serviceName on the machine hostName. + +=item GetStatus(hostName, serviceName, status) + +Get the status of a service. The third argument must be a hash +reference that will be populated with entries corresponding +to the SERVICE_STATUS structure of the Win32 API. See the +Win32 Platform SDK documentation for details of this structure. + +=item PauseService(hostName, serviceName) + +=item ResumeService(hostName, serviceName) + +=item GetServices(hostName, hashref) + +Enumerates both active and inactive Win32 services at the specified host. +The hashref is populated with the descriptive service names as keys +and the short names as the values. + +=back + +=cut + +sub AUTOLOAD +{ + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + #reset $! to zero to reset any current errors. + local $! = 0; + my $val = constant($constname); + if ($! != 0) { + if($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + ($pack,$file,$line) = caller; + die "Your vendor has not defined Win32::Service macro $constname, used in $file at line $line."; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + +bootstrap Win32::Service; + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Win32/Shortcut.pm b/Master/tlpkg/tlperl.old/lib/Win32/Shortcut.pm new file mode 100644 index 00000000000..d4dadafdcf2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/Shortcut.pm @@ -0,0 +1,323 @@ +package Win32::Shortcut; +####################################################################### +# +# Win32::Shortcut - Perl Module for Shell Link Interface +# ^^^^^^^^^^^^^^^ +# This module creates an object oriented interface to the Win32 +# Shell Links (IShellLink interface). +# +####################################################################### + +$VERSION = "0.04"; + +require Exporter; +require DynaLoader; + +@ISA= qw( Exporter DynaLoader ); +@EXPORT = qw( + SW_SHOWMAXIMIZED + SW_SHOWMINNOACTIVE + SW_SHOWNORMAL +); + + +####################################################################### +# This AUTOLOAD is used to 'autoload' constants from the constant() +# XS function. If a constant is not found then control is passed +# to the AUTOLOAD in AutoLoader. +# + +sub AUTOLOAD { + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + #reset $! to zero to reset any current errors. + local $!; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($!) { + my(undef, $file, $line) = caller; + die "Win32::Shortcut::$constname is not defined, used at $file line $line."; + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + + +####################################################################### +# PUBLIC METHODS +# + +#======== +sub new { +#======== + my($class, $file) = @_; + my $self = {}; + my $ilink = 0; + my $ifile = 0; + + ($ilink, $ifile) = _Instance(); + + if($ilink and $ifile) { + $self->{'ilink'} = $ilink; + $self->{'ifile'} = $ifile; + bless $self; + # Initialize properties + $self->{'File'} = ""; + $self->{'Path'} = ""; + $self->{'Arguments'} = ""; + $self->{'WorkingDirectory'} = ""; + $self->{'Description'} = ""; + $self->{'ShowCmd'} = 0; + $self->{'Hotkey'} = 0; + $self->{'IconLocation'} = ""; + $self->{'IconNumber'} = 0; + + $self->Load($file) if $file; + + } else { + return undef; + } + $self; +} + +#========= +sub Load { +#========= + my($self, $file) = @_; + return undef unless ref($self); + + my $result = _Load($self->{'ilink'}, $self->{'ifile'}, $file); + + if ($result) { + + # fill the properties of $self + $self->{'File'} = $file; + $self->{'Path'} = _GetPath($self->{'ilink'}, $self->{'ifile'},0); + $self->{'ShortPath'} = _GetPath($self->{'ilink'}, $self->{'ifile'},1); + $self->{'Arguments'} = _GetArguments($self->{'ilink'}, $self->{'ifile'}); + $self->{'WorkingDirectory'} = _GetWorkingDirectory($self->{'ilink'}, $self->{'ifile'}); + $self->{'Description'} = _GetDescription($self->{'ilink'}, $self->{'ifile'}); + $self->{'ShowCmd'} = _GetShowCmd($self->{'ilink'}, $self->{'ifile'}); + $self->{'Hotkey'} = _GetHotkey($self->{'ilink'}, $self->{'ifile'}); + ($self->{'IconLocation'}, + $self->{'IconNumber'}) = _GetIconLocation($self->{'ilink'}, $self->{'ifile'}); + } + return $result; +} + + +#======== +sub Set { +#======== + my($self, $path, $arguments, $dir, $description, $show, $hotkey, + $iconlocation, $iconnumber) = @_; + return undef unless ref($self); + + $self->{'Path'} = $path; + $self->{'Arguments'} = $arguments; + $self->{'WorkingDirectory'} = $dir; + $self->{'Description'} = $description; + $self->{'ShowCmd'} = $show; + $self->{'Hotkey'} = $hotkey; + $self->{'IconLocation'} = $iconlocation; + $self->{'IconNumber'} = $iconnumber; + return 1; +} + + +#========= +sub Save { +#========= + my($self, $file) = @_; + return unless ref($self); + + $file = $self->{'File'} unless $file; + return unless $file; + + require Win32 unless defined &Win32::GetFullPathName; + $file = Win32::GetFullPathName($file); + + _SetPath($self->{'ilink'}, $self->{'ifile'}, $self->{'Path'}); + _SetArguments($self->{'ilink'}, $self->{'ifile'}, $self->{'Arguments'}); + _SetWorkingDirectory($self->{'ilink'}, $self->{'ifile'}, $self->{'WorkingDirectory'}); + _SetDescription($self->{'ilink'}, $self->{'ifile'}, $self->{'Description'}); + _SetShowCmd($self->{'ilink'}, $self->{'ifile'}, $self->{'ShowCmd'}); + _SetHotkey($self->{'ilink'}, $self->{'ifile'}, $self->{'Hotkey'}); + _SetIconLocation($self->{'ilink'}, $self->{'ifile'}, + $self->{'IconLocation'}, $self->{'IconNumber'}); + + my $result = _Save($self->{'ilink'}, $self->{'ifile'}, $file); + if ($result) { + $self->{'File'} = $file unless $self->{'File'}; + } + return $result; +} + +#============ +sub Resolve { +#============ + my($self, $flags) = @_; + return undef unless ref($self); + $flags = 1 unless defined($flags); + my $result = _Resolve($self->{'ilink'}, $self->{'ifile'}, $flags); + return $result; +} + + +#========== +sub Close { +#========== + my($self) = @_; + return undef unless ref($self); + + my $result = _Release($self->{'ilink'}, $self->{'ifile'}); + $self->{'released'} = 1; + return $result; +} + +#========= +sub Path { +#========= + my($self, $value) = @_; + return undef unless ref($self); + + if(not defined($value)) { + return $self->{'Path'}; + } else { + $self->{'Path'} = $value; + } + return $self->{'Path'}; +} + +#============== +sub ShortPath { +#============== + my($self) = @_; + return undef unless ref($self); + return $self->{'ShortPath'}; +} + +#============== +sub Arguments { +#============== + my($self, $value) = @_; + return undef unless ref($self); + + if(not defined($value)) { + return $self->{'Arguments'}; + } else { + $self->{'Arguments'} = $value; + } + return $self->{'Arguments'}; +} + +#===================== +sub WorkingDirectory { +#===================== + my($self, $value) = @_; + return undef unless ref($self); + + if(not defined($value)) { + return $self->{'WorkingDirectory'}; + } else { + $self->{'WorkingDirectory'} = $value; + } + return $self->{'WorkingDirectory'}; +} + + +#================ +sub Description { +#================ + my($self, $value) = @_; + return undef unless ref($self); + + if(not defined($value)) { + return $self->{'Description'}; + } else { + $self->{'Description'} = $value; + } + return $self->{'Description'}; +} + +#============ +sub ShowCmd { +#============ + my($self, $value) = @_; + return undef unless ref($self); + + if(not defined($value)) { + return $self->{'ShowCmd'}; + } else { + $self->{'ShowCmd'} = $value; + } + return $self->{'ShowCmd'}; +} + +#=========== +sub Hotkey { +#=========== + my($self, $value) = @_; + return undef unless ref($self); + + if(not defined($value)) { + return $self->{'Hotkey'}; + } else { + $self->{'Hotkey'} = $value; + } + return $self->{'Hotkey'}; +} + +#================= +sub IconLocation { +#================= + my($self, $value) = @_; + return undef unless ref($self); + + if(not defined($value)) { + return $self->{'IconLocation'}; + } else { + $self->{'IconLocation'} = $value; + } + return $self->{'IconLocation'}; +} + +#=============== +sub IconNumber { +#=============== + my($self, $value) = @_; + return undef unless ref($self); + + if(not defined($value)) { + return $self->{'IconNumber'}; + } else { + $self->{'IconNumber'} = $value; + } + return $self->{'IconNumber'}; +} + +#============ +sub Version { +#============ + # [dada] to get rid of the "used only once" warning... + return $VERSION; +} + + +####################################################################### +# PRIVATE METHODS +# + +#============ +sub DESTROY { +#============ + my($self) = @_; + + if (not $self->{'released'}) { + _Release($self->{'ilink'}, $self->{'ifile'}); + $self->{'released'} = 1; + } +} + +bootstrap Win32::Shortcut; + +1; diff --git a/Master/tlpkg/tlperl.old/lib/Win32/Sound.pm b/Master/tlpkg/tlperl.old/lib/Win32/Sound.pm new file mode 100644 index 00000000000..a8d52a95117 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/Sound.pm @@ -0,0 +1,582 @@ +####################################################################### +# +# Win32::Sound - An extension to play with Windows sounds +# +# Author: Aldo Calpini <dada@divinf.it> +# Version: 0.47 +# Info: +# http://www.divinf.it/dada/perl +# http://www.perl.com/CPAN/authors/Aldo_Calpini +# +####################################################################### +# Version history: +# 0.01 (19 Nov 1996) file created +# 0.03 (08 Apr 1997) first release +# 0.30 (20 Oct 1998) added Volume/Format/Devices/DeviceInfo +# (thanks Dave Roth!) +# 0.40 (16 Mar 1999) added the WaveOut object +# 0.45 (09 Apr 1999) added $! support, documentation et goodies +# 0.46 (25 Sep 1999) fixed small bug in DESTROY, wo was used without being +# initialized (Gurusamy Sarathy <gsar@activestate.com>) +# 0.47 (22 May 2000) support for passing Unicode string to Play() +# (Doug Lankshear <dougl@activestate.com>) + +package Win32::Sound; + +# See the bottom of this file for the POD documentation. +# Search for the string '=head'. + +require Exporter; # to export the constants to the main:: space +require DynaLoader; # to dynuhlode the module. + +@ISA= qw( Exporter DynaLoader ); +@EXPORT = qw( + SND_ASYNC + SND_NODEFAULT + SND_LOOP + SND_NOSTOP +); + +####################################################################### +# This AUTOLOAD is used to 'autoload' constants from the constant() +# XS function. If a constant is not found then control is passed +# to the AUTOLOAD in AutoLoader. +# + +sub AUTOLOAD { + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + #reset $! to zero to reset any current errors. + local $! = 0; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($! != 0) { + + # [dada] This results in an ugly Autoloader error + + #if ($! =~ /Invalid/) { + # $AutoLoader::AUTOLOAD = $AUTOLOAD; + # goto &AutoLoader::AUTOLOAD; + #} else { + + # [dada] ... I prefer this one :) + + ($pack, $file, $line) = caller; + undef $pack; # [dada] and get rid of "used only once" warning... + die "Win32::Sound::$constname is not defined, used at $file line $line."; + + #} + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + + +####################################################################### +# STATIC OBJECT PROPERTIES +# +$VERSION="0.47"; +undef unless $VERSION; # [dada] to avoid "possible typo" warning + +####################################################################### +# METHODS +# + +sub Version { $VERSION } + +sub Volume { + my(@in) = @_; + # Allows '0%'..'100%' + $in[0] =~ s{ ([\d\.]+)%$ }{ int($1*100/255) }ex if defined $in[0]; + $in[1] =~ s{ ([\d\.]+)%$ }{ int($1*100/255) }ex if defined $in[1]; + _Volume(@in); +} + +####################################################################### +# dynamically load in the Sound.dll module. +# + +bootstrap Win32::Sound; + +####################################################################### +# Win32::Sound::WaveOut +# + +package Win32::Sound::WaveOut; + +sub new { + my($class, $one, $two, $three) = @_; + my $self = {}; + bless($self, $class); + + if($one !~ /^\d+$/ + and not defined($two) + and not defined($three)) { + # Looks like a file + $self->Open($one); + } else { + # Default format if not given + $self->{samplerate} = ($one or 44100); + $self->{bits} = ($two or 16); + $self->{channels} = ($three or 2); + $self->OpenDevice(); + } + return $self; +} + +sub Volume { + my(@in) = @_; + # Allows '0%'..'100%' + $in[0] =~ s{ ([\d\.]+)%$ }{ int($1*255/100) }ex if defined $in[0]; + $in[1] =~ s{ ([\d\.]+)%$ }{ int($1*255/100) }ex if defined $in[1]; + _Volume(@in); +} + +sub Pitch { + my($self, $pitch) = @_; + my($int, $frac); + if(defined($pitch)) { + $pitch =~ /(\d+).?(\d+)?/; + $int = $1; + $frac = $2 or 0; + $int = $int << 16; + $frac = eval("0.$frac * 65536"); + $pitch = $int + $frac; + return _Pitch($self, $pitch); + } else { + $pitch = _Pitch($self); + $int = ($pitch & 0xFFFF0000) >> 16; + $frac = $pitch & 0x0000FFFF; + return eval("$int.$frac"); + } +} + +sub PlaybackRate { + my($self, $rate) = @_; + my($int, $frac); + if(defined($rate)) { + $rate =~ /(\d+).?(\d+)?/; + $int = $1; + $frac = $2 or 0; + $int = $int << 16; + $frac = eval("0.$frac * 65536"); + $rate = $int + $frac; + return _PlaybackRate($self, $rate); + } else { + $rate = _PlaybackRate($self); + $int = ($rate & 0xFFFF0000) >> 16; + $frac = $rate & 0x0000FFFF; + return eval("$int.$frac"); + } +} + +# Preloaded methods go here. + +#Currently Autoloading is not implemented in Perl for win32 +# Autoload methods go after __END__, and are processed by the autosplit program. + +1; +__END__ + + +=head1 NAME + +Win32::Sound - An extension to play with Windows sounds + +=head1 SYNOPSIS + + use Win32::Sound; + Win32::Sound::Volume('100%'); + Win32::Sound::Play("file.wav"); + Win32::Sound::Stop(); + + # ...and read on for more fun ;-) + +=head1 FUNCTIONS + +=over 4 + +=item B<Win32::Sound::Play(SOUND, [FLAGS])> + +Plays the specified sound: SOUND can the be name of a WAV file +or one of the following predefined sound names: + + SystemDefault + SystemAsterisk + SystemExclamation + SystemExit + SystemHand + SystemQuestion + SystemStart + +Additionally, if the named sound could not be found, the +function plays the system default sound (unless you specify the +C<SND_NODEFAULT> flag). If no parameters are given, this function +stops the sound actually playing (see also Win32::Sound::Stop). + +FLAGS can be a combination of the following constants: + +=over 4 + +=item C<SND_ASYNC> + +The sound is played asynchronously and the function +returns immediately after beginning the sound +(if this flag is not specified, the sound is +played synchronously and the function returns +when the sound ends). + +=item C<SND_LOOP> + +The sound plays repeatedly until it is stopped. +You must also specify C<SND_ASYNC> flag. + +=item C<SND_NODEFAULT> + +No default sound is used. If the specified I<sound> +cannot be found, the function returns without +playing anything. + +=item C<SND_NOSTOP> + +If a sound is already playing, the function fails. +By default, any new call to the function will stop +previously playing sounds. + +=back + +=item B<Win32::Sound::Stop()> + +Stops the sound currently playing. + +=item B<Win32::Sound::Volume()> + +Returns the wave device volume; if +called in an array context, returns left +and right values. Otherwise, returns a single +32 bit value (left in the low word, right +in the high word). +In case of error, returns C<undef> and sets +$!. + +Examples: + + ($L, $R) = Win32::Sound::Volume(); + if( not defined Win32::Sound::Volume() ) { + die "Can't get volume: $!"; + } + +=item B<Win32::Sound::Volume(LEFT, [RIGHT])> + +Sets the wave device volume; if two arguments +are given, sets left and right channels +independently, otherwise sets them both to +LEFT (eg. RIGHT=LEFT). Values range from +0 to 65535 (0xFFFF), but they can also be +given as percentage (use a string containing +a number followed by a percent sign). + +Returns C<undef> and sets $! in case of error, +a true value if successful. + +Examples: + + Win32::Sound::Volume('50%'); + Win32::Sound::Volume(0xFFFF, 0x7FFF); + Win32::Sound::Volume('100%', '50%'); + Win32::Sound::Volume(0); + +=item B<Win32::Sound::Format(filename)> + +Returns information about the specified WAV file format; +the array contains: + +=over + +=item * sample rate (in Hz) + +=item * bits per sample (8 or 16) + +=item * channels (1 for mono, 2 for stereo) + +=back + +Example: + + ($hz, $bits, $channels) + = Win32::Sound::Format("file.wav"); + + +=item B<Win32::Sound::Devices()> + +Returns all the available sound devices; +their names contain the type of the +device (WAVEOUT, WAVEIN, MIDIOUT, +MIDIIN, AUX or MIXER) and +a zero-based ID number: valid devices +names are for example: + + WAVEOUT0 + WAVEOUT1 + WAVEIN0 + MIDIOUT0 + MIDIIN0 + AUX0 + AUX1 + AUX2 + +There are also two special device +names, C<WAVE_MAPPER> and C<MIDI_MAPPER> +(the default devices for wave output +and midi output). + +Example: + + @devices = Win32::Sound::Devices(); + +=item Win32::Sound::DeviceInfo(DEVICE) + +Returns an associative array of information +about the sound device named DEVICE (the +same format of Win32::Sound::Devices). + +The content of the array depends on the device +type queried. Each device type returns B<at least> +the following information: + + manufacturer_id + product_id + name + driver_version + +For additional data refer to the following +table: + + WAVEIN..... formats + channels + + WAVEOUT.... formats + channels + support + + MIDIOUT.... technology + voices + notes + channels + support + + AUX........ technology + support + + MIXER...... destinations + support + +The meaning of the fields, where not +obvious, can be evinced from the +Microsoft SDK documentation (too long +to report here, maybe one day... :-). + +Example: + + %info = Win32::Sound::DeviceInfo('WAVE_MAPPER'); + print "$info{name} version $info{driver_version}\n"; + +=back + +=head1 THE WaveOut PACKAGE + +Win32::Sound also provides a different, more +powerful approach to wave audio data with its +C<WaveOut> package. It has methods to load and +then play WAV files, with the additional feature +of specifying the start and end range, so you +can play only a portion of an audio file. + +Furthermore, it is possible to load arbitrary +binary data to the soundcard to let it play and +save them back into WAV files; in a few words, +you can do some sound synthesis work. + +=head2 FUNCTIONS + +=over + +=item new Win32::Sound::WaveOut(FILENAME) + +=item new Win32::Sound::WaveOut(SAMPLERATE, BITS, CHANNELS) + +=item new Win32::Sound::WaveOut() + +This function creates a C<WaveOut> object; the +first form opens the specified wave file (see +also C<Open()> ), so you can directly C<Play()> it. + +The second (and third) form opens the +wave output device with the format given +(or if none given, defaults to 44.1kHz, +16 bits, stereo); to produce something +audible you can either C<Open()> a wave file +or C<Load()> binary data to the soundcard +and then C<Write()> it. + +=item Close() + +Closes the wave file currently opened. + +=item CloseDevice() + +Closes the wave output device; you can change +format and reopen it with C<OpenDevice()>. + +=item GetErrorText(ERROR) + +Returns the error text associated with +the specified ERROR number; note it only +works for wave-output-specific errors. + +=item Load(DATA) + +Loads the DATA buffer in the soundcard. +The format of the data buffer depends +on the format used; for example, with +8 bit mono each sample is one character, +while with 16 bit stereo each sample is +four characters long (two 16 bit values +for left and right channels). The sample +rate defines how much samples are in one +second of sound. For example, to fit one +second at 44.1kHz 16 bit stereo your buffer +must contain 176400 bytes (44100 * 4). + +=item Open(FILE) + +Opens the specified wave FILE. + +=item OpenDevice() + +Opens the wave output device with the +current sound format (not needed unless +you used C<CloseDevice()>). + +=item Pause() + +Pauses the sound currently playing; +use C<Restart()> to continue playing. + +=item Play( [FROM, TO] ) + +Plays the opened wave file. You can optionally +specify a FROM - TO range, where FROM and TO +are expressed in samples (or use FROM=0 for the +first sample and TO=-1 for the last sample). +Playback happens always asynchronously, eg. in +the background. + +=item Position() + +Returns the sample number currently playing; +note that the play position is not zeroed +when the sound ends, so you have to call a +C<Reset()> between plays to receive the +correct position in the current sound. + +=item Reset() + +Stops playing and resets the play position +(see C<Position()>). + +=item Restart() + +Continues playing the sound paused by C<Pause()>. + +=item Save(FILE, [DATA]) + +Writes the DATA buffer (if not given, uses the +buffer currently loaded in the soundcard) +to the specified wave FILE. + +=item Status() + +Returns 0 if the soundcard is currently playing, +1 if it's free, or C<undef> on errors. + +=item Unload() + +Frees the soundcard from the loaded data. + +=item Volume( [LEFT, RIGHT] ) + +Gets or sets the volume for the wave output device. +It works the same way as Win32::Sound::Volume. + +=item Write() + +Plays the data currently loaded in the soundcard; +playback happens always asynchronously, eg. in +the background. + +=back + +=head2 THE SOUND FORMAT + +The sound format is stored in three properties of +the C<WaveOut> object: C<samplerate>, C<bits> and +C<channels>. +If you need to change them without creating a +new object, you should close before and reopen +afterwards the device. + + $WAV->CloseDevice(); + $WAV->{samplerate} = 44100; # 44.1kHz + $WAV->{bits} = 8; # 8 bit + $WAV->{channels} = 1; # mono + $WAV->OpenDevice(); + +You can also use the properties to query the +sound format currently used. + +=head2 EXAMPLE + +This small example produces a 1 second sinusoidal +wave at 440Hz and saves it in F<sinus.wav>: + + use Win32::Sound; + + # Create the object + $WAV = new Win32::Sound::WaveOut(44100, 8, 2); + + $data = ""; + $counter = 0; + $increment = 440/44100; + + # Generate 44100 samples ( = 1 second) + for $i (1..44100) { + + # Calculate the pitch + # (range 0..255 for 8 bits) + $v = sin($counter/2*3.14) * 128 + 128; + + # "pack" it twice for left and right + $data .= pack("cc", $v, $v); + + $counter += $increment; + } + + $WAV->Load($data); # get it + $WAV->Write(); # hear it + 1 until $WAV->Status(); # wait for completion + $WAV->Save("sinus.wav"); # write to disk + $WAV->Unload(); # drop it + +=head1 VERSION + +Win32::Sound version 0.46, 25 Sep 1999. + +=head1 AUTHOR + +Aldo Calpini, C<dada@divinf.it> + +Parts of the code provided and/or suggested by Dave Roth. + +=cut + + diff --git a/Master/tlpkg/tlperl.old/lib/Win32/Test.pl b/Master/tlpkg/tlperl.old/lib/Win32/Test.pl new file mode 100644 index 00000000000..235e94bdd78 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/Test.pl @@ -0,0 +1,477 @@ +##### +# T E S T . P L +# ------------- +# A test script for exercising the Win32::ODBC extension. Install +# the ODBC.PLL extension and the ODBC.PM wrapper, set up an ODBC +# DSN (Data Source Name) by the ODBC administrator, then give this a try! +# +# READ THE DOCUMENTATION -- I AM NOT RESPOSIBLE FOR ANY PROBLEMS THAT +# THIS MAY CAUSE WHATSOEVER. BY USING THIS OR ANY --- +# OF THE WIN32::ODBC PARTS FOUND IN THE DISTRIBUTION YOU ARE AGREEING +# WITH THE TERMS OF THIS DISTRIBUTION!!!!! +# +# +# You have been warned. +# --- ---- ---- ------ +# +# Updated to test newest version v961007. Dave Roth <rothd@roth.net> +# This version contains a small sample database (in MS Access 7.0 +# format) called ODBCTest.mdb. Place this database in the same +# directory as this test.pl file. +# +# -------------------------------------------------------------------- +# +# SYNTAX: +# perl test.pl ["DSN Name" [Max Rows]] +# +# DSN Name....Name of DSN that will be used. If this is +# omitted then we will use the obnoxious default DSN. +# Max Rows....Maximum number of rows wanted to be retrieved from +# the DSN. +# - If this is 0 then the request is to retrieve as +# many as possible. +# - If this is a value greater than that which the DSN +# driver can handle the value will be the greatest +# the DSN driver allows. +# - If omitted then we use the default value. +##### + + use Win32::ODBC; + + + $TempDSN = "Win32 ODBC Test --123xxYYzz987--"; + $iTempDSN = 1; + + if (!($DSN = $ARGV[0])){ + $DSN = $TempDSN; + } + $MaxRows = 8 unless defined ($MaxRows = $ARGV[1]); + + $DriverType = "Microsoft Access Driver (*.mdb)"; + $Desc = "Description=The Win32::ODBC Test DSN for Perl"; + $Dir = Win32::GetCwd(); + $DBase = "ODBCTest.mdb"; + + $iWidth=60; + %SQLStmtTypes = (SQL_CLOSE, "SQL_CLOSE", SQL_DROP, "SQL_DROP", SQL_UNBIND, "SQL_UNBIND", SQL_RESET_PARAMS, "SQL_RESET_PARAMS"); + +# Initialize(); + + ($Name, $Version, $Date, $Author, $CompileDate, $CompileTime, $Credits) = Win32::ODBC::Info(); + print "\n"; + print "\t+", "=" x ($iWidth), "+\n"; + print "\t|", Center("", $iWidth), "|\n"; + print "\t|", Center("", $iWidth), "|\n"; + print "\t|", Center("$Name", $iWidth), "|\n"; + print "\t|", Center("-" x length("$Name"), $iWidth), "|\n"; + print "\t|", Center("", $iWidth), "|\n"; + + print "\t|", Center("Version $Version ($Date)", $iWidth), "|\n"; + print "\t|", Center("by $Author", $iWidth), "|\n"; + print "\t|", Center("Compiled on $CompileDate at $CompileTime.", $iWidth), "|\n"; + print "\t|", Center("", $iWidth), "|\n"; + print "\t|", Center("Credits:", $iWidth), "|\n"; + print "\t|", Center(("-" x length("Credits:")), $iWidth), "|\n"; + foreach $Temp (split("\n", $Credits)){ + print "\t|", Center("$Temp", $iWidth), "|\n"; + } + print "\t|", Center("", $iWidth), "|\n"; + print "\t+", "=" x ($iWidth), "+\n"; + +#### +# T E S T 1 +#### + PrintTest(1, "Dump available ODBC Drivers"); + print "\nAvailable ODBC Drivers:\n"; + if (!(%Drivers = Win32::ODBC::Drivers())){ + $Failed{'Test 1'} = "Drivers(): " . Win32::ODBC::Error(); + } + foreach $Driver (keys(%Drivers)){ + print " Driver=\"$Driver\"\n Attributes: ", join("\n" . " "x14, sort(split(';', $Drivers{$Driver}))), "\n\n"; + } + + +#### +# T E S T 2 +#### + PrintTest(2,"Dump available datasources"); + + #### + # Notice you don't need an instantiated object to use this... + #### + print "\nHere are the available datasources...\n"; + if (!(%DSNs = Win32::ODBC::DataSources())){ + $Failed{'Test 2'} = "DataSources(): " . Win32::ODBC::Error(); + } + foreach $Temp (keys(%DSNs)){ + if (($Temp eq $TempDSN) && ($DSNs{$Temp} eq $DriverType)){ + $iTempDSNExists++; + } + if ($DSN =~ /$Temp/i){ + $iTempDSN = 0; + $DriverType = $DSNs{$Temp}; + } + print "\tDSN=\"$Temp\" (\"$DSNs{$Temp}\")\n"; + } + +#### +# T E S T 2.5 +#### + # IF WE DO NOT find the DSN the user specified... + if ($iTempDSN){ + PrintTest("2.5", "Create a Temporary DSN"); + + print "\n\tCould not find the DSN (\"$DSN\") so we will\n\tuse a temporary one (\"$TempDSN\")...\n\n"; + + $DSN = $TempDSN; + + if (! $iTempDSNExists){ + print "\tAdding DSN \"$DSN\"..."; + if (Win32::ODBC::ConfigDSN(ODBC_ADD_DSN, $DriverType, ("DSN=$DSN", "Description=The Win32 ODBC Test DSN for Perl", "DBQ=$Dir\\$DBase", "DEFAULTDIR=$Dir", "UID=", "PWD="))){ + print "Successful!\n"; + }else{ + print "Failure\n"; + $Failed{'Test 2.5'} = "ConfigDSN(): Could not add \"$DSN\": " . Win32::ODBC::Error(); + # If we failed here then use the last DSN we listed in Test 2 + $DriverType = $DSNs{$Temp}; + $DSN = $Temp; + print "\n\tCould not add a temporary DSN so using the last one listed:\n"; + print "\t\t$DSN ($DriverType)\n"; + + } + } + } + +#### +# Report What Driver/DSN we are using +#### + + print "\n\nWe are using the DSN:\n\tDSN = \"$DSN\"\n"; + print "\tDriver = \"$DriverType\"\n\n"; + + +#### +# T E S T 3 +#### + PrintTest(3, "Open several ODBC connections"); + print "\n\tOpening ODBC connection for \"$DSN\"...\n\t\t"; + if (!($O = new Win32::ODBC($DSN))){ + print "Failure. \n\n"; + $Failed{'Test 3a'} = "new(): " . Win32::ODBC::Error(); + PresentErrors(); + exit(); + }else{ + print "Success (connection #", $O->Connection(), ")\n\n"; + } + + print "\tOpening ODBC connection for \"$DSN\"...\n\t\t"; + if (!($O2 = new Win32::ODBC($DSN))){ + $Failed{'Test 3b'} = "new(): " . Win32::ODBC::Error(); + print "Failure. \n\n"; + }else{ + print "Success (connection #", $O2->Connection(), ")\n\n"; + } + + print "\tOpening ODBC connection for \"$DSN\"\n\t\t"; + if (!($O3 = new Win32::ODBC($DSN))){ + $Failed{'Test 3c'} = "new(): " . Win32::ODBC::Error(); + print "Failure. \n\n"; + }else{ + print "Success (connection #", $O3->Connection(), ")\n\n"; + } + + +#### +# T E S T 4 +#### + PrintTest(4, "Close all but one connection"); + + print "\n\tCurrently open ODBC connections are: \"", join(", ", sort($O2->GetConnections())), "\"\n"; + print "\tClosing ODBC connection #", $O2->Connection(), "...\n"; + print "\t\t...", (($O2->Close())? "Successful.":"Failure."), "\n"; + + print "\n\tCurrently open ODBC connections are: \"", join(", ", sort($O3->GetConnections())), "\"\n"; + print "\tClosing ODBC connection #", $O3->Connection(), "...\n"; + print "\t\t...", (($O3->Close())? "Successful.":"Failure."), "\n"; + + print "\n\tCurrently open ODBC connections are: \"", join(", ", sort($O2->GetConnections())), "\"\n"; + +#### +# T E S T 5 +#### + PrintTest(5, "Set/query Max Buffer size for a connection"); + + srand(time); + $Temp = int(rand(10240)) + 10240; + print "\nMaximum Buffer Size for connection #", $O->Connection(), ":\n"; + print "\tValue set at ", $O->GetMaxBufSize(), "\n"; + + print "\tSetting Maximum Buffer Size to $Temp... it has been set to ", $O->SetMaxBufSize($Temp), "\n"; + print "\tValue set at ", $O->GetMaxBufSize(), "\n"; + + $Temp += int(rand(10240)) + 102400; + print "\tSetting Maximum Buffer Size to $Temp... (can not be more than 102400)\n\t\t...it has been set to ", $O->SetMaxBufSize($Temp), "\n"; + print "\tValue set at ", $O->GetMaxBufSize(), "\n"; + + $Temp = int(rand(1024)) + 2048; + print "\tSetting Maximum Buffer Size to $Temp... it has been set to ", $O->SetMaxBufSize($Temp), "\n"; + + print "\tValue set at ", $O->GetMaxBufSize(), "\n"; + + +#### +# T E S T 6 +#### + PrintTest(6, "Set/query Stmt Close Type"); + + print "\n\tStatement Close Type is currently set as ", $O->GetStmtCloseType(), " " . $O->Error . "\n"; + print "\tSetting Statement Close Type to SQL_CLOSE: (returned code of ", $O->SetStmtCloseType(SQL_CLOSE), ")" . $O->Error . "\n"; + print "\tStatement Close Type is currently set as ", $O->GetStmtCloseType(), " " . $O->Error ."\n"; + + +#### +# T E S T 7 +#### + PrintTest(7, "Dump DSN for current connection"); + + if (! (%DSNAttributes = $O->GetDSN())){ + $Failed{'Test 7'} = "GetDSN(): " . $O->Error(); + }else{ + print"\nThe DSN for connection #", $O->Connection(), ":\n"; + print "\tDSN...\n"; + foreach (sort(keys(%DSNAttributes))){ + print "\t$_ = \"$DSNAttributes{$_}\"\n"; + } + } + + + +#### +# T E S T 8 +#### + PrintTest(8, "Dump list of ALL tables in datasource"); + + print "\nList of tables for \"$DSN\"\n\n"; + $Num = 0; + if ($O->Catalog("", "", "%", "'TABLE','VIEW','SYSTEM TABLE', 'GLOBAL TEMPORARY','LOCAL TEMPORARY','ALIAS','SYNONYM'")){ + + print "\tCursor is currently named \"", $O->GetCursorName(), "\".\n"; + print "\tRenaming cursor to \"TestCursor\"...", (($O->SetCursorName("TestCursor"))? "Success":"Failure"), ".\n"; + print "\tCursor is currently named \"", $O->GetCursorName(), "\".\n\n"; + + @FieldNames = $O->FieldNames(); + + $~ = "Test_8_Header"; + write; + + $~ = "Test_8_Body"; + while($O->FetchRow()){ + undef %Data; + %Data = $O->DataHash(); + write; + } + } + print "\n\tTotal number of tables displayed: $Num\n"; + + + +#### +# T E S T 9 +#### + PrintTest(9, "Dump list of non-system tables and views in datasource"); + + print "\n"; + $Num = 0; + + foreach $Temp ($O->TableList("", "", "%", "TABLE, VIEW, SYSTEM_TABLE")){ + $Table = $Temp; + print "\t", ++$Num, ".) \"$Temp\"\n"; + } + print "\n\tTotal number of tables displayed: $Num\n"; + + +#### +# T E S T 10 +#### + PrintTest(10, "Dump contents of the table: \"$Table\""); + + print "\n"; + + print "\tResetting (dropping) cursor...", (($O->DropCursor())? "Successful":"Failure"), ".\n\n"; + + print "\tCurrently the cursor type is: ", $O->GetStmtOption($O->SQL_CURSOR_TYPE), "\n"; + print "\tSetting Cursor to Dynamic (", ($O->SQL_CURSOR_DYNAMIC), ")...", (($O->SetStmtOption($O->SQL_CURSOR_TYPE, $O->SQL_CURSOR_DYNAMIC))? "Success":"Failure"), ".\n"; + print "\t\tThis may have failed depending on your ODBC Driver.\n"; + print "\t\tThis is not really a problem, it will default to another value.\n"; + print "\tUsing the cursor type of: ", $O->GetStmtOption($O->SQL_CURSOR_TYPE), "\n\n"; + + print "\tSetting the connection to only grab $MaxRows row", ($MaxRows == 1)? "":"s", " maximum..."; + if ($O->SetStmtOption($O->SQL_MAX_ROWS, $MaxRows)){ + print "Success!\n"; + }else{ + $Failed{'Test 10a'} = "SetStmtOption(): " . Win32::ODBC::Error(); + print "Failure.\n"; + } + + $iTemp = $O->GetStmtOption($O->SQL_MAX_ROWS); + print "\tUsing the maximum rows: ", (($iTemp)? $iTemp:"No maximum limit"), "\n\n"; + + print "\tCursor is currently named \"", $O->GetCursorName(), "\".\n"; + print "\tRenaming cursor to \"TestCursor\"...", (($O->SetCursorName("TestCursor"))? "Success":"Failure"), ".\n"; + print "\tCursor is currently named \"", $O->GetCursorName(), "\".\n\n"; + + if (! $O->Sql("SELECT * FROM [$Table]")){ + @FieldNames = $O->FieldNames(); + $Cols = $#FieldNames + 1; + $Cols = 8 if ($Cols > 8); + + $FmH = "format Test_10_Header =\n"; + $FmH2 = ""; + $FmH3 = ""; + $FmB = "format Test_10_Body = \n"; + $FmB2 = ""; + + for ($iTemp = 0; $iTemp < $Cols; $iTemp++){ + $FmH .= "@" . "<" x (80/$Cols - 2) . " "; + $FmH2 .= "\$FieldNames[$iTemp],"; + $FmH3 .= "-" x (80/$Cols - 1) . " "; + + $FmB .= "@" . "<" x (80/$Cols - 2) . " "; + $FmB2 .= "\$Data{\$FieldNames[$iTemp]},"; + } + chop $FmH2; + chop $FmB2; + + eval"$FmH\n$FmH2\n$FmH3\n.\n"; + eval "$FmB\n$FmB2\n.\n"; + + $~ = "Test_10_Header"; + write(); + $~ = "Test_10_Body"; + + # Fetch the next rowset + while($O->FetchRow()){ + undef %Data; + %Data = $O->DataHash(); + write(); + } + #### + # THE preceeding block could have been written like this: + # ------------------------------------------------------ + # + # print "\tCurrently the cursor type is: ", $O->GetStmtOption($O->SQL_CURSOR_TYPE), "\n"; + # print "\tSetting Cursor to Dynamic (", ($O->SQL_CURSOR_DYNAMIC), ")...", (($O->SetStmtOption($O->SQL_CURSOR_TYPE, $O->SQL_CURSOR_DYNAMIC))? "Success":"Failure"), ".\n"; + # print "\t\tThis may have failed depending on your ODBC Driver. No real problem.\n"; + # print "\tUsing the cursor type of: ", $O->GetStmtOption($O->SQL_CURSOR_TYPE), "\n\n"; + # + # print "\tSetting rowset size = 15 ...", (($O->SetStmtOption($O->SQL_ROWSET_SIZE, 15))? "Success":"Failure"), ".\n"; + # print "\tGetting rowset size: ", $O->GetStmtOption($O->SQL_ROWSET_SIZE), "\n\n"; + # + # while($O->FetchRow()){ + # $iNum = 1; + # # Position yourself in the rowset + # while($O->SetPos($iNum++ ,$O->SQL_POSITION, $O->SQL_LOCK_NO_CHANGE)){ + # undef %Data; + # %Data = $O->DataHash(); + # write(); + # } + # print "\t\tNext rowset...\n"; + # } + # + # The reason I didn't write it that way (which is easier) is to + # show that we can now SetPos(). Also Fetch() now uses + # SQLExtendedFetch() so it can position itself and retrieve + # rowsets. Notice earlier in this Test 10 we set the + # SQL_ROWSET_SIZE. If this was not set it would default to + # no limit (depending upon your ODBC Driver). + #### + + print "\n\tNo more records available.\n"; + }else{ + $Failed{'Test 10'} = "Sql(): " . $O->Error(); + } + + $O->Close(); + +#### +# T E S T 11 +#### + if ($iTempDSN){ + PrintTest(11, "Remove the temporary DSN"); + print "\n\tRemoving the temporary DSN:\n"; + print "\t\tDSN = \"$DSN\"\n\t\tDriver = \"$DriverType\"\n"; + + if (Win32::ODBC::ConfigDSN(ODBC_REMOVE_DSN, $DriverType, "DSN=$DSN")){ + print "\tSuccessful!\n"; + }else{ + print "\tFailed.\n"; + $Failed{'Test 11'} = "ConfigDSN(): Could not remove \"$DSN\":" . Win32::ODBC::Error(); + } + } + + + PrintTest("E N D O F T E S T"); + PresentErrors(); + + + +#----------------------- F U N C T I O N S --------------------------- + +sub Error{ + my($Data) = @_; + $Data->DumpError() if ref($Data); + Win32::ODBC::DumpError() if ! ref($Data); +} + + +sub Center{ + local($Temp, $Width) = @_; + local($Len) = ($Width - length($Temp)) / 2; + return " " x int($Len), $Temp, " " x (int($Len) + (($Len != int($Len))? 1:0)); +} + +sub PrintTest{ + my($Num, $String) = @_; + my($Temp); + if (length($String)){ + $Temp = " T E S T $Num $String "; + }else{ + $Temp = " $Num "; + } + $Len = length($Temp); + print "\n", "-" x ((79 - $Len)/2), $Temp, "-" x ((79 - $Len)/2 - 1), "\n"; + print "\t$String\n"; +} + +sub PresentErrors{ + PrintTest("", "Error Report:"); + if (keys(%Failed)){ + print "The following were errors:\n"; + foreach (sort(keys(%Failed))){ + print "$_ = $Failed{$_}\n"; + } + }else{ + print "\n\nThere were no errors reported during this test.\n\n"; + } +} + + +sub Initialize{ +format Test_8_Header = + @<<<<<<<<<<<<<<<<<<<<<<<<<<< @|||||||||||| @|||||||||||| @||||||||||| + $FieldNames[0], $FieldNames[1], $FieldNames[2], $FieldNames[3] + ---------------------------- ------------- ------------- ------------ +. +format Test_8_Body = + @>. @<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<< @<<<<<<<<<<<< @<<<<<<<<<<< + ++$Num, $Data{$FieldNames[0]}, $Data{$FieldNames[1]}, $Data{$FieldNames[2]}, $Data{$FieldNames[3]} +. +format Test_9_Header = + @<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<< @<<<<<<<<<<<<<< @<<<<<<<<<<<<<< + $FieldNames[0], $FieldNames[1], $FieldNames[2], $FieldNames[3] +. +format Test_9_Body = + @<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<< @<<<<<<<<<<<<<< @<<<<<<<<<<<<<< + $Data{$FieldNames[0]}, $Data{$FieldNames[1]}, $Data{$FieldNames[2]}, $Data{$FieldNames[3]} +. +} diff --git a/Master/tlpkg/tlperl.old/lib/Win32/TieRegistry.pm b/Master/tlpkg/tlperl.old/lib/Win32/TieRegistry.pm new file mode 100644 index 00000000000..0abbbddb6b8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/TieRegistry.pm @@ -0,0 +1,3801 @@ +# Win32/TieRegistry.pm -- Perl module to easily use a Registry +# (on Win32 systems so far). +# by Tye McQueen, tye@metronet.com, see http://www.metronet.com/~tye/. + +# +# Skip to "=head" line for user documentation. +# + + +package Win32::TieRegistry; + + +use strict; +use vars qw( $PACK $VERSION @ISA @EXPORT @EXPORT_OK ); + +$PACK= "Win32::TieRegistry"; # Used in error messages. +$VERSION= '0.26'; + + +use Carp; + +require Tie::Hash; +@ISA= qw(Tie::Hash); + +# Required other modules: +use Win32API::Registry 0.12 qw( :KEY_ :HKEY_ :REG_ ); + +#Optional other modules: +use vars qw( $_NoMoreItems $_FileNotFound $_TooSmall $_MoreData $_SetDualVar ); + +if( eval { require Win32::WinError } ) { + $_NoMoreItems= Win32::WinError::constant("ERROR_NO_MORE_ITEMS",0); + $_FileNotFound= Win32::WinError::constant("ERROR_FILE_NOT_FOUND",0); + $_TooSmall= Win32::WinError::constant("ERROR_INSUFFICIENT_BUFFER",0); + $_MoreData= Win32::WinError::constant("ERROR_MORE_DATA",0); +} else { + $_NoMoreItems= "^No more data"; + $_FileNotFound= "cannot find the file"; + $_TooSmall= " data area passed to "; + $_MoreData= "^more data is avail"; +} +if( $_SetDualVar= eval { require SetDualVar } ) { + import SetDualVar; +} + + +#Implementation details: +# When opened: +# HANDLE long; actual handle value +# MACHINE string; name of remote machine ("" if local) +# PATH list ref; machine-relative full path for this key: +# ["LMachine","System","Disk"] +# ["HKEY_LOCAL_MACHINE","System","Disk"] +# DELIM char; delimiter used to separate subkeys (def="\\") +# OS_DELIM char; always "\\" for Win32 +# ACCESS long; usually KEY_ALL_ACCESS, perhaps KEY_READ, etc. +# ROOTS string; var name for "Lmachine"->HKEY_LOCAL_MACHINE map +# FLAGS int; bits to control certain options +# Often: +# VALUES ref to list of value names (data/type never cached) +# SUBKEYS ref to list of subkey names +# SUBCLASSES ref to list of subkey classes +# SUBTIMES ref to list of subkey write times +# MEMBERS ref to list of subkey_name.DELIM's, DELIM.value_name's +# MEMBHASH hash ref to with MEMBERS as keys and 1's as values +# Once Key "Info" requested: +# Class CntSubKeys CntValues MaxSubKeyLen MaxSubClassLen +# MaxValNameLen MaxValDataLen SecurityLen LastWrite +# If is tied to a hash and iterating over key values: +# PREVIDX int; index of last MEMBERS element return +# If is the key object returned by Load(): +# UNLOADME list ref; information about Load()ed key +# If is a subkey of a "loaded" key other than the one returned by Load(): +# DEPENDON obj ref; object that can't be destroyed before us + + +#Package-local variables: + +# Option flag bits: +use vars qw( $Flag_ArrVal $Flag_TieVal $Flag_DualTyp $Flag_DualBin + $Flag_FastDel $Flag_HexDWord $Flag_Split $Flag_FixNulls ); +$Flag_ArrVal= 0x0001; +$Flag_TieVal= 0x0002; +$Flag_FastDel= 0x0004; +$Flag_HexDWord= 0x0008; +$Flag_Split= 0x0010; +$Flag_DualTyp= 0x0020; +$Flag_DualBin= 0x0040; +$Flag_FixNulls= 0x0080; + + +use vars qw( $RegObj %_Roots %RegHash $Registry ); + +# Short-hand for HKEY_* constants: +%_Roots= ( + "Classes" => HKEY_CLASSES_ROOT, + "CUser" => HKEY_CURRENT_USER, + "LMachine" => HKEY_LOCAL_MACHINE, + "Users" => HKEY_USERS, + "PerfData" => HKEY_PERFORMANCE_DATA, # Too picky to be useful + "CConfig" => HKEY_CURRENT_CONFIG, + "DynData" => HKEY_DYN_DATA, # Too picky to be useful +); + +# Basic master Registry object: +$RegObj= {}; +@$RegObj{qw( HANDLE MACHINE PATH DELIM OS_DELIM ACCESS FLAGS ROOTS )}= ( + "NONE", "", [], "\\", "\\", + KEY_READ|KEY_WRITE, $Flag_HexDWord|$Flag_FixNulls, "${PACK}::_Roots" ); +$RegObj->{FLAGS} |= $Flag_DualTyp|$Flag_DualBin if $_SetDualVar; +bless $RegObj; + +# Fill cache for master Registry object: +@$RegObj{qw( VALUES SUBKEYS SUBCLASSES SUBTIMES )}= ( + [], [ keys(%_Roots) ], [], [] ); +grep( s#$#$RegObj->{DELIM}#, + @{ $RegObj->{MEMBERS}= [ @{$RegObj->{SUBKEYS}} ] } ); +@$RegObj{qw( Class MaxSubKeyLen MaxSubClassLen MaxValNameLen + MaxValDataLen SecurityLen LastWrite CntSubKeys CntValues )}= + ( "", 0, 0, 0, 0, 0, 0, 0, 0 ); + +# Create master Registry tied hash: +$RegObj->Tie( \%RegHash ); + +# Create master Registry combination object and tied hash reference: +$Registry= \%RegHash; +bless $Registry; + + +# Preloaded methods go here. + + +# Map option names to name of subroutine that controls that option: +use vars qw( @_opt_subs %_opt_subs ); +@_opt_subs= qw( Delimiter ArrayValues TieValues SplitMultis DWordsToHex + FastDelete FixSzNulls DualTypes DualBinVals AllowLoad AllowSave ); +@_opt_subs{@_opt_subs}= @_opt_subs; + +sub import +{ + my $pkg= shift(@_); + my $level= $Exporter::ExportLevel; + my $expto= caller($level); + my @export= (); + my @consts= (); + my $registry= $Registry->Clone; + local( $_ ); + while( @_ ) { + $_= shift(@_); + if( /^\$(\w+::)*\w+$/ ) { + push( @export, "ObjVar" ) if /^\$RegObj$/; + push( @export, $_ ); + } elsif( /^\%(\w+::)*\w+$/ ) { + push( @export, $_ ); + } elsif( /^[$%]/ ) { + croak "${PACK}->import: Invalid variable name ($_)"; + } elsif( /^:/ || /^(H?KEY|REG)_/ ) { + push( @consts, $_ ); + } elsif( ! @_ ) { + croak "${PACK}->import: Missing argument after option ($_)"; + } elsif( exists $_opt_subs{$_} ) { + $_= $_opt_subs{$_}; + $registry->$_( shift(@_) ); + } elsif( /^TiedRef$/ ) { + $_= shift(@_); + if( ! ref($_) && /^(\$?)(\w+::)*\w+$/ ) { + $_= '$'.$_ unless '$' eq $1; + } elsif( "SCALAR" ne ref($_) ) { + croak "${PACK}->import: Invalid var after TiedRef ($_)"; + } + push( @export, $_ ); + } elsif( /^TiedHash$/ ) { + $_= shift(@_); + if( ! ref($_) && /^(\%?)(\w+::)*\w+$/ ) { + $_= '%'.$_ unless '%' eq $1; + } elsif( "HASH" ne ref($_) ) { + croak "${PACK}->import: Invalid var after TiedHash ($_)"; + } + push( @export, $_ ); + } elsif( /^ObjectRef$/ ) { + $_= shift(@_); + if( ! ref($_) && /^(\$?)(\w+::)*\w+$/ ) { + push( @export, "ObjVar" ); + $_= '$'.$_ unless '$' eq $1; + } elsif( "SCALAR" eq ref($_) ) { + push( @export, "ObjRef" ); + } else { + croak "${PACK}->import: Invalid var after ObjectRef ($_)"; + } + push( @export, $_ ); + } elsif( /^ExportLevel$/ ) { + $level= shift(@_); + $expto= caller($level); + } elsif( /^ExportTo$/ ) { + undef $level; + $expto= caller($level); + } else { + croak "${PACK}->import: Invalid option ($_)"; + } + } + Win32API::Registry->export( $expto, @consts ) if @consts; + @export= ('$Registry') unless @export; + while( @export ) { + $_= shift( @export ); + if( /^\$((?:\w+::)*)(\w+)$/ ) { + my( $pack, $sym )= ( $1, $2 ); + $pack= $expto unless defined($pack) && "" ne $pack; + no strict 'refs'; + *{"${pack}::$sym"}= \${"${pack}::$sym"}; + ${"${pack}::$sym"}= $registry; + } elsif( /^\%((?:\w+::)*)(\w+)$/ ) { + my( $pack, $sym )= ( $1, $2 ); + $pack= $expto unless defined($pack) && "" ne $pack; + no strict 'refs'; + *{"${pack}::$sym"}= \%{"${pack}::$sym"}; + $registry->Tie( \%{"${pack}::$sym"} ); + } elsif( "SCALAR" eq ref($_) ) { + $$_= $registry; + } elsif( "HASH" eq ref($_) ) { + $registry->Tie( $_ ); + } elsif( /^ObjVar$/ ) { + $_= shift( @_ ); + /^\$((?:\w+::)*)(\w+)$/; + my( $pack, $sym )= ( $1, $2 ); + $pack= $expto unless defined($pack) && "" ne $pack; + no strict 'refs'; + *{"${pack}::$sym"}= \${"${pack}::$sym"}; + ${"${pack}::$sym"}= $registry->ObjectRef; + } elsif( /^ObjRef$/ ) { + ${shift(@_)}= $registry->ObjectRef; + } else { + die "Impossible var to export ($_)"; + } + } +} + + +use vars qw( @_new_Opts %_new_Opts ); +@_new_Opts= qw( ACCESS DELIM MACHINE DEPENDON ); +@_new_Opts{@_new_Opts}= (1) x @_new_Opts; + +sub _new +{ + my $this= shift( @_ ); + $this= tied(%$this) if ref($this) && tied(%$this); + my $class= ref($this) || $this; + my $self= {}; + my( $handle, $rpath, $opts )= @_; + if( @_ < 2 || "ARRAY" ne ref($rpath) || 3 < @_ + || 3 == @_ && "HASH" ne ref($opts) ) { + croak "Usage: ${PACK}->_new( \$handle, \\\@path, {OPT=>VAL,...} );\n", + " options: @_new_Opts\nCalled"; + } + @$self{qw( HANDLE PATH )}= ( $handle, $rpath ); + @$self{qw( MACHINE ACCESS DELIM OS_DELIM ROOTS FLAGS )}= + ( $this->Machine, $this->Access, $this->Delimiter, + $this->OS_Delimiter, $this->_Roots, $this->_Flags ); + if( ref($opts) ) { + my @err= grep( ! $_new_Opts{$_}, keys(%$opts) ); + @err and croak "${PACK}->_new: Invalid options (@err)"; + @$self{ keys(%$opts) }= values(%$opts); + } + bless $self, $class; + return $self; +} + + +sub _split +{ + my $self= shift( @_ ); + $self= tied(%$self) if tied(%$self); + my $path= shift( @_ ); + my $delim= @_ ? shift(@_) : $self->Delimiter; + my $list= [ split( /\Q$delim/, $path ) ]; + return $list; +} + + +sub _rootKey +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my $keyPath= shift(@_); + my $delim= @_ ? shift(@_) : $self->Delimiter; + my( $root, $subPath ); + if( "ARRAY" eq ref($keyPath) ) { + $subPath= $keyPath; + } else { + $subPath= $self->_split( $keyPath, $delim ); + } + $root= shift( @$subPath ); + if( $root =~ /^HKEY_/ ) { + my $handle= Win32API::Registry::constant($root,0); + $handle or croak "Invalid HKEY_ constant ($root): $!"; + return( $self->_new( $handle, [$root], {DELIM=>$delim} ), + $subPath ); + } elsif( $root =~ /^([-+]|0x)?\d/ ) { + return( $self->_new( $root, [sprintf("0x%lX",$root)], + {DELIM=>$delim} ), + $subPath ); + } else { + my $roots= $self->Roots; + if( $roots->{$root} ) { + return( $self->_new( $roots->{$root}, [$root], {DELIM=>$delim} ), + $subPath ); + } + croak "No such root key ($root)"; + } +} + + +sub _open +{ + my $this= shift(@_); + $this= tied(%$this) if ref($this) && tied(%$this); + my $subPath= shift(@_); + my $sam= @_ ? shift(@_) : $this->Access; + my $subKey= join( $this->OS_Delimiter, @$subPath ); + my $handle= 0; + $this->RegOpenKeyEx( $subKey, 0, $sam, $handle ) + or return (); + return $this->_new( $handle, [ @{$this->_Path}, @$subPath ], + { ACCESS=>$sam, ( defined($this->{UNLOADME}) ? ("DEPENDON",$this) + : defined($this->{DEPENDON}) ? ("DEPENDON",$this->{DEPENDON}) : () ) + } ); +} + + +sub ObjectRef +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + return $self; +} + + +sub _constant +{ + my( $name, $desc )= @_; + my $value= Win32API::Registry::constant( $name, 0 ); + my $func= (caller(1))[3]; + if( 0 == $value ) { + if( $! =~ /invalid/i ) { + croak "$func: Invalid $desc ($name)"; + } elsif( 0 != $! ) { + croak "$func: \u$desc ($name) not support on this platform"; + } + } + return $value; +} + + +sub _connect +{ + my $this= shift(@_); + $this= tied(%$this) if ref($this) && tied(%$this); + my $subPath= pop(@_); + $subPath= $this->_split( $subPath ) unless ref($subPath); + my $machine= @_ ? shift(@_) : shift(@$subPath); + my $handle= 0; + my( $temp )= $this->_rootKey( [@$subPath] ); + $temp->RegConnectRegistry( $machine, $temp->Handle, $handle ) + or return (); + my $self= $this->_new( $handle, [shift(@$subPath)], {MACHINE=>$machine} ); + return( $self, $subPath ); +} + + +use vars qw( @Connect_Opts %Connect_Opts ); +@Connect_Opts= qw(Access Delimiter); +@Connect_Opts{@Connect_Opts}= (1) x @Connect_Opts; + +sub Connect +{ + my $this= shift(@_); + my $tied= ref($this) && tied(%$this); + $this= tied(%$this) if $tied; + my( $machine, $key, $opts )= @_; + my $delim= ""; + my $sam; + my $subPath; + if( @_ < 2 || 3 < @_ + || 3 == @_ && "HASH" ne ref($opts) ) { + croak "Usage: \$obj= ${PACK}->Connect(", + " \$Machine, \$subKey, { OPT=>VAL,... } );\n", + " options: @Connect_Opts\nCalled"; + } + if( ref($opts) ) { + my @err= grep( ! $Connect_Opts{$_}, keys(%$opts) ); + @err and croak "${PACK}->Connect: Invalid options (@err)"; + } + $delim= "$opts->{Delimiter}" if defined($opts->{Delimiter}); + $delim= $this->Delimiter if "" eq $delim; + $sam= defined($opts->{Access}) ? $opts->{Access} : $this->Access; + $sam= _constant($sam,"key access type") if $sam =~ /^KEY_/; + ( $this, $subPath )= $this->_connect( $machine, $key ); + return () unless defined($this); + my $self= $this->_open( $subPath, $sam ); + return () unless defined($self); + $self->Delimiter( $delim ); + $self= $self->TiedRef if $tied; + return $self; +} + + +my @_newVirtual_keys= qw( MEMBERS VALUES SUBKEYS SUBTIMES SUBCLASSES + Class SecurityLen LastWrite CntValues CntSubKeys + MaxValNameLen MaxValDataLen MaxSubKeyLen MaxSubClassLen ); + +sub _newVirtual +{ + my $self= shift(@_); + my( $rPath, $root, $opts )= @_; + my $new= $self->_new( "NONE", $rPath, $opts ) + or return (); + @{$new}{@_newVirtual_keys}= @{$root->ObjectRef}{@_newVirtual_keys}; + return $new; +} + + +#$key= new Win32::TieRegistry "LMachine/System/Disk"; +#$key= new Win32::TieRegistry "//Server1/LMachine/System/Disk"; +#Win32::TieRegistry->new( HKEY_LOCAL_MACHINE, {DELIM=>"/",ACCESS=>KEY_READ} ); +#Win32::TieRegistry->new( [ HKEY_LOCAL_MACHINE, ".../..." ], {DELIM=>$DELIM} ); +#$key->new( ... ); + +use vars qw( @new_Opts %new_Opts ); +@new_Opts= qw(Access Delimiter); +@new_Opts{@new_Opts}= (1) x @new_Opts; + +sub new +{ + my $this= shift( @_ ); + $this= tied(%$this) if ref($this) && tied(%$this); + if( ! ref($this) ) { + no strict "refs"; + my $self= ${"${this}::Registry"}; + croak "${this}->new failed since ${PACK}::new sees that ", + "\$${this}::Registry is not an object." + if ! ref($self); + $this= $self->Clone; + } + my( $subKey, $opts )= @_; + my $delim= ""; + my $dlen; + my $sam; + my $subPath; + if( @_ < 1 || 2 < @_ + || 2 == @_ && "HASH" ne ref($opts) ) { + croak "Usage: \$obj= ${PACK}->new( \$subKey, { OPT=>VAL,... } );\n", + " options: @new_Opts\nCalled"; + } + if( defined($opts) ) { + my @err= grep( ! $new_Opts{$_}, keys(%$opts) ); + @err and die "${PACK}->new: Invalid options (@err)"; + } + $delim= "$opts->{Delimiter}" if defined($opts->{Delimiter}); + $delim= $this->Delimiter if "" eq $delim; + $dlen= length($delim); + $sam= defined($opts->{Access}) ? $opts->{Access} : $this->Access; + $sam= _constant($sam,"key access type") if $sam =~ /^KEY_/; + if( "ARRAY" eq ref($subKey) ) { + $subPath= $subKey; + if( "NONE" eq $this->Handle && @$subPath ) { + ( $this, $subPath )= $this->_rootKey( $subPath ); + } + } elsif( $delim x 2 eq substr($subKey,0,2*$dlen) ) { + my $path= $this->_split( substr($subKey,2*$dlen), $delim ); + my $mach= shift(@$path); + if( ! @$path ) { + return $this->_newVirtual( $path, $Registry, + {MACHINE=>$mach,DELIM=>$delim,ACCESS=>$sam} ); + } + ( $this, $subPath )= $this->_connect( $mach, $path ); + return () if ! defined($this); + if( 0 == @$subPath ) { + $this->Delimiter( $delim ); + return $this; + } + } elsif( $delim eq substr($subKey,0,$dlen) ) { + ( $this, $subPath )= $this->_rootKey( substr($subKey,$dlen), $delim ); + } elsif( "NONE" eq $this->Handle && "" ne $subKey ) { + my( $mach )= $this->Machine; + if( $mach ) { + ( $this, $subPath )= $this->_connect( $mach, $subKey ); + } else { + ( $this, $subPath )= $this->_rootKey( $subKey, $delim ); + } + } else { + $subPath= $this->_split( $subKey, $delim ); + } + return () unless defined($this); + if( 0 == @$subPath && "NONE" eq $this->Handle ) { + return $this->_newVirtual( $this->_Path, $this, + { DELIM=>$delim, ACCESS=>$sam } ); + } + my $self= $this->_open( $subPath, $sam ); + return () unless defined($self); + $self->Delimiter( $delim ); + return $self; +} + + +sub Open +{ + my $self= shift(@_); + my $tied= ref($self) && tied(%$self); + $self= tied(%$self) if $tied; + $self= $self->new( @_ ); + $self= $self->TiedRef if defined($self) && $tied; + return $self; +} + + +sub Clone +{ + my $self= shift( @_ ); + my $new= $self->Open(""); + return $new; +} + + +{ my @flush; + sub Flush + { + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my( $flush )= shift(@_); + @_ and croak "Usage: \$key->Flush( \$bFlush );"; + return 0 if "NONE" eq $self->Handle; + @flush= qw( VALUES SUBKEYS SUBCLASSES SUBTIMES MEMBERS Class + CntSubKeys CntValues MaxSubKeyLen MaxSubClassLen + MaxValNameLen MaxValDataLen SecurityLen LastWrite PREVIDX ) + unless @flush; + delete( @$self{@flush} ); + if( defined($flush) && $flush ) { + return $self->RegFlushKey(); + } else { + return 1; + } + } +} + + +sub _DualVal +{ + my( $hRef, $num )= @_; + if( $_SetDualVar && $$hRef{$num} ) { + &SetDualVar( $num, "$$hRef{$num}", 0+$num ); + } + return $num; +} + + +use vars qw( @_RegDataTypes %_RegDataTypes ); +@_RegDataTypes= qw( REG_SZ REG_EXPAND_SZ REG_BINARY REG_LINK REG_MULTI_SZ + REG_DWORD_LITTLE_ENDIAN REG_DWORD_BIG_ENDIAN REG_DWORD + REG_RESOURCE_LIST REG_FULL_RESOURCE_DESCRIPTOR + REG_RESOURCE_REQUIREMENTS_LIST REG_NONE ); +# Make sure that REG_DWORD appears _after_ other REG_DWORD_* +# items above and that REG_NONE appears _last_. +foreach( @_RegDataTypes ) { + $_RegDataTypes{Win32API::Registry::constant($_,0)}= $_; +} + +sub GetValue +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + 1 == @_ or croak "Usage: (\$data,\$type)= \$key->GetValue('ValName');"; + my( $valName )= @_; + my( $valType, $valData, $dLen )= (0,"",0); + return () if "NONE" eq $self->Handle; + $self->RegQueryValueEx( $valName, [], $valType, $valData, + $dLen= ( defined($self->{MaxValDataLen}) ? $self->{MaxValDataLen} : 0 ) + ) or return (); + if( REG_DWORD == $valType ) { + my $val= unpack("L",$valData); + $valData= sprintf "0x%08.8lX", $val if $self->DWordsToHex; + &SetDualVar( $valData, $valData, $val ) if $self->DualBinVals + } elsif( REG_BINARY == $valType && length($valData) <= 4 ) { + &SetDualVar( $valData, $valData, hex reverse unpack("h*",$valData) ) + if $self->DualBinVals; + } elsif( ( REG_SZ == $valType || REG_EXPAND_SZ == $valType ) + && $self->FixSzNulls ) { + substr($valData,-1)= "" if "\0" eq substr($valData,-1); + } elsif( REG_MULTI_SZ == $valType && $self->SplitMultis ) { + ## $valData =~ s/\0\0$//; # Why does this often fail?? + substr($valData,-2)= "" if "\0\0" eq substr($valData,-2); + $valData= [ split( /\0/, $valData, -1 ) ] + } + if( ! wantarray ) { + return $valData; + } elsif( ! $self->DualTypes ) { + return( $valData, $valType ); + } else { + return( $valData, _DualVal( \%_RegDataTypes, $valType ) ); + } +} + + +sub _ErrNum +{ + # return $^E; + return Win32::GetLastError(); +} + + +sub _ErrMsg +{ + # return $^E; + return Win32::FormatMessage( Win32::GetLastError() ); +} + +sub _Err +{ + my $err; + # return $^E; + return _ErrMsg if ! $_SetDualVar; + return &SetDualVar( $err, _ErrMsg, _ErrNum ); +} + +sub _NoMoreItems +{ + return + $_NoMoreItems =~ /^\d/ + ? _ErrNum == $_NoMoreItems + : _ErrMsg =~ /$_NoMoreItems/io; +} + + +sub _FileNotFound +{ + return + $_FileNotFound =~ /^\d/ + ? _ErrNum == $_FileNotFound + : _ErrMsg =~ /$_FileNotFound/io; +} + + +sub _TooSmall +{ + return + $_TooSmall =~ /^\d/ + ? _ErrNum == $_TooSmall + : _ErrMsg =~ /$_TooSmall/io; +} + + +sub _MoreData +{ + return + $_MoreData =~ /^\d/ + ? _ErrNum == $_MoreData + : _ErrMsg =~ /$_MoreData/io; +} + + +sub _enumValues +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my( @names )= (); + my $pos= 0; + my $name= ""; + my $nlen= 1+$self->Information("MaxValNameLen"); + while( $self->RegEnumValue($pos++,$name,$nlen,[],[],[],[]) ) { + push( @names, $name ); + } + if( ! _NoMoreItems() ) { + return (); + } + $self->{VALUES}= \@names; + return 1; +} + + +sub ValueNames +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + @_ and croak "Usage: \@names= \$key->ValueNames;"; + $self->_enumValues unless $self->{VALUES}; + return @{$self->{VALUES}}; +} + + +sub _enumSubKeys +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my( @subkeys, @classes, @times )= (); + my $pos= 0; + my( $subkey, $class, $time )= ("","",""); + my( $namSiz, $clsSiz )= $self->Information( + qw( MaxSubKeyLen MaxSubClassLen )); + $namSiz++; $clsSiz++; + while( $self->RegEnumKeyEx( + $pos++, $subkey, $namSiz, [], $class, $clsSiz, $time ) ) { + push( @subkeys, $subkey ); + push( @classes, $class ); + push( @times, $time ); + } + if( ! _NoMoreItems() ) { + return (); + } + $self->{SUBKEYS}= \@subkeys; + $self->{SUBCLASSES}= \@classes; + $self->{SUBTIMES}= \@times; + return 1; +} + + +sub SubKeyNames +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + @_ and croak "Usage: \@names= \$key->SubKeyNames;"; + $self->_enumSubKeys unless $self->{SUBKEYS}; + return @{$self->{SUBKEYS}}; +} + + +sub SubKeyClasses +{ + my $self= shift(@_); + @_ and croak "Usage: \@classes= \$key->SubKeyClasses;"; + $self->_enumSubKeys unless $self->{SUBCLASSES}; + return @{$self->{SUBCLASSES}}; +} + + +sub SubKeyTimes +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + @_ and croak "Usage: \@times= \$key->SubKeyTimes;"; + $self->_enumSubKeys unless $self->{SUBTIMES}; + return @{$self->{SUBTIMES}}; +} + + +sub _MemberNames +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + @_ and croak "Usage: \$arrayRef= \$key->_MemberNames;"; + if( ! $self->{MEMBERS} ) { + $self->_enumValues unless $self->{VALUES}; + $self->_enumSubKeys unless $self->{SUBKEYS}; + my( @members )= ( map( $_.$self->{DELIM}, @{$self->{SUBKEYS}} ), + map( $self->{DELIM}.$_, @{$self->{VALUES}} ) ); + $self->{MEMBERS}= \@members; + } + return $self->{MEMBERS}; +} + + +sub _MembersHash +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + @_ and croak "Usage: \$hashRef= \$key->_MembersHash;"; + if( ! $self->{MEMBHASH} ) { + my $aRef= $self->_MemberNames; + $self->{MEMBHASH}= {}; + @{$self->{MEMBHASH}}{@$aRef}= (1) x @$aRef; + } + return $self->{MEMBHASH}; +} + + +sub MemberNames +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + @_ and croak "Usage: \@members= \$key->MemberNames;"; + return @{$self->_MemberNames}; +} + + +sub Information +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my( $time, $nkeys, $nvals, $xsec, $xkey, $xcls, $xname, $xdata )= + ("",0,0,0,0,0,0,0); + my $clen= 8; + if( ! $self->RegQueryInfoKey( [], [], $nkeys, $xkey, $xcls, + $nvals, $xname, $xdata, $xsec, $time ) ) { + return (); + } + if( defined($self->{Class}) ) { + $clen= length($self->{Class}); + } else { + $self->{Class}= ""; + } + while( ! $self->RegQueryInfoKey( $self->{Class}, $clen, + [],[],[],[],[],[],[],[],[]) + && _MoreData ) { + $clen *= 2; + } + my( %info ); + @info{ qw( LastWrite CntSubKeys CntValues SecurityLen + MaxValDataLen MaxSubKeyLen MaxSubClassLen MaxValNameLen ) + }= ( $time, $nkeys, $nvals, $xsec, + $xdata, $xkey, $xcls, $xname ); + if( @_ ) { + my( %check ); + @check{keys(%info)}= keys(%info); + my( @err )= grep( ! $check{$_}, @_ ); + if( @err ) { + croak "${PACK}::Information- Invalid info requested (@err)"; + } + return @info{@_}; + } else { + return %info; + } +} + + +sub Delimiter +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + $self= $RegObj unless ref($self); + my( $oldDelim )= $self->{DELIM}; + if( 1 == @_ && "" ne "$_[0]" ) { + delete $self->{MEMBERS}; + delete $self->{MEMBHASH}; + $self->{DELIM}= "$_[0]"; + } elsif( 0 != @_ ) { + croak "Usage: \$oldDelim= \$key->Delimiter(\$newDelim);"; + } + return $oldDelim; +} + + +sub Handle +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + @_ and croak "Usage: \$handle= \$key->Handle;"; + $self= $RegObj unless ref($self); + return $self->{HANDLE}; +} + + +sub Path +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + @_ and croak "Usage: \$path= \$key->Path;"; + my $delim= $self->{DELIM}; + $self= $RegObj unless ref($self); + if( "" eq $self->{MACHINE} ) { + return( $delim . join( $delim, @{$self->{PATH}} ) . $delim ); + } else { + return( $delim x 2 + . join( $delim, $self->{MACHINE}, @{$self->{PATH}} ) + . $delim ); + } +} + + +sub _Path +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + @_ and croak "Usage: \$arrRef= \$key->_Path;"; + $self= $RegObj unless ref($self); + return $self->{PATH}; +} + + +sub Machine +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + @_ and croak "Usage: \$machine= \$key->Machine;"; + $self= $RegObj unless ref($self); + return $self->{MACHINE}; +} + + +sub Access +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + @_ and croak "Usage: \$access= \$key->Access;"; + $self= $RegObj unless ref($self); + return $self->{ACCESS}; +} + + +sub OS_Delimiter +{ + my $self= shift(@_); + @_ and croak "Usage: \$backslash= \$key->OS_Delimiter;"; + return $self->{OS_DELIM}; +} + + +sub _Roots +{ + my $self= shift(@_); + $self= tied(%$self) if ref($self) && tied(%$self); + @_ and croak "Usage: \$varName= \$key->_Roots;"; + $self= $RegObj unless ref($self); + return $self->{ROOTS}; +} + + +sub Roots +{ + my $self= shift(@_); + $self= tied(%$self) if ref($self) && tied(%$self); + @_ and croak "Usage: \$hashRef= \$key->Roots;"; + $self= $RegObj unless ref($self); + return eval "\\%$self->{ROOTS}"; +} + + +sub TIEHASH +{ + my( $this )= shift(@_); + $this= tied(%$this) if ref($this) && tied(%$this); + my( $key )= @_; + if( 1 == @_ && ref($key) && "$key" =~ /=/ ) { + return $key; # $key is already an object (blessed reference). + } + return $this->new( @_ ); +} + + +sub Tie +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my( $hRef )= @_; + if( 1 != @_ || ! ref($hRef) || "$hRef" !~ /(^|=)HASH\(/ ) { + croak "Usage: \$key->Tie(\\\%hash);"; + } + return tie %$hRef, ref($self), $self; +} + + +sub TiedRef +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my $hRef= @_ ? shift(@_) : {}; + return () if ! defined($self); + $self->Tie($hRef); + bless $hRef, ref($self); + return $hRef; +} + + +sub _Flags +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my $oldFlags= $self->{FLAGS}; + if( 1 == @_ ) { + $self->{FLAGS}= shift(@_); + } elsif( 0 != @_ ) { + croak "Usage: \$oldBits= \$key->_Flags(\$newBits);"; + } + return $oldFlags; +} + + +sub ArrayValues +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my $oldFlag= $Flag_ArrVal == ( $Flag_ArrVal & $self->{FLAGS} ); + if( 1 == @_ ) { + my $bool= shift(@_); + if( $bool ) { + $self->{FLAGS} |= $Flag_ArrVal; + } else { + $self->{FLAGS} &= ~( $Flag_ArrVal | $Flag_TieVal ); + } + } elsif( 0 != @_ ) { + croak "Usage: \$oldBool= \$key->ArrayValues(\$newBool);"; + } + return $oldFlag; +} + + +sub TieValues +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my $oldFlag= $Flag_TieVal == ( $Flag_TieVal & $self->{FLAGS} ); + if( 1 == @_ ) { + my $bool= shift(@_); + if( $bool ) { + croak "${PACK}->TieValues cannot be enabled with this version"; + $self->{FLAGS} |= $Flag_TieVal; + } else { + $self->{FLAGS} &= ~$Flag_TieVal; + } + } elsif( 0 != @_ ) { + croak "Usage: \$oldBool= \$key->TieValues(\$newBool);"; + } + return $oldFlag; +} + + +sub FastDelete +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my $oldFlag= $Flag_FastDel == ( $Flag_FastDel & $self->{FLAGS} ); + if( 1 == @_ ) { + my $bool= shift(@_); + if( $bool ) { + $self->{FLAGS} |= $Flag_FastDel; + } else { + $self->{FLAGS} &= ~$Flag_FastDel; + } + } elsif( 0 != @_ ) { + croak "Usage: \$oldBool= \$key->FastDelete(\$newBool);"; + } + return $oldFlag; +} + + +sub SplitMultis +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my $oldFlag= $Flag_Split == ( $Flag_Split & $self->{FLAGS} ); + if( 1 == @_ ) { + my $bool= shift(@_); + if( $bool ) { + $self->{FLAGS} |= $Flag_Split; + } else { + $self->{FLAGS} &= ~$Flag_Split; + } + } elsif( 0 != @_ ) { + croak "Usage: \$oldBool= \$key->SplitMultis(\$newBool);"; + } + return $oldFlag; +} + + +sub DWordsToHex +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my $oldFlag= $Flag_HexDWord == ( $Flag_HexDWord & $self->{FLAGS} ); + if( 1 == @_ ) { + my $bool= shift(@_); + if( $bool ) { + $self->{FLAGS} |= $Flag_HexDWord; + } else { + $self->{FLAGS} &= ~$Flag_HexDWord; + } + } elsif( 0 != @_ ) { + croak "Usage: \$oldBool= \$key->DWordsToHex(\$newBool);"; + } + return $oldFlag; +} + + +sub FixSzNulls +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my $oldFlag= $Flag_FixNulls == ( $Flag_FixNulls & $self->{FLAGS} ); + if( 1 == @_ ) { + my $bool= shift(@_); + if( $bool ) { + $self->{FLAGS} |= $Flag_FixNulls; + } else { + $self->{FLAGS} &= ~$Flag_FixNulls; + } + } elsif( 0 != @_ ) { + croak "Usage: \$oldBool= \$key->FixSzNulls(\$newBool);"; + } + return $oldFlag; +} + + +sub DualTypes +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my $oldFlag= $Flag_DualTyp == ( $Flag_DualTyp & $self->{FLAGS} ); + if( 1 == @_ ) { + my $bool= shift(@_); + if( $bool ) { + croak "${PACK}->DualTypes cannot be enabled since ", + "SetDualVar module not installed" + unless $_SetDualVar; + $self->{FLAGS} |= $Flag_DualTyp; + } else { + $self->{FLAGS} &= ~$Flag_DualTyp; + } + } elsif( 0 != @_ ) { + croak "Usage: \$oldBool= \$key->DualTypes(\$newBool);"; + } + return $oldFlag; +} + + +sub DualBinVals +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my $oldFlag= $Flag_DualBin == ( $Flag_DualBin & $self->{FLAGS} ); + if( 1 == @_ ) { + my $bool= shift(@_); + if( $bool ) { + croak "${PACK}->DualBinVals cannot be enabled since ", + "SetDualVar module not installed" + unless $_SetDualVar; + $self->{FLAGS} |= $Flag_DualBin; + } else { + $self->{FLAGS} &= ~$Flag_DualBin; + } + } elsif( 0 != @_ ) { + croak "Usage: \$oldBool= \$key->DualBinVals(\$newBool);"; + } + return $oldFlag; +} + + +sub GetOptions +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my( $opt, $meth ); + if( ! @_ || 1 == @_ && "HASH" eq ref($_[0]) ) { + my $href= @_ ? $_[0] : {}; + foreach $opt ( grep !/^Allow/, @_opt_subs ) { + $meth= $_opt_subs{$opt}; + $href->{$opt}= $self->$meth(); + } + return @_ ? $self : $href; + } + my @old; + foreach $opt ( @_ ) { + $meth= $_opt_subs{$opt}; + if( defined $meth ) { + if( $opt eq "AllowLoad" || $opt eq "AllowSave" ) { + croak "${PACK}->GetOptions: Getting current setting of $opt ", + "not supported in this release"; + } + push( @old, $self->$meth() ); + } else { + croak "${PACK}->GetOptions: Invalid option ($opt) ", + "not one of ( ", join(" ",grep !/^Allow/, @_opt_subs), " )"; + } + } + return wantarray ? @old : $old[-1]; +} + + +sub SetOptions +{ + my $self= shift(@_); + # Don't get object if hash ref so "ref" returns original ref. + my( $opt, $meth, @old ); + while( @_ ) { + $opt= shift(@_); + $meth= $_opt_subs{$opt}; + if( ! @_ ) { + croak "${PACK}->SetOptions: Option value missing ", + "after option name ($opt)"; + } elsif( defined $meth ) { + push( @old, $self->$meth( shift(@_) ) ); + } elsif( $opt eq substr("reference",0,length($opt)) ) { + shift(@_) if @_; + push( @old, $self ); + } else { + croak "${PACK}->SetOptions: Invalid option ($opt) ", + "not one of ( @_opt_subs )"; + } + } + return wantarray ? @old : $old[-1]; +} + + +sub _parseTiedEnt +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my $ent= shift(@_); + my $delim= shift(@_); + my $dlen= length( $delim ); + my $parent= @_ ? shift(@_) : 0; + my $off; + if( $delim x 2 eq substr($ent,0,2*$dlen) && "NONE" eq $self->Handle ) { + if( 0 <= ( $off= index( $ent, $delim x 2, 2*$dlen ) ) ) { + return( substr( $ent, 0, $off ), substr( $ent, 2*$dlen+$off ) ); + } elsif( $delim eq substr($ent,-$dlen) ) { + return( substr($ent,0,-$dlen) ); + } elsif( 2*$dlen <= ( $off= rindex( $ent, $delim ) ) ) { + return( substr( $ent, 0, $off ), + undef, substr( $ent, $dlen+$off ) ); + } elsif( $parent ) { + return(); + } else { + return( $ent ); + } + } elsif( $delim eq substr($ent,0,$dlen) && "NONE" ne $self->Handle ) { + return( undef, substr($ent,$dlen) ); + } elsif( $self->{MEMBERS} && $self->_MembersHash->{$ent} ) { + return( substr($ent,0,-$dlen) ); + } elsif( 0 <= ( $off= index( $ent, $delim x 2 ) ) ) { + return( substr( $ent, 0, $off ), substr( $ent, 2*$dlen+$off ) ); + } elsif( $delim eq substr($ent,-$dlen) ) { + if( $parent + && 0 <= ( $off= rindex( $ent, $delim, length($ent)-2*$dlen ) ) ) { + return( substr($ent,0,$off), + undef, undef, substr($ent,$dlen+$off,-$dlen) ); + } else { + return( substr($ent,0,-$dlen) ); + } + } elsif( 0 <= ( $off= rindex( $ent, $delim ) ) ) { + return( + substr( $ent, 0, $off ), undef, substr( $ent, $dlen+$off ) ); + } else { + return( undef, undef, $ent ); + } +} + + +sub _FetchValue +{ + my $self= shift( @_ ); + my( $val, $createKey )= @_; + my( $data, $type ); + if( ( $data, $type )= $self->GetValue( $val ) ) { + return $self->ArrayValues ? [ $data, $type ] + : wantarray ? ( $data, $type ) + : $data; + } elsif( $createKey and $data= $self->new($val) ) { + return $data->TiedRef; + } else { + return (); + } +} + + +sub FETCH +{ + my $self= shift(@_); + my $ent= shift(@_); + my $delim= $self->Delimiter; + my( $key, $val, $ambig )= $self->_parseTiedEnt( $ent, $delim, 0 ); + my $sub; + if( defined($key) ) { + if( defined($self->{MEMBHASH}) + && $self->{MEMBHASH}->{$key.$delim} + && 0 <= index($key,$delim) ) { + return () + unless $sub= $self->new( $key, + {"Delimiter"=>$self->OS_Delimiter} ); + $sub->Delimiter($delim); + } else { + return () + unless $sub= $self->new( $key ); + } + } else { + $sub= $self; + } + if( defined($val) ) { + return $sub->_FetchValue( $val ); + } elsif( ! defined($ambig) ) { + return $sub->TiedRef; + } elsif( defined($key) ) { + return $sub->FETCH( $ambig ); + } else { + return $sub->_FetchValue( $ambig, "" ne $ambig ); + } +} + + +sub _FetchOld +{ + my( $self, $key )= @_; + my $old= $self->FETCH($key); + if( $old ) { + my $copy= {}; + %$copy= %$old; + return $copy; + } + # return $^E; + return _Err; +} + + +sub DELETE +{ + my $self= shift(@_); + my $ent= shift(@_); + my $delim= $self->Delimiter; + my( $key, $val, $ambig, $subkey )= $self->_parseTiedEnt( $ent, $delim, 1 ); + my $sub; + my $fast= defined(wantarray) ? $self->FastDelete : 2; + my $old= 1; # Value returned if FastDelete is set. + if( defined($key) + && ( defined($val) || defined($ambig) || defined($subkey) ) ) { + return () + unless $sub= $self->new( $key ); + } else { + $sub= $self; + } + if( defined($val) ) { + $old= $sub->GetValue($val) || _Err unless 2 <= $fast; + $sub->RegDeleteValue( $val ); + } elsif( defined($subkey) ) { + $old= $sub->_FetchOld( $subkey.$delim ) unless $fast; + $sub->RegDeleteKey( $subkey ); + } elsif( defined($ambig) ) { + if( defined($key) ) { + $old= $sub->DELETE($ambig); + } else { + $old= $sub->GetValue($ambig) || _Err unless 2 <= $fast; + if( defined( $old ) ) { + $sub->RegDeleteValue( $ambig ); + } else { + $old= $sub->_FetchOld( $ambig.$delim ) unless $fast; + $sub->RegDeleteKey( $ambig ); + } + } + } elsif( defined($key) ) { + $old= $sub->_FetchOld( $key.$delim ) unless $fast; + $sub->RegDeleteKey( $key ); + } else { + croak "${PACK}->DELETE: Key ($ent) can never be deleted"; + } + return $old; +} + + +sub SetValue +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + my $name= shift(@_); + my $data= shift(@_); + my( $type )= @_; + my $size; + if( ! defined($type) ) { + if( "ARRAY" eq ref($data) ) { + croak "${PACK}->SetValue: Value is array reference but ", + "no data type given" + unless 2 == @$data; + ( $data, $type )= @$data; + } else { + $type= REG_SZ; + } + } + $type= _constant($type,"registry value data type") if $type =~ /^REG_/; + if( REG_MULTI_SZ == $type && "ARRAY" eq ref($data) ) { + $data= join( "\0", @$data ) . "\0\0"; + ## $data= pack( "a*" x (1+@$data), map( $_."\0", @$data, "" ) ); + } elsif( ( REG_SZ == $type || REG_EXPAND_SZ == $type ) + && $self->FixSzNulls ) { + $data .= "\0" unless "\0" eq substr($data,0,-1); + } elsif( REG_DWORD == $type && $data =~ /^0x[0-9a-fA-F]{3,}$/ ) { + $data= pack( "L", hex($data) ); + # We could to $data=pack("L",$data) for REG_DWORD but I see + # no nice way to always destinguish when to do this or not. + } + return $self->RegSetValueEx( $name, 0, $type, $data, length($data) ); +} + + +sub StoreKey +{ + my $this= shift(@_); + $this= tied(%$this) if ref($this) && tied(%$this); + my $subKey= shift(@_); + my $data= shift(@_); + my $ent; + my $self; + if( ! ref($data) || "$data" !~ /(^|=)HASH/ ) { + croak "${PACK}->StoreKey: For ", $this->Path.$subKey, ",\n", + " subkey data must be a HASH reference"; + } + if( defined( $$data{""} ) && "HASH" eq ref($$data{""}) ) { + $self= $this->CreateKey( $subKey, delete $$data{""} ); + } else { + $self= $this->CreateKey( $subKey ); + } + return () if ! defined($self); + foreach $ent ( keys(%$data) ) { + return () + unless $self->STORE( $ent, $$data{$ent} ); + } + return $self; +} + + +# = { "" => {OPT=>VAL}, "val"=>[], "key"=>{} } creates a new key +# = "string" creates a new REG_SZ value +# = [ data, type ] creates a new value +sub STORE +{ + my $self= shift(@_); + my $ent= shift(@_); + my $data= shift(@_); + my $delim= $self->Delimiter; + my( $key, $val, $ambig, $subkey )= $self->_parseTiedEnt( $ent, $delim, 1 ); + my $sub; + if( defined($key) + && ( defined($val) || defined($ambig) || defined($subkey) ) ) { + return () + unless $sub= $self->new( $key ); + } else { + $sub= $self; + } + if( defined($val) ) { + croak "${PACK}->STORE: For ", $sub->Path.$delim.$val, ",\n", + " value data cannot be a HASH reference" + if ref($data) && "$data" =~ /(^|=)HASH/; + $sub->SetValue( $val, $data ); + } elsif( defined($subkey) ) { + croak "${PACK}->STORE: For ", $sub->Path.$subkey.$delim, ",\n", + " subkey data must be a HASH reference" + unless ref($data) && "$data" =~ /(^|=)HASH/; + $sub->StoreKey( $subkey, $data ); + } elsif( defined($ambig) ) { + if( ref($data) && "$data" =~ /(^|=)HASH/ ) { + $sub->StoreKey( $ambig, $data ); + } else { + $sub->SetValue( $ambig, $data ); + } + } elsif( defined($key) ) { + croak "${PACK}->STORE: For ", $sub->Path.$key.$delim, ",\n", + " subkey data must be a HASH reference" + unless ref($data) && "$data" =~ /(^|=)HASH/; + $sub->StoreKey( $key, $data ); + } else { + croak "${PACK}->STORE: Key ($ent) can never be created nor set"; + } +} + + +sub EXISTS +{ + my $self= shift(@_); + my $ent= shift(@_); + return defined( $self->FETCH($ent) ); +} + + +sub FIRSTKEY +{ + my $self= shift(@_); + my $members= $self->_MemberNames; + $self->{PREVIDX}= 0; + return @{$members} ? $members->[0] : undef; +} + + +sub NEXTKEY +{ + my $self= shift(@_); + my $prev= shift(@_); + my $idx= $self->{PREVIDX}; + my $members= $self->_MemberNames; + if( ! defined($idx) || $prev ne $members->[$idx] ) { + $idx= 0; + while( $idx < @$members && $prev ne $members->[$idx] ) { + $idx++; + } + } + $self->{PREVIDX}= ++$idx; + return $members->[$idx]; +} + + +sub DESTROY +{ + my $self= shift(@_); + return if tied(%$self); + my $unload; + local $@; + eval { $unload= $self->{UNLOADME}; 1 } + or return; + my $debug= $ENV{DEBUG_TIE_REGISTRY}; + if( defined($debug) ) { + if( 1 < $debug ) { + my $hand= $self->Handle; + my $dep= $self->{DEPENDON}; + carp "${PACK} destroying ", $self->Path, " (", + "NONE" eq $hand ? $hand : sprintf("0x%lX",$hand), ")", + defined($dep) ? (" [depends on ",$dep->Path,"]") : (); + } else { + warn "${PACK} destroying ", $self->Path, ".\n"; + } + } + $self->RegCloseKey + unless "NONE" eq $self->Handle; + if( defined($unload) ) { + if( defined($debug) && 1 < $debug ) { + my( $obj, $subKey, $file )= @$unload; + warn "Unloading ", $self->Path, + " (from ", $obj->Path, ", $subKey)...\n"; + } + $self->UnLoad + || warn "Couldn't unload ", $self->Path, ": ", _ErrMsg, "\n"; + ## carp "Never unloaded ${PACK}::Load($$unload[2])"; + } + #delete $self->{DEPENDON}; +} + + +use vars qw( @CreateKey_Opts %CreateKey_Opts %_KeyDispNames ); +@CreateKey_Opts= qw( Access Class Options Delimiter + Disposition Security Volatile Backup ); +@CreateKey_Opts{@CreateKey_Opts}= (1) x @CreateKey_Opts; +%_KeyDispNames= ( REG_CREATED_NEW_KEY() => "REG_CREATED_NEW_KEY", + REG_OPENED_EXISTING_KEY() => "REG_OPENED_EXISTING_KEY" ); + +sub CreateKey +{ + my $self= shift(@_); + my $tied= tied(%$self); + $self= tied(%$self) if $tied; + my( $subKey, $opts )= @_; + my( $sam )= $self->Access; + my( $delim )= $self->Delimiter; + my( $class )= ""; + my( $flags )= 0; + my( $secure )= []; + my( $garb )= []; + my( $result )= \$garb; + my( $handle )= 0; + if( @_ < 1 || 2 < @_ + || 2 == @_ && "HASH" ne ref($opts) ) { + croak "Usage: \$new= \$old->CreateKey( \$subKey, {OPT=>VAL,...} );\n", + " options: @CreateKey_Opts\nCalled"; + } + if( defined($opts) ) { + $sam= $opts->{"Access"} if defined($opts->{"Access"}); + $class= $opts->{Class} if defined($opts->{Class}); + $flags= $opts->{Options} if defined($opts->{Options}); + $delim= $opts->{"Delimiter"} if defined($opts->{"Delimiter"}); + $secure= $opts->{Security} if defined($opts->{Security}); + if( defined($opts->{Disposition}) ) { + "SCALAR" eq ref($opts->{Disposition}) + or croak "${PACK}->CreateKey option `Disposition'", + " must provide a scalar reference"; + $result= $opts->{Disposition}; + } + if( 0 == $flags ) { + $flags |= REG_OPTION_VOLATILE + if defined($opts->{Volatile}) && $opts->{Volatile}; + $flags |= REG_OPTION_BACKUP_RESTORE + if defined($opts->{Backup}) && $opts->{Backup}; + } + } + my $subPath= ref($subKey) ? $subKey : $self->_split($subKey,$delim); + $subKey= join( $self->OS_Delimiter, @$subPath ); + $self->RegCreateKeyEx( $subKey, 0, $class, $flags, $sam, + $secure, $handle, $$result ) + or return (); + if( ! ref($$result) && $self->DualTypes ) { + $$result= _DualVal( \%_KeyDispNames, $$result ); + } + my $new= $self->_new( $handle, [ @{$self->_Path}, @{$subPath} ] ); + $new->{ACCESS}= $sam; + $new->{DELIM}= $delim; + $new= $new->TiedRef if $tied; + return $new; +} + + +use vars qw( $Load_Cnt @Load_Opts %Load_Opts ); +$Load_Cnt= 0; +@Load_Opts= qw(NewSubKey); +@Load_Opts{@Load_Opts}= (1) x @Load_Opts; + +sub Load +{ + my $this= shift(@_); + my $tied= ref($this) && tied(%$this); + $this= tied(%$this) if $tied; + my( $file, $subKey, $opts )= @_; + if( 2 == @_ && "HASH" eq ref($subKey) ) { + $opts= $subKey; + undef $subKey; + } + @_ < 1 || 3 < @_ || defined($opts) && "HASH" ne ref($opts) + and croak "Usage: \$key= ", + "${PACK}->Load( \$fileName, [\$newSubKey,] {OPT=>VAL...} );\n", + " options: @Load_Opts @new_Opts\nCalled"; + if( defined($opts) && exists($opts->{NewSubKey}) ) { + $subKey= delete $opts->{NewSubKey}; + } + if( ! defined( $subKey ) ) { + if( "" ne $this->Machine ) { + ( $this )= $this->_connect( [$this->Machine,"LMachine"] ); + } else { + ( $this )= $this->_rootKey( "LMachine" ); # Could also be "Users" + } + $subKey= "PerlTie:$$." . ++$Load_Cnt; + } + $this->RegLoadKey( $subKey, $file ) + or return (); + my $self= $this->new( $subKey, defined($opts) ? $opts : () ); + if( ! defined( $self ) ) { + { my $err= Win32::GetLastError(); + #{ local( $^E ); #} + $this->RegUnLoadKey( $subKey ) or carp + "Can't unload $subKey from ", $this->Path, ": ", _ErrMsg, "\n"; + Win32::SetLastError($err); + } + return (); + } + $self->{UNLOADME}= [ $this, $subKey, $file ]; + $self= $self->TiedRef if $tied; + return $self; +} + + +sub UnLoad +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + @_ and croak "Usage: \$key->UnLoad;"; + my $unload= $self->{UNLOADME}; + "ARRAY" eq ref($unload) + or croak "${PACK}->UnLoad called on a key which was not Load()ed"; + my( $obj, $subKey, $file )= @$unload; + $self->RegCloseKey; + return Win32API::Registry::RegUnLoadKey( $obj->Handle, $subKey ); +} + + +sub AllowSave +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + return $self->AllowPriv( "SeBackupPrivilege", @_ ); +} + + +sub AllowLoad +{ + my $self= shift(@_); + $self= tied(%$self) if tied(%$self); + return $self->AllowPriv( "SeRestorePrivilege", @_ ); +} + + +# RegNotifyChangeKeyValue( hKey, bWatchSubtree, iNotifyFilter, hEvent, bAsync ) + + +sub RegCloseKey { my $self= shift(@_); + Win32API::Registry::RegCloseKey $self->Handle, @_; } +sub RegConnectRegistry { my $self= shift(@_); + Win32API::Registry::RegConnectRegistry @_; } +sub RegCreateKey { my $self= shift(@_); + Win32API::Registry::RegCreateKey $self->Handle, @_; } +sub RegCreateKeyEx { my $self= shift(@_); + Win32API::Registry::RegCreateKeyEx $self->Handle, @_; } +sub RegDeleteKey { my $self= shift(@_); + Win32API::Registry::RegDeleteKey $self->Handle, @_; } +sub RegDeleteValue { my $self= shift(@_); + Win32API::Registry::RegDeleteValue $self->Handle, @_; } +sub RegEnumKey { my $self= shift(@_); + Win32API::Registry::RegEnumKey $self->Handle, @_; } +sub RegEnumKeyEx { my $self= shift(@_); + Win32API::Registry::RegEnumKeyEx $self->Handle, @_; } +sub RegEnumValue { my $self= shift(@_); + Win32API::Registry::RegEnumValue $self->Handle, @_; } +sub RegFlushKey { my $self= shift(@_); + Win32API::Registry::RegFlushKey $self->Handle, @_; } +sub RegGetKeySecurity { my $self= shift(@_); + Win32API::Registry::RegGetKeySecurity $self->Handle, @_; } +sub RegLoadKey { my $self= shift(@_); + Win32API::Registry::RegLoadKey $self->Handle, @_; } +sub RegNotifyChangeKeyValue { my $self= shift(@_); + Win32API::Registry::RegNotifyChangeKeyValue $self->Handle, @_; } +sub RegOpenKey { my $self= shift(@_); + Win32API::Registry::RegOpenKey $self->Handle, @_; } +sub RegOpenKeyEx { my $self= shift(@_); + Win32API::Registry::RegOpenKeyEx $self->Handle, @_; } +sub RegQueryInfoKey { my $self= shift(@_); + Win32API::Registry::RegQueryInfoKey $self->Handle, @_; } +sub RegQueryMultipleValues { my $self= shift(@_); + Win32API::Registry::RegQueryMultipleValues $self->Handle, @_; } +sub RegQueryValue { my $self= shift(@_); + Win32API::Registry::RegQueryValue $self->Handle, @_; } +sub RegQueryValueEx { my $self= shift(@_); + Win32API::Registry::RegQueryValueEx $self->Handle, @_; } +sub RegReplaceKey { my $self= shift(@_); + Win32API::Registry::RegReplaceKey $self->Handle, @_; } +sub RegRestoreKey { my $self= shift(@_); + Win32API::Registry::RegRestoreKey $self->Handle, @_; } +sub RegSaveKey { my $self= shift(@_); + Win32API::Registry::RegSaveKey $self->Handle, @_; } +sub RegSetKeySecurity { my $self= shift(@_); + Win32API::Registry::RegSetKeySecurity $self->Handle, @_; } +sub RegSetValue { my $self= shift(@_); + Win32API::Registry::RegSetValue $self->Handle, @_; } +sub RegSetValueEx { my $self= shift(@_); + Win32API::Registry::RegSetValueEx $self->Handle, @_; } +sub RegUnLoadKey { my $self= shift(@_); + Win32API::Registry::RegUnLoadKey $self->Handle, @_; } +sub AllowPriv { my $self= shift(@_); + Win32API::Registry::AllowPriv @_; } + + +# Autoload methods go after =cut, and are processed by the autosplit program. + +1; +__END__ + +=head1 NAME + +Win32::TieRegistry - Powerful and easy ways to manipulate a registry +[on Win32 for now]. + +=head1 SYNOPSIS + + use Win32::TieRegistry 0.20 ( UseOptionName=>UseOptionValue[,...] ); + + $Registry->SomeMethodCall(arg1,...); + + $subKey= $Registry->{"Key\\SubKey\\"}; + $valueData= $Registry->{"Key\\SubKey\\\\ValueName"}; + $Registry->{"Key\\SubKey\\"}= { "NewSubKey" => {...} }; + $Registry->{"Key\\SubKey\\\\ValueName"}= "NewValueData"; + $Registry->{"\\ValueName"}= [ pack("fmt",$data), REG_DATATYPE ]; + +=head1 EXAMPLES + + use Win32::TieRegistry( Delimiter=>"#", ArrayValues=>0 ); + $pound= $Registry->Delimiter("/"); + $diskKey= $Registry->{"LMachine/System/Disk/"} + or die "Can't read LMachine/System/Disk key: $^E\n"; + $data= $key->{"/Information"} + or die "Can't read LMachine/System/Disk//Information value: $^E\n"; + $remoteKey= $Registry->{"//ServerA/LMachine/System/"} + or die "Can't read //ServerA/LMachine/System/ key: $^E\n"; + $remoteData= $remoteKey->{"Disk//Information"} + or die "Can't read ServerA's System/Disk//Information value: $^E\n"; + foreach $entry ( keys(%$diskKey) ) { + ... + } + foreach $subKey ( $diskKey->SubKeyNames ) { + ... + } + $diskKey->AllowSave( 1 ); + $diskKey->RegSaveKey( "C:/TEMP/DiskReg", [] ); + +=head1 DESCRIPTION + +The I<Win32::TieRegistry> module lets you manipulate the Registry +via objects [as in "object oriented"] or via tied hashes. But +you will probably mostly use a combination reference, that is, a +reference to a tied hash that has also been made an object so that +you can mix both access methods [as shown above]. + +If you did not get this module as part of L<libwin32>, you might +want to get a recent version of L<libwin32> from CPAN which should +include this module and the I<Win32API::Registry> module that it +uses. + +Skip to the L<SUMMARY> section if you just want to dive in and start +using the Registry from Perl. + +Accessing and manipulating the registry is extremely simple using +I<Win32::TieRegistry>. A single, simple expression can return +you almost any bit of information stored in the Registry. +I<Win32::TieRegistry> also gives you full access to the "raw" +underlying API calls so that you can do anything with the Registry +in Perl that you could do in C. But the "simple" interface has +been carefully designed to handle almost all operations itself +without imposing arbitrary limits while providing sensible +defaults so you can list only the parameters you care about. + +But first, an overview of the Registry itself. + +=head2 The Registry + +The Registry is a forest: a collection of several tree structures. +The root of each tree is a key. These root keys are identified by +predefined constants whose names start with "HKEY_". Although all +keys have a few attributes associated with each [a class, a time +stamp, and security information], the most important aspect of keys +is that each can contain subkeys and can contain values. + +Each subkey has a name: a string which cannot be blank and cannot +contain the delimiter character [backslash: C<'\\'>] nor nul +[C<'\0'>]. Each subkey is also a key and so can contain subkeys +and values [and has a class, time stamp, and security information]. + +Each value has a name: a string which E<can> be blank and E<can> +contain the delimiter character [backslash: C<'\\'>] and any +character except for null, C<'\0'>. Each value also has data +associated with it. Each value's data is a contiguous chunk of +bytes, which is exactly what a Perl string value is so Perl +strings will usually be used to represent value data. + +Each value also has a data type which says how to interpret the +value data. The primary data types are: + +=over + +=item REG_SZ + +A null-terminated string. + +=item REG_EXPAND_SZ + +A null-terminated string which contains substrings consisting of a +percent sign [C<'%'>], an environment variable name, then a percent +sign, that should be replaced with the value associate with that +environment variable. The system does I<not> automatically do this +substitution. + +=item REG_BINARY + +Some arbitrary binary value. You can think of these as being +"packed" into a string. + +If your system has the L<SetDualVar> module installed, +the C<DualBinVals()> option wasn't turned off, and you +fetch a C<REG_BINARY> value of 4 bytes or fewer, then +you can use the returned value in a numeric context to +get at the "unpacked" numeric value. See C<GetValue()> +for more information. + +=item REG_MULTI_SZ + +Several null-terminated strings concatenated together with an +extra trailing C<'\0'> at the end of the list. Note that the list +can include empty strings so use the value's length to determine +the end of the list, not the first occurrence of C<'\0\0'>. +It is best to set the C<SplitMultis()> option so I<Win32::TieRegistry> +will split these values into an array of strings for you. + +=item REG_DWORD + +A long [4-byte] integer value. These values are expected either +packed into a 4-character string or as a hex string of E<more than> +4 characters [but I<not> as a numeric value, unfortunately, as there is +no sure way to tell a numeric value from a packed 4-byte string that +just happens to be a string containing a valid numeric value]. + +How such values are returned depends on the C<DualBinVals()> and +C<DWordsToHex()> options. See C<GetValue()> for details. + +=back + +In the underlying Registry calls, most places which take a +subkey name also allow you to pass in a subkey "path" -- a +string of several subkey names separated by the delimiter +character, backslash [C<'\\'>]. For example, doing +C<RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\DISK",...)> is much +like opening the C<"SYSTEM"> subkey of C<HKEY_LOCAL_MACHINE>, +then opening its C<"DISK"> subkey, then closing the C<"SYSTEM"> +subkey. + +All of the I<Win32::TieRegistry> features allow you to use your +own delimiter in place of the system's delimiter, [C<'\\'>]. In +most of our examples we will use a forward slash [C<'/'>] as our +delimiter as it is easier to read and less error prone to use when +writing Perl code since you have to type two backslashes for each +backslash you want in a string. Note that this is true even when +using single quotes -- C<'\\HostName\LMachine\'> is an invalid +string and must be written as C<'\\\\HostName\\LMachine\\'>. + +You can also connect to the registry of other computers on your +network. This will be discussed more later. + +Although the Registry does not have a single root key, the +I<Win32::TieRegistry> module creates a virtual root key for you +which has all of the I<HKEY_*> keys as subkeys. + +=head2 Tied Hashes Documentation + +Before you can use a tied hash, you must create one. One way to +do that is via: + + use Win32::TieRegistry ( TiedHash => '%RegHash' ); + +which exports a C<%RegHash> variable into your package and ties it +to the virtual root key of the Registry. An alternate method is: + + my %RegHash; + use Win32::TieRegistry ( TiedHash => \%RegHash ); + +There are also several ways you can tie a hash variable to any +other key of the Registry, which are discussed later. + +Note that you will most likely use C<$Registry> instead of using +a tied hash. C<$Registry> is a reference to a hash that has +been tied to the virtual root of your computer's Registry [as if, +C<$Registry= \%RegHash>]. So you would use C<$Registry-E<gt>{Key}> +rather than C<$RegHash{Key}> and use C<keys %{$Registry}> rather +than C<keys %RegHash>, for example. + +For each hash which has been tied to a Registry key, the Perl +C<keys> function will return a list containing the name of each +of the key's subkeys with a delimiter character appended to it and +containing the name of each of the key's values with a delimiter +prepended to it. For example: + + keys( %{ $Registry->{"HKEY_CLASSES_ROOT\\batfile\\"} } ) + +might yield the following list value: + + ( "DefaultIcon\\", # The subkey named "DefaultIcon" + "shell\\", # The subkey named "shell" + "shellex\\", # The subkey named "shellex" + "\\", # The default value [named ""] + "\\EditFlags" ) # The value named "EditFlags" + +For the virtual root key, short-hand subkey names are used as +shown below. You can use the short-hand name, the regular +I<HKEY_*> name, or any numeric value to access these keys, but +the short-hand names are all that will be returned by the C<keys> +function. + +=over + +=item "Classes" for HKEY_CLASSES_ROOT + +Contains mappings between file name extensions and the uses +for such files along with configuration information for COM +[MicroSoft's Common Object Model] objects. Usually a link to +the C<"SOFTWARE\\Classes"> subkey of the C<HKEY_LOCAL_MACHINE> +key. + +=item "CUser" for HKEY_CURRENT_USER + +Contains information specific to the currently logged-in user. +Mostly software configuration information. Usually a link to +a subkey of the C<HKEY_USERS> key. + +=item "LMachine" for HKEY_LOCAL_MACHINE + +Contains all manner of information about the computer. + +=item "Users" for HKEY_USERS + +Contains one subkey, C<".DEFAULT">, which gets copied to a new +subkey whenever a new user is added. Also contains a subkey for +each user of the system, though only those for active users +[usually only one] are loaded at any given time. + +=item "PerfData" for HKEY_PERFORMANCE_DATA + +Used to access data about system performance. Access via this key +is "special" and all but the most carefully constructed calls will +fail, usually with C<ERROR_INSUFFICIENT_BUFFER>. For example, you +can't enumerate key names without also enumerating values which +require huge buffers but the exact buffer size required cannot be +determined beforehand because C<RegQueryInfoKey()> E<always> fails +with C<ERROR_INSUFFICIENT_BUFFER> for C<HKEY_PERFORMANCE_DATA> no +matter how it is called. So it is currently not very useful to +tie a hash to this key. You can use it to create an object to use +for making carefully constructed calls to the underlying Reg*() +routines. + +=item "CConfig" for HKEY_CURRENT_CONFIG + +Contains minimal information about the computer's current +configuration that is required very early in the boot process. +For example, setting for the display adapter such as screen +resolution and refresh rate are found in here. + +=item "DynData" for HKEY_DYN_DATA + +Dynamic data. We have found no documentation for this key. + +=back + +A tied hash is much like a regular hash variable in Perl -- you give +it a key string inside braces, [C<{> and C<}>], and it gives you +back a value [or lets you set a value]. For I<Win32::TieRegistry> +hashes, there are two types of values that will be returned. + +=over + +=item SubKeys + +If you give it a string which represents a subkey, then it will +give you back a reference to a hash which has been tied to that +subkey. It can't return the hash itself, so it returns a +reference to it. It also blesses that reference so that it is +also an object so you can use it to call method functions. + +=item Values + +If you give it a string which is a value name, then it will give +you back a string which is the data for that value. Alternately, +you can request that it give you both the data value string and +the data value type [we discuss how to request this later]. In +this case, it would return a reference to an array where the value +data string is element C<[0]> and the value data type is element +C<[1]>. + +=back + +The key string which you use in the tied hash must be interpreted +to determine whether it is a value name or a key name or a path +that combines several of these or even other things. There are +two simple rules that make this interpretation easy and +unambiguous: + + Put a delimiter after each key name. + Put a delimiter in front of each value name. + +Exactly how the key string will be intepreted is governed by the +following cases, in the order listed. These cases are designed +to "do what you mean". Most of the time you won't have to think +about them, especially if you follow the two simple rules above. +After the list of cases we give several examples which should be +clear enough so feel free to skip to them unless you are worried +about the details. + +=over + +=item Remote machines + +If the hash is tied to the virtual root of the registry [or the +virtual root of a remote machine's registry], then we treat hash +key strings which start with the delimiter character specially. + +If the hash key string starts with two delimiters in a row, then +those should be immediately followed by the name of a remote +machine whose registry we wish to connect to. That can be +followed by a delimiter and more subkey names, etc. If the +machine name is not following by anything, then a virtual root +for the remote machine's registry is created, a hash is tied to +it, and a reference to that hash it is returned. + +=item Hash key string starts with the delimiter + +If the hash is tied to a virtual root key, then the leading +delimiter is ignored. It should be followed by a valid Registry +root key name [either a short-hand name like C<"LMachine">, an +I<HKEY_*> value, or a numeric value]. This alternate notation is +allowed in order to be more consistant with the C<Open()> method +function. + +For all other Registry keys, the leading delimiter indicates +that the rest of the string is a value name. The leading +delimiter is stripped and the rest of the string [which can +be empty and can contain more delimiters] is used as a value +name with no further parsing. + +=item Exact match with direct subkey name followed by delimiter + +If you have already called the Perl C<keys> function on the tied +hash [or have already called C<MemberNames> on the object] and the +hash key string exactly matches one of the strings returned, then +no further parsing is done. In other words, if the key string +exactly matches the name of a direct subkey with a delimiter +appended, then a reference to a hash tied to that subkey is +returned [but only if C<keys> or C<MemberNames> has already +been called for that tied hash]. + +This is only important if you have selected a delimiter other than +the system default delimiter and one of the subkey names contains +the delimiter you have chosen. This rule allows you to deal with +subkeys which contain your chosen delimiter in their name as long +as you only traverse subkeys one level at a time and always +enumerate the list of members before doing so. + +The main advantage of this is that Perl code which recursively +traverses a hash will work on hashes tied to Registry keys even if +a non-default delimiter has been selected. + +=item Hash key string contains two delimiters in a row + +If the hash key string contains two [or more] delimiters in a row, +then the string is split between the first pair of delimiters. +The first part is interpreted as a subkey name or a path of subkey +names separated by delimiters and with a trailing delimiter. The +second part is interpreted as a value name with one leading +delimiter [any extra delimiters are considered part of the value +name]. + +=item Hash key string ends with a delimiter + +If the key string ends with a delimiter, then it is treated +as a subkey name or path of subkey names separated by delimiters. + +=item Hash key string contains a delimiter + +If the key string contains a delimiter, then it is split after +the last delimiter. The first part is treated as a subkey name or +path of subkey names separated by delimiters. The second part +is ambiguous and is treated as outlined in the next item. + +=item Hash key string contains no delimiters + +If the hash key string contains no delimiters, then it is ambiguous. + +If you are reading from the hash [fetching], then we first use the +key string as a value name. If there is a value with a matching +name in the Registry key which the hash is tied to, then the value +data string [and possibly the value data type] is returned. +Otherwise, we retry by using the hash key string as a subkey name. +If there is a subkey with a matching name, then we return a +reference to a hash tied to that subkey. Otherwise we return +C<undef>. + +If you are writing to the hash [storing], then we use the key +string as a subkey name only if the value you are storing is a +reference to a hash value. Otherwise we use the key string as +a value name. + +=back + +=head3 Examples + +Here are some examples showing different ways of accessing Registry +information using references to tied hashes: + +=over + +=item Canonical value fetch + + $tip18= $Registry->{"HKEY_LOCAL_MACHINE\\Software\\Microsoft\\" + . 'Windows\\CurrentVersion\\Explorer\\Tips\\\\18'}; + +Should return the text of important tip number 18. Note that two +backslashes, C<"\\">, are required to get a single backslash into +a Perl double-quoted or single-qouted string. Note that C<"\\"> +is appended to each key name [C<"HKEY_LOCAL_MACHINE"> through +C<"Tips">] and C<"\\"> is prepended to the value name, C<"18">. + +=item Changing your delimiter + + $Registry->Delimiter("/"); + $tip18= $Registry->{"HKEY_LOCAL_MACHINE/Software/Microsoft/" + . 'Windows/CurrentVersion/Explorer/Tips//18'}; + +This usually makes things easier to read when working in Perl. +All remaining examples will assume the delimiter has been changed +as above. + +=item Using intermediate keys + + $ms= $Registry->{"LMachine/Software/Microsoft/"}; + $tips= $ms->{"Windows/CurrentVersion/Explorer/Tips/"}; + $tip18= $winlogon->{"/18"}; + +Same as above but opens more keys into the Registry which lets you +efficiently re-access those intermediate keys. This is slightly +less efficient if you never reuse those intermediate keys. + +=item Chaining in a single statement + + $tip18= $Registry->{"LMachine/Software/Microsoft/"}-> + {"Windows/CurrentVersion/Explorer/Tips/"}->{"/18"}; + +Like above, this creates intermediate key objects then uses +them to access other data. Once this statement finishes, the +intermediate key objects are destroyed. Several handles into +the Registry are opened and closed by this statement so it is +less efficient but there are times when this will be useful. + +=item Even less efficient example of chaining + + $tip18= $Registry->{"LMachine/Software/Microsoft"}-> + {"Windows/CurrentVersion/Explorer/Tips"}->{"/18"}; + +Because we left off the trailing delimiters, I<Win32::TieRegistry> +doesn't know whether final names, C<"Microsoft"> and C<"Tips">, +are subkey names or value names. So this statement ends up +executing the same code as the next one. + +=item What the above really does + + $tip18= $Registry->{"LMachine/Software/"}->{"Microsoft"}-> + {"Windows/CurrentVersion/Explorer/"}->{"Tips"}->{"/18"}; + +With more chains to go through, more temporary objects are created +and later destroyed than in our first chaining example. Also, +when C<"Microsoft"> is looked up, I<Win32::TieRegistry> first +tries to open it as a value and fails then tries it as a subkey. +The same is true for when it looks up C<"Tips">. + +=item Getting all of the tips + + $tips= $Registry->{"LMachine/Software/Microsoft/"}-> + {"Windows/CurrentVersion/Explorer/Tips/"} + or die "Can't find the Windows tips: $^E\n"; + foreach( keys %$tips ) { + print "$_: ", $tips->{$_}, "\n"; + } + +First notice that we actually check for failure for the first +time. We are assuming that the C<"Tips"> key contains no subkeys. +Otherwise the C<print> statement would show something like +C<"Win32::TieRegistry=HASH(0xc03ebc)"> for each subkey. + +The output from the above code will start something like: + + /0: If you don't know how to do something,[...] + +=back + +=head3 Deleting items + +You can use the Perl C<delete> function to delete a value from a +Registry key or to delete a subkey as long that subkey contains +no subkeys of its own. See L<More Examples>, below, for more +information. + +=head3 Storing items + +You can use the Perl assignment operator [C<=>] to create new +keys, create new values, or replace values. The values you store +should be in the same format as the values you would fetch from a +tied hash. For example, you can use a single assignment statement +to copy an entire Registry tree. The following statement: + + $Registry->{"LMachine/Software/Classes/Tie_Registry/"}= + $Registry->{"LMachine/Software/Classes/batfile/"}; + +creates a C<"Tie_Registry"> subkey under the C<"Software\\Classes"> +subkey of the C<HKEY_LOCAL_MACHINE> key. Then it populates it +with copies of all of the subkeys and values in the C<"batfile"> +subkey and all of its subkeys. Note that you need to have +called C<$Registry-E<gt>ArrayValues(1)> for the proper value data +type information to be copied. Note also that this release of +I<Win32::TieRegistry> does not copy key attributes such as class +name and security information [this is planned for a future release]. + +The following statement creates a whole subtree in the Registry: + + $Registry->{"LMachine/Software/FooCorp/"}= { + "FooWriter/" => { + "/Version" => "4.032", + "Startup/" => { + "/Title" => "Foo Writer Deluxe ][", + "/WindowSize" => [ pack("LL",$wid,$ht), "REG_BINARY" ], + "/TaskBarIcon" => [ "0x0001", "REG_DWORD" ], + }, + "Compatibility/" => { + "/AutoConvert" => "Always", + "/Default Palette" => "Windows Colors", + }, + }, + "/License", => "0123-9C8EF1-09-FC", + }; + +Note that all but the last Registry key used on the left-hand +side of the assignment [that is, "LMachine/Software/" but not +"FooCorp/"] must already exist for this statement to succeed. + +By using the leading a trailing delimiters on each subkey name and +value name, I<Win32::TieRegistry> will tell you if you try to assign +subkey information to a value or visa-versa. + +=head3 More examples + +=over + +=item Adding a new tip + + $tips= $Registry->{"LMachine/Software/Microsoft/"}-> + {"Windows/CurrentVersion/Explorer/Tips/"} + or die "Can't find the Windows tips: $^E\n"; + $tips{'/186'}= "Be very careful when making changes to the Registry!"; + +=item Deleting our new tip + + $tips= $Registry->{"LMachine/Software/Microsoft/"}-> + {"Windows/CurrentVersion/Explorer/Tips/"} + or die "Can't find the Windows tips: $^E\n"; + $tip186= delete $tips{'/186'}; + +Note that Perl's C<delete> function returns the value that was deleted. + +=item Adding a new tip differently + + $Registry->{"LMachine/Software/Microsoft/" . + "Windows/CurrentVersion/Explorer/Tips//186"}= + "Be very careful when making changes to the Registry!"; + +=item Deleting differently + + $tip186= delete $Registry->{"LMachine/Software/Microsoft/Windows/" . + "CurrentVersion/Explorer/Tips//186"}; + +Note that this only deletes the tail of what we looked up, the +C<"186"> value, not any of the keys listed. + +=item Deleting a key + +WARNING: The following code will delete all information about the +current user's tip preferences. Actually executing this command +would probably cause the user to see the Welcome screen the next +time they log in and may cause more serious problems. This +statement is shown as an example only and should not be used when +experimenting. + + $tips= delete $Registry->{"CUser/Software/Microsoft/Windows/" . + "CurrentVersion/Explorer/Tips/"}; + +This deletes the C<"Tips"> key and the values it contains. The +C<delete> function will return a reference to a hash [not a tied +hash] containing the value names and value data that were deleted. + +The information to be returned is copied from the Registry into a +regular Perl hash before the key is deleted. If the key has many +subkeys, this copying could take a significant amount of memory +and/or processor time. So you can disable this process by calling +the C<FastDelete> member function: + + $prevSetting= $regKey->FastDelete(1); + +which will cause all subsequent delete operations via C<$regKey> +to simply return a true value if they succeed. This optimization +is automatically done if you use C<delete> in a void context. + +=item Technical notes on deleting + +If you use C<delete> to delete a Registry key or value and use +the return value, then I<Win32::TieRegistry> usually looks up the +current contents of that key or value so they can be returned if +the deletion is successful. If the deletion succeeds but the +attempt to lookup the old contents failed, then the return value +of C<delete> will be C<$^E> from the failed part of the operation. + +=item Undeleting a key + + $Registry->{"LMachine/Software/Microsoft/Windows/" . + "CurrentVersion/Explorer/Tips/"}= $tips; + +This adds back what we just deleted. Note that this version of +I<Win32::TieRegistry> will use defaults for the key attributes +[such as class name and security] and will not restore the +previous attributes. + +=item Not deleting a key + +WARNING: Actually executing the following code could cause +serious problems. This statement is shown as an example only and +should not be used when experimenting. + + $res= delete $Registry->{"CUser/Software/Microsoft/Windows/"} + defined($res) || die "Can't delete URL key: $^E\n"; + +Since the "Windows" key should contain subkeys, that C<delete> +statement should make no changes to the Registry, return C<undef>, +and set C<$^E> to "Access is denied". + +=item Not deleting again + + $tips= $Registry->{"CUser/Software/Microsoft/Windows/" . + "CurrentVersion/Explorer/Tips/"}; + delete $tips; + +The Perl C<delete> function requires that its argument be an +expression that ends in a hash element lookup [or hash slice], +which is not the case here. The C<delete> function doesn't +know which hash $tips came from and so can't delete it. + +=back + +=head2 Objects Documentation + +The following member functions are defined for use on +I<Win32::TieRegistry> objects: + +=over + +=item new + +The C<new> method creates a new I<Win32::TieRegistry> object. +C<new> is mostly a synonym for C<Open()> so see C<Open()> below for +information on what arguments to pass in. Examples: + + $machKey= new Win32::TieRegistry "LMachine" + or die "Can't access HKEY_LOCAL_MACHINE key: $^E\n"; + $userKey= Win32::TieRegistry->new("CUser") + or die "Can't access HKEY_CURRENT_USER key: $^E\n"; + +Note that calling C<new> via a reference to a tied hash returns +a simple object, not a reference to a tied hash. + +=item Open + +=item $subKey= $key->Open( $sSubKey, $rhOptions ) + +The C<Open> method opens a Registry key and returns a new +I<Win32::TieRegistry> object associated with that Registry key. +If C<Open> is called via a reference to a tied hash, then C<Open> +returns another reference to a tied hash. Otherwise C<Open> +returns a simple object and you should then use C<TiedRef> to get +a reference to a tied hash. + +C<$sSubKey> is a string specifying a subkey to be opened. +Alternately C<$sSubKey> can be a reference to an array value +containing the list of increasingly deep subkeys specifying the +path to the subkey to be opened. + +C<$rhOptions> is an optional reference to a hash containing extra +options. The C<Open> method supports two options, C<"Delimiter"> +and C<"Access">, and C<$rhOptions> should have only have zero or +more of these strings as keys. See the "Examples" section below +for more information. + +The C<"Delimiter"> option specifies what string [usually a single +character] will be used as the delimiter to be appended to subkey +names and prepended to value names. If this option is not specified, +the new key [C<$subKey>] inherits the delimiter of the old key +[C<$key>]. + +The C<"Access"> option specifies what level of access to the +Registry key you wish to have once it has been opened. If this +option is not specified, the new key [C<$subKey>] is opened with +the same access level used when the old key [C<$key>] was opened. +The virtual root of the Registry pretends it was opened with +access C<KEY_READ()|KEY_WRITE()> so this is the default access when +opening keys directory via C<$Registry>. If you don't plan on +modifying a key, you should open it with C<KEY_READ> access as +you may not have C<KEY_WRITE> access to it or some of its subkeys. + +If the C<"Access"> option value is a string that starts with +C<"KEY_">, then it should match E<one> of the predefined access +levels [probably C<"KEY_READ">, C<"KEY_WRITE">, or +C<"KEY_ALL_ACCESS">] exported by the I<Win32API::Registry> module. +Otherwise, a numeric value is expected. For maximum flexibility, +include C<use Win32::TieRegistry qw(:KEY_);>, for example, near +the top of your script so you can specify more complicated access +levels such as C<KEY_READ()|KEY_WRITE()>. + +If C<$sSubKey> does not begin with the delimiter [or C<$sSubKey> +is an array reference], then the path to the subkey to be opened +will be relative to the path of the original key [C<$key>]. If +C<$sSubKey> begins with a single delimiter, then the path to the +subkey to be opened will be relative to the virtual root of the +Registry on whichever machine the original key resides. If +C<$sSubKey> begins with two consectutive delimiters, then those +must be followed by a machine name which causes the C<Connect()> +method function to be called. + +Examples: + + $machKey= $Registry->Open( "LMachine", {Access=>KEY_READ(),Delimiter=>"/"} ) + or die "Can't open HKEY_LOCAL_MACHINE key: $^E\n"; + $swKey= $machKey->Open( "Software" ); + $logonKey= $swKey->Open( "Microsoft/Windows NT/CurrentVersion/Winlogon/" ); + $NTversKey= $swKey->Open( ["Microsoft","Windows NT","CurrentVersion"] ); + $versKey= $swKey->Open( qw(Microsoft Windows CurrentVersion) ); + + $remoteKey= $Registry->Open( "//HostA/LMachine/System/", {Delimiter=>"/"} ) + or die "Can't connect to HostA or can't open subkey: $^E\n"; + +=item Clone + +=item $copy= $key->Clone + +Creates a new object that is associated with the same Registry key +as the invoking object. + +=item Connect + +=item $remoteKey= $Registry->Connect( $sMachineName, $sKeyPath, $rhOptions ) + +The C<Connect> method connects to the Registry of a remote machine, +and opens a key within it, then returns a new I<Win32::TieRegistry> +object associated with that remote Registry key. If C<Connect> +was called using a reference to a tied hash, then the return value +will also be a reference to a tied hash [or C<undef>]. Otherwise, +if you wish to use the returned object as a tied hash [not just as +an object], then use the C<TiedRef> method function after C<Connect>. + +C<$sMachineName> is the name of the remote machine. You don't have +to preceed the machine name with two delimiter characters. + +C<$sKeyPath> is a string specifying the remote key to be opened. +Alternately C<$sKeyPath> can be a reference to an array value +containing the list of increasingly deep keys specifying the path +to the key to be opened. + +C<$rhOptions> is an optional reference to a hash containing extra +options. The C<Connect> method supports two options, C<"Delimiter"> +and C<"Access">. See the C<Open> method documentation for more +information on these options. + +C<$sKeyPath> is already relative to the virtual root of the Registry +of the remote machine. A single leading delimiter on C<sKeyPath> +will be ignored and is not required. + +C<$sKeyPath> can be empty in which case C<Connect> will return an +object representing the virtual root key of the remote Registry. +Each subsequent use of C<Open> on this virtual root key will call +the system C<RegConnectRegistry> function. + +The C<Connect> method can be called via any I<Win32::TieRegistry> +object, not just C<$Registry>. Attributes such as the desired +level of access and the delimiter will be inherited from the +object used but the C<$sKeyPath> will always be relative to the +virtual root of the remote machine's registry. + +Examples: + + $remMachKey= $Registry->Connect( "HostA", "LMachine", {Delimiter->"/"} ) + or die "Can't connect to HostA's HKEY_LOCAL_MACHINE key: $^E\n"; + + $remVersKey= $remMachKey->Connect( "www.microsoft.com", + "LMachine/Software/Microsoft/Inetsrv/CurrentVersion/", + { Access=>KEY_READ, Delimiter=>"/" } ) + or die "Can't check what version of IIS Microsoft is running: $^E\n"; + + $remVersKey= $remMachKey->Connect( "www", + qw(LMachine Software Microsoft Inetsrv CurrentVersion) ) + or die "Can't check what version of IIS we are running: $^E\n"; + +=item ObjectRef + +=item $object_ref= $obj_or_hash_ref->ObjectRef + +For a simple object, just returns itself [C<$obj == $obj->ObjectRef>]. + +For a reference to a tied hash [if it is also an object], C<ObjectRef> +returns the simple object that the hash is tied to. + +This is primarilly useful when debugging since typing C<x $Registry> +will try to display your I<entire> registry contents to your screen. +But the debugger command C<x $Registry->ObjectRef> will just dump +the implementation details of the underlying object to your screen. + +=item Flush( $bFlush ) + +Flushes all cached information about the Registry key so that future +uses will get fresh data from the Registry. + +If the optional C<$bFlush> is specified and a true value, then +C<RegFlushKey()> will be called, which is almost never necessary. + +=item GetValue + +=item $ValueData= $key->GetValue( $sValueName ) + +=item ($ValueData,$ValueType)= $key->GetValue( $sValueName ) + +Gets a Registry value's data and data type. + +C<$ValueData> is usually just a Perl string that contains the +value data [packed into it]. For certain types of data, however, +C<$ValueData> may be processed as described below. + +C<$ValueType> is the C<REG_*> constant describing the type of value +data stored in C<$ValueData>. If the C<DualTypes()> option is on, +then C<$ValueType> will be a dual value. That is, when used in a +numeric context, C<$ValueType> will give the numeric value of a +C<REG_*> constant. However, when used in a non-numeric context, +C<$ValueType> will return the name of the C<REG_*> constant, for +example C<"REG_SZ"> [note the quotes]. So both of the following +can be true at the same time: + + $ValueType == REG_SZ() + $ValueType eq "REG_SZ" + +=over + +=item REG_SZ and REG_EXPAND_SZ + +If the C<FixSzNulls()> option is on, then the trailing C<'\0'> will be +stripped [unless there isn't one] before values of type C<REG_SZ> +and C<REG_EXPAND_SZ> are returned. Note that C<SetValue()> will add +a trailing C<'\0'> under similar circumstances. + +=item REG_MULTI_SZ + +If the C<SplitMultis()> option is on, then values of this type are +returned as a reference to an array containing the strings. For +example, a value that, with C<SplitMultis()> off, would be returned as: + + "Value1\000Value2\000\000" + +would be returned, with C<SplitMultis()> on, as: + + [ "Value1", "Value2" ] + +=item REG_DWORD + +If the C<DualBinVals()> option is on, then the value is returned +as a scalar containing both a string and a number [much like +the C<$!> variable -- see the L<SetDualVar> module for more +information] where the number part is the "unpacked" value. +Use the returned value in a numeric context to access this part +of the value. For example: + + $num= 0 + $Registry->{"CUser/Console//ColorTable01"}; + +If the C<DWordsToHex()> option is off, the string part of the +returned value is a packed, 4-byte string [use C<unpack("L",$value)> +to get the numeric value. + +If C<DWordsToHex()> is on, the string part of the returned value is +a 10-character hex strings [with leading "0x"]. You can use +C<hex($value)> to get the numeric value. + +Note that C<SetValue()> will properly understand each of these +returned value formats no matter how C<DualBinVals()> is set. + +=back + +=item ValueNames + +=item @names= $key->ValueNames + +Returns the list of value names stored directly in a Registry key. +Note that the names returned do I<not> have a delimiter prepended +to them like with C<MemberNames()> and tied hashes. + +Once you request this information, it is cached in the object and +future requests will always return the same list unless C<Flush()> +has been called. + +=item SubKeyNames + +=item @key_names= $key->SubKeyNames + +Returns the list of subkey names stored directly in a Registry key. +Note that the names returned do I<not> have a delimiter appended +to them like with C<MemberNames()> and tied hashes. + +Once you request this information, it is cached in the object and +future requests will always return the same list unless C<Flush()> +has been called. + +=item SubKeyClasses + +=item @classes= $key->SubKeyClasses + +Returns the list of classes for subkeys stored directly in a +Registry key. The classes are returned in the same order as +the subkey names returned by C<SubKeyNames()>. + +=item SubKeyTimes + +=item @times= $key->SubKeyTimes + +Returns the list of last-modified times for subkeys stored +directly in a Registry key. The times are returned in the same +order as the subkey names returned by C<SubKeyNames()>. Each +time is a C<FILETIME> structure packed into a Perl string. + +Once you request this information, it is cached in the object and +future requests will always return the same list unless C<Flush()> +has been called. + +=item MemberNames + +=item @members= $key->MemberNames + +Returns the list of subkey names and value names stored directly +in a Registry key. Subkey names have a delimiter appended to the +end and value names have a delimiter prepended to the front. + +Note that a value name could end in a delimiter [or could be C<""> +so that the member name returned is just a delimiter] so the +presence or absence of the leading delimiter is what should be +used to determine whether a particular name is for a subkey or a +value, not the presence or absence of a trailing delimiter. + +Once you request this information, it is cached in the object and +future requests will always return the same list unless C<Flush()> +has been called. + +=item Information + +=item %info= $key->Information + +=item @items= $key->Information( @itemNames ); + +Returns the following information about a Registry key: + +=over + +=item LastWrite + +A C<FILETIME> structure indicating when the key was last modified +and packed into a Perl string. + +=item CntSubKeys + +The number of subkeys stored directly in this key. + +=item CntValues + +The number of values stored directly in this key. + +=item SecurityLen + +The length [in bytes] of the largest[?] C<SECURITY_DESCRIPTOR> +associated with the Registry key. + +=item MaxValDataLen + +The length [in bytes] of the longest value data associated with +a value stored in this key. + +=item MaxSubKeyLen + +The length [in chars] of the longest subkey name associated with +a subkey stored in this key. + +=item MaxSubClassLen + +The length [in chars] of the longest class name associated with +a subkey stored directly in this key. + +=item MaxValNameLen + +The length [in chars] of the longest value name associated with +a value stored in this key. + +=back + +With no arguments, returns a hash [not a reference to a hash] where +the keys are the names for the items given above and the values +are the information describe above. For example: + + %info= ( "CntValues" => 25, # Key contains 25 values. + "MaxValNameLen" => 20, # One of which has a 20-char name. + "MaxValDataLen" => 42, # One of which has a 42-byte value. + "CntSubKeys" => 1, # Key has 1 immediate subkey. + "MaxSubKeyLen" => 13, # One of which has a 12-char name. + "MaxSubClassLen" => 0, # All of which have class names of "". + "SecurityLen" => 232, # One SECURITY_DESCRIPTOR is 232 bytes. + "LastWrite" => "\x90mZ\cX{\xA3\xBD\cA\c@\cA" + # Key was last modifed 1998/06/01 16:29:32 GMT + ); + +With arguments, each one must be the name of a item given above. +The return value is the information associated with the listed +names. In other words: + + return $key->Information( @names ); + +returns the same list as: + + %info= $key->Information; + return @info{@names}; + +=item Delimiter + +=item $oldDelim= $key->Delimiter + +=item $oldDelim= $key->Delimiter( $newDelim ) + +Gets and possibly changes the delimiter used for this object. The +delimiter is appended to subkey names and prepended to value names +in many return values. It is also used when parsing keys passed +to tied hashes. + +The delimiter defaults to backslash (C<'\\'>) but is inherited from +the object used to create a new object and can be specified by an +option when a new object is created. + +=item Handle + +=item $handle= $key->Handle + +Returns the raw C<HKEY> handle for the associated Registry key as +an integer value. This value can then be used to Reg*() calls +from I<Win32API::Registry>. However, it is usually easier to just +call the I<Win32API::Registry> calls directly via: + + $key->RegNotifyChangeKeyValue( ... ); + +For the virtual root of the local or a remote Registry, +C<Handle()> return C<"NONE">. + +=item Path + +=item $path= $key->Path + +Returns a string describing the path of key names to this +Registry key. The string is built so that if it were passed +to C<$Registry->Open()>, it would reopen the same Registry key +[except in the rare case where one of the key names contains +C<$key->Delimiter>]. + +=item Machine + +=item $computerName= $key->Machine + +Returns the name of the computer [or "machine"] on which this Registry +key resides. Returns C<""> for local Registry keys. + +=item Access + +Returns the numeric value of the bit mask used to specify the +types of access requested when this Registry key was opened. Can +be compared to C<KEY_*> values. + +=item OS_Delimiter + +Returns the delimiter used by the operating system's RegOpenKeyEx() +call. For Win32, this is always backslash (C<"\\">). + +=item Roots + +Returns the mapping from root key names like C<"LMachine"> to their +associated C<HKEY_*> constants. Primarily for internal use and +subject to change. + +=item Tie + +=item $key->Tie( \%hash ); + +Ties the referenced hash to that Registry key. Pretty much the +same as + + tie %hash, ref($key), $key; + +Since C<ref($key)> is the class [package] to tie the hash to and +C<TIEHASH()> just returns its argument, C<$key>, [without calling +C<new()>] when it sees that it is already a blessed object. + +=item TiedRef + +=item $TiedHashRef= $hash_or_obj_ref->TiedRef + +For a simple object, returns a reference to a hash tied to the +object. Used to promote a simple object into a combined object +and hash ref. + +If already a reference to a tied hash [that is also an object], +it just returns itself [C<$ref == $ref->TiedRef>]. + +Mostly used internally. + +=item ArrayValues + +=item $oldBool= $key->ArrayValues + +=item $oldBool= $key->ArrayValues( $newBool ) + +Gets the current setting of the C<ArrayValues> option and possibly +turns it on or off. + +When off, Registry values fetched via a tied hash are returned as +just a value scalar [the same as C<GetValue()> in a scalar context]. +When on, they are returned as a reference to an array containing +the value data as the C<[0]> element and the data type as the C<[1]> +element. + +=item TieValues + +=item $oldBool= TieValues + +=item $oldBool= TieValues( $newBool ) + +Gets the current setting of the C<TieValues> option and possibly +turns it on or off. + +Turning this option on is not yet supported in this release of +I<Win32::TieRegistry>. In a future release, turning this option +on will cause Registry values returned from a tied hash to be +a tied array that you can use to modify the value in the Registry. + +=item FastDelete + +=item $oldBool= $key->FastDelete + +=item $oldBool= $key->FastDelete( $newBool ) + +Gets the current setting of the C<FastDelete> option and possibly +turns it on or off. + +When on, successfully deleting a Registry key [via a tied hash] +simply returns C<1>. + +When off, successfully deleting a Registry key [via a tied hash +and not in a void context] returns a reference to a hash that +contains the values present in the key when it was deleted. This +hash is just like that returned when referencing the key before it +was deleted except that it is an ordinary hash, not one tied to +the I<Win32::TieRegistry> package. + +Note that deleting either a Registry key or value via a tied hash +I<in a void context> prevents any overhead in trying to build an +appropriate return value. + +Note that deleting a Registry I<value> via a tied hash [not in +a void context] returns the value data even if <FastDelete> is on. + +=item SplitMultis + +=item $oldBool= $key->SplitMultis + +=item $oldBool= $key->SplitMultis( $newBool ) + +Gets the current setting of the C<SplitMultis> option and possibly +turns it on or off. + +If on, Registry values of type C<REG_MULTI_SZ> are returned as +a reference to an array of strings. See C<GetValue()> for more +information. + +=item DWordsToHex + +=item $oldBool= $key->DWordsToHex + +=item $oldBool= $key->DWordsToHex( $newBool ) + +Gets the current setting of the C<DWordsToHex> option and possibly +turns it on or off. + +If on, Registry values of type C<REG_DWORD> are returned as a hex +string with leading C<"0x"> and longer than 4 characters. See +C<GetValue()> for more information. + +=item FixSzNulls + +=item $oldBool= $key->FixSzNulls + +=item $oldBool= $key->FixSzNulls( $newBool ) + +Gets the current setting of the C<FixSzNulls> option and possibly +turns it on or off. + +If on, Registry values of type C<REG_SZ> and C<REG_EXPAND_SZ> have +trailing C<'\0'>s added before they are set and stripped before +they are returned. See C<GetValue()> and C<SetValue()> for more +information. + +=item DualTypes + +=item $oldBool= $key->DualTypes + +=item $oldBool= $key->DualTypes( $newBool ) + +Gets the current setting of the C<DualTypes> option and possibly +turns it on or off. + +If on, data types are returned as a combined numeric/string value +holding both the numeric value of a C<REG_*> constant and the +string value of the constant's name. See C<GetValue()> for +more information. + +=item DualBinVals + +=item $oldBool= $key->DualBinVals + +=item $oldBool= $key->DualBinVals( $newBool ) + +Gets the current setting of the C<DualBinVals> option and possibly +turns it on or off. + +If on, Registry value data of type C<REG_BINARY> and no more than +4 bytes long and Registry values of type C<REG_DWORD> are returned +as a combined numeric/string value where the numeric value is the +"unpacked" binary value as returned by: + + hex reverse unpack( "h*", $valData ) + +on a "little-endian" computer. [Would be C<hex unpack("H*",$valData)> +on a "big-endian" computer if this module is ever ported to one.] + +See C<GetValue()> for more information. + +=item GetOptions + +=item @oldOptValues= $key->GetOptions( @optionNames ) + +=item $refHashOfOldOpts= $key->GetOptions() + +=item $key->GetOptions( \%hashForOldOpts ) + +Returns the current setting of any of the following options: + + Delimiter FixSzNulls DWordsToHex + ArrayValues SplitMultis DualBinVals + TieValues FastDelete DualTypes + +Pass in one or more of the above names (as strings) to get back +an array of the corresponding current settings in the same order: + + my( $fastDel, $delim )= $key->GetOptions("FastDelete","Delimiter"); + +Pass in no arguments to get back a reference to a hash where +the above option names are the keys and the values are +the corresponding current settings for each option: + + my $href= $key->GetOptions(); + my $delim= $href->{Delimiter}; + +Pass in a single reference to a hash to have the above key/value +pairs I<added> to the referenced hash. For this case, the +return value is the original object so further methods can be +chained after the call to GetOptions: + + my %oldOpts; + $key->GetOptions( \%oldOpts )->SetOptions( Delimiter => "/" ); + +=item SetOptions + +=item @oldOpts= $key->SetOptions( optNames=>$optValue,... ) + +Changes the current setting of any of the following options, +returning the previous setting(s): + + Delimiter FixSzNulls DWordsToHex AllowLoad + ArrayValues SplitMultis DualBinVals AllowSave + TieValues FastDelete DualTypes + +For C<AllowLoad> and C<AllowSave>, instead of the previous +setting, C<SetOptions> returns whether or not the change was +successful. + +In a scalar context, returns only the last item. The last +option can also be specified as C<"ref"> or C<"r"> [which doesn't +need to be followed by a value] to allow chaining: + + $key->SetOptions(AllowSave=>1,"ref")->RegSaveKey(...) + +=item SetValue + +=item $okay= $key->SetValue( $ValueName, $ValueData ); + +=item $okay= $key->SetValue( $ValueName, $ValueData, $ValueType ); + +Adds or replaces a Registry value. Returns a true value if +successfully, false otherwise. + +C<$ValueName> is the name of the value to add or replace and +should I<not> have a delimiter prepended to it. Case is ignored. + +C<$ValueType> is assumed to be C<REG_SZ> if it is omitted. Otherwise, +it should be one the C<REG_*> constants. + +C<$ValueData> is the data to be stored in the value, probably packed +into a Perl string. Other supported formats for value data are +listed below for each posible C<$ValueType>. + +=over + +=item REG_SZ or REG_EXPAND_SZ + +The only special processing for these values is the addition of +the required trailing C<'\0'> if it is missing. This can be +turned off by disabling the C<FixSzNulls> option. + +=item REG_MULTI_SZ + +These values can also be specified as a reference to a list of +strings. For example, the following two lines are equivalent: + + $key->SetValue( "Val1\000Value2\000LastVal\000\000", "REG_MULTI_SZ" ); + $key->SetValue( ["Val1","Value2","LastVal"], "REG_MULTI_SZ" ); + +Note that if the required two trailing nulls (C<"\000\000">) are +missing, then this release of C<SetValue()> will I<not> add them. + +=item REG_DWORD + +These values can also be specified as a hex value with the leading +C<"0x"> included and totaling I<more than> 4 bytes. These will be +packed into a 4-byte string via: + + $data= pack( "L", hex($data) ); + +=item REG_BINARY + +This value type is listed just to emphasize that no alternate +format is supported for it. In particular, you should I<not> pass +in a numeric value for this type of data. C<SetValue()> cannot +distinguish such from a packed string that just happens to match +a numeric value and so will treat it as a packed string. + +=back + +An alternate calling format: + + $okay= $key->SetValue( $ValueName, [ $ValueData, $ValueType ] ); + +[two arguments, the second of which is a reference to an array +containing the value data and value type] is supported to ease +using tied hashes with C<SetValue()>. + +=item CreateKey + +=item $newKey= $key->CreateKey( $subKey ); + +=item $newKey= $key->CreateKey( $subKey, { Option=>OptVal,... } ); + +Creates a Registry key or just updates attributes of one. Calls +C<RegCreateKeyEx()> then, if it succeeded, creates an object +associated with the [possibly new] subkey. + +C<$subKey> is the name of a subkey [or a path to one] to be +created or updated. It can also be a reference to an array +containing a list of subkey names. + +The second argument, if it exists, should be a reference to a +hash specifying options either to be passed to C<RegCreateKeyEx()> +or to be used when creating the associated object. The following +items are the supported keys for this options hash: + +=over + +=item Delimiter + +Specifies the delimiter to be used to parse C<$subKey> and to be +used in the new object. Defaults to C<$key->Delimiter>. + +=item Access + +Specifies the types of access requested when the subkey is opened. +Should be a numeric bit mask that combines one or more C<KEY_*> +constant values. + +=item Class + +The name to assign as the class of the new or updated subkey. +Defaults to C<""> as we have never seen a use for this information. + +=item Disposition + +Lets you specify a reference to a scalar where, upon success, will be +stored either C<REG_CREATED_NEW_KEY()> or C<REG_OPENED_EXISTING_KEY()> +depending on whether a new key was created or an existing key was +opened. + +If you, for example, did C<use Win32::TieRegistry qw(REG_CREATED_NEW_KEY)> +then you can use C<REG_CREATED_NEW_KEY()> to compare against the numeric +value stored in the referenced scalar. + +If the C<DualTypes> option is enabled, then in addition to the +numeric value described above, the referenced scalar will also +have a string value equal to either C<"REG_CREATED_NEW_KEY"> or +C<"REG_OPENED_EXISTING_KEY">, as appropriate. + +=item Security + +Lets you specify a C<SECURITY_ATTRIBUTES> structure packed into a +Perl string. See C<Win32API::Registry::RegCreateKeyEx()> for more +information. + +=item Volatile + +If true, specifies that the new key should be volatile, that is, +stored only in memory and not backed by a hive file [and not saved +if the computer is rebooted]. This option is ignored under +Windows 95. Specifying C<Volatile=E<GT>1> is the same as +specifying C<Options=E<GT>REG_OPTION_VOLATILE>. + +=item Backup + +If true, specifies that the new key should be opened for +backup/restore access. The C<Access> option is ignored. If the +calling process has enabled C<"SeBackupPrivilege">, then the +subkey is opened with C<KEY_READ> access as the C<"LocalSystem"> +user which should have access to all subkeys. If the calling +process has enabled C<"SeRestorePrivilege">, then the subkey is +opened with C<KEY_WRITE> access as the C<"LocalSystem"> user which +should have access to all subkeys. + +This option is ignored under Windows 95. Specifying C<Backup=E<GT>1> +is the same as specifying C<Options=E<GT>REG_OPTION_BACKUP_RESTORE>. + +=item Options + +Lets you specify options to the C<RegOpenKeyEx()> call. The value +for this option should be a numeric value combining zero or more +of the C<REG_OPTION_*> bit masks. You may with to used the +C<Volatile> and/or C<Backup> options instead of this one. + +=back + +=item StoreKey + +=item $newKey= $key->StoreKey( $subKey, \%Contents ); + +Primarily for internal use. + +Used to create or update a Registry key and any number of subkeys +or values under it or its subkeys. + +C<$subKey> is the name of a subkey to be created [or a path of +subkey names separated by delimiters]. If that subkey already +exists, then it is updated. + +C<\%Contents> is a reference to a hash containing pairs of +value names with value data and/or subkey names with hash +references similar to C<\%Contents>. Each of these cause +a value or subkey of C<$subKey> to be created or updated. + +If C<$Contents{""}> exists and is a reference to a hash, then +it used as the options argument when C<CreateKey()> is called +for C<$subKey>. This allows you to specify ... + + if( defined( $$data{""} ) && "HASH" eq ref($$data{""}) ) { + $self= $this->CreateKey( $subKey, delete $$data{""} ); + +=item Load + +=item $newKey= $key->Load( $file ) + +=item $newKey= $key->Load( $file, $newSubKey ) + +=item $newKey= $key->Load( $file, $newSubKey, { Option=>OptVal... } ) + +=item $newKey= $key->Load( $file, { Option=>OptVal... } ) + +Loads a hive file into a Registry. That is, creates a new subkey +and associates a hive file with it. + +C<$file> is a hive file, that is a file created by calling +C<RegSaveKey()>. The C<$file> path is interpreted relative to +C<%SystemRoot%/System32/config> on the machine where C<$key> +resides. + +C<$newSubKey> is the name to be given to the new subkey. If +C<$newSubKey> is specified, then C<$key> must be +C<HKEY_LOCAL_MACHINE> or C<HKEY_USERS> of the local computer +or a remote computer and C<$newSubKey> should not contain any +occurrences of either the delimiter or the OS delimiter. + +If C<$newSubKey> is not specified, then it is as if C<$key> +was C<$Registry-E<GT>{LMachine}> and C<$newSubKey> is +C<"PerlTie:999"> where C<"999"> is actually a sequence number +incremented each time this process calls C<Load()>. + +You can specify as the last argument a reference to a hash +containing options. You can specify the same options that you +can specify to C<Open()>. See C<Open()> for more information on +those. In addition, you can specify the option C<"NewSubKey">. +The value of this option is interpretted exactly as if it was +specified as the C<$newSubKey> parameter and overrides the +C<$newSubKey> if one was specified. + +The hive is automatically unloaded when the returned object +[C<$newKey>] is destroyed. Registry key objects opened within +the hive will keep a reference to the C<$newKey> object so that +it will not be destroyed before these keys are closed. + +=item UnLoad + +=item $okay= $key->UnLoad + +Unloads a hive that was loaded via C<Load()>. Cannot unload other +hives. C<$key> must be the return from a previous call to C<Load()>. +C<$key> is closed and then the hive is unloaded. + +=item AllowSave + +=item $okay= AllowSave( $bool ) + +Enables or disables the C<"ReBackupPrivilege"> privilege for the +current process. You will probably have to enable this privilege +before you can use C<RegSaveKey()>. + +The return value indicates whether the operation succeeded, not +whether the privilege was previously enabled. + +=item AllowLoad + +=item $okay= AllowLoad( $bool ) + +Enables or disables the C<"ReRestorePrivilege"> privilege for the +current process. You will probably have to enable this privilege +before you can use C<RegLoadKey()>, C<RegUnLoadKey()>, +C<RegReplaceKey()>, or C<RegRestoreKey> and thus C<Load()> and +C<UnLoad()>. + +The return value indicates whether the operation succeeded, not +whether the privilege was previously enabled. + +=back + +=head2 Exports [C<use> and C<import()>] + +To have nothing imported into your package, use something like: + + use Win32::TieRegistry 0.20 (); + +which would verify that you have at least version 0.20 but wouldn't +call C<import()>. The F<Changes> file can be useful in figuring out +which, if any, prior versions of I<Win32::TieRegistry> you want to +support in your script. + +The code + + use Win32::TieRegistry; + +imports the variable C<$Registry> into your package and sets it +to be a reference to a hash tied to a copy of the master Registry +virtual root object with the default options. One disadvantage +to this "default" usage is that Perl does not support checking +the module version when you use it. + +Alternately, you can specify a list of arguments on the C<use> +line that will be passed to the C<Win32::TieRegistry->import()> +method to control what items to import into your package. These +arguments fall into the following broad categories: + +=over + +=item Import a reference to a hash tied to a Registry virtual root + +You can request that a scalar variable be imported (possibly) +and set to be a reference to a hash tied to a Registry virtual root +using any of the following types of arguments or argument pairs: + +=over + +=item "TiedRef", '$scalar' + +=item "TiedRef", '$pack::scalar' + +=item "TiedRef", 'scalar' + +=item "TiedRef", 'pack::scalar' + +All of the above import a scalar named C<$scalar> into your package +(or the package named "pack") and then sets it. + +=item '$scalar' + +=item '$pack::scalar' + +These are equivalent to the previous items to support a more +traditional appearance to the list of exports. Note that the +scalar name cannot be "RegObj" here. + +=item "TiedRef", \$scalar + +=item \$scalar + +These versions don't import anything but set the referenced C<$scalar>. + +=back + +=item Import a hash tied to the Registry virtual root + +You can request that a hash variable be imported (possibly) +and tied to a Registry virtual root using any of the following +types of arguments or argument pairs: + +=over + +=item "TiedHash", '%hash' + +=item "TiedHash", '%pack::hash' + +=item "TiedHash", 'hash' + +=item "TiedHash", 'pack::hash' + +All of the above import a hash named C<%hash> into your package +(or the package named "pack") and then sets it. + +=item '%hash' + +=item '%pack::hash' + +These are equivalent to the previous items to support a more +traditional appearance to the list of exports. + +=item "TiedHash", \%hash + +=item \%hash + +These versions don't import anything but set the referenced C<%hash>. + +=back + +=item Import a Registry virtual root object + +You can request that a scalar variable be imported (possibly) +and set to be a Registry virtual root object using any of the +following types of arguments or argument pairs: + +=over + +=item "ObjectRef", '$scalar' + +=item "ObjectRef", '$pack::scalar' + +=item "ObjectRef", 'scalar' + +=item "ObjectRef", 'pack::scalar' + +All of the above import a scalar named C<$scalar> into your package +(or the package named "pack") and then sets it. + +=item '$RegObj' + +This is equivalent to the previous items for backward compatibility. + +=item "ObjectRef", \$scalar + +This version doesn't import anything but sets the referenced C<$scalar>. + +=back + +=item Import constant(s) exported by I<Win32API::Registry> + +You can list any constants that are exported by I<Win32API::Registry> +to have them imported into your package. These constants have names +starting with "KEY_" or "REG_" (or even "HKEY_"). + +You can also specify C<":KEY_">, C<":REG_">, and even C<":HKEY_"> to +import a whole set of constants. + +See I<Win32API::Registry> documentation for more information. + +=item Options + +You can list any option names that can be listed in the C<SetOptions()> +method call, each folowed by the value to use for that option. +A Registry virtual root object is created, all of these options are +set for it, then each variable to be imported/set is associated with +this object. + +In addition, the following special options are supported: + +=over + +=item ExportLevel + +Whether to import variables into your package or some +package that uses your package. Defaults to the value of +C<$Exporter::ExportLevel> and has the same meaning. See +the L<Exporter> module for more information. + +=item ExportTo + +The name of the package to import variables and constants into. +Overrides I<ExportLevel>. + +=back + +=back + +=head3 Specifying constants in your Perl code + +This module was written with a strong emphasis on the convenience of +the module user. Therefore, most places where you can specify a +constant like C<REG_SZ()> also allow you to specify a string +containing the name of the constant, C<"REG_SZ">. This is convenient +because you may not have imported that symbolic constant. + +Perl also emphasizes programmer convenience so the code C<REG_SZ> +can be used to mean C<REG_SZ()> or C<"REG_SZ"> or be illegal. +Note that using C<®_SZ> (as we've seen in much Win32 Perl code) +is not a good idea since it passes the current C<@_> to the +C<constant()> routine of the module which, at the least, can give +you a warning under B<-w>. + +Although greatly a matter of style, the "safest" practice is probably +to specifically list all constants in the C<use Win32::TieRegistry> +statement, specify C<use strict> [or at least C<use strict qw(subs)>], +and use bare constant names when you want the numeric value. This will +detect mispelled constant names at compile time. + + use strict; + my $Registry; + use Win32::TieRegistry 0.20 ( + TiedRef => \$Registry, Delimiter => "/", ArrayValues => 1, + SplitMultis => 1, AllowLoad => 1, + qw( REG_SZ REG_EXPAND_SZ REG_DWORD REG_BINARY REG_MULTI_SZ + KEY_READ KEY_WRITE KEY_ALL_ACCESS ), + ); + $Registry->{"LMachine/Software/FooCorp/"}= { + "FooWriter/" => { + "/Fonts" => [ ["Times","Courier","Lucinda"], REG_MULTI_SZ ], + "/WindowSize" => [ pack("LL",24,80), REG_BINARY ], + "/TaskBarIcon" => [ "0x0001", REG_DWORD ], + }, + } or die "Can't create Software/FooCorp/: $^E\n"; + +If you don't want to C<use strict qw(subs)>, the second safest practice +is similar to the above but use the C<REG_SZ()> form for constants +when possible and quoted constant names when required. Note that +C<qw()> is a form of quoting. + + use Win32::TieRegistry 0.20 qw( + TiedRef $Registry + Delimiter / ArrayValues 1 SplitMultis 1 AllowLoad 1 + REG_SZ REG_EXPAND_SZ REG_DWORD REG_BINARY REG_MULTI_SZ + KEY_READ KEY_WRITE KEY_ALL_ACCESS + ); + $Registry->{"LMachine/Software/FooCorp/"}= { + "FooWriter/" => { + "/Fonts" => [ ["Times","Courier","Lucinda"], REG_MULTI_SZ() ], + "/WindowSize" => [ pack("LL",24,80), REG_BINARY() ], + "/TaskBarIcon" => [ "0x0001", REG_DWORD() ], + }, + } or die "Can't create Software/FooCorp/: $^E\n"; + +The examples in this document mostly use quoted constant names +(C<"REG_SZ">) since that works regardless of which constants +you imported and whether or not you have C<use strict> in your +script. It is not the best choice for you to use for real +scripts (vs. examples) because it is less efficient and is not +supported by most other similar modules. + +=head1 SUMMARY + +Most things can be done most easily via tied hashes. Skip down to the +the L<Tied Hashes Summary> to get started quickly. + +=head2 Objects Summary + +Here are quick examples that document the most common functionality +of all of the method functions [except for a few almost useless ones]. + + # Just another way of saying Open(): + $key= new Win32::TieRegistry "LMachine\\Software\\", + { Access=>KEY_READ()|KEY_WRITE(), Delimiter=>"\\" }; + + # Open a Registry key: + $subKey= $key->Open( "SubKey/SubSubKey/", + { Access=>KEY_ALL_ACCESS, Delimiter=>"/" } ); + + # Connect to a remote Registry key: + $remKey= $Registry->Connect( "MachineName", "LMachine/", + { Access=>KEY_READ, Delimiter=>"/" } ); + + # Get value data: + $valueString= $key->GetValue("ValueName"); + ( $valueString, $valueType )= $key->GetValue("ValueName"); + + # Get list of value names: + @valueNames= $key->ValueNames; + + # Get list of subkey names: + @subKeyNames= $key->SubKeyNames; + + # Get combined list of value names (with leading delimiters) + # and subkey names (with trailing delimiters): + @memberNames= $key->MemberNames; + + # Get all information about a key: + %keyInfo= $key->Information; + # keys(%keyInfo)= qw( Class LastWrite SecurityLen + # CntSubKeys MaxSubKeyLen MaxSubClassLen + # CntValues MaxValNameLen MaxValDataLen ); + + # Get selected information about a key: + ( $class, $cntSubKeys )= $key->Information( "Class", "CntSubKeys" ); + + # Get and/or set delimiter: + $delim= $key->Delimiter; + $oldDelim= $key->Delimiter( $newDelim ); + + # Get "path" for an open key: + $path= $key->Path; + # For example, "/CUser/Control Panel/Mouse/" + # or "//HostName/LMachine/System/DISK/". + + # Get name of machine where key is from: + $mach= $key->Machine; + # Will usually be "" indicating key is on local machine. + + # Control different options (see main documentation for descriptions): + $oldBool= $key->ArrayValues( $newBool ); + $oldBool= $key->FastDelete( $newBool ); + $oldBool= $key->FixSzNulls( $newBool ); + $oldBool= $key->SplitMultis( $newBool ); + $oldBool= $key->DWordsToHex( $newBool ); + $oldBool= $key->DualBinVals( $newBool ); + $oldBool= $key->DualTypes( $newBool ); + @oldBools= $key->SetOptions( ArrayValues=>1, FastDelete=>1, FixSzNulls=>0, + Delimiter=>"/", AllowLoad=>1, AllowSave=>1 ); + @oldBools= $key->GetOptions( ArrayValues, FastDelete, FixSzNulls ); + + # Add or set a value: + $key->SetValue( "ValueName", $valueDataString ); + $key->SetValue( "ValueName", pack($format,$valueData), "REG_BINARY" ); + + # Add or set a key: + $key->CreateKey( "SubKeyName" ); + $key->CreateKey( "SubKeyName", + { Access=>"KEY_ALL_ACCESS", Class=>"ClassName", + Delimiter=>"/", Volatile=>1, Backup=>1 } ); + + # Load an off-line Registry hive file into the on-line Registry: + $newKey= $Registry->Load( "C:/Path/To/Hive/FileName" ); + $newKey= $key->Load( "C:/Path/To/Hive/FileName", "NewSubKeyName", + { Access=>"KEY_READ" } ); + # Unload a Registry hive file loaded via the Load() method: + $newKey->UnLoad; + + # (Dis)Allow yourself to load Registry hive files: + $success= $Registry->AllowLoad( $bool ); + + # (Dis)Allow yourself to save a Registry key to a hive file: + $success= $Registry->AllowSave( $bool ); + + # Save a Registry key to a new hive file: + $key->RegSaveKey( "C:/Path/To/Hive/FileName", [] ); + +=head3 Other Useful Methods + +See I<Win32API::Registry> for more information on these methods. +These methods are provided for coding convenience and are +identical to the I<Win32API::Registry> functions except that these +don't take a handle to a Registry key, instead getting the handle +from the invoking object [C<$key>]. + + $key->RegGetKeySecurity( $iSecInfo, $sSecDesc, $lenSecDesc ); + $key->RegLoadKey( $sSubKeyName, $sPathToFile ); + $key->RegNotifyChangeKeyValue( + $bWatchSubtree, $iNotifyFilter, $hEvent, $bAsync ); + $key->RegQueryMultipleValues( + $structValueEnts, $cntValueEnts, $Buffer, $lenBuffer ); + $key->RegReplaceKey( $sSubKeyName, $sPathToNewFile, $sPathToBackupFile ); + $key->RegRestoreKey( $sPathToFile, $iFlags ); + $key->RegSetKeySecurity( $iSecInfo, $sSecDesc ); + $key->RegUnLoadKey( $sSubKeyName ); + +=head2 Tied Hashes Summary + +For fast learners, this may be the only section you need to read. +Always append one delimiter to the end of each Registry key name +and prepend one delimiter to the front of each Registry value name. + +=head3 Opening keys + + use Win32::TieRegistry ( Delimiter=>"/", ArrayValues=>1 ); + $Registry->Delimiter("/"); # Set delimiter to "/". + $swKey= $Registry->{"LMachine/Software/"}; + $winKey= $swKey->{"Microsoft/Windows/CurrentVersion/"}; + $userKey= $Registry-> + {"CUser/Software/Microsoft/Windows/CurrentVersion/"}; + $remoteKey= $Registry->{"//HostName/LMachine/"}; + +=head3 Reading values + + $progDir= $winKey->{"/ProgramFilesDir"}; # "C:\\Program Files" + $tip21= $winKey->{"Explorer/Tips//21"}; # Text of tip #21. + + $winKey->ArrayValues(1); + ( $devPath, $type )= $winKey->{"/DevicePath"}; + # $devPath eq "%SystemRoot%\\inf" + # $type eq "REG_EXPAND_SZ" [if you have SetDualVar.pm installed] + # $type == REG_EXPAND_SZ() [if did C<use Win32::TieRegistry qw(:REG_)>] + +=head3 Setting values + + $winKey->{"Setup//SourcePath"}= "\\\\SwServer\\SwShare\\Windows"; + # Simple. Assumes data type of REG_SZ. + + $winKey->{"Setup//Installation Sources"}= + [ "D:\x00\\\\SwServer\\SwShare\\Windows\0\0", "REG_MULTI_SZ" ]; + # "\x00" and "\0" used to mark ends of each string and end of list. + + $winKey->{"Setup//Installation Sources"}= + [ ["D:","\\\\SwServer\\SwShare\\Windows"], "REG_MULTI_SZ" ]; + # Alternate method that is easier to read. + + $userKey->{"Explorer/Tips//DisplayInitialTipWindow"}= + [ pack("L",0), "REG_DWORD" ]; + $userKey->{"Explorer/Tips//Next"}= [ pack("S",3), "REG_BINARY" ]; + $userKey->{"Explorer/Tips//Show"}= [ pack("L",0), "REG_BINARY" ]; + +=head3 Adding keys + + $swKey->{"FooCorp/"}= { + "FooWriter/" => { + "/Version" => "4.032", + "Startup/" => { + "/Title" => "Foo Writer Deluxe ][", + "/WindowSize" => [ pack("LL",$wid,$ht), "REG_BINARY" ], + "/TaskBarIcon" => [ "0x0001", "REG_DWORD" ], + }, + "Compatibility/" => { + "/AutoConvert" => "Always", + "/Default Palette" => "Windows Colors", + }, + }, + "/License", => "0123-9C8EF1-09-FC", + }; + +=head3 Listing all subkeys and values + + @members= keys( %{$swKey} ); + @subKeys= grep( m#^/#, keys( %{$swKey->{"Classes/batfile/"}} ) ); + # @subKeys= ( "/", "/EditFlags" ); + @valueNames= grep( ! m#^/#, keys( %{$swKey->{"Classes/batfile/"}} ) ); + # @valueNames= ( "DefaultIcon/", "shell/", "shellex/" ); + +=head3 Deleting values or keys with no subkeys + + $oldValue= delete $userKey->{"Explorer/Tips//Next"}; + + $oldValues= delete $userKey->{"Explorer/Tips/"}; + # $oldValues will be reference to hash containing deleted keys values. + +=head3 Closing keys + + undef $swKey; # Explicit way to close a key. + $winKey= "Anything else"; # Implicitly closes a key. + exit 0; # Implicitly closes all keys. + +=head2 Tie::Registry + +This module was originally called I<Tie::Registry>. Changing code +that used I<Tie::Registry> over to I<Win32::TieRegistry> is trivial +as the module name should only be mentioned once, in the C<use> +line. However, finding all of the places that used I<Tie::Registry> +may not be completely trivial so we have included F<Tie/Registry.pm> +which you can install to provide backward compatibility. + +=head1 AUTHOR + +Tye McQueen. See http://www.metronet.com/~tye/ or e-mail +tye@metronet.com with bug reports. + +=head1 SEE ALSO + +I<Win32API::Registry> - Provides access to C<Reg*()>, C<HKEY_*>, +C<KEY_*>, C<REG_*> [required]. + +I<Win32::WinError> - Defines C<ERROR_*> values [optional]. + +L<SetDualVar> - For returning C<REG_*> values as combined +string/integer values [optional]. + +=head1 BUGS + +Perl5.004_02 has bugs that make I<Win32::TieRegistry> fail in +strange and subtle ways. + +Using I<Win32::TieRegistry> with versions of Perl prior to 5.005 +can be tricky or impossible. Most notes about this have been +removed from the documentation (they get rather complicated +and confusing). This includes references to C<$^E> perhaps not +being meaningful. + +Because Perl hashes are case sensitive, certain lookups are also +case sensistive. In particular, the root keys ("Classes", "CUser", +"LMachine", "Users", "PerfData", "CConfig", "DynData", and HKEY_*) +must always be entered without changing between upper and lower +case letters. Also, the special rule for matching subkey names +that contain the user-selected delimiter only works if case is +matched. All other key name and value name lookups should be case +insensitive because the underlying Reg*() calls ignore case. + +Information about each key is cached when using a tied hash. +This cache is not flushed nor updated when changes are made, +I<even when the same tied hash is used> to make the changes. + +Current implementations of Perl's "global destruction" phase can +cause objects returned by C<Load()> to be destroyed while keys +within the hive are still open, if the objects still exist when +the script starts to exit. When this happens, the automatic +C<UnLoad()> will report a failure and the hive will remain loaded +in the Registry. + +Trying to C<Load()> a hive file that is located on a remote network +share may silently delete all data from the hive. This is a bug +in the Win32 APIs, not any Perl code or modules. This module does +not try to protect you from this bug. + +There is no test suite. + +=head1 FUTURE DIRECTIONS + +The following items are desired by the author and may appear in a +future release of this module. + +=over + +=item TieValues option + +Currently described in main documentation but no yet implemented. + +=item AutoRefresh option + +Trigger use of C<RegNotifyChangeKeyValue()> to keep tied hash +caches up-to-date even when other programs make changes. + +=item Error options + +Allow the user to have unchecked calls (calls in a "void context") +to automatically report errors via C<warn> or C<die>. + +For complex operations, such a copying an entire subtree, provide +access to detailed information about errors (and perhaps some +warnings) that were encountered. Let the user control whether +the complex operation continues in spite of errors. + +=back + +=cut + +# Autoload not currently supported by Perl under Windows. diff --git a/Master/tlpkg/tlperl.old/lib/Win32/WinError.pm b/Master/tlpkg/tlperl.old/lib/Win32/WinError.pm new file mode 100644 index 00000000000..46028a79321 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/WinError.pm @@ -0,0 +1,1017 @@ +package Win32::WinError; + +require Exporter; +require DynaLoader; + +$VERSION = '0.02'; + +@ISA = qw(Exporter DynaLoader); +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. +@EXPORT = qw( + GetLastError + CACHE_E_FIRST + CACHE_E_LAST + CACHE_E_NOCACHE_UPDATED + CACHE_S_FIRST + CACHE_S_FORMATETC_NOTSUPPORTED + CACHE_S_LAST + CACHE_S_SAMECACHE + CACHE_S_SOMECACHES_NOTUPDATED + CLASSFACTORY_E_FIRST + CLASSFACTORY_E_LAST + CLASSFACTORY_S_FIRST + CLASSFACTORY_S_LAST + CLASS_E_CLASSNOTAVAILABLE + CLASS_E_NOAGGREGATION + CLIENTSITE_E_FIRST + CLIENTSITE_E_LAST + CLIENTSITE_S_FIRST + CLIENTSITE_S_LAST + CLIPBRD_E_BAD_DATA + CLIPBRD_E_CANT_CLOSE + CLIPBRD_E_CANT_EMPTY + CLIPBRD_E_CANT_OPEN + CLIPBRD_E_CANT_SET + CLIPBRD_E_FIRST + CLIPBRD_E_LAST + CLIPBRD_S_FIRST + CLIPBRD_S_LAST + CONVERT10_E_FIRST + CONVERT10_E_LAST + CONVERT10_E_OLESTREAM_BITMAP_TO_DIB + CONVERT10_E_OLESTREAM_FMT + CONVERT10_E_OLESTREAM_GET + CONVERT10_E_OLESTREAM_PUT + CONVERT10_E_STG_DIB_TO_BITMAP + CONVERT10_E_STG_FMT + CONVERT10_E_STG_NO_STD_STREAM + CONVERT10_S_FIRST + CONVERT10_S_LAST + CONVERT10_S_NO_PRESENTATION + CO_E_ALREADYINITIALIZED + CO_E_APPDIDNTREG + CO_E_APPNOTFOUND + CO_E_APPSINGLEUSE + CO_E_BAD_PATH + CO_E_CANTDETERMINECLASS + CO_E_CLASSSTRING + CO_E_CLASS_CREATE_FAILED + CO_E_DLLNOTFOUND + CO_E_ERRORINAPP + CO_E_ERRORINDLL + CO_E_FIRST + CO_E_IIDSTRING + CO_E_INIT_CLASS_CACHE + CO_E_INIT_MEMORY_ALLOCATOR + CO_E_INIT_ONLY_SINGLE_THREADED + CO_E_INIT_RPC_CHANNEL + CO_E_INIT_SCM_EXEC_FAILURE + CO_E_INIT_SCM_FILE_MAPPING_EXISTS + CO_E_INIT_SCM_MAP_VIEW_OF_FILE + CO_E_INIT_SCM_MUTEX_EXISTS + CO_E_INIT_SHARED_ALLOCATOR + CO_E_INIT_TLS + CO_E_INIT_TLS_CHANNEL_CONTROL + CO_E_INIT_TLS_SET_CHANNEL_CONTROL + CO_E_INIT_UNACCEPTED_USER_ALLOCATOR + CO_E_LAST + CO_E_NOTINITIALIZED + CO_E_OBJISREG + CO_E_OBJNOTCONNECTED + CO_E_OBJNOTREG + CO_E_OBJSRV_RPC_FAILURE + CO_E_RELEASED + CO_E_SCM_ERROR + CO_E_SCM_RPC_FAILURE + CO_E_SERVER_EXEC_FAILURE + CO_E_SERVER_STOPPING + CO_E_WRONGOSFORAPP + CO_S_FIRST + CO_S_LAST + DATA_E_FIRST + DATA_E_LAST + DATA_S_FIRST + DATA_S_LAST + DATA_S_SAMEFORMATETC + DISP_E_ARRAYISLOCKED + DISP_E_BADCALLEE + DISP_E_BADINDEX + DISP_E_BADPARAMCOUNT + DISP_E_BADVARTYPE + DISP_E_EXCEPTION + DISP_E_MEMBERNOTFOUND + DISP_E_NONAMEDARGS + DISP_E_NOTACOLLECTION + DISP_E_OVERFLOW + DISP_E_PARAMNOTFOUND + DISP_E_PARAMNOTOPTIONAL + DISP_E_TYPEMISMATCH + DISP_E_UNKNOWNINTERFACE + DISP_E_UNKNOWNLCID + DISP_E_UNKNOWNNAME + DRAGDROP_E_ALREADYREGISTERED + DRAGDROP_E_FIRST + DRAGDROP_E_INVALIDHWND + DRAGDROP_E_LAST + DRAGDROP_E_NOTREGISTERED + DRAGDROP_S_CANCEL + DRAGDROP_S_DROP + DRAGDROP_S_FIRST + DRAGDROP_S_LAST + DRAGDROP_S_USEDEFAULTCURSORS + DV_E_CLIPFORMAT + DV_E_DVASPECT + DV_E_DVTARGETDEVICE + DV_E_DVTARGETDEVICE_SIZE + DV_E_FORMATETC + DV_E_LINDEX + DV_E_NOIVIEWOBJECT + DV_E_STATDATA + DV_E_STGMEDIUM + DV_E_TYMED + ENUM_E_FIRST + ENUM_E_LAST + ENUM_S_FIRST + ENUM_S_LAST + EPT_S_CANT_CREATE + EPT_S_CANT_PERFORM_OP + EPT_S_INVALID_ENTRY + EPT_S_NOT_REGISTERED + ERROR_ACCESS_DENIED + ERROR_ACCOUNT_DISABLED + ERROR_ACCOUNT_EXPIRED + ERROR_ACCOUNT_LOCKED_OUT + ERROR_ACCOUNT_RESTRICTION + ERROR_ACTIVE_CONNECTIONS + ERROR_ADAP_HDW_ERR + ERROR_ADDRESS_ALREADY_ASSOCIATED + ERROR_ADDRESS_NOT_ASSOCIATED + ERROR_ALIAS_EXISTS + ERROR_ALLOTTED_SPACE_EXCEEDED + ERROR_ALREADY_ASSIGNED + ERROR_ALREADY_EXISTS + ERROR_ALREADY_REGISTERED + ERROR_ALREADY_RUNNING_LKG + ERROR_ALREADY_WAITING + ERROR_ARENA_TRASHED + ERROR_ARITHMETIC_OVERFLOW + ERROR_ATOMIC_LOCKS_NOT_SUPPORTED + ERROR_AUTODATASEG_EXCEEDS_64k + ERROR_BADDB + ERROR_BADKEY + ERROR_BAD_ARGUMENTS + ERROR_BAD_COMMAND + ERROR_BAD_DESCRIPTOR_FORMAT + ERROR_BAD_DEVICE + ERROR_BAD_DEV_TYPE + ERROR_BAD_DRIVER + ERROR_BAD_DRIVER_LEVEL + ERROR_BAD_ENVIRONMENT + ERROR_BAD_EXE_FORMAT + ERROR_BAD_FORMAT + ERROR_BAD_IMPERSONATION_LEVEL + ERROR_BAD_INHERITANCE_ACL + ERROR_BAD_LENGTH + ERROR_BAD_LOGON_SESSION_STATE + ERROR_BAD_NETPATH + ERROR_BAD_NET_NAME + ERROR_BAD_NET_RESP + ERROR_BAD_PATHNAME + ERROR_BAD_PIPE + ERROR_BAD_PROFILE + ERROR_BAD_PROVIDER + ERROR_BAD_REM_ADAP + ERROR_BAD_THREADID_ADDR + ERROR_BAD_TOKEN_TYPE + ERROR_BAD_UNIT + ERROR_BAD_USERNAME + ERROR_BAD_VALIDATION_CLASS + ERROR_BEGINNING_OF_MEDIA + ERROR_BOOT_ALREADY_ACCEPTED + ERROR_BROKEN_PIPE + ERROR_BUFFER_OVERFLOW + ERROR_BUSY + ERROR_BUSY_DRIVE + ERROR_BUS_RESET + ERROR_CALL_NOT_IMPLEMENTED + ERROR_CANCELLED + ERROR_CANCEL_VIOLATION + ERROR_CANNOT_COPY + ERROR_CANNOT_FIND_WND_CLASS + ERROR_CANNOT_IMPERSONATE + ERROR_CANNOT_MAKE + ERROR_CANNOT_OPEN_PROFILE + ERROR_CANTOPEN + ERROR_CANTREAD + ERROR_CANTWRITE + ERROR_CANT_ACCESS_DOMAIN_INFO + ERROR_CANT_DISABLE_MANDATORY + ERROR_CANT_OPEN_ANONYMOUS + ERROR_CAN_NOT_COMPLETE + ERROR_CAN_NOT_DEL_LOCAL_WINS + ERROR_CHILD_MUST_BE_VOLATILE + ERROR_CHILD_NOT_COMPLETE + ERROR_CHILD_WINDOW_MENU + ERROR_CIRCULAR_DEPENDENCY + ERROR_CLASS_ALREADY_EXISTS + ERROR_CLASS_DOES_NOT_EXIST + ERROR_CLASS_HAS_WINDOWS + ERROR_CLIPBOARD_NOT_OPEN + ERROR_CLIPPING_NOT_SUPPORTED + ERROR_CONNECTION_ABORTED + ERROR_CONNECTION_ACTIVE + ERROR_CONNECTION_COUNT_LIMIT + ERROR_CONNECTION_INVALID + ERROR_CONNECTION_REFUSED + ERROR_CONNECTION_UNAVAIL + ERROR_CONTROL_ID_NOT_FOUND + ERROR_COUNTER_TIMEOUT + ERROR_CRC + ERROR_CURRENT_DIRECTORY + ERROR_DATABASE_DOES_NOT_EXIST + ERROR_DC_NOT_FOUND + ERROR_DEPENDENT_SERVICES_RUNNING + ERROR_DESTROY_OBJECT_OF_OTHER_THREAD + ERROR_DEVICE_ALREADY_REMEMBERED + ERROR_DEVICE_IN_USE + ERROR_DEVICE_NOT_PARTITIONED + ERROR_DEV_NOT_EXIST + ERROR_DIRECTORY + ERROR_DIRECT_ACCESS_HANDLE + ERROR_DIR_NOT_EMPTY + ERROR_DIR_NOT_ROOT + ERROR_DISCARDED + ERROR_DISK_CHANGE + ERROR_DISK_CORRUPT + ERROR_DISK_FULL + ERROR_DISK_OPERATION_FAILED + ERROR_DISK_RECALIBRATE_FAILED + ERROR_DISK_RESET_FAILED + ERROR_DLL_INIT_FAILED + ERROR_DOMAIN_CONTROLLER_NOT_FOUND + ERROR_DOMAIN_EXISTS + ERROR_DOMAIN_LIMIT_EXCEEDED + ERROR_DOMAIN_TRUST_INCONSISTENT + ERROR_DRIVE_LOCKED + ERROR_DUPLICATE_SERVICE_NAME + ERROR_DUP_DOMAINNAME + ERROR_DUP_NAME + ERROR_DYNLINK_FROM_INVALID_RING + ERROR_EAS_DIDNT_FIT + ERROR_EAS_NOT_SUPPORTED + ERROR_EA_ACCESS_DENIED + ERROR_EA_FILE_CORRUPT + ERROR_EA_LIST_INCONSISTENT + ERROR_EA_TABLE_FULL + ERROR_END_OF_MEDIA + ERROR_ENVVAR_NOT_FOUND + ERROR_EOM_OVERFLOW + ERROR_EVENTLOG_CANT_START + ERROR_EVENTLOG_FILE_CHANGED + ERROR_EVENTLOG_FILE_CORRUPT + ERROR_EXCEPTION_IN_SERVICE + ERROR_EXCL_SEM_ALREADY_OWNED + ERROR_EXE_MARKED_INVALID + ERROR_EXTENDED_ERROR + ERROR_FAILED_SERVICE_CONTROLLER_CONNECT + ERROR_FAIL_I24 + ERROR_FILEMARK_DETECTED + ERROR_FILENAME_EXCED_RANGE + ERROR_FILE_CORRUPT + ERROR_FILE_EXISTS + ERROR_FILE_INVALID + ERROR_FILE_NOT_FOUND + ERROR_FLOPPY_BAD_REGISTERS + ERROR_FLOPPY_ID_MARK_NOT_FOUND + ERROR_FLOPPY_UNKNOWN_ERROR + ERROR_FLOPPY_WRONG_CYLINDER + ERROR_FULLSCREEN_MODE + ERROR_FULL_BACKUP + ERROR_GENERIC_NOT_MAPPED + ERROR_GEN_FAILURE + ERROR_GLOBAL_ONLY_HOOK + ERROR_GRACEFUL_DISCONNECT + ERROR_GROUP_EXISTS + ERROR_HANDLE_DISK_FULL + ERROR_HANDLE_EOF + ERROR_HOOK_NEEDS_HMOD + ERROR_HOOK_NOT_INSTALLED + ERROR_HOST_UNREACHABLE + ERROR_HOTKEY_ALREADY_REGISTERED + ERROR_HOTKEY_NOT_REGISTERED + ERROR_HWNDS_HAVE_DIFF_PARENT + ERROR_ILL_FORMED_PASSWORD + ERROR_INCORRECT_ADDRESS + ERROR_INC_BACKUP + ERROR_INFLOOP_IN_RELOC_CHAIN + ERROR_INSUFFICIENT_BUFFER + ERROR_INTERNAL_DB_CORRUPTION + ERROR_INTERNAL_DB_ERROR + ERROR_INTERNAL_ERROR + ERROR_INVALID_ACCEL_HANDLE + ERROR_INVALID_ACCESS + ERROR_INVALID_ACCOUNT_NAME + ERROR_INVALID_ACL + ERROR_INVALID_ADDRESS + ERROR_INVALID_AT_INTERRUPT_TIME + ERROR_INVALID_BLOCK + ERROR_INVALID_BLOCK_LENGTH + ERROR_INVALID_CATEGORY + ERROR_INVALID_COMBOBOX_MESSAGE + ERROR_INVALID_COMPUTERNAME + ERROR_INVALID_CURSOR_HANDLE + ERROR_INVALID_DATA + ERROR_INVALID_DATATYPE + ERROR_INVALID_DOMAINNAME + ERROR_INVALID_DOMAIN_ROLE + ERROR_INVALID_DOMAIN_STATE + ERROR_INVALID_DRIVE + ERROR_INVALID_DWP_HANDLE + ERROR_INVALID_EA_HANDLE + ERROR_INVALID_EA_NAME + ERROR_INVALID_EDIT_HEIGHT + ERROR_INVALID_ENVIRONMENT + ERROR_INVALID_EVENTNAME + ERROR_INVALID_EVENT_COUNT + ERROR_INVALID_EXE_SIGNATURE + ERROR_INVALID_FILTER_PROC + ERROR_INVALID_FLAGS + ERROR_INVALID_FLAG_NUMBER + ERROR_INVALID_FORM_NAME + ERROR_INVALID_FORM_SIZE + ERROR_INVALID_FUNCTION + ERROR_INVALID_GROUPNAME + ERROR_INVALID_GROUP_ATTRIBUTES + ERROR_INVALID_GW_COMMAND + ERROR_INVALID_HANDLE + ERROR_INVALID_HOOK_FILTER + ERROR_INVALID_HOOK_HANDLE + ERROR_INVALID_ICON_HANDLE + ERROR_INVALID_ID_AUTHORITY + ERROR_INVALID_INDEX + ERROR_INVALID_LB_MESSAGE + ERROR_INVALID_LEVEL + ERROR_INVALID_LIST_FORMAT + ERROR_INVALID_LOGON_HOURS + ERROR_INVALID_LOGON_TYPE + ERROR_INVALID_MEMBER + ERROR_INVALID_MENU_HANDLE + ERROR_INVALID_MESSAGE + ERROR_INVALID_MESSAGEDEST + ERROR_INVALID_MESSAGENAME + ERROR_INVALID_MINALLOCSIZE + ERROR_INVALID_MODULETYPE + ERROR_INVALID_MSGBOX_STYLE + ERROR_INVALID_NAME + ERROR_INVALID_NETNAME + ERROR_INVALID_ORDINAL + ERROR_INVALID_OWNER + ERROR_INVALID_PARAMETER + ERROR_INVALID_PASSWORD + ERROR_INVALID_PASSWORDNAME + ERROR_INVALID_PIXEL_FORMAT + ERROR_INVALID_PRIMARY_GROUP + ERROR_INVALID_PRINTER_COMMAND + ERROR_INVALID_PRINTER_NAME + ERROR_INVALID_PRINTER_STATE + ERROR_INVALID_PRIORITY + ERROR_INVALID_SCROLLBAR_RANGE + ERROR_INVALID_SECURITY_DESCR + ERROR_INVALID_SEGDPL + ERROR_INVALID_SEGMENT_NUMBER + ERROR_INVALID_SEPARATOR_FILE + ERROR_INVALID_SERVER_STATE + ERROR_INVALID_SERVICENAME + ERROR_INVALID_SERVICE_ACCOUNT + ERROR_INVALID_SERVICE_CONTROL + ERROR_INVALID_SERVICE_LOCK + ERROR_INVALID_SHARENAME + ERROR_INVALID_SHOWWIN_COMMAND + ERROR_INVALID_SID + ERROR_INVALID_SIGNAL_NUMBER + ERROR_INVALID_SPI_VALUE + ERROR_INVALID_STACKSEG + ERROR_INVALID_STARTING_CODESEG + ERROR_INVALID_SUB_AUTHORITY + ERROR_INVALID_TARGET_HANDLE + ERROR_INVALID_THREAD_ID + ERROR_INVALID_TIME + ERROR_INVALID_USER_BUFFER + ERROR_INVALID_VERIFY_SWITCH + ERROR_INVALID_WINDOW_HANDLE + ERROR_INVALID_WINDOW_STYLE + ERROR_INVALID_WORKSTATION + ERROR_IOPL_NOT_ENABLED + ERROR_IO_DEVICE + ERROR_IO_INCOMPLETE + ERROR_IO_PENDING + ERROR_IRQ_BUSY + ERROR_IS_JOINED + ERROR_IS_JOIN_PATH + ERROR_IS_JOIN_TARGET + ERROR_IS_SUBSTED + ERROR_IS_SUBST_PATH + ERROR_IS_SUBST_TARGET + ERROR_ITERATED_DATA_EXCEEDS_64k + ERROR_JOIN_TO_JOIN + ERROR_JOIN_TO_SUBST + ERROR_JOURNAL_HOOK_SET + ERROR_KEY_DELETED + ERROR_KEY_HAS_CHILDREN + ERROR_LABEL_TOO_LONG + ERROR_LAST_ADMIN + ERROR_LB_WITHOUT_TABSTOPS + ERROR_LISTBOX_ID_NOT_FOUND + ERROR_LM_CROSS_ENCRYPTION_REQUIRED + ERROR_LOCAL_USER_SESSION_KEY + ERROR_LOCKED + ERROR_LOCK_FAILED + ERROR_LOCK_VIOLATION + ERROR_LOGIN_TIME_RESTRICTION + ERROR_LOGIN_WKSTA_RESTRICTION + ERROR_LOGON_FAILURE + ERROR_LOGON_NOT_GRANTED + ERROR_LOGON_SESSION_COLLISION + ERROR_LOGON_SESSION_EXISTS + ERROR_LOGON_TYPE_NOT_GRANTED + ERROR_LOG_FILE_FULL + ERROR_LUIDS_EXHAUSTED + ERROR_MAPPED_ALIGNMENT + ERROR_MAX_THRDS_REACHED + ERROR_MEDIA_CHANGED + ERROR_MEMBERS_PRIMARY_GROUP + ERROR_MEMBER_IN_ALIAS + ERROR_MEMBER_IN_GROUP + ERROR_MEMBER_NOT_IN_ALIAS + ERROR_MEMBER_NOT_IN_GROUP + ERROR_METAFILE_NOT_SUPPORTED + ERROR_META_EXPANSION_TOO_LONG + ERROR_MOD_NOT_FOUND + ERROR_MORE_DATA + ERROR_MORE_WRITES + ERROR_MR_MID_NOT_FOUND + ERROR_NEGATIVE_SEEK + ERROR_NESTING_NOT_ALLOWED + ERROR_NETLOGON_NOT_STARTED + ERROR_NETNAME_DELETED + ERROR_NETWORK_ACCESS_DENIED + ERROR_NETWORK_BUSY + ERROR_NETWORK_UNREACHABLE + ERROR_NET_WRITE_FAULT + ERROR_NOACCESS + ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT + ERROR_NOLOGON_SERVER_TRUST_ACCOUNT + ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT + ERROR_NONE_MAPPED + ERROR_NON_MDICHILD_WINDOW + ERROR_NOTIFY_ENUM_DIR + ERROR_NOT_ALL_ASSIGNED + ERROR_NOT_CHILD_WINDOW + ERROR_NOT_CONNECTED + ERROR_NOT_CONTAINER + ERROR_NOT_DOS_DISK + ERROR_NOT_ENOUGH_MEMORY + ERROR_NOT_ENOUGH_QUOTA + ERROR_NOT_ENOUGH_SERVER_MEMORY + ERROR_NOT_JOINED + ERROR_NOT_LOCKED + ERROR_NOT_LOGON_PROCESS + ERROR_NOT_OWNER + ERROR_NOT_READY + ERROR_NOT_REGISTRY_FILE + ERROR_NOT_SAME_DEVICE + ERROR_NOT_SUBSTED + ERROR_NOT_SUPPORTED + ERROR_NO_BROWSER_SERVERS_FOUND + ERROR_NO_DATA + ERROR_NO_DATA_DETECTED + ERROR_NO_IMPERSONATION_TOKEN + ERROR_NO_INHERITANCE + ERROR_NO_LOGON_SERVERS + ERROR_NO_LOG_SPACE + ERROR_NO_MEDIA_IN_DRIVE + ERROR_NO_MORE_FILES + ERROR_NO_MORE_ITEMS + ERROR_NO_MORE_SEARCH_HANDLES + ERROR_NO_NETWORK + ERROR_NO_NET_OR_BAD_PATH + ERROR_NO_PROC_SLOTS + ERROR_NO_QUOTAS_FOR_ACCOUNT + ERROR_NO_SCROLLBARS + ERROR_NO_SECURITY_ON_OBJECT + ERROR_NO_SHUTDOWN_IN_PROGRESS + ERROR_NO_SIGNAL_SENT + ERROR_NO_SPOOL_SPACE + ERROR_NO_SUCH_ALIAS + ERROR_NO_SUCH_DOMAIN + ERROR_NO_SUCH_GROUP + ERROR_NO_SUCH_LOGON_SESSION + ERROR_NO_SUCH_MEMBER + ERROR_NO_SUCH_PACKAGE + ERROR_NO_SUCH_PRIVILEGE + ERROR_NO_SUCH_USER + ERROR_NO_SYSTEM_MENU + ERROR_NO_TOKEN + ERROR_NO_TRUST_LSA_SECRET + ERROR_NO_TRUST_SAM_ACCOUNT + ERROR_NO_UNICODE_TRANSLATION + ERROR_NO_USER_SESSION_KEY + ERROR_NO_VOLUME_LABEL + ERROR_NO_WILDCARD_CHARACTERS + ERROR_NT_CROSS_ENCRYPTION_REQUIRED + ERROR_NULL_LM_PASSWORD + ERROR_OPEN_FAILED + ERROR_OPEN_FILES + ERROR_OPERATION_ABORTED + ERROR_OUTOFMEMORY + ERROR_OUT_OF_PAPER + ERROR_OUT_OF_STRUCTURES + ERROR_PARTIAL_COPY + ERROR_PARTITION_FAILURE + ERROR_PASSWORD_EXPIRED + ERROR_PASSWORD_MUST_CHANGE + ERROR_PASSWORD_RESTRICTION + ERROR_PATH_BUSY + ERROR_PATH_NOT_FOUND + ERROR_PIPE_BUSY + ERROR_PIPE_CONNECTED + ERROR_PIPE_LISTENING + ERROR_PIPE_NOT_CONNECTED + ERROR_POPUP_ALREADY_ACTIVE + ERROR_PORT_UNREACHABLE + ERROR_POSSIBLE_DEADLOCK + ERROR_PRINTER_ALREADY_EXISTS + ERROR_PRINTER_DELETED + ERROR_PRINTER_DRIVER_ALREADY_INSTALLED + ERROR_PRINTER_DRIVER_IN_USE + ERROR_PRINTQ_FULL + ERROR_PRINT_CANCELLED + ERROR_PRINT_MONITOR_ALREADY_INSTALLED + ERROR_PRINT_PROCESSOR_ALREADY_INSTALLED + ERROR_PRIVATE_DIALOG_INDEX + ERROR_PRIVILEGE_NOT_HELD + ERROR_PROCESS_ABORTED + ERROR_PROC_NOT_FOUND + ERROR_PROTOCOL_UNREACHABLE + ERROR_READ_FAULT + ERROR_REC_NON_EXISTENT + ERROR_REDIRECTOR_HAS_OPEN_HANDLES + ERROR_REDIR_PAUSED + ERROR_REGISTRY_CORRUPT + ERROR_REGISTRY_IO_FAILED + ERROR_REGISTRY_RECOVERED + ERROR_RELOC_CHAIN_XEEDS_SEGLIM + ERROR_REMOTE_SESSION_LIMIT_EXCEEDED + ERROR_REM_NOT_LIST + ERROR_REQUEST_ABORTED + ERROR_REQ_NOT_ACCEP + ERROR_RESOURCE_DATA_NOT_FOUND + ERROR_RESOURCE_LANG_NOT_FOUND + ERROR_RESOURCE_NAME_NOT_FOUND + ERROR_RESOURCE_TYPE_NOT_FOUND + ERROR_RETRY + ERROR_REVISION_MISMATCH + ERROR_RING2SEG_MUST_BE_MOVABLE + ERROR_RING2_STACK_IN_USE + ERROR_RPL_NOT_ALLOWED + ERROR_RXACT_COMMIT_FAILURE + ERROR_RXACT_INVALID_STATE + ERROR_SAME_DRIVE + ERROR_SCREEN_ALREADY_LOCKED + ERROR_SECRET_TOO_LONG + ERROR_SECTOR_NOT_FOUND + ERROR_SEEK + ERROR_SEEK_ON_DEVICE + ERROR_SEM_IS_SET + ERROR_SEM_NOT_FOUND + ERROR_SEM_OWNER_DIED + ERROR_SEM_TIMEOUT + ERROR_SEM_USER_LIMIT + ERROR_SERIAL_NO_DEVICE + ERROR_SERVER_DISABLED + ERROR_SERVER_HAS_OPEN_HANDLES + ERROR_SERVER_NOT_DISABLED + ERROR_SERVICE_ALREADY_RUNNING + ERROR_SERVICE_CANNOT_ACCEPT_CTRL + ERROR_SERVICE_DATABASE_LOCKED + ERROR_SERVICE_DEPENDENCY_DELETED + ERROR_SERVICE_DEPENDENCY_FAIL + ERROR_SERVICE_DISABLED + ERROR_SERVICE_DOES_NOT_EXIST + ERROR_SERVICE_EXISTS + ERROR_SERVICE_LOGON_FAILED + ERROR_SERVICE_MARKED_FOR_DELETE + ERROR_SERVICE_NEVER_STARTED + ERROR_SERVICE_NOT_ACTIVE + ERROR_SERVICE_NOT_FOUND + ERROR_SERVICE_NO_THREAD + ERROR_SERVICE_REQUEST_TIMEOUT + ERROR_SERVICE_SPECIFIC_ERROR + ERROR_SERVICE_START_HANG + ERROR_SESSION_CREDENTIAL_CONFLICT + ERROR_SETCOUNT_ON_BAD_LB + ERROR_SETMARK_DETECTED + ERROR_SHARING_BUFFER_EXCEEDED + ERROR_SHARING_PAUSED + ERROR_SHARING_VIOLATION + ERROR_SHUTDOWN_IN_PROGRESS + ERROR_SIGNAL_PENDING + ERROR_SIGNAL_REFUSED + ERROR_SOME_NOT_MAPPED + ERROR_SPECIAL_ACCOUNT + ERROR_SPECIAL_GROUP + ERROR_SPECIAL_USER + ERROR_SPL_NO_ADDJOB + ERROR_SPL_NO_STARTDOC + ERROR_SPOOL_FILE_NOT_FOUND + ERROR_STACK_OVERFLOW + ERROR_STATIC_INIT + ERROR_SUBST_TO_JOIN + ERROR_SUBST_TO_SUBST + ERROR_SUCCESS + ERROR_SWAPERROR + ERROR_SYSTEM_TRACE + ERROR_THREAD_1_INACTIVE + ERROR_TLW_WITH_WSCHILD + ERROR_TOKEN_ALREADY_IN_USE + ERROR_TOO_MANY_CMDS + ERROR_TOO_MANY_CONTEXT_IDS + ERROR_TOO_MANY_LUIDS_REQUESTED + ERROR_TOO_MANY_MODULES + ERROR_TOO_MANY_MUXWAITERS + ERROR_TOO_MANY_NAMES + ERROR_TOO_MANY_OPEN_FILES + ERROR_TOO_MANY_POSTS + ERROR_TOO_MANY_SECRETS + ERROR_TOO_MANY_SEMAPHORES + ERROR_TOO_MANY_SEM_REQUESTS + ERROR_TOO_MANY_SESS + ERROR_TOO_MANY_SIDS + ERROR_TOO_MANY_TCBS + ERROR_TRANSFORM_NOT_SUPPORTED + ERROR_TRUSTED_DOMAIN_FAILURE + ERROR_TRUSTED_RELATIONSHIP_FAILURE + ERROR_TRUST_FAILURE + ERROR_UNABLE_TO_LOCK_MEDIA + ERROR_UNABLE_TO_UNLOAD_MEDIA + ERROR_UNEXP_NET_ERR + ERROR_UNKNOWN_PORT + ERROR_UNKNOWN_PRINTER_DRIVER + ERROR_UNKNOWN_PRINTPROCESSOR + ERROR_UNKNOWN_PRINT_MONITOR + ERROR_UNKNOWN_REVISION + ERROR_UNRECOGNIZED_MEDIA + ERROR_UNRECOGNIZED_VOLUME + ERROR_USER_EXISTS + ERROR_USER_MAPPED_FILE + ERROR_VC_DISCONNECTED + ERROR_WAIT_NO_CHILDREN + ERROR_WINDOW_NOT_COMBOBOX + ERROR_WINDOW_NOT_DIALOG + ERROR_WINDOW_OF_OTHER_THREAD + ERROR_WINS_INTERNAL + ERROR_WRITE_FAULT + ERROR_WRITE_PROTECT + ERROR_WRONG_DISK + ERROR_WRONG_PASSWORD + E_ABORT + E_ACCESSDENIED + E_FAIL + E_HANDLE + E_INVALIDARG + E_NOINTERFACE + E_NOTIMPL + E_OUTOFMEMORY + E_POINTER + E_UNEXPECTED + FACILITY_CONTROL + FACILITY_DISPATCH + FACILITY_ITF + FACILITY_NT_BIT + FACILITY_NULL + FACILITY_RPC + FACILITY_STORAGE + FACILITY_WIN32 + FACILITY_WINDOWS + INPLACE_E_FIRST + INPLACE_E_LAST + INPLACE_E_NOTOOLSPACE + INPLACE_E_NOTUNDOABLE + INPLACE_S_FIRST + INPLACE_S_LAST + INPLACE_S_TRUNCATED + MARSHAL_E_FIRST + MARSHAL_E_LAST + MARSHAL_S_FIRST + MARSHAL_S_LAST + MEM_E_INVALID_LINK + MEM_E_INVALID_ROOT + MEM_E_INVALID_SIZE + MK_E_CANTOPENFILE + MK_E_CONNECTMANUALLY + MK_E_ENUMERATION_FAILED + MK_E_EXCEEDEDDEADLINE + MK_E_FIRST + MK_E_INTERMEDIATEINTERFACENOTSUPPORTED + MK_E_INVALIDEXTENSION + MK_E_LAST + MK_E_MUSTBOTHERUSER + MK_E_NEEDGENERIC + MK_E_NOINVERSE + MK_E_NOOBJECT + MK_E_NOPREFIX + MK_E_NOSTORAGE + MK_E_NOTBINDABLE + MK_E_NOTBOUND + MK_E_NO_NORMALIZED + MK_E_SYNTAX + MK_E_UNAVAILABLE + MK_S_FIRST + MK_S_HIM + MK_S_LAST + MK_S_ME + MK_S_MONIKERALREADYREGISTERED + MK_S_REDUCED_TO_SELF + MK_S_US + NOERROR + NO_ERROR + OLEOBJ_E_FIRST + OLEOBJ_E_INVALIDVERB + OLEOBJ_E_LAST + OLEOBJ_E_NOVERBS + OLEOBJ_S_CANNOT_DOVERB_NOW + OLEOBJ_S_FIRST + OLEOBJ_S_INVALIDHWND + OLEOBJ_S_INVALIDVERB + OLEOBJ_S_LAST + OLE_E_ADVF + OLE_E_ADVISENOTSUPPORTED + OLE_E_BLANK + OLE_E_CANTCONVERT + OLE_E_CANT_BINDTOSOURCE + OLE_E_CANT_GETMONIKER + OLE_E_CLASSDIFF + OLE_E_ENUM_NOMORE + OLE_E_FIRST + OLE_E_INVALIDHWND + OLE_E_INVALIDRECT + OLE_E_LAST + OLE_E_NOCACHE + OLE_E_NOCONNECTION + OLE_E_NOSTORAGE + OLE_E_NOTRUNNING + OLE_E_NOT_INPLACEACTIVE + OLE_E_OLEVERB + OLE_E_PROMPTSAVECANCELLED + OLE_E_STATIC + OLE_E_WRONGCOMPOBJ + OLE_S_FIRST + OLE_S_LAST + OLE_S_MAC_CLIPFORMAT + OLE_S_STATIC + OLE_S_USEREG + REGDB_E_CLASSNOTREG + REGDB_E_FIRST + REGDB_E_IIDNOTREG + REGDB_E_INVALIDVALUE + REGDB_E_KEYMISSING + REGDB_E_LAST + REGDB_E_READREGDB + REGDB_E_WRITEREGDB + REGDB_S_FIRST + REGDB_S_LAST + RPC_E_ATTEMPTED_MULTITHREAD + RPC_E_CALL_CANCELED + RPC_E_CALL_REJECTED + RPC_E_CANTCALLOUT_AGAIN + RPC_E_CANTCALLOUT_INASYNCCALL + RPC_E_CANTCALLOUT_INEXTERNALCALL + RPC_E_CANTCALLOUT_ININPUTSYNCCALL + RPC_E_CANTPOST_INSENDCALL + RPC_E_CANTTRANSMIT_CALL + RPC_E_CHANGED_MODE + RPC_E_CLIENT_CANTMARSHAL_DATA + RPC_E_CLIENT_CANTUNMARSHAL_DATA + RPC_E_CLIENT_DIED + RPC_E_CONNECTION_TERMINATED + RPC_E_DISCONNECTED + RPC_E_FAULT + RPC_E_INVALIDMETHOD + RPC_E_INVALID_CALLDATA + RPC_E_INVALID_DATA + RPC_E_INVALID_DATAPACKET + RPC_E_INVALID_PARAMETER + RPC_E_NOT_REGISTERED + RPC_E_OUT_OF_RESOURCES + RPC_E_RETRY + RPC_E_SERVERCALL_REJECTED + RPC_E_SERVERCALL_RETRYLATER + RPC_E_SERVERFAULT + RPC_E_SERVER_CANTMARSHAL_DATA + RPC_E_SERVER_CANTUNMARSHAL_DATA + RPC_E_SERVER_DIED + RPC_E_SERVER_DIED_DNE + RPC_E_SYS_CALL_FAILED + RPC_E_THREAD_NOT_INIT + RPC_E_UNEXPECTED + RPC_E_WRONG_THREAD + RPC_S_ADDRESS_ERROR + RPC_S_ALREADY_LISTENING + RPC_S_ALREADY_REGISTERED + RPC_S_BINDING_HAS_NO_AUTH + RPC_S_BINDING_INCOMPLETE + RPC_S_CALL_CANCELLED + RPC_S_CALL_FAILED + RPC_S_CALL_FAILED_DNE + RPC_S_CALL_IN_PROGRESS + RPC_S_CANNOT_SUPPORT + RPC_S_CANT_CREATE_ENDPOINT + RPC_S_COMM_FAILURE + RPC_S_DUPLICATE_ENDPOINT + RPC_S_ENTRY_ALREADY_EXISTS + RPC_S_ENTRY_NOT_FOUND + RPC_S_FP_DIV_ZERO + RPC_S_FP_OVERFLOW + RPC_S_FP_UNDERFLOW + RPC_S_GROUP_MEMBER_NOT_FOUND + RPC_S_INCOMPLETE_NAME + RPC_S_INTERFACE_NOT_FOUND + RPC_S_INTERNAL_ERROR + RPC_S_INVALID_AUTH_IDENTITY + RPC_S_INVALID_BINDING + RPC_S_INVALID_BOUND + RPC_S_INVALID_ENDPOINT_FORMAT + RPC_S_INVALID_NAF_ID + RPC_S_INVALID_NAME_SYNTAX + RPC_S_INVALID_NETWORK_OPTIONS + RPC_S_INVALID_NET_ADDR + RPC_S_INVALID_OBJECT + RPC_S_INVALID_RPC_PROTSEQ + RPC_S_INVALID_STRING_BINDING + RPC_S_INVALID_STRING_UUID + RPC_S_INVALID_TAG + RPC_S_INVALID_TIMEOUT + RPC_S_INVALID_VERS_OPTION + RPC_S_MAX_CALLS_TOO_SMALL + RPC_S_NAME_SERVICE_UNAVAILABLE + RPC_S_NOTHING_TO_EXPORT + RPC_S_NOT_ALL_OBJS_UNEXPORTED + RPC_S_NOT_CANCELLED + RPC_S_NOT_LISTENING + RPC_S_NOT_RPC_ERROR + RPC_S_NO_BINDINGS + RPC_S_NO_CALL_ACTIVE + RPC_S_NO_CONTEXT_AVAILABLE + RPC_S_NO_ENDPOINT_FOUND + RPC_S_NO_ENTRY_NAME + RPC_S_NO_INTERFACES + RPC_S_NO_MORE_BINDINGS + RPC_S_NO_MORE_MEMBERS + RPC_S_NO_PRINC_NAME + RPC_S_NO_PROTSEQS + RPC_S_NO_PROTSEQS_REGISTERED + RPC_S_OBJECT_NOT_FOUND + RPC_S_OUT_OF_RESOURCES + RPC_S_PROCNUM_OUT_OF_RANGE + RPC_S_PROTOCOL_ERROR + RPC_S_PROTSEQ_NOT_FOUND + RPC_S_PROTSEQ_NOT_SUPPORTED + RPC_S_SEC_PKG_ERROR + RPC_S_SERVER_TOO_BUSY + RPC_S_SERVER_UNAVAILABLE + RPC_S_STRING_TOO_LONG + RPC_S_TYPE_ALREADY_REGISTERED + RPC_S_UNKNOWN_AUTHN_LEVEL + RPC_S_UNKNOWN_AUTHN_SERVICE + RPC_S_UNKNOWN_AUTHN_TYPE + RPC_S_UNKNOWN_AUTHZ_SERVICE + RPC_S_UNKNOWN_IF + RPC_S_UNKNOWN_MGR_TYPE + RPC_S_UNSUPPORTED_AUTHN_LEVEL + RPC_S_UNSUPPORTED_NAME_SYNTAX + RPC_S_UNSUPPORTED_TRANS_SYN + RPC_S_UNSUPPORTED_TYPE + RPC_S_UUID_LOCAL_ONLY + RPC_S_UUID_NO_ADDRESS + RPC_S_WRONG_KIND_OF_BINDING + RPC_S_ZERO_DIVIDE + RPC_X_BAD_STUB_DATA + RPC_X_BYTE_COUNT_TOO_SMALL + RPC_X_ENUM_VALUE_OUT_OF_RANGE + RPC_X_INVALID_ES_ACTION + RPC_X_NO_MORE_ENTRIES + RPC_X_NULL_REF_POINTER + RPC_X_SS_CANNOT_GET_CALL_HANDLE + RPC_X_SS_CHAR_TRANS_OPEN_FAIL + RPC_X_SS_CHAR_TRANS_SHORT_FILE + RPC_X_SS_CONTEXT_DAMAGED + RPC_X_SS_HANDLES_MISMATCH + RPC_X_SS_IN_NULL_CONTEXT + RPC_X_WRONG_ES_VERSION + RPC_X_WRONG_STUB_VERSION + SEVERITY_ERROR + SEVERITY_SUCCESS + STG_E_ABNORMALAPIEXIT + STG_E_ACCESSDENIED + STG_E_CANTSAVE + STG_E_DISKISWRITEPROTECTED + STG_E_EXTANTMARSHALLINGS + STG_E_FILEALREADYEXISTS + STG_E_FILENOTFOUND + STG_E_INSUFFICIENTMEMORY + STG_E_INUSE + STG_E_INVALIDFLAG + STG_E_INVALIDFUNCTION + STG_E_INVALIDHANDLE + STG_E_INVALIDHEADER + STG_E_INVALIDNAME + STG_E_INVALIDPARAMETER + STG_E_INVALIDPOINTER + STG_E_LOCKVIOLATION + STG_E_MEDIUMFULL + STG_E_NOMOREFILES + STG_E_NOTCURRENT + STG_E_NOTFILEBASEDSTORAGE + STG_E_OLDDLL + STG_E_OLDFORMAT + STG_E_PATHNOTFOUND + STG_E_READFAULT + STG_E_REVERTED + STG_E_SEEKERROR + STG_E_SHAREREQUIRED + STG_E_SHAREVIOLATION + STG_E_TOOMANYOPENFILES + STG_E_UNIMPLEMENTEDFUNCTION + STG_E_UNKNOWN + STG_E_WRITEFAULT + STG_S_CONVERTED + S_FALSE + S_OK + TYPE_E_AMBIGUOUSNAME + TYPE_E_BADMODULEKIND + TYPE_E_BUFFERTOOSMALL + TYPE_E_CANTCREATETMPFILE + TYPE_E_CANTLOADLIBRARY + TYPE_E_CIRCULARTYPE + TYPE_E_DLLFUNCTIONNOTFOUND + TYPE_E_DUPLICATEID + TYPE_E_ELEMENTNOTFOUND + TYPE_E_INCONSISTENTPROPFUNCS + TYPE_E_INVALIDID + TYPE_E_INVALIDSTATE + TYPE_E_INVDATAREAD + TYPE_E_IOERROR + TYPE_E_LIBNOTREGISTERED + TYPE_E_NAMECONFLICT + TYPE_E_OUTOFBOUNDS + TYPE_E_QUALIFIEDNAMEDISALLOWED + TYPE_E_REGISTRYACCESS + TYPE_E_SIZETOOBIG + TYPE_E_TYPEMISMATCH + TYPE_E_UNDEFINEDTYPE + TYPE_E_UNKNOWNLCID + TYPE_E_UNSUPFORMAT + TYPE_E_WRONGTYPEKIND + VIEW_E_DRAW + VIEW_E_FIRST + VIEW_E_LAST + VIEW_S_ALREADY_FROZEN + VIEW_S_FIRST + VIEW_S_LAST +); + +sub AUTOLOAD { + # This AUTOLOAD is used to 'autoload' constants from the constant() + # XS function. If a constant is not found then control is passed + # to the AUTOLOAD in AutoLoader. + + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + #reset $! to zero to reset any current errors. + local $! = 0; + local $^E = 0; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($! != 0) { + if ($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + ($pack,$file,$line) = caller; + die "Your vendor has not defined Win32::WinError macro $constname, used at $file line $line."; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + +bootstrap Win32::WinError; + +# Preloaded methods go here. + +# Autoload methods go after __END__, and are processed by the autosplit program. + +1; +__END__ diff --git a/Master/tlpkg/tlperl.old/lib/Win32/test-async.pl b/Master/tlpkg/tlperl.old/lib/Win32/test-async.pl new file mode 100644 index 00000000000..c47e2df04ec --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32/test-async.pl @@ -0,0 +1,129 @@ +# +# TEST-ASYNC.PL +# Test Win32::Internet's Asynchronous Operations +# by Aldo Calpini <dada@divinf.it> +# +# WARNING: this code is most likely to fail with almost-random errors +# I don't know what is wrong here, any hint will be greatly +# appreciated! + +use Win32::Internet; + +$params{'flags'} = INTERNET_FLAG_ASYNC; +$params{'opentype'} = INTERNET_OPEN_TYPE_DIRECT; +$I = new Win32::Internet(\%params); + +# print "Error: ", $I->Error(), "\n"; +print "I.handle=", $I->{'handle'}, "\n"; + +$return = $I->SetStatusCallback(); +print "SetStatusCallback=$return"; +print "ERROR" if $return eq undef; +print "\n"; + +$buffer = $I->QueryOption(INTERNET_OPTION_READ_BUFFER_SIZE); +print "Buffer=$buffer\n"; + +$host = "ftp.activeware.com"; +$user = "anonymous"; +$pass = "dada\@divinf.it"; + + +print "Doing FTP()...\n"; + +$handle2 = $I->FTP($FTP, $host, $user, $pass, 21, 1); + +print "Returned from FTP()...\n"; + +($n, $t) = $I->Error(); + +if($n == 997) { + print "Going asynchronous...\n"; + ($status, $info) = $I->GetStatusCallback(1); + while($status != 100 and $status != 70) { + if($oldstatus != $status) { + if($status == 60) { + $FTP->{'handle'} = $info; + } elsif($status == 10) { + print "resolving name... \n"; + } elsif($status == 11) { + print "name resolved... \n"; + } elsif($status == 20) { + print "connecting... \n"; + } elsif($status == 21) { + print "connected... \n"; + } elsif($status == 30) { + print "sending... \n"; + } elsif($status == 31) { + print "$info bytes sent. \n"; + } elsif($status == 40) { + print "receiving... \n"; + } elsif($status == 41) { + print "$info bytes received. \n"; + } else { + print "status=$status\n"; + } + } + $oldstatus = $status; + ($status, $info) = $I->GetStatusCallback(1); + } +} else { + print "Error=", $I->Error(), "\n"; +} +print "FTP.handle=", $FTP->{'handle'}, "\n"; +print "STATUS(after FTP)=", $I->GetStatusCallback(1), "\n"; + +# "/pub/microsoft/sdk/activex13.exe", + +print "Doing Get()...\n"; + +$file = "/Perl-Win32/perl5.001m/currentBuild/110-i86.zip"; + +$FTP->Get($file, "110-i86.zip", 1, 0, 2); + +print "Returned from Get()...\n"; + +($n, $t) = $I->Error(); +if($n == 997) { + print "Going asynchronous...\n"; + $bytes = 0; + $oldstatus = 0; + ($status, $info) = $I->GetStatusCallback(2); + while($status != 100 and $status != 70) { + # print "status=$status info=$info\n"; + # if($oldstatus!=$status) { + if($status == 10) { + print "resolving name... \n"; + } elsif($status == 11) { + print "name resolved... \n"; + } elsif($status == 20) { + print "connecting... \n"; + } elsif($status == 21) { + print "connected... \n"; + #} elsif($status == 30) { + # print "sending... \n"; + } elsif($status == 31) { + print "$info bytes sent. \n"; + #} elsif($status == 40) { + # print "receiving... \n"; + } elsif($status == 41) { + $bytes = $bytes+$info; + print "$bytes bytes received. \n"; + #} else { + # print "status=$status\n"; + } + # } + $oldstatus = $status; + undef $status, $info; + ($status, $info) = $I->GetStatusCallback(2); + } +} else { + print "Error=[$n] $t\n"; +} +print "\n"; +($status, $info) = $I->GetStatusCallback(2); +print "STATUS(after Get)=$status\n"; +print "Error=", $I->Error(), "\n"; +exit(0); + + diff --git a/Master/tlpkg/tlperl.old/lib/Win32API/Registry.pm b/Master/tlpkg/tlperl.old/lib/Win32API/Registry.pm new file mode 100644 index 00000000000..dbf98b4e2e9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32API/Registry.pm @@ -0,0 +1,1792 @@ +# Registry.pm -- Low-level access to functions/constants from WINREG.h + +package Win32API::Registry; + +use strict; +use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); #@EXPORT_FAIL); +$VERSION= '0.24'; + +require Exporter; +require DynaLoader; +@ISA= qw(Exporter DynaLoader); + +@EXPORT= qw(); +%EXPORT_TAGS= ( + Func => [qw( regConstant regLastError + AllowPriv AbortSystemShutdown InitiateSystemShutdown + RegCloseKey RegConnectRegistry RegCreateKey + RegCreateKeyEx RegDeleteKey RegDeleteValue + RegEnumKey RegEnumKeyEx RegEnumValue + RegFlushKey RegGetKeySecurity RegLoadKey + RegNotifyChangeKeyValue RegOpenKey RegOpenKeyEx + RegQueryInfoKey RegQueryMultipleValues RegQueryValue + RegQueryValueEx RegReplaceKey RegRestoreKey + RegSaveKey RegSetKeySecurity RegSetValue + RegSetValueEx RegUnLoadKey )], + FuncA => [qw( + AbortSystemShutdownA InitiateSystemShutdownA + RegConnectRegistryA RegCreateKeyA RegCreateKeyExA + RegDeleteKeyA RegDeleteValueA RegEnumKeyA + RegEnumKeyExA RegEnumValueA RegLoadKeyA + RegOpenKeyA RegOpenKeyExA RegQueryInfoKeyA + RegQueryMultipleValuesA RegQueryValueA RegQueryValueExA + RegReplaceKeyA RegRestoreKeyA RegSaveKeyA + RegSetValueA RegSetValueExA RegUnLoadKeyA )], + FuncW => [qw( + AbortSystemShutdownW InitiateSystemShutdownW + RegConnectRegistryW RegCreateKeyW RegCreateKeyExW + RegDeleteKeyW RegDeleteValueW RegEnumKeyW + RegEnumKeyExW RegEnumValueW RegLoadKeyW + RegOpenKeyW RegOpenKeyExW RegQueryInfoKeyW + RegQueryMultipleValuesW RegQueryValueW RegQueryValueExW + RegReplaceKeyW RegRestoreKeyW RegSaveKeyW + RegSetValueW RegSetValueExW RegUnLoadKeyW )], + HKEY_ => [qw( + HKEY_CLASSES_ROOT HKEY_CURRENT_CONFIG HKEY_CURRENT_USER + HKEY_DYN_DATA HKEY_LOCAL_MACHINE HKEY_PERFORMANCE_DATA + HKEY_USERS )], + KEY_ => [qw( + KEY_QUERY_VALUE KEY_SET_VALUE KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS KEY_NOTIFY KEY_CREATE_LINK + KEY_READ KEY_WRITE KEY_EXECUTE + KEY_ALL_ACCESS), + 'KEY_DELETE', # DELETE (0x00010000L) + 'KEY_READ_CONTROL', # READ_CONTROL (0x00020000L) + 'KEY_WRITE_DAC', # WRITE_DAC (0x00040000L) + 'KEY_WRITE_OWNER', # WRITE_OWNER (0x00080000L) + 'KEY_SYNCHRONIZE', # SYNCHRONIZE (0x00100000L) (not used) + ], + REG_ => [qw( + REG_OPTION_RESERVED REG_OPTION_NON_VOLATILE REG_OPTION_VOLATILE + REG_OPTION_CREATE_LINK REG_OPTION_BACKUP_RESTORE + REG_OPTION_OPEN_LINK REG_LEGAL_OPTION REG_CREATED_NEW_KEY + REG_OPENED_EXISTING_KEY REG_WHOLE_HIVE_VOLATILE REG_REFRESH_HIVE + REG_NO_LAZY_FLUSH REG_NOTIFY_CHANGE_ATTRIBUTES + REG_NOTIFY_CHANGE_NAME REG_NOTIFY_CHANGE_LAST_SET + REG_NOTIFY_CHANGE_SECURITY REG_LEGAL_CHANGE_FILTER + REG_NONE REG_SZ REG_EXPAND_SZ + REG_BINARY REG_DWORD REG_DWORD_LITTLE_ENDIAN + REG_DWORD_BIG_ENDIAN REG_LINK REG_MULTI_SZ + REG_RESOURCE_LIST REG_FULL_RESOURCE_DESCRIPTOR + REG_RESOURCE_REQUIREMENTS_LIST )], + SE_ => [qw( + SE_ASSIGNPRIMARYTOKEN_NAME SE_AUDIT_NAME + SE_BACKUP_NAME SE_CHANGE_NOTIFY_NAME + SE_CREATE_PAGEFILE_NAME SE_CREATE_PERMANENT_NAME + SE_CREATE_TOKEN_NAME SE_DEBUG_NAME + SE_INCREASE_QUOTA_NAME SE_INC_BASE_PRIORITY_NAME + SE_LOAD_DRIVER_NAME SE_LOCK_MEMORY_NAME + SE_MACHINE_ACCOUNT_NAME SE_PROF_SINGLE_PROCESS_NAME + SE_REMOTE_SHUTDOWN_NAME SE_RESTORE_NAME + SE_SECURITY_NAME SE_SHUTDOWN_NAME + SE_SYSTEMTIME_NAME SE_SYSTEM_ENVIRONMENT_NAME + SE_SYSTEM_PROFILE_NAME SE_TAKE_OWNERSHIP_NAME + SE_TCB_NAME SE_UNSOLICITED_INPUT_NAME )], +); +@EXPORT_OK= (); +{ my $ref; + foreach $ref ( values(%EXPORT_TAGS) ) { + push( @EXPORT_OK, @$ref ) unless $ref->[0] =~ /^SE_/; + } +} +$EXPORT_TAGS{ALL}= [ @EXPORT_OK ]; # \@EXPORT_OK once SE_* settles down. +# push( @EXPORT_OK, "JHEREG_TACOSALAD" ); # Used to test Mkconst2perl +push( @EXPORT_OK, @{$EXPORT_TAGS{SE_}} ); + +bootstrap Win32API::Registry $VERSION; + +# Preloaded methods go here. + +# To convert C constants to Perl code in cRegistry.pc +# [instead of C or C++ code in cRegistry.h]: +# * Modify F<Makefile.PL> to add WriteMakeFile() => +# CONST2PERL/postamble => [[ "Win32API::Registry" => ]] WRITE_PERL => 1. +# * Either comment out C<#include "cRegistry.h"> from F<Registry.xs> +# or make F<cRegistry.h> an empty file. +# * Make sure the following C<if> block is not commented out. +# * "nmake clean", "perl Makefile.PL", "nmake" + +if( ! defined ®_NONE ) { + require "Win32API/Registry/cRegistry.pc"; +} + +# This would be convenient but inconsistant and hard to explain: +#push( @{$EXPORT_TAGS{ALL}}, @{$EXPORT_TAGS{SE_}} ) +# if defined &SE_TCB_NAME; + +sub regConstant +{ + my( $name )= @_; + if( 1 != @_ || ! $name || $name =~ /\W/ ) { + require Carp; + Carp::croak( 'Usage: ',__PACKAGE__,'::regConstant("CONST_NAME")' ); + } + my $proto= prototype $name; + if( defined \&$name + && defined $proto + && "" eq $proto ) { + no strict 'refs'; + return &$name; + } + return undef; +} + +# We provide this for backwards compatibility: +sub constant +{ + my( $name )= @_; + my $value= regConstant( $name ); + if( defined $value ) { + $!= 0; + return $value; + } + $!= 11; # EINVAL + return 0; +} + +# BEGIN { +# my $code= 'return _regLastError(@_)'; +# local( $!, $^E )= ( 1, 1 ); +# if( $! ne $^E ) { +# $code= ' +# local( $^E )= _regLastError(@_); +# my $ret= $^E; +# return $ret; +# '; +# } +# eval "sub regLastError { $code }"; +# die "$@" if $@; +# } + +package Win32API::Registry::_error; + +use overload + '""' => sub { + require Win32 unless defined &Win32::FormatMessage; + $_ = Win32::FormatMessage(Win32API::Registry::_regLastError()); + tr/\r\n//d; + return $_; + }, + '0+' => sub { Win32API::Registry::_regLastError() }, + 'fallback' => 1; + +sub new { return bless {}, shift } +sub set { Win32API::Registry::_regLastError($_[1]); return $_[0] } + +package Win32API::Registry; + +my $_error = new Win32API::Registry::_error; + +sub regLastError { + require Carp; + Carp::croak('Usage: ',__PACKAGE__,'::regLastError( [$setWin32ErrCode] )') if @_ > 1; + $_error->set($_[0]) if defined $_[0]; + return $_error; +} + +# Since we ISA DynaLoader which ISA AutoLoader, we ISA AutoLoader so we +# need this next chunk to prevent Win32API::Registry->nonesuch() from +# looking for "nonesuch.al" and producing confusing error messages: +use vars qw($AUTOLOAD); +sub AUTOLOAD { + require Carp; + Carp::croak( + "Can't locate method $AUTOLOAD via package Win32API::Registry" ); +} + +# Replace "&rout;" with "goto &rout;" when that is supported on Win32. + +# Let user omit all buffer sizes: +sub RegEnumKeyExA { + if( 6 == @_ ) { splice(@_,4,0,[]); splice(@_,2,0,[]); } + &_RegEnumKeyExA; +} +sub RegEnumKeyExW { + if( 6 == @_ ) { splice(@_,4,0,[]); splice(@_,2,0,[]); } + &_RegEnumKeyExW; +} +sub RegEnumValueA { + if( 6 == @_ ) { splice(@_,2,0,[]); push(@_,[]); } + &_RegEnumValueA; +} +sub RegEnumValueW { + if( 6 == @_ ) { splice(@_,2,0,[]); push(@_,[]); } + &_RegEnumValueW; +} +sub RegQueryInfoKeyA { + if( 11 == @_ ) { splice(@_,2,0,[]); } + &_RegQueryInfoKeyA; +} +sub RegQueryInfoKeyW { + if( 11 == @_ ) { splice(@_,2,0,[]); } + &_RegQueryInfoKeyW; +} + +sub RegEnumKeyA { + push(@_,[]) if 3 == @_; + &_RegEnumKeyA; +} +sub RegEnumKeyW { + push(@_,[]) if 3 == @_; + &_RegEnumKeyW; +} +sub RegGetKeySecurity { + push(@_,[]) if 3 == @_; + &_RegGetKeySecurity; +} +sub RegQueryMultipleValuesA { + push(@_,[]) if 4 == @_; + &_RegQueryMultipleValuesA; +} +sub RegQueryMultipleValuesW { + push(@_,[]) if 4 == @_; + &_RegQueryMultipleValuesW; +} +sub RegQueryValueA { + push(@_,[]) if 3 == @_; + &_RegQueryValueA; +} +sub RegQueryValueW { + push(@_,[]) if 3 == @_; + &_RegQueryValueW; +} +sub RegQueryValueExA { + push(@_,[]) if 5 == @_; + &_RegQueryValueExA; +} +sub RegQueryValueExW { + push(@_,[]) if 5 == @_; + &_RegQueryValueExW; +} +sub RegSetValueA { + push(@_,0) if 4 == @_; + &_RegSetValueA; +} +sub RegSetValueW { + push(@_,0) if 4 == @_; + &_RegSetValueW; +} +sub RegSetValueExA { + push(@_,0) if 5 == @_; + &_RegSetValueExA; +} +sub RegSetValueExW { + push(@_,0) if 5 == @_; + &_RegSetValueExW; +} + +# Aliases for non-Unicode functions: +sub AbortSystemShutdown { &AbortSystemShutdownA; } +sub InitiateSystemShutdown { &InitiateSystemShutdownA; } +sub RegConnectRegistry { &RegConnectRegistryA; } +sub RegCreateKey { &RegCreateKeyA; } +sub RegCreateKeyEx { &RegCreateKeyExA; } +sub RegDeleteKey { &RegDeleteKeyA; } +sub RegDeleteValue { &RegDeleteValueA; } +sub RegEnumKey { &RegEnumKeyA; } +sub RegEnumKeyEx { &RegEnumKeyExA; } +sub RegEnumValue { &RegEnumValueA; } +sub RegLoadKey { &RegLoadKeyA; } +sub RegOpenKey { &RegOpenKeyA; } +sub RegOpenKeyEx { &RegOpenKeyExA; } +sub RegQueryInfoKey { &RegQueryInfoKeyA; } +sub RegQueryMultipleValues { &RegQueryMultipleValuesA; } +sub RegQueryValue { &RegQueryValueA; } +sub RegQueryValueEx { &RegQueryValueExA; } +sub RegReplaceKey { &RegReplaceKeyA; } +sub RegRestoreKey { &RegRestoreKeyA; } +sub RegSaveKey { &RegSaveKeyA; } +sub RegSetValue { &RegSetValueA; } +sub RegSetValueEx { &RegSetValueExA; } +sub RegUnLoadKey { &RegUnLoadKeyA; } + +1; +__END__ + +=head1 NAME + +Win32API::Registry - Low-level access to Win32 system API calls from WINREG.H + +=head1 SYNOPSIS + + use Win32API::Registry 0.21 qw( :ALL ); + + RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SYSTEM\\Disk", 0, KEY_READ, $key ); + or die "Can't open HKEY_LOCAL_MACHINE\\SYSTEM\\Disk: ", + regLastError(),"\n"; + RegQueryValueEx( $key, "Information", [], $type, $data, [] ); + or die "Can't read HKEY_L*MACHINE\\SYSTEM\\Disk\\Information: ", + regLastError(),"\n"; + [...] + RegCloseKey( $key ) + or die "Can't close HKEY_LOCAL_MACHINE\\SYSTEM\\Disk: ", + regLastError(),"\n"; + +=head1 DESCRIPTION + +This provides fairly low-level access to the Win32 System API +calls dealing with the Registry [mostly from WINREG.H]. This +is mostly intended to be used by other modules such as +C<Win32::TieRegistry> [which provides an extremely Perl-friendly +method for using the Registry]. + +For a description of the logical structure of the Registry, see +the documentation for the C<Win32::TieRegistry> module. + +To pass in C<NULL> as the pointer to an optional buffer, pass in +an empty list reference, C<[]>. + +Beyond raw access to the API calls and related constants, this module +handles smart buffer allocation and translation of return codes. + +All calls return a true value for success and a false value for +failure. After any failure, C<$^E> should automatically be set +to indicate the reason. However, current versions of Perl often +overwrite C<$^E> too quickly, so you can use C<regLastError()> +instead, which is only set by Win32API::Registry routines. + +Note that C<$!> is not set by these routines except by +C<Win32API::Registry::constant()> when a constant is not defined. + +=head2 Exports + +Nothing is exported by default. The following tags can be used to +have sets of symbols exported. + +[Note that much of the following documentation refers to the +behavior of the underlying API calls which may vary in current +and future versions of the Win32 API without any changes to this +module. Therefore you should check the Win32 API documentation +directly when needed.] + +=over + +=item :Func + +The basic function names: + +=over + +=item AllowPriv + +=item C<AllowPriv( $sPrivName, $bEnable )> + +Not a Win32 API call. Enables or disables a specific privilege for +the current process. Returns a true value if successful and a false +value [and sets C<$^E>/C<regLastError()>] on failure. This routine +does not provide a way to tell if a privilege is currently enabled. + +C<$sPrivname> is a Win32 privilege name [see L</:SE_>]. For example, +C<"SeBackupPrivilege"> [a.k.a. C<SE_BACKUP_NAME>] controls whether +you can use C<RegSaveKey()> and C<"SeRestorePrivilege"> [a.k.a. +C<SE_RESTORE_NAME>] controls whether you can use C<RegLoadKey()>. + +If C<$bEnable> is true, then C<AllowPriv()> tries to enable the +privilege. Otherwise it tries to disable the privilege. + +=item AbortSystemShutdown + +=item C<AbortSystemShutdown( $sComputerName )> + +Tries to abort a remote shutdown request previously made via +C<InitiateSystemShutdown()>. Returns a true value if successful +and a false value [and sets C<$^E>/C<regLastError()>] on failure. + +=item InitiateSystemShutdown + +=item C<InitiateSystemShutdown( $sComputer, $sMessage, $uTimeoutSecs, $bForce, $bReboot )> + +Requests that a [remote] computer be shutdown or rebooted. +Returns a true value if successful and a false value [and +sets C<$^E>/C<regLastError()>] on failure. + +C<$sComputer> is the name [or address] of the computer to be +shutdown or rebooted. You can use C<[]> [for C<NULL>] or C<""> +to indicate the local computer. + +C<$sMessage> is the message to be displayed in a pop-up window +on the desktop of the computer to be shutdown or rebooted until +the timeout expires or the shutdown is aborted via +C<AbortSystemShutdown()>. With C<$iTimeoutSecs == 0>, the +message will never be visible. + +C<$iTimeoutSecs> is the number of seconds to wait before starting +the shutdown. + +If C<$bForce> is false, then any applications running on the remote +computer get a chance to prompt the remote user whether they want +to save changes. Also, for any applications that do not exit quickly +enough, the operating system will prompt the user whether they wish +to wait longer for the application to exit or force it to exit now. +At any of these prompts the user can press B<CANCEL> to abort the +shutdown but if no applications have unsaved data, they will likely +all exit quickly and the shutdown will progress with the remote user +having no option to cancel the shutdown. + +If C<$bForce> is true, all applications are told to exit immediately +and so will not prompt the user even if there is unsaved data. Any +applications that take too long to exit will be forcibly killed after +a short time. The only way to abort the shutdown is to call +C<AbortSystemShutdown()> before the timeout expires and there is no +way to abort the shutdown once it has begun. + +If C<$bReboot> is true, the computer will automatically reboot once +the shutdown is complete. If C<$bReboot> is false, then when the +shutdown is complete the computer will halt at a screen indicating +that the shutdown is complete and offering a way for the user to +start to boot the computer. + +You must have the C<"SeRemoteShutdownPrivilege"> privilege +on the remote computer for this call to succeed. If shutting +down the local computer, then the calling process must have +the C<"SeShutdownPrivilege"> privilege and have it enabled. + +=item RegCloseKey + +=item C<RegCloseKey( $hKey )> + +Closes the handle to a Registry key returned by C<RegOpenKeyEx()>, +C<RegConnectRegistry()>, C<RegCreateKeyEx()>, or a few other +routines. Returns a true value if successful and a false value +[and sets C<$^E>/C<regLastError()>] on failure. + +=item RegConnectRegistry + +=item C<RegConnectRegistry( $sComputer, $hRootKey, $ohKey )> + +Connects to one of the root Registry keys of a remote computer. +Returns a true value if successful and a false value [and +sets C<$^E>/C<regLastError()>] on failure. + +C<$sComputer> is the name [or address] of a remote computer +whose Registry you wish to access. + +C<$hKey> must be either C<HKEY_LOCAL_MACHINE> or C<HKEY_USERS> +and specifies which root Registry key on the remote computer +you wish to have access to. + +C<$phKey> will be set to the handle to be used to access the +remote Registry key if the call succeeds. + +=item regConstant + +=item C<$value= regConstant( $sConstantName )> + +Fetch the value of a constant. Returns C<undef> if C<$sConstantName> +is not the name of a constant supported by this module. Never sets +C<$!> nor C<$^E>. + +This function is rarely used since you will usually get the value of a +constant by having that constant imported into your package by listing +the constant name in the C<use Win32API::Registry> statement and then +simply using the constant name in your code [perhaps followed by +C<()>]. This function is useful for verifying constant names not in +Perl code, for example, after prompting a user to type in a constant +name. + +=item RegCreateKey + +=item C<RegCreateKey( $hKey, $sSubKey, $ohSubKey )> + +This routine is meant only for compatibility with Windows version +3.1. Use C<RegCreateKeyEx()> instead. + +=item RegCreateKeyEx + +=item C<RegCreateKeyEx( $hKey, $sSubKey, $uZero, $sClass, $uOpts, $uAccess, $pSecAttr, $ohNewKey, $ouDisp )> + +Creates a new Registry subkey. Returns a true value if successful and +a false value [and sets C<$^E>/C<regLastError()>] on failure. + +C<$hKey> is the handle to a Registry key [either C<HKEY_*> or from +a previous call]. + +C<$sSubKey> is the name of the new subkey to be created. + +C<$iZero> is reserved for future use and should always be specified +as C<0>. + +C<$sClass> is a string to be used as the class for the new +subkey. We are not aware of any current use for Registry key +class information so the empty string, C<"">, should usually +be used here. + +C<$iOpts> is a numeric value containing bits that control options +used while creating the new subkey. C<REG_OPTION_NON_VOLATILE> +is the default. C<REG_OPTION_VOLATILE> [which is ignored on +Windows 95] means the data stored under this key is not kept +in a file and will not be preserved when the system reboots. +C<REG_OPTION_BACKUP_RESTORE> [also ignored on Windows 95] means +ignore the C<$iAccess> parameter and try to open the new key with +the access required to backup or restore the key. + +C<$iAccess> is a numeric mask of bits specifying what type of +access is desired when opening the new subkey. See C<RegOpenKeyEx()>. + +C<$pSecAttr> is a C<SECURITY_ATTRIBUTES> structure packed into +a Perl string which controls whether the returned handle can be +inherited by child processes. Normally you would pass C<[]> for +this parameter to have C<NULL> passed to the underlying API +indicating that the handle cannot be inherited. If not under +Windows95, then C<$pSecAttr> also allows you to specify +C<SECURITY_DESCRIPTOR> that controls which users will have +what type of access to the new key -- otherwise the new key +inherits its security from its parent key. + +C<$phKey> will be set to the handle to be used to access the new +subkey if the call succeeds. + +C<$piDisp> will be set to either C<REG_CREATED_NEW_KEY> or +C<REG_OPENED_EXISTING_KEY> to indicate for which reason the +call succeeded. Can be specified as C<[]> if you don't care. + +If C<$phKey> and C<$piDisp> start out as integers, then they will +probably remain unchanged if the call fails. + +=item RegDeleteKey + +=item C<RegDeleteKey( $hKey, $sSubKey )> + +Deletes a subkey of an open Registry key provided that the subkey +contains no subkeys of its own [but the subkey may contain values]. +Returns a true value if successful and a false value [and sets +C<$^E>/C<regLastError()>] on failure. + +C<$hKey> is the handle to a Registry key [either C<HKEY_*> or from +a previous call]. + +C<$sSubKey> is the name of the subkey to be deleted. + +=item RegDeleteValue + +=item C<RegDeleteValue( $hKey, $sValueName )> + +Deletes a value from an open Registry key. Returns a true value if +successful and a false value [and sets C<$^E>/C<regLastError()>] on +failure. + +C<$hKey> is the handle to a Registry key [either C<HKEY_*> or from +a previous call]. + +C<$sValueKey> is the name of the value to be deleted. + +=item RegEnumKey + +=item C<RegEnumKey( $hKey, $uIndex, $osName, $ilNameSize )> + +This routine is meant only for compatibility with Windows version +3.1. Use C<RegEnumKeyEx()> instead. + +=item RegEnumKeyEx + +=item C<RegEnumKeyEx( $hKey, $uIndex, $osName, $iolName, $pNull, $osClass, $iolClass, $opftLastWrite )> + +Lets you enumerate the names of all of the subkeys directly under +an open Registry key. Returns a true value if successful and a false +value [and sets C<$^E>/C<regLastError()>] on failure. + +C<$hKey> is the handle to a Registry key [either C<HKEY_*> or from +a previous call]. + +C<$iIndex> is the sequence number of the immediate subkey that +you want information on. Start with this value as C<0> then +repeat the call incrementing this value each time until the +call fails with C<$^E>/C<regLastError()> numerically equal to +C<ERROR_NO_MORE_ITEMS>. + +C<$sName> will be set to the name of the subkey. Can be C<[]> if +you don't care about the name. + +C<$plName> initially specifies the [minimum] buffer size to be +allocated for C<$sName>. Will be set to the length of the subkey +name if the requested subkey exists even if C<$sName> isn't +successfully set to the subkey name. See L<Buffer sizes> for +more information. + +C<$pNull> is reserved for future used and should be passed as C<[]>. + +C<$sClass> will be set to the class name for the subkey. Can be +C<[]> if you don't care about the class. + +C<$plClass> initially specifies the [minimum] buffer size to be +allocated for C<$sClass> and will be set to the length of the +subkey class name if the requested subkey exists. See L<Buffer +sizes> for more information. + +C<$pftLastWrite> will be set to a C<FILETIME> structure packed +into a Perl string and indicating when the subkey was last changed. +Can be C<[]>. + +You may omit both C<$plName> and C<$plClass> to get the same effect +as passing in C<[]> for each of them. + +=item RegEnumValue + +=item C<RegEnumValue( $hKey, $uIndex, $osValName, $iolValName, $pNull, $ouType, $opValData, $iolValData )> + +Lets you enumerate the names of all of the values contained in an +open Registry key. Returns a true value if successful and a false +value [and sets C<$^E>/C<regLastError()>] on failure. + +C<$hKey> is the handle to a Registry key [either C<HKEY_*> or from +a previous call]. + +C<$iIndex> is the sequence number of the value that you want +information on. Start with this value as C<0> then repeat the +call incrementing this value each time until the call fails with +C<ERROR_NO_MORE_ITEMS>. + +C<$sValName> will be set to the name of the value. Can be C<[]> +if you don't care about the name. + +C<$plValName> initially specifies the [minimum] buffer size to be +allocated for C<$sValName>. Will be set to the length of the value +name if the requested value exists even if C<$sValName> isn't +successfully set to the value name. See L<Buffer sizes> for +more information. + +C<$pNull> is reserved for future used and should be passed as C<[]>. + +C<$piType> will be set to the type of data stored in the value data. +If the call succeeds, it will be set to a C<REG_*> value unless +passed in as C<[]>. + +C<$pValData> will be set to the data [packed into a Perl string] +that is stored in the requested value. Can be C<[]> if you don't +care about the value data. + +C<$plValData> initially specifies the [minimum] buffer size to be +allocated for C<$sValData> and will be set to the length of the +value data if the requested value exists. See L<Buffer sizes> for +more information. + +You may omit both C<$plValName> and C<$plValData> to get the same +effect as passing in C<[]> for each of them. + +=item RegFlushKey + +=item C<RegFlushKey( $hKey )> + +Forces the data stored under an open Registry key to be flushed +to the disk file where the data is preserved between reboots. +Forced flushing is not guaranteed to be efficient so this routine +should almost never be called. Returns a true value if successful +and a false value [and sets C<$^E>/C<regLastError()>] on failure. + +C<$hKey> is the handle to a Registry key [either C<HKEY_*> or from +a previous call]. + +=item RegGetKeySecurity + +=item C<RegGetKeySecurity( $hKey, $uSecInfo, $opSecDesc, $iolSecDesc )> + +Retrieves one of the C<SECURITY_DESCRIPTOR> structures describing +part of the security for an open Registry key. Returns a true value +if successful and a false value [and sets C<$^E>/C<regLastError()>] +on failure. + +C<$hKey> is the handle to a Registry key [either C<HKEY_*> or from +a previous call]. + +C<$iSecInfo> is a numeric C<SECURITY_INFORMATION> value that +specifies which parts of the C<SECURITY_DESCRIPTOR> structure +to retrieve. Should be C<OWNER_SECURITY_INFORMATION>, +C<GROUP_SECURITY_INFORMATION>, C<DACL_SECURITY_INFORMATION>, or +or C<SACL_SECURITY_INFORMATION> or two or more of these bits +combined using C<|>. + +C<$pSecDesc> will be set to the requested C<SECURITY_DESCRIPTOR> +structure [packed into a Perl string]. + +C<$plSecDesc> initially specifies the [minimum] buffer size to be +allocated for C<$sSecDesc> and will be set to the length of the +security descriptor. See L<Buffer sizes> for more information. +You may omit this parameter to get the same effect as passing in +C<[]> for it. + +=item regLastError + +=item C<$svError= regLastError();> + +=item C<regLastError( $uError );> + +Returns the last error encountered by a routine from this module. +It is just like C<$^E> except it isn't changed by anything except +routines from this module. Ideally you could just use C<$^E>, but +current versions of Perl often overwrite C<$^E> before you get a +chance to check it and really old versions of Perl don't really +support C<$^E> under Win32. + +Just like C<$^E>, in a numeric context C<regLastError()> returns +the numeric error value while in a string context it returns a +text description of the error [actually it returns a Perl scalar +that contains both values so C<$x= regLastError()> causes C<$x> +to give different values in string vs. numeric contexts]. + +The last form sets the error returned by future calls to +C<regLastError()> and should not be used often. C<$uError> must +be a numeric error code. Also returns the dual-valued version +of C<$uError>. + +=item RegLoadKey + +=item C<RegLoadKey( $hKey, $sSubKey, $sFileName )> + +Loads a hive file. That is, it creates a new subkey in the +Registry and associates that subkey with a disk file that contains +a Registry hive so that the new subkey can be used to access the +keys and values stored in that hive. Hives are usually created +via C<RegSaveKey()>. Returns a true value if successful and a +false value [and sets C<$^E>/C<regLastError()>] on failure. + +C<$hKey> is the handle to a Registry key that can have hives +loaded to it. This must be C<HKEY_LOCAL_MACHINE>, C<HKEY_USERS>, +or a remote version of one of these from a call to +C<RegConnectRegistry()>. + +C<$sSubKey> is the name of the new subkey to created and associated +with the hive file. + +C<$sFileName> is the name of the hive file to be loaded. This +file name is interpretted relative to the +C<%SystemRoot%/System32/config> directory on the computer where +the C<$hKey> key resides. If C<$sFileName> is on a FAT file +system, then its name must not have an extension. + +You must have the C<SE_RESTORE_NAME> privilege to use this routine. + +WARNING: Loading of hive files via a network share may silently +corrupt the hive and so should not be attempted [this is a problem +in at least some versions of the underlying API which this module +does not try to fix or avoid]. To access a hive file located on a +remote computer, connect to the remote computer's Registry and load +the hive via that. + +=item RegNotifyChangeKeyValue + +=item C<RegNotifyChangeKeyValue( $hKey, $bWatchSubtree, $uNotifyFilter, $hEvent, $bAsync )> + +Arranges for your process to be notified when part of the Registry +is changed. Returns a true value if successful and a false value +[and sets C<$^E>/C<regLastError()>] on failure. + +C<$hKey> is the handle to a Registry key [either C<HKEY_*> or from +a previous call] for which you wish to be notified when any changes +are made to it. + +If C<$bWatchSubtree> is true, then changes to any subkey or +descendant of C<$hKey> are also reported. + +C<$iNotifyFilter> controllers what types of changes are reported. It +is a numeric value containing one or more of the following bit masks: + +=over + +=item C<REG_NOTIFY_CHANGE_NAME> + +Notify if a subkey is added or deleted to a monitored key. + +=item C<REG_NOTIFY_CHANGE_LAST_SET> + +Notify if a value in a monitored key is added, deleted, or modified. + +=item C<REG_NOTIFY_CHANGE_SECURITY> + +Notify if a security descriptor of a monitored key is changed. + +=item C<REG_NOTIFY_CHANGE_ATTRIBUTES> + +Notify if any attributes of a monitored key are changed [class +name or security descriptors]. + +=back + +C<$hEvent> is ignored unless C<$bAsync> is true. Otherwise, C<$hEvent> +is a handle to a Win32 I<event> that will be signaled when changes are +to be reported. + +If C<$bAsync> is true, then C<RegNotifyChangeKeyValue()> returns +immediately and uses C<$hEvent> to notify your process of changes. +If C<$bAsync> is false, then C<RegNotifyChangeKeyValue()> does +not return until there is a change to be notified of. + +This routine does not work with Registry keys on remote computers. + +=item RegOpenKey + +=item C<RegOpenKey( $hKey, $sSubKey, $ohSubKey )> + +This routine is meant only for compatibility with Windows version +3.1. Use C<RegOpenKeyEx()> instead. + +=item RegOpenKeyEx + +=item C<RegOpenKeyEx( $hKey, $sSubKey, $uOptions, $uAccess, $ohSubKey )> + +Opens an existing Registry key. Returns a true value if successful +and a false value [and sets C<$^E>/C<regLastError()>] on failure. + +C<$hKey> is the handle to a Registry key [either C<HKEY_*> or from +a previous call]. + +C<$sSubKey> is the name of an existing subkey to be opened. +Can be C<""> or C<[]> to open an additional handle to the +key specified by C<$hKey>. + +C<$iOptions> is a numeric value containing bits that control options +used while opening the subkey. There are currently no supported +options so this parameter should be specified as C<0>. + +C<$iAccess> is a numeric mask of bits specifying what type of +access is desired when opening the new subkey. Should be a +combination of one or more of the following bit masks: + +=over + +=item C<KEY_ALL_ACCESS> + + KEY_READ | KEY_WRITE | KEY_CREATE_LINK + +=item C<KEY_READ> + + KEY_QUERY_VALUE | KEY_ENUMERATE_SUBKEYS | KEY_NOTIFY | STANDARD_RIGHTS_READ + +=item C<KEY_WRITE> + + KEY_SET_VALUE | KEY_CREATE_SUB_KEY | STANDARD_RIGHTS_WRITE + +=item C<KEY_QUERY_VALUE> + +=item C<KEY_SET_VALUE> + +=item C<KEY_ENUMERATE_SUB_KEYS> + +=item C<KEY_CREATE_SUB_KEY> + +=item C<KEY_NOTIFY> + +Allows you to use C<RegNotifyChangeKeyValue()> on the opened key. + +=item C<KEY_EXECUTE> + +Same as C<KEY_READ>. + +=item C<KEY_CREATE_LINK> + +Gives you permission to create a symbolic link like +C<HKEY_CLASSES_ROOT> and C<HKEY_CURRENT_USER>, though the method for +doing so is not documented [and probably requires use of the mostly +undocumented "native" routines, C<Nt*()> a.k.a. C<Zw*()>]. + +=back + +C<$phKey> will be set to the handle to be used to access the new subkey +if the call succeeds. + +=item RegQueryInfoKey + +=item C<RegQueryInfoKey( $hKey, $osClass, $iolClass, $pNull, $ocSubKeys, $olSubKey, $olSubClass, $ocValues, $olValName, $olValData, $olSecDesc, $opftTime )> + +Gets miscellaneous information about an open Registry key. +Returns a true value if successful and a false value [and +sets C<$^E>/C<regLastError()>] on failure. + +C<$hKey> is the handle to a Registry key [either C<HKEY_*> or from +a previous call]. + +C<$sClass> will be set to the class name for the key. Can be +C<[]> if you don't care about the class. + +C<$plClass> initially specifies the [minimum] buffer size to be +allocated for C<$sClass> and will be set to the length of the +key's class name. See L<Buffer sizes> for more information. +You may omit this parameter to get the same effect as passing in +C<[]> for it. + +C<$pNull> is reserved for future use and should be passed as C<[]>. + +C<$pcSubKeys> will be set to the count of the number of subkeys +directly under this key. Can be C<[]>. + +C<$plSubKey> will be set to the length of the longest subkey name. +Can be C<[]>. + +C<$plSubClass> will be set to the length of the longest class name +used with an immediate subkey of this key. Can be C<[]>. + +C<$pcValues> will be set to the count of the number of values in +this key. Can be C<[]>. + +C<$plValName> will be set to the length of the longest value name +in this key. Can be C<[]>. + +C<$plValData> will be set to the length of the longest value data +in this key. Can be C<[]>. + +C<$plSecDesc> will be set to the length of this key's full security +descriptor. + +C<$pftTime> will be set to a C<FILETIME> structure packed +into a Perl string and indicating when this key was last changed. +Can be C<[]>. + +=item RegQueryMultipleValues + +=item C<RegQueryMultipleValues( $hKey, $ioarValueEnts, $icValueEnts, $opBuffer, $iolBuffer )> + +Allows you to use a single call to query several values from a single +open Registry key to maximize efficiency. Returns a true value if +successful and a false value [and sets C<$^E>/C<regLastError()>] on +failure. + +C<$hKey> is the handle to a Registry key [either C<HKEY_*> or from +a previous call]. + +C<$pValueEnts> should contain a list of C<VALENT> structures packed +into a single Perl string. Each C<VALENT> structure should have +the C<ve_valuename> entry [the first 4 bytes] pointing to a string +containing the name of a value stored in this key. The remaining +fields are set if the function succeeds. + +C<$cValueEnts> should contain the count of the number of C<VALENT> +structures contained in C<$pValueEnts>. + +C<$pBuffer> will be set to the data from all of the requested values +concatenated into a single Perl string. + +C<$plBuffer> initially specifies the [minimum] buffer size to be +allocated for C<$sBuffer> and will be set to the total length of +the data to be written to C<$sBuffer>. See L<Buffer sizes> for +more information. You may omit this parameter to get the same +effect as passing in C<[]> for it. + +Here is sample code to populate C<$pValueEnts>: + + # @ValueNames= ...list of value name strings...; + $cValueEnts= @ValueNames; + $pValueEnts= pack( " p x4 x4 x4 " x $cValueEnts, @ValueNames ); + +Here is sample code to retrieve the data type and data length +returned in C<$pValueEnts>: + + @Lengths= unpack( " x4 L x4 x4 " x $cValueEnts, $pValueEnts ); + @Types= unpack( " x4 x4 x4 L " x $cValueEnts, $pValueEnts ); + +Given the above, and assuming you haven't modified C<$sBuffer> since +the call, you can also extract the value data strings from C<$sBuffer> +by using the pointers returned in C<$pValueEnts>: + + @Data= unpack( join( "", map {" x4 x4 P$_ x4 "} @Lengths ), + $pValueEnts ); + +Much better is to use the lengths and extract directly from +C<$sBuffer> using C<unpack()> [or C<substr()>]: + + @Data= unpack( join("",map("P$_",@Lengths)), $sBuffer ); + +=item RegQueryValue + +=item C<RegQueryValue( $hKey, $sSubKey, $osValueData, $iolValueData )> + +This routine is meant only for compatibility with Windows version +3.1. Use C<RegQueryValueEx()> instead. This routine can only +query unamed values [a.k.a. "default values"], that is, values with +a name of C<"">. + +=item RegQueryValueEx + +=item C<RegQueryValueEx( $hKey, $sValueName, $pNull, $ouType, $opValueData, $iolValueData )> + +Lets you look up value data stored in an open Registry key by +specifying the value name. Returns a true value if successful +and a false value [and sets C<$^E>/C<regLastError()>] on failure. + +C<$hKey> is the handle to a Registry key [either C<HKEY_*> or from +a previous call]. + +C<$sValueName> is the name of the value whose data you wish to +retrieve. + +C<$pNull> this parameter is reserved for future use and should be +specified as C<[]>. + +C<$piType> will be set to indicate what type of data is stored in +the named value. Will be set to a C<REG_*> value if the function +succeeds. + +C<$pValueData> will be set to the value data [packed into a Perl +string] that is stored in the named value. Can be C<[]> if you +don't care about the value data. + +C<$plValueData> initially specifies the [minimum] buffer size to be +allocated for C<$sValueData> and will be set to the size [always +in bytes] of the data to be written to C<$sValueData>, even if +C<$sValueData> is not successfully written to. See L<Buffer sizes> +for more information. + +=item RegReplaceKey + +=item C<RegReplaceKey( $hKey, $sSubKey, $sNewFile, $sOldFile )> + +Lets you replace an entire hive when the system is next booted. +Returns a true value if successful and a false value [and sets +C<$^E>/C<regLastError()>] on failure. + +C<$hKey> is the handle to a Registry key that has hive(s) +loaded in it. This must be C<HKEY_LOCAL_MACHINE>, +C<HKEY_USERS>, or a remote version of one of these from +a call to C<RegConnectRegistry()>. + +C<$sSubKey> is the name of the subkey of C<$hKey> whose hive +you wish to have replaced on the next reboot. + +C<$sNewFile> is the name of a file that will replace the existing +hive file when the system reboots. + +C<$sOldFile> is the file name to save the current hive file to +when the system reboots. + +C<$sNewFile> and C<$sOldFile> are interpretted relative to the +C<%SystemRoot%/System32/config> directory on the computer where +the C<$hKey> key resides [I think]. If either file is [would be] +on a FAT file system, then its name must not have an extension. + +You must have the C<SE_RESTORE_NAME> privilege to use this routine. + +=item RegRestoreKey + +=item C<RegRestoreKey( $hKey, $sFileName, $uFlags )> + +Reads in a hive file and copies its contents over an existing +Registry tree. Returns a true value if successful and a false +value [and sets C<$^E>/C<regLastError()>] on failure. + +C<$hKey> is the handle to a Registry key [either C<HKEY_*> or from +a previous call]. + +C<$sFileName> is the name of the hive file to be read. For each +value and subkey in this file, a value or subkey will be added +or replaced in C<$hKey>. + +C<$uFlags> is usally C<0>. It can also be C<REG_WHOLE_HIVE_VOLATILE> +which, rather than copying the hive over the existing key, +replaces the existing key with a temporary, memory-only Registry +key and then copies the hive contents into it. This option only +works if C<$hKey> is C<HKEY_LOCAL_MACHINE>, C<HKEY_USERS>, or a +remote version of one of these from a call to C<RegConnectRegistry()>. + +C<RegRestoreKey> does I<not> delete values nor keys from the +existing Registry tree when there is no corresponding value/key +in the hive file. + +=item RegSaveKey + +=item C<RegSaveKey( $hKey, $sFileName, $pSecAttr )> + +Dumps any open Registry key and all of its subkeys and values into +a new hive file. Returns a true value if successful and a false +value [and sets C<$^E>/C<regLastError()>] on failure. + +C<$hKey> is the handle to a Registry key [either C<HKEY_*> or from +a previous call]. + +C<$sFileName> is the name of the file that the Registry tree +should be saved to. It is interpretted relative to the +C<%SystemRoot%/System32/config> directory on the computer where +the C<$hKey> key resides. If C<$sFileName> is on a FAT file system, +then it must not have an extension. + +C<$pSecAttr> contains a C<SECURITY_ATTRIBUTES> structure that specifies +the permissions to be set on the new file that is created. This can +be C<[]>. + +You must have the C<SE_RESTORE_NAME> privilege to use this routine. + +=item RegSetKeySecurity + +=item C<RegSetKeySecurity( $hKey, $uSecInfo, $pSecDesc )> + +Sets [part of] the C<SECURITY_DESCRIPTOR> structure describing part +of the security for an open Registry key. Returns a true value if +successful and a false value [and sets C<$^E>/C<regLastError()>] on +failure. + +C<$hKey> is the handle to a Registry key [either C<HKEY_*> or from +a previous call]. + +C<$uSecInfo> is a numeric C<SECURITY_INFORMATION> value that +specifies which C<SECURITY_DESCRIPTOR> structure to set. Should +be C<OWNER_SECURITY_INFORMATION>, C<GROUP_SECURITY_INFORMATION>, +C<DACL_SECURITY_INFORMATION>, or C<SACL_SECURITY_INFORMATION> +or two or more of these bits combined using C<|>. + +C<$pSecDesc> contains the new C<SECURITY_DESCRIPTOR> structure +packed into a Perl string. + +=item RegSetValue + +=item C<RegSetValue( $hKey, $sSubKey, $uType, $sValueData, $lValueData )> + +This routine is meant only for compatibility with Windows version +3.1. Use C<RegSetValueEx()> instead. This routine can only +set unamed values [a.k.a. "default values"]. + +=item RegSetValueEx + +=item C<RegSetValueEx( $hKey, $sName, $uZero, $uType, $pData, $lData )> + +Adds or replaces a value in an open Registry key. Returns +a true value if successful and a false value [and sets +C<$^E>/C<regLastError()>] on failure. + +C<$hKey> is the handle to a Registry key [either C<HKEY_*> or from +a previous call]. + +C<$sName> is the name of the value to be set. + +C<$uZero> is reserved for future use and should be specified as C<0>. + +C<$uType> is the type of data stored in C<$pData>. It should +be a C<REG_*> value. + +C<$pData> is the value data packed into a Perl string. + +C<$lData> is the length of the value data that is stored in C<$pData>. +You will usually omit this parameter or pass in C<0> to have +C<length($pData)> used. In both of these cases, if C<$iType> is +C<REG_SZ> or C<REG_EXPAND_SZ>, C<RegSetValueEx()> will append a +trailing C<'\0'> to the end of C<$pData> [unless there is already +one]. + +=item RegUnLoadKey + +=item C<RegUnLoadKey( $hKey, $sSubKey )> + +Unloads a previously loaded hive file. That is, closes the +hive file then deletes the subkey that was providing access +to it. Returns a true value if successful and a false value +[and sets C<$^E>/C<regLastError()>] on failure. + +C<$hKey> is the handle to a Registry key that has hives +loaded in it. This must be C<HKEY_LOCAL_MACHINE>, C<HKEY_USERS>, +or a remote version of one of these from a call to +C<RegConnectRegistry()>. + +C<$sSubKey> is the name of the subkey whose hive you wish to +have unloaded. + +=item :FuncA + +The ASCII-specific function names. + +Each of these is identical to the version listed above without the +trailing "A": + + AbortSystemShutdownA InitiateSystemShutdownA + RegConnectRegistryA RegCreateKeyA RegCreateKeyExA + RegDeleteKeyA RegDeleteValueA RegEnumKeyA + RegEnumKeyExA RegEnumValueA RegLoadKeyA + RegOpenKeyA RegOpenKeyExA RegQueryInfoKeyA + RegQueryMultipleValuesA RegQueryValueA RegQueryValueExA + RegReplaceKeyA RegRestoreKeyA RegSaveKeyA + RegSetValueA RegSetValueExA RegUnLoadKeyA + +=item :FuncW + +The UNICODE-specific function names. These are the same as the +versions listed above without the trailing "W" except that string +parameters are UNICODE strings rather than ASCII strings, as +indicated. + +=item AbortSystemShutdownW + +=item C<AbortSystemShutdownW( $swComputerName )> + +C<$swComputerName> is UNICODE. + +=item InitiateSystemShutdownW + +=item C<InitiateSystemShutdownW( $swComputer, $swMessage, $uTimeoutSecs, $bForce, $bReboot )> + +C<$swComputer> and C<$swMessage> are UNICODE. + +=item RegConnectRegistryW + +=item C<RegConnectRegistryW( $swComputer, $hRootKey, $ohKey )> + +C<$swComputer> is UNICODE. + +=item RegCreateKeyW + +=item C<RegCreateKeyW( $hKey, $swSubKey, $ohSubKey )> + +C<$swSubKey> is UNICODE. + +=item RegCreateKeyExW + +=item C<RegCreateKeyExW( $hKey, $swSubKey, $uZero, $swClass, $uOpts, $uAccess, $pSecAttr, $ohNewKey, $ouDisp )> + +C<$swSubKey> and C<$swClass> are UNICODE. + +=item RegDeleteKeyW + +=item C<RegDeleteKeyW( $hKey, $swSubKey )> + +C<$swSubKey> is UNICODE. + +=item RegDeleteValueW + +=item C<RegDeleteValueW( $hKey, $swValueName )> + +C<$swValueName> is UNICODE. + +=item RegEnumKeyW + +=item C<RegEnumKeyW( $hKey, $uIndex, $oswName, $ilwNameSize )> + +C<$oswName> is UNICODE and C<$ilwNameSize> is measured as number of +C<WCHAR>s. + +=item RegEnumKeyExW + +=item C<RegEnumKeyExW( $hKey, $uIndex, $oswName, $iolwName, $pNull, $oswClass, $iolwClass, $opftLastWrite )> + +C<$swName> and C<$swClass> are UNICODE and C<$iolwName> and C<$iolwClass> +are measured as number of C<WCHAR>s. + +=item RegEnumValueW + +=item C<RegEnumValueW( $hKey, $uIndex, $oswName, $iolwName, $pNull, $ouType, $opData, $iolData )> + +C<$oswName> is UNICODE and C<$iolwName> is measured as number +of C<WCHAR>s. + +C<$opData> is UNICODE if C<$piType> is C<REG_SZ>, C<REG_EXPAND_SZ>, +or C<REG_MULTI_SZ>. Note that C<$iolData> is measured as number +of bytes even in these cases. + +=item RegLoadKeyW + +=item C<RegLoadKeyW( $hKey, $swSubKey, $swFileName )> + +C<$swSubKey> and C<$swFileName> are UNICODE. + +=item RegOpenKeyW + +=item C<RegOpenKeyW( $hKey, $swSubKey, $ohSubKey )> + +C<$swSubKey> is UNICODE. + +=item RegOpenKeyExW + +=item C<RegOpenKeyExW( $hKey, $swSubKey, $uOptions, $uAccess, $ohSubKey )> + +C<$swSubKey> is UNICODE. + +=item RegQueryInfoKeyW + +=item C<RegQueryInfoKeyW( $hKey, $oswClass, $iolwClass, $pNull, $ocSubKeys, $olwSubKey, $olwSubClass, $ocValues, $olwValName, $olValData, $olSecDesc, $opftTime )> + +C<$swClass> is UNICODE. C<$iolwClass>, C<$olwSubKey>, C<$olwSubClass>, +and C<$olwValName> are measured as number of C<WCHAR>s. Note that +C<$olValData> is measured as number of bytes. + +=item RegQueryMultipleValuesW + +=item C<RegQueryMultipleValuesW( $hKey, $ioarValueEnts, $icValueEnts, $opBuffer, $iolBuffer )> + +The C<ve_valuename> fields of the C<VALENT> [actually C<VALENTW>] +structures in C<$ioarValueEnts> are UNICODE. Values of type C<REG_SZ>, +C<REG_EXPAND_SZ>, and C<REG_MULTI_SZ> are written to C<$opBuffer> +in UNICODE. Note that C<$iolBuffer> and the C<ve_valuelen> fields +of the C<VALENT> [C<VALENTW>] structures are measured as number of +bytes. + +=item RegQueryValueW + +=item C<RegQueryValueW( $hKey, $swSubKey, $oswValueData, $iolValueData )> + +C<$swSubKey> and C<$oswValueData> are UNICODE. Note that +C<$iolValueData> is measured as number of bytes. + +=item RegQueryValueExW + +=item C<RegQueryValueExW( $hKey, $swName, $pNull, $ouType, $opData, $iolData )> + +C<$swName> is UNICODE. + +C<$opData> is UNICODE if C<$ouType> is C<REG_SZ>, C<REG_EXPAND_SZ>, +or C<REG_MULTI_SZ>. Note that C<$iolData> is measured as number of +bytes even in these cases. + +=item RegReplaceKeyW + +=item C<RegReplaceKeyW( $hKey, $swSubKey, $swNewFile, $swOldFile )> + +C<$swSubKey>, C<$swNewFile>, and C<$swOldFile> are UNICODE. + +=item RegRestoreKeyW + +=item C<RegRestoreKeyW( $hKey, $swFileName, $uFlags )> + +C<$swFileName> is UNICODE. + +=item RegSaveKeyW + +=item C<RegSaveKeyW( $hKey, $swFileName, $pSecAttr )> + +C<$swFileName> is UNICODE. + +=item RegSetValueW + +=item C<RegSetValueW( $hKey, $swSubKey, $uType, $swValueData, $lValueData )> + +C<$swSubKey> and C<$swValueData> are UNICODE. Note that +C<$lValueData> is measured as number of bytes even though +C<$swValueData> is always UNICODE. + +=item RegSetValueExW + +=item C<RegSetValueExW( $hKey, $swName, $uZero, $uType, $pData, $lData )> + +C<$swName> is UNICODE. + +C<$pData> is UNICODE if C<$uType> is C<REG_SZ>, C<REG_EXPAND_SZ>, +or C<REG_MULTI_SZ>. Note that C<$lData> is measured as number of +bytes even in these cases. + +=item RegUnLoadKeyW + +=item C<RegUnLoadKeyW( $hKey, $swSubKey )> + +C<$swSubKey> is UNICODE. + +=item :HKEY_ + +All C<HKEY_*> constants: + + HKEY_CLASSES_ROOT HKEY_CURRENT_CONFIG HKEY_CURRENT_USER + HKEY_DYN_DATA HKEY_LOCAL_MACHINE HKEY_PERFORMANCE_DATA + HKEY_USERS + +=item :KEY_ + +All C<KEY_*> constants: + + KEY_QUERY_VALUE KEY_SET_VALUE KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS KEY_NOTIFY KEY_CREATE_LINK + KEY_READ KEY_WRITE KEY_EXECUTE + KEY_ALL_ACCESS + +=item :REG_ + +All C<REG_*> constants: + + REG_CREATED_NEW_KEY REG_OPENED_EXISTING_KEY + + REG_LEGAL_CHANGE_FILTER REG_NOTIFY_CHANGE_ATTRIBUTES + REG_NOTIFY_CHANGE_NAME REG_NOTIFY_CHANGE_LAST_SET + REG_NOTIFY_CHANGE_SECURITY REG_LEGAL_OPTION + + REG_OPTION_BACKUP_RESTORE REG_OPTION_CREATE_LINK + REG_OPTION_NON_VOLATILE REG_OPTION_OPEN_LINK + REG_OPTION_RESERVED REG_OPTION_VOLATILE + + REG_WHOLE_HIVE_VOLATILE REG_REFRESH_HIVE + REG_NO_LAZY_FLUSH + + REG_NONE REG_SZ + REG_EXPAND_SZ REG_BINARY + REG_DWORD REG_DWORD_LITTLE_ENDIAN + REG_DWORD_BIG_ENDIAN REG_LINK + REG_MULTI_SZ REG_RESOURCE_LIST + REG_FULL_RESOURCE_DESCRIPTOR REG_RESOURCE_REQUIREMENTS_LIST + +=item :ALL + +All of the above. + +=item :SE_ + +The strings for the following privilege names: + + SE_ASSIGNPRIMARYTOKEN_NAME SE_AUDIT_NAME + SE_BACKUP_NAME SE_CHANGE_NOTIFY_NAME + SE_CREATE_PAGEFILE_NAME SE_CREATE_PERMANENT_NAME + SE_CREATE_TOKEN_NAME SE_DEBUG_NAME + SE_INCREASE_QUOTA_NAME SE_INC_BASE_PRIORITY_NAME + SE_LOAD_DRIVER_NAME SE_LOCK_MEMORY_NAME + SE_MACHINE_ACCOUNT_NAME SE_PROF_SINGLE_PROCESS_NAME + SE_REMOTE_SHUTDOWN_NAME SE_RESTORE_NAME + SE_SECURITY_NAME SE_SHUTDOWN_NAME + SE_SYSTEMTIME_NAME SE_SYSTEM_ENVIRONMENT_NAME + SE_SYSTEM_PROFILE_NAME SE_TAKE_OWNERSHIP_NAME + SE_TCB_NAME SE_UNSOLICITED_INPUT_NAME + +It can be difficult to successfully build this module in a way +that makes these constants available. So some builds of this +module may not make them available. For such builds, trying +to export any of these constants will cause a fatal error. +For this reason, none of these symbols are currently included +in the C<":ALL"> grouping. + +=back + +=head2 The Win32API:: heirarchy + +This and the other Win32API:: modules are meant to expose the +nearly raw API calls so they can be used from Perl code in any +way they might be used from C code. This provides the following +advantages: + +=over + +=item Many modules can be written by people that don't have a C compiler. + +=item Encourages more module code to be written in Perl [not C]. + +Perl code is often much easier to inspect, debug, customize, and +enhance than XS code. + +=item Allows those already familiar with the Win32 API to get +off to a quick start. + +=item Provides an interactive tool for exploring even obscure +details of the Win32 API. + +It can be very useful to interactively explore ad-hoc calls into +parts of the Win32 API using: + + perl -de 0 + +=item Ensures that native Win32 data structures can be used. + +This allows maximum efficiency. It also allows data from one +module [for example, time or security information from the +C<Win32API::Registry> or C<Win32API::File> modules] to be used +with other modules [for example, C<Win32API::Time> and +C<Win32API::SecDesc>]. + +=item Provides a single version of the XS interface to each API +call where improvements can be collected. + +=back + +=head2 Buffer sizes + +For each parameter that specifies a buffer size, a value of C<0> +can be passed. For parameter that are pointers to buffer sizes, +you can also pass in C<NULL> by specifying an empty list reference, +C<[]>. Both of these cases will ensure that the variable has +I<some> buffer space allocated to it and pass in that buffer's +allocated size. Many of the calls indicate, via C<ERROR_MORE_DATA>, +that the buffer size was not sufficient and the F<Registry.xs> +code will automatically enlarge the buffer to the required size +and repeat the call. + +Numeric buffer sizes are used as minimum initial sizes for the +buffers. The larger of this size and the size of space already +allocated to the scalar will be passed to the underlying routine. +If that size was insufficient, and the underlying call provides +an easy method for determining the needed buffer size, then the +buffer will be enlarged and the call repeated as above. + +The underlying calls define buffer size parameter as unsigned, so +negative buffer sizes are treated as very large positive buffer +sizes which usually cause C<malloc()> to fail. + +To force the F<Registry.xs> code to pass in a specific value for +a buffer size, preceed the size with an equals sign via C<"=".>. +Buffer sizes that are passed in as strings starting with an equals +sign will have the equal sign stripped and the remainder of the string +interpretted as a number [via C's C<strtoul()> using only base 10] +which will be passed to the underlying routine [even if the allocated +buffer is actually larger]. The F<Registry.xs> code will enlarge the +buffer to the specified size, if needed, but will not enlarge the +buffer based on the underlying routine requesting more space. + +Some Reg*() calls may not currently set the buffer size when they +return C<ERROR_MORE_DATA>. But some that are not documented as +doing so, currently do so anyway. So the code assumes that any +routine I<might> do this and resizes any buffers and repeats the +call. We hope that eventually all routines will provide this +feature. + +When you use C<[]> for a buffer size, you can still find the +length of the data returned by using C<length($buffer)>. Note +that this length will be in bytes while a few of the buffer +sizes would have been in units of wide characters. + +Note that the RegQueryValueEx*() and RegEnumValue*() calls +will trim the trailing C<'\0'> [if present] from the returned data +values of type C<REG_SZ> or C<REG_EXPAND_SZ> but only if the +value data length parameter is omitted [or specified as C<[]>]. + +The RegSetValueEx*() calls will add a trailing C<'\0'> [if +missing] to the supplied data values of type C<REG_SZ> and +C<REG_EXPAND_SZ> but only if the value data length parameter +is omitted [or specified as C<0>]. + +=head2 Hungarian Notation + +The following abbreviations are used at the start of each parameter +name to hint at aspects of how the parameter is used. The prefix +is always in lower case and followed by a capital letter that starts +the descriptive part of the parameter name. Several of the following +abbreviations can be combined into a single prefix. + +Probably not all of these prefix notations are used by this module. +This document section may be included in any C<Win32API> module and +so covers some notations not used by this specific module. + +=over + +=item s + +A string. In C, a C<'\0'>-terminated C<char *>. In Perl, just a +string except that it will be truncated at the first C<"\0">, if +it contains one. + +=item sw + +A wide [UNICODE] string. In C, a C<L'\0'>-terminated C<WCHAR *>. +In Perl, a string that contains UNICODE data. You can convert a +string to UNICODE in Perl via: + + $string= "This is an example string"; + $unicode= pack( "S*", unpack("C*",$string), 0 ); + +Note how C<, 0> above causes an explicit C<L'\0'> to be added since +Perl's implicit C<'\0'> that it puts after each of its strings is not +wide enough to terminate a UNICODE string. So UNICODE strings are +different than regular strings in that the Perl version of a regular +string will not include the trialing C<'\0'> while the Perl version +of a UNICODE string must include the trailing C<L'\0'>. + +If a UNICODE string contains no non-ASCII characters, then you +can convert it back into a normal string via: + + $string= pack( "C*", unpack("S*",$unicode) ); + $string =~ s/\0$//; + +=item p + +A pointer to some buffer [usually containing some C<struct>]. In C, +a C<void *> or some other pointer type. In Perl, a string that is +usually manipulated using C<pack> and C<unpack>. The "p" is usually +followed by more prefix character(s) to indicate what type of data is +stored in the bufffer. + +=item a + +A packed array. In C, an array [usually of C<struct>s]. In Perl, a +string containing the packed data. The "a" is usually followed by +more prefix character(s) to indicate the data type of the elements. + +These packed arrays are also called "vectors" in places to avoid +confusion with Perl arrays. + +=item n + +A generic number. In C, any of the integer or floating point data +types. In Perl, a number; either an integer, unsigned, or double +[IV, UV, or NV, respectively]. Usually an integer. + +=item iv + +A signed integral value. In C, any of the signed integer data types. +In Perl, an integer [IV]. + +=item u + +An unsigned integral value. In C, any of the unsigned integer data +types. In Perl, an unsigned integer [UV]. + +=item d + +A floating-point number. In C, a C<float> or C<double> or, perhaps, +a C<long double>. In Perl, a double-precision floating-point number +[NV]. + +=item b + +A Boolean value. In C, any integer data type, though usually via +a type alias of C<bool> or C<BOOL>, containing either a 0 [false] or +non-zero [true] value. In Perl, a scalar containing a Boolean value +[C<0>, C<"">, or C<undef> for "false" and anything else for "true"]. + +=item c + +A count of items. In C, any integer data type. In Perl, an unsigned +integer [UV]. Usually used in conjunction with a "vector" parameter +[see L</a> above] to indicate the number of elements. + +=item l + +A length [in bytes]. In C, any integer data type. In Perl, an +unsigned integer [UV]. Usually used in conjunction with a "string" +or "pointer" parameter [see L</s> and L</p> above] to indicate the +buffer size or the size of the value stored in the buffer. + +For strings, there is no general rule as to whether the trailing +C<'\0'> is included in such sizes. For this reason, the C<Win32API> +modules follow the Perl rule of always allocating one extra byte +and reporting buffer sizes as being one smaller than allocated in +case the C<'\0'> is not included in the size. + +=item lw + +A length measured as number of UNICODE characters. In C, a count +of C<WCHAR>s. In Perl, an unsigned integer [UV] counting "shorts" +[see "s" and "S" in C<pack> and C<unpack>]. + +For UNICODE strings, the trailing C<L'\0'> may or may not be +included in a length so, again, we always allocate extra room +for one and don't report that extra space. + +=item h + +A handle. In C, a C<HANDLE> or more-specific handle data type. +In Perl, an unsigned integer [UV]. In C, these handles are often +actually some type of pointer, but Perl just treats them as opaque +numbers, as it should. This prefix is also used for other pointers +that are treated as integers in Perl code. + +=item r + +A record. In C, almost always a C<struct> or perhaps C<union>. Note +that C C<struct>s are rarely passed by value so the "r" is almost +always preceeded by a "p" or "a" [see L</p> and L</a> above]. For +the very rare unadorned "r", Perl stores the record in the same way +as a "pr", that is, in a string. For the very rare case where Perl +explicitly stores a pointer to the C<struct> rather than storing the +C<struct> directly in a Perl string, the prefix "pp" or "ppr" or even +"par" is used. + +=item sv + +=item rv + +=item hv + +=item av + +=item cv + +A Perl data type. Respectively, a scalar value [SV], a reference +[RV] [usually to a scalar], a hash [HV], a Perl array [AV], or a Perl +code reference [PVCV]. For the "hv", "av", and "cv" prefixes, a +leading "rv" is usually assumed. For a parameter to an XS subroutine, +a prefix of "sv" means the parameter is a scalar and so may be a string +or a number [or C<undef>] or even both at the same time. So "sv" +doesn't imply a leading "rv". + +=item Input or Output + +Whether a parameter is for input data, output data, or both is usually +not reflected by the data type prefix. In cases where this is not +obvious nor reflected in the parameter name proper, we may use the +following in front of the data type prefix. + +=over + +=item i + +An input parameter given to the API [usually omitted]. + +=item o + +An output-only parameter taken from the API. You should not get a +warning if such a parameter is C<undef> when you pass it into the +function. You should get an error if such a parameter is read-only. +You can [usually] pass in C<[]> for such a parameter to have the +parameter silently ignored. + +The output may be written directly into the Perl variable passed +to the subroutine, the same way the buffer parameter to Perl's +C<sysread()>. This method is often avoided in Perl because +the call then lacks any visual cue that some parameters are being +overwritten. But this method closely matches the C API which is +what we are trying to do. + +=item io + +Input given to the API then overwritten with output taken from the +API. You should get a warning [if B<-w> is in effect] if such a +parameter is C<undef> when you pass it into the function [unless it +is a buffer or buffer length parameter]. If the value is read-only, +then [for most parameters] the output is silently not written. This +is because it is often convenient to pass in read-only constants for +many such parameters. You can also usually pass in C<[]> for such +parameters. + +=back + +=item pp + +=item ppr + +=item par + +=item pap + +These are just unusual combinations of prefix characters described above. + +For each, a pointer is stored in a [4-byte] Perl string. You can +usually use C<unpack "P"> to access the real data from Perl. + +For "ppr" [and often for "pp"], the pointer points directly at a +C C<struct>. For "par", the pointer points to the first element +of a C [packed] array of C<struct>s. For "pap", the pointer points +to a C [packed] array of pointers to other things. + +=item ap + +Here we have a list of pointers packed into a single Perl string. + +=back + +=head1 BUGS + +The old ActiveState ports of Perl for Win32 [but not, ActivePerl, the +ActiveState distributions of standard Perl 5.004 and beyond] do not support +the tools for building extensions and so do not support this extension. + +No routines are provided for using the data returned in the C<FILETIME> +buffers. Those are in the C<Win32API::Time> module. + +No routines are provided for dealing with UNICODE data effectively. +See L</:FuncW> above for some simple-minded UNICODE methods. + +Parts of the module test will fail if used on a version of Perl +that does not yet set C<$^E> based on C<GetLastError()>. + +On NT 4.0 [at least], the RegEnum*() calls do not set the required +buffer sizes when returning C<ERROR_MORE_DATA> so this module will +not grow the buffers in such cases. C<Win32::TieRegistry> overcomes +this by using values from C<RegQueryInfoKey()> for buffer sizes in +RegEnum* calls. + +On NT 4.0 [at least], C<RegQueryInfoKey()> on C<HKEY_PERFORMANCE_DATA> +never succeeds. Also, C<RegQueryValueEx()> on C<HKEY_PERFORMANCE_DATA> +never returns the required buffer size. To access C<HKEY_PERFORMANCE_DATA> +you will need to keep growing the data buffer until the call succeeds. + +Because C<goto &subroutine> seems to be buggy under Win32 Perl, +it is not used in the stubs in F<Registry.pm>. + +=head1 AUTHOR + +Tye McQueen, tye@metronet.com, http://www.metronet.com/~tye/. + +=head1 SEE ALSO + +=over + +=item L<Win32::TieRegistry> + +=item L<Win32::Registry> + +=back + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/Win32API/Registry/cRegistry.pc b/Master/tlpkg/tlperl.old/lib/Win32API/Registry/cRegistry.pc new file mode 100644 index 00000000000..9659d0c4361 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/Win32API/Registry/cRegistry.pc @@ -0,0 +1,87 @@ +# Generated by cRegistry_pc.cxx. +# Package Win32API::Registry with options: +# CPLUSPLUS => q[1] +# IFDEF => q[ /^SE_/ ? '__cplusplus' : /REG_/ ] +# IMPORT_LIST => [q[/._/], q[!/[a-z]/]] +# VALUES => { KEY_DELETE=>q[DELETE], KEY_READ_CONTROL=>q[READ_CONTROL], KEY_WRITE_OWNER=>q[WRITE_OWNER], KEY_SYNCHRONIZE=>q[SYNCHRONIZE], KEY_WRITE_DAC=>q[WRITE_DAC] } +# WRITE_PERL => q[1] +# Perl files eval'd: +# Registry.pm => last if /^\s*(bootstrap|XSLoader::load)\b/ +# C files included: +# Registry.xs => last if m#/[/*]\s*CONSTS_DEFINED\b|^\s*MODULE\b# +sub HKEY_CLASSES_ROOT () { 0x80000000 } +sub HKEY_CURRENT_CONFIG () { 0x80000005 } +sub HKEY_CURRENT_USER () { 0x80000001 } +sub HKEY_DYN_DATA () { 0x80000006 } +sub HKEY_LOCAL_MACHINE () { 0x80000002 } +sub HKEY_PERFORMANCE_DATA () { 0x80000004 } +sub HKEY_USERS () { 0x80000003 } +sub KEY_ALL_ACCESS () { 983103 } +sub KEY_CREATE_LINK () { 32 } +sub KEY_CREATE_SUB_KEY () { 4 } +sub KEY_DELETE () { 65536 } +sub KEY_ENUMERATE_SUB_KEYS () { 8 } +sub KEY_EXECUTE () { 131097 } +sub KEY_NOTIFY () { 16 } +sub KEY_QUERY_VALUE () { 1 } +sub KEY_READ () { 131097 } +sub KEY_READ_CONTROL () { 131072 } +sub KEY_SET_VALUE () { 2 } +sub KEY_SYNCHRONIZE () { 1048576 } +sub KEY_WRITE () { 131078 } +sub KEY_WRITE_DAC () { 262144 } +sub KEY_WRITE_OWNER () { 524288 } +sub REG_BINARY () { 3 } +sub REG_CREATED_NEW_KEY () { 1 } +sub REG_DWORD () { 4 } +sub REG_DWORD_BIG_ENDIAN () { 5 } +sub REG_DWORD_LITTLE_ENDIAN () { 4 } +sub REG_EXPAND_SZ () { 2 } +sub REG_FULL_RESOURCE_DESCRIPTOR () { 9 } +sub REG_LEGAL_CHANGE_FILTER () { 15 } +sub REG_LEGAL_OPTION () { 15 } +sub REG_LINK () { 6 } +sub REG_MULTI_SZ () { 7 } +sub REG_NONE () { 0 } +sub REG_NOTIFY_CHANGE_ATTRIBUTES () { 2 } +sub REG_NOTIFY_CHANGE_LAST_SET () { 4 } +sub REG_NOTIFY_CHANGE_NAME () { 1 } +sub REG_NOTIFY_CHANGE_SECURITY () { 8 } +sub REG_NO_LAZY_FLUSH () { 4 } +sub REG_OPENED_EXISTING_KEY () { 2 } +sub REG_OPTION_BACKUP_RESTORE () { 4 } +sub REG_OPTION_CREATE_LINK () { 2 } +sub REG_OPTION_NON_VOLATILE () { 0 } +sub REG_OPTION_OPEN_LINK () { 8 } +sub REG_OPTION_RESERVED () { 0 } +sub REG_OPTION_VOLATILE () { 1 } +sub REG_REFRESH_HIVE () { 2 } +sub REG_RESOURCE_LIST () { 8 } +sub REG_RESOURCE_REQUIREMENTS_LIST () { 10 } +sub REG_SZ () { 1 } +sub REG_WHOLE_HIVE_VOLATILE () { 1 } +sub SE_ASSIGNPRIMARYTOKEN_NAME () { 'SeAssignPrimaryTokenPrivilege' } +sub SE_AUDIT_NAME () { 'SeAuditPrivilege' } +sub SE_BACKUP_NAME () { 'SeBackupPrivilege' } +sub SE_CHANGE_NOTIFY_NAME () { 'SeChangeNotifyPrivilege' } +sub SE_CREATE_PAGEFILE_NAME () { 'SeCreatePagefilePrivilege' } +sub SE_CREATE_PERMANENT_NAME () { 'SeCreatePermanentPrivilege' } +sub SE_CREATE_TOKEN_NAME () { 'SeCreateTokenPrivilege' } +sub SE_DEBUG_NAME () { 'SeDebugPrivilege' } +sub SE_INCREASE_QUOTA_NAME () { 'SeIncreaseQuotaPrivilege' } +sub SE_INC_BASE_PRIORITY_NAME () { 'SeIncreaseBasePriorityPrivilege' } +sub SE_LOAD_DRIVER_NAME () { 'SeLoadDriverPrivilege' } +sub SE_LOCK_MEMORY_NAME () { 'SeLockMemoryPrivilege' } +sub SE_MACHINE_ACCOUNT_NAME () { 'SeMachineAccountPrivilege' } +sub SE_PROF_SINGLE_PROCESS_NAME () { 'SeProfileSingleProcessPrivilege' } +sub SE_REMOTE_SHUTDOWN_NAME () { 'SeRemoteShutdownPrivilege' } +sub SE_RESTORE_NAME () { 'SeRestorePrivilege' } +sub SE_SECURITY_NAME () { 'SeSecurityPrivilege' } +sub SE_SHUTDOWN_NAME () { 'SeShutdownPrivilege' } +sub SE_SYSTEMTIME_NAME () { 'SeSystemtimePrivilege' } +sub SE_SYSTEM_ENVIRONMENT_NAME () { 'SeSystemEnvironmentPrivilege' } +sub SE_SYSTEM_PROFILE_NAME () { 'SeSystemProfilePrivilege' } +sub SE_TAKE_OWNERSHIP_NAME () { 'SeTakeOwnershipPrivilege' } +sub SE_TCB_NAME () { 'SeTcbPrivilege' } +sub SE_UNSOLICITED_INPUT_NAME () { 'SeUnsolicitedInputPrivilege' } +1; diff --git a/Master/tlpkg/tlperl.old/lib/XSLoader.pm b/Master/tlpkg/tlperl.old/lib/XSLoader.pm new file mode 100644 index 00000000000..34172dcfa70 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/XSLoader.pm @@ -0,0 +1,356 @@ +# Generated from XSLoader.pm.PL (resolved %Config::Config value) + +package XSLoader; + +$VERSION = "0.06"; + +#use strict; + +# enable debug/trace messages from DynaLoader perl code +# $dl_debug = $ENV{PERL_DL_DEBUG} || 0 unless defined $dl_debug; + + my $dl_dlext = 'dll'; + +package DynaLoader; + +# No prizes for guessing why we don't say 'bootstrap DynaLoader;' here. +# NOTE: All dl_*.xs (including dl_none.xs) define a dl_error() XSUB +boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) && + !defined(&dl_error); +package XSLoader; + +sub load { + package DynaLoader; + + die q{XSLoader::load('Your::Module', $Your::Module::VERSION)} unless @_; + + my($module) = $_[0]; + + # work with static linking too + my $b = "$module\::bootstrap"; + goto &$b if defined &$b; + + goto retry unless $module and defined &dl_load_file; + + my @modparts = split(/::/,$module); + my $modfname = $modparts[-1]; + + my $modpname = join('/',@modparts); + my $modlibname = (caller())[1]; + my $c = @modparts; + $modlibname =~ s,[\\/][^\\/]+$,, while $c--; # Q&D basename + my $file = "$modlibname/auto/$modpname/$modfname.$dl_dlext"; + +# print STDERR "XSLoader::load for $module ($file)\n" if $dl_debug; + + my $bs = $file; + $bs =~ s/(\.\w+)?(;\d*)?$/\.bs/; # look for .bs 'beside' the library + + goto retry if not -f $file or -s $bs; + + my $bootname = "boot_$module"; + $bootname =~ s/\W/_/g; + @DynaLoader::dl_require_symbols = ($bootname); + + my $boot_symbol_ref; + + if ($^O eq 'darwin') { + if ($boot_symbol_ref = dl_find_symbol(0, $bootname)) { + goto boot; #extension library has already been loaded, e.g. darwin + } + } + + # Many dynamic extension loading problems will appear to come from + # this section of code: XYZ failed at line 123 of DynaLoader.pm. + # Often these errors are actually occurring in the initialisation + # C code of the extension XS file. Perl reports the error as being + # in this perl code simply because this was the last perl code + # it executed. + + my $libref = dl_load_file($file, 0) or do { + require Carp; + Carp::croak("Can't load '$file' for module $module: " . dl_error()); + }; + push(@DynaLoader::dl_librefs,$libref); # record loaded object + + my @unresolved = dl_undef_symbols(); + if (@unresolved) { + require Carp; + Carp::carp("Undefined symbols present after loading $file: @unresolved\n"); + } + + $boot_symbol_ref = dl_find_symbol($libref, $bootname) or do { + require Carp; + Carp::croak("Can't find '$bootname' symbol in $file\n"); + }; + + push(@DynaLoader::dl_modules, $module); # record loaded module + + boot: + my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file); + + # See comment block above + push(@DynaLoader::dl_shared_objects, $file); # record files loaded + return &$xs(@_); + + retry: + my $bootstrap_inherit = DynaLoader->can('bootstrap_inherit') || + XSLoader->can('bootstrap_inherit'); + goto &$bootstrap_inherit; +} + +# Versions of DynaLoader prior to 5.6.0 don't have this function. +sub bootstrap_inherit { + package DynaLoader; + + my $module = $_[0]; + local *DynaLoader::isa = *{"$module\::ISA"}; + local @DynaLoader::isa = (@DynaLoader::isa, 'DynaLoader'); + # Cannot goto due to delocalization. Will report errors on a wrong line? + require DynaLoader; + DynaLoader::bootstrap(@_); +} + +1; + + +__END__ + +=head1 NAME + +XSLoader - Dynamically load C libraries into Perl code + +=head1 VERSION + +Version 0.06 + +=head1 SYNOPSIS + + package YourPackage; + use XSLoader; + + XSLoader::load 'YourPackage', $YourPackage::VERSION; + +=head1 DESCRIPTION + +This module defines a standard I<simplified> interface to the dynamic +linking mechanisms available on many platforms. Its primary purpose is +to implement cheap automatic dynamic loading of Perl modules. + +For a more complicated interface, see L<DynaLoader>. Many (most) +features of C<DynaLoader> are not implemented in C<XSLoader>, like for +example the C<dl_load_flags>, not honored by C<XSLoader>. + +=head2 Migration from C<DynaLoader> + +A typical module using L<DynaLoader|DynaLoader> starts like this: + + package YourPackage; + require DynaLoader; + + our @ISA = qw( OnePackage OtherPackage DynaLoader ); + our $VERSION = '0.01'; + bootstrap YourPackage $VERSION; + +Change this to + + package YourPackage; + use XSLoader; + + our @ISA = qw( OnePackage OtherPackage ); + our $VERSION = '0.01'; + XSLoader::load 'YourPackage', $VERSION; + +In other words: replace C<require DynaLoader> by C<use XSLoader>, remove +C<DynaLoader> from C<@ISA>, change C<bootstrap> by C<XSLoader::load>. Do not +forget to quote the name of your package on the C<XSLoader::load> line, +and add comma (C<,>) before the arguments (C<$VERSION> above). + +Of course, if C<@ISA> contained only C<DynaLoader>, there is no need to have +the C<@ISA> assignment at all; moreover, if instead of C<our> one uses the +more backward-compatible + + use vars qw($VERSION @ISA); + +one can remove this reference to C<@ISA> together with the C<@ISA> assignment. + +If no C<$VERSION> was specified on the C<bootstrap> line, the last line becomes + + XSLoader::load 'YourPackage'; + +=head2 Backward compatible boilerplate + +If you want to have your cake and eat it too, you need a more complicated +boilerplate. + + package YourPackage; + use vars qw($VERSION @ISA); + + @ISA = qw( OnePackage OtherPackage ); + $VERSION = '0.01'; + eval { + require XSLoader; + XSLoader::load('YourPackage', $VERSION); + 1; + } or do { + require DynaLoader; + push @ISA, 'DynaLoader'; + bootstrap YourPackage $VERSION; + }; + +The parentheses about C<XSLoader::load()> arguments are needed since we replaced +C<use XSLoader> by C<require>, so the compiler does not know that a function +C<XSLoader::load()> is present. + +This boilerplate uses the low-overhead C<XSLoader> if present; if used with +an antic Perl which has no C<XSLoader>, it falls back to using C<DynaLoader>. + +=head1 Order of initialization: early load() + +I<Skip this section if the XSUB functions are supposed to be called from other +modules only; read it only if you call your XSUBs from the code in your module, +or have a C<BOOT:> section in your XS file (see L<perlxs/"The BOOT: Keyword">). +What is described here is equally applicable to the L<DynaLoader|DynaLoader> +interface.> + +A sufficiently complicated module using XS would have both Perl code (defined +in F<YourPackage.pm>) and XS code (defined in F<YourPackage.xs>). If this +Perl code makes calls into this XS code, and/or this XS code makes calls to +the Perl code, one should be careful with the order of initialization. + +The call to C<XSLoader::load()> (or C<bootstrap()>) has three side effects: + +=over + +=item * + +if C<$VERSION> was specified, a sanity check is done to ensure that the +versions of the F<.pm> and the (compiled) F<.xs> parts are compatible; + +=item * + +the XSUBs are made accessible from Perl; + +=item * + +if a C<BOOT:> section was present in the F<.xs> file, the code there is called. + +=back + +Consequently, if the code in the F<.pm> file makes calls to these XSUBs, it is +convenient to have XSUBs installed before the Perl code is defined; for +example, this makes prototypes for XSUBs visible to this Perl code. +Alternatively, if the C<BOOT:> section makes calls to Perl functions (or +uses Perl variables) defined in the F<.pm> file, they must be defined prior to +the call to C<XSLoader::load()> (or C<bootstrap()>). + +The first situation being much more frequent, it makes sense to rewrite the +boilerplate as + + package YourPackage; + use XSLoader; + use vars qw($VERSION @ISA); + + BEGIN { + @ISA = qw( OnePackage OtherPackage ); + $VERSION = '0.01'; + + # Put Perl code used in the BOOT: section here + + XSLoader::load 'YourPackage', $VERSION; + } + + # Put Perl code making calls into XSUBs here + +=head2 The most hairy case + +If the interdependence of your C<BOOT:> section and Perl code is +more complicated than this (e.g., the C<BOOT:> section makes calls to Perl +functions which make calls to XSUBs with prototypes), get rid of the C<BOOT:> +section altogether. Replace it with a function C<onBOOT()>, and call it like +this: + + package YourPackage; + use XSLoader; + use vars qw($VERSION @ISA); + + BEGIN { + @ISA = qw( OnePackage OtherPackage ); + $VERSION = '0.01'; + XSLoader::load 'YourPackage', $VERSION; + } + + # Put Perl code used in onBOOT() function here; calls to XSUBs are + # prototype-checked. + + onBOOT; + + # Put Perl initialization code assuming that XS is initialized here + + +=head1 DIAGNOSTICS + +=over 4 + +=item Can't find '%s' symbol in %s + +B<(F)> The bootstrap symbol could not be found in the extension module. + +=item Can't load '%s' for module %s: %s + +B<(F)> The loading or initialisation of the extension module failed. +The detailed error follows. + +=item Undefined symbols present after loading %s: %s + +B<(W)> As the message says, some symbols stay undefined although the +extension module was correctly loaded and initialised. The list of undefined +symbols follows. + +=item XSLoader::load('Your::Module', $Your::Module::VERSION) + +B<(F)> You tried to invoke C<load()> without any argument. You must supply +a module name, and optionally its version. + +=back + + +=head1 LIMITATIONS + +To reduce the overhead as much as possible, only one possible location +is checked to find the extension DLL (this location is where C<make install> +would put the DLL). If not found, the search for the DLL is transparently +delegated to C<DynaLoader>, which looks for the DLL along the C<@INC> list. + +In particular, this is applicable to the structure of C<@INC> used for testing +not-yet-installed extensions. This means that running uninstalled extensions +may have much more overhead than running the same extensions after +C<make install>. + + +=head1 BUGS + +Please report any bugs or feature requests via the perlbug(1) utility. + + +=head1 SEE ALSO + +L<DynaLoader> + + +=head1 AUTHORS + +Ilya Zakharevich originally extracted C<XSLoader> from C<DynaLoader>. + +CPAN version is currently maintained by SE<eacute>bastien Aperghis-Tramoni +E<lt>sebastien@aperghis.netE<gt> + +Previous maintainer was Michael G Schwern <schwern@pobox.com> + + +=head1 COPYRIGHT + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/attributes.pm b/Master/tlpkg/tlperl.old/lib/attributes.pm new file mode 100644 index 00000000000..714cb267218 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/attributes.pm @@ -0,0 +1,418 @@ +package attributes; + +our $VERSION = 0.06; + +@EXPORT_OK = qw(get reftype); +@EXPORT = (); +%EXPORT_TAGS = (ALL => [@EXPORT, @EXPORT_OK]); + +use strict; + +sub croak { + require Carp; + goto &Carp::croak; +} + +sub carp { + require Carp; + goto &Carp::carp; +} + +## forward declaration(s) rather than wrapping the bootstrap call in BEGIN{} +#sub reftype ($) ; +#sub _fetch_attrs ($) ; +#sub _guess_stash ($) ; +#sub _modify_attrs ; +#sub _warn_reserved () ; +# +# The extra trips through newATTRSUB in the interpreter wipe out any savings +# from avoiding the BEGIN block. Just do the bootstrap now. +BEGIN { bootstrap attributes } + +sub import { + @_ > 2 && ref $_[2] or do { + require Exporter; + goto &Exporter::import; + }; + my (undef,$home_stash,$svref,@attrs) = @_; + + my $svtype = uc reftype($svref); + my $pkgmeth; + $pkgmeth = UNIVERSAL::can($home_stash, "MODIFY_${svtype}_ATTRIBUTES") + if defined $home_stash && $home_stash ne ''; + my @badattrs; + if ($pkgmeth) { + my @pkgattrs = _modify_attrs($svref, @attrs); + @badattrs = $pkgmeth->($home_stash, $svref, @attrs); + if (!@badattrs && @pkgattrs) { + return unless _warn_reserved; + @pkgattrs = grep { m/\A[[:lower:]]+(?:\z|\()/ } @pkgattrs; + if (@pkgattrs) { + for my $attr (@pkgattrs) { + $attr =~ s/\(.+\z//s; + } + my $s = ((@pkgattrs == 1) ? '' : 's'); + carp "$svtype package attribute$s " . + "may clash with future reserved word$s: " . + join(' : ' , @pkgattrs); + } + } + } + else { + @badattrs = _modify_attrs($svref, @attrs); + } + if (@badattrs) { + croak "Invalid $svtype attribute" . + (( @badattrs == 1 ) ? '' : 's') . + ": " . + join(' : ', @badattrs); + } +} + +sub get ($) { + @_ == 1 && ref $_[0] or + croak 'Usage: '.__PACKAGE__.'::get $ref'; + my $svref = shift; + my $svtype = uc reftype $svref; + my $stash = _guess_stash $svref; + $stash = caller unless defined $stash; + my $pkgmeth; + $pkgmeth = UNIVERSAL::can($stash, "FETCH_${svtype}_ATTRIBUTES") + if defined $stash && $stash ne ''; + return $pkgmeth ? + (_fetch_attrs($svref), $pkgmeth->($stash, $svref)) : + (_fetch_attrs($svref)) + ; +} + +sub require_version { goto &UNIVERSAL::VERSION } + +1; +__END__ +#The POD goes here + +=head1 NAME + +attributes - get/set subroutine or variable attributes + +=head1 SYNOPSIS + + sub foo : method ; + my ($x,@y,%z) : Bent = 1; + my $s = sub : method { ... }; + + use attributes (); # optional, to get subroutine declarations + my @attrlist = attributes::get(\&foo); + + use attributes 'get'; # import the attributes::get subroutine + my @attrlist = get \&foo; + +=head1 DESCRIPTION + +Subroutine declarations and definitions may optionally have attribute lists +associated with them. (Variable C<my> declarations also may, but see the +warning below.) Perl handles these declarations by passing some information +about the call site and the thing being declared along with the attribute +list to this module. In particular, the first example above is equivalent to +the following: + + use attributes __PACKAGE__, \&foo, 'method'; + +The second example in the synopsis does something equivalent to this: + + use attributes (); + my ($x,@y,%z); + attributes::->import(__PACKAGE__, \$x, 'Bent'); + attributes::->import(__PACKAGE__, \@y, 'Bent'); + attributes::->import(__PACKAGE__, \%z, 'Bent'); + ($x,@y,%z) = 1; + +Yes, that's a lot of expansion. + +B<WARNING>: attribute declarations for variables are still evolving. +The semantics and interfaces of such declarations could change in +future versions. They are present for purposes of experimentation +with what the semantics ought to be. Do not rely on the current +implementation of this feature. + +There are only a few attributes currently handled by Perl itself (or +directly by this module, depending on how you look at it.) However, +package-specific attributes are allowed by an extension mechanism. +(See L<"Package-specific Attribute Handling"> below.) + +The setting of subroutine attributes happens at compile time. +Variable attributes in C<our> declarations are also applied at compile time. +However, C<my> variables get their attributes applied at run-time. +This means that you have to I<reach> the run-time component of the C<my> +before those attributes will get applied. For example: + + my $x : Bent = 42 if 0; + +will neither assign 42 to $x I<nor> will it apply the C<Bent> attribute +to the variable. + +An attempt to set an unrecognized attribute is a fatal error. (The +error is trappable, but it still stops the compilation within that +C<eval>.) Setting an attribute with a name that's all lowercase +letters that's not a built-in attribute (such as "foo") will result in +a warning with B<-w> or C<use warnings 'reserved'>. + +=head2 Built-in Attributes + +The following are the built-in attributes for subroutines: + +=over 4 + +=item locked + +B<5.005 threads only! The use of the "locked" attribute currently +only makes sense if you are using the deprecated "Perl 5.005 threads" +implementation of threads.> + +Setting this attribute is only meaningful when the subroutine or +method is to be called by multiple threads. When set on a method +subroutine (i.e., one marked with the B<method> attribute below), +Perl ensures that any invocation of it implicitly locks its first +argument before execution. When set on a non-method subroutine, +Perl ensures that a lock is taken on the subroutine itself before +execution. The semantics of the lock are exactly those of one +explicitly taken with the C<lock> operator immediately after the +subroutine is entered. + +=item method + +Indicates that the referenced subroutine is a method. +This has a meaning when taken together with the B<locked> attribute, +as described there. It also means that a subroutine so marked +will not trigger the "Ambiguous call resolved as CORE::%s" warning. + +=item lvalue + +Indicates that the referenced subroutine is a valid lvalue and can +be assigned to. The subroutine must return a modifiable value such +as a scalar variable, as described in L<perlsub>. + +=back + +For global variables there is C<unique> attribute: see L<perlfunc/our>. + +=head2 Available Subroutines + +The following subroutines are available for general use once this module +has been loaded: + +=over 4 + +=item get + +This routine expects a single parameter--a reference to a +subroutine or variable. It returns a list of attributes, which may be +empty. If passed invalid arguments, it uses die() (via L<Carp::croak|Carp>) +to raise a fatal exception. If it can find an appropriate package name +for a class method lookup, it will include the results from a +C<FETCH_I<type>_ATTRIBUTES> call in its return list, as described in +L<"Package-specific Attribute Handling"> below. +Otherwise, only L<built-in attributes|"Built-in Attributes"> will be returned. + +=item reftype + +This routine expects a single parameter--a reference to a subroutine or +variable. It returns the built-in type of the referenced variable, +ignoring any package into which it might have been blessed. +This can be useful for determining the I<type> value which forms part of +the method names described in L<"Package-specific Attribute Handling"> below. + +=back + +Note that these routines are I<not> exported by default. + +=head2 Package-specific Attribute Handling + +B<WARNING>: the mechanisms described here are still experimental. Do not +rely on the current implementation. In particular, there is no provision +for applying package attributes to 'cloned' copies of subroutines used as +closures. (See L<perlref/"Making References"> for information on closures.) +Package-specific attribute handling may change incompatibly in a future +release. + +When an attribute list is present in a declaration, a check is made to see +whether an attribute 'modify' handler is present in the appropriate package +(or its @ISA inheritance tree). Similarly, when C<attributes::get> is +called on a valid reference, a check is made for an appropriate attribute +'fetch' handler. See L<"EXAMPLES"> to see how the "appropriate package" +determination works. + +The handler names are based on the underlying type of the variable being +declared or of the reference passed. Because these attributes are +associated with subroutine or variable declarations, this deliberately +ignores any possibility of being blessed into some package. Thus, a +subroutine declaration uses "CODE" as its I<type>, and even a blessed +hash reference uses "HASH" as its I<type>. + +The class methods invoked for modifying and fetching are these: + +=over 4 + +=item FETCH_I<type>_ATTRIBUTES + +This method receives a single argument, which is a reference to the +variable or subroutine for which package-defined attributes are desired. +The expected return value is a list of associated attributes. +This list may be empty. + +=item MODIFY_I<type>_ATTRIBUTES + +This method is called with two fixed arguments, followed by the list of +attributes from the relevant declaration. The two fixed arguments are +the relevant package name and a reference to the declared subroutine or +variable. The expected return value is a list of attributes which were +not recognized by this handler. Note that this allows for a derived class +to delegate a call to its base class, and then only examine the attributes +which the base class didn't already handle for it. + +The call to this method is currently made I<during> the processing of the +declaration. In particular, this means that a subroutine reference will +probably be for an undefined subroutine, even if this declaration is +actually part of the definition. + +=back + +Calling C<attributes::get()> from within the scope of a null package +declaration C<package ;> for an unblessed variable reference will +not provide any starting package name for the 'fetch' method lookup. +Thus, this circumstance will not result in a method call for package-defined +attributes. A named subroutine knows to which symbol table entry it belongs +(or originally belonged), and it will use the corresponding package. +An anonymous subroutine knows the package name into which it was compiled +(unless it was also compiled with a null package declaration), and so it +will use that package name. + +=head2 Syntax of Attribute Lists + +An attribute list is a sequence of attribute specifications, separated by +whitespace or a colon (with optional whitespace). +Each attribute specification is a simple +name, optionally followed by a parenthesised parameter list. +If such a parameter list is present, it is scanned past as for the rules +for the C<q()> operator. (See L<perlop/"Quote and Quote-like Operators">.) +The parameter list is passed as it was found, however, and not as per C<q()>. + +Some examples of syntactically valid attribute lists: + + switch(10,foo(7,3)) : expensive + Ugly('\(") :Bad + _5x5 + locked method + +Some examples of syntactically invalid attribute lists (with annotation): + + switch(10,foo() # ()-string not balanced + Ugly('(') # ()-string not balanced + 5x5 # "5x5" not a valid identifier + Y2::north # "Y2::north" not a simple identifier + foo + bar # "+" neither a colon nor whitespace + +=head1 EXPORTS + +=head2 Default exports + +None. + +=head2 Available exports + +The routines C<get> and C<reftype> are exportable. + +=head2 Export tags defined + +The C<:ALL> tag will get all of the above exports. + +=head1 EXAMPLES + +Here are some samples of syntactically valid declarations, with annotation +as to how they resolve internally into C<use attributes> invocations by +perl. These examples are primarily useful to see how the "appropriate +package" is found for the possible method lookups for package-defined +attributes. + +=over 4 + +=item 1. + +Code: + + package Canine; + package Dog; + my Canine $spot : Watchful ; + +Effect: + + use attributes (); + attributes::->import(Canine => \$spot, "Watchful"); + +=item 2. + +Code: + + package Felis; + my $cat : Nervous; + +Effect: + + use attributes (); + attributes::->import(Felis => \$cat, "Nervous"); + +=item 3. + +Code: + + package X; + sub foo : locked ; + +Effect: + + use attributes X => \&foo, "locked"; + +=item 4. + +Code: + + package X; + sub Y::x : locked { 1 } + +Effect: + + use attributes Y => \&Y::x, "locked"; + +=item 5. + +Code: + + package X; + sub foo { 1 } + + package Y; + BEGIN { *bar = \&X::foo; } + + package Z; + sub Y::bar : locked ; + +Effect: + + use attributes X => \&X::foo, "locked"; + +=back + +This last example is purely for purposes of completeness. You should not +be trying to mess with the attributes of something in a package that's +not your own. + +=head1 SEE ALSO + +L<perlsub/"Private Variables via my()"> and +L<perlsub/"Subroutine Attributes"> for details on the basic declarations; +L<attrs> for the obsolescent form of subroutine attribute specification +which this module replaces; +L<perlfunc/use> for details on the normal invocation mechanism. + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/auto/B/B.bs b/Master/tlpkg/tlperl.old/lib/auto/B/B.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/B/B.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/B/B.dll b/Master/tlpkg/tlperl.old/lib/auto/B/B.dll Binary files differnew file mode 100755 index 00000000000..02ecf851c22 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/B/B.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/B/C/C.bs b/Master/tlpkg/tlperl.old/lib/auto/B/C/C.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/B/C/C.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/B/C/C.dll b/Master/tlpkg/tlperl.old/lib/auto/B/C/C.dll Binary files differnew file mode 100755 index 00000000000..0de9e53ba33 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/B/C/C.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Cwd/Cwd.bs b/Master/tlpkg/tlperl.old/lib/auto/Cwd/Cwd.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Cwd/Cwd.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Cwd/Cwd.dll b/Master/tlpkg/tlperl.old/lib/auto/Cwd/Cwd.dll Binary files differnew file mode 100755 index 00000000000..67f6d7baa57 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Cwd/Cwd.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Data/Dumper/Dumper.bs b/Master/tlpkg/tlperl.old/lib/auto/Data/Dumper/Dumper.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Data/Dumper/Dumper.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Data/Dumper/Dumper.dll b/Master/tlpkg/tlperl.old/lib/auto/Data/Dumper/Dumper.dll Binary files differnew file mode 100755 index 00000000000..9b99b3c3568 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Data/Dumper/Dumper.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Digest/MD5/MD5.bs b/Master/tlpkg/tlperl.old/lib/auto/Digest/MD5/MD5.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Digest/MD5/MD5.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Digest/MD5/MD5.dll b/Master/tlpkg/tlperl.old/lib/auto/Digest/MD5/MD5.dll Binary files differnew file mode 100755 index 00000000000..72ba4df2758 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Digest/MD5/MD5.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/DynaLoader/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/DynaLoader/autosplit.ix new file mode 100644 index 00000000000..d7605efa074 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/DynaLoader/autosplit.ix @@ -0,0 +1,8 @@ +# Index created by AutoSplit for ../LIB\DynaLoader.pm +# (file acts as timestamp) +package DynaLoader; +sub dl_findfile ; +sub dl_expandspec ; +sub dl_find_symbol_anywhere +; +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/DynaLoader/dl_expandspec.al b/Master/tlpkg/tlperl.old/lib/auto/DynaLoader/dl_expandspec.al new file mode 100644 index 00000000000..0bea19a3e4d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/DynaLoader/dl_expandspec.al @@ -0,0 +1,34 @@ +# NOTE: Derived from ../LIB\DynaLoader.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package DynaLoader; + +#line 377 "../LIB\DynaLoader.pm (autosplit into ..\lib\auto\DynaLoader\dl_expandspec.al)" +sub dl_expandspec { + my($spec) = @_; + # Optional function invoked if DynaLoader.pm sets $do_expand. + # Most systems do not require or use this function. + # Some systems may implement it in the dl_*.xs file in which case + # this autoload version will not be called but is harmless. + + # This function is designed to deal with systems which treat some + # 'filenames' in a special way. For example VMS 'Logical Names' + # (something like unix environment variables - but different). + # This function should recognise such names and expand them into + # full file paths. + # Must return undef if $spec is invalid or file does not exist. + + my $file = $spec; # default output to input + + if ($Is_VMS) { # dl_expandspec should be defined in dl_vms.xs + require Carp; + Carp::croak("dl_expandspec: should be defined in XS file!\n"); + } else { + return undef unless -f $file; + } + print STDERR "dl_expandspec($spec) => $file\n" if $dl_debug; + $file; +} + +# end of DynaLoader::dl_expandspec +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/DynaLoader/dl_find_symbol_anywhere.al b/Master/tlpkg/tlperl.old/lib/auto/DynaLoader/dl_find_symbol_anywhere.al new file mode 100644 index 00000000000..2232454ba69 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/DynaLoader/dl_find_symbol_anywhere.al @@ -0,0 +1,19 @@ +# NOTE: Derived from ../LIB\DynaLoader.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package DynaLoader; + +#line 403 "../LIB\DynaLoader.pm (autosplit into ..\lib\auto\DynaLoader\dl_find_symbol_anywhere.al)" +sub dl_find_symbol_anywhere +{ + my $sym = shift; + my $libref; + foreach $libref (@dl_librefs) { + my $symref = dl_find_symbol($libref,$sym); + return $symref if $symref; + } + return undef; +} + +1; +# end of DynaLoader::dl_find_symbol_anywhere diff --git a/Master/tlpkg/tlperl.old/lib/auto/DynaLoader/dl_findfile.al b/Master/tlpkg/tlperl.old/lib/auto/DynaLoader/dl_findfile.al new file mode 100644 index 00000000000..9f8df39d00c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/DynaLoader/dl_findfile.al @@ -0,0 +1,115 @@ +# NOTE: Derived from ../LIB\DynaLoader.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package DynaLoader; + +#line 269 "../LIB\DynaLoader.pm (autosplit into ..\lib\auto\DynaLoader\dl_findfile.al)" +sub dl_findfile { + # Read ext/DynaLoader/DynaLoader.doc for detailed information. + # This function does not automatically consider the architecture + # or the perl library auto directories. + my (@args) = @_; + my (@dirs, $dir); # which directories to search + my (@found); # full paths to real files we have found + my $dl_ext= 'dll'; # $Config::Config{'dlext'} suffix for perl extensions + my $dl_so = 'dll'; # $Config::Config{'so'} suffix for shared libraries + + print STDERR "dl_findfile(@args)\n" if $dl_debug; + + # accumulate directories but process files as they appear + arg: foreach(@args) { + # Special fast case: full filepath requires no search + if ($Is_VMS && m%[:>/\]]% && -f $_) { + push(@found,dl_expandspec(VMS::Filespec::vmsify($_))); + last arg unless wantarray; + next; + } + elsif ($Is_MacOS) { + if (m/:/ && -f $_) { + push(@found,$_); + last arg unless wantarray; + } + } + elsif (m:/: && -f $_ && !$do_expand) { + push(@found,$_); + last arg unless wantarray; + next; + } + + # Deal with directories first: + # Using a -L prefix is the preferred option (faster and more robust) + if (m:^-L:) { s/^-L//; push(@dirs, $_); next; } + + if ($Is_MacOS) { + # Otherwise we try to try to spot directories by a heuristic + # (this is a more complicated issue than it first appears) + if (m/:/ && -d $_) { push(@dirs, $_); next; } + # Only files should get this far... + my(@names, $name); # what filenames to look for + s/^-l//; + push(@names, $_); + foreach $dir (@dirs, @dl_library_path) { + next unless -d $dir; + $dir =~ s/^([^:]+)$/:$1/; + $dir =~ s/:$//; + foreach $name (@names) { + my($file) = "$dir:$name"; + print STDERR " checking in $dir for $name\n" if $dl_debug; + if (-f $file) { + push(@found, $file); + next arg; # no need to look any further + } + } + } + next; + } + + # Otherwise we try to try to spot directories by a heuristic + # (this is a more complicated issue than it first appears) + if (m:/: && -d $_) { push(@dirs, $_); next; } + + # VMS: we may be using native VMS directory syntax instead of + # Unix emulation, so check this as well + if ($Is_VMS && /[:>\]]/ && -d $_) { push(@dirs, $_); next; } + + # Only files should get this far... + my(@names, $name); # what filenames to look for + if (m:-l: ) { # convert -lname to appropriate library name + s/-l//; + push(@names,"lib$_.$dl_so"); + push(@names,"lib$_.a"); + } else { # Umm, a bare name. Try various alternatives: + # these should be ordered with the most likely first + push(@names,"$_.$dl_ext") unless m/\.$dl_ext$/o; + push(@names,"$_.$dl_so") unless m/\.$dl_so$/o; + push(@names,"lib$_.$dl_so") unless m:/:; + push(@names,"$_.a") if !m/\.a$/ and $dlsrc eq "dl_dld.xs"; + push(@names, $_); + } + foreach $dir (@dirs, @dl_library_path) { + next unless -d $dir; + chop($dir = VMS::Filespec::unixpath($dir)) if $Is_VMS; + foreach $name (@names) { + my($file) = "$dir/$name"; + print STDERR " checking in $dir for $name\n" if $dl_debug; + $file = ($do_expand) ? dl_expandspec($file) : (-f $file && $file); + #$file = _check_file($file); + if ($file) { + push(@found, $file); + next arg; # no need to look any further + } + } + } + } + if ($dl_debug) { + foreach(@dirs) { + print STDERR " dl_findfile ignored non-existent directory: $_\n" unless -d $_; + } + print STDERR "dl_findfile found: @found\n"; + } + return $found[0] unless wantarray; + @found; +} + +# end of DynaLoader::dl_findfile +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Encode/Byte/Byte.bs b/Master/tlpkg/tlperl.old/lib/auto/Encode/Byte/Byte.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Encode/Byte/Byte.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Encode/Byte/Byte.dll b/Master/tlpkg/tlperl.old/lib/auto/Encode/Byte/Byte.dll Binary files differnew file mode 100755 index 00000000000..88474ccb046 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Encode/Byte/Byte.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Encode/Encode.bs b/Master/tlpkg/tlperl.old/lib/auto/Encode/Encode.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Encode/Encode.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Encode/Encode.dll b/Master/tlpkg/tlperl.old/lib/auto/Encode/Encode.dll Binary files differnew file mode 100755 index 00000000000..69c8ebf8acb --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Encode/Encode.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Encode/Symbol/Symbol.bs b/Master/tlpkg/tlperl.old/lib/auto/Encode/Symbol/Symbol.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Encode/Symbol/Symbol.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Encode/Symbol/Symbol.dll b/Master/tlpkg/tlperl.old/lib/auto/Encode/Symbol/Symbol.dll Binary files differnew file mode 100755 index 00000000000..64df4071134 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Encode/Symbol/Symbol.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Encode/Unicode/Unicode.bs b/Master/tlpkg/tlperl.old/lib/auto/Encode/Unicode/Unicode.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Encode/Unicode/Unicode.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Encode/Unicode/Unicode.dll b/Master/tlpkg/tlperl.old/lib/auto/Encode/Unicode/Unicode.dll Binary files differnew file mode 100755 index 00000000000..71a757a6b64 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Encode/Unicode/Unicode.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Fcntl/Fcntl.bs b/Master/tlpkg/tlperl.old/lib/auto/Fcntl/Fcntl.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Fcntl/Fcntl.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Fcntl/Fcntl.dll b/Master/tlpkg/tlperl.old/lib/auto/Fcntl/Fcntl.dll Binary files differnew file mode 100755 index 00000000000..d053a295a71 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Fcntl/Fcntl.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/File/Glob/Glob.bs b/Master/tlpkg/tlperl.old/lib/auto/File/Glob/Glob.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/File/Glob/Glob.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/File/Glob/Glob.dll b/Master/tlpkg/tlperl.old/lib/auto/File/Glob/Glob.dll Binary files differnew file mode 100755 index 00000000000..9cd3d822949 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/File/Glob/Glob.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/IO/IO.bs b/Master/tlpkg/tlperl.old/lib/auto/IO/IO.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/IO/IO.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/IO/IO.dll b/Master/tlpkg/tlperl.old/lib/auto/IO/IO.dll Binary files differnew file mode 100755 index 00000000000..86276c177d9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/IO/IO.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/List/Util/Util.bs b/Master/tlpkg/tlperl.old/lib/auto/List/Util/Util.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/List/Util/Util.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/List/Util/Util.dll b/Master/tlpkg/tlperl.old/lib/auto/List/Util/Util.dll Binary files differnew file mode 100755 index 00000000000..238b1648bea --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/List/Util/Util.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Opcode/Opcode.bs b/Master/tlpkg/tlperl.old/lib/auto/Opcode/Opcode.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Opcode/Opcode.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Opcode/Opcode.dll b/Master/tlpkg/tlperl.old/lib/auto/Opcode/Opcode.dll Binary files differnew file mode 100755 index 00000000000..d44ff0069b8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Opcode/Opcode.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/POSIX.bs b/Master/tlpkg/tlperl.old/lib/auto/POSIX/POSIX.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/POSIX.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/POSIX.dll b/Master/tlpkg/tlperl.old/lib/auto/POSIX/POSIX.dll Binary files differnew file mode 100755 index 00000000000..49bdaee0917 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/POSIX.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/SigAction/flags.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/SigAction/flags.al new file mode 100644 index 00000000000..800cdd9a2b2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/SigAction/flags.al @@ -0,0 +1,9 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX::SigAction; + +#line 964 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\SigAction\flags.al)" +sub flags { $_[0]->{FLAGS} = $_[1] if @_ > 1; $_[0]->{FLAGS} }; +# end of POSIX::SigAction::flags +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/SigAction/handler.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/SigAction/handler.al new file mode 100644 index 00000000000..f2a3994bdf0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/SigAction/handler.al @@ -0,0 +1,11 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX::SigAction; + +#line 960 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\SigAction\handler.al)" +package POSIX::SigAction; + +sub handler { $_[0]->{HANDLER} = $_[1] if @_ > 1; $_[0]->{HANDLER} }; +# end of POSIX::SigAction::handler +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/SigAction/mask.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/SigAction/mask.al new file mode 100644 index 00000000000..e5c240eea1b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/SigAction/mask.al @@ -0,0 +1,9 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX::SigAction; + +#line 963 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\SigAction\mask.al)" +sub mask { $_[0]->{MASK} = $_[1] if @_ > 1; $_[0]->{MASK} }; +# end of POSIX::SigAction::mask +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/SigAction/safe.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/SigAction/safe.al new file mode 100644 index 00000000000..bb27883beae --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/SigAction/safe.al @@ -0,0 +1,9 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX::SigAction; + +#line 965 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\SigAction\safe.al)" +sub safe { $_[0]->{SAFE} = $_[1] if @_ > 1; $_[0]->{SAFE} }; +1; +# end of POSIX::SigAction::safe diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/abs.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/abs.al new file mode 100644 index 00000000000..89999433d53 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/abs.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 398 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\abs.al)" +sub abs { + usage "abs(x)" if @_ != 1; + CORE::abs($_[0]); +} + +# end of POSIX::abs +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/alarm.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/alarm.al new file mode 100644 index 00000000000..e1c864ed8e0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/alarm.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 615 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\alarm.al)" +sub alarm { + usage "alarm(seconds)" if @_ != 1; + CORE::alarm($_[0]); +} + +# end of POSIX::alarm +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/assert.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/assert.al new file mode 100644 index 00000000000..b3bce100406 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/assert.al @@ -0,0 +1,15 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 80 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\assert.al)" +sub assert { + usage "assert(expr)" if @_ != 1; + if (!$_[0]) { + croak "Assertion failed"; + } +} + +# end of POSIX::assert +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/atan2.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/atan2.al new file mode 100644 index 00000000000..9482e3cff23 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/atan2.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 145 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\atan2.al)" +sub atan2 { + usage "atan2(x,y)" if @_ != 2; + CORE::atan2($_[0], $_[1]); +} + +# end of POSIX::atan2 +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/atexit.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/atexit.al new file mode 100644 index 00000000000..b0fdf7e97cf --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/atexit.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 403 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\atexit.al)" +sub atexit { + unimpl "atexit() is C-specific: use END {} instead"; +} + +# end of POSIX::atexit +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/atof.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/atof.al new file mode 100644 index 00000000000..fc1d1cef431 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/atof.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 407 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\atof.al)" +sub atof { + unimpl "atof() is C-specific, stopped"; +} + +# end of POSIX::atof +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/atoi.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/atoi.al new file mode 100644 index 00000000000..5eef246231b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/atoi.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 411 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\atoi.al)" +sub atoi { + unimpl "atoi() is C-specific, stopped"; +} + +# end of POSIX::atoi +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/atol.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/atol.al new file mode 100644 index 00000000000..e6fc6869a1a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/atol.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 415 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\atol.al)" +sub atol { + unimpl "atol() is C-specific, stopped"; +} + +# end of POSIX::atol +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/POSIX/autosplit.ix new file mode 100644 index 00000000000..8ecf455bb80 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/autosplit.ix @@ -0,0 +1,159 @@ +# Index created by AutoSplit for ..\..\lib\POSIX.pm +# (file acts as timestamp) +package POSIX; +sub usage ; +sub redef ; +sub unimpl ; +sub assert ; +sub tolower ; +sub toupper ; +sub closedir ; +sub opendir ; +sub readdir ; +sub rewinddir ; +sub errno ; +sub creat ; +sub fcntl ; +sub getgrgid ; +sub getgrnam ; +sub atan2 ; +sub cos ; +sub exp ; +sub fabs ; +sub log ; +sub pow ; +sub sin ; +sub sqrt ; +sub getpwnam ; +sub getpwuid ; +sub longjmp ; +sub setjmp ; +sub siglongjmp ; +sub sigsetjmp ; +sub kill ; +sub raise ; +sub offsetof ; +sub clearerr ; +sub fclose ; +sub fdopen ; +sub feof ; +sub fgetc ; +sub fgets ; +sub fileno ; +sub fopen ; +sub fprintf ; +sub fputc ; +sub fputs ; +sub fread ; +sub freopen ; +sub fscanf ; +sub fseek ; +sub fsync ; +sub ferror ; +sub fflush ; +sub fgetpos ; +sub fsetpos ; +sub ftell ; +sub fwrite ; +sub getc ; +sub getchar ; +sub gets ; +sub perror ; +sub printf ; +sub putc ; +sub putchar ; +sub puts ; +sub remove ; +sub rename ; +sub rewind ; +sub scanf ; +sub sprintf ; +sub sscanf ; +sub tmpfile ; +sub ungetc ; +sub vfprintf ; +sub vprintf ; +sub vsprintf ; +sub abs ; +sub atexit ; +sub atof ; +sub atoi ; +sub atol ; +sub bsearch ; +sub calloc ; +sub div ; +sub exit ; +sub free ; +sub getenv ; +sub labs ; +sub ldiv ; +sub malloc ; +sub qsort ; +sub rand ; +sub realloc ; +sub srand ; +sub system ; +sub memchr ; +sub memcmp ; +sub memcpy ; +sub memmove ; +sub memset ; +sub strcat ; +sub strchr ; +sub strcmp ; +sub strcpy ; +sub strcspn ; +sub strerror ; +sub strlen ; +sub strncat ; +sub strncmp ; +sub strncpy ; +sub strpbrk ; +sub strrchr ; +sub strspn ; +sub strstr ; +sub strtok ; +sub chmod ; +sub fstat ; +sub mkdir ; +sub stat ; +sub umask ; +sub wait ; +sub waitpid ; +sub gmtime ; +sub localtime ; +sub time ; +sub alarm ; +sub chdir ; +sub chown ; +sub execl ; +sub execle ; +sub execlp ; +sub execv ; +sub execve ; +sub execvp ; +sub fork ; +sub getegid ; +sub geteuid ; +sub getgid ; +sub getgroups ; +sub getlogin ; +sub getpgrp ; +sub getpid ; +sub getppid ; +sub getuid ; +sub isatty ; +sub link ; +sub rmdir ; +sub setbuf ; +sub setvbuf ; +sub sleep ; +sub unlink ; +sub utime ; +sub load_imports ; +package POSIX::SigAction; +sub handler ; +sub mask ; +sub flags ; +sub safe ; +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/bsearch.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/bsearch.al new file mode 100644 index 00000000000..4acc59b5a7d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/bsearch.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 419 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\bsearch.al)" +sub bsearch { + unimpl "bsearch() not supplied"; +} + +# end of POSIX::bsearch +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/calloc.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/calloc.al new file mode 100644 index 00000000000..776029eff29 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/calloc.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 423 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\calloc.al)" +sub calloc { + unimpl "calloc() is C-specific, stopped"; +} + +# end of POSIX::calloc +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/chdir.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/chdir.al new file mode 100644 index 00000000000..1bddab213d6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/chdir.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 620 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\chdir.al)" +sub chdir { + usage "chdir(directory)" if @_ != 1; + CORE::chdir($_[0]); +} + +# end of POSIX::chdir +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/chmod.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/chmod.al new file mode 100644 index 00000000000..8fc0d5a5e0b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/chmod.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 561 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\chmod.al)" +sub chmod { + usage "chmod(mode, filename)" if @_ != 2; + CORE::chmod($_[0], $_[1]); +} + +# end of POSIX::chmod +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/chown.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/chown.al new file mode 100644 index 00000000000..ca945bd855d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/chown.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 625 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\chown.al)" +sub chown { + usage "chown(uid, gid, filename)" if @_ != 3; + CORE::chown($_[0], $_[1], $_[2]); +} + +# end of POSIX::chown +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/clearerr.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/clearerr.al new file mode 100644 index 00000000000..c360043abf9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/clearerr.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 225 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\clearerr.al)" +sub clearerr { + redef "IO::Handle::clearerr()"; +} + +# end of POSIX::clearerr +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/closedir.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/closedir.al new file mode 100644 index 00000000000..16ae1cd4f76 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/closedir.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 97 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\closedir.al)" +sub closedir { + usage "closedir(dirhandle)" if @_ != 1; + CORE::closedir($_[0]); +} + +# end of POSIX::closedir +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/cos.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/cos.al new file mode 100644 index 00000000000..ee01c091b27 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/cos.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 150 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\cos.al)" +sub cos { + usage "cos(x)" if @_ != 1; + CORE::cos($_[0]); +} + +# end of POSIX::cos +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/creat.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/creat.al new file mode 100644 index 00000000000..2d1cfb7d55d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/creat.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 125 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\creat.al)" +sub creat { + usage "creat(filename, mode)" if @_ != 2; + &open($_[0], &O_WRONLY | &O_CREAT | &O_TRUNC, $_[1]); +} + +# end of POSIX::creat +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/div.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/div.al new file mode 100644 index 00000000000..4c751314da0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/div.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 427 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\div.al)" +sub div { + unimpl "div() is C-specific, use /, % and int instead"; +} + +# end of POSIX::div +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/errno.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/errno.al new file mode 100644 index 00000000000..c57abdc4c3b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/errno.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 120 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\errno.al)" +sub errno { + usage "errno()" if @_ != 0; + $! + 0; +} + +# end of POSIX::errno +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/execl.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/execl.al new file mode 100644 index 00000000000..3ffc4f5a671 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/execl.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 630 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\execl.al)" +sub execl { + unimpl "execl() is C-specific, stopped"; +} + +# end of POSIX::execl +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/execle.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/execle.al new file mode 100644 index 00000000000..ec7e12da909 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/execle.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 634 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\execle.al)" +sub execle { + unimpl "execle() is C-specific, stopped"; +} + +# end of POSIX::execle +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/execlp.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/execlp.al new file mode 100644 index 00000000000..a9e32524839 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/execlp.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 638 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\execlp.al)" +sub execlp { + unimpl "execlp() is C-specific, stopped"; +} + +# end of POSIX::execlp +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/execv.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/execv.al new file mode 100644 index 00000000000..1e6f20bba77 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/execv.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 642 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\execv.al)" +sub execv { + unimpl "execv() is C-specific, stopped"; +} + +# end of POSIX::execv +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/execve.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/execve.al new file mode 100644 index 00000000000..ae23c53ea77 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/execve.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 646 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\execve.al)" +sub execve { + unimpl "execve() is C-specific, stopped"; +} + +# end of POSIX::execve +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/execvp.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/execvp.al new file mode 100644 index 00000000000..88d5dd6764e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/execvp.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 650 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\execvp.al)" +sub execvp { + unimpl "execvp() is C-specific, stopped"; +} + +# end of POSIX::execvp +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/exit.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/exit.al new file mode 100644 index 00000000000..d7806b3f4db --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/exit.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 431 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\exit.al)" +sub exit { + usage "exit(status)" if @_ != 1; + CORE::exit($_[0]); +} + +# end of POSIX::exit +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/exp.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/exp.al new file mode 100644 index 00000000000..251dc740eaf --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/exp.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 155 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\exp.al)" +sub exp { + usage "exp(x)" if @_ != 1; + CORE::exp($_[0]); +} + +# end of POSIX::exp +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fabs.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fabs.al new file mode 100644 index 00000000000..ebe714729c2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fabs.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 160 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fabs.al)" +sub fabs { + usage "fabs(x)" if @_ != 1; + CORE::abs($_[0]); +} + +# end of POSIX::fabs +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fclose.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fclose.al new file mode 100644 index 00000000000..f662ef7cda6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fclose.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 229 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fclose.al)" +sub fclose { + redef "IO::Handle::close()"; +} + +# end of POSIX::fclose +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fcntl.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fcntl.al new file mode 100644 index 00000000000..bf6ec04fb4c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fcntl.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 130 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fcntl.al)" +sub fcntl { + usage "fcntl(filehandle, cmd, arg)" if @_ != 3; + CORE::fcntl($_[0], $_[1], $_[2]); +} + +# end of POSIX::fcntl +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fdopen.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fdopen.al new file mode 100644 index 00000000000..392f8e27fbf --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fdopen.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 233 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fdopen.al)" +sub fdopen { + redef "IO::Handle::new_from_fd()"; +} + +# end of POSIX::fdopen +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/feof.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/feof.al new file mode 100644 index 00000000000..4c8b5ea37af --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/feof.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 237 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\feof.al)" +sub feof { + redef "IO::Handle::eof()"; +} + +# end of POSIX::feof +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/ferror.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/ferror.al new file mode 100644 index 00000000000..6ec8cccb11b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/ferror.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 289 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\ferror.al)" +sub ferror { + redef "IO::Handle::error()"; +} + +# end of POSIX::ferror +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fflush.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fflush.al new file mode 100644 index 00000000000..0ba6d1416f0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fflush.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 293 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fflush.al)" +sub fflush { + redef "IO::Handle::flush()"; +} + +# end of POSIX::fflush +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fgetc.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fgetc.al new file mode 100644 index 00000000000..f89a6f86334 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fgetc.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 241 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fgetc.al)" +sub fgetc { + redef "IO::Handle::getc()"; +} + +# end of POSIX::fgetc +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fgetpos.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fgetpos.al new file mode 100644 index 00000000000..7583bbf3da6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fgetpos.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 297 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fgetpos.al)" +sub fgetpos { + redef "IO::Seekable::getpos()"; +} + +# end of POSIX::fgetpos +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fgets.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fgets.al new file mode 100644 index 00000000000..7edcffdd192 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fgets.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 245 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fgets.al)" +sub fgets { + redef "IO::Handle::gets()"; +} + +# end of POSIX::fgets +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fileno.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fileno.al new file mode 100644 index 00000000000..45f0908329c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fileno.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 249 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fileno.al)" +sub fileno { + redef "IO::Handle::fileno()"; +} + +# end of POSIX::fileno +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fopen.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fopen.al new file mode 100644 index 00000000000..795f272b2bb --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fopen.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 253 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fopen.al)" +sub fopen { + redef "IO::File::open()"; +} + +# end of POSIX::fopen +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fork.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fork.al new file mode 100644 index 00000000000..cb0ee7aaf13 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fork.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 654 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fork.al)" +sub fork { + usage "fork()" if @_ != 0; + CORE::fork; +} + +# end of POSIX::fork +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fprintf.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fprintf.al new file mode 100644 index 00000000000..6ac5cb6a065 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fprintf.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 257 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fprintf.al)" +sub fprintf { + unimpl "fprintf() is C-specific--use printf instead"; +} + +# end of POSIX::fprintf +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fputc.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fputc.al new file mode 100644 index 00000000000..71a3b2307bb --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fputc.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 261 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fputc.al)" +sub fputc { + unimpl "fputc() is C-specific--use print instead"; +} + +# end of POSIX::fputc +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fputs.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fputs.al new file mode 100644 index 00000000000..5cc9cdc175b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fputs.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 265 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fputs.al)" +sub fputs { + unimpl "fputs() is C-specific--use print instead"; +} + +# end of POSIX::fputs +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fread.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fread.al new file mode 100644 index 00000000000..a2f731a784c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fread.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 269 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fread.al)" +sub fread { + unimpl "fread() is C-specific--use read instead"; +} + +# end of POSIX::fread +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/free.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/free.al new file mode 100644 index 00000000000..71eff3059c3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/free.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 436 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\free.al)" +sub free { + unimpl "free() is C-specific, stopped"; +} + +# end of POSIX::free +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/freopen.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/freopen.al new file mode 100644 index 00000000000..31e08a2a889 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/freopen.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 273 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\freopen.al)" +sub freopen { + unimpl "freopen() is C-specific--use open instead"; +} + +# end of POSIX::freopen +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fscanf.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fscanf.al new file mode 100644 index 00000000000..c5a5e08217b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fscanf.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 277 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fscanf.al)" +sub fscanf { + unimpl "fscanf() is C-specific--use <> and regular expressions instead"; +} + +# end of POSIX::fscanf +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fseek.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fseek.al new file mode 100644 index 00000000000..0a591cca259 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fseek.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 281 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fseek.al)" +sub fseek { + redef "IO::Seekable::seek()"; +} + +# end of POSIX::fseek +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fsetpos.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fsetpos.al new file mode 100644 index 00000000000..311027b54ea --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fsetpos.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 301 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fsetpos.al)" +sub fsetpos { + redef "IO::Seekable::setpos()"; +} + +# end of POSIX::fsetpos +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fstat.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fstat.al new file mode 100644 index 00000000000..084979716d0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fstat.al @@ -0,0 +1,17 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 566 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fstat.al)" +sub fstat { + usage "fstat(fd)" if @_ != 1; + local *TMP; + CORE::open(TMP, "<&$_[0]"); # Gross. + my @l = CORE::stat(TMP); + CORE::close(TMP); + @l; +} + +# end of POSIX::fstat +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fsync.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fsync.al new file mode 100644 index 00000000000..c8038d1d350 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fsync.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 285 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fsync.al)" +sub fsync { + redef "IO::Handle::sync()"; +} + +# end of POSIX::fsync +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/ftell.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/ftell.al new file mode 100644 index 00000000000..1d3490c6033 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/ftell.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 305 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\ftell.al)" +sub ftell { + redef "IO::Seekable::tell()"; +} + +# end of POSIX::ftell +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/fwrite.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fwrite.al new file mode 100644 index 00000000000..1099587edbd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/fwrite.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 309 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fwrite.al)" +sub fwrite { + unimpl "fwrite() is C-specific--use print instead"; +} + +# end of POSIX::fwrite +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/getc.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getc.al new file mode 100644 index 00000000000..2ccc28cdf43 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getc.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 313 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getc.al)" +sub getc { + usage "getc(handle)" if @_ != 1; + CORE::getc($_[0]); +} + +# end of POSIX::getc +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/getchar.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getchar.al new file mode 100644 index 00000000000..930386f6827 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getchar.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 318 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getchar.al)" +sub getchar { + usage "getchar()" if @_ != 0; + CORE::getc(STDIN); +} + +# end of POSIX::getchar +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/getegid.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getegid.al new file mode 100644 index 00000000000..61c0942023f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getegid.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 659 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getegid.al)" +sub getegid { + usage "getegid()" if @_ != 0; + $) + 0; +} + +# end of POSIX::getegid +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/getenv.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getenv.al new file mode 100644 index 00000000000..c6fec0ca34b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getenv.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 440 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getenv.al)" +sub getenv { + usage "getenv(name)" if @_ != 1; + $ENV{$_[0]}; +} + +# end of POSIX::getenv +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/geteuid.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/geteuid.al new file mode 100644 index 00000000000..710491ebcc3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/geteuid.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 664 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\geteuid.al)" +sub geteuid { + usage "geteuid()" if @_ != 0; + $> + 0; +} + +# end of POSIX::geteuid +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/getgid.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getgid.al new file mode 100644 index 00000000000..7cd6164fb43 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getgid.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 669 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getgid.al)" +sub getgid { + usage "getgid()" if @_ != 0; + $( + 0; +} + +# end of POSIX::getgid +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/getgrgid.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getgrgid.al new file mode 100644 index 00000000000..550e75a69f3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getgrgid.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 135 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getgrgid.al)" +sub getgrgid { + usage "getgrgid(gid)" if @_ != 1; + CORE::getgrgid($_[0]); +} + +# end of POSIX::getgrgid +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/getgrnam.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getgrnam.al new file mode 100644 index 00000000000..a480731586c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getgrnam.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 140 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getgrnam.al)" +sub getgrnam { + usage "getgrnam(name)" if @_ != 1; + CORE::getgrnam($_[0]); +} + +# end of POSIX::getgrnam +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/getgroups.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getgroups.al new file mode 100644 index 00000000000..5fd0d9d3aea --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getgroups.al @@ -0,0 +1,14 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 674 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getgroups.al)" +sub getgroups { + usage "getgroups()" if @_ != 0; + my %seen; + grep(!$seen{$_}++, split(' ', $) )); +} + +# end of POSIX::getgroups +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/getlogin.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getlogin.al new file mode 100644 index 00000000000..55bcb4ee9fb --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getlogin.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 680 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getlogin.al)" +sub getlogin { + usage "getlogin()" if @_ != 0; + CORE::getlogin(); +} + +# end of POSIX::getlogin +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/getpgrp.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getpgrp.al new file mode 100644 index 00000000000..ef0425b7b7f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getpgrp.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 685 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getpgrp.al)" +sub getpgrp { + usage "getpgrp()" if @_ != 0; + CORE::getpgrp; +} + +# end of POSIX::getpgrp +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/getpid.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getpid.al new file mode 100644 index 00000000000..9aeaa25b63e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getpid.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 690 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getpid.al)" +sub getpid { + usage "getpid()" if @_ != 0; + $$; +} + +# end of POSIX::getpid +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/getppid.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getppid.al new file mode 100644 index 00000000000..4951623eb04 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getppid.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 695 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getppid.al)" +sub getppid { + usage "getppid()" if @_ != 0; + CORE::getppid; +} + +# end of POSIX::getppid +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/getpwnam.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getpwnam.al new file mode 100644 index 00000000000..296b87f28ef --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getpwnam.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 185 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getpwnam.al)" +sub getpwnam { + usage "getpwnam(name)" if @_ != 1; + CORE::getpwnam($_[0]); +} + +# end of POSIX::getpwnam +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/getpwuid.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getpwuid.al new file mode 100644 index 00000000000..5616a6daa2c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getpwuid.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 190 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getpwuid.al)" +sub getpwuid { + usage "getpwuid(uid)" if @_ != 1; + CORE::getpwuid($_[0]); +} + +# end of POSIX::getpwuid +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/gets.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/gets.al new file mode 100644 index 00000000000..34667890e6e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/gets.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 323 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\gets.al)" +sub gets { + usage "gets()" if @_ != 0; + scalar <STDIN>; +} + +# end of POSIX::gets +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/getuid.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getuid.al new file mode 100644 index 00000000000..5a326ec67f0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/getuid.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 700 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getuid.al)" +sub getuid { + usage "getuid()" if @_ != 0; + $<; +} + +# end of POSIX::getuid +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/gmtime.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/gmtime.al new file mode 100644 index 00000000000..6bbf4fc6fef --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/gmtime.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 600 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\gmtime.al)" +sub gmtime { + usage "gmtime(time)" if @_ != 1; + CORE::gmtime($_[0]); +} + +# end of POSIX::gmtime +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/isatty.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/isatty.al new file mode 100644 index 00000000000..9ab71b3c2a0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/isatty.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 705 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\isatty.al)" +sub isatty { + usage "isatty(filehandle)" if @_ != 1; + -t $_[0]; +} + +# end of POSIX::isatty +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/kill.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/kill.al new file mode 100644 index 00000000000..12f5276f5f8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/kill.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 211 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\kill.al)" +sub kill { + usage "kill(pid, sig)" if @_ != 2; + CORE::kill $_[1], $_[0]; +} + +# end of POSIX::kill +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/labs.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/labs.al new file mode 100644 index 00000000000..581a1897d73 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/labs.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 445 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\labs.al)" +sub labs { + unimpl "labs() is C-specific, use abs instead"; +} + +# end of POSIX::labs +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/ldiv.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/ldiv.al new file mode 100644 index 00000000000..1b704c1fad4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/ldiv.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 449 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\ldiv.al)" +sub ldiv { + unimpl "ldiv() is C-specific, use /, % and int instead"; +} + +# end of POSIX::ldiv +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/link.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/link.al new file mode 100644 index 00000000000..e78401a321d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/link.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 710 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\link.al)" +sub link { + usage "link(oldfilename, newfilename)" if @_ != 2; + CORE::link($_[0], $_[1]); +} + +# end of POSIX::link +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/load_imports.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/load_imports.al new file mode 100644 index 00000000000..6c2ff0ad2ac --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/load_imports.al @@ -0,0 +1,225 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 743 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\load_imports.al)" +sub load_imports { +%EXPORT_TAGS = ( + + assert_h => [qw(assert NDEBUG)], + + ctype_h => [qw(isalnum isalpha iscntrl isdigit isgraph islower + isprint ispunct isspace isupper isxdigit tolower toupper)], + + dirent_h => [], + + errno_h => [qw(E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT + EAGAIN EALREADY EBADF EBUSY ECHILD ECONNABORTED + ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT + EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS + EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK + EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH + ENFILE ENOBUFS ENODEV ENOENT ENOEXEC ENOLCK ENOMEM + ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR + ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM + EPFNOSUPPORT EPIPE EPROCLIM EPROTONOSUPPORT EPROTOTYPE + ERANGE EREMOTE ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT + ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS ETXTBSY + EUSERS EWOULDBLOCK EXDEV errno)], + + fcntl_h => [qw(FD_CLOEXEC F_DUPFD F_GETFD F_GETFL F_GETLK F_RDLCK + F_SETFD F_SETFL F_SETLK F_SETLKW F_UNLCK F_WRLCK + O_ACCMODE O_APPEND O_CREAT O_EXCL O_NOCTTY O_NONBLOCK + O_RDONLY O_RDWR O_TRUNC O_WRONLY + creat + SEEK_CUR SEEK_END SEEK_SET + S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU + S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG S_ISUID + S_IWGRP S_IWOTH S_IWUSR)], + + float_h => [qw(DBL_DIG DBL_EPSILON DBL_MANT_DIG + DBL_MAX DBL_MAX_10_EXP DBL_MAX_EXP + DBL_MIN DBL_MIN_10_EXP DBL_MIN_EXP + FLT_DIG FLT_EPSILON FLT_MANT_DIG + FLT_MAX FLT_MAX_10_EXP FLT_MAX_EXP + FLT_MIN FLT_MIN_10_EXP FLT_MIN_EXP + FLT_RADIX FLT_ROUNDS + LDBL_DIG LDBL_EPSILON LDBL_MANT_DIG + LDBL_MAX LDBL_MAX_10_EXP LDBL_MAX_EXP + LDBL_MIN LDBL_MIN_10_EXP LDBL_MIN_EXP)], + + grp_h => [], + + limits_h => [qw( ARG_MAX CHAR_BIT CHAR_MAX CHAR_MIN CHILD_MAX + INT_MAX INT_MIN LINK_MAX LONG_MAX LONG_MIN MAX_CANON + MAX_INPUT MB_LEN_MAX NAME_MAX NGROUPS_MAX OPEN_MAX + PATH_MAX PIPE_BUF SCHAR_MAX SCHAR_MIN SHRT_MAX SHRT_MIN + SSIZE_MAX STREAM_MAX TZNAME_MAX UCHAR_MAX UINT_MAX + ULONG_MAX USHRT_MAX _POSIX_ARG_MAX _POSIX_CHILD_MAX + _POSIX_LINK_MAX _POSIX_MAX_CANON _POSIX_MAX_INPUT + _POSIX_NAME_MAX _POSIX_NGROUPS_MAX _POSIX_OPEN_MAX + _POSIX_PATH_MAX _POSIX_PIPE_BUF _POSIX_SSIZE_MAX + _POSIX_STREAM_MAX _POSIX_TZNAME_MAX)], + + locale_h => [qw(LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES + LC_MONETARY LC_NUMERIC LC_TIME NULL + localeconv setlocale)], + + math_h => [qw(HUGE_VAL acos asin atan ceil cosh fabs floor fmod + frexp ldexp log10 modf pow sinh tan tanh)], + + pwd_h => [], + + setjmp_h => [qw(longjmp setjmp siglongjmp sigsetjmp)], + + signal_h => [qw(SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK + SA_RESETHAND SA_RESTART SA_SIGINFO SIGABRT SIGALRM + SIGCHLD SIGCONT SIGFPE SIGHUP SIGILL SIGINT SIGKILL + SIGPIPE SIGQUIT SIGSEGV SIGSTOP SIGTERM SIGTSTP SIGTTIN + SIGTTOU SIGUSR1 SIGUSR2 SIG_BLOCK SIG_DFL SIG_ERR + SIG_IGN SIG_SETMASK SIG_UNBLOCK raise sigaction signal + sigpending sigprocmask sigsuspend)], + + stdarg_h => [], + + stddef_h => [qw(NULL offsetof)], + + stdio_h => [qw(BUFSIZ EOF FILENAME_MAX L_ctermid L_cuserid + L_tmpname NULL SEEK_CUR SEEK_END SEEK_SET + STREAM_MAX TMP_MAX stderr stdin stdout + clearerr fclose fdopen feof ferror fflush fgetc fgetpos + fgets fopen fprintf fputc fputs fread freopen + fscanf fseek fsetpos ftell fwrite getchar gets + perror putc putchar puts remove rewind + scanf setbuf setvbuf sscanf tmpfile tmpnam + ungetc vfprintf vprintf vsprintf)], + + stdlib_h => [qw(EXIT_FAILURE EXIT_SUCCESS MB_CUR_MAX NULL RAND_MAX + abort atexit atof atoi atol bsearch calloc div + free getenv labs ldiv malloc mblen mbstowcs mbtowc + qsort realloc strtod strtol strtoul wcstombs wctomb)], + + string_h => [qw(NULL memchr memcmp memcpy memmove memset strcat + strchr strcmp strcoll strcpy strcspn strerror strlen + strncat strncmp strncpy strpbrk strrchr strspn strstr + strtok strxfrm)], + + sys_stat_h => [qw(S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU + S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG + S_ISUID S_IWGRP S_IWOTH S_IWUSR S_IXGRP S_IXOTH S_IXUSR + fstat mkfifo)], + + sys_times_h => [], + + sys_types_h => [], + + sys_utsname_h => [qw(uname)], + + sys_wait_h => [qw(WEXITSTATUS WIFEXITED WIFSIGNALED WIFSTOPPED + WNOHANG WSTOPSIG WTERMSIG WUNTRACED)], + + termios_h => [qw( B0 B110 B1200 B134 B150 B1800 B19200 B200 B2400 + B300 B38400 B4800 B50 B600 B75 B9600 BRKINT CLOCAL + CREAD CS5 CS6 CS7 CS8 CSIZE CSTOPB ECHO ECHOE ECHOK + ECHONL HUPCL ICANON ICRNL IEXTEN IGNBRK IGNCR IGNPAR + INLCR INPCK ISIG ISTRIP IXOFF IXON NCCS NOFLSH OPOST + PARENB PARMRK PARODD TCIFLUSH TCIOFF TCIOFLUSH TCION + TCOFLUSH TCOOFF TCOON TCSADRAIN TCSAFLUSH TCSANOW + TOSTOP VEOF VEOL VERASE VINTR VKILL VMIN VQUIT VSTART + VSTOP VSUSP VTIME + cfgetispeed cfgetospeed cfsetispeed cfsetospeed tcdrain + tcflow tcflush tcgetattr tcsendbreak tcsetattr )], + + time_h => [qw(CLK_TCK CLOCKS_PER_SEC NULL asctime clock ctime + difftime mktime strftime tzset tzname)], + + unistd_h => [qw(F_OK NULL R_OK SEEK_CUR SEEK_END SEEK_SET + STDERR_FILENO STDIN_FILENO STDOUT_FILENO W_OK X_OK + _PC_CHOWN_RESTRICTED _PC_LINK_MAX _PC_MAX_CANON + _PC_MAX_INPUT _PC_NAME_MAX _PC_NO_TRUNC _PC_PATH_MAX + _PC_PIPE_BUF _PC_VDISABLE _POSIX_CHOWN_RESTRICTED + _POSIX_JOB_CONTROL _POSIX_NO_TRUNC _POSIX_SAVED_IDS + _POSIX_VDISABLE _POSIX_VERSION _SC_ARG_MAX + _SC_CHILD_MAX _SC_CLK_TCK _SC_JOB_CONTROL + _SC_NGROUPS_MAX _SC_OPEN_MAX _SC_PAGESIZE _SC_SAVED_IDS + _SC_STREAM_MAX _SC_TZNAME_MAX _SC_VERSION + _exit access ctermid cuserid + dup2 dup execl execle execlp execv execve execvp + fpathconf fsync getcwd getegid geteuid getgid getgroups + getpid getuid isatty lseek pathconf pause setgid setpgid + setsid setuid sysconf tcgetpgrp tcsetpgrp ttyname)], + + utime_h => [], + +); + +# Exporter::export_tags(); +for (values %EXPORT_TAGS) { + push @EXPORT, @$_; +} + +@EXPORT_OK = qw( + abs + alarm + atan2 + chdir + chmod + chown + close + closedir + cos + exit + exp + fcntl + fileno + fork + getc + getgrgid + getgrnam + getlogin + getpgrp + getppid + getpwnam + getpwuid + gmtime + isatty + kill + lchown + link + localtime + log + mkdir + nice + open + opendir + pipe + printf + rand + read + readdir + rename + rewinddir + rmdir + sin + sleep + sprintf + sqrt + srand + stat + system + time + times + umask + unlink + utime + wait + waitpid + write +); + +require Exporter; +} + +# end of POSIX::SigAction::load_imports +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/localtime.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/localtime.al new file mode 100644 index 00000000000..dde4f5769ef --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/localtime.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 605 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\localtime.al)" +sub localtime { + usage "localtime(time)" if @_ != 1; + CORE::localtime($_[0]); +} + +# end of POSIX::localtime +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/log.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/log.al new file mode 100644 index 00000000000..6e400f25866 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/log.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 165 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\log.al)" +sub log { + usage "log(x)" if @_ != 1; + CORE::log($_[0]); +} + +# end of POSIX::log +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/longjmp.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/longjmp.al new file mode 100644 index 00000000000..f3dd3263086 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/longjmp.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 195 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\longjmp.al)" +sub longjmp { + unimpl "longjmp() is C-specific: use die instead"; +} + +# end of POSIX::longjmp +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/malloc.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/malloc.al new file mode 100644 index 00000000000..2f50c6da70a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/malloc.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 453 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\malloc.al)" +sub malloc { + unimpl "malloc() is C-specific, stopped"; +} + +# end of POSIX::malloc +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/memchr.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/memchr.al new file mode 100644 index 00000000000..bcdfac6200b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/memchr.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 478 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\memchr.al)" +sub memchr { + unimpl "memchr() is C-specific, use index() instead"; +} + +# end of POSIX::memchr +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/memcmp.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/memcmp.al new file mode 100644 index 00000000000..e01575259d4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/memcmp.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 482 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\memcmp.al)" +sub memcmp { + unimpl "memcmp() is C-specific, use eq instead"; +} + +# end of POSIX::memcmp +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/memcpy.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/memcpy.al new file mode 100644 index 00000000000..b096a059be9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/memcpy.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 486 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\memcpy.al)" +sub memcpy { + unimpl "memcpy() is C-specific, use = instead"; +} + +# end of POSIX::memcpy +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/memmove.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/memmove.al new file mode 100644 index 00000000000..dd29e805f70 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/memmove.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 490 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\memmove.al)" +sub memmove { + unimpl "memmove() is C-specific, use = instead"; +} + +# end of POSIX::memmove +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/memset.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/memset.al new file mode 100644 index 00000000000..407980dd938 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/memset.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 494 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\memset.al)" +sub memset { + unimpl "memset() is C-specific, use x instead"; +} + +# end of POSIX::memset +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/mkdir.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/mkdir.al new file mode 100644 index 00000000000..edb004a11e8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/mkdir.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 575 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\mkdir.al)" +sub mkdir { + usage "mkdir(directoryname, mode)" if @_ != 2; + CORE::mkdir($_[0], $_[1]); +} + +# end of POSIX::mkdir +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/offsetof.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/offsetof.al new file mode 100644 index 00000000000..83c2df0e521 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/offsetof.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 221 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\offsetof.al)" +sub offsetof { + unimpl "offsetof() is C-specific, stopped"; +} + +# end of POSIX::offsetof +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/opendir.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/opendir.al new file mode 100644 index 00000000000..9c508b64371 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/opendir.al @@ -0,0 +1,16 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 102 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\opendir.al)" +sub opendir { + usage "opendir(directory)" if @_ != 1; + my $dirhandle; + CORE::opendir($dirhandle, $_[0]) + ? $dirhandle + : undef; +} + +# end of POSIX::opendir +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/perror.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/perror.al new file mode 100644 index 00000000000..df53df18eff --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/perror.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 328 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\perror.al)" +sub perror { + print STDERR "@_: " if @_; + print STDERR $!,"\n"; +} + +# end of POSIX::perror +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/pow.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/pow.al new file mode 100644 index 00000000000..9f1ac2fc14f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/pow.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 170 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\pow.al)" +sub pow { + usage "pow(x,exponent)" if @_ != 2; + $_[0] ** $_[1]; +} + +# end of POSIX::pow +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/printf.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/printf.al new file mode 100644 index 00000000000..28b07d21cd1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/printf.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 333 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\printf.al)" +sub printf { + usage "printf(pattern, args...)" if @_ < 1; + CORE::printf STDOUT @_; +} + +# end of POSIX::printf +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/putc.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/putc.al new file mode 100644 index 00000000000..484984bcd9f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/putc.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 338 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\putc.al)" +sub putc { + unimpl "putc() is C-specific--use print instead"; +} + +# end of POSIX::putc +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/putchar.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/putchar.al new file mode 100644 index 00000000000..a85a0d79b36 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/putchar.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 342 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\putchar.al)" +sub putchar { + unimpl "putchar() is C-specific--use print instead"; +} + +# end of POSIX::putchar +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/puts.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/puts.al new file mode 100644 index 00000000000..0bd3f4f3b3c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/puts.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 346 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\puts.al)" +sub puts { + unimpl "puts() is C-specific--use print instead"; +} + +# end of POSIX::puts +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/qsort.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/qsort.al new file mode 100644 index 00000000000..1621e6db521 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/qsort.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 457 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\qsort.al)" +sub qsort { + unimpl "qsort() is C-specific, use sort instead"; +} + +# end of POSIX::qsort +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/raise.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/raise.al new file mode 100644 index 00000000000..3d078d08f35 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/raise.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 216 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\raise.al)" +sub raise { + usage "raise(sig)" if @_ != 1; + CORE::kill $_[0], $$; # Is this good enough? +} + +# end of POSIX::raise +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/rand.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/rand.al new file mode 100644 index 00000000000..78d16fe53cc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/rand.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 461 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\rand.al)" +sub rand { + unimpl "rand() is non-portable, use Perl's rand instead"; +} + +# end of POSIX::rand +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/readdir.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/readdir.al new file mode 100644 index 00000000000..395379abb86 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/readdir.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 110 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\readdir.al)" +sub readdir { + usage "readdir(dirhandle)" if @_ != 1; + CORE::readdir($_[0]); +} + +# end of POSIX::readdir +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/realloc.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/realloc.al new file mode 100644 index 00000000000..949c4fc3b77 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/realloc.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 465 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\realloc.al)" +sub realloc { + unimpl "realloc() is C-specific, stopped"; +} + +# end of POSIX::realloc +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/redef.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/redef.al new file mode 100644 index 00000000000..d667327d6b4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/redef.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 69 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\redef.al)" +sub redef { + my ($mess) = @_; + croak "Use method $mess instead"; +} + +# end of POSIX::redef +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/remove.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/remove.al new file mode 100644 index 00000000000..e29b4531d68 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/remove.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 350 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\remove.al)" +sub remove { + usage "remove(filename)" if @_ != 1; + CORE::unlink($_[0]); +} + +# end of POSIX::remove +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/rename.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/rename.al new file mode 100644 index 00000000000..6087fefa798 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/rename.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 355 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\rename.al)" +sub rename { + usage "rename(oldfilename, newfilename)" if @_ != 2; + CORE::rename($_[0], $_[1]); +} + +# end of POSIX::rename +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/rewind.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/rewind.al new file mode 100644 index 00000000000..a07216f1c51 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/rewind.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 360 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\rewind.al)" +sub rewind { + usage "rewind(filehandle)" if @_ != 1; + CORE::seek($_[0],0,0); +} + +# end of POSIX::rewind +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/rewinddir.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/rewinddir.al new file mode 100644 index 00000000000..c01271a33d8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/rewinddir.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 115 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\rewinddir.al)" +sub rewinddir { + usage "rewinddir(dirhandle)" if @_ != 1; + CORE::rewinddir($_[0]); +} + +# end of POSIX::rewinddir +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/rmdir.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/rmdir.al new file mode 100644 index 00000000000..b94bdf166ee --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/rmdir.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 715 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\rmdir.al)" +sub rmdir { + usage "rmdir(directoryname)" if @_ != 1; + CORE::rmdir($_[0]); +} + +# end of POSIX::rmdir +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/scanf.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/scanf.al new file mode 100644 index 00000000000..2d4ff839328 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/scanf.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 365 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\scanf.al)" +sub scanf { + unimpl "scanf() is C-specific--use <> and regular expressions instead"; +} + +# end of POSIX::scanf +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/setbuf.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/setbuf.al new file mode 100644 index 00000000000..a7de25518fa --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/setbuf.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 720 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\setbuf.al)" +sub setbuf { + redef "IO::Handle::setbuf()"; +} + +# end of POSIX::setbuf +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/setjmp.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/setjmp.al new file mode 100644 index 00000000000..780deb31940 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/setjmp.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 199 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\setjmp.al)" +sub setjmp { + unimpl "setjmp() is C-specific: use eval {} instead"; +} + +# end of POSIX::setjmp +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/setvbuf.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/setvbuf.al new file mode 100644 index 00000000000..b134e52528d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/setvbuf.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 724 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\setvbuf.al)" +sub setvbuf { + redef "IO::Handle::setvbuf()"; +} + +# end of POSIX::setvbuf +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/siglongjmp.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/siglongjmp.al new file mode 100644 index 00000000000..ab46fac02b6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/siglongjmp.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 203 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\siglongjmp.al)" +sub siglongjmp { + unimpl "siglongjmp() is C-specific: use die instead"; +} + +# end of POSIX::siglongjmp +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/sigsetjmp.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/sigsetjmp.al new file mode 100644 index 00000000000..31e563c6f4f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/sigsetjmp.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 207 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\sigsetjmp.al)" +sub sigsetjmp { + unimpl "sigsetjmp() is C-specific: use eval {} instead"; +} + +# end of POSIX::sigsetjmp +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/sin.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/sin.al new file mode 100644 index 00000000000..9464a28bfea --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/sin.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 175 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\sin.al)" +sub sin { + usage "sin(x)" if @_ != 1; + CORE::sin($_[0]); +} + +# end of POSIX::sin +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/sleep.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/sleep.al new file mode 100644 index 00000000000..e58de4d5602 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/sleep.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 728 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\sleep.al)" +sub sleep { + usage "sleep(seconds)" if @_ != 1; + $_[0] - CORE::sleep($_[0]); +} + +# end of POSIX::sleep +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/sprintf.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/sprintf.al new file mode 100644 index 00000000000..75e6bc5e277 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/sprintf.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 369 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\sprintf.al)" +sub sprintf { + usage "sprintf(pattern,args)" if @_ == 0; + CORE::sprintf(shift,@_); +} + +# end of POSIX::sprintf +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/sqrt.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/sqrt.al new file mode 100644 index 00000000000..54a2976e2da --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/sqrt.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 180 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\sqrt.al)" +sub sqrt { + usage "sqrt(x)" if @_ != 1; + CORE::sqrt($_[0]); +} + +# end of POSIX::sqrt +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/srand.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/srand.al new file mode 100644 index 00000000000..b85fd14c60b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/srand.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 469 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\srand.al)" +sub srand { + unimpl "srand()"; +} + +# end of POSIX::srand +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/sscanf.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/sscanf.al new file mode 100644 index 00000000000..b6869491e5d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/sscanf.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 374 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\sscanf.al)" +sub sscanf { + unimpl "sscanf() is C-specific--use regular expressions instead"; +} + +# end of POSIX::sscanf +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/stat.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/stat.al new file mode 100644 index 00000000000..4016c0e88ab --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/stat.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 580 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\stat.al)" +sub stat { + usage "stat(filename)" if @_ != 1; + CORE::stat($_[0]); +} + +# end of POSIX::stat +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/strcat.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strcat.al new file mode 100644 index 00000000000..6b9602b93c6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strcat.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 498 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strcat.al)" +sub strcat { + unimpl "strcat() is C-specific, use .= instead"; +} + +# end of POSIX::strcat +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/strchr.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strchr.al new file mode 100644 index 00000000000..36a59233340 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strchr.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 502 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strchr.al)" +sub strchr { + unimpl "strchr() is C-specific, use index() instead"; +} + +# end of POSIX::strchr +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/strcmp.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strcmp.al new file mode 100644 index 00000000000..b0447b9f1db --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strcmp.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 506 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strcmp.al)" +sub strcmp { + unimpl "strcmp() is C-specific, use eq instead"; +} + +# end of POSIX::strcmp +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/strcpy.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strcpy.al new file mode 100644 index 00000000000..5660760b81d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strcpy.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 510 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strcpy.al)" +sub strcpy { + unimpl "strcpy() is C-specific, use = instead"; +} + +# end of POSIX::strcpy +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/strcspn.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strcspn.al new file mode 100644 index 00000000000..4a46be8baaa --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strcspn.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 514 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strcspn.al)" +sub strcspn { + unimpl "strcspn() is C-specific, use regular expressions instead"; +} + +# end of POSIX::strcspn +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/strerror.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strerror.al new file mode 100644 index 00000000000..cc4c86dbae4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strerror.al @@ -0,0 +1,14 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 518 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strerror.al)" +sub strerror { + usage "strerror(errno)" if @_ != 1; + local $! = $_[0]; + $! . ""; +} + +# end of POSIX::strerror +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/strlen.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strlen.al new file mode 100644 index 00000000000..9cc9df2d315 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strlen.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 524 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strlen.al)" +sub strlen { + unimpl "strlen() is C-specific, use length instead"; +} + +# end of POSIX::strlen +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/strncat.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strncat.al new file mode 100644 index 00000000000..4f09a52c298 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strncat.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 528 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strncat.al)" +sub strncat { + unimpl "strncat() is C-specific, use .= instead"; +} + +# end of POSIX::strncat +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/strncmp.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strncmp.al new file mode 100644 index 00000000000..b4dfc9ab0b4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strncmp.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 532 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strncmp.al)" +sub strncmp { + unimpl "strncmp() is C-specific, use eq instead"; +} + +# end of POSIX::strncmp +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/strncpy.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strncpy.al new file mode 100644 index 00000000000..98b3c081e68 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strncpy.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 536 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strncpy.al)" +sub strncpy { + unimpl "strncpy() is C-specific, use = instead"; +} + +# end of POSIX::strncpy +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/strpbrk.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strpbrk.al new file mode 100644 index 00000000000..227c00d76cc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strpbrk.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 540 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strpbrk.al)" +sub strpbrk { + unimpl "strpbrk() is C-specific, stopped"; +} + +# end of POSIX::strpbrk +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/strrchr.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strrchr.al new file mode 100644 index 00000000000..1dd2a6ebf04 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strrchr.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 544 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strrchr.al)" +sub strrchr { + unimpl "strrchr() is C-specific, use rindex() instead"; +} + +# end of POSIX::strrchr +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/strspn.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strspn.al new file mode 100644 index 00000000000..3bd65863563 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strspn.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 548 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strspn.al)" +sub strspn { + unimpl "strspn() is C-specific, stopped"; +} + +# end of POSIX::strspn +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/strstr.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strstr.al new file mode 100644 index 00000000000..f755459b68f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strstr.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 552 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strstr.al)" +sub strstr { + usage "strstr(big, little)" if @_ != 2; + CORE::index($_[0], $_[1]); +} + +# end of POSIX::strstr +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/strtok.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strtok.al new file mode 100644 index 00000000000..bae94c9282a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/strtok.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 557 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strtok.al)" +sub strtok { + unimpl "strtok() is C-specific, stopped"; +} + +# end of POSIX::strtok +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/system.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/system.al new file mode 100644 index 00000000000..1b51e8f5209 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/system.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 473 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\system.al)" +sub system { + usage "system(command)" if @_ != 1; + CORE::system($_[0]); +} + +# end of POSIX::system +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/time.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/time.al new file mode 100644 index 00000000000..6b404400fd4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/time.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 610 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\time.al)" +sub time { + usage "time()" if @_ != 0; + CORE::time; +} + +# end of POSIX::time +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/tmpfile.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/tmpfile.al new file mode 100644 index 00000000000..aa223d6a27c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/tmpfile.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 378 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\tmpfile.al)" +sub tmpfile { + redef "IO::File::new_tmpfile()"; +} + +# end of POSIX::tmpfile +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/tolower.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/tolower.al new file mode 100644 index 00000000000..57937313fc9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/tolower.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 87 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\tolower.al)" +sub tolower { + usage "tolower(string)" if @_ != 1; + lc($_[0]); +} + +# end of POSIX::tolower +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/toupper.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/toupper.al new file mode 100644 index 00000000000..a5484a70aa6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/toupper.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 92 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\toupper.al)" +sub toupper { + usage "toupper(string)" if @_ != 1; + uc($_[0]); +} + +# end of POSIX::toupper +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/umask.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/umask.al new file mode 100644 index 00000000000..8bf64ae7f0e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/umask.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 585 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\umask.al)" +sub umask { + usage "umask(mask)" if @_ != 1; + CORE::umask($_[0]); +} + +# end of POSIX::umask +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/ungetc.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/ungetc.al new file mode 100644 index 00000000000..874e4416f71 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/ungetc.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 382 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\ungetc.al)" +sub ungetc { + redef "IO::Handle::ungetc()"; +} + +# end of POSIX::ungetc +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/unimpl.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/unimpl.al new file mode 100644 index 00000000000..e1c36c60f85 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/unimpl.al @@ -0,0 +1,14 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 74 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\unimpl.al)" +sub unimpl { + my ($mess) = @_; + $mess =~ s/xxx//; + croak "Unimplemented: POSIX::$mess"; +} + +# end of POSIX::unimpl +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/unlink.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/unlink.al new file mode 100644 index 00000000000..c8f58ab9836 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/unlink.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 733 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\unlink.al)" +sub unlink { + usage "unlink(filename)" if @_ != 1; + CORE::unlink($_[0]); +} + +# end of POSIX::unlink +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/usage.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/usage.al new file mode 100644 index 00000000000..0b2b0bd6115 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/usage.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 64 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\usage.al)" +sub usage { + my ($mess) = @_; + croak "Usage: POSIX::$mess"; +} + +# end of POSIX::usage +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/utime.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/utime.al new file mode 100644 index 00000000000..68008e7e110 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/utime.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 738 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\utime.al)" +sub utime { + usage "utime(filename, atime, mtime)" if @_ != 3; + CORE::utime($_[1], $_[2], $_[0]); +} + +# end of POSIX::utime +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/vfprintf.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/vfprintf.al new file mode 100644 index 00000000000..fb502afc761 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/vfprintf.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 386 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\vfprintf.al)" +sub vfprintf { + unimpl "vfprintf() is C-specific"; +} + +# end of POSIX::vfprintf +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/vprintf.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/vprintf.al new file mode 100644 index 00000000000..28108face71 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/vprintf.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 390 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\vprintf.al)" +sub vprintf { + unimpl "vprintf() is C-specific"; +} + +# end of POSIX::vprintf +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/vsprintf.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/vsprintf.al new file mode 100644 index 00000000000..9d4f008ebbc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/vsprintf.al @@ -0,0 +1,12 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 394 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\vsprintf.al)" +sub vsprintf { + unimpl "vsprintf() is C-specific"; +} + +# end of POSIX::vsprintf +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/wait.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/wait.al new file mode 100644 index 00000000000..57d9701f4ff --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/wait.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 590 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\wait.al)" +sub wait { + usage "wait()" if @_ != 0; + CORE::wait(); +} + +# end of POSIX::wait +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/POSIX/waitpid.al b/Master/tlpkg/tlperl.old/lib/auto/POSIX/waitpid.al new file mode 100644 index 00000000000..6cd31c21009 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/POSIX/waitpid.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\..\lib\POSIX.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package POSIX; + +#line 595 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\waitpid.al)" +sub waitpid { + usage "waitpid(pid, options)" if @_ != 2; + CORE::waitpid($_[0], $_[1]); +} + +# end of POSIX::waitpid +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/SDBM_File/SDBM_File.bs b/Master/tlpkg/tlperl.old/lib/auto/SDBM_File/SDBM_File.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/SDBM_File/SDBM_File.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/SDBM_File/SDBM_File.dll b/Master/tlpkg/tlperl.old/lib/auto/SDBM_File/SDBM_File.dll Binary files differnew file mode 100755 index 00000000000..59f6b5ad9f4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/SDBM_File/SDBM_File.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Time/HiRes/HiRes.bs b/Master/tlpkg/tlperl.old/lib/auto/Time/HiRes/HiRes.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Time/HiRes/HiRes.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Time/HiRes/HiRes.dll b/Master/tlpkg/tlperl.old/lib/auto/Time/HiRes/HiRes.dll Binary files differnew file mode 100755 index 00000000000..5303bcfb0a8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Time/HiRes/HiRes.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/CancelRepeat.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/CancelRepeat.al new file mode 100644 index 00000000000..d0d6bb1b2a3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/CancelRepeat.al @@ -0,0 +1,15 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 491 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\CancelRepeat.al)" +sub CancelRepeat +{ + my $w = shift->MainWindow; + my $id = delete $w->{_afterId_}; + $w->after('cancel',$id) if (defined $id); +} + +# end of Tk::CancelRepeat +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Canvas/Canvas.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/Canvas/Canvas.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Canvas/Canvas.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Canvas/Canvas.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/Canvas/Canvas.dll Binary files differnew file mode 100755 index 00000000000..85fdb8e0f02 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Canvas/Canvas.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Clipboard/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/Tk/Clipboard/autosplit.ix new file mode 100644 index 00000000000..9831f74facb --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Clipboard/autosplit.ix @@ -0,0 +1,6 @@ +# Index created by AutoSplit for blib\lib\Tk\Clipboard.pm +# (file acts as timestamp) +package Tk::Clipboard; +sub getSelected +; +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Clipboard/getSelected.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Clipboard/getSelected.al new file mode 100644 index 00000000000..44ba7b74bf0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Clipboard/getSelected.al @@ -0,0 +1,15 @@ +# NOTE: Derived from blib\lib\Tk\Clipboard.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Clipboard; + +#line 115 "blib\lib\Tk\Clipboard.pm (autosplit into blib\lib\auto\Tk\Clipboard\getSelected.al)" +sub getSelected +{ + my $w = shift; + my $val = Tk::catch { $w->get('sel.first','sel.last') }; + return $val; +} + +1; +# end of Tk::Clipboard::getSelected diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Compound/Compound.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/Compound/Compound.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Compound/Compound.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Compound/Compound.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/Compound/Compound.dll Binary files differnew file mode 100755 index 00000000000..321f56a0d24 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Compound/Compound.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/DragDrop/Win32Site/Win32Site.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/DragDrop/Win32Site/Win32Site.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/DragDrop/Win32Site/Win32Site.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/DragDrop/Win32Site/Win32Site.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/DragDrop/Win32Site/Win32Site.dll Binary files differnew file mode 100755 index 00000000000..468d9d71d05 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/DragDrop/Win32Site/Win32Site.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/EnterFocus.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/EnterFocus.al new file mode 100644 index 00000000000..6b2b5b171a1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/EnterFocus.al @@ -0,0 +1,27 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 657 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\EnterFocus.al)" +# focusFollowsMouse +# +# If this procedure is invoked, Tk will enter "focus-follows-mouse" +# mode, where the focus is always on whatever window contains the +# mouse. If this procedure isn't invoked, then the user typically +# has to click on a window to give it the focus. +# +# Arguments: +# None. + +sub EnterFocus +{ + my $w = shift; + return unless $w; + my $Ev = $w->XEvent; + my $d = $Ev->d; + $w->Tk::focus() if ($d eq 'NotifyAncestor' || $d eq 'NotifyNonlinear' || $d eq 'NotifyInferior'); +} + +# end of Tk::EnterFocus +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Entry/Entry.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/Entry/Entry.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Entry/Entry.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Entry/Entry.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/Entry/Entry.dll Binary files differnew file mode 100755 index 00000000000..9b1c07a7792 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Entry/Entry.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Error.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Error.al new file mode 100644 index 00000000000..7efe2c7043d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Error.al @@ -0,0 +1,20 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 479 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\Error.al)" +sub Error +{my $w = shift; + my $error = shift; + if (Exists($w)) + { + my $grab = $w->grab('current'); + $grab->Unbusy if (defined $grab); + } + chomp($error); + warn "Tk::Error: $error\n " . join("\n ",@_)."\n"; +} + +# end of Tk::Error +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Event/Event.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/Event/Event.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Event/Event.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Event/Event.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/Event/Event.dll Binary files differnew file mode 100755 index 00000000000..5a9706cb92e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Event/Event.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/FirstMenu.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/FirstMenu.al new file mode 100644 index 00000000000..9ae95c2b311 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/FirstMenu.al @@ -0,0 +1,21 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 705 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\FirstMenu.al)" +# tkFirstMenu -- +# This procedure traverses to the first menubutton in the toplevel +# for a given window, and posts that menubutton's menu. +# +# Arguments: +# w - Name of a window. Selects which toplevel +# to search for menubuttons. +sub FirstMenu +{ + my $w = shift; + $w = $w->toplevel->FindMenu(''); +} + +# end of Tk::FirstMenu +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/FocusChildren.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/FocusChildren.al new file mode 100644 index 00000000000..816e29d5ce3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/FocusChildren.al @@ -0,0 +1,35 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 508 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\FocusChildren.al)" +#---------------------------------------------------------------------------- +# focus.tcl -- +# +# This file defines several procedures for managing the input +# focus. +# +# @(#) focus.tcl 1.6 94/12/19 17:06:46 +# +# Copyright (c) 1994 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +sub FocusChildren { shift->children } + +# +# focusNext -- +# This procedure is invoked to move the input focus to the next window +# after a given one. "Next" is defined in terms of the window +# stacking order, with all the windows underneath a given top-level +# (no matter how deeply nested in the hierarchy) considered except +# for frames and toplevels. +# +# Arguments: +# w - Name of a window: the procedure will set the focus +# to the next window after this one in the traversal +# order. +# end of Tk::FocusChildren +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/FocusOK.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/FocusOK.al new file mode 100644 index 00000000000..2bcfe3ebf82 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/FocusOK.al @@ -0,0 +1,36 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 628 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\FocusOK.al)" +sub FocusOK +{ + my $w = shift; + my $value; + catch { $value = $w->cget('-takefocus') }; + if (!$@ && defined($value)) + { + return 0 if ($value eq '0'); + return $w->viewable if ($value eq '1'); + if ($value) + { + $value = $w->$value(); + return $value if (defined $value); + } + } + if (!$w->viewable) + { + return 0; + } + catch { $value = $w->cget('-state') } ; + if (!$@ && defined($value) && $value eq 'disabled') + { + return 0; + } + $value = grep(/Key|Focus/,$w->Tk::bind(),$w->Tk::bind(ref($w))); + return $value; +} + +# end of Tk::FocusOK +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/AddScrollbars.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/AddScrollbars.al new file mode 100644 index 00000000000..aa12259f675 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/AddScrollbars.al @@ -0,0 +1,52 @@ +# NOTE: Derived from blib\lib\Tk\Frame.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Frame; + +#line 225 "blib\lib\Tk\Frame.pm (autosplit into blib\lib\auto\Tk\Frame\AddScrollbars.al)" +sub AddScrollbars +{ + require Tk::Scrollbar; + my ($cw,$w) = @_; + my $def = ''; + my ($x,$y) = ('',''); + my $s = 0; + my $c; + $cw->freeze_on_map; + foreach $c ($w->configure) + { + my $opt = $c->[0]; + if ($opt eq '-yscrollcommand') + { + my $slice = Tk::Frame->new($cw,Name => 'ysbslice'); + my $ysb = Tk::Scrollbar->new($slice,-orient => 'vertical', -command => [ 'yview', $w ]); + my $size = $ysb->cget('-width'); + my $corner = Tk::Frame->new($slice,Name=>'corner','-relief' => 'raised', + '-width' => $size, '-height' => $size); + $ysb->pack(-side => 'left', -fill => 'y'); + $cw->Advertise('yscrollbar' => $ysb); + $cw->Advertise('corner' => $corner); + $cw->Advertise('ysbslice' => $slice); + $corner->{'before'} = $ysb->PathName; + $slice->{'before'} = $w->PathName; + $y = 'w'; + $s = 1; + } + elsif ($opt eq '-xscrollcommand') + { + my $xsb = Tk::Scrollbar->new($cw,-orient => 'horizontal', -command => [ 'xview', $w ]); + $cw->Advertise('xscrollbar' => $xsb); + $xsb->{'before'} = $w->PathName; + $x = 's'; + $s = 1; + } + } + if ($s) + { + $cw->Advertise('scrolled' => $w); + $cw->ConfigSpecs('-scrollbars' => ['METHOD','scrollbars','Scrollbars',$x.$y]); + } +} + +# end of Tk::Frame::AddScrollbars +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/FindMenu.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/FindMenu.al new file mode 100644 index 00000000000..66e71c29b21 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/FindMenu.al @@ -0,0 +1,22 @@ +# NOTE: Derived from blib\lib\Tk\Frame.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Frame; + +#line 363 "blib\lib\Tk\Frame.pm (autosplit into blib\lib\auto\Tk\Frame\FindMenu.al)" +sub FindMenu +{ + my ($w,$char) = @_; + my $child; + my $match; + foreach $child ($w->children) + { + next unless (ref $child); + $match = $child->FindMenu($char); + return $match if (defined $match); + } + return undef; +} + +1; +# end of Tk::Frame::FindMenu diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/autosplit.ix new file mode 100644 index 00000000000..6e5b939fce1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/autosplit.ix @@ -0,0 +1,24 @@ +# Index created by AutoSplit for blib\lib\Tk\Frame.pm +# (file acts as timestamp) +package Tk::Frame; +sub labelPack +; +sub labelVariable +; +sub label +; +sub queuePack +; +sub sbset +; +sub freeze_on_map +; +sub AddScrollbars +; +sub packscrollbars +; +sub scrollbars +; +sub FindMenu +; +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/freeze_on_map.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/freeze_on_map.al new file mode 100644 index 00000000000..6a8b8a4f96e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/freeze_on_map.al @@ -0,0 +1,18 @@ +# NOTE: Derived from blib\lib\Tk\Frame.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Frame; + +#line 215 "blib\lib\Tk\Frame.pm (autosplit into blib\lib\auto\Tk\Frame\freeze_on_map.al)" +sub freeze_on_map +{ + my ($w) = @_; + unless ($w->Tk::bind('Freeze','<Map>')) + { + $w->Tk::bind('Freeze','<Map>',['packPropagate' => 0]) + } + $w->AddBindTag('Freeze'); +} + +# end of Tk::Frame::freeze_on_map +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/label.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/label.al new file mode 100644 index 00000000000..83ec70ed803 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/label.al @@ -0,0 +1,24 @@ +# NOTE: Derived from blib\lib\Tk\Frame.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Frame; + +#line 182 "blib\lib\Tk\Frame.pm (autosplit into blib\lib\auto\Tk\Frame\label.al)" +sub label +{ + my ($cw,$val) = @_; + my $var = $cw->cget('-labelVariable'); + if (@_ > 1 && defined $val) + { + if (!defined $var) + { + $var = \$cw->{Configure}{'-label'}; + $cw->labelVariable($var); + } + $$var = $val; + } + return (defined $var) ? $$var : undef;; +} + +# end of Tk::Frame::label +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/labelPack.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/labelPack.al new file mode 100644 index 00000000000..0cfa8631c24 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/labelPack.al @@ -0,0 +1,50 @@ +# NOTE: Derived from blib\lib\Tk\Frame.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Frame; + +#line 121 "blib\lib\Tk\Frame.pm (autosplit into blib\lib\auto\Tk\Frame\labelPack.al)" +sub labelPack +{ + my ($cw,$val) = @_; + my $w = $cw->Subwidget('label'); + my @result = (); + if (@_ > 1) + { + if (defined($w) && !defined($val)) + { + $w->packForget; + } + elsif (defined($val) && !defined ($w)) + { + require Tk::Label; + $w = Tk::Label->new($cw,-textvariable => $cw->labelVariable); + $cw->Advertise('label' => $w); + $cw->ConfigDelegate('label',qw(-text -textvariable)); + } + if (defined($val) && defined($w)) + { + my %pack = @$val; + unless (exists $pack{-side}) + { + $pack{-side} = 'top' unless (exists $pack{-side}); + } + unless (exists $pack{-fill}) + { + $pack{-fill} = 'x' if ($pack{-side} =~ /(top|bottom)/); + $pack{-fill} = 'y' if ($pack{-side} =~ /(left|right)/); + } + unless (exists($pack{'-before'}) || exists($pack{'-after'})) + { + my $before = ($cw->packSlaves)[0]; + $pack{'-before'} = $before if (defined $before); + } + $w->pack(%pack); + } + } + @result = $w->packInfo if (defined $w); + return (wantarray) ? @result : \@result; +} + +# end of Tk::Frame::labelPack +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/labelVariable.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/labelVariable.al new file mode 100644 index 00000000000..ca60cff1288 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/labelVariable.al @@ -0,0 +1,27 @@ +# NOTE: Derived from blib\lib\Tk\Frame.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Frame; + +#line 163 "blib\lib\Tk\Frame.pm (autosplit into blib\lib\auto\Tk\Frame\labelVariable.al)" +sub labelVariable +{ + my ($cw,$val) = @_; + my $var = \$cw->{Configure}{'-labelVariable'}; + if (@_ > 1 && defined $val) + { + $$var = $val; + $$val = '' unless (defined $$val); + my $w = $cw->Subwidget('label'); + unless (defined $w) + { + $cw->labelPack([]); + $w = $cw->Subwidget('label'); + } + $w->configure(-textvariable => $val); + } + return $$var; +} + +# end of Tk::Frame::labelVariable +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/packscrollbars.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/packscrollbars.al new file mode 100644 index 00000000000..9990eb67b13 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/packscrollbars.al @@ -0,0 +1,86 @@ +# NOTE: Derived from blib\lib\Tk\Frame.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Frame; + +#line 269 "blib\lib\Tk\Frame.pm (autosplit into blib\lib\auto\Tk\Frame\packscrollbars.al)" +sub packscrollbars +{ + my ($cw) = @_; + my $opt = $cw->cget('-scrollbars'); + my $slice = $cw->Subwidget('ysbslice'); + my $xsb = $cw->Subwidget('xscrollbar'); + my $corner = $cw->Subwidget('corner'); + my $w = $cw->Subwidget('scrolled'); + my $xside = (($opt =~ /n/) ? 'top' : 'bottom'); + my $havex = 0; + my $havey = 0; + $opt =~ s/r//; + $cw->{'pack_pending'} = 0; + if (defined $slice) + { + my $reqy; + my $ysb = $cw->Subwidget('yscrollbar'); + if ($opt =~ /(o)?[we]/ && (($reqy = !defined($1)) || $ysb->Needed)) + { + my $yside = (($opt =~ /w/) ? 'left' : 'right'); + $slice->pack(-side => $yside, -fill => 'y',-before => $slice->{'before'}); + $havey = 1; + if ($reqy) + { + $w->configure(-yscrollcommand => ['set', $ysb]); + } + else + { + $w->configure(-yscrollcommand => ['sbset', $cw, $ysb, \$cw->{'packysb'}]); + } + } + else + { + $w->configure(-yscrollcommand => undef) unless $opt =~ s/[we]//; + $slice->packForget; + } + $cw->{'packysb'} = $havey; + } + if (defined $xsb) + { + my $reqx; + if ($opt =~ /(o)?[ns]/ && (($reqx = !defined($1)) || $xsb->Needed)) + { + $xsb->pack(-side => $xside, -fill => 'x',-before => $xsb->{'before'}); + $havex = 1; + if ($reqx) + { + $w->configure(-xscrollcommand => ['set', $xsb]); + } + else + { + $w->configure(-xscrollcommand => ['sbset', $cw, $xsb, \$cw->{'packxsb'}]); + } + } + else + { + $w->configure(-xscrollcommand => undef) unless $opt =~ s/[ns]//; + $xsb->packForget; + } + $cw->{'packxsb'} = $havex; + } + if (defined $corner) + { + if ($havex && $havey && defined $corner->{'before'}) + { + my $anchor = $opt; + $anchor =~ s/o//g; + $corner->configure(-height => $xsb->ReqHeight); + $corner->pack(-before => $corner->{'before'}, -side => $xside, + -anchor => $anchor, -fill => 'x'); + } + else + { + $corner->packForget; + } + } +} + +# end of Tk::Frame::packscrollbars +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/queuePack.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/queuePack.al new file mode 100644 index 00000000000..59fe3ee4de0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/queuePack.al @@ -0,0 +1,18 @@ +# NOTE: Derived from blib\lib\Tk\Frame.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Frame; + +#line 198 "blib\lib\Tk\Frame.pm (autosplit into blib\lib\auto\Tk\Frame\queuePack.al)" +sub queuePack +{ + my ($cw) = @_; + unless ($cw->{'pack_pending'}) + { + $cw->{'pack_pending'} = 1; + $cw->afterIdle([$cw,'packscrollbars']); + } +} + +# end of Tk::Frame::queuePack +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/sbset.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/sbset.al new file mode 100644 index 00000000000..cca4f0d642a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/sbset.al @@ -0,0 +1,15 @@ +# NOTE: Derived from blib\lib\Tk\Frame.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Frame; + +#line 208 "blib\lib\Tk\Frame.pm (autosplit into blib\lib\auto\Tk\Frame\sbset.al)" +sub sbset +{ + my ($cw,$sb,$ref,@args) = @_; + $sb->set(@args); + $cw->queuePack if (@args == 2 && $sb->Needed != $$ref); +} + +# end of Tk::Frame::sbset +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/scrollbars.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/scrollbars.al new file mode 100644 index 00000000000..21eeb53d2b9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Frame/scrollbars.al @@ -0,0 +1,24 @@ +# NOTE: Derived from blib\lib\Tk\Frame.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Frame; + +#line 347 "blib\lib\Tk\Frame.pm (autosplit into blib\lib\auto\Tk\Frame\scrollbars.al)" +sub scrollbars +{ + my ($cw,$opt) = @_; + my $var = \$cw->{'-scrollbars'}; + if (@_ > 1) + { + my $old = $$var; + if (!defined $old || $old ne $opt) + { + $$var = $opt; + $cw->queuePack; + } + } + return $$var; +} + +# end of Tk::Frame::scrollbars +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/HList/HList.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/HList/HList.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/HList/HList.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/HList/HList.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/HList/HList.dll Binary files differnew file mode 100755 index 00000000000..aeb0f6bcf38 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/HList/HList.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/IO/IO.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/IO/IO.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/IO/IO.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/IO/IO.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/IO/IO.dll Binary files differnew file mode 100755 index 00000000000..472f34c8f64 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/IO/IO.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/ImageNames.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/ImageNames.al new file mode 100644 index 00000000000..46176b8a4c5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/ImageNames.al @@ -0,0 +1,13 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 757 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\ImageNames.al)" +sub ImageNames +{ + image('names'); +} + +# end of Tk::ImageNames +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/ImageTypes.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/ImageTypes.al new file mode 100644 index 00000000000..59fcf95b7d0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/ImageTypes.al @@ -0,0 +1,13 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 762 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\ImageTypes.al)" +sub ImageTypes +{ + image('types'); +} + +# end of Tk::ImageTypes +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/JPEG/JPEG.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/JPEG/JPEG.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/JPEG/JPEG.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/JPEG/JPEG.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/JPEG/JPEG.dll Binary files differnew file mode 100755 index 00000000000..b30740e14b4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/JPEG/JPEG.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/AutoScan.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/AutoScan.al new file mode 100644 index 00000000000..89bda0179c6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/AutoScan.al @@ -0,0 +1,49 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 676 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\AutoScan.al)" +# AutoScan -- +# This procedure is invoked when the mouse leaves an entry window +# with button 1 down. It scrolls the window up, down, left, or +# right, depending on where the mouse left the window, and reschedules +# itself as an "after" command so that the window continues to scroll until +# the mouse moves back into the window or the mouse button is released. +# +# Arguments: +# w - The entry window. +# x - The x-coordinate of the mouse when it left the window. +# y - The y-coordinate of the mouse when it left the window. +sub AutoScan +{ + my $w = shift; + return if !Tk::Exists($w); + my $x = shift; + my $y = shift; + if ($y >= $w->height) + { + $w->yview('scroll',1,'units') + } + elsif ($y < 0) + { + $w->yview('scroll',-1,'units') + } + elsif ($x >= $w->width) + { + $w->xview('scroll',2,'units') + } + elsif ($x < 0) + { + $w->xview('scroll',-2,'units') + } + else + { + return; + } + $w->Motion($w->index("@" . $x . ',' . $y)); + $w->RepeatId($w->after(50,'AutoScan',$w,$x,$y)); +} + +# end of Tk::Listbox::AutoScan +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/BeginExtend.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/BeginExtend.al new file mode 100644 index 00000000000..afd8f0e9fda --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/BeginExtend.al @@ -0,0 +1,34 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 620 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\BeginExtend.al)" +# BeginExtend -- +# +# This procedure is typically invoked on shift-button-1 presses. It +# begins the process of extending a selection in the listbox. Its +# exact behavior depends on the selection mode currently in effect +# for the listbox; see the Motif documentation for details. +# +# Arguments: +# w - The listbox widget. +# el - The element for the selection operation (typically the +# one under the pointer). Must be in numerical form. +sub BeginExtend +{ + my $w = shift; + my $el = shift; + if ($w->cget('-selectmode') eq 'extended' && $w->selectionIncludes('anchor')) + { + $w->Motion($el) + } + else + { + # No selection yet; simulate the begin-select operation. + $w->BeginSelect($el); + } +} + +# end of Tk::Listbox::BeginExtend +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/BeginSelect.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/BeginSelect.al new file mode 100644 index 00000000000..304a0afe1e1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/BeginSelect.al @@ -0,0 +1,46 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 515 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\BeginSelect.al)" +# BeginSelect -- +# +# This procedure is typically invoked on button-1 presses. It begins +# the process of making a selection in the listbox. Its exact behavior +# depends on the selection mode currently in effect for the listbox; +# see the Motif documentation for details. +# +# Arguments: +# w - The listbox widget. +# el - The element for the selection operation (typically the +# one under the pointer). Must be in numerical form. +sub BeginSelect +{ + my $w = shift; + my $el = shift; + if ($w->cget('-selectmode') eq 'multiple') + { + if ($w->selectionIncludes($el)) + { + $w->selectionClear($el) + } + else + { + $w->selectionSet($el) + } + } + else + { + $w->selectionClear(0,'end'); + $w->selectionSet($el); + $w->selectionAnchor($el); + @Selection = (); + $Prev = $el + } + $w->focus if ($w->cget('-takefocus')); + $w->eventGenerate("<<ListboxSelect>>"); +} + +# end of Tk::Listbox::BeginSelect +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/BeginToggle.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/BeginToggle.al new file mode 100644 index 00000000000..6c70e35d75a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/BeginToggle.al @@ -0,0 +1,40 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 645 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\BeginToggle.al)" +# BeginToggle -- +# +# This procedure is typically invoked on control-button-1 presses. It +# begins the process of toggling a selection in the listbox. Its +# exact behavior depends on the selection mode currently in effect +# for the listbox; see the Motif documentation for details. +# +# Arguments: +# w - The listbox widget. +# el - The element for the selection operation (typically the +# one under the pointer). Must be in numerical form. +sub BeginToggle +{ + my $w = shift; + my $el = shift; + if ($w->cget('-selectmode') eq 'extended') + { + @Selection = $w->curselection(); + $Prev = $el; + $w->selectionAnchor($el); + if ($w->selectionIncludes($el)) + { + $w->selectionClear($el) + } + else + { + $w->selectionSet($el) + } + $w->eventGenerate("<<ListboxSelect>>"); + } +} + +# end of Tk::Listbox::BeginToggle +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/ButtonRelease_1.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/ButtonRelease_1.al new file mode 100644 index 00000000000..ec8fa789fb9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/ButtonRelease_1.al @@ -0,0 +1,16 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 471 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\ButtonRelease_1.al)" +sub ButtonRelease_1 +{ + my $w = shift; + my $Ev = $w->XEvent; + $w->CancelRepeat; + $w->activate($Ev->xy); +} + +# end of Tk::Listbox::ButtonRelease_1 +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/CLEAR.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/CLEAR.al new file mode 100644 index 00000000000..8ed6feba4b5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/CLEAR.al @@ -0,0 +1,16 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 304 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\CLEAR.al)" +# CLEAR +# ----- +# Empty the Listbox of contents if tied to an array +sub CLEAR { + my $class = shift; + ${$class->{OBJECT}}->delete(0, 'end'); +} + +# end of Tk::Listbox::CLEAR +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Cancel.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Cancel.al new file mode 100644 index 00000000000..7ff924756f8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Cancel.al @@ -0,0 +1,42 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 805 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\Cancel.al)" +# Cancel +# +# This procedure is invoked to cancel an extended selection in +# progress. If there is an extended selection in progress, it +# restores all of the items between the active one and the anchor +# to their previous selection state. +# +# Arguments: +# w - The listbox widget. +sub Cancel +{ + my $w = shift; + if ($w->cget('-selectmode') ne 'extended' || !defined $Prev) + { + return; + } + my $first = $w->index('anchor'); + my $last = $Prev; + if ($first > $last) + { + ($first, $last) = ($last, $first); + } + $w->selectionClear($first,$last); + while ($first <= $last) + { + if (Tk::lsearch(\@Selection,$first) >= 0) + { + $w->selectionSet($first) + } + $first++ + } + $w->eventGenerate("<<ListboxSelect>>"); +} + +# end of Tk::Listbox::Cancel +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Cntrl_End.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Cntrl_End.al new file mode 100644 index 00000000000..dad5a4bc0d1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Cntrl_End.al @@ -0,0 +1,19 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 492 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\Cntrl_End.al)" +sub Cntrl_End +{ + my $w = shift; + my $Ev = $w->XEvent; + $w->activate('end'); + $w->see('end'); + $w->selectionClear(0,'end'); + $w->selectionSet('end'); + $w->eventGenerate("<<ListboxSelect>>"); +} + +# end of Tk::Listbox::Cntrl_End +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Cntrl_Home.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Cntrl_Home.al new file mode 100644 index 00000000000..08131896da1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Cntrl_Home.al @@ -0,0 +1,19 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 480 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\Cntrl_Home.al)" +sub Cntrl_Home +{ + my $w = shift; + my $Ev = $w->XEvent; + $w->activate(0); + $w->see(0); + $w->selectionClear(0,'end'); + $w->selectionSet(0); + $w->eventGenerate("<<ListboxSelect>>"); +} + +# end of Tk::Listbox::Cntrl_Home +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Cntrl_backslash.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Cntrl_backslash.al new file mode 100644 index 00000000000..402426261a7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Cntrl_backslash.al @@ -0,0 +1,19 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 504 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\Cntrl_backslash.al)" +sub Cntrl_backslash +{ + my $w = shift; + my $Ev = $w->XEvent; + if ($w->cget('-selectmode') ne 'browse') + { + $w->selectionClear(0,'end'); + $w->eventGenerate("<<ListboxSelect>>"); + } +} + +# end of Tk::Listbox::Cntrl_backslash +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/DELETE.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/DELETE.al new file mode 100644 index 00000000000..3dd81ad40fd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/DELETE.al @@ -0,0 +1,19 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 355 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\DELETE.al)" +# DELETE +# ------ +# Delete element at specified index +sub DELETE { + my ( $class, @list ) = @_; + + my $value = ${$class->{OBJECT}}->get(@list); + ${$class->{OBJECT}}->delete(@list); + return $value; +} + +# end of Tk::Listbox::DELETE +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/DataExtend.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/DataExtend.al new file mode 100644 index 00000000000..4240300aa68 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/DataExtend.al @@ -0,0 +1,39 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 775 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\DataExtend.al)" +# DataExtend +# +# This procedure is called for key-presses such as Shift-KEndData. +# If the selection mode isn't multiple or extend then it does nothing. +# Otherwise it moves the active element to el and, if we're in +# extended mode, extends the selection to that point. +# +# Arguments: +# w - The listbox widget. +# el - An integer element number. +sub DataExtend +{ + my $w = shift; + my $el = shift; + my $mode = $w->cget('-selectmode'); + if ($mode eq 'extended') + { + $w->activate($el); + $w->see($el); + if ($w->selectionIncludes('anchor')) + { + $w->Motion($el) + } + } + elsif ($mode eq 'multiple') + { + $w->activate($el); + $w->see($el) + } +} + +# end of Tk::Listbox::DataExtend +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/EXISTS.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/EXISTS.al new file mode 100644 index 00000000000..ae1ed1bc5e6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/EXISTS.al @@ -0,0 +1,16 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 366 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\EXISTS.al)" +# EXISTS +# ------ +# Returns true if the index exist, and undef if not +sub EXISTS { + my ( $class, $index ) = @_; + return undef unless ${$class->{OBJECT}}->get($index); +} + +# end of Tk::Listbox::EXISTS +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/EXTEND.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/EXTEND.al new file mode 100644 index 00000000000..2a483ea08c1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/EXTEND.al @@ -0,0 +1,16 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 312 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\EXTEND.al)" +# EXTEND +# ------ +# Do nothing and be happy about it +sub EXTEND { } + +# PUSH +# ---- +# Append elements onto the Listbox contents +# end of Tk::Listbox::EXTEND +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/ExtendUpDown.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/ExtendUpDown.al new file mode 100644 index 00000000000..9b72250ea41 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/ExtendUpDown.al @@ -0,0 +1,36 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 748 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\ExtendUpDown.al)" +# ExtendUpDown -- +# +# Does nothing unless we're in extended selection mode; in this +# case it moves the location cursor (active element) up or down by +# one element, and extends the selection to that point. +# +# Arguments: +# w - The listbox widget. +# amount - +1 to move down one item, -1 to move back one item. +sub ExtendUpDown +{ + my $w = shift; + my $amount = shift; + if ($w->cget('-selectmode') ne 'extended') + { + return; + } + my $active = $w->index('active'); + if (!@Selection) + { + $w->selectionSet($active); + @Selection = $w->curselection; + } + $w->activate($active + $amount); + $w->see('active'); + $w->Motion($w->index('active')) +} + +# end of Tk::Listbox::ExtendUpDown +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/FETCH.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/FETCH.al new file mode 100644 index 00000000000..fbbe7a3ce9a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/FETCH.al @@ -0,0 +1,56 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 176 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\FETCH.al)" +# FETCH +# ----- +# Return either the full contents or only the selected items in the +# box depending on whether we tied it to an array or scalar respectively +sub FETCH { + my $class = shift; + + my $self = ${$class->{OBJECT}}; + my %options = %{$class->{OPTION}} if defined $class->{OPTION};; + + # Define the return variable + my $result; + + # Check whether we are have a tied array or scalar quantity + if ( @_ ) { + my $i = shift; + # The Tk:: Listbox has been tied to an array, we are returning + # an array list of the current items in the Listbox + $result = $self->get($i); + } else { + # The Tk::Listbox has been tied to a scalar, we are returning a + # reference to an array or hash containing the currently selected items + my ( @array, %hash ); + + if ( defined $options{ReturnType} ) { + + # THREE-WAY SWITCH + if ( $options{ReturnType} eq "index" ) { + $result = [$self->curselection]; + } elsif ( $options{ReturnType} eq "element" ) { + foreach my $selection ( $self->curselection ) { + push(@array,$self->get($selection)); } + $result = \@array; + } elsif ( $options{ReturnType} eq "both" ) { + foreach my $selection ( $self->curselection ) { + %hash = ( %hash, $selection => $self->get($selection)); } + $result = \%hash; + } + } else { + # return elements (default) + foreach my $selection ( $self->curselection ) { + push(@array,$self->get($selection)); } + $result = \@array; + } + } + return $result; +} + +# end of Tk::Listbox::FETCH +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/FETCHSIZE.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/FETCHSIZE.al new file mode 100644 index 00000000000..13b612a26f5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/FETCHSIZE.al @@ -0,0 +1,16 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 224 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\FETCHSIZE.al)" +# FETCHSIZE +# --------- +# Return the number of elements in the Listbox when tied to an array +sub FETCHSIZE { + my $class = shift; + return ${$class->{OBJECT}}->size(); +} + +# end of Tk::Listbox::FETCHSIZE +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Listbox.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Listbox.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Listbox.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Listbox.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Listbox.dll Binary files differnew file mode 100755 index 00000000000..bb2c6c89f70 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Listbox.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Motion.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Motion.al new file mode 100644 index 00000000000..c1c3cbd978b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/Motion.al @@ -0,0 +1,77 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 552 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\Motion.al)" +# Motion -- +# +# This procedure is called to process mouse motion events while +# button 1 is down. It may move or extend the selection, depending +# on the listbox's selection mode. +# +# Arguments: +# w - The listbox widget. +# el - The element under the pointer (must be a number). +sub Motion +{ + my $w = shift; + my $el = shift; + if (defined($Prev) && $el == $Prev) + { + return; + } + my $anchor = $w->index('anchor'); + my $mode = $w->cget('-selectmode'); + if ($mode eq 'browse') + { + $w->selectionClear(0,'end'); + $w->selectionSet($el); + $Prev = $el; + $w->eventGenerate("<<ListboxSelect>>"); + } + elsif ($mode eq 'extended') + { + my $i = $Prev; + if (!defined $i || $i eq '') + { + $i = $el; + $w->selectionSet($el); + } + if ($w->selectionIncludes('anchor')) + { + $w->selectionClear($i,$el); + $w->selectionSet('anchor',$el) + } + else + { + $w->selectionClear($i,$el); + $w->selectionClear('anchor',$el) + } + if (!@Selection) + { + @Selection = $w->curselection; + } + while ($i < $el && $i < $anchor) + { + if (Tk::lsearch(\@Selection,$i) >= 0) + { + $w->selectionSet($i) + } + $i++ + } + while ($i > $el && $i > $anchor) + { + if (Tk::lsearch(\@Selection,$i) >= 0) + { + $w->selectionSet($i) + } + $i-- + } + $Prev = $el; + $w->eventGenerate("<<ListboxSelect>>"); + } +} + +# end of Tk::Listbox::Motion +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/POP.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/POP.al new file mode 100644 index 00000000000..db469652447 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/POP.al @@ -0,0 +1,19 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 325 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\POP.al)" +# POP +# --- +# Remove last element of the array and return it +sub POP { + my $class = shift; + + my $value = ${$class->{OBJECT}}->get('end'); + ${$class->{OBJECT}}->delete('end'); + return $value; +} + +# end of Tk::Listbox::POP +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/PUSH.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/PUSH.al new file mode 100644 index 00000000000..f2168ef46d9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/PUSH.al @@ -0,0 +1,13 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 320 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\PUSH.al)" +sub PUSH { + my ( $class, @list ) = @_; + ${$class->{OBJECT}}->insert('end', @list); +} + +# end of Tk::Listbox::PUSH +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/SHIFT.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/SHIFT.al new file mode 100644 index 00000000000..96a41f7d79c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/SHIFT.al @@ -0,0 +1,19 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 336 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\SHIFT.al)" +# SHIFT +# ----- +# Removes the first element and returns it +sub SHIFT { + my $class = shift; + + my $value = ${$class->{OBJECT}}->get(0); + ${$class->{OBJECT}}->delete(0); + return $value +} + +# end of Tk::Listbox::SHIFT +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/SPLICE.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/SPLICE.al new file mode 100644 index 00000000000..aeddea8196a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/SPLICE.al @@ -0,0 +1,84 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 374 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\SPLICE.al)" +# SPLICE +# ------ +# Performs equivalent of splice on the listbox contents +sub SPLICE { + my $class = shift; + + my $self = ${$class->{OBJECT}}; + + # check for arguments + my @elements; + if ( scalar(@_) == 0 ) { + # none + @elements = $self->get(0,'end'); + $self->delete(0,'end'); + return wantarray ? @elements : $elements[scalar(@elements)-1];; + + } elsif ( scalar(@_) == 1 ) { + # $offset + my ( $offset ) = @_; + if ( $offset < 0 ) { + my $start = $self->size() + $offset; + if ( $start > 0 ) { + @elements = $self->get($start,'end'); + $self->delete($start,'end'); + return wantarray ? @elements : $elements[scalar(@elements)-1]; + } else { + return undef; + } + } else { + @elements = $self->get($offset,'end'); + $self->delete($offset,'end'); + return wantarray ? @elements : $elements[scalar(@elements)-1]; + } + + } elsif ( scalar(@_) == 2 ) { + # $offset and $length + my ( $offset, $length ) = @_; + if ( $offset < 0 ) { + my $start = $self->size() + $offset; + my $end = $self->size() + $offset + $length - 1; + if ( $start > 0 ) { + @elements = $self->get($start,$end); + $self->delete($start,$end); + return wantarray ? @elements : $elements[scalar(@elements)-1]; + } else { + return undef; + } + } else { + @elements = $self->get($offset,$offset+$length-1); + $self->delete($offset,$offset+$length-1); + return wantarray ? @elements : $elements[scalar(@elements)-1]; + } + + } else { + # $offset, $length and @list + my ( $offset, $length, @list ) = @_; + if ( $offset < 0 ) { + my $start = $self->size() + $offset; + my $end = $self->size() + $offset + $length - 1; + if ( $start > 0 ) { + @elements = $self->get($start,$end); + $self->delete($start,$end); + $self->insert($start,@list); + return wantarray ? @elements : $elements[scalar(@elements)-1]; + } else { + return undef; + } + } else { + @elements = $self->get($offset,$offset+$length-1); + $self->delete($offset,$offset+$length-1); + $self->insert($offset,@list); + return wantarray ? @elements : $elements[scalar(@elements)-1]; + } + } +} + +# end of Tk::Listbox::SPLICE +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/STORE.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/STORE.al new file mode 100644 index 00000000000..492c32ccc1e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/STORE.al @@ -0,0 +1,80 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 232 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\STORE.al)" +# STORE +# ----- +# If tied to an array we will modify the Listbox contents, while if tied +# to a scalar we will select and clear elements. +sub STORE { + + if ( scalar(@_) == 2 ) { + # we have a tied scalar + my ( $class, $selected ) = @_; + my $self = ${$class->{OBJECT}}; + my %options = %{$class->{OPTION}} if defined $class->{OPTION};; + + # clear currently selected elements + $self->selectionClear(0,'end'); + + # set selected elements + if ( defined $options{ReturnType} ) { + + # THREE-WAY SWITCH + if ( $options{ReturnType} eq "index" ) { + for ( my $i=0; $i < scalar(@$selected) ; $i++ ) { + for ( my $j=0; $j < $self->size() ; $j++ ) { + if( $j == $$selected[$i] ) { + $self->selectionSet($j); last; } + } + } + } elsif ( $options{ReturnType} eq "element" ) { + for ( my $k=0; $k < scalar(@$selected) ; $k++ ) { + for ( my $l=0; $l < $self->size() ; $l++ ) { + if( $self->get($l) eq $$selected[$k] ) { + $self->selectionSet($l); last; } + } + } + } elsif ( $options{ReturnType} eq "both" ) { + foreach my $key ( keys %$selected ) { + $self->selectionSet($key) + if $$selected{$key} eq $self->get($key); + } + } + } else { + # return elements (default) + for ( my $k=0; $k < scalar(@$selected) ; $k++ ) { + for ( my $l=0; $l < $self->size() ; $l++ ) { + if( $self->get($l) eq $$selected[$k] ) { + $self->selectionSet($l); last; } + } + } + } + + } else { + # we have a tied array + my ( $class, $index, $value ) = @_; + my $self = ${$class->{OBJECT}}; + + # check size of current contents list + my $sizeof = $self->size(); + + if ( $index <= $sizeof ) { + # Change a current listbox entry + $self->delete($index); + $self->insert($index, $value); + } else { + # Add a new value + if ( defined $index ) { + $self->insert($index, $value); + } else { + $self->insert("end", $value); + } + } + } +} + +# end of Tk::Listbox::STORE +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/SelectAll.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/SelectAll.al new file mode 100644 index 00000000000..50569afbe50 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/SelectAll.al @@ -0,0 +1,32 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 838 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\SelectAll.al)" +# SelectAll +# +# This procedure is invoked to handle the "select all" operation. +# For single and browse mode, it just selects the active element. +# Otherwise it selects everything in the widget. +# +# Arguments: +# w - The listbox widget. +sub SelectAll +{ + my $w = shift; + my $mode = $w->cget('-selectmode'); + if ($mode eq 'single' || $mode eq 'browse') + { + $w->selectionClear(0,'end'); + $w->selectionSet('active') + } + else + { + $w->selectionSet(0,'end') + } + $w->eventGenerate("<<ListboxSelect>>"); +} + +# end of Tk::Listbox::SelectAll +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/SetList.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/SetList.al new file mode 100644 index 00000000000..25e4f596592 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/SetList.al @@ -0,0 +1,16 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 862 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\SetList.al)" +# Perl/Tk extensions: +sub SetList +{ + my $w = shift; + $w->delete(0,'end'); + $w->insert('end',@_); +} + +# end of Tk::Listbox::SetList +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/TIEARRAY.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/TIEARRAY.al new file mode 100644 index 00000000000..8c147e8eac8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/TIEARRAY.al @@ -0,0 +1,15 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 160 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\TIEARRAY.al)" +sub TIEARRAY { + my ( $class, $obj, %options ) = @_; + return bless { + OBJECT => \$obj, + OPTION => \%options }, $class; +} + +# end of Tk::Listbox::TIEARRAY +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/TIESCALAR.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/TIESCALAR.al new file mode 100644 index 00000000000..9cedf047c7f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/TIESCALAR.al @@ -0,0 +1,15 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 169 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\TIESCALAR.al)" +sub TIESCALAR { + my ( $class, $obj, %options ) = @_; + return bless { + OBJECT => \$obj, + OPTION => \%options }, $class; +} + +# end of Tk::Listbox::TIESCALAR +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/UNSHIFT.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/UNSHIFT.al new file mode 100644 index 00000000000..10d6bae86ec --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/UNSHIFT.al @@ -0,0 +1,16 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 347 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\UNSHIFT.al)" +# UNSHIFT +# ------- +# Insert elements at the beginning of the Listbox +sub UNSHIFT { + my ( $class, @list ) = @_; + ${$class->{OBJECT}}->insert(0, @list); +} + +# end of Tk::Listbox::UNSHIFT +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/UpDown.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/UpDown.al new file mode 100644 index 00000000000..7ffbfebf4e1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/UpDown.al @@ -0,0 +1,41 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 716 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\UpDown.al)" +# UpDown -- +# +# Moves the location cursor (active element) up or down by one element, +# and changes the selection if we're in browse or extended selection +# mode. +# +# Arguments: +# w - The listbox widget. +# amount - +1 to move down one item, -1 to move back one item. +sub UpDown +{ + my $w = shift; + my $amount = shift; + $w->activate($w->index('active')+$amount); + $w->see('active'); + my $mode = $w->cget('-selectmode'); + if ($mode eq 'browse') + { + $w->selectionClear(0,'end'); + $w->selectionSet('active'); + $w->eventGenerate("<<ListboxSelect>>"); + } + elsif ($mode eq 'extended') + { + $w->selectionClear(0,'end'); + $w->selectionSet('active'); + $w->selectionAnchor('active'); + $Prev = $w->index('active'); + @Selection = (); + $w->eventGenerate("<<ListboxSelect>>"); + } +} + +# end of Tk::Listbox::UpDown +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/autosplit.ix new file mode 100644 index 00000000000..0cd2e67037c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/autosplit.ix @@ -0,0 +1,56 @@ +# Index created by AutoSplit for ..\blib\lib\Tk\Listbox.pm +# (file acts as timestamp) +package Tk::Listbox; +sub TIEARRAY ; +sub TIESCALAR ; +sub FETCH ; +sub FETCHSIZE ; +sub STORE ; +sub CLEAR ; +sub EXTEND ; +sub PUSH ; +sub POP ; +sub SHIFT ; +sub UNSHIFT ; +sub DELETE ; +sub EXISTS ; +sub SPLICE ; +sub xyIndex +; +sub ButtonRelease_1 +; +sub Cntrl_Home +; +sub Cntrl_End +; +sub Cntrl_backslash +; +sub BeginSelect +; +sub Motion +; +sub BeginExtend +; +sub BeginToggle +; +sub AutoScan +; +sub UpDown +; +sub ExtendUpDown +; +sub DataExtend +; +sub Cancel +; +sub SelectAll +; +sub SetList +; +sub deleteSelected +; +sub clipboardPaste +; +sub getSelected +; +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/clipboardPaste.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/clipboardPaste.al new file mode 100644 index 00000000000..28f0bd731de --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/clipboardPaste.al @@ -0,0 +1,21 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 880 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\clipboardPaste.al)" +sub clipboardPaste +{ + my $w = shift; + my $index = $w->index('active') || $w->index($w->XEvent->xy); + my $str; + eval {local $SIG{__DIE__}; $str = $w->clipboardGet }; + return if $@; + foreach (split("\n",$str)) + { + $w->insert($index++,$_); + } +} + +# end of Tk::Listbox::clipboardPaste +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/deleteSelected.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/deleteSelected.al new file mode 100644 index 00000000000..45bdfe73221 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/deleteSelected.al @@ -0,0 +1,18 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 870 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\deleteSelected.al)" +sub deleteSelected +{ + my $w = shift; + my $i; + foreach $i (reverse $w->curselection) + { + $w->delete($i); + } +} + +# end of Tk::Listbox::deleteSelected +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/getSelected.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/getSelected.al new file mode 100644 index 00000000000..a729a713d3e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/getSelected.al @@ -0,0 +1,24 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 893 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\getSelected.al)" +sub getSelected +{ + my ($w) = @_; + my $i; + my (@result) = (); + foreach $i ($w->curselection) + { + push(@result,$w->get($i)); + } + return (wantarray) ? @result : $result[0]; +} + +1; +__END__ + + +1; +# end of Tk::Listbox::getSelected diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/xyIndex.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/xyIndex.al new file mode 100644 index 00000000000..5689afdb6ef --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Listbox/xyIndex.al @@ -0,0 +1,29 @@ +# NOTE: Derived from ..\blib\lib\Tk\Listbox.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Listbox; + +#line 450 "..\blib\lib\Tk\Listbox.pm (autosplit into ..\blib\lib\auto\Tk\Listbox\xyIndex.al)" +# ---- + +# +# Bind -- +# This procedure is invoked the first time the mouse enters a listbox +# widget or a listbox widget receives the input focus. It creates +# all of the class bindings for listboxes. +# +# Arguments: +# event - Indicates which event caused the procedure to be invoked +# (Enter or FocusIn). It is used so that we can carry out +# the functions of that event in addition to setting up +# bindings. + +sub xyIndex +{ + my $w = shift; + my $Ev = $w->XEvent; + return $w->index($Ev->xy); +} + +# end of Tk::Listbox::xyIndex +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Menubutton/Menubutton.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/Menubutton/Menubutton.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Menubutton/Menubutton.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Menubutton/Menubutton.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/Menubutton/Menubutton.dll Binary files differnew file mode 100755 index 00000000000..594c0bdadd3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Menubutton/Menubutton.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/NBFrame/NBFrame.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/NBFrame/NBFrame.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/NBFrame/NBFrame.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/NBFrame/NBFrame.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/NBFrame/NBFrame.dll Binary files differnew file mode 100755 index 00000000000..8678ec8c7af --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/NBFrame/NBFrame.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/PNG/PNG.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/PNG/PNG.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/PNG/PNG.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/PNG/PNG.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/PNG/PNG.dll Binary files differnew file mode 100755 index 00000000000..08bbbed4fcc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/PNG/PNG.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Pixmap/Pixmap.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/Pixmap/Pixmap.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Pixmap/Pixmap.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Pixmap/Pixmap.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/Pixmap/Pixmap.dll Binary files differnew file mode 100755 index 00000000000..c3adb205b3d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Pixmap/Pixmap.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Receive.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Receive.al new file mode 100644 index 00000000000..7cae1fc380b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Receive.al @@ -0,0 +1,23 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 728 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\Receive.al)" +# If we have sub Clipboard in Tk then use base qw(Tk::Clipboard ....) +# calls it when it does its eval "require $base" +#sub Clipboard +#{my $w = shift; +# my $cmd = shift; +# croak "Use clipboard\u$cmd()"; +#} + +sub Receive +{ + my $w = shift; + warn 'Receive(' . join(',',@_) .')'; + die 'Tk rejects send(' . join(',',@_) .")\n"; +} + +# end of Tk::Receive +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/RepeatId.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/RepeatId.al new file mode 100644 index 00000000000..e71d2a337a0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/RepeatId.al @@ -0,0 +1,16 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 498 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\RepeatId.al)" +sub RepeatId +{ + my ($w,$id) = @_; + $w = $w->MainWindow; + $w->CancelRepeat; + $w->{_afterId_} = $id; +} + +# end of Tk::RepeatId +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Activate.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Activate.al new file mode 100644 index 00000000000..500358c8e0e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Activate.al @@ -0,0 +1,33 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scale.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scale; + +#line 86 "..\blib\lib\Tk\Scale.pm (autosplit into ..\blib\lib\auto\Tk\Scale\Activate.al)" +# Activate -- +# This procedure is invoked to check a given x-y position in the +# scale and activate the slider if the x-y position falls within +# the slider. +# +# Arguments: +# w - The scale widget. +# x, y - Mouse coordinates. +sub Activate +{ + my $w = shift; + my $x = shift; + my $y = shift; + return if ($w->cget('-state') eq 'disabled'); + my $ident = $w->identify($x,$y); + if (defined($ident) && $ident eq 'slider') + { + $w->configure(-state => 'active') + } + else + { + $w->configure(-state => 'normal') + } +} + +# end of Tk::Scale::Activate +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/ButtonDown.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/ButtonDown.al new file mode 100644 index 00000000000..61ed6f32c11 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/ButtonDown.al @@ -0,0 +1,40 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scale.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scale; + +#line 138 "..\blib\lib\Tk\Scale.pm (autosplit into ..\blib\lib\auto\Tk\Scale\ButtonDown.al)" +# ButtonDown -- +# This procedure is invoked when a button is pressed in a scale. It +# takes different actions depending on where the button was pressed. +# +# Arguments: +# w - The scale widget. +# x, y - Mouse coordinates of button press. +sub ButtonDown +{ + my $w = shift; + my $x = shift; + my $y = shift; + $Tk::dragging = 0; + $el = $w->identify($x,$y); + return unless ($el); + if ($el eq 'trough1') + { + $w->Increment('up','little','initial') + } + elsif ($el eq 'trough2') + { + $w->Increment('down','little','initial') + } + elsif ($el eq 'slider') + { + $Tk::dragging = 1; + my @coords = $w->coords(); + $Tk::deltaX = $x-$coords[0]; + $Tk::deltaY = $y-$coords[1]; + } +} + +# end of Tk::Scale::ButtonDown +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/ButtonUp.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/ButtonUp.al new file mode 100644 index 00000000000..d5a22a77a46 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/ButtonUp.al @@ -0,0 +1,16 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scale.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scale; + +#line 129 "..\blib\lib\Tk\Scale.pm (autosplit into ..\blib\lib\auto\Tk\Scale\ButtonUp.al)" +sub ButtonUp +{ + my ($w,$x,$y) = @_; + $w->CancelRepeat(); + $w->EndDrag(); + $w->Activate($x,$y) +} + +# end of Tk::Scale::ButtonUp +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/ControlPress.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/ControlPress.al new file mode 100644 index 00000000000..50d7ad8b447 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/ControlPress.al @@ -0,0 +1,31 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scale.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scale; + +#line 255 "..\blib\lib\Tk\Scale.pm (autosplit into ..\blib\lib\auto\Tk\Scale\ControlPress.al)" +# ControlPress -- +# This procedure handles button presses that are made with the Control +# key down. Depending on the mouse position, it adjusts the scale +# value to one end of the range or the other. +# +# Arguments: +# w - The scale widget. +# x, y - Mouse coordinates where the button was pressed. +sub ControlPress +{ + my ($w,$x,$y) = @_; + my $el = $w->identify($x,$y); + return unless ($el); + if ($el eq 'trough1') + { + $w->set($w->cget('-from')) + } + elsif ($el eq 'trough2') + { + $w->set($w->cget('-to')) + } +} + +1; +# end of Tk::Scale::ControlPress diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Drag.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Drag.al new file mode 100644 index 00000000000..0bc63b12879 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Drag.al @@ -0,0 +1,29 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scale.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scale; + +#line 169 "..\blib\lib\Tk\Scale.pm (autosplit into ..\blib\lib\auto\Tk\Scale\Drag.al)" +# Drag -- +# This procedure is called when the mouse is dragged with +# mouse button 1 down. If the drag started inside the slider +# (i.e. the scale is active) then the scale's value is adjusted +# to reflect the mouse's position. +# +# Arguments: +# w - The scale widget. +# x, y - Mouse coordinates. +sub Drag +{ + my $w = shift; + my $x = shift; + my $y = shift; + if (!$Tk::dragging) + { + return; + } + $w->set($w->get($x-$Tk::deltaX,$y-$Tk::deltaY)) +} + +# end of Tk::Scale::Drag +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/EndDrag.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/EndDrag.al new file mode 100644 index 00000000000..86037b86d92 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/EndDrag.al @@ -0,0 +1,23 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scale.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scale; + +#line 189 "..\blib\lib\Tk\Scale.pm (autosplit into ..\blib\lib\auto\Tk\Scale\EndDrag.al)" +# EndDrag -- +# This procedure is called to end an interactive drag of the +# slider. It just marks the drag as over. +# Arguments: +# w - The scale widget. +sub EndDrag +{ + my $w = shift; + if (!$Tk::dragging) + { + return; + } + $Tk::dragging = 0; +} + +# end of Tk::Scale::EndDrag +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Enter.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Enter.al new file mode 100644 index 00000000000..1326a5ed9a0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Enter.al @@ -0,0 +1,19 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scale.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scale; + +#line 118 "..\blib\lib\Tk\Scale.pm (autosplit into ..\blib\lib\auto\Tk\Scale\Enter.al)" +sub Enter +{ + my ($w,$x,$y) = @_; + if ($Tk::strictMotif) + { + $w->{'activeBg'} = $w->cget('-activebackground'); + $w->configure('-activebackground',$w->cget('-background')); + } + $w->Activate($x,$y); +} + +# end of Tk::Scale::Enter +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Increment.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Increment.al new file mode 100644 index 00000000000..76432eeaf40 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Increment.al @@ -0,0 +1,61 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scale.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scale; + +#line 203 "..\blib\lib\Tk\Scale.pm (autosplit into ..\blib\lib\auto\Tk\Scale\Increment.al)" +# Increment -- +# This procedure is invoked to increment the value of a scale and +# to set up auto-repeating of the action if that is desired. The +# way the value is incremented depends on the "dir" and "big" +# arguments. +# +# Arguments: +# w - The scale widget. +# dir - "up" means move value towards -from, "down" means +# move towards -to. +# big - Size of increments: "big" or "little". +# repeat - Whether and how to auto-repeat the action: "noRepeat" +# means don't auto-repeat, "initial" means this is the +# first action in an auto-repeat sequence, and "again" +# means this is the second repetition or later. +sub Increment +{ + my $w = shift; + my $dir = shift; + my $big = shift; + my $repeat = shift; + my $inc; + if ($big eq 'big') + { + $inc = $w->cget('-bigincrement'); + if ($inc == 0) + { + $inc = abs(($w->cget('-to')-$w->cget('-from')))/10.0 + } + if ($inc < $w->cget('-resolution')) + { + $inc = $w->cget('-resolution') + } + } + else + { + $inc = $w->cget('-resolution') + } + if (($w->cget('-from') > $w->cget('-to')) ^ ($dir eq 'up')) + { + $inc = -$inc + } + $w->set($w->get()+$inc); + if ($repeat eq 'again') + { + $w->RepeatId($w->after($w->cget('-repeatinterval'),'Increment',$w,$dir,$big,'again')); + } + elsif ($repeat eq 'initial') + { + $w->RepeatId($w->after($w->cget('-repeatdelay'),'Increment',$w,$dir,$big,'again')); + } +} + +# end of Tk::Scale::Increment +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Leave.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Leave.al new file mode 100644 index 00000000000..eb6f7b69f89 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Leave.al @@ -0,0 +1,15 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scale.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scale; + +#line 111 "..\blib\lib\Tk\Scale.pm (autosplit into ..\blib\lib\auto\Tk\Scale\Leave.al)" +sub Leave +{ + my ($w) = @_; + $w->configure('-activebackground',$w->{'activeBg'}) if ($Tk::strictMotif); + $w->configure('-state','normal') if ($w->cget('-state') eq 'active'); +} + +# end of Tk::Scale::Leave +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Scale.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Scale.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Scale.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Scale.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Scale.dll Binary files differnew file mode 100755 index 00000000000..a63ac1d0213 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/Scale.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/autosplit.ix new file mode 100644 index 00000000000..a5c5d2292f2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scale/autosplit.ix @@ -0,0 +1,22 @@ +# Index created by AutoSplit for ..\blib\lib\Tk\Scale.pm +# (file acts as timestamp) +package Tk::Scale; +sub Activate +; +sub Leave +; +sub Enter +; +sub ButtonUp +; +sub ButtonDown +; +sub Drag +; +sub EndDrag +; +sub Increment +; +sub ControlPress +; +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ButtonDown.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ButtonDown.al new file mode 100644 index 00000000000..d80e2217abc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ButtonDown.al @@ -0,0 +1,55 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scrollbar.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scrollbar; + +#line 116 "..\blib\lib\Tk\Scrollbar.pm (autosplit into ..\blib\lib\auto\Tk\Scrollbar\ButtonDown.al)" +# tkScrollButtonDown -- +# This procedure is invoked when a button is pressed in a scrollbar. +# It changes the way the scrollbar is displayed and takes actions +# depending on where the mouse is. +# +# Arguments: +# w - The scrollbar widget. +# x, y - Mouse coordinates. + +sub ButtonDown +{my $w = shift; + my $e = $w->XEvent; + my $element = $w->identify($e->x,$e->y); + $w->configure('-activerelief' => 'sunken'); + if ($e->b == 1 and + (defined($element) && $element eq 'slider')) + { + $w->StartDrag($e->x,$e->y); + } + elsif ($e->b == 2 and + (defined($element) && $element =~ /^(trough[12]|slider)$/o)) + { + my $pos = $w->fraction($e->x, $e->y); + my($head, $tail) = $w->get; + my $len = $tail - $head; + + $head = $pos - $len/2; + $tail = $pos + $len/2; + if ($head < 0) { + $head = 0; + $tail = $len; + } + elsif ($tail > 1) { + $head = 1 - $len; + $tail = 1; + } + $w->ScrlToPos($head); + $w->set($head, $tail); + + $w->StartDrag($e->x,$e->y); + } + else + { + $w->Select($element,'initial'); + } +} + +# end of Tk::Scrollbar::ButtonDown +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ButtonUp.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ButtonUp.al new file mode 100644 index 00000000000..68857548755 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ButtonUp.al @@ -0,0 +1,26 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scrollbar.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scrollbar; + +#line 163 "..\blib\lib\Tk\Scrollbar.pm (autosplit into ..\blib\lib\auto\Tk\Scrollbar\ButtonUp.al)" +# tkScrollButtonUp -- +# This procedure is invoked when a button is released in a scrollbar. +# It cancels scans and auto-repeats that were in progress, and restores +# the way the active element is displayed. +# +# Arguments: +# w - The scrollbar widget. +# x, y - Mouse coordinates. + +sub ButtonUp +{my $w = shift; + my $e = $w->XEvent; + $w->CancelRepeat; + $w->configure('-activerelief' => 'raised'); + $w->EndDrag($e->x,$e->y); + $w->activate($w->identify($e->x,$e->y)); +} + +# end of Tk::Scrollbar::ButtonUp +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Drag.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Drag.al new file mode 100644 index 00000000000..988f9d4a3ef --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Drag.al @@ -0,0 +1,43 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scrollbar.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scrollbar; + +#line 262 "..\blib\lib\Tk\Scrollbar.pm (autosplit into ..\blib\lib\auto\Tk\Scrollbar\Drag.al)" +# tkScrollDrag -- +# This procedure is called for each mouse motion even when the slider +# is being dragged. It notifies the associated widget if we're not +# jump scrolling, and it just updates the scrollbar if we are jump +# scrolling. +# +# Arguments: +# w - The scrollbar widget. +# x, y - The current mouse position. + +sub Drag +{ + my($w,$x,$y) = @_; + return if !defined $initPos; + my $delta = $w->delta($x-$pressX, $y-$pressY); + if ($w->cget('-jump')) + { + if (@initValues == 2) + { + $w->set($initValues[0]+$delta, $initValues[1]+$delta); + } + else + { + $delta = sprintf "%d", $delta * $initValues[0]; # round() + $initValues[2] += $delta; + $initValues[3] += $delta; + $w->set(@initValues[2,3]); + } + } + else + { + $w->ScrlToPos($initPos+$delta); + } +} + +# end of Tk::Scrollbar::Drag +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/EndDrag.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/EndDrag.al new file mode 100644 index 00000000000..8c401b6fc31 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/EndDrag.al @@ -0,0 +1,28 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scrollbar.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scrollbar; + +#line 297 "..\blib\lib\Tk\Scrollbar.pm (autosplit into ..\blib\lib\auto\Tk\Scrollbar\EndDrag.al)" +# tkScrollEndDrag -- +# This procedure is called to end an interactive drag of the slider. +# It scrolls the window if we're in jump mode, otherwise it does nothing. +# +# Arguments: +# w - The scrollbar widget. +# x, y - The mouse position at the end of the drag operation. + +sub EndDrag +{ + my($w,$x,$y) = @_; + return if (!defined $initPos); + if ($w->cget('-jump')) + { + my $delta = $w->delta($x-$pressX, $y-$pressY); + $w->ScrlToPos($initPos+$delta); + } + undef $initPos; +} + +# end of Tk::Scrollbar::EndDrag +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Enter.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Enter.al new file mode 100644 index 00000000000..9584a7fa34c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Enter.al @@ -0,0 +1,21 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scrollbar.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scrollbar; + +#line 86 "..\blib\lib\Tk\Scrollbar.pm (autosplit into ..\blib\lib\auto\Tk\Scrollbar\Enter.al)" +sub Enter +{ + my $w = shift; + my $e = $w->XEvent; + if ($Tk::strictMotif) + { + my $bg = $w->cget('-background'); + $activeBg = $w->cget('-activebackground'); + $w->configure('-activebackground' => $bg); + } + $w->activate($w->identify($e->x,$e->y)); +} + +# end of Tk::Scrollbar::Enter +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Leave.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Leave.al new file mode 100644 index 00000000000..a6c5e89d91e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Leave.al @@ -0,0 +1,18 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scrollbar.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scrollbar; + +#line 99 "..\blib\lib\Tk\Scrollbar.pm (autosplit into ..\blib\lib\auto\Tk\Scrollbar\Leave.al)" +sub Leave +{ + my $w = shift; + if ($Tk::strictMotif) + { + $w->configure('-activebackground' => $activeBg) if (defined $activeBg) ; + } + $w->activate(''); +} + +# end of Tk::Scrollbar::Leave +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Motion.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Motion.al new file mode 100644 index 00000000000..46aac656c70 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Motion.al @@ -0,0 +1,15 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scrollbar.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scrollbar; + +#line 109 "..\blib\lib\Tk\Scrollbar.pm (autosplit into ..\blib\lib\auto\Tk\Scrollbar\Motion.al)" +sub Motion +{ + my $w = shift; + my $e = $w->XEvent; + $w->activate($w->identify($e->x,$e->y)); +} + +# end of Tk::Scrollbar::Motion +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ScrlByPages.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ScrlByPages.al new file mode 100644 index 00000000000..9d4018e9128 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ScrlByPages.al @@ -0,0 +1,38 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scrollbar.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scrollbar; + +#line 346 "..\blib\lib\Tk\Scrollbar.pm (autosplit into ..\blib\lib\auto\Tk\Scrollbar\ScrlByPages.al)" +# tkScrlByPages -- +# This procedure tells the scrollbar's associated widget to scroll up +# or down by a given number of screenfuls. It notifies the associated +# widget in different ways for old and new command syntaxes. +# +# Arguments: +# w - The scrollbar widget. +# orient - Which kinds of scrollbars this applies to: "h" for +# horizontal, "v" for vertical, "hv" for both. +# amount - How many screens to scroll: typically 1 or -1. + +sub ScrlByPages +{ + my $w = shift; + my $orient = shift; + my $amount = shift; + my $cmd = $w->cget('-command'); + return unless (defined $cmd); + return if (index($orient,substr($w->cget('-orient'),0,1)) < 0); + my @info = $w->get; + if (@info == 2) + { + $cmd->Call('scroll',$amount,'pages'); + } + else + { + $cmd->Call($info[2]+$amount*($info[1]-1)); + } +} + +# end of Tk::Scrollbar::ScrlByPages +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ScrlByUnits.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ScrlByUnits.al new file mode 100644 index 00000000000..a364b3e52ce --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ScrlByUnits.al @@ -0,0 +1,37 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scrollbar.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scrollbar; + +#line 317 "..\blib\lib\Tk\Scrollbar.pm (autosplit into ..\blib\lib\auto\Tk\Scrollbar\ScrlByUnits.al)" +# tkScrlByUnits -- +# This procedure tells the scrollbar's associated widget to scroll up +# or down by a given number of units. It notifies the associated widget +# in different ways for old and new command syntaxes. +# +# Arguments: +# w - The scrollbar widget. +# orient - Which kinds of scrollbars this applies to: "h" for +# horizontal, "v" for vertical, "hv" for both. +# amount - How many units to scroll: typically 1 or -1. + +sub ScrlByUnits +{my $w = shift; + my $orient = shift; + my $amount = shift; + my $cmd = $w->cget('-command'); + return unless (defined $cmd); + return if (index($orient,substr($w->cget('-orient'),0,1)) < 0); + my @info = $w->get; + if (@info == 2) + { + $cmd->Call('scroll',$amount,'units'); + } + else + { + $cmd->Call($info[2]+$amount); + } +} + +# end of Tk::Scrollbar::ScrlByUnits +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ScrlToPos.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ScrlToPos.al new file mode 100644 index 00000000000..e277237953e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ScrlToPos.al @@ -0,0 +1,35 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scrollbar.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scrollbar; + +#line 376 "..\blib\lib\Tk\Scrollbar.pm (autosplit into ..\blib\lib\auto\Tk\Scrollbar\ScrlToPos.al)" +# tkScrlToPos -- +# This procedure tells the scrollbar's associated widget to scroll to +# a particular location, given by a fraction between 0 and 1. It notifies +# the associated widget in different ways for old and new command syntaxes. +# +# Arguments: +# w - The scrollbar widget. +# pos - A fraction between 0 and 1 indicating a desired position +# in the document. + +sub ScrlToPos +{ + my $w = shift; + my $pos = shift; + my $cmd = $w->cget('-command'); + return unless (defined $cmd); + my @info = $w->get; + if (@info == 2) + { + $cmd->Call('moveto',$pos); + } + else + { + $cmd->Call(int($info[0]*$pos)); + } +} + +# end of Tk::Scrollbar::ScrlToPos +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ScrlTopBottom.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ScrlTopBottom.al new file mode 100644 index 00000000000..7a00efe616f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/ScrlTopBottom.al @@ -0,0 +1,32 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scrollbar.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scrollbar; + +#line 403 "..\blib\lib\Tk\Scrollbar.pm (autosplit into ..\blib\lib\auto\Tk\Scrollbar\ScrlTopBottom.al)" +# tkScrlTopBottom +# Scroll to the top or bottom of the document, depending on the mouse +# position. +# +# Arguments: +# w - The scrollbar widget. +# x, y - Mouse coordinates within the widget. + +sub ScrlTopBottom +{ + my $w = shift; + my $e = $w->XEvent; + my $element = $w->identify($e->x,$e->y); + return unless ($element); + if ($element =~ /1$/) + { + $w->ScrlToPos(0); + } + elsif ($element =~ /2$/) + { + $w->ScrlToPos(1); + } +} + +1; +# end of Tk::Scrollbar::ScrlTopBottom diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Scrollbar.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Scrollbar.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Scrollbar.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Scrollbar.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Scrollbar.dll Binary files differnew file mode 100755 index 00000000000..e8caf25b628 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Scrollbar.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Select.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Select.al new file mode 100644 index 00000000000..0da50da443b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/Select.al @@ -0,0 +1,59 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scrollbar.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scrollbar; + +#line 181 "..\blib\lib\Tk\Scrollbar.pm (autosplit into ..\blib\lib\auto\Tk\Scrollbar\Select.al)" +# tkScrollSelect -- +# This procedure is invoked when button 1 is pressed over the scrollbar. +# It invokes one of several scrolling actions depending on where in +# the scrollbar the button was pressed. +# +# Arguments: +# w - The scrollbar widget. +# element - The element of the scrollbar that was selected, such +# as "arrow1" or "trough2". Shouldn't be "slider". +# repeat - Whether and how to auto-repeat the action: "noRepeat" +# means don't auto-repeat, "initial" means this is the +# first action in an auto-repeat sequence, and "again" +# means this is the second repetition or later. + +sub Select +{ + my $w = shift; + my $element = shift; + my $repeat = shift; + return unless defined ($element); + if ($element eq 'arrow1') + { + $w->ScrlByUnits('hv',-1); + } + elsif ($element eq 'trough1') + { + $w->ScrlByPages('hv',-1); + } + elsif ($element eq 'trough2') + { + $w->ScrlByPages('hv', 1); + } + elsif ($element eq 'arrow2') + { + $w->ScrlByUnits('hv', 1); + } + else + { + return; + } + + if ($repeat eq 'again') + { + $w->RepeatId($w->after($w->cget('-repeatinterval'),['Select',$w,$element,'again'])); + } + elsif ($repeat eq 'initial') + { + $w->RepeatId($w->after($w->cget('-repeatdelay'),['Select',$w,$element,'again'])); + } +} + +# end of Tk::Scrollbar::Select +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/StartDrag.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/StartDrag.al new file mode 100644 index 00000000000..32edbfdef24 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/StartDrag.al @@ -0,0 +1,38 @@ +# NOTE: Derived from ..\blib\lib\Tk\Scrollbar.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Scrollbar; + +#line 232 "..\blib\lib\Tk\Scrollbar.pm (autosplit into ..\blib\lib\auto\Tk\Scrollbar\StartDrag.al)" +# tkScrollStartDrag -- +# This procedure is called to initiate a drag of the slider. It just +# remembers the starting position of the slider. +# +# Arguments: +# w - The scrollbar widget. +# x, y - The mouse position at the start of the drag operation. + +sub StartDrag +{ + my($w,$x,$y) = @_; + return unless (defined ($w->cget('-command'))); + $pressX = $x; + $pressY = $y; + @initValues = $w->get; + my $iv0 = $initValues[0]; + if (@initValues == 2) + { + $initPos = $iv0; + } + elsif ($iv0 == 0) + { + $initPos = 0; + } + else + { + $initPos = $initValues[2]/$initValues[0]; + } +} + +# end of Tk::Scrollbar::StartDrag +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/autosplit.ix new file mode 100644 index 00000000000..293d1322dd4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Scrollbar/autosplit.ix @@ -0,0 +1,30 @@ +# Index created by AutoSplit for ..\blib\lib\Tk\Scrollbar.pm +# (file acts as timestamp) +package Tk::Scrollbar; +sub Enter +; +sub Leave +; +sub Motion +; +sub ButtonDown +; +sub ButtonUp +; +sub Select +; +sub StartDrag +; +sub Drag +; +sub EndDrag +; +sub ScrlByUnits +; +sub ScrlByPages +; +sub ScrlToPos +; +sub ScrlTopBottom +; +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Selection.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Selection.al new file mode 100644 index 00000000000..965dae3cc22 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Selection.al @@ -0,0 +1,18 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 718 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\Selection.al)" +# These wrappers don't use method syntax so need to live +# in same package as raw Tk routines are newXS'ed into. + +sub Selection +{my $widget = shift; + my $cmd = shift; + croak 'Use SelectionOwn/SelectionOwner' if ($cmd eq 'own'); + croak "Use Selection\u$cmd()"; +} + +# end of Tk::Selection +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/TList/TList.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/TList/TList.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/TList/TList.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/TList/TList.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/TList/TList.dll Binary files differnew file mode 100755 index 00000000000..24c8e9ceb5a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/TList/TList.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/Create.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/Create.al new file mode 100644 index 00000000000..7900531ad3f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/Create.al @@ -0,0 +1,17 @@ +# NOTE: Derived from blib\lib\Tk\Table.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Table; + +#line 533 "blib\lib\Tk\Table.pm (autosplit into blib\lib\auto\Tk\Table\Create.al)" +sub Create +{ + my $t = shift; + my $r = shift; + my $c = shift; + my $kind = shift; + $t->put($r,$c,$t->$kind(@_)); +} + +# end of Tk::Table::Create +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/Posn.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/Posn.al new file mode 100644 index 00000000000..b625efe8212 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/Posn.al @@ -0,0 +1,15 @@ +# NOTE: Derived from blib\lib\Tk\Table.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Table; + +#line 552 "blib\lib\Tk\Table.pm (autosplit into blib\lib\auto\Tk\Table\Posn.al)" +sub Posn +{ + my ($t,$s) = @_; + my $info = $t->{Slave}{$s->PathName}; + return (wantarray) ? @$info : $info; +} + +# end of Tk::Table::Posn +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/autosplit.ix new file mode 100644 index 00000000000..1616ae28e83 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/autosplit.ix @@ -0,0 +1,14 @@ +# Index created by AutoSplit for blib\lib\Tk\Table.pm +# (file acts as timestamp) +package Tk::Table; +sub Create +; +sub totalColumns +; +sub totalRows +; +sub Posn +; +sub see +; +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/see.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/see.al new file mode 100644 index 00000000000..38841a76552 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/see.al @@ -0,0 +1,46 @@ +# NOTE: Derived from blib\lib\Tk\Table.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Table; + +#line 559 "blib\lib\Tk\Table.pm (autosplit into blib\lib\auto\Tk\Table\see.al)" +sub see +{ + my $t = shift; + my ($row,$col) = (@_ == 2) ? @_ : @{$t->{Slave}{$_[0]->PathName}}; + my $see = 1; + if (($row -= $t->cget('-fixedrows')) >= 0) + { + if ($row < $t->{Top}) + { + $t->{Top} = $row; + $t->QueueLayout(_ViewChange); + $see = 0; + } + elsif ($row >= $t->{Bottom}) + { + $t->{Top} += ($row - $t->{Bottom}+1); + $t->QueueLayout(_ViewChange); + $see = 0; + } + } + if (($col -= $t->cget('-fixedcolumns')) >= 0) + { + if ($col < $t->{Left}) + { + $t->{Left} = $col; + $t->QueueLayout(_ViewChange); + $see = 0; + } + elsif ($col >= $t->{Right}) + { + $t->{Left} += ($col - $t->{Right}+1); + $t->QueueLayout(_ViewChange); + $see = 0; + } + } + return $see; +} + +1; +# end of Tk::Table::see diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/totalColumns.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/totalColumns.al new file mode 100644 index 00000000000..bee111bbe80 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/totalColumns.al @@ -0,0 +1,13 @@ +# NOTE: Derived from blib\lib\Tk\Table.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Table; + +#line 542 "blib\lib\Tk\Table.pm (autosplit into blib\lib\auto\Tk\Table\totalColumns.al)" +sub totalColumns +{ + scalar @{shift->{'Width'}}; +} + +# end of Tk::Table::totalColumns +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/totalRows.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/totalRows.al new file mode 100644 index 00000000000..88591cc7cab --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Table/totalRows.al @@ -0,0 +1,13 @@ +# NOTE: Derived from blib\lib\Tk\Table.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Table; + +#line 547 "blib\lib\Tk\Table.pm (autosplit into blib\lib\auto\Tk\Table\totalRows.al)" +sub totalRows +{ + scalar @{shift->{'Height'}}; +} + +# end of Tk::Table::totalRows +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Text/Text.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/Text/Text.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Text/Text.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Text/Text.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/Text/Text.dll Binary files differnew file mode 100755 index 00000000000..2b0235a8221 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Text/Text.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Text/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/Tk/Text/autosplit.ix new file mode 100644 index 00000000000..48a5455c34a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Text/autosplit.ix @@ -0,0 +1,3 @@ +# Index created by AutoSplit for ..\blib\lib\Tk\Text.pm +# (file acts as timestamp) +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/TextEdit/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/Tk/TextEdit/autosplit.ix new file mode 100644 index 00000000000..d7c2cbff9ec --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/TextEdit/autosplit.ix @@ -0,0 +1,3 @@ +# Index created by AutoSplit for blib\lib\Tk\TextEdit.pm +# (file acts as timestamp) +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/TextUndo/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/Tk/TextUndo/autosplit.ix new file mode 100644 index 00000000000..3aef3c081a4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/TextUndo/autosplit.ix @@ -0,0 +1,3 @@ +# Index created by AutoSplit for blib\lib\Tk\TextUndo.pm +# (file acts as timestamp) +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/TixGrid/TixGrid.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/TixGrid/TixGrid.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/TixGrid/TixGrid.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/TixGrid/TixGrid.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/TixGrid/TixGrid.dll Binary files differnew file mode 100755 index 00000000000..7261f4fd948 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/TixGrid/TixGrid.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Tk.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/Tk.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Tk.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Tk.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/Tk.dll Binary files differnew file mode 100755 index 00000000000..8d80944808d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Tk.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_BindIn.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_BindIn.al new file mode 100644 index 00000000000..8a0a0a6c911 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_BindIn.al @@ -0,0 +1,19 @@ +# NOTE: Derived from blib\lib\Tk\Toplevel.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Toplevel; + +#line 128 "blib\lib\Tk\Toplevel.pm (autosplit into blib\lib\auto\Tk\Toplevel\FG_BindIn.al)" +# tkFocusGroup_BindIn -- +# +# Add a widget into the "FocusIn" list of the focus group. The $cmd will be +# called when the widget is focused on by the user. +# +sub FG_BindIn { + my($t, $w, $cmd) = @_; + $t->Error("focus group \"$t\" doesn't exist") unless (exists $t->{'_fg'}); + $t->{'_FocusIn'}{$w} = Tk::Callback->new($cmd); +} + +# end of Tk::Toplevel::FG_BindIn +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_BindOut.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_BindOut.al new file mode 100644 index 00000000000..d7fb14d40dc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_BindOut.al @@ -0,0 +1,20 @@ +# NOTE: Derived from blib\lib\Tk\Toplevel.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Toplevel; + +#line 139 "blib\lib\Tk\Toplevel.pm (autosplit into blib\lib\auto\Tk\Toplevel\FG_BindOut.al)" +# tkFocusGroup_BindOut -- +# +# Add a widget into the "FocusOut" list of the focus group. The +# $cmd will be called when the widget loses the focus (User +# types Tab or click on another widget). +# +sub FG_BindOut { + my($t, $w, $cmd) = @_; + $t->Error("focus group \"$t\" doesn't exist") unless (exists $t->{'_fg'}); + $t->{'_FocusOut'}{$w} = Tk::Callback->new($cmd); +} + +# end of Tk::Toplevel::FG_BindOut +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_Create.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_Create.al new file mode 100644 index 00000000000..34bb933cfa0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_Create.al @@ -0,0 +1,56 @@ +# NOTE: Derived from blib\lib\Tk\Toplevel.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Toplevel; + +#line 80 "blib\lib\Tk\Toplevel.pm (autosplit into blib\lib\auto\Tk\Toplevel\FG_Create.al)" +#---------------------------------------------------------------------- +# +# Focus Group +# +# Focus groups are used to handle the user's focusing actions inside a +# toplevel. +# +# One example of using focus groups is: when the user focuses on an +# entry, the text in the entry is highlighted and the cursor is put to +# the end of the text. When the user changes focus to another widget, +# the text in the previously focused entry is validated. +# + +#---------------------------------------------------------------------- +# tkFocusGroup_Create -- +# +# Create a focus group. All the widgets in a focus group must be +# within the same focus toplevel. Each toplevel can have only +# one focus group, which is identified by the name of the +# toplevel widget. +# +sub FG_Create { + my $t = shift; + unless (exists $t->{'_fg'}) { + $t->{'_fg'} = 1; + $t->bind('<FocusIn>', sub { + my $w = shift; + my $Ev = $w->XEvent; + $t->FG_In($w, $Ev->d); + } + ); + $t->bind('<FocusOut>', sub { + my $w = shift; + my $Ev = $w->XEvent; + $t->FG_Out($w, $Ev->d); + } + ); + $t->bind('<Destroy>', sub { + my $w = shift; + my $Ev = $w->XEvent; + $t->FG_Destroy($w); + } + ); + # <Destroy> is not sufficient to break loops if never mapped. + $t->OnDestroy([$t,'FG_Destroy']); + } +} + +# end of Tk::Toplevel::FG_Create +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_Destroy.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_Destroy.al new file mode 100644 index 00000000000..e0af457799f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_Destroy.al @@ -0,0 +1,29 @@ +# NOTE: Derived from blib\lib\Tk\Toplevel.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Toplevel; + +#line 151 "blib\lib\Tk\Toplevel.pm (autosplit into blib\lib\auto\Tk\Toplevel\FG_Destroy.al)" +# tkFocusGroup_Destroy -- +# +# Cleans up when members of the focus group is deleted, or when the +# toplevel itself gets deleted. +# +sub FG_Destroy { + my($t, $w) = @_; + if (!defined($w) || $t == $w) { + delete $t->{'_fg'}; + delete $t->{'_focus'}; + delete $t->{'_FocusOut'}; + delete $t->{'_FocusIn'}; + } else { + if (exists $t->{'_focus'}) { + delete $t->{'_focus'} if ($t->{'_focus'} == $w); + } + delete $t->{'_FocusIn'}{$w}; + delete $t->{'_FocusOut'}{$w}; + } +} + +# end of Tk::Toplevel::FG_Destroy +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_In.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_In.al new file mode 100644 index 00000000000..74cf18b9b9d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_In.al @@ -0,0 +1,24 @@ +# NOTE: Derived from blib\lib\Tk\Toplevel.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Toplevel; + +#line 172 "blib\lib\Tk\Toplevel.pm (autosplit into blib\lib\auto\Tk\Toplevel\FG_In.al)" +# tkFocusGroup_In -- +# +# Handles the <FocusIn> event. Calls the FocusIn command for the newly +# focused widget in the focus group. +# +sub FG_In { + my($t, $w, $detail) = @_; + if (defined $t->{'_focus'} and $t->{'_focus'} eq $w) { + # This is already in focus + return; + } else { + $t->{'_focus'} = $w; + $t->{'_FocusIn'}{$w}->Call if exists $t->{'_FocusIn'}{$w}; + } +} + +# end of Tk::Toplevel::FG_In +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_Out.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_Out.al new file mode 100644 index 00000000000..9dfaffe9d2e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/FG_Out.al @@ -0,0 +1,32 @@ +# NOTE: Derived from blib\lib\Tk\Toplevel.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Toplevel; + +#line 188 "blib\lib\Tk\Toplevel.pm (autosplit into blib\lib\auto\Tk\Toplevel\FG_Out.al)" +# tkFocusGroup_Out -- +# +# Handles the <FocusOut> event. Checks if this is really a lose +# focus event, not one generated by the mouse moving out of the +# toplevel window. Calls the FocusOut command for the widget +# who loses its focus. +# +sub FG_Out { + my($t, $w, $detail) = @_; + if ($detail ne 'NotifyNonlinear' and $detail ne 'NotifyNonlinearVirtual') { + # This is caused by mouse moving out of the window + return; + } + unless (exists $t->{'_FocusOut'}{$w}) { + return; + } else { + $t->{'_FocusOut'}{$w}->Call; + delete $t->{'_focus'}; + } +} + +1; + +__END__ +1; +# end of Tk::Toplevel::FG_Out diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/autosplit.ix new file mode 100644 index 00000000000..859b90d9a40 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Toplevel/autosplit.ix @@ -0,0 +1,10 @@ +# Index created by AutoSplit for blib\lib\Tk\Toplevel.pm +# (file acts as timestamp) +package Tk::Toplevel; +sub FG_Create ; +sub FG_BindIn ; +sub FG_BindOut ; +sub FG_Destroy ; +sub FG_In ; +sub FG_Out ; +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/TraverseToMenu.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/TraverseToMenu.al new file mode 100644 index 00000000000..2fdfc38b631 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/TraverseToMenu.al @@ -0,0 +1,27 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 687 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\TraverseToMenu.al)" +# tkTraverseToMenu -- +# This procedure implements keyboard traversal of menus. Given an +# ASCII character "char", it looks for a menubutton with that character +# underlined. If one is found, it posts the menubutton's menu +# +# Arguments: +# w - Window in which the key was typed (selects +# a toplevel window). +# char - Character that selects a menu. The case +# is ignored. If an empty string, nothing +# happens. +sub TraverseToMenu +{ + my $w = shift; + my $char = shift; + return unless(defined $char && $char ne ''); + $w = $w->toplevel->FindMenu($char); +} + +# end of Tk::TraverseToMenu +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Widget/ASkludge.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Widget/ASkludge.al new file mode 100644 index 00000000000..1c19caf235f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Widget/ASkludge.al @@ -0,0 +1,30 @@ +# NOTE: Derived from blib\lib\Tk\Widget.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Widget; + +#line 1438 "blib\lib\Tk\Widget.pm (autosplit into blib\lib\auto\Tk\Widget\ASkludge.al)" +sub ASkludge +{ + my ($hash,$sense) = @_; + foreach my $key (%$hash) + { + if ($key =~ /-.*variable/ && ref($hash->{$key}) eq 'SCALAR') + { + if ($sense) + { + my $val = ${$hash->{$key}}; + require Tie::Scalar; + tie ${$hash->{$key}},'Tie::StdScalar'; + ${$hash->{$key}} = $val; + } + else + { + untie ${$hash->{$key}}; + } + } + } +} + +# end of Tk::Widget::ASkludge +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Widget/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/Tk/Widget/autosplit.ix new file mode 100644 index 00000000000..b610773d4dc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Widget/autosplit.ix @@ -0,0 +1,11 @@ +# Index created by AutoSplit for blib\lib\Tk\Widget.pm +# (file acts as timestamp) +package Tk::Widget; +sub bindDump ; +sub ASkludge +; +sub clipboardKeysyms +; +sub pathname +; +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Widget/bindDump.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Widget/bindDump.al new file mode 100644 index 00000000000..cafaeececde --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Widget/bindDump.al @@ -0,0 +1,87 @@ +# NOTE: Derived from blib\lib\Tk\Widget.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Widget; + +#line 1358 "blib\lib\Tk\Widget.pm (autosplit into blib\lib\auto\Tk\Widget\bindDump.al)" +sub bindDump { + + # Dump lots of good binding information. This pretty-print subroutine + # is, essentially, the following code in disguise: + # + # print "Binding information for $w\n"; + # foreach my $tag ($w->bindtags) { + # printf "\n Binding tag '$tag' has these bindings:\n"; + # foreach my $binding ($w->bind($tag)) { + # printf " $binding\n"; + # } + # } + + my ($w) = @_; + + my (@bindtags) = $w->bindtags; + my $digits = length( scalar @bindtags ); + my ($spc1, $spc2) = ($digits + 33, $digits + 35); + my $format1 = "%${digits}d."; + my $format2 = ' ' x ($digits + 2); + my $n = 0; + + my @out; + push @out, sprintf( "\n## Binding information for '%s', %s ##", $w->PathName, $w ); + + foreach my $tag (@bindtags) { + my (@bindings) = $w->bind($tag); + $n++; # count this bindtag + + if ($#bindings == -1) { + push @out, sprintf( "\n$format1 Binding tag '$tag' has no bindings.\n", $n ); + } else { + push @out, sprintf( "\n$format1 Binding tag '$tag' has these bindings:\n", $n ); + + foreach my $binding ( @bindings ) { + my $callback = $w->bind($tag, $binding); + push @out, sprintf( "$format2%27s : %-40s\n", $binding, $callback ); + + if ($callback =~ /SCALAR/) { + if (ref $$callback) { + push @out, sprintf( "%s %s\n", ' ' x $spc1, $$callback ); + } else { + push @out, sprintf( "%s '%s'\n", ' ' x $spc1, $$callback ); + } + } elsif ($callback =~ /ARRAY/) { + if (ref $callback->[0]) { + push @out, sprintf( "%s %s\n", ' ' x $spc1, $callback->[0], "\n" ); + } else { + push @out, sprintf( "%s '%s'\n", ' ' x $spc1, $callback->[0], "\n" ); + } + foreach my $arg (@$callback[1 .. $#{@$callback}]) { + if (ref $arg) { + push @out, sprintf( "%s %-40s", ' ' x $spc2, $arg ); + } else { + push @out, sprintf( "%s '%s'", ' ' x $spc2, $arg ); + } + + if (ref $arg eq 'Tk::Ev') { + if ($arg =~ /SCALAR/) { + push @out, sprintf( ": '$$arg'" ); + } else { + push @out, sprintf( ": '%s'", join("' '", @$arg) ); + } + } + + push @out, sprintf( "\n" ); + } # forend callback arguments + } # ifend callback + + } # forend all bindings for one tag + + } # ifend have bindings + + } # forend all tags + push @out, sprintf( "\n" ); + return @out; + +} # end bindDump + +# end of Tk::Widget::bindDump +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Widget/clipboardKeysyms.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Widget/clipboardKeysyms.al new file mode 100644 index 00000000000..a5e488a7053 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Widget/clipboardKeysyms.al @@ -0,0 +1,51 @@ +# NOTE: Derived from blib\lib\Tk\Widget.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Widget; + +#line 1462 "blib\lib\Tk\Widget.pm (autosplit into blib\lib\auto\Tk\Widget\clipboardKeysyms.al)" +# clipboardKeysyms -- +# This procedure is invoked to identify the keys that correspond to +# the "copy", "cut", and "paste" functions for the clipboard. +# +# Arguments: +# copy - Name of the key (keysym name plus modifiers, if any, +# such as "Meta-y") used for the copy operation. +# cut - Name of the key used for the cut operation. +# paste - Name of the key used for the paste operation. +# +# This method is obsolete use clipboardOperations and abstract +# event types instead. See Clipboard.pm and Mainwindow.pm + +sub clipboardKeysyms +{ + my @class = (); + my $mw = shift; + if (ref $mw) + { + $mw = $mw->DelegateFor('bind'); + } + else + { + push(@class,$mw); + $mw = shift; + } + if (@_) + { + my $copy = shift; + $mw->Tk::bind(@class,"<$copy>",'clipboardCopy') if (defined $copy); + } + if (@_) + { + my $cut = shift; + $mw->Tk::bind(@class,"<$cut>",'clipboardCut') if (defined $cut); + } + if (@_) + { + my $paste = shift; + $mw->Tk::bind(@class,"<$paste>",'clipboardPaste') if (defined $paste); + } +} + +# end of Tk::Widget::clipboardKeysyms +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Widget/pathname.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Widget/pathname.al new file mode 100644 index 00000000000..9b725dc26d0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Widget/pathname.al @@ -0,0 +1,15 @@ +# NOTE: Derived from blib\lib\Tk\Widget.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Widget; + +#line 1505 "blib\lib\Tk\Widget.pm (autosplit into blib\lib\auto\Tk\Widget\pathname.al)" +sub pathname +{ + my ($w,$id) = @_; + my $x = $w->winfo('pathname',-displayof => oct($id)); + return $x->PathName; +} + +1; +# end of Tk::Widget::pathname diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/AnchorAdjust.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/AnchorAdjust.al new file mode 100644 index 00000000000..538612878ed --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/AnchorAdjust.al @@ -0,0 +1,17 @@ +# NOTE: Derived from blib\lib\Tk\Wm.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Wm; + +#line 87 "blib\lib\Tk\Wm.pm (autosplit into blib\lib\auto\Tk\Wm\AnchorAdjust.al)" +sub AnchorAdjust +{ + my ($anchor,$X,$Y,$w,$h) = @_; + $anchor = 'c' unless (defined $anchor); + $Y += ($anchor =~ /s/) ? $h : ($anchor =~ /n/) ? 0 : $h/2; + $X += ($anchor =~ /e/) ? $w : ($anchor =~ /w/) ? 0 : $w/2; + return ($X,$Y); +} + +# end of Tk::Wm::AnchorAdjust +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/FullScreen.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/FullScreen.al new file mode 100644 index 00000000000..4d5702cc60d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/FullScreen.al @@ -0,0 +1,29 @@ +# NOTE: Derived from blib\lib\Tk\Wm.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Wm; + +#line 138 "blib\lib\Tk\Wm.pm (autosplit into blib\lib\auto\Tk\Wm\FullScreen.al)" +sub FullScreen +{ + my $w = shift; + my $over = (@_) ? shift : 0; + my $width = $w->screenwidth; + my $height = $w->screenheight; + $w->GeometryRequest($width,$height); + $w->overrideredirect($over & 1); + $w->Post(0,0); + $w->update; + if ($over & 2) + { + my $x = $w->rootx; + my $y = $w->rooty; + $width -= 2*$x; + $height -= $x + $y; + $w->GeometryRequest($width,$height); + $w->update; + } +} + +# end of Tk::Wm::FullScreen +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/Popup.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/Popup.al new file mode 100644 index 00000000000..3f460c5bac6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/Popup.al @@ -0,0 +1,50 @@ +# NOTE: Derived from blib\lib\Tk\Wm.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Wm; + +#line 96 "blib\lib\Tk\Wm.pm (autosplit into blib\lib\auto\Tk\Wm\Popup.al)" +sub Popup +{ + my $w = shift; + $w->configure(@_) if @_; + $w->idletasks; + my ($mw,$mh) = ($w->reqwidth,$w->reqheight); + my ($rx,$ry,$rw,$rh) = (0,0,0,0); + my $base = $w->cget('-popover'); + my $outside = 0; + if (defined $base) + { + if ($base eq 'cursor') + { + ($rx,$ry) = $w->pointerxy; + } + else + { + $rx = $base->rootx; + $ry = $base->rooty; + $rw = $base->Width; + $rh = $base->Height; + } + } + else + { + my $sc = ($w->parent) ? $w->parent->toplevel : $w; + $rx = -$sc->vrootx; + $ry = -$sc->vrooty; + $rw = $w->screenwidth; + $rh = $w->screenheight; + } + my ($X,$Y) = AnchorAdjust($w->cget('-overanchor'),$rx,$ry,$rw,$rh); + ($X,$Y) = AnchorAdjust($w->cget('-popanchor'),$X,$Y,-$mw,-$mh); + # adjust to not cross screen borders + if ($X < 0) { $X = 0 } + if ($Y < 0) { $Y = 0 } + if ($mw > $w->screenwidth) { $X = 0 } + if ($mh > $w->screenheight) { $Y = 0 } + $w->Post($X,$Y); + $w->waitVisibility; +} + +# end of Tk::Wm::Popup +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/Post.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/Post.al new file mode 100644 index 00000000000..f3f5c8e3e08 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/Post.al @@ -0,0 +1,20 @@ +# NOTE: Derived from blib\lib\Tk\Wm.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Wm; + +#line 75 "blib\lib\Tk\Wm.pm (autosplit into blib\lib\auto\Tk\Wm\Post.al)" +sub Post +{ + my ($w,$X,$Y) = @_; + $X = int($X); + $Y = int($Y); + $w->positionfrom('user'); + $w->geometry("+$X+$Y"); + # $w->MoveToplevelWindow($X,$Y); + $w->deiconify; + $w->raise; +} + +# end of Tk::Wm::Post +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/autosplit.ix new file mode 100644 index 00000000000..201dbe8ba99 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/autosplit.ix @@ -0,0 +1,14 @@ +# Index created by AutoSplit for blib\lib\Tk\Wm.pm +# (file acts as timestamp) +package Tk::Wm; +sub Post +; +sub AnchorAdjust +; +sub Popup +; +sub FullScreen +; +sub iconposition +; +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/iconposition.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/iconposition.al new file mode 100644 index 00000000000..9254968f61c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Wm/iconposition.al @@ -0,0 +1,24 @@ +# NOTE: Derived from blib\lib\Tk\Wm.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk::Wm; + +#line 159 "blib\lib\Tk\Wm.pm (autosplit into blib\lib\auto\Tk\Wm\iconposition.al)" +sub iconposition +{ + my $w = shift; + if (@_ == 1) + { + return $w->wm('iconposition',$1,$2) if $_[0] =~ /^(\d+),(\d+)$/; + if ($_[0] =~ /^([+-])(\d+)([+-])(\d+)$/) + { + my $x = ($1 eq '-') ? $w->screenwidth-$2 : $2; + my $y = ($3 eq '-') ? $w->screenheight-$4 : $4; + return $w->wm('iconposition',$x,$y); + } + } + $w->wm('iconposition',@_); +} + +1; +# end of Tk::Wm::iconposition diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/X/X.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/X/X.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/X/X.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/X/X.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/X/X.dll Binary files differnew file mode 100755 index 00000000000..cbddac849e0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/X/X.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/X/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/Tk/X/autosplit.ix new file mode 100644 index 00000000000..e63dbf19b00 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/X/autosplit.ix @@ -0,0 +1,3 @@ +# Index created by AutoSplit for ..\..\blib\lib\Tk\X.pm +# (file acts as timestamp) +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Xlib/Xlib.bs b/Master/tlpkg/tlperl.old/lib/auto/Tk/Xlib/Xlib.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Xlib/Xlib.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/Xlib/Xlib.dll b/Master/tlpkg/tlperl.old/lib/auto/Tk/Xlib/Xlib.dll Binary files differnew file mode 100755 index 00000000000..aa4ebe56447 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/Xlib/Xlib.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/Tk/autosplit.ix new file mode 100644 index 00000000000..7bd25b78a9a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/autosplit.ix @@ -0,0 +1,45 @@ +# Index created by AutoSplit for blib\lib\Tk.pm +# (file acts as timestamp) +package Tk; +sub Error +; +sub CancelRepeat +; +sub RepeatId +; +sub FocusChildren ; +sub focusNext +; +sub focusPrev +; +sub FocusOK +; +sub EnterFocus +; +sub tabFocus +; +sub focusFollowsMouse +; +sub TraverseToMenu +; +sub FirstMenu +; +sub Selection +; +sub Receive +; +sub break +; +sub updateWidgets +; +sub ImageNames +; +sub ImageTypes +; +sub interps +; +sub lsearch +; +sub getEncoding +; +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/break.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/break.al new file mode 100644 index 00000000000..98ff783f190 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/break.al @@ -0,0 +1,13 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 743 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\break.al)" +sub break +{ + die "_TK_BREAK_\n"; +} + +# end of Tk::break +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/focusFollowsMouse.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/focusFollowsMouse.al new file mode 100644 index 00000000000..4a26198d323 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/focusFollowsMouse.al @@ -0,0 +1,14 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 681 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\focusFollowsMouse.al)" +sub focusFollowsMouse +{ + my $widget = shift; + $widget->bind('all','<Enter>','EnterFocus'); +} + +# end of Tk::focusFollowsMouse +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/focusNext.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/focusNext.al new file mode 100644 index 00000000000..18eece41cd6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/focusNext.al @@ -0,0 +1,45 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 535 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\focusNext.al)" +sub focusNext +{ + my $w = shift; + my $cur = $w; + while (1) + { + # Descend to just before the first child of the current widget. + my $parent = $cur; + my @children = $cur->FocusChildren(); + my $i = -1; + # Look for the next sibling that isn't a top-level. + while (1) + { + $i += 1; + if ($i < @children) + { + $cur = $children[$i]; + next if ($cur->toplevel == $cur); + last + } + # No more siblings, so go to the current widget's parent. + # If it's a top-level, break out of the loop, otherwise + # look for its next sibling. + $cur = $parent; + last if ($cur->toplevel() == $cur); + $parent = $parent->parent(); + @children = $parent->FocusChildren(); + $i = lsearch(\@children,$cur); + } + if ($cur == $w || $cur->FocusOK) + { + $cur->tabFocus; + return; + } + } +} + +# end of Tk::focusNext +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/focusPrev.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/focusPrev.al new file mode 100644 index 00000000000..340feab598f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/focusPrev.al @@ -0,0 +1,65 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 571 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\focusPrev.al)" +# focusPrev -- +# This procedure is invoked to move the input focus to the previous +# window before a given one. "Previous" is defined in terms of the +# window stacking order, with all the windows underneath a given +# top-level (no matter how deeply nested in the hierarchy) considered. +# +# Arguments: +# w - Name of a window: the procedure will set the focus +# to the previous window before this one in the traversal +# order. +sub focusPrev +{ + my $w = shift; + my $cur = $w; + my @children; + my $i; + my $parent; + while (1) + { + # Collect information about the current window's position + # among its siblings. Also, if the window is a top-level, + # then reposition to just after the last child of the window. + if ($cur->toplevel() == $cur) + { + $parent = $cur; + @children = $cur->FocusChildren(); + $i = @children; + } + else + { + $parent = $cur->parent(); + @children = $parent->FocusChildren(); + $i = lsearch(\@children,$cur); + } + # Go to the previous sibling, then descend to its last descendant + # (highest in stacking order. While doing this, ignore top-levels + # and their descendants. When we run out of descendants, go up + # one level to the parent. + while ($i > 0) + { + $i--; + $cur = $children[$i]; + next if ($cur->toplevel() == $cur); + $parent = $cur; + @children = $parent->FocusChildren(); + $i = @children; + } + $cur = $parent; + if ($cur == $w || $cur->FocusOK) + { + $cur->tabFocus; + return; + } + } + +} + +# end of Tk::focusPrev +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/getEncoding.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/getEncoding.al new file mode 100644 index 00000000000..b9e230edbf1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/getEncoding.al @@ -0,0 +1,43 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 785 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\getEncoding.al)" +sub getEncoding +{ + my ($class,$name) = @_; + eval { require Encode }; + if ($@) + { + require Tk::DummyEncode; + return Tk::DummyEncode->getEncoding($name); + } + $name = $Tk::font_encoding{$name} if exists $Tk::font_encoding{$name}; + my $enc = Encode::find_encoding($name); + + unless ($enc) + { + $enc = Encode::find_encoding($name) if ($name =~ s/[-_]\d+$//) + } +# if ($enc) +# { +# print STDERR "Lookup '$name' => ".$enc->name."\n"; +# } +# else +# { +# print STDERR "Failed '$name'\n"; +# } + unless ($enc) + { + if ($name eq 'X11ControlChars') + { + require Tk::DummyEncode; + $Encode::encoding{$name} = $enc = Tk::DummyEncode->getEncoding($name); + } + } + return $enc; +} + +1; +# end of Tk::getEncoding diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/interps.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/interps.al new file mode 100644 index 00000000000..9298fe95b5c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/interps.al @@ -0,0 +1,14 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 767 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\interps.al)" +sub interps +{ + my $w = shift; + return $w->winfo('interps','-displayof'); +} + +# end of Tk::interps +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/lsearch.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/lsearch.al new file mode 100644 index 00000000000..7fa5d5839de --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/lsearch.al @@ -0,0 +1,19 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 773 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\lsearch.al)" +sub lsearch +{my $ar = shift; + my $x = shift; + my $i; + for ($i = 0; $i < scalar @$ar; $i++) + { + return $i if ($$ar[$i] eq $x); + } + return -1; +} + +# end of Tk::lsearch +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/pTk/extralibs.ld b/Master/tlpkg/tlperl.old/lib/auto/Tk/pTk/extralibs.ld new file mode 100644 index 00000000000..9f42bd72dec --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/pTk/extralibs.ld @@ -0,0 +1 @@ +x:\msys\mingw\lib\libcomdlg32.a x:\msys\mingw\lib\libgdi32.a x:\msys\mingw\lib\libmsvcrt.a x:\msys\mingw\lib\libmoldname.a x:\msys\mingw\lib\libkernel32.a x:\msys\mingw\lib\libuser32.a x:\msys\mingw\lib\libgdi32.a x:\msys\mingw\lib\libwinspool.a x:\msys\mingw\lib\libcomdlg32.a x:\msys\mingw\lib\libadvapi32.a x:\msys\mingw\lib\libshell32.a x:\msys\mingw\lib\libole32.a x:\msys\mingw\lib\liboleaut32.a x:\msys\mingw\lib\libnetapi32.a x:\msys\mingw\lib\libuuid.a x:\msys\mingw\lib\libws2_32.a x:\msys\mingw\lib\libmpr.a x:\msys\mingw\lib\libwinmm.a x:\msys\mingw\lib\libversion.a x:\msys\mingw\lib\libodbc32.a x:\msys\mingw\lib\libodbccp32.a diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/tabFocus.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/tabFocus.al new file mode 100644 index 00000000000..7a4ffdf80f0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/tabFocus.al @@ -0,0 +1,13 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 676 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\tabFocus.al)" +sub tabFocus +{ + shift->Tk::focus; +} + +# end of Tk::tabFocus +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Tk/updateWidgets.al b/Master/tlpkg/tlperl.old/lib/auto/Tk/updateWidgets.al new file mode 100644 index 00000000000..5b1bf866ead --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Tk/updateWidgets.al @@ -0,0 +1,17 @@ +# NOTE: Derived from blib\lib\Tk.pm. +# Changes made here will be lost when autosplit is run again. +# See AutoSplit.pm. +package Tk; + +#line 748 "blib\lib\Tk.pm (autosplit into blib\lib\auto\Tk\updateWidgets.al)" +sub updateWidgets +{ + my ($w) = @_; + while ($w->DoOneEvent(DONT_WAIT|IDLE_EVENTS|WINDOW_EVENTS)) + { + } + $w; +} + +# end of Tk::updateWidgets +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/API/API.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/API/API.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/API/API.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/API/API.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/API/API.dll Binary files differnew file mode 100755 index 00000000000..3a7efc0adca --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/API/API.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/API/Callback/Callback.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/API/Callback/Callback.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/API/Callback/Callback.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/API/Callback/Callback.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/API/Callback/Callback.dll Binary files differnew file mode 100755 index 00000000000..147c679d576 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/API/Callback/Callback.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/ChangeNotify/ChangeNotify.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/ChangeNotify/ChangeNotify.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/ChangeNotify/ChangeNotify.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/ChangeNotify/ChangeNotify.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/ChangeNotify/ChangeNotify.dll Binary files differnew file mode 100755 index 00000000000..d2aea9dad9b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/ChangeNotify/ChangeNotify.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Clipboard/Clipboard.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/Clipboard/Clipboard.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Clipboard/Clipboard.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Clipboard/Clipboard.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/Clipboard/Clipboard.dll Binary files differnew file mode 100755 index 00000000000..d278ab5a424 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Clipboard/Clipboard.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Console/Console.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/Console/Console.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Console/Console.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Console/Console.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/Console/Console.dll Binary files differnew file mode 100755 index 00000000000..1063d12ed68 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Console/Console.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Event/Event.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/Event/Event.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Event/Event.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Event/Event.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/Event/Event.dll Binary files differnew file mode 100755 index 00000000000..60b2bebca01 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Event/Event.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/EventLog/EventLog.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/EventLog/EventLog.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/EventLog/EventLog.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/EventLog/EventLog.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/EventLog/EventLog.dll Binary files differnew file mode 100755 index 00000000000..61e6c54c3ef --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/EventLog/EventLog.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/File/File.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/File/File.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/File/File.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/File/File.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/File/File.dll Binary files differnew file mode 100755 index 00000000000..70f4a8f8849 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/File/File.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/FileSecurity/FileSecurity.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/FileSecurity/FileSecurity.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/FileSecurity/FileSecurity.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/FileSecurity/FileSecurity.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/FileSecurity/FileSecurity.dll Binary files differnew file mode 100755 index 00000000000..402775123a1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/FileSecurity/FileSecurity.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/IPC/IPC.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/IPC/IPC.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/IPC/IPC.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/IPC/IPC.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/IPC/IPC.dll Binary files differnew file mode 100755 index 00000000000..e12f04c7c0a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/IPC/IPC.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Internet/Internet.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/Internet/Internet.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Internet/Internet.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Internet/Internet.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/Internet/Internet.dll Binary files differnew file mode 100755 index 00000000000..ae5b15e9cd3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Internet/Internet.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Job/Job.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/Job/Job.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Job/Job.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Job/Job.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/Job/Job.dll Binary files differnew file mode 100755 index 00000000000..46db0b6a335 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Job/Job.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Mutex/Mutex.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/Mutex/Mutex.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Mutex/Mutex.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Mutex/Mutex.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/Mutex/Mutex.dll Binary files differnew file mode 100755 index 00000000000..db311a4b229 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Mutex/Mutex.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/NetAdmin/NetAdmin.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/NetAdmin/NetAdmin.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/NetAdmin/NetAdmin.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/NetAdmin/NetAdmin.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/NetAdmin/NetAdmin.dll Binary files differnew file mode 100755 index 00000000000..c9c353b1624 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/NetAdmin/NetAdmin.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/NetResource/NetResource.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/NetResource/NetResource.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/NetResource/NetResource.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/NetResource/NetResource.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/NetResource/NetResource.dll Binary files differnew file mode 100755 index 00000000000..e28382b65b9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/NetResource/NetResource.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/NetResource/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/Win32/NetResource/autosplit.ix new file mode 100644 index 00000000000..5a940127951 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/NetResource/autosplit.ix @@ -0,0 +1,3 @@ +# Index created by AutoSplit for ..\blib\lib\Win32\NetResource.pm +# (file acts as timestamp) +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/ODBC/ODBC.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/ODBC/ODBC.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/ODBC/ODBC.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/ODBC/ODBC.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/ODBC/ODBC.dll Binary files differnew file mode 100755 index 00000000000..c3a55ff68f4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/ODBC/ODBC.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/OLE/OLE.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/OLE/OLE.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/OLE/OLE.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/OLE/OLE.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/OLE/OLE.dll Binary files differnew file mode 100755 index 00000000000..a8bb4eb0097 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/OLE/OLE.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/PerfLib/PerfLib.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/PerfLib/PerfLib.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/PerfLib/PerfLib.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/PerfLib/PerfLib.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/PerfLib/PerfLib.dll Binary files differnew file mode 100755 index 00000000000..c0aa61962ae --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/PerfLib/PerfLib.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/PerfLib/autosplit.ix b/Master/tlpkg/tlperl.old/lib/auto/Win32/PerfLib/autosplit.ix new file mode 100644 index 00000000000..e8fc6693cb5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/PerfLib/autosplit.ix @@ -0,0 +1,3 @@ +# Index created by AutoSplit for ..\blib\lib\Win32\PerfLib.pm +# (file acts as timestamp) +1; diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Pipe/Pipe.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/Pipe/Pipe.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Pipe/Pipe.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Pipe/Pipe.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/Pipe/Pipe.dll Binary files differnew file mode 100755 index 00000000000..d6db3893029 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Pipe/Pipe.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Process/Process.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/Process/Process.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Process/Process.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Process/Process.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/Process/Process.dll Binary files differnew file mode 100755 index 00000000000..d5d417912da --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Process/Process.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Registry/Registry.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/Registry/Registry.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Registry/Registry.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Registry/Registry.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/Registry/Registry.dll Binary files differnew file mode 100755 index 00000000000..b1dfb36fd34 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Registry/Registry.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Semaphore/Semaphore.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/Semaphore/Semaphore.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Semaphore/Semaphore.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Semaphore/Semaphore.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/Semaphore/Semaphore.dll Binary files differnew file mode 100755 index 00000000000..3ab2f6f4850 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Semaphore/Semaphore.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Service/Service.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/Service/Service.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Service/Service.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Service/Service.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/Service/Service.dll Binary files differnew file mode 100755 index 00000000000..7a6be008842 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Service/Service.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Shortcut/Shortcut.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/Shortcut/Shortcut.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Shortcut/Shortcut.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Shortcut/Shortcut.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/Shortcut/Shortcut.dll Binary files differnew file mode 100755 index 00000000000..17889059886 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Shortcut/Shortcut.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Sound/Sound.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/Sound/Sound.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Sound/Sound.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Sound/Sound.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/Sound/Sound.dll Binary files differnew file mode 100755 index 00000000000..6dd86ff29f8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Sound/Sound.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Win32.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/Win32.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Win32.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/Win32.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/Win32.dll Binary files differnew file mode 100755 index 00000000000..ad5bc6b0082 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/Win32.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/WinError/WinError.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32/WinError/WinError.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/WinError/WinError.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32/WinError/WinError.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32/WinError/WinError.dll Binary files differnew file mode 100755 index 00000000000..d63300a7405 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32/WinError/WinError.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32API/Registry/Registry.bs b/Master/tlpkg/tlperl.old/lib/auto/Win32API/Registry/Registry.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32API/Registry/Registry.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/Win32API/Registry/Registry.dll b/Master/tlpkg/tlperl.old/lib/auto/Win32API/Registry/Registry.dll Binary files differnew file mode 100755 index 00000000000..45b7bc0688a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/Win32API/Registry/Registry.dll diff --git a/Master/tlpkg/tlperl.old/lib/auto/re/re.bs b/Master/tlpkg/tlperl.old/lib/auto/re/re.bs new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/re/re.bs diff --git a/Master/tlpkg/tlperl.old/lib/auto/re/re.dll b/Master/tlpkg/tlperl.old/lib/auto/re/re.dll Binary files differnew file mode 100755 index 00000000000..d2c1852db63 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/auto/re/re.dll diff --git a/Master/tlpkg/tlperl.old/lib/base.pm b/Master/tlpkg/tlperl.old/lib/base.pm new file mode 100644 index 00000000000..001914be4d3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/base.pm @@ -0,0 +1,226 @@ +package base; + +use strict 'vars'; +use vars qw($VERSION); +$VERSION = '2.07'; + +# constant.pm is slow +sub SUCCESS () { 1 } + +sub PUBLIC () { 2**0 } +sub PRIVATE () { 2**1 } +sub INHERITED () { 2**2 } +sub PROTECTED () { 2**3 } + + +my $Fattr = \%fields::attr; + +sub has_fields { + my($base) = shift; + my $fglob = ${"$base\::"}{FIELDS}; + return( ($fglob && *$fglob{HASH}) ? 1 : 0 ); +} + +sub has_version { + my($base) = shift; + my $vglob = ${$base.'::'}{VERSION}; + return( ($vglob && *$vglob{SCALAR}) ? 1 : 0 ); +} + +sub has_attr { + my($proto) = shift; + my($class) = ref $proto || $proto; + return exists $Fattr->{$class}; +} + +sub get_attr { + $Fattr->{$_[0]} = [1] unless $Fattr->{$_[0]}; + return $Fattr->{$_[0]}; +} + +if ($] < 5.009) { + *get_fields = sub { + # Shut up a possible typo warning. + () = \%{$_[0].'::FIELDS'}; + my $f = \%{$_[0].'::FIELDS'}; + + # should be centralized in fields? perhaps + # fields::mk_FIELDS_be_OK. Peh. As long as %{ $package . '::FIELDS' } + # is used here anyway, it doesn't matter. + bless $f, 'pseudohash' if (ref($f) ne 'pseudohash'); + + return $f; + } +} +else { + *get_fields = sub { + # Shut up a possible typo warning. + () = \%{$_[0].'::FIELDS'}; + return \%{$_[0].'::FIELDS'}; + } +} + +sub import { + my $class = shift; + + return SUCCESS unless @_; + + # List of base classes from which we will inherit %FIELDS. + my $fields_base; + + my $inheritor = caller(0); + + foreach my $base (@_) { + next if $inheritor->isa($base); + + if (has_version($base)) { + ${$base.'::VERSION'} = '-1, set by base.pm' + unless defined ${$base.'::VERSION'}; + } + else { + local $SIG{__DIE__}; + eval "require $base"; + # Only ignore "Can't locate" errors from our eval require. + # Other fatal errors (syntax etc) must be reported. + die if $@ && $@ !~ /^Can't locate .*? at \(eval /; + unless (%{"$base\::"}) { + require Carp; + Carp::croak(<<ERROR); +Base class package "$base" is empty. + (Perhaps you need to 'use' the module which defines that package first.) +ERROR + + } + ${$base.'::VERSION'} = "-1, set by base.pm" + unless defined ${$base.'::VERSION'}; + } + push @{"$inheritor\::ISA"}, $base; + + if ( has_fields($base) || has_attr($base) ) { + # No multiple fields inheritence *suck* + if ($fields_base) { + require Carp; + Carp::croak("Can't multiply inherit %FIELDS"); + } else { + $fields_base = $base; + } + } + } + + if( defined $fields_base ) { + inherit_fields($inheritor, $fields_base); + } +} + + +sub inherit_fields { + my($derived, $base) = @_; + + return SUCCESS unless $base; + + my $battr = get_attr($base); + my $dattr = get_attr($derived); + my $dfields = get_fields($derived); + my $bfields = get_fields($base); + + $dattr->[0] = @$battr; + + if( keys %$dfields ) { + warn "$derived is inheriting from $base but already has its own ". + "fields!\n". + "This will cause problems.\n". + "Be sure you use base BEFORE declaring fields\n"; + } + + # Iterate through the base's fields adding all the non-private + # ones to the derived class. Hang on to the original attribute + # (Public, Private, etc...) and add Inherited. + # This is all too complicated to do efficiently with add_fields(). + while (my($k,$v) = each %$bfields) { + my $fno; + if ($fno = $dfields->{$k} and $fno != $v) { + require Carp; + Carp::croak ("Inherited %FIELDS can't override existing %FIELDS"); + } + + if( $battr->[$v] & PRIVATE ) { + $dattr->[$v] = PRIVATE | INHERITED; + } + else { + $dattr->[$v] = INHERITED | $battr->[$v]; + $dfields->{$k} = $v; + } + } + + foreach my $idx (1..$#{$battr}) { + next if defined $dattr->[$idx]; + $dattr->[$idx] = $battr->[$idx] & INHERITED; + } +} + + +1; + +__END__ + +=head1 NAME + +base - Establish IS-A relationship with base classes at compile time + +=head1 SYNOPSIS + + package Baz; + use base qw(Foo Bar); + +=head1 DESCRIPTION + +Allows you to both load one or more modules, while setting up inheritance from +those modules at the same time. Roughly similar in effect to + + package Baz; + BEGIN { + require Foo; + require Bar; + push @ISA, qw(Foo Bar); + } + +If any of the listed modules are not loaded yet, I<base> silently attempts to +C<require> them (and silently continues if the C<require> failed). Whether to +C<require> a base class module is determined by the absence of a global variable +$VERSION in the base package. If $VERSION is not detected even after loading +it, <base> will define $VERSION in the base package, setting it to the string +C<-1, set by base.pm>. + +Will also initialize the fields if one of the base classes has it. +Multiple inheritence of fields is B<NOT> supported, if two or more +base classes each have inheritable fields the 'base' pragma will +croak. See L<fields>, L<public> and L<protected> for a description of +this feature. + +=head1 DIAGNOSTICS + +=over 4 + +=item Base class package "%s" is empty. + +base.pm was unable to require the base package, because it was not +found in your path. + +=back + +=head1 HISTORY + +This module was introduced with Perl 5.004_04. + + +=head1 CAVEATS + +Due to the limitations of the implementation, you must use +base I<before> you declare any of your own fields. + + +=head1 SEE ALSO + +L<fields> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/bytes.pm b/Master/tlpkg/tlperl.old/lib/bytes.pm new file mode 100644 index 00000000000..a8222794ddf --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/bytes.pm @@ -0,0 +1,88 @@ +package bytes; + +our $VERSION = '1.02'; + +$bytes::hint_bits = 0x00000008; + +sub import { + $^H |= $bytes::hint_bits; +} + +sub unimport { + $^H &= ~$bytes::hint_bits; +} + +sub AUTOLOAD { + require "bytes_heavy.pl"; + goto &$AUTOLOAD if defined &$AUTOLOAD; + require Carp; + Carp::croak("Undefined subroutine $AUTOLOAD called"); +} + +sub length ($); +sub chr ($); +sub ord ($); +sub substr ($$;$$); +sub index ($$;$); +sub rindex ($$;$); + +1; +__END__ + +=head1 NAME + +bytes - Perl pragma to force byte semantics rather than character semantics + +=head1 SYNOPSIS + + use bytes; + ... chr(...); # or bytes::chr + ... index(...); # or bytes::index + ... length(...); # or bytes::length + ... ord(...); # or bytes::ord + ... rindex(...); # or bytes::rindex + ... substr(...); # or bytes::substr + no bytes; + + +=head1 DESCRIPTION + +The C<use bytes> pragma disables character semantics for the rest of the +lexical scope in which it appears. C<no bytes> can be used to reverse +the effect of C<use bytes> within the current lexical scope. + +Perl normally assumes character semantics in the presence of character +data (i.e. data that has come from a source that has been marked as +being of a particular character encoding). When C<use bytes> is in +effect, the encoding is temporarily ignored, and each string is treated +as a series of bytes. + +As an example, when Perl sees C<$x = chr(400)>, it encodes the character +in UTF-8 and stores it in $x. Then it is marked as character data, so, +for instance, C<length $x> returns C<1>. However, in the scope of the +C<bytes> pragma, $x is treated as a series of bytes - the bytes that make +up the UTF8 encoding - and C<length $x> returns C<2>: + + $x = chr(400); + print "Length is ", length $x, "\n"; # "Length is 1" + printf "Contents are %vd\n", $x; # "Contents are 400" + { + use bytes; # or "require bytes; bytes::length()" + print "Length is ", length $x, "\n"; # "Length is 2" + printf "Contents are %vd\n", $x; # "Contents are 198.144" + } + +chr(), ord(), substr(), index() and rindex() behave similarly. + +For more on the implications and differences between character +semantics and byte semantics, see L<perluniintro> and L<perlunicode>. + +=head1 LIMITATIONS + +bytes::substr() does not work as an lvalue(). + +=head1 SEE ALSO + +L<perluniintro>, L<perlunicode>, L<utf8> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/bytes_heavy.pl b/Master/tlpkg/tlperl.old/lib/bytes_heavy.pl new file mode 100644 index 00000000000..923381de58d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/bytes_heavy.pl @@ -0,0 +1,40 @@ +package bytes; + +sub length ($) { + BEGIN { bytes::import() } + return CORE::length($_[0]); +} + +sub substr ($$;$$) { + BEGIN { bytes::import() } + return + @_ == 2 ? CORE::substr($_[0], $_[1]) : + @_ == 3 ? CORE::substr($_[0], $_[1], $_[2]) : + CORE::substr($_[0], $_[1], $_[2], $_[3]) ; +} + +sub ord ($) { + BEGIN { bytes::import() } + return CORE::ord($_[0]); +} + +sub chr ($) { + BEGIN { bytes::import() } + return CORE::chr($_[0]); +} + +sub index ($$;$) { + BEGIN { bytes::import() } + return + @_ == 2 ? CORE::index($_[0], $_[1]) : + CORE::index($_[0], $_[1], $_[2]) ; +} + +sub rindex ($$;$) { + BEGIN { bytes::import() } + return + @_ == 2 ? CORE::rindex($_[0], $_[1]) : + CORE::rindex($_[0], $_[1], $_[2]) ; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/constant.pm b/Master/tlpkg/tlperl.old/lib/constant.pm new file mode 100644 index 00000000000..159c29978a5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/constant.pm @@ -0,0 +1,340 @@ +package constant; + +use strict; +use 5.006_00; +use warnings::register; + +our($VERSION, %declared); +$VERSION = '1.05'; + +#======================================================================= + +# Some names are evil choices. +my %keywords = map +($_, 1), qw{ BEGIN INIT CHECK END DESTROY AUTOLOAD }; + +my %forced_into_main = map +($_, 1), + qw{ STDIN STDOUT STDERR ARGV ARGVOUT ENV INC SIG }; + +my %forbidden = (%keywords, %forced_into_main); + +#======================================================================= +# import() - import symbols into user's namespace +# +# What we actually do is define a function in the caller's namespace +# which returns the value. The function we create will normally +# be inlined as a constant, thereby avoiding further sub calling +# overhead. +#======================================================================= +sub import { + my $class = shift; + return unless @_; # Ignore 'use constant;' + my %constants = (); + my $multiple = ref $_[0]; + + if ( $multiple ) { + if (ref $_[0] ne 'HASH') { + require Carp; + Carp::croak("Invalid reference type '".ref(shift)."' not 'HASH'"); + } + %constants = %{+shift}; + } else { + $constants{+shift} = undef; + } + + foreach my $name ( keys %constants ) { + unless (defined $name) { + require Carp; + Carp::croak("Can't use undef as constant name"); + } + my $pkg = caller; + + # Normal constant name + if ($name =~ /^_?[^\W_0-9]\w*\z/ and !$forbidden{$name}) { + # Everything is okay + + # Name forced into main, but we're not in main. Fatal. + } elsif ($forced_into_main{$name} and $pkg ne 'main') { + require Carp; + Carp::croak("Constant name '$name' is forced into main::"); + + # Starts with double underscore. Fatal. + } elsif ($name =~ /^__/) { + require Carp; + Carp::croak("Constant name '$name' begins with '__'"); + + # Maybe the name is tolerable + } elsif ($name =~ /^[A-Za-z_]\w*\z/) { + # Then we'll warn only if you've asked for warnings + if (warnings::enabled()) { + if ($keywords{$name}) { + warnings::warn("Constant name '$name' is a Perl keyword"); + } elsif ($forced_into_main{$name}) { + warnings::warn("Constant name '$name' is " . + "forced into package main::"); + } + } + + # Looks like a boolean + # use constant FRED == fred; + } elsif ($name =~ /^[01]?\z/) { + require Carp; + if (@_) { + Carp::croak("Constant name '$name' is invalid"); + } else { + Carp::croak("Constant name looks like boolean value"); + } + + } else { + # Must have bad characters + require Carp; + Carp::croak("Constant name '$name' has invalid characters"); + } + + { + no strict 'refs'; + my $full_name = "${pkg}::$name"; + $declared{$full_name}++; + if ($multiple) { + my $scalar = $constants{$name}; + *$full_name = sub () { $scalar }; + } else { + if (@_ == 1) { + my $scalar = $_[0]; + *$full_name = sub () { $scalar }; + } elsif (@_) { + my @list = @_; + *$full_name = sub () { @list }; + } else { + *$full_name = sub () { }; + } + } + } + } +} + +1; + +__END__ + +=head1 NAME + +constant - Perl pragma to declare constants + +=head1 SYNOPSIS + + use constant PI => 4 * atan2(1, 1); + use constant DEBUG => 0; + + print "Pi equals ", PI, "...\n" if DEBUG; + + use constant { + SEC => 0, + MIN => 1, + HOUR => 2, + MDAY => 3, + MON => 4, + YEAR => 5, + WDAY => 6, + YDAY => 7, + ISDST => 8, + }; + + use constant WEEKDAYS => qw( + Sunday Monday Tuesday Wednesday Thursday Friday Saturday + ); + + print "Today is ", (WEEKDAYS)[ (localtime)[WDAY] ], ".\n"; + +=head1 DESCRIPTION + +This will declare a symbol to be a constant with the given value. + +When you declare a constant such as C<PI> using the method shown +above, each machine your script runs upon can have as many digits +of accuracy as it can use. Also, your program will be easier to +read, more likely to be maintained (and maintained correctly), and +far less likely to send a space probe to the wrong planet because +nobody noticed the one equation in which you wrote C<3.14195>. + +When a constant is used in an expression, perl replaces it with its +value at compile time, and may then optimize the expression further. +In particular, any code in an C<if (CONSTANT)> block will be optimized +away if the constant is false. + +=head1 NOTES + +As with all C<use> directives, defining a constant happens at +compile time. Thus, it's probably not correct to put a constant +declaration inside of a conditional statement (like C<if ($foo) +{ use constant ... }>). + +Constants defined using this module cannot be interpolated into +strings like variables. However, concatenation works just fine: + + print "Pi equals PI...\n"; # WRONG: does not expand "PI" + print "Pi equals ".PI."...\n"; # right + +Even though a reference may be declared as a constant, the reference may +point to data which may be changed, as this code shows. + + use constant ARRAY => [ 1,2,3,4 ]; + print ARRAY->[1]; + ARRAY->[1] = " be changed"; + print ARRAY->[1]; + +Dereferencing constant references incorrectly (such as using an array +subscript on a constant hash reference, or vice versa) will be trapped at +compile time. + +Constants belong to the package they are defined in. To refer to a +constant defined in another package, specify the full package name, as +in C<Some::Package::CONSTANT>. Constants may be exported by modules, +and may also be called as either class or instance methods, that is, +as C<< Some::Package->CONSTANT >> or as C<< $obj->CONSTANT >> where +C<$obj> is an instance of C<Some::Package>. Subclasses may define +their own constants to override those in their base class. + +The use of all caps for constant names is merely a convention, +although it is recommended in order to make constants stand out +and to help avoid collisions with other barewords, keywords, and +subroutine names. Constant names must begin with a letter or +underscore. Names beginning with a double underscore are reserved. Some +poor choices for names will generate warnings, if warnings are enabled at +compile time. + +=head2 List constants + +Constants may be lists of more (or less) than one value. A constant +with no values evaluates to C<undef> in scalar context. Note that +constants with more than one value do I<not> return their last value in +scalar context as one might expect. They currently return the number +of values, but B<this may change in the future>. Do not use constants +with multiple values in scalar context. + +B<NOTE:> This implies that the expression defining the value of a +constant is evaluated in list context. This may produce surprises: + + use constant TIMESTAMP => localtime; # WRONG! + use constant TIMESTAMP => scalar localtime; # right + +The first line above defines C<TIMESTAMP> as a 9-element list, as +returned by localtime() in list context. To set it to the string +returned by localtime() in scalar context, an explicit C<scalar> +keyword is required. + +List constants are lists, not arrays. To index or slice them, they +must be placed in parentheses. + + my @workdays = WEEKDAYS[1 .. 5]; # WRONG! + my @workdays = (WEEKDAYS)[1 .. 5]; # right + +=head2 Defining multiple constants at once + +Instead of writing multiple C<use constant> statements, you may define +multiple constants in a single statement by giving, instead of the +constant name, a reference to a hash where the keys are the names of +the constants to be defined. Obviously, all constants defined using +this method must have a single value. + + use constant { + FOO => "A single value", + BAR => "This", "won't", "work!", # Error! + }; + +This is a fundamental limitation of the way hashes are constructed in +Perl. The error messages produced when this happens will often be +quite cryptic -- in the worst case there may be none at all, and +you'll only later find that something is broken. + +When defining multiple constants, you cannot use the values of other +constants defined in the same declaration. This is because the +calling package doesn't know about any constant within that group +until I<after> the C<use> statement is finished. + + use constant { + BITMASK => 0xAFBAEBA8, + NEGMASK => ~BITMASK, # Error! + }; + +=head2 Magic constants + +Magical values and references can be made into constants at compile +time, allowing for way cool stuff like this. (These error numbers +aren't totally portable, alas.) + + use constant E2BIG => ($! = 7); + print E2BIG, "\n"; # something like "Arg list too long" + print 0+E2BIG, "\n"; # "7" + +You can't produce a tied constant by giving a tied scalar as the +value. References to tied variables, however, can be used as +constants without any problems. + +=head1 TECHNICAL NOTES + +In the current implementation, scalar constants are actually +inlinable subroutines. As of version 5.004 of Perl, the appropriate +scalar constant is inserted directly in place of some subroutine +calls, thereby saving the overhead of a subroutine call. See +L<perlsub/"Constant Functions"> for details about how and when this +happens. + +In the rare case in which you need to discover at run time whether a +particular constant has been declared via this module, you may use +this function to examine the hash C<%constant::declared>. If the given +constant name does not include a package name, the current package is +used. + + sub declared ($) { + use constant 1.01; # don't omit this! + my $name = shift; + $name =~ s/^::/main::/; + my $pkg = caller; + my $full_name = $name =~ /::/ ? $name : "${pkg}::$name"; + $constant::declared{$full_name}; + } + +=head1 BUGS + +In the current version of Perl, list constants are not inlined +and some symbols may be redefined without generating a warning. + +It is not possible to have a subroutine or a keyword with the same +name as a constant in the same package. This is probably a Good Thing. + +A constant with a name in the list C<STDIN STDOUT STDERR ARGV ARGVOUT +ENV INC SIG> is not allowed anywhere but in package C<main::>, for +technical reasons. + +Unlike constants in some languages, these cannot be overridden +on the command line or via environment variables. + +You can get into trouble if you use constants in a context which +automatically quotes barewords (as is true for any subroutine call). +For example, you can't say C<$hash{CONSTANT}> because C<CONSTANT> will +be interpreted as a string. Use C<$hash{CONSTANT()}> or +C<$hash{+CONSTANT}> to prevent the bareword quoting mechanism from +kicking in. Similarly, since the C<< => >> operator quotes a bareword +immediately to its left, you have to say C<< CONSTANT() => 'value' >> +(or simply use a comma in place of the big arrow) instead of +C<< CONSTANT => 'value' >>. + +=head1 AUTHOR + +Tom Phoenix, E<lt>F<rootbeer@redcat.com>E<gt>, with help from +many other folks. + +Multiple constant declarations at once added by Casey West, +E<lt>F<casey@geeknest.com>E<gt>. + +Documentation mostly rewritten by Ilmari Karonen, +E<lt>F<perl@itz.pp.sci.fi>E<gt>. + +=head1 COPYRIGHT + +Copyright (C) 1997, 1999 Tom Phoenix + +This module is free software; you can redistribute it or modify it +under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/fields.pm b/Master/tlpkg/tlperl.old/lib/fields.pm new file mode 100644 index 00000000000..cca778f905d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/fields.pm @@ -0,0 +1,319 @@ +package fields; + +require 5.005; +use strict; +no strict 'refs'; +unless( eval q{require warnings::register; warnings::register->import} ) { + *warnings::warnif = sub { + require Carp; + Carp::carp(@_); + } +} +use vars qw(%attr $VERSION); + +$VERSION = '2.03'; + +# constant.pm is slow +sub PUBLIC () { 2**0 } +sub PRIVATE () { 2**1 } +sub INHERITED () { 2**2 } +sub PROTECTED () { 2**3 } + + +# The %attr hash holds the attributes of the currently assigned fields +# per class. The hash is indexed by class names and the hash value is +# an array reference. The first element in the array is the lowest field +# number not belonging to a base class. The remaining elements' indices +# are the field numbers. The values are integer bit masks, or undef +# in the case of base class private fields (which occupy a slot but are +# otherwise irrelevant to the class). + +sub import { + my $class = shift; + return unless @_; + my $package = caller(0); + # avoid possible typo warnings + %{"$package\::FIELDS"} = () unless %{"$package\::FIELDS"}; + my $fields = \%{"$package\::FIELDS"}; + my $fattr = ($attr{$package} ||= [1]); + my $next = @$fattr; + + # Quiet pseudo-hash deprecation warning for uses of fields::new. + bless \%{"$package\::FIELDS"}, 'pseudohash'; + + if ($next > $fattr->[0] + and ($fields->{$_[0]} || 0) >= $fattr->[0]) + { + # There are already fields not belonging to base classes. + # Looks like a possible module reload... + $next = $fattr->[0]; + } + foreach my $f (@_) { + my $fno = $fields->{$f}; + + # Allow the module to be reloaded so long as field positions + # have not changed. + if ($fno and $fno != $next) { + require Carp; + if ($fno < $fattr->[0]) { + if ($] < 5.006001) { + warn("Hides field '$f' in base class") if $^W; + } else { + warnings::warnif("Hides field '$f' in base class") ; + } + } else { + Carp::croak("Field name '$f' already in use"); + } + } + $fields->{$f} = $next; + $fattr->[$next] = ($f =~ /^_/) ? PRIVATE : PUBLIC; + $next += 1; + } + if (@$fattr > $next) { + # Well, we gave them the benefit of the doubt by guessing the + # module was reloaded, but they appear to be declaring fields + # in more than one place. We can't be sure (without some extra + # bookkeeping) that the rest of the fields will be declared or + # have the same positions, so punt. + require Carp; + Carp::croak ("Reloaded module must declare all fields at once"); + } +} + +sub inherit { + require base; + goto &base::inherit_fields; +} + +sub _dump # sometimes useful for debugging +{ + for my $pkg (sort keys %attr) { + print "\n$pkg"; + if (@{"$pkg\::ISA"}) { + print " (", join(", ", @{"$pkg\::ISA"}), ")"; + } + print "\n"; + my $fields = \%{"$pkg\::FIELDS"}; + for my $f (sort {$fields->{$a} <=> $fields->{$b}} keys %$fields) { + my $no = $fields->{$f}; + print " $no: $f"; + my $fattr = $attr{$pkg}[$no]; + if (defined $fattr) { + my @a; + push(@a, "public") if $fattr & PUBLIC; + push(@a, "private") if $fattr & PRIVATE; + push(@a, "inherited") if $fattr & INHERITED; + print "\t(", join(", ", @a), ")"; + } + print "\n"; + } + } +} + +if ($] < 5.009) { + *new = sub { + my $class = shift; + $class = ref $class if ref $class; + return bless [\%{$class . "::FIELDS"}], $class; + } +} else { + *new = sub { + my $class = shift; + $class = ref $class if ref $class; + require Hash::Util; + my $self = bless {}, $class; + + # The lock_keys() prototype won't work since we require Hash::Util :( + &Hash::Util::lock_keys(\%$self, keys %{$class.'::FIELDS'}); + return $self; + } +} + +sub phash { + die "Pseudo-hashes have been removed from Perl" if $] >= 5.009; + my $h; + my $v; + if (@_) { + if (ref $_[0] eq 'ARRAY') { + my $a = shift; + @$h{@$a} = 1 .. @$a; + if (@_) { + $v = shift; + unless (! @_ and ref $v eq 'ARRAY') { + require Carp; + Carp::croak ("Expected at most two array refs\n"); + } + } + } + else { + if (@_ % 2) { + require Carp; + Carp::croak ("Odd number of elements initializing pseudo-hash\n"); + } + my $i = 0; + @$h{grep ++$i % 2, @_} = 1 .. @_ / 2; + $i = 0; + $v = [grep $i++ % 2, @_]; + } + } + else { + $h = {}; + $v = []; + } + [ $h, @$v ]; + +} + +1; + +__END__ + +=head1 NAME + +fields - compile-time class fields + +=head1 SYNOPSIS + + { + package Foo; + use fields qw(foo bar _Foo_private); + sub new { + my Foo $self = shift; + unless (ref $self) { + $self = fields::new($self); + $self->{_Foo_private} = "this is Foo's secret"; + } + $self->{foo} = 10; + $self->{bar} = 20; + return $self; + } + } + + my $var = Foo->new; + $var->{foo} = 42; + + # this will generate an error + $var->{zap} = 42; + + # subclassing + { + package Bar; + use base 'Foo'; + use fields qw(baz _Bar_private); # not shared with Foo + sub new { + my $class = shift; + my $self = fields::new($class); + $self->SUPER::new(); # init base fields + $self->{baz} = 10; # init own fields + $self->{_Bar_private} = "this is Bar's secret"; + return $self; + } + } + +=head1 DESCRIPTION + +The C<fields> pragma enables compile-time verified class fields. + +NOTE: The current implementation keeps the declared fields in the %FIELDS +hash of the calling package, but this may change in future versions. +Do B<not> update the %FIELDS hash directly, because it must be created +at compile-time for it to be fully useful, as is done by this pragma. + +B<Only valid for perl before 5.9.0:> + +If a typed lexical variable holding a reference is used to access a +hash element and a package with the same name as the type has +declared class fields using this pragma, then the operation is +turned into an array access at compile time. + + +The related C<base> pragma will combine fields from base classes and any +fields declared using the C<fields> pragma. This enables field +inheritance to work properly. + +Field names that start with an underscore character are made private to +the class and are not visible to subclasses. Inherited fields can be +overridden but will generate a warning if used together with the C<-w> +switch. + +B<Only valid for perls before 5.9.0:> + +The effect of all this is that you can have objects with named +fields which are as compact and as fast arrays to access. This only +works as long as the objects are accessed through properly typed +variables. If the objects are not typed, access is only checked at +run time. + + +The following functions are supported: + +=over 4 + +=item new + +B< perl before 5.9.0: > fields::new() creates and blesses a +pseudo-hash comprised of the fields declared using the C<fields> +pragma into the specified class. + +B< perl 5.9.0 and higher: > fields::new() creates and blesses a +restricted-hash comprised of the fields declared using the C<fields> +pragma into the specified class. + +This function is usable with or without pseudo-hashes. It is the +recommended way to construct a fields-based object. + +This makes it possible to write a constructor like this: + + package Critter::Sounds; + use fields qw(cat dog bird); + + sub new { + my $self = shift; + $self = fields::new($self) unless ref $self; + $self->{cat} = 'meow'; # scalar element + @$self{'dog','bird'} = ('bark','tweet'); # slice + return $self; + } + +=item phash + +B< before perl 5.9.0: > + +fields::phash() can be used to create and initialize a plain (unblessed) +pseudo-hash. This function should always be used instead of creating +pseudo-hashes directly. + +If the first argument is a reference to an array, the pseudo-hash will +be created with keys from that array. If a second argument is supplied, +it must also be a reference to an array whose elements will be used as +the values. If the second array contains less elements than the first, +the trailing elements of the pseudo-hash will not be initialized. +This makes it particularly useful for creating a pseudo-hash from +subroutine arguments: + + sub dogtag { + my $tag = fields::phash([qw(name rank ser_num)], [@_]); + } + +fields::phash() also accepts a list of key-value pairs that will +be used to construct the pseudo hash. Examples: + + my $tag = fields::phash(name => "Joe", + rank => "captain", + ser_num => 42); + + my $pseudohash = fields::phash(%args); + +B< perl 5.9.0 and higher: > + +Pseudo-hashes have been removed from Perl as of 5.10. Consider using +restricted hashes or fields::new() instead. Using fields::phash() +will cause an error. + +=back + +=head1 SEE ALSO + +L<base> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/lib.pm b/Master/tlpkg/tlperl.old/lib/lib.pm new file mode 100644 index 00000000000..06a03502368 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/lib.pm @@ -0,0 +1,206 @@ +package lib; + +# THIS FILE IS AUTOMATICALLY GENERATED FROM lib_pm.PL. +# ANY CHANGES TO THIS FILE WILL BE OVERWRITTEN BY THE NEXT PERL BUILD. + +use Config; + +use strict; + +my $archname = $Config{archname}; +my $version = $Config{version}; +my @inc_version_list = reverse split / /, $Config{inc_version_list}; + + +our @ORIG_INC = @INC; # take a handy copy of 'original' value +our $VERSION = '0.5565'; +my $Is_MacOS = $^O eq 'MacOS'; +my $Mac_FS; +if ($Is_MacOS) { + require File::Spec; + $Mac_FS = eval { require Mac::FileSpec::Unixish }; +} + +sub import { + shift; + + my %names; + foreach (reverse @_) { + my $path = $_; # we'll be modifying it, so break the alias + if ($path eq '') { + require Carp; + Carp::carp("Empty compile time value given to use lib"); + } + + $path = _nativize($path); + + if (-e $path && ! -d _) { + require Carp; + Carp::carp("Parameter to use lib must be directory, not file"); + } + unshift(@INC, $path); + # Add any previous version directories we found at configure time + foreach my $incver (@inc_version_list) + { + my $dir = $Is_MacOS + ? File::Spec->catdir( $path, $incver ) + : "$path/$incver"; + unshift(@INC, $dir) if -d $dir; + } + # Put a corresponding archlib directory in front of $path if it + # looks like $path has an archlib directory below it. + my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir) + = _get_dirs($path); + unshift(@INC, $arch_dir) if -d $arch_auto_dir; + unshift(@INC, $version_dir) if -d $version_dir; + unshift(@INC, $version_arch_dir) if -d $version_arch_dir; + } + + # remove trailing duplicates + @INC = grep { ++$names{$_} == 1 } @INC; + return; +} + + +sub unimport { + shift; + + my %names; + foreach (@_) { + my $path = _nativize($_); + + my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir) + = _get_dirs($path); + ++$names{$path}; + ++$names{$arch_dir} if -d $arch_auto_dir; + ++$names{$version_dir} if -d $version_dir; + ++$names{$version_arch_dir} if -d $version_arch_dir; + } + + # Remove ALL instances of each named directory. + @INC = grep { !exists $names{$_} } @INC; + return; +} + +sub _get_dirs { + my($dir) = @_; + my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir); + + # we could use this for all platforms in the future, but leave it + # Mac-only for now, until there is more time for testing it. + if ($Is_MacOS) { + $arch_auto_dir = File::Spec->catdir( $dir, $archname, 'auto' ); + $arch_dir = File::Spec->catdir( $dir, $archname, ); + $version_dir = File::Spec->catdir( $dir, $version ); + $version_arch_dir = File::Spec->catdir( $dir, $version, $archname ); + } else { + $arch_auto_dir = "$dir/$archname/auto"; + $arch_dir = "$dir/$archname"; + $version_dir = "$dir/$version"; + $version_arch_dir = "$dir/$version/$archname"; + } + return($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir); +} + +sub _nativize { + my($dir) = @_; + + if ($Is_MacOS && $Mac_FS && ! -d $dir) { + $dir = Mac::FileSpec::Unixish::nativize($dir); + $dir .= ":" unless $dir =~ /:$/; + } + + return $dir; +} + +1; +__END__ + +=head1 NAME + +lib - manipulate @INC at compile time + +=head1 SYNOPSIS + + use lib LIST; + + no lib LIST; + +=head1 DESCRIPTION + +This is a small simple module which simplifies the manipulation of @INC +at compile time. + +It is typically used to add extra directories to perl's search path so +that later C<use> or C<require> statements will find modules which are +not located on perl's default search path. + +=head2 Adding directories to @INC + +The parameters to C<use lib> are added to the start of the perl search +path. Saying + + use lib LIST; + +is I<almost> the same as saying + + BEGIN { unshift(@INC, LIST) } + +For each directory in LIST (called $dir here) the lib module also +checks to see if a directory called $dir/$archname/auto exists. +If so the $dir/$archname directory is assumed to be a corresponding +architecture specific directory and is added to @INC in front of $dir. + +To avoid memory leaks, all trailing duplicate entries in @INC are +removed. + +=head2 Deleting directories from @INC + +You should normally only add directories to @INC. If you need to +delete directories from @INC take care to only delete those which you +added yourself or which you are certain are not needed by other modules +in your script. Other modules may have added directories which they +need for correct operation. + +The C<no lib> statement deletes all instances of each named directory +from @INC. + +For each directory in LIST (called $dir here) the lib module also +checks to see if a directory called $dir/$archname/auto exists. +If so the $dir/$archname directory is assumed to be a corresponding +architecture specific directory and is also deleted from @INC. + +=head2 Restoring original @INC + +When the lib module is first loaded it records the current value of @INC +in an array C<@lib::ORIG_INC>. To restore @INC to that value you +can say + + @INC = @lib::ORIG_INC; + +=head1 CAVEATS + +In order to keep lib.pm small and simple, it only works with Unix +filepaths. This doesn't mean it only works on Unix, but non-Unix +users must first translate their file paths to Unix conventions. + + # VMS users wanting to put [.stuff.moo] into + # their @INC would write + use lib 'stuff/moo'; + +=head1 NOTES + +In the future, this module will likely use File::Spec for determining +paths, as it does now for Mac OS (where Unix-style or Mac-style paths +work, and Unix-style paths are converted properly to Mac-style paths +before being added to @INC). + +=head1 SEE ALSO + +FindBin - optional module which deals with paths relative to the source file. + +=head1 AUTHOR + +Tim Bunce, 2nd June 1995. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/newgetopt.pl b/Master/tlpkg/tlperl.old/lib/newgetopt.pl new file mode 100644 index 00000000000..95eef220fe7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/newgetopt.pl @@ -0,0 +1,75 @@ +# $Id: newgetopt.pl,v 1.18 2001-09-21 15:34:59+02 jv Exp $ + +# This library is no longer being maintained, and is included for backward +# compatibility with Perl 4 programs which may require it. +# It is now just a wrapper around the Getopt::Long module. +# +# In particular, this should not be used as an example of modern Perl +# programming techniques. +# +# Suggested alternative: Getopt::Long + +{ package newgetopt; + + # Values for $order. See GNU getopt.c for details. + $REQUIRE_ORDER = 0; + $PERMUTE = 1; + $RETURN_IN_ORDER = 2; + + # Handle POSIX compliancy. + if ( defined $ENV{"POSIXLY_CORRECT"} ) { + $autoabbrev = 0; # no automatic abbrev of options (???) + $getopt_compat = 0; # disallow '+' to start options + $option_start = "(--|-)"; + $order = $REQUIRE_ORDER; + $bundling = 0; + $passthrough = 0; + } + else { + $autoabbrev = 1; # automatic abbrev of options + $getopt_compat = 1; # allow '+' to start options + $option_start = "(--|-|\\+)"; + $order = $PERMUTE; + $bundling = 0; + $passthrough = 0; + } + + # Other configurable settings. + $debug = 0; # for debugging + $ignorecase = 1; # ignore case when matching options + $argv_end = "--"; # don't change this! +} + +use Getopt::Long; + +################ Subroutines ################ + +sub NGetOpt { + + $Getopt::Long::debug = $newgetopt::debug + if defined $newgetopt::debug; + $Getopt::Long::autoabbrev = $newgetopt::autoabbrev + if defined $newgetopt::autoabbrev; + $Getopt::Long::getopt_compat = $newgetopt::getopt_compat + if defined $newgetopt::getopt_compat; + $Getopt::Long::option_start = $newgetopt::option_start + if defined $newgetopt::option_start; + $Getopt::Long::order = $newgetopt::order + if defined $newgetopt::order; + $Getopt::Long::bundling = $newgetopt::bundling + if defined $newgetopt::bundling; + $Getopt::Long::ignorecase = $newgetopt::ignorecase + if defined $newgetopt::ignorecase; + $Getopt::Long::ignorecase = $newgetopt::ignorecase + if defined $newgetopt::ignorecase; + $Getopt::Long::passthrough = $newgetopt::passthrough + if defined $newgetopt::passthrough; + + &GetOptions; +} + +################ Package return ################ + +1; + +################ End of newgetopt.pl ################ diff --git a/Master/tlpkg/tlperl.old/lib/overload.pm b/Master/tlpkg/tlperl.old/lib/overload.pm new file mode 100644 index 00000000000..15b7e775e74 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/overload.pm @@ -0,0 +1,1434 @@ +package overload; + +our $VERSION = '1.04'; + +$overload::hint_bits = 0x20000; # HINT_LOCALIZE_HH + +sub nil {} + +sub OVERLOAD { + $package = shift; + my %arg = @_; + my ($sub, $fb); + $ {$package . "::OVERLOAD"}{dummy}++; # Register with magic by touching. + *{$package . "::()"} = \&nil; # Make it findable via fetchmethod. + for (keys %arg) { + if ($_ eq 'fallback') { + $fb = $arg{$_}; + } else { + $sub = $arg{$_}; + if (not ref $sub and $sub !~ /::/) { + $ {$package . "::(" . $_} = $sub; + $sub = \&nil; + } + #print STDERR "Setting `$ {'package'}::\cO$_' to \\&`$sub'.\n"; + *{$package . "::(" . $_} = \&{ $sub }; + } + } + ${$package . "::()"} = $fb; # Make it findable too (fallback only). +} + +sub import { + $package = (caller())[0]; + # *{$package . "::OVERLOAD"} = \&OVERLOAD; + shift; + $package->overload::OVERLOAD(@_); +} + +sub unimport { + $package = (caller())[0]; + ${$package . "::OVERLOAD"}{dummy}++; # Upgrade the table + shift; + for (@_) { + if ($_ eq 'fallback') { + undef $ {$package . "::()"}; + } else { + delete $ {$package . "::"}{"(" . $_}; + } + } +} + +sub Overloaded { + my $package = shift; + $package = ref $package if ref $package; + $package->can('()'); +} + +sub ov_method { + my $globref = shift; + return undef unless $globref; + my $sub = \&{*$globref}; + return $sub if $sub ne \&nil; + return shift->can($ {*$globref}); +} + +sub OverloadedStringify { + my $package = shift; + $package = ref $package if ref $package; + #$package->can('(""') + ov_method mycan($package, '(""'), $package + or ov_method mycan($package, '(0+'), $package + or ov_method mycan($package, '(bool'), $package + or ov_method mycan($package, '(nomethod'), $package; +} + +sub Method { + my $package = shift; + $package = ref $package if ref $package; + #my $meth = $package->can('(' . shift); + ov_method mycan($package, '(' . shift), $package; + #return $meth if $meth ne \&nil; + #return $ {*{$meth}}; +} + +sub AddrRef { + my $package = ref $_[0]; + return "$_[0]" unless $package; + + require Scalar::Util; + my $class = Scalar::Util::blessed($_[0]); + my $class_prefix = defined($class) ? "$class=" : ""; + my $type = Scalar::Util::reftype($_[0]); + my $addr = Scalar::Util::refaddr($_[0]); + return sprintf("$class_prefix$type(0x%x)", $addr); +} + +*StrVal = *AddrRef; + +sub mycan { # Real can would leave stubs. + my ($package, $meth) = @_; + return \*{$package . "::$meth"} if defined &{$package . "::$meth"}; + my $p; + foreach $p (@{$package . "::ISA"}) { + my $out = mycan($p, $meth); + return $out if $out; + } + return undef; +} + +%constants = ( + 'integer' => 0x1000, # HINT_NEW_INTEGER + 'float' => 0x2000, # HINT_NEW_FLOAT + 'binary' => 0x4000, # HINT_NEW_BINARY + 'q' => 0x8000, # HINT_NEW_STRING + 'qr' => 0x10000, # HINT_NEW_RE + ); + +%ops = ( with_assign => "+ - * / % ** << >> x .", + assign => "+= -= *= /= %= **= <<= >>= x= .=", + num_comparison => "< <= > >= == !=", + '3way_comparison'=> "<=> cmp", + str_comparison => "lt le gt ge eq ne", + binary => "& | ^", + unary => "neg ! ~", + mutators => '++ --', + func => "atan2 cos sin exp abs log sqrt int", + conversion => 'bool "" 0+', + iterators => '<>', + dereferencing => '${} @{} %{} &{} *{}', + special => 'nomethod fallback ='); + +use warnings::register; +sub constant { + # Arguments: what, sub + while (@_) { + if (@_ == 1) { + warnings::warnif ("Odd number of arguments for overload::constant"); + last; + } + elsif (!exists $constants {$_ [0]}) { + warnings::warnif ("`$_[0]' is not an overloadable type"); + } + elsif (!ref $_ [1] || "$_[1]" !~ /CODE\(0x[\da-f]+\)$/) { + # Can't use C<ref $_[1] eq "CODE"> above as code references can be + # blessed, and C<ref> would return the package the ref is blessed into. + if (warnings::enabled) { + $_ [1] = "undef" unless defined $_ [1]; + warnings::warn ("`$_[1]' is not a code reference"); + } + } + else { + $^H{$_[0]} = $_[1]; + $^H |= $constants{$_[0]} | $overload::hint_bits; + } + shift, shift; + } +} + +sub remove_constant { + # Arguments: what, sub + while (@_) { + delete $^H{$_[0]}; + $^H &= ~ $constants{$_[0]}; + shift, shift; + } +} + +1; + +__END__ + +=head1 NAME + +overload - Package for overloading Perl operations + +=head1 SYNOPSIS + + package SomeThing; + + use overload + '+' => \&myadd, + '-' => \&mysub; + # etc + ... + + package main; + $a = new SomeThing 57; + $b=5+$a; + ... + if (overload::Overloaded $b) {...} + ... + $strval = overload::StrVal $b; + +=head1 DESCRIPTION + +=head2 Declaration of overloaded functions + +The compilation directive + + package Number; + use overload + "+" => \&add, + "*=" => "muas"; + +declares function Number::add() for addition, and method muas() in +the "class" C<Number> (or one of its base classes) +for the assignment form C<*=> of multiplication. + +Arguments of this directive come in (key, value) pairs. Legal values +are values legal inside a C<&{ ... }> call, so the name of a +subroutine, a reference to a subroutine, or an anonymous subroutine +will all work. Note that values specified as strings are +interpreted as methods, not subroutines. Legal keys are listed below. + +The subroutine C<add> will be called to execute C<$a+$b> if $a +is a reference to an object blessed into the package C<Number>, or if $a is +not an object from a package with defined mathemagic addition, but $b is a +reference to a C<Number>. It can also be called in other situations, like +C<$a+=7>, or C<$a++>. See L<MAGIC AUTOGENERATION>. (Mathemagical +methods refer to methods triggered by an overloaded mathematical +operator.) + +Since overloading respects inheritance via the @ISA hierarchy, the +above declaration would also trigger overloading of C<+> and C<*=> in +all the packages which inherit from C<Number>. + +=head2 Calling Conventions for Binary Operations + +The functions specified in the C<use overload ...> directive are called +with three (in one particular case with four, see L<Last Resort>) +arguments. If the corresponding operation is binary, then the first +two arguments are the two arguments of the operation. However, due to +general object calling conventions, the first argument should always be +an object in the package, so in the situation of C<7+$a>, the +order of the arguments is interchanged. It probably does not matter +when implementing the addition method, but whether the arguments +are reversed is vital to the subtraction method. The method can +query this information by examining the third argument, which can take +three different values: + +=over 7 + +=item FALSE + +the order of arguments is as in the current operation. + +=item TRUE + +the arguments are reversed. + +=item C<undef> + +the current operation is an assignment variant (as in +C<$a+=7>), but the usual function is called instead. This additional +information can be used to generate some optimizations. Compare +L<Calling Conventions for Mutators>. + +=back + +=head2 Calling Conventions for Unary Operations + +Unary operation are considered binary operations with the second +argument being C<undef>. Thus the functions that overloads C<{"++"}> +is called with arguments C<($a,undef,'')> when $a++ is executed. + +=head2 Calling Conventions for Mutators + +Two types of mutators have different calling conventions: + +=over + +=item C<++> and C<--> + +The routines which implement these operators are expected to actually +I<mutate> their arguments. So, assuming that $obj is a reference to a +number, + + sub incr { my $n = $ {$_[0]}; ++$n; $_[0] = bless \$n} + +is an appropriate implementation of overloaded C<++>. Note that + + sub incr { ++$ {$_[0]} ; shift } + +is OK if used with preincrement and with postincrement. (In the case +of postincrement a copying will be performed, see L<Copy Constructor>.) + +=item C<x=> and other assignment versions + +There is nothing special about these methods. They may change the +value of their arguments, and may leave it as is. The result is going +to be assigned to the value in the left-hand-side if different from +this value. + +This allows for the same method to be used as overloaded C<+=> and +C<+>. Note that this is I<allowed>, but not recommended, since by the +semantic of L<"Fallback"> Perl will call the method for C<+> anyway, +if C<+=> is not overloaded. + +=back + +B<Warning.> Due to the presence of assignment versions of operations, +routines which may be called in assignment context may create +self-referential structures. Currently Perl will not free self-referential +structures until cycles are C<explicitly> broken. You may get problems +when traversing your structures too. + +Say, + + use overload '+' => sub { bless [ \$_[0], \$_[1] ] }; + +is asking for trouble, since for code C<$obj += $foo> the subroutine +is called as C<$obj = add($obj, $foo, undef)>, or C<$obj = [\$obj, +\$foo]>. If using such a subroutine is an important optimization, one +can overload C<+=> explicitly by a non-"optimized" version, or switch +to non-optimized version if C<not defined $_[2]> (see +L<Calling Conventions for Binary Operations>). + +Even if no I<explicit> assignment-variants of operators are present in +the script, they may be generated by the optimizer. Say, C<",$obj,"> or +C<',' . $obj . ','> may be both optimized to + + my $tmp = ',' . $obj; $tmp .= ','; + +=head2 Overloadable Operations + +The following symbols can be specified in C<use overload> directive: + +=over 5 + +=item * I<Arithmetic operations> + + "+", "+=", "-", "-=", "*", "*=", "/", "/=", "%", "%=", + "**", "**=", "<<", "<<=", ">>", ">>=", "x", "x=", ".", ".=", + +For these operations a substituted non-assignment variant can be called if +the assignment variant is not available. Methods for operations C<+>, +C<->, C<+=>, and C<-=> can be called to automatically generate +increment and decrement methods. The operation C<-> can be used to +autogenerate missing methods for unary minus or C<abs>. + +See L<"MAGIC AUTOGENERATION">, L<"Calling Conventions for Mutators"> and +L<"Calling Conventions for Binary Operations">) for details of these +substitutions. + +=item * I<Comparison operations> + + "<", "<=", ">", ">=", "==", "!=", "<=>", + "lt", "le", "gt", "ge", "eq", "ne", "cmp", + +If the corresponding "spaceship" variant is available, it can be +used to substitute for the missing operation. During C<sort>ing +arrays, C<cmp> is used to compare values subject to C<use overload>. + +=item * I<Bit operations> + + "&", "^", "|", "neg", "!", "~", + +C<neg> stands for unary minus. If the method for C<neg> is not +specified, it can be autogenerated using the method for +subtraction. If the method for C<!> is not specified, it can be +autogenerated using the methods for C<bool>, or C<"">, or C<0+>. + +=item * I<Increment and decrement> + + "++", "--", + +If undefined, addition and subtraction methods can be +used instead. These operations are called both in prefix and +postfix form. + +=item * I<Transcendental functions> + + "atan2", "cos", "sin", "exp", "abs", "log", "sqrt", "int" + +If C<abs> is unavailable, it can be autogenerated using methods +for "E<lt>" or "E<lt>=E<gt>" combined with either unary minus or subtraction. + +Note that traditionally the Perl function L<int> rounds to 0, thus for +floating-point-like types one should follow the same semantic. If +C<int> is unavailable, it can be autogenerated using the overloading of +C<0+>. + +=item * I<Boolean, string and numeric conversion> + + 'bool', '""', '0+', + +If one or two of these operations are not overloaded, the remaining ones can +be used instead. C<bool> is used in the flow control operators +(like C<while>) and for the ternary C<?:> operation. These functions can +return any arbitrary Perl value. If the corresponding operation for this value +is overloaded too, that operation will be called again with this value. + +As a special case if the overload returns the object itself then it will +be used directly. An overloaded conversion returning the object is +probably a bug, because you're likely to get something that looks like +C<YourPackage=HASH(0x8172b34)>. + +=item * I<Iteration> + + "<>" + +If not overloaded, the argument will be converted to a filehandle or +glob (which may require a stringification). The same overloading +happens both for the I<read-filehandle> syntax C<E<lt>$varE<gt>> and +I<globbing> syntax C<E<lt>${var}E<gt>>. + +B<BUGS> Even in list context, the iterator is currently called only +once and with scalar context. + +=item * I<Dereferencing> + + '${}', '@{}', '%{}', '&{}', '*{}'. + +If not overloaded, the argument will be dereferenced I<as is>, thus +should be of correct type. These functions should return a reference +of correct type, or another object with overloaded dereferencing. + +As a special case if the overload returns the object itself then it +will be used directly (provided it is the correct type). + +The dereference operators must be specified explicitly they will not be passed to +"nomethod". + +=item * I<Special> + + "nomethod", "fallback", "=", + +see L<SPECIAL SYMBOLS FOR C<use overload>>. + +=back + +See L<"Fallback"> for an explanation of when a missing method can be +autogenerated. + +A computer-readable form of the above table is available in the hash +%overload::ops, with values being space-separated lists of names: + + with_assign => '+ - * / % ** << >> x .', + assign => '+= -= *= /= %= **= <<= >>= x= .=', + num_comparison => '< <= > >= == !=', + '3way_comparison'=> '<=> cmp', + str_comparison => 'lt le gt ge eq ne', + binary => '& | ^', + unary => 'neg ! ~', + mutators => '++ --', + func => 'atan2 cos sin exp abs log sqrt', + conversion => 'bool "" 0+', + iterators => '<>', + dereferencing => '${} @{} %{} &{} *{}', + special => 'nomethod fallback =' + +=head2 Inheritance and overloading + +Inheritance interacts with overloading in two ways. + +=over + +=item Strings as values of C<use overload> directive + +If C<value> in + + use overload key => value; + +is a string, it is interpreted as a method name. + +=item Overloading of an operation is inherited by derived classes + +Any class derived from an overloaded class is also overloaded. The +set of overloaded methods is the union of overloaded methods of all +the ancestors. If some method is overloaded in several ancestor, then +which description will be used is decided by the usual inheritance +rules: + +If C<A> inherits from C<B> and C<C> (in this order), C<B> overloads +C<+> with C<\&D::plus_sub>, and C<C> overloads C<+> by C<"plus_meth">, +then the subroutine C<D::plus_sub> will be called to implement +operation C<+> for an object in package C<A>. + +=back + +Note that since the value of the C<fallback> key is not a subroutine, +its inheritance is not governed by the above rules. In the current +implementation, the value of C<fallback> in the first overloaded +ancestor is used, but this is accidental and subject to change. + +=head1 SPECIAL SYMBOLS FOR C<use overload> + +Three keys are recognized by Perl that are not covered by the above +description. + +=head2 Last Resort + +C<"nomethod"> should be followed by a reference to a function of four +parameters. If defined, it is called when the overloading mechanism +cannot find a method for some operation. The first three arguments of +this function coincide with the arguments for the corresponding method if +it were found, the fourth argument is the symbol +corresponding to the missing method. If several methods are tried, +the last one is used. Say, C<1-$a> can be equivalent to + + &nomethodMethod($a,1,1,"-") + +if the pair C<"nomethod" =E<gt> "nomethodMethod"> was specified in the +C<use overload> directive. + +The C<"nomethod"> mechanism is I<not> used for the dereference operators +( ${} @{} %{} &{} *{} ). + + +If some operation cannot be resolved, and there is no function +assigned to C<"nomethod">, then an exception will be raised via die()-- +unless C<"fallback"> was specified as a key in C<use overload> directive. + + +=head2 Fallback + +The key C<"fallback"> governs what to do if a method for a particular +operation is not found. Three different cases are possible depending on +the value of C<"fallback">: + +=over 16 + +=item * C<undef> + +Perl tries to use a +substituted method (see L<MAGIC AUTOGENERATION>). If this fails, it +then tries to calls C<"nomethod"> value; if missing, an exception +will be raised. + +=item * TRUE + +The same as for the C<undef> value, but no exception is raised. Instead, +it silently reverts to what it would have done were there no C<use overload> +present. + +=item * defined, but FALSE + +No autogeneration is tried. Perl tries to call +C<"nomethod"> value, and if this is missing, raises an exception. + +=back + +B<Note.> C<"fallback"> inheritance via @ISA is not carved in stone +yet, see L<"Inheritance and overloading">. + +=head2 Copy Constructor + +The value for C<"="> is a reference to a function with three +arguments, i.e., it looks like the other values in C<use +overload>. However, it does not overload the Perl assignment +operator. This would go against Camel hair. + +This operation is called in the situations when a mutator is applied +to a reference that shares its object with some other reference, such +as + + $a=$b; + ++$a; + +To make this change $a and not change $b, a copy of C<$$a> is made, +and $a is assigned a reference to this new object. This operation is +done during execution of the C<++$a>, and not during the assignment, +(so before the increment C<$$a> coincides with C<$$b>). This is only +done if C<++> is expressed via a method for C<'++'> or C<'+='> (or +C<nomethod>). Note that if this operation is expressed via C<'+'> +a nonmutator, i.e., as in + + $a=$b; + $a=$a+1; + +then C<$a> does not reference a new copy of C<$$a>, since $$a does not +appear as lvalue when the above code is executed. + +If the copy constructor is required during the execution of some mutator, +but a method for C<'='> was not specified, it can be autogenerated as a +string copy if the object is a plain scalar. + +=over 5 + +=item B<Example> + +The actually executed code for + + $a=$b; + Something else which does not modify $a or $b.... + ++$a; + +may be + + $a=$b; + Something else which does not modify $a or $b.... + $a = $a->clone(undef,""); + $a->incr(undef,""); + +if $b was mathemagical, and C<'++'> was overloaded with C<\&incr>, +C<'='> was overloaded with C<\&clone>. + +=back + +Same behaviour is triggered by C<$b = $a++>, which is consider a synonym for +C<$b = $a; ++$a>. + +=head1 MAGIC AUTOGENERATION + +If a method for an operation is not found, and the value for C<"fallback"> is +TRUE or undefined, Perl tries to autogenerate a substitute method for +the missing operation based on the defined operations. Autogenerated method +substitutions are possible for the following operations: + +=over 16 + +=item I<Assignment forms of arithmetic operations> + +C<$a+=$b> can use the method for C<"+"> if the method for C<"+="> +is not defined. + +=item I<Conversion operations> + +String, numeric, and boolean conversion are calculated in terms of one +another if not all of them are defined. + +=item I<Increment and decrement> + +The C<++$a> operation can be expressed in terms of C<$a+=1> or C<$a+1>, +and C<$a--> in terms of C<$a-=1> and C<$a-1>. + +=item C<abs($a)> + +can be expressed in terms of C<$aE<lt>0> and C<-$a> (or C<0-$a>). + +=item I<Unary minus> + +can be expressed in terms of subtraction. + +=item I<Negation> + +C<!> and C<not> can be expressed in terms of boolean conversion, or +string or numerical conversion. + +=item I<Concatenation> + +can be expressed in terms of string conversion. + +=item I<Comparison operations> + +can be expressed in terms of its "spaceship" counterpart: either +C<E<lt>=E<gt>> or C<cmp>: + + <, >, <=, >=, ==, != in terms of <=> + lt, gt, le, ge, eq, ne in terms of cmp + +=item I<Iterator> + + <> in terms of builtin operations + +=item I<Dereferencing> + + ${} @{} %{} &{} *{} in terms of builtin operations + +=item I<Copy operator> + +can be expressed in terms of an assignment to the dereferenced value, if this +value is a scalar and not a reference. + +=back + +=head1 Losing overloading + +The restriction for the comparison operation is that even if, for example, +`C<cmp>' should return a blessed reference, the autogenerated `C<lt>' +function will produce only a standard logical value based on the +numerical value of the result of `C<cmp>'. In particular, a working +numeric conversion is needed in this case (possibly expressed in terms of +other conversions). + +Similarly, C<.=> and C<x=> operators lose their mathemagical properties +if the string conversion substitution is applied. + +When you chop() a mathemagical object it is promoted to a string and its +mathemagical properties are lost. The same can happen with other +operations as well. + +=head1 Run-time Overloading + +Since all C<use> directives are executed at compile-time, the only way to +change overloading during run-time is to + + eval 'use overload "+" => \&addmethod'; + +You can also use + + eval 'no overload "+", "--", "<="'; + +though the use of these constructs during run-time is questionable. + +=head1 Public functions + +Package C<overload.pm> provides the following public functions: + +=over 5 + +=item overload::StrVal(arg) + +Gives string value of C<arg> as in absence of stringify overloading. If you +are using this to get the address of a reference (useful for checking if two +references point to the same thing) then you may be better off using +C<Scalar::Util::refaddr()>, which is faster. + +=item overload::Overloaded(arg) + +Returns true if C<arg> is subject to overloading of some operations. + +=item overload::Method(obj,op) + +Returns C<undef> or a reference to the method that implements C<op>. + +=back + +=head1 Overloading constants + +For some applications, the Perl parser mangles constants too much. +It is possible to hook into this process via C<overload::constant()> +and C<overload::remove_constant()> functions. + +These functions take a hash as an argument. The recognized keys of this hash +are: + +=over 8 + +=item integer + +to overload integer constants, + +=item float + +to overload floating point constants, + +=item binary + +to overload octal and hexadecimal constants, + +=item q + +to overload C<q>-quoted strings, constant pieces of C<qq>- and C<qx>-quoted +strings and here-documents, + +=item qr + +to overload constant pieces of regular expressions. + +=back + +The corresponding values are references to functions which take three arguments: +the first one is the I<initial> string form of the constant, the second one +is how Perl interprets this constant, the third one is how the constant is used. +Note that the initial string form does not +contain string delimiters, and has backslashes in backslash-delimiter +combinations stripped (thus the value of delimiter is not relevant for +processing of this string). The return value of this function is how this +constant is going to be interpreted by Perl. The third argument is undefined +unless for overloaded C<q>- and C<qr>- constants, it is C<q> in single-quote +context (comes from strings, regular expressions, and single-quote HERE +documents), it is C<tr> for arguments of C<tr>/C<y> operators, +it is C<s> for right-hand side of C<s>-operator, and it is C<qq> otherwise. + +Since an expression C<"ab$cd,,"> is just a shortcut for C<'ab' . $cd . ',,'>, +it is expected that overloaded constant strings are equipped with reasonable +overloaded catenation operator, otherwise absurd results will result. +Similarly, negative numbers are considered as negations of positive constants. + +Note that it is probably meaningless to call the functions overload::constant() +and overload::remove_constant() from anywhere but import() and unimport() methods. +From these methods they may be called as + + sub import { + shift; + return unless @_; + die "unknown import: @_" unless @_ == 1 and $_[0] eq ':constant'; + overload::constant integer => sub {Math::BigInt->new(shift)}; + } + +B<BUGS> Currently overloaded-ness of constants does not propagate +into C<eval '...'>. + +=head1 IMPLEMENTATION + +What follows is subject to change RSN. + +The table of methods for all operations is cached in magic for the +symbol table hash for the package. The cache is invalidated during +processing of C<use overload>, C<no overload>, new function +definitions, and changes in @ISA. However, this invalidation remains +unprocessed until the next C<bless>ing into the package. Hence if you +want to change overloading structure dynamically, you'll need an +additional (fake) C<bless>ing to update the table. + +(Every SVish thing has a magic queue, and magic is an entry in that +queue. This is how a single variable may participate in multiple +forms of magic simultaneously. For instance, environment variables +regularly have two forms at once: their %ENV magic and their taint +magic. However, the magic which implements overloading is applied to +the stashes, which are rarely used directly, thus should not slow down +Perl.) + +If an object belongs to a package using overload, it carries a special +flag. Thus the only speed penalty during arithmetic operations without +overloading is the checking of this flag. + +In fact, if C<use overload> is not present, there is almost no overhead +for overloadable operations, so most programs should not suffer +measurable performance penalties. A considerable effort was made to +minimize the overhead when overload is used in some package, but the +arguments in question do not belong to packages using overload. When +in doubt, test your speed with C<use overload> and without it. So far +there have been no reports of substantial speed degradation if Perl is +compiled with optimization turned on. + +There is no size penalty for data if overload is not used. The only +size penalty if overload is used in some package is that I<all> the +packages acquire a magic during the next C<bless>ing into the +package. This magic is three-words-long for packages without +overloading, and carries the cache table if the package is overloaded. + +Copying (C<$a=$b>) is shallow; however, a one-level-deep copying is +carried out before any operation that can imply an assignment to the +object $a (or $b) refers to, like C<$a++>. You can override this +behavior by defining your own copy constructor (see L<"Copy Constructor">). + +It is expected that arguments to methods that are not explicitly supposed +to be changed are constant (but this is not enforced). + +=head1 Metaphor clash + +One may wonder why the semantic of overloaded C<=> is so counter intuitive. +If it I<looks> counter intuitive to you, you are subject to a metaphor +clash. + +Here is a Perl object metaphor: + +I< object is a reference to blessed data> + +and an arithmetic metaphor: + +I< object is a thing by itself>. + +The I<main> problem of overloading C<=> is the fact that these metaphors +imply different actions on the assignment C<$a = $b> if $a and $b are +objects. Perl-think implies that $a becomes a reference to whatever +$b was referencing. Arithmetic-think implies that the value of "object" +$a is changed to become the value of the object $b, preserving the fact +that $a and $b are separate entities. + +The difference is not relevant in the absence of mutators. After +a Perl-way assignment an operation which mutates the data referenced by $a +would change the data referenced by $b too. Effectively, after +C<$a = $b> values of $a and $b become I<indistinguishable>. + +On the other hand, anyone who has used algebraic notation knows the +expressive power of the arithmetic metaphor. Overloading works hard +to enable this metaphor while preserving the Perlian way as far as +possible. Since it is not possible to freely mix two contradicting +metaphors, overloading allows the arithmetic way to write things I<as +far as all the mutators are called via overloaded access only>. The +way it is done is described in L<Copy Constructor>. + +If some mutator methods are directly applied to the overloaded values, +one may need to I<explicitly unlink> other values which references the +same value: + + $a = new Data 23; + ... + $b = $a; # $b is "linked" to $a + ... + $a = $a->clone; # Unlink $b from $a + $a->increment_by(4); + +Note that overloaded access makes this transparent: + + $a = new Data 23; + $b = $a; # $b is "linked" to $a + $a += 4; # would unlink $b automagically + +However, it would not make + + $a = new Data 23; + $a = 4; # Now $a is a plain 4, not 'Data' + +preserve "objectness" of $a. But Perl I<has> a way to make assignments +to an object do whatever you want. It is just not the overload, but +tie()ing interface (see L<perlfunc/tie>). Adding a FETCH() method +which returns the object itself, and STORE() method which changes the +value of the object, one can reproduce the arithmetic metaphor in its +completeness, at least for variables which were tie()d from the start. + +(Note that a workaround for a bug may be needed, see L<"BUGS">.) + +=head1 Cookbook + +Please add examples to what follows! + +=head2 Two-face scalars + +Put this in F<two_face.pm> in your Perl library directory: + + package two_face; # Scalars with separate string and + # numeric values. + sub new { my $p = shift; bless [@_], $p } + use overload '""' => \&str, '0+' => \&num, fallback => 1; + sub num {shift->[1]} + sub str {shift->[0]} + +Use it as follows: + + require two_face; + my $seven = new two_face ("vii", 7); + printf "seven=$seven, seven=%d, eight=%d\n", $seven, $seven+1; + print "seven contains `i'\n" if $seven =~ /i/; + +(The second line creates a scalar which has both a string value, and a +numeric value.) This prints: + + seven=vii, seven=7, eight=8 + seven contains `i' + +=head2 Two-face references + +Suppose you want to create an object which is accessible as both an +array reference and a hash reference, similar to the +L<pseudo-hash|perlref/"Pseudo-hashes: Using an array as a hash"> +builtin Perl type. Let's make it better than a pseudo-hash by +allowing index 0 to be treated as a normal element. + + package two_refs; + use overload '%{}' => \&gethash, '@{}' => sub { $ {shift()} }; + sub new { + my $p = shift; + bless \ [@_], $p; + } + sub gethash { + my %h; + my $self = shift; + tie %h, ref $self, $self; + \%h; + } + + sub TIEHASH { my $p = shift; bless \ shift, $p } + my %fields; + my $i = 0; + $fields{$_} = $i++ foreach qw{zero one two three}; + sub STORE { + my $self = ${shift()}; + my $key = $fields{shift()}; + defined $key or die "Out of band access"; + $$self->[$key] = shift; + } + sub FETCH { + my $self = ${shift()}; + my $key = $fields{shift()}; + defined $key or die "Out of band access"; + $$self->[$key]; + } + +Now one can access an object using both the array and hash syntax: + + my $bar = new two_refs 3,4,5,6; + $bar->[2] = 11; + $bar->{two} == 11 or die 'bad hash fetch'; + +Note several important features of this example. First of all, the +I<actual> type of $bar is a scalar reference, and we do not overload +the scalar dereference. Thus we can get the I<actual> non-overloaded +contents of $bar by just using C<$$bar> (what we do in functions which +overload dereference). Similarly, the object returned by the +TIEHASH() method is a scalar reference. + +Second, we create a new tied hash each time the hash syntax is used. +This allows us not to worry about a possibility of a reference loop, +which would lead to a memory leak. + +Both these problems can be cured. Say, if we want to overload hash +dereference on a reference to an object which is I<implemented> as a +hash itself, the only problem one has to circumvent is how to access +this I<actual> hash (as opposed to the I<virtual> hash exhibited by the +overloaded dereference operator). Here is one possible fetching routine: + + sub access_hash { + my ($self, $key) = (shift, shift); + my $class = ref $self; + bless $self, 'overload::dummy'; # Disable overloading of %{} + my $out = $self->{$key}; + bless $self, $class; # Restore overloading + $out; + } + +To remove creation of the tied hash on each access, one may an extra +level of indirection which allows a non-circular structure of references: + + package two_refs1; + use overload '%{}' => sub { ${shift()}->[1] }, + '@{}' => sub { ${shift()}->[0] }; + sub new { + my $p = shift; + my $a = [@_]; + my %h; + tie %h, $p, $a; + bless \ [$a, \%h], $p; + } + sub gethash { + my %h; + my $self = shift; + tie %h, ref $self, $self; + \%h; + } + + sub TIEHASH { my $p = shift; bless \ shift, $p } + my %fields; + my $i = 0; + $fields{$_} = $i++ foreach qw{zero one two three}; + sub STORE { + my $a = ${shift()}; + my $key = $fields{shift()}; + defined $key or die "Out of band access"; + $a->[$key] = shift; + } + sub FETCH { + my $a = ${shift()}; + my $key = $fields{shift()}; + defined $key or die "Out of band access"; + $a->[$key]; + } + +Now if $baz is overloaded like this, then C<$baz> is a reference to a +reference to the intermediate array, which keeps a reference to an +actual array, and the access hash. The tie()ing object for the access +hash is a reference to a reference to the actual array, so + +=over + +=item * + +There are no loops of references. + +=item * + +Both "objects" which are blessed into the class C<two_refs1> are +references to a reference to an array, thus references to a I<scalar>. +Thus the accessor expression C<$$foo-E<gt>[$ind]> involves no +overloaded operations. + +=back + +=head2 Symbolic calculator + +Put this in F<symbolic.pm> in your Perl library directory: + + package symbolic; # Primitive symbolic calculator + use overload nomethod => \&wrap; + + sub new { shift; bless ['n', @_] } + sub wrap { + my ($obj, $other, $inv, $meth) = @_; + ($obj, $other) = ($other, $obj) if $inv; + bless [$meth, $obj, $other]; + } + +This module is very unusual as overloaded modules go: it does not +provide any usual overloaded operators, instead it provides the L<Last +Resort> operator C<nomethod>. In this example the corresponding +subroutine returns an object which encapsulates operations done over +the objects: C<new symbolic 3> contains C<['n', 3]>, C<2 + new +symbolic 3> contains C<['+', 2, ['n', 3]]>. + +Here is an example of the script which "calculates" the side of +circumscribed octagon using the above package: + + require symbolic; + my $iter = 1; # 2**($iter+2) = 8 + my $side = new symbolic 1; + my $cnt = $iter; + + while ($cnt--) { + $side = (sqrt(1 + $side**2) - 1)/$side; + } + print "OK\n"; + +The value of $side is + + ['/', ['-', ['sqrt', ['+', 1, ['**', ['n', 1], 2]], + undef], 1], ['n', 1]] + +Note that while we obtained this value using a nice little script, +there is no simple way to I<use> this value. In fact this value may +be inspected in debugger (see L<perldebug>), but ony if +C<bareStringify> B<O>ption is set, and not via C<p> command. + +If one attempts to print this value, then the overloaded operator +C<""> will be called, which will call C<nomethod> operator. The +result of this operator will be stringified again, but this result is +again of type C<symbolic>, which will lead to an infinite loop. + +Add a pretty-printer method to the module F<symbolic.pm>: + + sub pretty { + my ($meth, $a, $b) = @{+shift}; + $a = 'u' unless defined $a; + $b = 'u' unless defined $b; + $a = $a->pretty if ref $a; + $b = $b->pretty if ref $b; + "[$meth $a $b]"; + } + +Now one can finish the script by + + print "side = ", $side->pretty, "\n"; + +The method C<pretty> is doing object-to-string conversion, so it +is natural to overload the operator C<""> using this method. However, +inside such a method it is not necessary to pretty-print the +I<components> $a and $b of an object. In the above subroutine +C<"[$meth $a $b]"> is a catenation of some strings and components $a +and $b. If these components use overloading, the catenation operator +will look for an overloaded operator C<.>; if not present, it will +look for an overloaded operator C<"">. Thus it is enough to use + + use overload nomethod => \&wrap, '""' => \&str; + sub str { + my ($meth, $a, $b) = @{+shift}; + $a = 'u' unless defined $a; + $b = 'u' unless defined $b; + "[$meth $a $b]"; + } + +Now one can change the last line of the script to + + print "side = $side\n"; + +which outputs + + side = [/ [- [sqrt [+ 1 [** [n 1 u] 2]] u] 1] [n 1 u]] + +and one can inspect the value in debugger using all the possible +methods. + +Something is still amiss: consider the loop variable $cnt of the +script. It was a number, not an object. We cannot make this value of +type C<symbolic>, since then the loop will not terminate. + +Indeed, to terminate the cycle, the $cnt should become false. +However, the operator C<bool> for checking falsity is overloaded (this +time via overloaded C<"">), and returns a long string, thus any object +of type C<symbolic> is true. To overcome this, we need a way to +compare an object to 0. In fact, it is easier to write a numeric +conversion routine. + +Here is the text of F<symbolic.pm> with such a routine added (and +slightly modified str()): + + package symbolic; # Primitive symbolic calculator + use overload + nomethod => \&wrap, '""' => \&str, '0+' => \# + + sub new { shift; bless ['n', @_] } + sub wrap { + my ($obj, $other, $inv, $meth) = @_; + ($obj, $other) = ($other, $obj) if $inv; + bless [$meth, $obj, $other]; + } + sub str { + my ($meth, $a, $b) = @{+shift}; + $a = 'u' unless defined $a; + if (defined $b) { + "[$meth $a $b]"; + } else { + "[$meth $a]"; + } + } + my %subr = ( n => sub {$_[0]}, + sqrt => sub {sqrt $_[0]}, + '-' => sub {shift() - shift()}, + '+' => sub {shift() + shift()}, + '/' => sub {shift() / shift()}, + '*' => sub {shift() * shift()}, + '**' => sub {shift() ** shift()}, + ); + sub num { + my ($meth, $a, $b) = @{+shift}; + my $subr = $subr{$meth} + or die "Do not know how to ($meth) in symbolic"; + $a = $a->num if ref $a eq __PACKAGE__; + $b = $b->num if ref $b eq __PACKAGE__; + $subr->($a,$b); + } + +All the work of numeric conversion is done in %subr and num(). Of +course, %subr is not complete, it contains only operators used in the +example below. Here is the extra-credit question: why do we need an +explicit recursion in num()? (Answer is at the end of this section.) + +Use this module like this: + + require symbolic; + my $iter = new symbolic 2; # 16-gon + my $side = new symbolic 1; + my $cnt = $iter; + + while ($cnt) { + $cnt = $cnt - 1; # Mutator `--' not implemented + $side = (sqrt(1 + $side**2) - 1)/$side; + } + printf "%s=%f\n", $side, $side; + printf "pi=%f\n", $side*(2**($iter+2)); + +It prints (without so many line breaks) + + [/ [- [sqrt [+ 1 [** [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1] + [n 1]] 2]]] 1] + [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1] [n 1]]]=0.198912 + pi=3.182598 + +The above module is very primitive. It does not implement +mutator methods (C<++>, C<-=> and so on), does not do deep copying +(not required without mutators!), and implements only those arithmetic +operations which are used in the example. + +To implement most arithmetic operations is easy; one should just use +the tables of operations, and change the code which fills %subr to + + my %subr = ( 'n' => sub {$_[0]} ); + foreach my $op (split " ", $overload::ops{with_assign}) { + $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}"; + } + my @bins = qw(binary 3way_comparison num_comparison str_comparison); + foreach my $op (split " ", "@overload::ops{ @bins }") { + $subr{$op} = eval "sub {shift() $op shift()}"; + } + foreach my $op (split " ", "@overload::ops{qw(unary func)}") { + print "defining `$op'\n"; + $subr{$op} = eval "sub {$op shift()}"; + } + +Due to L<Calling Conventions for Mutators>, we do not need anything +special to make C<+=> and friends work, except filling C<+=> entry of +%subr, and defining a copy constructor (needed since Perl has no +way to know that the implementation of C<'+='> does not mutate +the argument, compare L<Copy Constructor>). + +To implement a copy constructor, add C<< '=' => \&cpy >> to C<use overload> +line, and code (this code assumes that mutators change things one level +deep only, so recursive copying is not needed): + + sub cpy { + my $self = shift; + bless [@$self], ref $self; + } + +To make C<++> and C<--> work, we need to implement actual mutators, +either directly, or in C<nomethod>. We continue to do things inside +C<nomethod>, thus add + + if ($meth eq '++' or $meth eq '--') { + @$obj = ($meth, (bless [@$obj]), 1); # Avoid circular reference + return $obj; + } + +after the first line of wrap(). This is not a most effective +implementation, one may consider + + sub inc { $_[0] = bless ['++', shift, 1]; } + +instead. + +As a final remark, note that one can fill %subr by + + my %subr = ( 'n' => sub {$_[0]} ); + foreach my $op (split " ", $overload::ops{with_assign}) { + $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}"; + } + my @bins = qw(binary 3way_comparison num_comparison str_comparison); + foreach my $op (split " ", "@overload::ops{ @bins }") { + $subr{$op} = eval "sub {shift() $op shift()}"; + } + foreach my $op (split " ", "@overload::ops{qw(unary func)}") { + $subr{$op} = eval "sub {$op shift()}"; + } + $subr{'++'} = $subr{'+'}; + $subr{'--'} = $subr{'-'}; + +This finishes implementation of a primitive symbolic calculator in +50 lines of Perl code. Since the numeric values of subexpressions +are not cached, the calculator is very slow. + +Here is the answer for the exercise: In the case of str(), we need no +explicit recursion since the overloaded C<.>-operator will fall back +to an existing overloaded operator C<"">. Overloaded arithmetic +operators I<do not> fall back to numeric conversion if C<fallback> is +not explicitly requested. Thus without an explicit recursion num() +would convert C<['+', $a, $b]> to C<$a + $b>, which would just rebuild +the argument of num(). + +If you wonder why defaults for conversion are different for str() and +num(), note how easy it was to write the symbolic calculator. This +simplicity is due to an appropriate choice of defaults. One extra +note: due to the explicit recursion num() is more fragile than sym(): +we need to explicitly check for the type of $a and $b. If components +$a and $b happen to be of some related type, this may lead to problems. + +=head2 I<Really> symbolic calculator + +One may wonder why we call the above calculator symbolic. The reason +is that the actual calculation of the value of expression is postponed +until the value is I<used>. + +To see it in action, add a method + + sub STORE { + my $obj = shift; + $#$obj = 1; + @$obj->[0,1] = ('=', shift); + } + +to the package C<symbolic>. After this change one can do + + my $a = new symbolic 3; + my $b = new symbolic 4; + my $c = sqrt($a**2 + $b**2); + +and the numeric value of $c becomes 5. However, after calling + + $a->STORE(12); $b->STORE(5); + +the numeric value of $c becomes 13. There is no doubt now that the module +symbolic provides a I<symbolic> calculator indeed. + +To hide the rough edges under the hood, provide a tie()d interface to the +package C<symbolic> (compare with L<Metaphor clash>). Add methods + + sub TIESCALAR { my $pack = shift; $pack->new(@_) } + sub FETCH { shift } + sub nop { } # Around a bug + +(the bug is described in L<"BUGS">). One can use this new interface as + + tie $a, 'symbolic', 3; + tie $b, 'symbolic', 4; + $a->nop; $b->nop; # Around a bug + + my $c = sqrt($a**2 + $b**2); + +Now numeric value of $c is 5. After C<$a = 12; $b = 5> the numeric value +of $c becomes 13. To insulate the user of the module add a method + + sub vars { my $p = shift; tie($_, $p), $_->nop foreach @_; } + +Now + + my ($a, $b); + symbolic->vars($a, $b); + my $c = sqrt($a**2 + $b**2); + + $a = 3; $b = 4; + printf "c5 %s=%f\n", $c, $c; + + $a = 12; $b = 5; + printf "c13 %s=%f\n", $c, $c; + +shows that the numeric value of $c follows changes to the values of $a +and $b. + +=head1 AUTHOR + +Ilya Zakharevich E<lt>F<ilya@math.mps.ohio-state.edu>E<gt>. + +=head1 DIAGNOSTICS + +When Perl is run with the B<-Do> switch or its equivalent, overloading +induces diagnostic messages. + +Using the C<m> command of Perl debugger (see L<perldebug>) one can +deduce which operations are overloaded (and which ancestor triggers +this overloading). Say, if C<eq> is overloaded, then the method C<(eq> +is shown by debugger. The method C<()> corresponds to the C<fallback> +key (in fact a presence of this method shows that this package has +overloading enabled, and it is what is used by the C<Overloaded> +function of module C<overload>). + +The module might issue the following warnings: + +=over 4 + +=item Odd number of arguments for overload::constant + +(W) The call to overload::constant contained an odd number of arguments. +The arguments should come in pairs. + +=item `%s' is not an overloadable type + +(W) You tried to overload a constant type the overload package is unaware of. + +=item `%s' is not a code reference + +(W) The second (fourth, sixth, ...) argument of overload::constant needs +to be a code reference. Either an anonymous subroutine, or a reference +to a subroutine. + +=back + +=head1 BUGS + +Because it is used for overloading, the per-package hash %OVERLOAD now +has a special meaning in Perl. The symbol table is filled with names +looking like line-noise. + +For the purpose of inheritance every overloaded package behaves as if +C<fallback> is present (possibly undefined). This may create +interesting effects if some package is not overloaded, but inherits +from two overloaded packages. + +Relation between overloading and tie()ing is broken. Overloading is +triggered or not basing on the I<previous> class of tie()d value. + +This happens because the presence of overloading is checked too early, +before any tie()d access is attempted. If the FETCH()ed class of the +tie()d value does not change, a simple workaround is to access the value +immediately after tie()ing, so that after this call the I<previous> class +coincides with the current one. + +B<Needed:> a way to fix this without a speed penalty. + +Barewords are not covered by overloaded string constants. + +This document is confusing. There are grammos and misleading language +used in places. It would seem a total rewrite is needed. + +=cut + diff --git a/Master/tlpkg/tlperl.old/lib/re.pm b/Master/tlpkg/tlperl.old/lib/re.pm new file mode 100644 index 00000000000..6e9d1218ef0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/re.pm @@ -0,0 +1,134 @@ +package re; + +our $VERSION = 0.05; + +=head1 NAME + +re - Perl pragma to alter regular expression behaviour + +=head1 SYNOPSIS + + use re 'taint'; + ($x) = ($^X =~ /^(.*)$/s); # $x is tainted here + + $pat = '(?{ $foo = 1 })'; + use re 'eval'; + /foo${pat}bar/; # won't fail (when not under -T switch) + + { + no re 'taint'; # the default + ($x) = ($^X =~ /^(.*)$/s); # $x is not tainted here + + no re 'eval'; # the default + /foo${pat}bar/; # disallowed (with or without -T switch) + } + + use re 'debug'; # NOT lexically scoped (as others are) + /^(.*)$/s; # output debugging info during + # compile and run time + + use re 'debugcolor'; # same as 'debug', but with colored output + ... + +(We use $^X in these examples because it's tainted by default.) + +=head1 DESCRIPTION + +When C<use re 'taint'> is in effect, and a tainted string is the target +of a regex, the regex memories (or values returned by the m// operator +in list context) are tainted. This feature is useful when regex operations +on tainted data aren't meant to extract safe substrings, but to perform +other transformations. + +When C<use re 'eval'> is in effect, a regex is allowed to contain +C<(?{ ... })> zero-width assertions even if regular expression contains +variable interpolation. That is normally disallowed, since it is a +potential security risk. Note that this pragma is ignored when the regular +expression is obtained from tainted data, i.e. evaluation is always +disallowed with tainted regular expressions. See L<perlre/(?{ code })>. + +For the purpose of this pragma, interpolation of precompiled regular +expressions (i.e., the result of C<qr//>) is I<not> considered variable +interpolation. Thus: + + /foo${pat}bar/ + +I<is> allowed if $pat is a precompiled regular expression, even +if $pat contains C<(?{ ... })> assertions. + +When C<use re 'debug'> is in effect, perl emits debugging messages when +compiling and using regular expressions. The output is the same as that +obtained by running a C<-DDEBUGGING>-enabled perl interpreter with the +B<-Dr> switch. It may be quite voluminous depending on the complexity +of the match. Using C<debugcolor> instead of C<debug> enables a +form of output that can be used to get a colorful display on terminals +that understand termcap color sequences. Set C<$ENV{PERL_RE_TC}> to a +comma-separated list of C<termcap> properties to use for highlighting +strings on/off, pre-point part on/off. +See L<perldebug/"Debugging regular expressions"> for additional info. + +The directive C<use re 'debug'> is I<not lexically scoped>, as the +other directives are. It has both compile-time and run-time effects. + +See L<perlmodlib/Pragmatic Modules>. + +=cut + +# N.B. File::Basename contains a literal for 'taint' as a fallback. If +# taint is changed here, File::Basename must be updated as well. +my %bitmask = ( +taint => 0x00100000, # HINT_RE_TAINT +eval => 0x00200000, # HINT_RE_EVAL +); + +sub setcolor { + eval { # Ignore errors + require Term::Cap; + + my $terminal = Tgetent Term::Cap ({OSPEED => 9600}); # Avoid warning. + my $props = $ENV{PERL_RE_TC} || 'md,me,so,se,us,ue'; + my @props = split /,/, $props; + my $colors = join "\t", map {$terminal->Tputs($_,1)} @props; + + $colors =~ s/\0//g; + $ENV{PERL_RE_COLORS} = $colors; + }; +} + +sub bits { + my $on = shift; + my $bits = 0; + unless (@_) { + require Carp; + Carp::carp("Useless use of \"re\" pragma"); + } + foreach my $s (@_){ + if ($s eq 'debug' or $s eq 'debugcolor') { + setcolor() if $s eq 'debugcolor'; + require XSLoader; + XSLoader::load('re'); + install() if $on; + uninstall() unless $on; + next; + } + if (exists $bitmask{$s}) { + $bits |= $bitmask{$s}; + } else { + require Carp; + Carp::carp("Unknown \"re\" subpragma '$s' (known ones are: @{[join(', ', map {qq('$_')} 'debug', 'debugcolor', sort keys %bitmask)]})"); + } + } + $bits; +} + +sub import { + shift; + $^H |= bits(1, @_); +} + +sub unimport { + shift; + $^H &= ~ bits(0, @_); +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/strict.pm b/Master/tlpkg/tlperl.old/lib/strict.pm new file mode 100644 index 00000000000..d14391add44 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/strict.pm @@ -0,0 +1,136 @@ +package strict; + +$strict::VERSION = "1.03"; + +my %bitmask = ( +refs => 0x00000002, +subs => 0x00000200, +vars => 0x00000400 +); + +sub bits { + my $bits = 0; + my @wrong; + foreach my $s (@_) { + push @wrong, $s unless exists $bitmask{$s}; + $bits |= $bitmask{$s} || 0; + } + if (@wrong) { + require Carp; + Carp::croak("Unknown 'strict' tag(s) '@wrong'"); + } + $bits; +} + +my $default_bits = bits(qw(refs subs vars)); + +sub import { + shift; + $^H |= @_ ? bits(@_) : $default_bits; +} + +sub unimport { + shift; + $^H &= ~ (@_ ? bits(@_) : $default_bits); +} + +1; +__END__ + +=head1 NAME + +strict - Perl pragma to restrict unsafe constructs + +=head1 SYNOPSIS + + use strict; + + use strict "vars"; + use strict "refs"; + use strict "subs"; + + use strict; + no strict "vars"; + +=head1 DESCRIPTION + +If no import list is supplied, all possible restrictions are assumed. +(This is the safest mode to operate in, but is sometimes too strict for +casual programming.) Currently, there are three possible things to be +strict about: "subs", "vars", and "refs". + +=over 6 + +=item C<strict refs> + +This generates a runtime error if you +use symbolic references (see L<perlref>). + + use strict 'refs'; + $ref = \$foo; + print $$ref; # ok + $ref = "foo"; + print $$ref; # runtime error; normally ok + $file = "STDOUT"; + print $file "Hi!"; # error; note: no comma after $file + +There is one exception to this rule: + + $bar = \&{'foo'}; + &$bar; + +is allowed so that C<goto &$AUTOLOAD> would not break under stricture. + + +=item C<strict vars> + +This generates a compile-time error if you access a variable that wasn't +declared via C<our> or C<use vars>, +localized via C<my()>, or wasn't fully qualified. Because this is to avoid +variable suicide problems and subtle dynamic scoping issues, a merely +local() variable isn't good enough. See L<perlfunc/my> and +L<perlfunc/local>. + + use strict 'vars'; + $X::foo = 1; # ok, fully qualified + my $foo = 10; # ok, my() var + local $foo = 9; # blows up + + package Cinna; + our $bar; # Declares $bar in current package + $bar = 'HgS'; # ok, global declared via pragma + +The local() generated a compile-time error because you just touched a global +name without fully qualifying it. + +Because of their special use by sort(), the variables $a and $b are +exempted from this check. + +=item C<strict subs> + +This disables the poetry optimization, generating a compile-time error if +you try to use a bareword identifier that's not a subroutine, unless it +is a simple identifier (no colons) and that it appears in curly braces or +on the left hand side of the C<< => >> symbol. + + use strict 'subs'; + $SIG{PIPE} = Plumber; # blows up + $SIG{PIPE} = "Plumber"; # just fine: quoted string is always ok + $SIG{PIPE} = \&Plumber; # preferred form + +=back + +See L<perlmodlib/Pragmatic Modules>. + +=head1 HISTORY + +C<strict 'subs'>, with Perl 5.6.1, erroneously permitted to use an unquoted +compound identifier (e.g. C<Foo::Bar>) as a hash key (before C<< => >> or +inside curlies), but without forcing it always to a literal string. + +Starting with Perl 5.8.1 strict is strict about its restrictions: +if unknown restrictions are used, the strict pragma will abort with + + Unknown 'strict' tag(s) '...' + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/subs.pm b/Master/tlpkg/tlperl.old/lib/subs.pm new file mode 100644 index 00000000000..e5a9aa8827d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/subs.pm @@ -0,0 +1,40 @@ +package subs; + +our $VERSION = '1.00'; + +=head1 NAME + +subs - Perl pragma to predeclare sub names + +=head1 SYNOPSIS + + use subs qw(frob); + frob 3..10; + +=head1 DESCRIPTION + +This will predeclare all the subroutine whose names are +in the list, allowing you to use them without parentheses +even before they're declared. + +Unlike pragmas that affect the C<$^H> hints variable, the C<use vars> and +C<use subs> declarations are not BLOCK-scoped. They are thus effective +for the entire file in which they appear. You may not rescind such +declarations with C<no vars> or C<no subs>. + +See L<perlmodlib/Pragmatic Modules> and L<strict/strict subs>. + +=cut + +require 5.000; + +sub import { + my $callpack = caller; + my $pack = shift; + my @imports = @_; + foreach $sym (@imports) { + *{"${callpack}::$sym"} = \&{"${callpack}::$sym"}; + } +}; + +1; diff --git a/Master/tlpkg/tlperl.old/lib/unicore/ArabicShaping.txt b/Master/tlpkg/tlperl.old/lib/unicore/ArabicShaping.txt new file mode 100644 index 00000000000..ec2e0241012 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/ArabicShaping.txt @@ -0,0 +1,299 @@ +# ArabicShaping-4.1.0.txt +# Date: 2005-03-17, 15:21:00 PST [KW] +# +# This file is a normative contributory data file in the +# Unicode Character Database. +# +# Copyright (c) 1991-2005 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# This file defines the shaping classes for Arabic and Syriac +# positional shaping, repeating in machine readable form the +# information printed in Tables 8-3, 8-7, 8-8, 8-11, 8-12, and +# 8-13 of The Unicode Standard, Version 4.0. +# +# See sections 8.2 and 8.3 of The Unicode Standard, Version 4.0 +# for more information. +# +# Each line contains four fields, separated by a semicolon. +# +# Field 0: the code point, in 4-digit hexadecimal +# form, of an Arabic or Syriac character. +# Field 1: gives a short schematic name for that character, +# abbreviated from the normative Unicode character name. +# Field 2: defines the joining type (property name: Joining_Type) +# R Right_Joining +# L Left_Joining +# D Dual_Joining +# C Join_Causing +# U Non_Joining +# T Transparent +# See the Arabic block description for more information on these types. +# Field 3: defines the joining group (property name: Joining_Group) +# +# The values of the joining group are based schematically on character +# names. Where a schematic character name consists of two or more parts separated +# by spaces, the formal Joining_Group property value, as specified in +# PropertyValueAliases.txt, consists of the same name parts joined by +# underscores. Hence, the entry: +# +# 0629; TEH MARBUTA; R; TEH MARBUTA +# +# corresponds to [Joining_Group = Teh_Marbuta]. +# +# Note: For historical reasons, the property value [Joining_Group = Hamza_On_Heh_Goal] +# is anachronistically named. It used to apply to both of the following characters +# in earlier versions of the standard: +# +# U+06C2 ARABIC LETTER HEH GOAL WITH HAMZA ABOVE +# U+06C3 ARABIC LETTER TEH MARBUTA GOAL +# +# However, it currently applies only to U+06C3, and *not* to U+06C2. +# To avoid destabilizing existing Joining_Group property aliases, the +# value Hamza_On_Heh_Goal has not been changed, despite the fact that it +# no longer applies to Hamza On Heh Goal, but only to Teh Marbuta Goal. +# +# Note: Code points that are not explicitly listed in this file are +# either of joining type T or U: +# +# - Those that not explicitly listed that are of General Category Mn, Me, or Cf +# have joining type T. +# - All others not explicitly listed have type U. +# +# For an explicit listing of characters of joining type T, see +# the derived property file DerivedJoiningType.txt. +# +# There are currently no characters of type L defined in Unicode. +# +# ############################################################# + +# Unicode; Schematic Name; Joining Type; Joining Group + +# Arabic characters + +0600; ARABIC NUMBER SIGN; U; No_Joining_Group +0601; ARABIC SIGN SANAH; U; No_Joining_Group +0602; ARABIC FOOTNOTE MARKER; U; No_Joining_Group +0603; ARABIC SIGN SAFHA; U; No_Joining_Group +060B; AFGHANI SIGN; U; No_Joining_Group +0621; HAMZA; U; No_Joining_Group +0622; MADDA ON ALEF; R; ALEF +0623; HAMZA ON ALEF; R; ALEF +0624; HAMZA ON WAW; R; WAW +0625; HAMZA UNDER ALEF; R; ALEF +0626; HAMZA ON YEH; D; YEH +0627; ALEF; R; ALEF +0628; BEH; D; BEH +0629; TEH MARBUTA; R; TEH MARBUTA +062A; TEH; D; BEH +062B; THEH; D; BEH +062C; JEEM; D; HAH +062D; HAH; D; HAH +062E; KHAH; D; HAH +062F; DAL; R; DAL +0630; THAL; R; DAL +0631; REH; R; REH +0632; ZAIN; R; REH +0633; SEEN; D; SEEN +0634; SHEEN; D; SEEN +0635; SAD; D; SAD +0636; DAD; D; SAD +0637; TAH; D; TAH +0638; ZAH; D; TAH +0639; AIN; D; AIN +063A; GHAIN; D; AIN +0640; TATWEEL; C; No_Joining_Group +0641; FEH; D; FEH +0642; QAF; D; QAF +0643; KAF; D; KAF +0644; LAM; D; LAM +0645; MEEM; D; MEEM +0646; NOON; D; NOON +0647; HEH; D; HEH +0648; WAW; R; WAW +0649; ALEF MAKSURA; D; YEH +064A; YEH; D; YEH +066E; DOTLESS BEH; D; BEH +066F; DOTLESS QAF; D; QAF +0671; HAMZAT WASL ON ALEF; R; ALEF +0672; WAVY HAMZA ON ALEF; R; ALEF +0673; WAVY HAMZA UNDER ALEF; R; ALEF +0674; HIGH HAMZA; U; No_Joining_Group +0675; HIGH HAMZA ALEF; R; ALEF +0676; HIGH HAMZA WAW; R; WAW +0677; HIGH HAMZA WAW WITH DAMMA; R; WAW +0678; HIGH HAMZA YEH; D; YEH +0679; TEH WITH SMALL TAH; D; BEH +067A; TEH WITH 2 DOTS VERTICAL ABOVE; D; BEH +067B; BEH WITH 2 DOTS VERTICAL BELOW; D; BEH +067C; TEH WITH RING; D; BEH +067D; TEH WITH 3 DOTS ABOVE DOWNWARD; D; BEH +067E; TEH WITH 3 DOTS BELOW; D; BEH +067F; TEH WITH 4 DOTS ABOVE; D; BEH +0680; BEH WITH 4 DOTS BELOW; D; BEH +0681; HAMZA ON HAH; D; HAH +0682; HAH WITH 2 DOTS VERTICAL ABOVE; D; HAH +0683; HAH WITH MIDDLE 2 DOTS; D; HAH +0684; HAH WITH MIDDLE 2 DOTS VERTICAL; D; HAH +0685; HAH WITH 3 DOTS ABOVE; D; HAH +0686; HAH WITH MIDDLE 3 DOTS DOWNWARD; D; HAH +0687; HAH WITH MIDDLE 4 DOTS; D; HAH +0688; DAL WITH SMALL TAH; R; DAL +0689; DAL WITH RING; R; DAL +068A; DAL WITH DOT BELOW; R; DAL +068B; DAL WITH DOT BELOW AND SMALL TAH; R; DAL +068C; DAL WITH 2 DOTS ABOVE; R; DAL +068D; DAL WITH 2 DOTS BELOW; R; DAL +068E; DAL WITH 3 DOTS ABOVE; R; DAL +068F; DAL WITH 3 DOTS ABOVE DOWNWARD; R; DAL +0690; DAL WITH 4 DOTS ABOVE; R; DAL +0691; REH WITH SMALL TAH; R; REH +0692; REH WITH SMALL V; R; REH +0693; REH WITH RING; R; REH +0694; REH WITH DOT BELOW; R; REH +0695; REH WITH SMALL V BELOW; R; REH +0696; REH WITH DOT BELOW AND DOT ABOVE; R; REH +0697; REH WITH 2 DOTS ABOVE; R; REH +0698; REH WITH 3 DOTS ABOVE; R; REH +0699; REH WITH 4 DOTS ABOVE; R; REH +069A; SEEN WITH DOT BELOW AND DOT ABOVE; D; SEEN +069B; SEEN WITH 3 DOTS BELOW; D; SEEN +069C; SEEN WITH 3 DOTS BELOW AND 3 DOTS ABOVE; D; SEEN +069D; SAD WITH 2 DOTS BELOW; D; SAD +069E; SAD WITH 3 DOTS ABOVE; D; SAD +069F; TAH WITH 3 DOTS ABOVE; D; TAH +06A0; AIN WITH 3 DOTS ABOVE; D; AIN +06A1; DOTLESS FEH; D; FEH +06A2; FEH WITH DOT MOVED BELOW; D; FEH +06A3; FEH WITH DOT BELOW; D; FEH +06A4; FEH WITH 3 DOTS ABOVE; D; FEH +06A5; FEH WITH 3 DOTS BELOW; D; FEH +06A6; FEH WITH 4 DOTS ABOVE; D; FEH +06A7; QAF WITH DOT ABOVE; D; QAF +06A8; QAF WITH 3 DOTS ABOVE; D; QAF +06A9; KEHEH; D; GAF +06AA; SWASH KAF; D; SWASH KAF +06AB; KAF WITH RING; D; GAF +06AC; KAF WITH DOT ABOVE; D; KAF +06AD; KAF WITH 3 DOTS ABOVE; D; KAF +06AE; KAF WITH 3 DOTS BELOW; D; KAF +06AF; GAF; D; GAF +06B0; GAF WITH RING; D; GAF +06B1; GAF WITH 2 DOTS ABOVE; D; GAF +06B2; GAF WITH 2 DOTS BELOW; D; GAF +06B3; GAF WITH 2 DOTS VERTICAL BELOW; D; GAF +06B4; GAF WITH 3 DOTS ABOVE; D; GAF +06B5; LAM WITH SMALL V; D; LAM +06B6; LAM WITH DOT ABOVE; D; LAM +06B7; LAM WITH 3 DOTS ABOVE; D; LAM +06B8; LAM WITH 3 DOTS BELOW; D; LAM +06B9; NOON WITH DOT BELOW; D; NOON +06BA; DOTLESS NOON; D; NOON +06BB; DOTLESS NOON WITH SMALL TAH; D; NOON +06BC; NOON WITH RING; D; NOON +06BD; NOON WITH 3 DOTS ABOVE; D; NOON +06BE; KNOTTED HEH; D; KNOTTED HEH +06BF; HAH WITH MIDDLE 3 DOTS DOWNWARD AND DOT ABOVE; D; HAH +06C0; HAMZA ON HEH; R; TEH MARBUTA +06C1; HEH GOAL; D; HEH GOAL +06C2; HAMZA ON HEH GOAL; D; HEH GOAL +06C3; TEH MARBUTA GOAL; R; HAMZA ON HEH GOAL +06C4; WAW WITH RING; R; WAW +06C5; WAW WITH BAR; R; WAW +06C6; WAW WITH SMALL V; R; WAW +06C7; WAW WITH DAMMA; R; WAW +06C8; WAW WITH ALEF ABOVE; R; WAW +06C9; WAW WITH INVERTED SMALL V; R; WAW +06CA; WAW WITH 2 DOTS ABOVE; R; WAW +06CB; WAW WITH 3 DOTS ABOVE; R; WAW +06CC; DOTLESS YEH; D; YEH +06CD; YEH WITH TAIL; R; YEH WITH TAIL +06CE; YEH WITH SMALL V; D; YEH +06CF; WAW WITH DOT ABOVE; R; WAW +06D0; YEH WITH 2 DOTS VERTICAL BELOW; D; YEH +06D1; YEH WITH 3 DOTS BELOW; D; YEH +06D2; YEH BARREE; R; YEH BARREE +06D3; HAMZA ON YEH BARREE; R; YEH BARREE +06D5; AE; R; TEH MARBUTA +06DD; ARABIC END OF AYAH; U; No_Joining_Group +06EE; DAL WITH INVERTED V; R; DAL +06EF; REH WITH INVERTED V; R; REH +06FA; SEEN WITH DOT BELOW AND 3 DOTS ABOVE; D; SEEN +06FB; DAD WITH DOT BELOW; D; SAD +06FC; GHAIN WITH DOT BELOW; D; AIN +06FF; HEH WITH INVERTED V; D; KNOTTED HEH + +# Syriac characters + +0710; ALAPH; R; ALAPH +0712; BETH; D; BETH +0713; GAMAL; D; GAMAL +0714; GAMAL GARSHUNI; D; GAMAL +0715; DALATH; R; DALATH RISH +0716; DOTLESS DALATH RISH; R; DALATH RISH +0717; HE; R; HE +0718; WAW; R; SYRIAC WAW +0719; ZAIN; R; ZAIN +071A; HETH; D; HETH +071B; TETH; D; TETH +071C; TETH GARSHUNI; D; TETH +071D; YUDH; D; YUDH +071E; YUDH HE; R; YUDH HE +071F; KAPH; D; KAPH +0720; LAMADH; D; LAMADH +0721; MIM; D; MIM +0722; NUN; D; NUN +0723; SEMKATH; D; SEMKATH +0724; FINAL SEMKATH; D; FINAL SEMKATH +0725; E; D; E +0726; PE; D; PE +0727; REVERSED PE; D; REVERSED PE +0728; SADHE; R; SADHE +0729; QAPH; D; QAPH +072A; RISH; R; DALATH RISH +072B; SHIN; D; SHIN +072C; TAW; R; TAW +072D; PERSIAN BHETH; D; BETH +072E; PERSIAN GHAMAL; D; GAMAL +072F; PERSIAN DHALATH; R; DALATH RISH +074D; SOGDIAN ZHAIN; R; ZHAIN +074E; SOGDIAN KHAPH; D; KHAPH +074F; SOGDIAN FE; D; FE + +# Arabic supplement characters + +0750; BEH WITH 3 DOTS HORIZONTALLY BELOW; D; BEH +0751; BEH WITH DOT BELOW AND 3 DOTS ABOVE; D; BEH +0752; BEH WITH 3 DOTS POINTING UPWARDS BELOW; D; BEH +0753; BEH WITH 3 DOTS POINTING UPWARDS BELOW AND 2 DOTS ABOVE; D; BEH +0754; BEH WITH 2 DOTS BELOW AND DOT ABOVE; D; BEH +0755; BEH WITH INVERTED SMALL V BELOW; D; BEH +0756; BEH WITH SMALL V; D; BEH +0757; HAH WITH 2 DOTS ABOVE; D; HAH +0758; HAH WITH 3 DOTS POINTING UPWARDS BELOW; D; HAH +0759; DAL WITH 2 DOTS VERTICALLY BELOW AND SMALL TAH; R; DAL +075A; DAL WITH INVERTED SMALL V BELOW; R; DAL +075B; REH WITH STROKE; R; REH +075C; SEEN WITH 4 DOTS ABOVE; D; SEEN +075D; AIN WITH 2 DOTS ABOVE; D; AIN +075E; AIN WITH 3 DOTS POINTING DOWNWARDS ABOVE; D; AIN +075F; AIN WITH 2 DOTS VERTICALLY ABOVE; D; AIN +0760; FEH WITH 2 DOTS BELOW; D; FEH +0761; FEH WITH 3 DOTS POINTING UPWARDS BELOW; D; FEH +0762; KEHEH WITH DOT ABOVE; D; GAF +0763; KEHEH WITH 3 DOTS ABOVE; D; GAF +0764; KEHEH WITH 3 DOTS POINTING UPWARDS BELOW; D; GAF +0765; MEEM WITH DOT ABOVE; D; MEEM +0766; MEEM WITH DOT BELOW; D; MEEM +0767; NOON WITH 2 DOTS BELOW; D; NOON +0768; NOON WITH SMALL TAH; D; NOON +0769; NOON WITH SMALL V; D; NOON +076A; LAM WITH BAR; D; LAM +076B; REH WITH 2 DOTS VERTICALLY ABOVE; R; REH +076C; REH WITH HAMZA ABOVE; R; REH +076D; SEEN WITH 2 DOTS VERTICALLY ABOVE; D; SEEN + +# Other + +200D; ZERO WIDTH JOINER; C; No_Joining_Group +200C; ZERO WIDTH NON-JOINER; U; No_Joining_Group diff --git a/Master/tlpkg/tlperl.old/lib/unicore/BidiMirroring.txt b/Master/tlpkg/tlperl.old/lib/unicore/BidiMirroring.txt new file mode 100644 index 00000000000..45167fbb99c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/BidiMirroring.txt @@ -0,0 +1,550 @@ +# BidiMirroring-4.1.0.txt +# Date: 2005-03-17, 15:21:00 PST [KW] +# +# Bidi_Mirroring_Glyph Property +# +# This file is an informative contributory data file in the +# Unicode Character Database. +# +# Copyright (c) 1991-2005 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# This data file lists characters that have the mirrored property +# where there is another Unicode character that typically has a glyph +# that is the mirror image of the original character's glyph. +# The repertoire covered by the file is Unicode 4.1.0. +# +# The file contains a list of lines with mappings from one code point +# to another one for character-based mirroring. +# Note that for "real" mirroring, a rendering engine needs to select +# appropriate alternative glyphs, and that many Unicode characters do not +# have a mirror-image Unicode character. +# +# Each mapping line contains two fields, separated by a semicolon (';'). +# Each of the two fields contains a code point represented as a +# variable-length hexadecimal value with 4 to 6 digits. +# A comment indicates where the characters are "BEST FIT" mirroring. +# +# Code points with the "mirrored" property but no appropriate mirrors are +# listed as comments at the end of the file. +# +# For information on bidi mirroring, see UAX #9: Bidirectional Algorithm, +# at http://www.unicode.org/unicode/reports/tr9/ +# +# This file was originally created by Markus Scherer. +# Extended for Unicode 3.2, 4.0, and 4.1 by Ken Whistler. +# +# ############################################################ + +0028; 0029 # LEFT PARENTHESIS +0029; 0028 # RIGHT PARENTHESIS +003C; 003E # LESS-THAN SIGN +003E; 003C # GREATER-THAN SIGN +005B; 005D # LEFT SQUARE BRACKET +005D; 005B # RIGHT SQUARE BRACKET +007B; 007D # LEFT CURLY BRACKET +007D; 007B # RIGHT CURLY BRACKET +00AB; 00BB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00BB; 00AB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +2039; 203A # SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A; 2039 # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +2045; 2046 # LEFT SQUARE BRACKET WITH QUILL +2046; 2045 # RIGHT SQUARE BRACKET WITH QUILL +207D; 207E # SUPERSCRIPT LEFT PARENTHESIS +207E; 207D # SUPERSCRIPT RIGHT PARENTHESIS +208D; 208E # SUBSCRIPT LEFT PARENTHESIS +208E; 208D # SUBSCRIPT RIGHT PARENTHESIS +2208; 220B # ELEMENT OF +2209; 220C # NOT AN ELEMENT OF +220A; 220D # SMALL ELEMENT OF +220B; 2208 # CONTAINS AS MEMBER +220C; 2209 # DOES NOT CONTAIN AS MEMBER +220D; 220A # SMALL CONTAINS AS MEMBER +2215; 29F5 # DIVISION SLASH +223C; 223D # TILDE OPERATOR +223D; 223C # REVERSED TILDE +2243; 22CD # ASYMPTOTICALLY EQUAL TO +2252; 2253 # APPROXIMATELY EQUAL TO OR THE IMAGE OF +2253; 2252 # IMAGE OF OR APPROXIMATELY EQUAL TO +2254; 2255 # COLON EQUALS +2255; 2254 # EQUALS COLON +2264; 2265 # LESS-THAN OR EQUAL TO +2265; 2264 # GREATER-THAN OR EQUAL TO +2266; 2267 # LESS-THAN OVER EQUAL TO +2267; 2266 # GREATER-THAN OVER EQUAL TO +2268; 2269 # [BEST FIT] LESS-THAN BUT NOT EQUAL TO +2269; 2268 # [BEST FIT] GREATER-THAN BUT NOT EQUAL TO +226A; 226B # MUCH LESS-THAN +226B; 226A # MUCH GREATER-THAN +226E; 226F # [BEST FIT] NOT LESS-THAN +226F; 226E # [BEST FIT] NOT GREATER-THAN +2270; 2271 # [BEST FIT] NEITHER LESS-THAN NOR EQUAL TO +2271; 2270 # [BEST FIT] NEITHER GREATER-THAN NOR EQUAL TO +2272; 2273 # [BEST FIT] LESS-THAN OR EQUIVALENT TO +2273; 2272 # [BEST FIT] GREATER-THAN OR EQUIVALENT TO +2274; 2275 # [BEST FIT] NEITHER LESS-THAN NOR EQUIVALENT TO +2275; 2274 # [BEST FIT] NEITHER GREATER-THAN NOR EQUIVALENT TO +2276; 2277 # LESS-THAN OR GREATER-THAN +2277; 2276 # GREATER-THAN OR LESS-THAN +2278; 2279 # NEITHER LESS-THAN NOR GREATER-THAN +2279; 2278 # NEITHER GREATER-THAN NOR LESS-THAN +227A; 227B # PRECEDES +227B; 227A # SUCCEEDS +227C; 227D # PRECEDES OR EQUAL TO +227D; 227C # SUCCEEDS OR EQUAL TO +227E; 227F # [BEST FIT] PRECEDES OR EQUIVALENT TO +227F; 227E # [BEST FIT] SUCCEEDS OR EQUIVALENT TO +2280; 2281 # [BEST FIT] DOES NOT PRECEDE +2281; 2280 # [BEST FIT] DOES NOT SUCCEED +2282; 2283 # SUBSET OF +2283; 2282 # SUPERSET OF +2284; 2285 # [BEST FIT] NOT A SUBSET OF +2285; 2284 # [BEST FIT] NOT A SUPERSET OF +2286; 2287 # SUBSET OF OR EQUAL TO +2287; 2286 # SUPERSET OF OR EQUAL TO +2288; 2289 # [BEST FIT] NEITHER A SUBSET OF NOR EQUAL TO +2289; 2288 # [BEST FIT] NEITHER A SUPERSET OF NOR EQUAL TO +228A; 228B # [BEST FIT] SUBSET OF WITH NOT EQUAL TO +228B; 228A # [BEST FIT] SUPERSET OF WITH NOT EQUAL TO +228F; 2290 # SQUARE IMAGE OF +2290; 228F # SQUARE ORIGINAL OF +2291; 2292 # SQUARE IMAGE OF OR EQUAL TO +2292; 2291 # SQUARE ORIGINAL OF OR EQUAL TO +2298; 29B8 # CIRCLED DIVISION SLASH +22A2; 22A3 # RIGHT TACK +22A3; 22A2 # LEFT TACK +22A6; 2ADE # ASSERTION +22A8; 2AE4 # TRUE +22A9; 2AE3 # FORCES +22AB; 2AE5 # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22B0; 22B1 # PRECEDES UNDER RELATION +22B1; 22B0 # SUCCEEDS UNDER RELATION +22B2; 22B3 # NORMAL SUBGROUP OF +22B3; 22B2 # CONTAINS AS NORMAL SUBGROUP +22B4; 22B5 # NORMAL SUBGROUP OF OR EQUAL TO +22B5; 22B4 # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO +22B6; 22B7 # ORIGINAL OF +22B7; 22B6 # IMAGE OF +22C9; 22CA # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT +22CA; 22C9 # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT +22CB; 22CC # LEFT SEMIDIRECT PRODUCT +22CC; 22CB # RIGHT SEMIDIRECT PRODUCT +22CD; 2243 # REVERSED TILDE EQUALS +22D0; 22D1 # DOUBLE SUBSET +22D1; 22D0 # DOUBLE SUPERSET +22D6; 22D7 # LESS-THAN WITH DOT +22D7; 22D6 # GREATER-THAN WITH DOT +22D8; 22D9 # VERY MUCH LESS-THAN +22D9; 22D8 # VERY MUCH GREATER-THAN +22DA; 22DB # LESS-THAN EQUAL TO OR GREATER-THAN +22DB; 22DA # GREATER-THAN EQUAL TO OR LESS-THAN +22DC; 22DD # EQUAL TO OR LESS-THAN +22DD; 22DC # EQUAL TO OR GREATER-THAN +22DE; 22DF # EQUAL TO OR PRECEDES +22DF; 22DE # EQUAL TO OR SUCCEEDS +22E0; 22E1 # [BEST FIT] DOES NOT PRECEDE OR EQUAL +22E1; 22E0 # [BEST FIT] DOES NOT SUCCEED OR EQUAL +22E2; 22E3 # [BEST FIT] NOT SQUARE IMAGE OF OR EQUAL TO +22E3; 22E2 # [BEST FIT] NOT SQUARE ORIGINAL OF OR EQUAL TO +22E4; 22E5 # [BEST FIT] SQUARE IMAGE OF OR NOT EQUAL TO +22E5; 22E4 # [BEST FIT] SQUARE ORIGINAL OF OR NOT EQUAL TO +22E6; 22E7 # [BEST FIT] LESS-THAN BUT NOT EQUIVALENT TO +22E7; 22E6 # [BEST FIT] GREATER-THAN BUT NOT EQUIVALENT TO +22E8; 22E9 # [BEST FIT] PRECEDES BUT NOT EQUIVALENT TO +22E9; 22E8 # [BEST FIT] SUCCEEDS BUT NOT EQUIVALENT TO +22EA; 22EB # [BEST FIT] NOT NORMAL SUBGROUP OF +22EB; 22EA # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP +22EC; 22ED # [BEST FIT] NOT NORMAL SUBGROUP OF OR EQUAL TO +22ED; 22EC # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +22F0; 22F1 # UP RIGHT DIAGONAL ELLIPSIS +22F1; 22F0 # DOWN RIGHT DIAGONAL ELLIPSIS +22F2; 22FA # ELEMENT OF WITH LONG HORIZONTAL STROKE +22F3; 22FB # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F4; 22FC # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F6; 22FD # ELEMENT OF WITH OVERBAR +22F7; 22FE # SMALL ELEMENT OF WITH OVERBAR +22FA; 22F2 # CONTAINS WITH LONG HORIZONTAL STROKE +22FB; 22F3 # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FC; 22F4 # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FD; 22F6 # CONTAINS WITH OVERBAR +22FE; 22F7 # SMALL CONTAINS WITH OVERBAR +2308; 2309 # LEFT CEILING +2309; 2308 # RIGHT CEILING +230A; 230B # LEFT FLOOR +230B; 230A # RIGHT FLOOR +2329; 232A # LEFT-POINTING ANGLE BRACKET +232A; 2329 # RIGHT-POINTING ANGLE BRACKET +2768; 2769 # MEDIUM LEFT PARENTHESIS ORNAMENT +2769; 2768 # MEDIUM RIGHT PARENTHESIS ORNAMENT +276A; 276B # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B; 276A # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C; 276D # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D; 276C # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E; 276F # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F; 276E # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770; 2771 # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771; 2770 # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772; 2773 # LIGHT LEFT TORTOISE SHELL BRACKET +2773; 2772 # LIGHT RIGHT TORTOISE SHELL BRACKET +2774; 2775 # MEDIUM LEFT CURLY BRACKET ORNAMENT +2775; 2774 # MEDIUM RIGHT CURLY BRACKET ORNAMENT +27C3; 27C4 # OPEN SUBSET +27C4; 27C3 # OPEN SUPERSET +27C5; 27C6 # LEFT S-SHAPED BAG DELIMITER +27C6; 27C5 # RIGHT S-SHAPED BAG DELIMITER +27D5; 27D6 # LEFT OUTER JOIN +27D6; 27D5 # RIGHT OUTER JOIN +27DD; 27DE # LONG RIGHT TACK +27DE; 27DD # LONG LEFT TACK +27E2; 27E3 # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK +27E3; 27E2 # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK +27E4; 27E5 # WHITE SQUARE WITH LEFTWARDS TICK +27E5; 27E4 # WHITE SQUARE WITH RIGHTWARDS TICK +27E6; 27E7 # MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7; 27E6 # MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8; 27E9 # MATHEMATICAL LEFT ANGLE BRACKET +27E9; 27E8 # MATHEMATICAL RIGHT ANGLE BRACKET +27EA; 27EB # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB; 27EA # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +2983; 2984 # LEFT WHITE CURLY BRACKET +2984; 2983 # RIGHT WHITE CURLY BRACKET +2985; 2986 # LEFT WHITE PARENTHESIS +2986; 2985 # RIGHT WHITE PARENTHESIS +2987; 2988 # Z NOTATION LEFT IMAGE BRACKET +2988; 2987 # Z NOTATION RIGHT IMAGE BRACKET +2989; 298A # Z NOTATION LEFT BINDING BRACKET +298A; 2989 # Z NOTATION RIGHT BINDING BRACKET +298B; 298C # LEFT SQUARE BRACKET WITH UNDERBAR +298C; 298B # RIGHT SQUARE BRACKET WITH UNDERBAR +298D; 2990 # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E; 298F # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F; 298E # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990; 298D # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991; 2992 # LEFT ANGLE BRACKET WITH DOT +2992; 2991 # RIGHT ANGLE BRACKET WITH DOT +2993; 2994 # LEFT ARC LESS-THAN BRACKET +2994; 2993 # RIGHT ARC GREATER-THAN BRACKET +2995; 2996 # DOUBLE LEFT ARC GREATER-THAN BRACKET +2996; 2995 # DOUBLE RIGHT ARC LESS-THAN BRACKET +2997; 2998 # LEFT BLACK TORTOISE SHELL BRACKET +2998; 2997 # RIGHT BLACK TORTOISE SHELL BRACKET +29B8; 2298 # CIRCLED REVERSE SOLIDUS +29C0; 29C1 # CIRCLED LESS-THAN +29C1; 29C0 # CIRCLED GREATER-THAN +29C4; 29C5 # SQUARED RISING DIAGONAL SLASH +29C5; 29C4 # SQUARED FALLING DIAGONAL SLASH +29CF; 29D0 # LEFT TRIANGLE BESIDE VERTICAL BAR +29D0; 29CF # VERTICAL BAR BESIDE RIGHT TRIANGLE +29D1; 29D2 # BOWTIE WITH LEFT HALF BLACK +29D2; 29D1 # BOWTIE WITH RIGHT HALF BLACK +29D4; 29D5 # TIMES WITH LEFT HALF BLACK +29D5; 29D4 # TIMES WITH RIGHT HALF BLACK +29D8; 29D9 # LEFT WIGGLY FENCE +29D9; 29D8 # RIGHT WIGGLY FENCE +29DA; 29DB # LEFT DOUBLE WIGGLY FENCE +29DB; 29DA # RIGHT DOUBLE WIGGLY FENCE +29F5; 2215 # REVERSE SOLIDUS OPERATOR +29F8; 29F9 # BIG SOLIDUS +29F9; 29F8 # BIG REVERSE SOLIDUS +29FC; 29FD # LEFT-POINTING CURVED ANGLE BRACKET +29FD; 29FC # RIGHT-POINTING CURVED ANGLE BRACKET +2A2B; 2A2C # MINUS SIGN WITH FALLING DOTS +2A2C; 2A2B # MINUS SIGN WITH RISING DOTS +2A2D; 2A2E # PLUS SIGN IN LEFT HALF CIRCLE +2A2E; 2A2D # PLUS SIGN IN RIGHT HALF CIRCLE +2A34; 2A35 # MULTIPLICATION SIGN IN LEFT HALF CIRCLE +2A35; 2A34 # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE +2A3C; 2A3D # INTERIOR PRODUCT +2A3D; 2A3C # RIGHTHAND INTERIOR PRODUCT +2A64; 2A65 # Z NOTATION DOMAIN ANTIRESTRICTION +2A65; 2A64 # Z NOTATION RANGE ANTIRESTRICTION +2A79; 2A7A # LESS-THAN WITH CIRCLE INSIDE +2A7A; 2A79 # GREATER-THAN WITH CIRCLE INSIDE +2A7D; 2A7E # LESS-THAN OR SLANTED EQUAL TO +2A7E; 2A7D # GREATER-THAN OR SLANTED EQUAL TO +2A7F; 2A80 # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A80; 2A7F # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A81; 2A82 # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A82; 2A81 # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A83; 2A84 # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT +2A84; 2A83 # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT +2A8B; 2A8C # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN +2A8C; 2A8B # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN +2A91; 2A92 # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL +2A92; 2A91 # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL +2A93; 2A94 # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL +2A94; 2A93 # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL +2A95; 2A96 # SLANTED EQUAL TO OR LESS-THAN +2A96; 2A95 # SLANTED EQUAL TO OR GREATER-THAN +2A97; 2A98 # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE +2A98; 2A97 # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE +2A99; 2A9A # DOUBLE-LINE EQUAL TO OR LESS-THAN +2A9A; 2A99 # DOUBLE-LINE EQUAL TO OR GREATER-THAN +2A9B; 2A9C # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN +2A9C; 2A9B # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN +2AA1; 2AA2 # DOUBLE NESTED LESS-THAN +2AA2; 2AA1 # DOUBLE NESTED GREATER-THAN +2AA6; 2AA7 # LESS-THAN CLOSED BY CURVE +2AA7; 2AA6 # GREATER-THAN CLOSED BY CURVE +2AA8; 2AA9 # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AA9; 2AA8 # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AAA; 2AAB # SMALLER THAN +2AAB; 2AAA # LARGER THAN +2AAC; 2AAD # SMALLER THAN OR EQUAL TO +2AAD; 2AAC # LARGER THAN OR EQUAL TO +2AAF; 2AB0 # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN +2AB0; 2AAF # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN +2AB3; 2AB4 # PRECEDES ABOVE EQUALS SIGN +2AB4; 2AB3 # SUCCEEDS ABOVE EQUALS SIGN +2ABB; 2ABC # DOUBLE PRECEDES +2ABC; 2ABB # DOUBLE SUCCEEDS +2ABD; 2ABE # SUBSET WITH DOT +2ABE; 2ABD # SUPERSET WITH DOT +2ABF; 2AC0 # SUBSET WITH PLUS SIGN BELOW +2AC0; 2ABF # SUPERSET WITH PLUS SIGN BELOW +2AC1; 2AC2 # SUBSET WITH MULTIPLICATION SIGN BELOW +2AC2; 2AC1 # SUPERSET WITH MULTIPLICATION SIGN BELOW +2AC3; 2AC4 # SUBSET OF OR EQUAL TO WITH DOT ABOVE +2AC4; 2AC3 # SUPERSET OF OR EQUAL TO WITH DOT ABOVE +2AC5; 2AC6 # SUBSET OF ABOVE EQUALS SIGN +2AC6; 2AC5 # SUPERSET OF ABOVE EQUALS SIGN +2ACD; 2ACE # SQUARE LEFT OPEN BOX OPERATOR +2ACE; 2ACD # SQUARE RIGHT OPEN BOX OPERATOR +2ACF; 2AD0 # CLOSED SUBSET +2AD0; 2ACF # CLOSED SUPERSET +2AD1; 2AD2 # CLOSED SUBSET OR EQUAL TO +2AD2; 2AD1 # CLOSED SUPERSET OR EQUAL TO +2AD3; 2AD4 # SUBSET ABOVE SUPERSET +2AD4; 2AD3 # SUPERSET ABOVE SUBSET +2AD5; 2AD6 # SUBSET ABOVE SUBSET +2AD6; 2AD5 # SUPERSET ABOVE SUPERSET +2ADE; 22A6 # SHORT LEFT TACK +2AE3; 22A9 # DOUBLE VERTICAL BAR LEFT TURNSTILE +2AE4; 22A8 # VERTICAL BAR DOUBLE LEFT TURNSTILE +2AE5; 22AB # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE +2AEC; 2AED # DOUBLE STROKE NOT SIGN +2AED; 2AEC # REVERSED DOUBLE STROKE NOT SIGN +2AF7; 2AF8 # TRIPLE NESTED LESS-THAN +2AF8; 2AF7 # TRIPLE NESTED GREATER-THAN +2AF9; 2AFA # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO +2AFA; 2AF9 # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO +2E02; 2E03 # LEFT SUBSTITUTION BRACKET +2E03; 2E02 # RIGHT SUBSTITUTION BRACKET +2E04; 2E05 # LEFT DOTTED SUBSTITUTION BRACKET +2E05; 2E04 # RIGHT DOTTED SUBSTITUTION BRACKET +2E09; 2E0A # LEFT TRANSPOSITION BRACKET +2E0A; 2E09 # RIGHT TRANSPOSITION BRACKET +2E0C; 2E0D # LEFT RAISED OMISSION BRACKET +2E0D; 2E0C # RIGHT RAISED OMISSION BRACKET +2E1C; 2E1D # LEFT LOW PARAPHRASE BRACKET +2E1D; 2E1C # RIGHT LOW PARAPHRASE BRACKET +3008; 3009 # LEFT ANGLE BRACKET +3009; 3008 # RIGHT ANGLE BRACKET +300A; 300B # LEFT DOUBLE ANGLE BRACKET +300B; 300A # RIGHT DOUBLE ANGLE BRACKET +300C; 300D # [BEST FIT] LEFT CORNER BRACKET +300D; 300C # [BEST FIT] RIGHT CORNER BRACKET +300E; 300F # [BEST FIT] LEFT WHITE CORNER BRACKET +300F; 300E # [BEST FIT] RIGHT WHITE CORNER BRACKET +3010; 3011 # LEFT BLACK LENTICULAR BRACKET +3011; 3010 # RIGHT BLACK LENTICULAR BRACKET +3014; 3015 # LEFT TORTOISE SHELL BRACKET +3015; 3014 # RIGHT TORTOISE SHELL BRACKET +3016; 3017 # LEFT WHITE LENTICULAR BRACKET +3017; 3016 # RIGHT WHITE LENTICULAR BRACKET +3018; 3019 # LEFT WHITE TORTOISE SHELL BRACKET +3019; 3018 # RIGHT WHITE TORTOISE SHELL BRACKET +301A; 301B # LEFT WHITE SQUARE BRACKET +301B; 301A # RIGHT WHITE SQUARE BRACKET +FF08; FF09 # FULLWIDTH LEFT PARENTHESIS +FF09; FF08 # FULLWIDTH RIGHT PARENTHESIS +FF1C; FF1E # FULLWIDTH LESS-THAN SIGN +FF1E; FF1C # FULLWIDTH GREATER-THAN SIGN +FF3B; FF3D # FULLWIDTH LEFT SQUARE BRACKET +FF3D; FF3B # FULLWIDTH RIGHT SQUARE BRACKET +FF5B; FF5D # FULLWIDTH LEFT CURLY BRACKET +FF5D; FF5B # FULLWIDTH RIGHT CURLY BRACKET +FF5F; FF60 # FULLWIDTH LEFT WHITE PARENTHESIS +FF60; FF5F # FULLWIDTH RIGHT WHITE PARENTHESIS +FF62; FF63 # [BEST FIT] HALFWIDTH LEFT CORNER BRACKET +FF63; FF62 # [BEST FIT] HALFWIDTH RIGHT CORNER BRACKET + +# The following characters have no appropriate mirroring character. +# For these characters it is up to the rendering system +# to provide mirrored glyphs. + +# 2140; DOUBLE-STRUCK N-ARY SUMMATION +# 2201; COMPLEMENT +# 2202; PARTIAL DIFFERENTIAL +# 2203; THERE EXISTS +# 2204; THERE DOES NOT EXIST +# 2211; N-ARY SUMMATION +# 2216; SET MINUS +# 221A; SQUARE ROOT +# 221B; CUBE ROOT +# 221C; FOURTH ROOT +# 221D; PROPORTIONAL TO +# 221F; RIGHT ANGLE +# 2220; ANGLE +# 2221; MEASURED ANGLE +# 2222; SPHERICAL ANGLE +# 2224; DOES NOT DIVIDE +# 2226; NOT PARALLEL TO +# 222B; INTEGRAL +# 222C; DOUBLE INTEGRAL +# 222D; TRIPLE INTEGRAL +# 222E; CONTOUR INTEGRAL +# 222F; SURFACE INTEGRAL +# 2230; VOLUME INTEGRAL +# 2231; CLOCKWISE INTEGRAL +# 2232; CLOCKWISE CONTOUR INTEGRAL +# 2233; ANTICLOCKWISE CONTOUR INTEGRAL +# 2239; EXCESS +# 223B; HOMOTHETIC +# 223E; INVERTED LAZY S +# 223F; SINE WAVE +# 2240; WREATH PRODUCT +# 2241; NOT TILDE +# 2242; MINUS TILDE +# 2244; NOT ASYMPTOTICALLY EQUAL TO +# 2245; APPROXIMATELY EQUAL TO +# 2246; APPROXIMATELY BUT NOT ACTUALLY EQUAL TO +# 2247; NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +# 2248; ALMOST EQUAL TO +# 2249; NOT ALMOST EQUAL TO +# 224A; ALMOST EQUAL OR EQUAL TO +# 224B; TRIPLE TILDE +# 224C; ALL EQUAL TO +# 225F; QUESTIONED EQUAL TO +# 2260; NOT EQUAL TO +# 2262; NOT IDENTICAL TO +# 228C; MULTISET +# 22A7; MODELS +# 22AA; TRIPLE VERTICAL BAR RIGHT TURNSTILE +# 22AC; DOES NOT PROVE +# 22AD; NOT TRUE +# 22AE; DOES NOT FORCE +# 22AF; NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +# 22B8; MULTIMAP +# 22BE; RIGHT ANGLE WITH ARC +# 22BF; RIGHT TRIANGLE +# 22F5; ELEMENT OF WITH DOT ABOVE +# 22F8; ELEMENT OF WITH UNDERBAR +# 22F9; ELEMENT OF WITH TWO HORIZONTAL STROKES +# 22FF; Z NOTATION BAG MEMBERSHIP +# 2320; TOP HALF INTEGRAL +# 2321; BOTTOM HALF INTEGRAL +# 27C0; THREE DIMENSIONAL ANGLE +# 27D3; LOWER RIGHT CORNER WITH DOT +# 27D4; UPPER LEFT CORNER WITH DOT +# 27DC; LEFT MULTIMAP +# 299B; MEASURED ANGLE OPENING LEFT +# 299C; RIGHT ANGLE VARIANT WITH SQUARE +# 299D; MEASURED RIGHT ANGLE WITH DOT +# 299E; ANGLE WITH S INSIDE +# 299F; ACUTE ANGLE +# 29A0; SPHERICAL ANGLE OPENING LEFT +# 29A1; SPHERICAL ANGLE OPENING UP +# 29A2; TURNED ANGLE +# 29A3; REVERSED ANGLE +# 29A4; ANGLE WITH UNDERBAR +# 29A5; REVERSED ANGLE WITH UNDERBAR +# 29A6; OBLIQUE ANGLE OPENING UP +# 29A7; OBLIQUE ANGLE OPENING DOWN +# 29A8; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT +# 29A9; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT +# 29AA; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT +# 29AB; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT +# 29AC; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP +# 29AD; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP +# 29AE; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN +# 29AF; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN +# 29C2; CIRCLE WITH SMALL CIRCLE TO THE RIGHT +# 29C3; CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT +# 29C9; TWO JOINED SQUARES +# 29CE; RIGHT TRIANGLE ABOVE LEFT TRIANGLE +# 29DC; INCOMPLETE INFINITY +# 29E1; INCREASES AS +# 29E3; EQUALS SIGN AND SLANTED PARALLEL +# 29E4; EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE +# 29E5; IDENTICAL TO AND SLANTED PARALLEL +# 29E8; DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK +# 29E9; DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK +# 29F4; RULE-DELAYED +# 29F6; SOLIDUS WITH OVERBAR +# 29F7; REVERSE SOLIDUS WITH HORIZONTAL STROKE +# 2A0A; MODULO TWO SUM +# 2A0B; SUMMATION WITH INTEGRAL +# 2A0C; QUADRUPLE INTEGRAL OPERATOR +# 2A0D; FINITE PART INTEGRAL +# 2A0E; INTEGRAL WITH DOUBLE STROKE +# 2A0F; INTEGRAL AVERAGE WITH SLASH +# 2A10; CIRCULATION FUNCTION +# 2A11; ANTICLOCKWISE INTEGRATION +# 2A12; LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE +# 2A13; LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE +# 2A14; LINE INTEGRATION NOT INCLUDING THE POLE +# 2A15; INTEGRAL AROUND A POINT OPERATOR +# 2A16; QUATERNION INTEGRAL OPERATOR +# 2A17; INTEGRAL WITH LEFTWARDS ARROW WITH HOOK +# 2A18; INTEGRAL WITH TIMES SIGN +# 2A19; INTEGRAL WITH INTERSECTION +# 2A1A; INTEGRAL WITH UNION +# 2A1B; INTEGRAL WITH OVERBAR +# 2A1C; INTEGRAL WITH UNDERBAR +# 2A1E; LARGE LEFT TRIANGLE OPERATOR +# 2A1F; Z NOTATION SCHEMA COMPOSITION +# 2A20; Z NOTATION SCHEMA PIPING +# 2A21; Z NOTATION SCHEMA PROJECTION +# 2A24; PLUS SIGN WITH TILDE ABOVE +# 2A26; PLUS SIGN WITH TILDE BELOW +# 2A29; MINUS SIGN WITH COMMA ABOVE +# 2A3E; Z NOTATION RELATIONAL COMPOSITION +# 2A57; SLOPING LARGE OR +# 2A58; SLOPING LARGE AND +# 2A6A; TILDE OPERATOR WITH DOT ABOVE +# 2A6B; TILDE OPERATOR WITH RISING DOTS +# 2A6C; SIMILAR MINUS SIMILAR +# 2A6D; CONGRUENT WITH DOT ABOVE +# 2A6F; ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT +# 2A70; APPROXIMATELY EQUAL OR EQUAL TO +# 2A73; EQUALS SIGN ABOVE TILDE OPERATOR +# 2A74; DOUBLE COLON EQUAL +# 2A7B; LESS-THAN WITH QUESTION MARK ABOVE +# 2A7C; GREATER-THAN WITH QUESTION MARK ABOVE +# 2A85; LESS-THAN OR APPROXIMATE +# 2A86; GREATER-THAN OR APPROXIMATE +# 2A87; LESS-THAN AND SINGLE-LINE NOT EQUAL TO +# 2A88; GREATER-THAN AND SINGLE-LINE NOT EQUAL TO +# 2A89; LESS-THAN AND NOT APPROXIMATE +# 2A8A; GREATER-THAN AND NOT APPROXIMATE +# 2A8D; LESS-THAN ABOVE SIMILAR OR EQUAL +# 2A8E; GREATER-THAN ABOVE SIMILAR OR EQUAL +# 2A8F; LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN +# 2A90; GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN +# 2A9D; SIMILAR OR LESS-THAN +# 2A9E; SIMILAR OR GREATER-THAN +# 2A9F; SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN +# 2AA0; SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN +# 2AA3; DOUBLE NESTED LESS-THAN WITH UNDERBAR +# 2AB1; PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO +# 2AB2; SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO +# 2AB5; PRECEDES ABOVE NOT EQUAL TO +# 2AB6; SUCCEEDS ABOVE NOT EQUAL TO +# 2AB7; PRECEDES ABOVE ALMOST EQUAL TO +# 2AB8; SUCCEEDS ABOVE ALMOST EQUAL TO +# 2AB9; PRECEDES ABOVE NOT ALMOST EQUAL TO +# 2ABA; SUCCEEDS ABOVE NOT ALMOST EQUAL TO +# 2AC7; SUBSET OF ABOVE TILDE OPERATOR +# 2AC8; SUPERSET OF ABOVE TILDE OPERATOR +# 2AC9; SUBSET OF ABOVE ALMOST EQUAL TO +# 2ACA; SUPERSET OF ABOVE ALMOST EQUAL TO +# 2ACB; SUBSET OF ABOVE NOT EQUAL TO +# 2ACC; SUPERSET OF ABOVE NOT EQUAL TO +# 2ADC; FORKING +# 2AE2; VERTICAL BAR TRIPLE RIGHT TURNSTILE +# 2AE6; LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL +# 2AEE; DOES NOT DIVIDE WITH REVERSED NEGATION SLASH +# 2AF3; PARALLEL WITH TILDE OPERATOR +# 2AFB; TRIPLE SOLIDUS BINARY RELATION +# 2AFD; DOUBLE SOLIDUS OPERATOR diff --git a/Master/tlpkg/tlperl.old/lib/unicore/Blocks.txt b/Master/tlpkg/tlperl.old/lib/unicore/Blocks.txt new file mode 100644 index 00000000000..f2b95662745 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/Blocks.txt @@ -0,0 +1,172 @@ +# Blocks-4.1.0.txt +# Date: 2005-1-31, 16:50 [KW] +# +# Unicode Character Database +# Copyright (c) 1991-2005 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html +# +# Note: The casing of block names is not normative. +# For example, "Basic Latin" and "BASIC LATIN" are equivalent. +# +# Format: +# Start Code..End Code; Block Name + +# ================================================ + +# Note: When comparing block names, casing, whitespace, hyphens, +# and underbars are ignored. +# For example, "Latin Extended-A" and "latin extended a" are equivalent. +# For more information on the comparison of property values, +# see UCD.html. +# +# All code points not explicitly listed for Block +# have the value No_Block. + +# Property: Block + +0000..007F; Basic Latin +0080..00FF; Latin-1 Supplement +0100..017F; Latin Extended-A +0180..024F; Latin Extended-B +0250..02AF; IPA Extensions +02B0..02FF; Spacing Modifier Letters +0300..036F; Combining Diacritical Marks +0370..03FF; Greek and Coptic +0400..04FF; Cyrillic +0500..052F; Cyrillic Supplement +0530..058F; Armenian +0590..05FF; Hebrew +0600..06FF; Arabic +0700..074F; Syriac +0750..077F; Arabic Supplement +0780..07BF; Thaana +0900..097F; Devanagari +0980..09FF; Bengali +0A00..0A7F; Gurmukhi +0A80..0AFF; Gujarati +0B00..0B7F; Oriya +0B80..0BFF; Tamil +0C00..0C7F; Telugu +0C80..0CFF; Kannada +0D00..0D7F; Malayalam +0D80..0DFF; Sinhala +0E00..0E7F; Thai +0E80..0EFF; Lao +0F00..0FFF; Tibetan +1000..109F; Myanmar +10A0..10FF; Georgian +1100..11FF; Hangul Jamo +1200..137F; Ethiopic +1380..139F; Ethiopic Supplement +13A0..13FF; Cherokee +1400..167F; Unified Canadian Aboriginal Syllabics +1680..169F; Ogham +16A0..16FF; Runic +1700..171F; Tagalog +1720..173F; Hanunoo +1740..175F; Buhid +1760..177F; Tagbanwa +1780..17FF; Khmer +1800..18AF; Mongolian +1900..194F; Limbu +1950..197F; Tai Le +1980..19DF; New Tai Lue +19E0..19FF; Khmer Symbols +1A00..1A1F; Buginese +1D00..1D7F; Phonetic Extensions +1D80..1DBF; Phonetic Extensions Supplement +1DC0..1DFF; Combining Diacritical Marks Supplement +1E00..1EFF; Latin Extended Additional +1F00..1FFF; Greek Extended +2000..206F; General Punctuation +2070..209F; Superscripts and Subscripts +20A0..20CF; Currency Symbols +20D0..20FF; Combining Diacritical Marks for Symbols +2100..214F; Letterlike Symbols +2150..218F; Number Forms +2190..21FF; Arrows +2200..22FF; Mathematical Operators +2300..23FF; Miscellaneous Technical +2400..243F; Control Pictures +2440..245F; Optical Character Recognition +2460..24FF; Enclosed Alphanumerics +2500..257F; Box Drawing +2580..259F; Block Elements +25A0..25FF; Geometric Shapes +2600..26FF; Miscellaneous Symbols +2700..27BF; Dingbats +27C0..27EF; Miscellaneous Mathematical Symbols-A +27F0..27FF; Supplemental Arrows-A +2800..28FF; Braille Patterns +2900..297F; Supplemental Arrows-B +2980..29FF; Miscellaneous Mathematical Symbols-B +2A00..2AFF; Supplemental Mathematical Operators +2B00..2BFF; Miscellaneous Symbols and Arrows +2C00..2C5F; Glagolitic +2C80..2CFF; Coptic +2D00..2D2F; Georgian Supplement +2D30..2D7F; Tifinagh +2D80..2DDF; Ethiopic Extended +2E00..2E7F; Supplemental Punctuation +2E80..2EFF; CJK Radicals Supplement +2F00..2FDF; Kangxi Radicals +2FF0..2FFF; Ideographic Description Characters +3000..303F; CJK Symbols and Punctuation +3040..309F; Hiragana +30A0..30FF; Katakana +3100..312F; Bopomofo +3130..318F; Hangul Compatibility Jamo +3190..319F; Kanbun +31A0..31BF; Bopomofo Extended +31C0..31EF; CJK Strokes +31F0..31FF; Katakana Phonetic Extensions +3200..32FF; Enclosed CJK Letters and Months +3300..33FF; CJK Compatibility +3400..4DBF; CJK Unified Ideographs Extension A +4DC0..4DFF; Yijing Hexagram Symbols +4E00..9FFF; CJK Unified Ideographs +A000..A48F; Yi Syllables +A490..A4CF; Yi Radicals +A700..A71F; Modifier Tone Letters +A800..A82F; Syloti Nagri +AC00..D7AF; Hangul Syllables +D800..DB7F; High Surrogates +DB80..DBFF; High Private Use Surrogates +DC00..DFFF; Low Surrogates +E000..F8FF; Private Use Area +F900..FAFF; CJK Compatibility Ideographs +FB00..FB4F; Alphabetic Presentation Forms +FB50..FDFF; Arabic Presentation Forms-A +FE00..FE0F; Variation Selectors +FE10..FE1F; Vertical Forms +FE20..FE2F; Combining Half Marks +FE30..FE4F; CJK Compatibility Forms +FE50..FE6F; Small Form Variants +FE70..FEFF; Arabic Presentation Forms-B +FF00..FFEF; Halfwidth and Fullwidth Forms +FFF0..FFFF; Specials +10000..1007F; Linear B Syllabary +10080..100FF; Linear B Ideograms +10100..1013F; Aegean Numbers +10140..1018F; Ancient Greek Numbers +10300..1032F; Old Italic +10330..1034F; Gothic +10380..1039F; Ugaritic +103A0..103DF; Old Persian +10400..1044F; Deseret +10450..1047F; Shavian +10480..104AF; Osmanya +10800..1083F; Cypriot Syllabary +10A00..10A5F; Kharoshthi +1D000..1D0FF; Byzantine Musical Symbols +1D100..1D1FF; Musical Symbols +1D200..1D24F; Ancient Greek Musical Notation +1D300..1D35F; Tai Xuan Jing Symbols +1D400..1D7FF; Mathematical Alphanumeric Symbols +20000..2A6DF; CJK Unified Ideographs Extension B +2F800..2FA1F; CJK Compatibility Ideographs Supplement +E0000..E007F; Tags +E0100..E01EF; Variation Selectors Supplement +F0000..FFFFF; Supplementary Private Use Area-A +100000..10FFFF; Supplementary Private Use Area-B diff --git a/Master/tlpkg/tlperl.old/lib/unicore/Canonical.pl b/Master/tlpkg/tlperl.old/lib/unicore/Canonical.pl new file mode 100644 index 00000000000..fce1e219700 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/Canonical.pl @@ -0,0 +1,1042 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +## +## Data in this file used by ../utf8_heavy.pl +## + +## Mapping from lc(canonical name) to filename in ./lib +%utf8::Canonical = ( + + # InAegeanNumbers + aegeannumbers => 'InAegean', + + alphabetic => 'Alphabet', + + # InAlphabeticPresentationForms + alphabeticpresentationforms => 'InAlphab', + + # InAncientGreekMusicalNotation + ancientgreekmusicalnotation => 'InAncie2', + + # InAncientGreekNumbers + ancientgreeknumbers => 'InAncien', + + arabic => 'Arab', + + # InArabicPresentationFormsA + arabicpresentationformsa => 'InArabi4', + + # InArabicPresentationFormsB + arabicpresentationformsb => 'InArabi3', + + # InArabicSupplement + arabicsupplement => 'InArabi2', + + armenian => 'Armn', + + # InArrows + arrows => 'InArrows', + + # AsciiHexDigit + asciihexdigit => 'AsciiHex', + + # InBasicLatin + basiclatin => 'InBasicL', + + bengali => 'Beng', + + # BidiControl + bidicontrol => 'BidiCont', + + # InBlockElements + blockelements => 'InBlockE', + + bopomofo => 'Bopo', + + # InBopomofoExtended + bopomofoextended => 'InBopom2', + + # InBoxDrawing + boxdrawing => 'InBoxDra', + + braille => 'Brai', + + # InBraillePatterns + braillepatterns => 'InBraill', + + buginese => 'Bugi', + buhid => 'Buhd', + + # InByzantineMusicalSymbols + byzantinemusicalsymbols => 'InByzant', + + # CanadianAboriginal + canadianaboriginal => 'Canadian', + + # CasedLetter + casedletter => 'LC', + + cherokee => 'Cher', + + # InCjkCompatibility + cjkcompatibility => 'InCjkCom', + + # InCjkCompatibilityForms + cjkcompatibilityforms => 'InCjkCo2', + + # InCjkCompatibilityIdeographs + cjkcompatibilityideographs => 'InCjkCo3', + + # InCjkCompatibilityIdeographsSupplement + cjkcompatibilityideographssupplement => 'InCjkCo4', + + # InCjkRadicalsSupplement + cjkradicalssupplement => 'InCjkRad', + + # InCjkStrokes + cjkstrokes => 'InCjkStr', + + # InCjkSymbolsAndPunctuation + cjksymbolsandpunctuation => 'InCjkSym', + + # InCjkUnifiedIdeographs + cjkunifiedideographs => 'InCjkUni', + + # InCjkUnifiedIdeographsExtensionA + cjkunifiedideographsextensiona => 'InCjkUn3', + + # InCjkUnifiedIdeographsExtensionB + cjkunifiedideographsextensionb => 'InCjkUn2', + + # ClosePunctuation + closepunctuation => 'Pe', + + # InCombiningDiacriticalMarks + combiningdiacriticalmarks => 'InCombi2', + + # InCombiningDiacriticalMarksForSymbols + combiningdiacriticalmarksforsymbols => 'InCombi4', + + # InCombiningDiacriticalMarksSupplement + combiningdiacriticalmarkssupplement => 'InCombi3', + + # InCombiningHalfMarks + combininghalfmarks => 'InCombin', + + common => 'Zyyy', + + # ConnectorPunctuation + connectorpunctuation => 'Pc', + + control => 'Cc', + + # InControlPictures + controlpictures => 'InContro', + + coptic => 'Copt', + + # CurrencySymbol + currencysymbol => 'Sc', + + # InCurrencySymbols + currencysymbols => 'InCurren', + + cypriot => 'Cprt', + + # InCypriotSyllabary + cypriotsyllabary => 'InCyprio', + + cyrillic => 'Cyrl', + + # InCyrillicSupplement + cyrillicsupplement => 'InCyril2', + + dash => 'Dash2', + + # DashPunctuation + dashpunctuation => 'Pd', + + # DecimalNumber + decimalnumber => 'Nd', + + deprecated => 'Deprecat', + deseret => 'Dsrt', + devanagari => 'Deva', + diacritic => 'Diacriti', + + # InDingbats + dingbats => 'InDingba', + + # InEnclosedAlphanumerics + enclosedalphanumerics => 'InEnclos', + + # InEnclosedCjkLettersAndMonths + enclosedcjklettersandmonths => 'InEnclo2', + + # EnclosingMark + enclosingmark => 'Me', + + ethiopic => 'Ethi', + + # InEthiopicExtended + ethiopicextended => 'InEthio2', + + # InEthiopicSupplement + ethiopicsupplement => 'InEthio3', + + extender => 'Extender', + + # FinalPunctuation + finalpunctuation => 'Pf', + + format => 'Cf', + + # InGeneralPunctuation + generalpunctuation => 'InGenera', + + # InGeometricShapes + geometricshapes => 'InGeomet', + + georgian => 'Geor', + + # InGeorgianSupplement + georgiansupplement => 'InGeorg2', + + glagolitic => 'Glag', + gothic => 'Goth', + + # GraphemeLink + graphemelink => 'Grapheme', + + greek => 'Grek', + + # InGreekAndCoptic + greekandcoptic => 'InGreekA', + + # InGreekExtended + greekextended => 'InGreekE', + + gujarati => 'Gujr', + gurmukhi => 'Guru', + + # InHalfwidthAndFullwidthForms + halfwidthandfullwidthforms => 'InHalfwi', + + han => 'Hani', + hangul => 'Hang', + + # InHangulCompatibilityJamo + hangulcompatibilityjamo => 'InHangu3', + + # InHangulJamo + hanguljamo => 'InHangul', + + # InHangulSyllables + hangulsyllables => 'InHangu2', + + hanunoo => 'Hano', + hebrew => 'Hebr', + + # HexDigit + hexdigit => 'HexDigit', + + # InHighPrivateUseSurrogates + highprivateusesurrogates => 'InHighPr', + + # InHighSurrogates + highsurrogates => 'InHighSu', + + hiragana => 'Hira', + hyphen => 'Hyphen2', + + # IdContinue + idcontinue => 'IdContin', + + ideographic => 'Ideograp', + + # InIdeographicDescriptionCharacters + ideographicdescriptioncharacters => 'InIdeogr', + + # IdsBinaryOperator + idsbinaryoperator => 'IdsBinar', + + # IdStart + idstart => 'IdStart', + + # IdsTrinaryOperator + idstrinaryoperator => 'IdsTrina', + + # InAegeanNumbers + inaegeannumbers => 'InAegean', + + # InAlphabeticPresentationForms + inalphabeticpresentationforms => 'InAlphab', + + # InAncientGreekMusicalNotation + inancientgreekmusicalnotation => 'InAncie2', + + # InAncientGreekNumbers + inancientgreeknumbers => 'InAncien', + + # InArabic + inarabic => 'InArabic', + + # InArabicPresentationFormsA + inarabicpresentationformsa => 'InArabi4', + + # InArabicPresentationFormsB + inarabicpresentationformsb => 'InArabi3', + + # InArabicSupplement + inarabicsupplement => 'InArabi2', + + # InArmenian + inarmenian => 'InArmeni', + + # InArrows + inarrows => 'InArrows', + + # InBasicLatin + inbasiclatin => 'InBasicL', + + # InBengali + inbengali => 'InBengal', + + # InBlockElements + inblockelements => 'InBlockE', + + # InBopomofo + inbopomofo => 'InBopomo', + + # InBopomofoExtended + inbopomofoextended => 'InBopom2', + + # InBoxDrawing + inboxdrawing => 'InBoxDra', + + # InBraillePatterns + inbraillepatterns => 'InBraill', + + # InBuginese + inbuginese => 'InBugine', + + # InBuhid + inbuhid => 'InBuhid', + + # InByzantineMusicalSymbols + inbyzantinemusicalsymbols => 'InByzant', + + # InCherokee + incherokee => 'InCherok', + + # InCjkCompatibility + incjkcompatibility => 'InCjkCom', + + # InCjkCompatibilityForms + incjkcompatibilityforms => 'InCjkCo2', + + # InCjkCompatibilityIdeographs + incjkcompatibilityideographs => 'InCjkCo3', + + # InCjkCompatibilityIdeographsSupplement + incjkcompatibilityideographssupplement => 'InCjkCo4', + + # InCjkRadicalsSupplement + incjkradicalssupplement => 'InCjkRad', + + # InCjkStrokes + incjkstrokes => 'InCjkStr', + + # InCjkSymbolsAndPunctuation + incjksymbolsandpunctuation => 'InCjkSym', + + # InCjkUnifiedIdeographs + incjkunifiedideographs => 'InCjkUni', + + # InCjkUnifiedIdeographsExtensionA + incjkunifiedideographsextensiona => 'InCjkUn3', + + # InCjkUnifiedIdeographsExtensionB + incjkunifiedideographsextensionb => 'InCjkUn2', + + # InCombiningDiacriticalMarks + incombiningdiacriticalmarks => 'InCombi2', + + # InCombiningDiacriticalMarksForSymbols + incombiningdiacriticalmarksforsymbols => 'InCombi4', + + # InCombiningDiacriticalMarksSupplement + incombiningdiacriticalmarkssupplement => 'InCombi3', + + # InCombiningHalfMarks + incombininghalfmarks => 'InCombin', + + # InControlPictures + incontrolpictures => 'InContro', + + # InCoptic + incoptic => 'InCoptic', + + # InCurrencySymbols + incurrencysymbols => 'InCurren', + + # InCypriotSyllabary + incypriotsyllabary => 'InCyprio', + + # InCyrillic + incyrillic => 'InCyrill', + + # InCyrillicSupplement + incyrillicsupplement => 'InCyril2', + + # InDeseret + indeseret => 'InDesere', + + # InDevanagari + indevanagari => 'InDevana', + + # InDingbats + indingbats => 'InDingba', + + # InEnclosedAlphanumerics + inenclosedalphanumerics => 'InEnclos', + + # InEnclosedCjkLettersAndMonths + inenclosedcjklettersandmonths => 'InEnclo2', + + # InEthiopic + inethiopic => 'InEthiop', + + # InEthiopicExtended + inethiopicextended => 'InEthio2', + + # InEthiopicSupplement + inethiopicsupplement => 'InEthio3', + + # InGeneralPunctuation + ingeneralpunctuation => 'InGenera', + + # InGeometricShapes + ingeometricshapes => 'InGeomet', + + # InGeorgian + ingeorgian => 'InGeorgi', + + # InGeorgianSupplement + ingeorgiansupplement => 'InGeorg2', + + # InGlagolitic + inglagolitic => 'InGlagol', + + # InGothic + ingothic => 'InGothic', + + # InGreekAndCoptic + ingreekandcoptic => 'InGreekA', + + # InGreekExtended + ingreekextended => 'InGreekE', + + # InGujarati + ingujarati => 'InGujara', + + # InGurmukhi + ingurmukhi => 'InGurmuk', + + # InHalfwidthAndFullwidthForms + inhalfwidthandfullwidthforms => 'InHalfwi', + + # InHangulCompatibilityJamo + inhangulcompatibilityjamo => 'InHangu3', + + # InHangulJamo + inhanguljamo => 'InHangul', + + # InHangulSyllables + inhangulsyllables => 'InHangu2', + + # InHanunoo + inhanunoo => 'InHanuno', + + # InHebrew + inhebrew => 'InHebrew', + + inherited => 'Qaai', + + # InHighPrivateUseSurrogates + inhighprivateusesurrogates => 'InHighPr', + + # InHighSurrogates + inhighsurrogates => 'InHighSu', + + # InHiragana + inhiragana => 'InHiraga', + + # InIdeographicDescriptionCharacters + inideographicdescriptioncharacters => 'InIdeogr', + + # InIpaExtensions + inipaextensions => 'InIpaExt', + + # InitialPunctuation + initialpunctuation => 'Pi', + + # InKanbun + inkanbun => 'InKanbun', + + # InKangxiRadicals + inkangxiradicals => 'InKangxi', + + # InKannada + inkannada => 'InKannad', + + # InKatakana + inkatakana => 'InKataka', + + # InKatakanaPhoneticExtensions + inkatakanaphoneticextensions => 'InKatak2', + + # InKharoshthi + inkharoshthi => 'InKharos', + + # InKhmer + inkhmer => 'InKhmer', + + # InKhmerSymbols + inkhmersymbols => 'InKhmerS', + + # InLao + inlao => 'InLao', + + # InLatin1Supplement + inlatin1supplement => 'InLatin1', + + # InLatinExtendedA + inlatinextendeda => 'InLatin2', + + # InLatinExtendedAdditional + inlatinextendedadditional => 'InLatin3', + + # InLatinExtendedB + inlatinextendedb => 'InLatinE', + + # InLetterlikeSymbols + inletterlikesymbols => 'InLetter', + + # InLimbu + inlimbu => 'InLimbu', + + # InLinearBIdeograms + inlinearbideograms => 'InLinear', + + # InLinearBSyllabary + inlinearbsyllabary => 'InLinea2', + + # InLowSurrogates + inlowsurrogates => 'InLowSur', + + # InMalayalam + inmalayalam => 'InMalaya', + + # InMathematicalAlphanumericSymbols + inmathematicalalphanumericsymbols => 'InMathe2', + + # InMathematicalOperators + inmathematicaloperators => 'InMathem', + + # InMiscellaneousMathematicalSymbolsA + inmiscellaneousmathematicalsymbolsa => 'InMisce4', + + # InMiscellaneousMathematicalSymbolsB + inmiscellaneousmathematicalsymbolsb => 'InMisce5', + + # InMiscellaneousSymbols + inmiscellaneoussymbols => 'InMiscel', + + # InMiscellaneousSymbolsAndArrows + inmiscellaneoussymbolsandarrows => 'InMisce3', + + # InMiscellaneousTechnical + inmiscellaneoustechnical => 'InMisce2', + + # InModifierToneLetters + inmodifiertoneletters => 'InModifi', + + # InMongolian + inmongolian => 'InMongol', + + # InMusicalSymbols + inmusicalsymbols => 'InMusica', + + # InMyanmar + inmyanmar => 'InMyanma', + + # InNewTaiLue + innewtailue => 'InNewTai', + + # InNumberForms + innumberforms => 'InNumber', + + # InOgham + inogham => 'InOgham', + + # InOldItalic + inolditalic => 'InOldIta', + + # InOldPersian + inoldpersian => 'InOldPer', + + # InOpticalCharacterRecognition + inopticalcharacterrecognition => 'InOptica', + + # InOriya + inoriya => 'InOriya', + + # InOsmanya + inosmanya => 'InOsmany', + + # InPhoneticExtensions + inphoneticextensions => 'InPhonet', + + # InPhoneticExtensionsSupplement + inphoneticextensionssupplement => 'InPhone2', + + # InPrivateUseArea + inprivateusearea => 'InPrivat', + + # InRunic + inrunic => 'InRunic', + + # InShavian + inshavian => 'InShavia', + + # InSinhala + insinhala => 'InSinhal', + + # InSmallFormVariants + insmallformvariants => 'InSmallF', + + # InSpacingModifierLetters + inspacingmodifierletters => 'InSpacin', + + # InSpecials + inspecials => 'InSpecia', + + # InSuperscriptsAndSubscripts + insuperscriptsandsubscripts => 'InSupers', + + # InSupplementalArrowsA + insupplementalarrowsa => 'InSuppl2', + + # InSupplementalArrowsB + insupplementalarrowsb => 'InSupple', + + # InSupplementalMathematicalOperators + insupplementalmathematicaloperators => 'InSuppl6', + + # InSupplementalPunctuation + insupplementalpunctuation => 'InSuppl3', + + # InSupplementaryPrivateUseAreaA + insupplementaryprivateuseareaa => 'InSuppl4', + + # InSupplementaryPrivateUseAreaB + insupplementaryprivateuseareab => 'InSuppl5', + + # InSylotiNagri + insylotinagri => 'InSyloti', + + # InSyriac + insyriac => 'InSyriac', + + # InTagalog + intagalog => 'InTagalo', + + # InTagbanwa + intagbanwa => 'InTagban', + + # InTags + intags => 'InTags', + + # InTaiLe + intaile => 'InTaiLe', + + # InTaiXuanJingSymbols + intaixuanjingsymbols => 'InTaiXua', + + # InTamil + intamil => 'InTamil', + + # InTelugu + intelugu => 'InTelugu', + + # InThaana + inthaana => 'InThaana', + + # InThai + inthai => 'InThai', + + # InTibetan + intibetan => 'InTibeta', + + # InTifinagh + intifinagh => 'InTifina', + + # InUgaritic + inugaritic => 'InUgarit', + + # InUnifiedCanadianAboriginalSyllabics + inunifiedcanadianaboriginalsyllabics => 'InUnifie', + + # InVariationSelectors + invariationselectors => 'InVariat', + + # InVariationSelectorsSupplement + invariationselectorssupplement => 'InVaria2', + + # InVerticalForms + inverticalforms => 'InVertic', + + # InYijingHexagramSymbols + inyijinghexagramsymbols => 'InYijing', + + # InYiRadicals + inyiradicals => 'InYiRadi', + + # InYiSyllables + inyisyllables => 'InYiSyll', + + # InIpaExtensions + ipaextensions => 'InIpaExt', + + # JoinControl + joincontrol => 'JoinCont', + + # InKanbun + kanbun => 'InKanbun', + + # InKangxiRadicals + kangxiradicals => 'InKangxi', + + kannada => 'Knda', + katakana => 'Kana', + + # InKatakanaPhoneticExtensions + katakanaphoneticextensions => 'InKatak2', + + kharoshthi => 'Khar', + khmer => 'Khmr', + + # InKhmerSymbols + khmersymbols => 'InKhmerS', + + lao => 'Laoo', + latin => 'Latn', + + # InLatin1Supplement + latin1supplement => 'InLatin1', + + # InLatinExtendedA + latinextendeda => 'InLatin2', + + # InLatinExtendedAdditional + latinextendedadditional => 'InLatin3', + + # InLatinExtendedB + latinextendedb => 'InLatinE', + + letter => 'L', + + # InLetterlikeSymbols + letterlikesymbols => 'InLetter', + + # LetterNumber + letternumber => 'Nl', + + limbu => 'Limb', + + # LinearB + linearb => 'LinearB', + + # InLinearBIdeograms + linearbideograms => 'InLinear', + + # InLinearBSyllabary + linearbsyllabary => 'InLinea2', + + # LineSeparator + lineseparator => 'Zl', + + # LogicalOrderException + logicalorderexception => 'LogicalO', + + lowercase => 'Lowercas', + + # LowercaseLetter + lowercaseletter => 'Ll', + + # InLowSurrogates + lowsurrogates => 'InLowSur', + + malayalam => 'Mlym', + mark => 'M', + math => 'Math', + + # InMathematicalAlphanumericSymbols + mathematicalalphanumericsymbols => 'InMathe2', + + # InMathematicalOperators + mathematicaloperators => 'InMathem', + + # MathSymbol + mathsymbol => 'Sm', + + # InMiscellaneousMathematicalSymbolsA + miscellaneousmathematicalsymbolsa => 'InMisce4', + + # InMiscellaneousMathematicalSymbolsB + miscellaneousmathematicalsymbolsb => 'InMisce5', + + # InMiscellaneousSymbols + miscellaneoussymbols => 'InMiscel', + + # InMiscellaneousSymbolsAndArrows + miscellaneoussymbolsandarrows => 'InMisce3', + + # InMiscellaneousTechnical + miscellaneoustechnical => 'InMisce2', + + # ModifierLetter + modifierletter => 'Lm', + + # ModifierSymbol + modifiersymbol => 'Sk', + + # InModifierToneLetters + modifiertoneletters => 'InModifi', + + mongolian => 'Mong', + + # InMusicalSymbols + musicalsymbols => 'InMusica', + + myanmar => 'Mymr', + + # NewTaiLue + newtailue => 'NewTaiLu', + + # NoncharacterCodePoint + noncharactercodepoint => 'Nonchara', + + # NonspacingMark + nonspacingmark => 'Mn', + + number => 'N', + + # InNumberForms + numberforms => 'InNumber', + + ogham => 'Ogam', + + # OldItalic + olditalic => 'OldItali', + + # OldPersian + oldpersian => 'OldPersi', + + # OpenPunctuation + openpunctuation => 'Ps', + + # InOpticalCharacterRecognition + opticalcharacterrecognition => 'InOptica', + + oriya => 'Orya', + osmanya => 'Osma', + other => 'C', + + # OtherAlphabetic + otheralphabetic => 'OtherAlp', + + # OtherDefaultIgnorableCodePoint + otherdefaultignorablecodepoint => 'OtherDef', + + # OtherGraphemeExtend + othergraphemeextend => 'OtherGra', + + # OtherIdContinue + otheridcontinue => 'OtherIdC', + + # OtherIdStart + otheridstart => 'OtherIdS', + + # OtherLetter + otherletter => 'Lo', + + # OtherLowercase + otherlowercase => 'OtherLow', + + # OtherMath + othermath => 'OtherMat', + + # OtherNumber + othernumber => 'No', + + # OtherPunctuation + otherpunctuation => 'Po', + + # OtherSymbol + othersymbol => 'So', + + # OtherUppercase + otheruppercase => 'OtherUpp', + + # ParagraphSeparator + paragraphseparator => 'Zp', + + # PatternSyntax + patternsyntax => 'PatternS', + + # PatternWhiteSpace + patternwhitespace => 'PatternW', + + # InPhoneticExtensions + phoneticextensions => 'InPhonet', + + # InPhoneticExtensionsSupplement + phoneticextensionssupplement => 'InPhone2', + + # PrivateUse + privateuse => 'Co', + + # InPrivateUseArea + privateusearea => 'InPrivat', + + punctuation => 'P', + + # QuotationMark + quotationmark => 'Quotatio', + + radical => 'Radical2', + runic => 'Runr', + separator => 'Z', + shavian => 'Shaw', + sinhala => 'Sinh', + + # InSmallFormVariants + smallformvariants => 'InSmallF', + + # SoftDotted + softdotted => 'SoftDott', + + # SpaceSeparator + spaceseparator => 'Zs', + + # SpacingMark + spacingmark => 'Mc', + + # InSpacingModifierLetters + spacingmodifierletters => 'InSpacin', + + # InSpecials + specials => 'InSpecia', + + sterm => 'Sterm2', + + # InSuperscriptsAndSubscripts + superscriptsandsubscripts => 'InSupers', + + # InSupplementalArrowsA + supplementalarrowsa => 'InSuppl2', + + # InSupplementalArrowsB + supplementalarrowsb => 'InSupple', + + # InSupplementalMathematicalOperators + supplementalmathematicaloperators => 'InSuppl6', + + # InSupplementalPunctuation + supplementalpunctuation => 'InSuppl3', + + # InSupplementaryPrivateUseAreaA + supplementaryprivateuseareaa => 'InSuppl4', + + # InSupplementaryPrivateUseAreaB + supplementaryprivateuseareab => 'InSuppl5', + + surrogate => 'Cs', + + # SylotiNagri + sylotinagri => 'SylotiNa', + + symbol => 'S', + syriac => 'Syrc', + tagalog => 'Tglg', + tagbanwa => 'Tagb', + + # InTags + tags => 'InTags', + + # TaiLe + taile => 'TaiLe', + + # InTaiXuanJingSymbols + taixuanjingsymbols => 'InTaiXua', + + tamil => 'Taml', + telugu => 'Telu', + + # TerminalPunctuation + terminalpunctuation => 'Terminal', + + thaana => 'Thaa', + thai => 'Thai', + tibetan => 'Tibt', + tifinagh => 'Tfng', + + # TitlecaseLetter + titlecaseletter => 'Lt', + + ugaritic => 'Ugar', + unassigned => 'Cn', + + # InUnifiedCanadianAboriginalSyllabics + unifiedcanadianaboriginalsyllabics => 'InUnifie', + + # UnifiedIdeograph + unifiedideograph => 'UnifiedI', + + uppercase => 'Uppercas', + + # UppercaseLetter + uppercaseletter => 'Lu', + + # VariationSelector + variationselector => 'Variatio', + + # InVariationSelectors + variationselectors => 'InVariat', + + # InVariationSelectorsSupplement + variationselectorssupplement => 'InVaria2', + + # InVerticalForms + verticalforms => 'InVertic', + + # WhiteSpace + whitespace => 'WhiteSpa', + + yi => 'Yiii', + + # InYijingHexagramSymbols + yijinghexagramsymbols => 'InYijing', + + # InYiRadicals + yiradicals => 'InYiRadi', + + # InYiSyllables + yisyllables => 'InYiSyll', + +); +1 diff --git a/Master/tlpkg/tlperl.old/lib/unicore/CaseFolding.txt b/Master/tlpkg/tlperl.old/lib/unicore/CaseFolding.txt new file mode 100644 index 00000000000..f25d9bfed4d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/CaseFolding.txt @@ -0,0 +1,1064 @@ +# CaseFolding-4.1.0.txt +# Date: 2005-03-26, 00:24:43 GMT [MD] +# +# Unicode Character Database +# Copyright (c) 1991-2005 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html +# +# 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. +# +# All code points not listed in this file map to themselves. +# +# 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: +# +# <code>; <status>; <mapping>; # <name> +# +# 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. +# Note that the Turkic mappings do not maintain canonical equivalence without additional processing. +# See the discussions of case mapping in the Unicode Standard for more information. +# +# 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 +023B; C; 023C; # LATIN CAPITAL LETTER C WITH STROKE +023D; C; 019A; # LATIN CAPITAL LETTER L WITH BAR +0241; C; 0294; # LATIN CAPITAL LETTER GLOTTAL STOP +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 +03F4; C; 03B8; # GREEK CAPITAL THETA SYMBOL +03F5; C; 03B5; # GREEK LUNATE EPSILON SYMBOL +03F7; C; 03F8; # GREEK CAPITAL LETTER SHO +03F9; C; 03F2; # GREEK CAPITAL LUNATE SIGMA SYMBOL +03FA; C; 03FB; # GREEK CAPITAL LETTER SAN +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 +04F6; C; 04F7; # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +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 +10A0; C; 2D00; # GEORGIAN CAPITAL LETTER AN +10A1; C; 2D01; # GEORGIAN CAPITAL LETTER BAN +10A2; C; 2D02; # GEORGIAN CAPITAL LETTER GAN +10A3; C; 2D03; # GEORGIAN CAPITAL LETTER DON +10A4; C; 2D04; # GEORGIAN CAPITAL LETTER EN +10A5; C; 2D05; # GEORGIAN CAPITAL LETTER VIN +10A6; C; 2D06; # GEORGIAN CAPITAL LETTER ZEN +10A7; C; 2D07; # GEORGIAN CAPITAL LETTER TAN +10A8; C; 2D08; # GEORGIAN CAPITAL LETTER IN +10A9; C; 2D09; # GEORGIAN CAPITAL LETTER KAN +10AA; C; 2D0A; # GEORGIAN CAPITAL LETTER LAS +10AB; C; 2D0B; # GEORGIAN CAPITAL LETTER MAN +10AC; C; 2D0C; # GEORGIAN CAPITAL LETTER NAR +10AD; C; 2D0D; # GEORGIAN CAPITAL LETTER ON +10AE; C; 2D0E; # GEORGIAN CAPITAL LETTER PAR +10AF; C; 2D0F; # GEORGIAN CAPITAL LETTER ZHAR +10B0; C; 2D10; # GEORGIAN CAPITAL LETTER RAE +10B1; C; 2D11; # GEORGIAN CAPITAL LETTER SAN +10B2; C; 2D12; # GEORGIAN CAPITAL LETTER TAR +10B3; C; 2D13; # GEORGIAN CAPITAL LETTER UN +10B4; C; 2D14; # GEORGIAN CAPITAL LETTER PHAR +10B5; C; 2D15; # GEORGIAN CAPITAL LETTER KHAR +10B6; C; 2D16; # GEORGIAN CAPITAL LETTER GHAN +10B7; C; 2D17; # GEORGIAN CAPITAL LETTER QAR +10B8; C; 2D18; # GEORGIAN CAPITAL LETTER SHIN +10B9; C; 2D19; # GEORGIAN CAPITAL LETTER CHIN +10BA; C; 2D1A; # GEORGIAN CAPITAL LETTER CAN +10BB; C; 2D1B; # GEORGIAN CAPITAL LETTER JIL +10BC; C; 2D1C; # GEORGIAN CAPITAL LETTER CIL +10BD; C; 2D1D; # GEORGIAN CAPITAL LETTER CHAR +10BE; C; 2D1E; # GEORGIAN CAPITAL LETTER XAN +10BF; C; 2D1F; # GEORGIAN CAPITAL LETTER JHAN +10C0; C; 2D20; # GEORGIAN CAPITAL LETTER HAE +10C1; C; 2D21; # GEORGIAN CAPITAL LETTER HE +10C2; C; 2D22; # GEORGIAN CAPITAL LETTER HIE +10C3; C; 2D23; # GEORGIAN CAPITAL LETTER WE +10C4; C; 2D24; # GEORGIAN CAPITAL LETTER HAR +10C5; C; 2D25; # GEORGIAN CAPITAL LETTER HOE +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 +2C00; C; 2C30; # GLAGOLITIC CAPITAL LETTER AZU +2C01; C; 2C31; # GLAGOLITIC CAPITAL LETTER BUKY +2C02; C; 2C32; # GLAGOLITIC CAPITAL LETTER VEDE +2C03; C; 2C33; # GLAGOLITIC CAPITAL LETTER GLAGOLI +2C04; C; 2C34; # GLAGOLITIC CAPITAL LETTER DOBRO +2C05; C; 2C35; # GLAGOLITIC CAPITAL LETTER YESTU +2C06; C; 2C36; # GLAGOLITIC CAPITAL LETTER ZHIVETE +2C07; C; 2C37; # GLAGOLITIC CAPITAL LETTER DZELO +2C08; C; 2C38; # GLAGOLITIC CAPITAL LETTER ZEMLJA +2C09; C; 2C39; # GLAGOLITIC CAPITAL LETTER IZHE +2C0A; C; 2C3A; # GLAGOLITIC CAPITAL LETTER INITIAL IZHE +2C0B; C; 2C3B; # GLAGOLITIC CAPITAL LETTER I +2C0C; C; 2C3C; # GLAGOLITIC CAPITAL LETTER DJERVI +2C0D; C; 2C3D; # GLAGOLITIC CAPITAL LETTER KAKO +2C0E; C; 2C3E; # GLAGOLITIC CAPITAL LETTER LJUDIJE +2C0F; C; 2C3F; # GLAGOLITIC CAPITAL LETTER MYSLITE +2C10; C; 2C40; # GLAGOLITIC CAPITAL LETTER NASHI +2C11; C; 2C41; # GLAGOLITIC CAPITAL LETTER ONU +2C12; C; 2C42; # GLAGOLITIC CAPITAL LETTER POKOJI +2C13; C; 2C43; # GLAGOLITIC CAPITAL LETTER RITSI +2C14; C; 2C44; # GLAGOLITIC CAPITAL LETTER SLOVO +2C15; C; 2C45; # GLAGOLITIC CAPITAL LETTER TVRIDO +2C16; C; 2C46; # GLAGOLITIC CAPITAL LETTER UKU +2C17; C; 2C47; # GLAGOLITIC CAPITAL LETTER FRITU +2C18; C; 2C48; # GLAGOLITIC CAPITAL LETTER HERU +2C19; C; 2C49; # GLAGOLITIC CAPITAL LETTER OTU +2C1A; C; 2C4A; # GLAGOLITIC CAPITAL LETTER PE +2C1B; C; 2C4B; # GLAGOLITIC CAPITAL LETTER SHTA +2C1C; C; 2C4C; # GLAGOLITIC CAPITAL LETTER TSI +2C1D; C; 2C4D; # GLAGOLITIC CAPITAL LETTER CHRIVI +2C1E; C; 2C4E; # GLAGOLITIC CAPITAL LETTER SHA +2C1F; C; 2C4F; # GLAGOLITIC CAPITAL LETTER YERU +2C20; C; 2C50; # GLAGOLITIC CAPITAL LETTER YERI +2C21; C; 2C51; # GLAGOLITIC CAPITAL LETTER YATI +2C22; C; 2C52; # GLAGOLITIC CAPITAL LETTER SPIDERY HA +2C23; C; 2C53; # GLAGOLITIC CAPITAL LETTER YU +2C24; C; 2C54; # GLAGOLITIC CAPITAL LETTER SMALL YUS +2C25; C; 2C55; # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +2C26; C; 2C56; # GLAGOLITIC CAPITAL LETTER YO +2C27; C; 2C57; # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +2C28; C; 2C58; # GLAGOLITIC CAPITAL LETTER BIG YUS +2C29; C; 2C59; # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +2C2A; C; 2C5A; # GLAGOLITIC CAPITAL LETTER FITA +2C2B; C; 2C5B; # GLAGOLITIC CAPITAL LETTER IZHITSA +2C2C; C; 2C5C; # GLAGOLITIC CAPITAL LETTER SHTAPIC +2C2D; C; 2C5D; # GLAGOLITIC CAPITAL LETTER TROKUTASTI A +2C2E; C; 2C5E; # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C80; C; 2C81; # COPTIC CAPITAL LETTER ALFA +2C82; C; 2C83; # COPTIC CAPITAL LETTER VIDA +2C84; C; 2C85; # COPTIC CAPITAL LETTER GAMMA +2C86; C; 2C87; # COPTIC CAPITAL LETTER DALDA +2C88; C; 2C89; # COPTIC CAPITAL LETTER EIE +2C8A; C; 2C8B; # COPTIC CAPITAL LETTER SOU +2C8C; C; 2C8D; # COPTIC CAPITAL LETTER ZATA +2C8E; C; 2C8F; # COPTIC CAPITAL LETTER HATE +2C90; C; 2C91; # COPTIC CAPITAL LETTER THETHE +2C92; C; 2C93; # COPTIC CAPITAL LETTER IAUDA +2C94; C; 2C95; # COPTIC CAPITAL LETTER KAPA +2C96; C; 2C97; # COPTIC CAPITAL LETTER LAULA +2C98; C; 2C99; # COPTIC CAPITAL LETTER MI +2C9A; C; 2C9B; # COPTIC CAPITAL LETTER NI +2C9C; C; 2C9D; # COPTIC CAPITAL LETTER KSI +2C9E; C; 2C9F; # COPTIC CAPITAL LETTER O +2CA0; C; 2CA1; # COPTIC CAPITAL LETTER PI +2CA2; C; 2CA3; # COPTIC CAPITAL LETTER RO +2CA4; C; 2CA5; # COPTIC CAPITAL LETTER SIMA +2CA6; C; 2CA7; # COPTIC CAPITAL LETTER TAU +2CA8; C; 2CA9; # COPTIC CAPITAL LETTER UA +2CAA; C; 2CAB; # COPTIC CAPITAL LETTER FI +2CAC; C; 2CAD; # COPTIC CAPITAL LETTER KHI +2CAE; C; 2CAF; # COPTIC CAPITAL LETTER PSI +2CB0; C; 2CB1; # COPTIC CAPITAL LETTER OOU +2CB2; C; 2CB3; # COPTIC CAPITAL LETTER DIALECT-P ALEF +2CB4; C; 2CB5; # COPTIC CAPITAL LETTER OLD COPTIC AIN +2CB6; C; 2CB7; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +2CB8; C; 2CB9; # COPTIC CAPITAL LETTER DIALECT-P KAPA +2CBA; C; 2CBB; # COPTIC CAPITAL LETTER DIALECT-P NI +2CBC; C; 2CBD; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +2CBE; C; 2CBF; # COPTIC CAPITAL LETTER OLD COPTIC OOU +2CC0; C; 2CC1; # COPTIC CAPITAL LETTER SAMPI +2CC2; C; 2CC3; # COPTIC CAPITAL LETTER CROSSED SHEI +2CC4; C; 2CC5; # COPTIC CAPITAL LETTER OLD COPTIC SHEI +2CC6; C; 2CC7; # COPTIC CAPITAL LETTER OLD COPTIC ESH +2CC8; C; 2CC9; # COPTIC CAPITAL LETTER AKHMIMIC KHEI +2CCA; C; 2CCB; # COPTIC CAPITAL LETTER DIALECT-P HORI +2CCC; C; 2CCD; # COPTIC CAPITAL LETTER OLD COPTIC HORI +2CCE; C; 2CCF; # COPTIC CAPITAL LETTER OLD COPTIC HA +2CD0; C; 2CD1; # COPTIC CAPITAL LETTER L-SHAPED HA +2CD2; C; 2CD3; # COPTIC CAPITAL LETTER OLD COPTIC HEI +2CD4; C; 2CD5; # COPTIC CAPITAL LETTER OLD COPTIC HAT +2CD6; C; 2CD7; # COPTIC CAPITAL LETTER OLD COPTIC GANGIA +2CD8; C; 2CD9; # COPTIC CAPITAL LETTER OLD COPTIC DJA +2CDA; C; 2CDB; # COPTIC CAPITAL LETTER OLD COPTIC SHIMA +2CDC; C; 2CDD; # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +2CDE; C; 2CDF; # COPTIC CAPITAL LETTER OLD NUBIAN NGI +2CE0; C; 2CE1; # COPTIC CAPITAL LETTER OLD NUBIAN NYI +2CE2; C; 2CE3; # COPTIC CAPITAL LETTER OLD NUBIAN WAU +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 +10426; C; 1044E; # DESERET CAPITAL LETTER OI +10427; C; 1044F; # DESERET CAPITAL LETTER EW diff --git a/Master/tlpkg/tlperl.old/lib/unicore/CombiningClass.pl b/Master/tlpkg/tlperl.old/lib/unicore/CombiningClass.pl new file mode 100644 index 00000000000..7d4b8085c57 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/CombiningClass.pl @@ -0,0 +1,203 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +return <<'END'; +0300 0314 230 +0315 232 +0316 0319 220 +031A 232 +031B 216 +031C 0320 220 +0321 0322 202 +0323 0326 220 +0327 0328 202 +0329 0333 220 +0334 0338 1 +0339 033C 220 +033D 0344 230 +0345 240 +0346 230 +0347 0349 220 +034A 034C 230 +034D 034E 220 +0350 0352 230 +0353 0356 220 +0357 230 +0358 232 +0359 035A 220 +035B 230 +035C 233 +035D 035E 234 +035F 233 +0360 0361 234 +0362 233 +0363 036F 230 +0483 0486 230 +0591 220 +0592 0595 230 +0596 220 +0597 0599 230 +059A 222 +059B 220 +059C 05A1 230 +05A2 05A7 220 +05A8 05A9 230 +05AA 220 +05AB 05AC 230 +05AD 222 +05AE 228 +05AF 230 +05B0 10 +05B1 11 +05B2 12 +05B3 13 +05B4 14 +05B5 15 +05B6 16 +05B7 17 +05B8 18 +05B9 19 +05BB 20 +05BC 21 +05BD 22 +05BF 23 +05C1 24 +05C2 25 +05C4 230 +05C5 220 +05C7 18 +0610 0615 230 +064B 27 +064C 28 +064D 29 +064E 30 +064F 31 +0650 32 +0651 33 +0652 34 +0653 0654 230 +0655 0656 220 +0657 065B 230 +065C 220 +065D 065E 230 +0670 35 +06D6 06DC 230 +06DF 06E2 230 +06E3 220 +06E4 230 +06E7 06E8 230 +06EA 220 +06EB 06EC 230 +06ED 220 +0711 36 +0730 230 +0731 220 +0732 0733 230 +0734 220 +0735 0736 230 +0737 0739 220 +073A 230 +073B 073C 220 +073D 230 +073E 220 +073F 0741 230 +0742 220 +0743 230 +0744 220 +0745 230 +0746 220 +0747 230 +0748 220 +0749 074A 230 +093C 7 +094D 9 +0951 230 +0952 220 +0953 0954 230 +09BC 7 +09CD 9 +0A3C 7 +0A4D 9 +0ABC 7 +0ACD 9 +0B3C 7 +0B4D 9 +0BCD 9 +0C4D 9 +0C55 84 +0C56 91 +0CBC 7 +0CCD 9 +0D4D 9 +0DCA 9 +0E38 0E39 103 +0E3A 9 +0E48 0E4B 107 +0EB8 0EB9 118 +0EC8 0ECB 122 +0F18 0F19 220 +0F35 220 +0F37 220 +0F39 216 +0F71 129 +0F72 130 +0F74 132 +0F7A 0F7D 130 +0F80 130 +0F82 0F83 230 +0F84 9 +0F86 0F87 230 +0FC6 220 +1037 7 +1039 9 +135F 230 +1714 9 +1734 9 +17D2 9 +17DD 230 +18A9 228 +1939 222 +193A 230 +193B 220 +1A17 230 +1A18 220 +1DC0 1DC1 230 +1DC2 220 +1DC3 230 +20D0 20D1 230 +20D2 20D3 1 +20D4 20D7 230 +20D8 20DA 1 +20DB 20DC 230 +20E1 230 +20E5 20E6 1 +20E7 230 +20E8 220 +20E9 230 +20EA 20EB 1 +302A 218 +302B 228 +302C 232 +302D 222 +302E 302F 224 +3099 309A 8 +A806 9 +FB1E 26 +FE20 FE23 230 +10A0D 220 +10A0F 230 +10A38 230 +10A39 1 +10A3A 220 +10A3F 9 +1D165 1D166 216 +1D167 1D169 1 +1D16D 226 +1D16E 1D172 216 +1D17B 1D182 220 +1D185 1D189 230 +1D18A 1D18B 220 +1D1AA 1D1AD 230 +1D242 1D244 230 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/CompositionExclusions.txt b/Master/tlpkg/tlperl.old/lib/unicore/CompositionExclusions.txt new file mode 100644 index 00000000000..f20528b091e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/CompositionExclusions.txt @@ -0,0 +1,179 @@ +# CompositionExclusions-4.1.0.txt +# Date: 2005-03-17, 15:21:00 PST [KW] +# +# This file lists the characters from the UAX #15 Composition Exclusion Table. +# +# This file is a normative contributory data file in the +# Unicode Character Database. +# +# Copyright (c) 1991-2005 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# 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 +# FA70..FAD9 [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +# 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/Master/tlpkg/tlperl.old/lib/unicore/Decomposition.pl b/Master/tlpkg/tlperl.old/lib/unicore/Decomposition.pl new file mode 100644 index 00000000000..ba6b304c15e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/Decomposition.pl @@ -0,0 +1,5366 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +return <<'END'; +00A0 <noBreak> 0020 +00A8 <compat> 0020 0308 +00AA <super> 0061 +00AF <compat> 0020 0304 +00B2 <super> 0032 +00B3 <super> 0033 +00B4 <compat> 0020 0301 +00B5 <compat> 03BC +00B8 <compat> 0020 0327 +00B9 <super> 0031 +00BA <super> 006F +00BC <fraction> 0031 2044 0034 +00BD <fraction> 0031 2044 0032 +00BE <fraction> 0033 2044 0034 +00C0 0041 0300 +00C1 0041 0301 +00C2 0041 0302 +00C3 0041 0303 +00C4 0041 0308 +00C5 0041 030A +00C7 0043 0327 +00C8 0045 0300 +00C9 0045 0301 +00CA 0045 0302 +00CB 0045 0308 +00CC 0049 0300 +00CD 0049 0301 +00CE 0049 0302 +00CF 0049 0308 +00D1 004E 0303 +00D2 004F 0300 +00D3 004F 0301 +00D4 004F 0302 +00D5 004F 0303 +00D6 004F 0308 +00D9 0055 0300 +00DA 0055 0301 +00DB 0055 0302 +00DC 0055 0308 +00DD 0059 0301 +00E0 0061 0300 +00E1 0061 0301 +00E2 0061 0302 +00E3 0061 0303 +00E4 0061 0308 +00E5 0061 030A +00E7 0063 0327 +00E8 0065 0300 +00E9 0065 0301 +00EA 0065 0302 +00EB 0065 0308 +00EC 0069 0300 +00ED 0069 0301 +00EE 0069 0302 +00EF 0069 0308 +00F1 006E 0303 +00F2 006F 0300 +00F3 006F 0301 +00F4 006F 0302 +00F5 006F 0303 +00F6 006F 0308 +00F9 0075 0300 +00FA 0075 0301 +00FB 0075 0302 +00FC 0075 0308 +00FD 0079 0301 +00FF 0079 0308 +0100 0041 0304 +0101 0061 0304 +0102 0041 0306 +0103 0061 0306 +0104 0041 0328 +0105 0061 0328 +0106 0043 0301 +0107 0063 0301 +0108 0043 0302 +0109 0063 0302 +010A 0043 0307 +010B 0063 0307 +010C 0043 030C +010D 0063 030C +010E 0044 030C +010F 0064 030C +0112 0045 0304 +0113 0065 0304 +0114 0045 0306 +0115 0065 0306 +0116 0045 0307 +0117 0065 0307 +0118 0045 0328 +0119 0065 0328 +011A 0045 030C +011B 0065 030C +011C 0047 0302 +011D 0067 0302 +011E 0047 0306 +011F 0067 0306 +0120 0047 0307 +0121 0067 0307 +0122 0047 0327 +0123 0067 0327 +0124 0048 0302 +0125 0068 0302 +0128 0049 0303 +0129 0069 0303 +012A 0049 0304 +012B 0069 0304 +012C 0049 0306 +012D 0069 0306 +012E 0049 0328 +012F 0069 0328 +0130 0049 0307 +0132 <compat> 0049 004A +0133 <compat> 0069 006A +0134 004A 0302 +0135 006A 0302 +0136 004B 0327 +0137 006B 0327 +0139 004C 0301 +013A 006C 0301 +013B 004C 0327 +013C 006C 0327 +013D 004C 030C +013E 006C 030C +013F <compat> 004C 00B7 +0140 <compat> 006C 00B7 +0143 004E 0301 +0144 006E 0301 +0145 004E 0327 +0146 006E 0327 +0147 004E 030C +0148 006E 030C +0149 <compat> 02BC 006E +014C 004F 0304 +014D 006F 0304 +014E 004F 0306 +014F 006F 0306 +0150 004F 030B +0151 006F 030B +0154 0052 0301 +0155 0072 0301 +0156 0052 0327 +0157 0072 0327 +0158 0052 030C +0159 0072 030C +015A 0053 0301 +015B 0073 0301 +015C 0053 0302 +015D 0073 0302 +015E 0053 0327 +015F 0073 0327 +0160 0053 030C +0161 0073 030C +0162 0054 0327 +0163 0074 0327 +0164 0054 030C +0165 0074 030C +0168 0055 0303 +0169 0075 0303 +016A 0055 0304 +016B 0075 0304 +016C 0055 0306 +016D 0075 0306 +016E 0055 030A +016F 0075 030A +0170 0055 030B +0171 0075 030B +0172 0055 0328 +0173 0075 0328 +0174 0057 0302 +0175 0077 0302 +0176 0059 0302 +0177 0079 0302 +0178 0059 0308 +0179 005A 0301 +017A 007A 0301 +017B 005A 0307 +017C 007A 0307 +017D 005A 030C +017E 007A 030C +017F <compat> 0073 +01A0 004F 031B +01A1 006F 031B +01AF 0055 031B +01B0 0075 031B +01C4 <compat> 0044 017D +01C5 <compat> 0044 017E +01C6 <compat> 0064 017E +01C7 <compat> 004C 004A +01C8 <compat> 004C 006A +01C9 <compat> 006C 006A +01CA <compat> 004E 004A +01CB <compat> 004E 006A +01CC <compat> 006E 006A +01CD 0041 030C +01CE 0061 030C +01CF 0049 030C +01D0 0069 030C +01D1 004F 030C +01D2 006F 030C +01D3 0055 030C +01D4 0075 030C +01D5 00DC 0304 +01D6 00FC 0304 +01D7 00DC 0301 +01D8 00FC 0301 +01D9 00DC 030C +01DA 00FC 030C +01DB 00DC 0300 +01DC 00FC 0300 +01DE 00C4 0304 +01DF 00E4 0304 +01E0 0226 0304 +01E1 0227 0304 +01E2 00C6 0304 +01E3 00E6 0304 +01E6 0047 030C +01E7 0067 030C +01E8 004B 030C +01E9 006B 030C +01EA 004F 0328 +01EB 006F 0328 +01EC 01EA 0304 +01ED 01EB 0304 +01EE 01B7 030C +01EF 0292 030C +01F0 006A 030C +01F1 <compat> 0044 005A +01F2 <compat> 0044 007A +01F3 <compat> 0064 007A +01F4 0047 0301 +01F5 0067 0301 +01F8 004E 0300 +01F9 006E 0300 +01FA 00C5 0301 +01FB 00E5 0301 +01FC 00C6 0301 +01FD 00E6 0301 +01FE 00D8 0301 +01FF 00F8 0301 +0200 0041 030F +0201 0061 030F +0202 0041 0311 +0203 0061 0311 +0204 0045 030F +0205 0065 030F +0206 0045 0311 +0207 0065 0311 +0208 0049 030F +0209 0069 030F +020A 0049 0311 +020B 0069 0311 +020C 004F 030F +020D 006F 030F +020E 004F 0311 +020F 006F 0311 +0210 0052 030F +0211 0072 030F +0212 0052 0311 +0213 0072 0311 +0214 0055 030F +0215 0075 030F +0216 0055 0311 +0217 0075 0311 +0218 0053 0326 +0219 0073 0326 +021A 0054 0326 +021B 0074 0326 +021E 0048 030C +021F 0068 030C +0226 0041 0307 +0227 0061 0307 +0228 0045 0327 +0229 0065 0327 +022A 00D6 0304 +022B 00F6 0304 +022C 00D5 0304 +022D 00F5 0304 +022E 004F 0307 +022F 006F 0307 +0230 022E 0304 +0231 022F 0304 +0232 0059 0304 +0233 0079 0304 +02B0 <super> 0068 +02B1 <super> 0266 +02B2 <super> 006A +02B3 <super> 0072 +02B4 <super> 0279 +02B5 <super> 027B +02B6 <super> 0281 +02B7 <super> 0077 +02B8 <super> 0079 +02D8 <compat> 0020 0306 +02D9 <compat> 0020 0307 +02DA <compat> 0020 030A +02DB <compat> 0020 0328 +02DC <compat> 0020 0303 +02DD <compat> 0020 030B +02E0 <super> 0263 +02E1 <super> 006C +02E2 <super> 0073 +02E3 <super> 0078 +02E4 <super> 0295 +0340 0300 +0341 0301 +0343 0313 +0344 0308 0301 +0374 02B9 +037A <compat> 0020 0345 +037E 003B +0384 <compat> 0020 0301 +0385 00A8 0301 +0386 0391 0301 +0387 00B7 +0388 0395 0301 +0389 0397 0301 +038A 0399 0301 +038C 039F 0301 +038E 03A5 0301 +038F 03A9 0301 +0390 03CA 0301 +03AA 0399 0308 +03AB 03A5 0308 +03AC 03B1 0301 +03AD 03B5 0301 +03AE 03B7 0301 +03AF 03B9 0301 +03B0 03CB 0301 +03CA 03B9 0308 +03CB 03C5 0308 +03CC 03BF 0301 +03CD 03C5 0301 +03CE 03C9 0301 +03D0 <compat> 03B2 +03D1 <compat> 03B8 +03D2 <compat> 03A5 +03D3 03D2 0301 +03D4 03D2 0308 +03D5 <compat> 03C6 +03D6 <compat> 03C0 +03F0 <compat> 03BA +03F1 <compat> 03C1 +03F2 <compat> 03C2 +03F4 <compat> 0398 +03F5 <compat> 03B5 +03F9 <compat> 03A3 +0400 0415 0300 +0401 0415 0308 +0403 0413 0301 +0407 0406 0308 +040C 041A 0301 +040D 0418 0300 +040E 0423 0306 +0419 0418 0306 +0439 0438 0306 +0450 0435 0300 +0451 0435 0308 +0453 0433 0301 +0457 0456 0308 +045C 043A 0301 +045D 0438 0300 +045E 0443 0306 +0476 0474 030F +0477 0475 030F +04C1 0416 0306 +04C2 0436 0306 +04D0 0410 0306 +04D1 0430 0306 +04D2 0410 0308 +04D3 0430 0308 +04D6 0415 0306 +04D7 0435 0306 +04DA 04D8 0308 +04DB 04D9 0308 +04DC 0416 0308 +04DD 0436 0308 +04DE 0417 0308 +04DF 0437 0308 +04E2 0418 0304 +04E3 0438 0304 +04E4 0418 0308 +04E5 0438 0308 +04E6 041E 0308 +04E7 043E 0308 +04EA 04E8 0308 +04EB 04E9 0308 +04EC 042D 0308 +04ED 044D 0308 +04EE 0423 0304 +04EF 0443 0304 +04F0 0423 0308 +04F1 0443 0308 +04F2 0423 030B +04F3 0443 030B +04F4 0427 0308 +04F5 0447 0308 +04F8 042B 0308 +04F9 044B 0308 +0587 <compat> 0565 0582 +0622 0627 0653 +0623 0627 0654 +0624 0648 0654 +0625 0627 0655 +0626 064A 0654 +0675 <compat> 0627 0674 +0676 <compat> 0648 0674 +0677 <compat> 06C7 0674 +0678 <compat> 064A 0674 +06C0 06D5 0654 +06C2 06C1 0654 +06D3 06D2 0654 +0929 0928 093C +0931 0930 093C +0934 0933 093C +0958 0915 093C +0959 0916 093C +095A 0917 093C +095B 091C 093C +095C 0921 093C +095D 0922 093C +095E 092B 093C +095F 092F 093C +09CB 09C7 09BE +09CC 09C7 09D7 +09DC 09A1 09BC +09DD 09A2 09BC +09DF 09AF 09BC +0A33 0A32 0A3C +0A36 0A38 0A3C +0A59 0A16 0A3C +0A5A 0A17 0A3C +0A5B 0A1C 0A3C +0A5E 0A2B 0A3C +0B48 0B47 0B56 +0B4B 0B47 0B3E +0B4C 0B47 0B57 +0B5C 0B21 0B3C +0B5D 0B22 0B3C +0B94 0B92 0BD7 +0BCA 0BC6 0BBE +0BCB 0BC7 0BBE +0BCC 0BC6 0BD7 +0C48 0C46 0C56 +0CC0 0CBF 0CD5 +0CC7 0CC6 0CD5 +0CC8 0CC6 0CD6 +0CCA 0CC6 0CC2 +0CCB 0CCA 0CD5 +0D4A 0D46 0D3E +0D4B 0D47 0D3E +0D4C 0D46 0D57 +0DDA 0DD9 0DCA +0DDC 0DD9 0DCF +0DDD 0DDC 0DCA +0DDE 0DD9 0DDF +0E33 <compat> 0E4D 0E32 +0EB3 <compat> 0ECD 0EB2 +0EDC <compat> 0EAB 0E99 +0EDD <compat> 0EAB 0EA1 +0F0C <noBreak> 0F0B +0F43 0F42 0FB7 +0F4D 0F4C 0FB7 +0F52 0F51 0FB7 +0F57 0F56 0FB7 +0F5C 0F5B 0FB7 +0F69 0F40 0FB5 +0F73 0F71 0F72 +0F75 0F71 0F74 +0F76 0FB2 0F80 +0F77 <compat> 0FB2 0F81 +0F78 0FB3 0F80 +0F79 <compat> 0FB3 0F81 +0F81 0F71 0F80 +0F93 0F92 0FB7 +0F9D 0F9C 0FB7 +0FA2 0FA1 0FB7 +0FA7 0FA6 0FB7 +0FAC 0FAB 0FB7 +0FB9 0F90 0FB5 +1026 1025 102E +10FC <super> 10DC +1D2C <super> 0041 +1D2D <super> 00C6 +1D2E <super> 0042 +1D30 <super> 0044 +1D31 <super> 0045 +1D32 <super> 018E +1D33 <super> 0047 +1D34 <super> 0048 +1D35 <super> 0049 +1D36 <super> 004A +1D37 <super> 004B +1D38 <super> 004C +1D39 <super> 004D +1D3A <super> 004E +1D3C <super> 004F +1D3D <super> 0222 +1D3E <super> 0050 +1D3F <super> 0052 +1D40 <super> 0054 +1D41 <super> 0055 +1D42 <super> 0057 +1D43 <super> 0061 +1D44 <super> 0250 +1D45 <super> 0251 +1D46 <super> 1D02 +1D47 <super> 0062 +1D48 <super> 0064 +1D49 <super> 0065 +1D4A <super> 0259 +1D4B <super> 025B +1D4C <super> 025C +1D4D <super> 0067 +1D4F <super> 006B +1D50 <super> 006D +1D51 <super> 014B +1D52 <super> 006F +1D53 <super> 0254 +1D54 <super> 1D16 +1D55 <super> 1D17 +1D56 <super> 0070 +1D57 <super> 0074 +1D58 <super> 0075 +1D59 <super> 1D1D +1D5A <super> 026F +1D5B <super> 0076 +1D5C <super> 1D25 +1D5D <super> 03B2 +1D5E <super> 03B3 +1D5F <super> 03B4 +1D60 <super> 03C6 +1D61 <super> 03C7 +1D62 <sub> 0069 +1D63 <sub> 0072 +1D64 <sub> 0075 +1D65 <sub> 0076 +1D66 <sub> 03B2 +1D67 <sub> 03B3 +1D68 <sub> 03C1 +1D69 <sub> 03C6 +1D6A <sub> 03C7 +1D78 <super> 043D +1D9B <super> 0252 +1D9C <super> 0063 +1D9D <super> 0255 +1D9E <super> 00F0 +1D9F <super> 025C +1DA0 <super> 0066 +1DA1 <super> 025F +1DA2 <super> 0261 +1DA3 <super> 0265 +1DA4 <super> 0268 +1DA5 <super> 0269 +1DA6 <super> 026A +1DA7 <super> 1D7B +1DA8 <super> 029D +1DA9 <super> 026D +1DAA <super> 1D85 +1DAB <super> 029F +1DAC <super> 0271 +1DAD <super> 0270 +1DAE <super> 0272 +1DAF <super> 0273 +1DB0 <super> 0274 +1DB1 <super> 0275 +1DB2 <super> 0278 +1DB3 <super> 0282 +1DB4 <super> 0283 +1DB5 <super> 01AB +1DB6 <super> 0289 +1DB7 <super> 028A +1DB8 <super> 1D1C +1DB9 <super> 028B +1DBA <super> 028C +1DBB <super> 007A +1DBC <super> 0290 +1DBD <super> 0291 +1DBE <super> 0292 +1DBF <super> 03B8 +1E00 0041 0325 +1E01 0061 0325 +1E02 0042 0307 +1E03 0062 0307 +1E04 0042 0323 +1E05 0062 0323 +1E06 0042 0331 +1E07 0062 0331 +1E08 00C7 0301 +1E09 00E7 0301 +1E0A 0044 0307 +1E0B 0064 0307 +1E0C 0044 0323 +1E0D 0064 0323 +1E0E 0044 0331 +1E0F 0064 0331 +1E10 0044 0327 +1E11 0064 0327 +1E12 0044 032D +1E13 0064 032D +1E14 0112 0300 +1E15 0113 0300 +1E16 0112 0301 +1E17 0113 0301 +1E18 0045 032D +1E19 0065 032D +1E1A 0045 0330 +1E1B 0065 0330 +1E1C 0228 0306 +1E1D 0229 0306 +1E1E 0046 0307 +1E1F 0066 0307 +1E20 0047 0304 +1E21 0067 0304 +1E22 0048 0307 +1E23 0068 0307 +1E24 0048 0323 +1E25 0068 0323 +1E26 0048 0308 +1E27 0068 0308 +1E28 0048 0327 +1E29 0068 0327 +1E2A 0048 032E +1E2B 0068 032E +1E2C 0049 0330 +1E2D 0069 0330 +1E2E 00CF 0301 +1E2F 00EF 0301 +1E30 004B 0301 +1E31 006B 0301 +1E32 004B 0323 +1E33 006B 0323 +1E34 004B 0331 +1E35 006B 0331 +1E36 004C 0323 +1E37 006C 0323 +1E38 1E36 0304 +1E39 1E37 0304 +1E3A 004C 0331 +1E3B 006C 0331 +1E3C 004C 032D +1E3D 006C 032D +1E3E 004D 0301 +1E3F 006D 0301 +1E40 004D 0307 +1E41 006D 0307 +1E42 004D 0323 +1E43 006D 0323 +1E44 004E 0307 +1E45 006E 0307 +1E46 004E 0323 +1E47 006E 0323 +1E48 004E 0331 +1E49 006E 0331 +1E4A 004E 032D +1E4B 006E 032D +1E4C 00D5 0301 +1E4D 00F5 0301 +1E4E 00D5 0308 +1E4F 00F5 0308 +1E50 014C 0300 +1E51 014D 0300 +1E52 014C 0301 +1E53 014D 0301 +1E54 0050 0301 +1E55 0070 0301 +1E56 0050 0307 +1E57 0070 0307 +1E58 0052 0307 +1E59 0072 0307 +1E5A 0052 0323 +1E5B 0072 0323 +1E5C 1E5A 0304 +1E5D 1E5B 0304 +1E5E 0052 0331 +1E5F 0072 0331 +1E60 0053 0307 +1E61 0073 0307 +1E62 0053 0323 +1E63 0073 0323 +1E64 015A 0307 +1E65 015B 0307 +1E66 0160 0307 +1E67 0161 0307 +1E68 1E62 0307 +1E69 1E63 0307 +1E6A 0054 0307 +1E6B 0074 0307 +1E6C 0054 0323 +1E6D 0074 0323 +1E6E 0054 0331 +1E6F 0074 0331 +1E70 0054 032D +1E71 0074 032D +1E72 0055 0324 +1E73 0075 0324 +1E74 0055 0330 +1E75 0075 0330 +1E76 0055 032D +1E77 0075 032D +1E78 0168 0301 +1E79 0169 0301 +1E7A 016A 0308 +1E7B 016B 0308 +1E7C 0056 0303 +1E7D 0076 0303 +1E7E 0056 0323 +1E7F 0076 0323 +1E80 0057 0300 +1E81 0077 0300 +1E82 0057 0301 +1E83 0077 0301 +1E84 0057 0308 +1E85 0077 0308 +1E86 0057 0307 +1E87 0077 0307 +1E88 0057 0323 +1E89 0077 0323 +1E8A 0058 0307 +1E8B 0078 0307 +1E8C 0058 0308 +1E8D 0078 0308 +1E8E 0059 0307 +1E8F 0079 0307 +1E90 005A 0302 +1E91 007A 0302 +1E92 005A 0323 +1E93 007A 0323 +1E94 005A 0331 +1E95 007A 0331 +1E96 0068 0331 +1E97 0074 0308 +1E98 0077 030A +1E99 0079 030A +1E9A <compat> 0061 02BE +1E9B 017F 0307 +1EA0 0041 0323 +1EA1 0061 0323 +1EA2 0041 0309 +1EA3 0061 0309 +1EA4 00C2 0301 +1EA5 00E2 0301 +1EA6 00C2 0300 +1EA7 00E2 0300 +1EA8 00C2 0309 +1EA9 00E2 0309 +1EAA 00C2 0303 +1EAB 00E2 0303 +1EAC 1EA0 0302 +1EAD 1EA1 0302 +1EAE 0102 0301 +1EAF 0103 0301 +1EB0 0102 0300 +1EB1 0103 0300 +1EB2 0102 0309 +1EB3 0103 0309 +1EB4 0102 0303 +1EB5 0103 0303 +1EB6 1EA0 0306 +1EB7 1EA1 0306 +1EB8 0045 0323 +1EB9 0065 0323 +1EBA 0045 0309 +1EBB 0065 0309 +1EBC 0045 0303 +1EBD 0065 0303 +1EBE 00CA 0301 +1EBF 00EA 0301 +1EC0 00CA 0300 +1EC1 00EA 0300 +1EC2 00CA 0309 +1EC3 00EA 0309 +1EC4 00CA 0303 +1EC5 00EA 0303 +1EC6 1EB8 0302 +1EC7 1EB9 0302 +1EC8 0049 0309 +1EC9 0069 0309 +1ECA 0049 0323 +1ECB 0069 0323 +1ECC 004F 0323 +1ECD 006F 0323 +1ECE 004F 0309 +1ECF 006F 0309 +1ED0 00D4 0301 +1ED1 00F4 0301 +1ED2 00D4 0300 +1ED3 00F4 0300 +1ED4 00D4 0309 +1ED5 00F4 0309 +1ED6 00D4 0303 +1ED7 00F4 0303 +1ED8 1ECC 0302 +1ED9 1ECD 0302 +1EDA 01A0 0301 +1EDB 01A1 0301 +1EDC 01A0 0300 +1EDD 01A1 0300 +1EDE 01A0 0309 +1EDF 01A1 0309 +1EE0 01A0 0303 +1EE1 01A1 0303 +1EE2 01A0 0323 +1EE3 01A1 0323 +1EE4 0055 0323 +1EE5 0075 0323 +1EE6 0055 0309 +1EE7 0075 0309 +1EE8 01AF 0301 +1EE9 01B0 0301 +1EEA 01AF 0300 +1EEB 01B0 0300 +1EEC 01AF 0309 +1EED 01B0 0309 +1EEE 01AF 0303 +1EEF 01B0 0303 +1EF0 01AF 0323 +1EF1 01B0 0323 +1EF2 0059 0300 +1EF3 0079 0300 +1EF4 0059 0323 +1EF5 0079 0323 +1EF6 0059 0309 +1EF7 0079 0309 +1EF8 0059 0303 +1EF9 0079 0303 +1F00 03B1 0313 +1F01 03B1 0314 +1F02 1F00 0300 +1F03 1F01 0300 +1F04 1F00 0301 +1F05 1F01 0301 +1F06 1F00 0342 +1F07 1F01 0342 +1F08 0391 0313 +1F09 0391 0314 +1F0A 1F08 0300 +1F0B 1F09 0300 +1F0C 1F08 0301 +1F0D 1F09 0301 +1F0E 1F08 0342 +1F0F 1F09 0342 +1F10 03B5 0313 +1F11 03B5 0314 +1F12 1F10 0300 +1F13 1F11 0300 +1F14 1F10 0301 +1F15 1F11 0301 +1F18 0395 0313 +1F19 0395 0314 +1F1A 1F18 0300 +1F1B 1F19 0300 +1F1C 1F18 0301 +1F1D 1F19 0301 +1F20 03B7 0313 +1F21 03B7 0314 +1F22 1F20 0300 +1F23 1F21 0300 +1F24 1F20 0301 +1F25 1F21 0301 +1F26 1F20 0342 +1F27 1F21 0342 +1F28 0397 0313 +1F29 0397 0314 +1F2A 1F28 0300 +1F2B 1F29 0300 +1F2C 1F28 0301 +1F2D 1F29 0301 +1F2E 1F28 0342 +1F2F 1F29 0342 +1F30 03B9 0313 +1F31 03B9 0314 +1F32 1F30 0300 +1F33 1F31 0300 +1F34 1F30 0301 +1F35 1F31 0301 +1F36 1F30 0342 +1F37 1F31 0342 +1F38 0399 0313 +1F39 0399 0314 +1F3A 1F38 0300 +1F3B 1F39 0300 +1F3C 1F38 0301 +1F3D 1F39 0301 +1F3E 1F38 0342 +1F3F 1F39 0342 +1F40 03BF 0313 +1F41 03BF 0314 +1F42 1F40 0300 +1F43 1F41 0300 +1F44 1F40 0301 +1F45 1F41 0301 +1F48 039F 0313 +1F49 039F 0314 +1F4A 1F48 0300 +1F4B 1F49 0300 +1F4C 1F48 0301 +1F4D 1F49 0301 +1F50 03C5 0313 +1F51 03C5 0314 +1F52 1F50 0300 +1F53 1F51 0300 +1F54 1F50 0301 +1F55 1F51 0301 +1F56 1F50 0342 +1F57 1F51 0342 +1F59 03A5 0314 +1F5B 1F59 0300 +1F5D 1F59 0301 +1F5F 1F59 0342 +1F60 03C9 0313 +1F61 03C9 0314 +1F62 1F60 0300 +1F63 1F61 0300 +1F64 1F60 0301 +1F65 1F61 0301 +1F66 1F60 0342 +1F67 1F61 0342 +1F68 03A9 0313 +1F69 03A9 0314 +1F6A 1F68 0300 +1F6B 1F69 0300 +1F6C 1F68 0301 +1F6D 1F69 0301 +1F6E 1F68 0342 +1F6F 1F69 0342 +1F70 03B1 0300 +1F71 03AC +1F72 03B5 0300 +1F73 03AD +1F74 03B7 0300 +1F75 03AE +1F76 03B9 0300 +1F77 03AF +1F78 03BF 0300 +1F79 03CC +1F7A 03C5 0300 +1F7B 03CD +1F7C 03C9 0300 +1F7D 03CE +1F80 1F00 0345 +1F81 1F01 0345 +1F82 1F02 0345 +1F83 1F03 0345 +1F84 1F04 0345 +1F85 1F05 0345 +1F86 1F06 0345 +1F87 1F07 0345 +1F88 1F08 0345 +1F89 1F09 0345 +1F8A 1F0A 0345 +1F8B 1F0B 0345 +1F8C 1F0C 0345 +1F8D 1F0D 0345 +1F8E 1F0E 0345 +1F8F 1F0F 0345 +1F90 1F20 0345 +1F91 1F21 0345 +1F92 1F22 0345 +1F93 1F23 0345 +1F94 1F24 0345 +1F95 1F25 0345 +1F96 1F26 0345 +1F97 1F27 0345 +1F98 1F28 0345 +1F99 1F29 0345 +1F9A 1F2A 0345 +1F9B 1F2B 0345 +1F9C 1F2C 0345 +1F9D 1F2D 0345 +1F9E 1F2E 0345 +1F9F 1F2F 0345 +1FA0 1F60 0345 +1FA1 1F61 0345 +1FA2 1F62 0345 +1FA3 1F63 0345 +1FA4 1F64 0345 +1FA5 1F65 0345 +1FA6 1F66 0345 +1FA7 1F67 0345 +1FA8 1F68 0345 +1FA9 1F69 0345 +1FAA 1F6A 0345 +1FAB 1F6B 0345 +1FAC 1F6C 0345 +1FAD 1F6D 0345 +1FAE 1F6E 0345 +1FAF 1F6F 0345 +1FB0 03B1 0306 +1FB1 03B1 0304 +1FB2 1F70 0345 +1FB3 03B1 0345 +1FB4 03AC 0345 +1FB6 03B1 0342 +1FB7 1FB6 0345 +1FB8 0391 0306 +1FB9 0391 0304 +1FBA 0391 0300 +1FBB 0386 +1FBC 0391 0345 +1FBD <compat> 0020 0313 +1FBE 03B9 +1FBF <compat> 0020 0313 +1FC0 <compat> 0020 0342 +1FC1 00A8 0342 +1FC2 1F74 0345 +1FC3 03B7 0345 +1FC4 03AE 0345 +1FC6 03B7 0342 +1FC7 1FC6 0345 +1FC8 0395 0300 +1FC9 0388 +1FCA 0397 0300 +1FCB 0389 +1FCC 0397 0345 +1FCD 1FBF 0300 +1FCE 1FBF 0301 +1FCF 1FBF 0342 +1FD0 03B9 0306 +1FD1 03B9 0304 +1FD2 03CA 0300 +1FD3 0390 +1FD6 03B9 0342 +1FD7 03CA 0342 +1FD8 0399 0306 +1FD9 0399 0304 +1FDA 0399 0300 +1FDB 038A +1FDD 1FFE 0300 +1FDE 1FFE 0301 +1FDF 1FFE 0342 +1FE0 03C5 0306 +1FE1 03C5 0304 +1FE2 03CB 0300 +1FE3 03B0 +1FE4 03C1 0313 +1FE5 03C1 0314 +1FE6 03C5 0342 +1FE7 03CB 0342 +1FE8 03A5 0306 +1FE9 03A5 0304 +1FEA 03A5 0300 +1FEB 038E +1FEC 03A1 0314 +1FED 00A8 0300 +1FEE 0385 +1FEF 0060 +1FF2 1F7C 0345 +1FF3 03C9 0345 +1FF4 03CE 0345 +1FF6 03C9 0342 +1FF7 1FF6 0345 +1FF8 039F 0300 +1FF9 038C +1FFA 03A9 0300 +1FFB 038F +1FFC 03A9 0345 +1FFD 00B4 +1FFE <compat> 0020 0314 +2000 2002 +2001 2003 +2002 2006 <compat> 0020 +2007 <noBreak> 0020 +2008 200A <compat> 0020 +2011 <noBreak> 2010 +2017 <compat> 0020 0333 +2024 <compat> 002E +2025 <compat> 002E 002E +2026 <compat> 002E 002E 002E +202F <noBreak> 0020 +2033 <compat> 2032 2032 +2034 <compat> 2032 2032 2032 +2036 <compat> 2035 2035 +2037 <compat> 2035 2035 2035 +203C <compat> 0021 0021 +203E <compat> 0020 0305 +2047 <compat> 003F 003F +2048 <compat> 003F 0021 +2049 <compat> 0021 003F +2057 <compat> 2032 2032 2032 2032 +205F <compat> 0020 +2070 <super> 0030 +2071 <super> 0069 +2074 <super> 0034 +2075 <super> 0035 +2076 <super> 0036 +2077 <super> 0037 +2078 <super> 0038 +2079 <super> 0039 +207A <super> 002B +207B <super> 2212 +207C <super> 003D +207D <super> 0028 +207E <super> 0029 +207F <super> 006E +2080 <sub> 0030 +2081 <sub> 0031 +2082 <sub> 0032 +2083 <sub> 0033 +2084 <sub> 0034 +2085 <sub> 0035 +2086 <sub> 0036 +2087 <sub> 0037 +2088 <sub> 0038 +2089 <sub> 0039 +208A <sub> 002B +208B <sub> 2212 +208C <sub> 003D +208D <sub> 0028 +208E <sub> 0029 +2090 <sub> 0061 +2091 <sub> 0065 +2092 <sub> 006F +2093 <sub> 0078 +2094 <sub> 0259 +20A8 <compat> 0052 0073 +2100 <compat> 0061 002F 0063 +2101 <compat> 0061 002F 0073 +2102 <font> 0043 +2103 <compat> 00B0 0043 +2105 <compat> 0063 002F 006F +2106 <compat> 0063 002F 0075 +2107 <compat> 0190 +2109 <compat> 00B0 0046 +210A <font> 0067 +210B 210D <font> 0048 +210E <font> 0068 +210F <font> 0127 +2110 2111 <font> 0049 +2112 <font> 004C +2113 <font> 006C +2115 <font> 004E +2116 <compat> 004E 006F +2119 <font> 0050 +211A <font> 0051 +211B 211D <font> 0052 +2120 <super> 0053 004D +2121 <compat> 0054 0045 004C +2122 <super> 0054 004D +2124 <font> 005A +2126 03A9 +2128 <font> 005A +212A 004B +212B 00C5 +212C <font> 0042 +212D <font> 0043 +212F <font> 0065 +2130 <font> 0045 +2131 <font> 0046 +2133 <font> 004D +2134 <font> 006F +2135 <compat> 05D0 +2136 <compat> 05D1 +2137 <compat> 05D2 +2138 <compat> 05D3 +2139 <font> 0069 +213B <compat> 0046 0041 0058 +213C <font> 03C0 +213D <font> 03B3 +213E <font> 0393 +213F <font> 03A0 +2140 <font> 2211 +2145 <font> 0044 +2146 <font> 0064 +2147 <font> 0065 +2148 <font> 0069 +2149 <font> 006A +2153 <fraction> 0031 2044 0033 +2154 <fraction> 0032 2044 0033 +2155 <fraction> 0031 2044 0035 +2156 <fraction> 0032 2044 0035 +2157 <fraction> 0033 2044 0035 +2158 <fraction> 0034 2044 0035 +2159 <fraction> 0031 2044 0036 +215A <fraction> 0035 2044 0036 +215B <fraction> 0031 2044 0038 +215C <fraction> 0033 2044 0038 +215D <fraction> 0035 2044 0038 +215E <fraction> 0037 2044 0038 +215F <fraction> 0031 2044 +2160 <compat> 0049 +2161 <compat> 0049 0049 +2162 <compat> 0049 0049 0049 +2163 <compat> 0049 0056 +2164 <compat> 0056 +2165 <compat> 0056 0049 +2166 <compat> 0056 0049 0049 +2167 <compat> 0056 0049 0049 0049 +2168 <compat> 0049 0058 +2169 <compat> 0058 +216A <compat> 0058 0049 +216B <compat> 0058 0049 0049 +216C <compat> 004C +216D <compat> 0043 +216E <compat> 0044 +216F <compat> 004D +2170 <compat> 0069 +2171 <compat> 0069 0069 +2172 <compat> 0069 0069 0069 +2173 <compat> 0069 0076 +2174 <compat> 0076 +2175 <compat> 0076 0069 +2176 <compat> 0076 0069 0069 +2177 <compat> 0076 0069 0069 0069 +2178 <compat> 0069 0078 +2179 <compat> 0078 +217A <compat> 0078 0069 +217B <compat> 0078 0069 0069 +217C <compat> 006C +217D <compat> 0063 +217E <compat> 0064 +217F <compat> 006D +219A 2190 0338 +219B 2192 0338 +21AE 2194 0338 +21CD 21D0 0338 +21CE 21D4 0338 +21CF 21D2 0338 +2204 2203 0338 +2209 2208 0338 +220C 220B 0338 +2224 2223 0338 +2226 2225 0338 +222C <compat> 222B 222B +222D <compat> 222B 222B 222B +222F <compat> 222E 222E +2230 <compat> 222E 222E 222E +2241 223C 0338 +2244 2243 0338 +2247 2245 0338 +2249 2248 0338 +2260 003D 0338 +2262 2261 0338 +226D 224D 0338 +226E 003C 0338 +226F 003E 0338 +2270 2264 0338 +2271 2265 0338 +2274 2272 0338 +2275 2273 0338 +2278 2276 0338 +2279 2277 0338 +2280 227A 0338 +2281 227B 0338 +2284 2282 0338 +2285 2283 0338 +2288 2286 0338 +2289 2287 0338 +22AC 22A2 0338 +22AD 22A8 0338 +22AE 22A9 0338 +22AF 22AB 0338 +22E0 227C 0338 +22E1 227D 0338 +22E2 2291 0338 +22E3 2292 0338 +22EA 22B2 0338 +22EB 22B3 0338 +22EC 22B4 0338 +22ED 22B5 0338 +2329 3008 +232A 3009 +2460 <circle> 0031 +2461 <circle> 0032 +2462 <circle> 0033 +2463 <circle> 0034 +2464 <circle> 0035 +2465 <circle> 0036 +2466 <circle> 0037 +2467 <circle> 0038 +2468 <circle> 0039 +2469 <circle> 0031 0030 +246A <circle> 0031 0031 +246B <circle> 0031 0032 +246C <circle> 0031 0033 +246D <circle> 0031 0034 +246E <circle> 0031 0035 +246F <circle> 0031 0036 +2470 <circle> 0031 0037 +2471 <circle> 0031 0038 +2472 <circle> 0031 0039 +2473 <circle> 0032 0030 +2474 <compat> 0028 0031 0029 +2475 <compat> 0028 0032 0029 +2476 <compat> 0028 0033 0029 +2477 <compat> 0028 0034 0029 +2478 <compat> 0028 0035 0029 +2479 <compat> 0028 0036 0029 +247A <compat> 0028 0037 0029 +247B <compat> 0028 0038 0029 +247C <compat> 0028 0039 0029 +247D <compat> 0028 0031 0030 0029 +247E <compat> 0028 0031 0031 0029 +247F <compat> 0028 0031 0032 0029 +2480 <compat> 0028 0031 0033 0029 +2481 <compat> 0028 0031 0034 0029 +2482 <compat> 0028 0031 0035 0029 +2483 <compat> 0028 0031 0036 0029 +2484 <compat> 0028 0031 0037 0029 +2485 <compat> 0028 0031 0038 0029 +2486 <compat> 0028 0031 0039 0029 +2487 <compat> 0028 0032 0030 0029 +2488 <compat> 0031 002E +2489 <compat> 0032 002E +248A <compat> 0033 002E +248B <compat> 0034 002E +248C <compat> 0035 002E +248D <compat> 0036 002E +248E <compat> 0037 002E +248F <compat> 0038 002E +2490 <compat> 0039 002E +2491 <compat> 0031 0030 002E +2492 <compat> 0031 0031 002E +2493 <compat> 0031 0032 002E +2494 <compat> 0031 0033 002E +2495 <compat> 0031 0034 002E +2496 <compat> 0031 0035 002E +2497 <compat> 0031 0036 002E +2498 <compat> 0031 0037 002E +2499 <compat> 0031 0038 002E +249A <compat> 0031 0039 002E +249B <compat> 0032 0030 002E +249C <compat> 0028 0061 0029 +249D <compat> 0028 0062 0029 +249E <compat> 0028 0063 0029 +249F <compat> 0028 0064 0029 +24A0 <compat> 0028 0065 0029 +24A1 <compat> 0028 0066 0029 +24A2 <compat> 0028 0067 0029 +24A3 <compat> 0028 0068 0029 +24A4 <compat> 0028 0069 0029 +24A5 <compat> 0028 006A 0029 +24A6 <compat> 0028 006B 0029 +24A7 <compat> 0028 006C 0029 +24A8 <compat> 0028 006D 0029 +24A9 <compat> 0028 006E 0029 +24AA <compat> 0028 006F 0029 +24AB <compat> 0028 0070 0029 +24AC <compat> 0028 0071 0029 +24AD <compat> 0028 0072 0029 +24AE <compat> 0028 0073 0029 +24AF <compat> 0028 0074 0029 +24B0 <compat> 0028 0075 0029 +24B1 <compat> 0028 0076 0029 +24B2 <compat> 0028 0077 0029 +24B3 <compat> 0028 0078 0029 +24B4 <compat> 0028 0079 0029 +24B5 <compat> 0028 007A 0029 +24B6 <circle> 0041 +24B7 <circle> 0042 +24B8 <circle> 0043 +24B9 <circle> 0044 +24BA <circle> 0045 +24BB <circle> 0046 +24BC <circle> 0047 +24BD <circle> 0048 +24BE <circle> 0049 +24BF <circle> 004A +24C0 <circle> 004B +24C1 <circle> 004C +24C2 <circle> 004D +24C3 <circle> 004E +24C4 <circle> 004F +24C5 <circle> 0050 +24C6 <circle> 0051 +24C7 <circle> 0052 +24C8 <circle> 0053 +24C9 <circle> 0054 +24CA <circle> 0055 +24CB <circle> 0056 +24CC <circle> 0057 +24CD <circle> 0058 +24CE <circle> 0059 +24CF <circle> 005A +24D0 <circle> 0061 +24D1 <circle> 0062 +24D2 <circle> 0063 +24D3 <circle> 0064 +24D4 <circle> 0065 +24D5 <circle> 0066 +24D6 <circle> 0067 +24D7 <circle> 0068 +24D8 <circle> 0069 +24D9 <circle> 006A +24DA <circle> 006B +24DB <circle> 006C +24DC <circle> 006D +24DD <circle> 006E +24DE <circle> 006F +24DF <circle> 0070 +24E0 <circle> 0071 +24E1 <circle> 0072 +24E2 <circle> 0073 +24E3 <circle> 0074 +24E4 <circle> 0075 +24E5 <circle> 0076 +24E6 <circle> 0077 +24E7 <circle> 0078 +24E8 <circle> 0079 +24E9 <circle> 007A +24EA <circle> 0030 +2A0C <compat> 222B 222B 222B 222B +2A74 <compat> 003A 003A 003D +2A75 <compat> 003D 003D +2A76 <compat> 003D 003D 003D +2ADC 2ADD 0338 +2D6F <super> 2D61 +2E9F <compat> 6BCD +2EF3 <compat> 9F9F +2F00 <compat> 4E00 +2F01 <compat> 4E28 +2F02 <compat> 4E36 +2F03 <compat> 4E3F +2F04 <compat> 4E59 +2F05 <compat> 4E85 +2F06 <compat> 4E8C +2F07 <compat> 4EA0 +2F08 <compat> 4EBA +2F09 <compat> 513F +2F0A <compat> 5165 +2F0B <compat> 516B +2F0C <compat> 5182 +2F0D <compat> 5196 +2F0E <compat> 51AB +2F0F <compat> 51E0 +2F10 <compat> 51F5 +2F11 <compat> 5200 +2F12 <compat> 529B +2F13 <compat> 52F9 +2F14 <compat> 5315 +2F15 <compat> 531A +2F16 <compat> 5338 +2F17 <compat> 5341 +2F18 <compat> 535C +2F19 <compat> 5369 +2F1A <compat> 5382 +2F1B <compat> 53B6 +2F1C <compat> 53C8 +2F1D <compat> 53E3 +2F1E <compat> 56D7 +2F1F <compat> 571F +2F20 <compat> 58EB +2F21 <compat> 5902 +2F22 <compat> 590A +2F23 <compat> 5915 +2F24 <compat> 5927 +2F25 <compat> 5973 +2F26 <compat> 5B50 +2F27 <compat> 5B80 +2F28 <compat> 5BF8 +2F29 <compat> 5C0F +2F2A <compat> 5C22 +2F2B <compat> 5C38 +2F2C <compat> 5C6E +2F2D <compat> 5C71 +2F2E <compat> 5DDB +2F2F <compat> 5DE5 +2F30 <compat> 5DF1 +2F31 <compat> 5DFE +2F32 <compat> 5E72 +2F33 <compat> 5E7A +2F34 <compat> 5E7F +2F35 <compat> 5EF4 +2F36 <compat> 5EFE +2F37 <compat> 5F0B +2F38 <compat> 5F13 +2F39 <compat> 5F50 +2F3A <compat> 5F61 +2F3B <compat> 5F73 +2F3C <compat> 5FC3 +2F3D <compat> 6208 +2F3E <compat> 6236 +2F3F <compat> 624B +2F40 <compat> 652F +2F41 <compat> 6534 +2F42 <compat> 6587 +2F43 <compat> 6597 +2F44 <compat> 65A4 +2F45 <compat> 65B9 +2F46 <compat> 65E0 +2F47 <compat> 65E5 +2F48 <compat> 66F0 +2F49 <compat> 6708 +2F4A <compat> 6728 +2F4B <compat> 6B20 +2F4C <compat> 6B62 +2F4D <compat> 6B79 +2F4E <compat> 6BB3 +2F4F <compat> 6BCB +2F50 <compat> 6BD4 +2F51 <compat> 6BDB +2F52 <compat> 6C0F +2F53 <compat> 6C14 +2F54 <compat> 6C34 +2F55 <compat> 706B +2F56 <compat> 722A +2F57 <compat> 7236 +2F58 <compat> 723B +2F59 <compat> 723F +2F5A <compat> 7247 +2F5B <compat> 7259 +2F5C <compat> 725B +2F5D <compat> 72AC +2F5E <compat> 7384 +2F5F <compat> 7389 +2F60 <compat> 74DC +2F61 <compat> 74E6 +2F62 <compat> 7518 +2F63 <compat> 751F +2F64 <compat> 7528 +2F65 <compat> 7530 +2F66 <compat> 758B +2F67 <compat> 7592 +2F68 <compat> 7676 +2F69 <compat> 767D +2F6A <compat> 76AE +2F6B <compat> 76BF +2F6C <compat> 76EE +2F6D <compat> 77DB +2F6E <compat> 77E2 +2F6F <compat> 77F3 +2F70 <compat> 793A +2F71 <compat> 79B8 +2F72 <compat> 79BE +2F73 <compat> 7A74 +2F74 <compat> 7ACB +2F75 <compat> 7AF9 +2F76 <compat> 7C73 +2F77 <compat> 7CF8 +2F78 <compat> 7F36 +2F79 <compat> 7F51 +2F7A <compat> 7F8A +2F7B <compat> 7FBD +2F7C <compat> 8001 +2F7D <compat> 800C +2F7E <compat> 8012 +2F7F <compat> 8033 +2F80 <compat> 807F +2F81 <compat> 8089 +2F82 <compat> 81E3 +2F83 <compat> 81EA +2F84 <compat> 81F3 +2F85 <compat> 81FC +2F86 <compat> 820C +2F87 <compat> 821B +2F88 <compat> 821F +2F89 <compat> 826E +2F8A <compat> 8272 +2F8B <compat> 8278 +2F8C <compat> 864D +2F8D <compat> 866B +2F8E <compat> 8840 +2F8F <compat> 884C +2F90 <compat> 8863 +2F91 <compat> 897E +2F92 <compat> 898B +2F93 <compat> 89D2 +2F94 <compat> 8A00 +2F95 <compat> 8C37 +2F96 <compat> 8C46 +2F97 <compat> 8C55 +2F98 <compat> 8C78 +2F99 <compat> 8C9D +2F9A <compat> 8D64 +2F9B <compat> 8D70 +2F9C <compat> 8DB3 +2F9D <compat> 8EAB +2F9E <compat> 8ECA +2F9F <compat> 8F9B +2FA0 <compat> 8FB0 +2FA1 <compat> 8FB5 +2FA2 <compat> 9091 +2FA3 <compat> 9149 +2FA4 <compat> 91C6 +2FA5 <compat> 91CC +2FA6 <compat> 91D1 +2FA7 <compat> 9577 +2FA8 <compat> 9580 +2FA9 <compat> 961C +2FAA <compat> 96B6 +2FAB <compat> 96B9 +2FAC <compat> 96E8 +2FAD <compat> 9751 +2FAE <compat> 975E +2FAF <compat> 9762 +2FB0 <compat> 9769 +2FB1 <compat> 97CB +2FB2 <compat> 97ED +2FB3 <compat> 97F3 +2FB4 <compat> 9801 +2FB5 <compat> 98A8 +2FB6 <compat> 98DB +2FB7 <compat> 98DF +2FB8 <compat> 9996 +2FB9 <compat> 9999 +2FBA <compat> 99AC +2FBB <compat> 9AA8 +2FBC <compat> 9AD8 +2FBD <compat> 9ADF +2FBE <compat> 9B25 +2FBF <compat> 9B2F +2FC0 <compat> 9B32 +2FC1 <compat> 9B3C +2FC2 <compat> 9B5A +2FC3 <compat> 9CE5 +2FC4 <compat> 9E75 +2FC5 <compat> 9E7F +2FC6 <compat> 9EA5 +2FC7 <compat> 9EBB +2FC8 <compat> 9EC3 +2FC9 <compat> 9ECD +2FCA <compat> 9ED1 +2FCB <compat> 9EF9 +2FCC <compat> 9EFD +2FCD <compat> 9F0E +2FCE <compat> 9F13 +2FCF <compat> 9F20 +2FD0 <compat> 9F3B +2FD1 <compat> 9F4A +2FD2 <compat> 9F52 +2FD3 <compat> 9F8D +2FD4 <compat> 9F9C +2FD5 <compat> 9FA0 +3000 <wide> 0020 +3036 <compat> 3012 +3038 <compat> 5341 +3039 <compat> 5344 +303A <compat> 5345 +304C 304B 3099 +304E 304D 3099 +3050 304F 3099 +3052 3051 3099 +3054 3053 3099 +3056 3055 3099 +3058 3057 3099 +305A 3059 3099 +305C 305B 3099 +305E 305D 3099 +3060 305F 3099 +3062 3061 3099 +3065 3064 3099 +3067 3066 3099 +3069 3068 3099 +3070 306F 3099 +3071 306F 309A +3073 3072 3099 +3074 3072 309A +3076 3075 3099 +3077 3075 309A +3079 3078 3099 +307A 3078 309A +307C 307B 3099 +307D 307B 309A +3094 3046 3099 +309B <compat> 0020 3099 +309C <compat> 0020 309A +309E 309D 3099 +309F <vertical> 3088 308A +30AC 30AB 3099 +30AE 30AD 3099 +30B0 30AF 3099 +30B2 30B1 3099 +30B4 30B3 3099 +30B6 30B5 3099 +30B8 30B7 3099 +30BA 30B9 3099 +30BC 30BB 3099 +30BE 30BD 3099 +30C0 30BF 3099 +30C2 30C1 3099 +30C5 30C4 3099 +30C7 30C6 3099 +30C9 30C8 3099 +30D0 30CF 3099 +30D1 30CF 309A +30D3 30D2 3099 +30D4 30D2 309A +30D6 30D5 3099 +30D7 30D5 309A +30D9 30D8 3099 +30DA 30D8 309A +30DC 30DB 3099 +30DD 30DB 309A +30F4 30A6 3099 +30F7 30EF 3099 +30F8 30F0 3099 +30F9 30F1 3099 +30FA 30F2 3099 +30FE 30FD 3099 +30FF <vertical> 30B3 30C8 +3131 <compat> 1100 +3132 <compat> 1101 +3133 <compat> 11AA +3134 <compat> 1102 +3135 <compat> 11AC +3136 <compat> 11AD +3137 <compat> 1103 +3138 <compat> 1104 +3139 <compat> 1105 +313A <compat> 11B0 +313B <compat> 11B1 +313C <compat> 11B2 +313D <compat> 11B3 +313E <compat> 11B4 +313F <compat> 11B5 +3140 <compat> 111A +3141 <compat> 1106 +3142 <compat> 1107 +3143 <compat> 1108 +3144 <compat> 1121 +3145 <compat> 1109 +3146 <compat> 110A +3147 <compat> 110B +3148 <compat> 110C +3149 <compat> 110D +314A <compat> 110E +314B <compat> 110F +314C <compat> 1110 +314D <compat> 1111 +314E <compat> 1112 +314F <compat> 1161 +3150 <compat> 1162 +3151 <compat> 1163 +3152 <compat> 1164 +3153 <compat> 1165 +3154 <compat> 1166 +3155 <compat> 1167 +3156 <compat> 1168 +3157 <compat> 1169 +3158 <compat> 116A +3159 <compat> 116B +315A <compat> 116C +315B <compat> 116D +315C <compat> 116E +315D <compat> 116F +315E <compat> 1170 +315F <compat> 1171 +3160 <compat> 1172 +3161 <compat> 1173 +3162 <compat> 1174 +3163 <compat> 1175 +3164 <compat> 1160 +3165 <compat> 1114 +3166 <compat> 1115 +3167 <compat> 11C7 +3168 <compat> 11C8 +3169 <compat> 11CC +316A <compat> 11CE +316B <compat> 11D3 +316C <compat> 11D7 +316D <compat> 11D9 +316E <compat> 111C +316F <compat> 11DD +3170 <compat> 11DF +3171 <compat> 111D +3172 <compat> 111E +3173 <compat> 1120 +3174 <compat> 1122 +3175 <compat> 1123 +3176 <compat> 1127 +3177 <compat> 1129 +3178 <compat> 112B +3179 <compat> 112C +317A <compat> 112D +317B <compat> 112E +317C <compat> 112F +317D <compat> 1132 +317E <compat> 1136 +317F <compat> 1140 +3180 <compat> 1147 +3181 <compat> 114C +3182 <compat> 11F1 +3183 <compat> 11F2 +3184 <compat> 1157 +3185 <compat> 1158 +3186 <compat> 1159 +3187 <compat> 1184 +3188 <compat> 1185 +3189 <compat> 1188 +318A <compat> 1191 +318B <compat> 1192 +318C <compat> 1194 +318D <compat> 119E +318E <compat> 11A1 +3192 <super> 4E00 +3193 <super> 4E8C +3194 <super> 4E09 +3195 <super> 56DB +3196 <super> 4E0A +3197 <super> 4E2D +3198 <super> 4E0B +3199 <super> 7532 +319A <super> 4E59 +319B <super> 4E19 +319C <super> 4E01 +319D <super> 5929 +319E <super> 5730 +319F <super> 4EBA +3200 <compat> 0028 1100 0029 +3201 <compat> 0028 1102 0029 +3202 <compat> 0028 1103 0029 +3203 <compat> 0028 1105 0029 +3204 <compat> 0028 1106 0029 +3205 <compat> 0028 1107 0029 +3206 <compat> 0028 1109 0029 +3207 <compat> 0028 110B 0029 +3208 <compat> 0028 110C 0029 +3209 <compat> 0028 110E 0029 +320A <compat> 0028 110F 0029 +320B <compat> 0028 1110 0029 +320C <compat> 0028 1111 0029 +320D <compat> 0028 1112 0029 +320E <compat> 0028 1100 1161 0029 +320F <compat> 0028 1102 1161 0029 +3210 <compat> 0028 1103 1161 0029 +3211 <compat> 0028 1105 1161 0029 +3212 <compat> 0028 1106 1161 0029 +3213 <compat> 0028 1107 1161 0029 +3214 <compat> 0028 1109 1161 0029 +3215 <compat> 0028 110B 1161 0029 +3216 <compat> 0028 110C 1161 0029 +3217 <compat> 0028 110E 1161 0029 +3218 <compat> 0028 110F 1161 0029 +3219 <compat> 0028 1110 1161 0029 +321A <compat> 0028 1111 1161 0029 +321B <compat> 0028 1112 1161 0029 +321C <compat> 0028 110C 116E 0029 +321D <compat> 0028 110B 1169 110C 1165 11AB 0029 +321E <compat> 0028 110B 1169 1112 116E 0029 +3220 <compat> 0028 4E00 0029 +3221 <compat> 0028 4E8C 0029 +3222 <compat> 0028 4E09 0029 +3223 <compat> 0028 56DB 0029 +3224 <compat> 0028 4E94 0029 +3225 <compat> 0028 516D 0029 +3226 <compat> 0028 4E03 0029 +3227 <compat> 0028 516B 0029 +3228 <compat> 0028 4E5D 0029 +3229 <compat> 0028 5341 0029 +322A <compat> 0028 6708 0029 +322B <compat> 0028 706B 0029 +322C <compat> 0028 6C34 0029 +322D <compat> 0028 6728 0029 +322E <compat> 0028 91D1 0029 +322F <compat> 0028 571F 0029 +3230 <compat> 0028 65E5 0029 +3231 <compat> 0028 682A 0029 +3232 <compat> 0028 6709 0029 +3233 <compat> 0028 793E 0029 +3234 <compat> 0028 540D 0029 +3235 <compat> 0028 7279 0029 +3236 <compat> 0028 8CA1 0029 +3237 <compat> 0028 795D 0029 +3238 <compat> 0028 52B4 0029 +3239 <compat> 0028 4EE3 0029 +323A <compat> 0028 547C 0029 +323B <compat> 0028 5B66 0029 +323C <compat> 0028 76E3 0029 +323D <compat> 0028 4F01 0029 +323E <compat> 0028 8CC7 0029 +323F <compat> 0028 5354 0029 +3240 <compat> 0028 796D 0029 +3241 <compat> 0028 4F11 0029 +3242 <compat> 0028 81EA 0029 +3243 <compat> 0028 81F3 0029 +3250 <square> 0050 0054 0045 +3251 <circle> 0032 0031 +3252 <circle> 0032 0032 +3253 <circle> 0032 0033 +3254 <circle> 0032 0034 +3255 <circle> 0032 0035 +3256 <circle> 0032 0036 +3257 <circle> 0032 0037 +3258 <circle> 0032 0038 +3259 <circle> 0032 0039 +325A <circle> 0033 0030 +325B <circle> 0033 0031 +325C <circle> 0033 0032 +325D <circle> 0033 0033 +325E <circle> 0033 0034 +325F <circle> 0033 0035 +3260 <circle> 1100 +3261 <circle> 1102 +3262 <circle> 1103 +3263 <circle> 1105 +3264 <circle> 1106 +3265 <circle> 1107 +3266 <circle> 1109 +3267 <circle> 110B +3268 <circle> 110C +3269 <circle> 110E +326A <circle> 110F +326B <circle> 1110 +326C <circle> 1111 +326D <circle> 1112 +326E <circle> 1100 1161 +326F <circle> 1102 1161 +3270 <circle> 1103 1161 +3271 <circle> 1105 1161 +3272 <circle> 1106 1161 +3273 <circle> 1107 1161 +3274 <circle> 1109 1161 +3275 <circle> 110B 1161 +3276 <circle> 110C 1161 +3277 <circle> 110E 1161 +3278 <circle> 110F 1161 +3279 <circle> 1110 1161 +327A <circle> 1111 1161 +327B <circle> 1112 1161 +327C <circle> 110E 1161 11B7 1100 1169 +327D <circle> 110C 116E 110B 1174 +327E <circle> 110B 116E +3280 <circle> 4E00 +3281 <circle> 4E8C +3282 <circle> 4E09 +3283 <circle> 56DB +3284 <circle> 4E94 +3285 <circle> 516D +3286 <circle> 4E03 +3287 <circle> 516B +3288 <circle> 4E5D +3289 <circle> 5341 +328A <circle> 6708 +328B <circle> 706B +328C <circle> 6C34 +328D <circle> 6728 +328E <circle> 91D1 +328F <circle> 571F +3290 <circle> 65E5 +3291 <circle> 682A +3292 <circle> 6709 +3293 <circle> 793E +3294 <circle> 540D +3295 <circle> 7279 +3296 <circle> 8CA1 +3297 <circle> 795D +3298 <circle> 52B4 +3299 <circle> 79D8 +329A <circle> 7537 +329B <circle> 5973 +329C <circle> 9069 +329D <circle> 512A +329E <circle> 5370 +329F <circle> 6CE8 +32A0 <circle> 9805 +32A1 <circle> 4F11 +32A2 <circle> 5199 +32A3 <circle> 6B63 +32A4 <circle> 4E0A +32A5 <circle> 4E2D +32A6 <circle> 4E0B +32A7 <circle> 5DE6 +32A8 <circle> 53F3 +32A9 <circle> 533B +32AA <circle> 5B97 +32AB <circle> 5B66 +32AC <circle> 76E3 +32AD <circle> 4F01 +32AE <circle> 8CC7 +32AF <circle> 5354 +32B0 <circle> 591C +32B1 <circle> 0033 0036 +32B2 <circle> 0033 0037 +32B3 <circle> 0033 0038 +32B4 <circle> 0033 0039 +32B5 <circle> 0034 0030 +32B6 <circle> 0034 0031 +32B7 <circle> 0034 0032 +32B8 <circle> 0034 0033 +32B9 <circle> 0034 0034 +32BA <circle> 0034 0035 +32BB <circle> 0034 0036 +32BC <circle> 0034 0037 +32BD <circle> 0034 0038 +32BE <circle> 0034 0039 +32BF <circle> 0035 0030 +32C0 <compat> 0031 6708 +32C1 <compat> 0032 6708 +32C2 <compat> 0033 6708 +32C3 <compat> 0034 6708 +32C4 <compat> 0035 6708 +32C5 <compat> 0036 6708 +32C6 <compat> 0037 6708 +32C7 <compat> 0038 6708 +32C8 <compat> 0039 6708 +32C9 <compat> 0031 0030 6708 +32CA <compat> 0031 0031 6708 +32CB <compat> 0031 0032 6708 +32CC <square> 0048 0067 +32CD <square> 0065 0072 0067 +32CE <square> 0065 0056 +32CF <square> 004C 0054 0044 +32D0 <circle> 30A2 +32D1 <circle> 30A4 +32D2 <circle> 30A6 +32D3 <circle> 30A8 +32D4 <circle> 30AA +32D5 <circle> 30AB +32D6 <circle> 30AD +32D7 <circle> 30AF +32D8 <circle> 30B1 +32D9 <circle> 30B3 +32DA <circle> 30B5 +32DB <circle> 30B7 +32DC <circle> 30B9 +32DD <circle> 30BB +32DE <circle> 30BD +32DF <circle> 30BF +32E0 <circle> 30C1 +32E1 <circle> 30C4 +32E2 <circle> 30C6 +32E3 <circle> 30C8 +32E4 <circle> 30CA +32E5 <circle> 30CB +32E6 <circle> 30CC +32E7 <circle> 30CD +32E8 <circle> 30CE +32E9 <circle> 30CF +32EA <circle> 30D2 +32EB <circle> 30D5 +32EC <circle> 30D8 +32ED <circle> 30DB +32EE <circle> 30DE +32EF <circle> 30DF +32F0 <circle> 30E0 +32F1 <circle> 30E1 +32F2 <circle> 30E2 +32F3 <circle> 30E4 +32F4 <circle> 30E6 +32F5 <circle> 30E8 +32F6 <circle> 30E9 +32F7 <circle> 30EA +32F8 <circle> 30EB +32F9 <circle> 30EC +32FA <circle> 30ED +32FB <circle> 30EF +32FC <circle> 30F0 +32FD <circle> 30F1 +32FE <circle> 30F2 +3300 <square> 30A2 30D1 30FC 30C8 +3301 <square> 30A2 30EB 30D5 30A1 +3302 <square> 30A2 30F3 30DA 30A2 +3303 <square> 30A2 30FC 30EB +3304 <square> 30A4 30CB 30F3 30B0 +3305 <square> 30A4 30F3 30C1 +3306 <square> 30A6 30A9 30F3 +3307 <square> 30A8 30B9 30AF 30FC 30C9 +3308 <square> 30A8 30FC 30AB 30FC +3309 <square> 30AA 30F3 30B9 +330A <square> 30AA 30FC 30E0 +330B <square> 30AB 30A4 30EA +330C <square> 30AB 30E9 30C3 30C8 +330D <square> 30AB 30ED 30EA 30FC +330E <square> 30AC 30ED 30F3 +330F <square> 30AC 30F3 30DE +3310 <square> 30AE 30AC +3311 <square> 30AE 30CB 30FC +3312 <square> 30AD 30E5 30EA 30FC +3313 <square> 30AE 30EB 30C0 30FC +3314 <square> 30AD 30ED +3315 <square> 30AD 30ED 30B0 30E9 30E0 +3316 <square> 30AD 30ED 30E1 30FC 30C8 30EB +3317 <square> 30AD 30ED 30EF 30C3 30C8 +3318 <square> 30B0 30E9 30E0 +3319 <square> 30B0 30E9 30E0 30C8 30F3 +331A <square> 30AF 30EB 30BC 30A4 30ED +331B <square> 30AF 30ED 30FC 30CD +331C <square> 30B1 30FC 30B9 +331D <square> 30B3 30EB 30CA +331E <square> 30B3 30FC 30DD +331F <square> 30B5 30A4 30AF 30EB +3320 <square> 30B5 30F3 30C1 30FC 30E0 +3321 <square> 30B7 30EA 30F3 30B0 +3322 <square> 30BB 30F3 30C1 +3323 <square> 30BB 30F3 30C8 +3324 <square> 30C0 30FC 30B9 +3325 <square> 30C7 30B7 +3326 <square> 30C9 30EB +3327 <square> 30C8 30F3 +3328 <square> 30CA 30CE +3329 <square> 30CE 30C3 30C8 +332A <square> 30CF 30A4 30C4 +332B <square> 30D1 30FC 30BB 30F3 30C8 +332C <square> 30D1 30FC 30C4 +332D <square> 30D0 30FC 30EC 30EB +332E <square> 30D4 30A2 30B9 30C8 30EB +332F <square> 30D4 30AF 30EB +3330 <square> 30D4 30B3 +3331 <square> 30D3 30EB +3332 <square> 30D5 30A1 30E9 30C3 30C9 +3333 <square> 30D5 30A3 30FC 30C8 +3334 <square> 30D6 30C3 30B7 30A7 30EB +3335 <square> 30D5 30E9 30F3 +3336 <square> 30D8 30AF 30BF 30FC 30EB +3337 <square> 30DA 30BD +3338 <square> 30DA 30CB 30D2 +3339 <square> 30D8 30EB 30C4 +333A <square> 30DA 30F3 30B9 +333B <square> 30DA 30FC 30B8 +333C <square> 30D9 30FC 30BF +333D <square> 30DD 30A4 30F3 30C8 +333E <square> 30DC 30EB 30C8 +333F <square> 30DB 30F3 +3340 <square> 30DD 30F3 30C9 +3341 <square> 30DB 30FC 30EB +3342 <square> 30DB 30FC 30F3 +3343 <square> 30DE 30A4 30AF 30ED +3344 <square> 30DE 30A4 30EB +3345 <square> 30DE 30C3 30CF +3346 <square> 30DE 30EB 30AF +3347 <square> 30DE 30F3 30B7 30E7 30F3 +3348 <square> 30DF 30AF 30ED 30F3 +3349 <square> 30DF 30EA +334A <square> 30DF 30EA 30D0 30FC 30EB +334B <square> 30E1 30AC +334C <square> 30E1 30AC 30C8 30F3 +334D <square> 30E1 30FC 30C8 30EB +334E <square> 30E4 30FC 30C9 +334F <square> 30E4 30FC 30EB +3350 <square> 30E6 30A2 30F3 +3351 <square> 30EA 30C3 30C8 30EB +3352 <square> 30EA 30E9 +3353 <square> 30EB 30D4 30FC +3354 <square> 30EB 30FC 30D6 30EB +3355 <square> 30EC 30E0 +3356 <square> 30EC 30F3 30C8 30B2 30F3 +3357 <square> 30EF 30C3 30C8 +3358 <compat> 0030 70B9 +3359 <compat> 0031 70B9 +335A <compat> 0032 70B9 +335B <compat> 0033 70B9 +335C <compat> 0034 70B9 +335D <compat> 0035 70B9 +335E <compat> 0036 70B9 +335F <compat> 0037 70B9 +3360 <compat> 0038 70B9 +3361 <compat> 0039 70B9 +3362 <compat> 0031 0030 70B9 +3363 <compat> 0031 0031 70B9 +3364 <compat> 0031 0032 70B9 +3365 <compat> 0031 0033 70B9 +3366 <compat> 0031 0034 70B9 +3367 <compat> 0031 0035 70B9 +3368 <compat> 0031 0036 70B9 +3369 <compat> 0031 0037 70B9 +336A <compat> 0031 0038 70B9 +336B <compat> 0031 0039 70B9 +336C <compat> 0032 0030 70B9 +336D <compat> 0032 0031 70B9 +336E <compat> 0032 0032 70B9 +336F <compat> 0032 0033 70B9 +3370 <compat> 0032 0034 70B9 +3371 <square> 0068 0050 0061 +3372 <square> 0064 0061 +3373 <square> 0041 0055 +3374 <square> 0062 0061 0072 +3375 <square> 006F 0056 +3376 <square> 0070 0063 +3377 <square> 0064 006D +3378 <square> 0064 006D 00B2 +3379 <square> 0064 006D 00B3 +337A <square> 0049 0055 +337B <square> 5E73 6210 +337C <square> 662D 548C +337D <square> 5927 6B63 +337E <square> 660E 6CBB +337F <square> 682A 5F0F 4F1A 793E +3380 <square> 0070 0041 +3381 <square> 006E 0041 +3382 <square> 03BC 0041 +3383 <square> 006D 0041 +3384 <square> 006B 0041 +3385 <square> 004B 0042 +3386 <square> 004D 0042 +3387 <square> 0047 0042 +3388 <square> 0063 0061 006C +3389 <square> 006B 0063 0061 006C +338A <square> 0070 0046 +338B <square> 006E 0046 +338C <square> 03BC 0046 +338D <square> 03BC 0067 +338E <square> 006D 0067 +338F <square> 006B 0067 +3390 <square> 0048 007A +3391 <square> 006B 0048 007A +3392 <square> 004D 0048 007A +3393 <square> 0047 0048 007A +3394 <square> 0054 0048 007A +3395 <square> 03BC 2113 +3396 <square> 006D 2113 +3397 <square> 0064 2113 +3398 <square> 006B 2113 +3399 <square> 0066 006D +339A <square> 006E 006D +339B <square> 03BC 006D +339C <square> 006D 006D +339D <square> 0063 006D +339E <square> 006B 006D +339F <square> 006D 006D 00B2 +33A0 <square> 0063 006D 00B2 +33A1 <square> 006D 00B2 +33A2 <square> 006B 006D 00B2 +33A3 <square> 006D 006D 00B3 +33A4 <square> 0063 006D 00B3 +33A5 <square> 006D 00B3 +33A6 <square> 006B 006D 00B3 +33A7 <square> 006D 2215 0073 +33A8 <square> 006D 2215 0073 00B2 +33A9 <square> 0050 0061 +33AA <square> 006B 0050 0061 +33AB <square> 004D 0050 0061 +33AC <square> 0047 0050 0061 +33AD <square> 0072 0061 0064 +33AE <square> 0072 0061 0064 2215 0073 +33AF <square> 0072 0061 0064 2215 0073 00B2 +33B0 <square> 0070 0073 +33B1 <square> 006E 0073 +33B2 <square> 03BC 0073 +33B3 <square> 006D 0073 +33B4 <square> 0070 0056 +33B5 <square> 006E 0056 +33B6 <square> 03BC 0056 +33B7 <square> 006D 0056 +33B8 <square> 006B 0056 +33B9 <square> 004D 0056 +33BA <square> 0070 0057 +33BB <square> 006E 0057 +33BC <square> 03BC 0057 +33BD <square> 006D 0057 +33BE <square> 006B 0057 +33BF <square> 004D 0057 +33C0 <square> 006B 03A9 +33C1 <square> 004D 03A9 +33C2 <square> 0061 002E 006D 002E +33C3 <square> 0042 0071 +33C4 <square> 0063 0063 +33C5 <square> 0063 0064 +33C6 <square> 0043 2215 006B 0067 +33C7 <square> 0043 006F 002E +33C8 <square> 0064 0042 +33C9 <square> 0047 0079 +33CA <square> 0068 0061 +33CB <square> 0048 0050 +33CC <square> 0069 006E +33CD <square> 004B 004B +33CE <square> 004B 004D +33CF <square> 006B 0074 +33D0 <square> 006C 006D +33D1 <square> 006C 006E +33D2 <square> 006C 006F 0067 +33D3 <square> 006C 0078 +33D4 <square> 006D 0062 +33D5 <square> 006D 0069 006C +33D6 <square> 006D 006F 006C +33D7 <square> 0050 0048 +33D8 <square> 0070 002E 006D 002E +33D9 <square> 0050 0050 004D +33DA <square> 0050 0052 +33DB <square> 0073 0072 +33DC <square> 0053 0076 +33DD <square> 0057 0062 +33DE <square> 0056 2215 006D +33DF <square> 0041 2215 006D +33E0 <compat> 0031 65E5 +33E1 <compat> 0032 65E5 +33E2 <compat> 0033 65E5 +33E3 <compat> 0034 65E5 +33E4 <compat> 0035 65E5 +33E5 <compat> 0036 65E5 +33E6 <compat> 0037 65E5 +33E7 <compat> 0038 65E5 +33E8 <compat> 0039 65E5 +33E9 <compat> 0031 0030 65E5 +33EA <compat> 0031 0031 65E5 +33EB <compat> 0031 0032 65E5 +33EC <compat> 0031 0033 65E5 +33ED <compat> 0031 0034 65E5 +33EE <compat> 0031 0035 65E5 +33EF <compat> 0031 0036 65E5 +33F0 <compat> 0031 0037 65E5 +33F1 <compat> 0031 0038 65E5 +33F2 <compat> 0031 0039 65E5 +33F3 <compat> 0032 0030 65E5 +33F4 <compat> 0032 0031 65E5 +33F5 <compat> 0032 0032 65E5 +33F6 <compat> 0032 0033 65E5 +33F7 <compat> 0032 0034 65E5 +33F8 <compat> 0032 0035 65E5 +33F9 <compat> 0032 0036 65E5 +33FA <compat> 0032 0037 65E5 +33FB <compat> 0032 0038 65E5 +33FC <compat> 0032 0039 65E5 +33FD <compat> 0033 0030 65E5 +33FE <compat> 0033 0031 65E5 +33FF <square> 0067 0061 006C +F900 8C48 +F901 66F4 +F902 8ECA +F903 8CC8 +F904 6ED1 +F905 4E32 +F906 53E5 +F907 F908 9F9C +F909 5951 +F90A 91D1 +F90B 5587 +F90C 5948 +F90D 61F6 +F90E 7669 +F90F 7F85 +F910 863F +F911 87BA +F912 88F8 +F913 908F +F914 6A02 +F915 6D1B +F916 70D9 +F917 73DE +F918 843D +F919 916A +F91A 99F1 +F91B 4E82 +F91C 5375 +F91D 6B04 +F91E 721B +F91F 862D +F920 9E1E +F921 5D50 +F922 6FEB +F923 85CD +F924 8964 +F925 62C9 +F926 81D8 +F927 881F +F928 5ECA +F929 6717 +F92A 6D6A +F92B 72FC +F92C 90CE +F92D 4F86 +F92E 51B7 +F92F 52DE +F930 64C4 +F931 6AD3 +F932 7210 +F933 76E7 +F934 8001 +F935 8606 +F936 865C +F937 8DEF +F938 9732 +F939 9B6F +F93A 9DFA +F93B 788C +F93C 797F +F93D 7DA0 +F93E 83C9 +F93F 9304 +F940 9E7F +F941 8AD6 +F942 58DF +F943 5F04 +F944 7C60 +F945 807E +F946 7262 +F947 78CA +F948 8CC2 +F949 96F7 +F94A 58D8 +F94B 5C62 +F94C 6A13 +F94D 6DDA +F94E 6F0F +F94F 7D2F +F950 7E37 +F951 964B +F952 52D2 +F953 808B +F954 51DC +F955 51CC +F956 7A1C +F957 7DBE +F958 83F1 +F959 9675 +F95A 8B80 +F95B 62CF +F95C 6A02 +F95D 8AFE +F95E 4E39 +F95F 5BE7 +F960 6012 +F961 7387 +F962 7570 +F963 5317 +F964 78FB +F965 4FBF +F966 5FA9 +F967 4E0D +F968 6CCC +F969 6578 +F96A 7D22 +F96B 53C3 +F96C 585E +F96D 7701 +F96E 8449 +F96F 8AAA +F970 6BBA +F971 8FB0 +F972 6C88 +F973 62FE +F974 82E5 +F975 63A0 +F976 7565 +F977 4EAE +F978 5169 +F979 51C9 +F97A 6881 +F97B 7CE7 +F97C 826F +F97D 8AD2 +F97E 91CF +F97F 52F5 +F980 5442 +F981 5973 +F982 5EEC +F983 65C5 +F984 6FFE +F985 792A +F986 95AD +F987 9A6A +F988 9E97 +F989 9ECE +F98A 529B +F98B 66C6 +F98C 6B77 +F98D 8F62 +F98E 5E74 +F98F 6190 +F990 6200 +F991 649A +F992 6F23 +F993 7149 +F994 7489 +F995 79CA +F996 7DF4 +F997 806F +F998 8F26 +F999 84EE +F99A 9023 +F99B 934A +F99C 5217 +F99D 52A3 +F99E 54BD +F99F 70C8 +F9A0 88C2 +F9A1 8AAA +F9A2 5EC9 +F9A3 5FF5 +F9A4 637B +F9A5 6BAE +F9A6 7C3E +F9A7 7375 +F9A8 4EE4 +F9A9 56F9 +F9AA 5BE7 +F9AB 5DBA +F9AC 601C +F9AD 73B2 +F9AE 7469 +F9AF 7F9A +F9B0 8046 +F9B1 9234 +F9B2 96F6 +F9B3 9748 +F9B4 9818 +F9B5 4F8B +F9B6 79AE +F9B7 91B4 +F9B8 96B8 +F9B9 60E1 +F9BA 4E86 +F9BB 50DA +F9BC 5BEE +F9BD 5C3F +F9BE 6599 +F9BF 6A02 +F9C0 71CE +F9C1 7642 +F9C2 84FC +F9C3 907C +F9C4 9F8D +F9C5 6688 +F9C6 962E +F9C7 5289 +F9C8 677B +F9C9 67F3 +F9CA 6D41 +F9CB 6E9C +F9CC 7409 +F9CD 7559 +F9CE 786B +F9CF 7D10 +F9D0 985E +F9D1 516D +F9D2 622E +F9D3 9678 +F9D4 502B +F9D5 5D19 +F9D6 6DEA +F9D7 8F2A +F9D8 5F8B +F9D9 6144 +F9DA 6817 +F9DB 7387 +F9DC 9686 +F9DD 5229 +F9DE 540F +F9DF 5C65 +F9E0 6613 +F9E1 674E +F9E2 68A8 +F9E3 6CE5 +F9E4 7406 +F9E5 75E2 +F9E6 7F79 +F9E7 88CF +F9E8 88E1 +F9E9 91CC +F9EA 96E2 +F9EB 533F +F9EC 6EBA +F9ED 541D +F9EE 71D0 +F9EF 7498 +F9F0 85FA +F9F1 96A3 +F9F2 9C57 +F9F3 9E9F +F9F4 6797 +F9F5 6DCB +F9F6 81E8 +F9F7 7ACB +F9F8 7B20 +F9F9 7C92 +F9FA 72C0 +F9FB 7099 +F9FC 8B58 +F9FD 4EC0 +F9FE 8336 +F9FF 523A +FA00 5207 +FA01 5EA6 +FA02 62D3 +FA03 7CD6 +FA04 5B85 +FA05 6D1E +FA06 66B4 +FA07 8F3B +FA08 884C +FA09 964D +FA0A 898B +FA0B 5ED3 +FA0C 5140 +FA0D 55C0 +FA10 585A +FA12 6674 +FA15 51DE +FA16 732A +FA17 76CA +FA18 793C +FA19 795E +FA1A 7965 +FA1B 798F +FA1C 9756 +FA1D 7CBE +FA1E 7FBD +FA20 8612 +FA22 8AF8 +FA25 9038 +FA26 90FD +FA2A 98EF +FA2B 98FC +FA2C 9928 +FA2D 9DB4 +FA30 4FAE +FA31 50E7 +FA32 514D +FA33 52C9 +FA34 52E4 +FA35 5351 +FA36 559D +FA37 5606 +FA38 5668 +FA39 5840 +FA3A 58A8 +FA3B 5C64 +FA3C 5C6E +FA3D 6094 +FA3E 6168 +FA3F 618E +FA40 61F2 +FA41 654F +FA42 65E2 +FA43 6691 +FA44 6885 +FA45 6D77 +FA46 6E1A +FA47 6F22 +FA48 716E +FA49 722B +FA4A 7422 +FA4B 7891 +FA4C 793E +FA4D 7949 +FA4E 7948 +FA4F 7950 +FA50 7956 +FA51 795D +FA52 798D +FA53 798E +FA54 7A40 +FA55 7A81 +FA56 7BC0 +FA57 7DF4 +FA58 7E09 +FA59 7E41 +FA5A 7F72 +FA5B 8005 +FA5C 81ED +FA5D FA5E 8279 +FA5F 8457 +FA60 8910 +FA61 8996 +FA62 8B01 +FA63 8B39 +FA64 8CD3 +FA65 8D08 +FA66 8FB6 +FA67 9038 +FA68 96E3 +FA69 97FF +FA6A 983B +FA70 4E26 +FA71 51B5 +FA72 5168 +FA73 4F80 +FA74 5145 +FA75 5180 +FA76 52C7 +FA77 52FA +FA78 559D +FA79 5555 +FA7A 5599 +FA7B 55E2 +FA7C 585A +FA7D 58B3 +FA7E 5944 +FA7F 5954 +FA80 5A62 +FA81 5B28 +FA82 5ED2 +FA83 5ED9 +FA84 5F69 +FA85 5FAD +FA86 60D8 +FA87 614E +FA88 6108 +FA89 618E +FA8A 6160 +FA8B 61F2 +FA8C 6234 +FA8D 63C4 +FA8E 641C +FA8F 6452 +FA90 6556 +FA91 6674 +FA92 6717 +FA93 671B +FA94 6756 +FA95 6B79 +FA96 6BBA +FA97 6D41 +FA98 6EDB +FA99 6ECB +FA9A 6F22 +FA9B 701E +FA9C 716E +FA9D 77A7 +FA9E 7235 +FA9F 72AF +FAA0 732A +FAA1 7471 +FAA2 7506 +FAA3 753B +FAA4 761D +FAA5 761F +FAA6 76CA +FAA7 76DB +FAA8 76F4 +FAA9 774A +FAAA 7740 +FAAB 78CC +FAAC 7AB1 +FAAD 7BC0 +FAAE 7C7B +FAAF 7D5B +FAB0 7DF4 +FAB1 7F3E +FAB2 8005 +FAB3 8352 +FAB4 83EF +FAB5 8779 +FAB6 8941 +FAB7 8986 +FAB8 8996 +FAB9 8ABF +FABA 8AF8 +FABB 8ACB +FABC 8B01 +FABD 8AFE +FABE 8AED +FABF 8B39 +FAC0 8B8A +FAC1 8D08 +FAC2 8F38 +FAC3 9072 +FAC4 9199 +FAC5 9276 +FAC6 967C +FAC7 96E3 +FAC8 9756 +FAC9 97DB +FACA 97FF +FACB 980B +FACC 983B +FACD 9B12 +FACE 9F9C +FACF 2284A +FAD0 22844 +FAD1 233D5 +FAD2 3B9D +FAD3 4018 +FAD4 4039 +FAD5 25249 +FAD6 25CD0 +FAD7 27ED3 +FAD8 9F43 +FAD9 9F8E +FB00 <compat> 0066 0066 +FB01 <compat> 0066 0069 +FB02 <compat> 0066 006C +FB03 <compat> 0066 0066 0069 +FB04 <compat> 0066 0066 006C +FB05 <compat> 017F 0074 +FB06 <compat> 0073 0074 +FB13 <compat> 0574 0576 +FB14 <compat> 0574 0565 +FB15 <compat> 0574 056B +FB16 <compat> 057E 0576 +FB17 <compat> 0574 056D +FB1D 05D9 05B4 +FB1F 05F2 05B7 +FB20 <font> 05E2 +FB21 <font> 05D0 +FB22 <font> 05D3 +FB23 <font> 05D4 +FB24 <font> 05DB +FB25 <font> 05DC +FB26 <font> 05DD +FB27 <font> 05E8 +FB28 <font> 05EA +FB29 <font> 002B +FB2A 05E9 05C1 +FB2B 05E9 05C2 +FB2C FB49 05C1 +FB2D FB49 05C2 +FB2E 05D0 05B7 +FB2F 05D0 05B8 +FB30 05D0 05BC +FB31 05D1 05BC +FB32 05D2 05BC +FB33 05D3 05BC +FB34 05D4 05BC +FB35 05D5 05BC +FB36 05D6 05BC +FB38 05D8 05BC +FB39 05D9 05BC +FB3A 05DA 05BC +FB3B 05DB 05BC +FB3C 05DC 05BC +FB3E 05DE 05BC +FB40 05E0 05BC +FB41 05E1 05BC +FB43 05E3 05BC +FB44 05E4 05BC +FB46 05E6 05BC +FB47 05E7 05BC +FB48 05E8 05BC +FB49 05E9 05BC +FB4A 05EA 05BC +FB4B 05D5 05B9 +FB4C 05D1 05BF +FB4D 05DB 05BF +FB4E 05E4 05BF +FB4F <compat> 05D0 05DC +FB50 <isolated> 0671 +FB51 <final> 0671 +FB52 <isolated> 067B +FB53 <final> 067B +FB54 <initial> 067B +FB55 <medial> 067B +FB56 <isolated> 067E +FB57 <final> 067E +FB58 <initial> 067E +FB59 <medial> 067E +FB5A <isolated> 0680 +FB5B <final> 0680 +FB5C <initial> 0680 +FB5D <medial> 0680 +FB5E <isolated> 067A +FB5F <final> 067A +FB60 <initial> 067A +FB61 <medial> 067A +FB62 <isolated> 067F +FB63 <final> 067F +FB64 <initial> 067F +FB65 <medial> 067F +FB66 <isolated> 0679 +FB67 <final> 0679 +FB68 <initial> 0679 +FB69 <medial> 0679 +FB6A <isolated> 06A4 +FB6B <final> 06A4 +FB6C <initial> 06A4 +FB6D <medial> 06A4 +FB6E <isolated> 06A6 +FB6F <final> 06A6 +FB70 <initial> 06A6 +FB71 <medial> 06A6 +FB72 <isolated> 0684 +FB73 <final> 0684 +FB74 <initial> 0684 +FB75 <medial> 0684 +FB76 <isolated> 0683 +FB77 <final> 0683 +FB78 <initial> 0683 +FB79 <medial> 0683 +FB7A <isolated> 0686 +FB7B <final> 0686 +FB7C <initial> 0686 +FB7D <medial> 0686 +FB7E <isolated> 0687 +FB7F <final> 0687 +FB80 <initial> 0687 +FB81 <medial> 0687 +FB82 <isolated> 068D +FB83 <final> 068D +FB84 <isolated> 068C +FB85 <final> 068C +FB86 <isolated> 068E +FB87 <final> 068E +FB88 <isolated> 0688 +FB89 <final> 0688 +FB8A <isolated> 0698 +FB8B <final> 0698 +FB8C <isolated> 0691 +FB8D <final> 0691 +FB8E <isolated> 06A9 +FB8F <final> 06A9 +FB90 <initial> 06A9 +FB91 <medial> 06A9 +FB92 <isolated> 06AF +FB93 <final> 06AF +FB94 <initial> 06AF +FB95 <medial> 06AF +FB96 <isolated> 06B3 +FB97 <final> 06B3 +FB98 <initial> 06B3 +FB99 <medial> 06B3 +FB9A <isolated> 06B1 +FB9B <final> 06B1 +FB9C <initial> 06B1 +FB9D <medial> 06B1 +FB9E <isolated> 06BA +FB9F <final> 06BA +FBA0 <isolated> 06BB +FBA1 <final> 06BB +FBA2 <initial> 06BB +FBA3 <medial> 06BB +FBA4 <isolated> 06C0 +FBA5 <final> 06C0 +FBA6 <isolated> 06C1 +FBA7 <final> 06C1 +FBA8 <initial> 06C1 +FBA9 <medial> 06C1 +FBAA <isolated> 06BE +FBAB <final> 06BE +FBAC <initial> 06BE +FBAD <medial> 06BE +FBAE <isolated> 06D2 +FBAF <final> 06D2 +FBB0 <isolated> 06D3 +FBB1 <final> 06D3 +FBD3 <isolated> 06AD +FBD4 <final> 06AD +FBD5 <initial> 06AD +FBD6 <medial> 06AD +FBD7 <isolated> 06C7 +FBD8 <final> 06C7 +FBD9 <isolated> 06C6 +FBDA <final> 06C6 +FBDB <isolated> 06C8 +FBDC <final> 06C8 +FBDD <isolated> 0677 +FBDE <isolated> 06CB +FBDF <final> 06CB +FBE0 <isolated> 06C5 +FBE1 <final> 06C5 +FBE2 <isolated> 06C9 +FBE3 <final> 06C9 +FBE4 <isolated> 06D0 +FBE5 <final> 06D0 +FBE6 <initial> 06D0 +FBE7 <medial> 06D0 +FBE8 <initial> 0649 +FBE9 <medial> 0649 +FBEA <isolated> 0626 0627 +FBEB <final> 0626 0627 +FBEC <isolated> 0626 06D5 +FBED <final> 0626 06D5 +FBEE <isolated> 0626 0648 +FBEF <final> 0626 0648 +FBF0 <isolated> 0626 06C7 +FBF1 <final> 0626 06C7 +FBF2 <isolated> 0626 06C6 +FBF3 <final> 0626 06C6 +FBF4 <isolated> 0626 06C8 +FBF5 <final> 0626 06C8 +FBF6 <isolated> 0626 06D0 +FBF7 <final> 0626 06D0 +FBF8 <initial> 0626 06D0 +FBF9 <isolated> 0626 0649 +FBFA <final> 0626 0649 +FBFB <initial> 0626 0649 +FBFC <isolated> 06CC +FBFD <final> 06CC +FBFE <initial> 06CC +FBFF <medial> 06CC +FC00 <isolated> 0626 062C +FC01 <isolated> 0626 062D +FC02 <isolated> 0626 0645 +FC03 <isolated> 0626 0649 +FC04 <isolated> 0626 064A +FC05 <isolated> 0628 062C +FC06 <isolated> 0628 062D +FC07 <isolated> 0628 062E +FC08 <isolated> 0628 0645 +FC09 <isolated> 0628 0649 +FC0A <isolated> 0628 064A +FC0B <isolated> 062A 062C +FC0C <isolated> 062A 062D +FC0D <isolated> 062A 062E +FC0E <isolated> 062A 0645 +FC0F <isolated> 062A 0649 +FC10 <isolated> 062A 064A +FC11 <isolated> 062B 062C +FC12 <isolated> 062B 0645 +FC13 <isolated> 062B 0649 +FC14 <isolated> 062B 064A +FC15 <isolated> 062C 062D +FC16 <isolated> 062C 0645 +FC17 <isolated> 062D 062C +FC18 <isolated> 062D 0645 +FC19 <isolated> 062E 062C +FC1A <isolated> 062E 062D +FC1B <isolated> 062E 0645 +FC1C <isolated> 0633 062C +FC1D <isolated> 0633 062D +FC1E <isolated> 0633 062E +FC1F <isolated> 0633 0645 +FC20 <isolated> 0635 062D +FC21 <isolated> 0635 0645 +FC22 <isolated> 0636 062C +FC23 <isolated> 0636 062D +FC24 <isolated> 0636 062E +FC25 <isolated> 0636 0645 +FC26 <isolated> 0637 062D +FC27 <isolated> 0637 0645 +FC28 <isolated> 0638 0645 +FC29 <isolated> 0639 062C +FC2A <isolated> 0639 0645 +FC2B <isolated> 063A 062C +FC2C <isolated> 063A 0645 +FC2D <isolated> 0641 062C +FC2E <isolated> 0641 062D +FC2F <isolated> 0641 062E +FC30 <isolated> 0641 0645 +FC31 <isolated> 0641 0649 +FC32 <isolated> 0641 064A +FC33 <isolated> 0642 062D +FC34 <isolated> 0642 0645 +FC35 <isolated> 0642 0649 +FC36 <isolated> 0642 064A +FC37 <isolated> 0643 0627 +FC38 <isolated> 0643 062C +FC39 <isolated> 0643 062D +FC3A <isolated> 0643 062E +FC3B <isolated> 0643 0644 +FC3C <isolated> 0643 0645 +FC3D <isolated> 0643 0649 +FC3E <isolated> 0643 064A +FC3F <isolated> 0644 062C +FC40 <isolated> 0644 062D +FC41 <isolated> 0644 062E +FC42 <isolated> 0644 0645 +FC43 <isolated> 0644 0649 +FC44 <isolated> 0644 064A +FC45 <isolated> 0645 062C +FC46 <isolated> 0645 062D +FC47 <isolated> 0645 062E +FC48 <isolated> 0645 0645 +FC49 <isolated> 0645 0649 +FC4A <isolated> 0645 064A +FC4B <isolated> 0646 062C +FC4C <isolated> 0646 062D +FC4D <isolated> 0646 062E +FC4E <isolated> 0646 0645 +FC4F <isolated> 0646 0649 +FC50 <isolated> 0646 064A +FC51 <isolated> 0647 062C +FC52 <isolated> 0647 0645 +FC53 <isolated> 0647 0649 +FC54 <isolated> 0647 064A +FC55 <isolated> 064A 062C +FC56 <isolated> 064A 062D +FC57 <isolated> 064A 062E +FC58 <isolated> 064A 0645 +FC59 <isolated> 064A 0649 +FC5A <isolated> 064A 064A +FC5B <isolated> 0630 0670 +FC5C <isolated> 0631 0670 +FC5D <isolated> 0649 0670 +FC5E <isolated> 0020 064C 0651 +FC5F <isolated> 0020 064D 0651 +FC60 <isolated> 0020 064E 0651 +FC61 <isolated> 0020 064F 0651 +FC62 <isolated> 0020 0650 0651 +FC63 <isolated> 0020 0651 0670 +FC64 <final> 0626 0631 +FC65 <final> 0626 0632 +FC66 <final> 0626 0645 +FC67 <final> 0626 0646 +FC68 <final> 0626 0649 +FC69 <final> 0626 064A +FC6A <final> 0628 0631 +FC6B <final> 0628 0632 +FC6C <final> 0628 0645 +FC6D <final> 0628 0646 +FC6E <final> 0628 0649 +FC6F <final> 0628 064A +FC70 <final> 062A 0631 +FC71 <final> 062A 0632 +FC72 <final> 062A 0645 +FC73 <final> 062A 0646 +FC74 <final> 062A 0649 +FC75 <final> 062A 064A +FC76 <final> 062B 0631 +FC77 <final> 062B 0632 +FC78 <final> 062B 0645 +FC79 <final> 062B 0646 +FC7A <final> 062B 0649 +FC7B <final> 062B 064A +FC7C <final> 0641 0649 +FC7D <final> 0641 064A +FC7E <final> 0642 0649 +FC7F <final> 0642 064A +FC80 <final> 0643 0627 +FC81 <final> 0643 0644 +FC82 <final> 0643 0645 +FC83 <final> 0643 0649 +FC84 <final> 0643 064A +FC85 <final> 0644 0645 +FC86 <final> 0644 0649 +FC87 <final> 0644 064A +FC88 <final> 0645 0627 +FC89 <final> 0645 0645 +FC8A <final> 0646 0631 +FC8B <final> 0646 0632 +FC8C <final> 0646 0645 +FC8D <final> 0646 0646 +FC8E <final> 0646 0649 +FC8F <final> 0646 064A +FC90 <final> 0649 0670 +FC91 <final> 064A 0631 +FC92 <final> 064A 0632 +FC93 <final> 064A 0645 +FC94 <final> 064A 0646 +FC95 <final> 064A 0649 +FC96 <final> 064A 064A +FC97 <initial> 0626 062C +FC98 <initial> 0626 062D +FC99 <initial> 0626 062E +FC9A <initial> 0626 0645 +FC9B <initial> 0626 0647 +FC9C <initial> 0628 062C +FC9D <initial> 0628 062D +FC9E <initial> 0628 062E +FC9F <initial> 0628 0645 +FCA0 <initial> 0628 0647 +FCA1 <initial> 062A 062C +FCA2 <initial> 062A 062D +FCA3 <initial> 062A 062E +FCA4 <initial> 062A 0645 +FCA5 <initial> 062A 0647 +FCA6 <initial> 062B 0645 +FCA7 <initial> 062C 062D +FCA8 <initial> 062C 0645 +FCA9 <initial> 062D 062C +FCAA <initial> 062D 0645 +FCAB <initial> 062E 062C +FCAC <initial> 062E 0645 +FCAD <initial> 0633 062C +FCAE <initial> 0633 062D +FCAF <initial> 0633 062E +FCB0 <initial> 0633 0645 +FCB1 <initial> 0635 062D +FCB2 <initial> 0635 062E +FCB3 <initial> 0635 0645 +FCB4 <initial> 0636 062C +FCB5 <initial> 0636 062D +FCB6 <initial> 0636 062E +FCB7 <initial> 0636 0645 +FCB8 <initial> 0637 062D +FCB9 <initial> 0638 0645 +FCBA <initial> 0639 062C +FCBB <initial> 0639 0645 +FCBC <initial> 063A 062C +FCBD <initial> 063A 0645 +FCBE <initial> 0641 062C +FCBF <initial> 0641 062D +FCC0 <initial> 0641 062E +FCC1 <initial> 0641 0645 +FCC2 <initial> 0642 062D +FCC3 <initial> 0642 0645 +FCC4 <initial> 0643 062C +FCC5 <initial> 0643 062D +FCC6 <initial> 0643 062E +FCC7 <initial> 0643 0644 +FCC8 <initial> 0643 0645 +FCC9 <initial> 0644 062C +FCCA <initial> 0644 062D +FCCB <initial> 0644 062E +FCCC <initial> 0644 0645 +FCCD <initial> 0644 0647 +FCCE <initial> 0645 062C +FCCF <initial> 0645 062D +FCD0 <initial> 0645 062E +FCD1 <initial> 0645 0645 +FCD2 <initial> 0646 062C +FCD3 <initial> 0646 062D +FCD4 <initial> 0646 062E +FCD5 <initial> 0646 0645 +FCD6 <initial> 0646 0647 +FCD7 <initial> 0647 062C +FCD8 <initial> 0647 0645 +FCD9 <initial> 0647 0670 +FCDA <initial> 064A 062C +FCDB <initial> 064A 062D +FCDC <initial> 064A 062E +FCDD <initial> 064A 0645 +FCDE <initial> 064A 0647 +FCDF <medial> 0626 0645 +FCE0 <medial> 0626 0647 +FCE1 <medial> 0628 0645 +FCE2 <medial> 0628 0647 +FCE3 <medial> 062A 0645 +FCE4 <medial> 062A 0647 +FCE5 <medial> 062B 0645 +FCE6 <medial> 062B 0647 +FCE7 <medial> 0633 0645 +FCE8 <medial> 0633 0647 +FCE9 <medial> 0634 0645 +FCEA <medial> 0634 0647 +FCEB <medial> 0643 0644 +FCEC <medial> 0643 0645 +FCED <medial> 0644 0645 +FCEE <medial> 0646 0645 +FCEF <medial> 0646 0647 +FCF0 <medial> 064A 0645 +FCF1 <medial> 064A 0647 +FCF2 <medial> 0640 064E 0651 +FCF3 <medial> 0640 064F 0651 +FCF4 <medial> 0640 0650 0651 +FCF5 <isolated> 0637 0649 +FCF6 <isolated> 0637 064A +FCF7 <isolated> 0639 0649 +FCF8 <isolated> 0639 064A +FCF9 <isolated> 063A 0649 +FCFA <isolated> 063A 064A +FCFB <isolated> 0633 0649 +FCFC <isolated> 0633 064A +FCFD <isolated> 0634 0649 +FCFE <isolated> 0634 064A +FCFF <isolated> 062D 0649 +FD00 <isolated> 062D 064A +FD01 <isolated> 062C 0649 +FD02 <isolated> 062C 064A +FD03 <isolated> 062E 0649 +FD04 <isolated> 062E 064A +FD05 <isolated> 0635 0649 +FD06 <isolated> 0635 064A +FD07 <isolated> 0636 0649 +FD08 <isolated> 0636 064A +FD09 <isolated> 0634 062C +FD0A <isolated> 0634 062D +FD0B <isolated> 0634 062E +FD0C <isolated> 0634 0645 +FD0D <isolated> 0634 0631 +FD0E <isolated> 0633 0631 +FD0F <isolated> 0635 0631 +FD10 <isolated> 0636 0631 +FD11 <final> 0637 0649 +FD12 <final> 0637 064A +FD13 <final> 0639 0649 +FD14 <final> 0639 064A +FD15 <final> 063A 0649 +FD16 <final> 063A 064A +FD17 <final> 0633 0649 +FD18 <final> 0633 064A +FD19 <final> 0634 0649 +FD1A <final> 0634 064A +FD1B <final> 062D 0649 +FD1C <final> 062D 064A +FD1D <final> 062C 0649 +FD1E <final> 062C 064A +FD1F <final> 062E 0649 +FD20 <final> 062E 064A +FD21 <final> 0635 0649 +FD22 <final> 0635 064A +FD23 <final> 0636 0649 +FD24 <final> 0636 064A +FD25 <final> 0634 062C +FD26 <final> 0634 062D +FD27 <final> 0634 062E +FD28 <final> 0634 0645 +FD29 <final> 0634 0631 +FD2A <final> 0633 0631 +FD2B <final> 0635 0631 +FD2C <final> 0636 0631 +FD2D <initial> 0634 062C +FD2E <initial> 0634 062D +FD2F <initial> 0634 062E +FD30 <initial> 0634 0645 +FD31 <initial> 0633 0647 +FD32 <initial> 0634 0647 +FD33 <initial> 0637 0645 +FD34 <medial> 0633 062C +FD35 <medial> 0633 062D +FD36 <medial> 0633 062E +FD37 <medial> 0634 062C +FD38 <medial> 0634 062D +FD39 <medial> 0634 062E +FD3A <medial> 0637 0645 +FD3B <medial> 0638 0645 +FD3C <final> 0627 064B +FD3D <isolated> 0627 064B +FD50 <initial> 062A 062C 0645 +FD51 <final> 062A 062D 062C +FD52 <initial> 062A 062D 062C +FD53 <initial> 062A 062D 0645 +FD54 <initial> 062A 062E 0645 +FD55 <initial> 062A 0645 062C +FD56 <initial> 062A 0645 062D +FD57 <initial> 062A 0645 062E +FD58 <final> 062C 0645 062D +FD59 <initial> 062C 0645 062D +FD5A <final> 062D 0645 064A +FD5B <final> 062D 0645 0649 +FD5C <initial> 0633 062D 062C +FD5D <initial> 0633 062C 062D +FD5E <final> 0633 062C 0649 +FD5F <final> 0633 0645 062D +FD60 <initial> 0633 0645 062D +FD61 <initial> 0633 0645 062C +FD62 <final> 0633 0645 0645 +FD63 <initial> 0633 0645 0645 +FD64 <final> 0635 062D 062D +FD65 <initial> 0635 062D 062D +FD66 <final> 0635 0645 0645 +FD67 <final> 0634 062D 0645 +FD68 <initial> 0634 062D 0645 +FD69 <final> 0634 062C 064A +FD6A <final> 0634 0645 062E +FD6B <initial> 0634 0645 062E +FD6C <final> 0634 0645 0645 +FD6D <initial> 0634 0645 0645 +FD6E <final> 0636 062D 0649 +FD6F <final> 0636 062E 0645 +FD70 <initial> 0636 062E 0645 +FD71 <final> 0637 0645 062D +FD72 <initial> 0637 0645 062D +FD73 <initial> 0637 0645 0645 +FD74 <final> 0637 0645 064A +FD75 <final> 0639 062C 0645 +FD76 <final> 0639 0645 0645 +FD77 <initial> 0639 0645 0645 +FD78 <final> 0639 0645 0649 +FD79 <final> 063A 0645 0645 +FD7A <final> 063A 0645 064A +FD7B <final> 063A 0645 0649 +FD7C <final> 0641 062E 0645 +FD7D <initial> 0641 062E 0645 +FD7E <final> 0642 0645 062D +FD7F <final> 0642 0645 0645 +FD80 <final> 0644 062D 0645 +FD81 <final> 0644 062D 064A +FD82 <final> 0644 062D 0649 +FD83 <initial> 0644 062C 062C +FD84 <final> 0644 062C 062C +FD85 <final> 0644 062E 0645 +FD86 <initial> 0644 062E 0645 +FD87 <final> 0644 0645 062D +FD88 <initial> 0644 0645 062D +FD89 <initial> 0645 062D 062C +FD8A <initial> 0645 062D 0645 +FD8B <final> 0645 062D 064A +FD8C <initial> 0645 062C 062D +FD8D <initial> 0645 062C 0645 +FD8E <initial> 0645 062E 062C +FD8F <initial> 0645 062E 0645 +FD92 <initial> 0645 062C 062E +FD93 <initial> 0647 0645 062C +FD94 <initial> 0647 0645 0645 +FD95 <initial> 0646 062D 0645 +FD96 <final> 0646 062D 0649 +FD97 <final> 0646 062C 0645 +FD98 <initial> 0646 062C 0645 +FD99 <final> 0646 062C 0649 +FD9A <final> 0646 0645 064A +FD9B <final> 0646 0645 0649 +FD9C <final> 064A 0645 0645 +FD9D <initial> 064A 0645 0645 +FD9E <final> 0628 062E 064A +FD9F <final> 062A 062C 064A +FDA0 <final> 062A 062C 0649 +FDA1 <final> 062A 062E 064A +FDA2 <final> 062A 062E 0649 +FDA3 <final> 062A 0645 064A +FDA4 <final> 062A 0645 0649 +FDA5 <final> 062C 0645 064A +FDA6 <final> 062C 062D 0649 +FDA7 <final> 062C 0645 0649 +FDA8 <final> 0633 062E 0649 +FDA9 <final> 0635 062D 064A +FDAA <final> 0634 062D 064A +FDAB <final> 0636 062D 064A +FDAC <final> 0644 062C 064A +FDAD <final> 0644 0645 064A +FDAE <final> 064A 062D 064A +FDAF <final> 064A 062C 064A +FDB0 <final> 064A 0645 064A +FDB1 <final> 0645 0645 064A +FDB2 <final> 0642 0645 064A +FDB3 <final> 0646 062D 064A +FDB4 <initial> 0642 0645 062D +FDB5 <initial> 0644 062D 0645 +FDB6 <final> 0639 0645 064A +FDB7 <final> 0643 0645 064A +FDB8 <initial> 0646 062C 062D +FDB9 <final> 0645 062E 064A +FDBA <initial> 0644 062C 0645 +FDBB <final> 0643 0645 0645 +FDBC <final> 0644 062C 0645 +FDBD <final> 0646 062C 062D +FDBE <final> 062C 062D 064A +FDBF <final> 062D 062C 064A +FDC0 <final> 0645 062C 064A +FDC1 <final> 0641 0645 064A +FDC2 <final> 0628 062D 064A +FDC3 <initial> 0643 0645 0645 +FDC4 <initial> 0639 062C 0645 +FDC5 <initial> 0635 0645 0645 +FDC6 <final> 0633 062E 064A +FDC7 <final> 0646 062C 064A +FDF0 <isolated> 0635 0644 06D2 +FDF1 <isolated> 0642 0644 06D2 +FDF2 <isolated> 0627 0644 0644 0647 +FDF3 <isolated> 0627 0643 0628 0631 +FDF4 <isolated> 0645 062D 0645 062F +FDF5 <isolated> 0635 0644 0639 0645 +FDF6 <isolated> 0631 0633 0648 0644 +FDF7 <isolated> 0639 0644 064A 0647 +FDF8 <isolated> 0648 0633 0644 0645 +FDF9 <isolated> 0635 0644 0649 +FDFA <isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645 +FDFB <isolated> 062C 0644 0020 062C 0644 0627 0644 0647 +FDFC <isolated> 0631 06CC 0627 0644 +FE10 <vertical> 002C +FE11 <vertical> 3001 +FE12 <vertical> 3002 +FE13 <vertical> 003A +FE14 <vertical> 003B +FE15 <vertical> 0021 +FE16 <vertical> 003F +FE17 <vertical> 3016 +FE18 <vertical> 3017 +FE19 <vertical> 2026 +FE30 <vertical> 2025 +FE31 <vertical> 2014 +FE32 <vertical> 2013 +FE33 FE34 <vertical> 005F +FE35 <vertical> 0028 +FE36 <vertical> 0029 +FE37 <vertical> 007B +FE38 <vertical> 007D +FE39 <vertical> 3014 +FE3A <vertical> 3015 +FE3B <vertical> 3010 +FE3C <vertical> 3011 +FE3D <vertical> 300A +FE3E <vertical> 300B +FE3F <vertical> 3008 +FE40 <vertical> 3009 +FE41 <vertical> 300C +FE42 <vertical> 300D +FE43 <vertical> 300E +FE44 <vertical> 300F +FE47 <vertical> 005B +FE48 <vertical> 005D +FE49 FE4C <compat> 203E +FE4D FE4F <compat> 005F +FE50 <small> 002C +FE51 <small> 3001 +FE52 <small> 002E +FE54 <small> 003B +FE55 <small> 003A +FE56 <small> 003F +FE57 <small> 0021 +FE58 <small> 2014 +FE59 <small> 0028 +FE5A <small> 0029 +FE5B <small> 007B +FE5C <small> 007D +FE5D <small> 3014 +FE5E <small> 3015 +FE5F <small> 0023 +FE60 <small> 0026 +FE61 <small> 002A +FE62 <small> 002B +FE63 <small> 002D +FE64 <small> 003C +FE65 <small> 003E +FE66 <small> 003D +FE68 <small> 005C +FE69 <small> 0024 +FE6A <small> 0025 +FE6B <small> 0040 +FE70 <isolated> 0020 064B +FE71 <medial> 0640 064B +FE72 <isolated> 0020 064C +FE74 <isolated> 0020 064D +FE76 <isolated> 0020 064E +FE77 <medial> 0640 064E +FE78 <isolated> 0020 064F +FE79 <medial> 0640 064F +FE7A <isolated> 0020 0650 +FE7B <medial> 0640 0650 +FE7C <isolated> 0020 0651 +FE7D <medial> 0640 0651 +FE7E <isolated> 0020 0652 +FE7F <medial> 0640 0652 +FE80 <isolated> 0621 +FE81 <isolated> 0622 +FE82 <final> 0622 +FE83 <isolated> 0623 +FE84 <final> 0623 +FE85 <isolated> 0624 +FE86 <final> 0624 +FE87 <isolated> 0625 +FE88 <final> 0625 +FE89 <isolated> 0626 +FE8A <final> 0626 +FE8B <initial> 0626 +FE8C <medial> 0626 +FE8D <isolated> 0627 +FE8E <final> 0627 +FE8F <isolated> 0628 +FE90 <final> 0628 +FE91 <initial> 0628 +FE92 <medial> 0628 +FE93 <isolated> 0629 +FE94 <final> 0629 +FE95 <isolated> 062A +FE96 <final> 062A +FE97 <initial> 062A +FE98 <medial> 062A +FE99 <isolated> 062B +FE9A <final> 062B +FE9B <initial> 062B +FE9C <medial> 062B +FE9D <isolated> 062C +FE9E <final> 062C +FE9F <initial> 062C +FEA0 <medial> 062C +FEA1 <isolated> 062D +FEA2 <final> 062D +FEA3 <initial> 062D +FEA4 <medial> 062D +FEA5 <isolated> 062E +FEA6 <final> 062E +FEA7 <initial> 062E +FEA8 <medial> 062E +FEA9 <isolated> 062F +FEAA <final> 062F +FEAB <isolated> 0630 +FEAC <final> 0630 +FEAD <isolated> 0631 +FEAE <final> 0631 +FEAF <isolated> 0632 +FEB0 <final> 0632 +FEB1 <isolated> 0633 +FEB2 <final> 0633 +FEB3 <initial> 0633 +FEB4 <medial> 0633 +FEB5 <isolated> 0634 +FEB6 <final> 0634 +FEB7 <initial> 0634 +FEB8 <medial> 0634 +FEB9 <isolated> 0635 +FEBA <final> 0635 +FEBB <initial> 0635 +FEBC <medial> 0635 +FEBD <isolated> 0636 +FEBE <final> 0636 +FEBF <initial> 0636 +FEC0 <medial> 0636 +FEC1 <isolated> 0637 +FEC2 <final> 0637 +FEC3 <initial> 0637 +FEC4 <medial> 0637 +FEC5 <isolated> 0638 +FEC6 <final> 0638 +FEC7 <initial> 0638 +FEC8 <medial> 0638 +FEC9 <isolated> 0639 +FECA <final> 0639 +FECB <initial> 0639 +FECC <medial> 0639 +FECD <isolated> 063A +FECE <final> 063A +FECF <initial> 063A +FED0 <medial> 063A +FED1 <isolated> 0641 +FED2 <final> 0641 +FED3 <initial> 0641 +FED4 <medial> 0641 +FED5 <isolated> 0642 +FED6 <final> 0642 +FED7 <initial> 0642 +FED8 <medial> 0642 +FED9 <isolated> 0643 +FEDA <final> 0643 +FEDB <initial> 0643 +FEDC <medial> 0643 +FEDD <isolated> 0644 +FEDE <final> 0644 +FEDF <initial> 0644 +FEE0 <medial> 0644 +FEE1 <isolated> 0645 +FEE2 <final> 0645 +FEE3 <initial> 0645 +FEE4 <medial> 0645 +FEE5 <isolated> 0646 +FEE6 <final> 0646 +FEE7 <initial> 0646 +FEE8 <medial> 0646 +FEE9 <isolated> 0647 +FEEA <final> 0647 +FEEB <initial> 0647 +FEEC <medial> 0647 +FEED <isolated> 0648 +FEEE <final> 0648 +FEEF <isolated> 0649 +FEF0 <final> 0649 +FEF1 <isolated> 064A +FEF2 <final> 064A +FEF3 <initial> 064A +FEF4 <medial> 064A +FEF5 <isolated> 0644 0622 +FEF6 <final> 0644 0622 +FEF7 <isolated> 0644 0623 +FEF8 <final> 0644 0623 +FEF9 <isolated> 0644 0625 +FEFA <final> 0644 0625 +FEFB <isolated> 0644 0627 +FEFC <final> 0644 0627 +FF01 <wide> 0021 +FF02 <wide> 0022 +FF03 <wide> 0023 +FF04 <wide> 0024 +FF05 <wide> 0025 +FF06 <wide> 0026 +FF07 <wide> 0027 +FF08 <wide> 0028 +FF09 <wide> 0029 +FF0A <wide> 002A +FF0B <wide> 002B +FF0C <wide> 002C +FF0D <wide> 002D +FF0E <wide> 002E +FF0F <wide> 002F +FF10 <wide> 0030 +FF11 <wide> 0031 +FF12 <wide> 0032 +FF13 <wide> 0033 +FF14 <wide> 0034 +FF15 <wide> 0035 +FF16 <wide> 0036 +FF17 <wide> 0037 +FF18 <wide> 0038 +FF19 <wide> 0039 +FF1A <wide> 003A +FF1B <wide> 003B +FF1C <wide> 003C +FF1D <wide> 003D +FF1E <wide> 003E +FF1F <wide> 003F +FF20 <wide> 0040 +FF21 <wide> 0041 +FF22 <wide> 0042 +FF23 <wide> 0043 +FF24 <wide> 0044 +FF25 <wide> 0045 +FF26 <wide> 0046 +FF27 <wide> 0047 +FF28 <wide> 0048 +FF29 <wide> 0049 +FF2A <wide> 004A +FF2B <wide> 004B +FF2C <wide> 004C +FF2D <wide> 004D +FF2E <wide> 004E +FF2F <wide> 004F +FF30 <wide> 0050 +FF31 <wide> 0051 +FF32 <wide> 0052 +FF33 <wide> 0053 +FF34 <wide> 0054 +FF35 <wide> 0055 +FF36 <wide> 0056 +FF37 <wide> 0057 +FF38 <wide> 0058 +FF39 <wide> 0059 +FF3A <wide> 005A +FF3B <wide> 005B +FF3C <wide> 005C +FF3D <wide> 005D +FF3E <wide> 005E +FF3F <wide> 005F +FF40 <wide> 0060 +FF41 <wide> 0061 +FF42 <wide> 0062 +FF43 <wide> 0063 +FF44 <wide> 0064 +FF45 <wide> 0065 +FF46 <wide> 0066 +FF47 <wide> 0067 +FF48 <wide> 0068 +FF49 <wide> 0069 +FF4A <wide> 006A +FF4B <wide> 006B +FF4C <wide> 006C +FF4D <wide> 006D +FF4E <wide> 006E +FF4F <wide> 006F +FF50 <wide> 0070 +FF51 <wide> 0071 +FF52 <wide> 0072 +FF53 <wide> 0073 +FF54 <wide> 0074 +FF55 <wide> 0075 +FF56 <wide> 0076 +FF57 <wide> 0077 +FF58 <wide> 0078 +FF59 <wide> 0079 +FF5A <wide> 007A +FF5B <wide> 007B +FF5C <wide> 007C +FF5D <wide> 007D +FF5E <wide> 007E +FF5F <wide> 2985 +FF60 <wide> 2986 +FF61 <narrow> 3002 +FF62 <narrow> 300C +FF63 <narrow> 300D +FF64 <narrow> 3001 +FF65 <narrow> 30FB +FF66 <narrow> 30F2 +FF67 <narrow> 30A1 +FF68 <narrow> 30A3 +FF69 <narrow> 30A5 +FF6A <narrow> 30A7 +FF6B <narrow> 30A9 +FF6C <narrow> 30E3 +FF6D <narrow> 30E5 +FF6E <narrow> 30E7 +FF6F <narrow> 30C3 +FF70 <narrow> 30FC +FF71 <narrow> 30A2 +FF72 <narrow> 30A4 +FF73 <narrow> 30A6 +FF74 <narrow> 30A8 +FF75 <narrow> 30AA +FF76 <narrow> 30AB +FF77 <narrow> 30AD +FF78 <narrow> 30AF +FF79 <narrow> 30B1 +FF7A <narrow> 30B3 +FF7B <narrow> 30B5 +FF7C <narrow> 30B7 +FF7D <narrow> 30B9 +FF7E <narrow> 30BB +FF7F <narrow> 30BD +FF80 <narrow> 30BF +FF81 <narrow> 30C1 +FF82 <narrow> 30C4 +FF83 <narrow> 30C6 +FF84 <narrow> 30C8 +FF85 <narrow> 30CA +FF86 <narrow> 30CB +FF87 <narrow> 30CC +FF88 <narrow> 30CD +FF89 <narrow> 30CE +FF8A <narrow> 30CF +FF8B <narrow> 30D2 +FF8C <narrow> 30D5 +FF8D <narrow> 30D8 +FF8E <narrow> 30DB +FF8F <narrow> 30DE +FF90 <narrow> 30DF +FF91 <narrow> 30E0 +FF92 <narrow> 30E1 +FF93 <narrow> 30E2 +FF94 <narrow> 30E4 +FF95 <narrow> 30E6 +FF96 <narrow> 30E8 +FF97 <narrow> 30E9 +FF98 <narrow> 30EA +FF99 <narrow> 30EB +FF9A <narrow> 30EC +FF9B <narrow> 30ED +FF9C <narrow> 30EF +FF9D <narrow> 30F3 +FF9E <narrow> 3099 +FF9F <narrow> 309A +FFA0 <narrow> 3164 +FFA1 <narrow> 3131 +FFA2 <narrow> 3132 +FFA3 <narrow> 3133 +FFA4 <narrow> 3134 +FFA5 <narrow> 3135 +FFA6 <narrow> 3136 +FFA7 <narrow> 3137 +FFA8 <narrow> 3138 +FFA9 <narrow> 3139 +FFAA <narrow> 313A +FFAB <narrow> 313B +FFAC <narrow> 313C +FFAD <narrow> 313D +FFAE <narrow> 313E +FFAF <narrow> 313F +FFB0 <narrow> 3140 +FFB1 <narrow> 3141 +FFB2 <narrow> 3142 +FFB3 <narrow> 3143 +FFB4 <narrow> 3144 +FFB5 <narrow> 3145 +FFB6 <narrow> 3146 +FFB7 <narrow> 3147 +FFB8 <narrow> 3148 +FFB9 <narrow> 3149 +FFBA <narrow> 314A +FFBB <narrow> 314B +FFBC <narrow> 314C +FFBD <narrow> 314D +FFBE <narrow> 314E +FFC2 <narrow> 314F +FFC3 <narrow> 3150 +FFC4 <narrow> 3151 +FFC5 <narrow> 3152 +FFC6 <narrow> 3153 +FFC7 <narrow> 3154 +FFCA <narrow> 3155 +FFCB <narrow> 3156 +FFCC <narrow> 3157 +FFCD <narrow> 3158 +FFCE <narrow> 3159 +FFCF <narrow> 315A +FFD2 <narrow> 315B +FFD3 <narrow> 315C +FFD4 <narrow> 315D +FFD5 <narrow> 315E +FFD6 <narrow> 315F +FFD7 <narrow> 3160 +FFDA <narrow> 3161 +FFDB <narrow> 3162 +FFDC <narrow> 3163 +FFE0 <wide> 00A2 +FFE1 <wide> 00A3 +FFE2 <wide> 00AC +FFE3 <wide> 00AF +FFE4 <wide> 00A6 +FFE5 <wide> 00A5 +FFE6 <wide> 20A9 +FFE8 <narrow> 2502 +FFE9 <narrow> 2190 +FFEA <narrow> 2191 +FFEB <narrow> 2192 +FFEC <narrow> 2193 +FFED <narrow> 25A0 +FFEE <narrow> 25CB +1D15E 1D157 1D165 +1D15F 1D158 1D165 +1D160 1D15F 1D16E +1D161 1D15F 1D16F +1D162 1D15F 1D170 +1D163 1D15F 1D171 +1D164 1D15F 1D172 +1D1BB 1D1B9 1D165 +1D1BC 1D1BA 1D165 +1D1BD 1D1BB 1D16E +1D1BE 1D1BC 1D16E +1D1BF 1D1BB 1D16F +1D1C0 1D1BC 1D16F +1D400 <font> 0041 +1D401 <font> 0042 +1D402 <font> 0043 +1D403 <font> 0044 +1D404 <font> 0045 +1D405 <font> 0046 +1D406 <font> 0047 +1D407 <font> 0048 +1D408 <font> 0049 +1D409 <font> 004A +1D40A <font> 004B +1D40B <font> 004C +1D40C <font> 004D +1D40D <font> 004E +1D40E <font> 004F +1D40F <font> 0050 +1D410 <font> 0051 +1D411 <font> 0052 +1D412 <font> 0053 +1D413 <font> 0054 +1D414 <font> 0055 +1D415 <font> 0056 +1D416 <font> 0057 +1D417 <font> 0058 +1D418 <font> 0059 +1D419 <font> 005A +1D41A <font> 0061 +1D41B <font> 0062 +1D41C <font> 0063 +1D41D <font> 0064 +1D41E <font> 0065 +1D41F <font> 0066 +1D420 <font> 0067 +1D421 <font> 0068 +1D422 <font> 0069 +1D423 <font> 006A +1D424 <font> 006B +1D425 <font> 006C +1D426 <font> 006D +1D427 <font> 006E +1D428 <font> 006F +1D429 <font> 0070 +1D42A <font> 0071 +1D42B <font> 0072 +1D42C <font> 0073 +1D42D <font> 0074 +1D42E <font> 0075 +1D42F <font> 0076 +1D430 <font> 0077 +1D431 <font> 0078 +1D432 <font> 0079 +1D433 <font> 007A +1D434 <font> 0041 +1D435 <font> 0042 +1D436 <font> 0043 +1D437 <font> 0044 +1D438 <font> 0045 +1D439 <font> 0046 +1D43A <font> 0047 +1D43B <font> 0048 +1D43C <font> 0049 +1D43D <font> 004A +1D43E <font> 004B +1D43F <font> 004C +1D440 <font> 004D +1D441 <font> 004E +1D442 <font> 004F +1D443 <font> 0050 +1D444 <font> 0051 +1D445 <font> 0052 +1D446 <font> 0053 +1D447 <font> 0054 +1D448 <font> 0055 +1D449 <font> 0056 +1D44A <font> 0057 +1D44B <font> 0058 +1D44C <font> 0059 +1D44D <font> 005A +1D44E <font> 0061 +1D44F <font> 0062 +1D450 <font> 0063 +1D451 <font> 0064 +1D452 <font> 0065 +1D453 <font> 0066 +1D454 <font> 0067 +1D456 <font> 0069 +1D457 <font> 006A +1D458 <font> 006B +1D459 <font> 006C +1D45A <font> 006D +1D45B <font> 006E +1D45C <font> 006F +1D45D <font> 0070 +1D45E <font> 0071 +1D45F <font> 0072 +1D460 <font> 0073 +1D461 <font> 0074 +1D462 <font> 0075 +1D463 <font> 0076 +1D464 <font> 0077 +1D465 <font> 0078 +1D466 <font> 0079 +1D467 <font> 007A +1D468 <font> 0041 +1D469 <font> 0042 +1D46A <font> 0043 +1D46B <font> 0044 +1D46C <font> 0045 +1D46D <font> 0046 +1D46E <font> 0047 +1D46F <font> 0048 +1D470 <font> 0049 +1D471 <font> 004A +1D472 <font> 004B +1D473 <font> 004C +1D474 <font> 004D +1D475 <font> 004E +1D476 <font> 004F +1D477 <font> 0050 +1D478 <font> 0051 +1D479 <font> 0052 +1D47A <font> 0053 +1D47B <font> 0054 +1D47C <font> 0055 +1D47D <font> 0056 +1D47E <font> 0057 +1D47F <font> 0058 +1D480 <font> 0059 +1D481 <font> 005A +1D482 <font> 0061 +1D483 <font> 0062 +1D484 <font> 0063 +1D485 <font> 0064 +1D486 <font> 0065 +1D487 <font> 0066 +1D488 <font> 0067 +1D489 <font> 0068 +1D48A <font> 0069 +1D48B <font> 006A +1D48C <font> 006B +1D48D <font> 006C +1D48E <font> 006D +1D48F <font> 006E +1D490 <font> 006F +1D491 <font> 0070 +1D492 <font> 0071 +1D493 <font> 0072 +1D494 <font> 0073 +1D495 <font> 0074 +1D496 <font> 0075 +1D497 <font> 0076 +1D498 <font> 0077 +1D499 <font> 0078 +1D49A <font> 0079 +1D49B <font> 007A +1D49C <font> 0041 +1D49E <font> 0043 +1D49F <font> 0044 +1D4A2 <font> 0047 +1D4A5 <font> 004A +1D4A6 <font> 004B +1D4A9 <font> 004E +1D4AA <font> 004F +1D4AB <font> 0050 +1D4AC <font> 0051 +1D4AE <font> 0053 +1D4AF <font> 0054 +1D4B0 <font> 0055 +1D4B1 <font> 0056 +1D4B2 <font> 0057 +1D4B3 <font> 0058 +1D4B4 <font> 0059 +1D4B5 <font> 005A +1D4B6 <font> 0061 +1D4B7 <font> 0062 +1D4B8 <font> 0063 +1D4B9 <font> 0064 +1D4BB <font> 0066 +1D4BD <font> 0068 +1D4BE <font> 0069 +1D4BF <font> 006A +1D4C0 <font> 006B +1D4C1 <font> 006C +1D4C2 <font> 006D +1D4C3 <font> 006E +1D4C5 <font> 0070 +1D4C6 <font> 0071 +1D4C7 <font> 0072 +1D4C8 <font> 0073 +1D4C9 <font> 0074 +1D4CA <font> 0075 +1D4CB <font> 0076 +1D4CC <font> 0077 +1D4CD <font> 0078 +1D4CE <font> 0079 +1D4CF <font> 007A +1D4D0 <font> 0041 +1D4D1 <font> 0042 +1D4D2 <font> 0043 +1D4D3 <font> 0044 +1D4D4 <font> 0045 +1D4D5 <font> 0046 +1D4D6 <font> 0047 +1D4D7 <font> 0048 +1D4D8 <font> 0049 +1D4D9 <font> 004A +1D4DA <font> 004B +1D4DB <font> 004C +1D4DC <font> 004D +1D4DD <font> 004E +1D4DE <font> 004F +1D4DF <font> 0050 +1D4E0 <font> 0051 +1D4E1 <font> 0052 +1D4E2 <font> 0053 +1D4E3 <font> 0054 +1D4E4 <font> 0055 +1D4E5 <font> 0056 +1D4E6 <font> 0057 +1D4E7 <font> 0058 +1D4E8 <font> 0059 +1D4E9 <font> 005A +1D4EA <font> 0061 +1D4EB <font> 0062 +1D4EC <font> 0063 +1D4ED <font> 0064 +1D4EE <font> 0065 +1D4EF <font> 0066 +1D4F0 <font> 0067 +1D4F1 <font> 0068 +1D4F2 <font> 0069 +1D4F3 <font> 006A +1D4F4 <font> 006B +1D4F5 <font> 006C +1D4F6 <font> 006D +1D4F7 <font> 006E +1D4F8 <font> 006F +1D4F9 <font> 0070 +1D4FA <font> 0071 +1D4FB <font> 0072 +1D4FC <font> 0073 +1D4FD <font> 0074 +1D4FE <font> 0075 +1D4FF <font> 0076 +1D500 <font> 0077 +1D501 <font> 0078 +1D502 <font> 0079 +1D503 <font> 007A +1D504 <font> 0041 +1D505 <font> 0042 +1D507 <font> 0044 +1D508 <font> 0045 +1D509 <font> 0046 +1D50A <font> 0047 +1D50D <font> 004A +1D50E <font> 004B +1D50F <font> 004C +1D510 <font> 004D +1D511 <font> 004E +1D512 <font> 004F +1D513 <font> 0050 +1D514 <font> 0051 +1D516 <font> 0053 +1D517 <font> 0054 +1D518 <font> 0055 +1D519 <font> 0056 +1D51A <font> 0057 +1D51B <font> 0058 +1D51C <font> 0059 +1D51E <font> 0061 +1D51F <font> 0062 +1D520 <font> 0063 +1D521 <font> 0064 +1D522 <font> 0065 +1D523 <font> 0066 +1D524 <font> 0067 +1D525 <font> 0068 +1D526 <font> 0069 +1D527 <font> 006A +1D528 <font> 006B +1D529 <font> 006C +1D52A <font> 006D +1D52B <font> 006E +1D52C <font> 006F +1D52D <font> 0070 +1D52E <font> 0071 +1D52F <font> 0072 +1D530 <font> 0073 +1D531 <font> 0074 +1D532 <font> 0075 +1D533 <font> 0076 +1D534 <font> 0077 +1D535 <font> 0078 +1D536 <font> 0079 +1D537 <font> 007A +1D538 <font> 0041 +1D539 <font> 0042 +1D53B <font> 0044 +1D53C <font> 0045 +1D53D <font> 0046 +1D53E <font> 0047 +1D540 <font> 0049 +1D541 <font> 004A +1D542 <font> 004B +1D543 <font> 004C +1D544 <font> 004D +1D546 <font> 004F +1D54A <font> 0053 +1D54B <font> 0054 +1D54C <font> 0055 +1D54D <font> 0056 +1D54E <font> 0057 +1D54F <font> 0058 +1D550 <font> 0059 +1D552 <font> 0061 +1D553 <font> 0062 +1D554 <font> 0063 +1D555 <font> 0064 +1D556 <font> 0065 +1D557 <font> 0066 +1D558 <font> 0067 +1D559 <font> 0068 +1D55A <font> 0069 +1D55B <font> 006A +1D55C <font> 006B +1D55D <font> 006C +1D55E <font> 006D +1D55F <font> 006E +1D560 <font> 006F +1D561 <font> 0070 +1D562 <font> 0071 +1D563 <font> 0072 +1D564 <font> 0073 +1D565 <font> 0074 +1D566 <font> 0075 +1D567 <font> 0076 +1D568 <font> 0077 +1D569 <font> 0078 +1D56A <font> 0079 +1D56B <font> 007A +1D56C <font> 0041 +1D56D <font> 0042 +1D56E <font> 0043 +1D56F <font> 0044 +1D570 <font> 0045 +1D571 <font> 0046 +1D572 <font> 0047 +1D573 <font> 0048 +1D574 <font> 0049 +1D575 <font> 004A +1D576 <font> 004B +1D577 <font> 004C +1D578 <font> 004D +1D579 <font> 004E +1D57A <font> 004F +1D57B <font> 0050 +1D57C <font> 0051 +1D57D <font> 0052 +1D57E <font> 0053 +1D57F <font> 0054 +1D580 <font> 0055 +1D581 <font> 0056 +1D582 <font> 0057 +1D583 <font> 0058 +1D584 <font> 0059 +1D585 <font> 005A +1D586 <font> 0061 +1D587 <font> 0062 +1D588 <font> 0063 +1D589 <font> 0064 +1D58A <font> 0065 +1D58B <font> 0066 +1D58C <font> 0067 +1D58D <font> 0068 +1D58E <font> 0069 +1D58F <font> 006A +1D590 <font> 006B +1D591 <font> 006C +1D592 <font> 006D +1D593 <font> 006E +1D594 <font> 006F +1D595 <font> 0070 +1D596 <font> 0071 +1D597 <font> 0072 +1D598 <font> 0073 +1D599 <font> 0074 +1D59A <font> 0075 +1D59B <font> 0076 +1D59C <font> 0077 +1D59D <font> 0078 +1D59E <font> 0079 +1D59F <font> 007A +1D5A0 <font> 0041 +1D5A1 <font> 0042 +1D5A2 <font> 0043 +1D5A3 <font> 0044 +1D5A4 <font> 0045 +1D5A5 <font> 0046 +1D5A6 <font> 0047 +1D5A7 <font> 0048 +1D5A8 <font> 0049 +1D5A9 <font> 004A +1D5AA <font> 004B +1D5AB <font> 004C +1D5AC <font> 004D +1D5AD <font> 004E +1D5AE <font> 004F +1D5AF <font> 0050 +1D5B0 <font> 0051 +1D5B1 <font> 0052 +1D5B2 <font> 0053 +1D5B3 <font> 0054 +1D5B4 <font> 0055 +1D5B5 <font> 0056 +1D5B6 <font> 0057 +1D5B7 <font> 0058 +1D5B8 <font> 0059 +1D5B9 <font> 005A +1D5BA <font> 0061 +1D5BB <font> 0062 +1D5BC <font> 0063 +1D5BD <font> 0064 +1D5BE <font> 0065 +1D5BF <font> 0066 +1D5C0 <font> 0067 +1D5C1 <font> 0068 +1D5C2 <font> 0069 +1D5C3 <font> 006A +1D5C4 <font> 006B +1D5C5 <font> 006C +1D5C6 <font> 006D +1D5C7 <font> 006E +1D5C8 <font> 006F +1D5C9 <font> 0070 +1D5CA <font> 0071 +1D5CB <font> 0072 +1D5CC <font> 0073 +1D5CD <font> 0074 +1D5CE <font> 0075 +1D5CF <font> 0076 +1D5D0 <font> 0077 +1D5D1 <font> 0078 +1D5D2 <font> 0079 +1D5D3 <font> 007A +1D5D4 <font> 0041 +1D5D5 <font> 0042 +1D5D6 <font> 0043 +1D5D7 <font> 0044 +1D5D8 <font> 0045 +1D5D9 <font> 0046 +1D5DA <font> 0047 +1D5DB <font> 0048 +1D5DC <font> 0049 +1D5DD <font> 004A +1D5DE <font> 004B +1D5DF <font> 004C +1D5E0 <font> 004D +1D5E1 <font> 004E +1D5E2 <font> 004F +1D5E3 <font> 0050 +1D5E4 <font> 0051 +1D5E5 <font> 0052 +1D5E6 <font> 0053 +1D5E7 <font> 0054 +1D5E8 <font> 0055 +1D5E9 <font> 0056 +1D5EA <font> 0057 +1D5EB <font> 0058 +1D5EC <font> 0059 +1D5ED <font> 005A +1D5EE <font> 0061 +1D5EF <font> 0062 +1D5F0 <font> 0063 +1D5F1 <font> 0064 +1D5F2 <font> 0065 +1D5F3 <font> 0066 +1D5F4 <font> 0067 +1D5F5 <font> 0068 +1D5F6 <font> 0069 +1D5F7 <font> 006A +1D5F8 <font> 006B +1D5F9 <font> 006C +1D5FA <font> 006D +1D5FB <font> 006E +1D5FC <font> 006F +1D5FD <font> 0070 +1D5FE <font> 0071 +1D5FF <font> 0072 +1D600 <font> 0073 +1D601 <font> 0074 +1D602 <font> 0075 +1D603 <font> 0076 +1D604 <font> 0077 +1D605 <font> 0078 +1D606 <font> 0079 +1D607 <font> 007A +1D608 <font> 0041 +1D609 <font> 0042 +1D60A <font> 0043 +1D60B <font> 0044 +1D60C <font> 0045 +1D60D <font> 0046 +1D60E <font> 0047 +1D60F <font> 0048 +1D610 <font> 0049 +1D611 <font> 004A +1D612 <font> 004B +1D613 <font> 004C +1D614 <font> 004D +1D615 <font> 004E +1D616 <font> 004F +1D617 <font> 0050 +1D618 <font> 0051 +1D619 <font> 0052 +1D61A <font> 0053 +1D61B <font> 0054 +1D61C <font> 0055 +1D61D <font> 0056 +1D61E <font> 0057 +1D61F <font> 0058 +1D620 <font> 0059 +1D621 <font> 005A +1D622 <font> 0061 +1D623 <font> 0062 +1D624 <font> 0063 +1D625 <font> 0064 +1D626 <font> 0065 +1D627 <font> 0066 +1D628 <font> 0067 +1D629 <font> 0068 +1D62A <font> 0069 +1D62B <font> 006A +1D62C <font> 006B +1D62D <font> 006C +1D62E <font> 006D +1D62F <font> 006E +1D630 <font> 006F +1D631 <font> 0070 +1D632 <font> 0071 +1D633 <font> 0072 +1D634 <font> 0073 +1D635 <font> 0074 +1D636 <font> 0075 +1D637 <font> 0076 +1D638 <font> 0077 +1D639 <font> 0078 +1D63A <font> 0079 +1D63B <font> 007A +1D63C <font> 0041 +1D63D <font> 0042 +1D63E <font> 0043 +1D63F <font> 0044 +1D640 <font> 0045 +1D641 <font> 0046 +1D642 <font> 0047 +1D643 <font> 0048 +1D644 <font> 0049 +1D645 <font> 004A +1D646 <font> 004B +1D647 <font> 004C +1D648 <font> 004D +1D649 <font> 004E +1D64A <font> 004F +1D64B <font> 0050 +1D64C <font> 0051 +1D64D <font> 0052 +1D64E <font> 0053 +1D64F <font> 0054 +1D650 <font> 0055 +1D651 <font> 0056 +1D652 <font> 0057 +1D653 <font> 0058 +1D654 <font> 0059 +1D655 <font> 005A +1D656 <font> 0061 +1D657 <font> 0062 +1D658 <font> 0063 +1D659 <font> 0064 +1D65A <font> 0065 +1D65B <font> 0066 +1D65C <font> 0067 +1D65D <font> 0068 +1D65E <font> 0069 +1D65F <font> 006A +1D660 <font> 006B +1D661 <font> 006C +1D662 <font> 006D +1D663 <font> 006E +1D664 <font> 006F +1D665 <font> 0070 +1D666 <font> 0071 +1D667 <font> 0072 +1D668 <font> 0073 +1D669 <font> 0074 +1D66A <font> 0075 +1D66B <font> 0076 +1D66C <font> 0077 +1D66D <font> 0078 +1D66E <font> 0079 +1D66F <font> 007A +1D670 <font> 0041 +1D671 <font> 0042 +1D672 <font> 0043 +1D673 <font> 0044 +1D674 <font> 0045 +1D675 <font> 0046 +1D676 <font> 0047 +1D677 <font> 0048 +1D678 <font> 0049 +1D679 <font> 004A +1D67A <font> 004B +1D67B <font> 004C +1D67C <font> 004D +1D67D <font> 004E +1D67E <font> 004F +1D67F <font> 0050 +1D680 <font> 0051 +1D681 <font> 0052 +1D682 <font> 0053 +1D683 <font> 0054 +1D684 <font> 0055 +1D685 <font> 0056 +1D686 <font> 0057 +1D687 <font> 0058 +1D688 <font> 0059 +1D689 <font> 005A +1D68A <font> 0061 +1D68B <font> 0062 +1D68C <font> 0063 +1D68D <font> 0064 +1D68E <font> 0065 +1D68F <font> 0066 +1D690 <font> 0067 +1D691 <font> 0068 +1D692 <font> 0069 +1D693 <font> 006A +1D694 <font> 006B +1D695 <font> 006C +1D696 <font> 006D +1D697 <font> 006E +1D698 <font> 006F +1D699 <font> 0070 +1D69A <font> 0071 +1D69B <font> 0072 +1D69C <font> 0073 +1D69D <font> 0074 +1D69E <font> 0075 +1D69F <font> 0076 +1D6A0 <font> 0077 +1D6A1 <font> 0078 +1D6A2 <font> 0079 +1D6A3 <font> 007A +1D6A4 <font> 0131 +1D6A5 <font> 0237 +1D6A8 <font> 0391 +1D6A9 <font> 0392 +1D6AA <font> 0393 +1D6AB <font> 0394 +1D6AC <font> 0395 +1D6AD <font> 0396 +1D6AE <font> 0397 +1D6AF <font> 0398 +1D6B0 <font> 0399 +1D6B1 <font> 039A +1D6B2 <font> 039B +1D6B3 <font> 039C +1D6B4 <font> 039D +1D6B5 <font> 039E +1D6B6 <font> 039F +1D6B7 <font> 03A0 +1D6B8 <font> 03A1 +1D6B9 <font> 03F4 +1D6BA <font> 03A3 +1D6BB <font> 03A4 +1D6BC <font> 03A5 +1D6BD <font> 03A6 +1D6BE <font> 03A7 +1D6BF <font> 03A8 +1D6C0 <font> 03A9 +1D6C1 <font> 2207 +1D6C2 <font> 03B1 +1D6C3 <font> 03B2 +1D6C4 <font> 03B3 +1D6C5 <font> 03B4 +1D6C6 <font> 03B5 +1D6C7 <font> 03B6 +1D6C8 <font> 03B7 +1D6C9 <font> 03B8 +1D6CA <font> 03B9 +1D6CB <font> 03BA +1D6CC <font> 03BB +1D6CD <font> 03BC +1D6CE <font> 03BD +1D6CF <font> 03BE +1D6D0 <font> 03BF +1D6D1 <font> 03C0 +1D6D2 <font> 03C1 +1D6D3 <font> 03C2 +1D6D4 <font> 03C3 +1D6D5 <font> 03C4 +1D6D6 <font> 03C5 +1D6D7 <font> 03C6 +1D6D8 <font> 03C7 +1D6D9 <font> 03C8 +1D6DA <font> 03C9 +1D6DB <font> 2202 +1D6DC <font> 03F5 +1D6DD <font> 03D1 +1D6DE <font> 03F0 +1D6DF <font> 03D5 +1D6E0 <font> 03F1 +1D6E1 <font> 03D6 +1D6E2 <font> 0391 +1D6E3 <font> 0392 +1D6E4 <font> 0393 +1D6E5 <font> 0394 +1D6E6 <font> 0395 +1D6E7 <font> 0396 +1D6E8 <font> 0397 +1D6E9 <font> 0398 +1D6EA <font> 0399 +1D6EB <font> 039A +1D6EC <font> 039B +1D6ED <font> 039C +1D6EE <font> 039D +1D6EF <font> 039E +1D6F0 <font> 039F +1D6F1 <font> 03A0 +1D6F2 <font> 03A1 +1D6F3 <font> 03F4 +1D6F4 <font> 03A3 +1D6F5 <font> 03A4 +1D6F6 <font> 03A5 +1D6F7 <font> 03A6 +1D6F8 <font> 03A7 +1D6F9 <font> 03A8 +1D6FA <font> 03A9 +1D6FB <font> 2207 +1D6FC <font> 03B1 +1D6FD <font> 03B2 +1D6FE <font> 03B3 +1D6FF <font> 03B4 +1D700 <font> 03B5 +1D701 <font> 03B6 +1D702 <font> 03B7 +1D703 <font> 03B8 +1D704 <font> 03B9 +1D705 <font> 03BA +1D706 <font> 03BB +1D707 <font> 03BC +1D708 <font> 03BD +1D709 <font> 03BE +1D70A <font> 03BF +1D70B <font> 03C0 +1D70C <font> 03C1 +1D70D <font> 03C2 +1D70E <font> 03C3 +1D70F <font> 03C4 +1D710 <font> 03C5 +1D711 <font> 03C6 +1D712 <font> 03C7 +1D713 <font> 03C8 +1D714 <font> 03C9 +1D715 <font> 2202 +1D716 <font> 03F5 +1D717 <font> 03D1 +1D718 <font> 03F0 +1D719 <font> 03D5 +1D71A <font> 03F1 +1D71B <font> 03D6 +1D71C <font> 0391 +1D71D <font> 0392 +1D71E <font> 0393 +1D71F <font> 0394 +1D720 <font> 0395 +1D721 <font> 0396 +1D722 <font> 0397 +1D723 <font> 0398 +1D724 <font> 0399 +1D725 <font> 039A +1D726 <font> 039B +1D727 <font> 039C +1D728 <font> 039D +1D729 <font> 039E +1D72A <font> 039F +1D72B <font> 03A0 +1D72C <font> 03A1 +1D72D <font> 03F4 +1D72E <font> 03A3 +1D72F <font> 03A4 +1D730 <font> 03A5 +1D731 <font> 03A6 +1D732 <font> 03A7 +1D733 <font> 03A8 +1D734 <font> 03A9 +1D735 <font> 2207 +1D736 <font> 03B1 +1D737 <font> 03B2 +1D738 <font> 03B3 +1D739 <font> 03B4 +1D73A <font> 03B5 +1D73B <font> 03B6 +1D73C <font> 03B7 +1D73D <font> 03B8 +1D73E <font> 03B9 +1D73F <font> 03BA +1D740 <font> 03BB +1D741 <font> 03BC +1D742 <font> 03BD +1D743 <font> 03BE +1D744 <font> 03BF +1D745 <font> 03C0 +1D746 <font> 03C1 +1D747 <font> 03C2 +1D748 <font> 03C3 +1D749 <font> 03C4 +1D74A <font> 03C5 +1D74B <font> 03C6 +1D74C <font> 03C7 +1D74D <font> 03C8 +1D74E <font> 03C9 +1D74F <font> 2202 +1D750 <font> 03F5 +1D751 <font> 03D1 +1D752 <font> 03F0 +1D753 <font> 03D5 +1D754 <font> 03F1 +1D755 <font> 03D6 +1D756 <font> 0391 +1D757 <font> 0392 +1D758 <font> 0393 +1D759 <font> 0394 +1D75A <font> 0395 +1D75B <font> 0396 +1D75C <font> 0397 +1D75D <font> 0398 +1D75E <font> 0399 +1D75F <font> 039A +1D760 <font> 039B +1D761 <font> 039C +1D762 <font> 039D +1D763 <font> 039E +1D764 <font> 039F +1D765 <font> 03A0 +1D766 <font> 03A1 +1D767 <font> 03F4 +1D768 <font> 03A3 +1D769 <font> 03A4 +1D76A <font> 03A5 +1D76B <font> 03A6 +1D76C <font> 03A7 +1D76D <font> 03A8 +1D76E <font> 03A9 +1D76F <font> 2207 +1D770 <font> 03B1 +1D771 <font> 03B2 +1D772 <font> 03B3 +1D773 <font> 03B4 +1D774 <font> 03B5 +1D775 <font> 03B6 +1D776 <font> 03B7 +1D777 <font> 03B8 +1D778 <font> 03B9 +1D779 <font> 03BA +1D77A <font> 03BB +1D77B <font> 03BC +1D77C <font> 03BD +1D77D <font> 03BE +1D77E <font> 03BF +1D77F <font> 03C0 +1D780 <font> 03C1 +1D781 <font> 03C2 +1D782 <font> 03C3 +1D783 <font> 03C4 +1D784 <font> 03C5 +1D785 <font> 03C6 +1D786 <font> 03C7 +1D787 <font> 03C8 +1D788 <font> 03C9 +1D789 <font> 2202 +1D78A <font> 03F5 +1D78B <font> 03D1 +1D78C <font> 03F0 +1D78D <font> 03D5 +1D78E <font> 03F1 +1D78F <font> 03D6 +1D790 <font> 0391 +1D791 <font> 0392 +1D792 <font> 0393 +1D793 <font> 0394 +1D794 <font> 0395 +1D795 <font> 0396 +1D796 <font> 0397 +1D797 <font> 0398 +1D798 <font> 0399 +1D799 <font> 039A +1D79A <font> 039B +1D79B <font> 039C +1D79C <font> 039D +1D79D <font> 039E +1D79E <font> 039F +1D79F <font> 03A0 +1D7A0 <font> 03A1 +1D7A1 <font> 03F4 +1D7A2 <font> 03A3 +1D7A3 <font> 03A4 +1D7A4 <font> 03A5 +1D7A5 <font> 03A6 +1D7A6 <font> 03A7 +1D7A7 <font> 03A8 +1D7A8 <font> 03A9 +1D7A9 <font> 2207 +1D7AA <font> 03B1 +1D7AB <font> 03B2 +1D7AC <font> 03B3 +1D7AD <font> 03B4 +1D7AE <font> 03B5 +1D7AF <font> 03B6 +1D7B0 <font> 03B7 +1D7B1 <font> 03B8 +1D7B2 <font> 03B9 +1D7B3 <font> 03BA +1D7B4 <font> 03BB +1D7B5 <font> 03BC +1D7B6 <font> 03BD +1D7B7 <font> 03BE +1D7B8 <font> 03BF +1D7B9 <font> 03C0 +1D7BA <font> 03C1 +1D7BB <font> 03C2 +1D7BC <font> 03C3 +1D7BD <font> 03C4 +1D7BE <font> 03C5 +1D7BF <font> 03C6 +1D7C0 <font> 03C7 +1D7C1 <font> 03C8 +1D7C2 <font> 03C9 +1D7C3 <font> 2202 +1D7C4 <font> 03F5 +1D7C5 <font> 03D1 +1D7C6 <font> 03F0 +1D7C7 <font> 03D5 +1D7C8 <font> 03F1 +1D7C9 <font> 03D6 +1D7CE <font> 0030 +1D7CF <font> 0031 +1D7D0 <font> 0032 +1D7D1 <font> 0033 +1D7D2 <font> 0034 +1D7D3 <font> 0035 +1D7D4 <font> 0036 +1D7D5 <font> 0037 +1D7D6 <font> 0038 +1D7D7 <font> 0039 +1D7D8 <font> 0030 +1D7D9 <font> 0031 +1D7DA <font> 0032 +1D7DB <font> 0033 +1D7DC <font> 0034 +1D7DD <font> 0035 +1D7DE <font> 0036 +1D7DF <font> 0037 +1D7E0 <font> 0038 +1D7E1 <font> 0039 +1D7E2 <font> 0030 +1D7E3 <font> 0031 +1D7E4 <font> 0032 +1D7E5 <font> 0033 +1D7E6 <font> 0034 +1D7E7 <font> 0035 +1D7E8 <font> 0036 +1D7E9 <font> 0037 +1D7EA <font> 0038 +1D7EB <font> 0039 +1D7EC <font> 0030 +1D7ED <font> 0031 +1D7EE <font> 0032 +1D7EF <font> 0033 +1D7F0 <font> 0034 +1D7F1 <font> 0035 +1D7F2 <font> 0036 +1D7F3 <font> 0037 +1D7F4 <font> 0038 +1D7F5 <font> 0039 +1D7F6 <font> 0030 +1D7F7 <font> 0031 +1D7F8 <font> 0032 +1D7F9 <font> 0033 +1D7FA <font> 0034 +1D7FB <font> 0035 +1D7FC <font> 0036 +1D7FD <font> 0037 +1D7FE <font> 0038 +1D7FF <font> 0039 +2F800 4E3D +2F801 4E38 +2F802 4E41 +2F803 20122 +2F804 4F60 +2F805 4FAE +2F806 4FBB +2F807 5002 +2F808 507A +2F809 5099 +2F80A 50E7 +2F80B 50CF +2F80C 349E +2F80D 2063A +2F80E 514D +2F80F 5154 +2F810 5164 +2F811 5177 +2F812 2051C +2F813 34B9 +2F814 5167 +2F815 518D +2F816 2054B +2F817 5197 +2F818 51A4 +2F819 4ECC +2F81A 51AC +2F81B 51B5 +2F81C 291DF +2F81D 51F5 +2F81E 5203 +2F81F 34DF +2F820 523B +2F821 5246 +2F822 5272 +2F823 5277 +2F824 3515 +2F825 52C7 +2F826 52C9 +2F827 52E4 +2F828 52FA +2F829 5305 +2F82A 5306 +2F82B 5317 +2F82C 5349 +2F82D 5351 +2F82E 535A +2F82F 5373 +2F830 537D +2F831 2F833 537F +2F834 20A2C +2F835 7070 +2F836 53CA +2F837 53DF +2F838 20B63 +2F839 53EB +2F83A 53F1 +2F83B 5406 +2F83C 549E +2F83D 5438 +2F83E 5448 +2F83F 5468 +2F840 54A2 +2F841 54F6 +2F842 5510 +2F843 5553 +2F844 5563 +2F845 2F846 5584 +2F847 5599 +2F848 55AB +2F849 55B3 +2F84A 55C2 +2F84B 5716 +2F84C 5606 +2F84D 5717 +2F84E 5651 +2F84F 5674 +2F850 5207 +2F851 58EE +2F852 57CE +2F853 57F4 +2F854 580D +2F855 578B +2F856 5832 +2F857 5831 +2F858 58AC +2F859 214E4 +2F85A 58F2 +2F85B 58F7 +2F85C 5906 +2F85D 591A +2F85E 5922 +2F85F 5962 +2F860 216A8 +2F861 216EA +2F862 59EC +2F863 5A1B +2F864 5A27 +2F865 59D8 +2F866 5A66 +2F867 36EE +2F868 36FC +2F869 5B08 +2F86A 2F86B 5B3E +2F86C 219C8 +2F86D 5BC3 +2F86E 5BD8 +2F86F 5BE7 +2F870 5BF3 +2F871 21B18 +2F872 5BFF +2F873 5C06 +2F874 5F53 +2F875 5C22 +2F876 3781 +2F877 5C60 +2F878 5C6E +2F879 5CC0 +2F87A 5C8D +2F87B 21DE4 +2F87C 5D43 +2F87D 21DE6 +2F87E 5D6E +2F87F 5D6B +2F880 5D7C +2F881 5DE1 +2F882 5DE2 +2F883 382F +2F884 5DFD +2F885 5E28 +2F886 5E3D +2F887 5E69 +2F888 3862 +2F889 22183 +2F88A 387C +2F88B 5EB0 +2F88C 5EB3 +2F88D 5EB6 +2F88E 5ECA +2F88F 2A392 +2F890 5EFE +2F891 2F892 22331 +2F893 8201 +2F894 2F895 5F22 +2F896 38C7 +2F897 232B8 +2F898 261DA +2F899 5F62 +2F89A 5F6B +2F89B 38E3 +2F89C 5F9A +2F89D 5FCD +2F89E 5FD7 +2F89F 5FF9 +2F8A0 6081 +2F8A1 393A +2F8A2 391C +2F8A3 6094 +2F8A4 226D4 +2F8A5 60C7 +2F8A6 6148 +2F8A7 614C +2F8A8 614E +2F8A9 614C +2F8AA 617A +2F8AB 618E +2F8AC 61B2 +2F8AD 61A4 +2F8AE 61AF +2F8AF 61DE +2F8B0 61F2 +2F8B1 61F6 +2F8B2 6210 +2F8B3 621B +2F8B4 625D +2F8B5 62B1 +2F8B6 62D4 +2F8B7 6350 +2F8B8 22B0C +2F8B9 633D +2F8BA 62FC +2F8BB 6368 +2F8BC 6383 +2F8BD 63E4 +2F8BE 22BF1 +2F8BF 6422 +2F8C0 63C5 +2F8C1 63A9 +2F8C2 3A2E +2F8C3 6469 +2F8C4 647E +2F8C5 649D +2F8C6 6477 +2F8C7 3A6C +2F8C8 654F +2F8C9 656C +2F8CA 2300A +2F8CB 65E3 +2F8CC 66F8 +2F8CD 6649 +2F8CE 3B19 +2F8CF 6691 +2F8D0 3B08 +2F8D1 3AE4 +2F8D2 5192 +2F8D3 5195 +2F8D4 6700 +2F8D5 669C +2F8D6 80AD +2F8D7 43D9 +2F8D8 6717 +2F8D9 671B +2F8DA 6721 +2F8DB 675E +2F8DC 6753 +2F8DD 233C3 +2F8DE 3B49 +2F8DF 67FA +2F8E0 6785 +2F8E1 6852 +2F8E2 6885 +2F8E3 2346D +2F8E4 688E +2F8E5 681F +2F8E6 6914 +2F8E7 3B9D +2F8E8 6942 +2F8E9 69A3 +2F8EA 69EA +2F8EB 6AA8 +2F8EC 236A3 +2F8ED 6ADB +2F8EE 3C18 +2F8EF 6B21 +2F8F0 238A7 +2F8F1 6B54 +2F8F2 3C4E +2F8F3 6B72 +2F8F4 6B9F +2F8F5 6BBA +2F8F6 6BBB +2F8F7 23A8D +2F8F8 21D0B +2F8F9 23AFA +2F8FA 6C4E +2F8FB 23CBC +2F8FC 6CBF +2F8FD 6CCD +2F8FE 6C67 +2F8FF 6D16 +2F900 6D3E +2F901 6D77 +2F902 6D41 +2F903 6D69 +2F904 6D78 +2F905 6D85 +2F906 23D1E +2F907 6D34 +2F908 6E2F +2F909 6E6E +2F90A 3D33 +2F90B 6ECB +2F90C 6EC7 +2F90D 23ED1 +2F90E 6DF9 +2F90F 6F6E +2F910 23F5E +2F911 23F8E +2F912 6FC6 +2F913 7039 +2F914 701E +2F915 701B +2F916 3D96 +2F917 704A +2F918 707D +2F919 7077 +2F91A 70AD +2F91B 20525 +2F91C 7145 +2F91D 24263 +2F91E 719C +2F91F 243AB +2F920 7228 +2F921 7235 +2F922 7250 +2F923 24608 +2F924 7280 +2F925 7295 +2F926 24735 +2F927 24814 +2F928 737A +2F929 738B +2F92A 3EAC +2F92B 73A5 +2F92C 2F92D 3EB8 +2F92E 7447 +2F92F 745C +2F930 7471 +2F931 7485 +2F932 74CA +2F933 3F1B +2F934 7524 +2F935 24C36 +2F936 753E +2F937 24C92 +2F938 7570 +2F939 2219F +2F93A 7610 +2F93B 24FA1 +2F93C 24FB8 +2F93D 25044 +2F93E 3FFC +2F93F 4008 +2F940 76F4 +2F941 250F3 +2F942 250F2 +2F943 25119 +2F944 25133 +2F945 771E +2F946 2F947 771F +2F948 774A +2F949 4039 +2F94A 778B +2F94B 4046 +2F94C 4096 +2F94D 2541D +2F94E 784E +2F94F 788C +2F950 78CC +2F951 40E3 +2F952 25626 +2F953 7956 +2F954 2569A +2F955 256C5 +2F956 798F +2F957 79EB +2F958 412F +2F959 7A40 +2F95A 7A4A +2F95B 7A4F +2F95C 2597C +2F95D 2F95E 25AA7 +2F95F 7AEE +2F960 4202 +2F961 25BAB +2F962 7BC6 +2F963 7BC9 +2F964 4227 +2F965 25C80 +2F966 7CD2 +2F967 42A0 +2F968 7CE8 +2F969 7CE3 +2F96A 7D00 +2F96B 25F86 +2F96C 7D63 +2F96D 4301 +2F96E 7DC7 +2F96F 7E02 +2F970 7E45 +2F971 4334 +2F972 26228 +2F973 26247 +2F974 4359 +2F975 262D9 +2F976 7F7A +2F977 2633E +2F978 7F95 +2F979 7FFA +2F97A 8005 +2F97B 264DA +2F97C 26523 +2F97D 8060 +2F97E 265A8 +2F97F 8070 +2F980 2335F +2F981 43D5 +2F982 80B2 +2F983 8103 +2F984 440B +2F985 813E +2F986 5AB5 +2F987 267A7 +2F988 267B5 +2F989 23393 +2F98A 2339C +2F98B 8201 +2F98C 8204 +2F98D 8F9E +2F98E 446B +2F98F 8291 +2F990 828B +2F991 829D +2F992 52B3 +2F993 82B1 +2F994 82B3 +2F995 82BD +2F996 82E6 +2F997 26B3C +2F998 82E5 +2F999 831D +2F99A 8363 +2F99B 83AD +2F99C 8323 +2F99D 83BD +2F99E 83E7 +2F99F 8457 +2F9A0 8353 +2F9A1 83CA +2F9A2 83CC +2F9A3 83DC +2F9A4 26C36 +2F9A5 26D6B +2F9A6 26CD5 +2F9A7 452B +2F9A8 84F1 +2F9A9 84F3 +2F9AA 8516 +2F9AB 273CA +2F9AC 8564 +2F9AD 26F2C +2F9AE 455D +2F9AF 4561 +2F9B0 26FB1 +2F9B1 270D2 +2F9B2 456B +2F9B3 8650 +2F9B4 865C +2F9B5 8667 +2F9B6 8669 +2F9B7 86A9 +2F9B8 8688 +2F9B9 870E +2F9BA 86E2 +2F9BB 8779 +2F9BC 8728 +2F9BD 876B +2F9BE 8786 +2F9BF 45D7 +2F9C0 87E1 +2F9C1 8801 +2F9C2 45F9 +2F9C3 8860 +2F9C4 8863 +2F9C5 27667 +2F9C6 88D7 +2F9C7 88DE +2F9C8 4635 +2F9C9 88FA +2F9CA 34BB +2F9CB 278AE +2F9CC 27966 +2F9CD 46BE +2F9CE 46C7 +2F9CF 8AA0 +2F9D0 8AED +2F9D1 8B8A +2F9D2 8C55 +2F9D3 27CA8 +2F9D4 8CAB +2F9D5 8CC1 +2F9D6 8D1B +2F9D7 8D77 +2F9D8 27F2F +2F9D9 20804 +2F9DA 8DCB +2F9DB 8DBC +2F9DC 8DF0 +2F9DD 208DE +2F9DE 8ED4 +2F9DF 8F38 +2F9E0 285D2 +2F9E1 285ED +2F9E2 9094 +2F9E3 90F1 +2F9E4 9111 +2F9E5 2872E +2F9E6 911B +2F9E7 9238 +2F9E8 92D7 +2F9E9 92D8 +2F9EA 927C +2F9EB 93F9 +2F9EC 9415 +2F9ED 28BFA +2F9EE 958B +2F9EF 4995 +2F9F0 95B7 +2F9F1 28D77 +2F9F2 49E6 +2F9F3 96C3 +2F9F4 5DB2 +2F9F5 9723 +2F9F6 29145 +2F9F7 2921A +2F9F8 4A6E +2F9F9 4A76 +2F9FA 97E0 +2F9FB 2940A +2F9FC 4AB2 +2F9FD 29496 +2F9FE 2F9FF 980B +2FA00 9829 +2FA01 295B6 +2FA02 98E2 +2FA03 4B33 +2FA04 9929 +2FA05 99A7 +2FA06 99C2 +2FA07 99FE +2FA08 4BCE +2FA09 29B30 +2FA0A 9B12 +2FA0B 9C40 +2FA0C 9CFD +2FA0D 4CCE +2FA0E 4CED +2FA0F 9D67 +2FA10 2A0CE +2FA11 4CF8 +2FA12 2A105 +2FA13 2A20E +2FA14 2A291 +2FA15 9EBB +2FA16 4D56 +2FA17 9EF9 +2FA18 9EFE +2FA19 9F05 +2FA1A 9F0F +2FA1B 9F16 +2FA1C 9F3B +2FA1D 2A600 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/EastAsianWidth.txt b/Master/tlpkg/tlperl.old/lib/unicore/EastAsianWidth.txt new file mode 100644 index 00000000000..935d041eacd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/EastAsianWidth.txt @@ -0,0 +1,16368 @@ +# EastAsianWidth-4.1.0.txt +# Date: 2005-03-17, 15:21:00 PST [KW] +# +# East Asian Width Properties +# +# This file is an informative contributory data file in the +# Unicode Character Database. +# +# Copyright (c) 1991-2005 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# The format is two fields separated by a semicolon. +# Field 0: Unicode value +# Field 1: East Asian Width property, consisting of one of the following values: +# "N", "A", "H", "W", "F", "Na" +# - All code points, assigned or unassigned, that are not listed +# explicitly are given the value "N". +# - 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 UAX #11: East Asian Character Width, for more information. +0000;N # <control> +0001;N # <control> +0002;N # <control> +0003;N # <control> +0004;N # <control> +0005;N # <control> +0006;N # <control> +0007;N # <control> +0008;N # <control> +0009;N # <control> +000A;N # <control> +000B;N # <control> +000C;N # <control> +000D;N # <control> +000E;N # <control> +000F;N # <control> +0010;N # <control> +0011;N # <control> +0012;N # <control> +0013;N # <control> +0014;N # <control> +0015;N # <control> +0016;N # <control> +0017;N # <control> +0018;N # <control> +0019;N # <control> +001A;N # <control> +001B;N # <control> +001C;N # <control> +001D;N # <control> +001E;N # <control> +001F;N # <control> +0020;Na # SPACE +0021;Na # EXCLAMATION MARK +0022;Na # QUOTATION MARK +0023;Na # NUMBER SIGN +0024;Na # DOLLAR SIGN +0025;Na # PERCENT SIGN +0026;Na # AMPERSAND +0027;Na # APOSTROPHE +0028;Na # LEFT PARENTHESIS +0029;Na # RIGHT PARENTHESIS +002A;Na # ASTERISK +002B;Na # PLUS SIGN +002C;Na # COMMA +002D;Na # HYPHEN-MINUS +002E;Na # FULL STOP +002F;Na # SOLIDUS +0030;Na # DIGIT ZERO +0031;Na # DIGIT ONE +0032;Na # DIGIT TWO +0033;Na # DIGIT THREE +0034;Na # DIGIT FOUR +0035;Na # DIGIT FIVE +0036;Na # DIGIT SIX +0037;Na # DIGIT SEVEN +0038;Na # DIGIT EIGHT +0039;Na # DIGIT NINE +003A;Na # COLON +003B;Na # SEMICOLON +003C;Na # LESS-THAN SIGN +003D;Na # EQUALS SIGN +003E;Na # GREATER-THAN SIGN +003F;Na # QUESTION MARK +0040;Na # COMMERCIAL AT +0041;Na # LATIN CAPITAL LETTER A +0042;Na # LATIN CAPITAL LETTER B +0043;Na # LATIN CAPITAL LETTER C +0044;Na # LATIN CAPITAL LETTER D +0045;Na # LATIN CAPITAL LETTER E +0046;Na # LATIN CAPITAL LETTER F +0047;Na # LATIN CAPITAL LETTER G +0048;Na # LATIN CAPITAL LETTER H +0049;Na # LATIN CAPITAL LETTER I +004A;Na # LATIN CAPITAL LETTER J +004B;Na # LATIN CAPITAL LETTER K +004C;Na # LATIN CAPITAL LETTER L +004D;Na # LATIN CAPITAL LETTER M +004E;Na # LATIN CAPITAL LETTER N +004F;Na # LATIN CAPITAL LETTER O +0050;Na # LATIN CAPITAL LETTER P +0051;Na # LATIN CAPITAL LETTER Q +0052;Na # LATIN CAPITAL LETTER R +0053;Na # LATIN CAPITAL LETTER S +0054;Na # LATIN CAPITAL LETTER T +0055;Na # LATIN CAPITAL LETTER U +0056;Na # LATIN CAPITAL LETTER V +0057;Na # LATIN CAPITAL LETTER W +0058;Na # LATIN CAPITAL LETTER X +0059;Na # LATIN CAPITAL LETTER Y +005A;Na # LATIN CAPITAL LETTER Z +005B;Na # LEFT SQUARE BRACKET +005C;Na # REVERSE SOLIDUS +005D;Na # RIGHT SQUARE BRACKET +005E;Na # CIRCUMFLEX ACCENT +005F;Na # LOW LINE +0060;Na # GRAVE ACCENT +0061;Na # LATIN SMALL LETTER A +0062;Na # LATIN SMALL LETTER B +0063;Na # LATIN SMALL LETTER C +0064;Na # LATIN SMALL LETTER D +0065;Na # LATIN SMALL LETTER E +0066;Na # LATIN SMALL LETTER F +0067;Na # LATIN SMALL LETTER G +0068;Na # LATIN SMALL LETTER H +0069;Na # LATIN SMALL LETTER I +006A;Na # LATIN SMALL LETTER J +006B;Na # LATIN SMALL LETTER K +006C;Na # LATIN SMALL LETTER L +006D;Na # LATIN SMALL LETTER M +006E;Na # LATIN SMALL LETTER N +006F;Na # LATIN SMALL LETTER O +0070;Na # LATIN SMALL LETTER P +0071;Na # LATIN SMALL LETTER Q +0072;Na # LATIN SMALL LETTER R +0073;Na # LATIN SMALL LETTER S +0074;Na # LATIN SMALL LETTER T +0075;Na # LATIN SMALL LETTER U +0076;Na # LATIN SMALL LETTER V +0077;Na # LATIN SMALL LETTER W +0078;Na # LATIN SMALL LETTER X +0079;Na # LATIN SMALL LETTER Y +007A;Na # LATIN SMALL LETTER Z +007B;Na # LEFT CURLY BRACKET +007C;Na # VERTICAL LINE +007D;Na # RIGHT CURLY BRACKET +007E;Na # TILDE +007F;N # <control> +0080;N # <control> +0081;N # <control> +0082;N # <control> +0083;N # <control> +0084;N # <control> +0085;N # <control> +0086;N # <control> +0087;N # <control> +0088;N # <control> +0089;N # <control> +008A;N # <control> +008B;N # <control> +008C;N # <control> +008D;N # <control> +008E;N # <control> +008F;N # <control> +0090;N # <control> +0091;N # <control> +0092;N # <control> +0093;N # <control> +0094;N # <control> +0095;N # <control> +0096;N # <control> +0097;N # <control> +0098;N # <control> +0099;N # <control> +009A;N # <control> +009B;N # <control> +009C;N # <control> +009D;N # <control> +009E;N # <control> +009F;N # <control> +00A0;N # NO-BREAK SPACE +00A1;A # INVERTED EXCLAMATION MARK +00A2;Na # CENT SIGN +00A3;Na # POUND SIGN +00A4;A # CURRENCY SIGN +00A5;Na # YEN SIGN +00A6;Na # BROKEN BAR +00A7;A # SECTION SIGN +00A8;A # DIAERESIS +00A9;N # COPYRIGHT SIGN +00AA;A # FEMININE ORDINAL INDICATOR +00AB;N # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC;Na # NOT SIGN +00AD;A # SOFT HYPHEN +00AE;A # REGISTERED SIGN +00AF;Na # MACRON +00B0;A # DEGREE SIGN +00B1;A # PLUS-MINUS SIGN +00B2;A # SUPERSCRIPT TWO +00B3;A # SUPERSCRIPT THREE +00B4;A # ACUTE ACCENT +00B5;N # MICRO SIGN +00B6;A # PILCROW SIGN +00B7;A # MIDDLE DOT +00B8;A # CEDILLA +00B9;A # SUPERSCRIPT ONE +00BA;A # MASCULINE ORDINAL INDICATOR +00BB;N # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BC;A # VULGAR FRACTION ONE QUARTER +00BD;A # VULGAR FRACTION ONE HALF +00BE;A # VULGAR FRACTION THREE QUARTERS +00BF;A # INVERTED QUESTION MARK +00C0;N # LATIN CAPITAL LETTER A WITH GRAVE +00C1;N # LATIN CAPITAL LETTER A WITH ACUTE +00C2;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +00C3;N # LATIN CAPITAL LETTER A WITH TILDE +00C4;N # LATIN CAPITAL LETTER A WITH DIAERESIS +00C5;N # LATIN CAPITAL LETTER A WITH RING ABOVE +00C6;A # LATIN CAPITAL LETTER AE +00C7;N # LATIN CAPITAL LETTER C WITH CEDILLA +00C8;N # LATIN CAPITAL LETTER E WITH GRAVE +00C9;N # LATIN CAPITAL LETTER E WITH ACUTE +00CA;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +00CB;N # LATIN CAPITAL LETTER E WITH DIAERESIS +00CC;N # LATIN CAPITAL LETTER I WITH GRAVE +00CD;N # LATIN CAPITAL LETTER I WITH ACUTE +00CE;N # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +00CF;N # LATIN CAPITAL LETTER I WITH DIAERESIS +00D0;A # LATIN CAPITAL LETTER ETH +00D1;N # LATIN CAPITAL LETTER N WITH TILDE +00D2;N # LATIN CAPITAL LETTER O WITH GRAVE +00D3;N # LATIN CAPITAL LETTER O WITH ACUTE +00D4;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +00D5;N # LATIN CAPITAL LETTER O WITH TILDE +00D6;N # LATIN CAPITAL LETTER O WITH DIAERESIS +00D7;A # MULTIPLICATION SIGN +00D8;A # LATIN CAPITAL LETTER O WITH STROKE +00D9;N # LATIN CAPITAL LETTER U WITH GRAVE +00DA;N # LATIN CAPITAL LETTER U WITH ACUTE +00DB;N # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +00DC;N # LATIN CAPITAL LETTER U WITH DIAERESIS +00DD;N # LATIN CAPITAL LETTER Y WITH ACUTE +00DE;A # LATIN CAPITAL LETTER THORN +00DF;A # LATIN SMALL LETTER SHARP S +00E0;A # LATIN SMALL LETTER A WITH GRAVE +00E1;A # LATIN SMALL LETTER A WITH ACUTE +00E2;N # LATIN SMALL LETTER A WITH CIRCUMFLEX +00E3;N # LATIN SMALL LETTER A WITH TILDE +00E4;N # LATIN SMALL LETTER A WITH DIAERESIS +00E5;N # LATIN SMALL LETTER A WITH RING ABOVE +00E6;A # LATIN SMALL LETTER AE +00E7;N # LATIN SMALL LETTER C WITH CEDILLA +00E8;A # LATIN SMALL LETTER E WITH GRAVE +00E9;A # LATIN SMALL LETTER E WITH ACUTE +00EA;A # LATIN SMALL LETTER E WITH CIRCUMFLEX +00EB;N # LATIN SMALL LETTER E WITH DIAERESIS +00EC;A # LATIN SMALL LETTER I WITH GRAVE +00ED;A # LATIN SMALL LETTER I WITH ACUTE +00EE;N # LATIN SMALL LETTER I WITH CIRCUMFLEX +00EF;N # LATIN SMALL LETTER I WITH DIAERESIS +00F0;A # LATIN SMALL LETTER ETH +00F1;N # LATIN SMALL LETTER N WITH TILDE +00F2;A # LATIN SMALL LETTER O WITH GRAVE +00F3;A # LATIN SMALL LETTER O WITH ACUTE +00F4;N # LATIN SMALL LETTER O WITH CIRCUMFLEX +00F5;N # LATIN SMALL LETTER O WITH TILDE +00F6;N # LATIN SMALL LETTER O WITH DIAERESIS +00F7;A # DIVISION SIGN +00F8;A # LATIN SMALL LETTER O WITH STROKE +00F9;A # LATIN SMALL LETTER U WITH GRAVE +00FA;A # LATIN SMALL LETTER U WITH ACUTE +00FB;N # LATIN SMALL LETTER U WITH CIRCUMFLEX +00FC;A # LATIN SMALL LETTER U WITH DIAERESIS +00FD;N # LATIN SMALL LETTER Y WITH ACUTE +00FE;A # LATIN SMALL LETTER THORN +00FF;N # LATIN SMALL LETTER Y WITH DIAERESIS +0100;N # LATIN CAPITAL LETTER A WITH MACRON +0101;A # LATIN SMALL LETTER A WITH MACRON +0102;N # LATIN CAPITAL LETTER A WITH BREVE +0103;N # LATIN SMALL LETTER A WITH BREVE +0104;N # LATIN CAPITAL LETTER A WITH OGONEK +0105;N # LATIN SMALL LETTER A WITH OGONEK +0106;N # LATIN CAPITAL LETTER C WITH ACUTE +0107;N # LATIN SMALL LETTER C WITH ACUTE +0108;N # LATIN CAPITAL LETTER C WITH CIRCUMFLEX +0109;N # LATIN SMALL LETTER C WITH CIRCUMFLEX +010A;N # LATIN CAPITAL LETTER C WITH DOT ABOVE +010B;N # LATIN SMALL LETTER C WITH DOT ABOVE +010C;N # LATIN CAPITAL LETTER C WITH CARON +010D;N # LATIN SMALL LETTER C WITH CARON +010E;N # LATIN CAPITAL LETTER D WITH CARON +010F;N # LATIN SMALL LETTER D WITH CARON +0110;N # LATIN CAPITAL LETTER D WITH STROKE +0111;A # LATIN SMALL LETTER D WITH STROKE +0112;N # LATIN CAPITAL LETTER E WITH MACRON +0113;A # LATIN SMALL LETTER E WITH MACRON +0114;N # LATIN CAPITAL LETTER E WITH BREVE +0115;N # LATIN SMALL LETTER E WITH BREVE +0116;N # LATIN CAPITAL LETTER E WITH DOT ABOVE +0117;N # LATIN SMALL LETTER E WITH DOT ABOVE +0118;N # LATIN CAPITAL LETTER E WITH OGONEK +0119;N # LATIN SMALL LETTER E WITH OGONEK +011A;N # LATIN CAPITAL LETTER E WITH CARON +011B;A # LATIN SMALL LETTER E WITH CARON +011C;N # LATIN CAPITAL LETTER G WITH CIRCUMFLEX +011D;N # LATIN SMALL LETTER G WITH CIRCUMFLEX +011E;N # LATIN CAPITAL LETTER G WITH BREVE +011F;N # LATIN SMALL LETTER G WITH BREVE +0120;N # LATIN CAPITAL LETTER G WITH DOT ABOVE +0121;N # LATIN SMALL LETTER G WITH DOT ABOVE +0122;N # LATIN CAPITAL LETTER G WITH CEDILLA +0123;N # LATIN SMALL LETTER G WITH CEDILLA +0124;N # LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0125;N # LATIN SMALL LETTER H WITH CIRCUMFLEX +0126;A # LATIN CAPITAL LETTER H WITH STROKE +0127;A # LATIN SMALL LETTER H WITH STROKE +0128;N # LATIN CAPITAL LETTER I WITH TILDE +0129;N # LATIN SMALL LETTER I WITH TILDE +012A;N # LATIN CAPITAL LETTER I WITH MACRON +012B;A # LATIN SMALL LETTER I WITH MACRON +012C;N # LATIN CAPITAL LETTER I WITH BREVE +012D;N # LATIN SMALL LETTER I WITH BREVE +012E;N # LATIN CAPITAL LETTER I WITH OGONEK +012F;N # LATIN SMALL LETTER I WITH OGONEK +0130;N # LATIN CAPITAL LETTER I WITH DOT ABOVE +0131;A # LATIN SMALL LETTER DOTLESS I +0132;A # LATIN CAPITAL LIGATURE IJ +0133;A # LATIN SMALL LIGATURE IJ +0134;N # LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0135;N # LATIN SMALL LETTER J WITH CIRCUMFLEX +0136;N # LATIN CAPITAL LETTER K WITH CEDILLA +0137;N # LATIN SMALL LETTER K WITH CEDILLA +0138;A # LATIN SMALL LETTER KRA +0139;N # LATIN CAPITAL LETTER L WITH ACUTE +013A;N # LATIN SMALL LETTER L WITH ACUTE +013B;N # LATIN CAPITAL LETTER L WITH CEDILLA +013C;N # LATIN SMALL LETTER L WITH CEDILLA +013D;N # LATIN CAPITAL LETTER L WITH CARON +013E;N # LATIN SMALL LETTER L WITH CARON +013F;A # LATIN CAPITAL LETTER L WITH MIDDLE DOT +0140;A # LATIN SMALL LETTER L WITH MIDDLE DOT +0141;A # LATIN CAPITAL LETTER L WITH STROKE +0142;A # LATIN SMALL LETTER L WITH STROKE +0143;N # LATIN CAPITAL LETTER N WITH ACUTE +0144;A # LATIN SMALL LETTER N WITH ACUTE +0145;N # LATIN CAPITAL LETTER N WITH CEDILLA +0146;N # LATIN SMALL LETTER N WITH CEDILLA +0147;N # LATIN CAPITAL LETTER N WITH CARON +0148;A # LATIN SMALL LETTER N WITH CARON +0149;A # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +014A;A # LATIN CAPITAL LETTER ENG +014B;A # LATIN SMALL LETTER ENG +014C;N # LATIN CAPITAL LETTER O WITH MACRON +014D;A # LATIN SMALL LETTER O WITH MACRON +014E;N # LATIN CAPITAL LETTER O WITH BREVE +014F;N # LATIN SMALL LETTER O WITH BREVE +0150;N # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0151;N # LATIN SMALL LETTER O WITH DOUBLE ACUTE +0152;A # LATIN CAPITAL LIGATURE OE +0153;A # LATIN SMALL LIGATURE OE +0154;N # LATIN CAPITAL LETTER R WITH ACUTE +0155;N # LATIN SMALL LETTER R WITH ACUTE +0156;N # LATIN CAPITAL LETTER R WITH CEDILLA +0157;N # LATIN SMALL LETTER R WITH CEDILLA +0158;N # LATIN CAPITAL LETTER R WITH CARON +0159;N # LATIN SMALL LETTER R WITH CARON +015A;N # LATIN CAPITAL LETTER S WITH ACUTE +015B;N # LATIN SMALL LETTER S WITH ACUTE +015C;N # LATIN CAPITAL LETTER S WITH CIRCUMFLEX +015D;N # LATIN SMALL LETTER S WITH CIRCUMFLEX +015E;N # LATIN CAPITAL LETTER S WITH CEDILLA +015F;N # LATIN SMALL LETTER S WITH CEDILLA +0160;N # LATIN CAPITAL LETTER S WITH CARON +0161;N # LATIN SMALL LETTER S WITH CARON +0162;N # LATIN CAPITAL LETTER T WITH CEDILLA +0163;N # LATIN SMALL LETTER T WITH CEDILLA +0164;N # LATIN CAPITAL LETTER T WITH CARON +0165;N # LATIN SMALL LETTER T WITH CARON +0166;A # LATIN CAPITAL LETTER T WITH STROKE +0167;A # LATIN SMALL LETTER T WITH STROKE +0168;N # LATIN CAPITAL LETTER U WITH TILDE +0169;N # LATIN SMALL LETTER U WITH TILDE +016A;N # LATIN CAPITAL LETTER U WITH MACRON +016B;A # LATIN SMALL LETTER U WITH MACRON +016C;N # LATIN CAPITAL LETTER U WITH BREVE +016D;N # LATIN SMALL LETTER U WITH BREVE +016E;N # LATIN CAPITAL LETTER U WITH RING ABOVE +016F;N # LATIN SMALL LETTER U WITH RING ABOVE +0170;N # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0171;N # LATIN SMALL LETTER U WITH DOUBLE ACUTE +0172;N # LATIN CAPITAL LETTER U WITH OGONEK +0173;N # LATIN SMALL LETTER U WITH OGONEK +0174;N # LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0175;N # LATIN SMALL LETTER W WITH CIRCUMFLEX +0176;N # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0177;N # LATIN SMALL LETTER Y WITH CIRCUMFLEX +0178;N # LATIN CAPITAL LETTER Y WITH DIAERESIS +0179;N # LATIN CAPITAL LETTER Z WITH ACUTE +017A;N # LATIN SMALL LETTER Z WITH ACUTE +017B;N # LATIN CAPITAL LETTER Z WITH DOT ABOVE +017C;N # LATIN SMALL LETTER Z WITH DOT ABOVE +017D;N # LATIN CAPITAL LETTER Z WITH CARON +017E;N # LATIN SMALL LETTER Z WITH CARON +017F;N # LATIN SMALL LETTER LONG S +0180;N # LATIN SMALL LETTER B WITH STROKE +0181;N # LATIN CAPITAL LETTER B WITH HOOK +0182;N # LATIN CAPITAL LETTER B WITH TOPBAR +0183;N # LATIN SMALL LETTER B WITH TOPBAR +0184;N # LATIN CAPITAL LETTER TONE SIX +0185;N # LATIN SMALL LETTER TONE SIX +0186;N # LATIN CAPITAL LETTER OPEN O +0187;N # LATIN CAPITAL LETTER C WITH HOOK +0188;N # LATIN SMALL LETTER C WITH HOOK +0189;N # LATIN CAPITAL LETTER AFRICAN D +018A;N # LATIN CAPITAL LETTER D WITH HOOK +018B;N # LATIN CAPITAL LETTER D WITH TOPBAR +018C;N # LATIN SMALL LETTER D WITH TOPBAR +018D;N # LATIN SMALL LETTER TURNED DELTA +018E;N # LATIN CAPITAL LETTER REVERSED E +018F;N # LATIN CAPITAL LETTER SCHWA +0190;N # LATIN CAPITAL LETTER OPEN E +0191;N # LATIN CAPITAL LETTER F WITH HOOK +0192;N # LATIN SMALL LETTER F WITH HOOK +0193;N # LATIN CAPITAL LETTER G WITH HOOK +0194;N # LATIN CAPITAL LETTER GAMMA +0195;N # LATIN SMALL LETTER HV +0196;N # LATIN CAPITAL LETTER IOTA +0197;N # LATIN CAPITAL LETTER I WITH STROKE +0198;N # LATIN CAPITAL LETTER K WITH HOOK +0199;N # LATIN SMALL LETTER K WITH HOOK +019A;N # LATIN SMALL LETTER L WITH BAR +019B;N # LATIN SMALL LETTER LAMBDA WITH STROKE +019C;N # LATIN CAPITAL LETTER TURNED M +019D;N # LATIN CAPITAL LETTER N WITH LEFT HOOK +019E;N # LATIN SMALL LETTER N WITH LONG RIGHT LEG +019F;N # LATIN CAPITAL LETTER O WITH MIDDLE TILDE +01A0;N # LATIN CAPITAL LETTER O WITH HORN +01A1;N # LATIN SMALL LETTER O WITH HORN +01A2;N # LATIN CAPITAL LETTER OI +01A3;N # LATIN SMALL LETTER OI +01A4;N # LATIN CAPITAL LETTER P WITH HOOK +01A5;N # LATIN SMALL LETTER P WITH HOOK +01A6;N # LATIN LETTER YR +01A7;N # LATIN CAPITAL LETTER TONE TWO +01A8;N # LATIN SMALL LETTER TONE TWO +01A9;N # LATIN CAPITAL LETTER ESH +01AA;N # LATIN LETTER REVERSED ESH LOOP +01AB;N # LATIN SMALL LETTER T WITH PALATAL HOOK +01AC;N # LATIN CAPITAL LETTER T WITH HOOK +01AD;N # LATIN SMALL LETTER T WITH HOOK +01AE;N # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK +01AF;N # LATIN CAPITAL LETTER U WITH HORN +01B0;N # LATIN SMALL LETTER U WITH HORN +01B1;N # LATIN CAPITAL LETTER UPSILON +01B2;N # LATIN CAPITAL LETTER V WITH HOOK +01B3;N # LATIN CAPITAL LETTER Y WITH HOOK +01B4;N # LATIN SMALL LETTER Y WITH HOOK +01B5;N # LATIN CAPITAL LETTER Z WITH STROKE +01B6;N # LATIN SMALL LETTER Z WITH STROKE +01B7;N # LATIN CAPITAL LETTER EZH +01B8;N # LATIN CAPITAL LETTER EZH REVERSED +01B9;N # LATIN SMALL LETTER EZH REVERSED +01BA;N # LATIN SMALL LETTER EZH WITH TAIL +01BB;N # LATIN LETTER TWO WITH STROKE +01BC;N # LATIN CAPITAL LETTER TONE FIVE +01BD;N # LATIN SMALL LETTER TONE FIVE +01BE;N # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE +01BF;N # LATIN LETTER WYNN +01C0;N # LATIN LETTER DENTAL CLICK +01C1;N # LATIN LETTER LATERAL CLICK +01C2;N # LATIN LETTER ALVEOLAR CLICK +01C3;N # LATIN LETTER RETROFLEX CLICK +01C4;N # LATIN CAPITAL LETTER DZ WITH CARON +01C5;N # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +01C6;N # LATIN SMALL LETTER DZ WITH CARON +01C7;N # LATIN CAPITAL LETTER LJ +01C8;N # LATIN CAPITAL LETTER L WITH SMALL LETTER J +01C9;N # LATIN SMALL LETTER LJ +01CA;N # LATIN CAPITAL LETTER NJ +01CB;N # LATIN CAPITAL LETTER N WITH SMALL LETTER J +01CC;N # LATIN SMALL LETTER NJ +01CD;N # LATIN CAPITAL LETTER A WITH CARON +01CE;A # LATIN SMALL LETTER A WITH CARON +01CF;N # LATIN CAPITAL LETTER I WITH CARON +01D0;A # LATIN SMALL LETTER I WITH CARON +01D1;N # LATIN CAPITAL LETTER O WITH CARON +01D2;A # LATIN SMALL LETTER O WITH CARON +01D3;N # LATIN CAPITAL LETTER U WITH CARON +01D4;A # LATIN SMALL LETTER U WITH CARON +01D5;N # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D6;A # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D7;N # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D8;A # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01D9;N # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DA;A # LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01DB;N # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DC;A # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +01DD;N # LATIN SMALL LETTER TURNED E +01DE;N # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +01DF;N # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +01E0;N # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +01E1;N # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +01E2;N # LATIN CAPITAL LETTER AE WITH MACRON +01E3;N # LATIN SMALL LETTER AE WITH MACRON +01E4;N # LATIN CAPITAL LETTER G WITH STROKE +01E5;N # LATIN SMALL LETTER G WITH STROKE +01E6;N # LATIN CAPITAL LETTER G WITH CARON +01E7;N # LATIN SMALL LETTER G WITH CARON +01E8;N # LATIN CAPITAL LETTER K WITH CARON +01E9;N # LATIN SMALL LETTER K WITH CARON +01EA;N # LATIN CAPITAL LETTER O WITH OGONEK +01EB;N # LATIN SMALL LETTER O WITH OGONEK +01EC;N # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +01ED;N # LATIN SMALL LETTER O WITH OGONEK AND MACRON +01EE;N # LATIN CAPITAL LETTER EZH WITH CARON +01EF;N # LATIN SMALL LETTER EZH WITH CARON +01F0;N # LATIN SMALL LETTER J WITH CARON +01F1;N # LATIN CAPITAL LETTER DZ +01F2;N # LATIN CAPITAL LETTER D WITH SMALL LETTER Z +01F3;N # LATIN SMALL LETTER DZ +01F4;N # LATIN CAPITAL LETTER G WITH ACUTE +01F5;N # LATIN SMALL LETTER G WITH ACUTE +01F6;N # LATIN CAPITAL LETTER HWAIR +01F7;N # LATIN CAPITAL LETTER WYNN +01F8;N # LATIN CAPITAL LETTER N WITH GRAVE +01F9;N # LATIN SMALL LETTER N WITH GRAVE +01FA;N # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +01FB;N # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +01FC;N # LATIN CAPITAL LETTER AE WITH ACUTE +01FD;N # LATIN SMALL LETTER AE WITH ACUTE +01FE;N # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +01FF;N # LATIN SMALL LETTER O WITH STROKE AND ACUTE +0200;N # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0201;N # LATIN SMALL LETTER A WITH DOUBLE GRAVE +0202;N # LATIN CAPITAL LETTER A WITH INVERTED BREVE +0203;N # LATIN SMALL LETTER A WITH INVERTED BREVE +0204;N # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0205;N # LATIN SMALL LETTER E WITH DOUBLE GRAVE +0206;N # LATIN CAPITAL LETTER E WITH INVERTED BREVE +0207;N # LATIN SMALL LETTER E WITH INVERTED BREVE +0208;N # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +0209;N # LATIN SMALL LETTER I WITH DOUBLE GRAVE +020A;N # LATIN CAPITAL LETTER I WITH INVERTED BREVE +020B;N # LATIN SMALL LETTER I WITH INVERTED BREVE +020C;N # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020D;N # LATIN SMALL LETTER O WITH DOUBLE GRAVE +020E;N # LATIN CAPITAL LETTER O WITH INVERTED BREVE +020F;N # LATIN SMALL LETTER O WITH INVERTED BREVE +0210;N # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0211;N # LATIN SMALL LETTER R WITH DOUBLE GRAVE +0212;N # LATIN CAPITAL LETTER R WITH INVERTED BREVE +0213;N # LATIN SMALL LETTER R WITH INVERTED BREVE +0214;N # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0215;N # LATIN SMALL LETTER U WITH DOUBLE GRAVE +0216;N # LATIN CAPITAL LETTER U WITH INVERTED BREVE +0217;N # LATIN SMALL LETTER U WITH INVERTED BREVE +0218;N # LATIN CAPITAL LETTER S WITH COMMA BELOW +0219;N # LATIN SMALL LETTER S WITH COMMA BELOW +021A;N # LATIN CAPITAL LETTER T WITH COMMA BELOW +021B;N # LATIN SMALL LETTER T WITH COMMA BELOW +021C;N # LATIN CAPITAL LETTER YOGH +021D;N # LATIN SMALL LETTER YOGH +021E;N # LATIN CAPITAL LETTER H WITH CARON +021F;N # LATIN SMALL LETTER H WITH CARON +0220;N # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +0221;N # LATIN SMALL LETTER D WITH CURL +0222;N # LATIN CAPITAL LETTER OU +0223;N # LATIN SMALL LETTER OU +0224;N # LATIN CAPITAL LETTER Z WITH HOOK +0225;N # LATIN SMALL LETTER Z WITH HOOK +0226;N # LATIN CAPITAL LETTER A WITH DOT ABOVE +0227;N # LATIN SMALL LETTER A WITH DOT ABOVE +0228;N # LATIN CAPITAL LETTER E WITH CEDILLA +0229;N # LATIN SMALL LETTER E WITH CEDILLA +022A;N # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +022B;N # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON +022C;N # LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022D;N # LATIN SMALL LETTER O WITH TILDE AND MACRON +022E;N # LATIN CAPITAL LETTER O WITH DOT ABOVE +022F;N # LATIN SMALL LETTER O WITH DOT ABOVE +0230;N # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +0231;N # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON +0232;N # LATIN CAPITAL LETTER Y WITH MACRON +0233;N # LATIN SMALL LETTER Y WITH MACRON +0234;N # LATIN SMALL LETTER L WITH CURL +0235;N # LATIN SMALL LETTER N WITH CURL +0236;N # LATIN SMALL LETTER T WITH CURL +0237;N # LATIN SMALL LETTER DOTLESS J +0238;N # LATIN SMALL LETTER DB DIGRAPH +0239;N # LATIN SMALL LETTER QP DIGRAPH +023A;N # LATIN CAPITAL LETTER A WITH STROKE +023B;N # LATIN CAPITAL LETTER C WITH STROKE +023C;N # LATIN SMALL LETTER C WITH STROKE +023D;N # LATIN CAPITAL LETTER L WITH BAR +023E;N # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +023F;N # LATIN SMALL LETTER S WITH SWASH TAIL +0240;N # LATIN SMALL LETTER Z WITH SWASH TAIL +0241;N # LATIN CAPITAL LETTER GLOTTAL STOP +0250;N # LATIN SMALL LETTER TURNED A +0251;A # LATIN SMALL LETTER ALPHA +0252;N # LATIN SMALL LETTER TURNED ALPHA +0253;N # LATIN SMALL LETTER B WITH HOOK +0254;N # LATIN SMALL LETTER OPEN O +0255;N # LATIN SMALL LETTER C WITH CURL +0256;N # LATIN SMALL LETTER D WITH TAIL +0257;N # LATIN SMALL LETTER D WITH HOOK +0258;N # LATIN SMALL LETTER REVERSED E +0259;N # LATIN SMALL LETTER SCHWA +025A;N # LATIN SMALL LETTER SCHWA WITH HOOK +025B;N # LATIN SMALL LETTER OPEN E +025C;N # LATIN SMALL LETTER REVERSED OPEN E +025D;N # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK +025E;N # LATIN SMALL LETTER CLOSED REVERSED OPEN E +025F;N # LATIN SMALL LETTER DOTLESS J WITH STROKE +0260;N # LATIN SMALL LETTER G WITH HOOK +0261;A # LATIN SMALL LETTER SCRIPT G +0262;N # LATIN LETTER SMALL CAPITAL G +0263;N # LATIN SMALL LETTER GAMMA +0264;N # LATIN SMALL LETTER RAMS HORN +0265;N # LATIN SMALL LETTER TURNED H +0266;N # LATIN SMALL LETTER H WITH HOOK +0267;N # LATIN SMALL LETTER HENG WITH HOOK +0268;N # LATIN SMALL LETTER I WITH STROKE +0269;N # LATIN SMALL LETTER IOTA +026A;N # LATIN LETTER SMALL CAPITAL I +026B;N # LATIN SMALL LETTER L WITH MIDDLE TILDE +026C;N # LATIN SMALL LETTER L WITH BELT +026D;N # LATIN SMALL LETTER L WITH RETROFLEX HOOK +026E;N # LATIN SMALL LETTER LEZH +026F;N # LATIN SMALL LETTER TURNED M +0270;N # LATIN SMALL LETTER TURNED M WITH LONG LEG +0271;N # LATIN SMALL LETTER M WITH HOOK +0272;N # LATIN SMALL LETTER N WITH LEFT HOOK +0273;N # LATIN SMALL LETTER N WITH RETROFLEX HOOK +0274;N # LATIN LETTER SMALL CAPITAL N +0275;N # LATIN SMALL LETTER BARRED O +0276;N # LATIN LETTER SMALL CAPITAL OE +0277;N # LATIN SMALL LETTER CLOSED OMEGA +0278;N # LATIN SMALL LETTER PHI +0279;N # LATIN SMALL LETTER TURNED R +027A;N # LATIN SMALL LETTER TURNED R WITH LONG LEG +027B;N # LATIN SMALL LETTER TURNED R WITH HOOK +027C;N # LATIN SMALL LETTER R WITH LONG LEG +027D;N # LATIN SMALL LETTER R WITH TAIL +027E;N # LATIN SMALL LETTER R WITH FISHHOOK +027F;N # LATIN SMALL LETTER REVERSED R WITH FISHHOOK +0280;N # LATIN LETTER SMALL CAPITAL R +0281;N # LATIN LETTER SMALL CAPITAL INVERTED R +0282;N # LATIN SMALL LETTER S WITH HOOK +0283;N # LATIN SMALL LETTER ESH +0284;N # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK +0285;N # LATIN SMALL LETTER SQUAT REVERSED ESH +0286;N # LATIN SMALL LETTER ESH WITH CURL +0287;N # LATIN SMALL LETTER TURNED T +0288;N # LATIN SMALL LETTER T WITH RETROFLEX HOOK +0289;N # LATIN SMALL LETTER U BAR +028A;N # LATIN SMALL LETTER UPSILON +028B;N # LATIN SMALL LETTER V WITH HOOK +028C;N # LATIN SMALL LETTER TURNED V +028D;N # LATIN SMALL LETTER TURNED W +028E;N # LATIN SMALL LETTER TURNED Y +028F;N # LATIN LETTER SMALL CAPITAL Y +0290;N # LATIN SMALL LETTER Z WITH RETROFLEX HOOK +0291;N # LATIN SMALL LETTER Z WITH CURL +0292;N # LATIN SMALL LETTER EZH +0293;N # LATIN SMALL LETTER EZH WITH CURL +0294;N # LATIN LETTER GLOTTAL STOP +0295;N # LATIN LETTER PHARYNGEAL VOICED FRICATIVE +0296;N # LATIN LETTER INVERTED GLOTTAL STOP +0297;N # LATIN LETTER STRETCHED C +0298;N # LATIN LETTER BILABIAL CLICK +0299;N # LATIN LETTER SMALL CAPITAL B +029A;N # LATIN SMALL LETTER CLOSED OPEN E +029B;N # LATIN LETTER SMALL CAPITAL G WITH HOOK +029C;N # LATIN LETTER SMALL CAPITAL H +029D;N # LATIN SMALL LETTER J WITH CROSSED-TAIL +029E;N # LATIN SMALL LETTER TURNED K +029F;N # LATIN LETTER SMALL CAPITAL L +02A0;N # LATIN SMALL LETTER Q WITH HOOK +02A1;N # LATIN LETTER GLOTTAL STOP WITH STROKE +02A2;N # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE +02A3;N # LATIN SMALL LETTER DZ DIGRAPH +02A4;N # LATIN SMALL LETTER DEZH DIGRAPH +02A5;N # LATIN SMALL LETTER DZ DIGRAPH WITH CURL +02A6;N # LATIN SMALL LETTER TS DIGRAPH +02A7;N # LATIN SMALL LETTER TESH DIGRAPH +02A8;N # LATIN SMALL LETTER TC DIGRAPH WITH CURL +02A9;N # LATIN SMALL LETTER FENG DIGRAPH +02AA;N # LATIN SMALL LETTER LS DIGRAPH +02AB;N # LATIN SMALL LETTER LZ DIGRAPH +02AC;N # LATIN LETTER BILABIAL PERCUSSIVE +02AD;N # LATIN LETTER BIDENTAL PERCUSSIVE +02AE;N # LATIN SMALL LETTER TURNED H WITH FISHHOOK +02AF;N # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0;N # MODIFIER LETTER SMALL H +02B1;N # MODIFIER LETTER SMALL H WITH HOOK +02B2;N # MODIFIER LETTER SMALL J +02B3;N # MODIFIER LETTER SMALL R +02B4;N # MODIFIER LETTER SMALL TURNED R +02B5;N # MODIFIER LETTER SMALL TURNED R WITH HOOK +02B6;N # MODIFIER LETTER SMALL CAPITAL INVERTED R +02B7;N # MODIFIER LETTER SMALL W +02B8;N # MODIFIER LETTER SMALL Y +02B9;N # MODIFIER LETTER PRIME +02BA;N # MODIFIER LETTER DOUBLE PRIME +02BB;N # MODIFIER LETTER TURNED COMMA +02BC;N # MODIFIER LETTER APOSTROPHE +02BD;N # MODIFIER LETTER REVERSED COMMA +02BE;N # MODIFIER LETTER RIGHT HALF RING +02BF;N # MODIFIER LETTER LEFT HALF RING +02C0;N # MODIFIER LETTER GLOTTAL STOP +02C1;N # MODIFIER LETTER REVERSED GLOTTAL STOP +02C2;N # MODIFIER LETTER LEFT ARROWHEAD +02C3;N # MODIFIER LETTER RIGHT ARROWHEAD +02C4;A # MODIFIER LETTER UP ARROWHEAD +02C5;N # MODIFIER LETTER DOWN ARROWHEAD +02C6;N # MODIFIER LETTER CIRCUMFLEX ACCENT +02C7;A # CARON +02C8;N # MODIFIER LETTER VERTICAL LINE +02C9;A # MODIFIER LETTER MACRON +02CA;A # MODIFIER LETTER ACUTE ACCENT +02CB;A # MODIFIER LETTER GRAVE ACCENT +02CC;N # MODIFIER LETTER LOW VERTICAL LINE +02CD;A # MODIFIER LETTER LOW MACRON +02CE;N # MODIFIER LETTER LOW GRAVE ACCENT +02CF;N # MODIFIER LETTER LOW ACUTE ACCENT +02D0;A # MODIFIER LETTER TRIANGULAR COLON +02D1;N # MODIFIER LETTER HALF TRIANGULAR COLON +02D2;N # MODIFIER LETTER CENTRED RIGHT HALF RING +02D3;N # MODIFIER LETTER CENTRED LEFT HALF RING +02D4;N # MODIFIER LETTER UP TACK +02D5;N # MODIFIER LETTER DOWN TACK +02D6;N # MODIFIER LETTER PLUS SIGN +02D7;N # MODIFIER LETTER MINUS SIGN +02D8;A # BREVE +02D9;A # DOT ABOVE +02DA;A # RING ABOVE +02DB;A # OGONEK +02DC;N # SMALL TILDE +02DD;A # DOUBLE ACUTE ACCENT +02DE;N # MODIFIER LETTER RHOTIC HOOK +02DF;A # MODIFIER LETTER CROSS ACCENT +02E0;N # MODIFIER LETTER SMALL GAMMA +02E1;N # MODIFIER LETTER SMALL L +02E2;N # MODIFIER LETTER SMALL S +02E3;N # MODIFIER LETTER SMALL X +02E4;N # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02E5;N # MODIFIER LETTER EXTRA-HIGH TONE BAR +02E6;N # MODIFIER LETTER HIGH TONE BAR +02E7;N # MODIFIER LETTER MID TONE BAR +02E8;N # MODIFIER LETTER LOW TONE BAR +02E9;N # MODIFIER LETTER EXTRA-LOW TONE BAR +02EA;N # MODIFIER LETTER YIN DEPARTING TONE MARK +02EB;N # MODIFIER LETTER YANG DEPARTING TONE MARK +02EC;N # MODIFIER LETTER VOICING +02ED;N # MODIFIER LETTER UNASPIRATED +02EE;N # MODIFIER LETTER DOUBLE APOSTROPHE +02EF;N # MODIFIER LETTER LOW DOWN ARROWHEAD +02F0;N # MODIFIER LETTER LOW UP ARROWHEAD +02F1;N # MODIFIER LETTER LOW LEFT ARROWHEAD +02F2;N # MODIFIER LETTER LOW RIGHT ARROWHEAD +02F3;N # MODIFIER LETTER LOW RING +02F4;N # MODIFIER LETTER MIDDLE GRAVE ACCENT +02F5;N # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT +02F6;N # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT +02F7;N # MODIFIER LETTER LOW TILDE +02F8;N # MODIFIER LETTER RAISED COLON +02F9;N # MODIFIER LETTER BEGIN HIGH TONE +02FA;N # MODIFIER LETTER END HIGH TONE +02FB;N # MODIFIER LETTER BEGIN LOW TONE +02FC;N # MODIFIER LETTER END LOW TONE +02FD;N # MODIFIER LETTER SHELF +02FE;N # MODIFIER LETTER OPEN SHELF +02FF;N # MODIFIER LETTER LOW LEFT ARROW +0300;A # COMBINING GRAVE ACCENT +0301;A # COMBINING ACUTE ACCENT +0302;A # COMBINING CIRCUMFLEX ACCENT +0303;A # COMBINING TILDE +0304;A # COMBINING MACRON +0305;A # COMBINING OVERLINE +0306;A # COMBINING BREVE +0307;A # COMBINING DOT ABOVE +0308;A # COMBINING DIAERESIS +0309;A # COMBINING HOOK ABOVE +030A;A # COMBINING RING ABOVE +030B;A # COMBINING DOUBLE ACUTE ACCENT +030C;A # COMBINING CARON +030D;A # COMBINING VERTICAL LINE ABOVE +030E;A # COMBINING DOUBLE VERTICAL LINE ABOVE +030F;A # COMBINING DOUBLE GRAVE ACCENT +0310;A # COMBINING CANDRABINDU +0311;A # COMBINING INVERTED BREVE +0312;A # COMBINING TURNED COMMA ABOVE +0313;A # COMBINING COMMA ABOVE +0314;A # COMBINING REVERSED COMMA ABOVE +0315;A # COMBINING COMMA ABOVE RIGHT +0316;A # COMBINING GRAVE ACCENT BELOW +0317;A # COMBINING ACUTE ACCENT BELOW +0318;A # COMBINING LEFT TACK BELOW +0319;A # COMBINING RIGHT TACK BELOW +031A;A # COMBINING LEFT ANGLE ABOVE +031B;A # COMBINING HORN +031C;A # COMBINING LEFT HALF RING BELOW +031D;A # COMBINING UP TACK BELOW +031E;A # COMBINING DOWN TACK BELOW +031F;A # COMBINING PLUS SIGN BELOW +0320;A # COMBINING MINUS SIGN BELOW +0321;A # COMBINING PALATALIZED HOOK BELOW +0322;A # COMBINING RETROFLEX HOOK BELOW +0323;A # COMBINING DOT BELOW +0324;A # COMBINING DIAERESIS BELOW +0325;A # COMBINING RING BELOW +0326;A # COMBINING COMMA BELOW +0327;A # COMBINING CEDILLA +0328;A # COMBINING OGONEK +0329;A # COMBINING VERTICAL LINE BELOW +032A;A # COMBINING BRIDGE BELOW +032B;A # COMBINING INVERTED DOUBLE ARCH BELOW +032C;A # COMBINING CARON BELOW +032D;A # COMBINING CIRCUMFLEX ACCENT BELOW +032E;A # COMBINING BREVE BELOW +032F;A # COMBINING INVERTED BREVE BELOW +0330;A # COMBINING TILDE BELOW +0331;A # COMBINING MACRON BELOW +0332;A # COMBINING LOW LINE +0333;A # COMBINING DOUBLE LOW LINE +0334;A # COMBINING TILDE OVERLAY +0335;A # COMBINING SHORT STROKE OVERLAY +0336;A # COMBINING LONG STROKE OVERLAY +0337;A # COMBINING SHORT SOLIDUS OVERLAY +0338;A # COMBINING LONG SOLIDUS OVERLAY +0339;A # COMBINING RIGHT HALF RING BELOW +033A;A # COMBINING INVERTED BRIDGE BELOW +033B;A # COMBINING SQUARE BELOW +033C;A # COMBINING SEAGULL BELOW +033D;A # COMBINING X ABOVE +033E;A # COMBINING VERTICAL TILDE +033F;A # COMBINING DOUBLE OVERLINE +0340;A # COMBINING GRAVE TONE MARK +0341;A # COMBINING ACUTE TONE MARK +0342;A # COMBINING GREEK PERISPOMENI +0343;A # COMBINING GREEK KORONIS +0344;A # COMBINING GREEK DIALYTIKA TONOS +0345;A # COMBINING GREEK YPOGEGRAMMENI +0346;A # COMBINING BRIDGE ABOVE +0347;A # COMBINING EQUALS SIGN BELOW +0348;A # COMBINING DOUBLE VERTICAL LINE BELOW +0349;A # COMBINING LEFT ANGLE BELOW +034A;A # COMBINING NOT TILDE ABOVE +034B;A # COMBINING HOMOTHETIC ABOVE +034C;A # COMBINING ALMOST EQUAL TO ABOVE +034D;A # COMBINING LEFT RIGHT ARROW BELOW +034E;A # COMBINING UPWARDS ARROW BELOW +034F;A # COMBINING GRAPHEME JOINER +0350;A # COMBINING RIGHT ARROWHEAD ABOVE +0351;A # COMBINING LEFT HALF RING ABOVE +0352;A # COMBINING FERMATA +0353;A # COMBINING X BELOW +0354;A # COMBINING LEFT ARROWHEAD BELOW +0355;A # COMBINING RIGHT ARROWHEAD BELOW +0356;A # COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW +0357;A # COMBINING RIGHT HALF RING ABOVE +0358;A # COMBINING DOT ABOVE RIGHT +0359;A # COMBINING ASTERISK BELOW +035A;A # COMBINING DOUBLE RING BELOW +035B;A # COMBINING ZIGZAG ABOVE +035C;A # COMBINING DOUBLE BREVE BELOW +035D;A # COMBINING DOUBLE BREVE +035E;A # COMBINING DOUBLE MACRON +035F;A # COMBINING DOUBLE MACRON BELOW +0360;A # COMBINING DOUBLE TILDE +0361;A # COMBINING DOUBLE INVERTED BREVE +0362;A # COMBINING DOUBLE RIGHTWARDS ARROW BELOW +0363;A # COMBINING LATIN SMALL LETTER A +0364;A # COMBINING LATIN SMALL LETTER E +0365;A # COMBINING LATIN SMALL LETTER I +0366;A # COMBINING LATIN SMALL LETTER O +0367;A # COMBINING LATIN SMALL LETTER U +0368;A # COMBINING LATIN SMALL LETTER C +0369;A # COMBINING LATIN SMALL LETTER D +036A;A # COMBINING LATIN SMALL LETTER H +036B;A # COMBINING LATIN SMALL LETTER M +036C;A # COMBINING LATIN SMALL LETTER R +036D;A # COMBINING LATIN SMALL LETTER T +036E;A # COMBINING LATIN SMALL LETTER V +036F;A # COMBINING LATIN SMALL LETTER X +0374;N # GREEK NUMERAL SIGN +0375;N # GREEK LOWER NUMERAL SIGN +037A;N # GREEK YPOGEGRAMMENI +037E;N # GREEK QUESTION MARK +0384;N # GREEK TONOS +0385;N # GREEK DIALYTIKA TONOS +0386;N # GREEK CAPITAL LETTER ALPHA WITH TONOS +0387;N # GREEK ANO TELEIA +0388;N # GREEK CAPITAL LETTER EPSILON WITH TONOS +0389;N # GREEK CAPITAL LETTER ETA WITH TONOS +038A;N # GREEK CAPITAL LETTER IOTA WITH TONOS +038C;N # GREEK CAPITAL LETTER OMICRON WITH TONOS +038E;N # GREEK CAPITAL LETTER UPSILON WITH TONOS +038F;N # GREEK CAPITAL LETTER OMEGA WITH TONOS +0390;N # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0391;A # GREEK CAPITAL LETTER ALPHA +0392;A # GREEK CAPITAL LETTER BETA +0393;A # GREEK CAPITAL LETTER GAMMA +0394;A # GREEK CAPITAL LETTER DELTA +0395;A # GREEK CAPITAL LETTER EPSILON +0396;A # GREEK CAPITAL LETTER ZETA +0397;A # GREEK CAPITAL LETTER ETA +0398;A # GREEK CAPITAL LETTER THETA +0399;A # GREEK CAPITAL LETTER IOTA +039A;A # GREEK CAPITAL LETTER KAPPA +039B;A # GREEK CAPITAL LETTER LAMDA +039C;A # GREEK CAPITAL LETTER MU +039D;A # GREEK CAPITAL LETTER NU +039E;A # GREEK CAPITAL LETTER XI +039F;A # GREEK CAPITAL LETTER OMICRON +03A0;A # GREEK CAPITAL LETTER PI +03A1;A # GREEK CAPITAL LETTER RHO +03A3;A # GREEK CAPITAL LETTER SIGMA +03A4;A # GREEK CAPITAL LETTER TAU +03A5;A # GREEK CAPITAL LETTER UPSILON +03A6;A # GREEK CAPITAL LETTER PHI +03A7;A # GREEK CAPITAL LETTER CHI +03A8;A # GREEK CAPITAL LETTER PSI +03A9;A # GREEK CAPITAL LETTER OMEGA +03AA;N # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +03AB;N # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03AC;N # GREEK SMALL LETTER ALPHA WITH TONOS +03AD;N # GREEK SMALL LETTER EPSILON WITH TONOS +03AE;N # GREEK SMALL LETTER ETA WITH TONOS +03AF;N # GREEK SMALL LETTER IOTA WITH TONOS +03B0;N # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +03B1;A # GREEK SMALL LETTER ALPHA +03B2;A # GREEK SMALL LETTER BETA +03B3;A # GREEK SMALL LETTER GAMMA +03B4;A # GREEK SMALL LETTER DELTA +03B5;A # GREEK SMALL LETTER EPSILON +03B6;A # GREEK SMALL LETTER ZETA +03B7;A # GREEK SMALL LETTER ETA +03B8;A # GREEK SMALL LETTER THETA +03B9;A # GREEK SMALL LETTER IOTA +03BA;A # GREEK SMALL LETTER KAPPA +03BB;A # GREEK SMALL LETTER LAMDA +03BC;A # GREEK SMALL LETTER MU +03BD;A # GREEK SMALL LETTER NU +03BE;A # GREEK SMALL LETTER XI +03BF;A # GREEK SMALL LETTER OMICRON +03C0;A # GREEK SMALL LETTER PI +03C1;A # GREEK SMALL LETTER RHO +03C2;N # GREEK SMALL LETTER FINAL SIGMA +03C3;A # GREEK SMALL LETTER SIGMA +03C4;A # GREEK SMALL LETTER TAU +03C5;A # GREEK SMALL LETTER UPSILON +03C6;A # GREEK SMALL LETTER PHI +03C7;A # GREEK SMALL LETTER CHI +03C8;A # GREEK SMALL LETTER PSI +03C9;A # GREEK SMALL LETTER OMEGA +03CA;N # GREEK SMALL LETTER IOTA WITH DIALYTIKA +03CB;N # GREEK SMALL LETTER UPSILON WITH DIALYTIKA +03CC;N # GREEK SMALL LETTER OMICRON WITH TONOS +03CD;N # GREEK SMALL LETTER UPSILON WITH TONOS +03CE;N # GREEK SMALL LETTER OMEGA WITH TONOS +03D0;N # GREEK BETA SYMBOL +03D1;N # GREEK THETA SYMBOL +03D2;N # GREEK UPSILON WITH HOOK SYMBOL +03D3;N # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL +03D4;N # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL +03D5;N # GREEK PHI SYMBOL +03D6;N # GREEK PI SYMBOL +03D7;N # GREEK KAI SYMBOL +03D8;N # GREEK LETTER ARCHAIC KOPPA +03D9;N # GREEK SMALL LETTER ARCHAIC KOPPA +03DA;N # GREEK LETTER STIGMA +03DB;N # GREEK SMALL LETTER STIGMA +03DC;N # GREEK LETTER DIGAMMA +03DD;N # GREEK SMALL LETTER DIGAMMA +03DE;N # GREEK LETTER KOPPA +03DF;N # GREEK SMALL LETTER KOPPA +03E0;N # GREEK LETTER SAMPI +03E1;N # GREEK SMALL LETTER SAMPI +03E2;N # COPTIC CAPITAL LETTER SHEI +03E3;N # COPTIC SMALL LETTER SHEI +03E4;N # COPTIC CAPITAL LETTER FEI +03E5;N # COPTIC SMALL LETTER FEI +03E6;N # COPTIC CAPITAL LETTER KHEI +03E7;N # COPTIC SMALL LETTER KHEI +03E8;N # COPTIC CAPITAL LETTER HORI +03E9;N # COPTIC SMALL LETTER HORI +03EA;N # COPTIC CAPITAL LETTER GANGIA +03EB;N # COPTIC SMALL LETTER GANGIA +03EC;N # COPTIC CAPITAL LETTER SHIMA +03ED;N # COPTIC SMALL LETTER SHIMA +03EE;N # COPTIC CAPITAL LETTER DEI +03EF;N # COPTIC SMALL LETTER DEI +03F0;N # GREEK KAPPA SYMBOL +03F1;N # GREEK RHO SYMBOL +03F2;N # GREEK LUNATE SIGMA SYMBOL +03F3;N # GREEK LETTER YOT +03F4;N # GREEK CAPITAL THETA SYMBOL +03F5;N # GREEK LUNATE EPSILON SYMBOL +03F6;N # GREEK REVERSED LUNATE EPSILON SYMBOL +03F7;N # GREEK CAPITAL LETTER SHO +03F8;N # GREEK SMALL LETTER SHO +03F9;N # GREEK CAPITAL LUNATE SIGMA SYMBOL +03FA;N # GREEK CAPITAL LETTER SAN +03FB;N # GREEK SMALL LETTER SAN +03FC;N # GREEK RHO WITH STROKE SYMBOL +03FD;N # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL +03FE;N # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL +03FF;N # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +0400;N # CYRILLIC CAPITAL LETTER IE WITH GRAVE +0401;A # CYRILLIC CAPITAL LETTER IO +0402;N # CYRILLIC CAPITAL LETTER DJE +0403;N # CYRILLIC CAPITAL LETTER GJE +0404;N # CYRILLIC CAPITAL LETTER UKRAINIAN IE +0405;N # CYRILLIC CAPITAL LETTER DZE +0406;N # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0407;N # CYRILLIC CAPITAL LETTER YI +0408;N # CYRILLIC CAPITAL LETTER JE +0409;N # CYRILLIC CAPITAL LETTER LJE +040A;N # CYRILLIC CAPITAL LETTER NJE +040B;N # CYRILLIC CAPITAL LETTER TSHE +040C;N # CYRILLIC CAPITAL LETTER KJE +040D;N # CYRILLIC CAPITAL LETTER I WITH GRAVE +040E;N # CYRILLIC CAPITAL LETTER SHORT U +040F;N # CYRILLIC CAPITAL LETTER DZHE +0410;A # CYRILLIC CAPITAL LETTER A +0411;A # CYRILLIC CAPITAL LETTER BE +0412;A # CYRILLIC CAPITAL LETTER VE +0413;A # CYRILLIC CAPITAL LETTER GHE +0414;A # CYRILLIC CAPITAL LETTER DE +0415;A # CYRILLIC CAPITAL LETTER IE +0416;A # CYRILLIC CAPITAL LETTER ZHE +0417;A # CYRILLIC CAPITAL LETTER ZE +0418;A # CYRILLIC CAPITAL LETTER I +0419;A # CYRILLIC CAPITAL LETTER SHORT I +041A;A # CYRILLIC CAPITAL LETTER KA +041B;A # CYRILLIC CAPITAL LETTER EL +041C;A # CYRILLIC CAPITAL LETTER EM +041D;A # CYRILLIC CAPITAL LETTER EN +041E;A # CYRILLIC CAPITAL LETTER O +041F;A # CYRILLIC CAPITAL LETTER PE +0420;A # CYRILLIC CAPITAL LETTER ER +0421;A # CYRILLIC CAPITAL LETTER ES +0422;A # CYRILLIC CAPITAL LETTER TE +0423;A # CYRILLIC CAPITAL LETTER U +0424;A # CYRILLIC CAPITAL LETTER EF +0425;A # CYRILLIC CAPITAL LETTER HA +0426;A # CYRILLIC CAPITAL LETTER TSE +0427;A # CYRILLIC CAPITAL LETTER CHE +0428;A # CYRILLIC CAPITAL LETTER SHA +0429;A # CYRILLIC CAPITAL LETTER SHCHA +042A;A # CYRILLIC CAPITAL LETTER HARD SIGN +042B;A # CYRILLIC CAPITAL LETTER YERU +042C;A # CYRILLIC CAPITAL LETTER SOFT SIGN +042D;A # CYRILLIC CAPITAL LETTER E +042E;A # CYRILLIC CAPITAL LETTER YU +042F;A # CYRILLIC CAPITAL LETTER YA +0430;A # CYRILLIC SMALL LETTER A +0431;A # CYRILLIC SMALL LETTER BE +0432;A # CYRILLIC SMALL LETTER VE +0433;A # CYRILLIC SMALL LETTER GHE +0434;A # CYRILLIC SMALL LETTER DE +0435;A # CYRILLIC SMALL LETTER IE +0436;A # CYRILLIC SMALL LETTER ZHE +0437;A # CYRILLIC SMALL LETTER ZE +0438;A # CYRILLIC SMALL LETTER I +0439;A # CYRILLIC SMALL LETTER SHORT I +043A;A # CYRILLIC SMALL LETTER KA +043B;A # CYRILLIC SMALL LETTER EL +043C;A # CYRILLIC SMALL LETTER EM +043D;A # CYRILLIC SMALL LETTER EN +043E;A # CYRILLIC SMALL LETTER O +043F;A # CYRILLIC SMALL LETTER PE +0440;A # CYRILLIC SMALL LETTER ER +0441;A # CYRILLIC SMALL LETTER ES +0442;A # CYRILLIC SMALL LETTER TE +0443;A # CYRILLIC SMALL LETTER U +0444;A # CYRILLIC SMALL LETTER EF +0445;A # CYRILLIC SMALL LETTER HA +0446;A # CYRILLIC SMALL LETTER TSE +0447;A # CYRILLIC SMALL LETTER CHE +0448;A # CYRILLIC SMALL LETTER SHA +0449;A # CYRILLIC SMALL LETTER SHCHA +044A;A # CYRILLIC SMALL LETTER HARD SIGN +044B;A # CYRILLIC SMALL LETTER YERU +044C;A # CYRILLIC SMALL LETTER SOFT SIGN +044D;A # CYRILLIC SMALL LETTER E +044E;A # CYRILLIC SMALL LETTER YU +044F;A # CYRILLIC SMALL LETTER YA +0450;N # CYRILLIC SMALL LETTER IE WITH GRAVE +0451;A # CYRILLIC SMALL LETTER IO +0452;N # CYRILLIC SMALL LETTER DJE +0453;N # CYRILLIC SMALL LETTER GJE +0454;N # CYRILLIC SMALL LETTER UKRAINIAN IE +0455;N # CYRILLIC SMALL LETTER DZE +0456;N # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0457;N # CYRILLIC SMALL LETTER YI +0458;N # CYRILLIC SMALL LETTER JE +0459;N # CYRILLIC SMALL LETTER LJE +045A;N # CYRILLIC SMALL LETTER NJE +045B;N # CYRILLIC SMALL LETTER TSHE +045C;N # CYRILLIC SMALL LETTER KJE +045D;N # CYRILLIC SMALL LETTER I WITH GRAVE +045E;N # CYRILLIC SMALL LETTER SHORT U +045F;N # CYRILLIC SMALL LETTER DZHE +0460;N # CYRILLIC CAPITAL LETTER OMEGA +0461;N # CYRILLIC SMALL LETTER OMEGA +0462;N # CYRILLIC CAPITAL LETTER YAT +0463;N # CYRILLIC SMALL LETTER YAT +0464;N # CYRILLIC CAPITAL LETTER IOTIFIED E +0465;N # CYRILLIC SMALL LETTER IOTIFIED E +0466;N # CYRILLIC CAPITAL LETTER LITTLE YUS +0467;N # CYRILLIC SMALL LETTER LITTLE YUS +0468;N # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +0469;N # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS +046A;N # CYRILLIC CAPITAL LETTER BIG YUS +046B;N # CYRILLIC SMALL LETTER BIG YUS +046C;N # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +046D;N # CYRILLIC SMALL LETTER IOTIFIED BIG YUS +046E;N # CYRILLIC CAPITAL LETTER KSI +046F;N # CYRILLIC SMALL LETTER KSI +0470;N # CYRILLIC CAPITAL LETTER PSI +0471;N # CYRILLIC SMALL LETTER PSI +0472;N # CYRILLIC CAPITAL LETTER FITA +0473;N # CYRILLIC SMALL LETTER FITA +0474;N # CYRILLIC CAPITAL LETTER IZHITSA +0475;N # CYRILLIC SMALL LETTER IZHITSA +0476;N # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0477;N # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0478;N # CYRILLIC CAPITAL LETTER UK +0479;N # CYRILLIC SMALL LETTER UK +047A;N # CYRILLIC CAPITAL LETTER ROUND OMEGA +047B;N # CYRILLIC SMALL LETTER ROUND OMEGA +047C;N # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +047D;N # CYRILLIC SMALL LETTER OMEGA WITH TITLO +047E;N # CYRILLIC CAPITAL LETTER OT +047F;N # CYRILLIC SMALL LETTER OT +0480;N # CYRILLIC CAPITAL LETTER KOPPA +0481;N # CYRILLIC SMALL LETTER KOPPA +0482;N # CYRILLIC THOUSANDS SIGN +0483;N # COMBINING CYRILLIC TITLO +0484;N # COMBINING CYRILLIC PALATALIZATION +0485;N # COMBINING CYRILLIC DASIA PNEUMATA +0486;N # COMBINING CYRILLIC PSILI PNEUMATA +0488;N # COMBINING CYRILLIC HUNDRED THOUSANDS SIGN +0489;N # COMBINING CYRILLIC MILLIONS SIGN +048A;N # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +048B;N # CYRILLIC SMALL LETTER SHORT I WITH TAIL +048C;N # CYRILLIC CAPITAL LETTER SEMISOFT SIGN +048D;N # CYRILLIC SMALL LETTER SEMISOFT SIGN +048E;N # CYRILLIC CAPITAL LETTER ER WITH TICK +048F;N # CYRILLIC SMALL LETTER ER WITH TICK +0490;N # CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0491;N # CYRILLIC SMALL LETTER GHE WITH UPTURN +0492;N # CYRILLIC CAPITAL LETTER GHE WITH STROKE +0493;N # CYRILLIC SMALL LETTER GHE WITH STROKE +0494;N # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +0495;N # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK +0496;N # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +0497;N # CYRILLIC SMALL LETTER ZHE WITH DESCENDER +0498;N # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +0499;N # CYRILLIC SMALL LETTER ZE WITH DESCENDER +049A;N # CYRILLIC CAPITAL LETTER KA WITH DESCENDER +049B;N # CYRILLIC SMALL LETTER KA WITH DESCENDER +049C;N # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +049D;N # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE +049E;N # CYRILLIC CAPITAL LETTER KA WITH STROKE +049F;N # CYRILLIC SMALL LETTER KA WITH STROKE +04A0;N # CYRILLIC CAPITAL LETTER BASHKIR KA +04A1;N # CYRILLIC SMALL LETTER BASHKIR KA +04A2;N # CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04A3;N # CYRILLIC SMALL LETTER EN WITH DESCENDER +04A4;N # CYRILLIC CAPITAL LIGATURE EN GHE +04A5;N # CYRILLIC SMALL LIGATURE EN GHE +04A6;N # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +04A7;N # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK +04A8;N # CYRILLIC CAPITAL LETTER ABKHASIAN HA +04A9;N # CYRILLIC SMALL LETTER ABKHASIAN HA +04AA;N # CYRILLIC CAPITAL LETTER ES WITH DESCENDER +04AB;N # CYRILLIC SMALL LETTER ES WITH DESCENDER +04AC;N # CYRILLIC CAPITAL LETTER TE WITH DESCENDER +04AD;N # CYRILLIC SMALL LETTER TE WITH DESCENDER +04AE;N # CYRILLIC CAPITAL LETTER STRAIGHT U +04AF;N # CYRILLIC SMALL LETTER STRAIGHT U +04B0;N # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +04B1;N # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE +04B2;N # CYRILLIC CAPITAL LETTER HA WITH DESCENDER +04B3;N # CYRILLIC SMALL LETTER HA WITH DESCENDER +04B4;N # CYRILLIC CAPITAL LIGATURE TE TSE +04B5;N # CYRILLIC SMALL LIGATURE TE TSE +04B6;N # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +04B7;N # CYRILLIC SMALL LETTER CHE WITH DESCENDER +04B8;N # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +04B9;N # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE +04BA;N # CYRILLIC CAPITAL LETTER SHHA +04BB;N # CYRILLIC SMALL LETTER SHHA +04BC;N # CYRILLIC CAPITAL LETTER ABKHASIAN CHE +04BD;N # CYRILLIC SMALL LETTER ABKHASIAN CHE +04BE;N # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +04BF;N # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER +04C0;N # CYRILLIC LETTER PALOCHKA +04C1;N # CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04C2;N # CYRILLIC SMALL LETTER ZHE WITH BREVE +04C3;N # CYRILLIC CAPITAL LETTER KA WITH HOOK +04C4;N # CYRILLIC SMALL LETTER KA WITH HOOK +04C5;N # CYRILLIC CAPITAL LETTER EL WITH TAIL +04C6;N # CYRILLIC SMALL LETTER EL WITH TAIL +04C7;N # CYRILLIC CAPITAL LETTER EN WITH HOOK +04C8;N # CYRILLIC SMALL LETTER EN WITH HOOK +04C9;N # CYRILLIC CAPITAL LETTER EN WITH TAIL +04CA;N # CYRILLIC SMALL LETTER EN WITH TAIL +04CB;N # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +04CC;N # CYRILLIC SMALL LETTER KHAKASSIAN CHE +04CD;N # CYRILLIC CAPITAL LETTER EM WITH TAIL +04CE;N # CYRILLIC SMALL LETTER EM WITH TAIL +04D0;N # CYRILLIC CAPITAL LETTER A WITH BREVE +04D1;N # CYRILLIC SMALL LETTER A WITH BREVE +04D2;N # CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D3;N # CYRILLIC SMALL LETTER A WITH DIAERESIS +04D4;N # CYRILLIC CAPITAL LIGATURE A IE +04D5;N # CYRILLIC SMALL LIGATURE A IE +04D6;N # CYRILLIC CAPITAL LETTER IE WITH BREVE +04D7;N # CYRILLIC SMALL LETTER IE WITH BREVE +04D8;N # CYRILLIC CAPITAL LETTER SCHWA +04D9;N # CYRILLIC SMALL LETTER SCHWA +04DA;N # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04DB;N # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS +04DC;N # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +04DD;N # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS +04DE;N # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +04DF;N # CYRILLIC SMALL LETTER ZE WITH DIAERESIS +04E0;N # CYRILLIC CAPITAL LETTER ABKHASIAN DZE +04E1;N # CYRILLIC SMALL LETTER ABKHASIAN DZE +04E2;N # CYRILLIC CAPITAL LETTER I WITH MACRON +04E3;N # CYRILLIC SMALL LETTER I WITH MACRON +04E4;N # CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E5;N # CYRILLIC SMALL LETTER I WITH DIAERESIS +04E6;N # CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E7;N # CYRILLIC SMALL LETTER O WITH DIAERESIS +04E8;N # CYRILLIC CAPITAL LETTER BARRED O +04E9;N # CYRILLIC SMALL LETTER BARRED O +04EA;N # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +04EB;N # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS +04EC;N # CYRILLIC CAPITAL LETTER E WITH DIAERESIS +04ED;N # CYRILLIC SMALL LETTER E WITH DIAERESIS +04EE;N # CYRILLIC CAPITAL LETTER U WITH MACRON +04EF;N # CYRILLIC SMALL LETTER U WITH MACRON +04F0;N # CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F1;N # CYRILLIC SMALL LETTER U WITH DIAERESIS +04F2;N # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04F3;N # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE +04F4;N # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +04F5;N # CYRILLIC SMALL LETTER CHE WITH DIAERESIS +04F6;N # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +04F7;N # CYRILLIC SMALL LETTER GHE WITH DESCENDER +04F8;N # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +04F9;N # CYRILLIC SMALL LETTER YERU WITH DIAERESIS +0500;N # CYRILLIC CAPITAL LETTER KOMI DE +0501;N # CYRILLIC SMALL LETTER KOMI DE +0502;N # CYRILLIC CAPITAL LETTER KOMI DJE +0503;N # CYRILLIC SMALL LETTER KOMI DJE +0504;N # CYRILLIC CAPITAL LETTER KOMI ZJE +0505;N # CYRILLIC SMALL LETTER KOMI ZJE +0506;N # CYRILLIC CAPITAL LETTER KOMI DZJE +0507;N # CYRILLIC SMALL LETTER KOMI DZJE +0508;N # CYRILLIC CAPITAL LETTER KOMI LJE +0509;N # CYRILLIC SMALL LETTER KOMI LJE +050A;N # CYRILLIC CAPITAL LETTER KOMI NJE +050B;N # CYRILLIC SMALL LETTER KOMI NJE +050C;N # CYRILLIC CAPITAL LETTER KOMI SJE +050D;N # CYRILLIC SMALL LETTER KOMI SJE +050E;N # CYRILLIC CAPITAL LETTER KOMI TJE +050F;N # CYRILLIC SMALL LETTER KOMI TJE +0531;N # ARMENIAN CAPITAL LETTER AYB +0532;N # ARMENIAN CAPITAL LETTER BEN +0533;N # ARMENIAN CAPITAL LETTER GIM +0534;N # ARMENIAN CAPITAL LETTER DA +0535;N # ARMENIAN CAPITAL LETTER ECH +0536;N # ARMENIAN CAPITAL LETTER ZA +0537;N # ARMENIAN CAPITAL LETTER EH +0538;N # ARMENIAN CAPITAL LETTER ET +0539;N # ARMENIAN CAPITAL LETTER TO +053A;N # ARMENIAN CAPITAL LETTER ZHE +053B;N # ARMENIAN CAPITAL LETTER INI +053C;N # ARMENIAN CAPITAL LETTER LIWN +053D;N # ARMENIAN CAPITAL LETTER XEH +053E;N # ARMENIAN CAPITAL LETTER CA +053F;N # ARMENIAN CAPITAL LETTER KEN +0540;N # ARMENIAN CAPITAL LETTER HO +0541;N # ARMENIAN CAPITAL LETTER JA +0542;N # ARMENIAN CAPITAL LETTER GHAD +0543;N # ARMENIAN CAPITAL LETTER CHEH +0544;N # ARMENIAN CAPITAL LETTER MEN +0545;N # ARMENIAN CAPITAL LETTER YI +0546;N # ARMENIAN CAPITAL LETTER NOW +0547;N # ARMENIAN CAPITAL LETTER SHA +0548;N # ARMENIAN CAPITAL LETTER VO +0549;N # ARMENIAN CAPITAL LETTER CHA +054A;N # ARMENIAN CAPITAL LETTER PEH +054B;N # ARMENIAN CAPITAL LETTER JHEH +054C;N # ARMENIAN CAPITAL LETTER RA +054D;N # ARMENIAN CAPITAL LETTER SEH +054E;N # ARMENIAN CAPITAL LETTER VEW +054F;N # ARMENIAN CAPITAL LETTER TIWN +0550;N # ARMENIAN CAPITAL LETTER REH +0551;N # ARMENIAN CAPITAL LETTER CO +0552;N # ARMENIAN CAPITAL LETTER YIWN +0553;N # ARMENIAN CAPITAL LETTER PIWR +0554;N # ARMENIAN CAPITAL LETTER KEH +0555;N # ARMENIAN CAPITAL LETTER OH +0556;N # ARMENIAN CAPITAL LETTER FEH +0559;N # ARMENIAN MODIFIER LETTER LEFT HALF RING +055A;N # ARMENIAN APOSTROPHE +055B;N # ARMENIAN EMPHASIS MARK +055C;N # ARMENIAN EXCLAMATION MARK +055D;N # ARMENIAN COMMA +055E;N # ARMENIAN QUESTION MARK +055F;N # ARMENIAN ABBREVIATION MARK +0561;N # ARMENIAN SMALL LETTER AYB +0562;N # ARMENIAN SMALL LETTER BEN +0563;N # ARMENIAN SMALL LETTER GIM +0564;N # ARMENIAN SMALL LETTER DA +0565;N # ARMENIAN SMALL LETTER ECH +0566;N # ARMENIAN SMALL LETTER ZA +0567;N # ARMENIAN SMALL LETTER EH +0568;N # ARMENIAN SMALL LETTER ET +0569;N # ARMENIAN SMALL LETTER TO +056A;N # ARMENIAN SMALL LETTER ZHE +056B;N # ARMENIAN SMALL LETTER INI +056C;N # ARMENIAN SMALL LETTER LIWN +056D;N # ARMENIAN SMALL LETTER XEH +056E;N # ARMENIAN SMALL LETTER CA +056F;N # ARMENIAN SMALL LETTER KEN +0570;N # ARMENIAN SMALL LETTER HO +0571;N # ARMENIAN SMALL LETTER JA +0572;N # ARMENIAN SMALL LETTER GHAD +0573;N # ARMENIAN SMALL LETTER CHEH +0574;N # ARMENIAN SMALL LETTER MEN +0575;N # ARMENIAN SMALL LETTER YI +0576;N # ARMENIAN SMALL LETTER NOW +0577;N # ARMENIAN SMALL LETTER SHA +0578;N # ARMENIAN SMALL LETTER VO +0579;N # ARMENIAN SMALL LETTER CHA +057A;N # ARMENIAN SMALL LETTER PEH +057B;N # ARMENIAN SMALL LETTER JHEH +057C;N # ARMENIAN SMALL LETTER RA +057D;N # ARMENIAN SMALL LETTER SEH +057E;N # ARMENIAN SMALL LETTER VEW +057F;N # ARMENIAN SMALL LETTER TIWN +0580;N # ARMENIAN SMALL LETTER REH +0581;N # ARMENIAN SMALL LETTER CO +0582;N # ARMENIAN SMALL LETTER YIWN +0583;N # ARMENIAN SMALL LETTER PIWR +0584;N # ARMENIAN SMALL LETTER KEH +0585;N # ARMENIAN SMALL LETTER OH +0586;N # ARMENIAN SMALL LETTER FEH +0587;N # ARMENIAN SMALL LIGATURE ECH YIWN +0589;N # ARMENIAN FULL STOP +058A;N # ARMENIAN HYPHEN +0591;N # HEBREW ACCENT ETNAHTA +0592;N # HEBREW ACCENT SEGOL +0593;N # HEBREW ACCENT SHALSHELET +0594;N # HEBREW ACCENT ZAQEF QATAN +0595;N # HEBREW ACCENT ZAQEF GADOL +0596;N # HEBREW ACCENT TIPEHA +0597;N # HEBREW ACCENT REVIA +0598;N # HEBREW ACCENT ZARQA +0599;N # HEBREW ACCENT PASHTA +059A;N # HEBREW ACCENT YETIV +059B;N # HEBREW ACCENT TEVIR +059C;N # HEBREW ACCENT GERESH +059D;N # HEBREW ACCENT GERESH MUQDAM +059E;N # HEBREW ACCENT GERSHAYIM +059F;N # HEBREW ACCENT QARNEY PARA +05A0;N # HEBREW ACCENT TELISHA GEDOLA +05A1;N # HEBREW ACCENT PAZER +05A2;N # HEBREW ACCENT ATNAH HAFUKH +05A3;N # HEBREW ACCENT MUNAH +05A4;N # HEBREW ACCENT MAHAPAKH +05A5;N # HEBREW ACCENT MERKHA +05A6;N # HEBREW ACCENT MERKHA KEFULA +05A7;N # HEBREW ACCENT DARGA +05A8;N # HEBREW ACCENT QADMA +05A9;N # HEBREW ACCENT TELISHA QETANA +05AA;N # HEBREW ACCENT YERAH BEN YOMO +05AB;N # HEBREW ACCENT OLE +05AC;N # HEBREW ACCENT ILUY +05AD;N # HEBREW ACCENT DEHI +05AE;N # HEBREW ACCENT ZINOR +05AF;N # HEBREW MARK MASORA CIRCLE +05B0;N # HEBREW POINT SHEVA +05B1;N # HEBREW POINT HATAF SEGOL +05B2;N # HEBREW POINT HATAF PATAH +05B3;N # HEBREW POINT HATAF QAMATS +05B4;N # HEBREW POINT HIRIQ +05B5;N # HEBREW POINT TSERE +05B6;N # HEBREW POINT SEGOL +05B7;N # HEBREW POINT PATAH +05B8;N # HEBREW POINT QAMATS +05B9;N # HEBREW POINT HOLAM +05BB;N # HEBREW POINT QUBUTS +05BC;N # HEBREW POINT DAGESH OR MAPIQ +05BD;N # HEBREW POINT METEG +05BE;N # HEBREW PUNCTUATION MAQAF +05BF;N # HEBREW POINT RAFE +05C0;N # HEBREW PUNCTUATION PASEQ +05C1;N # HEBREW POINT SHIN DOT +05C2;N # HEBREW POINT SIN DOT +05C3;N # HEBREW PUNCTUATION SOF PASUQ +05C4;N # HEBREW MARK UPPER DOT +05C5;N # HEBREW MARK LOWER DOT +05C6;N # HEBREW PUNCTUATION NUN HAFUKHA +05C7;N # HEBREW POINT QAMATS QATAN +05D0;N # HEBREW LETTER ALEF +05D1;N # HEBREW LETTER BET +05D2;N # HEBREW LETTER GIMEL +05D3;N # HEBREW LETTER DALET +05D4;N # HEBREW LETTER HE +05D5;N # HEBREW LETTER VAV +05D6;N # HEBREW LETTER ZAYIN +05D7;N # HEBREW LETTER HET +05D8;N # HEBREW LETTER TET +05D9;N # HEBREW LETTER YOD +05DA;N # HEBREW LETTER FINAL KAF +05DB;N # HEBREW LETTER KAF +05DC;N # HEBREW LETTER LAMED +05DD;N # HEBREW LETTER FINAL MEM +05DE;N # HEBREW LETTER MEM +05DF;N # HEBREW LETTER FINAL NUN +05E0;N # HEBREW LETTER NUN +05E1;N # HEBREW LETTER SAMEKH +05E2;N # HEBREW LETTER AYIN +05E3;N # HEBREW LETTER FINAL PE +05E4;N # HEBREW LETTER PE +05E5;N # HEBREW LETTER FINAL TSADI +05E6;N # HEBREW LETTER TSADI +05E7;N # HEBREW LETTER QOF +05E8;N # HEBREW LETTER RESH +05E9;N # HEBREW LETTER SHIN +05EA;N # HEBREW LETTER TAV +05F0;N # HEBREW LIGATURE YIDDISH DOUBLE VAV +05F1;N # HEBREW LIGATURE YIDDISH VAV YOD +05F2;N # HEBREW LIGATURE YIDDISH DOUBLE YOD +05F3;N # HEBREW PUNCTUATION GERESH +05F4;N # HEBREW PUNCTUATION GERSHAYIM +0600;N # ARABIC NUMBER SIGN +0601;N # ARABIC SIGN SANAH +0602;N # ARABIC FOOTNOTE MARKER +0603;N # ARABIC SIGN SAFHA +060B;N # AFGHANI SIGN +060C;N # ARABIC COMMA +060D;N # ARABIC DATE SEPARATOR +060E;N # ARABIC POETIC VERSE SIGN +060F;N # ARABIC SIGN MISRA +0610;N # ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM +0611;N # ARABIC SIGN ALAYHE ASSALLAM +0612;N # ARABIC SIGN RAHMATULLAH ALAYHE +0613;N # ARABIC SIGN RADI ALLAHOU ANHU +0614;N # ARABIC SIGN TAKHALLUS +0615;N # ARABIC SMALL HIGH TAH +061B;N # ARABIC SEMICOLON +061E;N # ARABIC TRIPLE DOT PUNCTUATION MARK +061F;N # ARABIC QUESTION MARK +0621;N # ARABIC LETTER HAMZA +0622;N # ARABIC LETTER ALEF WITH MADDA ABOVE +0623;N # ARABIC LETTER ALEF WITH HAMZA ABOVE +0624;N # ARABIC LETTER WAW WITH HAMZA ABOVE +0625;N # ARABIC LETTER ALEF WITH HAMZA BELOW +0626;N # ARABIC LETTER YEH WITH HAMZA ABOVE +0627;N # ARABIC LETTER ALEF +0628;N # ARABIC LETTER BEH +0629;N # ARABIC LETTER TEH MARBUTA +062A;N # ARABIC LETTER TEH +062B;N # ARABIC LETTER THEH +062C;N # ARABIC LETTER JEEM +062D;N # ARABIC LETTER HAH +062E;N # ARABIC LETTER KHAH +062F;N # ARABIC LETTER DAL +0630;N # ARABIC LETTER THAL +0631;N # ARABIC LETTER REH +0632;N # ARABIC LETTER ZAIN +0633;N # ARABIC LETTER SEEN +0634;N # ARABIC LETTER SHEEN +0635;N # ARABIC LETTER SAD +0636;N # ARABIC LETTER DAD +0637;N # ARABIC LETTER TAH +0638;N # ARABIC LETTER ZAH +0639;N # ARABIC LETTER AIN +063A;N # ARABIC LETTER GHAIN +0640;N # ARABIC TATWEEL +0641;N # ARABIC LETTER FEH +0642;N # ARABIC LETTER QAF +0643;N # ARABIC LETTER KAF +0644;N # ARABIC LETTER LAM +0645;N # ARABIC LETTER MEEM +0646;N # ARABIC LETTER NOON +0647;N # ARABIC LETTER HEH +0648;N # ARABIC LETTER WAW +0649;N # ARABIC LETTER ALEF MAKSURA +064A;N # ARABIC LETTER YEH +064B;N # ARABIC FATHATAN +064C;N # ARABIC DAMMATAN +064D;N # ARABIC KASRATAN +064E;N # ARABIC FATHA +064F;N # ARABIC DAMMA +0650;N # ARABIC KASRA +0651;N # ARABIC SHADDA +0652;N # ARABIC SUKUN +0653;N # ARABIC MADDAH ABOVE +0654;N # ARABIC HAMZA ABOVE +0655;N # ARABIC HAMZA BELOW +0656;N # ARABIC SUBSCRIPT ALEF +0657;N # ARABIC INVERTED DAMMA +0658;N # ARABIC MARK NOON GHUNNA +0659;N # ARABIC ZWARAKAY +065A;N # ARABIC VOWEL SIGN SMALL V ABOVE +065B;N # ARABIC VOWEL SIGN INVERTED SMALL V ABOVE +065C;N # ARABIC VOWEL SIGN DOT BELOW +065D;N # ARABIC REVERSED DAMMA +065E;N # ARABIC FATHA WITH TWO DOTS +0660;N # ARABIC-INDIC DIGIT ZERO +0661;N # ARABIC-INDIC DIGIT ONE +0662;N # ARABIC-INDIC DIGIT TWO +0663;N # ARABIC-INDIC DIGIT THREE +0664;N # ARABIC-INDIC DIGIT FOUR +0665;N # ARABIC-INDIC DIGIT FIVE +0666;N # ARABIC-INDIC DIGIT SIX +0667;N # ARABIC-INDIC DIGIT SEVEN +0668;N # ARABIC-INDIC DIGIT EIGHT +0669;N # ARABIC-INDIC DIGIT NINE +066A;N # ARABIC PERCENT SIGN +066B;N # ARABIC DECIMAL SEPARATOR +066C;N # ARABIC THOUSANDS SEPARATOR +066D;N # ARABIC FIVE POINTED STAR +066E;N # ARABIC LETTER DOTLESS BEH +066F;N # ARABIC LETTER DOTLESS QAF +0670;N # ARABIC LETTER SUPERSCRIPT ALEF +0671;N # ARABIC LETTER ALEF WASLA +0672;N # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE +0673;N # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW +0674;N # ARABIC LETTER HIGH HAMZA +0675;N # ARABIC LETTER HIGH HAMZA ALEF +0676;N # ARABIC LETTER HIGH HAMZA WAW +0677;N # ARABIC LETTER U WITH HAMZA ABOVE +0678;N # ARABIC LETTER HIGH HAMZA YEH +0679;N # ARABIC LETTER TTEH +067A;N # ARABIC LETTER TTEHEH +067B;N # ARABIC LETTER BEEH +067C;N # ARABIC LETTER TEH WITH RING +067D;N # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS +067E;N # ARABIC LETTER PEH +067F;N # ARABIC LETTER TEHEH +0680;N # ARABIC LETTER BEHEH +0681;N # ARABIC LETTER HAH WITH HAMZA ABOVE +0682;N # ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE +0683;N # ARABIC LETTER NYEH +0684;N # ARABIC LETTER DYEH +0685;N # ARABIC LETTER HAH WITH THREE DOTS ABOVE +0686;N # ARABIC LETTER TCHEH +0687;N # ARABIC LETTER TCHEHEH +0688;N # ARABIC LETTER DDAL +0689;N # ARABIC LETTER DAL WITH RING +068A;N # ARABIC LETTER DAL WITH DOT BELOW +068B;N # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH +068C;N # ARABIC LETTER DAHAL +068D;N # ARABIC LETTER DDAHAL +068E;N # ARABIC LETTER DUL +068F;N # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS +0690;N # ARABIC LETTER DAL WITH FOUR DOTS ABOVE +0691;N # ARABIC LETTER RREH +0692;N # ARABIC LETTER REH WITH SMALL V +0693;N # ARABIC LETTER REH WITH RING +0694;N # ARABIC LETTER REH WITH DOT BELOW +0695;N # ARABIC LETTER REH WITH SMALL V BELOW +0696;N # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE +0697;N # ARABIC LETTER REH WITH TWO DOTS ABOVE +0698;N # ARABIC LETTER JEH +0699;N # ARABIC LETTER REH WITH FOUR DOTS ABOVE +069A;N # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE +069B;N # ARABIC LETTER SEEN WITH THREE DOTS BELOW +069C;N # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE +069D;N # ARABIC LETTER SAD WITH TWO DOTS BELOW +069E;N # ARABIC LETTER SAD WITH THREE DOTS ABOVE +069F;N # ARABIC LETTER TAH WITH THREE DOTS ABOVE +06A0;N # ARABIC LETTER AIN WITH THREE DOTS ABOVE +06A1;N # ARABIC LETTER DOTLESS FEH +06A2;N # ARABIC LETTER FEH WITH DOT MOVED BELOW +06A3;N # ARABIC LETTER FEH WITH DOT BELOW +06A4;N # ARABIC LETTER VEH +06A5;N # ARABIC LETTER FEH WITH THREE DOTS BELOW +06A6;N # ARABIC LETTER PEHEH +06A7;N # ARABIC LETTER QAF WITH DOT ABOVE +06A8;N # ARABIC LETTER QAF WITH THREE DOTS ABOVE +06A9;N # ARABIC LETTER KEHEH +06AA;N # ARABIC LETTER SWASH KAF +06AB;N # ARABIC LETTER KAF WITH RING +06AC;N # ARABIC LETTER KAF WITH DOT ABOVE +06AD;N # ARABIC LETTER NG +06AE;N # ARABIC LETTER KAF WITH THREE DOTS BELOW +06AF;N # ARABIC LETTER GAF +06B0;N # ARABIC LETTER GAF WITH RING +06B1;N # ARABIC LETTER NGOEH +06B2;N # ARABIC LETTER GAF WITH TWO DOTS BELOW +06B3;N # ARABIC LETTER GUEH +06B4;N # ARABIC LETTER GAF WITH THREE DOTS ABOVE +06B5;N # ARABIC LETTER LAM WITH SMALL V +06B6;N # ARABIC LETTER LAM WITH DOT ABOVE +06B7;N # ARABIC LETTER LAM WITH THREE DOTS ABOVE +06B8;N # ARABIC LETTER LAM WITH THREE DOTS BELOW +06B9;N # ARABIC LETTER NOON WITH DOT BELOW +06BA;N # ARABIC LETTER NOON GHUNNA +06BB;N # ARABIC LETTER RNOON +06BC;N # ARABIC LETTER NOON WITH RING +06BD;N # ARABIC LETTER NOON WITH THREE DOTS ABOVE +06BE;N # ARABIC LETTER HEH DOACHASHMEE +06BF;N # ARABIC LETTER TCHEH WITH DOT ABOVE +06C0;N # ARABIC LETTER HEH WITH YEH ABOVE +06C1;N # ARABIC LETTER HEH GOAL +06C2;N # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE +06C3;N # ARABIC LETTER TEH MARBUTA GOAL +06C4;N # ARABIC LETTER WAW WITH RING +06C5;N # ARABIC LETTER KIRGHIZ OE +06C6;N # ARABIC LETTER OE +06C7;N # ARABIC LETTER U +06C8;N # ARABIC LETTER YU +06C9;N # ARABIC LETTER KIRGHIZ YU +06CA;N # ARABIC LETTER WAW WITH TWO DOTS ABOVE +06CB;N # ARABIC LETTER VE +06CC;N # ARABIC LETTER FARSI YEH +06CD;N # ARABIC LETTER YEH WITH TAIL +06CE;N # ARABIC LETTER YEH WITH SMALL V +06CF;N # ARABIC LETTER WAW WITH DOT ABOVE +06D0;N # ARABIC LETTER E +06D1;N # ARABIC LETTER YEH WITH THREE DOTS BELOW +06D2;N # ARABIC LETTER YEH BARREE +06D3;N # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D4;N # ARABIC FULL STOP +06D5;N # ARABIC LETTER AE +06D6;N # ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA +06D7;N # ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA +06D8;N # ARABIC SMALL HIGH MEEM INITIAL FORM +06D9;N # ARABIC SMALL HIGH LAM ALEF +06DA;N # ARABIC SMALL HIGH JEEM +06DB;N # ARABIC SMALL HIGH THREE DOTS +06DC;N # ARABIC SMALL HIGH SEEN +06DD;N # ARABIC END OF AYAH +06DE;N # ARABIC START OF RUB EL HIZB +06DF;N # ARABIC SMALL HIGH ROUNDED ZERO +06E0;N # ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO +06E1;N # ARABIC SMALL HIGH DOTLESS HEAD OF KHAH +06E2;N # ARABIC SMALL HIGH MEEM ISOLATED FORM +06E3;N # ARABIC SMALL LOW SEEN +06E4;N # ARABIC SMALL HIGH MADDA +06E5;N # ARABIC SMALL WAW +06E6;N # ARABIC SMALL YEH +06E7;N # ARABIC SMALL HIGH YEH +06E8;N # ARABIC SMALL HIGH NOON +06E9;N # ARABIC PLACE OF SAJDAH +06EA;N # ARABIC EMPTY CENTRE LOW STOP +06EB;N # ARABIC EMPTY CENTRE HIGH STOP +06EC;N # ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE +06ED;N # ARABIC SMALL LOW MEEM +06EE;N # ARABIC LETTER DAL WITH INVERTED V +06EF;N # ARABIC LETTER REH WITH INVERTED V +06F0;N # EXTENDED ARABIC-INDIC DIGIT ZERO +06F1;N # EXTENDED ARABIC-INDIC DIGIT ONE +06F2;N # EXTENDED ARABIC-INDIC DIGIT TWO +06F3;N # EXTENDED ARABIC-INDIC DIGIT THREE +06F4;N # EXTENDED ARABIC-INDIC DIGIT FOUR +06F5;N # EXTENDED ARABIC-INDIC DIGIT FIVE +06F6;N # EXTENDED ARABIC-INDIC DIGIT SIX +06F7;N # EXTENDED ARABIC-INDIC DIGIT SEVEN +06F8;N # EXTENDED ARABIC-INDIC DIGIT EIGHT +06F9;N # EXTENDED ARABIC-INDIC DIGIT NINE +06FA;N # ARABIC LETTER SHEEN WITH DOT BELOW +06FB;N # ARABIC LETTER DAD WITH DOT BELOW +06FC;N # ARABIC LETTER GHAIN WITH DOT BELOW +06FD;N # ARABIC SIGN SINDHI AMPERSAND +06FE;N # ARABIC SIGN SINDHI POSTPOSITION MEN +06FF;N # ARABIC LETTER HEH WITH INVERTED V +0700;N # SYRIAC END OF PARAGRAPH +0701;N # SYRIAC SUPRALINEAR FULL STOP +0702;N # SYRIAC SUBLINEAR FULL STOP +0703;N # SYRIAC SUPRALINEAR COLON +0704;N # SYRIAC SUBLINEAR COLON +0705;N # SYRIAC HORIZONTAL COLON +0706;N # SYRIAC COLON SKEWED LEFT +0707;N # SYRIAC COLON SKEWED RIGHT +0708;N # SYRIAC SUPRALINEAR COLON SKEWED LEFT +0709;N # SYRIAC SUBLINEAR COLON SKEWED RIGHT +070A;N # SYRIAC CONTRACTION +070B;N # SYRIAC HARKLEAN OBELUS +070C;N # SYRIAC HARKLEAN METOBELUS +070D;N # SYRIAC HARKLEAN ASTERISCUS +070F;N # SYRIAC ABBREVIATION MARK +0710;N # SYRIAC LETTER ALAPH +0711;N # SYRIAC LETTER SUPERSCRIPT ALAPH +0712;N # SYRIAC LETTER BETH +0713;N # SYRIAC LETTER GAMAL +0714;N # SYRIAC LETTER GAMAL GARSHUNI +0715;N # SYRIAC LETTER DALATH +0716;N # SYRIAC LETTER DOTLESS DALATH RISH +0717;N # SYRIAC LETTER HE +0718;N # SYRIAC LETTER WAW +0719;N # SYRIAC LETTER ZAIN +071A;N # SYRIAC LETTER HETH +071B;N # SYRIAC LETTER TETH +071C;N # SYRIAC LETTER TETH GARSHUNI +071D;N # SYRIAC LETTER YUDH +071E;N # SYRIAC LETTER YUDH HE +071F;N # SYRIAC LETTER KAPH +0720;N # SYRIAC LETTER LAMADH +0721;N # SYRIAC LETTER MIM +0722;N # SYRIAC LETTER NUN +0723;N # SYRIAC LETTER SEMKATH +0724;N # SYRIAC LETTER FINAL SEMKATH +0725;N # SYRIAC LETTER E +0726;N # SYRIAC LETTER PE +0727;N # SYRIAC LETTER REVERSED PE +0728;N # SYRIAC LETTER SADHE +0729;N # SYRIAC LETTER QAPH +072A;N # SYRIAC LETTER RISH +072B;N # SYRIAC LETTER SHIN +072C;N # SYRIAC LETTER TAW +072D;N # SYRIAC LETTER PERSIAN BHETH +072E;N # SYRIAC LETTER PERSIAN GHAMAL +072F;N # SYRIAC LETTER PERSIAN DHALATH +0730;N # SYRIAC PTHAHA ABOVE +0731;N # SYRIAC PTHAHA BELOW +0732;N # SYRIAC PTHAHA DOTTED +0733;N # SYRIAC ZQAPHA ABOVE +0734;N # SYRIAC ZQAPHA BELOW +0735;N # SYRIAC ZQAPHA DOTTED +0736;N # SYRIAC RBASA ABOVE +0737;N # SYRIAC RBASA BELOW +0738;N # SYRIAC DOTTED ZLAMA HORIZONTAL +0739;N # SYRIAC DOTTED ZLAMA ANGULAR +073A;N # SYRIAC HBASA ABOVE +073B;N # SYRIAC HBASA BELOW +073C;N # SYRIAC HBASA-ESASA DOTTED +073D;N # SYRIAC ESASA ABOVE +073E;N # SYRIAC ESASA BELOW +073F;N # SYRIAC RWAHA +0740;N # SYRIAC FEMININE DOT +0741;N # SYRIAC QUSHSHAYA +0742;N # SYRIAC RUKKAKHA +0743;N # SYRIAC TWO VERTICAL DOTS ABOVE +0744;N # SYRIAC TWO VERTICAL DOTS BELOW +0745;N # SYRIAC THREE DOTS ABOVE +0746;N # SYRIAC THREE DOTS BELOW +0747;N # SYRIAC OBLIQUE LINE ABOVE +0748;N # SYRIAC OBLIQUE LINE BELOW +0749;N # SYRIAC MUSIC +074A;N # SYRIAC BARREKH +074D;N # SYRIAC LETTER SOGDIAN ZHAIN +074E;N # SYRIAC LETTER SOGDIAN KHAPH +074F;N # SYRIAC LETTER SOGDIAN FE +0750;N # ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW +0751;N # ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE +0752;N # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW +0753;N # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE +0754;N # ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE +0755;N # ARABIC LETTER BEH WITH INVERTED SMALL V BELOW +0756;N # ARABIC LETTER BEH WITH SMALL V +0757;N # ARABIC LETTER HAH WITH TWO DOTS ABOVE +0758;N # ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW +0759;N # ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH +075A;N # ARABIC LETTER DAL WITH INVERTED SMALL V BELOW +075B;N # ARABIC LETTER REH WITH STROKE +075C;N # ARABIC LETTER SEEN WITH FOUR DOTS ABOVE +075D;N # ARABIC LETTER AIN WITH TWO DOTS ABOVE +075E;N # ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE +075F;N # ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE +0760;N # ARABIC LETTER FEH WITH TWO DOTS BELOW +0761;N # ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW +0762;N # ARABIC LETTER KEHEH WITH DOT ABOVE +0763;N # ARABIC LETTER KEHEH WITH THREE DOTS ABOVE +0764;N # ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW +0765;N # ARABIC LETTER MEEM WITH DOT ABOVE +0766;N # ARABIC LETTER MEEM WITH DOT BELOW +0767;N # ARABIC LETTER NOON WITH TWO DOTS BELOW +0768;N # ARABIC LETTER NOON WITH SMALL TAH +0769;N # ARABIC LETTER NOON WITH SMALL V +076A;N # ARABIC LETTER LAM WITH BAR +076B;N # ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE +076C;N # ARABIC LETTER REH WITH HAMZA ABOVE +076D;N # ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE +0780;N # THAANA LETTER HAA +0781;N # THAANA LETTER SHAVIYANI +0782;N # THAANA LETTER NOONU +0783;N # THAANA LETTER RAA +0784;N # THAANA LETTER BAA +0785;N # THAANA LETTER LHAVIYANI +0786;N # THAANA LETTER KAAFU +0787;N # THAANA LETTER ALIFU +0788;N # THAANA LETTER VAAVU +0789;N # THAANA LETTER MEEMU +078A;N # THAANA LETTER FAAFU +078B;N # THAANA LETTER DHAALU +078C;N # THAANA LETTER THAA +078D;N # THAANA LETTER LAAMU +078E;N # THAANA LETTER GAAFU +078F;N # THAANA LETTER GNAVIYANI +0790;N # THAANA LETTER SEENU +0791;N # THAANA LETTER DAVIYANI +0792;N # THAANA LETTER ZAVIYANI +0793;N # THAANA LETTER TAVIYANI +0794;N # THAANA LETTER YAA +0795;N # THAANA LETTER PAVIYANI +0796;N # THAANA LETTER JAVIYANI +0797;N # THAANA LETTER CHAVIYANI +0798;N # THAANA LETTER TTAA +0799;N # THAANA LETTER HHAA +079A;N # THAANA LETTER KHAA +079B;N # THAANA LETTER THAALU +079C;N # THAANA LETTER ZAA +079D;N # THAANA LETTER SHEENU +079E;N # THAANA LETTER SAADHU +079F;N # THAANA LETTER DAADHU +07A0;N # THAANA LETTER TO +07A1;N # THAANA LETTER ZO +07A2;N # THAANA LETTER AINU +07A3;N # THAANA LETTER GHAINU +07A4;N # THAANA LETTER QAAFU +07A5;N # THAANA LETTER WAAVU +07A6;N # THAANA ABAFILI +07A7;N # THAANA AABAAFILI +07A8;N # THAANA IBIFILI +07A9;N # THAANA EEBEEFILI +07AA;N # THAANA UBUFILI +07AB;N # THAANA OOBOOFILI +07AC;N # THAANA EBEFILI +07AD;N # THAANA EYBEYFILI +07AE;N # THAANA OBOFILI +07AF;N # THAANA OABOAFILI +07B0;N # THAANA SUKUN +07B1;N # THAANA LETTER NAA +0901;N # DEVANAGARI SIGN CANDRABINDU +0902;N # DEVANAGARI SIGN ANUSVARA +0903;N # DEVANAGARI SIGN VISARGA +0904;N # DEVANAGARI LETTER SHORT A +0905;N # DEVANAGARI LETTER A +0906;N # DEVANAGARI LETTER AA +0907;N # DEVANAGARI LETTER I +0908;N # DEVANAGARI LETTER II +0909;N # DEVANAGARI LETTER U +090A;N # DEVANAGARI LETTER UU +090B;N # DEVANAGARI LETTER VOCALIC R +090C;N # DEVANAGARI LETTER VOCALIC L +090D;N # DEVANAGARI LETTER CANDRA E +090E;N # DEVANAGARI LETTER SHORT E +090F;N # DEVANAGARI LETTER E +0910;N # DEVANAGARI LETTER AI +0911;N # DEVANAGARI LETTER CANDRA O +0912;N # DEVANAGARI LETTER SHORT O +0913;N # DEVANAGARI LETTER O +0914;N # DEVANAGARI LETTER AU +0915;N # DEVANAGARI LETTER KA +0916;N # DEVANAGARI LETTER KHA +0917;N # DEVANAGARI LETTER GA +0918;N # DEVANAGARI LETTER GHA +0919;N # DEVANAGARI LETTER NGA +091A;N # DEVANAGARI LETTER CA +091B;N # DEVANAGARI LETTER CHA +091C;N # DEVANAGARI LETTER JA +091D;N # DEVANAGARI LETTER JHA +091E;N # DEVANAGARI LETTER NYA +091F;N # DEVANAGARI LETTER TTA +0920;N # DEVANAGARI LETTER TTHA +0921;N # DEVANAGARI LETTER DDA +0922;N # DEVANAGARI LETTER DDHA +0923;N # DEVANAGARI LETTER NNA +0924;N # DEVANAGARI LETTER TA +0925;N # DEVANAGARI LETTER THA +0926;N # DEVANAGARI LETTER DA +0927;N # DEVANAGARI LETTER DHA +0928;N # DEVANAGARI LETTER NA +0929;N # DEVANAGARI LETTER NNNA +092A;N # DEVANAGARI LETTER PA +092B;N # DEVANAGARI LETTER PHA +092C;N # DEVANAGARI LETTER BA +092D;N # DEVANAGARI LETTER BHA +092E;N # DEVANAGARI LETTER MA +092F;N # DEVANAGARI LETTER YA +0930;N # DEVANAGARI LETTER RA +0931;N # DEVANAGARI LETTER RRA +0932;N # DEVANAGARI LETTER LA +0933;N # DEVANAGARI LETTER LLA +0934;N # DEVANAGARI LETTER LLLA +0935;N # DEVANAGARI LETTER VA +0936;N # DEVANAGARI LETTER SHA +0937;N # DEVANAGARI LETTER SSA +0938;N # DEVANAGARI LETTER SA +0939;N # DEVANAGARI LETTER HA +093C;N # DEVANAGARI SIGN NUKTA +093D;N # DEVANAGARI SIGN AVAGRAHA +093E;N # DEVANAGARI VOWEL SIGN AA +093F;N # DEVANAGARI VOWEL SIGN I +0940;N # DEVANAGARI VOWEL SIGN II +0941;N # DEVANAGARI VOWEL SIGN U +0942;N # DEVANAGARI VOWEL SIGN UU +0943;N # DEVANAGARI VOWEL SIGN VOCALIC R +0944;N # DEVANAGARI VOWEL SIGN VOCALIC RR +0945;N # DEVANAGARI VOWEL SIGN CANDRA E +0946;N # DEVANAGARI VOWEL SIGN SHORT E +0947;N # DEVANAGARI VOWEL SIGN E +0948;N # DEVANAGARI VOWEL SIGN AI +0949;N # DEVANAGARI VOWEL SIGN CANDRA O +094A;N # DEVANAGARI VOWEL SIGN SHORT O +094B;N # DEVANAGARI VOWEL SIGN O +094C;N # DEVANAGARI VOWEL SIGN AU +094D;N # DEVANAGARI SIGN VIRAMA +0950;N # DEVANAGARI OM +0951;N # DEVANAGARI STRESS SIGN UDATTA +0952;N # DEVANAGARI STRESS SIGN ANUDATTA +0953;N # DEVANAGARI GRAVE ACCENT +0954;N # DEVANAGARI ACUTE ACCENT +0958;N # DEVANAGARI LETTER QA +0959;N # DEVANAGARI LETTER KHHA +095A;N # DEVANAGARI LETTER GHHA +095B;N # DEVANAGARI LETTER ZA +095C;N # DEVANAGARI LETTER DDDHA +095D;N # DEVANAGARI LETTER RHA +095E;N # DEVANAGARI LETTER FA +095F;N # DEVANAGARI LETTER YYA +0960;N # DEVANAGARI LETTER VOCALIC RR +0961;N # DEVANAGARI LETTER VOCALIC LL +0962;N # DEVANAGARI VOWEL SIGN VOCALIC L +0963;N # DEVANAGARI VOWEL SIGN VOCALIC LL +0964;N # DEVANAGARI DANDA +0965;N # DEVANAGARI DOUBLE DANDA +0966;N # DEVANAGARI DIGIT ZERO +0967;N # DEVANAGARI DIGIT ONE +0968;N # DEVANAGARI DIGIT TWO +0969;N # DEVANAGARI DIGIT THREE +096A;N # DEVANAGARI DIGIT FOUR +096B;N # DEVANAGARI DIGIT FIVE +096C;N # DEVANAGARI DIGIT SIX +096D;N # DEVANAGARI DIGIT SEVEN +096E;N # DEVANAGARI DIGIT EIGHT +096F;N # DEVANAGARI DIGIT NINE +0970;N # DEVANAGARI ABBREVIATION SIGN +097D;N # DEVANAGARI LETTER GLOTTAL STOP +0981;N # BENGALI SIGN CANDRABINDU +0982;N # BENGALI SIGN ANUSVARA +0983;N # BENGALI SIGN VISARGA +0985;N # BENGALI LETTER A +0986;N # BENGALI LETTER AA +0987;N # BENGALI LETTER I +0988;N # BENGALI LETTER II +0989;N # BENGALI LETTER U +098A;N # BENGALI LETTER UU +098B;N # BENGALI LETTER VOCALIC R +098C;N # BENGALI LETTER VOCALIC L +098F;N # BENGALI LETTER E +0990;N # BENGALI LETTER AI +0993;N # BENGALI LETTER O +0994;N # BENGALI LETTER AU +0995;N # BENGALI LETTER KA +0996;N # BENGALI LETTER KHA +0997;N # BENGALI LETTER GA +0998;N # BENGALI LETTER GHA +0999;N # BENGALI LETTER NGA +099A;N # BENGALI LETTER CA +099B;N # BENGALI LETTER CHA +099C;N # BENGALI LETTER JA +099D;N # BENGALI LETTER JHA +099E;N # BENGALI LETTER NYA +099F;N # BENGALI LETTER TTA +09A0;N # BENGALI LETTER TTHA +09A1;N # BENGALI LETTER DDA +09A2;N # BENGALI LETTER DDHA +09A3;N # BENGALI LETTER NNA +09A4;N # BENGALI LETTER TA +09A5;N # BENGALI LETTER THA +09A6;N # BENGALI LETTER DA +09A7;N # BENGALI LETTER DHA +09A8;N # BENGALI LETTER NA +09AA;N # BENGALI LETTER PA +09AB;N # BENGALI LETTER PHA +09AC;N # BENGALI LETTER BA +09AD;N # BENGALI LETTER BHA +09AE;N # BENGALI LETTER MA +09AF;N # BENGALI LETTER YA +09B0;N # BENGALI LETTER RA +09B2;N # BENGALI LETTER LA +09B6;N # BENGALI LETTER SHA +09B7;N # BENGALI LETTER SSA +09B8;N # BENGALI LETTER SA +09B9;N # BENGALI LETTER HA +09BC;N # BENGALI SIGN NUKTA +09BD;N # BENGALI SIGN AVAGRAHA +09BE;N # BENGALI VOWEL SIGN AA +09BF;N # BENGALI VOWEL SIGN I +09C0;N # BENGALI VOWEL SIGN II +09C1;N # BENGALI VOWEL SIGN U +09C2;N # BENGALI VOWEL SIGN UU +09C3;N # BENGALI VOWEL SIGN VOCALIC R +09C4;N # BENGALI VOWEL SIGN VOCALIC RR +09C7;N # BENGALI VOWEL SIGN E +09C8;N # BENGALI VOWEL SIGN AI +09CB;N # BENGALI VOWEL SIGN O +09CC;N # BENGALI VOWEL SIGN AU +09CD;N # BENGALI SIGN VIRAMA +09CE;N # BENGALI LETTER KHANDA TA +09D7;N # BENGALI AU LENGTH MARK +09DC;N # BENGALI LETTER RRA +09DD;N # BENGALI LETTER RHA +09DF;N # BENGALI LETTER YYA +09E0;N # BENGALI LETTER VOCALIC RR +09E1;N # BENGALI LETTER VOCALIC LL +09E2;N # BENGALI VOWEL SIGN VOCALIC L +09E3;N # BENGALI VOWEL SIGN VOCALIC LL +09E6;N # BENGALI DIGIT ZERO +09E7;N # BENGALI DIGIT ONE +09E8;N # BENGALI DIGIT TWO +09E9;N # BENGALI DIGIT THREE +09EA;N # BENGALI DIGIT FOUR +09EB;N # BENGALI DIGIT FIVE +09EC;N # BENGALI DIGIT SIX +09ED;N # BENGALI DIGIT SEVEN +09EE;N # BENGALI DIGIT EIGHT +09EF;N # BENGALI DIGIT NINE +09F0;N # BENGALI LETTER RA WITH MIDDLE DIAGONAL +09F1;N # BENGALI LETTER RA WITH LOWER DIAGONAL +09F2;N # BENGALI RUPEE MARK +09F3;N # BENGALI RUPEE SIGN +09F4;N # BENGALI CURRENCY NUMERATOR ONE +09F5;N # BENGALI CURRENCY NUMERATOR TWO +09F6;N # BENGALI CURRENCY NUMERATOR THREE +09F7;N # BENGALI CURRENCY NUMERATOR FOUR +09F8;N # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +09F9;N # BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA;N # BENGALI ISSHAR +0A01;N # GURMUKHI SIGN ADAK BINDI +0A02;N # GURMUKHI SIGN BINDI +0A03;N # GURMUKHI SIGN VISARGA +0A05;N # GURMUKHI LETTER A +0A06;N # GURMUKHI LETTER AA +0A07;N # GURMUKHI LETTER I +0A08;N # GURMUKHI LETTER II +0A09;N # GURMUKHI LETTER U +0A0A;N # GURMUKHI LETTER UU +0A0F;N # GURMUKHI LETTER EE +0A10;N # GURMUKHI LETTER AI +0A13;N # GURMUKHI LETTER OO +0A14;N # GURMUKHI LETTER AU +0A15;N # GURMUKHI LETTER KA +0A16;N # GURMUKHI LETTER KHA +0A17;N # GURMUKHI LETTER GA +0A18;N # GURMUKHI LETTER GHA +0A19;N # GURMUKHI LETTER NGA +0A1A;N # GURMUKHI LETTER CA +0A1B;N # GURMUKHI LETTER CHA +0A1C;N # GURMUKHI LETTER JA +0A1D;N # GURMUKHI LETTER JHA +0A1E;N # GURMUKHI LETTER NYA +0A1F;N # GURMUKHI LETTER TTA +0A20;N # GURMUKHI LETTER TTHA +0A21;N # GURMUKHI LETTER DDA +0A22;N # GURMUKHI LETTER DDHA +0A23;N # GURMUKHI LETTER NNA +0A24;N # GURMUKHI LETTER TA +0A25;N # GURMUKHI LETTER THA +0A26;N # GURMUKHI LETTER DA +0A27;N # GURMUKHI LETTER DHA +0A28;N # GURMUKHI LETTER NA +0A2A;N # GURMUKHI LETTER PA +0A2B;N # GURMUKHI LETTER PHA +0A2C;N # GURMUKHI LETTER BA +0A2D;N # GURMUKHI LETTER BHA +0A2E;N # GURMUKHI LETTER MA +0A2F;N # GURMUKHI LETTER YA +0A30;N # GURMUKHI LETTER RA +0A32;N # GURMUKHI LETTER LA +0A33;N # GURMUKHI LETTER LLA +0A35;N # GURMUKHI LETTER VA +0A36;N # GURMUKHI LETTER SHA +0A38;N # GURMUKHI LETTER SA +0A39;N # GURMUKHI LETTER HA +0A3C;N # GURMUKHI SIGN NUKTA +0A3E;N # GURMUKHI VOWEL SIGN AA +0A3F;N # GURMUKHI VOWEL SIGN I +0A40;N # GURMUKHI VOWEL SIGN II +0A41;N # GURMUKHI VOWEL SIGN U +0A42;N # GURMUKHI VOWEL SIGN UU +0A47;N # GURMUKHI VOWEL SIGN EE +0A48;N # GURMUKHI VOWEL SIGN AI +0A4B;N # GURMUKHI VOWEL SIGN OO +0A4C;N # GURMUKHI VOWEL SIGN AU +0A4D;N # GURMUKHI SIGN VIRAMA +0A59;N # GURMUKHI LETTER KHHA +0A5A;N # GURMUKHI LETTER GHHA +0A5B;N # GURMUKHI LETTER ZA +0A5C;N # GURMUKHI LETTER RRA +0A5E;N # GURMUKHI LETTER FA +0A66;N # GURMUKHI DIGIT ZERO +0A67;N # GURMUKHI DIGIT ONE +0A68;N # GURMUKHI DIGIT TWO +0A69;N # GURMUKHI DIGIT THREE +0A6A;N # GURMUKHI DIGIT FOUR +0A6B;N # GURMUKHI DIGIT FIVE +0A6C;N # GURMUKHI DIGIT SIX +0A6D;N # GURMUKHI DIGIT SEVEN +0A6E;N # GURMUKHI DIGIT EIGHT +0A6F;N # GURMUKHI DIGIT NINE +0A70;N # GURMUKHI TIPPI +0A71;N # GURMUKHI ADDAK +0A72;N # GURMUKHI IRI +0A73;N # GURMUKHI URA +0A74;N # GURMUKHI EK ONKAR +0A81;N # GUJARATI SIGN CANDRABINDU +0A82;N # GUJARATI SIGN ANUSVARA +0A83;N # GUJARATI SIGN VISARGA +0A85;N # GUJARATI LETTER A +0A86;N # GUJARATI LETTER AA +0A87;N # GUJARATI LETTER I +0A88;N # GUJARATI LETTER II +0A89;N # GUJARATI LETTER U +0A8A;N # GUJARATI LETTER UU +0A8B;N # GUJARATI LETTER VOCALIC R +0A8C;N # GUJARATI LETTER VOCALIC L +0A8D;N # GUJARATI VOWEL CANDRA E +0A8F;N # GUJARATI LETTER E +0A90;N # GUJARATI LETTER AI +0A91;N # GUJARATI VOWEL CANDRA O +0A93;N # GUJARATI LETTER O +0A94;N # GUJARATI LETTER AU +0A95;N # GUJARATI LETTER KA +0A96;N # GUJARATI LETTER KHA +0A97;N # GUJARATI LETTER GA +0A98;N # GUJARATI LETTER GHA +0A99;N # GUJARATI LETTER NGA +0A9A;N # GUJARATI LETTER CA +0A9B;N # GUJARATI LETTER CHA +0A9C;N # GUJARATI LETTER JA +0A9D;N # GUJARATI LETTER JHA +0A9E;N # GUJARATI LETTER NYA +0A9F;N # GUJARATI LETTER TTA +0AA0;N # GUJARATI LETTER TTHA +0AA1;N # GUJARATI LETTER DDA +0AA2;N # GUJARATI LETTER DDHA +0AA3;N # GUJARATI LETTER NNA +0AA4;N # GUJARATI LETTER TA +0AA5;N # GUJARATI LETTER THA +0AA6;N # GUJARATI LETTER DA +0AA7;N # GUJARATI LETTER DHA +0AA8;N # GUJARATI LETTER NA +0AAA;N # GUJARATI LETTER PA +0AAB;N # GUJARATI LETTER PHA +0AAC;N # GUJARATI LETTER BA +0AAD;N # GUJARATI LETTER BHA +0AAE;N # GUJARATI LETTER MA +0AAF;N # GUJARATI LETTER YA +0AB0;N # GUJARATI LETTER RA +0AB2;N # GUJARATI LETTER LA +0AB3;N # GUJARATI LETTER LLA +0AB5;N # GUJARATI LETTER VA +0AB6;N # GUJARATI LETTER SHA +0AB7;N # GUJARATI LETTER SSA +0AB8;N # GUJARATI LETTER SA +0AB9;N # GUJARATI LETTER HA +0ABC;N # GUJARATI SIGN NUKTA +0ABD;N # GUJARATI SIGN AVAGRAHA +0ABE;N # GUJARATI VOWEL SIGN AA +0ABF;N # GUJARATI VOWEL SIGN I +0AC0;N # GUJARATI VOWEL SIGN II +0AC1;N # GUJARATI VOWEL SIGN U +0AC2;N # GUJARATI VOWEL SIGN UU +0AC3;N # GUJARATI VOWEL SIGN VOCALIC R +0AC4;N # GUJARATI VOWEL SIGN VOCALIC RR +0AC5;N # GUJARATI VOWEL SIGN CANDRA E +0AC7;N # GUJARATI VOWEL SIGN E +0AC8;N # GUJARATI VOWEL SIGN AI +0AC9;N # GUJARATI VOWEL SIGN CANDRA O +0ACB;N # GUJARATI VOWEL SIGN O +0ACC;N # GUJARATI VOWEL SIGN AU +0ACD;N # GUJARATI SIGN VIRAMA +0AD0;N # GUJARATI OM +0AE0;N # GUJARATI LETTER VOCALIC RR +0AE1;N # GUJARATI LETTER VOCALIC LL +0AE2;N # GUJARATI VOWEL SIGN VOCALIC L +0AE3;N # GUJARATI VOWEL SIGN VOCALIC LL +0AE6;N # GUJARATI DIGIT ZERO +0AE7;N # GUJARATI DIGIT ONE +0AE8;N # GUJARATI DIGIT TWO +0AE9;N # GUJARATI DIGIT THREE +0AEA;N # GUJARATI DIGIT FOUR +0AEB;N # GUJARATI DIGIT FIVE +0AEC;N # GUJARATI DIGIT SIX +0AED;N # GUJARATI DIGIT SEVEN +0AEE;N # GUJARATI DIGIT EIGHT +0AEF;N # GUJARATI DIGIT NINE +0AF1;N # GUJARATI RUPEE SIGN +0B01;N # ORIYA SIGN CANDRABINDU +0B02;N # ORIYA SIGN ANUSVARA +0B03;N # ORIYA SIGN VISARGA +0B05;N # ORIYA LETTER A +0B06;N # ORIYA LETTER AA +0B07;N # ORIYA LETTER I +0B08;N # ORIYA LETTER II +0B09;N # ORIYA LETTER U +0B0A;N # ORIYA LETTER UU +0B0B;N # ORIYA LETTER VOCALIC R +0B0C;N # ORIYA LETTER VOCALIC L +0B0F;N # ORIYA LETTER E +0B10;N # ORIYA LETTER AI +0B13;N # ORIYA LETTER O +0B14;N # ORIYA LETTER AU +0B15;N # ORIYA LETTER KA +0B16;N # ORIYA LETTER KHA +0B17;N # ORIYA LETTER GA +0B18;N # ORIYA LETTER GHA +0B19;N # ORIYA LETTER NGA +0B1A;N # ORIYA LETTER CA +0B1B;N # ORIYA LETTER CHA +0B1C;N # ORIYA LETTER JA +0B1D;N # ORIYA LETTER JHA +0B1E;N # ORIYA LETTER NYA +0B1F;N # ORIYA LETTER TTA +0B20;N # ORIYA LETTER TTHA +0B21;N # ORIYA LETTER DDA +0B22;N # ORIYA LETTER DDHA +0B23;N # ORIYA LETTER NNA +0B24;N # ORIYA LETTER TA +0B25;N # ORIYA LETTER THA +0B26;N # ORIYA LETTER DA +0B27;N # ORIYA LETTER DHA +0B28;N # ORIYA LETTER NA +0B2A;N # ORIYA LETTER PA +0B2B;N # ORIYA LETTER PHA +0B2C;N # ORIYA LETTER BA +0B2D;N # ORIYA LETTER BHA +0B2E;N # ORIYA LETTER MA +0B2F;N # ORIYA LETTER YA +0B30;N # ORIYA LETTER RA +0B32;N # ORIYA LETTER LA +0B33;N # ORIYA LETTER LLA +0B35;N # ORIYA LETTER VA +0B36;N # ORIYA LETTER SHA +0B37;N # ORIYA LETTER SSA +0B38;N # ORIYA LETTER SA +0B39;N # ORIYA LETTER HA +0B3C;N # ORIYA SIGN NUKTA +0B3D;N # ORIYA SIGN AVAGRAHA +0B3E;N # ORIYA VOWEL SIGN AA +0B3F;N # ORIYA VOWEL SIGN I +0B40;N # ORIYA VOWEL SIGN II +0B41;N # ORIYA VOWEL SIGN U +0B42;N # ORIYA VOWEL SIGN UU +0B43;N # ORIYA VOWEL SIGN VOCALIC R +0B47;N # ORIYA VOWEL SIGN E +0B48;N # ORIYA VOWEL SIGN AI +0B4B;N # ORIYA VOWEL SIGN O +0B4C;N # ORIYA VOWEL SIGN AU +0B4D;N # ORIYA SIGN VIRAMA +0B56;N # ORIYA AI LENGTH MARK +0B57;N # ORIYA AU LENGTH MARK +0B5C;N # ORIYA LETTER RRA +0B5D;N # ORIYA LETTER RHA +0B5F;N # ORIYA LETTER YYA +0B60;N # ORIYA LETTER VOCALIC RR +0B61;N # ORIYA LETTER VOCALIC LL +0B66;N # ORIYA DIGIT ZERO +0B67;N # ORIYA DIGIT ONE +0B68;N # ORIYA DIGIT TWO +0B69;N # ORIYA DIGIT THREE +0B6A;N # ORIYA DIGIT FOUR +0B6B;N # ORIYA DIGIT FIVE +0B6C;N # ORIYA DIGIT SIX +0B6D;N # ORIYA DIGIT SEVEN +0B6E;N # ORIYA DIGIT EIGHT +0B6F;N # ORIYA DIGIT NINE +0B70;N # ORIYA ISSHAR +0B71;N # ORIYA LETTER WA +0B82;N # TAMIL SIGN ANUSVARA +0B83;N # TAMIL SIGN VISARGA +0B85;N # TAMIL LETTER A +0B86;N # TAMIL LETTER AA +0B87;N # TAMIL LETTER I +0B88;N # TAMIL LETTER II +0B89;N # TAMIL LETTER U +0B8A;N # TAMIL LETTER UU +0B8E;N # TAMIL LETTER E +0B8F;N # TAMIL LETTER EE +0B90;N # TAMIL LETTER AI +0B92;N # TAMIL LETTER O +0B93;N # TAMIL LETTER OO +0B94;N # TAMIL LETTER AU +0B95;N # TAMIL LETTER KA +0B99;N # TAMIL LETTER NGA +0B9A;N # TAMIL LETTER CA +0B9C;N # TAMIL LETTER JA +0B9E;N # TAMIL LETTER NYA +0B9F;N # TAMIL LETTER TTA +0BA3;N # TAMIL LETTER NNA +0BA4;N # TAMIL LETTER TA +0BA8;N # TAMIL LETTER NA +0BA9;N # TAMIL LETTER NNNA +0BAA;N # TAMIL LETTER PA +0BAE;N # TAMIL LETTER MA +0BAF;N # TAMIL LETTER YA +0BB0;N # TAMIL LETTER RA +0BB1;N # TAMIL LETTER RRA +0BB2;N # TAMIL LETTER LA +0BB3;N # TAMIL LETTER LLA +0BB4;N # TAMIL LETTER LLLA +0BB5;N # TAMIL LETTER VA +0BB6;N # TAMIL LETTER SHA +0BB7;N # TAMIL LETTER SSA +0BB8;N # TAMIL LETTER SA +0BB9;N # TAMIL LETTER HA +0BBE;N # TAMIL VOWEL SIGN AA +0BBF;N # TAMIL VOWEL SIGN I +0BC0;N # TAMIL VOWEL SIGN II +0BC1;N # TAMIL VOWEL SIGN U +0BC2;N # TAMIL VOWEL SIGN UU +0BC6;N # TAMIL VOWEL SIGN E +0BC7;N # TAMIL VOWEL SIGN EE +0BC8;N # TAMIL VOWEL SIGN AI +0BCA;N # TAMIL VOWEL SIGN O +0BCB;N # TAMIL VOWEL SIGN OO +0BCC;N # TAMIL VOWEL SIGN AU +0BCD;N # TAMIL SIGN VIRAMA +0BD7;N # TAMIL AU LENGTH MARK +0BE6;N # TAMIL DIGIT ZERO +0BE7;N # TAMIL DIGIT ONE +0BE8;N # TAMIL DIGIT TWO +0BE9;N # TAMIL DIGIT THREE +0BEA;N # TAMIL DIGIT FOUR +0BEB;N # TAMIL DIGIT FIVE +0BEC;N # TAMIL DIGIT SIX +0BED;N # TAMIL DIGIT SEVEN +0BEE;N # TAMIL DIGIT EIGHT +0BEF;N # TAMIL DIGIT NINE +0BF0;N # TAMIL NUMBER TEN +0BF1;N # TAMIL NUMBER ONE HUNDRED +0BF2;N # TAMIL NUMBER ONE THOUSAND +0BF3;N # TAMIL DAY SIGN +0BF4;N # TAMIL MONTH SIGN +0BF5;N # TAMIL YEAR SIGN +0BF6;N # TAMIL DEBIT SIGN +0BF7;N # TAMIL CREDIT SIGN +0BF8;N # TAMIL AS ABOVE SIGN +0BF9;N # TAMIL RUPEE SIGN +0BFA;N # TAMIL NUMBER SIGN +0C01;N # TELUGU SIGN CANDRABINDU +0C02;N # TELUGU SIGN ANUSVARA +0C03;N # TELUGU SIGN VISARGA +0C05;N # TELUGU LETTER A +0C06;N # TELUGU LETTER AA +0C07;N # TELUGU LETTER I +0C08;N # TELUGU LETTER II +0C09;N # TELUGU LETTER U +0C0A;N # TELUGU LETTER UU +0C0B;N # TELUGU LETTER VOCALIC R +0C0C;N # TELUGU LETTER VOCALIC L +0C0E;N # TELUGU LETTER E +0C0F;N # TELUGU LETTER EE +0C10;N # TELUGU LETTER AI +0C12;N # TELUGU LETTER O +0C13;N # TELUGU LETTER OO +0C14;N # TELUGU LETTER AU +0C15;N # TELUGU LETTER KA +0C16;N # TELUGU LETTER KHA +0C17;N # TELUGU LETTER GA +0C18;N # TELUGU LETTER GHA +0C19;N # TELUGU LETTER NGA +0C1A;N # TELUGU LETTER CA +0C1B;N # TELUGU LETTER CHA +0C1C;N # TELUGU LETTER JA +0C1D;N # TELUGU LETTER JHA +0C1E;N # TELUGU LETTER NYA +0C1F;N # TELUGU LETTER TTA +0C20;N # TELUGU LETTER TTHA +0C21;N # TELUGU LETTER DDA +0C22;N # TELUGU LETTER DDHA +0C23;N # TELUGU LETTER NNA +0C24;N # TELUGU LETTER TA +0C25;N # TELUGU LETTER THA +0C26;N # TELUGU LETTER DA +0C27;N # TELUGU LETTER DHA +0C28;N # TELUGU LETTER NA +0C2A;N # TELUGU LETTER PA +0C2B;N # TELUGU LETTER PHA +0C2C;N # TELUGU LETTER BA +0C2D;N # TELUGU LETTER BHA +0C2E;N # TELUGU LETTER MA +0C2F;N # TELUGU LETTER YA +0C30;N # TELUGU LETTER RA +0C31;N # TELUGU LETTER RRA +0C32;N # TELUGU LETTER LA +0C33;N # TELUGU LETTER LLA +0C35;N # TELUGU LETTER VA +0C36;N # TELUGU LETTER SHA +0C37;N # TELUGU LETTER SSA +0C38;N # TELUGU LETTER SA +0C39;N # TELUGU LETTER HA +0C3E;N # TELUGU VOWEL SIGN AA +0C3F;N # TELUGU VOWEL SIGN I +0C40;N # TELUGU VOWEL SIGN II +0C41;N # TELUGU VOWEL SIGN U +0C42;N # TELUGU VOWEL SIGN UU +0C43;N # TELUGU VOWEL SIGN VOCALIC R +0C44;N # TELUGU VOWEL SIGN VOCALIC RR +0C46;N # TELUGU VOWEL SIGN E +0C47;N # TELUGU VOWEL SIGN EE +0C48;N # TELUGU VOWEL SIGN AI +0C4A;N # TELUGU VOWEL SIGN O +0C4B;N # TELUGU VOWEL SIGN OO +0C4C;N # TELUGU VOWEL SIGN AU +0C4D;N # TELUGU SIGN VIRAMA +0C55;N # TELUGU LENGTH MARK +0C56;N # TELUGU AI LENGTH MARK +0C60;N # TELUGU LETTER VOCALIC RR +0C61;N # TELUGU LETTER VOCALIC LL +0C66;N # TELUGU DIGIT ZERO +0C67;N # TELUGU DIGIT ONE +0C68;N # TELUGU DIGIT TWO +0C69;N # TELUGU DIGIT THREE +0C6A;N # TELUGU DIGIT FOUR +0C6B;N # TELUGU DIGIT FIVE +0C6C;N # TELUGU DIGIT SIX +0C6D;N # TELUGU DIGIT SEVEN +0C6E;N # TELUGU DIGIT EIGHT +0C6F;N # TELUGU DIGIT NINE +0C82;N # KANNADA SIGN ANUSVARA +0C83;N # KANNADA SIGN VISARGA +0C85;N # KANNADA LETTER A +0C86;N # KANNADA LETTER AA +0C87;N # KANNADA LETTER I +0C88;N # KANNADA LETTER II +0C89;N # KANNADA LETTER U +0C8A;N # KANNADA LETTER UU +0C8B;N # KANNADA LETTER VOCALIC R +0C8C;N # KANNADA LETTER VOCALIC L +0C8E;N # KANNADA LETTER E +0C8F;N # KANNADA LETTER EE +0C90;N # KANNADA LETTER AI +0C92;N # KANNADA LETTER O +0C93;N # KANNADA LETTER OO +0C94;N # KANNADA LETTER AU +0C95;N # KANNADA LETTER KA +0C96;N # KANNADA LETTER KHA +0C97;N # KANNADA LETTER GA +0C98;N # KANNADA LETTER GHA +0C99;N # KANNADA LETTER NGA +0C9A;N # KANNADA LETTER CA +0C9B;N # KANNADA LETTER CHA +0C9C;N # KANNADA LETTER JA +0C9D;N # KANNADA LETTER JHA +0C9E;N # KANNADA LETTER NYA +0C9F;N # KANNADA LETTER TTA +0CA0;N # KANNADA LETTER TTHA +0CA1;N # KANNADA LETTER DDA +0CA2;N # KANNADA LETTER DDHA +0CA3;N # KANNADA LETTER NNA +0CA4;N # KANNADA LETTER TA +0CA5;N # KANNADA LETTER THA +0CA6;N # KANNADA LETTER DA +0CA7;N # KANNADA LETTER DHA +0CA8;N # KANNADA LETTER NA +0CAA;N # KANNADA LETTER PA +0CAB;N # KANNADA LETTER PHA +0CAC;N # KANNADA LETTER BA +0CAD;N # KANNADA LETTER BHA +0CAE;N # KANNADA LETTER MA +0CAF;N # KANNADA LETTER YA +0CB0;N # KANNADA LETTER RA +0CB1;N # KANNADA LETTER RRA +0CB2;N # KANNADA LETTER LA +0CB3;N # KANNADA LETTER LLA +0CB5;N # KANNADA LETTER VA +0CB6;N # KANNADA LETTER SHA +0CB7;N # KANNADA LETTER SSA +0CB8;N # KANNADA LETTER SA +0CB9;N # KANNADA LETTER HA +0CBC;N # KANNADA SIGN NUKTA +0CBD;N # KANNADA SIGN AVAGRAHA +0CBE;N # KANNADA VOWEL SIGN AA +0CBF;N # KANNADA VOWEL SIGN I +0CC0;N # KANNADA VOWEL SIGN II +0CC1;N # KANNADA VOWEL SIGN U +0CC2;N # KANNADA VOWEL SIGN UU +0CC3;N # KANNADA VOWEL SIGN VOCALIC R +0CC4;N # KANNADA VOWEL SIGN VOCALIC RR +0CC6;N # KANNADA VOWEL SIGN E +0CC7;N # KANNADA VOWEL SIGN EE +0CC8;N # KANNADA VOWEL SIGN AI +0CCA;N # KANNADA VOWEL SIGN O +0CCB;N # KANNADA VOWEL SIGN OO +0CCC;N # KANNADA VOWEL SIGN AU +0CCD;N # KANNADA SIGN VIRAMA +0CD5;N # KANNADA LENGTH MARK +0CD6;N # KANNADA AI LENGTH MARK +0CDE;N # KANNADA LETTER FA +0CE0;N # KANNADA LETTER VOCALIC RR +0CE1;N # KANNADA LETTER VOCALIC LL +0CE6;N # KANNADA DIGIT ZERO +0CE7;N # KANNADA DIGIT ONE +0CE8;N # KANNADA DIGIT TWO +0CE9;N # KANNADA DIGIT THREE +0CEA;N # KANNADA DIGIT FOUR +0CEB;N # KANNADA DIGIT FIVE +0CEC;N # KANNADA DIGIT SIX +0CED;N # KANNADA DIGIT SEVEN +0CEE;N # KANNADA DIGIT EIGHT +0CEF;N # KANNADA DIGIT NINE +0D02;N # MALAYALAM SIGN ANUSVARA +0D03;N # MALAYALAM SIGN VISARGA +0D05;N # MALAYALAM LETTER A +0D06;N # MALAYALAM LETTER AA +0D07;N # MALAYALAM LETTER I +0D08;N # MALAYALAM LETTER II +0D09;N # MALAYALAM LETTER U +0D0A;N # MALAYALAM LETTER UU +0D0B;N # MALAYALAM LETTER VOCALIC R +0D0C;N # MALAYALAM LETTER VOCALIC L +0D0E;N # MALAYALAM LETTER E +0D0F;N # MALAYALAM LETTER EE +0D10;N # MALAYALAM LETTER AI +0D12;N # MALAYALAM LETTER O +0D13;N # MALAYALAM LETTER OO +0D14;N # MALAYALAM LETTER AU +0D15;N # MALAYALAM LETTER KA +0D16;N # MALAYALAM LETTER KHA +0D17;N # MALAYALAM LETTER GA +0D18;N # MALAYALAM LETTER GHA +0D19;N # MALAYALAM LETTER NGA +0D1A;N # MALAYALAM LETTER CA +0D1B;N # MALAYALAM LETTER CHA +0D1C;N # MALAYALAM LETTER JA +0D1D;N # MALAYALAM LETTER JHA +0D1E;N # MALAYALAM LETTER NYA +0D1F;N # MALAYALAM LETTER TTA +0D20;N # MALAYALAM LETTER TTHA +0D21;N # MALAYALAM LETTER DDA +0D22;N # MALAYALAM LETTER DDHA +0D23;N # MALAYALAM LETTER NNA +0D24;N # MALAYALAM LETTER TA +0D25;N # MALAYALAM LETTER THA +0D26;N # MALAYALAM LETTER DA +0D27;N # MALAYALAM LETTER DHA +0D28;N # MALAYALAM LETTER NA +0D2A;N # MALAYALAM LETTER PA +0D2B;N # MALAYALAM LETTER PHA +0D2C;N # MALAYALAM LETTER BA +0D2D;N # MALAYALAM LETTER BHA +0D2E;N # MALAYALAM LETTER MA +0D2F;N # MALAYALAM LETTER YA +0D30;N # MALAYALAM LETTER RA +0D31;N # MALAYALAM LETTER RRA +0D32;N # MALAYALAM LETTER LA +0D33;N # MALAYALAM LETTER LLA +0D34;N # MALAYALAM LETTER LLLA +0D35;N # MALAYALAM LETTER VA +0D36;N # MALAYALAM LETTER SHA +0D37;N # MALAYALAM LETTER SSA +0D38;N # MALAYALAM LETTER SA +0D39;N # MALAYALAM LETTER HA +0D3E;N # MALAYALAM VOWEL SIGN AA +0D3F;N # MALAYALAM VOWEL SIGN I +0D40;N # MALAYALAM VOWEL SIGN II +0D41;N # MALAYALAM VOWEL SIGN U +0D42;N # MALAYALAM VOWEL SIGN UU +0D43;N # MALAYALAM VOWEL SIGN VOCALIC R +0D46;N # MALAYALAM VOWEL SIGN E +0D47;N # MALAYALAM VOWEL SIGN EE +0D48;N # MALAYALAM VOWEL SIGN AI +0D4A;N # MALAYALAM VOWEL SIGN O +0D4B;N # MALAYALAM VOWEL SIGN OO +0D4C;N # MALAYALAM VOWEL SIGN AU +0D4D;N # MALAYALAM SIGN VIRAMA +0D57;N # MALAYALAM AU LENGTH MARK +0D60;N # MALAYALAM LETTER VOCALIC RR +0D61;N # MALAYALAM LETTER VOCALIC LL +0D66;N # MALAYALAM DIGIT ZERO +0D67;N # MALAYALAM DIGIT ONE +0D68;N # MALAYALAM DIGIT TWO +0D69;N # MALAYALAM DIGIT THREE +0D6A;N # MALAYALAM DIGIT FOUR +0D6B;N # MALAYALAM DIGIT FIVE +0D6C;N # MALAYALAM DIGIT SIX +0D6D;N # MALAYALAM DIGIT SEVEN +0D6E;N # MALAYALAM DIGIT EIGHT +0D6F;N # MALAYALAM DIGIT NINE +0D82;N # SINHALA SIGN ANUSVARAYA +0D83;N # SINHALA SIGN VISARGAYA +0D85;N # SINHALA LETTER AYANNA +0D86;N # SINHALA LETTER AAYANNA +0D87;N # SINHALA LETTER AEYANNA +0D88;N # SINHALA LETTER AEEYANNA +0D89;N # SINHALA LETTER IYANNA +0D8A;N # SINHALA LETTER IIYANNA +0D8B;N # SINHALA LETTER UYANNA +0D8C;N # SINHALA LETTER UUYANNA +0D8D;N # SINHALA LETTER IRUYANNA +0D8E;N # SINHALA LETTER IRUUYANNA +0D8F;N # SINHALA LETTER ILUYANNA +0D90;N # SINHALA LETTER ILUUYANNA +0D91;N # SINHALA LETTER EYANNA +0D92;N # SINHALA LETTER EEYANNA +0D93;N # SINHALA LETTER AIYANNA +0D94;N # SINHALA LETTER OYANNA +0D95;N # SINHALA LETTER OOYANNA +0D96;N # SINHALA LETTER AUYANNA +0D9A;N # SINHALA LETTER ALPAPRAANA KAYANNA +0D9B;N # SINHALA LETTER MAHAAPRAANA KAYANNA +0D9C;N # SINHALA LETTER ALPAPRAANA GAYANNA +0D9D;N # SINHALA LETTER MAHAAPRAANA GAYANNA +0D9E;N # SINHALA LETTER KANTAJA NAASIKYAYA +0D9F;N # SINHALA LETTER SANYAKA GAYANNA +0DA0;N # SINHALA LETTER ALPAPRAANA CAYANNA +0DA1;N # SINHALA LETTER MAHAAPRAANA CAYANNA +0DA2;N # SINHALA LETTER ALPAPRAANA JAYANNA +0DA3;N # SINHALA LETTER MAHAAPRAANA JAYANNA +0DA4;N # SINHALA LETTER TAALUJA NAASIKYAYA +0DA5;N # SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA +0DA6;N # SINHALA LETTER SANYAKA JAYANNA +0DA7;N # SINHALA LETTER ALPAPRAANA TTAYANNA +0DA8;N # SINHALA LETTER MAHAAPRAANA TTAYANNA +0DA9;N # SINHALA LETTER ALPAPRAANA DDAYANNA +0DAA;N # SINHALA LETTER MAHAAPRAANA DDAYANNA +0DAB;N # SINHALA LETTER MUURDHAJA NAYANNA +0DAC;N # SINHALA LETTER SANYAKA DDAYANNA +0DAD;N # SINHALA LETTER ALPAPRAANA TAYANNA +0DAE;N # SINHALA LETTER MAHAAPRAANA TAYANNA +0DAF;N # SINHALA LETTER ALPAPRAANA DAYANNA +0DB0;N # SINHALA LETTER MAHAAPRAANA DAYANNA +0DB1;N # SINHALA LETTER DANTAJA NAYANNA +0DB3;N # SINHALA LETTER SANYAKA DAYANNA +0DB4;N # SINHALA LETTER ALPAPRAANA PAYANNA +0DB5;N # SINHALA LETTER MAHAAPRAANA PAYANNA +0DB6;N # SINHALA LETTER ALPAPRAANA BAYANNA +0DB7;N # SINHALA LETTER MAHAAPRAANA BAYANNA +0DB8;N # SINHALA LETTER MAYANNA +0DB9;N # SINHALA LETTER AMBA BAYANNA +0DBA;N # SINHALA LETTER YAYANNA +0DBB;N # SINHALA LETTER RAYANNA +0DBD;N # SINHALA LETTER DANTAJA LAYANNA +0DC0;N # SINHALA LETTER VAYANNA +0DC1;N # SINHALA LETTER TAALUJA SAYANNA +0DC2;N # SINHALA LETTER MUURDHAJA SAYANNA +0DC3;N # SINHALA LETTER DANTAJA SAYANNA +0DC4;N # SINHALA LETTER HAYANNA +0DC5;N # SINHALA LETTER MUURDHAJA LAYANNA +0DC6;N # SINHALA LETTER FAYANNA +0DCA;N # SINHALA SIGN AL-LAKUNA +0DCF;N # SINHALA VOWEL SIGN AELA-PILLA +0DD0;N # SINHALA VOWEL SIGN KETTI AEDA-PILLA +0DD1;N # SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2;N # SINHALA VOWEL SIGN KETTI IS-PILLA +0DD3;N # SINHALA VOWEL SIGN DIGA IS-PILLA +0DD4;N # SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6;N # SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8;N # SINHALA VOWEL SIGN GAETTA-PILLA +0DD9;N # SINHALA VOWEL SIGN KOMBUVA +0DDA;N # SINHALA VOWEL SIGN DIGA KOMBUVA +0DDB;N # SINHALA VOWEL SIGN KOMBU DEKA +0DDC;N # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA +0DDD;N # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA +0DDE;N # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA +0DDF;N # SINHALA VOWEL SIGN GAYANUKITTA +0DF2;N # SINHALA VOWEL SIGN DIGA GAETTA-PILLA +0DF3;N # SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DF4;N # SINHALA PUNCTUATION KUNDDALIYA +0E01;N # THAI CHARACTER KO KAI +0E02;N # THAI CHARACTER KHO KHAI +0E03;N # THAI CHARACTER KHO KHUAT +0E04;N # THAI CHARACTER KHO KHWAI +0E05;N # THAI CHARACTER KHO KHON +0E06;N # THAI CHARACTER KHO RAKHANG +0E07;N # THAI CHARACTER NGO NGU +0E08;N # THAI CHARACTER CHO CHAN +0E09;N # THAI CHARACTER CHO CHING +0E0A;N # THAI CHARACTER CHO CHANG +0E0B;N # THAI CHARACTER SO SO +0E0C;N # THAI CHARACTER CHO CHOE +0E0D;N # THAI CHARACTER YO YING +0E0E;N # THAI CHARACTER DO CHADA +0E0F;N # THAI CHARACTER TO PATAK +0E10;N # THAI CHARACTER THO THAN +0E11;N # THAI CHARACTER THO NANGMONTHO +0E12;N # THAI CHARACTER THO PHUTHAO +0E13;N # THAI CHARACTER NO NEN +0E14;N # THAI CHARACTER DO DEK +0E15;N # THAI CHARACTER TO TAO +0E16;N # THAI CHARACTER THO THUNG +0E17;N # THAI CHARACTER THO THAHAN +0E18;N # THAI CHARACTER THO THONG +0E19;N # THAI CHARACTER NO NU +0E1A;N # THAI CHARACTER BO BAIMAI +0E1B;N # THAI CHARACTER PO PLA +0E1C;N # THAI CHARACTER PHO PHUNG +0E1D;N # THAI CHARACTER FO FA +0E1E;N # THAI CHARACTER PHO PHAN +0E1F;N # THAI CHARACTER FO FAN +0E20;N # THAI CHARACTER PHO SAMPHAO +0E21;N # THAI CHARACTER MO MA +0E22;N # THAI CHARACTER YO YAK +0E23;N # THAI CHARACTER RO RUA +0E24;N # THAI CHARACTER RU +0E25;N # THAI CHARACTER LO LING +0E26;N # THAI CHARACTER LU +0E27;N # THAI CHARACTER WO WAEN +0E28;N # THAI CHARACTER SO SALA +0E29;N # THAI CHARACTER SO RUSI +0E2A;N # THAI CHARACTER SO SUA +0E2B;N # THAI CHARACTER HO HIP +0E2C;N # THAI CHARACTER LO CHULA +0E2D;N # THAI CHARACTER O ANG +0E2E;N # THAI CHARACTER HO NOKHUK +0E2F;N # THAI CHARACTER PAIYANNOI +0E30;N # THAI CHARACTER SARA A +0E31;N # THAI CHARACTER MAI HAN-AKAT +0E32;N # THAI CHARACTER SARA AA +0E33;N # THAI CHARACTER SARA AM +0E34;N # THAI CHARACTER SARA I +0E35;N # THAI CHARACTER SARA II +0E36;N # THAI CHARACTER SARA UE +0E37;N # THAI CHARACTER SARA UEE +0E38;N # THAI CHARACTER SARA U +0E39;N # THAI CHARACTER SARA UU +0E3A;N # THAI CHARACTER PHINTHU +0E3F;N # THAI CURRENCY SYMBOL BAHT +0E40;N # THAI CHARACTER SARA E +0E41;N # THAI CHARACTER SARA AE +0E42;N # THAI CHARACTER SARA O +0E43;N # THAI CHARACTER SARA AI MAIMUAN +0E44;N # THAI CHARACTER SARA AI MAIMALAI +0E45;N # THAI CHARACTER LAKKHANGYAO +0E46;N # THAI CHARACTER MAIYAMOK +0E47;N # THAI CHARACTER MAITAIKHU +0E48;N # THAI CHARACTER MAI EK +0E49;N # THAI CHARACTER MAI THO +0E4A;N # THAI CHARACTER MAI TRI +0E4B;N # THAI CHARACTER MAI CHATTAWA +0E4C;N # THAI CHARACTER THANTHAKHAT +0E4D;N # THAI CHARACTER NIKHAHIT +0E4E;N # THAI CHARACTER YAMAKKAN +0E4F;N # THAI CHARACTER FONGMAN +0E50;N # THAI DIGIT ZERO +0E51;N # THAI DIGIT ONE +0E52;N # THAI DIGIT TWO +0E53;N # THAI DIGIT THREE +0E54;N # THAI DIGIT FOUR +0E55;N # THAI DIGIT FIVE +0E56;N # THAI DIGIT SIX +0E57;N # THAI DIGIT SEVEN +0E58;N # THAI DIGIT EIGHT +0E59;N # THAI DIGIT NINE +0E5A;N # THAI CHARACTER ANGKHANKHU +0E5B;N # THAI CHARACTER KHOMUT +0E81;N # LAO LETTER KO +0E82;N # LAO LETTER KHO SUNG +0E84;N # LAO LETTER KHO TAM +0E87;N # LAO LETTER NGO +0E88;N # LAO LETTER CO +0E8A;N # LAO LETTER SO TAM +0E8D;N # LAO LETTER NYO +0E94;N # LAO LETTER DO +0E95;N # LAO LETTER TO +0E96;N # LAO LETTER THO SUNG +0E97;N # LAO LETTER THO TAM +0E99;N # LAO LETTER NO +0E9A;N # LAO LETTER BO +0E9B;N # LAO LETTER PO +0E9C;N # LAO LETTER PHO SUNG +0E9D;N # LAO LETTER FO TAM +0E9E;N # LAO LETTER PHO TAM +0E9F;N # LAO LETTER FO SUNG +0EA1;N # LAO LETTER MO +0EA2;N # LAO LETTER YO +0EA3;N # LAO LETTER LO LING +0EA5;N # LAO LETTER LO LOOT +0EA7;N # LAO LETTER WO +0EAA;N # LAO LETTER SO SUNG +0EAB;N # LAO LETTER HO SUNG +0EAD;N # LAO LETTER O +0EAE;N # LAO LETTER HO TAM +0EAF;N # LAO ELLIPSIS +0EB0;N # LAO VOWEL SIGN A +0EB1;N # LAO VOWEL SIGN MAI KAN +0EB2;N # LAO VOWEL SIGN AA +0EB3;N # LAO VOWEL SIGN AM +0EB4;N # LAO VOWEL SIGN I +0EB5;N # LAO VOWEL SIGN II +0EB6;N # LAO VOWEL SIGN Y +0EB7;N # LAO VOWEL SIGN YY +0EB8;N # LAO VOWEL SIGN U +0EB9;N # LAO VOWEL SIGN UU +0EBB;N # LAO VOWEL SIGN MAI KON +0EBC;N # LAO SEMIVOWEL SIGN LO +0EBD;N # LAO SEMIVOWEL SIGN NYO +0EC0;N # LAO VOWEL SIGN E +0EC1;N # LAO VOWEL SIGN EI +0EC2;N # LAO VOWEL SIGN O +0EC3;N # LAO VOWEL SIGN AY +0EC4;N # LAO VOWEL SIGN AI +0EC6;N # LAO KO LA +0EC8;N # LAO TONE MAI EK +0EC9;N # LAO TONE MAI THO +0ECA;N # LAO TONE MAI TI +0ECB;N # LAO TONE MAI CATAWA +0ECC;N # LAO CANCELLATION MARK +0ECD;N # LAO NIGGAHITA +0ED0;N # LAO DIGIT ZERO +0ED1;N # LAO DIGIT ONE +0ED2;N # LAO DIGIT TWO +0ED3;N # LAO DIGIT THREE +0ED4;N # LAO DIGIT FOUR +0ED5;N # LAO DIGIT FIVE +0ED6;N # LAO DIGIT SIX +0ED7;N # LAO DIGIT SEVEN +0ED8;N # LAO DIGIT EIGHT +0ED9;N # LAO DIGIT NINE +0EDC;N # LAO HO NO +0EDD;N # LAO HO MO +0F00;N # TIBETAN SYLLABLE OM +0F01;N # TIBETAN MARK GTER YIG MGO TRUNCATED A +0F02;N # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA +0F03;N # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04;N # TIBETAN MARK INITIAL YIG MGO MDUN MA +0F05;N # TIBETAN MARK CLOSING YIG MGO SGAB MA +0F06;N # TIBETAN MARK CARET YIG MGO PHUR SHAD MA +0F07;N # TIBETAN MARK YIG MGO TSHEG SHAD MA +0F08;N # TIBETAN MARK SBRUL SHAD +0F09;N # TIBETAN MARK BSKUR YIG MGO +0F0A;N # TIBETAN MARK BKA- SHOG YIG MGO +0F0B;N # TIBETAN MARK INTERSYLLABIC TSHEG +0F0C;N # TIBETAN MARK DELIMITER TSHEG BSTAR +0F0D;N # TIBETAN MARK SHAD +0F0E;N # TIBETAN MARK NYIS SHAD +0F0F;N # TIBETAN MARK TSHEG SHAD +0F10;N # TIBETAN MARK NYIS TSHEG SHAD +0F11;N # TIBETAN MARK RIN CHEN SPUNGS SHAD +0F12;N # TIBETAN MARK RGYA GRAM SHAD +0F13;N # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +0F14;N # TIBETAN MARK GTER TSHEG +0F15;N # TIBETAN LOGOTYPE SIGN CHAD RTAGS +0F16;N # TIBETAN LOGOTYPE SIGN LHAG RTAGS +0F17;N # TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F18;N # TIBETAN ASTROLOGICAL SIGN -KHYUD PA +0F19;N # TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F1A;N # TIBETAN SIGN RDEL DKAR GCIG +0F1B;N # TIBETAN SIGN RDEL DKAR GNYIS +0F1C;N # TIBETAN SIGN RDEL DKAR GSUM +0F1D;N # TIBETAN SIGN RDEL NAG GCIG +0F1E;N # TIBETAN SIGN RDEL NAG GNYIS +0F1F;N # TIBETAN SIGN RDEL DKAR RDEL NAG +0F20;N # TIBETAN DIGIT ZERO +0F21;N # TIBETAN DIGIT ONE +0F22;N # TIBETAN DIGIT TWO +0F23;N # TIBETAN DIGIT THREE +0F24;N # TIBETAN DIGIT FOUR +0F25;N # TIBETAN DIGIT FIVE +0F26;N # TIBETAN DIGIT SIX +0F27;N # TIBETAN DIGIT SEVEN +0F28;N # TIBETAN DIGIT EIGHT +0F29;N # TIBETAN DIGIT NINE +0F2A;N # TIBETAN DIGIT HALF ONE +0F2B;N # TIBETAN DIGIT HALF TWO +0F2C;N # TIBETAN DIGIT HALF THREE +0F2D;N # TIBETAN DIGIT HALF FOUR +0F2E;N # TIBETAN DIGIT HALF FIVE +0F2F;N # TIBETAN DIGIT HALF SIX +0F30;N # TIBETAN DIGIT HALF SEVEN +0F31;N # TIBETAN DIGIT HALF EIGHT +0F32;N # TIBETAN DIGIT HALF NINE +0F33;N # TIBETAN DIGIT HALF ZERO +0F34;N # TIBETAN MARK BSDUS RTAGS +0F35;N # TIBETAN MARK NGAS BZUNG NYI ZLA +0F36;N # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F37;N # TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F38;N # TIBETAN MARK CHE MGO +0F39;N # TIBETAN MARK TSA -PHRU +0F3A;N # TIBETAN MARK GUG RTAGS GYON +0F3B;N # TIBETAN MARK GUG RTAGS GYAS +0F3C;N # TIBETAN MARK ANG KHANG GYON +0F3D;N # TIBETAN MARK ANG KHANG GYAS +0F3E;N # TIBETAN SIGN YAR TSHES +0F3F;N # TIBETAN SIGN MAR TSHES +0F40;N # TIBETAN LETTER KA +0F41;N # TIBETAN LETTER KHA +0F42;N # TIBETAN LETTER GA +0F43;N # TIBETAN LETTER GHA +0F44;N # TIBETAN LETTER NGA +0F45;N # TIBETAN LETTER CA +0F46;N # TIBETAN LETTER CHA +0F47;N # TIBETAN LETTER JA +0F49;N # TIBETAN LETTER NYA +0F4A;N # TIBETAN LETTER TTA +0F4B;N # TIBETAN LETTER TTHA +0F4C;N # TIBETAN LETTER DDA +0F4D;N # TIBETAN LETTER DDHA +0F4E;N # TIBETAN LETTER NNA +0F4F;N # TIBETAN LETTER TA +0F50;N # TIBETAN LETTER THA +0F51;N # TIBETAN LETTER DA +0F52;N # TIBETAN LETTER DHA +0F53;N # TIBETAN LETTER NA +0F54;N # TIBETAN LETTER PA +0F55;N # TIBETAN LETTER PHA +0F56;N # TIBETAN LETTER BA +0F57;N # TIBETAN LETTER BHA +0F58;N # TIBETAN LETTER MA +0F59;N # TIBETAN LETTER TSA +0F5A;N # TIBETAN LETTER TSHA +0F5B;N # TIBETAN LETTER DZA +0F5C;N # TIBETAN LETTER DZHA +0F5D;N # TIBETAN LETTER WA +0F5E;N # TIBETAN LETTER ZHA +0F5F;N # TIBETAN LETTER ZA +0F60;N # TIBETAN LETTER -A +0F61;N # TIBETAN LETTER YA +0F62;N # TIBETAN LETTER RA +0F63;N # TIBETAN LETTER LA +0F64;N # TIBETAN LETTER SHA +0F65;N # TIBETAN LETTER SSA +0F66;N # TIBETAN LETTER SA +0F67;N # TIBETAN LETTER HA +0F68;N # TIBETAN LETTER A +0F69;N # TIBETAN LETTER KSSA +0F6A;N # TIBETAN LETTER FIXED-FORM RA +0F71;N # TIBETAN VOWEL SIGN AA +0F72;N # TIBETAN VOWEL SIGN I +0F73;N # TIBETAN VOWEL SIGN II +0F74;N # TIBETAN VOWEL SIGN U +0F75;N # TIBETAN VOWEL SIGN UU +0F76;N # TIBETAN VOWEL SIGN VOCALIC R +0F77;N # TIBETAN VOWEL SIGN VOCALIC RR +0F78;N # TIBETAN VOWEL SIGN VOCALIC L +0F79;N # TIBETAN VOWEL SIGN VOCALIC LL +0F7A;N # TIBETAN VOWEL SIGN E +0F7B;N # TIBETAN VOWEL SIGN EE +0F7C;N # TIBETAN VOWEL SIGN O +0F7D;N # TIBETAN VOWEL SIGN OO +0F7E;N # TIBETAN SIGN RJES SU NGA RO +0F7F;N # TIBETAN SIGN RNAM BCAD +0F80;N # TIBETAN VOWEL SIGN REVERSED I +0F81;N # TIBETAN VOWEL SIGN REVERSED II +0F82;N # TIBETAN SIGN NYI ZLA NAA DA +0F83;N # TIBETAN SIGN SNA LDAN +0F84;N # TIBETAN MARK HALANTA +0F85;N # TIBETAN MARK PALUTA +0F86;N # TIBETAN SIGN LCI RTAGS +0F87;N # TIBETAN SIGN YANG RTAGS +0F88;N # TIBETAN SIGN LCE TSA CAN +0F89;N # TIBETAN SIGN MCHU CAN +0F8A;N # TIBETAN SIGN GRU CAN RGYINGS +0F8B;N # TIBETAN SIGN GRU MED RGYINGS +0F90;N # TIBETAN SUBJOINED LETTER KA +0F91;N # TIBETAN SUBJOINED LETTER KHA +0F92;N # TIBETAN SUBJOINED LETTER GA +0F93;N # TIBETAN SUBJOINED LETTER GHA +0F94;N # TIBETAN SUBJOINED LETTER NGA +0F95;N # TIBETAN SUBJOINED LETTER CA +0F96;N # TIBETAN SUBJOINED LETTER CHA +0F97;N # TIBETAN SUBJOINED LETTER JA +0F99;N # TIBETAN SUBJOINED LETTER NYA +0F9A;N # TIBETAN SUBJOINED LETTER TTA +0F9B;N # TIBETAN SUBJOINED LETTER TTHA +0F9C;N # TIBETAN SUBJOINED LETTER DDA +0F9D;N # TIBETAN SUBJOINED LETTER DDHA +0F9E;N # TIBETAN SUBJOINED LETTER NNA +0F9F;N # TIBETAN SUBJOINED LETTER TA +0FA0;N # TIBETAN SUBJOINED LETTER THA +0FA1;N # TIBETAN SUBJOINED LETTER DA +0FA2;N # TIBETAN SUBJOINED LETTER DHA +0FA3;N # TIBETAN SUBJOINED LETTER NA +0FA4;N # TIBETAN SUBJOINED LETTER PA +0FA5;N # TIBETAN SUBJOINED LETTER PHA +0FA6;N # TIBETAN SUBJOINED LETTER BA +0FA7;N # TIBETAN SUBJOINED LETTER BHA +0FA8;N # TIBETAN SUBJOINED LETTER MA +0FA9;N # TIBETAN SUBJOINED LETTER TSA +0FAA;N # TIBETAN SUBJOINED LETTER TSHA +0FAB;N # TIBETAN SUBJOINED LETTER DZA +0FAC;N # TIBETAN SUBJOINED LETTER DZHA +0FAD;N # TIBETAN SUBJOINED LETTER WA +0FAE;N # TIBETAN SUBJOINED LETTER ZHA +0FAF;N # TIBETAN SUBJOINED LETTER ZA +0FB0;N # TIBETAN SUBJOINED LETTER -A +0FB1;N # TIBETAN SUBJOINED LETTER YA +0FB2;N # TIBETAN SUBJOINED LETTER RA +0FB3;N # TIBETAN SUBJOINED LETTER LA +0FB4;N # TIBETAN SUBJOINED LETTER SHA +0FB5;N # TIBETAN SUBJOINED LETTER SSA +0FB6;N # TIBETAN SUBJOINED LETTER SA +0FB7;N # TIBETAN SUBJOINED LETTER HA +0FB8;N # TIBETAN SUBJOINED LETTER A +0FB9;N # TIBETAN SUBJOINED LETTER KSSA +0FBA;N # TIBETAN SUBJOINED LETTER FIXED-FORM WA +0FBB;N # TIBETAN SUBJOINED LETTER FIXED-FORM YA +0FBC;N # TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FBE;N # TIBETAN KU RU KHA +0FBF;N # TIBETAN KU RU KHA BZHI MIG CAN +0FC0;N # TIBETAN CANTILLATION SIGN HEAVY BEAT +0FC1;N # TIBETAN CANTILLATION SIGN LIGHT BEAT +0FC2;N # TIBETAN CANTILLATION SIGN CANG TE-U +0FC3;N # TIBETAN CANTILLATION SIGN SBUB -CHAL +0FC4;N # TIBETAN SYMBOL DRIL BU +0FC5;N # TIBETAN SYMBOL RDO RJE +0FC6;N # TIBETAN SYMBOL PADMA GDAN +0FC7;N # TIBETAN SYMBOL RDO RJE RGYA GRAM +0FC8;N # TIBETAN SYMBOL PHUR PA +0FC9;N # TIBETAN SYMBOL NOR BU +0FCA;N # TIBETAN SYMBOL NOR BU NYIS -KHYIL +0FCB;N # TIBETAN SYMBOL NOR BU GSUM -KHYIL +0FCC;N # TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCF;N # TIBETAN SIGN RDEL NAG GSUM +0FD0;N # TIBETAN MARK BSKA- SHOG GI MGO RGYAN +0FD1;N # TIBETAN MARK MNYAM YIG GI MGO RGYAN +1000;N # MYANMAR LETTER KA +1001;N # MYANMAR LETTER KHA +1002;N # MYANMAR LETTER GA +1003;N # MYANMAR LETTER GHA +1004;N # MYANMAR LETTER NGA +1005;N # MYANMAR LETTER CA +1006;N # MYANMAR LETTER CHA +1007;N # MYANMAR LETTER JA +1008;N # MYANMAR LETTER JHA +1009;N # MYANMAR LETTER NYA +100A;N # MYANMAR LETTER NNYA +100B;N # MYANMAR LETTER TTA +100C;N # MYANMAR LETTER TTHA +100D;N # MYANMAR LETTER DDA +100E;N # MYANMAR LETTER DDHA +100F;N # MYANMAR LETTER NNA +1010;N # MYANMAR LETTER TA +1011;N # MYANMAR LETTER THA +1012;N # MYANMAR LETTER DA +1013;N # MYANMAR LETTER DHA +1014;N # MYANMAR LETTER NA +1015;N # MYANMAR LETTER PA +1016;N # MYANMAR LETTER PHA +1017;N # MYANMAR LETTER BA +1018;N # MYANMAR LETTER BHA +1019;N # MYANMAR LETTER MA +101A;N # MYANMAR LETTER YA +101B;N # MYANMAR LETTER RA +101C;N # MYANMAR LETTER LA +101D;N # MYANMAR LETTER WA +101E;N # MYANMAR LETTER SA +101F;N # MYANMAR LETTER HA +1020;N # MYANMAR LETTER LLA +1021;N # MYANMAR LETTER A +1023;N # MYANMAR LETTER I +1024;N # MYANMAR LETTER II +1025;N # MYANMAR LETTER U +1026;N # MYANMAR LETTER UU +1027;N # MYANMAR LETTER E +1029;N # MYANMAR LETTER O +102A;N # MYANMAR LETTER AU +102C;N # MYANMAR VOWEL SIGN AA +102D;N # MYANMAR VOWEL SIGN I +102E;N # MYANMAR VOWEL SIGN II +102F;N # MYANMAR VOWEL SIGN U +1030;N # MYANMAR VOWEL SIGN UU +1031;N # MYANMAR VOWEL SIGN E +1032;N # MYANMAR VOWEL SIGN AI +1036;N # MYANMAR SIGN ANUSVARA +1037;N # MYANMAR SIGN DOT BELOW +1038;N # MYANMAR SIGN VISARGA +1039;N # MYANMAR SIGN VIRAMA +1040;N # MYANMAR DIGIT ZERO +1041;N # MYANMAR DIGIT ONE +1042;N # MYANMAR DIGIT TWO +1043;N # MYANMAR DIGIT THREE +1044;N # MYANMAR DIGIT FOUR +1045;N # MYANMAR DIGIT FIVE +1046;N # MYANMAR DIGIT SIX +1047;N # MYANMAR DIGIT SEVEN +1048;N # MYANMAR DIGIT EIGHT +1049;N # MYANMAR DIGIT NINE +104A;N # MYANMAR SIGN LITTLE SECTION +104B;N # MYANMAR SIGN SECTION +104C;N # MYANMAR SYMBOL LOCATIVE +104D;N # MYANMAR SYMBOL COMPLETED +104E;N # MYANMAR SYMBOL AFOREMENTIONED +104F;N # MYANMAR SYMBOL GENITIVE +1050;N # MYANMAR LETTER SHA +1051;N # MYANMAR LETTER SSA +1052;N # MYANMAR LETTER VOCALIC R +1053;N # MYANMAR LETTER VOCALIC RR +1054;N # MYANMAR LETTER VOCALIC L +1055;N # MYANMAR LETTER VOCALIC LL +1056;N # MYANMAR VOWEL SIGN VOCALIC R +1057;N # MYANMAR VOWEL SIGN VOCALIC RR +1058;N # MYANMAR VOWEL SIGN VOCALIC L +1059;N # MYANMAR VOWEL SIGN VOCALIC LL +10A0;N # GEORGIAN CAPITAL LETTER AN +10A1;N # GEORGIAN CAPITAL LETTER BAN +10A2;N # GEORGIAN CAPITAL LETTER GAN +10A3;N # GEORGIAN CAPITAL LETTER DON +10A4;N # GEORGIAN CAPITAL LETTER EN +10A5;N # GEORGIAN CAPITAL LETTER VIN +10A6;N # GEORGIAN CAPITAL LETTER ZEN +10A7;N # GEORGIAN CAPITAL LETTER TAN +10A8;N # GEORGIAN CAPITAL LETTER IN +10A9;N # GEORGIAN CAPITAL LETTER KAN +10AA;N # GEORGIAN CAPITAL LETTER LAS +10AB;N # GEORGIAN CAPITAL LETTER MAN +10AC;N # GEORGIAN CAPITAL LETTER NAR +10AD;N # GEORGIAN CAPITAL LETTER ON +10AE;N # GEORGIAN CAPITAL LETTER PAR +10AF;N # GEORGIAN CAPITAL LETTER ZHAR +10B0;N # GEORGIAN CAPITAL LETTER RAE +10B1;N # GEORGIAN CAPITAL LETTER SAN +10B2;N # GEORGIAN CAPITAL LETTER TAR +10B3;N # GEORGIAN CAPITAL LETTER UN +10B4;N # GEORGIAN CAPITAL LETTER PHAR +10B5;N # GEORGIAN CAPITAL LETTER KHAR +10B6;N # GEORGIAN CAPITAL LETTER GHAN +10B7;N # GEORGIAN CAPITAL LETTER QAR +10B8;N # GEORGIAN CAPITAL LETTER SHIN +10B9;N # GEORGIAN CAPITAL LETTER CHIN +10BA;N # GEORGIAN CAPITAL LETTER CAN +10BB;N # GEORGIAN CAPITAL LETTER JIL +10BC;N # GEORGIAN CAPITAL LETTER CIL +10BD;N # GEORGIAN CAPITAL LETTER CHAR +10BE;N # GEORGIAN CAPITAL LETTER XAN +10BF;N # GEORGIAN CAPITAL LETTER JHAN +10C0;N # GEORGIAN CAPITAL LETTER HAE +10C1;N # GEORGIAN CAPITAL LETTER HE +10C2;N # GEORGIAN CAPITAL LETTER HIE +10C3;N # GEORGIAN CAPITAL LETTER WE +10C4;N # GEORGIAN CAPITAL LETTER HAR +10C5;N # GEORGIAN CAPITAL LETTER HOE +10D0;N # GEORGIAN LETTER AN +10D1;N # GEORGIAN LETTER BAN +10D2;N # GEORGIAN LETTER GAN +10D3;N # GEORGIAN LETTER DON +10D4;N # GEORGIAN LETTER EN +10D5;N # GEORGIAN LETTER VIN +10D6;N # GEORGIAN LETTER ZEN +10D7;N # GEORGIAN LETTER TAN +10D8;N # GEORGIAN LETTER IN +10D9;N # GEORGIAN LETTER KAN +10DA;N # GEORGIAN LETTER LAS +10DB;N # GEORGIAN LETTER MAN +10DC;N # GEORGIAN LETTER NAR +10DD;N # GEORGIAN LETTER ON +10DE;N # GEORGIAN LETTER PAR +10DF;N # GEORGIAN LETTER ZHAR +10E0;N # GEORGIAN LETTER RAE +10E1;N # GEORGIAN LETTER SAN +10E2;N # GEORGIAN LETTER TAR +10E3;N # GEORGIAN LETTER UN +10E4;N # GEORGIAN LETTER PHAR +10E5;N # GEORGIAN LETTER KHAR +10E6;N # GEORGIAN LETTER GHAN +10E7;N # GEORGIAN LETTER QAR +10E8;N # GEORGIAN LETTER SHIN +10E9;N # GEORGIAN LETTER CHIN +10EA;N # GEORGIAN LETTER CAN +10EB;N # GEORGIAN LETTER JIL +10EC;N # GEORGIAN LETTER CIL +10ED;N # GEORGIAN LETTER CHAR +10EE;N # GEORGIAN LETTER XAN +10EF;N # GEORGIAN LETTER JHAN +10F0;N # GEORGIAN LETTER HAE +10F1;N # GEORGIAN LETTER HE +10F2;N # GEORGIAN LETTER HIE +10F3;N # GEORGIAN LETTER WE +10F4;N # GEORGIAN LETTER HAR +10F5;N # GEORGIAN LETTER HOE +10F6;N # GEORGIAN LETTER FI +10F7;N # GEORGIAN LETTER YN +10F8;N # GEORGIAN LETTER ELIFI +10F9;N # GEORGIAN LETTER TURNED GAN +10FA;N # GEORGIAN LETTER AIN +10FB;N # GEORGIAN PARAGRAPH SEPARATOR +10FC;N # MODIFIER LETTER GEORGIAN NAR +1100;W # HANGUL CHOSEONG KIYEOK +1101;W # HANGUL CHOSEONG SSANGKIYEOK +1102;W # HANGUL CHOSEONG NIEUN +1103;W # HANGUL CHOSEONG TIKEUT +1104;W # HANGUL CHOSEONG SSANGTIKEUT +1105;W # HANGUL CHOSEONG RIEUL +1106;W # HANGUL CHOSEONG MIEUM +1107;W # HANGUL CHOSEONG PIEUP +1108;W # HANGUL CHOSEONG SSANGPIEUP +1109;W # HANGUL CHOSEONG SIOS +110A;W # HANGUL CHOSEONG SSANGSIOS +110B;W # HANGUL CHOSEONG IEUNG +110C;W # HANGUL CHOSEONG CIEUC +110D;W # HANGUL CHOSEONG SSANGCIEUC +110E;W # HANGUL CHOSEONG CHIEUCH +110F;W # HANGUL CHOSEONG KHIEUKH +1110;W # HANGUL CHOSEONG THIEUTH +1111;W # HANGUL CHOSEONG PHIEUPH +1112;W # HANGUL CHOSEONG HIEUH +1113;W # HANGUL CHOSEONG NIEUN-KIYEOK +1114;W # HANGUL CHOSEONG SSANGNIEUN +1115;W # HANGUL CHOSEONG NIEUN-TIKEUT +1116;W # HANGUL CHOSEONG NIEUN-PIEUP +1117;W # HANGUL CHOSEONG TIKEUT-KIYEOK +1118;W # HANGUL CHOSEONG RIEUL-NIEUN +1119;W # HANGUL CHOSEONG SSANGRIEUL +111A;W # HANGUL CHOSEONG RIEUL-HIEUH +111B;W # HANGUL CHOSEONG KAPYEOUNRIEUL +111C;W # HANGUL CHOSEONG MIEUM-PIEUP +111D;W # HANGUL CHOSEONG KAPYEOUNMIEUM +111E;W # HANGUL CHOSEONG PIEUP-KIYEOK +111F;W # HANGUL CHOSEONG PIEUP-NIEUN +1120;W # HANGUL CHOSEONG PIEUP-TIKEUT +1121;W # HANGUL CHOSEONG PIEUP-SIOS +1122;W # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK +1123;W # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT +1124;W # HANGUL CHOSEONG PIEUP-SIOS-PIEUP +1125;W # HANGUL CHOSEONG PIEUP-SSANGSIOS +1126;W # HANGUL CHOSEONG PIEUP-SIOS-CIEUC +1127;W # HANGUL CHOSEONG PIEUP-CIEUC +1128;W # HANGUL CHOSEONG PIEUP-CHIEUCH +1129;W # HANGUL CHOSEONG PIEUP-THIEUTH +112A;W # HANGUL CHOSEONG PIEUP-PHIEUPH +112B;W # HANGUL CHOSEONG KAPYEOUNPIEUP +112C;W # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP +112D;W # HANGUL CHOSEONG SIOS-KIYEOK +112E;W # HANGUL CHOSEONG SIOS-NIEUN +112F;W # HANGUL CHOSEONG SIOS-TIKEUT +1130;W # HANGUL CHOSEONG SIOS-RIEUL +1131;W # HANGUL CHOSEONG SIOS-MIEUM +1132;W # HANGUL CHOSEONG SIOS-PIEUP +1133;W # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK +1134;W # HANGUL CHOSEONG SIOS-SSANGSIOS +1135;W # HANGUL CHOSEONG SIOS-IEUNG +1136;W # HANGUL CHOSEONG SIOS-CIEUC +1137;W # HANGUL CHOSEONG SIOS-CHIEUCH +1138;W # HANGUL CHOSEONG SIOS-KHIEUKH +1139;W # HANGUL CHOSEONG SIOS-THIEUTH +113A;W # HANGUL CHOSEONG SIOS-PHIEUPH +113B;W # HANGUL CHOSEONG SIOS-HIEUH +113C;W # HANGUL CHOSEONG CHITUEUMSIOS +113D;W # HANGUL CHOSEONG CHITUEUMSSANGSIOS +113E;W # HANGUL CHOSEONG CEONGCHIEUMSIOS +113F;W # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS +1140;W # HANGUL CHOSEONG PANSIOS +1141;W # HANGUL CHOSEONG IEUNG-KIYEOK +1142;W # HANGUL CHOSEONG IEUNG-TIKEUT +1143;W # HANGUL CHOSEONG IEUNG-MIEUM +1144;W # HANGUL CHOSEONG IEUNG-PIEUP +1145;W # HANGUL CHOSEONG IEUNG-SIOS +1146;W # HANGUL CHOSEONG IEUNG-PANSIOS +1147;W # HANGUL CHOSEONG SSANGIEUNG +1148;W # HANGUL CHOSEONG IEUNG-CIEUC +1149;W # HANGUL CHOSEONG IEUNG-CHIEUCH +114A;W # HANGUL CHOSEONG IEUNG-THIEUTH +114B;W # HANGUL CHOSEONG IEUNG-PHIEUPH +114C;W # HANGUL CHOSEONG YESIEUNG +114D;W # HANGUL CHOSEONG CIEUC-IEUNG +114E;W # HANGUL CHOSEONG CHITUEUMCIEUC +114F;W # HANGUL CHOSEONG CHITUEUMSSANGCIEUC +1150;W # HANGUL CHOSEONG CEONGCHIEUMCIEUC +1151;W # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC +1152;W # HANGUL CHOSEONG CHIEUCH-KHIEUKH +1153;W # HANGUL CHOSEONG CHIEUCH-HIEUH +1154;W # HANGUL CHOSEONG CHITUEUMCHIEUCH +1155;W # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH +1156;W # HANGUL CHOSEONG PHIEUPH-PIEUP +1157;W # HANGUL CHOSEONG KAPYEOUNPHIEUPH +1158;W # HANGUL CHOSEONG SSANGHIEUH +1159;W # HANGUL CHOSEONG YEORINHIEUH +115F;W # HANGUL CHOSEONG FILLER +1160;N # HANGUL JUNGSEONG FILLER +1161;N # HANGUL JUNGSEONG A +1162;N # HANGUL JUNGSEONG AE +1163;N # HANGUL JUNGSEONG YA +1164;N # HANGUL JUNGSEONG YAE +1165;N # HANGUL JUNGSEONG EO +1166;N # HANGUL JUNGSEONG E +1167;N # HANGUL JUNGSEONG YEO +1168;N # HANGUL JUNGSEONG YE +1169;N # HANGUL JUNGSEONG O +116A;N # HANGUL JUNGSEONG WA +116B;N # HANGUL JUNGSEONG WAE +116C;N # HANGUL JUNGSEONG OE +116D;N # HANGUL JUNGSEONG YO +116E;N # HANGUL JUNGSEONG U +116F;N # HANGUL JUNGSEONG WEO +1170;N # HANGUL JUNGSEONG WE +1171;N # HANGUL JUNGSEONG WI +1172;N # HANGUL JUNGSEONG YU +1173;N # HANGUL JUNGSEONG EU +1174;N # HANGUL JUNGSEONG YI +1175;N # HANGUL JUNGSEONG I +1176;N # HANGUL JUNGSEONG A-O +1177;N # HANGUL JUNGSEONG A-U +1178;N # HANGUL JUNGSEONG YA-O +1179;N # HANGUL JUNGSEONG YA-YO +117A;N # HANGUL JUNGSEONG EO-O +117B;N # HANGUL JUNGSEONG EO-U +117C;N # HANGUL JUNGSEONG EO-EU +117D;N # HANGUL JUNGSEONG YEO-O +117E;N # HANGUL JUNGSEONG YEO-U +117F;N # HANGUL JUNGSEONG O-EO +1180;N # HANGUL JUNGSEONG O-E +1181;N # HANGUL JUNGSEONG O-YE +1182;N # HANGUL JUNGSEONG O-O +1183;N # HANGUL JUNGSEONG O-U +1184;N # HANGUL JUNGSEONG YO-YA +1185;N # HANGUL JUNGSEONG YO-YAE +1186;N # HANGUL JUNGSEONG YO-YEO +1187;N # HANGUL JUNGSEONG YO-O +1188;N # HANGUL JUNGSEONG YO-I +1189;N # HANGUL JUNGSEONG U-A +118A;N # HANGUL JUNGSEONG U-AE +118B;N # HANGUL JUNGSEONG U-EO-EU +118C;N # HANGUL JUNGSEONG U-YE +118D;N # HANGUL JUNGSEONG U-U +118E;N # HANGUL JUNGSEONG YU-A +118F;N # HANGUL JUNGSEONG YU-EO +1190;N # HANGUL JUNGSEONG YU-E +1191;N # HANGUL JUNGSEONG YU-YEO +1192;N # HANGUL JUNGSEONG YU-YE +1193;N # HANGUL JUNGSEONG YU-U +1194;N # HANGUL JUNGSEONG YU-I +1195;N # HANGUL JUNGSEONG EU-U +1196;N # HANGUL JUNGSEONG EU-EU +1197;N # HANGUL JUNGSEONG YI-U +1198;N # HANGUL JUNGSEONG I-A +1199;N # HANGUL JUNGSEONG I-YA +119A;N # HANGUL JUNGSEONG I-O +119B;N # HANGUL JUNGSEONG I-U +119C;N # HANGUL JUNGSEONG I-EU +119D;N # HANGUL JUNGSEONG I-ARAEA +119E;N # HANGUL JUNGSEONG ARAEA +119F;N # HANGUL JUNGSEONG ARAEA-EO +11A0;N # HANGUL JUNGSEONG ARAEA-U +11A1;N # HANGUL JUNGSEONG ARAEA-I +11A2;N # HANGUL JUNGSEONG SSANGARAEA +11A8;N # HANGUL JONGSEONG KIYEOK +11A9;N # HANGUL JONGSEONG SSANGKIYEOK +11AA;N # HANGUL JONGSEONG KIYEOK-SIOS +11AB;N # HANGUL JONGSEONG NIEUN +11AC;N # HANGUL JONGSEONG NIEUN-CIEUC +11AD;N # HANGUL JONGSEONG NIEUN-HIEUH +11AE;N # HANGUL JONGSEONG TIKEUT +11AF;N # HANGUL JONGSEONG RIEUL +11B0;N # HANGUL JONGSEONG RIEUL-KIYEOK +11B1;N # HANGUL JONGSEONG RIEUL-MIEUM +11B2;N # HANGUL JONGSEONG RIEUL-PIEUP +11B3;N # HANGUL JONGSEONG RIEUL-SIOS +11B4;N # HANGUL JONGSEONG RIEUL-THIEUTH +11B5;N # HANGUL JONGSEONG RIEUL-PHIEUPH +11B6;N # HANGUL JONGSEONG RIEUL-HIEUH +11B7;N # HANGUL JONGSEONG MIEUM +11B8;N # HANGUL JONGSEONG PIEUP +11B9;N # HANGUL JONGSEONG PIEUP-SIOS +11BA;N # HANGUL JONGSEONG SIOS +11BB;N # HANGUL JONGSEONG SSANGSIOS +11BC;N # HANGUL JONGSEONG IEUNG +11BD;N # HANGUL JONGSEONG CIEUC +11BE;N # HANGUL JONGSEONG CHIEUCH +11BF;N # HANGUL JONGSEONG KHIEUKH +11C0;N # HANGUL JONGSEONG THIEUTH +11C1;N # HANGUL JONGSEONG PHIEUPH +11C2;N # HANGUL JONGSEONG HIEUH +11C3;N # HANGUL JONGSEONG KIYEOK-RIEUL +11C4;N # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK +11C5;N # HANGUL JONGSEONG NIEUN-KIYEOK +11C6;N # HANGUL JONGSEONG NIEUN-TIKEUT +11C7;N # HANGUL JONGSEONG NIEUN-SIOS +11C8;N # HANGUL JONGSEONG NIEUN-PANSIOS +11C9;N # HANGUL JONGSEONG NIEUN-THIEUTH +11CA;N # HANGUL JONGSEONG TIKEUT-KIYEOK +11CB;N # HANGUL JONGSEONG TIKEUT-RIEUL +11CC;N # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS +11CD;N # HANGUL JONGSEONG RIEUL-NIEUN +11CE;N # HANGUL JONGSEONG RIEUL-TIKEUT +11CF;N # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH +11D0;N # HANGUL JONGSEONG SSANGRIEUL +11D1;N # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK +11D2;N # HANGUL JONGSEONG RIEUL-MIEUM-SIOS +11D3;N # HANGUL JONGSEONG RIEUL-PIEUP-SIOS +11D4;N # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH +11D5;N # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP +11D6;N # HANGUL JONGSEONG RIEUL-SSANGSIOS +11D7;N # HANGUL JONGSEONG RIEUL-PANSIOS +11D8;N # HANGUL JONGSEONG RIEUL-KHIEUKH +11D9;N # HANGUL JONGSEONG RIEUL-YEORINHIEUH +11DA;N # HANGUL JONGSEONG MIEUM-KIYEOK +11DB;N # HANGUL JONGSEONG MIEUM-RIEUL +11DC;N # HANGUL JONGSEONG MIEUM-PIEUP +11DD;N # HANGUL JONGSEONG MIEUM-SIOS +11DE;N # HANGUL JONGSEONG MIEUM-SSANGSIOS +11DF;N # HANGUL JONGSEONG MIEUM-PANSIOS +11E0;N # HANGUL JONGSEONG MIEUM-CHIEUCH +11E1;N # HANGUL JONGSEONG MIEUM-HIEUH +11E2;N # HANGUL JONGSEONG KAPYEOUNMIEUM +11E3;N # HANGUL JONGSEONG PIEUP-RIEUL +11E4;N # HANGUL JONGSEONG PIEUP-PHIEUPH +11E5;N # HANGUL JONGSEONG PIEUP-HIEUH +11E6;N # HANGUL JONGSEONG KAPYEOUNPIEUP +11E7;N # HANGUL JONGSEONG SIOS-KIYEOK +11E8;N # HANGUL JONGSEONG SIOS-TIKEUT +11E9;N # HANGUL JONGSEONG SIOS-RIEUL +11EA;N # HANGUL JONGSEONG SIOS-PIEUP +11EB;N # HANGUL JONGSEONG PANSIOS +11EC;N # HANGUL JONGSEONG IEUNG-KIYEOK +11ED;N # HANGUL JONGSEONG IEUNG-SSANGKIYEOK +11EE;N # HANGUL JONGSEONG SSANGIEUNG +11EF;N # HANGUL JONGSEONG IEUNG-KHIEUKH +11F0;N # HANGUL JONGSEONG YESIEUNG +11F1;N # HANGUL JONGSEONG YESIEUNG-SIOS +11F2;N # HANGUL JONGSEONG YESIEUNG-PANSIOS +11F3;N # HANGUL JONGSEONG PHIEUPH-PIEUP +11F4;N # HANGUL JONGSEONG KAPYEOUNPHIEUPH +11F5;N # HANGUL JONGSEONG HIEUH-NIEUN +11F6;N # HANGUL JONGSEONG HIEUH-RIEUL +11F7;N # HANGUL JONGSEONG HIEUH-MIEUM +11F8;N # HANGUL JONGSEONG HIEUH-PIEUP +11F9;N # HANGUL JONGSEONG YEORINHIEUH +1200;N # ETHIOPIC SYLLABLE HA +1201;N # ETHIOPIC SYLLABLE HU +1202;N # ETHIOPIC SYLLABLE HI +1203;N # ETHIOPIC SYLLABLE HAA +1204;N # ETHIOPIC SYLLABLE HEE +1205;N # ETHIOPIC SYLLABLE HE +1206;N # ETHIOPIC SYLLABLE HO +1207;N # ETHIOPIC SYLLABLE HOA +1208;N # ETHIOPIC SYLLABLE LA +1209;N # ETHIOPIC SYLLABLE LU +120A;N # ETHIOPIC SYLLABLE LI +120B;N # ETHIOPIC SYLLABLE LAA +120C;N # ETHIOPIC SYLLABLE LEE +120D;N # ETHIOPIC SYLLABLE LE +120E;N # ETHIOPIC SYLLABLE LO +120F;N # ETHIOPIC SYLLABLE LWA +1210;N # ETHIOPIC SYLLABLE HHA +1211;N # ETHIOPIC SYLLABLE HHU +1212;N # ETHIOPIC SYLLABLE HHI +1213;N # ETHIOPIC SYLLABLE HHAA +1214;N # ETHIOPIC SYLLABLE HHEE +1215;N # ETHIOPIC SYLLABLE HHE +1216;N # ETHIOPIC SYLLABLE HHO +1217;N # ETHIOPIC SYLLABLE HHWA +1218;N # ETHIOPIC SYLLABLE MA +1219;N # ETHIOPIC SYLLABLE MU +121A;N # ETHIOPIC SYLLABLE MI +121B;N # ETHIOPIC SYLLABLE MAA +121C;N # ETHIOPIC SYLLABLE MEE +121D;N # ETHIOPIC SYLLABLE ME +121E;N # ETHIOPIC SYLLABLE MO +121F;N # ETHIOPIC SYLLABLE MWA +1220;N # ETHIOPIC SYLLABLE SZA +1221;N # ETHIOPIC SYLLABLE SZU +1222;N # ETHIOPIC SYLLABLE SZI +1223;N # ETHIOPIC SYLLABLE SZAA +1224;N # ETHIOPIC SYLLABLE SZEE +1225;N # ETHIOPIC SYLLABLE SZE +1226;N # ETHIOPIC SYLLABLE SZO +1227;N # ETHIOPIC SYLLABLE SZWA +1228;N # ETHIOPIC SYLLABLE RA +1229;N # ETHIOPIC SYLLABLE RU +122A;N # ETHIOPIC SYLLABLE RI +122B;N # ETHIOPIC SYLLABLE RAA +122C;N # ETHIOPIC SYLLABLE REE +122D;N # ETHIOPIC SYLLABLE RE +122E;N # ETHIOPIC SYLLABLE RO +122F;N # ETHIOPIC SYLLABLE RWA +1230;N # ETHIOPIC SYLLABLE SA +1231;N # ETHIOPIC SYLLABLE SU +1232;N # ETHIOPIC SYLLABLE SI +1233;N # ETHIOPIC SYLLABLE SAA +1234;N # ETHIOPIC SYLLABLE SEE +1235;N # ETHIOPIC SYLLABLE SE +1236;N # ETHIOPIC SYLLABLE SO +1237;N # ETHIOPIC SYLLABLE SWA +1238;N # ETHIOPIC SYLLABLE SHA +1239;N # ETHIOPIC SYLLABLE SHU +123A;N # ETHIOPIC SYLLABLE SHI +123B;N # ETHIOPIC SYLLABLE SHAA +123C;N # ETHIOPIC SYLLABLE SHEE +123D;N # ETHIOPIC SYLLABLE SHE +123E;N # ETHIOPIC SYLLABLE SHO +123F;N # ETHIOPIC SYLLABLE SHWA +1240;N # ETHIOPIC SYLLABLE QA +1241;N # ETHIOPIC SYLLABLE QU +1242;N # ETHIOPIC SYLLABLE QI +1243;N # ETHIOPIC SYLLABLE QAA +1244;N # ETHIOPIC SYLLABLE QEE +1245;N # ETHIOPIC SYLLABLE QE +1246;N # ETHIOPIC SYLLABLE QO +1247;N # ETHIOPIC SYLLABLE QOA +1248;N # ETHIOPIC SYLLABLE QWA +124A;N # ETHIOPIC SYLLABLE QWI +124B;N # ETHIOPIC SYLLABLE QWAA +124C;N # ETHIOPIC SYLLABLE QWEE +124D;N # ETHIOPIC SYLLABLE QWE +1250;N # ETHIOPIC SYLLABLE QHA +1251;N # ETHIOPIC SYLLABLE QHU +1252;N # ETHIOPIC SYLLABLE QHI +1253;N # ETHIOPIC SYLLABLE QHAA +1254;N # ETHIOPIC SYLLABLE QHEE +1255;N # ETHIOPIC SYLLABLE QHE +1256;N # ETHIOPIC SYLLABLE QHO +1258;N # ETHIOPIC SYLLABLE QHWA +125A;N # ETHIOPIC SYLLABLE QHWI +125B;N # ETHIOPIC SYLLABLE QHWAA +125C;N # ETHIOPIC SYLLABLE QHWEE +125D;N # ETHIOPIC SYLLABLE QHWE +1260;N # ETHIOPIC SYLLABLE BA +1261;N # ETHIOPIC SYLLABLE BU +1262;N # ETHIOPIC SYLLABLE BI +1263;N # ETHIOPIC SYLLABLE BAA +1264;N # ETHIOPIC SYLLABLE BEE +1265;N # ETHIOPIC SYLLABLE BE +1266;N # ETHIOPIC SYLLABLE BO +1267;N # ETHIOPIC SYLLABLE BWA +1268;N # ETHIOPIC SYLLABLE VA +1269;N # ETHIOPIC SYLLABLE VU +126A;N # ETHIOPIC SYLLABLE VI +126B;N # ETHIOPIC SYLLABLE VAA +126C;N # ETHIOPIC SYLLABLE VEE +126D;N # ETHIOPIC SYLLABLE VE +126E;N # ETHIOPIC SYLLABLE VO +126F;N # ETHIOPIC SYLLABLE VWA +1270;N # ETHIOPIC SYLLABLE TA +1271;N # ETHIOPIC SYLLABLE TU +1272;N # ETHIOPIC SYLLABLE TI +1273;N # ETHIOPIC SYLLABLE TAA +1274;N # ETHIOPIC SYLLABLE TEE +1275;N # ETHIOPIC SYLLABLE TE +1276;N # ETHIOPIC SYLLABLE TO +1277;N # ETHIOPIC SYLLABLE TWA +1278;N # ETHIOPIC SYLLABLE CA +1279;N # ETHIOPIC SYLLABLE CU +127A;N # ETHIOPIC SYLLABLE CI +127B;N # ETHIOPIC SYLLABLE CAA +127C;N # ETHIOPIC SYLLABLE CEE +127D;N # ETHIOPIC SYLLABLE CE +127E;N # ETHIOPIC SYLLABLE CO +127F;N # ETHIOPIC SYLLABLE CWA +1280;N # ETHIOPIC SYLLABLE XA +1281;N # ETHIOPIC SYLLABLE XU +1282;N # ETHIOPIC SYLLABLE XI +1283;N # ETHIOPIC SYLLABLE XAA +1284;N # ETHIOPIC SYLLABLE XEE +1285;N # ETHIOPIC SYLLABLE XE +1286;N # ETHIOPIC SYLLABLE XO +1287;N # ETHIOPIC SYLLABLE XOA +1288;N # ETHIOPIC SYLLABLE XWA +128A;N # ETHIOPIC SYLLABLE XWI +128B;N # ETHIOPIC SYLLABLE XWAA +128C;N # ETHIOPIC SYLLABLE XWEE +128D;N # ETHIOPIC SYLLABLE XWE +1290;N # ETHIOPIC SYLLABLE NA +1291;N # ETHIOPIC SYLLABLE NU +1292;N # ETHIOPIC SYLLABLE NI +1293;N # ETHIOPIC SYLLABLE NAA +1294;N # ETHIOPIC SYLLABLE NEE +1295;N # ETHIOPIC SYLLABLE NE +1296;N # ETHIOPIC SYLLABLE NO +1297;N # ETHIOPIC SYLLABLE NWA +1298;N # ETHIOPIC SYLLABLE NYA +1299;N # ETHIOPIC SYLLABLE NYU +129A;N # ETHIOPIC SYLLABLE NYI +129B;N # ETHIOPIC SYLLABLE NYAA +129C;N # ETHIOPIC SYLLABLE NYEE +129D;N # ETHIOPIC SYLLABLE NYE +129E;N # ETHIOPIC SYLLABLE NYO +129F;N # ETHIOPIC SYLLABLE NYWA +12A0;N # ETHIOPIC SYLLABLE GLOTTAL A +12A1;N # ETHIOPIC SYLLABLE GLOTTAL U +12A2;N # ETHIOPIC SYLLABLE GLOTTAL I +12A3;N # ETHIOPIC SYLLABLE GLOTTAL AA +12A4;N # ETHIOPIC SYLLABLE GLOTTAL EE +12A5;N # ETHIOPIC SYLLABLE GLOTTAL E +12A6;N # ETHIOPIC SYLLABLE GLOTTAL O +12A7;N # ETHIOPIC SYLLABLE GLOTTAL WA +12A8;N # ETHIOPIC SYLLABLE KA +12A9;N # ETHIOPIC SYLLABLE KU +12AA;N # ETHIOPIC SYLLABLE KI +12AB;N # ETHIOPIC SYLLABLE KAA +12AC;N # ETHIOPIC SYLLABLE KEE +12AD;N # ETHIOPIC SYLLABLE KE +12AE;N # ETHIOPIC SYLLABLE KO +12AF;N # ETHIOPIC SYLLABLE KOA +12B0;N # ETHIOPIC SYLLABLE KWA +12B2;N # ETHIOPIC SYLLABLE KWI +12B3;N # ETHIOPIC SYLLABLE KWAA +12B4;N # ETHIOPIC SYLLABLE KWEE +12B5;N # ETHIOPIC SYLLABLE KWE +12B8;N # ETHIOPIC SYLLABLE KXA +12B9;N # ETHIOPIC SYLLABLE KXU +12BA;N # ETHIOPIC SYLLABLE KXI +12BB;N # ETHIOPIC SYLLABLE KXAA +12BC;N # ETHIOPIC SYLLABLE KXEE +12BD;N # ETHIOPIC SYLLABLE KXE +12BE;N # ETHIOPIC SYLLABLE KXO +12C0;N # ETHIOPIC SYLLABLE KXWA +12C2;N # ETHIOPIC SYLLABLE KXWI +12C3;N # ETHIOPIC SYLLABLE KXWAA +12C4;N # ETHIOPIC SYLLABLE KXWEE +12C5;N # ETHIOPIC SYLLABLE KXWE +12C8;N # ETHIOPIC SYLLABLE WA +12C9;N # ETHIOPIC SYLLABLE WU +12CA;N # ETHIOPIC SYLLABLE WI +12CB;N # ETHIOPIC SYLLABLE WAA +12CC;N # ETHIOPIC SYLLABLE WEE +12CD;N # ETHIOPIC SYLLABLE WE +12CE;N # ETHIOPIC SYLLABLE WO +12CF;N # ETHIOPIC SYLLABLE WOA +12D0;N # ETHIOPIC SYLLABLE PHARYNGEAL A +12D1;N # ETHIOPIC SYLLABLE PHARYNGEAL U +12D2;N # ETHIOPIC SYLLABLE PHARYNGEAL I +12D3;N # ETHIOPIC SYLLABLE PHARYNGEAL AA +12D4;N # ETHIOPIC SYLLABLE PHARYNGEAL EE +12D5;N # ETHIOPIC SYLLABLE PHARYNGEAL E +12D6;N # ETHIOPIC SYLLABLE PHARYNGEAL O +12D8;N # ETHIOPIC SYLLABLE ZA +12D9;N # ETHIOPIC SYLLABLE ZU +12DA;N # ETHIOPIC SYLLABLE ZI +12DB;N # ETHIOPIC SYLLABLE ZAA +12DC;N # ETHIOPIC SYLLABLE ZEE +12DD;N # ETHIOPIC SYLLABLE ZE +12DE;N # ETHIOPIC SYLLABLE ZO +12DF;N # ETHIOPIC SYLLABLE ZWA +12E0;N # ETHIOPIC SYLLABLE ZHA +12E1;N # ETHIOPIC SYLLABLE ZHU +12E2;N # ETHIOPIC SYLLABLE ZHI +12E3;N # ETHIOPIC SYLLABLE ZHAA +12E4;N # ETHIOPIC SYLLABLE ZHEE +12E5;N # ETHIOPIC SYLLABLE ZHE +12E6;N # ETHIOPIC SYLLABLE ZHO +12E7;N # ETHIOPIC SYLLABLE ZHWA +12E8;N # ETHIOPIC SYLLABLE YA +12E9;N # ETHIOPIC SYLLABLE YU +12EA;N # ETHIOPIC SYLLABLE YI +12EB;N # ETHIOPIC SYLLABLE YAA +12EC;N # ETHIOPIC SYLLABLE YEE +12ED;N # ETHIOPIC SYLLABLE YE +12EE;N # ETHIOPIC SYLLABLE YO +12EF;N # ETHIOPIC SYLLABLE YOA +12F0;N # ETHIOPIC SYLLABLE DA +12F1;N # ETHIOPIC SYLLABLE DU +12F2;N # ETHIOPIC SYLLABLE DI +12F3;N # ETHIOPIC SYLLABLE DAA +12F4;N # ETHIOPIC SYLLABLE DEE +12F5;N # ETHIOPIC SYLLABLE DE +12F6;N # ETHIOPIC SYLLABLE DO +12F7;N # ETHIOPIC SYLLABLE DWA +12F8;N # ETHIOPIC SYLLABLE DDA +12F9;N # ETHIOPIC SYLLABLE DDU +12FA;N # ETHIOPIC SYLLABLE DDI +12FB;N # ETHIOPIC SYLLABLE DDAA +12FC;N # ETHIOPIC SYLLABLE DDEE +12FD;N # ETHIOPIC SYLLABLE DDE +12FE;N # ETHIOPIC SYLLABLE DDO +12FF;N # ETHIOPIC SYLLABLE DDWA +1300;N # ETHIOPIC SYLLABLE JA +1301;N # ETHIOPIC SYLLABLE JU +1302;N # ETHIOPIC SYLLABLE JI +1303;N # ETHIOPIC SYLLABLE JAA +1304;N # ETHIOPIC SYLLABLE JEE +1305;N # ETHIOPIC SYLLABLE JE +1306;N # ETHIOPIC SYLLABLE JO +1307;N # ETHIOPIC SYLLABLE JWA +1308;N # ETHIOPIC SYLLABLE GA +1309;N # ETHIOPIC SYLLABLE GU +130A;N # ETHIOPIC SYLLABLE GI +130B;N # ETHIOPIC SYLLABLE GAA +130C;N # ETHIOPIC SYLLABLE GEE +130D;N # ETHIOPIC SYLLABLE GE +130E;N # ETHIOPIC SYLLABLE GO +130F;N # ETHIOPIC SYLLABLE GOA +1310;N # ETHIOPIC SYLLABLE GWA +1312;N # ETHIOPIC SYLLABLE GWI +1313;N # ETHIOPIC SYLLABLE GWAA +1314;N # ETHIOPIC SYLLABLE GWEE +1315;N # ETHIOPIC SYLLABLE GWE +1318;N # ETHIOPIC SYLLABLE GGA +1319;N # ETHIOPIC SYLLABLE GGU +131A;N # ETHIOPIC SYLLABLE GGI +131B;N # ETHIOPIC SYLLABLE GGAA +131C;N # ETHIOPIC SYLLABLE GGEE +131D;N # ETHIOPIC SYLLABLE GGE +131E;N # ETHIOPIC SYLLABLE GGO +131F;N # ETHIOPIC SYLLABLE GGWAA +1320;N # ETHIOPIC SYLLABLE THA +1321;N # ETHIOPIC SYLLABLE THU +1322;N # ETHIOPIC SYLLABLE THI +1323;N # ETHIOPIC SYLLABLE THAA +1324;N # ETHIOPIC SYLLABLE THEE +1325;N # ETHIOPIC SYLLABLE THE +1326;N # ETHIOPIC SYLLABLE THO +1327;N # ETHIOPIC SYLLABLE THWA +1328;N # ETHIOPIC SYLLABLE CHA +1329;N # ETHIOPIC SYLLABLE CHU +132A;N # ETHIOPIC SYLLABLE CHI +132B;N # ETHIOPIC SYLLABLE CHAA +132C;N # ETHIOPIC SYLLABLE CHEE +132D;N # ETHIOPIC SYLLABLE CHE +132E;N # ETHIOPIC SYLLABLE CHO +132F;N # ETHIOPIC SYLLABLE CHWA +1330;N # ETHIOPIC SYLLABLE PHA +1331;N # ETHIOPIC SYLLABLE PHU +1332;N # ETHIOPIC SYLLABLE PHI +1333;N # ETHIOPIC SYLLABLE PHAA +1334;N # ETHIOPIC SYLLABLE PHEE +1335;N # ETHIOPIC SYLLABLE PHE +1336;N # ETHIOPIC SYLLABLE PHO +1337;N # ETHIOPIC SYLLABLE PHWA +1338;N # ETHIOPIC SYLLABLE TSA +1339;N # ETHIOPIC SYLLABLE TSU +133A;N # ETHIOPIC SYLLABLE TSI +133B;N # ETHIOPIC SYLLABLE TSAA +133C;N # ETHIOPIC SYLLABLE TSEE +133D;N # ETHIOPIC SYLLABLE TSE +133E;N # ETHIOPIC SYLLABLE TSO +133F;N # ETHIOPIC SYLLABLE TSWA +1340;N # ETHIOPIC SYLLABLE TZA +1341;N # ETHIOPIC SYLLABLE TZU +1342;N # ETHIOPIC SYLLABLE TZI +1343;N # ETHIOPIC SYLLABLE TZAA +1344;N # ETHIOPIC SYLLABLE TZEE +1345;N # ETHIOPIC SYLLABLE TZE +1346;N # ETHIOPIC SYLLABLE TZO +1347;N # ETHIOPIC SYLLABLE TZOA +1348;N # ETHIOPIC SYLLABLE FA +1349;N # ETHIOPIC SYLLABLE FU +134A;N # ETHIOPIC SYLLABLE FI +134B;N # ETHIOPIC SYLLABLE FAA +134C;N # ETHIOPIC SYLLABLE FEE +134D;N # ETHIOPIC SYLLABLE FE +134E;N # ETHIOPIC SYLLABLE FO +134F;N # ETHIOPIC SYLLABLE FWA +1350;N # ETHIOPIC SYLLABLE PA +1351;N # ETHIOPIC SYLLABLE PU +1352;N # ETHIOPIC SYLLABLE PI +1353;N # ETHIOPIC SYLLABLE PAA +1354;N # ETHIOPIC SYLLABLE PEE +1355;N # ETHIOPIC SYLLABLE PE +1356;N # ETHIOPIC SYLLABLE PO +1357;N # ETHIOPIC SYLLABLE PWA +1358;N # ETHIOPIC SYLLABLE RYA +1359;N # ETHIOPIC SYLLABLE MYA +135A;N # ETHIOPIC SYLLABLE FYA +135F;N # ETHIOPIC COMBINING GEMINATION MARK +1360;N # ETHIOPIC SECTION MARK +1361;N # ETHIOPIC WORDSPACE +1362;N # ETHIOPIC FULL STOP +1363;N # ETHIOPIC COMMA +1364;N # ETHIOPIC SEMICOLON +1365;N # ETHIOPIC COLON +1366;N # ETHIOPIC PREFACE COLON +1367;N # ETHIOPIC QUESTION MARK +1368;N # ETHIOPIC PARAGRAPH SEPARATOR +1369;N # ETHIOPIC DIGIT ONE +136A;N # ETHIOPIC DIGIT TWO +136B;N # ETHIOPIC DIGIT THREE +136C;N # ETHIOPIC DIGIT FOUR +136D;N # ETHIOPIC DIGIT FIVE +136E;N # ETHIOPIC DIGIT SIX +136F;N # ETHIOPIC DIGIT SEVEN +1370;N # ETHIOPIC DIGIT EIGHT +1371;N # ETHIOPIC DIGIT NINE +1372;N # ETHIOPIC NUMBER TEN +1373;N # ETHIOPIC NUMBER TWENTY +1374;N # ETHIOPIC NUMBER THIRTY +1375;N # ETHIOPIC NUMBER FORTY +1376;N # ETHIOPIC NUMBER FIFTY +1377;N # ETHIOPIC NUMBER SIXTY +1378;N # ETHIOPIC NUMBER SEVENTY +1379;N # ETHIOPIC NUMBER EIGHTY +137A;N # ETHIOPIC NUMBER NINETY +137B;N # ETHIOPIC NUMBER HUNDRED +137C;N # ETHIOPIC NUMBER TEN THOUSAND +1380;N # ETHIOPIC SYLLABLE SEBATBEIT MWA +1381;N # ETHIOPIC SYLLABLE MWI +1382;N # ETHIOPIC SYLLABLE MWEE +1383;N # ETHIOPIC SYLLABLE MWE +1384;N # ETHIOPIC SYLLABLE SEBATBEIT BWA +1385;N # ETHIOPIC SYLLABLE BWI +1386;N # ETHIOPIC SYLLABLE BWEE +1387;N # ETHIOPIC SYLLABLE BWE +1388;N # ETHIOPIC SYLLABLE SEBATBEIT FWA +1389;N # ETHIOPIC SYLLABLE FWI +138A;N # ETHIOPIC SYLLABLE FWEE +138B;N # ETHIOPIC SYLLABLE FWE +138C;N # ETHIOPIC SYLLABLE SEBATBEIT PWA +138D;N # ETHIOPIC SYLLABLE PWI +138E;N # ETHIOPIC SYLLABLE PWEE +138F;N # ETHIOPIC SYLLABLE PWE +1390;N # ETHIOPIC TONAL MARK YIZET +1391;N # ETHIOPIC TONAL MARK DERET +1392;N # ETHIOPIC TONAL MARK RIKRIK +1393;N # ETHIOPIC TONAL MARK SHORT RIKRIK +1394;N # ETHIOPIC TONAL MARK DIFAT +1395;N # ETHIOPIC TONAL MARK KENAT +1396;N # ETHIOPIC TONAL MARK CHIRET +1397;N # ETHIOPIC TONAL MARK HIDET +1398;N # ETHIOPIC TONAL MARK DERET-HIDET +1399;N # ETHIOPIC TONAL MARK KURT +13A0;N # CHEROKEE LETTER A +13A1;N # CHEROKEE LETTER E +13A2;N # CHEROKEE LETTER I +13A3;N # CHEROKEE LETTER O +13A4;N # CHEROKEE LETTER U +13A5;N # CHEROKEE LETTER V +13A6;N # CHEROKEE LETTER GA +13A7;N # CHEROKEE LETTER KA +13A8;N # CHEROKEE LETTER GE +13A9;N # CHEROKEE LETTER GI +13AA;N # CHEROKEE LETTER GO +13AB;N # CHEROKEE LETTER GU +13AC;N # CHEROKEE LETTER GV +13AD;N # CHEROKEE LETTER HA +13AE;N # CHEROKEE LETTER HE +13AF;N # CHEROKEE LETTER HI +13B0;N # CHEROKEE LETTER HO +13B1;N # CHEROKEE LETTER HU +13B2;N # CHEROKEE LETTER HV +13B3;N # CHEROKEE LETTER LA +13B4;N # CHEROKEE LETTER LE +13B5;N # CHEROKEE LETTER LI +13B6;N # CHEROKEE LETTER LO +13B7;N # CHEROKEE LETTER LU +13B8;N # CHEROKEE LETTER LV +13B9;N # CHEROKEE LETTER MA +13BA;N # CHEROKEE LETTER ME +13BB;N # CHEROKEE LETTER MI +13BC;N # CHEROKEE LETTER MO +13BD;N # CHEROKEE LETTER MU +13BE;N # CHEROKEE LETTER NA +13BF;N # CHEROKEE LETTER HNA +13C0;N # CHEROKEE LETTER NAH +13C1;N # CHEROKEE LETTER NE +13C2;N # CHEROKEE LETTER NI +13C3;N # CHEROKEE LETTER NO +13C4;N # CHEROKEE LETTER NU +13C5;N # CHEROKEE LETTER NV +13C6;N # CHEROKEE LETTER QUA +13C7;N # CHEROKEE LETTER QUE +13C8;N # CHEROKEE LETTER QUI +13C9;N # CHEROKEE LETTER QUO +13CA;N # CHEROKEE LETTER QUU +13CB;N # CHEROKEE LETTER QUV +13CC;N # CHEROKEE LETTER SA +13CD;N # CHEROKEE LETTER S +13CE;N # CHEROKEE LETTER SE +13CF;N # CHEROKEE LETTER SI +13D0;N # CHEROKEE LETTER SO +13D1;N # CHEROKEE LETTER SU +13D2;N # CHEROKEE LETTER SV +13D3;N # CHEROKEE LETTER DA +13D4;N # CHEROKEE LETTER TA +13D5;N # CHEROKEE LETTER DE +13D6;N # CHEROKEE LETTER TE +13D7;N # CHEROKEE LETTER DI +13D8;N # CHEROKEE LETTER TI +13D9;N # CHEROKEE LETTER DO +13DA;N # CHEROKEE LETTER DU +13DB;N # CHEROKEE LETTER DV +13DC;N # CHEROKEE LETTER DLA +13DD;N # CHEROKEE LETTER TLA +13DE;N # CHEROKEE LETTER TLE +13DF;N # CHEROKEE LETTER TLI +13E0;N # CHEROKEE LETTER TLO +13E1;N # CHEROKEE LETTER TLU +13E2;N # CHEROKEE LETTER TLV +13E3;N # CHEROKEE LETTER TSA +13E4;N # CHEROKEE LETTER TSE +13E5;N # CHEROKEE LETTER TSI +13E6;N # CHEROKEE LETTER TSO +13E7;N # CHEROKEE LETTER TSU +13E8;N # CHEROKEE LETTER TSV +13E9;N # CHEROKEE LETTER WA +13EA;N # CHEROKEE LETTER WE +13EB;N # CHEROKEE LETTER WI +13EC;N # CHEROKEE LETTER WO +13ED;N # CHEROKEE LETTER WU +13EE;N # CHEROKEE LETTER WV +13EF;N # CHEROKEE LETTER YA +13F0;N # CHEROKEE LETTER YE +13F1;N # CHEROKEE LETTER YI +13F2;N # CHEROKEE LETTER YO +13F3;N # CHEROKEE LETTER YU +13F4;N # CHEROKEE LETTER YV +1401;N # CANADIAN SYLLABICS E +1402;N # CANADIAN SYLLABICS AAI +1403;N # CANADIAN SYLLABICS I +1404;N # CANADIAN SYLLABICS II +1405;N # CANADIAN SYLLABICS O +1406;N # CANADIAN SYLLABICS OO +1407;N # CANADIAN SYLLABICS Y-CREE OO +1408;N # CANADIAN SYLLABICS CARRIER EE +1409;N # CANADIAN SYLLABICS CARRIER I +140A;N # CANADIAN SYLLABICS A +140B;N # CANADIAN SYLLABICS AA +140C;N # CANADIAN SYLLABICS WE +140D;N # CANADIAN SYLLABICS WEST-CREE WE +140E;N # CANADIAN SYLLABICS WI +140F;N # CANADIAN SYLLABICS WEST-CREE WI +1410;N # CANADIAN SYLLABICS WII +1411;N # CANADIAN SYLLABICS WEST-CREE WII +1412;N # CANADIAN SYLLABICS WO +1413;N # CANADIAN SYLLABICS WEST-CREE WO +1414;N # CANADIAN SYLLABICS WOO +1415;N # CANADIAN SYLLABICS WEST-CREE WOO +1416;N # CANADIAN SYLLABICS NASKAPI WOO +1417;N # CANADIAN SYLLABICS WA +1418;N # CANADIAN SYLLABICS WEST-CREE WA +1419;N # CANADIAN SYLLABICS WAA +141A;N # CANADIAN SYLLABICS WEST-CREE WAA +141B;N # CANADIAN SYLLABICS NASKAPI WAA +141C;N # CANADIAN SYLLABICS AI +141D;N # CANADIAN SYLLABICS Y-CREE W +141E;N # CANADIAN SYLLABICS GLOTTAL STOP +141F;N # CANADIAN SYLLABICS FINAL ACUTE +1420;N # CANADIAN SYLLABICS FINAL GRAVE +1421;N # CANADIAN SYLLABICS FINAL BOTTOM HALF RING +1422;N # CANADIAN SYLLABICS FINAL TOP HALF RING +1423;N # CANADIAN SYLLABICS FINAL RIGHT HALF RING +1424;N # CANADIAN SYLLABICS FINAL RING +1425;N # CANADIAN SYLLABICS FINAL DOUBLE ACUTE +1426;N # CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES +1427;N # CANADIAN SYLLABICS FINAL MIDDLE DOT +1428;N # CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE +1429;N # CANADIAN SYLLABICS FINAL PLUS +142A;N # CANADIAN SYLLABICS FINAL DOWN TACK +142B;N # CANADIAN SYLLABICS EN +142C;N # CANADIAN SYLLABICS IN +142D;N # CANADIAN SYLLABICS ON +142E;N # CANADIAN SYLLABICS AN +142F;N # CANADIAN SYLLABICS PE +1430;N # CANADIAN SYLLABICS PAAI +1431;N # CANADIAN SYLLABICS PI +1432;N # CANADIAN SYLLABICS PII +1433;N # CANADIAN SYLLABICS PO +1434;N # CANADIAN SYLLABICS POO +1435;N # CANADIAN SYLLABICS Y-CREE POO +1436;N # CANADIAN SYLLABICS CARRIER HEE +1437;N # CANADIAN SYLLABICS CARRIER HI +1438;N # CANADIAN SYLLABICS PA +1439;N # CANADIAN SYLLABICS PAA +143A;N # CANADIAN SYLLABICS PWE +143B;N # CANADIAN SYLLABICS WEST-CREE PWE +143C;N # CANADIAN SYLLABICS PWI +143D;N # CANADIAN SYLLABICS WEST-CREE PWI +143E;N # CANADIAN SYLLABICS PWII +143F;N # CANADIAN SYLLABICS WEST-CREE PWII +1440;N # CANADIAN SYLLABICS PWO +1441;N # CANADIAN SYLLABICS WEST-CREE PWO +1442;N # CANADIAN SYLLABICS PWOO +1443;N # CANADIAN SYLLABICS WEST-CREE PWOO +1444;N # CANADIAN SYLLABICS PWA +1445;N # CANADIAN SYLLABICS WEST-CREE PWA +1446;N # CANADIAN SYLLABICS PWAA +1447;N # CANADIAN SYLLABICS WEST-CREE PWAA +1448;N # CANADIAN SYLLABICS Y-CREE PWAA +1449;N # CANADIAN SYLLABICS P +144A;N # CANADIAN SYLLABICS WEST-CREE P +144B;N # CANADIAN SYLLABICS CARRIER H +144C;N # CANADIAN SYLLABICS TE +144D;N # CANADIAN SYLLABICS TAAI +144E;N # CANADIAN SYLLABICS TI +144F;N # CANADIAN SYLLABICS TII +1450;N # CANADIAN SYLLABICS TO +1451;N # CANADIAN SYLLABICS TOO +1452;N # CANADIAN SYLLABICS Y-CREE TOO +1453;N # CANADIAN SYLLABICS CARRIER DEE +1454;N # CANADIAN SYLLABICS CARRIER DI +1455;N # CANADIAN SYLLABICS TA +1456;N # CANADIAN SYLLABICS TAA +1457;N # CANADIAN SYLLABICS TWE +1458;N # CANADIAN SYLLABICS WEST-CREE TWE +1459;N # CANADIAN SYLLABICS TWI +145A;N # CANADIAN SYLLABICS WEST-CREE TWI +145B;N # CANADIAN SYLLABICS TWII +145C;N # CANADIAN SYLLABICS WEST-CREE TWII +145D;N # CANADIAN SYLLABICS TWO +145E;N # CANADIAN SYLLABICS WEST-CREE TWO +145F;N # CANADIAN SYLLABICS TWOO +1460;N # CANADIAN SYLLABICS WEST-CREE TWOO +1461;N # CANADIAN SYLLABICS TWA +1462;N # CANADIAN SYLLABICS WEST-CREE TWA +1463;N # CANADIAN SYLLABICS TWAA +1464;N # CANADIAN SYLLABICS WEST-CREE TWAA +1465;N # CANADIAN SYLLABICS NASKAPI TWAA +1466;N # CANADIAN SYLLABICS T +1467;N # CANADIAN SYLLABICS TTE +1468;N # CANADIAN SYLLABICS TTI +1469;N # CANADIAN SYLLABICS TTO +146A;N # CANADIAN SYLLABICS TTA +146B;N # CANADIAN SYLLABICS KE +146C;N # CANADIAN SYLLABICS KAAI +146D;N # CANADIAN SYLLABICS KI +146E;N # CANADIAN SYLLABICS KII +146F;N # CANADIAN SYLLABICS KO +1470;N # CANADIAN SYLLABICS KOO +1471;N # CANADIAN SYLLABICS Y-CREE KOO +1472;N # CANADIAN SYLLABICS KA +1473;N # CANADIAN SYLLABICS KAA +1474;N # CANADIAN SYLLABICS KWE +1475;N # CANADIAN SYLLABICS WEST-CREE KWE +1476;N # CANADIAN SYLLABICS KWI +1477;N # CANADIAN SYLLABICS WEST-CREE KWI +1478;N # CANADIAN SYLLABICS KWII +1479;N # CANADIAN SYLLABICS WEST-CREE KWII +147A;N # CANADIAN SYLLABICS KWO +147B;N # CANADIAN SYLLABICS WEST-CREE KWO +147C;N # CANADIAN SYLLABICS KWOO +147D;N # CANADIAN SYLLABICS WEST-CREE KWOO +147E;N # CANADIAN SYLLABICS KWA +147F;N # CANADIAN SYLLABICS WEST-CREE KWA +1480;N # CANADIAN SYLLABICS KWAA +1481;N # CANADIAN SYLLABICS WEST-CREE KWAA +1482;N # CANADIAN SYLLABICS NASKAPI KWAA +1483;N # CANADIAN SYLLABICS K +1484;N # CANADIAN SYLLABICS KW +1485;N # CANADIAN SYLLABICS SOUTH-SLAVEY KEH +1486;N # CANADIAN SYLLABICS SOUTH-SLAVEY KIH +1487;N # CANADIAN SYLLABICS SOUTH-SLAVEY KOH +1488;N # CANADIAN SYLLABICS SOUTH-SLAVEY KAH +1489;N # CANADIAN SYLLABICS CE +148A;N # CANADIAN SYLLABICS CAAI +148B;N # CANADIAN SYLLABICS CI +148C;N # CANADIAN SYLLABICS CII +148D;N # CANADIAN SYLLABICS CO +148E;N # CANADIAN SYLLABICS COO +148F;N # CANADIAN SYLLABICS Y-CREE COO +1490;N # CANADIAN SYLLABICS CA +1491;N # CANADIAN SYLLABICS CAA +1492;N # CANADIAN SYLLABICS CWE +1493;N # CANADIAN SYLLABICS WEST-CREE CWE +1494;N # CANADIAN SYLLABICS CWI +1495;N # CANADIAN SYLLABICS WEST-CREE CWI +1496;N # CANADIAN SYLLABICS CWII +1497;N # CANADIAN SYLLABICS WEST-CREE CWII +1498;N # CANADIAN SYLLABICS CWO +1499;N # CANADIAN SYLLABICS WEST-CREE CWO +149A;N # CANADIAN SYLLABICS CWOO +149B;N # CANADIAN SYLLABICS WEST-CREE CWOO +149C;N # CANADIAN SYLLABICS CWA +149D;N # CANADIAN SYLLABICS WEST-CREE CWA +149E;N # CANADIAN SYLLABICS CWAA +149F;N # CANADIAN SYLLABICS WEST-CREE CWAA +14A0;N # CANADIAN SYLLABICS NASKAPI CWAA +14A1;N # CANADIAN SYLLABICS C +14A2;N # CANADIAN SYLLABICS SAYISI TH +14A3;N # CANADIAN SYLLABICS ME +14A4;N # CANADIAN SYLLABICS MAAI +14A5;N # CANADIAN SYLLABICS MI +14A6;N # CANADIAN SYLLABICS MII +14A7;N # CANADIAN SYLLABICS MO +14A8;N # CANADIAN SYLLABICS MOO +14A9;N # CANADIAN SYLLABICS Y-CREE MOO +14AA;N # CANADIAN SYLLABICS MA +14AB;N # CANADIAN SYLLABICS MAA +14AC;N # CANADIAN SYLLABICS MWE +14AD;N # CANADIAN SYLLABICS WEST-CREE MWE +14AE;N # CANADIAN SYLLABICS MWI +14AF;N # CANADIAN SYLLABICS WEST-CREE MWI +14B0;N # CANADIAN SYLLABICS MWII +14B1;N # CANADIAN SYLLABICS WEST-CREE MWII +14B2;N # CANADIAN SYLLABICS MWO +14B3;N # CANADIAN SYLLABICS WEST-CREE MWO +14B4;N # CANADIAN SYLLABICS MWOO +14B5;N # CANADIAN SYLLABICS WEST-CREE MWOO +14B6;N # CANADIAN SYLLABICS MWA +14B7;N # CANADIAN SYLLABICS WEST-CREE MWA +14B8;N # CANADIAN SYLLABICS MWAA +14B9;N # CANADIAN SYLLABICS WEST-CREE MWAA +14BA;N # CANADIAN SYLLABICS NASKAPI MWAA +14BB;N # CANADIAN SYLLABICS M +14BC;N # CANADIAN SYLLABICS WEST-CREE M +14BD;N # CANADIAN SYLLABICS MH +14BE;N # CANADIAN SYLLABICS ATHAPASCAN M +14BF;N # CANADIAN SYLLABICS SAYISI M +14C0;N # CANADIAN SYLLABICS NE +14C1;N # CANADIAN SYLLABICS NAAI +14C2;N # CANADIAN SYLLABICS NI +14C3;N # CANADIAN SYLLABICS NII +14C4;N # CANADIAN SYLLABICS NO +14C5;N # CANADIAN SYLLABICS NOO +14C6;N # CANADIAN SYLLABICS Y-CREE NOO +14C7;N # CANADIAN SYLLABICS NA +14C8;N # CANADIAN SYLLABICS NAA +14C9;N # CANADIAN SYLLABICS NWE +14CA;N # CANADIAN SYLLABICS WEST-CREE NWE +14CB;N # CANADIAN SYLLABICS NWA +14CC;N # CANADIAN SYLLABICS WEST-CREE NWA +14CD;N # CANADIAN SYLLABICS NWAA +14CE;N # CANADIAN SYLLABICS WEST-CREE NWAA +14CF;N # CANADIAN SYLLABICS NASKAPI NWAA +14D0;N # CANADIAN SYLLABICS N +14D1;N # CANADIAN SYLLABICS CARRIER NG +14D2;N # CANADIAN SYLLABICS NH +14D3;N # CANADIAN SYLLABICS LE +14D4;N # CANADIAN SYLLABICS LAAI +14D5;N # CANADIAN SYLLABICS LI +14D6;N # CANADIAN SYLLABICS LII +14D7;N # CANADIAN SYLLABICS LO +14D8;N # CANADIAN SYLLABICS LOO +14D9;N # CANADIAN SYLLABICS Y-CREE LOO +14DA;N # CANADIAN SYLLABICS LA +14DB;N # CANADIAN SYLLABICS LAA +14DC;N # CANADIAN SYLLABICS LWE +14DD;N # CANADIAN SYLLABICS WEST-CREE LWE +14DE;N # CANADIAN SYLLABICS LWI +14DF;N # CANADIAN SYLLABICS WEST-CREE LWI +14E0;N # CANADIAN SYLLABICS LWII +14E1;N # CANADIAN SYLLABICS WEST-CREE LWII +14E2;N # CANADIAN SYLLABICS LWO +14E3;N # CANADIAN SYLLABICS WEST-CREE LWO +14E4;N # CANADIAN SYLLABICS LWOO +14E5;N # CANADIAN SYLLABICS WEST-CREE LWOO +14E6;N # CANADIAN SYLLABICS LWA +14E7;N # CANADIAN SYLLABICS WEST-CREE LWA +14E8;N # CANADIAN SYLLABICS LWAA +14E9;N # CANADIAN SYLLABICS WEST-CREE LWAA +14EA;N # CANADIAN SYLLABICS L +14EB;N # CANADIAN SYLLABICS WEST-CREE L +14EC;N # CANADIAN SYLLABICS MEDIAL L +14ED;N # CANADIAN SYLLABICS SE +14EE;N # CANADIAN SYLLABICS SAAI +14EF;N # CANADIAN SYLLABICS SI +14F0;N # CANADIAN SYLLABICS SII +14F1;N # CANADIAN SYLLABICS SO +14F2;N # CANADIAN SYLLABICS SOO +14F3;N # CANADIAN SYLLABICS Y-CREE SOO +14F4;N # CANADIAN SYLLABICS SA +14F5;N # CANADIAN SYLLABICS SAA +14F6;N # CANADIAN SYLLABICS SWE +14F7;N # CANADIAN SYLLABICS WEST-CREE SWE +14F8;N # CANADIAN SYLLABICS SWI +14F9;N # CANADIAN SYLLABICS WEST-CREE SWI +14FA;N # CANADIAN SYLLABICS SWII +14FB;N # CANADIAN SYLLABICS WEST-CREE SWII +14FC;N # CANADIAN SYLLABICS SWO +14FD;N # CANADIAN SYLLABICS WEST-CREE SWO +14FE;N # CANADIAN SYLLABICS SWOO +14FF;N # CANADIAN SYLLABICS WEST-CREE SWOO +1500;N # CANADIAN SYLLABICS SWA +1501;N # CANADIAN SYLLABICS WEST-CREE SWA +1502;N # CANADIAN SYLLABICS SWAA +1503;N # CANADIAN SYLLABICS WEST-CREE SWAA +1504;N # CANADIAN SYLLABICS NASKAPI SWAA +1505;N # CANADIAN SYLLABICS S +1506;N # CANADIAN SYLLABICS ATHAPASCAN S +1507;N # CANADIAN SYLLABICS SW +1508;N # CANADIAN SYLLABICS BLACKFOOT S +1509;N # CANADIAN SYLLABICS MOOSE-CREE SK +150A;N # CANADIAN SYLLABICS NASKAPI SKW +150B;N # CANADIAN SYLLABICS NASKAPI S-W +150C;N # CANADIAN SYLLABICS NASKAPI SPWA +150D;N # CANADIAN SYLLABICS NASKAPI STWA +150E;N # CANADIAN SYLLABICS NASKAPI SKWA +150F;N # CANADIAN SYLLABICS NASKAPI SCWA +1510;N # CANADIAN SYLLABICS SHE +1511;N # CANADIAN SYLLABICS SHI +1512;N # CANADIAN SYLLABICS SHII +1513;N # CANADIAN SYLLABICS SHO +1514;N # CANADIAN SYLLABICS SHOO +1515;N # CANADIAN SYLLABICS SHA +1516;N # CANADIAN SYLLABICS SHAA +1517;N # CANADIAN SYLLABICS SHWE +1518;N # CANADIAN SYLLABICS WEST-CREE SHWE +1519;N # CANADIAN SYLLABICS SHWI +151A;N # CANADIAN SYLLABICS WEST-CREE SHWI +151B;N # CANADIAN SYLLABICS SHWII +151C;N # CANADIAN SYLLABICS WEST-CREE SHWII +151D;N # CANADIAN SYLLABICS SHWO +151E;N # CANADIAN SYLLABICS WEST-CREE SHWO +151F;N # CANADIAN SYLLABICS SHWOO +1520;N # CANADIAN SYLLABICS WEST-CREE SHWOO +1521;N # CANADIAN SYLLABICS SHWA +1522;N # CANADIAN SYLLABICS WEST-CREE SHWA +1523;N # CANADIAN SYLLABICS SHWAA +1524;N # CANADIAN SYLLABICS WEST-CREE SHWAA +1525;N # CANADIAN SYLLABICS SH +1526;N # CANADIAN SYLLABICS YE +1527;N # CANADIAN SYLLABICS YAAI +1528;N # CANADIAN SYLLABICS YI +1529;N # CANADIAN SYLLABICS YII +152A;N # CANADIAN SYLLABICS YO +152B;N # CANADIAN SYLLABICS YOO +152C;N # CANADIAN SYLLABICS Y-CREE YOO +152D;N # CANADIAN SYLLABICS YA +152E;N # CANADIAN SYLLABICS YAA +152F;N # CANADIAN SYLLABICS YWE +1530;N # CANADIAN SYLLABICS WEST-CREE YWE +1531;N # CANADIAN SYLLABICS YWI +1532;N # CANADIAN SYLLABICS WEST-CREE YWI +1533;N # CANADIAN SYLLABICS YWII +1534;N # CANADIAN SYLLABICS WEST-CREE YWII +1535;N # CANADIAN SYLLABICS YWO +1536;N # CANADIAN SYLLABICS WEST-CREE YWO +1537;N # CANADIAN SYLLABICS YWOO +1538;N # CANADIAN SYLLABICS WEST-CREE YWOO +1539;N # CANADIAN SYLLABICS YWA +153A;N # CANADIAN SYLLABICS WEST-CREE YWA +153B;N # CANADIAN SYLLABICS YWAA +153C;N # CANADIAN SYLLABICS WEST-CREE YWAA +153D;N # CANADIAN SYLLABICS NASKAPI YWAA +153E;N # CANADIAN SYLLABICS Y +153F;N # CANADIAN SYLLABICS BIBLE-CREE Y +1540;N # CANADIAN SYLLABICS WEST-CREE Y +1541;N # CANADIAN SYLLABICS SAYISI YI +1542;N # CANADIAN SYLLABICS RE +1543;N # CANADIAN SYLLABICS R-CREE RE +1544;N # CANADIAN SYLLABICS WEST-CREE LE +1545;N # CANADIAN SYLLABICS RAAI +1546;N # CANADIAN SYLLABICS RI +1547;N # CANADIAN SYLLABICS RII +1548;N # CANADIAN SYLLABICS RO +1549;N # CANADIAN SYLLABICS ROO +154A;N # CANADIAN SYLLABICS WEST-CREE LO +154B;N # CANADIAN SYLLABICS RA +154C;N # CANADIAN SYLLABICS RAA +154D;N # CANADIAN SYLLABICS WEST-CREE LA +154E;N # CANADIAN SYLLABICS RWAA +154F;N # CANADIAN SYLLABICS WEST-CREE RWAA +1550;N # CANADIAN SYLLABICS R +1551;N # CANADIAN SYLLABICS WEST-CREE R +1552;N # CANADIAN SYLLABICS MEDIAL R +1553;N # CANADIAN SYLLABICS FE +1554;N # CANADIAN SYLLABICS FAAI +1555;N # CANADIAN SYLLABICS FI +1556;N # CANADIAN SYLLABICS FII +1557;N # CANADIAN SYLLABICS FO +1558;N # CANADIAN SYLLABICS FOO +1559;N # CANADIAN SYLLABICS FA +155A;N # CANADIAN SYLLABICS FAA +155B;N # CANADIAN SYLLABICS FWAA +155C;N # CANADIAN SYLLABICS WEST-CREE FWAA +155D;N # CANADIAN SYLLABICS F +155E;N # CANADIAN SYLLABICS THE +155F;N # CANADIAN SYLLABICS N-CREE THE +1560;N # CANADIAN SYLLABICS THI +1561;N # CANADIAN SYLLABICS N-CREE THI +1562;N # CANADIAN SYLLABICS THII +1563;N # CANADIAN SYLLABICS N-CREE THII +1564;N # CANADIAN SYLLABICS THO +1565;N # CANADIAN SYLLABICS THOO +1566;N # CANADIAN SYLLABICS THA +1567;N # CANADIAN SYLLABICS THAA +1568;N # CANADIAN SYLLABICS THWAA +1569;N # CANADIAN SYLLABICS WEST-CREE THWAA +156A;N # CANADIAN SYLLABICS TH +156B;N # CANADIAN SYLLABICS TTHE +156C;N # CANADIAN SYLLABICS TTHI +156D;N # CANADIAN SYLLABICS TTHO +156E;N # CANADIAN SYLLABICS TTHA +156F;N # CANADIAN SYLLABICS TTH +1570;N # CANADIAN SYLLABICS TYE +1571;N # CANADIAN SYLLABICS TYI +1572;N # CANADIAN SYLLABICS TYO +1573;N # CANADIAN SYLLABICS TYA +1574;N # CANADIAN SYLLABICS NUNAVIK HE +1575;N # CANADIAN SYLLABICS NUNAVIK HI +1576;N # CANADIAN SYLLABICS NUNAVIK HII +1577;N # CANADIAN SYLLABICS NUNAVIK HO +1578;N # CANADIAN SYLLABICS NUNAVIK HOO +1579;N # CANADIAN SYLLABICS NUNAVIK HA +157A;N # CANADIAN SYLLABICS NUNAVIK HAA +157B;N # CANADIAN SYLLABICS NUNAVIK H +157C;N # CANADIAN SYLLABICS NUNAVUT H +157D;N # CANADIAN SYLLABICS HK +157E;N # CANADIAN SYLLABICS QAAI +157F;N # CANADIAN SYLLABICS QI +1580;N # CANADIAN SYLLABICS QII +1581;N # CANADIAN SYLLABICS QO +1582;N # CANADIAN SYLLABICS QOO +1583;N # CANADIAN SYLLABICS QA +1584;N # CANADIAN SYLLABICS QAA +1585;N # CANADIAN SYLLABICS Q +1586;N # CANADIAN SYLLABICS TLHE +1587;N # CANADIAN SYLLABICS TLHI +1588;N # CANADIAN SYLLABICS TLHO +1589;N # CANADIAN SYLLABICS TLHA +158A;N # CANADIAN SYLLABICS WEST-CREE RE +158B;N # CANADIAN SYLLABICS WEST-CREE RI +158C;N # CANADIAN SYLLABICS WEST-CREE RO +158D;N # CANADIAN SYLLABICS WEST-CREE RA +158E;N # CANADIAN SYLLABICS NGAAI +158F;N # CANADIAN SYLLABICS NGI +1590;N # CANADIAN SYLLABICS NGII +1591;N # CANADIAN SYLLABICS NGO +1592;N # CANADIAN SYLLABICS NGOO +1593;N # CANADIAN SYLLABICS NGA +1594;N # CANADIAN SYLLABICS NGAA +1595;N # CANADIAN SYLLABICS NG +1596;N # CANADIAN SYLLABICS NNG +1597;N # CANADIAN SYLLABICS SAYISI SHE +1598;N # CANADIAN SYLLABICS SAYISI SHI +1599;N # CANADIAN SYLLABICS SAYISI SHO +159A;N # CANADIAN SYLLABICS SAYISI SHA +159B;N # CANADIAN SYLLABICS WOODS-CREE THE +159C;N # CANADIAN SYLLABICS WOODS-CREE THI +159D;N # CANADIAN SYLLABICS WOODS-CREE THO +159E;N # CANADIAN SYLLABICS WOODS-CREE THA +159F;N # CANADIAN SYLLABICS WOODS-CREE TH +15A0;N # CANADIAN SYLLABICS LHI +15A1;N # CANADIAN SYLLABICS LHII +15A2;N # CANADIAN SYLLABICS LHO +15A3;N # CANADIAN SYLLABICS LHOO +15A4;N # CANADIAN SYLLABICS LHA +15A5;N # CANADIAN SYLLABICS LHAA +15A6;N # CANADIAN SYLLABICS LH +15A7;N # CANADIAN SYLLABICS TH-CREE THE +15A8;N # CANADIAN SYLLABICS TH-CREE THI +15A9;N # CANADIAN SYLLABICS TH-CREE THII +15AA;N # CANADIAN SYLLABICS TH-CREE THO +15AB;N # CANADIAN SYLLABICS TH-CREE THOO +15AC;N # CANADIAN SYLLABICS TH-CREE THA +15AD;N # CANADIAN SYLLABICS TH-CREE THAA +15AE;N # CANADIAN SYLLABICS TH-CREE TH +15AF;N # CANADIAN SYLLABICS AIVILIK B +15B0;N # CANADIAN SYLLABICS BLACKFOOT E +15B1;N # CANADIAN SYLLABICS BLACKFOOT I +15B2;N # CANADIAN SYLLABICS BLACKFOOT O +15B3;N # CANADIAN SYLLABICS BLACKFOOT A +15B4;N # CANADIAN SYLLABICS BLACKFOOT WE +15B5;N # CANADIAN SYLLABICS BLACKFOOT WI +15B6;N # CANADIAN SYLLABICS BLACKFOOT WO +15B7;N # CANADIAN SYLLABICS BLACKFOOT WA +15B8;N # CANADIAN SYLLABICS BLACKFOOT NE +15B9;N # CANADIAN SYLLABICS BLACKFOOT NI +15BA;N # CANADIAN SYLLABICS BLACKFOOT NO +15BB;N # CANADIAN SYLLABICS BLACKFOOT NA +15BC;N # CANADIAN SYLLABICS BLACKFOOT KE +15BD;N # CANADIAN SYLLABICS BLACKFOOT KI +15BE;N # CANADIAN SYLLABICS BLACKFOOT KO +15BF;N # CANADIAN SYLLABICS BLACKFOOT KA +15C0;N # CANADIAN SYLLABICS SAYISI HE +15C1;N # CANADIAN SYLLABICS SAYISI HI +15C2;N # CANADIAN SYLLABICS SAYISI HO +15C3;N # CANADIAN SYLLABICS SAYISI HA +15C4;N # CANADIAN SYLLABICS CARRIER GHU +15C5;N # CANADIAN SYLLABICS CARRIER GHO +15C6;N # CANADIAN SYLLABICS CARRIER GHE +15C7;N # CANADIAN SYLLABICS CARRIER GHEE +15C8;N # CANADIAN SYLLABICS CARRIER GHI +15C9;N # CANADIAN SYLLABICS CARRIER GHA +15CA;N # CANADIAN SYLLABICS CARRIER RU +15CB;N # CANADIAN SYLLABICS CARRIER RO +15CC;N # CANADIAN SYLLABICS CARRIER RE +15CD;N # CANADIAN SYLLABICS CARRIER REE +15CE;N # CANADIAN SYLLABICS CARRIER RI +15CF;N # CANADIAN SYLLABICS CARRIER RA +15D0;N # CANADIAN SYLLABICS CARRIER WU +15D1;N # CANADIAN SYLLABICS CARRIER WO +15D2;N # CANADIAN SYLLABICS CARRIER WE +15D3;N # CANADIAN SYLLABICS CARRIER WEE +15D4;N # CANADIAN SYLLABICS CARRIER WI +15D5;N # CANADIAN SYLLABICS CARRIER WA +15D6;N # CANADIAN SYLLABICS CARRIER HWU +15D7;N # CANADIAN SYLLABICS CARRIER HWO +15D8;N # CANADIAN SYLLABICS CARRIER HWE +15D9;N # CANADIAN SYLLABICS CARRIER HWEE +15DA;N # CANADIAN SYLLABICS CARRIER HWI +15DB;N # CANADIAN SYLLABICS CARRIER HWA +15DC;N # CANADIAN SYLLABICS CARRIER THU +15DD;N # CANADIAN SYLLABICS CARRIER THO +15DE;N # CANADIAN SYLLABICS CARRIER THE +15DF;N # CANADIAN SYLLABICS CARRIER THEE +15E0;N # CANADIAN SYLLABICS CARRIER THI +15E1;N # CANADIAN SYLLABICS CARRIER THA +15E2;N # CANADIAN SYLLABICS CARRIER TTU +15E3;N # CANADIAN SYLLABICS CARRIER TTO +15E4;N # CANADIAN SYLLABICS CARRIER TTE +15E5;N # CANADIAN SYLLABICS CARRIER TTEE +15E6;N # CANADIAN SYLLABICS CARRIER TTI +15E7;N # CANADIAN SYLLABICS CARRIER TTA +15E8;N # CANADIAN SYLLABICS CARRIER PU +15E9;N # CANADIAN SYLLABICS CARRIER PO +15EA;N # CANADIAN SYLLABICS CARRIER PE +15EB;N # CANADIAN SYLLABICS CARRIER PEE +15EC;N # CANADIAN SYLLABICS CARRIER PI +15ED;N # CANADIAN SYLLABICS CARRIER PA +15EE;N # CANADIAN SYLLABICS CARRIER P +15EF;N # CANADIAN SYLLABICS CARRIER GU +15F0;N # CANADIAN SYLLABICS CARRIER GO +15F1;N # CANADIAN SYLLABICS CARRIER GE +15F2;N # CANADIAN SYLLABICS CARRIER GEE +15F3;N # CANADIAN SYLLABICS CARRIER GI +15F4;N # CANADIAN SYLLABICS CARRIER GA +15F5;N # CANADIAN SYLLABICS CARRIER KHU +15F6;N # CANADIAN SYLLABICS CARRIER KHO +15F7;N # CANADIAN SYLLABICS CARRIER KHE +15F8;N # CANADIAN SYLLABICS CARRIER KHEE +15F9;N # CANADIAN SYLLABICS CARRIER KHI +15FA;N # CANADIAN SYLLABICS CARRIER KHA +15FB;N # CANADIAN SYLLABICS CARRIER KKU +15FC;N # CANADIAN SYLLABICS CARRIER KKO +15FD;N # CANADIAN SYLLABICS CARRIER KKE +15FE;N # CANADIAN SYLLABICS CARRIER KKEE +15FF;N # CANADIAN SYLLABICS CARRIER KKI +1600;N # CANADIAN SYLLABICS CARRIER KKA +1601;N # CANADIAN SYLLABICS CARRIER KK +1602;N # CANADIAN SYLLABICS CARRIER NU +1603;N # CANADIAN SYLLABICS CARRIER NO +1604;N # CANADIAN SYLLABICS CARRIER NE +1605;N # CANADIAN SYLLABICS CARRIER NEE +1606;N # CANADIAN SYLLABICS CARRIER NI +1607;N # CANADIAN SYLLABICS CARRIER NA +1608;N # CANADIAN SYLLABICS CARRIER MU +1609;N # CANADIAN SYLLABICS CARRIER MO +160A;N # CANADIAN SYLLABICS CARRIER ME +160B;N # CANADIAN SYLLABICS CARRIER MEE +160C;N # CANADIAN SYLLABICS CARRIER MI +160D;N # CANADIAN SYLLABICS CARRIER MA +160E;N # CANADIAN SYLLABICS CARRIER YU +160F;N # CANADIAN SYLLABICS CARRIER YO +1610;N # CANADIAN SYLLABICS CARRIER YE +1611;N # CANADIAN SYLLABICS CARRIER YEE +1612;N # CANADIAN SYLLABICS CARRIER YI +1613;N # CANADIAN SYLLABICS CARRIER YA +1614;N # CANADIAN SYLLABICS CARRIER JU +1615;N # CANADIAN SYLLABICS SAYISI JU +1616;N # CANADIAN SYLLABICS CARRIER JO +1617;N # CANADIAN SYLLABICS CARRIER JE +1618;N # CANADIAN SYLLABICS CARRIER JEE +1619;N # CANADIAN SYLLABICS CARRIER JI +161A;N # CANADIAN SYLLABICS SAYISI JI +161B;N # CANADIAN SYLLABICS CARRIER JA +161C;N # CANADIAN SYLLABICS CARRIER JJU +161D;N # CANADIAN SYLLABICS CARRIER JJO +161E;N # CANADIAN SYLLABICS CARRIER JJE +161F;N # CANADIAN SYLLABICS CARRIER JJEE +1620;N # CANADIAN SYLLABICS CARRIER JJI +1621;N # CANADIAN SYLLABICS CARRIER JJA +1622;N # CANADIAN SYLLABICS CARRIER LU +1623;N # CANADIAN SYLLABICS CARRIER LO +1624;N # CANADIAN SYLLABICS CARRIER LE +1625;N # CANADIAN SYLLABICS CARRIER LEE +1626;N # CANADIAN SYLLABICS CARRIER LI +1627;N # CANADIAN SYLLABICS CARRIER LA +1628;N # CANADIAN SYLLABICS CARRIER DLU +1629;N # CANADIAN SYLLABICS CARRIER DLO +162A;N # CANADIAN SYLLABICS CARRIER DLE +162B;N # CANADIAN SYLLABICS CARRIER DLEE +162C;N # CANADIAN SYLLABICS CARRIER DLI +162D;N # CANADIAN SYLLABICS CARRIER DLA +162E;N # CANADIAN SYLLABICS CARRIER LHU +162F;N # CANADIAN SYLLABICS CARRIER LHO +1630;N # CANADIAN SYLLABICS CARRIER LHE +1631;N # CANADIAN SYLLABICS CARRIER LHEE +1632;N # CANADIAN SYLLABICS CARRIER LHI +1633;N # CANADIAN SYLLABICS CARRIER LHA +1634;N # CANADIAN SYLLABICS CARRIER TLHU +1635;N # CANADIAN SYLLABICS CARRIER TLHO +1636;N # CANADIAN SYLLABICS CARRIER TLHE +1637;N # CANADIAN SYLLABICS CARRIER TLHEE +1638;N # CANADIAN SYLLABICS CARRIER TLHI +1639;N # CANADIAN SYLLABICS CARRIER TLHA +163A;N # CANADIAN SYLLABICS CARRIER TLU +163B;N # CANADIAN SYLLABICS CARRIER TLO +163C;N # CANADIAN SYLLABICS CARRIER TLE +163D;N # CANADIAN SYLLABICS CARRIER TLEE +163E;N # CANADIAN SYLLABICS CARRIER TLI +163F;N # CANADIAN SYLLABICS CARRIER TLA +1640;N # CANADIAN SYLLABICS CARRIER ZU +1641;N # CANADIAN SYLLABICS CARRIER ZO +1642;N # CANADIAN SYLLABICS CARRIER ZE +1643;N # CANADIAN SYLLABICS CARRIER ZEE +1644;N # CANADIAN SYLLABICS CARRIER ZI +1645;N # CANADIAN SYLLABICS CARRIER ZA +1646;N # CANADIAN SYLLABICS CARRIER Z +1647;N # CANADIAN SYLLABICS CARRIER INITIAL Z +1648;N # CANADIAN SYLLABICS CARRIER DZU +1649;N # CANADIAN SYLLABICS CARRIER DZO +164A;N # CANADIAN SYLLABICS CARRIER DZE +164B;N # CANADIAN SYLLABICS CARRIER DZEE +164C;N # CANADIAN SYLLABICS CARRIER DZI +164D;N # CANADIAN SYLLABICS CARRIER DZA +164E;N # CANADIAN SYLLABICS CARRIER SU +164F;N # CANADIAN SYLLABICS CARRIER SO +1650;N # CANADIAN SYLLABICS CARRIER SE +1651;N # CANADIAN SYLLABICS CARRIER SEE +1652;N # CANADIAN SYLLABICS CARRIER SI +1653;N # CANADIAN SYLLABICS CARRIER SA +1654;N # CANADIAN SYLLABICS CARRIER SHU +1655;N # CANADIAN SYLLABICS CARRIER SHO +1656;N # CANADIAN SYLLABICS CARRIER SHE +1657;N # CANADIAN SYLLABICS CARRIER SHEE +1658;N # CANADIAN SYLLABICS CARRIER SHI +1659;N # CANADIAN SYLLABICS CARRIER SHA +165A;N # CANADIAN SYLLABICS CARRIER SH +165B;N # CANADIAN SYLLABICS CARRIER TSU +165C;N # CANADIAN SYLLABICS CARRIER TSO +165D;N # CANADIAN SYLLABICS CARRIER TSE +165E;N # CANADIAN SYLLABICS CARRIER TSEE +165F;N # CANADIAN SYLLABICS CARRIER TSI +1660;N # CANADIAN SYLLABICS CARRIER TSA +1661;N # CANADIAN SYLLABICS CARRIER CHU +1662;N # CANADIAN SYLLABICS CARRIER CHO +1663;N # CANADIAN SYLLABICS CARRIER CHE +1664;N # CANADIAN SYLLABICS CARRIER CHEE +1665;N # CANADIAN SYLLABICS CARRIER CHI +1666;N # CANADIAN SYLLABICS CARRIER CHA +1667;N # CANADIAN SYLLABICS CARRIER TTSU +1668;N # CANADIAN SYLLABICS CARRIER TTSO +1669;N # CANADIAN SYLLABICS CARRIER TTSE +166A;N # CANADIAN SYLLABICS CARRIER TTSEE +166B;N # CANADIAN SYLLABICS CARRIER TTSI +166C;N # CANADIAN SYLLABICS CARRIER TTSA +166D;N # CANADIAN SYLLABICS CHI SIGN +166E;N # CANADIAN SYLLABICS FULL STOP +166F;N # CANADIAN SYLLABICS QAI +1670;N # CANADIAN SYLLABICS NGAI +1671;N # CANADIAN SYLLABICS NNGI +1672;N # CANADIAN SYLLABICS NNGII +1673;N # CANADIAN SYLLABICS NNGO +1674;N # CANADIAN SYLLABICS NNGOO +1675;N # CANADIAN SYLLABICS NNGA +1676;N # CANADIAN SYLLABICS NNGAA +1680;N # OGHAM SPACE MARK +1681;N # OGHAM LETTER BEITH +1682;N # OGHAM LETTER LUIS +1683;N # OGHAM LETTER FEARN +1684;N # OGHAM LETTER SAIL +1685;N # OGHAM LETTER NION +1686;N # OGHAM LETTER UATH +1687;N # OGHAM LETTER DAIR +1688;N # OGHAM LETTER TINNE +1689;N # OGHAM LETTER COLL +168A;N # OGHAM LETTER CEIRT +168B;N # OGHAM LETTER MUIN +168C;N # OGHAM LETTER GORT +168D;N # OGHAM LETTER NGEADAL +168E;N # OGHAM LETTER STRAIF +168F;N # OGHAM LETTER RUIS +1690;N # OGHAM LETTER AILM +1691;N # OGHAM LETTER ONN +1692;N # OGHAM LETTER UR +1693;N # OGHAM LETTER EADHADH +1694;N # OGHAM LETTER IODHADH +1695;N # OGHAM LETTER EABHADH +1696;N # OGHAM LETTER OR +1697;N # OGHAM LETTER UILLEANN +1698;N # OGHAM LETTER IFIN +1699;N # OGHAM LETTER EAMHANCHOLL +169A;N # OGHAM LETTER PEITH +169B;N # OGHAM FEATHER MARK +169C;N # OGHAM REVERSED FEATHER MARK +16A0;N # RUNIC LETTER FEHU FEOH FE F +16A1;N # RUNIC LETTER V +16A2;N # RUNIC LETTER URUZ UR U +16A3;N # RUNIC LETTER YR +16A4;N # RUNIC LETTER Y +16A5;N # RUNIC LETTER W +16A6;N # RUNIC LETTER THURISAZ THURS THORN +16A7;N # RUNIC LETTER ETH +16A8;N # RUNIC LETTER ANSUZ A +16A9;N # RUNIC LETTER OS O +16AA;N # RUNIC LETTER AC A +16AB;N # RUNIC LETTER AESC +16AC;N # RUNIC LETTER LONG-BRANCH-OSS O +16AD;N # RUNIC LETTER SHORT-TWIG-OSS O +16AE;N # RUNIC LETTER O +16AF;N # RUNIC LETTER OE +16B0;N # RUNIC LETTER ON +16B1;N # RUNIC LETTER RAIDO RAD REID R +16B2;N # RUNIC LETTER KAUNA +16B3;N # RUNIC LETTER CEN +16B4;N # RUNIC LETTER KAUN K +16B5;N # RUNIC LETTER G +16B6;N # RUNIC LETTER ENG +16B7;N # RUNIC LETTER GEBO GYFU G +16B8;N # RUNIC LETTER GAR +16B9;N # RUNIC LETTER WUNJO WYNN W +16BA;N # RUNIC LETTER HAGLAZ H +16BB;N # RUNIC LETTER HAEGL H +16BC;N # RUNIC LETTER LONG-BRANCH-HAGALL H +16BD;N # RUNIC LETTER SHORT-TWIG-HAGALL H +16BE;N # RUNIC LETTER NAUDIZ NYD NAUD N +16BF;N # RUNIC LETTER SHORT-TWIG-NAUD N +16C0;N # RUNIC LETTER DOTTED-N +16C1;N # RUNIC LETTER ISAZ IS ISS I +16C2;N # RUNIC LETTER E +16C3;N # RUNIC LETTER JERAN J +16C4;N # RUNIC LETTER GER +16C5;N # RUNIC LETTER LONG-BRANCH-AR AE +16C6;N # RUNIC LETTER SHORT-TWIG-AR A +16C7;N # RUNIC LETTER IWAZ EOH +16C8;N # RUNIC LETTER PERTHO PEORTH P +16C9;N # RUNIC LETTER ALGIZ EOLHX +16CA;N # RUNIC LETTER SOWILO S +16CB;N # RUNIC LETTER SIGEL LONG-BRANCH-SOL S +16CC;N # RUNIC LETTER SHORT-TWIG-SOL S +16CD;N # RUNIC LETTER C +16CE;N # RUNIC LETTER Z +16CF;N # RUNIC LETTER TIWAZ TIR TYR T +16D0;N # RUNIC LETTER SHORT-TWIG-TYR T +16D1;N # RUNIC LETTER D +16D2;N # RUNIC LETTER BERKANAN BEORC BJARKAN B +16D3;N # RUNIC LETTER SHORT-TWIG-BJARKAN B +16D4;N # RUNIC LETTER DOTTED-P +16D5;N # RUNIC LETTER OPEN-P +16D6;N # RUNIC LETTER EHWAZ EH E +16D7;N # RUNIC LETTER MANNAZ MAN M +16D8;N # RUNIC LETTER LONG-BRANCH-MADR M +16D9;N # RUNIC LETTER SHORT-TWIG-MADR M +16DA;N # RUNIC LETTER LAUKAZ LAGU LOGR L +16DB;N # RUNIC LETTER DOTTED-L +16DC;N # RUNIC LETTER INGWAZ +16DD;N # RUNIC LETTER ING +16DE;N # RUNIC LETTER DAGAZ DAEG D +16DF;N # RUNIC LETTER OTHALAN ETHEL O +16E0;N # RUNIC LETTER EAR +16E1;N # RUNIC LETTER IOR +16E2;N # RUNIC LETTER CWEORTH +16E3;N # RUNIC LETTER CALC +16E4;N # RUNIC LETTER CEALC +16E5;N # RUNIC LETTER STAN +16E6;N # RUNIC LETTER LONG-BRANCH-YR +16E7;N # RUNIC LETTER SHORT-TWIG-YR +16E8;N # RUNIC LETTER ICELANDIC-YR +16E9;N # RUNIC LETTER Q +16EA;N # RUNIC LETTER X +16EB;N # RUNIC SINGLE PUNCTUATION +16EC;N # RUNIC MULTIPLE PUNCTUATION +16ED;N # RUNIC CROSS PUNCTUATION +16EE;N # RUNIC ARLAUG SYMBOL +16EF;N # RUNIC TVIMADUR SYMBOL +16F0;N # RUNIC BELGTHOR SYMBOL +1700;N # TAGALOG LETTER A +1701;N # TAGALOG LETTER I +1702;N # TAGALOG LETTER U +1703;N # TAGALOG LETTER KA +1704;N # TAGALOG LETTER GA +1705;N # TAGALOG LETTER NGA +1706;N # TAGALOG LETTER TA +1707;N # TAGALOG LETTER DA +1708;N # TAGALOG LETTER NA +1709;N # TAGALOG LETTER PA +170A;N # TAGALOG LETTER BA +170B;N # TAGALOG LETTER MA +170C;N # TAGALOG LETTER YA +170E;N # TAGALOG LETTER LA +170F;N # TAGALOG LETTER WA +1710;N # TAGALOG LETTER SA +1711;N # TAGALOG LETTER HA +1712;N # TAGALOG VOWEL SIGN I +1713;N # TAGALOG VOWEL SIGN U +1714;N # TAGALOG SIGN VIRAMA +1720;N # HANUNOO LETTER A +1721;N # HANUNOO LETTER I +1722;N # HANUNOO LETTER U +1723;N # HANUNOO LETTER KA +1724;N # HANUNOO LETTER GA +1725;N # HANUNOO LETTER NGA +1726;N # HANUNOO LETTER TA +1727;N # HANUNOO LETTER DA +1728;N # HANUNOO LETTER NA +1729;N # HANUNOO LETTER PA +172A;N # HANUNOO LETTER BA +172B;N # HANUNOO LETTER MA +172C;N # HANUNOO LETTER YA +172D;N # HANUNOO LETTER RA +172E;N # HANUNOO LETTER LA +172F;N # HANUNOO LETTER WA +1730;N # HANUNOO LETTER SA +1731;N # HANUNOO LETTER HA +1732;N # HANUNOO VOWEL SIGN I +1733;N # HANUNOO VOWEL SIGN U +1734;N # HANUNOO SIGN PAMUDPOD +1735;N # PHILIPPINE SINGLE PUNCTUATION +1736;N # PHILIPPINE DOUBLE PUNCTUATION +1740;N # BUHID LETTER A +1741;N # BUHID LETTER I +1742;N # BUHID LETTER U +1743;N # BUHID LETTER KA +1744;N # BUHID LETTER GA +1745;N # BUHID LETTER NGA +1746;N # BUHID LETTER TA +1747;N # BUHID LETTER DA +1748;N # BUHID LETTER NA +1749;N # BUHID LETTER PA +174A;N # BUHID LETTER BA +174B;N # BUHID LETTER MA +174C;N # BUHID LETTER YA +174D;N # BUHID LETTER RA +174E;N # BUHID LETTER LA +174F;N # BUHID LETTER WA +1750;N # BUHID LETTER SA +1751;N # BUHID LETTER HA +1752;N # BUHID VOWEL SIGN I +1753;N # BUHID VOWEL SIGN U +1760;N # TAGBANWA LETTER A +1761;N # TAGBANWA LETTER I +1762;N # TAGBANWA LETTER U +1763;N # TAGBANWA LETTER KA +1764;N # TAGBANWA LETTER GA +1765;N # TAGBANWA LETTER NGA +1766;N # TAGBANWA LETTER TA +1767;N # TAGBANWA LETTER DA +1768;N # TAGBANWA LETTER NA +1769;N # TAGBANWA LETTER PA +176A;N # TAGBANWA LETTER BA +176B;N # TAGBANWA LETTER MA +176C;N # TAGBANWA LETTER YA +176E;N # TAGBANWA LETTER LA +176F;N # TAGBANWA LETTER WA +1770;N # TAGBANWA LETTER SA +1772;N # TAGBANWA VOWEL SIGN I +1773;N # TAGBANWA VOWEL SIGN U +1780;N # KHMER LETTER KA +1781;N # KHMER LETTER KHA +1782;N # KHMER LETTER KO +1783;N # KHMER LETTER KHO +1784;N # KHMER LETTER NGO +1785;N # KHMER LETTER CA +1786;N # KHMER LETTER CHA +1787;N # KHMER LETTER CO +1788;N # KHMER LETTER CHO +1789;N # KHMER LETTER NYO +178A;N # KHMER LETTER DA +178B;N # KHMER LETTER TTHA +178C;N # KHMER LETTER DO +178D;N # KHMER LETTER TTHO +178E;N # KHMER LETTER NNO +178F;N # KHMER LETTER TA +1790;N # KHMER LETTER THA +1791;N # KHMER LETTER TO +1792;N # KHMER LETTER THO +1793;N # KHMER LETTER NO +1794;N # KHMER LETTER BA +1795;N # KHMER LETTER PHA +1796;N # KHMER LETTER PO +1797;N # KHMER LETTER PHO +1798;N # KHMER LETTER MO +1799;N # KHMER LETTER YO +179A;N # KHMER LETTER RO +179B;N # KHMER LETTER LO +179C;N # KHMER LETTER VO +179D;N # KHMER LETTER SHA +179E;N # KHMER LETTER SSO +179F;N # KHMER LETTER SA +17A0;N # KHMER LETTER HA +17A1;N # KHMER LETTER LA +17A2;N # KHMER LETTER QA +17A3;N # KHMER INDEPENDENT VOWEL QAQ +17A4;N # KHMER INDEPENDENT VOWEL QAA +17A5;N # KHMER INDEPENDENT VOWEL QI +17A6;N # KHMER INDEPENDENT VOWEL QII +17A7;N # KHMER INDEPENDENT VOWEL QU +17A8;N # KHMER INDEPENDENT VOWEL QUK +17A9;N # KHMER INDEPENDENT VOWEL QUU +17AA;N # KHMER INDEPENDENT VOWEL QUUV +17AB;N # KHMER INDEPENDENT VOWEL RY +17AC;N # KHMER INDEPENDENT VOWEL RYY +17AD;N # KHMER INDEPENDENT VOWEL LY +17AE;N # KHMER INDEPENDENT VOWEL LYY +17AF;N # KHMER INDEPENDENT VOWEL QE +17B0;N # KHMER INDEPENDENT VOWEL QAI +17B1;N # KHMER INDEPENDENT VOWEL QOO TYPE ONE +17B2;N # KHMER INDEPENDENT VOWEL QOO TYPE TWO +17B3;N # KHMER INDEPENDENT VOWEL QAU +17B4;N # KHMER VOWEL INHERENT AQ +17B5;N # KHMER VOWEL INHERENT AA +17B6;N # KHMER VOWEL SIGN AA +17B7;N # KHMER VOWEL SIGN I +17B8;N # KHMER VOWEL SIGN II +17B9;N # KHMER VOWEL SIGN Y +17BA;N # KHMER VOWEL SIGN YY +17BB;N # KHMER VOWEL SIGN U +17BC;N # KHMER VOWEL SIGN UU +17BD;N # KHMER VOWEL SIGN UA +17BE;N # KHMER VOWEL SIGN OE +17BF;N # KHMER VOWEL SIGN YA +17C0;N # KHMER VOWEL SIGN IE +17C1;N # KHMER VOWEL SIGN E +17C2;N # KHMER VOWEL SIGN AE +17C3;N # KHMER VOWEL SIGN AI +17C4;N # KHMER VOWEL SIGN OO +17C5;N # KHMER VOWEL SIGN AU +17C6;N # KHMER SIGN NIKAHIT +17C7;N # KHMER SIGN REAHMUK +17C8;N # KHMER SIGN YUUKALEAPINTU +17C9;N # KHMER SIGN MUUSIKATOAN +17CA;N # KHMER SIGN TRIISAP +17CB;N # KHMER SIGN BANTOC +17CC;N # KHMER SIGN ROBAT +17CD;N # KHMER SIGN TOANDAKHIAT +17CE;N # KHMER SIGN KAKABAT +17CF;N # KHMER SIGN AHSDA +17D0;N # KHMER SIGN SAMYOK SANNYA +17D1;N # KHMER SIGN VIRIAM +17D2;N # KHMER SIGN COENG +17D3;N # KHMER SIGN BATHAMASAT +17D4;N # KHMER SIGN KHAN +17D5;N # KHMER SIGN BARIYOOSAN +17D6;N # KHMER SIGN CAMNUC PII KUUH +17D7;N # KHMER SIGN LEK TOO +17D8;N # KHMER SIGN BEYYAL +17D9;N # KHMER SIGN PHNAEK MUAN +17DA;N # KHMER SIGN KOOMUUT +17DB;N # KHMER CURRENCY SYMBOL RIEL +17DC;N # KHMER SIGN AVAKRAHASANYA +17DD;N # KHMER SIGN ATTHACAN +17E0;N # KHMER DIGIT ZERO +17E1;N # KHMER DIGIT ONE +17E2;N # KHMER DIGIT TWO +17E3;N # KHMER DIGIT THREE +17E4;N # KHMER DIGIT FOUR +17E5;N # KHMER DIGIT FIVE +17E6;N # KHMER DIGIT SIX +17E7;N # KHMER DIGIT SEVEN +17E8;N # KHMER DIGIT EIGHT +17E9;N # KHMER DIGIT NINE +17F0;N # KHMER SYMBOL LEK ATTAK SON +17F1;N # KHMER SYMBOL LEK ATTAK MUOY +17F2;N # KHMER SYMBOL LEK ATTAK PII +17F3;N # KHMER SYMBOL LEK ATTAK BEI +17F4;N # KHMER SYMBOL LEK ATTAK BUON +17F5;N # KHMER SYMBOL LEK ATTAK PRAM +17F6;N # KHMER SYMBOL LEK ATTAK PRAM-MUOY +17F7;N # KHMER SYMBOL LEK ATTAK PRAM-PII +17F8;N # KHMER SYMBOL LEK ATTAK PRAM-BEI +17F9;N # KHMER SYMBOL LEK ATTAK PRAM-BUON +1800;N # MONGOLIAN BIRGA +1801;N # MONGOLIAN ELLIPSIS +1802;N # MONGOLIAN COMMA +1803;N # MONGOLIAN FULL STOP +1804;N # MONGOLIAN COLON +1805;N # MONGOLIAN FOUR DOTS +1806;N # MONGOLIAN TODO SOFT HYPHEN +1807;N # MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER +1808;N # MONGOLIAN MANCHU COMMA +1809;N # MONGOLIAN MANCHU FULL STOP +180A;N # MONGOLIAN NIRUGU +180B;N # MONGOLIAN FREE VARIATION SELECTOR ONE +180C;N # MONGOLIAN FREE VARIATION SELECTOR TWO +180D;N # MONGOLIAN FREE VARIATION SELECTOR THREE +180E;N # MONGOLIAN VOWEL SEPARATOR +1810;N # MONGOLIAN DIGIT ZERO +1811;N # MONGOLIAN DIGIT ONE +1812;N # MONGOLIAN DIGIT TWO +1813;N # MONGOLIAN DIGIT THREE +1814;N # MONGOLIAN DIGIT FOUR +1815;N # MONGOLIAN DIGIT FIVE +1816;N # MONGOLIAN DIGIT SIX +1817;N # MONGOLIAN DIGIT SEVEN +1818;N # MONGOLIAN DIGIT EIGHT +1819;N # MONGOLIAN DIGIT NINE +1820;N # MONGOLIAN LETTER A +1821;N # MONGOLIAN LETTER E +1822;N # MONGOLIAN LETTER I +1823;N # MONGOLIAN LETTER O +1824;N # MONGOLIAN LETTER U +1825;N # MONGOLIAN LETTER OE +1826;N # MONGOLIAN LETTER UE +1827;N # MONGOLIAN LETTER EE +1828;N # MONGOLIAN LETTER NA +1829;N # MONGOLIAN LETTER ANG +182A;N # MONGOLIAN LETTER BA +182B;N # MONGOLIAN LETTER PA +182C;N # MONGOLIAN LETTER QA +182D;N # MONGOLIAN LETTER GA +182E;N # MONGOLIAN LETTER MA +182F;N # MONGOLIAN LETTER LA +1830;N # MONGOLIAN LETTER SA +1831;N # MONGOLIAN LETTER SHA +1832;N # MONGOLIAN LETTER TA +1833;N # MONGOLIAN LETTER DA +1834;N # MONGOLIAN LETTER CHA +1835;N # MONGOLIAN LETTER JA +1836;N # MONGOLIAN LETTER YA +1837;N # MONGOLIAN LETTER RA +1838;N # MONGOLIAN LETTER WA +1839;N # MONGOLIAN LETTER FA +183A;N # MONGOLIAN LETTER KA +183B;N # MONGOLIAN LETTER KHA +183C;N # MONGOLIAN LETTER TSA +183D;N # MONGOLIAN LETTER ZA +183E;N # MONGOLIAN LETTER HAA +183F;N # MONGOLIAN LETTER ZRA +1840;N # MONGOLIAN LETTER LHA +1841;N # MONGOLIAN LETTER ZHI +1842;N # MONGOLIAN LETTER CHI +1843;N # MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844;N # MONGOLIAN LETTER TODO E +1845;N # MONGOLIAN LETTER TODO I +1846;N # MONGOLIAN LETTER TODO O +1847;N # MONGOLIAN LETTER TODO U +1848;N # MONGOLIAN LETTER TODO OE +1849;N # MONGOLIAN LETTER TODO UE +184A;N # MONGOLIAN LETTER TODO ANG +184B;N # MONGOLIAN LETTER TODO BA +184C;N # MONGOLIAN LETTER TODO PA +184D;N # MONGOLIAN LETTER TODO QA +184E;N # MONGOLIAN LETTER TODO GA +184F;N # MONGOLIAN LETTER TODO MA +1850;N # MONGOLIAN LETTER TODO TA +1851;N # MONGOLIAN LETTER TODO DA +1852;N # MONGOLIAN LETTER TODO CHA +1853;N # MONGOLIAN LETTER TODO JA +1854;N # MONGOLIAN LETTER TODO TSA +1855;N # MONGOLIAN LETTER TODO YA +1856;N # MONGOLIAN LETTER TODO WA +1857;N # MONGOLIAN LETTER TODO KA +1858;N # MONGOLIAN LETTER TODO GAA +1859;N # MONGOLIAN LETTER TODO HAA +185A;N # MONGOLIAN LETTER TODO JIA +185B;N # MONGOLIAN LETTER TODO NIA +185C;N # MONGOLIAN LETTER TODO DZA +185D;N # MONGOLIAN LETTER SIBE E +185E;N # MONGOLIAN LETTER SIBE I +185F;N # MONGOLIAN LETTER SIBE IY +1860;N # MONGOLIAN LETTER SIBE UE +1861;N # MONGOLIAN LETTER SIBE U +1862;N # MONGOLIAN LETTER SIBE ANG +1863;N # MONGOLIAN LETTER SIBE KA +1864;N # MONGOLIAN LETTER SIBE GA +1865;N # MONGOLIAN LETTER SIBE HA +1866;N # MONGOLIAN LETTER SIBE PA +1867;N # MONGOLIAN LETTER SIBE SHA +1868;N # MONGOLIAN LETTER SIBE TA +1869;N # MONGOLIAN LETTER SIBE DA +186A;N # MONGOLIAN LETTER SIBE JA +186B;N # MONGOLIAN LETTER SIBE FA +186C;N # MONGOLIAN LETTER SIBE GAA +186D;N # MONGOLIAN LETTER SIBE HAA +186E;N # MONGOLIAN LETTER SIBE TSA +186F;N # MONGOLIAN LETTER SIBE ZA +1870;N # MONGOLIAN LETTER SIBE RAA +1871;N # MONGOLIAN LETTER SIBE CHA +1872;N # MONGOLIAN LETTER SIBE ZHA +1873;N # MONGOLIAN LETTER MANCHU I +1874;N # MONGOLIAN LETTER MANCHU KA +1875;N # MONGOLIAN LETTER MANCHU RA +1876;N # MONGOLIAN LETTER MANCHU FA +1877;N # MONGOLIAN LETTER MANCHU ZHA +1880;N # MONGOLIAN LETTER ALI GALI ANUSVARA ONE +1881;N # MONGOLIAN LETTER ALI GALI VISARGA ONE +1882;N # MONGOLIAN LETTER ALI GALI DAMARU +1883;N # MONGOLIAN LETTER ALI GALI UBADAMA +1884;N # MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885;N # MONGOLIAN LETTER ALI GALI BALUDA +1886;N # MONGOLIAN LETTER ALI GALI THREE BALUDA +1887;N # MONGOLIAN LETTER ALI GALI A +1888;N # MONGOLIAN LETTER ALI GALI I +1889;N # MONGOLIAN LETTER ALI GALI KA +188A;N # MONGOLIAN LETTER ALI GALI NGA +188B;N # MONGOLIAN LETTER ALI GALI CA +188C;N # MONGOLIAN LETTER ALI GALI TTA +188D;N # MONGOLIAN LETTER ALI GALI TTHA +188E;N # MONGOLIAN LETTER ALI GALI DDA +188F;N # MONGOLIAN LETTER ALI GALI NNA +1890;N # MONGOLIAN LETTER ALI GALI TA +1891;N # MONGOLIAN LETTER ALI GALI DA +1892;N # MONGOLIAN LETTER ALI GALI PA +1893;N # MONGOLIAN LETTER ALI GALI PHA +1894;N # MONGOLIAN LETTER ALI GALI SSA +1895;N # MONGOLIAN LETTER ALI GALI ZHA +1896;N # MONGOLIAN LETTER ALI GALI ZA +1897;N # MONGOLIAN LETTER ALI GALI AH +1898;N # MONGOLIAN LETTER TODO ALI GALI TA +1899;N # MONGOLIAN LETTER TODO ALI GALI ZHA +189A;N # MONGOLIAN LETTER MANCHU ALI GALI GHA +189B;N # MONGOLIAN LETTER MANCHU ALI GALI NGA +189C;N # MONGOLIAN LETTER MANCHU ALI GALI CA +189D;N # MONGOLIAN LETTER MANCHU ALI GALI JHA +189E;N # MONGOLIAN LETTER MANCHU ALI GALI TTA +189F;N # MONGOLIAN LETTER MANCHU ALI GALI DDHA +18A0;N # MONGOLIAN LETTER MANCHU ALI GALI TA +18A1;N # MONGOLIAN LETTER MANCHU ALI GALI DHA +18A2;N # MONGOLIAN LETTER MANCHU ALI GALI SSA +18A3;N # MONGOLIAN LETTER MANCHU ALI GALI CYA +18A4;N # MONGOLIAN LETTER MANCHU ALI GALI ZHA +18A5;N # MONGOLIAN LETTER MANCHU ALI GALI ZA +18A6;N # MONGOLIAN LETTER ALI GALI HALF U +18A7;N # MONGOLIAN LETTER ALI GALI HALF YA +18A8;N # MONGOLIAN LETTER MANCHU ALI GALI BHA +18A9;N # MONGOLIAN LETTER ALI GALI DAGALGA +1900;N # LIMBU VOWEL-CARRIER LETTER +1901;N # LIMBU LETTER KA +1902;N # LIMBU LETTER KHA +1903;N # LIMBU LETTER GA +1904;N # LIMBU LETTER GHA +1905;N # LIMBU LETTER NGA +1906;N # LIMBU LETTER CA +1907;N # LIMBU LETTER CHA +1908;N # LIMBU LETTER JA +1909;N # LIMBU LETTER JHA +190A;N # LIMBU LETTER YAN +190B;N # LIMBU LETTER TA +190C;N # LIMBU LETTER THA +190D;N # LIMBU LETTER DA +190E;N # LIMBU LETTER DHA +190F;N # LIMBU LETTER NA +1910;N # LIMBU LETTER PA +1911;N # LIMBU LETTER PHA +1912;N # LIMBU LETTER BA +1913;N # LIMBU LETTER BHA +1914;N # LIMBU LETTER MA +1915;N # LIMBU LETTER YA +1916;N # LIMBU LETTER RA +1917;N # LIMBU LETTER LA +1918;N # LIMBU LETTER WA +1919;N # LIMBU LETTER SHA +191A;N # LIMBU LETTER SSA +191B;N # LIMBU LETTER SA +191C;N # LIMBU LETTER HA +1920;N # LIMBU VOWEL SIGN A +1921;N # LIMBU VOWEL SIGN I +1922;N # LIMBU VOWEL SIGN U +1923;N # LIMBU VOWEL SIGN EE +1924;N # LIMBU VOWEL SIGN AI +1925;N # LIMBU VOWEL SIGN OO +1926;N # LIMBU VOWEL SIGN AU +1927;N # LIMBU VOWEL SIGN E +1928;N # LIMBU VOWEL SIGN O +1929;N # LIMBU SUBJOINED LETTER YA +192A;N # LIMBU SUBJOINED LETTER RA +192B;N # LIMBU SUBJOINED LETTER WA +1930;N # LIMBU SMALL LETTER KA +1931;N # LIMBU SMALL LETTER NGA +1932;N # LIMBU SMALL LETTER ANUSVARA +1933;N # LIMBU SMALL LETTER TA +1934;N # LIMBU SMALL LETTER NA +1935;N # LIMBU SMALL LETTER PA +1936;N # LIMBU SMALL LETTER MA +1937;N # LIMBU SMALL LETTER RA +1938;N # LIMBU SMALL LETTER LA +1939;N # LIMBU SIGN MUKPHRENG +193A;N # LIMBU SIGN KEMPHRENG +193B;N # LIMBU SIGN SA-I +1940;N # LIMBU SIGN LOO +1944;N # LIMBU EXCLAMATION MARK +1945;N # LIMBU QUESTION MARK +1946;N # LIMBU DIGIT ZERO +1947;N # LIMBU DIGIT ONE +1948;N # LIMBU DIGIT TWO +1949;N # LIMBU DIGIT THREE +194A;N # LIMBU DIGIT FOUR +194B;N # LIMBU DIGIT FIVE +194C;N # LIMBU DIGIT SIX +194D;N # LIMBU DIGIT SEVEN +194E;N # LIMBU DIGIT EIGHT +194F;N # LIMBU DIGIT NINE +1950;N # TAI LE LETTER KA +1951;N # TAI LE LETTER XA +1952;N # TAI LE LETTER NGA +1953;N # TAI LE LETTER TSA +1954;N # TAI LE LETTER SA +1955;N # TAI LE LETTER YA +1956;N # TAI LE LETTER TA +1957;N # TAI LE LETTER THA +1958;N # TAI LE LETTER LA +1959;N # TAI LE LETTER PA +195A;N # TAI LE LETTER PHA +195B;N # TAI LE LETTER MA +195C;N # TAI LE LETTER FA +195D;N # TAI LE LETTER VA +195E;N # TAI LE LETTER HA +195F;N # TAI LE LETTER QA +1960;N # TAI LE LETTER KHA +1961;N # TAI LE LETTER TSHA +1962;N # TAI LE LETTER NA +1963;N # TAI LE LETTER A +1964;N # TAI LE LETTER I +1965;N # TAI LE LETTER EE +1966;N # TAI LE LETTER EH +1967;N # TAI LE LETTER U +1968;N # TAI LE LETTER OO +1969;N # TAI LE LETTER O +196A;N # TAI LE LETTER UE +196B;N # TAI LE LETTER E +196C;N # TAI LE LETTER AUE +196D;N # TAI LE LETTER AI +1970;N # TAI LE LETTER TONE-2 +1971;N # TAI LE LETTER TONE-3 +1972;N # TAI LE LETTER TONE-4 +1973;N # TAI LE LETTER TONE-5 +1974;N # TAI LE LETTER TONE-6 +1980;N # NEW TAI LUE LETTER HIGH QA +1981;N # NEW TAI LUE LETTER LOW QA +1982;N # NEW TAI LUE LETTER HIGH KA +1983;N # NEW TAI LUE LETTER HIGH XA +1984;N # NEW TAI LUE LETTER HIGH NGA +1985;N # NEW TAI LUE LETTER LOW KA +1986;N # NEW TAI LUE LETTER LOW XA +1987;N # NEW TAI LUE LETTER LOW NGA +1988;N # NEW TAI LUE LETTER HIGH TSA +1989;N # NEW TAI LUE LETTER HIGH SA +198A;N # NEW TAI LUE LETTER HIGH YA +198B;N # NEW TAI LUE LETTER LOW TSA +198C;N # NEW TAI LUE LETTER LOW SA +198D;N # NEW TAI LUE LETTER LOW YA +198E;N # NEW TAI LUE LETTER HIGH TA +198F;N # NEW TAI LUE LETTER HIGH THA +1990;N # NEW TAI LUE LETTER HIGH NA +1991;N # NEW TAI LUE LETTER LOW TA +1992;N # NEW TAI LUE LETTER LOW THA +1993;N # NEW TAI LUE LETTER LOW NA +1994;N # NEW TAI LUE LETTER HIGH PA +1995;N # NEW TAI LUE LETTER HIGH PHA +1996;N # NEW TAI LUE LETTER HIGH MA +1997;N # NEW TAI LUE LETTER LOW PA +1998;N # NEW TAI LUE LETTER LOW PHA +1999;N # NEW TAI LUE LETTER LOW MA +199A;N # NEW TAI LUE LETTER HIGH FA +199B;N # NEW TAI LUE LETTER HIGH VA +199C;N # NEW TAI LUE LETTER HIGH LA +199D;N # NEW TAI LUE LETTER LOW FA +199E;N # NEW TAI LUE LETTER LOW VA +199F;N # NEW TAI LUE LETTER LOW LA +19A0;N # NEW TAI LUE LETTER HIGH HA +19A1;N # NEW TAI LUE LETTER HIGH DA +19A2;N # NEW TAI LUE LETTER HIGH BA +19A3;N # NEW TAI LUE LETTER LOW HA +19A4;N # NEW TAI LUE LETTER LOW DA +19A5;N # NEW TAI LUE LETTER LOW BA +19A6;N # NEW TAI LUE LETTER HIGH KVA +19A7;N # NEW TAI LUE LETTER HIGH XVA +19A8;N # NEW TAI LUE LETTER LOW KVA +19A9;N # NEW TAI LUE LETTER LOW XVA +19B0;N # NEW TAI LUE VOWEL SIGN VOWEL SHORTENER +19B1;N # NEW TAI LUE VOWEL SIGN AA +19B2;N # NEW TAI LUE VOWEL SIGN II +19B3;N # NEW TAI LUE VOWEL SIGN U +19B4;N # NEW TAI LUE VOWEL SIGN UU +19B5;N # NEW TAI LUE VOWEL SIGN E +19B6;N # NEW TAI LUE VOWEL SIGN AE +19B7;N # NEW TAI LUE VOWEL SIGN O +19B8;N # NEW TAI LUE VOWEL SIGN OA +19B9;N # NEW TAI LUE VOWEL SIGN UE +19BA;N # NEW TAI LUE VOWEL SIGN AY +19BB;N # NEW TAI LUE VOWEL SIGN AAY +19BC;N # NEW TAI LUE VOWEL SIGN UY +19BD;N # NEW TAI LUE VOWEL SIGN OY +19BE;N # NEW TAI LUE VOWEL SIGN OAY +19BF;N # NEW TAI LUE VOWEL SIGN UEY +19C0;N # NEW TAI LUE VOWEL SIGN IY +19C1;N # NEW TAI LUE LETTER FINAL V +19C2;N # NEW TAI LUE LETTER FINAL NG +19C3;N # NEW TAI LUE LETTER FINAL N +19C4;N # NEW TAI LUE LETTER FINAL M +19C5;N # NEW TAI LUE LETTER FINAL K +19C6;N # NEW TAI LUE LETTER FINAL D +19C7;N # NEW TAI LUE LETTER FINAL B +19C8;N # NEW TAI LUE TONE MARK-1 +19C9;N # NEW TAI LUE TONE MARK-2 +19D0;N # NEW TAI LUE DIGIT ZERO +19D1;N # NEW TAI LUE DIGIT ONE +19D2;N # NEW TAI LUE DIGIT TWO +19D3;N # NEW TAI LUE DIGIT THREE +19D4;N # NEW TAI LUE DIGIT FOUR +19D5;N # NEW TAI LUE DIGIT FIVE +19D6;N # NEW TAI LUE DIGIT SIX +19D7;N # NEW TAI LUE DIGIT SEVEN +19D8;N # NEW TAI LUE DIGIT EIGHT +19D9;N # NEW TAI LUE DIGIT NINE +19DE;N # NEW TAI LUE SIGN LAE +19DF;N # NEW TAI LUE SIGN LAEV +19E0;N # KHMER SYMBOL PATHAMASAT +19E1;N # KHMER SYMBOL MUOY KOET +19E2;N # KHMER SYMBOL PII KOET +19E3;N # KHMER SYMBOL BEI KOET +19E4;N # KHMER SYMBOL BUON KOET +19E5;N # KHMER SYMBOL PRAM KOET +19E6;N # KHMER SYMBOL PRAM-MUOY KOET +19E7;N # KHMER SYMBOL PRAM-PII KOET +19E8;N # KHMER SYMBOL PRAM-BEI KOET +19E9;N # KHMER SYMBOL PRAM-BUON KOET +19EA;N # KHMER SYMBOL DAP KOET +19EB;N # KHMER SYMBOL DAP-MUOY KOET +19EC;N # KHMER SYMBOL DAP-PII KOET +19ED;N # KHMER SYMBOL DAP-BEI KOET +19EE;N # KHMER SYMBOL DAP-BUON KOET +19EF;N # KHMER SYMBOL DAP-PRAM KOET +19F0;N # KHMER SYMBOL TUTEYASAT +19F1;N # KHMER SYMBOL MUOY ROC +19F2;N # KHMER SYMBOL PII ROC +19F3;N # KHMER SYMBOL BEI ROC +19F4;N # KHMER SYMBOL BUON ROC +19F5;N # KHMER SYMBOL PRAM ROC +19F6;N # KHMER SYMBOL PRAM-MUOY ROC +19F7;N # KHMER SYMBOL PRAM-PII ROC +19F8;N # KHMER SYMBOL PRAM-BEI ROC +19F9;N # KHMER SYMBOL PRAM-BUON ROC +19FA;N # KHMER SYMBOL DAP ROC +19FB;N # KHMER SYMBOL DAP-MUOY ROC +19FC;N # KHMER SYMBOL DAP-PII ROC +19FD;N # KHMER SYMBOL DAP-BEI ROC +19FE;N # KHMER SYMBOL DAP-BUON ROC +19FF;N # KHMER SYMBOL DAP-PRAM ROC +1A00;N # BUGINESE LETTER KA +1A01;N # BUGINESE LETTER GA +1A02;N # BUGINESE LETTER NGA +1A03;N # BUGINESE LETTER NGKA +1A04;N # BUGINESE LETTER PA +1A05;N # BUGINESE LETTER BA +1A06;N # BUGINESE LETTER MA +1A07;N # BUGINESE LETTER MPA +1A08;N # BUGINESE LETTER TA +1A09;N # BUGINESE LETTER DA +1A0A;N # BUGINESE LETTER NA +1A0B;N # BUGINESE LETTER NRA +1A0C;N # BUGINESE LETTER CA +1A0D;N # BUGINESE LETTER JA +1A0E;N # BUGINESE LETTER NYA +1A0F;N # BUGINESE LETTER NYCA +1A10;N # BUGINESE LETTER YA +1A11;N # BUGINESE LETTER RA +1A12;N # BUGINESE LETTER LA +1A13;N # BUGINESE LETTER VA +1A14;N # BUGINESE LETTER SA +1A15;N # BUGINESE LETTER A +1A16;N # BUGINESE LETTER HA +1A17;N # BUGINESE VOWEL SIGN I +1A18;N # BUGINESE VOWEL SIGN U +1A19;N # BUGINESE VOWEL SIGN E +1A1A;N # BUGINESE VOWEL SIGN O +1A1B;N # BUGINESE VOWEL SIGN AE +1A1E;N # BUGINESE PALLAWA +1A1F;N # BUGINESE END OF SECTION +1D00;N # LATIN LETTER SMALL CAPITAL A +1D01;N # LATIN LETTER SMALL CAPITAL AE +1D02;N # LATIN SMALL LETTER TURNED AE +1D03;N # LATIN LETTER SMALL CAPITAL BARRED B +1D04;N # LATIN LETTER SMALL CAPITAL C +1D05;N # LATIN LETTER SMALL CAPITAL D +1D06;N # LATIN LETTER SMALL CAPITAL ETH +1D07;N # LATIN LETTER SMALL CAPITAL E +1D08;N # LATIN SMALL LETTER TURNED OPEN E +1D09;N # LATIN SMALL LETTER TURNED I +1D0A;N # LATIN LETTER SMALL CAPITAL J +1D0B;N # LATIN LETTER SMALL CAPITAL K +1D0C;N # LATIN LETTER SMALL CAPITAL L WITH STROKE +1D0D;N # LATIN LETTER SMALL CAPITAL M +1D0E;N # LATIN LETTER SMALL CAPITAL REVERSED N +1D0F;N # LATIN LETTER SMALL CAPITAL O +1D10;N # LATIN LETTER SMALL CAPITAL OPEN O +1D11;N # LATIN SMALL LETTER SIDEWAYS O +1D12;N # LATIN SMALL LETTER SIDEWAYS OPEN O +1D13;N # LATIN SMALL LETTER SIDEWAYS O WITH STROKE +1D14;N # LATIN SMALL LETTER TURNED OE +1D15;N # LATIN LETTER SMALL CAPITAL OU +1D16;N # LATIN SMALL LETTER TOP HALF O +1D17;N # LATIN SMALL LETTER BOTTOM HALF O +1D18;N # LATIN LETTER SMALL CAPITAL P +1D19;N # LATIN LETTER SMALL CAPITAL REVERSED R +1D1A;N # LATIN LETTER SMALL CAPITAL TURNED R +1D1B;N # LATIN LETTER SMALL CAPITAL T +1D1C;N # LATIN LETTER SMALL CAPITAL U +1D1D;N # LATIN SMALL LETTER SIDEWAYS U +1D1E;N # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U +1D1F;N # LATIN SMALL LETTER SIDEWAYS TURNED M +1D20;N # LATIN LETTER SMALL CAPITAL V +1D21;N # LATIN LETTER SMALL CAPITAL W +1D22;N # LATIN LETTER SMALL CAPITAL Z +1D23;N # LATIN LETTER SMALL CAPITAL EZH +1D24;N # LATIN LETTER VOICED LARYNGEAL SPIRANT +1D25;N # LATIN LETTER AIN +1D26;N # GREEK LETTER SMALL CAPITAL GAMMA +1D27;N # GREEK LETTER SMALL CAPITAL LAMDA +1D28;N # GREEK LETTER SMALL CAPITAL PI +1D29;N # GREEK LETTER SMALL CAPITAL RHO +1D2A;N # GREEK LETTER SMALL CAPITAL PSI +1D2B;N # CYRILLIC LETTER SMALL CAPITAL EL +1D2C;N # MODIFIER LETTER CAPITAL A +1D2D;N # MODIFIER LETTER CAPITAL AE +1D2E;N # MODIFIER LETTER CAPITAL B +1D2F;N # MODIFIER LETTER CAPITAL BARRED B +1D30;N # MODIFIER LETTER CAPITAL D +1D31;N # MODIFIER LETTER CAPITAL E +1D32;N # MODIFIER LETTER CAPITAL REVERSED E +1D33;N # MODIFIER LETTER CAPITAL G +1D34;N # MODIFIER LETTER CAPITAL H +1D35;N # MODIFIER LETTER CAPITAL I +1D36;N # MODIFIER LETTER CAPITAL J +1D37;N # MODIFIER LETTER CAPITAL K +1D38;N # MODIFIER LETTER CAPITAL L +1D39;N # MODIFIER LETTER CAPITAL M +1D3A;N # MODIFIER LETTER CAPITAL N +1D3B;N # MODIFIER LETTER CAPITAL REVERSED N +1D3C;N # MODIFIER LETTER CAPITAL O +1D3D;N # MODIFIER LETTER CAPITAL OU +1D3E;N # MODIFIER LETTER CAPITAL P +1D3F;N # MODIFIER LETTER CAPITAL R +1D40;N # MODIFIER LETTER CAPITAL T +1D41;N # MODIFIER LETTER CAPITAL U +1D42;N # MODIFIER LETTER CAPITAL W +1D43;N # MODIFIER LETTER SMALL A +1D44;N # MODIFIER LETTER SMALL TURNED A +1D45;N # MODIFIER LETTER SMALL ALPHA +1D46;N # MODIFIER LETTER SMALL TURNED AE +1D47;N # MODIFIER LETTER SMALL B +1D48;N # MODIFIER LETTER SMALL D +1D49;N # MODIFIER LETTER SMALL E +1D4A;N # MODIFIER LETTER SMALL SCHWA +1D4B;N # MODIFIER LETTER SMALL OPEN E +1D4C;N # MODIFIER LETTER SMALL TURNED OPEN E +1D4D;N # MODIFIER LETTER SMALL G +1D4E;N # MODIFIER LETTER SMALL TURNED I +1D4F;N # MODIFIER LETTER SMALL K +1D50;N # MODIFIER LETTER SMALL M +1D51;N # MODIFIER LETTER SMALL ENG +1D52;N # MODIFIER LETTER SMALL O +1D53;N # MODIFIER LETTER SMALL OPEN O +1D54;N # MODIFIER LETTER SMALL TOP HALF O +1D55;N # MODIFIER LETTER SMALL BOTTOM HALF O +1D56;N # MODIFIER LETTER SMALL P +1D57;N # MODIFIER LETTER SMALL T +1D58;N # MODIFIER LETTER SMALL U +1D59;N # MODIFIER LETTER SMALL SIDEWAYS U +1D5A;N # MODIFIER LETTER SMALL TURNED M +1D5B;N # MODIFIER LETTER SMALL V +1D5C;N # MODIFIER LETTER SMALL AIN +1D5D;N # MODIFIER LETTER SMALL BETA +1D5E;N # MODIFIER LETTER SMALL GREEK GAMMA +1D5F;N # MODIFIER LETTER SMALL DELTA +1D60;N # MODIFIER LETTER SMALL GREEK PHI +1D61;N # MODIFIER LETTER SMALL CHI +1D62;N # LATIN SUBSCRIPT SMALL LETTER I +1D63;N # LATIN SUBSCRIPT SMALL LETTER R +1D64;N # LATIN SUBSCRIPT SMALL LETTER U +1D65;N # LATIN SUBSCRIPT SMALL LETTER V +1D66;N # GREEK SUBSCRIPT SMALL LETTER BETA +1D67;N # GREEK SUBSCRIPT SMALL LETTER GAMMA +1D68;N # GREEK SUBSCRIPT SMALL LETTER RHO +1D69;N # GREEK SUBSCRIPT SMALL LETTER PHI +1D6A;N # GREEK SUBSCRIPT SMALL LETTER CHI +1D6B;N # LATIN SMALL LETTER UE +1D6C;N # LATIN SMALL LETTER B WITH MIDDLE TILDE +1D6D;N # LATIN SMALL LETTER D WITH MIDDLE TILDE +1D6E;N # LATIN SMALL LETTER F WITH MIDDLE TILDE +1D6F;N # LATIN SMALL LETTER M WITH MIDDLE TILDE +1D70;N # LATIN SMALL LETTER N WITH MIDDLE TILDE +1D71;N # LATIN SMALL LETTER P WITH MIDDLE TILDE +1D72;N # LATIN SMALL LETTER R WITH MIDDLE TILDE +1D73;N # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE +1D74;N # LATIN SMALL LETTER S WITH MIDDLE TILDE +1D75;N # LATIN SMALL LETTER T WITH MIDDLE TILDE +1D76;N # LATIN SMALL LETTER Z WITH MIDDLE TILDE +1D77;N # LATIN SMALL LETTER TURNED G +1D78;N # MODIFIER LETTER CYRILLIC EN +1D79;N # LATIN SMALL LETTER INSULAR G +1D7A;N # LATIN SMALL LETTER TH WITH STRIKETHROUGH +1D7B;N # LATIN SMALL CAPITAL LETTER I WITH STROKE +1D7C;N # LATIN SMALL LETTER IOTA WITH STROKE +1D7D;N # LATIN SMALL LETTER P WITH STROKE +1D7E;N # LATIN SMALL CAPITAL LETTER U WITH STROKE +1D7F;N # LATIN SMALL LETTER UPSILON WITH STROKE +1D80;N # LATIN SMALL LETTER B WITH PALATAL HOOK +1D81;N # LATIN SMALL LETTER D WITH PALATAL HOOK +1D82;N # LATIN SMALL LETTER F WITH PALATAL HOOK +1D83;N # LATIN SMALL LETTER G WITH PALATAL HOOK +1D84;N # LATIN SMALL LETTER K WITH PALATAL HOOK +1D85;N # LATIN SMALL LETTER L WITH PALATAL HOOK +1D86;N # LATIN SMALL LETTER M WITH PALATAL HOOK +1D87;N # LATIN SMALL LETTER N WITH PALATAL HOOK +1D88;N # LATIN SMALL LETTER P WITH PALATAL HOOK +1D89;N # LATIN SMALL LETTER R WITH PALATAL HOOK +1D8A;N # LATIN SMALL LETTER S WITH PALATAL HOOK +1D8B;N # LATIN SMALL LETTER ESH WITH PALATAL HOOK +1D8C;N # LATIN SMALL LETTER V WITH PALATAL HOOK +1D8D;N # LATIN SMALL LETTER X WITH PALATAL HOOK +1D8E;N # LATIN SMALL LETTER Z WITH PALATAL HOOK +1D8F;N # LATIN SMALL LETTER A WITH RETROFLEX HOOK +1D90;N # LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK +1D91;N # LATIN SMALL LETTER D WITH HOOK AND TAIL +1D92;N # LATIN SMALL LETTER E WITH RETROFLEX HOOK +1D93;N # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK +1D94;N # LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK +1D95;N # LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK +1D96;N # LATIN SMALL LETTER I WITH RETROFLEX HOOK +1D97;N # LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK +1D98;N # LATIN SMALL LETTER ESH WITH RETROFLEX HOOK +1D99;N # LATIN SMALL LETTER U WITH RETROFLEX HOOK +1D9A;N # LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B;N # MODIFIER LETTER SMALL TURNED ALPHA +1D9C;N # MODIFIER LETTER SMALL C +1D9D;N # MODIFIER LETTER SMALL C WITH CURL +1D9E;N # MODIFIER LETTER SMALL ETH +1D9F;N # MODIFIER LETTER SMALL REVERSED OPEN E +1DA0;N # MODIFIER LETTER SMALL F +1DA1;N # MODIFIER LETTER SMALL DOTLESS J WITH STROKE +1DA2;N # MODIFIER LETTER SMALL SCRIPT G +1DA3;N # MODIFIER LETTER SMALL TURNED H +1DA4;N # MODIFIER LETTER SMALL I WITH STROKE +1DA5;N # MODIFIER LETTER SMALL IOTA +1DA6;N # MODIFIER LETTER SMALL CAPITAL I +1DA7;N # MODIFIER LETTER SMALL CAPITAL I WITH STROKE +1DA8;N # MODIFIER LETTER SMALL J WITH CROSSED-TAIL +1DA9;N # MODIFIER LETTER SMALL L WITH RETROFLEX HOOK +1DAA;N # MODIFIER LETTER SMALL L WITH PALATAL HOOK +1DAB;N # MODIFIER LETTER SMALL CAPITAL L +1DAC;N # MODIFIER LETTER SMALL M WITH HOOK +1DAD;N # MODIFIER LETTER SMALL TURNED M WITH LONG LEG +1DAE;N # MODIFIER LETTER SMALL N WITH LEFT HOOK +1DAF;N # MODIFIER LETTER SMALL N WITH RETROFLEX HOOK +1DB0;N # MODIFIER LETTER SMALL CAPITAL N +1DB1;N # MODIFIER LETTER SMALL BARRED O +1DB2;N # MODIFIER LETTER SMALL PHI +1DB3;N # MODIFIER LETTER SMALL S WITH HOOK +1DB4;N # MODIFIER LETTER SMALL ESH +1DB5;N # MODIFIER LETTER SMALL T WITH PALATAL HOOK +1DB6;N # MODIFIER LETTER SMALL U BAR +1DB7;N # MODIFIER LETTER SMALL UPSILON +1DB8;N # MODIFIER LETTER SMALL CAPITAL U +1DB9;N # MODIFIER LETTER SMALL V WITH HOOK +1DBA;N # MODIFIER LETTER SMALL TURNED V +1DBB;N # MODIFIER LETTER SMALL Z +1DBC;N # MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK +1DBD;N # MODIFIER LETTER SMALL Z WITH CURL +1DBE;N # MODIFIER LETTER SMALL EZH +1DBF;N # MODIFIER LETTER SMALL THETA +1DC0;N # COMBINING DOTTED GRAVE ACCENT +1DC1;N # COMBINING DOTTED ACUTE ACCENT +1DC2;N # COMBINING SNAKE BELOW +1DC3;N # COMBINING SUSPENSION MARK +1E00;N # LATIN CAPITAL LETTER A WITH RING BELOW +1E01;N # LATIN SMALL LETTER A WITH RING BELOW +1E02;N # LATIN CAPITAL LETTER B WITH DOT ABOVE +1E03;N # LATIN SMALL LETTER B WITH DOT ABOVE +1E04;N # LATIN CAPITAL LETTER B WITH DOT BELOW +1E05;N # LATIN SMALL LETTER B WITH DOT BELOW +1E06;N # LATIN CAPITAL LETTER B WITH LINE BELOW +1E07;N # LATIN SMALL LETTER B WITH LINE BELOW +1E08;N # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +1E09;N # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +1E0A;N # LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0B;N # LATIN SMALL LETTER D WITH DOT ABOVE +1E0C;N # LATIN CAPITAL LETTER D WITH DOT BELOW +1E0D;N # LATIN SMALL LETTER D WITH DOT BELOW +1E0E;N # LATIN CAPITAL LETTER D WITH LINE BELOW +1E0F;N # LATIN SMALL LETTER D WITH LINE BELOW +1E10;N # LATIN CAPITAL LETTER D WITH CEDILLA +1E11;N # LATIN SMALL LETTER D WITH CEDILLA +1E12;N # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E13;N # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +1E14;N # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1E15;N # LATIN SMALL LETTER E WITH MACRON AND GRAVE +1E16;N # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E17;N # LATIN SMALL LETTER E WITH MACRON AND ACUTE +1E18;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E19;N # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +1E1A;N # LATIN CAPITAL LETTER E WITH TILDE BELOW +1E1B;N # LATIN SMALL LETTER E WITH TILDE BELOW +1E1C;N # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +1E1D;N # LATIN SMALL LETTER E WITH CEDILLA AND BREVE +1E1E;N # LATIN CAPITAL LETTER F WITH DOT ABOVE +1E1F;N # LATIN SMALL LETTER F WITH DOT ABOVE +1E20;N # LATIN CAPITAL LETTER G WITH MACRON +1E21;N # LATIN SMALL LETTER G WITH MACRON +1E22;N # LATIN CAPITAL LETTER H WITH DOT ABOVE +1E23;N # LATIN SMALL LETTER H WITH DOT ABOVE +1E24;N # LATIN CAPITAL LETTER H WITH DOT BELOW +1E25;N # LATIN SMALL LETTER H WITH DOT BELOW +1E26;N # LATIN CAPITAL LETTER H WITH DIAERESIS +1E27;N # LATIN SMALL LETTER H WITH DIAERESIS +1E28;N # LATIN CAPITAL LETTER H WITH CEDILLA +1E29;N # LATIN SMALL LETTER H WITH CEDILLA +1E2A;N # LATIN CAPITAL LETTER H WITH BREVE BELOW +1E2B;N # LATIN SMALL LETTER H WITH BREVE BELOW +1E2C;N # LATIN CAPITAL LETTER I WITH TILDE BELOW +1E2D;N # LATIN SMALL LETTER I WITH TILDE BELOW +1E2E;N # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +1E2F;N # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +1E30;N # LATIN CAPITAL LETTER K WITH ACUTE +1E31;N # LATIN SMALL LETTER K WITH ACUTE +1E32;N # LATIN CAPITAL LETTER K WITH DOT BELOW +1E33;N # LATIN SMALL LETTER K WITH DOT BELOW +1E34;N # LATIN CAPITAL LETTER K WITH LINE BELOW +1E35;N # LATIN SMALL LETTER K WITH LINE BELOW +1E36;N # LATIN CAPITAL LETTER L WITH DOT BELOW +1E37;N # LATIN SMALL LETTER L WITH DOT BELOW +1E38;N # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E39;N # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +1E3A;N # LATIN CAPITAL LETTER L WITH LINE BELOW +1E3B;N # LATIN SMALL LETTER L WITH LINE BELOW +1E3C;N # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3D;N # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +1E3E;N # LATIN CAPITAL LETTER M WITH ACUTE +1E3F;N # LATIN SMALL LETTER M WITH ACUTE +1E40;N # LATIN CAPITAL LETTER M WITH DOT ABOVE +1E41;N # LATIN SMALL LETTER M WITH DOT ABOVE +1E42;N # LATIN CAPITAL LETTER M WITH DOT BELOW +1E43;N # LATIN SMALL LETTER M WITH DOT BELOW +1E44;N # LATIN CAPITAL LETTER N WITH DOT ABOVE +1E45;N # LATIN SMALL LETTER N WITH DOT ABOVE +1E46;N # LATIN CAPITAL LETTER N WITH DOT BELOW +1E47;N # LATIN SMALL LETTER N WITH DOT BELOW +1E48;N # LATIN CAPITAL LETTER N WITH LINE BELOW +1E49;N # LATIN SMALL LETTER N WITH LINE BELOW +1E4A;N # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E4B;N # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +1E4C;N # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4D;N # LATIN SMALL LETTER O WITH TILDE AND ACUTE +1E4E;N # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +1E4F;N # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +1E50;N # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1E51;N # LATIN SMALL LETTER O WITH MACRON AND GRAVE +1E52;N # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E53;N # LATIN SMALL LETTER O WITH MACRON AND ACUTE +1E54;N # LATIN CAPITAL LETTER P WITH ACUTE +1E55;N # LATIN SMALL LETTER P WITH ACUTE +1E56;N # LATIN CAPITAL LETTER P WITH DOT ABOVE +1E57;N # LATIN SMALL LETTER P WITH DOT ABOVE +1E58;N # LATIN CAPITAL LETTER R WITH DOT ABOVE +1E59;N # LATIN SMALL LETTER R WITH DOT ABOVE +1E5A;N # LATIN CAPITAL LETTER R WITH DOT BELOW +1E5B;N # LATIN SMALL LETTER R WITH DOT BELOW +1E5C;N # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5D;N # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +1E5E;N # LATIN CAPITAL LETTER R WITH LINE BELOW +1E5F;N # LATIN SMALL LETTER R WITH LINE BELOW +1E60;N # LATIN CAPITAL LETTER S WITH DOT ABOVE +1E61;N # LATIN SMALL LETTER S WITH DOT ABOVE +1E62;N # LATIN CAPITAL LETTER S WITH DOT BELOW +1E63;N # LATIN SMALL LETTER S WITH DOT BELOW +1E64;N # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +1E65;N # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +1E66;N # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E67;N # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +1E68;N # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +1E69;N # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6A;N # LATIN CAPITAL LETTER T WITH DOT ABOVE +1E6B;N # LATIN SMALL LETTER T WITH DOT ABOVE +1E6C;N # LATIN CAPITAL LETTER T WITH DOT BELOW +1E6D;N # LATIN SMALL LETTER T WITH DOT BELOW +1E6E;N # LATIN CAPITAL LETTER T WITH LINE BELOW +1E6F;N # LATIN SMALL LETTER T WITH LINE BELOW +1E70;N # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E71;N # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +1E72;N # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E73;N # LATIN SMALL LETTER U WITH DIAERESIS BELOW +1E74;N # LATIN CAPITAL LETTER U WITH TILDE BELOW +1E75;N # LATIN SMALL LETTER U WITH TILDE BELOW +1E76;N # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E77;N # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +1E78;N # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +1E79;N # LATIN SMALL LETTER U WITH TILDE AND ACUTE +1E7A;N # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1E7B;N # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +1E7C;N # LATIN CAPITAL LETTER V WITH TILDE +1E7D;N # LATIN SMALL LETTER V WITH TILDE +1E7E;N # LATIN CAPITAL LETTER V WITH DOT BELOW +1E7F;N # LATIN SMALL LETTER V WITH DOT BELOW +1E80;N # LATIN CAPITAL LETTER W WITH GRAVE +1E81;N # LATIN SMALL LETTER W WITH GRAVE +1E82;N # LATIN CAPITAL LETTER W WITH ACUTE +1E83;N # LATIN SMALL LETTER W WITH ACUTE +1E84;N # LATIN CAPITAL LETTER W WITH DIAERESIS +1E85;N # LATIN SMALL LETTER W WITH DIAERESIS +1E86;N # LATIN CAPITAL LETTER W WITH DOT ABOVE +1E87;N # LATIN SMALL LETTER W WITH DOT ABOVE +1E88;N # LATIN CAPITAL LETTER W WITH DOT BELOW +1E89;N # LATIN SMALL LETTER W WITH DOT BELOW +1E8A;N # LATIN CAPITAL LETTER X WITH DOT ABOVE +1E8B;N # LATIN SMALL LETTER X WITH DOT ABOVE +1E8C;N # LATIN CAPITAL LETTER X WITH DIAERESIS +1E8D;N # LATIN SMALL LETTER X WITH DIAERESIS +1E8E;N # LATIN CAPITAL LETTER Y WITH DOT ABOVE +1E8F;N # LATIN SMALL LETTER Y WITH DOT ABOVE +1E90;N # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +1E91;N # LATIN SMALL LETTER Z WITH CIRCUMFLEX +1E92;N # LATIN CAPITAL LETTER Z WITH DOT BELOW +1E93;N # LATIN SMALL LETTER Z WITH DOT BELOW +1E94;N # LATIN CAPITAL LETTER Z WITH LINE BELOW +1E95;N # LATIN SMALL LETTER Z WITH LINE BELOW +1E96;N # LATIN SMALL LETTER H WITH LINE BELOW +1E97;N # LATIN SMALL LETTER T WITH DIAERESIS +1E98;N # LATIN SMALL LETTER W WITH RING ABOVE +1E99;N # LATIN SMALL LETTER Y WITH RING ABOVE +1E9A;N # LATIN SMALL LETTER A WITH RIGHT HALF RING +1E9B;N # LATIN SMALL LETTER LONG S WITH DOT ABOVE +1EA0;N # LATIN CAPITAL LETTER A WITH DOT BELOW +1EA1;N # LATIN SMALL LETTER A WITH DOT BELOW +1EA2;N # LATIN CAPITAL LETTER A WITH HOOK ABOVE +1EA3;N # LATIN SMALL LETTER A WITH HOOK ABOVE +1EA4;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA5;N # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA6;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA7;N # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA8;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EA9;N # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAA;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EAB;N # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +1EAC;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAD;N # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAE;N # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EAF;N # LATIN SMALL LETTER A WITH BREVE AND ACUTE +1EB0;N # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB1;N # LATIN SMALL LETTER A WITH BREVE AND GRAVE +1EB2;N # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +1EB3;N # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +1EB4;N # LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB5;N # LATIN SMALL LETTER A WITH BREVE AND TILDE +1EB6;N # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EB7;N # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +1EB8;N # LATIN CAPITAL LETTER E WITH DOT BELOW +1EB9;N # LATIN SMALL LETTER E WITH DOT BELOW +1EBA;N # LATIN CAPITAL LETTER E WITH HOOK ABOVE +1EBB;N # LATIN SMALL LETTER E WITH HOOK ABOVE +1EBC;N # LATIN CAPITAL LETTER E WITH TILDE +1EBD;N # LATIN SMALL LETTER E WITH TILDE +1EBE;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EBF;N # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC0;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC1;N # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC2;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC3;N # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC4;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC5;N # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +1EC6;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC7;N # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC8;N # LATIN CAPITAL LETTER I WITH HOOK ABOVE +1EC9;N # LATIN SMALL LETTER I WITH HOOK ABOVE +1ECA;N # LATIN CAPITAL LETTER I WITH DOT BELOW +1ECB;N # LATIN SMALL LETTER I WITH DOT BELOW +1ECC;N # LATIN CAPITAL LETTER O WITH DOT BELOW +1ECD;N # LATIN SMALL LETTER O WITH DOT BELOW +1ECE;N # LATIN CAPITAL LETTER O WITH HOOK ABOVE +1ECF;N # LATIN SMALL LETTER O WITH HOOK ABOVE +1ED0;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED1;N # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED2;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED3;N # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED4;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED5;N # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED6;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED7;N # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +1ED8;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1ED9;N # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDA;N # LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDB;N # LATIN SMALL LETTER O WITH HORN AND ACUTE +1EDC;N # LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EDD;N # LATIN SMALL LETTER O WITH HORN AND GRAVE +1EDE;N # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EDF;N # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +1EE0;N # LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EE1;N # LATIN SMALL LETTER O WITH HORN AND TILDE +1EE2;N # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1EE3;N # LATIN SMALL LETTER O WITH HORN AND DOT BELOW +1EE4;N # LATIN CAPITAL LETTER U WITH DOT BELOW +1EE5;N # LATIN SMALL LETTER U WITH DOT BELOW +1EE6;N # LATIN CAPITAL LETTER U WITH HOOK ABOVE +1EE7;N # LATIN SMALL LETTER U WITH HOOK ABOVE +1EE8;N # LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EE9;N # LATIN SMALL LETTER U WITH HORN AND ACUTE +1EEA;N # LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEB;N # LATIN SMALL LETTER U WITH HORN AND GRAVE +1EEC;N # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EED;N # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +1EEE;N # LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EEF;N # LATIN SMALL LETTER U WITH HORN AND TILDE +1EF0;N # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EF1;N # LATIN SMALL LETTER U WITH HORN AND DOT BELOW +1EF2;N # LATIN CAPITAL LETTER Y WITH GRAVE +1EF3;N # LATIN SMALL LETTER Y WITH GRAVE +1EF4;N # LATIN CAPITAL LETTER Y WITH DOT BELOW +1EF5;N # LATIN SMALL LETTER Y WITH DOT BELOW +1EF6;N # LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF7;N # LATIN SMALL LETTER Y WITH HOOK ABOVE +1EF8;N # LATIN CAPITAL LETTER Y WITH TILDE +1EF9;N # LATIN SMALL LETTER Y WITH TILDE +1F00;N # GREEK SMALL LETTER ALPHA WITH PSILI +1F01;N # GREEK SMALL LETTER ALPHA WITH DASIA +1F02;N # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA +1F03;N # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA +1F04;N # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA +1F05;N # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA +1F06;N # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F07;N # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F08;N # GREEK CAPITAL LETTER ALPHA WITH PSILI +1F09;N # GREEK CAPITAL LETTER ALPHA WITH DASIA +1F0A;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +1F0B;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +1F0C;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +1F0D;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +1F0E;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F0F;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F10;N # GREEK SMALL LETTER EPSILON WITH PSILI +1F11;N # GREEK SMALL LETTER EPSILON WITH DASIA +1F12;N # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA +1F13;N # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA +1F14;N # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA +1F15;N # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18;N # GREEK CAPITAL LETTER EPSILON WITH PSILI +1F19;N # GREEK CAPITAL LETTER EPSILON WITH DASIA +1F1A;N # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +1F1B;N # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +1F1C;N # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +1F1D;N # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20;N # GREEK SMALL LETTER ETA WITH PSILI +1F21;N # GREEK SMALL LETTER ETA WITH DASIA +1F22;N # GREEK SMALL LETTER ETA WITH PSILI AND VARIA +1F23;N # GREEK SMALL LETTER ETA WITH DASIA AND VARIA +1F24;N # GREEK SMALL LETTER ETA WITH PSILI AND OXIA +1F25;N # GREEK SMALL LETTER ETA WITH DASIA AND OXIA +1F26;N # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI +1F27;N # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI +1F28;N # GREEK CAPITAL LETTER ETA WITH PSILI +1F29;N # GREEK CAPITAL LETTER ETA WITH DASIA +1F2A;N # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +1F2B;N # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +1F2C;N # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +1F2D;N # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +1F2E;N # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +1F2F;N # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F30;N # GREEK SMALL LETTER IOTA WITH PSILI +1F31;N # GREEK SMALL LETTER IOTA WITH DASIA +1F32;N # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA +1F33;N # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA +1F34;N # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA +1F35;N # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA +1F36;N # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI +1F37;N # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI +1F38;N # GREEK CAPITAL LETTER IOTA WITH PSILI +1F39;N # GREEK CAPITAL LETTER IOTA WITH DASIA +1F3A;N # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +1F3B;N # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +1F3C;N # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +1F3D;N # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +1F3E;N # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +1F3F;N # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +1F40;N # GREEK SMALL LETTER OMICRON WITH PSILI +1F41;N # GREEK SMALL LETTER OMICRON WITH DASIA +1F42;N # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA +1F43;N # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA +1F44;N # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA +1F45;N # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48;N # GREEK CAPITAL LETTER OMICRON WITH PSILI +1F49;N # GREEK CAPITAL LETTER OMICRON WITH DASIA +1F4A;N # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +1F4B;N # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +1F4C;N # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +1F4D;N # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50;N # GREEK SMALL LETTER UPSILON WITH PSILI +1F51;N # GREEK SMALL LETTER UPSILON WITH DASIA +1F52;N # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F53;N # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA +1F54;N # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F55;N # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA +1F56;N # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1F57;N # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59;N # GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B;N # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D;N # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F;N # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F60;N # GREEK SMALL LETTER OMEGA WITH PSILI +1F61;N # GREEK SMALL LETTER OMEGA WITH DASIA +1F62;N # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA +1F63;N # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA +1F64;N # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA +1F65;N # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA +1F66;N # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F67;N # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F68;N # GREEK CAPITAL LETTER OMEGA WITH PSILI +1F69;N # GREEK CAPITAL LETTER OMEGA WITH DASIA +1F6A;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +1F6B;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +1F6C;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +1F6D;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +1F6E;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F6F;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F70;N # GREEK SMALL LETTER ALPHA WITH VARIA +1F71;N # GREEK SMALL LETTER ALPHA WITH OXIA +1F72;N # GREEK SMALL LETTER EPSILON WITH VARIA +1F73;N # GREEK SMALL LETTER EPSILON WITH OXIA +1F74;N # GREEK SMALL LETTER ETA WITH VARIA +1F75;N # GREEK SMALL LETTER ETA WITH OXIA +1F76;N # GREEK SMALL LETTER IOTA WITH VARIA +1F77;N # GREEK SMALL LETTER IOTA WITH OXIA +1F78;N # GREEK SMALL LETTER OMICRON WITH VARIA +1F79;N # GREEK SMALL LETTER OMICRON WITH OXIA +1F7A;N # GREEK SMALL LETTER UPSILON WITH VARIA +1F7B;N # GREEK SMALL LETTER UPSILON WITH OXIA +1F7C;N # GREEK SMALL LETTER OMEGA WITH VARIA +1F7D;N # GREEK SMALL LETTER OMEGA WITH OXIA +1F80;N # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F81;N # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F82;N # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F83;N # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F84;N # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F85;N # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F86;N # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F87;N # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F88;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F89;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F8A;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8B;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8C;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8D;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8E;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8F;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F90;N # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F91;N # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F92;N # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F93;N # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F94;N # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F95;N # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F96;N # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F97;N # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F98;N # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F99;N # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F9A;N # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9B;N # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9C;N # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9D;N # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9E;N # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9F;N # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA0;N # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA1;N # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA2;N # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FA3;N # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FA4;N # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FA5;N # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FA6;N # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FA7;N # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA8;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA9;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FAA;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAB;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAC;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAD;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAE;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAF;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB0;N # GREEK SMALL LETTER ALPHA WITH VRACHY +1FB1;N # GREEK SMALL LETTER ALPHA WITH MACRON +1FB2;N # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB3;N # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FB4;N # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6;N # GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FB7;N # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FB8;N # GREEK CAPITAL LETTER ALPHA WITH VRACHY +1FB9;N # GREEK CAPITAL LETTER ALPHA WITH MACRON +1FBA;N # GREEK CAPITAL LETTER ALPHA WITH VARIA +1FBB;N # GREEK CAPITAL LETTER ALPHA WITH OXIA +1FBC;N # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD;N # GREEK KORONIS +1FBE;N # GREEK PROSGEGRAMMENI +1FBF;N # GREEK PSILI +1FC0;N # GREEK PERISPOMENI +1FC1;N # GREEK DIALYTIKA AND PERISPOMENI +1FC2;N # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC3;N # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FC4;N # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6;N # GREEK SMALL LETTER ETA WITH PERISPOMENI +1FC7;N # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC8;N # GREEK CAPITAL LETTER EPSILON WITH VARIA +1FC9;N # GREEK CAPITAL LETTER EPSILON WITH OXIA +1FCA;N # GREEK CAPITAL LETTER ETA WITH VARIA +1FCB;N # GREEK CAPITAL LETTER ETA WITH OXIA +1FCC;N # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD;N # GREEK PSILI AND VARIA +1FCE;N # GREEK PSILI AND OXIA +1FCF;N # GREEK PSILI AND PERISPOMENI +1FD0;N # GREEK SMALL LETTER IOTA WITH VRACHY +1FD1;N # GREEK SMALL LETTER IOTA WITH MACRON +1FD2;N # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD3;N # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6;N # GREEK SMALL LETTER IOTA WITH PERISPOMENI +1FD7;N # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FD8;N # GREEK CAPITAL LETTER IOTA WITH VRACHY +1FD9;N # GREEK CAPITAL LETTER IOTA WITH MACRON +1FDA;N # GREEK CAPITAL LETTER IOTA WITH VARIA +1FDB;N # GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD;N # GREEK DASIA AND VARIA +1FDE;N # GREEK DASIA AND OXIA +1FDF;N # GREEK DASIA AND PERISPOMENI +1FE0;N # GREEK SMALL LETTER UPSILON WITH VRACHY +1FE1;N # GREEK SMALL LETTER UPSILON WITH MACRON +1FE2;N # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE3;N # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE4;N # GREEK SMALL LETTER RHO WITH PSILI +1FE5;N # GREEK SMALL LETTER RHO WITH DASIA +1FE6;N # GREEK SMALL LETTER UPSILON WITH PERISPOMENI +1FE7;N # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FE8;N # GREEK CAPITAL LETTER UPSILON WITH VRACHY +1FE9;N # GREEK CAPITAL LETTER UPSILON WITH MACRON +1FEA;N # GREEK CAPITAL LETTER UPSILON WITH VARIA +1FEB;N # GREEK CAPITAL LETTER UPSILON WITH OXIA +1FEC;N # GREEK CAPITAL LETTER RHO WITH DASIA +1FED;N # GREEK DIALYTIKA AND VARIA +1FEE;N # GREEK DIALYTIKA AND OXIA +1FEF;N # GREEK VARIA +1FF2;N # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF3;N # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FF4;N # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6;N # GREEK SMALL LETTER OMEGA WITH PERISPOMENI +1FF7;N # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF8;N # GREEK CAPITAL LETTER OMICRON WITH VARIA +1FF9;N # GREEK CAPITAL LETTER OMICRON WITH OXIA +1FFA;N # GREEK CAPITAL LETTER OMEGA WITH VARIA +1FFB;N # GREEK CAPITAL LETTER OMEGA WITH OXIA +1FFC;N # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD;N # GREEK OXIA +1FFE;N # GREEK DASIA +2000;N # EN QUAD +2001;N # EM QUAD +2002;N # EN SPACE +2003;N # EM SPACE +2004;N # THREE-PER-EM SPACE +2005;N # FOUR-PER-EM SPACE +2006;N # SIX-PER-EM SPACE +2007;N # FIGURE SPACE +2008;N # PUNCTUATION SPACE +2009;N # THIN SPACE +200A;N # HAIR SPACE +200B;N # ZERO WIDTH SPACE +200C;N # ZERO WIDTH NON-JOINER +200D;N # ZERO WIDTH JOINER +200E;N # LEFT-TO-RIGHT MARK +200F;N # RIGHT-TO-LEFT MARK +2010;A # HYPHEN +2011;N # NON-BREAKING HYPHEN +2012;N # FIGURE DASH +2013;A # EN DASH +2014;A # EM DASH +2015;A # HORIZONTAL BAR +2016;A # DOUBLE VERTICAL LINE +2017;N # DOUBLE LOW LINE +2018;A # LEFT SINGLE QUOTATION MARK +2019;A # RIGHT SINGLE QUOTATION MARK +201A;N # SINGLE LOW-9 QUOTATION MARK +201B;N # SINGLE HIGH-REVERSED-9 QUOTATION MARK +201C;A # LEFT DOUBLE QUOTATION MARK +201D;A # RIGHT DOUBLE QUOTATION MARK +201E;N # DOUBLE LOW-9 QUOTATION MARK +201F;N # DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020;A # DAGGER +2021;A # DOUBLE DAGGER +2022;A # BULLET +2023;N # TRIANGULAR BULLET +2024;A # ONE DOT LEADER +2025;A # TWO DOT LEADER +2026;A # HORIZONTAL ELLIPSIS +2027;A # HYPHENATION POINT +2028;N # LINE SEPARATOR +2029;N # PARAGRAPH SEPARATOR +202A;N # LEFT-TO-RIGHT EMBEDDING +202B;N # RIGHT-TO-LEFT EMBEDDING +202C;N # POP DIRECTIONAL FORMATTING +202D;N # LEFT-TO-RIGHT OVERRIDE +202E;N # RIGHT-TO-LEFT OVERRIDE +202F;N # NARROW NO-BREAK SPACE +2030;A # PER MILLE SIGN +2031;N # PER TEN THOUSAND SIGN +2032;A # PRIME +2033;A # DOUBLE PRIME +2034;N # TRIPLE PRIME +2035;A # REVERSED PRIME +2036;N # REVERSED DOUBLE PRIME +2037;N # REVERSED TRIPLE PRIME +2038;N # CARET +2039;N # SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A;N # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B;A # REFERENCE MARK +203C;N # DOUBLE EXCLAMATION MARK +203D;N # INTERROBANG +203E;A # OVERLINE +203F;N # UNDERTIE +2040;N # CHARACTER TIE +2041;N # CARET INSERTION POINT +2042;N # ASTERISM +2043;N # HYPHEN BULLET +2044;N # FRACTION SLASH +2045;N # LEFT SQUARE BRACKET WITH QUILL +2046;N # RIGHT SQUARE BRACKET WITH QUILL +2047;N # DOUBLE QUESTION MARK +2048;N # QUESTION EXCLAMATION MARK +2049;N # EXCLAMATION QUESTION MARK +204A;N # TIRONIAN SIGN ET +204B;N # REVERSED PILCROW SIGN +204C;N # BLACK LEFTWARDS BULLET +204D;N # BLACK RIGHTWARDS BULLET +204E;N # LOW ASTERISK +204F;N # REVERSED SEMICOLON +2050;N # CLOSE UP +2051;N # TWO ASTERISKS ALIGNED VERTICALLY +2052;N # COMMERCIAL MINUS SIGN +2053;N # SWUNG DASH +2054;N # INVERTED UNDERTIE +2055;N # FLOWER PUNCTUATION MARK +2056;N # THREE DOT PUNCTUATION +2057;N # QUADRUPLE PRIME +2058;N # FOUR DOT PUNCTUATION +2059;N # FIVE DOT PUNCTUATION +205A;N # TWO DOT PUNCTUATION +205B;N # FOUR DOT MARK +205C;N # DOTTED CROSS +205D;N # TRICOLON +205E;N # VERTICAL FOUR DOTS +205F;N # MEDIUM MATHEMATICAL SPACE +2060;N # WORD JOINER +2061;N # FUNCTION APPLICATION +2062;N # INVISIBLE TIMES +2063;N # INVISIBLE SEPARATOR +206A;N # INHIBIT SYMMETRIC SWAPPING +206B;N # ACTIVATE SYMMETRIC SWAPPING +206C;N # INHIBIT ARABIC FORM SHAPING +206D;N # ACTIVATE ARABIC FORM SHAPING +206E;N # NATIONAL DIGIT SHAPES +206F;N # NOMINAL DIGIT SHAPES +2070;N # SUPERSCRIPT ZERO +2071;N # SUPERSCRIPT LATIN SMALL LETTER I +2074;A # SUPERSCRIPT FOUR +2075;N # SUPERSCRIPT FIVE +2076;N # SUPERSCRIPT SIX +2077;N # SUPERSCRIPT SEVEN +2078;N # SUPERSCRIPT EIGHT +2079;N # SUPERSCRIPT NINE +207A;N # SUPERSCRIPT PLUS SIGN +207B;N # SUPERSCRIPT MINUS +207C;N # SUPERSCRIPT EQUALS SIGN +207D;N # SUPERSCRIPT LEFT PARENTHESIS +207E;N # SUPERSCRIPT RIGHT PARENTHESIS +207F;A # SUPERSCRIPT LATIN SMALL LETTER N +2080;N # SUBSCRIPT ZERO +2081;A # SUBSCRIPT ONE +2082;A # SUBSCRIPT TWO +2083;A # SUBSCRIPT THREE +2084;A # SUBSCRIPT FOUR +2085;N # SUBSCRIPT FIVE +2086;N # SUBSCRIPT SIX +2087;N # SUBSCRIPT SEVEN +2088;N # SUBSCRIPT EIGHT +2089;N # SUBSCRIPT NINE +208A;N # SUBSCRIPT PLUS SIGN +208B;N # SUBSCRIPT MINUS +208C;N # SUBSCRIPT EQUALS SIGN +208D;N # SUBSCRIPT LEFT PARENTHESIS +208E;N # SUBSCRIPT RIGHT PARENTHESIS +2090;N # LATIN SUBSCRIPT SMALL LETTER A +2091;N # LATIN SUBSCRIPT SMALL LETTER E +2092;N # LATIN SUBSCRIPT SMALL LETTER O +2093;N # LATIN SUBSCRIPT SMALL LETTER X +2094;N # LATIN SUBSCRIPT SMALL LETTER SCHWA +20A0;N # EURO-CURRENCY SIGN +20A1;N # COLON SIGN +20A2;N # CRUZEIRO SIGN +20A3;N # FRENCH FRANC SIGN +20A4;N # LIRA SIGN +20A5;N # MILL SIGN +20A6;N # NAIRA SIGN +20A7;N # PESETA SIGN +20A8;N # RUPEE SIGN +20A9;H # WON SIGN +20AA;N # NEW SHEQEL SIGN +20AB;N # DONG SIGN +20AC;A # EURO SIGN +20AD;N # KIP SIGN +20AE;N # TUGRIK SIGN +20AF;N # DRACHMA SIGN +20B0;N # GERMAN PENNY SIGN +20B1;N # PESO SIGN +20B2;N # GUARANI SIGN +20B3;N # AUSTRAL SIGN +20B4;N # HRYVNIA SIGN +20B5;N # CEDI SIGN +20D0;N # COMBINING LEFT HARPOON ABOVE +20D1;N # COMBINING RIGHT HARPOON ABOVE +20D2;N # COMBINING LONG VERTICAL LINE OVERLAY +20D3;N # COMBINING SHORT VERTICAL LINE OVERLAY +20D4;N # COMBINING ANTICLOCKWISE ARROW ABOVE +20D5;N # COMBINING CLOCKWISE ARROW ABOVE +20D6;N # COMBINING LEFT ARROW ABOVE +20D7;N # COMBINING RIGHT ARROW ABOVE +20D8;N # COMBINING RING OVERLAY +20D9;N # COMBINING CLOCKWISE RING OVERLAY +20DA;N # COMBINING ANTICLOCKWISE RING OVERLAY +20DB;N # COMBINING THREE DOTS ABOVE +20DC;N # COMBINING FOUR DOTS ABOVE +20DD;N # COMBINING ENCLOSING CIRCLE +20DE;N # COMBINING ENCLOSING SQUARE +20DF;N # COMBINING ENCLOSING DIAMOND +20E0;N # COMBINING ENCLOSING CIRCLE BACKSLASH +20E1;N # COMBINING LEFT RIGHT ARROW ABOVE +20E2;N # COMBINING ENCLOSING SCREEN +20E3;N # COMBINING ENCLOSING KEYCAP +20E4;N # COMBINING ENCLOSING UPWARD POINTING TRIANGLE +20E5;N # COMBINING REVERSE SOLIDUS OVERLAY +20E6;N # COMBINING DOUBLE VERTICAL STROKE OVERLAY +20E7;N # COMBINING ANNUITY SYMBOL +20E8;N # COMBINING TRIPLE UNDERDOT +20E9;N # COMBINING WIDE BRIDGE ABOVE +20EA;N # COMBINING LEFTWARDS ARROW OVERLAY +20EB;N # COMBINING LONG DOUBLE SOLIDUS OVERLAY +2100;N # ACCOUNT OF +2101;N # ADDRESSED TO THE SUBJECT +2102;N # DOUBLE-STRUCK CAPITAL C +2103;A # DEGREE CELSIUS +2104;N # CENTRE LINE SYMBOL +2105;A # CARE OF +2106;N # CADA UNA +2107;N # EULER CONSTANT +2108;N # SCRUPLE +2109;A # DEGREE FAHRENHEIT +210A;N # SCRIPT SMALL G +210B;N # SCRIPT CAPITAL H +210C;N # BLACK-LETTER CAPITAL H +210D;N # DOUBLE-STRUCK CAPITAL H +210E;N # PLANCK CONSTANT +210F;N # PLANCK CONSTANT OVER TWO PI +2110;N # SCRIPT CAPITAL I +2111;N # BLACK-LETTER CAPITAL I +2112;N # SCRIPT CAPITAL L +2113;A # SCRIPT SMALL L +2114;N # L B BAR SYMBOL +2115;N # DOUBLE-STRUCK CAPITAL N +2116;A # NUMERO SIGN +2117;N # SOUND RECORDING COPYRIGHT +2118;N # SCRIPT CAPITAL P +2119;N # DOUBLE-STRUCK CAPITAL P +211A;N # DOUBLE-STRUCK CAPITAL Q +211B;N # SCRIPT CAPITAL R +211C;N # BLACK-LETTER CAPITAL R +211D;N # DOUBLE-STRUCK CAPITAL R +211E;N # PRESCRIPTION TAKE +211F;N # RESPONSE +2120;N # SERVICE MARK +2121;A # TELEPHONE SIGN +2122;A # TRADE MARK SIGN +2123;N # VERSICLE +2124;N # DOUBLE-STRUCK CAPITAL Z +2125;N # OUNCE SIGN +2126;A # OHM SIGN +2127;N # INVERTED OHM SIGN +2128;N # BLACK-LETTER CAPITAL Z +2129;N # TURNED GREEK SMALL LETTER IOTA +212A;N # KELVIN SIGN +212B;A # ANGSTROM SIGN +212C;N # SCRIPT CAPITAL B +212D;N # BLACK-LETTER CAPITAL C +212E;N # ESTIMATED SYMBOL +212F;N # SCRIPT SMALL E +2130;N # SCRIPT CAPITAL E +2131;N # SCRIPT CAPITAL F +2132;N # TURNED CAPITAL F +2133;N # SCRIPT CAPITAL M +2134;N # SCRIPT SMALL O +2135;N # ALEF SYMBOL +2136;N # BET SYMBOL +2137;N # GIMEL SYMBOL +2138;N # DALET SYMBOL +2139;N # INFORMATION SOURCE +213A;N # ROTATED CAPITAL Q +213B;N # FACSIMILE SIGN +213C;N # DOUBLE-STRUCK SMALL PI +213D;N # DOUBLE-STRUCK SMALL GAMMA +213E;N # DOUBLE-STRUCK CAPITAL GAMMA +213F;N # DOUBLE-STRUCK CAPITAL PI +2140;N # DOUBLE-STRUCK N-ARY SUMMATION +2141;N # TURNED SANS-SERIF CAPITAL G +2142;N # TURNED SANS-SERIF CAPITAL L +2143;N # REVERSED SANS-SERIF CAPITAL L +2144;N # TURNED SANS-SERIF CAPITAL Y +2145;N # DOUBLE-STRUCK ITALIC CAPITAL D +2146;N # DOUBLE-STRUCK ITALIC SMALL D +2147;N # DOUBLE-STRUCK ITALIC SMALL E +2148;N # DOUBLE-STRUCK ITALIC SMALL I +2149;N # DOUBLE-STRUCK ITALIC SMALL J +214A;N # PROPERTY LINE +214B;N # TURNED AMPERSAND +214C;N # PER SIGN +2153;A # VULGAR FRACTION ONE THIRD +2154;A # VULGAR FRACTION TWO THIRDS +2155;N # VULGAR FRACTION ONE FIFTH +2156;N # VULGAR FRACTION TWO FIFTHS +2157;N # VULGAR FRACTION THREE FIFTHS +2158;N # VULGAR FRACTION FOUR FIFTHS +2159;N # VULGAR FRACTION ONE SIXTH +215A;N # VULGAR FRACTION FIVE SIXTHS +215B;A # VULGAR FRACTION ONE EIGHTH +215C;A # VULGAR FRACTION THREE EIGHTHS +215D;A # VULGAR FRACTION FIVE EIGHTHS +215E;A # VULGAR FRACTION SEVEN EIGHTHS +215F;N # FRACTION NUMERATOR ONE +2160;A # ROMAN NUMERAL ONE +2161;A # ROMAN NUMERAL TWO +2162;A # ROMAN NUMERAL THREE +2163;A # ROMAN NUMERAL FOUR +2164;A # ROMAN NUMERAL FIVE +2165;A # ROMAN NUMERAL SIX +2166;A # ROMAN NUMERAL SEVEN +2167;A # ROMAN NUMERAL EIGHT +2168;A # ROMAN NUMERAL NINE +2169;A # ROMAN NUMERAL TEN +216A;A # ROMAN NUMERAL ELEVEN +216B;A # ROMAN NUMERAL TWELVE +216C;N # ROMAN NUMERAL FIFTY +216D;N # ROMAN NUMERAL ONE HUNDRED +216E;N # ROMAN NUMERAL FIVE HUNDRED +216F;N # ROMAN NUMERAL ONE THOUSAND +2170;A # SMALL ROMAN NUMERAL ONE +2171;A # SMALL ROMAN NUMERAL TWO +2172;A # SMALL ROMAN NUMERAL THREE +2173;A # SMALL ROMAN NUMERAL FOUR +2174;A # SMALL ROMAN NUMERAL FIVE +2175;A # SMALL ROMAN NUMERAL SIX +2176;A # SMALL ROMAN NUMERAL SEVEN +2177;A # SMALL ROMAN NUMERAL EIGHT +2178;A # SMALL ROMAN NUMERAL NINE +2179;A # SMALL ROMAN NUMERAL TEN +217A;N # SMALL ROMAN NUMERAL ELEVEN +217B;N # SMALL ROMAN NUMERAL TWELVE +217C;N # SMALL ROMAN NUMERAL FIFTY +217D;N # SMALL ROMAN NUMERAL ONE HUNDRED +217E;N # SMALL ROMAN NUMERAL FIVE HUNDRED +217F;N # SMALL ROMAN NUMERAL ONE THOUSAND +2180;N # ROMAN NUMERAL ONE THOUSAND C D +2181;N # ROMAN NUMERAL FIVE THOUSAND +2182;N # ROMAN NUMERAL TEN THOUSAND +2183;N # ROMAN NUMERAL REVERSED ONE HUNDRED +2190;A # LEFTWARDS ARROW +2191;A # UPWARDS ARROW +2192;A # RIGHTWARDS ARROW +2193;A # DOWNWARDS ARROW +2194;A # LEFT RIGHT ARROW +2195;A # UP DOWN ARROW +2196;A # NORTH WEST ARROW +2197;A # NORTH EAST ARROW +2198;A # SOUTH EAST ARROW +2199;A # SOUTH WEST ARROW +219A;N # LEFTWARDS ARROW WITH STROKE +219B;N # RIGHTWARDS ARROW WITH STROKE +219C;N # LEFTWARDS WAVE ARROW +219D;N # RIGHTWARDS WAVE ARROW +219E;N # LEFTWARDS TWO HEADED ARROW +219F;N # UPWARDS TWO HEADED ARROW +21A0;N # RIGHTWARDS TWO HEADED ARROW +21A1;N # DOWNWARDS TWO HEADED ARROW +21A2;N # LEFTWARDS ARROW WITH TAIL +21A3;N # RIGHTWARDS ARROW WITH TAIL +21A4;N # LEFTWARDS ARROW FROM BAR +21A5;N # UPWARDS ARROW FROM BAR +21A6;N # RIGHTWARDS ARROW FROM BAR +21A7;N # DOWNWARDS ARROW FROM BAR +21A8;N # UP DOWN ARROW WITH BASE +21A9;N # LEFTWARDS ARROW WITH HOOK +21AA;N # RIGHTWARDS ARROW WITH HOOK +21AB;N # LEFTWARDS ARROW WITH LOOP +21AC;N # RIGHTWARDS ARROW WITH LOOP +21AD;N # LEFT RIGHT WAVE ARROW +21AE;N # LEFT RIGHT ARROW WITH STROKE +21AF;N # DOWNWARDS ZIGZAG ARROW +21B0;N # UPWARDS ARROW WITH TIP LEFTWARDS +21B1;N # UPWARDS ARROW WITH TIP RIGHTWARDS +21B2;N # DOWNWARDS ARROW WITH TIP LEFTWARDS +21B3;N # DOWNWARDS ARROW WITH TIP RIGHTWARDS +21B4;N # RIGHTWARDS ARROW WITH CORNER DOWNWARDS +21B5;N # DOWNWARDS ARROW WITH CORNER LEFTWARDS +21B6;N # ANTICLOCKWISE TOP SEMICIRCLE ARROW +21B7;N # CLOCKWISE TOP SEMICIRCLE ARROW +21B8;A # NORTH WEST ARROW TO LONG BAR +21B9;A # LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR +21BA;N # ANTICLOCKWISE OPEN CIRCLE ARROW +21BB;N # CLOCKWISE OPEN CIRCLE ARROW +21BC;N # LEFTWARDS HARPOON WITH BARB UPWARDS +21BD;N # LEFTWARDS HARPOON WITH BARB DOWNWARDS +21BE;N # UPWARDS HARPOON WITH BARB RIGHTWARDS +21BF;N # UPWARDS HARPOON WITH BARB LEFTWARDS +21C0;N # RIGHTWARDS HARPOON WITH BARB UPWARDS +21C1;N # RIGHTWARDS HARPOON WITH BARB DOWNWARDS +21C2;N # DOWNWARDS HARPOON WITH BARB RIGHTWARDS +21C3;N # DOWNWARDS HARPOON WITH BARB LEFTWARDS +21C4;N # RIGHTWARDS ARROW OVER LEFTWARDS ARROW +21C5;N # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW +21C6;N # LEFTWARDS ARROW OVER RIGHTWARDS ARROW +21C7;N # LEFTWARDS PAIRED ARROWS +21C8;N # UPWARDS PAIRED ARROWS +21C9;N # RIGHTWARDS PAIRED ARROWS +21CA;N # DOWNWARDS PAIRED ARROWS +21CB;N # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +21CC;N # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +21CD;N # LEFTWARDS DOUBLE ARROW WITH STROKE +21CE;N # LEFT RIGHT DOUBLE ARROW WITH STROKE +21CF;N # RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0;N # LEFTWARDS DOUBLE ARROW +21D1;N # UPWARDS DOUBLE ARROW +21D2;A # RIGHTWARDS DOUBLE ARROW +21D3;N # DOWNWARDS DOUBLE ARROW +21D4;A # LEFT RIGHT DOUBLE ARROW +21D5;N # UP DOWN DOUBLE ARROW +21D6;N # NORTH WEST DOUBLE ARROW +21D7;N # NORTH EAST DOUBLE ARROW +21D8;N # SOUTH EAST DOUBLE ARROW +21D9;N # SOUTH WEST DOUBLE ARROW +21DA;N # LEFTWARDS TRIPLE ARROW +21DB;N # RIGHTWARDS TRIPLE ARROW +21DC;N # LEFTWARDS SQUIGGLE ARROW +21DD;N # RIGHTWARDS SQUIGGLE ARROW +21DE;N # UPWARDS ARROW WITH DOUBLE STROKE +21DF;N # DOWNWARDS ARROW WITH DOUBLE STROKE +21E0;N # LEFTWARDS DASHED ARROW +21E1;N # UPWARDS DASHED ARROW +21E2;N # RIGHTWARDS DASHED ARROW +21E3;N # DOWNWARDS DASHED ARROW +21E4;N # LEFTWARDS ARROW TO BAR +21E5;N # RIGHTWARDS ARROW TO BAR +21E6;N # LEFTWARDS WHITE ARROW +21E7;A # UPWARDS WHITE ARROW +21E8;N # RIGHTWARDS WHITE ARROW +21E9;N # DOWNWARDS WHITE ARROW +21EA;N # UPWARDS WHITE ARROW FROM BAR +21EB;N # UPWARDS WHITE ARROW ON PEDESTAL +21EC;N # UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR +21ED;N # UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR +21EE;N # UPWARDS WHITE DOUBLE ARROW +21EF;N # UPWARDS WHITE DOUBLE ARROW ON PEDESTAL +21F0;N # RIGHTWARDS WHITE ARROW FROM WALL +21F1;N # NORTH WEST ARROW TO CORNER +21F2;N # SOUTH EAST ARROW TO CORNER +21F3;N # UP DOWN WHITE ARROW +21F4;N # RIGHT ARROW WITH SMALL CIRCLE +21F5;N # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW +21F6;N # THREE RIGHTWARDS ARROWS +21F7;N # LEFTWARDS ARROW WITH VERTICAL STROKE +21F8;N # RIGHTWARDS ARROW WITH VERTICAL STROKE +21F9;N # LEFT RIGHT ARROW WITH VERTICAL STROKE +21FA;N # LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE +21FB;N # RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE +21FC;N # LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE +21FD;N # LEFTWARDS OPEN-HEADED ARROW +21FE;N # RIGHTWARDS OPEN-HEADED ARROW +21FF;N # LEFT RIGHT OPEN-HEADED ARROW +2200;A # FOR ALL +2201;N # COMPLEMENT +2202;A # PARTIAL DIFFERENTIAL +2203;A # THERE EXISTS +2204;N # THERE DOES NOT EXIST +2205;N # EMPTY SET +2206;N # INCREMENT +2207;A # NABLA +2208;A # ELEMENT OF +2209;N # NOT AN ELEMENT OF +220A;N # SMALL ELEMENT OF +220B;A # CONTAINS AS MEMBER +220C;N # DOES NOT CONTAIN AS MEMBER +220D;N # SMALL CONTAINS AS MEMBER +220E;N # END OF PROOF +220F;A # N-ARY PRODUCT +2210;N # N-ARY COPRODUCT +2211;A # N-ARY SUMMATION +2212;N # MINUS SIGN +2213;N # MINUS-OR-PLUS SIGN +2214;N # DOT PLUS +2215;A # DIVISION SLASH +2216;N # SET MINUS +2217;N # ASTERISK OPERATOR +2218;N # RING OPERATOR +2219;N # BULLET OPERATOR +221A;A # SQUARE ROOT +221B;N # CUBE ROOT +221C;N # FOURTH ROOT +221D;A # PROPORTIONAL TO +221E;A # INFINITY +221F;A # RIGHT ANGLE +2220;A # ANGLE +2221;N # MEASURED ANGLE +2222;N # SPHERICAL ANGLE +2223;A # DIVIDES +2224;N # DOES NOT DIVIDE +2225;A # PARALLEL TO +2226;N # NOT PARALLEL TO +2227;A # LOGICAL AND +2228;A # LOGICAL OR +2229;A # INTERSECTION +222A;A # UNION +222B;A # INTEGRAL +222C;A # DOUBLE INTEGRAL +222D;N # TRIPLE INTEGRAL +222E;A # CONTOUR INTEGRAL +222F;N # SURFACE INTEGRAL +2230;N # VOLUME INTEGRAL +2231;N # CLOCKWISE INTEGRAL +2232;N # CLOCKWISE CONTOUR INTEGRAL +2233;N # ANTICLOCKWISE CONTOUR INTEGRAL +2234;A # THEREFORE +2235;A # BECAUSE +2236;A # RATIO +2237;A # PROPORTION +2238;N # DOT MINUS +2239;N # EXCESS +223A;N # GEOMETRIC PROPORTION +223B;N # HOMOTHETIC +223C;A # TILDE OPERATOR +223D;A # REVERSED TILDE +223E;N # INVERTED LAZY S +223F;N # SINE WAVE +2240;N # WREATH PRODUCT +2241;N # NOT TILDE +2242;N # MINUS TILDE +2243;N # ASYMPTOTICALLY EQUAL TO +2244;N # NOT ASYMPTOTICALLY EQUAL TO +2245;N # APPROXIMATELY EQUAL TO +2246;N # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO +2247;N # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +2248;A # ALMOST EQUAL TO +2249;N # NOT ALMOST EQUAL TO +224A;N # ALMOST EQUAL OR EQUAL TO +224B;N # TRIPLE TILDE +224C;A # ALL EQUAL TO +224D;N # EQUIVALENT TO +224E;N # GEOMETRICALLY EQUIVALENT TO +224F;N # DIFFERENCE BETWEEN +2250;N # APPROACHES THE LIMIT +2251;N # GEOMETRICALLY EQUAL TO +2252;A # APPROXIMATELY EQUAL TO OR THE IMAGE OF +2253;N # IMAGE OF OR APPROXIMATELY EQUAL TO +2254;N # COLON EQUALS +2255;N # EQUALS COLON +2256;N # RING IN EQUAL TO +2257;N # RING EQUAL TO +2258;N # CORRESPONDS TO +2259;N # ESTIMATES +225A;N # EQUIANGULAR TO +225B;N # STAR EQUALS +225C;N # DELTA EQUAL TO +225D;N # EQUAL TO BY DEFINITION +225E;N # MEASURED BY +225F;N # QUESTIONED EQUAL TO +2260;A # NOT EQUAL TO +2261;A # IDENTICAL TO +2262;N # NOT IDENTICAL TO +2263;N # STRICTLY EQUIVALENT TO +2264;A # LESS-THAN OR EQUAL TO +2265;A # GREATER-THAN OR EQUAL TO +2266;A # LESS-THAN OVER EQUAL TO +2267;A # GREATER-THAN OVER EQUAL TO +2268;N # LESS-THAN BUT NOT EQUAL TO +2269;N # GREATER-THAN BUT NOT EQUAL TO +226A;A # MUCH LESS-THAN +226B;A # MUCH GREATER-THAN +226C;N # BETWEEN +226D;N # NOT EQUIVALENT TO +226E;A # NOT LESS-THAN +226F;A # NOT GREATER-THAN +2270;N # NEITHER LESS-THAN NOR EQUAL TO +2271;N # NEITHER GREATER-THAN NOR EQUAL TO +2272;N # LESS-THAN OR EQUIVALENT TO +2273;N # GREATER-THAN OR EQUIVALENT TO +2274;N # NEITHER LESS-THAN NOR EQUIVALENT TO +2275;N # NEITHER GREATER-THAN NOR EQUIVALENT TO +2276;N # LESS-THAN OR GREATER-THAN +2277;N # GREATER-THAN OR LESS-THAN +2278;N # NEITHER LESS-THAN NOR GREATER-THAN +2279;N # NEITHER GREATER-THAN NOR LESS-THAN +227A;N # PRECEDES +227B;N # SUCCEEDS +227C;N # PRECEDES OR EQUAL TO +227D;N # SUCCEEDS OR EQUAL TO +227E;N # PRECEDES OR EQUIVALENT TO +227F;N # SUCCEEDS OR EQUIVALENT TO +2280;N # DOES NOT PRECEDE +2281;N # DOES NOT SUCCEED +2282;A # SUBSET OF +2283;A # SUPERSET OF +2284;N # NOT A SUBSET OF +2285;N # NOT A SUPERSET OF +2286;A # SUBSET OF OR EQUAL TO +2287;A # SUPERSET OF OR EQUAL TO +2288;N # NEITHER A SUBSET OF NOR EQUAL TO +2289;N # NEITHER A SUPERSET OF NOR EQUAL TO +228A;N # SUBSET OF WITH NOT EQUAL TO +228B;N # SUPERSET OF WITH NOT EQUAL TO +228C;N # MULTISET +228D;N # MULTISET MULTIPLICATION +228E;N # MULTISET UNION +228F;N # SQUARE IMAGE OF +2290;N # SQUARE ORIGINAL OF +2291;N # SQUARE IMAGE OF OR EQUAL TO +2292;N # SQUARE ORIGINAL OF OR EQUAL TO +2293;N # SQUARE CAP +2294;N # SQUARE CUP +2295;A # CIRCLED PLUS +2296;N # CIRCLED MINUS +2297;N # CIRCLED TIMES +2298;N # CIRCLED DIVISION SLASH +2299;A # CIRCLED DOT OPERATOR +229A;N # CIRCLED RING OPERATOR +229B;N # CIRCLED ASTERISK OPERATOR +229C;N # CIRCLED EQUALS +229D;N # CIRCLED DASH +229E;N # SQUARED PLUS +229F;N # SQUARED MINUS +22A0;N # SQUARED TIMES +22A1;N # SQUARED DOT OPERATOR +22A2;N # RIGHT TACK +22A3;N # LEFT TACK +22A4;N # DOWN TACK +22A5;A # UP TACK +22A6;N # ASSERTION +22A7;N # MODELS +22A8;N # TRUE +22A9;N # FORCES +22AA;N # TRIPLE VERTICAL BAR RIGHT TURNSTILE +22AB;N # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22AC;N # DOES NOT PROVE +22AD;N # NOT TRUE +22AE;N # DOES NOT FORCE +22AF;N # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22B0;N # PRECEDES UNDER RELATION +22B1;N # SUCCEEDS UNDER RELATION +22B2;N # NORMAL SUBGROUP OF +22B3;N # CONTAINS AS NORMAL SUBGROUP +22B4;N # NORMAL SUBGROUP OF OR EQUAL TO +22B5;N # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO +22B6;N # ORIGINAL OF +22B7;N # IMAGE OF +22B8;N # MULTIMAP +22B9;N # HERMITIAN CONJUGATE MATRIX +22BA;N # INTERCALATE +22BB;N # XOR +22BC;N # NAND +22BD;N # NOR +22BE;N # RIGHT ANGLE WITH ARC +22BF;A # RIGHT TRIANGLE +22C0;N # N-ARY LOGICAL AND +22C1;N # N-ARY LOGICAL OR +22C2;N # N-ARY INTERSECTION +22C3;N # N-ARY UNION +22C4;N # DIAMOND OPERATOR +22C5;N # DOT OPERATOR +22C6;N # STAR OPERATOR +22C7;N # DIVISION TIMES +22C8;N # BOWTIE +22C9;N # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT +22CA;N # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT +22CB;N # LEFT SEMIDIRECT PRODUCT +22CC;N # RIGHT SEMIDIRECT PRODUCT +22CD;N # REVERSED TILDE EQUALS +22CE;N # CURLY LOGICAL OR +22CF;N # CURLY LOGICAL AND +22D0;N # DOUBLE SUBSET +22D1;N # DOUBLE SUPERSET +22D2;N # DOUBLE INTERSECTION +22D3;N # DOUBLE UNION +22D4;N # PITCHFORK +22D5;N # EQUAL AND PARALLEL TO +22D6;N # LESS-THAN WITH DOT +22D7;N # GREATER-THAN WITH DOT +22D8;N # VERY MUCH LESS-THAN +22D9;N # VERY MUCH GREATER-THAN +22DA;N # LESS-THAN EQUAL TO OR GREATER-THAN +22DB;N # GREATER-THAN EQUAL TO OR LESS-THAN +22DC;N # EQUAL TO OR LESS-THAN +22DD;N # EQUAL TO OR GREATER-THAN +22DE;N # EQUAL TO OR PRECEDES +22DF;N # EQUAL TO OR SUCCEEDS +22E0;N # DOES NOT PRECEDE OR EQUAL +22E1;N # DOES NOT SUCCEED OR EQUAL +22E2;N # NOT SQUARE IMAGE OF OR EQUAL TO +22E3;N # NOT SQUARE ORIGINAL OF OR EQUAL TO +22E4;N # SQUARE IMAGE OF OR NOT EQUAL TO +22E5;N # SQUARE ORIGINAL OF OR NOT EQUAL TO +22E6;N # LESS-THAN BUT NOT EQUIVALENT TO +22E7;N # GREATER-THAN BUT NOT EQUIVALENT TO +22E8;N # PRECEDES BUT NOT EQUIVALENT TO +22E9;N # SUCCEEDS BUT NOT EQUIVALENT TO +22EA;N # NOT NORMAL SUBGROUP OF +22EB;N # DOES NOT CONTAIN AS NORMAL SUBGROUP +22EC;N # NOT NORMAL SUBGROUP OF OR EQUAL TO +22ED;N # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +22EE;N # VERTICAL ELLIPSIS +22EF;N # MIDLINE HORIZONTAL ELLIPSIS +22F0;N # UP RIGHT DIAGONAL ELLIPSIS +22F1;N # DOWN RIGHT DIAGONAL ELLIPSIS +22F2;N # ELEMENT OF WITH LONG HORIZONTAL STROKE +22F3;N # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F4;N # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F5;N # ELEMENT OF WITH DOT ABOVE +22F6;N # ELEMENT OF WITH OVERBAR +22F7;N # SMALL ELEMENT OF WITH OVERBAR +22F8;N # ELEMENT OF WITH UNDERBAR +22F9;N # ELEMENT OF WITH TWO HORIZONTAL STROKES +22FA;N # CONTAINS WITH LONG HORIZONTAL STROKE +22FB;N # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FC;N # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FD;N # CONTAINS WITH OVERBAR +22FE;N # SMALL CONTAINS WITH OVERBAR +22FF;N # Z NOTATION BAG MEMBERSHIP +2300;N # DIAMETER SIGN +2301;N # ELECTRIC ARROW +2302;N # HOUSE +2303;N # UP ARROWHEAD +2304;N # DOWN ARROWHEAD +2305;N # PROJECTIVE +2306;N # PERSPECTIVE +2307;N # WAVY LINE +2308;N # LEFT CEILING +2309;N # RIGHT CEILING +230A;N # LEFT FLOOR +230B;N # RIGHT FLOOR +230C;N # BOTTOM RIGHT CROP +230D;N # BOTTOM LEFT CROP +230E;N # TOP RIGHT CROP +230F;N # TOP LEFT CROP +2310;N # REVERSED NOT SIGN +2311;N # SQUARE LOZENGE +2312;A # ARC +2313;N # SEGMENT +2314;N # SECTOR +2315;N # TELEPHONE RECORDER +2316;N # POSITION INDICATOR +2317;N # VIEWDATA SQUARE +2318;N # PLACE OF INTEREST SIGN +2319;N # TURNED NOT SIGN +231A;N # WATCH +231B;N # HOURGLASS +231C;N # TOP LEFT CORNER +231D;N # TOP RIGHT CORNER +231E;N # BOTTOM LEFT CORNER +231F;N # BOTTOM RIGHT CORNER +2320;N # TOP HALF INTEGRAL +2321;N # BOTTOM HALF INTEGRAL +2322;N # FROWN +2323;N # SMILE +2324;N # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS +2325;N # OPTION KEY +2326;N # ERASE TO THE RIGHT +2327;N # X IN A RECTANGLE BOX +2328;N # KEYBOARD +2329;W # LEFT-POINTING ANGLE BRACKET +232A;W # RIGHT-POINTING ANGLE BRACKET +232B;N # ERASE TO THE LEFT +232C;N # BENZENE RING +232D;N # CYLINDRICITY +232E;N # ALL AROUND-PROFILE +232F;N # SYMMETRY +2330;N # TOTAL RUNOUT +2331;N # DIMENSION ORIGIN +2332;N # CONICAL TAPER +2333;N # SLOPE +2334;N # COUNTERBORE +2335;N # COUNTERSINK +2336;N # APL FUNCTIONAL SYMBOL I-BEAM +2337;N # APL FUNCTIONAL SYMBOL SQUISH QUAD +2338;N # APL FUNCTIONAL SYMBOL QUAD EQUAL +2339;N # APL FUNCTIONAL SYMBOL QUAD DIVIDE +233A;N # APL FUNCTIONAL SYMBOL QUAD DIAMOND +233B;N # APL FUNCTIONAL SYMBOL QUAD JOT +233C;N # APL FUNCTIONAL SYMBOL QUAD CIRCLE +233D;N # APL FUNCTIONAL SYMBOL CIRCLE STILE +233E;N # APL FUNCTIONAL SYMBOL CIRCLE JOT +233F;N # APL FUNCTIONAL SYMBOL SLASH BAR +2340;N # APL FUNCTIONAL SYMBOL BACKSLASH BAR +2341;N # APL FUNCTIONAL SYMBOL QUAD SLASH +2342;N # APL FUNCTIONAL SYMBOL QUAD BACKSLASH +2343;N # APL FUNCTIONAL SYMBOL QUAD LESS-THAN +2344;N # APL FUNCTIONAL SYMBOL QUAD GREATER-THAN +2345;N # APL FUNCTIONAL SYMBOL LEFTWARDS VANE +2346;N # APL FUNCTIONAL SYMBOL RIGHTWARDS VANE +2347;N # APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW +2348;N # APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW +2349;N # APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH +234A;N # APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR +234B;N # APL FUNCTIONAL SYMBOL DELTA STILE +234C;N # APL FUNCTIONAL SYMBOL QUAD DOWN CARET +234D;N # APL FUNCTIONAL SYMBOL QUAD DELTA +234E;N # APL FUNCTIONAL SYMBOL DOWN TACK JOT +234F;N # APL FUNCTIONAL SYMBOL UPWARDS VANE +2350;N # APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW +2351;N # APL FUNCTIONAL SYMBOL UP TACK OVERBAR +2352;N # APL FUNCTIONAL SYMBOL DEL STILE +2353;N # APL FUNCTIONAL SYMBOL QUAD UP CARET +2354;N # APL FUNCTIONAL SYMBOL QUAD DEL +2355;N # APL FUNCTIONAL SYMBOL UP TACK JOT +2356;N # APL FUNCTIONAL SYMBOL DOWNWARDS VANE +2357;N # APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW +2358;N # APL FUNCTIONAL SYMBOL QUOTE UNDERBAR +2359;N # APL FUNCTIONAL SYMBOL DELTA UNDERBAR +235A;N # APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR +235B;N # APL FUNCTIONAL SYMBOL JOT UNDERBAR +235C;N # APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR +235D;N # APL FUNCTIONAL SYMBOL UP SHOE JOT +235E;N # APL FUNCTIONAL SYMBOL QUOTE QUAD +235F;N # APL FUNCTIONAL SYMBOL CIRCLE STAR +2360;N # APL FUNCTIONAL SYMBOL QUAD COLON +2361;N # APL FUNCTIONAL SYMBOL UP TACK DIAERESIS +2362;N # APL FUNCTIONAL SYMBOL DEL DIAERESIS +2363;N # APL FUNCTIONAL SYMBOL STAR DIAERESIS +2364;N # APL FUNCTIONAL SYMBOL JOT DIAERESIS +2365;N # APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS +2366;N # APL FUNCTIONAL SYMBOL DOWN SHOE STILE +2367;N # APL FUNCTIONAL SYMBOL LEFT SHOE STILE +2368;N # APL FUNCTIONAL SYMBOL TILDE DIAERESIS +2369;N # APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS +236A;N # APL FUNCTIONAL SYMBOL COMMA BAR +236B;N # APL FUNCTIONAL SYMBOL DEL TILDE +236C;N # APL FUNCTIONAL SYMBOL ZILDE +236D;N # APL FUNCTIONAL SYMBOL STILE TILDE +236E;N # APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR +236F;N # APL FUNCTIONAL SYMBOL QUAD NOT EQUAL +2370;N # APL FUNCTIONAL SYMBOL QUAD QUESTION +2371;N # APL FUNCTIONAL SYMBOL DOWN CARET TILDE +2372;N # APL FUNCTIONAL SYMBOL UP CARET TILDE +2373;N # APL FUNCTIONAL SYMBOL IOTA +2374;N # APL FUNCTIONAL SYMBOL RHO +2375;N # APL FUNCTIONAL SYMBOL OMEGA +2376;N # APL FUNCTIONAL SYMBOL ALPHA UNDERBAR +2377;N # APL FUNCTIONAL SYMBOL EPSILON UNDERBAR +2378;N # APL FUNCTIONAL SYMBOL IOTA UNDERBAR +2379;N # APL FUNCTIONAL SYMBOL OMEGA UNDERBAR +237A;N # APL FUNCTIONAL SYMBOL ALPHA +237B;N # NOT CHECK MARK +237C;N # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D;N # SHOULDERED OPEN BOX +237E;N # BELL SYMBOL +237F;N # VERTICAL LINE WITH MIDDLE DOT +2380;N # INSERTION SYMBOL +2381;N # CONTINUOUS UNDERLINE SYMBOL +2382;N # DISCONTINUOUS UNDERLINE SYMBOL +2383;N # EMPHASIS SYMBOL +2384;N # COMPOSITION SYMBOL +2385;N # WHITE SQUARE WITH CENTRE VERTICAL LINE +2386;N # ENTER SYMBOL +2387;N # ALTERNATIVE KEY SYMBOL +2388;N # HELM SYMBOL +2389;N # CIRCLED HORIZONTAL BAR WITH NOTCH +238A;N # CIRCLED TRIANGLE DOWN +238B;N # BROKEN CIRCLE WITH NORTHWEST ARROW +238C;N # UNDO SYMBOL +238D;N # MONOSTABLE SYMBOL +238E;N # HYSTERESIS SYMBOL +238F;N # OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL +2390;N # OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL +2391;N # PASSIVE-PULL-DOWN-OUTPUT SYMBOL +2392;N # PASSIVE-PULL-UP-OUTPUT SYMBOL +2393;N # DIRECT CURRENT SYMBOL FORM TWO +2394;N # SOFTWARE-FUNCTION SYMBOL +2395;N # APL FUNCTIONAL SYMBOL QUAD +2396;N # DECIMAL SEPARATOR KEY SYMBOL +2397;N # PREVIOUS PAGE +2398;N # NEXT PAGE +2399;N # PRINT SCREEN SYMBOL +239A;N # CLEAR SCREEN SYMBOL +239B;N # LEFT PARENTHESIS UPPER HOOK +239C;N # LEFT PARENTHESIS EXTENSION +239D;N # LEFT PARENTHESIS LOWER HOOK +239E;N # RIGHT PARENTHESIS UPPER HOOK +239F;N # RIGHT PARENTHESIS EXTENSION +23A0;N # RIGHT PARENTHESIS LOWER HOOK +23A1;N # LEFT SQUARE BRACKET UPPER CORNER +23A2;N # LEFT SQUARE BRACKET EXTENSION +23A3;N # LEFT SQUARE BRACKET LOWER CORNER +23A4;N # RIGHT SQUARE BRACKET UPPER CORNER +23A5;N # RIGHT SQUARE BRACKET EXTENSION +23A6;N # RIGHT SQUARE BRACKET LOWER CORNER +23A7;N # LEFT CURLY BRACKET UPPER HOOK +23A8;N # LEFT CURLY BRACKET MIDDLE PIECE +23A9;N # LEFT CURLY BRACKET LOWER HOOK +23AA;N # CURLY BRACKET EXTENSION +23AB;N # RIGHT CURLY BRACKET UPPER HOOK +23AC;N # RIGHT CURLY BRACKET MIDDLE PIECE +23AD;N # RIGHT CURLY BRACKET LOWER HOOK +23AE;N # INTEGRAL EXTENSION +23AF;N # HORIZONTAL LINE EXTENSION +23B0;N # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION +23B1;N # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION +23B2;N # SUMMATION TOP +23B3;N # SUMMATION BOTTOM +23B4;N # TOP SQUARE BRACKET +23B5;N # BOTTOM SQUARE BRACKET +23B6;N # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET +23B7;N # RADICAL SYMBOL BOTTOM +23B8;N # LEFT VERTICAL BOX LINE +23B9;N # RIGHT VERTICAL BOX LINE +23BA;N # HORIZONTAL SCAN LINE-1 +23BB;N # HORIZONTAL SCAN LINE-3 +23BC;N # HORIZONTAL SCAN LINE-7 +23BD;N # HORIZONTAL SCAN LINE-9 +23BE;N # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT +23BF;N # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT +23C0;N # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE +23C1;N # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE +23C2;N # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE +23C3;N # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE +23C4;N # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE +23C5;N # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE +23C6;N # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE +23C7;N # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE +23C8;N # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE +23C9;N # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL +23CA;N # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL +23CB;N # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT +23CC;N # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT +23CD;N # SQUARE FOOT +23CE;N # RETURN SYMBOL +23CF;N # EJECT SYMBOL +23D0;N # VERTICAL LINE EXTENSION +23D1;N # METRICAL BREVE +23D2;N # METRICAL LONG OVER SHORT +23D3;N # METRICAL SHORT OVER LONG +23D4;N # METRICAL LONG OVER TWO SHORTS +23D5;N # METRICAL TWO SHORTS OVER LONG +23D6;N # METRICAL TWO SHORTS JOINED +23D7;N # METRICAL TRISEME +23D8;N # METRICAL TETRASEME +23D9;N # METRICAL PENTASEME +23DA;N # EARTH GROUND +23DB;N # FUSE +2400;N # SYMBOL FOR NULL +2401;N # SYMBOL FOR START OF HEADING +2402;N # SYMBOL FOR START OF TEXT +2403;N # SYMBOL FOR END OF TEXT +2404;N # SYMBOL FOR END OF TRANSMISSION +2405;N # SYMBOL FOR ENQUIRY +2406;N # SYMBOL FOR ACKNOWLEDGE +2407;N # SYMBOL FOR BELL +2408;N # SYMBOL FOR BACKSPACE +2409;N # SYMBOL FOR HORIZONTAL TABULATION +240A;N # SYMBOL FOR LINE FEED +240B;N # SYMBOL FOR VERTICAL TABULATION +240C;N # SYMBOL FOR FORM FEED +240D;N # SYMBOL FOR CARRIAGE RETURN +240E;N # SYMBOL FOR SHIFT OUT +240F;N # SYMBOL FOR SHIFT IN +2410;N # SYMBOL FOR DATA LINK ESCAPE +2411;N # SYMBOL FOR DEVICE CONTROL ONE +2412;N # SYMBOL FOR DEVICE CONTROL TWO +2413;N # SYMBOL FOR DEVICE CONTROL THREE +2414;N # SYMBOL FOR DEVICE CONTROL FOUR +2415;N # SYMBOL FOR NEGATIVE ACKNOWLEDGE +2416;N # SYMBOL FOR SYNCHRONOUS IDLE +2417;N # SYMBOL FOR END OF TRANSMISSION BLOCK +2418;N # SYMBOL FOR CANCEL +2419;N # SYMBOL FOR END OF MEDIUM +241A;N # SYMBOL FOR SUBSTITUTE +241B;N # SYMBOL FOR ESCAPE +241C;N # SYMBOL FOR FILE SEPARATOR +241D;N # SYMBOL FOR GROUP SEPARATOR +241E;N # SYMBOL FOR RECORD SEPARATOR +241F;N # SYMBOL FOR UNIT SEPARATOR +2420;N # SYMBOL FOR SPACE +2421;N # SYMBOL FOR DELETE +2422;N # BLANK SYMBOL +2423;N # OPEN BOX +2424;N # SYMBOL FOR NEWLINE +2425;N # SYMBOL FOR DELETE FORM TWO +2426;N # SYMBOL FOR SUBSTITUTE FORM TWO +2440;N # OCR HOOK +2441;N # OCR CHAIR +2442;N # OCR FORK +2443;N # OCR INVERTED FORK +2444;N # OCR BELT BUCKLE +2445;N # OCR BOW TIE +2446;N # OCR BRANCH BANK IDENTIFICATION +2447;N # OCR AMOUNT OF CHECK +2448;N # OCR DASH +2449;N # OCR CUSTOMER ACCOUNT NUMBER +244A;N # OCR DOUBLE BACKSLASH +2460;A # CIRCLED DIGIT ONE +2461;A # CIRCLED DIGIT TWO +2462;A # CIRCLED DIGIT THREE +2463;A # CIRCLED DIGIT FOUR +2464;A # CIRCLED DIGIT FIVE +2465;A # CIRCLED DIGIT SIX +2466;A # CIRCLED DIGIT SEVEN +2467;A # CIRCLED DIGIT EIGHT +2468;A # CIRCLED DIGIT NINE +2469;A # CIRCLED NUMBER TEN +246A;A # CIRCLED NUMBER ELEVEN +246B;A # CIRCLED NUMBER TWELVE +246C;A # CIRCLED NUMBER THIRTEEN +246D;A # CIRCLED NUMBER FOURTEEN +246E;A # CIRCLED NUMBER FIFTEEN +246F;A # CIRCLED NUMBER SIXTEEN +2470;A # CIRCLED NUMBER SEVENTEEN +2471;A # CIRCLED NUMBER EIGHTEEN +2472;A # CIRCLED NUMBER NINETEEN +2473;A # CIRCLED NUMBER TWENTY +2474;A # PARENTHESIZED DIGIT ONE +2475;A # PARENTHESIZED DIGIT TWO +2476;A # PARENTHESIZED DIGIT THREE +2477;A # PARENTHESIZED DIGIT FOUR +2478;A # PARENTHESIZED DIGIT FIVE +2479;A # PARENTHESIZED DIGIT SIX +247A;A # PARENTHESIZED DIGIT SEVEN +247B;A # PARENTHESIZED DIGIT EIGHT +247C;A # PARENTHESIZED DIGIT NINE +247D;A # PARENTHESIZED NUMBER TEN +247E;A # PARENTHESIZED NUMBER ELEVEN +247F;A # PARENTHESIZED NUMBER TWELVE +2480;A # PARENTHESIZED NUMBER THIRTEEN +2481;A # PARENTHESIZED NUMBER FOURTEEN +2482;A # PARENTHESIZED NUMBER FIFTEEN +2483;A # PARENTHESIZED NUMBER SIXTEEN +2484;A # PARENTHESIZED NUMBER SEVENTEEN +2485;A # PARENTHESIZED NUMBER EIGHTEEN +2486;A # PARENTHESIZED NUMBER NINETEEN +2487;A # PARENTHESIZED NUMBER TWENTY +2488;A # DIGIT ONE FULL STOP +2489;A # DIGIT TWO FULL STOP +248A;A # DIGIT THREE FULL STOP +248B;A # DIGIT FOUR FULL STOP +248C;A # DIGIT FIVE FULL STOP +248D;A # DIGIT SIX FULL STOP +248E;A # DIGIT SEVEN FULL STOP +248F;A # DIGIT EIGHT FULL STOP +2490;A # DIGIT NINE FULL STOP +2491;A # NUMBER TEN FULL STOP +2492;A # NUMBER ELEVEN FULL STOP +2493;A # NUMBER TWELVE FULL STOP +2494;A # NUMBER THIRTEEN FULL STOP +2495;A # NUMBER FOURTEEN FULL STOP +2496;A # NUMBER FIFTEEN FULL STOP +2497;A # NUMBER SIXTEEN FULL STOP +2498;A # NUMBER SEVENTEEN FULL STOP +2499;A # NUMBER EIGHTEEN FULL STOP +249A;A # NUMBER NINETEEN FULL STOP +249B;A # NUMBER TWENTY FULL STOP +249C;A # PARENTHESIZED LATIN SMALL LETTER A +249D;A # PARENTHESIZED LATIN SMALL LETTER B +249E;A # PARENTHESIZED LATIN SMALL LETTER C +249F;A # PARENTHESIZED LATIN SMALL LETTER D +24A0;A # PARENTHESIZED LATIN SMALL LETTER E +24A1;A # PARENTHESIZED LATIN SMALL LETTER F +24A2;A # PARENTHESIZED LATIN SMALL LETTER G +24A3;A # PARENTHESIZED LATIN SMALL LETTER H +24A4;A # PARENTHESIZED LATIN SMALL LETTER I +24A5;A # PARENTHESIZED LATIN SMALL LETTER J +24A6;A # PARENTHESIZED LATIN SMALL LETTER K +24A7;A # PARENTHESIZED LATIN SMALL LETTER L +24A8;A # PARENTHESIZED LATIN SMALL LETTER M +24A9;A # PARENTHESIZED LATIN SMALL LETTER N +24AA;A # PARENTHESIZED LATIN SMALL LETTER O +24AB;A # PARENTHESIZED LATIN SMALL LETTER P +24AC;A # PARENTHESIZED LATIN SMALL LETTER Q +24AD;A # PARENTHESIZED LATIN SMALL LETTER R +24AE;A # PARENTHESIZED LATIN SMALL LETTER S +24AF;A # PARENTHESIZED LATIN SMALL LETTER T +24B0;A # PARENTHESIZED LATIN SMALL LETTER U +24B1;A # PARENTHESIZED LATIN SMALL LETTER V +24B2;A # PARENTHESIZED LATIN SMALL LETTER W +24B3;A # PARENTHESIZED LATIN SMALL LETTER X +24B4;A # PARENTHESIZED LATIN SMALL LETTER Y +24B5;A # PARENTHESIZED LATIN SMALL LETTER Z +24B6;A # CIRCLED LATIN CAPITAL LETTER A +24B7;A # CIRCLED LATIN CAPITAL LETTER B +24B8;A # CIRCLED LATIN CAPITAL LETTER C +24B9;A # CIRCLED LATIN CAPITAL LETTER D +24BA;A # CIRCLED LATIN CAPITAL LETTER E +24BB;A # CIRCLED LATIN CAPITAL LETTER F +24BC;A # CIRCLED LATIN CAPITAL LETTER G +24BD;A # CIRCLED LATIN CAPITAL LETTER H +24BE;A # CIRCLED LATIN CAPITAL LETTER I +24BF;A # CIRCLED LATIN CAPITAL LETTER J +24C0;A # CIRCLED LATIN CAPITAL LETTER K +24C1;A # CIRCLED LATIN CAPITAL LETTER L +24C2;A # CIRCLED LATIN CAPITAL LETTER M +24C3;A # CIRCLED LATIN CAPITAL LETTER N +24C4;A # CIRCLED LATIN CAPITAL LETTER O +24C5;A # CIRCLED LATIN CAPITAL LETTER P +24C6;A # CIRCLED LATIN CAPITAL LETTER Q +24C7;A # CIRCLED LATIN CAPITAL LETTER R +24C8;A # CIRCLED LATIN CAPITAL LETTER S +24C9;A # CIRCLED LATIN CAPITAL LETTER T +24CA;A # CIRCLED LATIN CAPITAL LETTER U +24CB;A # CIRCLED LATIN CAPITAL LETTER V +24CC;A # CIRCLED LATIN CAPITAL LETTER W +24CD;A # CIRCLED LATIN CAPITAL LETTER X +24CE;A # CIRCLED LATIN CAPITAL LETTER Y +24CF;A # CIRCLED LATIN CAPITAL LETTER Z +24D0;A # CIRCLED LATIN SMALL LETTER A +24D1;A # CIRCLED LATIN SMALL LETTER B +24D2;A # CIRCLED LATIN SMALL LETTER C +24D3;A # CIRCLED LATIN SMALL LETTER D +24D4;A # CIRCLED LATIN SMALL LETTER E +24D5;A # CIRCLED LATIN SMALL LETTER F +24D6;A # CIRCLED LATIN SMALL LETTER G +24D7;A # CIRCLED LATIN SMALL LETTER H +24D8;A # CIRCLED LATIN SMALL LETTER I +24D9;A # CIRCLED LATIN SMALL LETTER J +24DA;A # CIRCLED LATIN SMALL LETTER K +24DB;A # CIRCLED LATIN SMALL LETTER L +24DC;A # CIRCLED LATIN SMALL LETTER M +24DD;A # CIRCLED LATIN SMALL LETTER N +24DE;A # CIRCLED LATIN SMALL LETTER O +24DF;A # CIRCLED LATIN SMALL LETTER P +24E0;A # CIRCLED LATIN SMALL LETTER Q +24E1;A # CIRCLED LATIN SMALL LETTER R +24E2;A # CIRCLED LATIN SMALL LETTER S +24E3;A # CIRCLED LATIN SMALL LETTER T +24E4;A # CIRCLED LATIN SMALL LETTER U +24E5;A # CIRCLED LATIN SMALL LETTER V +24E6;A # CIRCLED LATIN SMALL LETTER W +24E7;A # CIRCLED LATIN SMALL LETTER X +24E8;A # CIRCLED LATIN SMALL LETTER Y +24E9;A # CIRCLED LATIN SMALL LETTER Z +24EA;N # CIRCLED DIGIT ZERO +24EB;A # NEGATIVE CIRCLED NUMBER ELEVEN +24EC;A # NEGATIVE CIRCLED NUMBER TWELVE +24ED;A # NEGATIVE CIRCLED NUMBER THIRTEEN +24EE;A # NEGATIVE CIRCLED NUMBER FOURTEEN +24EF;A # NEGATIVE CIRCLED NUMBER FIFTEEN +24F0;A # NEGATIVE CIRCLED NUMBER SIXTEEN +24F1;A # NEGATIVE CIRCLED NUMBER SEVENTEEN +24F2;A # NEGATIVE CIRCLED NUMBER EIGHTEEN +24F3;A # NEGATIVE CIRCLED NUMBER NINETEEN +24F4;A # NEGATIVE CIRCLED NUMBER TWENTY +24F5;A # DOUBLE CIRCLED DIGIT ONE +24F6;A # DOUBLE CIRCLED DIGIT TWO +24F7;A # DOUBLE CIRCLED DIGIT THREE +24F8;A # DOUBLE CIRCLED DIGIT FOUR +24F9;A # DOUBLE CIRCLED DIGIT FIVE +24FA;A # DOUBLE CIRCLED DIGIT SIX +24FB;A # DOUBLE CIRCLED DIGIT SEVEN +24FC;A # DOUBLE CIRCLED DIGIT EIGHT +24FD;A # DOUBLE CIRCLED DIGIT NINE +24FE;A # DOUBLE CIRCLED NUMBER TEN +24FF;A # NEGATIVE CIRCLED DIGIT ZERO +2500;A # BOX DRAWINGS LIGHT HORIZONTAL +2501;A # BOX DRAWINGS HEAVY HORIZONTAL +2502;A # BOX DRAWINGS LIGHT VERTICAL +2503;A # BOX DRAWINGS HEAVY VERTICAL +2504;A # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL +2505;A # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL +2506;A # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL +2507;A # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL +2508;A # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL +2509;A # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL +250A;A # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL +250B;A # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL +250C;A # BOX DRAWINGS LIGHT DOWN AND RIGHT +250D;A # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY +250E;A # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT +250F;A # BOX DRAWINGS HEAVY DOWN AND RIGHT +2510;A # BOX DRAWINGS LIGHT DOWN AND LEFT +2511;A # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY +2512;A # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT +2513;A # BOX DRAWINGS HEAVY DOWN AND LEFT +2514;A # BOX DRAWINGS LIGHT UP AND RIGHT +2515;A # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY +2516;A # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT +2517;A # BOX DRAWINGS HEAVY UP AND RIGHT +2518;A # BOX DRAWINGS LIGHT UP AND LEFT +2519;A # BOX DRAWINGS UP LIGHT AND LEFT HEAVY +251A;A # BOX DRAWINGS UP HEAVY AND LEFT LIGHT +251B;A # BOX DRAWINGS HEAVY UP AND LEFT +251C;A # BOX DRAWINGS LIGHT VERTICAL AND RIGHT +251D;A # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +251E;A # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT +251F;A # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT +2520;A # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +2521;A # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY +2522;A # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY +2523;A # BOX DRAWINGS HEAVY VERTICAL AND RIGHT +2524;A # BOX DRAWINGS LIGHT VERTICAL AND LEFT +2525;A # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +2526;A # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT +2527;A # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT +2528;A # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +2529;A # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY +252A;A # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY +252B;A # BOX DRAWINGS HEAVY VERTICAL AND LEFT +252C;A # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +252D;A # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT +252E;A # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT +252F;A # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +2530;A # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +2531;A # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY +2532;A # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY +2533;A # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +2534;A # BOX DRAWINGS LIGHT UP AND HORIZONTAL +2535;A # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT +2536;A # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT +2537;A # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +2538;A # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +2539;A # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY +253A;A # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY +253B;A # BOX DRAWINGS HEAVY UP AND HORIZONTAL +253C;A # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +253D;A # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT +253E;A # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT +253F;A # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +2540;A # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT +2541;A # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT +2542;A # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +2543;A # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT +2544;A # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT +2545;A # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT +2546;A # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT +2547;A # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY +2548;A # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY +2549;A # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY +254A;A # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY +254B;A # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +254C;N # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL +254D;N # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL +254E;N # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL +254F;N # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL +2550;A # BOX DRAWINGS DOUBLE HORIZONTAL +2551;A # BOX DRAWINGS DOUBLE VERTICAL +2552;A # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +2553;A # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +2554;A # BOX DRAWINGS DOUBLE DOWN AND RIGHT +2555;A # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +2556;A # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +2557;A # BOX DRAWINGS DOUBLE DOWN AND LEFT +2558;A # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +2559;A # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +255A;A # BOX DRAWINGS DOUBLE UP AND RIGHT +255B;A # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +255C;A # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +255D;A # BOX DRAWINGS DOUBLE UP AND LEFT +255E;A # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +255F;A # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +2560;A # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +2561;A # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +2562;A # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +2563;A # BOX DRAWINGS DOUBLE VERTICAL AND LEFT +2564;A # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +2565;A # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +2566;A # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +2567;A # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +2568;A # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +2569;A # BOX DRAWINGS DOUBLE UP AND HORIZONTAL +256A;A # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +256B;A # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +256C;A # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +256D;A # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT +256E;A # BOX DRAWINGS LIGHT ARC DOWN AND LEFT +256F;A # BOX DRAWINGS LIGHT ARC UP AND LEFT +2570;A # BOX DRAWINGS LIGHT ARC UP AND RIGHT +2571;A # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT +2572;A # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT +2573;A # BOX DRAWINGS LIGHT DIAGONAL CROSS +2574;N # BOX DRAWINGS LIGHT LEFT +2575;N # BOX DRAWINGS LIGHT UP +2576;N # BOX DRAWINGS LIGHT RIGHT +2577;N # BOX DRAWINGS LIGHT DOWN +2578;N # BOX DRAWINGS HEAVY LEFT +2579;N # BOX DRAWINGS HEAVY UP +257A;N # BOX DRAWINGS HEAVY RIGHT +257B;N # BOX DRAWINGS HEAVY DOWN +257C;N # BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT +257D;N # BOX DRAWINGS LIGHT UP AND HEAVY DOWN +257E;N # BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT +257F;N # BOX DRAWINGS HEAVY UP AND LIGHT DOWN +2580;A # UPPER HALF BLOCK +2581;A # LOWER ONE EIGHTH BLOCK +2582;A # LOWER ONE QUARTER BLOCK +2583;A # LOWER THREE EIGHTHS BLOCK +2584;A # LOWER HALF BLOCK +2585;A # LOWER FIVE EIGHTHS BLOCK +2586;A # LOWER THREE QUARTERS BLOCK +2587;A # LOWER SEVEN EIGHTHS BLOCK +2588;A # FULL BLOCK +2589;A # LEFT SEVEN EIGHTHS BLOCK +258A;A # LEFT THREE QUARTERS BLOCK +258B;A # LEFT FIVE EIGHTHS BLOCK +258C;A # LEFT HALF BLOCK +258D;A # LEFT THREE EIGHTHS BLOCK +258E;A # LEFT ONE QUARTER BLOCK +258F;A # LEFT ONE EIGHTH BLOCK +2590;N # RIGHT HALF BLOCK +2591;N # LIGHT SHADE +2592;A # MEDIUM SHADE +2593;A # DARK SHADE +2594;A # UPPER ONE EIGHTH BLOCK +2595;A # RIGHT ONE EIGHTH BLOCK +2596;N # QUADRANT LOWER LEFT +2597;N # QUADRANT LOWER RIGHT +2598;N # QUADRANT UPPER LEFT +2599;N # QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT +259A;N # QUADRANT UPPER LEFT AND LOWER RIGHT +259B;N # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT +259C;N # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT +259D;N # QUADRANT UPPER RIGHT +259E;N # QUADRANT UPPER RIGHT AND LOWER LEFT +259F;N # QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT +25A0;A # BLACK SQUARE +25A1;A # WHITE SQUARE +25A2;N # WHITE SQUARE WITH ROUNDED CORNERS +25A3;A # WHITE SQUARE CONTAINING BLACK SMALL SQUARE +25A4;A # SQUARE WITH HORIZONTAL FILL +25A5;A # SQUARE WITH VERTICAL FILL +25A6;A # SQUARE WITH ORTHOGONAL CROSSHATCH FILL +25A7;A # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL +25A8;A # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL +25A9;A # SQUARE WITH DIAGONAL CROSSHATCH FILL +25AA;N # BLACK SMALL SQUARE +25AB;N # WHITE SMALL SQUARE +25AC;N # BLACK RECTANGLE +25AD;N # WHITE RECTANGLE +25AE;N # BLACK VERTICAL RECTANGLE +25AF;N # WHITE VERTICAL RECTANGLE +25B0;N # BLACK PARALLELOGRAM +25B1;N # WHITE PARALLELOGRAM +25B2;A # BLACK UP-POINTING TRIANGLE +25B3;A # WHITE UP-POINTING TRIANGLE +25B4;N # BLACK UP-POINTING SMALL TRIANGLE +25B5;N # WHITE UP-POINTING SMALL TRIANGLE +25B6;A # BLACK RIGHT-POINTING TRIANGLE +25B7;A # WHITE RIGHT-POINTING TRIANGLE +25B8;N # BLACK RIGHT-POINTING SMALL TRIANGLE +25B9;N # WHITE RIGHT-POINTING SMALL TRIANGLE +25BA;N # BLACK RIGHT-POINTING POINTER +25BB;N # WHITE RIGHT-POINTING POINTER +25BC;A # BLACK DOWN-POINTING TRIANGLE +25BD;A # WHITE DOWN-POINTING TRIANGLE +25BE;N # BLACK DOWN-POINTING SMALL TRIANGLE +25BF;N # WHITE DOWN-POINTING SMALL TRIANGLE +25C0;A # BLACK LEFT-POINTING TRIANGLE +25C1;A # WHITE LEFT-POINTING TRIANGLE +25C2;N # BLACK LEFT-POINTING SMALL TRIANGLE +25C3;N # WHITE LEFT-POINTING SMALL TRIANGLE +25C4;N # BLACK LEFT-POINTING POINTER +25C5;N # WHITE LEFT-POINTING POINTER +25C6;A # BLACK DIAMOND +25C7;A # WHITE DIAMOND +25C8;A # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND +25C9;N # FISHEYE +25CA;N # LOZENGE +25CB;A # WHITE CIRCLE +25CC;N # DOTTED CIRCLE +25CD;N # CIRCLE WITH VERTICAL FILL +25CE;A # BULLSEYE +25CF;A # BLACK CIRCLE +25D0;A # CIRCLE WITH LEFT HALF BLACK +25D1;A # CIRCLE WITH RIGHT HALF BLACK +25D2;N # CIRCLE WITH LOWER HALF BLACK +25D3;N # CIRCLE WITH UPPER HALF BLACK +25D4;N # CIRCLE WITH UPPER RIGHT QUADRANT BLACK +25D5;N # CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK +25D6;N # LEFT HALF BLACK CIRCLE +25D7;N # RIGHT HALF BLACK CIRCLE +25D8;N # INVERSE BULLET +25D9;N # INVERSE WHITE CIRCLE +25DA;N # UPPER HALF INVERSE WHITE CIRCLE +25DB;N # LOWER HALF INVERSE WHITE CIRCLE +25DC;N # UPPER LEFT QUADRANT CIRCULAR ARC +25DD;N # UPPER RIGHT QUADRANT CIRCULAR ARC +25DE;N # LOWER RIGHT QUADRANT CIRCULAR ARC +25DF;N # LOWER LEFT QUADRANT CIRCULAR ARC +25E0;N # UPPER HALF CIRCLE +25E1;N # LOWER HALF CIRCLE +25E2;A # BLACK LOWER RIGHT TRIANGLE +25E3;A # BLACK LOWER LEFT TRIANGLE +25E4;A # BLACK UPPER LEFT TRIANGLE +25E5;A # BLACK UPPER RIGHT TRIANGLE +25E6;N # WHITE BULLET +25E7;N # SQUARE WITH LEFT HALF BLACK +25E8;N # SQUARE WITH RIGHT HALF BLACK +25E9;N # SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK +25EA;N # SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK +25EB;N # WHITE SQUARE WITH VERTICAL BISECTING LINE +25EC;N # WHITE UP-POINTING TRIANGLE WITH DOT +25ED;N # UP-POINTING TRIANGLE WITH LEFT HALF BLACK +25EE;N # UP-POINTING TRIANGLE WITH RIGHT HALF BLACK +25EF;A # LARGE CIRCLE +25F0;N # WHITE SQUARE WITH UPPER LEFT QUADRANT +25F1;N # WHITE SQUARE WITH LOWER LEFT QUADRANT +25F2;N # WHITE SQUARE WITH LOWER RIGHT QUADRANT +25F3;N # WHITE SQUARE WITH UPPER RIGHT QUADRANT +25F4;N # WHITE CIRCLE WITH UPPER LEFT QUADRANT +25F5;N # WHITE CIRCLE WITH LOWER LEFT QUADRANT +25F6;N # WHITE CIRCLE WITH LOWER RIGHT QUADRANT +25F7;N # WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8;N # UPPER LEFT TRIANGLE +25F9;N # UPPER RIGHT TRIANGLE +25FA;N # LOWER LEFT TRIANGLE +25FB;N # WHITE MEDIUM SQUARE +25FC;N # BLACK MEDIUM SQUARE +25FD;N # WHITE MEDIUM SMALL SQUARE +25FE;N # BLACK MEDIUM SMALL SQUARE +25FF;N # LOWER RIGHT TRIANGLE +2600;N # BLACK SUN WITH RAYS +2601;N # CLOUD +2602;N # UMBRELLA +2603;N # SNOWMAN +2604;N # COMET +2605;A # BLACK STAR +2606;A # WHITE STAR +2607;N # LIGHTNING +2608;N # THUNDERSTORM +2609;A # SUN +260A;N # ASCENDING NODE +260B;N # DESCENDING NODE +260C;N # CONJUNCTION +260D;N # OPPOSITION +260E;A # BLACK TELEPHONE +260F;A # WHITE TELEPHONE +2610;N # BALLOT BOX +2611;N # BALLOT BOX WITH CHECK +2612;N # BALLOT BOX WITH X +2613;N # SALTIRE +2614;A # UMBRELLA WITH RAIN DROPS +2615;A # HOT BEVERAGE +2616;N # WHITE SHOGI PIECE +2617;N # BLACK SHOGI PIECE +2618;N # SHAMROCK +2619;N # REVERSED ROTATED FLORAL HEART BULLET +261A;N # BLACK LEFT POINTING INDEX +261B;N # BLACK RIGHT POINTING INDEX +261C;A # WHITE LEFT POINTING INDEX +261D;N # WHITE UP POINTING INDEX +261E;A # WHITE RIGHT POINTING INDEX +261F;N # WHITE DOWN POINTING INDEX +2620;N # SKULL AND CROSSBONES +2621;N # CAUTION SIGN +2622;N # RADIOACTIVE SIGN +2623;N # BIOHAZARD SIGN +2624;N # CADUCEUS +2625;N # ANKH +2626;N # ORTHODOX CROSS +2627;N # CHI RHO +2628;N # CROSS OF LORRAINE +2629;N # CROSS OF JERUSALEM +262A;N # STAR AND CRESCENT +262B;N # FARSI SYMBOL +262C;N # ADI SHAKTI +262D;N # HAMMER AND SICKLE +262E;N # PEACE SYMBOL +262F;N # YIN YANG +2630;N # TRIGRAM FOR HEAVEN +2631;N # TRIGRAM FOR LAKE +2632;N # TRIGRAM FOR FIRE +2633;N # TRIGRAM FOR THUNDER +2634;N # TRIGRAM FOR WIND +2635;N # TRIGRAM FOR WATER +2636;N # TRIGRAM FOR MOUNTAIN +2637;N # TRIGRAM FOR EARTH +2638;N # WHEEL OF DHARMA +2639;N # WHITE FROWNING FACE +263A;N # WHITE SMILING FACE +263B;N # BLACK SMILING FACE +263C;N # WHITE SUN WITH RAYS +263D;N # FIRST QUARTER MOON +263E;N # LAST QUARTER MOON +263F;N # MERCURY +2640;A # FEMALE SIGN +2641;N # EARTH +2642;A # MALE SIGN +2643;N # JUPITER +2644;N # SATURN +2645;N # URANUS +2646;N # NEPTUNE +2647;N # PLUTO +2648;N # ARIES +2649;N # TAURUS +264A;N # GEMINI +264B;N # CANCER +264C;N # LEO +264D;N # VIRGO +264E;N # LIBRA +264F;N # SCORPIUS +2650;N # SAGITTARIUS +2651;N # CAPRICORN +2652;N # AQUARIUS +2653;N # PISCES +2654;N # WHITE CHESS KING +2655;N # WHITE CHESS QUEEN +2656;N # WHITE CHESS ROOK +2657;N # WHITE CHESS BISHOP +2658;N # WHITE CHESS KNIGHT +2659;N # WHITE CHESS PAWN +265A;N # BLACK CHESS KING +265B;N # BLACK CHESS QUEEN +265C;N # BLACK CHESS ROOK +265D;N # BLACK CHESS BISHOP +265E;N # BLACK CHESS KNIGHT +265F;N # BLACK CHESS PAWN +2660;A # BLACK SPADE SUIT +2661;A # WHITE HEART SUIT +2662;N # WHITE DIAMOND SUIT +2663;A # BLACK CLUB SUIT +2664;A # WHITE SPADE SUIT +2665;A # BLACK HEART SUIT +2666;N # BLACK DIAMOND SUIT +2667;A # WHITE CLUB SUIT +2668;A # HOT SPRINGS +2669;A # QUARTER NOTE +266A;A # EIGHTH NOTE +266B;N # BEAMED EIGHTH NOTES +266C;A # BEAMED SIXTEENTH NOTES +266D;A # MUSIC FLAT SIGN +266E;N # MUSIC NATURAL SIGN +266F;A # MUSIC SHARP SIGN +2670;N # WEST SYRIAC CROSS +2671;N # EAST SYRIAC CROSS +2672;N # UNIVERSAL RECYCLING SYMBOL +2673;N # RECYCLING SYMBOL FOR TYPE-1 PLASTICS +2674;N # RECYCLING SYMBOL FOR TYPE-2 PLASTICS +2675;N # RECYCLING SYMBOL FOR TYPE-3 PLASTICS +2676;N # RECYCLING SYMBOL FOR TYPE-4 PLASTICS +2677;N # RECYCLING SYMBOL FOR TYPE-5 PLASTICS +2678;N # RECYCLING SYMBOL FOR TYPE-6 PLASTICS +2679;N # RECYCLING SYMBOL FOR TYPE-7 PLASTICS +267A;N # RECYCLING SYMBOL FOR GENERIC MATERIALS +267B;N # BLACK UNIVERSAL RECYCLING SYMBOL +267C;N # RECYCLED PAPER SYMBOL +267D;N # PARTIALLY-RECYCLED PAPER SYMBOL +267E;N # PERMANENT PAPER SIGN +267F;N # WHEELCHAIR SYMBOL +2680;N # DIE FACE-1 +2681;N # DIE FACE-2 +2682;N # DIE FACE-3 +2683;N # DIE FACE-4 +2684;N # DIE FACE-5 +2685;N # DIE FACE-6 +2686;N # WHITE CIRCLE WITH DOT RIGHT +2687;N # WHITE CIRCLE WITH TWO DOTS +2688;N # BLACK CIRCLE WITH WHITE DOT RIGHT +2689;N # BLACK CIRCLE WITH TWO WHITE DOTS +268A;N # MONOGRAM FOR YANG +268B;N # MONOGRAM FOR YIN +268C;N # DIGRAM FOR GREATER YANG +268D;N # DIGRAM FOR LESSER YIN +268E;N # DIGRAM FOR LESSER YANG +268F;N # DIGRAM FOR GREATER YIN +2690;N # WHITE FLAG +2691;N # BLACK FLAG +2692;N # HAMMER AND PICK +2693;N # ANCHOR +2694;N # CROSSED SWORDS +2695;N # STAFF OF AESCULAPIUS +2696;N # SCALES +2697;N # ALEMBIC +2698;N # FLOWER +2699;N # GEAR +269A;N # STAFF OF HERMES +269B;N # ATOM SYMBOL +269C;N # FLEUR-DE-LIS +26A0;N # WARNING SIGN +26A1;N # HIGH VOLTAGE SIGN +26A2;N # DOUBLED FEMALE SIGN +26A3;N # DOUBLED MALE SIGN +26A4;N # INTERLOCKED FEMALE AND MALE SIGN +26A5;N # MALE AND FEMALE SIGN +26A6;N # MALE WITH STROKE SIGN +26A7;N # MALE WITH STROKE AND MALE AND FEMALE SIGN +26A8;N # VERTICAL MALE WITH STROKE SIGN +26A9;N # HORIZONTAL MALE WITH STROKE SIGN +26AA;N # MEDIUM WHITE CIRCLE +26AB;N # MEDIUM BLACK CIRCLE +26AC;N # MEDIUM SMALL WHITE CIRCLE +26AD;N # MARRIAGE SYMBOL +26AE;N # DIVORCE SYMBOL +26AF;N # UNMARRIED PARTNERSHIP SYMBOL +26B0;N # COFFIN +26B1;N # FUNERAL URN +2701;N # UPPER BLADE SCISSORS +2702;N # BLACK SCISSORS +2703;N # LOWER BLADE SCISSORS +2704;N # WHITE SCISSORS +2706;N # TELEPHONE LOCATION SIGN +2707;N # TAPE DRIVE +2708;N # AIRPLANE +2709;N # ENVELOPE +270C;N # VICTORY HAND +270D;N # WRITING HAND +270E;N # LOWER RIGHT PENCIL +270F;N # PENCIL +2710;N # UPPER RIGHT PENCIL +2711;N # WHITE NIB +2712;N # BLACK NIB +2713;N # CHECK MARK +2714;N # HEAVY CHECK MARK +2715;N # MULTIPLICATION X +2716;N # HEAVY MULTIPLICATION X +2717;N # BALLOT X +2718;N # HEAVY BALLOT X +2719;N # OUTLINED GREEK CROSS +271A;N # HEAVY GREEK CROSS +271B;N # OPEN CENTRE CROSS +271C;N # HEAVY OPEN CENTRE CROSS +271D;N # LATIN CROSS +271E;N # SHADOWED WHITE LATIN CROSS +271F;N # OUTLINED LATIN CROSS +2720;N # MALTESE CROSS +2721;N # STAR OF DAVID +2722;N # FOUR TEARDROP-SPOKED ASTERISK +2723;N # FOUR BALLOON-SPOKED ASTERISK +2724;N # HEAVY FOUR BALLOON-SPOKED ASTERISK +2725;N # FOUR CLUB-SPOKED ASTERISK +2726;N # BLACK FOUR POINTED STAR +2727;N # WHITE FOUR POINTED STAR +2729;N # STRESS OUTLINED WHITE STAR +272A;N # CIRCLED WHITE STAR +272B;N # OPEN CENTRE BLACK STAR +272C;N # BLACK CENTRE WHITE STAR +272D;N # OUTLINED BLACK STAR +272E;N # HEAVY OUTLINED BLACK STAR +272F;N # PINWHEEL STAR +2730;N # SHADOWED WHITE STAR +2731;N # HEAVY ASTERISK +2732;N # OPEN CENTRE ASTERISK +2733;N # EIGHT SPOKED ASTERISK +2734;N # EIGHT POINTED BLACK STAR +2735;N # EIGHT POINTED PINWHEEL STAR +2736;N # SIX POINTED BLACK STAR +2737;N # EIGHT POINTED RECTILINEAR BLACK STAR +2738;N # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR +2739;N # TWELVE POINTED BLACK STAR +273A;N # SIXTEEN POINTED ASTERISK +273B;N # TEARDROP-SPOKED ASTERISK +273C;N # OPEN CENTRE TEARDROP-SPOKED ASTERISK +273D;A # HEAVY TEARDROP-SPOKED ASTERISK +273E;N # SIX PETALLED BLACK AND WHITE FLORETTE +273F;N # BLACK FLORETTE +2740;N # WHITE FLORETTE +2741;N # EIGHT PETALLED OUTLINED BLACK FLORETTE +2742;N # CIRCLED OPEN CENTRE EIGHT POINTED STAR +2743;N # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK +2744;N # SNOWFLAKE +2745;N # TIGHT TRIFOLIATE SNOWFLAKE +2746;N # HEAVY CHEVRON SNOWFLAKE +2747;N # SPARKLE +2748;N # HEAVY SPARKLE +2749;N # BALLOON-SPOKED ASTERISK +274A;N # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274B;N # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274D;N # SHADOWED WHITE CIRCLE +274F;N # LOWER RIGHT DROP-SHADOWED WHITE SQUARE +2750;N # UPPER RIGHT DROP-SHADOWED WHITE SQUARE +2751;N # LOWER RIGHT SHADOWED WHITE SQUARE +2752;N # UPPER RIGHT SHADOWED WHITE SQUARE +2756;N # BLACK DIAMOND MINUS WHITE X +2758;N # LIGHT VERTICAL BAR +2759;N # MEDIUM VERTICAL BAR +275A;N # HEAVY VERTICAL BAR +275B;N # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT +275C;N # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT +275D;N # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT +275E;N # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +2761;N # CURVED STEM PARAGRAPH SIGN ORNAMENT +2762;N # HEAVY EXCLAMATION MARK ORNAMENT +2763;N # HEAVY HEART EXCLAMATION MARK ORNAMENT +2764;N # HEAVY BLACK HEART +2765;N # ROTATED HEAVY BLACK HEART BULLET +2766;N # FLORAL HEART +2767;N # ROTATED FLORAL HEART BULLET +2768;N # MEDIUM LEFT PARENTHESIS ORNAMENT +2769;N # MEDIUM RIGHT PARENTHESIS ORNAMENT +276A;N # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B;N # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C;N # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D;N # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E;N # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F;N # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770;N # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771;N # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772;N # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773;N # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774;N # MEDIUM LEFT CURLY BRACKET ORNAMENT +2775;N # MEDIUM RIGHT CURLY BRACKET ORNAMENT +2776;A # DINGBAT NEGATIVE CIRCLED DIGIT ONE +2777;A # DINGBAT NEGATIVE CIRCLED DIGIT TWO +2778;A # DINGBAT NEGATIVE CIRCLED DIGIT THREE +2779;A # DINGBAT NEGATIVE CIRCLED DIGIT FOUR +277A;A # DINGBAT NEGATIVE CIRCLED DIGIT FIVE +277B;A # DINGBAT NEGATIVE CIRCLED DIGIT SIX +277C;A # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN +277D;A # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT +277E;A # DINGBAT NEGATIVE CIRCLED DIGIT NINE +277F;A # DINGBAT NEGATIVE CIRCLED NUMBER TEN +2780;N # DINGBAT CIRCLED SANS-SERIF DIGIT ONE +2781;N # DINGBAT CIRCLED SANS-SERIF DIGIT TWO +2782;N # DINGBAT CIRCLED SANS-SERIF DIGIT THREE +2783;N # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR +2784;N # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE +2785;N # DINGBAT CIRCLED SANS-SERIF DIGIT SIX +2786;N # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN +2787;N # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT +2788;N # DINGBAT CIRCLED SANS-SERIF DIGIT NINE +2789;N # DINGBAT CIRCLED SANS-SERIF NUMBER TEN +278A;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE +278B;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO +278C;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE +278D;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR +278E;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE +278F;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX +2790;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN +2791;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT +2792;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE +2793;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +2794;N # HEAVY WIDE-HEADED RIGHTWARDS ARROW +2798;N # HEAVY SOUTH EAST ARROW +2799;N # HEAVY RIGHTWARDS ARROW +279A;N # HEAVY NORTH EAST ARROW +279B;N # DRAFTING POINT RIGHTWARDS ARROW +279C;N # HEAVY ROUND-TIPPED RIGHTWARDS ARROW +279D;N # TRIANGLE-HEADED RIGHTWARDS ARROW +279E;N # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW +279F;N # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +27A0;N # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +27A1;N # BLACK RIGHTWARDS ARROW +27A2;N # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD +27A3;N # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD +27A4;N # BLACK RIGHTWARDS ARROWHEAD +27A5;N # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW +27A6;N # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW +27A7;N # SQUAT BLACK RIGHTWARDS ARROW +27A8;N # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW +27A9;N # RIGHT-SHADED WHITE RIGHTWARDS ARROW +27AA;N # LEFT-SHADED WHITE RIGHTWARDS ARROW +27AB;N # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW +27AC;N # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW +27AD;N # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27AE;N # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27AF;N # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B1;N # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B2;N # CIRCLED HEAVY WHITE RIGHTWARDS ARROW +27B3;N # WHITE-FEATHERED RIGHTWARDS ARROW +27B4;N # BLACK-FEATHERED SOUTH EAST ARROW +27B5;N # BLACK-FEATHERED RIGHTWARDS ARROW +27B6;N # BLACK-FEATHERED NORTH EAST ARROW +27B7;N # HEAVY BLACK-FEATHERED SOUTH EAST ARROW +27B8;N # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW +27B9;N # HEAVY BLACK-FEATHERED NORTH EAST ARROW +27BA;N # TEARDROP-BARBED RIGHTWARDS ARROW +27BB;N # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW +27BC;N # WEDGE-TAILED RIGHTWARDS ARROW +27BD;N # HEAVY WEDGE-TAILED RIGHTWARDS ARROW +27BE;N # OPEN-OUTLINED RIGHTWARDS ARROW +27C0;N # THREE DIMENSIONAL ANGLE +27C1;N # WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE +27C2;N # PERPENDICULAR +27C3;N # OPEN SUBSET +27C4;N # OPEN SUPERSET +27C5;N # LEFT S-SHAPED BAG DELIMITER +27C6;N # RIGHT S-SHAPED BAG DELIMITER +27D0;N # WHITE DIAMOND WITH CENTRED DOT +27D1;N # AND WITH DOT +27D2;N # ELEMENT OF OPENING UPWARDS +27D3;N # LOWER RIGHT CORNER WITH DOT +27D4;N # UPPER LEFT CORNER WITH DOT +27D5;N # LEFT OUTER JOIN +27D6;N # RIGHT OUTER JOIN +27D7;N # FULL OUTER JOIN +27D8;N # LARGE UP TACK +27D9;N # LARGE DOWN TACK +27DA;N # LEFT AND RIGHT DOUBLE TURNSTILE +27DB;N # LEFT AND RIGHT TACK +27DC;N # LEFT MULTIMAP +27DD;N # LONG RIGHT TACK +27DE;N # LONG LEFT TACK +27DF;N # UP TACK WITH CIRCLE ABOVE +27E0;N # LOZENGE DIVIDED BY HORIZONTAL RULE +27E1;N # WHITE CONCAVE-SIDED DIAMOND +27E2;N # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK +27E3;N # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK +27E4;N # WHITE SQUARE WITH LEFTWARDS TICK +27E5;N # WHITE SQUARE WITH RIGHTWARDS TICK +27E6;Na # MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7;Na # MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8;Na # MATHEMATICAL LEFT ANGLE BRACKET +27E9;Na # MATHEMATICAL RIGHT ANGLE BRACKET +27EA;Na # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB;Na # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27F0;N # UPWARDS QUADRUPLE ARROW +27F1;N # DOWNWARDS QUADRUPLE ARROW +27F2;N # ANTICLOCKWISE GAPPED CIRCLE ARROW +27F3;N # CLOCKWISE GAPPED CIRCLE ARROW +27F4;N # RIGHT ARROW WITH CIRCLED PLUS +27F5;N # LONG LEFTWARDS ARROW +27F6;N # LONG RIGHTWARDS ARROW +27F7;N # LONG LEFT RIGHT ARROW +27F8;N # LONG LEFTWARDS DOUBLE ARROW +27F9;N # LONG RIGHTWARDS DOUBLE ARROW +27FA;N # LONG LEFT RIGHT DOUBLE ARROW +27FB;N # LONG LEFTWARDS ARROW FROM BAR +27FC;N # LONG RIGHTWARDS ARROW FROM BAR +27FD;N # LONG LEFTWARDS DOUBLE ARROW FROM BAR +27FE;N # LONG RIGHTWARDS DOUBLE ARROW FROM BAR +27FF;N # LONG RIGHTWARDS SQUIGGLE ARROW +2800;N # BRAILLE PATTERN BLANK +2801;N # BRAILLE PATTERN DOTS-1 +2802;N # BRAILLE PATTERN DOTS-2 +2803;N # BRAILLE PATTERN DOTS-12 +2804;N # BRAILLE PATTERN DOTS-3 +2805;N # BRAILLE PATTERN DOTS-13 +2806;N # BRAILLE PATTERN DOTS-23 +2807;N # BRAILLE PATTERN DOTS-123 +2808;N # BRAILLE PATTERN DOTS-4 +2809;N # BRAILLE PATTERN DOTS-14 +280A;N # BRAILLE PATTERN DOTS-24 +280B;N # BRAILLE PATTERN DOTS-124 +280C;N # BRAILLE PATTERN DOTS-34 +280D;N # BRAILLE PATTERN DOTS-134 +280E;N # BRAILLE PATTERN DOTS-234 +280F;N # BRAILLE PATTERN DOTS-1234 +2810;N # BRAILLE PATTERN DOTS-5 +2811;N # BRAILLE PATTERN DOTS-15 +2812;N # BRAILLE PATTERN DOTS-25 +2813;N # BRAILLE PATTERN DOTS-125 +2814;N # BRAILLE PATTERN DOTS-35 +2815;N # BRAILLE PATTERN DOTS-135 +2816;N # BRAILLE PATTERN DOTS-235 +2817;N # BRAILLE PATTERN DOTS-1235 +2818;N # BRAILLE PATTERN DOTS-45 +2819;N # BRAILLE PATTERN DOTS-145 +281A;N # BRAILLE PATTERN DOTS-245 +281B;N # BRAILLE PATTERN DOTS-1245 +281C;N # BRAILLE PATTERN DOTS-345 +281D;N # BRAILLE PATTERN DOTS-1345 +281E;N # BRAILLE PATTERN DOTS-2345 +281F;N # BRAILLE PATTERN DOTS-12345 +2820;N # BRAILLE PATTERN DOTS-6 +2821;N # BRAILLE PATTERN DOTS-16 +2822;N # BRAILLE PATTERN DOTS-26 +2823;N # BRAILLE PATTERN DOTS-126 +2824;N # BRAILLE PATTERN DOTS-36 +2825;N # BRAILLE PATTERN DOTS-136 +2826;N # BRAILLE PATTERN DOTS-236 +2827;N # BRAILLE PATTERN DOTS-1236 +2828;N # BRAILLE PATTERN DOTS-46 +2829;N # BRAILLE PATTERN DOTS-146 +282A;N # BRAILLE PATTERN DOTS-246 +282B;N # BRAILLE PATTERN DOTS-1246 +282C;N # BRAILLE PATTERN DOTS-346 +282D;N # BRAILLE PATTERN DOTS-1346 +282E;N # BRAILLE PATTERN DOTS-2346 +282F;N # BRAILLE PATTERN DOTS-12346 +2830;N # BRAILLE PATTERN DOTS-56 +2831;N # BRAILLE PATTERN DOTS-156 +2832;N # BRAILLE PATTERN DOTS-256 +2833;N # BRAILLE PATTERN DOTS-1256 +2834;N # BRAILLE PATTERN DOTS-356 +2835;N # BRAILLE PATTERN DOTS-1356 +2836;N # BRAILLE PATTERN DOTS-2356 +2837;N # BRAILLE PATTERN DOTS-12356 +2838;N # BRAILLE PATTERN DOTS-456 +2839;N # BRAILLE PATTERN DOTS-1456 +283A;N # BRAILLE PATTERN DOTS-2456 +283B;N # BRAILLE PATTERN DOTS-12456 +283C;N # BRAILLE PATTERN DOTS-3456 +283D;N # BRAILLE PATTERN DOTS-13456 +283E;N # BRAILLE PATTERN DOTS-23456 +283F;N # BRAILLE PATTERN DOTS-123456 +2840;N # BRAILLE PATTERN DOTS-7 +2841;N # BRAILLE PATTERN DOTS-17 +2842;N # BRAILLE PATTERN DOTS-27 +2843;N # BRAILLE PATTERN DOTS-127 +2844;N # BRAILLE PATTERN DOTS-37 +2845;N # BRAILLE PATTERN DOTS-137 +2846;N # BRAILLE PATTERN DOTS-237 +2847;N # BRAILLE PATTERN DOTS-1237 +2848;N # BRAILLE PATTERN DOTS-47 +2849;N # BRAILLE PATTERN DOTS-147 +284A;N # BRAILLE PATTERN DOTS-247 +284B;N # BRAILLE PATTERN DOTS-1247 +284C;N # BRAILLE PATTERN DOTS-347 +284D;N # BRAILLE PATTERN DOTS-1347 +284E;N # BRAILLE PATTERN DOTS-2347 +284F;N # BRAILLE PATTERN DOTS-12347 +2850;N # BRAILLE PATTERN DOTS-57 +2851;N # BRAILLE PATTERN DOTS-157 +2852;N # BRAILLE PATTERN DOTS-257 +2853;N # BRAILLE PATTERN DOTS-1257 +2854;N # BRAILLE PATTERN DOTS-357 +2855;N # BRAILLE PATTERN DOTS-1357 +2856;N # BRAILLE PATTERN DOTS-2357 +2857;N # BRAILLE PATTERN DOTS-12357 +2858;N # BRAILLE PATTERN DOTS-457 +2859;N # BRAILLE PATTERN DOTS-1457 +285A;N # BRAILLE PATTERN DOTS-2457 +285B;N # BRAILLE PATTERN DOTS-12457 +285C;N # BRAILLE PATTERN DOTS-3457 +285D;N # BRAILLE PATTERN DOTS-13457 +285E;N # BRAILLE PATTERN DOTS-23457 +285F;N # BRAILLE PATTERN DOTS-123457 +2860;N # BRAILLE PATTERN DOTS-67 +2861;N # BRAILLE PATTERN DOTS-167 +2862;N # BRAILLE PATTERN DOTS-267 +2863;N # BRAILLE PATTERN DOTS-1267 +2864;N # BRAILLE PATTERN DOTS-367 +2865;N # BRAILLE PATTERN DOTS-1367 +2866;N # BRAILLE PATTERN DOTS-2367 +2867;N # BRAILLE PATTERN DOTS-12367 +2868;N # BRAILLE PATTERN DOTS-467 +2869;N # BRAILLE PATTERN DOTS-1467 +286A;N # BRAILLE PATTERN DOTS-2467 +286B;N # BRAILLE PATTERN DOTS-12467 +286C;N # BRAILLE PATTERN DOTS-3467 +286D;N # BRAILLE PATTERN DOTS-13467 +286E;N # BRAILLE PATTERN DOTS-23467 +286F;N # BRAILLE PATTERN DOTS-123467 +2870;N # BRAILLE PATTERN DOTS-567 +2871;N # BRAILLE PATTERN DOTS-1567 +2872;N # BRAILLE PATTERN DOTS-2567 +2873;N # BRAILLE PATTERN DOTS-12567 +2874;N # BRAILLE PATTERN DOTS-3567 +2875;N # BRAILLE PATTERN DOTS-13567 +2876;N # BRAILLE PATTERN DOTS-23567 +2877;N # BRAILLE PATTERN DOTS-123567 +2878;N # BRAILLE PATTERN DOTS-4567 +2879;N # BRAILLE PATTERN DOTS-14567 +287A;N # BRAILLE PATTERN DOTS-24567 +287B;N # BRAILLE PATTERN DOTS-124567 +287C;N # BRAILLE PATTERN DOTS-34567 +287D;N # BRAILLE PATTERN DOTS-134567 +287E;N # BRAILLE PATTERN DOTS-234567 +287F;N # BRAILLE PATTERN DOTS-1234567 +2880;N # BRAILLE PATTERN DOTS-8 +2881;N # BRAILLE PATTERN DOTS-18 +2882;N # BRAILLE PATTERN DOTS-28 +2883;N # BRAILLE PATTERN DOTS-128 +2884;N # BRAILLE PATTERN DOTS-38 +2885;N # BRAILLE PATTERN DOTS-138 +2886;N # BRAILLE PATTERN DOTS-238 +2887;N # BRAILLE PATTERN DOTS-1238 +2888;N # BRAILLE PATTERN DOTS-48 +2889;N # BRAILLE PATTERN DOTS-148 +288A;N # BRAILLE PATTERN DOTS-248 +288B;N # BRAILLE PATTERN DOTS-1248 +288C;N # BRAILLE PATTERN DOTS-348 +288D;N # BRAILLE PATTERN DOTS-1348 +288E;N # BRAILLE PATTERN DOTS-2348 +288F;N # BRAILLE PATTERN DOTS-12348 +2890;N # BRAILLE PATTERN DOTS-58 +2891;N # BRAILLE PATTERN DOTS-158 +2892;N # BRAILLE PATTERN DOTS-258 +2893;N # BRAILLE PATTERN DOTS-1258 +2894;N # BRAILLE PATTERN DOTS-358 +2895;N # BRAILLE PATTERN DOTS-1358 +2896;N # BRAILLE PATTERN DOTS-2358 +2897;N # BRAILLE PATTERN DOTS-12358 +2898;N # BRAILLE PATTERN DOTS-458 +2899;N # BRAILLE PATTERN DOTS-1458 +289A;N # BRAILLE PATTERN DOTS-2458 +289B;N # BRAILLE PATTERN DOTS-12458 +289C;N # BRAILLE PATTERN DOTS-3458 +289D;N # BRAILLE PATTERN DOTS-13458 +289E;N # BRAILLE PATTERN DOTS-23458 +289F;N # BRAILLE PATTERN DOTS-123458 +28A0;N # BRAILLE PATTERN DOTS-68 +28A1;N # BRAILLE PATTERN DOTS-168 +28A2;N # BRAILLE PATTERN DOTS-268 +28A3;N # BRAILLE PATTERN DOTS-1268 +28A4;N # BRAILLE PATTERN DOTS-368 +28A5;N # BRAILLE PATTERN DOTS-1368 +28A6;N # BRAILLE PATTERN DOTS-2368 +28A7;N # BRAILLE PATTERN DOTS-12368 +28A8;N # BRAILLE PATTERN DOTS-468 +28A9;N # BRAILLE PATTERN DOTS-1468 +28AA;N # BRAILLE PATTERN DOTS-2468 +28AB;N # BRAILLE PATTERN DOTS-12468 +28AC;N # BRAILLE PATTERN DOTS-3468 +28AD;N # BRAILLE PATTERN DOTS-13468 +28AE;N # BRAILLE PATTERN DOTS-23468 +28AF;N # BRAILLE PATTERN DOTS-123468 +28B0;N # BRAILLE PATTERN DOTS-568 +28B1;N # BRAILLE PATTERN DOTS-1568 +28B2;N # BRAILLE PATTERN DOTS-2568 +28B3;N # BRAILLE PATTERN DOTS-12568 +28B4;N # BRAILLE PATTERN DOTS-3568 +28B5;N # BRAILLE PATTERN DOTS-13568 +28B6;N # BRAILLE PATTERN DOTS-23568 +28B7;N # BRAILLE PATTERN DOTS-123568 +28B8;N # BRAILLE PATTERN DOTS-4568 +28B9;N # BRAILLE PATTERN DOTS-14568 +28BA;N # BRAILLE PATTERN DOTS-24568 +28BB;N # BRAILLE PATTERN DOTS-124568 +28BC;N # BRAILLE PATTERN DOTS-34568 +28BD;N # BRAILLE PATTERN DOTS-134568 +28BE;N # BRAILLE PATTERN DOTS-234568 +28BF;N # BRAILLE PATTERN DOTS-1234568 +28C0;N # BRAILLE PATTERN DOTS-78 +28C1;N # BRAILLE PATTERN DOTS-178 +28C2;N # BRAILLE PATTERN DOTS-278 +28C3;N # BRAILLE PATTERN DOTS-1278 +28C4;N # BRAILLE PATTERN DOTS-378 +28C5;N # BRAILLE PATTERN DOTS-1378 +28C6;N # BRAILLE PATTERN DOTS-2378 +28C7;N # BRAILLE PATTERN DOTS-12378 +28C8;N # BRAILLE PATTERN DOTS-478 +28C9;N # BRAILLE PATTERN DOTS-1478 +28CA;N # BRAILLE PATTERN DOTS-2478 +28CB;N # BRAILLE PATTERN DOTS-12478 +28CC;N # BRAILLE PATTERN DOTS-3478 +28CD;N # BRAILLE PATTERN DOTS-13478 +28CE;N # BRAILLE PATTERN DOTS-23478 +28CF;N # BRAILLE PATTERN DOTS-123478 +28D0;N # BRAILLE PATTERN DOTS-578 +28D1;N # BRAILLE PATTERN DOTS-1578 +28D2;N # BRAILLE PATTERN DOTS-2578 +28D3;N # BRAILLE PATTERN DOTS-12578 +28D4;N # BRAILLE PATTERN DOTS-3578 +28D5;N # BRAILLE PATTERN DOTS-13578 +28D6;N # BRAILLE PATTERN DOTS-23578 +28D7;N # BRAILLE PATTERN DOTS-123578 +28D8;N # BRAILLE PATTERN DOTS-4578 +28D9;N # BRAILLE PATTERN DOTS-14578 +28DA;N # BRAILLE PATTERN DOTS-24578 +28DB;N # BRAILLE PATTERN DOTS-124578 +28DC;N # BRAILLE PATTERN DOTS-34578 +28DD;N # BRAILLE PATTERN DOTS-134578 +28DE;N # BRAILLE PATTERN DOTS-234578 +28DF;N # BRAILLE PATTERN DOTS-1234578 +28E0;N # BRAILLE PATTERN DOTS-678 +28E1;N # BRAILLE PATTERN DOTS-1678 +28E2;N # BRAILLE PATTERN DOTS-2678 +28E3;N # BRAILLE PATTERN DOTS-12678 +28E4;N # BRAILLE PATTERN DOTS-3678 +28E5;N # BRAILLE PATTERN DOTS-13678 +28E6;N # BRAILLE PATTERN DOTS-23678 +28E7;N # BRAILLE PATTERN DOTS-123678 +28E8;N # BRAILLE PATTERN DOTS-4678 +28E9;N # BRAILLE PATTERN DOTS-14678 +28EA;N # BRAILLE PATTERN DOTS-24678 +28EB;N # BRAILLE PATTERN DOTS-124678 +28EC;N # BRAILLE PATTERN DOTS-34678 +28ED;N # BRAILLE PATTERN DOTS-134678 +28EE;N # BRAILLE PATTERN DOTS-234678 +28EF;N # BRAILLE PATTERN DOTS-1234678 +28F0;N # BRAILLE PATTERN DOTS-5678 +28F1;N # BRAILLE PATTERN DOTS-15678 +28F2;N # BRAILLE PATTERN DOTS-25678 +28F3;N # BRAILLE PATTERN DOTS-125678 +28F4;N # BRAILLE PATTERN DOTS-35678 +28F5;N # BRAILLE PATTERN DOTS-135678 +28F6;N # BRAILLE PATTERN DOTS-235678 +28F7;N # BRAILLE PATTERN DOTS-1235678 +28F8;N # BRAILLE PATTERN DOTS-45678 +28F9;N # BRAILLE PATTERN DOTS-145678 +28FA;N # BRAILLE PATTERN DOTS-245678 +28FB;N # BRAILLE PATTERN DOTS-1245678 +28FC;N # BRAILLE PATTERN DOTS-345678 +28FD;N # BRAILLE PATTERN DOTS-1345678 +28FE;N # BRAILLE PATTERN DOTS-2345678 +28FF;N # BRAILLE PATTERN DOTS-12345678 +2900;N # RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE +2901;N # RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE +2902;N # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE +2903;N # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE +2904;N # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE +2905;N # RIGHTWARDS TWO-HEADED ARROW FROM BAR +2906;N # LEFTWARDS DOUBLE ARROW FROM BAR +2907;N # RIGHTWARDS DOUBLE ARROW FROM BAR +2908;N # DOWNWARDS ARROW WITH HORIZONTAL STROKE +2909;N # UPWARDS ARROW WITH HORIZONTAL STROKE +290A;N # UPWARDS TRIPLE ARROW +290B;N # DOWNWARDS TRIPLE ARROW +290C;N # LEFTWARDS DOUBLE DASH ARROW +290D;N # RIGHTWARDS DOUBLE DASH ARROW +290E;N # LEFTWARDS TRIPLE DASH ARROW +290F;N # RIGHTWARDS TRIPLE DASH ARROW +2910;N # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW +2911;N # RIGHTWARDS ARROW WITH DOTTED STEM +2912;N # UPWARDS ARROW TO BAR +2913;N # DOWNWARDS ARROW TO BAR +2914;N # RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE +2915;N # RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2916;N # RIGHTWARDS TWO-HEADED ARROW WITH TAIL +2917;N # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE +2918;N # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2919;N # LEFTWARDS ARROW-TAIL +291A;N # RIGHTWARDS ARROW-TAIL +291B;N # LEFTWARDS DOUBLE ARROW-TAIL +291C;N # RIGHTWARDS DOUBLE ARROW-TAIL +291D;N # LEFTWARDS ARROW TO BLACK DIAMOND +291E;N # RIGHTWARDS ARROW TO BLACK DIAMOND +291F;N # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND +2920;N # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND +2921;N # NORTH WEST AND SOUTH EAST ARROW +2922;N # NORTH EAST AND SOUTH WEST ARROW +2923;N # NORTH WEST ARROW WITH HOOK +2924;N # NORTH EAST ARROW WITH HOOK +2925;N # SOUTH EAST ARROW WITH HOOK +2926;N # SOUTH WEST ARROW WITH HOOK +2927;N # NORTH WEST ARROW AND NORTH EAST ARROW +2928;N # NORTH EAST ARROW AND SOUTH EAST ARROW +2929;N # SOUTH EAST ARROW AND SOUTH WEST ARROW +292A;N # SOUTH WEST ARROW AND NORTH WEST ARROW +292B;N # RISING DIAGONAL CROSSING FALLING DIAGONAL +292C;N # FALLING DIAGONAL CROSSING RISING DIAGONAL +292D;N # SOUTH EAST ARROW CROSSING NORTH EAST ARROW +292E;N # NORTH EAST ARROW CROSSING SOUTH EAST ARROW +292F;N # FALLING DIAGONAL CROSSING NORTH EAST ARROW +2930;N # RISING DIAGONAL CROSSING SOUTH EAST ARROW +2931;N # NORTH EAST ARROW CROSSING NORTH WEST ARROW +2932;N # NORTH WEST ARROW CROSSING NORTH EAST ARROW +2933;N # WAVE ARROW POINTING DIRECTLY RIGHT +2934;N # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS +2935;N # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS +2936;N # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS +2937;N # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS +2938;N # RIGHT-SIDE ARC CLOCKWISE ARROW +2939;N # LEFT-SIDE ARC ANTICLOCKWISE ARROW +293A;N # TOP ARC ANTICLOCKWISE ARROW +293B;N # BOTTOM ARC ANTICLOCKWISE ARROW +293C;N # TOP ARC CLOCKWISE ARROW WITH MINUS +293D;N # TOP ARC ANTICLOCKWISE ARROW WITH PLUS +293E;N # LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW +293F;N # LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW +2940;N # ANTICLOCKWISE CLOSED CIRCLE ARROW +2941;N # CLOCKWISE CLOSED CIRCLE ARROW +2942;N # RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW +2943;N # LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW +2944;N # SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW +2945;N # RIGHTWARDS ARROW WITH PLUS BELOW +2946;N # LEFTWARDS ARROW WITH PLUS BELOW +2947;N # RIGHTWARDS ARROW THROUGH X +2948;N # LEFT RIGHT ARROW THROUGH SMALL CIRCLE +2949;N # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE +294A;N # LEFT BARB UP RIGHT BARB DOWN HARPOON +294B;N # LEFT BARB DOWN RIGHT BARB UP HARPOON +294C;N # UP BARB RIGHT DOWN BARB LEFT HARPOON +294D;N # UP BARB LEFT DOWN BARB RIGHT HARPOON +294E;N # LEFT BARB UP RIGHT BARB UP HARPOON +294F;N # UP BARB RIGHT DOWN BARB RIGHT HARPOON +2950;N # LEFT BARB DOWN RIGHT BARB DOWN HARPOON +2951;N # UP BARB LEFT DOWN BARB LEFT HARPOON +2952;N # LEFTWARDS HARPOON WITH BARB UP TO BAR +2953;N # RIGHTWARDS HARPOON WITH BARB UP TO BAR +2954;N # UPWARDS HARPOON WITH BARB RIGHT TO BAR +2955;N # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR +2956;N # LEFTWARDS HARPOON WITH BARB DOWN TO BAR +2957;N # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR +2958;N # UPWARDS HARPOON WITH BARB LEFT TO BAR +2959;N # DOWNWARDS HARPOON WITH BARB LEFT TO BAR +295A;N # LEFTWARDS HARPOON WITH BARB UP FROM BAR +295B;N # RIGHTWARDS HARPOON WITH BARB UP FROM BAR +295C;N # UPWARDS HARPOON WITH BARB RIGHT FROM BAR +295D;N # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR +295E;N # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR +295F;N # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR +2960;N # UPWARDS HARPOON WITH BARB LEFT FROM BAR +2961;N # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR +2962;N # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN +2963;N # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +2964;N # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +2965;N # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +2966;N # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP +2967;N # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +2968;N # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP +2969;N # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN +296A;N # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +296B;N # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +296C;N # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +296D;N # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +296E;N # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +296F;N # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +2970;N # RIGHT DOUBLE ARROW WITH ROUNDED HEAD +2971;N # EQUALS SIGN ABOVE RIGHTWARDS ARROW +2972;N # TILDE OPERATOR ABOVE RIGHTWARDS ARROW +2973;N # LEFTWARDS ARROW ABOVE TILDE OPERATOR +2974;N # RIGHTWARDS ARROW ABOVE TILDE OPERATOR +2975;N # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO +2976;N # LESS-THAN ABOVE LEFTWARDS ARROW +2977;N # LEFTWARDS ARROW THROUGH LESS-THAN +2978;N # GREATER-THAN ABOVE RIGHTWARDS ARROW +2979;N # SUBSET ABOVE RIGHTWARDS ARROW +297A;N # LEFTWARDS ARROW THROUGH SUBSET +297B;N # SUPERSET ABOVE LEFTWARDS ARROW +297C;N # LEFT FISH TAIL +297D;N # RIGHT FISH TAIL +297E;N # UP FISH TAIL +297F;N # DOWN FISH TAIL +2980;N # TRIPLE VERTICAL BAR DELIMITER +2981;N # Z NOTATION SPOT +2982;N # Z NOTATION TYPE COLON +2983;N # LEFT WHITE CURLY BRACKET +2984;N # RIGHT WHITE CURLY BRACKET +2985;Na # LEFT WHITE PARENTHESIS +2986;Na # RIGHT WHITE PARENTHESIS +2987;N # Z NOTATION LEFT IMAGE BRACKET +2988;N # Z NOTATION RIGHT IMAGE BRACKET +2989;N # Z NOTATION LEFT BINDING BRACKET +298A;N # Z NOTATION RIGHT BINDING BRACKET +298B;N # LEFT SQUARE BRACKET WITH UNDERBAR +298C;N # RIGHT SQUARE BRACKET WITH UNDERBAR +298D;N # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E;N # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F;N # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990;N # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991;N # LEFT ANGLE BRACKET WITH DOT +2992;N # RIGHT ANGLE BRACKET WITH DOT +2993;N # LEFT ARC LESS-THAN BRACKET +2994;N # RIGHT ARC GREATER-THAN BRACKET +2995;N # DOUBLE LEFT ARC GREATER-THAN BRACKET +2996;N # DOUBLE RIGHT ARC LESS-THAN BRACKET +2997;N # LEFT BLACK TORTOISE SHELL BRACKET +2998;N # RIGHT BLACK TORTOISE SHELL BRACKET +2999;N # DOTTED FENCE +299A;N # VERTICAL ZIGZAG LINE +299B;N # MEASURED ANGLE OPENING LEFT +299C;N # RIGHT ANGLE VARIANT WITH SQUARE +299D;N # MEASURED RIGHT ANGLE WITH DOT +299E;N # ANGLE WITH S INSIDE +299F;N # ACUTE ANGLE +29A0;N # SPHERICAL ANGLE OPENING LEFT +29A1;N # SPHERICAL ANGLE OPENING UP +29A2;N # TURNED ANGLE +29A3;N # REVERSED ANGLE +29A4;N # ANGLE WITH UNDERBAR +29A5;N # REVERSED ANGLE WITH UNDERBAR +29A6;N # OBLIQUE ANGLE OPENING UP +29A7;N # OBLIQUE ANGLE OPENING DOWN +29A8;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT +29A9;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT +29AA;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT +29AB;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT +29AC;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP +29AD;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP +29AE;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN +29AF;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN +29B0;N # REVERSED EMPTY SET +29B1;N # EMPTY SET WITH OVERBAR +29B2;N # EMPTY SET WITH SMALL CIRCLE ABOVE +29B3;N # EMPTY SET WITH RIGHT ARROW ABOVE +29B4;N # EMPTY SET WITH LEFT ARROW ABOVE +29B5;N # CIRCLE WITH HORIZONTAL BAR +29B6;N # CIRCLED VERTICAL BAR +29B7;N # CIRCLED PARALLEL +29B8;N # CIRCLED REVERSE SOLIDUS +29B9;N # CIRCLED PERPENDICULAR +29BA;N # CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR +29BB;N # CIRCLE WITH SUPERIMPOSED X +29BC;N # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN +29BD;N # UP ARROW THROUGH CIRCLE +29BE;N # CIRCLED WHITE BULLET +29BF;N # CIRCLED BULLET +29C0;N # CIRCLED LESS-THAN +29C1;N # CIRCLED GREATER-THAN +29C2;N # CIRCLE WITH SMALL CIRCLE TO THE RIGHT +29C3;N # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT +29C4;N # SQUARED RISING DIAGONAL SLASH +29C5;N # SQUARED FALLING DIAGONAL SLASH +29C6;N # SQUARED ASTERISK +29C7;N # SQUARED SMALL CIRCLE +29C8;N # SQUARED SQUARE +29C9;N # TWO JOINED SQUARES +29CA;N # TRIANGLE WITH DOT ABOVE +29CB;N # TRIANGLE WITH UNDERBAR +29CC;N # S IN TRIANGLE +29CD;N # TRIANGLE WITH SERIFS AT BOTTOM +29CE;N # RIGHT TRIANGLE ABOVE LEFT TRIANGLE +29CF;N # LEFT TRIANGLE BESIDE VERTICAL BAR +29D0;N # VERTICAL BAR BESIDE RIGHT TRIANGLE +29D1;N # BOWTIE WITH LEFT HALF BLACK +29D2;N # BOWTIE WITH RIGHT HALF BLACK +29D3;N # BLACK BOWTIE +29D4;N # TIMES WITH LEFT HALF BLACK +29D5;N # TIMES WITH RIGHT HALF BLACK +29D6;N # WHITE HOURGLASS +29D7;N # BLACK HOURGLASS +29D8;N # LEFT WIGGLY FENCE +29D9;N # RIGHT WIGGLY FENCE +29DA;N # LEFT DOUBLE WIGGLY FENCE +29DB;N # RIGHT DOUBLE WIGGLY FENCE +29DC;N # INCOMPLETE INFINITY +29DD;N # TIE OVER INFINITY +29DE;N # INFINITY NEGATED WITH VERTICAL BAR +29DF;N # DOUBLE-ENDED MULTIMAP +29E0;N # SQUARE WITH CONTOURED OUTLINE +29E1;N # INCREASES AS +29E2;N # SHUFFLE PRODUCT +29E3;N # EQUALS SIGN AND SLANTED PARALLEL +29E4;N # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE +29E5;N # IDENTICAL TO AND SLANTED PARALLEL +29E6;N # GLEICH STARK +29E7;N # THERMODYNAMIC +29E8;N # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK +29E9;N # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK +29EA;N # BLACK DIAMOND WITH DOWN ARROW +29EB;N # BLACK LOZENGE +29EC;N # WHITE CIRCLE WITH DOWN ARROW +29ED;N # BLACK CIRCLE WITH DOWN ARROW +29EE;N # ERROR-BARRED WHITE SQUARE +29EF;N # ERROR-BARRED BLACK SQUARE +29F0;N # ERROR-BARRED WHITE DIAMOND +29F1;N # ERROR-BARRED BLACK DIAMOND +29F2;N # ERROR-BARRED WHITE CIRCLE +29F3;N # ERROR-BARRED BLACK CIRCLE +29F4;N # RULE-DELAYED +29F5;N # REVERSE SOLIDUS OPERATOR +29F6;N # SOLIDUS WITH OVERBAR +29F7;N # REVERSE SOLIDUS WITH HORIZONTAL STROKE +29F8;N # BIG SOLIDUS +29F9;N # BIG REVERSE SOLIDUS +29FA;N # DOUBLE PLUS +29FB;N # TRIPLE PLUS +29FC;N # LEFT-POINTING CURVED ANGLE BRACKET +29FD;N # RIGHT-POINTING CURVED ANGLE BRACKET +29FE;N # TINY +29FF;N # MINY +2A00;N # N-ARY CIRCLED DOT OPERATOR +2A01;N # N-ARY CIRCLED PLUS OPERATOR +2A02;N # N-ARY CIRCLED TIMES OPERATOR +2A03;N # N-ARY UNION OPERATOR WITH DOT +2A04;N # N-ARY UNION OPERATOR WITH PLUS +2A05;N # N-ARY SQUARE INTERSECTION OPERATOR +2A06;N # N-ARY SQUARE UNION OPERATOR +2A07;N # TWO LOGICAL AND OPERATOR +2A08;N # TWO LOGICAL OR OPERATOR +2A09;N # N-ARY TIMES OPERATOR +2A0A;N # MODULO TWO SUM +2A0B;N # SUMMATION WITH INTEGRAL +2A0C;N # QUADRUPLE INTEGRAL OPERATOR +2A0D;N # FINITE PART INTEGRAL +2A0E;N # INTEGRAL WITH DOUBLE STROKE +2A0F;N # INTEGRAL AVERAGE WITH SLASH +2A10;N # CIRCULATION FUNCTION +2A11;N # ANTICLOCKWISE INTEGRATION +2A12;N # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE +2A13;N # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE +2A14;N # LINE INTEGRATION NOT INCLUDING THE POLE +2A15;N # INTEGRAL AROUND A POINT OPERATOR +2A16;N # QUATERNION INTEGRAL OPERATOR +2A17;N # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK +2A18;N # INTEGRAL WITH TIMES SIGN +2A19;N # INTEGRAL WITH INTERSECTION +2A1A;N # INTEGRAL WITH UNION +2A1B;N # INTEGRAL WITH OVERBAR +2A1C;N # INTEGRAL WITH UNDERBAR +2A1D;N # JOIN +2A1E;N # LARGE LEFT TRIANGLE OPERATOR +2A1F;N # Z NOTATION SCHEMA COMPOSITION +2A20;N # Z NOTATION SCHEMA PIPING +2A21;N # Z NOTATION SCHEMA PROJECTION +2A22;N # PLUS SIGN WITH SMALL CIRCLE ABOVE +2A23;N # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE +2A24;N # PLUS SIGN WITH TILDE ABOVE +2A25;N # PLUS SIGN WITH DOT BELOW +2A26;N # PLUS SIGN WITH TILDE BELOW +2A27;N # PLUS SIGN WITH SUBSCRIPT TWO +2A28;N # PLUS SIGN WITH BLACK TRIANGLE +2A29;N # MINUS SIGN WITH COMMA ABOVE +2A2A;N # MINUS SIGN WITH DOT BELOW +2A2B;N # MINUS SIGN WITH FALLING DOTS +2A2C;N # MINUS SIGN WITH RISING DOTS +2A2D;N # PLUS SIGN IN LEFT HALF CIRCLE +2A2E;N # PLUS SIGN IN RIGHT HALF CIRCLE +2A2F;N # VECTOR OR CROSS PRODUCT +2A30;N # MULTIPLICATION SIGN WITH DOT ABOVE +2A31;N # MULTIPLICATION SIGN WITH UNDERBAR +2A32;N # SEMIDIRECT PRODUCT WITH BOTTOM CLOSED +2A33;N # SMASH PRODUCT +2A34;N # MULTIPLICATION SIGN IN LEFT HALF CIRCLE +2A35;N # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE +2A36;N # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT +2A37;N # MULTIPLICATION SIGN IN DOUBLE CIRCLE +2A38;N # CIRCLED DIVISION SIGN +2A39;N # PLUS SIGN IN TRIANGLE +2A3A;N # MINUS SIGN IN TRIANGLE +2A3B;N # MULTIPLICATION SIGN IN TRIANGLE +2A3C;N # INTERIOR PRODUCT +2A3D;N # RIGHTHAND INTERIOR PRODUCT +2A3E;N # Z NOTATION RELATIONAL COMPOSITION +2A3F;N # AMALGAMATION OR COPRODUCT +2A40;N # INTERSECTION WITH DOT +2A41;N # UNION WITH MINUS SIGN +2A42;N # UNION WITH OVERBAR +2A43;N # INTERSECTION WITH OVERBAR +2A44;N # INTERSECTION WITH LOGICAL AND +2A45;N # UNION WITH LOGICAL OR +2A46;N # UNION ABOVE INTERSECTION +2A47;N # INTERSECTION ABOVE UNION +2A48;N # UNION ABOVE BAR ABOVE INTERSECTION +2A49;N # INTERSECTION ABOVE BAR ABOVE UNION +2A4A;N # UNION BESIDE AND JOINED WITH UNION +2A4B;N # INTERSECTION BESIDE AND JOINED WITH INTERSECTION +2A4C;N # CLOSED UNION WITH SERIFS +2A4D;N # CLOSED INTERSECTION WITH SERIFS +2A4E;N # DOUBLE SQUARE INTERSECTION +2A4F;N # DOUBLE SQUARE UNION +2A50;N # CLOSED UNION WITH SERIFS AND SMASH PRODUCT +2A51;N # LOGICAL AND WITH DOT ABOVE +2A52;N # LOGICAL OR WITH DOT ABOVE +2A53;N # DOUBLE LOGICAL AND +2A54;N # DOUBLE LOGICAL OR +2A55;N # TWO INTERSECTING LOGICAL AND +2A56;N # TWO INTERSECTING LOGICAL OR +2A57;N # SLOPING LARGE OR +2A58;N # SLOPING LARGE AND +2A59;N # LOGICAL OR OVERLAPPING LOGICAL AND +2A5A;N # LOGICAL AND WITH MIDDLE STEM +2A5B;N # LOGICAL OR WITH MIDDLE STEM +2A5C;N # LOGICAL AND WITH HORIZONTAL DASH +2A5D;N # LOGICAL OR WITH HORIZONTAL DASH +2A5E;N # LOGICAL AND WITH DOUBLE OVERBAR +2A5F;N # LOGICAL AND WITH UNDERBAR +2A60;N # LOGICAL AND WITH DOUBLE UNDERBAR +2A61;N # SMALL VEE WITH UNDERBAR +2A62;N # LOGICAL OR WITH DOUBLE OVERBAR +2A63;N # LOGICAL OR WITH DOUBLE UNDERBAR +2A64;N # Z NOTATION DOMAIN ANTIRESTRICTION +2A65;N # Z NOTATION RANGE ANTIRESTRICTION +2A66;N # EQUALS SIGN WITH DOT BELOW +2A67;N # IDENTICAL WITH DOT ABOVE +2A68;N # TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE +2A69;N # TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE +2A6A;N # TILDE OPERATOR WITH DOT ABOVE +2A6B;N # TILDE OPERATOR WITH RISING DOTS +2A6C;N # SIMILAR MINUS SIMILAR +2A6D;N # CONGRUENT WITH DOT ABOVE +2A6E;N # EQUALS WITH ASTERISK +2A6F;N # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT +2A70;N # APPROXIMATELY EQUAL OR EQUAL TO +2A71;N # EQUALS SIGN ABOVE PLUS SIGN +2A72;N # PLUS SIGN ABOVE EQUALS SIGN +2A73;N # EQUALS SIGN ABOVE TILDE OPERATOR +2A74;N # DOUBLE COLON EQUAL +2A75;N # TWO CONSECUTIVE EQUALS SIGNS +2A76;N # THREE CONSECUTIVE EQUALS SIGNS +2A77;N # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW +2A78;N # EQUIVALENT WITH FOUR DOTS ABOVE +2A79;N # LESS-THAN WITH CIRCLE INSIDE +2A7A;N # GREATER-THAN WITH CIRCLE INSIDE +2A7B;N # LESS-THAN WITH QUESTION MARK ABOVE +2A7C;N # GREATER-THAN WITH QUESTION MARK ABOVE +2A7D;N # LESS-THAN OR SLANTED EQUAL TO +2A7E;N # GREATER-THAN OR SLANTED EQUAL TO +2A7F;N # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A80;N # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A81;N # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A82;N # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A83;N # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT +2A84;N # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT +2A85;N # LESS-THAN OR APPROXIMATE +2A86;N # GREATER-THAN OR APPROXIMATE +2A87;N # LESS-THAN AND SINGLE-LINE NOT EQUAL TO +2A88;N # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO +2A89;N # LESS-THAN AND NOT APPROXIMATE +2A8A;N # GREATER-THAN AND NOT APPROXIMATE +2A8B;N # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN +2A8C;N # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN +2A8D;N # LESS-THAN ABOVE SIMILAR OR EQUAL +2A8E;N # GREATER-THAN ABOVE SIMILAR OR EQUAL +2A8F;N # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN +2A90;N # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN +2A91;N # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL +2A92;N # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL +2A93;N # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL +2A94;N # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL +2A95;N # SLANTED EQUAL TO OR LESS-THAN +2A96;N # SLANTED EQUAL TO OR GREATER-THAN +2A97;N # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE +2A98;N # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE +2A99;N # DOUBLE-LINE EQUAL TO OR LESS-THAN +2A9A;N # DOUBLE-LINE EQUAL TO OR GREATER-THAN +2A9B;N # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN +2A9C;N # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN +2A9D;N # SIMILAR OR LESS-THAN +2A9E;N # SIMILAR OR GREATER-THAN +2A9F;N # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN +2AA0;N # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN +2AA1;N # DOUBLE NESTED LESS-THAN +2AA2;N # DOUBLE NESTED GREATER-THAN +2AA3;N # DOUBLE NESTED LESS-THAN WITH UNDERBAR +2AA4;N # GREATER-THAN OVERLAPPING LESS-THAN +2AA5;N # GREATER-THAN BESIDE LESS-THAN +2AA6;N # LESS-THAN CLOSED BY CURVE +2AA7;N # GREATER-THAN CLOSED BY CURVE +2AA8;N # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AA9;N # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AAA;N # SMALLER THAN +2AAB;N # LARGER THAN +2AAC;N # SMALLER THAN OR EQUAL TO +2AAD;N # LARGER THAN OR EQUAL TO +2AAE;N # EQUALS SIGN WITH BUMPY ABOVE +2AAF;N # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN +2AB0;N # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN +2AB1;N # PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO +2AB2;N # SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO +2AB3;N # PRECEDES ABOVE EQUALS SIGN +2AB4;N # SUCCEEDS ABOVE EQUALS SIGN +2AB5;N # PRECEDES ABOVE NOT EQUAL TO +2AB6;N # SUCCEEDS ABOVE NOT EQUAL TO +2AB7;N # PRECEDES ABOVE ALMOST EQUAL TO +2AB8;N # SUCCEEDS ABOVE ALMOST EQUAL TO +2AB9;N # PRECEDES ABOVE NOT ALMOST EQUAL TO +2ABA;N # SUCCEEDS ABOVE NOT ALMOST EQUAL TO +2ABB;N # DOUBLE PRECEDES +2ABC;N # DOUBLE SUCCEEDS +2ABD;N # SUBSET WITH DOT +2ABE;N # SUPERSET WITH DOT +2ABF;N # SUBSET WITH PLUS SIGN BELOW +2AC0;N # SUPERSET WITH PLUS SIGN BELOW +2AC1;N # SUBSET WITH MULTIPLICATION SIGN BELOW +2AC2;N # SUPERSET WITH MULTIPLICATION SIGN BELOW +2AC3;N # SUBSET OF OR EQUAL TO WITH DOT ABOVE +2AC4;N # SUPERSET OF OR EQUAL TO WITH DOT ABOVE +2AC5;N # SUBSET OF ABOVE EQUALS SIGN +2AC6;N # SUPERSET OF ABOVE EQUALS SIGN +2AC7;N # SUBSET OF ABOVE TILDE OPERATOR +2AC8;N # SUPERSET OF ABOVE TILDE OPERATOR +2AC9;N # SUBSET OF ABOVE ALMOST EQUAL TO +2ACA;N # SUPERSET OF ABOVE ALMOST EQUAL TO +2ACB;N # SUBSET OF ABOVE NOT EQUAL TO +2ACC;N # SUPERSET OF ABOVE NOT EQUAL TO +2ACD;N # SQUARE LEFT OPEN BOX OPERATOR +2ACE;N # SQUARE RIGHT OPEN BOX OPERATOR +2ACF;N # CLOSED SUBSET +2AD0;N # CLOSED SUPERSET +2AD1;N # CLOSED SUBSET OR EQUAL TO +2AD2;N # CLOSED SUPERSET OR EQUAL TO +2AD3;N # SUBSET ABOVE SUPERSET +2AD4;N # SUPERSET ABOVE SUBSET +2AD5;N # SUBSET ABOVE SUBSET +2AD6;N # SUPERSET ABOVE SUPERSET +2AD7;N # SUPERSET BESIDE SUBSET +2AD8;N # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET +2AD9;N # ELEMENT OF OPENING DOWNWARDS +2ADA;N # PITCHFORK WITH TEE TOP +2ADB;N # TRANSVERSAL INTERSECTION +2ADC;N # FORKING +2ADD;N # NONFORKING +2ADE;N # SHORT LEFT TACK +2ADF;N # SHORT DOWN TACK +2AE0;N # SHORT UP TACK +2AE1;N # PERPENDICULAR WITH S +2AE2;N # VERTICAL BAR TRIPLE RIGHT TURNSTILE +2AE3;N # DOUBLE VERTICAL BAR LEFT TURNSTILE +2AE4;N # VERTICAL BAR DOUBLE LEFT TURNSTILE +2AE5;N # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE +2AE6;N # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL +2AE7;N # SHORT DOWN TACK WITH OVERBAR +2AE8;N # SHORT UP TACK WITH UNDERBAR +2AE9;N # SHORT UP TACK ABOVE SHORT DOWN TACK +2AEA;N # DOUBLE DOWN TACK +2AEB;N # DOUBLE UP TACK +2AEC;N # DOUBLE STROKE NOT SIGN +2AED;N # REVERSED DOUBLE STROKE NOT SIGN +2AEE;N # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH +2AEF;N # VERTICAL LINE WITH CIRCLE ABOVE +2AF0;N # VERTICAL LINE WITH CIRCLE BELOW +2AF1;N # DOWN TACK WITH CIRCLE BELOW +2AF2;N # PARALLEL WITH HORIZONTAL STROKE +2AF3;N # PARALLEL WITH TILDE OPERATOR +2AF4;N # TRIPLE VERTICAL BAR BINARY RELATION +2AF5;N # TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE +2AF6;N # TRIPLE COLON OPERATOR +2AF7;N # TRIPLE NESTED LESS-THAN +2AF8;N # TRIPLE NESTED GREATER-THAN +2AF9;N # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO +2AFA;N # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO +2AFB;N # TRIPLE SOLIDUS BINARY RELATION +2AFC;N # LARGE TRIPLE VERTICAL BAR OPERATOR +2AFD;N # DOUBLE SOLIDUS OPERATOR +2AFE;N # WHITE VERTICAL BAR +2AFF;N # N-ARY WHITE VERTICAL BAR +2B00;N # NORTH EAST WHITE ARROW +2B01;N # NORTH WEST WHITE ARROW +2B02;N # SOUTH EAST WHITE ARROW +2B03;N # SOUTH WEST WHITE ARROW +2B04;N # LEFT RIGHT WHITE ARROW +2B05;N # LEFTWARDS BLACK ARROW +2B06;N # UPWARDS BLACK ARROW +2B07;N # DOWNWARDS BLACK ARROW +2B08;N # NORTH EAST BLACK ARROW +2B09;N # NORTH WEST BLACK ARROW +2B0A;N # SOUTH EAST BLACK ARROW +2B0B;N # SOUTH WEST BLACK ARROW +2B0C;N # LEFT RIGHT BLACK ARROW +2B0D;N # UP DOWN BLACK ARROW +2B0E;N # RIGHTWARDS ARROW WITH TIP DOWNWARDS +2B0F;N # RIGHTWARDS ARROW WITH TIP UPWARDS +2B10;N # LEFTWARDS ARROW WITH TIP DOWNWARDS +2B11;N # LEFTWARDS ARROW WITH TIP UPWARDS +2B12;N # SQUARE WITH TOP HALF BLACK +2B13;N # SQUARE WITH BOTTOM HALF BLACK +2C00;N # GLAGOLITIC CAPITAL LETTER AZU +2C01;N # GLAGOLITIC CAPITAL LETTER BUKY +2C02;N # GLAGOLITIC CAPITAL LETTER VEDE +2C03;N # GLAGOLITIC CAPITAL LETTER GLAGOLI +2C04;N # GLAGOLITIC CAPITAL LETTER DOBRO +2C05;N # GLAGOLITIC CAPITAL LETTER YESTU +2C06;N # GLAGOLITIC CAPITAL LETTER ZHIVETE +2C07;N # GLAGOLITIC CAPITAL LETTER DZELO +2C08;N # GLAGOLITIC CAPITAL LETTER ZEMLJA +2C09;N # GLAGOLITIC CAPITAL LETTER IZHE +2C0A;N # GLAGOLITIC CAPITAL LETTER INITIAL IZHE +2C0B;N # GLAGOLITIC CAPITAL LETTER I +2C0C;N # GLAGOLITIC CAPITAL LETTER DJERVI +2C0D;N # GLAGOLITIC CAPITAL LETTER KAKO +2C0E;N # GLAGOLITIC CAPITAL LETTER LJUDIJE +2C0F;N # GLAGOLITIC CAPITAL LETTER MYSLITE +2C10;N # GLAGOLITIC CAPITAL LETTER NASHI +2C11;N # GLAGOLITIC CAPITAL LETTER ONU +2C12;N # GLAGOLITIC CAPITAL LETTER POKOJI +2C13;N # GLAGOLITIC CAPITAL LETTER RITSI +2C14;N # GLAGOLITIC CAPITAL LETTER SLOVO +2C15;N # GLAGOLITIC CAPITAL LETTER TVRIDO +2C16;N # GLAGOLITIC CAPITAL LETTER UKU +2C17;N # GLAGOLITIC CAPITAL LETTER FRITU +2C18;N # GLAGOLITIC CAPITAL LETTER HERU +2C19;N # GLAGOLITIC CAPITAL LETTER OTU +2C1A;N # GLAGOLITIC CAPITAL LETTER PE +2C1B;N # GLAGOLITIC CAPITAL LETTER SHTA +2C1C;N # GLAGOLITIC CAPITAL LETTER TSI +2C1D;N # GLAGOLITIC CAPITAL LETTER CHRIVI +2C1E;N # GLAGOLITIC CAPITAL LETTER SHA +2C1F;N # GLAGOLITIC CAPITAL LETTER YERU +2C20;N # GLAGOLITIC CAPITAL LETTER YERI +2C21;N # GLAGOLITIC CAPITAL LETTER YATI +2C22;N # GLAGOLITIC CAPITAL LETTER SPIDERY HA +2C23;N # GLAGOLITIC CAPITAL LETTER YU +2C24;N # GLAGOLITIC CAPITAL LETTER SMALL YUS +2C25;N # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +2C26;N # GLAGOLITIC CAPITAL LETTER YO +2C27;N # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +2C28;N # GLAGOLITIC CAPITAL LETTER BIG YUS +2C29;N # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +2C2A;N # GLAGOLITIC CAPITAL LETTER FITA +2C2B;N # GLAGOLITIC CAPITAL LETTER IZHITSA +2C2C;N # GLAGOLITIC CAPITAL LETTER SHTAPIC +2C2D;N # GLAGOLITIC CAPITAL LETTER TROKUTASTI A +2C2E;N # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C30;N # GLAGOLITIC SMALL LETTER AZU +2C31;N # GLAGOLITIC SMALL LETTER BUKY +2C32;N # GLAGOLITIC SMALL LETTER VEDE +2C33;N # GLAGOLITIC SMALL LETTER GLAGOLI +2C34;N # GLAGOLITIC SMALL LETTER DOBRO +2C35;N # GLAGOLITIC SMALL LETTER YESTU +2C36;N # GLAGOLITIC SMALL LETTER ZHIVETE +2C37;N # GLAGOLITIC SMALL LETTER DZELO +2C38;N # GLAGOLITIC SMALL LETTER ZEMLJA +2C39;N # GLAGOLITIC SMALL LETTER IZHE +2C3A;N # GLAGOLITIC SMALL LETTER INITIAL IZHE +2C3B;N # GLAGOLITIC SMALL LETTER I +2C3C;N # GLAGOLITIC SMALL LETTER DJERVI +2C3D;N # GLAGOLITIC SMALL LETTER KAKO +2C3E;N # GLAGOLITIC SMALL LETTER LJUDIJE +2C3F;N # GLAGOLITIC SMALL LETTER MYSLITE +2C40;N # GLAGOLITIC SMALL LETTER NASHI +2C41;N # GLAGOLITIC SMALL LETTER ONU +2C42;N # GLAGOLITIC SMALL LETTER POKOJI +2C43;N # GLAGOLITIC SMALL LETTER RITSI +2C44;N # GLAGOLITIC SMALL LETTER SLOVO +2C45;N # GLAGOLITIC SMALL LETTER TVRIDO +2C46;N # GLAGOLITIC SMALL LETTER UKU +2C47;N # GLAGOLITIC SMALL LETTER FRITU +2C48;N # GLAGOLITIC SMALL LETTER HERU +2C49;N # GLAGOLITIC SMALL LETTER OTU +2C4A;N # GLAGOLITIC SMALL LETTER PE +2C4B;N # GLAGOLITIC SMALL LETTER SHTA +2C4C;N # GLAGOLITIC SMALL LETTER TSI +2C4D;N # GLAGOLITIC SMALL LETTER CHRIVI +2C4E;N # GLAGOLITIC SMALL LETTER SHA +2C4F;N # GLAGOLITIC SMALL LETTER YERU +2C50;N # GLAGOLITIC SMALL LETTER YERI +2C51;N # GLAGOLITIC SMALL LETTER YATI +2C52;N # GLAGOLITIC SMALL LETTER SPIDERY HA +2C53;N # GLAGOLITIC SMALL LETTER YU +2C54;N # GLAGOLITIC SMALL LETTER SMALL YUS +2C55;N # GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL +2C56;N # GLAGOLITIC SMALL LETTER YO +2C57;N # GLAGOLITIC SMALL LETTER IOTATED SMALL YUS +2C58;N # GLAGOLITIC SMALL LETTER BIG YUS +2C59;N # GLAGOLITIC SMALL LETTER IOTATED BIG YUS +2C5A;N # GLAGOLITIC SMALL LETTER FITA +2C5B;N # GLAGOLITIC SMALL LETTER IZHITSA +2C5C;N # GLAGOLITIC SMALL LETTER SHTAPIC +2C5D;N # GLAGOLITIC SMALL LETTER TROKUTASTI A +2C5E;N # GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C80;N # COPTIC CAPITAL LETTER ALFA +2C81;N # COPTIC SMALL LETTER ALFA +2C82;N # COPTIC CAPITAL LETTER VIDA +2C83;N # COPTIC SMALL LETTER VIDA +2C84;N # COPTIC CAPITAL LETTER GAMMA +2C85;N # COPTIC SMALL LETTER GAMMA +2C86;N # COPTIC CAPITAL LETTER DALDA +2C87;N # COPTIC SMALL LETTER DALDA +2C88;N # COPTIC CAPITAL LETTER EIE +2C89;N # COPTIC SMALL LETTER EIE +2C8A;N # COPTIC CAPITAL LETTER SOU +2C8B;N # COPTIC SMALL LETTER SOU +2C8C;N # COPTIC CAPITAL LETTER ZATA +2C8D;N # COPTIC SMALL LETTER ZATA +2C8E;N # COPTIC CAPITAL LETTER HATE +2C8F;N # COPTIC SMALL LETTER HATE +2C90;N # COPTIC CAPITAL LETTER THETHE +2C91;N # COPTIC SMALL LETTER THETHE +2C92;N # COPTIC CAPITAL LETTER IAUDA +2C93;N # COPTIC SMALL LETTER IAUDA +2C94;N # COPTIC CAPITAL LETTER KAPA +2C95;N # COPTIC SMALL LETTER KAPA +2C96;N # COPTIC CAPITAL LETTER LAULA +2C97;N # COPTIC SMALL LETTER LAULA +2C98;N # COPTIC CAPITAL LETTER MI +2C99;N # COPTIC SMALL LETTER MI +2C9A;N # COPTIC CAPITAL LETTER NI +2C9B;N # COPTIC SMALL LETTER NI +2C9C;N # COPTIC CAPITAL LETTER KSI +2C9D;N # COPTIC SMALL LETTER KSI +2C9E;N # COPTIC CAPITAL LETTER O +2C9F;N # COPTIC SMALL LETTER O +2CA0;N # COPTIC CAPITAL LETTER PI +2CA1;N # COPTIC SMALL LETTER PI +2CA2;N # COPTIC CAPITAL LETTER RO +2CA3;N # COPTIC SMALL LETTER RO +2CA4;N # COPTIC CAPITAL LETTER SIMA +2CA5;N # COPTIC SMALL LETTER SIMA +2CA6;N # COPTIC CAPITAL LETTER TAU +2CA7;N # COPTIC SMALL LETTER TAU +2CA8;N # COPTIC CAPITAL LETTER UA +2CA9;N # COPTIC SMALL LETTER UA +2CAA;N # COPTIC CAPITAL LETTER FI +2CAB;N # COPTIC SMALL LETTER FI +2CAC;N # COPTIC CAPITAL LETTER KHI +2CAD;N # COPTIC SMALL LETTER KHI +2CAE;N # COPTIC CAPITAL LETTER PSI +2CAF;N # COPTIC SMALL LETTER PSI +2CB0;N # COPTIC CAPITAL LETTER OOU +2CB1;N # COPTIC SMALL LETTER OOU +2CB2;N # COPTIC CAPITAL LETTER DIALECT-P ALEF +2CB3;N # COPTIC SMALL LETTER DIALECT-P ALEF +2CB4;N # COPTIC CAPITAL LETTER OLD COPTIC AIN +2CB5;N # COPTIC SMALL LETTER OLD COPTIC AIN +2CB6;N # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +2CB7;N # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE +2CB8;N # COPTIC CAPITAL LETTER DIALECT-P KAPA +2CB9;N # COPTIC SMALL LETTER DIALECT-P KAPA +2CBA;N # COPTIC CAPITAL LETTER DIALECT-P NI +2CBB;N # COPTIC SMALL LETTER DIALECT-P NI +2CBC;N # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +2CBD;N # COPTIC SMALL LETTER CRYPTOGRAMMIC NI +2CBE;N # COPTIC CAPITAL LETTER OLD COPTIC OOU +2CBF;N # COPTIC SMALL LETTER OLD COPTIC OOU +2CC0;N # COPTIC CAPITAL LETTER SAMPI +2CC1;N # COPTIC SMALL LETTER SAMPI +2CC2;N # COPTIC CAPITAL LETTER CROSSED SHEI +2CC3;N # COPTIC SMALL LETTER CROSSED SHEI +2CC4;N # COPTIC CAPITAL LETTER OLD COPTIC SHEI +2CC5;N # COPTIC SMALL LETTER OLD COPTIC SHEI +2CC6;N # COPTIC CAPITAL LETTER OLD COPTIC ESH +2CC7;N # COPTIC SMALL LETTER OLD COPTIC ESH +2CC8;N # COPTIC CAPITAL LETTER AKHMIMIC KHEI +2CC9;N # COPTIC SMALL LETTER AKHMIMIC KHEI +2CCA;N # COPTIC CAPITAL LETTER DIALECT-P HORI +2CCB;N # COPTIC SMALL LETTER DIALECT-P HORI +2CCC;N # COPTIC CAPITAL LETTER OLD COPTIC HORI +2CCD;N # COPTIC SMALL LETTER OLD COPTIC HORI +2CCE;N # COPTIC CAPITAL LETTER OLD COPTIC HA +2CCF;N # COPTIC SMALL LETTER OLD COPTIC HA +2CD0;N # COPTIC CAPITAL LETTER L-SHAPED HA +2CD1;N # COPTIC SMALL LETTER L-SHAPED HA +2CD2;N # COPTIC CAPITAL LETTER OLD COPTIC HEI +2CD3;N # COPTIC SMALL LETTER OLD COPTIC HEI +2CD4;N # COPTIC CAPITAL LETTER OLD COPTIC HAT +2CD5;N # COPTIC SMALL LETTER OLD COPTIC HAT +2CD6;N # COPTIC CAPITAL LETTER OLD COPTIC GANGIA +2CD7;N # COPTIC SMALL LETTER OLD COPTIC GANGIA +2CD8;N # COPTIC CAPITAL LETTER OLD COPTIC DJA +2CD9;N # COPTIC SMALL LETTER OLD COPTIC DJA +2CDA;N # COPTIC CAPITAL LETTER OLD COPTIC SHIMA +2CDB;N # COPTIC SMALL LETTER OLD COPTIC SHIMA +2CDC;N # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +2CDD;N # COPTIC SMALL LETTER OLD NUBIAN SHIMA +2CDE;N # COPTIC CAPITAL LETTER OLD NUBIAN NGI +2CDF;N # COPTIC SMALL LETTER OLD NUBIAN NGI +2CE0;N # COPTIC CAPITAL LETTER OLD NUBIAN NYI +2CE1;N # COPTIC SMALL LETTER OLD NUBIAN NYI +2CE2;N # COPTIC CAPITAL LETTER OLD NUBIAN WAU +2CE3;N # COPTIC SMALL LETTER OLD NUBIAN WAU +2CE4;N # COPTIC SYMBOL KAI +2CE5;N # COPTIC SYMBOL MI RO +2CE6;N # COPTIC SYMBOL PI RO +2CE7;N # COPTIC SYMBOL STAUROS +2CE8;N # COPTIC SYMBOL TAU RO +2CE9;N # COPTIC SYMBOL KHI RO +2CEA;N # COPTIC SYMBOL SHIMA SIMA +2CF9;N # COPTIC OLD NUBIAN FULL STOP +2CFA;N # COPTIC OLD NUBIAN DIRECT QUESTION MARK +2CFB;N # COPTIC OLD NUBIAN INDIRECT QUESTION MARK +2CFC;N # COPTIC OLD NUBIAN VERSE DIVIDER +2CFD;N # COPTIC FRACTION ONE HALF +2CFE;N # COPTIC FULL STOP +2CFF;N # COPTIC MORPHOLOGICAL DIVIDER +2D00;N # GEORGIAN SMALL LETTER AN +2D01;N # GEORGIAN SMALL LETTER BAN +2D02;N # GEORGIAN SMALL LETTER GAN +2D03;N # GEORGIAN SMALL LETTER DON +2D04;N # GEORGIAN SMALL LETTER EN +2D05;N # GEORGIAN SMALL LETTER VIN +2D06;N # GEORGIAN SMALL LETTER ZEN +2D07;N # GEORGIAN SMALL LETTER TAN +2D08;N # GEORGIAN SMALL LETTER IN +2D09;N # GEORGIAN SMALL LETTER KAN +2D0A;N # GEORGIAN SMALL LETTER LAS +2D0B;N # GEORGIAN SMALL LETTER MAN +2D0C;N # GEORGIAN SMALL LETTER NAR +2D0D;N # GEORGIAN SMALL LETTER ON +2D0E;N # GEORGIAN SMALL LETTER PAR +2D0F;N # GEORGIAN SMALL LETTER ZHAR +2D10;N # GEORGIAN SMALL LETTER RAE +2D11;N # GEORGIAN SMALL LETTER SAN +2D12;N # GEORGIAN SMALL LETTER TAR +2D13;N # GEORGIAN SMALL LETTER UN +2D14;N # GEORGIAN SMALL LETTER PHAR +2D15;N # GEORGIAN SMALL LETTER KHAR +2D16;N # GEORGIAN SMALL LETTER GHAN +2D17;N # GEORGIAN SMALL LETTER QAR +2D18;N # GEORGIAN SMALL LETTER SHIN +2D19;N # GEORGIAN SMALL LETTER CHIN +2D1A;N # GEORGIAN SMALL LETTER CAN +2D1B;N # GEORGIAN SMALL LETTER JIL +2D1C;N # GEORGIAN SMALL LETTER CIL +2D1D;N # GEORGIAN SMALL LETTER CHAR +2D1E;N # GEORGIAN SMALL LETTER XAN +2D1F;N # GEORGIAN SMALL LETTER JHAN +2D20;N # GEORGIAN SMALL LETTER HAE +2D21;N # GEORGIAN SMALL LETTER HE +2D22;N # GEORGIAN SMALL LETTER HIE +2D23;N # GEORGIAN SMALL LETTER WE +2D24;N # GEORGIAN SMALL LETTER HAR +2D25;N # GEORGIAN SMALL LETTER HOE +2D30;N # TIFINAGH LETTER YA +2D31;N # TIFINAGH LETTER YAB +2D32;N # TIFINAGH LETTER YABH +2D33;N # TIFINAGH LETTER YAG +2D34;N # TIFINAGH LETTER YAGHH +2D35;N # TIFINAGH LETTER BERBER ACADEMY YAJ +2D36;N # TIFINAGH LETTER YAJ +2D37;N # TIFINAGH LETTER YAD +2D38;N # TIFINAGH LETTER YADH +2D39;N # TIFINAGH LETTER YADD +2D3A;N # TIFINAGH LETTER YADDH +2D3B;N # TIFINAGH LETTER YEY +2D3C;N # TIFINAGH LETTER YAF +2D3D;N # TIFINAGH LETTER YAK +2D3E;N # TIFINAGH LETTER TUAREG YAK +2D3F;N # TIFINAGH LETTER YAKHH +2D40;N # TIFINAGH LETTER YAH +2D41;N # TIFINAGH LETTER BERBER ACADEMY YAH +2D42;N # TIFINAGH LETTER TUAREG YAH +2D43;N # TIFINAGH LETTER YAHH +2D44;N # TIFINAGH LETTER YAA +2D45;N # TIFINAGH LETTER YAKH +2D46;N # TIFINAGH LETTER TUAREG YAKH +2D47;N # TIFINAGH LETTER YAQ +2D48;N # TIFINAGH LETTER TUAREG YAQ +2D49;N # TIFINAGH LETTER YI +2D4A;N # TIFINAGH LETTER YAZH +2D4B;N # TIFINAGH LETTER AHAGGAR YAZH +2D4C;N # TIFINAGH LETTER TUAREG YAZH +2D4D;N # TIFINAGH LETTER YAL +2D4E;N # TIFINAGH LETTER YAM +2D4F;N # TIFINAGH LETTER YAN +2D50;N # TIFINAGH LETTER TUAREG YAGN +2D51;N # TIFINAGH LETTER TUAREG YANG +2D52;N # TIFINAGH LETTER YAP +2D53;N # TIFINAGH LETTER YU +2D54;N # TIFINAGH LETTER YAR +2D55;N # TIFINAGH LETTER YARR +2D56;N # TIFINAGH LETTER YAGH +2D57;N # TIFINAGH LETTER TUAREG YAGH +2D58;N # TIFINAGH LETTER AYER YAGH +2D59;N # TIFINAGH LETTER YAS +2D5A;N # TIFINAGH LETTER YASS +2D5B;N # TIFINAGH LETTER YASH +2D5C;N # TIFINAGH LETTER YAT +2D5D;N # TIFINAGH LETTER YATH +2D5E;N # TIFINAGH LETTER YACH +2D5F;N # TIFINAGH LETTER YATT +2D60;N # TIFINAGH LETTER YAV +2D61;N # TIFINAGH LETTER YAW +2D62;N # TIFINAGH LETTER YAY +2D63;N # TIFINAGH LETTER YAZ +2D64;N # TIFINAGH LETTER TAWELLEMET YAZ +2D65;N # TIFINAGH LETTER YAZZ +2D6F;N # TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D80;N # ETHIOPIC SYLLABLE LOA +2D81;N # ETHIOPIC SYLLABLE MOA +2D82;N # ETHIOPIC SYLLABLE ROA +2D83;N # ETHIOPIC SYLLABLE SOA +2D84;N # ETHIOPIC SYLLABLE SHOA +2D85;N # ETHIOPIC SYLLABLE BOA +2D86;N # ETHIOPIC SYLLABLE TOA +2D87;N # ETHIOPIC SYLLABLE COA +2D88;N # ETHIOPIC SYLLABLE NOA +2D89;N # ETHIOPIC SYLLABLE NYOA +2D8A;N # ETHIOPIC SYLLABLE GLOTTAL OA +2D8B;N # ETHIOPIC SYLLABLE ZOA +2D8C;N # ETHIOPIC SYLLABLE DOA +2D8D;N # ETHIOPIC SYLLABLE DDOA +2D8E;N # ETHIOPIC SYLLABLE JOA +2D8F;N # ETHIOPIC SYLLABLE THOA +2D90;N # ETHIOPIC SYLLABLE CHOA +2D91;N # ETHIOPIC SYLLABLE PHOA +2D92;N # ETHIOPIC SYLLABLE POA +2D93;N # ETHIOPIC SYLLABLE GGWA +2D94;N # ETHIOPIC SYLLABLE GGWI +2D95;N # ETHIOPIC SYLLABLE GGWEE +2D96;N # ETHIOPIC SYLLABLE GGWE +2DA0;N # ETHIOPIC SYLLABLE SSA +2DA1;N # ETHIOPIC SYLLABLE SSU +2DA2;N # ETHIOPIC SYLLABLE SSI +2DA3;N # ETHIOPIC SYLLABLE SSAA +2DA4;N # ETHIOPIC SYLLABLE SSEE +2DA5;N # ETHIOPIC SYLLABLE SSE +2DA6;N # ETHIOPIC SYLLABLE SSO +2DA8;N # ETHIOPIC SYLLABLE CCA +2DA9;N # ETHIOPIC SYLLABLE CCU +2DAA;N # ETHIOPIC SYLLABLE CCI +2DAB;N # ETHIOPIC SYLLABLE CCAA +2DAC;N # ETHIOPIC SYLLABLE CCEE +2DAD;N # ETHIOPIC SYLLABLE CCE +2DAE;N # ETHIOPIC SYLLABLE CCO +2DB0;N # ETHIOPIC SYLLABLE ZZA +2DB1;N # ETHIOPIC SYLLABLE ZZU +2DB2;N # ETHIOPIC SYLLABLE ZZI +2DB3;N # ETHIOPIC SYLLABLE ZZAA +2DB4;N # ETHIOPIC SYLLABLE ZZEE +2DB5;N # ETHIOPIC SYLLABLE ZZE +2DB6;N # ETHIOPIC SYLLABLE ZZO +2DB8;N # ETHIOPIC SYLLABLE CCHA +2DB9;N # ETHIOPIC SYLLABLE CCHU +2DBA;N # ETHIOPIC SYLLABLE CCHI +2DBB;N # ETHIOPIC SYLLABLE CCHAA +2DBC;N # ETHIOPIC SYLLABLE CCHEE +2DBD;N # ETHIOPIC SYLLABLE CCHE +2DBE;N # ETHIOPIC SYLLABLE CCHO +2DC0;N # ETHIOPIC SYLLABLE QYA +2DC1;N # ETHIOPIC SYLLABLE QYU +2DC2;N # ETHIOPIC SYLLABLE QYI +2DC3;N # ETHIOPIC SYLLABLE QYAA +2DC4;N # ETHIOPIC SYLLABLE QYEE +2DC5;N # ETHIOPIC SYLLABLE QYE +2DC6;N # ETHIOPIC SYLLABLE QYO +2DC8;N # ETHIOPIC SYLLABLE KYA +2DC9;N # ETHIOPIC SYLLABLE KYU +2DCA;N # ETHIOPIC SYLLABLE KYI +2DCB;N # ETHIOPIC SYLLABLE KYAA +2DCC;N # ETHIOPIC SYLLABLE KYEE +2DCD;N # ETHIOPIC SYLLABLE KYE +2DCE;N # ETHIOPIC SYLLABLE KYO +2DD0;N # ETHIOPIC SYLLABLE XYA +2DD1;N # ETHIOPIC SYLLABLE XYU +2DD2;N # ETHIOPIC SYLLABLE XYI +2DD3;N # ETHIOPIC SYLLABLE XYAA +2DD4;N # ETHIOPIC SYLLABLE XYEE +2DD5;N # ETHIOPIC SYLLABLE XYE +2DD6;N # ETHIOPIC SYLLABLE XYO +2DD8;N # ETHIOPIC SYLLABLE GYA +2DD9;N # ETHIOPIC SYLLABLE GYU +2DDA;N # ETHIOPIC SYLLABLE GYI +2DDB;N # ETHIOPIC SYLLABLE GYAA +2DDC;N # ETHIOPIC SYLLABLE GYEE +2DDD;N # ETHIOPIC SYLLABLE GYE +2DDE;N # ETHIOPIC SYLLABLE GYO +2E00;N # RIGHT ANGLE SUBSTITUTION MARKER +2E01;N # RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02;N # LEFT SUBSTITUTION BRACKET +2E03;N # RIGHT SUBSTITUTION BRACKET +2E04;N # LEFT DOTTED SUBSTITUTION BRACKET +2E05;N # RIGHT DOTTED SUBSTITUTION BRACKET +2E06;N # RAISED INTERPOLATION MARKER +2E07;N # RAISED DOTTED INTERPOLATION MARKER +2E08;N # DOTTED TRANSPOSITION MARKER +2E09;N # LEFT TRANSPOSITION BRACKET +2E0A;N # RIGHT TRANSPOSITION BRACKET +2E0B;N # RAISED SQUARE +2E0C;N # LEFT RAISED OMISSION BRACKET +2E0D;N # RIGHT RAISED OMISSION BRACKET +2E0E;N # EDITORIAL CORONIS +2E0F;N # PARAGRAPHOS +2E10;N # FORKED PARAGRAPHOS +2E11;N # REVERSED FORKED PARAGRAPHOS +2E12;N # HYPODIASTOLE +2E13;N # DOTTED OBELOS +2E14;N # DOWNWARDS ANCORA +2E15;N # UPWARDS ANCORA +2E16;N # DOTTED RIGHT-POINTING ANGLE +2E17;N # DOUBLE OBLIQUE HYPHEN +2E1C;N # LEFT LOW PARAPHRASE BRACKET +2E1D;N # RIGHT LOW PARAPHRASE BRACKET +2E80;W # CJK RADICAL REPEAT +2E81;W # CJK RADICAL CLIFF +2E82;W # CJK RADICAL SECOND ONE +2E83;W # CJK RADICAL SECOND TWO +2E84;W # CJK RADICAL SECOND THREE +2E85;W # CJK RADICAL PERSON +2E86;W # CJK RADICAL BOX +2E87;W # CJK RADICAL TABLE +2E88;W # CJK RADICAL KNIFE ONE +2E89;W # CJK RADICAL KNIFE TWO +2E8A;W # CJK RADICAL DIVINATION +2E8B;W # CJK RADICAL SEAL +2E8C;W # CJK RADICAL SMALL ONE +2E8D;W # CJK RADICAL SMALL TWO +2E8E;W # CJK RADICAL LAME ONE +2E8F;W # CJK RADICAL LAME TWO +2E90;W # CJK RADICAL LAME THREE +2E91;W # CJK RADICAL LAME FOUR +2E92;W # CJK RADICAL SNAKE +2E93;W # CJK RADICAL THREAD +2E94;W # CJK RADICAL SNOUT ONE +2E95;W # CJK RADICAL SNOUT TWO +2E96;W # CJK RADICAL HEART ONE +2E97;W # CJK RADICAL HEART TWO +2E98;W # CJK RADICAL HAND +2E99;W # CJK RADICAL RAP +2E9B;W # CJK RADICAL CHOKE +2E9C;W # CJK RADICAL SUN +2E9D;W # CJK RADICAL MOON +2E9E;W # CJK RADICAL DEATH +2E9F;W # CJK RADICAL MOTHER +2EA0;W # CJK RADICAL CIVILIAN +2EA1;W # CJK RADICAL WATER ONE +2EA2;W # CJK RADICAL WATER TWO +2EA3;W # CJK RADICAL FIRE +2EA4;W # CJK RADICAL PAW ONE +2EA5;W # CJK RADICAL PAW TWO +2EA6;W # CJK RADICAL SIMPLIFIED HALF TREE TRUNK +2EA7;W # CJK RADICAL COW +2EA8;W # CJK RADICAL DOG +2EA9;W # CJK RADICAL JADE +2EAA;W # CJK RADICAL BOLT OF CLOTH +2EAB;W # CJK RADICAL EYE +2EAC;W # CJK RADICAL SPIRIT ONE +2EAD;W # CJK RADICAL SPIRIT TWO +2EAE;W # CJK RADICAL BAMBOO +2EAF;W # CJK RADICAL SILK +2EB0;W # CJK RADICAL C-SIMPLIFIED SILK +2EB1;W # CJK RADICAL NET ONE +2EB2;W # CJK RADICAL NET TWO +2EB3;W # CJK RADICAL NET THREE +2EB4;W # CJK RADICAL NET FOUR +2EB5;W # CJK RADICAL MESH +2EB6;W # CJK RADICAL SHEEP +2EB7;W # CJK RADICAL RAM +2EB8;W # CJK RADICAL EWE +2EB9;W # CJK RADICAL OLD +2EBA;W # CJK RADICAL BRUSH ONE +2EBB;W # CJK RADICAL BRUSH TWO +2EBC;W # CJK RADICAL MEAT +2EBD;W # CJK RADICAL MORTAR +2EBE;W # CJK RADICAL GRASS ONE +2EBF;W # CJK RADICAL GRASS TWO +2EC0;W # CJK RADICAL GRASS THREE +2EC1;W # CJK RADICAL TIGER +2EC2;W # CJK RADICAL CLOTHES +2EC3;W # CJK RADICAL WEST ONE +2EC4;W # CJK RADICAL WEST TWO +2EC5;W # CJK RADICAL C-SIMPLIFIED SEE +2EC6;W # CJK RADICAL SIMPLIFIED HORN +2EC7;W # CJK RADICAL HORN +2EC8;W # CJK RADICAL C-SIMPLIFIED SPEECH +2EC9;W # CJK RADICAL C-SIMPLIFIED SHELL +2ECA;W # CJK RADICAL FOOT +2ECB;W # CJK RADICAL C-SIMPLIFIED CART +2ECC;W # CJK RADICAL SIMPLIFIED WALK +2ECD;W # CJK RADICAL WALK ONE +2ECE;W # CJK RADICAL WALK TWO +2ECF;W # CJK RADICAL CITY +2ED0;W # CJK RADICAL C-SIMPLIFIED GOLD +2ED1;W # CJK RADICAL LONG ONE +2ED2;W # CJK RADICAL LONG TWO +2ED3;W # CJK RADICAL C-SIMPLIFIED LONG +2ED4;W # CJK RADICAL C-SIMPLIFIED GATE +2ED5;W # CJK RADICAL MOUND ONE +2ED6;W # CJK RADICAL MOUND TWO +2ED7;W # CJK RADICAL RAIN +2ED8;W # CJK RADICAL BLUE +2ED9;W # CJK RADICAL C-SIMPLIFIED TANNED LEATHER +2EDA;W # CJK RADICAL C-SIMPLIFIED LEAF +2EDB;W # CJK RADICAL C-SIMPLIFIED WIND +2EDC;W # CJK RADICAL C-SIMPLIFIED FLY +2EDD;W # CJK RADICAL EAT ONE +2EDE;W # CJK RADICAL EAT TWO +2EDF;W # CJK RADICAL EAT THREE +2EE0;W # CJK RADICAL C-SIMPLIFIED EAT +2EE1;W # CJK RADICAL HEAD +2EE2;W # CJK RADICAL C-SIMPLIFIED HORSE +2EE3;W # CJK RADICAL BONE +2EE4;W # CJK RADICAL GHOST +2EE5;W # CJK RADICAL C-SIMPLIFIED FISH +2EE6;W # CJK RADICAL C-SIMPLIFIED BIRD +2EE7;W # CJK RADICAL C-SIMPLIFIED SALT +2EE8;W # CJK RADICAL SIMPLIFIED WHEAT +2EE9;W # CJK RADICAL SIMPLIFIED YELLOW +2EEA;W # CJK RADICAL C-SIMPLIFIED FROG +2EEB;W # CJK RADICAL J-SIMPLIFIED EVEN +2EEC;W # CJK RADICAL C-SIMPLIFIED EVEN +2EED;W # CJK RADICAL J-SIMPLIFIED TOOTH +2EEE;W # CJK RADICAL C-SIMPLIFIED TOOTH +2EEF;W # CJK RADICAL J-SIMPLIFIED DRAGON +2EF0;W # CJK RADICAL C-SIMPLIFIED DRAGON +2EF1;W # CJK RADICAL TURTLE +2EF2;W # CJK RADICAL J-SIMPLIFIED TURTLE +2EF3;W # CJK RADICAL C-SIMPLIFIED TURTLE +2F00;W # KANGXI RADICAL ONE +2F01;W # KANGXI RADICAL LINE +2F02;W # KANGXI RADICAL DOT +2F03;W # KANGXI RADICAL SLASH +2F04;W # KANGXI RADICAL SECOND +2F05;W # KANGXI RADICAL HOOK +2F06;W # KANGXI RADICAL TWO +2F07;W # KANGXI RADICAL LID +2F08;W # KANGXI RADICAL MAN +2F09;W # KANGXI RADICAL LEGS +2F0A;W # KANGXI RADICAL ENTER +2F0B;W # KANGXI RADICAL EIGHT +2F0C;W # KANGXI RADICAL DOWN BOX +2F0D;W # KANGXI RADICAL COVER +2F0E;W # KANGXI RADICAL ICE +2F0F;W # KANGXI RADICAL TABLE +2F10;W # KANGXI RADICAL OPEN BOX +2F11;W # KANGXI RADICAL KNIFE +2F12;W # KANGXI RADICAL POWER +2F13;W # KANGXI RADICAL WRAP +2F14;W # KANGXI RADICAL SPOON +2F15;W # KANGXI RADICAL RIGHT OPEN BOX +2F16;W # KANGXI RADICAL HIDING ENCLOSURE +2F17;W # KANGXI RADICAL TEN +2F18;W # KANGXI RADICAL DIVINATION +2F19;W # KANGXI RADICAL SEAL +2F1A;W # KANGXI RADICAL CLIFF +2F1B;W # KANGXI RADICAL PRIVATE +2F1C;W # KANGXI RADICAL AGAIN +2F1D;W # KANGXI RADICAL MOUTH +2F1E;W # KANGXI RADICAL ENCLOSURE +2F1F;W # KANGXI RADICAL EARTH +2F20;W # KANGXI RADICAL SCHOLAR +2F21;W # KANGXI RADICAL GO +2F22;W # KANGXI RADICAL GO SLOWLY +2F23;W # KANGXI RADICAL EVENING +2F24;W # KANGXI RADICAL BIG +2F25;W # KANGXI RADICAL WOMAN +2F26;W # KANGXI RADICAL CHILD +2F27;W # KANGXI RADICAL ROOF +2F28;W # KANGXI RADICAL INCH +2F29;W # KANGXI RADICAL SMALL +2F2A;W # KANGXI RADICAL LAME +2F2B;W # KANGXI RADICAL CORPSE +2F2C;W # KANGXI RADICAL SPROUT +2F2D;W # KANGXI RADICAL MOUNTAIN +2F2E;W # KANGXI RADICAL RIVER +2F2F;W # KANGXI RADICAL WORK +2F30;W # KANGXI RADICAL ONESELF +2F31;W # KANGXI RADICAL TURBAN +2F32;W # KANGXI RADICAL DRY +2F33;W # KANGXI RADICAL SHORT THREAD +2F34;W # KANGXI RADICAL DOTTED CLIFF +2F35;W # KANGXI RADICAL LONG STRIDE +2F36;W # KANGXI RADICAL TWO HANDS +2F37;W # KANGXI RADICAL SHOOT +2F38;W # KANGXI RADICAL BOW +2F39;W # KANGXI RADICAL SNOUT +2F3A;W # KANGXI RADICAL BRISTLE +2F3B;W # KANGXI RADICAL STEP +2F3C;W # KANGXI RADICAL HEART +2F3D;W # KANGXI RADICAL HALBERD +2F3E;W # KANGXI RADICAL DOOR +2F3F;W # KANGXI RADICAL HAND +2F40;W # KANGXI RADICAL BRANCH +2F41;W # KANGXI RADICAL RAP +2F42;W # KANGXI RADICAL SCRIPT +2F43;W # KANGXI RADICAL DIPPER +2F44;W # KANGXI RADICAL AXE +2F45;W # KANGXI RADICAL SQUARE +2F46;W # KANGXI RADICAL NOT +2F47;W # KANGXI RADICAL SUN +2F48;W # KANGXI RADICAL SAY +2F49;W # KANGXI RADICAL MOON +2F4A;W # KANGXI RADICAL TREE +2F4B;W # KANGXI RADICAL LACK +2F4C;W # KANGXI RADICAL STOP +2F4D;W # KANGXI RADICAL DEATH +2F4E;W # KANGXI RADICAL WEAPON +2F4F;W # KANGXI RADICAL DO NOT +2F50;W # KANGXI RADICAL COMPARE +2F51;W # KANGXI RADICAL FUR +2F52;W # KANGXI RADICAL CLAN +2F53;W # KANGXI RADICAL STEAM +2F54;W # KANGXI RADICAL WATER +2F55;W # KANGXI RADICAL FIRE +2F56;W # KANGXI RADICAL CLAW +2F57;W # KANGXI RADICAL FATHER +2F58;W # KANGXI RADICAL DOUBLE X +2F59;W # KANGXI RADICAL HALF TREE TRUNK +2F5A;W # KANGXI RADICAL SLICE +2F5B;W # KANGXI RADICAL FANG +2F5C;W # KANGXI RADICAL COW +2F5D;W # KANGXI RADICAL DOG +2F5E;W # KANGXI RADICAL PROFOUND +2F5F;W # KANGXI RADICAL JADE +2F60;W # KANGXI RADICAL MELON +2F61;W # KANGXI RADICAL TILE +2F62;W # KANGXI RADICAL SWEET +2F63;W # KANGXI RADICAL LIFE +2F64;W # KANGXI RADICAL USE +2F65;W # KANGXI RADICAL FIELD +2F66;W # KANGXI RADICAL BOLT OF CLOTH +2F67;W # KANGXI RADICAL SICKNESS +2F68;W # KANGXI RADICAL DOTTED TENT +2F69;W # KANGXI RADICAL WHITE +2F6A;W # KANGXI RADICAL SKIN +2F6B;W # KANGXI RADICAL DISH +2F6C;W # KANGXI RADICAL EYE +2F6D;W # KANGXI RADICAL SPEAR +2F6E;W # KANGXI RADICAL ARROW +2F6F;W # KANGXI RADICAL STONE +2F70;W # KANGXI RADICAL SPIRIT +2F71;W # KANGXI RADICAL TRACK +2F72;W # KANGXI RADICAL GRAIN +2F73;W # KANGXI RADICAL CAVE +2F74;W # KANGXI RADICAL STAND +2F75;W # KANGXI RADICAL BAMBOO +2F76;W # KANGXI RADICAL RICE +2F77;W # KANGXI RADICAL SILK +2F78;W # KANGXI RADICAL JAR +2F79;W # KANGXI RADICAL NET +2F7A;W # KANGXI RADICAL SHEEP +2F7B;W # KANGXI RADICAL FEATHER +2F7C;W # KANGXI RADICAL OLD +2F7D;W # KANGXI RADICAL AND +2F7E;W # KANGXI RADICAL PLOW +2F7F;W # KANGXI RADICAL EAR +2F80;W # KANGXI RADICAL BRUSH +2F81;W # KANGXI RADICAL MEAT +2F82;W # KANGXI RADICAL MINISTER +2F83;W # KANGXI RADICAL SELF +2F84;W # KANGXI RADICAL ARRIVE +2F85;W # KANGXI RADICAL MORTAR +2F86;W # KANGXI RADICAL TONGUE +2F87;W # KANGXI RADICAL OPPOSE +2F88;W # KANGXI RADICAL BOAT +2F89;W # KANGXI RADICAL STOPPING +2F8A;W # KANGXI RADICAL COLOR +2F8B;W # KANGXI RADICAL GRASS +2F8C;W # KANGXI RADICAL TIGER +2F8D;W # KANGXI RADICAL INSECT +2F8E;W # KANGXI RADICAL BLOOD +2F8F;W # KANGXI RADICAL WALK ENCLOSURE +2F90;W # KANGXI RADICAL CLOTHES +2F91;W # KANGXI RADICAL WEST +2F92;W # KANGXI RADICAL SEE +2F93;W # KANGXI RADICAL HORN +2F94;W # KANGXI RADICAL SPEECH +2F95;W # KANGXI RADICAL VALLEY +2F96;W # KANGXI RADICAL BEAN +2F97;W # KANGXI RADICAL PIG +2F98;W # KANGXI RADICAL BADGER +2F99;W # KANGXI RADICAL SHELL +2F9A;W # KANGXI RADICAL RED +2F9B;W # KANGXI RADICAL RUN +2F9C;W # KANGXI RADICAL FOOT +2F9D;W # KANGXI RADICAL BODY +2F9E;W # KANGXI RADICAL CART +2F9F;W # KANGXI RADICAL BITTER +2FA0;W # KANGXI RADICAL MORNING +2FA1;W # KANGXI RADICAL WALK +2FA2;W # KANGXI RADICAL CITY +2FA3;W # KANGXI RADICAL WINE +2FA4;W # KANGXI RADICAL DISTINGUISH +2FA5;W # KANGXI RADICAL VILLAGE +2FA6;W # KANGXI RADICAL GOLD +2FA7;W # KANGXI RADICAL LONG +2FA8;W # KANGXI RADICAL GATE +2FA9;W # KANGXI RADICAL MOUND +2FAA;W # KANGXI RADICAL SLAVE +2FAB;W # KANGXI RADICAL SHORT TAILED BIRD +2FAC;W # KANGXI RADICAL RAIN +2FAD;W # KANGXI RADICAL BLUE +2FAE;W # KANGXI RADICAL WRONG +2FAF;W # KANGXI RADICAL FACE +2FB0;W # KANGXI RADICAL LEATHER +2FB1;W # KANGXI RADICAL TANNED LEATHER +2FB2;W # KANGXI RADICAL LEEK +2FB3;W # KANGXI RADICAL SOUND +2FB4;W # KANGXI RADICAL LEAF +2FB5;W # KANGXI RADICAL WIND +2FB6;W # KANGXI RADICAL FLY +2FB7;W # KANGXI RADICAL EAT +2FB8;W # KANGXI RADICAL HEAD +2FB9;W # KANGXI RADICAL FRAGRANT +2FBA;W # KANGXI RADICAL HORSE +2FBB;W # KANGXI RADICAL BONE +2FBC;W # KANGXI RADICAL TALL +2FBD;W # KANGXI RADICAL HAIR +2FBE;W # KANGXI RADICAL FIGHT +2FBF;W # KANGXI RADICAL SACRIFICIAL WINE +2FC0;W # KANGXI RADICAL CAULDRON +2FC1;W # KANGXI RADICAL GHOST +2FC2;W # KANGXI RADICAL FISH +2FC3;W # KANGXI RADICAL BIRD +2FC4;W # KANGXI RADICAL SALT +2FC5;W # KANGXI RADICAL DEER +2FC6;W # KANGXI RADICAL WHEAT +2FC7;W # KANGXI RADICAL HEMP +2FC8;W # KANGXI RADICAL YELLOW +2FC9;W # KANGXI RADICAL MILLET +2FCA;W # KANGXI RADICAL BLACK +2FCB;W # KANGXI RADICAL EMBROIDERY +2FCC;W # KANGXI RADICAL FROG +2FCD;W # KANGXI RADICAL TRIPOD +2FCE;W # KANGXI RADICAL DRUM +2FCF;W # KANGXI RADICAL RAT +2FD0;W # KANGXI RADICAL NOSE +2FD1;W # KANGXI RADICAL EVEN +2FD2;W # KANGXI RADICAL TOOTH +2FD3;W # KANGXI RADICAL DRAGON +2FD4;W # KANGXI RADICAL TURTLE +2FD5;W # KANGXI RADICAL FLUTE +2FF0;W # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT +2FF1;W # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW +2FF2;W # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT +2FF3;W # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW +2FF4;W # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND +2FF5;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE +2FF6;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW +2FF7;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT +2FF8;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT +2FF9;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT +2FFA;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT +2FFB;W # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +3000;F # IDEOGRAPHIC SPACE +3001;W # IDEOGRAPHIC COMMA +3002;W # IDEOGRAPHIC FULL STOP +3003;W # DITTO MARK +3004;W # JAPANESE INDUSTRIAL STANDARD SYMBOL +3005;W # IDEOGRAPHIC ITERATION MARK +3006;W # IDEOGRAPHIC CLOSING MARK +3007;W # IDEOGRAPHIC NUMBER ZERO +3008;W # LEFT ANGLE BRACKET +3009;W # RIGHT ANGLE BRACKET +300A;W # LEFT DOUBLE ANGLE BRACKET +300B;W # RIGHT DOUBLE ANGLE BRACKET +300C;W # LEFT CORNER BRACKET +300D;W # RIGHT CORNER BRACKET +300E;W # LEFT WHITE CORNER BRACKET +300F;W # RIGHT WHITE CORNER BRACKET +3010;W # LEFT BLACK LENTICULAR BRACKET +3011;W # RIGHT BLACK LENTICULAR BRACKET +3012;W # POSTAL MARK +3013;W # GETA MARK +3014;W # LEFT TORTOISE SHELL BRACKET +3015;W # RIGHT TORTOISE SHELL BRACKET +3016;W # LEFT WHITE LENTICULAR BRACKET +3017;W # RIGHT WHITE LENTICULAR BRACKET +3018;W # LEFT WHITE TORTOISE SHELL BRACKET +3019;W # RIGHT WHITE TORTOISE SHELL BRACKET +301A;W # LEFT WHITE SQUARE BRACKET +301B;W # RIGHT WHITE SQUARE BRACKET +301C;W # WAVE DASH +301D;W # REVERSED DOUBLE PRIME QUOTATION MARK +301E;W # DOUBLE PRIME QUOTATION MARK +301F;W # LOW DOUBLE PRIME QUOTATION MARK +3020;W # POSTAL MARK FACE +3021;W # HANGZHOU NUMERAL ONE +3022;W # HANGZHOU NUMERAL TWO +3023;W # HANGZHOU NUMERAL THREE +3024;W # HANGZHOU NUMERAL FOUR +3025;W # HANGZHOU NUMERAL FIVE +3026;W # HANGZHOU NUMERAL SIX +3027;W # HANGZHOU NUMERAL SEVEN +3028;W # HANGZHOU NUMERAL EIGHT +3029;W # HANGZHOU NUMERAL NINE +302A;W # IDEOGRAPHIC LEVEL TONE MARK +302B;W # IDEOGRAPHIC RISING TONE MARK +302C;W # IDEOGRAPHIC DEPARTING TONE MARK +302D;W # IDEOGRAPHIC ENTERING TONE MARK +302E;W # HANGUL SINGLE DOT TONE MARK +302F;W # HANGUL DOUBLE DOT TONE MARK +3030;W # WAVY DASH +3031;W # VERTICAL KANA REPEAT MARK +3032;W # VERTICAL KANA REPEAT WITH VOICED SOUND MARK +3033;W # VERTICAL KANA REPEAT MARK UPPER HALF +3034;W # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF +3035;W # VERTICAL KANA REPEAT MARK LOWER HALF +3036;W # CIRCLED POSTAL MARK +3037;W # IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +3038;W # HANGZHOU NUMERAL TEN +3039;W # HANGZHOU NUMERAL TWENTY +303A;W # HANGZHOU NUMERAL THIRTY +303B;W # VERTICAL IDEOGRAPHIC ITERATION MARK +303C;W # MASU MARK +303D;W # PART ALTERNATION MARK +303E;W # IDEOGRAPHIC VARIATION INDICATOR +303F;N # IDEOGRAPHIC HALF FILL SPACE +3041;W # HIRAGANA LETTER SMALL A +3042;W # HIRAGANA LETTER A +3043;W # HIRAGANA LETTER SMALL I +3044;W # HIRAGANA LETTER I +3045;W # HIRAGANA LETTER SMALL U +3046;W # HIRAGANA LETTER U +3047;W # HIRAGANA LETTER SMALL E +3048;W # HIRAGANA LETTER E +3049;W # HIRAGANA LETTER SMALL O +304A;W # HIRAGANA LETTER O +304B;W # HIRAGANA LETTER KA +304C;W # HIRAGANA LETTER GA +304D;W # HIRAGANA LETTER KI +304E;W # HIRAGANA LETTER GI +304F;W # HIRAGANA LETTER KU +3050;W # HIRAGANA LETTER GU +3051;W # HIRAGANA LETTER KE +3052;W # HIRAGANA LETTER GE +3053;W # HIRAGANA LETTER KO +3054;W # HIRAGANA LETTER GO +3055;W # HIRAGANA LETTER SA +3056;W # HIRAGANA LETTER ZA +3057;W # HIRAGANA LETTER SI +3058;W # HIRAGANA LETTER ZI +3059;W # HIRAGANA LETTER SU +305A;W # HIRAGANA LETTER ZU +305B;W # HIRAGANA LETTER SE +305C;W # HIRAGANA LETTER ZE +305D;W # HIRAGANA LETTER SO +305E;W # HIRAGANA LETTER ZO +305F;W # HIRAGANA LETTER TA +3060;W # HIRAGANA LETTER DA +3061;W # HIRAGANA LETTER TI +3062;W # HIRAGANA LETTER DI +3063;W # HIRAGANA LETTER SMALL TU +3064;W # HIRAGANA LETTER TU +3065;W # HIRAGANA LETTER DU +3066;W # HIRAGANA LETTER TE +3067;W # HIRAGANA LETTER DE +3068;W # HIRAGANA LETTER TO +3069;W # HIRAGANA LETTER DO +306A;W # HIRAGANA LETTER NA +306B;W # HIRAGANA LETTER NI +306C;W # HIRAGANA LETTER NU +306D;W # HIRAGANA LETTER NE +306E;W # HIRAGANA LETTER NO +306F;W # HIRAGANA LETTER HA +3070;W # HIRAGANA LETTER BA +3071;W # HIRAGANA LETTER PA +3072;W # HIRAGANA LETTER HI +3073;W # HIRAGANA LETTER BI +3074;W # HIRAGANA LETTER PI +3075;W # HIRAGANA LETTER HU +3076;W # HIRAGANA LETTER BU +3077;W # HIRAGANA LETTER PU +3078;W # HIRAGANA LETTER HE +3079;W # HIRAGANA LETTER BE +307A;W # HIRAGANA LETTER PE +307B;W # HIRAGANA LETTER HO +307C;W # HIRAGANA LETTER BO +307D;W # HIRAGANA LETTER PO +307E;W # HIRAGANA LETTER MA +307F;W # HIRAGANA LETTER MI +3080;W # HIRAGANA LETTER MU +3081;W # HIRAGANA LETTER ME +3082;W # HIRAGANA LETTER MO +3083;W # HIRAGANA LETTER SMALL YA +3084;W # HIRAGANA LETTER YA +3085;W # HIRAGANA LETTER SMALL YU +3086;W # HIRAGANA LETTER YU +3087;W # HIRAGANA LETTER SMALL YO +3088;W # HIRAGANA LETTER YO +3089;W # HIRAGANA LETTER RA +308A;W # HIRAGANA LETTER RI +308B;W # HIRAGANA LETTER RU +308C;W # HIRAGANA LETTER RE +308D;W # HIRAGANA LETTER RO +308E;W # HIRAGANA LETTER SMALL WA +308F;W # HIRAGANA LETTER WA +3090;W # HIRAGANA LETTER WI +3091;W # HIRAGANA LETTER WE +3092;W # HIRAGANA LETTER WO +3093;W # HIRAGANA LETTER N +3094;W # HIRAGANA LETTER VU +3095;W # HIRAGANA LETTER SMALL KA +3096;W # HIRAGANA LETTER SMALL KE +3099;W # COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK +309A;W # COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309B;W # KATAKANA-HIRAGANA VOICED SOUND MARK +309C;W # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309D;W # HIRAGANA ITERATION MARK +309E;W # HIRAGANA VOICED ITERATION MARK +309F;W # HIRAGANA DIGRAPH YORI +30A0;W # KATAKANA-HIRAGANA DOUBLE HYPHEN +30A1;W # KATAKANA LETTER SMALL A +30A2;W # KATAKANA LETTER A +30A3;W # KATAKANA LETTER SMALL I +30A4;W # KATAKANA LETTER I +30A5;W # KATAKANA LETTER SMALL U +30A6;W # KATAKANA LETTER U +30A7;W # KATAKANA LETTER SMALL E +30A8;W # KATAKANA LETTER E +30A9;W # KATAKANA LETTER SMALL O +30AA;W # KATAKANA LETTER O +30AB;W # KATAKANA LETTER KA +30AC;W # KATAKANA LETTER GA +30AD;W # KATAKANA LETTER KI +30AE;W # KATAKANA LETTER GI +30AF;W # KATAKANA LETTER KU +30B0;W # KATAKANA LETTER GU +30B1;W # KATAKANA LETTER KE +30B2;W # KATAKANA LETTER GE +30B3;W # KATAKANA LETTER KO +30B4;W # KATAKANA LETTER GO +30B5;W # KATAKANA LETTER SA +30B6;W # KATAKANA LETTER ZA +30B7;W # KATAKANA LETTER SI +30B8;W # KATAKANA LETTER ZI +30B9;W # KATAKANA LETTER SU +30BA;W # KATAKANA LETTER ZU +30BB;W # KATAKANA LETTER SE +30BC;W # KATAKANA LETTER ZE +30BD;W # KATAKANA LETTER SO +30BE;W # KATAKANA LETTER ZO +30BF;W # KATAKANA LETTER TA +30C0;W # KATAKANA LETTER DA +30C1;W # KATAKANA LETTER TI +30C2;W # KATAKANA LETTER DI +30C3;W # KATAKANA LETTER SMALL TU +30C4;W # KATAKANA LETTER TU +30C5;W # KATAKANA LETTER DU +30C6;W # KATAKANA LETTER TE +30C7;W # KATAKANA LETTER DE +30C8;W # KATAKANA LETTER TO +30C9;W # KATAKANA LETTER DO +30CA;W # KATAKANA LETTER NA +30CB;W # KATAKANA LETTER NI +30CC;W # KATAKANA LETTER NU +30CD;W # KATAKANA LETTER NE +30CE;W # KATAKANA LETTER NO +30CF;W # KATAKANA LETTER HA +30D0;W # KATAKANA LETTER BA +30D1;W # KATAKANA LETTER PA +30D2;W # KATAKANA LETTER HI +30D3;W # KATAKANA LETTER BI +30D4;W # KATAKANA LETTER PI +30D5;W # KATAKANA LETTER HU +30D6;W # KATAKANA LETTER BU +30D7;W # KATAKANA LETTER PU +30D8;W # KATAKANA LETTER HE +30D9;W # KATAKANA LETTER BE +30DA;W # KATAKANA LETTER PE +30DB;W # KATAKANA LETTER HO +30DC;W # KATAKANA LETTER BO +30DD;W # KATAKANA LETTER PO +30DE;W # KATAKANA LETTER MA +30DF;W # KATAKANA LETTER MI +30E0;W # KATAKANA LETTER MU +30E1;W # KATAKANA LETTER ME +30E2;W # KATAKANA LETTER MO +30E3;W # KATAKANA LETTER SMALL YA +30E4;W # KATAKANA LETTER YA +30E5;W # KATAKANA LETTER SMALL YU +30E6;W # KATAKANA LETTER YU +30E7;W # KATAKANA LETTER SMALL YO +30E8;W # KATAKANA LETTER YO +30E9;W # KATAKANA LETTER RA +30EA;W # KATAKANA LETTER RI +30EB;W # KATAKANA LETTER RU +30EC;W # KATAKANA LETTER RE +30ED;W # KATAKANA LETTER RO +30EE;W # KATAKANA LETTER SMALL WA +30EF;W # KATAKANA LETTER WA +30F0;W # KATAKANA LETTER WI +30F1;W # KATAKANA LETTER WE +30F2;W # KATAKANA LETTER WO +30F3;W # KATAKANA LETTER N +30F4;W # KATAKANA LETTER VU +30F5;W # KATAKANA LETTER SMALL KA +30F6;W # KATAKANA LETTER SMALL KE +30F7;W # KATAKANA LETTER VA +30F8;W # KATAKANA LETTER VI +30F9;W # KATAKANA LETTER VE +30FA;W # KATAKANA LETTER VO +30FB;W # KATAKANA MIDDLE DOT +30FC;W # KATAKANA-HIRAGANA PROLONGED SOUND MARK +30FD;W # KATAKANA ITERATION MARK +30FE;W # KATAKANA VOICED ITERATION MARK +30FF;W # KATAKANA DIGRAPH KOTO +3105;W # BOPOMOFO LETTER B +3106;W # BOPOMOFO LETTER P +3107;W # BOPOMOFO LETTER M +3108;W # BOPOMOFO LETTER F +3109;W # BOPOMOFO LETTER D +310A;W # BOPOMOFO LETTER T +310B;W # BOPOMOFO LETTER N +310C;W # BOPOMOFO LETTER L +310D;W # BOPOMOFO LETTER G +310E;W # BOPOMOFO LETTER K +310F;W # BOPOMOFO LETTER H +3110;W # BOPOMOFO LETTER J +3111;W # BOPOMOFO LETTER Q +3112;W # BOPOMOFO LETTER X +3113;W # BOPOMOFO LETTER ZH +3114;W # BOPOMOFO LETTER CH +3115;W # BOPOMOFO LETTER SH +3116;W # BOPOMOFO LETTER R +3117;W # BOPOMOFO LETTER Z +3118;W # BOPOMOFO LETTER C +3119;W # BOPOMOFO LETTER S +311A;W # BOPOMOFO LETTER A +311B;W # BOPOMOFO LETTER O +311C;W # BOPOMOFO LETTER E +311D;W # BOPOMOFO LETTER EH +311E;W # BOPOMOFO LETTER AI +311F;W # BOPOMOFO LETTER EI +3120;W # BOPOMOFO LETTER AU +3121;W # BOPOMOFO LETTER OU +3122;W # BOPOMOFO LETTER AN +3123;W # BOPOMOFO LETTER EN +3124;W # BOPOMOFO LETTER ANG +3125;W # BOPOMOFO LETTER ENG +3126;W # BOPOMOFO LETTER ER +3127;W # BOPOMOFO LETTER I +3128;W # BOPOMOFO LETTER U +3129;W # BOPOMOFO LETTER IU +312A;W # BOPOMOFO LETTER V +312B;W # BOPOMOFO LETTER NG +312C;W # BOPOMOFO LETTER GN +3131;W # HANGUL LETTER KIYEOK +3132;W # HANGUL LETTER SSANGKIYEOK +3133;W # HANGUL LETTER KIYEOK-SIOS +3134;W # HANGUL LETTER NIEUN +3135;W # HANGUL LETTER NIEUN-CIEUC +3136;W # HANGUL LETTER NIEUN-HIEUH +3137;W # HANGUL LETTER TIKEUT +3138;W # HANGUL LETTER SSANGTIKEUT +3139;W # HANGUL LETTER RIEUL +313A;W # HANGUL LETTER RIEUL-KIYEOK +313B;W # HANGUL LETTER RIEUL-MIEUM +313C;W # HANGUL LETTER RIEUL-PIEUP +313D;W # HANGUL LETTER RIEUL-SIOS +313E;W # HANGUL LETTER RIEUL-THIEUTH +313F;W # HANGUL LETTER RIEUL-PHIEUPH +3140;W # HANGUL LETTER RIEUL-HIEUH +3141;W # HANGUL LETTER MIEUM +3142;W # HANGUL LETTER PIEUP +3143;W # HANGUL LETTER SSANGPIEUP +3144;W # HANGUL LETTER PIEUP-SIOS +3145;W # HANGUL LETTER SIOS +3146;W # HANGUL LETTER SSANGSIOS +3147;W # HANGUL LETTER IEUNG +3148;W # HANGUL LETTER CIEUC +3149;W # HANGUL LETTER SSANGCIEUC +314A;W # HANGUL LETTER CHIEUCH +314B;W # HANGUL LETTER KHIEUKH +314C;W # HANGUL LETTER THIEUTH +314D;W # HANGUL LETTER PHIEUPH +314E;W # HANGUL LETTER HIEUH +314F;W # HANGUL LETTER A +3150;W # HANGUL LETTER AE +3151;W # HANGUL LETTER YA +3152;W # HANGUL LETTER YAE +3153;W # HANGUL LETTER EO +3154;W # HANGUL LETTER E +3155;W # HANGUL LETTER YEO +3156;W # HANGUL LETTER YE +3157;W # HANGUL LETTER O +3158;W # HANGUL LETTER WA +3159;W # HANGUL LETTER WAE +315A;W # HANGUL LETTER OE +315B;W # HANGUL LETTER YO +315C;W # HANGUL LETTER U +315D;W # HANGUL LETTER WEO +315E;W # HANGUL LETTER WE +315F;W # HANGUL LETTER WI +3160;W # HANGUL LETTER YU +3161;W # HANGUL LETTER EU +3162;W # HANGUL LETTER YI +3163;W # HANGUL LETTER I +3164;W # HANGUL FILLER +3165;W # HANGUL LETTER SSANGNIEUN +3166;W # HANGUL LETTER NIEUN-TIKEUT +3167;W # HANGUL LETTER NIEUN-SIOS +3168;W # HANGUL LETTER NIEUN-PANSIOS +3169;W # HANGUL LETTER RIEUL-KIYEOK-SIOS +316A;W # HANGUL LETTER RIEUL-TIKEUT +316B;W # HANGUL LETTER RIEUL-PIEUP-SIOS +316C;W # HANGUL LETTER RIEUL-PANSIOS +316D;W # HANGUL LETTER RIEUL-YEORINHIEUH +316E;W # HANGUL LETTER MIEUM-PIEUP +316F;W # HANGUL LETTER MIEUM-SIOS +3170;W # HANGUL LETTER MIEUM-PANSIOS +3171;W # HANGUL LETTER KAPYEOUNMIEUM +3172;W # HANGUL LETTER PIEUP-KIYEOK +3173;W # HANGUL LETTER PIEUP-TIKEUT +3174;W # HANGUL LETTER PIEUP-SIOS-KIYEOK +3175;W # HANGUL LETTER PIEUP-SIOS-TIKEUT +3176;W # HANGUL LETTER PIEUP-CIEUC +3177;W # HANGUL LETTER PIEUP-THIEUTH +3178;W # HANGUL LETTER KAPYEOUNPIEUP +3179;W # HANGUL LETTER KAPYEOUNSSANGPIEUP +317A;W # HANGUL LETTER SIOS-KIYEOK +317B;W # HANGUL LETTER SIOS-NIEUN +317C;W # HANGUL LETTER SIOS-TIKEUT +317D;W # HANGUL LETTER SIOS-PIEUP +317E;W # HANGUL LETTER SIOS-CIEUC +317F;W # HANGUL LETTER PANSIOS +3180;W # HANGUL LETTER SSANGIEUNG +3181;W # HANGUL LETTER YESIEUNG +3182;W # HANGUL LETTER YESIEUNG-SIOS +3183;W # HANGUL LETTER YESIEUNG-PANSIOS +3184;W # HANGUL LETTER KAPYEOUNPHIEUPH +3185;W # HANGUL LETTER SSANGHIEUH +3186;W # HANGUL LETTER YEORINHIEUH +3187;W # HANGUL LETTER YO-YA +3188;W # HANGUL LETTER YO-YAE +3189;W # HANGUL LETTER YO-I +318A;W # HANGUL LETTER YU-YEO +318B;W # HANGUL LETTER YU-YE +318C;W # HANGUL LETTER YU-I +318D;W # HANGUL LETTER ARAEA +318E;W # HANGUL LETTER ARAEAE +3190;W # IDEOGRAPHIC ANNOTATION LINKING MARK +3191;W # IDEOGRAPHIC ANNOTATION REVERSE MARK +3192;W # IDEOGRAPHIC ANNOTATION ONE MARK +3193;W # IDEOGRAPHIC ANNOTATION TWO MARK +3194;W # IDEOGRAPHIC ANNOTATION THREE MARK +3195;W # IDEOGRAPHIC ANNOTATION FOUR MARK +3196;W # IDEOGRAPHIC ANNOTATION TOP MARK +3197;W # IDEOGRAPHIC ANNOTATION MIDDLE MARK +3198;W # IDEOGRAPHIC ANNOTATION BOTTOM MARK +3199;W # IDEOGRAPHIC ANNOTATION FIRST MARK +319A;W # IDEOGRAPHIC ANNOTATION SECOND MARK +319B;W # IDEOGRAPHIC ANNOTATION THIRD MARK +319C;W # IDEOGRAPHIC ANNOTATION FOURTH MARK +319D;W # IDEOGRAPHIC ANNOTATION HEAVEN MARK +319E;W # IDEOGRAPHIC ANNOTATION EARTH MARK +319F;W # IDEOGRAPHIC ANNOTATION MAN MARK +31A0;W # BOPOMOFO LETTER BU +31A1;W # BOPOMOFO LETTER ZI +31A2;W # BOPOMOFO LETTER JI +31A3;W # BOPOMOFO LETTER GU +31A4;W # BOPOMOFO LETTER EE +31A5;W # BOPOMOFO LETTER ENN +31A6;W # BOPOMOFO LETTER OO +31A7;W # BOPOMOFO LETTER ONN +31A8;W # BOPOMOFO LETTER IR +31A9;W # BOPOMOFO LETTER ANN +31AA;W # BOPOMOFO LETTER INN +31AB;W # BOPOMOFO LETTER UNN +31AC;W # BOPOMOFO LETTER IM +31AD;W # BOPOMOFO LETTER NGG +31AE;W # BOPOMOFO LETTER AINN +31AF;W # BOPOMOFO LETTER AUNN +31B0;W # BOPOMOFO LETTER AM +31B1;W # BOPOMOFO LETTER OM +31B2;W # BOPOMOFO LETTER ONG +31B3;W # BOPOMOFO LETTER INNN +31B4;W # BOPOMOFO FINAL LETTER P +31B5;W # BOPOMOFO FINAL LETTER T +31B6;W # BOPOMOFO FINAL LETTER K +31B7;W # BOPOMOFO FINAL LETTER H +31C0;W # CJK STROKE T +31C1;W # CJK STROKE WG +31C2;W # CJK STROKE XG +31C3;W # CJK STROKE BXG +31C4;W # CJK STROKE SW +31C5;W # CJK STROKE HZZ +31C6;W # CJK STROKE HZG +31C7;W # CJK STROKE HP +31C8;W # CJK STROKE HZWG +31C9;W # CJK STROKE SZWG +31CA;W # CJK STROKE HZT +31CB;W # CJK STROKE HZZP +31CC;W # CJK STROKE HPWG +31CD;W # CJK STROKE HZW +31CE;W # CJK STROKE HZZZ +31CF;W # CJK STROKE N +31F0;W # KATAKANA LETTER SMALL KU +31F1;W # KATAKANA LETTER SMALL SI +31F2;W # KATAKANA LETTER SMALL SU +31F3;W # KATAKANA LETTER SMALL TO +31F4;W # KATAKANA LETTER SMALL NU +31F5;W # KATAKANA LETTER SMALL HA +31F6;W # KATAKANA LETTER SMALL HI +31F7;W # KATAKANA LETTER SMALL HU +31F8;W # KATAKANA LETTER SMALL HE +31F9;W # KATAKANA LETTER SMALL HO +31FA;W # KATAKANA LETTER SMALL MU +31FB;W # KATAKANA LETTER SMALL RA +31FC;W # KATAKANA LETTER SMALL RI +31FD;W # KATAKANA LETTER SMALL RU +31FE;W # KATAKANA LETTER SMALL RE +31FF;W # KATAKANA LETTER SMALL RO +3200;W # PARENTHESIZED HANGUL KIYEOK +3201;W # PARENTHESIZED HANGUL NIEUN +3202;W # PARENTHESIZED HANGUL TIKEUT +3203;W # PARENTHESIZED HANGUL RIEUL +3204;W # PARENTHESIZED HANGUL MIEUM +3205;W # PARENTHESIZED HANGUL PIEUP +3206;W # PARENTHESIZED HANGUL SIOS +3207;W # PARENTHESIZED HANGUL IEUNG +3208;W # PARENTHESIZED HANGUL CIEUC +3209;W # PARENTHESIZED HANGUL CHIEUCH +320A;W # PARENTHESIZED HANGUL KHIEUKH +320B;W # PARENTHESIZED HANGUL THIEUTH +320C;W # PARENTHESIZED HANGUL PHIEUPH +320D;W # PARENTHESIZED HANGUL HIEUH +320E;W # PARENTHESIZED HANGUL KIYEOK A +320F;W # PARENTHESIZED HANGUL NIEUN A +3210;W # PARENTHESIZED HANGUL TIKEUT A +3211;W # PARENTHESIZED HANGUL RIEUL A +3212;W # PARENTHESIZED HANGUL MIEUM A +3213;W # PARENTHESIZED HANGUL PIEUP A +3214;W # PARENTHESIZED HANGUL SIOS A +3215;W # PARENTHESIZED HANGUL IEUNG A +3216;W # PARENTHESIZED HANGUL CIEUC A +3217;W # PARENTHESIZED HANGUL CHIEUCH A +3218;W # PARENTHESIZED HANGUL KHIEUKH A +3219;W # PARENTHESIZED HANGUL THIEUTH A +321A;W # PARENTHESIZED HANGUL PHIEUPH A +321B;W # PARENTHESIZED HANGUL HIEUH A +321C;W # PARENTHESIZED HANGUL CIEUC U +321D;W # PARENTHESIZED KOREAN CHARACTER OJEON +321E;W # PARENTHESIZED KOREAN CHARACTER O HU +3220;W # PARENTHESIZED IDEOGRAPH ONE +3221;W # PARENTHESIZED IDEOGRAPH TWO +3222;W # PARENTHESIZED IDEOGRAPH THREE +3223;W # PARENTHESIZED IDEOGRAPH FOUR +3224;W # PARENTHESIZED IDEOGRAPH FIVE +3225;W # PARENTHESIZED IDEOGRAPH SIX +3226;W # PARENTHESIZED IDEOGRAPH SEVEN +3227;W # PARENTHESIZED IDEOGRAPH EIGHT +3228;W # PARENTHESIZED IDEOGRAPH NINE +3229;W # PARENTHESIZED IDEOGRAPH TEN +322A;W # PARENTHESIZED IDEOGRAPH MOON +322B;W # PARENTHESIZED IDEOGRAPH FIRE +322C;W # PARENTHESIZED IDEOGRAPH WATER +322D;W # PARENTHESIZED IDEOGRAPH WOOD +322E;W # PARENTHESIZED IDEOGRAPH METAL +322F;W # PARENTHESIZED IDEOGRAPH EARTH +3230;W # PARENTHESIZED IDEOGRAPH SUN +3231;W # PARENTHESIZED IDEOGRAPH STOCK +3232;W # PARENTHESIZED IDEOGRAPH HAVE +3233;W # PARENTHESIZED IDEOGRAPH SOCIETY +3234;W # PARENTHESIZED IDEOGRAPH NAME +3235;W # PARENTHESIZED IDEOGRAPH SPECIAL +3236;W # PARENTHESIZED IDEOGRAPH FINANCIAL +3237;W # PARENTHESIZED IDEOGRAPH CONGRATULATION +3238;W # PARENTHESIZED IDEOGRAPH LABOR +3239;W # PARENTHESIZED IDEOGRAPH REPRESENT +323A;W # PARENTHESIZED IDEOGRAPH CALL +323B;W # PARENTHESIZED IDEOGRAPH STUDY +323C;W # PARENTHESIZED IDEOGRAPH SUPERVISE +323D;W # PARENTHESIZED IDEOGRAPH ENTERPRISE +323E;W # PARENTHESIZED IDEOGRAPH RESOURCE +323F;W # PARENTHESIZED IDEOGRAPH ALLIANCE +3240;W # PARENTHESIZED IDEOGRAPH FESTIVAL +3241;W # PARENTHESIZED IDEOGRAPH REST +3242;W # PARENTHESIZED IDEOGRAPH SELF +3243;W # PARENTHESIZED IDEOGRAPH REACH +3250;W # PARTNERSHIP SIGN +3251;W # CIRCLED NUMBER TWENTY ONE +3252;W # CIRCLED NUMBER TWENTY TWO +3253;W # CIRCLED NUMBER TWENTY THREE +3254;W # CIRCLED NUMBER TWENTY FOUR +3255;W # CIRCLED NUMBER TWENTY FIVE +3256;W # CIRCLED NUMBER TWENTY SIX +3257;W # CIRCLED NUMBER TWENTY SEVEN +3258;W # CIRCLED NUMBER TWENTY EIGHT +3259;W # CIRCLED NUMBER TWENTY NINE +325A;W # CIRCLED NUMBER THIRTY +325B;W # CIRCLED NUMBER THIRTY ONE +325C;W # CIRCLED NUMBER THIRTY TWO +325D;W # CIRCLED NUMBER THIRTY THREE +325E;W # CIRCLED NUMBER THIRTY FOUR +325F;W # CIRCLED NUMBER THIRTY FIVE +3260;W # CIRCLED HANGUL KIYEOK +3261;W # CIRCLED HANGUL NIEUN +3262;W # CIRCLED HANGUL TIKEUT +3263;W # CIRCLED HANGUL RIEUL +3264;W # CIRCLED HANGUL MIEUM +3265;W # CIRCLED HANGUL PIEUP +3266;W # CIRCLED HANGUL SIOS +3267;W # CIRCLED HANGUL IEUNG +3268;W # CIRCLED HANGUL CIEUC +3269;W # CIRCLED HANGUL CHIEUCH +326A;W # CIRCLED HANGUL KHIEUKH +326B;W # CIRCLED HANGUL THIEUTH +326C;W # CIRCLED HANGUL PHIEUPH +326D;W # CIRCLED HANGUL HIEUH +326E;W # CIRCLED HANGUL KIYEOK A +326F;W # CIRCLED HANGUL NIEUN A +3270;W # CIRCLED HANGUL TIKEUT A +3271;W # CIRCLED HANGUL RIEUL A +3272;W # CIRCLED HANGUL MIEUM A +3273;W # CIRCLED HANGUL PIEUP A +3274;W # CIRCLED HANGUL SIOS A +3275;W # CIRCLED HANGUL IEUNG A +3276;W # CIRCLED HANGUL CIEUC A +3277;W # CIRCLED HANGUL CHIEUCH A +3278;W # CIRCLED HANGUL KHIEUKH A +3279;W # CIRCLED HANGUL THIEUTH A +327A;W # CIRCLED HANGUL PHIEUPH A +327B;W # CIRCLED HANGUL HIEUH A +327C;W # CIRCLED KOREAN CHARACTER CHAMKO +327D;W # CIRCLED KOREAN CHARACTER JUEUI +327E;W # CIRCLED HANGUL IEUNG U +327F;W # KOREAN STANDARD SYMBOL +3280;W # CIRCLED IDEOGRAPH ONE +3281;W # CIRCLED IDEOGRAPH TWO +3282;W # CIRCLED IDEOGRAPH THREE +3283;W # CIRCLED IDEOGRAPH FOUR +3284;W # CIRCLED IDEOGRAPH FIVE +3285;W # CIRCLED IDEOGRAPH SIX +3286;W # CIRCLED IDEOGRAPH SEVEN +3287;W # CIRCLED IDEOGRAPH EIGHT +3288;W # CIRCLED IDEOGRAPH NINE +3289;W # CIRCLED IDEOGRAPH TEN +328A;W # CIRCLED IDEOGRAPH MOON +328B;W # CIRCLED IDEOGRAPH FIRE +328C;W # CIRCLED IDEOGRAPH WATER +328D;W # CIRCLED IDEOGRAPH WOOD +328E;W # CIRCLED IDEOGRAPH METAL +328F;W # CIRCLED IDEOGRAPH EARTH +3290;W # CIRCLED IDEOGRAPH SUN +3291;W # CIRCLED IDEOGRAPH STOCK +3292;W # CIRCLED IDEOGRAPH HAVE +3293;W # CIRCLED IDEOGRAPH SOCIETY +3294;W # CIRCLED IDEOGRAPH NAME +3295;W # CIRCLED IDEOGRAPH SPECIAL +3296;W # CIRCLED IDEOGRAPH FINANCIAL +3297;W # CIRCLED IDEOGRAPH CONGRATULATION +3298;W # CIRCLED IDEOGRAPH LABOR +3299;W # CIRCLED IDEOGRAPH SECRET +329A;W # CIRCLED IDEOGRAPH MALE +329B;W # CIRCLED IDEOGRAPH FEMALE +329C;W # CIRCLED IDEOGRAPH SUITABLE +329D;W # CIRCLED IDEOGRAPH EXCELLENT +329E;W # CIRCLED IDEOGRAPH PRINT +329F;W # CIRCLED IDEOGRAPH ATTENTION +32A0;W # CIRCLED IDEOGRAPH ITEM +32A1;W # CIRCLED IDEOGRAPH REST +32A2;W # CIRCLED IDEOGRAPH COPY +32A3;W # CIRCLED IDEOGRAPH CORRECT +32A4;W # CIRCLED IDEOGRAPH HIGH +32A5;W # CIRCLED IDEOGRAPH CENTRE +32A6;W # CIRCLED IDEOGRAPH LOW +32A7;W # CIRCLED IDEOGRAPH LEFT +32A8;W # CIRCLED IDEOGRAPH RIGHT +32A9;W # CIRCLED IDEOGRAPH MEDICINE +32AA;W # CIRCLED IDEOGRAPH RELIGION +32AB;W # CIRCLED IDEOGRAPH STUDY +32AC;W # CIRCLED IDEOGRAPH SUPERVISE +32AD;W # CIRCLED IDEOGRAPH ENTERPRISE +32AE;W # CIRCLED IDEOGRAPH RESOURCE +32AF;W # CIRCLED IDEOGRAPH ALLIANCE +32B0;W # CIRCLED IDEOGRAPH NIGHT +32B1;W # CIRCLED NUMBER THIRTY SIX +32B2;W # CIRCLED NUMBER THIRTY SEVEN +32B3;W # CIRCLED NUMBER THIRTY EIGHT +32B4;W # CIRCLED NUMBER THIRTY NINE +32B5;W # CIRCLED NUMBER FORTY +32B6;W # CIRCLED NUMBER FORTY ONE +32B7;W # CIRCLED NUMBER FORTY TWO +32B8;W # CIRCLED NUMBER FORTY THREE +32B9;W # CIRCLED NUMBER FORTY FOUR +32BA;W # CIRCLED NUMBER FORTY FIVE +32BB;W # CIRCLED NUMBER FORTY SIX +32BC;W # CIRCLED NUMBER FORTY SEVEN +32BD;W # CIRCLED NUMBER FORTY EIGHT +32BE;W # CIRCLED NUMBER FORTY NINE +32BF;W # CIRCLED NUMBER FIFTY +32C0;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY +32C1;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY +32C2;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH +32C3;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL +32C4;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY +32C5;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE +32C6;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY +32C7;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST +32C8;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER +32C9;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER +32CA;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER +32CB;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER +32CC;W # SQUARE HG +32CD;W # SQUARE ERG +32CE;W # SQUARE EV +32CF;W # LIMITED LIABILITY SIGN +32D0;W # CIRCLED KATAKANA A +32D1;W # CIRCLED KATAKANA I +32D2;W # CIRCLED KATAKANA U +32D3;W # CIRCLED KATAKANA E +32D4;W # CIRCLED KATAKANA O +32D5;W # CIRCLED KATAKANA KA +32D6;W # CIRCLED KATAKANA KI +32D7;W # CIRCLED KATAKANA KU +32D8;W # CIRCLED KATAKANA KE +32D9;W # CIRCLED KATAKANA KO +32DA;W # CIRCLED KATAKANA SA +32DB;W # CIRCLED KATAKANA SI +32DC;W # CIRCLED KATAKANA SU +32DD;W # CIRCLED KATAKANA SE +32DE;W # CIRCLED KATAKANA SO +32DF;W # CIRCLED KATAKANA TA +32E0;W # CIRCLED KATAKANA TI +32E1;W # CIRCLED KATAKANA TU +32E2;W # CIRCLED KATAKANA TE +32E3;W # CIRCLED KATAKANA TO +32E4;W # CIRCLED KATAKANA NA +32E5;W # CIRCLED KATAKANA NI +32E6;W # CIRCLED KATAKANA NU +32E7;W # CIRCLED KATAKANA NE +32E8;W # CIRCLED KATAKANA NO +32E9;W # CIRCLED KATAKANA HA +32EA;W # CIRCLED KATAKANA HI +32EB;W # CIRCLED KATAKANA HU +32EC;W # CIRCLED KATAKANA HE +32ED;W # CIRCLED KATAKANA HO +32EE;W # CIRCLED KATAKANA MA +32EF;W # CIRCLED KATAKANA MI +32F0;W # CIRCLED KATAKANA MU +32F1;W # CIRCLED KATAKANA ME +32F2;W # CIRCLED KATAKANA MO +32F3;W # CIRCLED KATAKANA YA +32F4;W # CIRCLED KATAKANA YU +32F5;W # CIRCLED KATAKANA YO +32F6;W # CIRCLED KATAKANA RA +32F7;W # CIRCLED KATAKANA RI +32F8;W # CIRCLED KATAKANA RU +32F9;W # CIRCLED KATAKANA RE +32FA;W # CIRCLED KATAKANA RO +32FB;W # CIRCLED KATAKANA WA +32FC;W # CIRCLED KATAKANA WI +32FD;W # CIRCLED KATAKANA WE +32FE;W # CIRCLED KATAKANA WO +3300;W # SQUARE APAATO +3301;W # SQUARE ARUHUA +3302;W # SQUARE ANPEA +3303;W # SQUARE AARU +3304;W # SQUARE ININGU +3305;W # SQUARE INTI +3306;W # SQUARE UON +3307;W # SQUARE ESUKUUDO +3308;W # SQUARE EEKAA +3309;W # SQUARE ONSU +330A;W # SQUARE OOMU +330B;W # SQUARE KAIRI +330C;W # SQUARE KARATTO +330D;W # SQUARE KARORII +330E;W # SQUARE GARON +330F;W # SQUARE GANMA +3310;W # SQUARE GIGA +3311;W # SQUARE GINII +3312;W # SQUARE KYURII +3313;W # SQUARE GIRUDAA +3314;W # SQUARE KIRO +3315;W # SQUARE KIROGURAMU +3316;W # SQUARE KIROMEETORU +3317;W # SQUARE KIROWATTO +3318;W # SQUARE GURAMU +3319;W # SQUARE GURAMUTON +331A;W # SQUARE KURUZEIRO +331B;W # SQUARE KUROONE +331C;W # SQUARE KEESU +331D;W # SQUARE KORUNA +331E;W # SQUARE KOOPO +331F;W # SQUARE SAIKURU +3320;W # SQUARE SANTIIMU +3321;W # SQUARE SIRINGU +3322;W # SQUARE SENTI +3323;W # SQUARE SENTO +3324;W # SQUARE DAASU +3325;W # SQUARE DESI +3326;W # SQUARE DORU +3327;W # SQUARE TON +3328;W # SQUARE NANO +3329;W # SQUARE NOTTO +332A;W # SQUARE HAITU +332B;W # SQUARE PAASENTO +332C;W # SQUARE PAATU +332D;W # SQUARE BAARERU +332E;W # SQUARE PIASUTORU +332F;W # SQUARE PIKURU +3330;W # SQUARE PIKO +3331;W # SQUARE BIRU +3332;W # SQUARE HUARADDO +3333;W # SQUARE HUIITO +3334;W # SQUARE BUSSYERU +3335;W # SQUARE HURAN +3336;W # SQUARE HEKUTAARU +3337;W # SQUARE PESO +3338;W # SQUARE PENIHI +3339;W # SQUARE HERUTU +333A;W # SQUARE PENSU +333B;W # SQUARE PEEZI +333C;W # SQUARE BEETA +333D;W # SQUARE POINTO +333E;W # SQUARE BORUTO +333F;W # SQUARE HON +3340;W # SQUARE PONDO +3341;W # SQUARE HOORU +3342;W # SQUARE HOON +3343;W # SQUARE MAIKURO +3344;W # SQUARE MAIRU +3345;W # SQUARE MAHHA +3346;W # SQUARE MARUKU +3347;W # SQUARE MANSYON +3348;W # SQUARE MIKURON +3349;W # SQUARE MIRI +334A;W # SQUARE MIRIBAARU +334B;W # SQUARE MEGA +334C;W # SQUARE MEGATON +334D;W # SQUARE MEETORU +334E;W # SQUARE YAADO +334F;W # SQUARE YAARU +3350;W # SQUARE YUAN +3351;W # SQUARE RITTORU +3352;W # SQUARE RIRA +3353;W # SQUARE RUPII +3354;W # SQUARE RUUBURU +3355;W # SQUARE REMU +3356;W # SQUARE RENTOGEN +3357;W # SQUARE WATTO +3358;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO +3359;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE +335A;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO +335B;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE +335C;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR +335D;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE +335E;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX +335F;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN +3360;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT +3361;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE +3362;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN +3363;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN +3364;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE +3365;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN +3366;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN +3367;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN +3368;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN +3369;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN +336A;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN +336B;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN +336C;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY +336D;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE +336E;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO +336F;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE +3370;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR +3371;W # SQUARE HPA +3372;W # SQUARE DA +3373;W # SQUARE AU +3374;W # SQUARE BAR +3375;W # SQUARE OV +3376;W # SQUARE PC +3377;W # SQUARE DM +3378;W # SQUARE DM SQUARED +3379;W # SQUARE DM CUBED +337A;W # SQUARE IU +337B;W # SQUARE ERA NAME HEISEI +337C;W # SQUARE ERA NAME SYOUWA +337D;W # SQUARE ERA NAME TAISYOU +337E;W # SQUARE ERA NAME MEIZI +337F;W # SQUARE CORPORATION +3380;W # SQUARE PA AMPS +3381;W # SQUARE NA +3382;W # SQUARE MU A +3383;W # SQUARE MA +3384;W # SQUARE KA +3385;W # SQUARE KB +3386;W # SQUARE MB +3387;W # SQUARE GB +3388;W # SQUARE CAL +3389;W # SQUARE KCAL +338A;W # SQUARE PF +338B;W # SQUARE NF +338C;W # SQUARE MU F +338D;W # SQUARE MU G +338E;W # SQUARE MG +338F;W # SQUARE KG +3390;W # SQUARE HZ +3391;W # SQUARE KHZ +3392;W # SQUARE MHZ +3393;W # SQUARE GHZ +3394;W # SQUARE THZ +3395;W # SQUARE MU L +3396;W # SQUARE ML +3397;W # SQUARE DL +3398;W # SQUARE KL +3399;W # SQUARE FM +339A;W # SQUARE NM +339B;W # SQUARE MU M +339C;W # SQUARE MM +339D;W # SQUARE CM +339E;W # SQUARE KM +339F;W # SQUARE MM SQUARED +33A0;W # SQUARE CM SQUARED +33A1;W # SQUARE M SQUARED +33A2;W # SQUARE KM SQUARED +33A3;W # SQUARE MM CUBED +33A4;W # SQUARE CM CUBED +33A5;W # SQUARE M CUBED +33A6;W # SQUARE KM CUBED +33A7;W # SQUARE M OVER S +33A8;W # SQUARE M OVER S SQUARED +33A9;W # SQUARE PA +33AA;W # SQUARE KPA +33AB;W # SQUARE MPA +33AC;W # SQUARE GPA +33AD;W # SQUARE RAD +33AE;W # SQUARE RAD OVER S +33AF;W # SQUARE RAD OVER S SQUARED +33B0;W # SQUARE PS +33B1;W # SQUARE NS +33B2;W # SQUARE MU S +33B3;W # SQUARE MS +33B4;W # SQUARE PV +33B5;W # SQUARE NV +33B6;W # SQUARE MU V +33B7;W # SQUARE MV +33B8;W # SQUARE KV +33B9;W # SQUARE MV MEGA +33BA;W # SQUARE PW +33BB;W # SQUARE NW +33BC;W # SQUARE MU W +33BD;W # SQUARE MW +33BE;W # SQUARE KW +33BF;W # SQUARE MW MEGA +33C0;W # SQUARE K OHM +33C1;W # SQUARE M OHM +33C2;W # SQUARE AM +33C3;W # SQUARE BQ +33C4;W # SQUARE CC +33C5;W # SQUARE CD +33C6;W # SQUARE C OVER KG +33C7;W # SQUARE CO +33C8;W # SQUARE DB +33C9;W # SQUARE GY +33CA;W # SQUARE HA +33CB;W # SQUARE HP +33CC;W # SQUARE IN +33CD;W # SQUARE KK +33CE;W # SQUARE KM CAPITAL +33CF;W # SQUARE KT +33D0;W # SQUARE LM +33D1;W # SQUARE LN +33D2;W # SQUARE LOG +33D3;W # SQUARE LX +33D4;W # SQUARE MB SMALL +33D5;W # SQUARE MIL +33D6;W # SQUARE MOL +33D7;W # SQUARE PH +33D8;W # SQUARE PM +33D9;W # SQUARE PPM +33DA;W # SQUARE PR +33DB;W # SQUARE SR +33DC;W # SQUARE SV +33DD;W # SQUARE WB +33DE;W # SQUARE V OVER M +33DF;W # SQUARE A OVER M +33E0;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE +33E1;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO +33E2;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE +33E3;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR +33E4;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE +33E5;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX +33E6;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN +33E7;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT +33E8;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE +33E9;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN +33EA;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN +33EB;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE +33EC;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN +33ED;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN +33EE;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN +33EF;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN +33F0;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN +33F1;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN +33F2;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN +33F3;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY +33F4;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE +33F5;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO +33F6;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE +33F7;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR +33F8;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE +33F9;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX +33FA;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN +33FB;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT +33FC;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE +33FD;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY +33FE;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE +33FF;W # SQUARE GAL +3400..4DB5;W # <CJK Ideograph Extension A, First>..<CJK Ideograph Extension A, Last> +4DC0;N # HEXAGRAM FOR THE CREATIVE HEAVEN +4DC1;N # HEXAGRAM FOR THE RECEPTIVE EARTH +4DC2;N # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING +4DC3;N # HEXAGRAM FOR YOUTHFUL FOLLY +4DC4;N # HEXAGRAM FOR WAITING +4DC5;N # HEXAGRAM FOR CONFLICT +4DC6;N # HEXAGRAM FOR THE ARMY +4DC7;N # HEXAGRAM FOR HOLDING TOGETHER +4DC8;N # HEXAGRAM FOR SMALL TAMING +4DC9;N # HEXAGRAM FOR TREADING +4DCA;N # HEXAGRAM FOR PEACE +4DCB;N # HEXAGRAM FOR STANDSTILL +4DCC;N # HEXAGRAM FOR FELLOWSHIP +4DCD;N # HEXAGRAM FOR GREAT POSSESSION +4DCE;N # HEXAGRAM FOR MODESTY +4DCF;N # HEXAGRAM FOR ENTHUSIASM +4DD0;N # HEXAGRAM FOR FOLLOWING +4DD1;N # HEXAGRAM FOR WORK ON THE DECAYED +4DD2;N # HEXAGRAM FOR APPROACH +4DD3;N # HEXAGRAM FOR CONTEMPLATION +4DD4;N # HEXAGRAM FOR BITING THROUGH +4DD5;N # HEXAGRAM FOR GRACE +4DD6;N # HEXAGRAM FOR SPLITTING APART +4DD7;N # HEXAGRAM FOR RETURN +4DD8;N # HEXAGRAM FOR INNOCENCE +4DD9;N # HEXAGRAM FOR GREAT TAMING +4DDA;N # HEXAGRAM FOR MOUTH CORNERS +4DDB;N # HEXAGRAM FOR GREAT PREPONDERANCE +4DDC;N # HEXAGRAM FOR THE ABYSMAL WATER +4DDD;N # HEXAGRAM FOR THE CLINGING FIRE +4DDE;N # HEXAGRAM FOR INFLUENCE +4DDF;N # HEXAGRAM FOR DURATION +4DE0;N # HEXAGRAM FOR RETREAT +4DE1;N # HEXAGRAM FOR GREAT POWER +4DE2;N # HEXAGRAM FOR PROGRESS +4DE3;N # HEXAGRAM FOR DARKENING OF THE LIGHT +4DE4;N # HEXAGRAM FOR THE FAMILY +4DE5;N # HEXAGRAM FOR OPPOSITION +4DE6;N # HEXAGRAM FOR OBSTRUCTION +4DE7;N # HEXAGRAM FOR DELIVERANCE +4DE8;N # HEXAGRAM FOR DECREASE +4DE9;N # HEXAGRAM FOR INCREASE +4DEA;N # HEXAGRAM FOR BREAKTHROUGH +4DEB;N # HEXAGRAM FOR COMING TO MEET +4DEC;N # HEXAGRAM FOR GATHERING TOGETHER +4DED;N # HEXAGRAM FOR PUSHING UPWARD +4DEE;N # HEXAGRAM FOR OPPRESSION +4DEF;N # HEXAGRAM FOR THE WELL +4DF0;N # HEXAGRAM FOR REVOLUTION +4DF1;N # HEXAGRAM FOR THE CAULDRON +4DF2;N # HEXAGRAM FOR THE AROUSING THUNDER +4DF3;N # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN +4DF4;N # HEXAGRAM FOR DEVELOPMENT +4DF5;N # HEXAGRAM FOR THE MARRYING MAIDEN +4DF6;N # HEXAGRAM FOR ABUNDANCE +4DF7;N # HEXAGRAM FOR THE WANDERER +4DF8;N # HEXAGRAM FOR THE GENTLE WIND +4DF9;N # HEXAGRAM FOR THE JOYOUS LAKE +4DFA;N # HEXAGRAM FOR DISPERSION +4DFB;N # HEXAGRAM FOR LIMITATION +4DFC;N # HEXAGRAM FOR INNER TRUTH +4DFD;N # HEXAGRAM FOR SMALL PREPONDERANCE +4DFE;N # HEXAGRAM FOR AFTER COMPLETION +4DFF;N # HEXAGRAM FOR BEFORE COMPLETION +4E00..9FBB;W # <CJK Ideograph, First>..<CJK Ideograph, Last> +A000;W # YI SYLLABLE IT +A001;W # YI SYLLABLE IX +A002;W # YI SYLLABLE I +A003;W # YI SYLLABLE IP +A004;W # YI SYLLABLE IET +A005;W # YI SYLLABLE IEX +A006;W # YI SYLLABLE IE +A007;W # YI SYLLABLE IEP +A008;W # YI SYLLABLE AT +A009;W # YI SYLLABLE AX +A00A;W # YI SYLLABLE A +A00B;W # YI SYLLABLE AP +A00C;W # YI SYLLABLE UOX +A00D;W # YI SYLLABLE UO +A00E;W # YI SYLLABLE UOP +A00F;W # YI SYLLABLE OT +A010;W # YI SYLLABLE OX +A011;W # YI SYLLABLE O +A012;W # YI SYLLABLE OP +A013;W # YI SYLLABLE EX +A014;W # YI SYLLABLE E +A015;W # YI SYLLABLE WU +A016;W # YI SYLLABLE BIT +A017;W # YI SYLLABLE BIX +A018;W # YI SYLLABLE BI +A019;W # YI SYLLABLE BIP +A01A;W # YI SYLLABLE BIET +A01B;W # YI SYLLABLE BIEX +A01C;W # YI SYLLABLE BIE +A01D;W # YI SYLLABLE BIEP +A01E;W # YI SYLLABLE BAT +A01F;W # YI SYLLABLE BAX +A020;W # YI SYLLABLE BA +A021;W # YI SYLLABLE BAP +A022;W # YI SYLLABLE BUOX +A023;W # YI SYLLABLE BUO +A024;W # YI SYLLABLE BUOP +A025;W # YI SYLLABLE BOT +A026;W # YI SYLLABLE BOX +A027;W # YI SYLLABLE BO +A028;W # YI SYLLABLE BOP +A029;W # YI SYLLABLE BEX +A02A;W # YI SYLLABLE BE +A02B;W # YI SYLLABLE BEP +A02C;W # YI SYLLABLE BUT +A02D;W # YI SYLLABLE BUX +A02E;W # YI SYLLABLE BU +A02F;W # YI SYLLABLE BUP +A030;W # YI SYLLABLE BURX +A031;W # YI SYLLABLE BUR +A032;W # YI SYLLABLE BYT +A033;W # YI SYLLABLE BYX +A034;W # YI SYLLABLE BY +A035;W # YI SYLLABLE BYP +A036;W # YI SYLLABLE BYRX +A037;W # YI SYLLABLE BYR +A038;W # YI SYLLABLE PIT +A039;W # YI SYLLABLE PIX +A03A;W # YI SYLLABLE PI +A03B;W # YI SYLLABLE PIP +A03C;W # YI SYLLABLE PIEX +A03D;W # YI SYLLABLE PIE +A03E;W # YI SYLLABLE PIEP +A03F;W # YI SYLLABLE PAT +A040;W # YI SYLLABLE PAX +A041;W # YI SYLLABLE PA +A042;W # YI SYLLABLE PAP +A043;W # YI SYLLABLE PUOX +A044;W # YI SYLLABLE PUO +A045;W # YI SYLLABLE PUOP +A046;W # YI SYLLABLE POT +A047;W # YI SYLLABLE POX +A048;W # YI SYLLABLE PO +A049;W # YI SYLLABLE POP +A04A;W # YI SYLLABLE PUT +A04B;W # YI SYLLABLE PUX +A04C;W # YI SYLLABLE PU +A04D;W # YI SYLLABLE PUP +A04E;W # YI SYLLABLE PURX +A04F;W # YI SYLLABLE PUR +A050;W # YI SYLLABLE PYT +A051;W # YI SYLLABLE PYX +A052;W # YI SYLLABLE PY +A053;W # YI SYLLABLE PYP +A054;W # YI SYLLABLE PYRX +A055;W # YI SYLLABLE PYR +A056;W # YI SYLLABLE BBIT +A057;W # YI SYLLABLE BBIX +A058;W # YI SYLLABLE BBI +A059;W # YI SYLLABLE BBIP +A05A;W # YI SYLLABLE BBIET +A05B;W # YI SYLLABLE BBIEX +A05C;W # YI SYLLABLE BBIE +A05D;W # YI SYLLABLE BBIEP +A05E;W # YI SYLLABLE BBAT +A05F;W # YI SYLLABLE BBAX +A060;W # YI SYLLABLE BBA +A061;W # YI SYLLABLE BBAP +A062;W # YI SYLLABLE BBUOX +A063;W # YI SYLLABLE BBUO +A064;W # YI SYLLABLE BBUOP +A065;W # YI SYLLABLE BBOT +A066;W # YI SYLLABLE BBOX +A067;W # YI SYLLABLE BBO +A068;W # YI SYLLABLE BBOP +A069;W # YI SYLLABLE BBEX +A06A;W # YI SYLLABLE BBE +A06B;W # YI SYLLABLE BBEP +A06C;W # YI SYLLABLE BBUT +A06D;W # YI SYLLABLE BBUX +A06E;W # YI SYLLABLE BBU +A06F;W # YI SYLLABLE BBUP +A070;W # YI SYLLABLE BBURX +A071;W # YI SYLLABLE BBUR +A072;W # YI SYLLABLE BBYT +A073;W # YI SYLLABLE BBYX +A074;W # YI SYLLABLE BBY +A075;W # YI SYLLABLE BBYP +A076;W # YI SYLLABLE NBIT +A077;W # YI SYLLABLE NBIX +A078;W # YI SYLLABLE NBI +A079;W # YI SYLLABLE NBIP +A07A;W # YI SYLLABLE NBIEX +A07B;W # YI SYLLABLE NBIE +A07C;W # YI SYLLABLE NBIEP +A07D;W # YI SYLLABLE NBAT +A07E;W # YI SYLLABLE NBAX +A07F;W # YI SYLLABLE NBA +A080;W # YI SYLLABLE NBAP +A081;W # YI SYLLABLE NBOT +A082;W # YI SYLLABLE NBOX +A083;W # YI SYLLABLE NBO +A084;W # YI SYLLABLE NBOP +A085;W # YI SYLLABLE NBUT +A086;W # YI SYLLABLE NBUX +A087;W # YI SYLLABLE NBU +A088;W # YI SYLLABLE NBUP +A089;W # YI SYLLABLE NBURX +A08A;W # YI SYLLABLE NBUR +A08B;W # YI SYLLABLE NBYT +A08C;W # YI SYLLABLE NBYX +A08D;W # YI SYLLABLE NBY +A08E;W # YI SYLLABLE NBYP +A08F;W # YI SYLLABLE NBYRX +A090;W # YI SYLLABLE NBYR +A091;W # YI SYLLABLE HMIT +A092;W # YI SYLLABLE HMIX +A093;W # YI SYLLABLE HMI +A094;W # YI SYLLABLE HMIP +A095;W # YI SYLLABLE HMIEX +A096;W # YI SYLLABLE HMIE +A097;W # YI SYLLABLE HMIEP +A098;W # YI SYLLABLE HMAT +A099;W # YI SYLLABLE HMAX +A09A;W # YI SYLLABLE HMA +A09B;W # YI SYLLABLE HMAP +A09C;W # YI SYLLABLE HMUOX +A09D;W # YI SYLLABLE HMUO +A09E;W # YI SYLLABLE HMUOP +A09F;W # YI SYLLABLE HMOT +A0A0;W # YI SYLLABLE HMOX +A0A1;W # YI SYLLABLE HMO +A0A2;W # YI SYLLABLE HMOP +A0A3;W # YI SYLLABLE HMUT +A0A4;W # YI SYLLABLE HMUX +A0A5;W # YI SYLLABLE HMU +A0A6;W # YI SYLLABLE HMUP +A0A7;W # YI SYLLABLE HMURX +A0A8;W # YI SYLLABLE HMUR +A0A9;W # YI SYLLABLE HMYX +A0AA;W # YI SYLLABLE HMY +A0AB;W # YI SYLLABLE HMYP +A0AC;W # YI SYLLABLE HMYRX +A0AD;W # YI SYLLABLE HMYR +A0AE;W # YI SYLLABLE MIT +A0AF;W # YI SYLLABLE MIX +A0B0;W # YI SYLLABLE MI +A0B1;W # YI SYLLABLE MIP +A0B2;W # YI SYLLABLE MIEX +A0B3;W # YI SYLLABLE MIE +A0B4;W # YI SYLLABLE MIEP +A0B5;W # YI SYLLABLE MAT +A0B6;W # YI SYLLABLE MAX +A0B7;W # YI SYLLABLE MA +A0B8;W # YI SYLLABLE MAP +A0B9;W # YI SYLLABLE MUOT +A0BA;W # YI SYLLABLE MUOX +A0BB;W # YI SYLLABLE MUO +A0BC;W # YI SYLLABLE MUOP +A0BD;W # YI SYLLABLE MOT +A0BE;W # YI SYLLABLE MOX +A0BF;W # YI SYLLABLE MO +A0C0;W # YI SYLLABLE MOP +A0C1;W # YI SYLLABLE MEX +A0C2;W # YI SYLLABLE ME +A0C3;W # YI SYLLABLE MUT +A0C4;W # YI SYLLABLE MUX +A0C5;W # YI SYLLABLE MU +A0C6;W # YI SYLLABLE MUP +A0C7;W # YI SYLLABLE MURX +A0C8;W # YI SYLLABLE MUR +A0C9;W # YI SYLLABLE MYT +A0CA;W # YI SYLLABLE MYX +A0CB;W # YI SYLLABLE MY +A0CC;W # YI SYLLABLE MYP +A0CD;W # YI SYLLABLE FIT +A0CE;W # YI SYLLABLE FIX +A0CF;W # YI SYLLABLE FI +A0D0;W # YI SYLLABLE FIP +A0D1;W # YI SYLLABLE FAT +A0D2;W # YI SYLLABLE FAX +A0D3;W # YI SYLLABLE FA +A0D4;W # YI SYLLABLE FAP +A0D5;W # YI SYLLABLE FOX +A0D6;W # YI SYLLABLE FO +A0D7;W # YI SYLLABLE FOP +A0D8;W # YI SYLLABLE FUT +A0D9;W # YI SYLLABLE FUX +A0DA;W # YI SYLLABLE FU +A0DB;W # YI SYLLABLE FUP +A0DC;W # YI SYLLABLE FURX +A0DD;W # YI SYLLABLE FUR +A0DE;W # YI SYLLABLE FYT +A0DF;W # YI SYLLABLE FYX +A0E0;W # YI SYLLABLE FY +A0E1;W # YI SYLLABLE FYP +A0E2;W # YI SYLLABLE VIT +A0E3;W # YI SYLLABLE VIX +A0E4;W # YI SYLLABLE VI +A0E5;W # YI SYLLABLE VIP +A0E6;W # YI SYLLABLE VIET +A0E7;W # YI SYLLABLE VIEX +A0E8;W # YI SYLLABLE VIE +A0E9;W # YI SYLLABLE VIEP +A0EA;W # YI SYLLABLE VAT +A0EB;W # YI SYLLABLE VAX +A0EC;W # YI SYLLABLE VA +A0ED;W # YI SYLLABLE VAP +A0EE;W # YI SYLLABLE VOT +A0EF;W # YI SYLLABLE VOX +A0F0;W # YI SYLLABLE VO +A0F1;W # YI SYLLABLE VOP +A0F2;W # YI SYLLABLE VEX +A0F3;W # YI SYLLABLE VEP +A0F4;W # YI SYLLABLE VUT +A0F5;W # YI SYLLABLE VUX +A0F6;W # YI SYLLABLE VU +A0F7;W # YI SYLLABLE VUP +A0F8;W # YI SYLLABLE VURX +A0F9;W # YI SYLLABLE VUR +A0FA;W # YI SYLLABLE VYT +A0FB;W # YI SYLLABLE VYX +A0FC;W # YI SYLLABLE VY +A0FD;W # YI SYLLABLE VYP +A0FE;W # YI SYLLABLE VYRX +A0FF;W # YI SYLLABLE VYR +A100;W # YI SYLLABLE DIT +A101;W # YI SYLLABLE DIX +A102;W # YI SYLLABLE DI +A103;W # YI SYLLABLE DIP +A104;W # YI SYLLABLE DIEX +A105;W # YI SYLLABLE DIE +A106;W # YI SYLLABLE DIEP +A107;W # YI SYLLABLE DAT +A108;W # YI SYLLABLE DAX +A109;W # YI SYLLABLE DA +A10A;W # YI SYLLABLE DAP +A10B;W # YI SYLLABLE DUOX +A10C;W # YI SYLLABLE DUO +A10D;W # YI SYLLABLE DOT +A10E;W # YI SYLLABLE DOX +A10F;W # YI SYLLABLE DO +A110;W # YI SYLLABLE DOP +A111;W # YI SYLLABLE DEX +A112;W # YI SYLLABLE DE +A113;W # YI SYLLABLE DEP +A114;W # YI SYLLABLE DUT +A115;W # YI SYLLABLE DUX +A116;W # YI SYLLABLE DU +A117;W # YI SYLLABLE DUP +A118;W # YI SYLLABLE DURX +A119;W # YI SYLLABLE DUR +A11A;W # YI SYLLABLE TIT +A11B;W # YI SYLLABLE TIX +A11C;W # YI SYLLABLE TI +A11D;W # YI SYLLABLE TIP +A11E;W # YI SYLLABLE TIEX +A11F;W # YI SYLLABLE TIE +A120;W # YI SYLLABLE TIEP +A121;W # YI SYLLABLE TAT +A122;W # YI SYLLABLE TAX +A123;W # YI SYLLABLE TA +A124;W # YI SYLLABLE TAP +A125;W # YI SYLLABLE TUOT +A126;W # YI SYLLABLE TUOX +A127;W # YI SYLLABLE TUO +A128;W # YI SYLLABLE TUOP +A129;W # YI SYLLABLE TOT +A12A;W # YI SYLLABLE TOX +A12B;W # YI SYLLABLE TO +A12C;W # YI SYLLABLE TOP +A12D;W # YI SYLLABLE TEX +A12E;W # YI SYLLABLE TE +A12F;W # YI SYLLABLE TEP +A130;W # YI SYLLABLE TUT +A131;W # YI SYLLABLE TUX +A132;W # YI SYLLABLE TU +A133;W # YI SYLLABLE TUP +A134;W # YI SYLLABLE TURX +A135;W # YI SYLLABLE TUR +A136;W # YI SYLLABLE DDIT +A137;W # YI SYLLABLE DDIX +A138;W # YI SYLLABLE DDI +A139;W # YI SYLLABLE DDIP +A13A;W # YI SYLLABLE DDIEX +A13B;W # YI SYLLABLE DDIE +A13C;W # YI SYLLABLE DDIEP +A13D;W # YI SYLLABLE DDAT +A13E;W # YI SYLLABLE DDAX +A13F;W # YI SYLLABLE DDA +A140;W # YI SYLLABLE DDAP +A141;W # YI SYLLABLE DDUOX +A142;W # YI SYLLABLE DDUO +A143;W # YI SYLLABLE DDUOP +A144;W # YI SYLLABLE DDOT +A145;W # YI SYLLABLE DDOX +A146;W # YI SYLLABLE DDO +A147;W # YI SYLLABLE DDOP +A148;W # YI SYLLABLE DDEX +A149;W # YI SYLLABLE DDE +A14A;W # YI SYLLABLE DDEP +A14B;W # YI SYLLABLE DDUT +A14C;W # YI SYLLABLE DDUX +A14D;W # YI SYLLABLE DDU +A14E;W # YI SYLLABLE DDUP +A14F;W # YI SYLLABLE DDURX +A150;W # YI SYLLABLE DDUR +A151;W # YI SYLLABLE NDIT +A152;W # YI SYLLABLE NDIX +A153;W # YI SYLLABLE NDI +A154;W # YI SYLLABLE NDIP +A155;W # YI SYLLABLE NDIEX +A156;W # YI SYLLABLE NDIE +A157;W # YI SYLLABLE NDAT +A158;W # YI SYLLABLE NDAX +A159;W # YI SYLLABLE NDA +A15A;W # YI SYLLABLE NDAP +A15B;W # YI SYLLABLE NDOT +A15C;W # YI SYLLABLE NDOX +A15D;W # YI SYLLABLE NDO +A15E;W # YI SYLLABLE NDOP +A15F;W # YI SYLLABLE NDEX +A160;W # YI SYLLABLE NDE +A161;W # YI SYLLABLE NDEP +A162;W # YI SYLLABLE NDUT +A163;W # YI SYLLABLE NDUX +A164;W # YI SYLLABLE NDU +A165;W # YI SYLLABLE NDUP +A166;W # YI SYLLABLE NDURX +A167;W # YI SYLLABLE NDUR +A168;W # YI SYLLABLE HNIT +A169;W # YI SYLLABLE HNIX +A16A;W # YI SYLLABLE HNI +A16B;W # YI SYLLABLE HNIP +A16C;W # YI SYLLABLE HNIET +A16D;W # YI SYLLABLE HNIEX +A16E;W # YI SYLLABLE HNIE +A16F;W # YI SYLLABLE HNIEP +A170;W # YI SYLLABLE HNAT +A171;W # YI SYLLABLE HNAX +A172;W # YI SYLLABLE HNA +A173;W # YI SYLLABLE HNAP +A174;W # YI SYLLABLE HNUOX +A175;W # YI SYLLABLE HNUO +A176;W # YI SYLLABLE HNOT +A177;W # YI SYLLABLE HNOX +A178;W # YI SYLLABLE HNOP +A179;W # YI SYLLABLE HNEX +A17A;W # YI SYLLABLE HNE +A17B;W # YI SYLLABLE HNEP +A17C;W # YI SYLLABLE HNUT +A17D;W # YI SYLLABLE NIT +A17E;W # YI SYLLABLE NIX +A17F;W # YI SYLLABLE NI +A180;W # YI SYLLABLE NIP +A181;W # YI SYLLABLE NIEX +A182;W # YI SYLLABLE NIE +A183;W # YI SYLLABLE NIEP +A184;W # YI SYLLABLE NAX +A185;W # YI SYLLABLE NA +A186;W # YI SYLLABLE NAP +A187;W # YI SYLLABLE NUOX +A188;W # YI SYLLABLE NUO +A189;W # YI SYLLABLE NUOP +A18A;W # YI SYLLABLE NOT +A18B;W # YI SYLLABLE NOX +A18C;W # YI SYLLABLE NO +A18D;W # YI SYLLABLE NOP +A18E;W # YI SYLLABLE NEX +A18F;W # YI SYLLABLE NE +A190;W # YI SYLLABLE NEP +A191;W # YI SYLLABLE NUT +A192;W # YI SYLLABLE NUX +A193;W # YI SYLLABLE NU +A194;W # YI SYLLABLE NUP +A195;W # YI SYLLABLE NURX +A196;W # YI SYLLABLE NUR +A197;W # YI SYLLABLE HLIT +A198;W # YI SYLLABLE HLIX +A199;W # YI SYLLABLE HLI +A19A;W # YI SYLLABLE HLIP +A19B;W # YI SYLLABLE HLIEX +A19C;W # YI SYLLABLE HLIE +A19D;W # YI SYLLABLE HLIEP +A19E;W # YI SYLLABLE HLAT +A19F;W # YI SYLLABLE HLAX +A1A0;W # YI SYLLABLE HLA +A1A1;W # YI SYLLABLE HLAP +A1A2;W # YI SYLLABLE HLUOX +A1A3;W # YI SYLLABLE HLUO +A1A4;W # YI SYLLABLE HLUOP +A1A5;W # YI SYLLABLE HLOX +A1A6;W # YI SYLLABLE HLO +A1A7;W # YI SYLLABLE HLOP +A1A8;W # YI SYLLABLE HLEX +A1A9;W # YI SYLLABLE HLE +A1AA;W # YI SYLLABLE HLEP +A1AB;W # YI SYLLABLE HLUT +A1AC;W # YI SYLLABLE HLUX +A1AD;W # YI SYLLABLE HLU +A1AE;W # YI SYLLABLE HLUP +A1AF;W # YI SYLLABLE HLURX +A1B0;W # YI SYLLABLE HLUR +A1B1;W # YI SYLLABLE HLYT +A1B2;W # YI SYLLABLE HLYX +A1B3;W # YI SYLLABLE HLY +A1B4;W # YI SYLLABLE HLYP +A1B5;W # YI SYLLABLE HLYRX +A1B6;W # YI SYLLABLE HLYR +A1B7;W # YI SYLLABLE LIT +A1B8;W # YI SYLLABLE LIX +A1B9;W # YI SYLLABLE LI +A1BA;W # YI SYLLABLE LIP +A1BB;W # YI SYLLABLE LIET +A1BC;W # YI SYLLABLE LIEX +A1BD;W # YI SYLLABLE LIE +A1BE;W # YI SYLLABLE LIEP +A1BF;W # YI SYLLABLE LAT +A1C0;W # YI SYLLABLE LAX +A1C1;W # YI SYLLABLE LA +A1C2;W # YI SYLLABLE LAP +A1C3;W # YI SYLLABLE LUOT +A1C4;W # YI SYLLABLE LUOX +A1C5;W # YI SYLLABLE LUO +A1C6;W # YI SYLLABLE LUOP +A1C7;W # YI SYLLABLE LOT +A1C8;W # YI SYLLABLE LOX +A1C9;W # YI SYLLABLE LO +A1CA;W # YI SYLLABLE LOP +A1CB;W # YI SYLLABLE LEX +A1CC;W # YI SYLLABLE LE +A1CD;W # YI SYLLABLE LEP +A1CE;W # YI SYLLABLE LUT +A1CF;W # YI SYLLABLE LUX +A1D0;W # YI SYLLABLE LU +A1D1;W # YI SYLLABLE LUP +A1D2;W # YI SYLLABLE LURX +A1D3;W # YI SYLLABLE LUR +A1D4;W # YI SYLLABLE LYT +A1D5;W # YI SYLLABLE LYX +A1D6;W # YI SYLLABLE LY +A1D7;W # YI SYLLABLE LYP +A1D8;W # YI SYLLABLE LYRX +A1D9;W # YI SYLLABLE LYR +A1DA;W # YI SYLLABLE GIT +A1DB;W # YI SYLLABLE GIX +A1DC;W # YI SYLLABLE GI +A1DD;W # YI SYLLABLE GIP +A1DE;W # YI SYLLABLE GIET +A1DF;W # YI SYLLABLE GIEX +A1E0;W # YI SYLLABLE GIE +A1E1;W # YI SYLLABLE GIEP +A1E2;W # YI SYLLABLE GAT +A1E3;W # YI SYLLABLE GAX +A1E4;W # YI SYLLABLE GA +A1E5;W # YI SYLLABLE GAP +A1E6;W # YI SYLLABLE GUOT +A1E7;W # YI SYLLABLE GUOX +A1E8;W # YI SYLLABLE GUO +A1E9;W # YI SYLLABLE GUOP +A1EA;W # YI SYLLABLE GOT +A1EB;W # YI SYLLABLE GOX +A1EC;W # YI SYLLABLE GO +A1ED;W # YI SYLLABLE GOP +A1EE;W # YI SYLLABLE GET +A1EF;W # YI SYLLABLE GEX +A1F0;W # YI SYLLABLE GE +A1F1;W # YI SYLLABLE GEP +A1F2;W # YI SYLLABLE GUT +A1F3;W # YI SYLLABLE GUX +A1F4;W # YI SYLLABLE GU +A1F5;W # YI SYLLABLE GUP +A1F6;W # YI SYLLABLE GURX +A1F7;W # YI SYLLABLE GUR +A1F8;W # YI SYLLABLE KIT +A1F9;W # YI SYLLABLE KIX +A1FA;W # YI SYLLABLE KI +A1FB;W # YI SYLLABLE KIP +A1FC;W # YI SYLLABLE KIEX +A1FD;W # YI SYLLABLE KIE +A1FE;W # YI SYLLABLE KIEP +A1FF;W # YI SYLLABLE KAT +A200;W # YI SYLLABLE KAX +A201;W # YI SYLLABLE KA +A202;W # YI SYLLABLE KAP +A203;W # YI SYLLABLE KUOX +A204;W # YI SYLLABLE KUO +A205;W # YI SYLLABLE KUOP +A206;W # YI SYLLABLE KOT +A207;W # YI SYLLABLE KOX +A208;W # YI SYLLABLE KO +A209;W # YI SYLLABLE KOP +A20A;W # YI SYLLABLE KET +A20B;W # YI SYLLABLE KEX +A20C;W # YI SYLLABLE KE +A20D;W # YI SYLLABLE KEP +A20E;W # YI SYLLABLE KUT +A20F;W # YI SYLLABLE KUX +A210;W # YI SYLLABLE KU +A211;W # YI SYLLABLE KUP +A212;W # YI SYLLABLE KURX +A213;W # YI SYLLABLE KUR +A214;W # YI SYLLABLE GGIT +A215;W # YI SYLLABLE GGIX +A216;W # YI SYLLABLE GGI +A217;W # YI SYLLABLE GGIEX +A218;W # YI SYLLABLE GGIE +A219;W # YI SYLLABLE GGIEP +A21A;W # YI SYLLABLE GGAT +A21B;W # YI SYLLABLE GGAX +A21C;W # YI SYLLABLE GGA +A21D;W # YI SYLLABLE GGAP +A21E;W # YI SYLLABLE GGUOT +A21F;W # YI SYLLABLE GGUOX +A220;W # YI SYLLABLE GGUO +A221;W # YI SYLLABLE GGUOP +A222;W # YI SYLLABLE GGOT +A223;W # YI SYLLABLE GGOX +A224;W # YI SYLLABLE GGO +A225;W # YI SYLLABLE GGOP +A226;W # YI SYLLABLE GGET +A227;W # YI SYLLABLE GGEX +A228;W # YI SYLLABLE GGE +A229;W # YI SYLLABLE GGEP +A22A;W # YI SYLLABLE GGUT +A22B;W # YI SYLLABLE GGUX +A22C;W # YI SYLLABLE GGU +A22D;W # YI SYLLABLE GGUP +A22E;W # YI SYLLABLE GGURX +A22F;W # YI SYLLABLE GGUR +A230;W # YI SYLLABLE MGIEX +A231;W # YI SYLLABLE MGIE +A232;W # YI SYLLABLE MGAT +A233;W # YI SYLLABLE MGAX +A234;W # YI SYLLABLE MGA +A235;W # YI SYLLABLE MGAP +A236;W # YI SYLLABLE MGUOX +A237;W # YI SYLLABLE MGUO +A238;W # YI SYLLABLE MGUOP +A239;W # YI SYLLABLE MGOT +A23A;W # YI SYLLABLE MGOX +A23B;W # YI SYLLABLE MGO +A23C;W # YI SYLLABLE MGOP +A23D;W # YI SYLLABLE MGEX +A23E;W # YI SYLLABLE MGE +A23F;W # YI SYLLABLE MGEP +A240;W # YI SYLLABLE MGUT +A241;W # YI SYLLABLE MGUX +A242;W # YI SYLLABLE MGU +A243;W # YI SYLLABLE MGUP +A244;W # YI SYLLABLE MGURX +A245;W # YI SYLLABLE MGUR +A246;W # YI SYLLABLE HXIT +A247;W # YI SYLLABLE HXIX +A248;W # YI SYLLABLE HXI +A249;W # YI SYLLABLE HXIP +A24A;W # YI SYLLABLE HXIET +A24B;W # YI SYLLABLE HXIEX +A24C;W # YI SYLLABLE HXIE +A24D;W # YI SYLLABLE HXIEP +A24E;W # YI SYLLABLE HXAT +A24F;W # YI SYLLABLE HXAX +A250;W # YI SYLLABLE HXA +A251;W # YI SYLLABLE HXAP +A252;W # YI SYLLABLE HXUOT +A253;W # YI SYLLABLE HXUOX +A254;W # YI SYLLABLE HXUO +A255;W # YI SYLLABLE HXUOP +A256;W # YI SYLLABLE HXOT +A257;W # YI SYLLABLE HXOX +A258;W # YI SYLLABLE HXO +A259;W # YI SYLLABLE HXOP +A25A;W # YI SYLLABLE HXEX +A25B;W # YI SYLLABLE HXE +A25C;W # YI SYLLABLE HXEP +A25D;W # YI SYLLABLE NGIEX +A25E;W # YI SYLLABLE NGIE +A25F;W # YI SYLLABLE NGIEP +A260;W # YI SYLLABLE NGAT +A261;W # YI SYLLABLE NGAX +A262;W # YI SYLLABLE NGA +A263;W # YI SYLLABLE NGAP +A264;W # YI SYLLABLE NGUOT +A265;W # YI SYLLABLE NGUOX +A266;W # YI SYLLABLE NGUO +A267;W # YI SYLLABLE NGOT +A268;W # YI SYLLABLE NGOX +A269;W # YI SYLLABLE NGO +A26A;W # YI SYLLABLE NGOP +A26B;W # YI SYLLABLE NGEX +A26C;W # YI SYLLABLE NGE +A26D;W # YI SYLLABLE NGEP +A26E;W # YI SYLLABLE HIT +A26F;W # YI SYLLABLE HIEX +A270;W # YI SYLLABLE HIE +A271;W # YI SYLLABLE HAT +A272;W # YI SYLLABLE HAX +A273;W # YI SYLLABLE HA +A274;W # YI SYLLABLE HAP +A275;W # YI SYLLABLE HUOT +A276;W # YI SYLLABLE HUOX +A277;W # YI SYLLABLE HUO +A278;W # YI SYLLABLE HUOP +A279;W # YI SYLLABLE HOT +A27A;W # YI SYLLABLE HOX +A27B;W # YI SYLLABLE HO +A27C;W # YI SYLLABLE HOP +A27D;W # YI SYLLABLE HEX +A27E;W # YI SYLLABLE HE +A27F;W # YI SYLLABLE HEP +A280;W # YI SYLLABLE WAT +A281;W # YI SYLLABLE WAX +A282;W # YI SYLLABLE WA +A283;W # YI SYLLABLE WAP +A284;W # YI SYLLABLE WUOX +A285;W # YI SYLLABLE WUO +A286;W # YI SYLLABLE WUOP +A287;W # YI SYLLABLE WOX +A288;W # YI SYLLABLE WO +A289;W # YI SYLLABLE WOP +A28A;W # YI SYLLABLE WEX +A28B;W # YI SYLLABLE WE +A28C;W # YI SYLLABLE WEP +A28D;W # YI SYLLABLE ZIT +A28E;W # YI SYLLABLE ZIX +A28F;W # YI SYLLABLE ZI +A290;W # YI SYLLABLE ZIP +A291;W # YI SYLLABLE ZIEX +A292;W # YI SYLLABLE ZIE +A293;W # YI SYLLABLE ZIEP +A294;W # YI SYLLABLE ZAT +A295;W # YI SYLLABLE ZAX +A296;W # YI SYLLABLE ZA +A297;W # YI SYLLABLE ZAP +A298;W # YI SYLLABLE ZUOX +A299;W # YI SYLLABLE ZUO +A29A;W # YI SYLLABLE ZUOP +A29B;W # YI SYLLABLE ZOT +A29C;W # YI SYLLABLE ZOX +A29D;W # YI SYLLABLE ZO +A29E;W # YI SYLLABLE ZOP +A29F;W # YI SYLLABLE ZEX +A2A0;W # YI SYLLABLE ZE +A2A1;W # YI SYLLABLE ZEP +A2A2;W # YI SYLLABLE ZUT +A2A3;W # YI SYLLABLE ZUX +A2A4;W # YI SYLLABLE ZU +A2A5;W # YI SYLLABLE ZUP +A2A6;W # YI SYLLABLE ZURX +A2A7;W # YI SYLLABLE ZUR +A2A8;W # YI SYLLABLE ZYT +A2A9;W # YI SYLLABLE ZYX +A2AA;W # YI SYLLABLE ZY +A2AB;W # YI SYLLABLE ZYP +A2AC;W # YI SYLLABLE ZYRX +A2AD;W # YI SYLLABLE ZYR +A2AE;W # YI SYLLABLE CIT +A2AF;W # YI SYLLABLE CIX +A2B0;W # YI SYLLABLE CI +A2B1;W # YI SYLLABLE CIP +A2B2;W # YI SYLLABLE CIET +A2B3;W # YI SYLLABLE CIEX +A2B4;W # YI SYLLABLE CIE +A2B5;W # YI SYLLABLE CIEP +A2B6;W # YI SYLLABLE CAT +A2B7;W # YI SYLLABLE CAX +A2B8;W # YI SYLLABLE CA +A2B9;W # YI SYLLABLE CAP +A2BA;W # YI SYLLABLE CUOX +A2BB;W # YI SYLLABLE CUO +A2BC;W # YI SYLLABLE CUOP +A2BD;W # YI SYLLABLE COT +A2BE;W # YI SYLLABLE COX +A2BF;W # YI SYLLABLE CO +A2C0;W # YI SYLLABLE COP +A2C1;W # YI SYLLABLE CEX +A2C2;W # YI SYLLABLE CE +A2C3;W # YI SYLLABLE CEP +A2C4;W # YI SYLLABLE CUT +A2C5;W # YI SYLLABLE CUX +A2C6;W # YI SYLLABLE CU +A2C7;W # YI SYLLABLE CUP +A2C8;W # YI SYLLABLE CURX +A2C9;W # YI SYLLABLE CUR +A2CA;W # YI SYLLABLE CYT +A2CB;W # YI SYLLABLE CYX +A2CC;W # YI SYLLABLE CY +A2CD;W # YI SYLLABLE CYP +A2CE;W # YI SYLLABLE CYRX +A2CF;W # YI SYLLABLE CYR +A2D0;W # YI SYLLABLE ZZIT +A2D1;W # YI SYLLABLE ZZIX +A2D2;W # YI SYLLABLE ZZI +A2D3;W # YI SYLLABLE ZZIP +A2D4;W # YI SYLLABLE ZZIET +A2D5;W # YI SYLLABLE ZZIEX +A2D6;W # YI SYLLABLE ZZIE +A2D7;W # YI SYLLABLE ZZIEP +A2D8;W # YI SYLLABLE ZZAT +A2D9;W # YI SYLLABLE ZZAX +A2DA;W # YI SYLLABLE ZZA +A2DB;W # YI SYLLABLE ZZAP +A2DC;W # YI SYLLABLE ZZOX +A2DD;W # YI SYLLABLE ZZO +A2DE;W # YI SYLLABLE ZZOP +A2DF;W # YI SYLLABLE ZZEX +A2E0;W # YI SYLLABLE ZZE +A2E1;W # YI SYLLABLE ZZEP +A2E2;W # YI SYLLABLE ZZUX +A2E3;W # YI SYLLABLE ZZU +A2E4;W # YI SYLLABLE ZZUP +A2E5;W # YI SYLLABLE ZZURX +A2E6;W # YI SYLLABLE ZZUR +A2E7;W # YI SYLLABLE ZZYT +A2E8;W # YI SYLLABLE ZZYX +A2E9;W # YI SYLLABLE ZZY +A2EA;W # YI SYLLABLE ZZYP +A2EB;W # YI SYLLABLE ZZYRX +A2EC;W # YI SYLLABLE ZZYR +A2ED;W # YI SYLLABLE NZIT +A2EE;W # YI SYLLABLE NZIX +A2EF;W # YI SYLLABLE NZI +A2F0;W # YI SYLLABLE NZIP +A2F1;W # YI SYLLABLE NZIEX +A2F2;W # YI SYLLABLE NZIE +A2F3;W # YI SYLLABLE NZIEP +A2F4;W # YI SYLLABLE NZAT +A2F5;W # YI SYLLABLE NZAX +A2F6;W # YI SYLLABLE NZA +A2F7;W # YI SYLLABLE NZAP +A2F8;W # YI SYLLABLE NZUOX +A2F9;W # YI SYLLABLE NZUO +A2FA;W # YI SYLLABLE NZOX +A2FB;W # YI SYLLABLE NZOP +A2FC;W # YI SYLLABLE NZEX +A2FD;W # YI SYLLABLE NZE +A2FE;W # YI SYLLABLE NZUX +A2FF;W # YI SYLLABLE NZU +A300;W # YI SYLLABLE NZUP +A301;W # YI SYLLABLE NZURX +A302;W # YI SYLLABLE NZUR +A303;W # YI SYLLABLE NZYT +A304;W # YI SYLLABLE NZYX +A305;W # YI SYLLABLE NZY +A306;W # YI SYLLABLE NZYP +A307;W # YI SYLLABLE NZYRX +A308;W # YI SYLLABLE NZYR +A309;W # YI SYLLABLE SIT +A30A;W # YI SYLLABLE SIX +A30B;W # YI SYLLABLE SI +A30C;W # YI SYLLABLE SIP +A30D;W # YI SYLLABLE SIEX +A30E;W # YI SYLLABLE SIE +A30F;W # YI SYLLABLE SIEP +A310;W # YI SYLLABLE SAT +A311;W # YI SYLLABLE SAX +A312;W # YI SYLLABLE SA +A313;W # YI SYLLABLE SAP +A314;W # YI SYLLABLE SUOX +A315;W # YI SYLLABLE SUO +A316;W # YI SYLLABLE SUOP +A317;W # YI SYLLABLE SOT +A318;W # YI SYLLABLE SOX +A319;W # YI SYLLABLE SO +A31A;W # YI SYLLABLE SOP +A31B;W # YI SYLLABLE SEX +A31C;W # YI SYLLABLE SE +A31D;W # YI SYLLABLE SEP +A31E;W # YI SYLLABLE SUT +A31F;W # YI SYLLABLE SUX +A320;W # YI SYLLABLE SU +A321;W # YI SYLLABLE SUP +A322;W # YI SYLLABLE SURX +A323;W # YI SYLLABLE SUR +A324;W # YI SYLLABLE SYT +A325;W # YI SYLLABLE SYX +A326;W # YI SYLLABLE SY +A327;W # YI SYLLABLE SYP +A328;W # YI SYLLABLE SYRX +A329;W # YI SYLLABLE SYR +A32A;W # YI SYLLABLE SSIT +A32B;W # YI SYLLABLE SSIX +A32C;W # YI SYLLABLE SSI +A32D;W # YI SYLLABLE SSIP +A32E;W # YI SYLLABLE SSIEX +A32F;W # YI SYLLABLE SSIE +A330;W # YI SYLLABLE SSIEP +A331;W # YI SYLLABLE SSAT +A332;W # YI SYLLABLE SSAX +A333;W # YI SYLLABLE SSA +A334;W # YI SYLLABLE SSAP +A335;W # YI SYLLABLE SSOT +A336;W # YI SYLLABLE SSOX +A337;W # YI SYLLABLE SSO +A338;W # YI SYLLABLE SSOP +A339;W # YI SYLLABLE SSEX +A33A;W # YI SYLLABLE SSE +A33B;W # YI SYLLABLE SSEP +A33C;W # YI SYLLABLE SSUT +A33D;W # YI SYLLABLE SSUX +A33E;W # YI SYLLABLE SSU +A33F;W # YI SYLLABLE SSUP +A340;W # YI SYLLABLE SSYT +A341;W # YI SYLLABLE SSYX +A342;W # YI SYLLABLE SSY +A343;W # YI SYLLABLE SSYP +A344;W # YI SYLLABLE SSYRX +A345;W # YI SYLLABLE SSYR +A346;W # YI SYLLABLE ZHAT +A347;W # YI SYLLABLE ZHAX +A348;W # YI SYLLABLE ZHA +A349;W # YI SYLLABLE ZHAP +A34A;W # YI SYLLABLE ZHUOX +A34B;W # YI SYLLABLE ZHUO +A34C;W # YI SYLLABLE ZHUOP +A34D;W # YI SYLLABLE ZHOT +A34E;W # YI SYLLABLE ZHOX +A34F;W # YI SYLLABLE ZHO +A350;W # YI SYLLABLE ZHOP +A351;W # YI SYLLABLE ZHET +A352;W # YI SYLLABLE ZHEX +A353;W # YI SYLLABLE ZHE +A354;W # YI SYLLABLE ZHEP +A355;W # YI SYLLABLE ZHUT +A356;W # YI SYLLABLE ZHUX +A357;W # YI SYLLABLE ZHU +A358;W # YI SYLLABLE ZHUP +A359;W # YI SYLLABLE ZHURX +A35A;W # YI SYLLABLE ZHUR +A35B;W # YI SYLLABLE ZHYT +A35C;W # YI SYLLABLE ZHYX +A35D;W # YI SYLLABLE ZHY +A35E;W # YI SYLLABLE ZHYP +A35F;W # YI SYLLABLE ZHYRX +A360;W # YI SYLLABLE ZHYR +A361;W # YI SYLLABLE CHAT +A362;W # YI SYLLABLE CHAX +A363;W # YI SYLLABLE CHA +A364;W # YI SYLLABLE CHAP +A365;W # YI SYLLABLE CHUOT +A366;W # YI SYLLABLE CHUOX +A367;W # YI SYLLABLE CHUO +A368;W # YI SYLLABLE CHUOP +A369;W # YI SYLLABLE CHOT +A36A;W # YI SYLLABLE CHOX +A36B;W # YI SYLLABLE CHO +A36C;W # YI SYLLABLE CHOP +A36D;W # YI SYLLABLE CHET +A36E;W # YI SYLLABLE CHEX +A36F;W # YI SYLLABLE CHE +A370;W # YI SYLLABLE CHEP +A371;W # YI SYLLABLE CHUX +A372;W # YI SYLLABLE CHU +A373;W # YI SYLLABLE CHUP +A374;W # YI SYLLABLE CHURX +A375;W # YI SYLLABLE CHUR +A376;W # YI SYLLABLE CHYT +A377;W # YI SYLLABLE CHYX +A378;W # YI SYLLABLE CHY +A379;W # YI SYLLABLE CHYP +A37A;W # YI SYLLABLE CHYRX +A37B;W # YI SYLLABLE CHYR +A37C;W # YI SYLLABLE RRAX +A37D;W # YI SYLLABLE RRA +A37E;W # YI SYLLABLE RRUOX +A37F;W # YI SYLLABLE RRUO +A380;W # YI SYLLABLE RROT +A381;W # YI SYLLABLE RROX +A382;W # YI SYLLABLE RRO +A383;W # YI SYLLABLE RROP +A384;W # YI SYLLABLE RRET +A385;W # YI SYLLABLE RREX +A386;W # YI SYLLABLE RRE +A387;W # YI SYLLABLE RREP +A388;W # YI SYLLABLE RRUT +A389;W # YI SYLLABLE RRUX +A38A;W # YI SYLLABLE RRU +A38B;W # YI SYLLABLE RRUP +A38C;W # YI SYLLABLE RRURX +A38D;W # YI SYLLABLE RRUR +A38E;W # YI SYLLABLE RRYT +A38F;W # YI SYLLABLE RRYX +A390;W # YI SYLLABLE RRY +A391;W # YI SYLLABLE RRYP +A392;W # YI SYLLABLE RRYRX +A393;W # YI SYLLABLE RRYR +A394;W # YI SYLLABLE NRAT +A395;W # YI SYLLABLE NRAX +A396;W # YI SYLLABLE NRA +A397;W # YI SYLLABLE NRAP +A398;W # YI SYLLABLE NROX +A399;W # YI SYLLABLE NRO +A39A;W # YI SYLLABLE NROP +A39B;W # YI SYLLABLE NRET +A39C;W # YI SYLLABLE NREX +A39D;W # YI SYLLABLE NRE +A39E;W # YI SYLLABLE NREP +A39F;W # YI SYLLABLE NRUT +A3A0;W # YI SYLLABLE NRUX +A3A1;W # YI SYLLABLE NRU +A3A2;W # YI SYLLABLE NRUP +A3A3;W # YI SYLLABLE NRURX +A3A4;W # YI SYLLABLE NRUR +A3A5;W # YI SYLLABLE NRYT +A3A6;W # YI SYLLABLE NRYX +A3A7;W # YI SYLLABLE NRY +A3A8;W # YI SYLLABLE NRYP +A3A9;W # YI SYLLABLE NRYRX +A3AA;W # YI SYLLABLE NRYR +A3AB;W # YI SYLLABLE SHAT +A3AC;W # YI SYLLABLE SHAX +A3AD;W # YI SYLLABLE SHA +A3AE;W # YI SYLLABLE SHAP +A3AF;W # YI SYLLABLE SHUOX +A3B0;W # YI SYLLABLE SHUO +A3B1;W # YI SYLLABLE SHUOP +A3B2;W # YI SYLLABLE SHOT +A3B3;W # YI SYLLABLE SHOX +A3B4;W # YI SYLLABLE SHO +A3B5;W # YI SYLLABLE SHOP +A3B6;W # YI SYLLABLE SHET +A3B7;W # YI SYLLABLE SHEX +A3B8;W # YI SYLLABLE SHE +A3B9;W # YI SYLLABLE SHEP +A3BA;W # YI SYLLABLE SHUT +A3BB;W # YI SYLLABLE SHUX +A3BC;W # YI SYLLABLE SHU +A3BD;W # YI SYLLABLE SHUP +A3BE;W # YI SYLLABLE SHURX +A3BF;W # YI SYLLABLE SHUR +A3C0;W # YI SYLLABLE SHYT +A3C1;W # YI SYLLABLE SHYX +A3C2;W # YI SYLLABLE SHY +A3C3;W # YI SYLLABLE SHYP +A3C4;W # YI SYLLABLE SHYRX +A3C5;W # YI SYLLABLE SHYR +A3C6;W # YI SYLLABLE RAT +A3C7;W # YI SYLLABLE RAX +A3C8;W # YI SYLLABLE RA +A3C9;W # YI SYLLABLE RAP +A3CA;W # YI SYLLABLE RUOX +A3CB;W # YI SYLLABLE RUO +A3CC;W # YI SYLLABLE RUOP +A3CD;W # YI SYLLABLE ROT +A3CE;W # YI SYLLABLE ROX +A3CF;W # YI SYLLABLE RO +A3D0;W # YI SYLLABLE ROP +A3D1;W # YI SYLLABLE REX +A3D2;W # YI SYLLABLE RE +A3D3;W # YI SYLLABLE REP +A3D4;W # YI SYLLABLE RUT +A3D5;W # YI SYLLABLE RUX +A3D6;W # YI SYLLABLE RU +A3D7;W # YI SYLLABLE RUP +A3D8;W # YI SYLLABLE RURX +A3D9;W # YI SYLLABLE RUR +A3DA;W # YI SYLLABLE RYT +A3DB;W # YI SYLLABLE RYX +A3DC;W # YI SYLLABLE RY +A3DD;W # YI SYLLABLE RYP +A3DE;W # YI SYLLABLE RYRX +A3DF;W # YI SYLLABLE RYR +A3E0;W # YI SYLLABLE JIT +A3E1;W # YI SYLLABLE JIX +A3E2;W # YI SYLLABLE JI +A3E3;W # YI SYLLABLE JIP +A3E4;W # YI SYLLABLE JIET +A3E5;W # YI SYLLABLE JIEX +A3E6;W # YI SYLLABLE JIE +A3E7;W # YI SYLLABLE JIEP +A3E8;W # YI SYLLABLE JUOT +A3E9;W # YI SYLLABLE JUOX +A3EA;W # YI SYLLABLE JUO +A3EB;W # YI SYLLABLE JUOP +A3EC;W # YI SYLLABLE JOT +A3ED;W # YI SYLLABLE JOX +A3EE;W # YI SYLLABLE JO +A3EF;W # YI SYLLABLE JOP +A3F0;W # YI SYLLABLE JUT +A3F1;W # YI SYLLABLE JUX +A3F2;W # YI SYLLABLE JU +A3F3;W # YI SYLLABLE JUP +A3F4;W # YI SYLLABLE JURX +A3F5;W # YI SYLLABLE JUR +A3F6;W # YI SYLLABLE JYT +A3F7;W # YI SYLLABLE JYX +A3F8;W # YI SYLLABLE JY +A3F9;W # YI SYLLABLE JYP +A3FA;W # YI SYLLABLE JYRX +A3FB;W # YI SYLLABLE JYR +A3FC;W # YI SYLLABLE QIT +A3FD;W # YI SYLLABLE QIX +A3FE;W # YI SYLLABLE QI +A3FF;W # YI SYLLABLE QIP +A400;W # YI SYLLABLE QIET +A401;W # YI SYLLABLE QIEX +A402;W # YI SYLLABLE QIE +A403;W # YI SYLLABLE QIEP +A404;W # YI SYLLABLE QUOT +A405;W # YI SYLLABLE QUOX +A406;W # YI SYLLABLE QUO +A407;W # YI SYLLABLE QUOP +A408;W # YI SYLLABLE QOT +A409;W # YI SYLLABLE QOX +A40A;W # YI SYLLABLE QO +A40B;W # YI SYLLABLE QOP +A40C;W # YI SYLLABLE QUT +A40D;W # YI SYLLABLE QUX +A40E;W # YI SYLLABLE QU +A40F;W # YI SYLLABLE QUP +A410;W # YI SYLLABLE QURX +A411;W # YI SYLLABLE QUR +A412;W # YI SYLLABLE QYT +A413;W # YI SYLLABLE QYX +A414;W # YI SYLLABLE QY +A415;W # YI SYLLABLE QYP +A416;W # YI SYLLABLE QYRX +A417;W # YI SYLLABLE QYR +A418;W # YI SYLLABLE JJIT +A419;W # YI SYLLABLE JJIX +A41A;W # YI SYLLABLE JJI +A41B;W # YI SYLLABLE JJIP +A41C;W # YI SYLLABLE JJIET +A41D;W # YI SYLLABLE JJIEX +A41E;W # YI SYLLABLE JJIE +A41F;W # YI SYLLABLE JJIEP +A420;W # YI SYLLABLE JJUOX +A421;W # YI SYLLABLE JJUO +A422;W # YI SYLLABLE JJUOP +A423;W # YI SYLLABLE JJOT +A424;W # YI SYLLABLE JJOX +A425;W # YI SYLLABLE JJO +A426;W # YI SYLLABLE JJOP +A427;W # YI SYLLABLE JJUT +A428;W # YI SYLLABLE JJUX +A429;W # YI SYLLABLE JJU +A42A;W # YI SYLLABLE JJUP +A42B;W # YI SYLLABLE JJURX +A42C;W # YI SYLLABLE JJUR +A42D;W # YI SYLLABLE JJYT +A42E;W # YI SYLLABLE JJYX +A42F;W # YI SYLLABLE JJY +A430;W # YI SYLLABLE JJYP +A431;W # YI SYLLABLE NJIT +A432;W # YI SYLLABLE NJIX +A433;W # YI SYLLABLE NJI +A434;W # YI SYLLABLE NJIP +A435;W # YI SYLLABLE NJIET +A436;W # YI SYLLABLE NJIEX +A437;W # YI SYLLABLE NJIE +A438;W # YI SYLLABLE NJIEP +A439;W # YI SYLLABLE NJUOX +A43A;W # YI SYLLABLE NJUO +A43B;W # YI SYLLABLE NJOT +A43C;W # YI SYLLABLE NJOX +A43D;W # YI SYLLABLE NJO +A43E;W # YI SYLLABLE NJOP +A43F;W # YI SYLLABLE NJUX +A440;W # YI SYLLABLE NJU +A441;W # YI SYLLABLE NJUP +A442;W # YI SYLLABLE NJURX +A443;W # YI SYLLABLE NJUR +A444;W # YI SYLLABLE NJYT +A445;W # YI SYLLABLE NJYX +A446;W # YI SYLLABLE NJY +A447;W # YI SYLLABLE NJYP +A448;W # YI SYLLABLE NJYRX +A449;W # YI SYLLABLE NJYR +A44A;W # YI SYLLABLE NYIT +A44B;W # YI SYLLABLE NYIX +A44C;W # YI SYLLABLE NYI +A44D;W # YI SYLLABLE NYIP +A44E;W # YI SYLLABLE NYIET +A44F;W # YI SYLLABLE NYIEX +A450;W # YI SYLLABLE NYIE +A451;W # YI SYLLABLE NYIEP +A452;W # YI SYLLABLE NYUOX +A453;W # YI SYLLABLE NYUO +A454;W # YI SYLLABLE NYUOP +A455;W # YI SYLLABLE NYOT +A456;W # YI SYLLABLE NYOX +A457;W # YI SYLLABLE NYO +A458;W # YI SYLLABLE NYOP +A459;W # YI SYLLABLE NYUT +A45A;W # YI SYLLABLE NYUX +A45B;W # YI SYLLABLE NYU +A45C;W # YI SYLLABLE NYUP +A45D;W # YI SYLLABLE XIT +A45E;W # YI SYLLABLE XIX +A45F;W # YI SYLLABLE XI +A460;W # YI SYLLABLE XIP +A461;W # YI SYLLABLE XIET +A462;W # YI SYLLABLE XIEX +A463;W # YI SYLLABLE XIE +A464;W # YI SYLLABLE XIEP +A465;W # YI SYLLABLE XUOX +A466;W # YI SYLLABLE XUO +A467;W # YI SYLLABLE XOT +A468;W # YI SYLLABLE XOX +A469;W # YI SYLLABLE XO +A46A;W # YI SYLLABLE XOP +A46B;W # YI SYLLABLE XYT +A46C;W # YI SYLLABLE XYX +A46D;W # YI SYLLABLE XY +A46E;W # YI SYLLABLE XYP +A46F;W # YI SYLLABLE XYRX +A470;W # YI SYLLABLE XYR +A471;W # YI SYLLABLE YIT +A472;W # YI SYLLABLE YIX +A473;W # YI SYLLABLE YI +A474;W # YI SYLLABLE YIP +A475;W # YI SYLLABLE YIET +A476;W # YI SYLLABLE YIEX +A477;W # YI SYLLABLE YIE +A478;W # YI SYLLABLE YIEP +A479;W # YI SYLLABLE YUOT +A47A;W # YI SYLLABLE YUOX +A47B;W # YI SYLLABLE YUO +A47C;W # YI SYLLABLE YUOP +A47D;W # YI SYLLABLE YOT +A47E;W # YI SYLLABLE YOX +A47F;W # YI SYLLABLE YO +A480;W # YI SYLLABLE YOP +A481;W # YI SYLLABLE YUT +A482;W # YI SYLLABLE YUX +A483;W # YI SYLLABLE YU +A484;W # YI SYLLABLE YUP +A485;W # YI SYLLABLE YURX +A486;W # YI SYLLABLE YUR +A487;W # YI SYLLABLE YYT +A488;W # YI SYLLABLE YYX +A489;W # YI SYLLABLE YY +A48A;W # YI SYLLABLE YYP +A48B;W # YI SYLLABLE YYRX +A48C;W # YI SYLLABLE YYR +A490;W # YI RADICAL QOT +A491;W # YI RADICAL LI +A492;W # YI RADICAL KIT +A493;W # YI RADICAL NYIP +A494;W # YI RADICAL CYP +A495;W # YI RADICAL SSI +A496;W # YI RADICAL GGOP +A497;W # YI RADICAL GEP +A498;W # YI RADICAL MI +A499;W # YI RADICAL HXIT +A49A;W # YI RADICAL LYR +A49B;W # YI RADICAL BBUT +A49C;W # YI RADICAL MOP +A49D;W # YI RADICAL YO +A49E;W # YI RADICAL PUT +A49F;W # YI RADICAL HXUO +A4A0;W # YI RADICAL TAT +A4A1;W # YI RADICAL GA +A4A2;W # YI RADICAL ZUP +A4A3;W # YI RADICAL CYT +A4A4;W # YI RADICAL DDUR +A4A5;W # YI RADICAL BUR +A4A6;W # YI RADICAL GGUO +A4A7;W # YI RADICAL NYOP +A4A8;W # YI RADICAL TU +A4A9;W # YI RADICAL OP +A4AA;W # YI RADICAL JJUT +A4AB;W # YI RADICAL ZOT +A4AC;W # YI RADICAL PYT +A4AD;W # YI RADICAL HMO +A4AE;W # YI RADICAL YIT +A4AF;W # YI RADICAL VUR +A4B0;W # YI RADICAL SHY +A4B1;W # YI RADICAL VEP +A4B2;W # YI RADICAL ZA +A4B3;W # YI RADICAL JO +A4B4;W # YI RADICAL NZUP +A4B5;W # YI RADICAL JJY +A4B6;W # YI RADICAL GOT +A4B7;W # YI RADICAL JJIE +A4B8;W # YI RADICAL WO +A4B9;W # YI RADICAL DU +A4BA;W # YI RADICAL SHUR +A4BB;W # YI RADICAL LIE +A4BC;W # YI RADICAL CY +A4BD;W # YI RADICAL CUOP +A4BE;W # YI RADICAL CIP +A4BF;W # YI RADICAL HXOP +A4C0;W # YI RADICAL SHAT +A4C1;W # YI RADICAL ZUR +A4C2;W # YI RADICAL SHOP +A4C3;W # YI RADICAL CHE +A4C4;W # YI RADICAL ZZIET +A4C5;W # YI RADICAL NBIE +A4C6;W # YI RADICAL KE +A700;N # MODIFIER LETTER CHINESE TONE YIN PING +A701;N # MODIFIER LETTER CHINESE TONE YANG PING +A702;N # MODIFIER LETTER CHINESE TONE YIN SHANG +A703;N # MODIFIER LETTER CHINESE TONE YANG SHANG +A704;N # MODIFIER LETTER CHINESE TONE YIN QU +A705;N # MODIFIER LETTER CHINESE TONE YANG QU +A706;N # MODIFIER LETTER CHINESE TONE YIN RU +A707;N # MODIFIER LETTER CHINESE TONE YANG RU +A708;N # MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR +A709;N # MODIFIER LETTER HIGH DOTTED TONE BAR +A70A;N # MODIFIER LETTER MID DOTTED TONE BAR +A70B;N # MODIFIER LETTER LOW DOTTED TONE BAR +A70C;N # MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR +A70D;N # MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR +A70E;N # MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR +A70F;N # MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR +A710;N # MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR +A711;N # MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR +A712;N # MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR +A713;N # MODIFIER LETTER HIGH LEFT-STEM TONE BAR +A714;N # MODIFIER LETTER MID LEFT-STEM TONE BAR +A715;N # MODIFIER LETTER LOW LEFT-STEM TONE BAR +A716;N # MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A800;N # SYLOTI NAGRI LETTER A +A801;N # SYLOTI NAGRI LETTER I +A802;N # SYLOTI NAGRI SIGN DVISVARA +A803;N # SYLOTI NAGRI LETTER U +A804;N # SYLOTI NAGRI LETTER E +A805;N # SYLOTI NAGRI LETTER O +A806;N # SYLOTI NAGRI SIGN HASANTA +A807;N # SYLOTI NAGRI LETTER KO +A808;N # SYLOTI NAGRI LETTER KHO +A809;N # SYLOTI NAGRI LETTER GO +A80A;N # SYLOTI NAGRI LETTER GHO +A80B;N # SYLOTI NAGRI SIGN ANUSVARA +A80C;N # SYLOTI NAGRI LETTER CO +A80D;N # SYLOTI NAGRI LETTER CHO +A80E;N # SYLOTI NAGRI LETTER JO +A80F;N # SYLOTI NAGRI LETTER JHO +A810;N # SYLOTI NAGRI LETTER TTO +A811;N # SYLOTI NAGRI LETTER TTHO +A812;N # SYLOTI NAGRI LETTER DDO +A813;N # SYLOTI NAGRI LETTER DDHO +A814;N # SYLOTI NAGRI LETTER TO +A815;N # SYLOTI NAGRI LETTER THO +A816;N # SYLOTI NAGRI LETTER DO +A817;N # SYLOTI NAGRI LETTER DHO +A818;N # SYLOTI NAGRI LETTER NO +A819;N # SYLOTI NAGRI LETTER PO +A81A;N # SYLOTI NAGRI LETTER PHO +A81B;N # SYLOTI NAGRI LETTER BO +A81C;N # SYLOTI NAGRI LETTER BHO +A81D;N # SYLOTI NAGRI LETTER MO +A81E;N # SYLOTI NAGRI LETTER RO +A81F;N # SYLOTI NAGRI LETTER LO +A820;N # SYLOTI NAGRI LETTER RRO +A821;N # SYLOTI NAGRI LETTER SO +A822;N # SYLOTI NAGRI LETTER HO +A823;N # SYLOTI NAGRI VOWEL SIGN A +A824;N # SYLOTI NAGRI VOWEL SIGN I +A825;N # SYLOTI NAGRI VOWEL SIGN U +A826;N # SYLOTI NAGRI VOWEL SIGN E +A827;N # SYLOTI NAGRI VOWEL SIGN OO +A828;N # SYLOTI NAGRI POETRY MARK-1 +A829;N # SYLOTI NAGRI POETRY MARK-2 +A82A;N # SYLOTI NAGRI POETRY MARK-3 +A82B;N # SYLOTI NAGRI POETRY MARK-4 +AC00..D7A3;W # <Hangul Syllable, First>..<Hangul Syllable, Last> +D800..DB7F;N # <Non Private Use High Surrogate, First>..<Non Private Use High Surrogate, Last> +DB80..DBFF;N # <Private Use High Surrogate, First>..<Private Use High Surrogate, Last> +DC00..DFFF;N # <Low Surrogate, First>..<Low Surrogate, Last> +E000..F8FF;A # <Private Use, First>..<Private Use, Last> +F900;W # CJK COMPATIBILITY IDEOGRAPH-F900 +F901;W # CJK COMPATIBILITY IDEOGRAPH-F901 +F902;W # CJK COMPATIBILITY IDEOGRAPH-F902 +F903;W # CJK COMPATIBILITY IDEOGRAPH-F903 +F904;W # CJK COMPATIBILITY IDEOGRAPH-F904 +F905;W # CJK COMPATIBILITY IDEOGRAPH-F905 +F906;W # CJK COMPATIBILITY IDEOGRAPH-F906 +F907;W # CJK COMPATIBILITY IDEOGRAPH-F907 +F908;W # CJK COMPATIBILITY IDEOGRAPH-F908 +F909;W # CJK COMPATIBILITY IDEOGRAPH-F909 +F90A;W # CJK COMPATIBILITY IDEOGRAPH-F90A +F90B;W # CJK COMPATIBILITY IDEOGRAPH-F90B +F90C;W # CJK COMPATIBILITY IDEOGRAPH-F90C +F90D;W # CJK COMPATIBILITY IDEOGRAPH-F90D +F90E;W # CJK COMPATIBILITY IDEOGRAPH-F90E +F90F;W # CJK COMPATIBILITY IDEOGRAPH-F90F +F910;W # CJK COMPATIBILITY IDEOGRAPH-F910 +F911;W # CJK COMPATIBILITY IDEOGRAPH-F911 +F912;W # CJK COMPATIBILITY IDEOGRAPH-F912 +F913;W # CJK COMPATIBILITY IDEOGRAPH-F913 +F914;W # CJK COMPATIBILITY IDEOGRAPH-F914 +F915;W # CJK COMPATIBILITY IDEOGRAPH-F915 +F916;W # CJK COMPATIBILITY IDEOGRAPH-F916 +F917;W # CJK COMPATIBILITY IDEOGRAPH-F917 +F918;W # CJK COMPATIBILITY IDEOGRAPH-F918 +F919;W # CJK COMPATIBILITY IDEOGRAPH-F919 +F91A;W # CJK COMPATIBILITY IDEOGRAPH-F91A +F91B;W # CJK COMPATIBILITY IDEOGRAPH-F91B +F91C;W # CJK COMPATIBILITY IDEOGRAPH-F91C +F91D;W # CJK COMPATIBILITY IDEOGRAPH-F91D +F91E;W # CJK COMPATIBILITY IDEOGRAPH-F91E +F91F;W # CJK COMPATIBILITY IDEOGRAPH-F91F +F920;W # CJK COMPATIBILITY IDEOGRAPH-F920 +F921;W # CJK COMPATIBILITY IDEOGRAPH-F921 +F922;W # CJK COMPATIBILITY IDEOGRAPH-F922 +F923;W # CJK COMPATIBILITY IDEOGRAPH-F923 +F924;W # CJK COMPATIBILITY IDEOGRAPH-F924 +F925;W # CJK COMPATIBILITY IDEOGRAPH-F925 +F926;W # CJK COMPATIBILITY IDEOGRAPH-F926 +F927;W # CJK COMPATIBILITY IDEOGRAPH-F927 +F928;W # CJK COMPATIBILITY IDEOGRAPH-F928 +F929;W # CJK COMPATIBILITY IDEOGRAPH-F929 +F92A;W # CJK COMPATIBILITY IDEOGRAPH-F92A +F92B;W # CJK COMPATIBILITY IDEOGRAPH-F92B +F92C;W # CJK COMPATIBILITY IDEOGRAPH-F92C +F92D;W # CJK COMPATIBILITY IDEOGRAPH-F92D +F92E;W # CJK COMPATIBILITY IDEOGRAPH-F92E +F92F;W # CJK COMPATIBILITY IDEOGRAPH-F92F +F930;W # CJK COMPATIBILITY IDEOGRAPH-F930 +F931;W # CJK COMPATIBILITY IDEOGRAPH-F931 +F932;W # CJK COMPATIBILITY IDEOGRAPH-F932 +F933;W # CJK COMPATIBILITY IDEOGRAPH-F933 +F934;W # CJK COMPATIBILITY IDEOGRAPH-F934 +F935;W # CJK COMPATIBILITY IDEOGRAPH-F935 +F936;W # CJK COMPATIBILITY IDEOGRAPH-F936 +F937;W # CJK COMPATIBILITY IDEOGRAPH-F937 +F938;W # CJK COMPATIBILITY IDEOGRAPH-F938 +F939;W # CJK COMPATIBILITY IDEOGRAPH-F939 +F93A;W # CJK COMPATIBILITY IDEOGRAPH-F93A +F93B;W # CJK COMPATIBILITY IDEOGRAPH-F93B +F93C;W # CJK COMPATIBILITY IDEOGRAPH-F93C +F93D;W # CJK COMPATIBILITY IDEOGRAPH-F93D +F93E;W # CJK COMPATIBILITY IDEOGRAPH-F93E +F93F;W # CJK COMPATIBILITY IDEOGRAPH-F93F +F940;W # CJK COMPATIBILITY IDEOGRAPH-F940 +F941;W # CJK COMPATIBILITY IDEOGRAPH-F941 +F942;W # CJK COMPATIBILITY IDEOGRAPH-F942 +F943;W # CJK COMPATIBILITY IDEOGRAPH-F943 +F944;W # CJK COMPATIBILITY IDEOGRAPH-F944 +F945;W # CJK COMPATIBILITY IDEOGRAPH-F945 +F946;W # CJK COMPATIBILITY IDEOGRAPH-F946 +F947;W # CJK COMPATIBILITY IDEOGRAPH-F947 +F948;W # CJK COMPATIBILITY IDEOGRAPH-F948 +F949;W # CJK COMPATIBILITY IDEOGRAPH-F949 +F94A;W # CJK COMPATIBILITY IDEOGRAPH-F94A +F94B;W # CJK COMPATIBILITY IDEOGRAPH-F94B +F94C;W # CJK COMPATIBILITY IDEOGRAPH-F94C +F94D;W # CJK COMPATIBILITY IDEOGRAPH-F94D +F94E;W # CJK COMPATIBILITY IDEOGRAPH-F94E +F94F;W # CJK COMPATIBILITY IDEOGRAPH-F94F +F950;W # CJK COMPATIBILITY IDEOGRAPH-F950 +F951;W # CJK COMPATIBILITY IDEOGRAPH-F951 +F952;W # CJK COMPATIBILITY IDEOGRAPH-F952 +F953;W # CJK COMPATIBILITY IDEOGRAPH-F953 +F954;W # CJK COMPATIBILITY IDEOGRAPH-F954 +F955;W # CJK COMPATIBILITY IDEOGRAPH-F955 +F956;W # CJK COMPATIBILITY IDEOGRAPH-F956 +F957;W # CJK COMPATIBILITY IDEOGRAPH-F957 +F958;W # CJK COMPATIBILITY IDEOGRAPH-F958 +F959;W # CJK COMPATIBILITY IDEOGRAPH-F959 +F95A;W # CJK COMPATIBILITY IDEOGRAPH-F95A +F95B;W # CJK COMPATIBILITY IDEOGRAPH-F95B +F95C;W # CJK COMPATIBILITY IDEOGRAPH-F95C +F95D;W # CJK COMPATIBILITY IDEOGRAPH-F95D +F95E;W # CJK COMPATIBILITY IDEOGRAPH-F95E +F95F;W # CJK COMPATIBILITY IDEOGRAPH-F95F +F960;W # CJK COMPATIBILITY IDEOGRAPH-F960 +F961;W # CJK COMPATIBILITY IDEOGRAPH-F961 +F962;W # CJK COMPATIBILITY IDEOGRAPH-F962 +F963;W # CJK COMPATIBILITY IDEOGRAPH-F963 +F964;W # CJK COMPATIBILITY IDEOGRAPH-F964 +F965;W # CJK COMPATIBILITY IDEOGRAPH-F965 +F966;W # CJK COMPATIBILITY IDEOGRAPH-F966 +F967;W # CJK COMPATIBILITY IDEOGRAPH-F967 +F968;W # CJK COMPATIBILITY IDEOGRAPH-F968 +F969;W # CJK COMPATIBILITY IDEOGRAPH-F969 +F96A;W # CJK COMPATIBILITY IDEOGRAPH-F96A +F96B;W # CJK COMPATIBILITY IDEOGRAPH-F96B +F96C;W # CJK COMPATIBILITY IDEOGRAPH-F96C +F96D;W # CJK COMPATIBILITY IDEOGRAPH-F96D +F96E;W # CJK COMPATIBILITY IDEOGRAPH-F96E +F96F;W # CJK COMPATIBILITY IDEOGRAPH-F96F +F970;W # CJK COMPATIBILITY IDEOGRAPH-F970 +F971;W # CJK COMPATIBILITY IDEOGRAPH-F971 +F972;W # CJK COMPATIBILITY IDEOGRAPH-F972 +F973;W # CJK COMPATIBILITY IDEOGRAPH-F973 +F974;W # CJK COMPATIBILITY IDEOGRAPH-F974 +F975;W # CJK COMPATIBILITY IDEOGRAPH-F975 +F976;W # CJK COMPATIBILITY IDEOGRAPH-F976 +F977;W # CJK COMPATIBILITY IDEOGRAPH-F977 +F978;W # CJK COMPATIBILITY IDEOGRAPH-F978 +F979;W # CJK COMPATIBILITY IDEOGRAPH-F979 +F97A;W # CJK COMPATIBILITY IDEOGRAPH-F97A +F97B;W # CJK COMPATIBILITY IDEOGRAPH-F97B +F97C;W # CJK COMPATIBILITY IDEOGRAPH-F97C +F97D;W # CJK COMPATIBILITY IDEOGRAPH-F97D +F97E;W # CJK COMPATIBILITY IDEOGRAPH-F97E +F97F;W # CJK COMPATIBILITY IDEOGRAPH-F97F +F980;W # CJK COMPATIBILITY IDEOGRAPH-F980 +F981;W # CJK COMPATIBILITY IDEOGRAPH-F981 +F982;W # CJK COMPATIBILITY IDEOGRAPH-F982 +F983;W # CJK COMPATIBILITY IDEOGRAPH-F983 +F984;W # CJK COMPATIBILITY IDEOGRAPH-F984 +F985;W # CJK COMPATIBILITY IDEOGRAPH-F985 +F986;W # CJK COMPATIBILITY IDEOGRAPH-F986 +F987;W # CJK COMPATIBILITY IDEOGRAPH-F987 +F988;W # CJK COMPATIBILITY IDEOGRAPH-F988 +F989;W # CJK COMPATIBILITY IDEOGRAPH-F989 +F98A;W # CJK COMPATIBILITY IDEOGRAPH-F98A +F98B;W # CJK COMPATIBILITY IDEOGRAPH-F98B +F98C;W # CJK COMPATIBILITY IDEOGRAPH-F98C +F98D;W # CJK COMPATIBILITY IDEOGRAPH-F98D +F98E;W # CJK COMPATIBILITY IDEOGRAPH-F98E +F98F;W # CJK COMPATIBILITY IDEOGRAPH-F98F +F990;W # CJK COMPATIBILITY IDEOGRAPH-F990 +F991;W # CJK COMPATIBILITY IDEOGRAPH-F991 +F992;W # CJK COMPATIBILITY IDEOGRAPH-F992 +F993;W # CJK COMPATIBILITY IDEOGRAPH-F993 +F994;W # CJK COMPATIBILITY IDEOGRAPH-F994 +F995;W # CJK COMPATIBILITY IDEOGRAPH-F995 +F996;W # CJK COMPATIBILITY IDEOGRAPH-F996 +F997;W # CJK COMPATIBILITY IDEOGRAPH-F997 +F998;W # CJK COMPATIBILITY IDEOGRAPH-F998 +F999;W # CJK COMPATIBILITY IDEOGRAPH-F999 +F99A;W # CJK COMPATIBILITY IDEOGRAPH-F99A +F99B;W # CJK COMPATIBILITY IDEOGRAPH-F99B +F99C;W # CJK COMPATIBILITY IDEOGRAPH-F99C +F99D;W # CJK COMPATIBILITY IDEOGRAPH-F99D +F99E;W # CJK COMPATIBILITY IDEOGRAPH-F99E +F99F;W # CJK COMPATIBILITY IDEOGRAPH-F99F +F9A0;W # CJK COMPATIBILITY IDEOGRAPH-F9A0 +F9A1;W # CJK COMPATIBILITY IDEOGRAPH-F9A1 +F9A2;W # CJK COMPATIBILITY IDEOGRAPH-F9A2 +F9A3;W # CJK COMPATIBILITY IDEOGRAPH-F9A3 +F9A4;W # CJK COMPATIBILITY IDEOGRAPH-F9A4 +F9A5;W # CJK COMPATIBILITY IDEOGRAPH-F9A5 +F9A6;W # CJK COMPATIBILITY IDEOGRAPH-F9A6 +F9A7;W # CJK COMPATIBILITY IDEOGRAPH-F9A7 +F9A8;W # CJK COMPATIBILITY IDEOGRAPH-F9A8 +F9A9;W # CJK COMPATIBILITY IDEOGRAPH-F9A9 +F9AA;W # CJK COMPATIBILITY IDEOGRAPH-F9AA +F9AB;W # CJK COMPATIBILITY IDEOGRAPH-F9AB +F9AC;W # CJK COMPATIBILITY IDEOGRAPH-F9AC +F9AD;W # CJK COMPATIBILITY IDEOGRAPH-F9AD +F9AE;W # CJK COMPATIBILITY IDEOGRAPH-F9AE +F9AF;W # CJK COMPATIBILITY IDEOGRAPH-F9AF +F9B0;W # CJK COMPATIBILITY IDEOGRAPH-F9B0 +F9B1;W # CJK COMPATIBILITY IDEOGRAPH-F9B1 +F9B2;W # CJK COMPATIBILITY IDEOGRAPH-F9B2 +F9B3;W # CJK COMPATIBILITY IDEOGRAPH-F9B3 +F9B4;W # CJK COMPATIBILITY IDEOGRAPH-F9B4 +F9B5;W # CJK COMPATIBILITY IDEOGRAPH-F9B5 +F9B6;W # CJK COMPATIBILITY IDEOGRAPH-F9B6 +F9B7;W # CJK COMPATIBILITY IDEOGRAPH-F9B7 +F9B8;W # CJK COMPATIBILITY IDEOGRAPH-F9B8 +F9B9;W # CJK COMPATIBILITY IDEOGRAPH-F9B9 +F9BA;W # CJK COMPATIBILITY IDEOGRAPH-F9BA +F9BB;W # CJK COMPATIBILITY IDEOGRAPH-F9BB +F9BC;W # CJK COMPATIBILITY IDEOGRAPH-F9BC +F9BD;W # CJK COMPATIBILITY IDEOGRAPH-F9BD +F9BE;W # CJK COMPATIBILITY IDEOGRAPH-F9BE +F9BF;W # CJK COMPATIBILITY IDEOGRAPH-F9BF +F9C0;W # CJK COMPATIBILITY IDEOGRAPH-F9C0 +F9C1;W # CJK COMPATIBILITY IDEOGRAPH-F9C1 +F9C2;W # CJK COMPATIBILITY IDEOGRAPH-F9C2 +F9C3;W # CJK COMPATIBILITY IDEOGRAPH-F9C3 +F9C4;W # CJK COMPATIBILITY IDEOGRAPH-F9C4 +F9C5;W # CJK COMPATIBILITY IDEOGRAPH-F9C5 +F9C6;W # CJK COMPATIBILITY IDEOGRAPH-F9C6 +F9C7;W # CJK COMPATIBILITY IDEOGRAPH-F9C7 +F9C8;W # CJK COMPATIBILITY IDEOGRAPH-F9C8 +F9C9;W # CJK COMPATIBILITY IDEOGRAPH-F9C9 +F9CA;W # CJK COMPATIBILITY IDEOGRAPH-F9CA +F9CB;W # CJK COMPATIBILITY IDEOGRAPH-F9CB +F9CC;W # CJK COMPATIBILITY IDEOGRAPH-F9CC +F9CD;W # CJK COMPATIBILITY IDEOGRAPH-F9CD +F9CE;W # CJK COMPATIBILITY IDEOGRAPH-F9CE +F9CF;W # CJK COMPATIBILITY IDEOGRAPH-F9CF +F9D0;W # CJK COMPATIBILITY IDEOGRAPH-F9D0 +F9D1;W # CJK COMPATIBILITY IDEOGRAPH-F9D1 +F9D2;W # CJK COMPATIBILITY IDEOGRAPH-F9D2 +F9D3;W # CJK COMPATIBILITY IDEOGRAPH-F9D3 +F9D4;W # CJK COMPATIBILITY IDEOGRAPH-F9D4 +F9D5;W # CJK COMPATIBILITY IDEOGRAPH-F9D5 +F9D6;W # CJK COMPATIBILITY IDEOGRAPH-F9D6 +F9D7;W # CJK COMPATIBILITY IDEOGRAPH-F9D7 +F9D8;W # CJK COMPATIBILITY IDEOGRAPH-F9D8 +F9D9;W # CJK COMPATIBILITY IDEOGRAPH-F9D9 +F9DA;W # CJK COMPATIBILITY IDEOGRAPH-F9DA +F9DB;W # CJK COMPATIBILITY IDEOGRAPH-F9DB +F9DC;W # CJK COMPATIBILITY IDEOGRAPH-F9DC +F9DD;W # CJK COMPATIBILITY IDEOGRAPH-F9DD +F9DE;W # CJK COMPATIBILITY IDEOGRAPH-F9DE +F9DF;W # CJK COMPATIBILITY IDEOGRAPH-F9DF +F9E0;W # CJK COMPATIBILITY IDEOGRAPH-F9E0 +F9E1;W # CJK COMPATIBILITY IDEOGRAPH-F9E1 +F9E2;W # CJK COMPATIBILITY IDEOGRAPH-F9E2 +F9E3;W # CJK COMPATIBILITY IDEOGRAPH-F9E3 +F9E4;W # CJK COMPATIBILITY IDEOGRAPH-F9E4 +F9E5;W # CJK COMPATIBILITY IDEOGRAPH-F9E5 +F9E6;W # CJK COMPATIBILITY IDEOGRAPH-F9E6 +F9E7;W # CJK COMPATIBILITY IDEOGRAPH-F9E7 +F9E8;W # CJK COMPATIBILITY IDEOGRAPH-F9E8 +F9E9;W # CJK COMPATIBILITY IDEOGRAPH-F9E9 +F9EA;W # CJK COMPATIBILITY IDEOGRAPH-F9EA +F9EB;W # CJK COMPATIBILITY IDEOGRAPH-F9EB +F9EC;W # CJK COMPATIBILITY IDEOGRAPH-F9EC +F9ED;W # CJK COMPATIBILITY IDEOGRAPH-F9ED +F9EE;W # CJK COMPATIBILITY IDEOGRAPH-F9EE +F9EF;W # CJK COMPATIBILITY IDEOGRAPH-F9EF +F9F0;W # CJK COMPATIBILITY IDEOGRAPH-F9F0 +F9F1;W # CJK COMPATIBILITY IDEOGRAPH-F9F1 +F9F2;W # CJK COMPATIBILITY IDEOGRAPH-F9F2 +F9F3;W # CJK COMPATIBILITY IDEOGRAPH-F9F3 +F9F4;W # CJK COMPATIBILITY IDEOGRAPH-F9F4 +F9F5;W # CJK COMPATIBILITY IDEOGRAPH-F9F5 +F9F6;W # CJK COMPATIBILITY IDEOGRAPH-F9F6 +F9F7;W # CJK COMPATIBILITY IDEOGRAPH-F9F7 +F9F8;W # CJK COMPATIBILITY IDEOGRAPH-F9F8 +F9F9;W # CJK COMPATIBILITY IDEOGRAPH-F9F9 +F9FA;W # CJK COMPATIBILITY IDEOGRAPH-F9FA +F9FB;W # CJK COMPATIBILITY IDEOGRAPH-F9FB +F9FC;W # CJK COMPATIBILITY IDEOGRAPH-F9FC +F9FD;W # CJK COMPATIBILITY IDEOGRAPH-F9FD +F9FE;W # CJK COMPATIBILITY IDEOGRAPH-F9FE +F9FF;W # CJK COMPATIBILITY IDEOGRAPH-F9FF +FA00;W # CJK COMPATIBILITY IDEOGRAPH-FA00 +FA01;W # CJK COMPATIBILITY IDEOGRAPH-FA01 +FA02;W # CJK COMPATIBILITY IDEOGRAPH-FA02 +FA03;W # CJK COMPATIBILITY IDEOGRAPH-FA03 +FA04;W # CJK COMPATIBILITY IDEOGRAPH-FA04 +FA05;W # CJK COMPATIBILITY IDEOGRAPH-FA05 +FA06;W # CJK COMPATIBILITY IDEOGRAPH-FA06 +FA07;W # CJK COMPATIBILITY IDEOGRAPH-FA07 +FA08;W # CJK COMPATIBILITY IDEOGRAPH-FA08 +FA09;W # CJK COMPATIBILITY IDEOGRAPH-FA09 +FA0A;W # CJK COMPATIBILITY IDEOGRAPH-FA0A +FA0B;W # CJK COMPATIBILITY IDEOGRAPH-FA0B +FA0C;W # CJK COMPATIBILITY IDEOGRAPH-FA0C +FA0D;W # CJK COMPATIBILITY IDEOGRAPH-FA0D +FA0E;W # CJK COMPATIBILITY IDEOGRAPH-FA0E +FA0F;W # CJK COMPATIBILITY IDEOGRAPH-FA0F +FA10;W # CJK COMPATIBILITY IDEOGRAPH-FA10 +FA11;W # CJK COMPATIBILITY IDEOGRAPH-FA11 +FA12;W # CJK COMPATIBILITY IDEOGRAPH-FA12 +FA13;W # CJK COMPATIBILITY IDEOGRAPH-FA13 +FA14;W # CJK COMPATIBILITY IDEOGRAPH-FA14 +FA15;W # CJK COMPATIBILITY IDEOGRAPH-FA15 +FA16;W # CJK COMPATIBILITY IDEOGRAPH-FA16 +FA17;W # CJK COMPATIBILITY IDEOGRAPH-FA17 +FA18;W # CJK COMPATIBILITY IDEOGRAPH-FA18 +FA19;W # CJK COMPATIBILITY IDEOGRAPH-FA19 +FA1A;W # CJK COMPATIBILITY IDEOGRAPH-FA1A +FA1B;W # CJK COMPATIBILITY IDEOGRAPH-FA1B +FA1C;W # CJK COMPATIBILITY IDEOGRAPH-FA1C +FA1D;W # CJK COMPATIBILITY IDEOGRAPH-FA1D +FA1E;W # CJK COMPATIBILITY IDEOGRAPH-FA1E +FA1F;W # CJK COMPATIBILITY IDEOGRAPH-FA1F +FA20;W # CJK COMPATIBILITY IDEOGRAPH-FA20 +FA21;W # CJK COMPATIBILITY IDEOGRAPH-FA21 +FA22;W # CJK COMPATIBILITY IDEOGRAPH-FA22 +FA23;W # CJK COMPATIBILITY IDEOGRAPH-FA23 +FA24;W # CJK COMPATIBILITY IDEOGRAPH-FA24 +FA25;W # CJK COMPATIBILITY IDEOGRAPH-FA25 +FA26;W # CJK COMPATIBILITY IDEOGRAPH-FA26 +FA27;W # CJK COMPATIBILITY IDEOGRAPH-FA27 +FA28;W # CJK COMPATIBILITY IDEOGRAPH-FA28 +FA29;W # CJK COMPATIBILITY IDEOGRAPH-FA29 +FA2A;W # CJK COMPATIBILITY IDEOGRAPH-FA2A +FA2B;W # CJK COMPATIBILITY IDEOGRAPH-FA2B +FA2C;W # CJK COMPATIBILITY IDEOGRAPH-FA2C +FA2D;W # CJK COMPATIBILITY IDEOGRAPH-FA2D +FA30;W # CJK COMPATIBILITY IDEOGRAPH-FA30 +FA31;W # CJK COMPATIBILITY IDEOGRAPH-FA31 +FA32;W # CJK COMPATIBILITY IDEOGRAPH-FA32 +FA33;W # CJK COMPATIBILITY IDEOGRAPH-FA33 +FA34;W # CJK COMPATIBILITY IDEOGRAPH-FA34 +FA35;W # CJK COMPATIBILITY IDEOGRAPH-FA35 +FA36;W # CJK COMPATIBILITY IDEOGRAPH-FA36 +FA37;W # CJK COMPATIBILITY IDEOGRAPH-FA37 +FA38;W # CJK COMPATIBILITY IDEOGRAPH-FA38 +FA39;W # CJK COMPATIBILITY IDEOGRAPH-FA39 +FA3A;W # CJK COMPATIBILITY IDEOGRAPH-FA3A +FA3B;W # CJK COMPATIBILITY IDEOGRAPH-FA3B +FA3C;W # CJK COMPATIBILITY IDEOGRAPH-FA3C +FA3D;W # CJK COMPATIBILITY IDEOGRAPH-FA3D +FA3E;W # CJK COMPATIBILITY IDEOGRAPH-FA3E +FA3F;W # CJK COMPATIBILITY IDEOGRAPH-FA3F +FA40;W # CJK COMPATIBILITY IDEOGRAPH-FA40 +FA41;W # CJK COMPATIBILITY IDEOGRAPH-FA41 +FA42;W # CJK COMPATIBILITY IDEOGRAPH-FA42 +FA43;W # CJK COMPATIBILITY IDEOGRAPH-FA43 +FA44;W # CJK COMPATIBILITY IDEOGRAPH-FA44 +FA45;W # CJK COMPATIBILITY IDEOGRAPH-FA45 +FA46;W # CJK COMPATIBILITY IDEOGRAPH-FA46 +FA47;W # CJK COMPATIBILITY IDEOGRAPH-FA47 +FA48;W # CJK COMPATIBILITY IDEOGRAPH-FA48 +FA49;W # CJK COMPATIBILITY IDEOGRAPH-FA49 +FA4A;W # CJK COMPATIBILITY IDEOGRAPH-FA4A +FA4B;W # CJK COMPATIBILITY IDEOGRAPH-FA4B +FA4C;W # CJK COMPATIBILITY IDEOGRAPH-FA4C +FA4D;W # CJK COMPATIBILITY IDEOGRAPH-FA4D +FA4E;W # CJK COMPATIBILITY IDEOGRAPH-FA4E +FA4F;W # CJK COMPATIBILITY IDEOGRAPH-FA4F +FA50;W # CJK COMPATIBILITY IDEOGRAPH-FA50 +FA51;W # CJK COMPATIBILITY IDEOGRAPH-FA51 +FA52;W # CJK COMPATIBILITY IDEOGRAPH-FA52 +FA53;W # CJK COMPATIBILITY IDEOGRAPH-FA53 +FA54;W # CJK COMPATIBILITY IDEOGRAPH-FA54 +FA55;W # CJK COMPATIBILITY IDEOGRAPH-FA55 +FA56;W # CJK COMPATIBILITY IDEOGRAPH-FA56 +FA57;W # CJK COMPATIBILITY IDEOGRAPH-FA57 +FA58;W # CJK COMPATIBILITY IDEOGRAPH-FA58 +FA59;W # CJK COMPATIBILITY IDEOGRAPH-FA59 +FA5A;W # CJK COMPATIBILITY IDEOGRAPH-FA5A +FA5B;W # CJK COMPATIBILITY IDEOGRAPH-FA5B +FA5C;W # CJK COMPATIBILITY IDEOGRAPH-FA5C +FA5D;W # CJK COMPATIBILITY IDEOGRAPH-FA5D +FA5E;W # CJK COMPATIBILITY IDEOGRAPH-FA5E +FA5F;W # CJK COMPATIBILITY IDEOGRAPH-FA5F +FA60;W # CJK COMPATIBILITY IDEOGRAPH-FA60 +FA61;W # CJK COMPATIBILITY IDEOGRAPH-FA61 +FA62;W # CJK COMPATIBILITY IDEOGRAPH-FA62 +FA63;W # CJK COMPATIBILITY IDEOGRAPH-FA63 +FA64;W # CJK COMPATIBILITY IDEOGRAPH-FA64 +FA65;W # CJK COMPATIBILITY IDEOGRAPH-FA65 +FA66;W # CJK COMPATIBILITY IDEOGRAPH-FA66 +FA67;W # CJK COMPATIBILITY IDEOGRAPH-FA67 +FA68;W # CJK COMPATIBILITY IDEOGRAPH-FA68 +FA69;W # CJK COMPATIBILITY IDEOGRAPH-FA69 +FA6A;W # CJK COMPATIBILITY IDEOGRAPH-FA6A +FA70;W # CJK COMPATIBILITY IDEOGRAPH-FA70 +FA71;W # CJK COMPATIBILITY IDEOGRAPH-FA71 +FA72;W # CJK COMPATIBILITY IDEOGRAPH-FA72 +FA73;W # CJK COMPATIBILITY IDEOGRAPH-FA73 +FA74;W # CJK COMPATIBILITY IDEOGRAPH-FA74 +FA75;W # CJK COMPATIBILITY IDEOGRAPH-FA75 +FA76;W # CJK COMPATIBILITY IDEOGRAPH-FA76 +FA77;W # CJK COMPATIBILITY IDEOGRAPH-FA77 +FA78;W # CJK COMPATIBILITY IDEOGRAPH-FA78 +FA79;W # CJK COMPATIBILITY IDEOGRAPH-FA79 +FA7A;W # CJK COMPATIBILITY IDEOGRAPH-FA7A +FA7B;W # CJK COMPATIBILITY IDEOGRAPH-FA7B +FA7C;W # CJK COMPATIBILITY IDEOGRAPH-FA7C +FA7D;W # CJK COMPATIBILITY IDEOGRAPH-FA7D +FA7E;W # CJK COMPATIBILITY IDEOGRAPH-FA7E +FA7F;W # CJK COMPATIBILITY IDEOGRAPH-FA7F +FA80;W # CJK COMPATIBILITY IDEOGRAPH-FA80 +FA81;W # CJK COMPATIBILITY IDEOGRAPH-FA81 +FA82;W # CJK COMPATIBILITY IDEOGRAPH-FA82 +FA83;W # CJK COMPATIBILITY IDEOGRAPH-FA83 +FA84;W # CJK COMPATIBILITY IDEOGRAPH-FA84 +FA85;W # CJK COMPATIBILITY IDEOGRAPH-FA85 +FA86;W # CJK COMPATIBILITY IDEOGRAPH-FA86 +FA87;W # CJK COMPATIBILITY IDEOGRAPH-FA87 +FA88;W # CJK COMPATIBILITY IDEOGRAPH-FA88 +FA89;W # CJK COMPATIBILITY IDEOGRAPH-FA89 +FA8A;W # CJK COMPATIBILITY IDEOGRAPH-FA8A +FA8B;W # CJK COMPATIBILITY IDEOGRAPH-FA8B +FA8C;W # CJK COMPATIBILITY IDEOGRAPH-FA8C +FA8D;W # CJK COMPATIBILITY IDEOGRAPH-FA8D +FA8E;W # CJK COMPATIBILITY IDEOGRAPH-FA8E +FA8F;W # CJK COMPATIBILITY IDEOGRAPH-FA8F +FA90;W # CJK COMPATIBILITY IDEOGRAPH-FA90 +FA91;W # CJK COMPATIBILITY IDEOGRAPH-FA91 +FA92;W # CJK COMPATIBILITY IDEOGRAPH-FA92 +FA93;W # CJK COMPATIBILITY IDEOGRAPH-FA93 +FA94;W # CJK COMPATIBILITY IDEOGRAPH-FA94 +FA95;W # CJK COMPATIBILITY IDEOGRAPH-FA95 +FA96;W # CJK COMPATIBILITY IDEOGRAPH-FA96 +FA97;W # CJK COMPATIBILITY IDEOGRAPH-FA97 +FA98;W # CJK COMPATIBILITY IDEOGRAPH-FA98 +FA99;W # CJK COMPATIBILITY IDEOGRAPH-FA99 +FA9A;W # CJK COMPATIBILITY IDEOGRAPH-FA9A +FA9B;W # CJK COMPATIBILITY IDEOGRAPH-FA9B +FA9C;W # CJK COMPATIBILITY IDEOGRAPH-FA9C +FA9D;W # CJK COMPATIBILITY IDEOGRAPH-FA9D +FA9E;W # CJK COMPATIBILITY IDEOGRAPH-FA9E +FA9F;W # CJK COMPATIBILITY IDEOGRAPH-FA9F +FAA0;W # CJK COMPATIBILITY IDEOGRAPH-FAA0 +FAA1;W # CJK COMPATIBILITY IDEOGRAPH-FAA1 +FAA2;W # CJK COMPATIBILITY IDEOGRAPH-FAA2 +FAA3;W # CJK COMPATIBILITY IDEOGRAPH-FAA3 +FAA4;W # CJK COMPATIBILITY IDEOGRAPH-FAA4 +FAA5;W # CJK COMPATIBILITY IDEOGRAPH-FAA5 +FAA6;W # CJK COMPATIBILITY IDEOGRAPH-FAA6 +FAA7;W # CJK COMPATIBILITY IDEOGRAPH-FAA7 +FAA8;W # CJK COMPATIBILITY IDEOGRAPH-FAA8 +FAA9;W # CJK COMPATIBILITY IDEOGRAPH-FAA9 +FAAA;W # CJK COMPATIBILITY IDEOGRAPH-FAAA +FAAB;W # CJK COMPATIBILITY IDEOGRAPH-FAAB +FAAC;W # CJK COMPATIBILITY IDEOGRAPH-FAAC +FAAD;W # CJK COMPATIBILITY IDEOGRAPH-FAAD +FAAE;W # CJK COMPATIBILITY IDEOGRAPH-FAAE +FAAF;W # CJK COMPATIBILITY IDEOGRAPH-FAAF +FAB0;W # CJK COMPATIBILITY IDEOGRAPH-FAB0 +FAB1;W # CJK COMPATIBILITY IDEOGRAPH-FAB1 +FAB2;W # CJK COMPATIBILITY IDEOGRAPH-FAB2 +FAB3;W # CJK COMPATIBILITY IDEOGRAPH-FAB3 +FAB4;W # CJK COMPATIBILITY IDEOGRAPH-FAB4 +FAB5;W # CJK COMPATIBILITY IDEOGRAPH-FAB5 +FAB6;W # CJK COMPATIBILITY IDEOGRAPH-FAB6 +FAB7;W # CJK COMPATIBILITY IDEOGRAPH-FAB7 +FAB8;W # CJK COMPATIBILITY IDEOGRAPH-FAB8 +FAB9;W # CJK COMPATIBILITY IDEOGRAPH-FAB9 +FABA;W # CJK COMPATIBILITY IDEOGRAPH-FABA +FABB;W # CJK COMPATIBILITY IDEOGRAPH-FABB +FABC;W # CJK COMPATIBILITY IDEOGRAPH-FABC +FABD;W # CJK COMPATIBILITY IDEOGRAPH-FABD +FABE;W # CJK COMPATIBILITY IDEOGRAPH-FABE +FABF;W # CJK COMPATIBILITY IDEOGRAPH-FABF +FAC0;W # CJK COMPATIBILITY IDEOGRAPH-FAC0 +FAC1;W # CJK COMPATIBILITY IDEOGRAPH-FAC1 +FAC2;W # CJK COMPATIBILITY IDEOGRAPH-FAC2 +FAC3;W # CJK COMPATIBILITY IDEOGRAPH-FAC3 +FAC4;W # CJK COMPATIBILITY IDEOGRAPH-FAC4 +FAC5;W # CJK COMPATIBILITY IDEOGRAPH-FAC5 +FAC6;W # CJK COMPATIBILITY IDEOGRAPH-FAC6 +FAC7;W # CJK COMPATIBILITY IDEOGRAPH-FAC7 +FAC8;W # CJK COMPATIBILITY IDEOGRAPH-FAC8 +FAC9;W # CJK COMPATIBILITY IDEOGRAPH-FAC9 +FACA;W # CJK COMPATIBILITY IDEOGRAPH-FACA +FACB;W # CJK COMPATIBILITY IDEOGRAPH-FACB +FACC;W # CJK COMPATIBILITY IDEOGRAPH-FACC +FACD;W # CJK COMPATIBILITY IDEOGRAPH-FACD +FACE;W # CJK COMPATIBILITY IDEOGRAPH-FACE +FACF;W # CJK COMPATIBILITY IDEOGRAPH-FACF +FAD0;W # CJK COMPATIBILITY IDEOGRAPH-FAD0 +FAD1;W # CJK COMPATIBILITY IDEOGRAPH-FAD1 +FAD2;W # CJK COMPATIBILITY IDEOGRAPH-FAD2 +FAD3;W # CJK COMPATIBILITY IDEOGRAPH-FAD3 +FAD4;W # CJK COMPATIBILITY IDEOGRAPH-FAD4 +FAD5;W # CJK COMPATIBILITY IDEOGRAPH-FAD5 +FAD6;W # CJK COMPATIBILITY IDEOGRAPH-FAD6 +FAD7;W # CJK COMPATIBILITY IDEOGRAPH-FAD7 +FAD8;W # CJK COMPATIBILITY IDEOGRAPH-FAD8 +FAD9;W # CJK COMPATIBILITY IDEOGRAPH-FAD9 +FB00;N # LATIN SMALL LIGATURE FF +FB01;N # LATIN SMALL LIGATURE FI +FB02;N # LATIN SMALL LIGATURE FL +FB03;N # LATIN SMALL LIGATURE FFI +FB04;N # LATIN SMALL LIGATURE FFL +FB05;N # LATIN SMALL LIGATURE LONG S T +FB06;N # LATIN SMALL LIGATURE ST +FB13;N # ARMENIAN SMALL LIGATURE MEN NOW +FB14;N # ARMENIAN SMALL LIGATURE MEN ECH +FB15;N # ARMENIAN SMALL LIGATURE MEN INI +FB16;N # ARMENIAN SMALL LIGATURE VEW NOW +FB17;N # ARMENIAN SMALL LIGATURE MEN XEH +FB1D;N # HEBREW LETTER YOD WITH HIRIQ +FB1E;N # HEBREW POINT JUDEO-SPANISH VARIKA +FB1F;N # HEBREW LIGATURE YIDDISH YOD YOD PATAH +FB20;N # HEBREW LETTER ALTERNATIVE AYIN +FB21;N # HEBREW LETTER WIDE ALEF +FB22;N # HEBREW LETTER WIDE DALET +FB23;N # HEBREW LETTER WIDE HE +FB24;N # HEBREW LETTER WIDE KAF +FB25;N # HEBREW LETTER WIDE LAMED +FB26;N # HEBREW LETTER WIDE FINAL MEM +FB27;N # HEBREW LETTER WIDE RESH +FB28;N # HEBREW LETTER WIDE TAV +FB29;N # HEBREW LETTER ALTERNATIVE PLUS SIGN +FB2A;N # HEBREW LETTER SHIN WITH SHIN DOT +FB2B;N # HEBREW LETTER SHIN WITH SIN DOT +FB2C;N # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT +FB2D;N # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT +FB2E;N # HEBREW LETTER ALEF WITH PATAH +FB2F;N # HEBREW LETTER ALEF WITH QAMATS +FB30;N # HEBREW LETTER ALEF WITH MAPIQ +FB31;N # HEBREW LETTER BET WITH DAGESH +FB32;N # HEBREW LETTER GIMEL WITH DAGESH +FB33;N # HEBREW LETTER DALET WITH DAGESH +FB34;N # HEBREW LETTER HE WITH MAPIQ +FB35;N # HEBREW LETTER VAV WITH DAGESH +FB36;N # HEBREW LETTER ZAYIN WITH DAGESH +FB38;N # HEBREW LETTER TET WITH DAGESH +FB39;N # HEBREW LETTER YOD WITH DAGESH +FB3A;N # HEBREW LETTER FINAL KAF WITH DAGESH +FB3B;N # HEBREW LETTER KAF WITH DAGESH +FB3C;N # HEBREW LETTER LAMED WITH DAGESH +FB3E;N # HEBREW LETTER MEM WITH DAGESH +FB40;N # HEBREW LETTER NUN WITH DAGESH +FB41;N # HEBREW LETTER SAMEKH WITH DAGESH +FB43;N # HEBREW LETTER FINAL PE WITH DAGESH +FB44;N # HEBREW LETTER PE WITH DAGESH +FB46;N # HEBREW LETTER TSADI WITH DAGESH +FB47;N # HEBREW LETTER QOF WITH DAGESH +FB48;N # HEBREW LETTER RESH WITH DAGESH +FB49;N # HEBREW LETTER SHIN WITH DAGESH +FB4A;N # HEBREW LETTER TAV WITH DAGESH +FB4B;N # HEBREW LETTER VAV WITH HOLAM +FB4C;N # HEBREW LETTER BET WITH RAFE +FB4D;N # HEBREW LETTER KAF WITH RAFE +FB4E;N # HEBREW LETTER PE WITH RAFE +FB4F;N # HEBREW LIGATURE ALEF LAMED +FB50;N # ARABIC LETTER ALEF WASLA ISOLATED FORM +FB51;N # ARABIC LETTER ALEF WASLA FINAL FORM +FB52;N # ARABIC LETTER BEEH ISOLATED FORM +FB53;N # ARABIC LETTER BEEH FINAL FORM +FB54;N # ARABIC LETTER BEEH INITIAL FORM +FB55;N # ARABIC LETTER BEEH MEDIAL FORM +FB56;N # ARABIC LETTER PEH ISOLATED FORM +FB57;N # ARABIC LETTER PEH FINAL FORM +FB58;N # ARABIC LETTER PEH INITIAL FORM +FB59;N # ARABIC LETTER PEH MEDIAL FORM +FB5A;N # ARABIC LETTER BEHEH ISOLATED FORM +FB5B;N # ARABIC LETTER BEHEH FINAL FORM +FB5C;N # ARABIC LETTER BEHEH INITIAL FORM +FB5D;N # ARABIC LETTER BEHEH MEDIAL FORM +FB5E;N # ARABIC LETTER TTEHEH ISOLATED FORM +FB5F;N # ARABIC LETTER TTEHEH FINAL FORM +FB60;N # ARABIC LETTER TTEHEH INITIAL FORM +FB61;N # ARABIC LETTER TTEHEH MEDIAL FORM +FB62;N # ARABIC LETTER TEHEH ISOLATED FORM +FB63;N # ARABIC LETTER TEHEH FINAL FORM +FB64;N # ARABIC LETTER TEHEH INITIAL FORM +FB65;N # ARABIC LETTER TEHEH MEDIAL FORM +FB66;N # ARABIC LETTER TTEH ISOLATED FORM +FB67;N # ARABIC LETTER TTEH FINAL FORM +FB68;N # ARABIC LETTER TTEH INITIAL FORM +FB69;N # ARABIC LETTER TTEH MEDIAL FORM +FB6A;N # ARABIC LETTER VEH ISOLATED FORM +FB6B;N # ARABIC LETTER VEH FINAL FORM +FB6C;N # ARABIC LETTER VEH INITIAL FORM +FB6D;N # ARABIC LETTER VEH MEDIAL FORM +FB6E;N # ARABIC LETTER PEHEH ISOLATED FORM +FB6F;N # ARABIC LETTER PEHEH FINAL FORM +FB70;N # ARABIC LETTER PEHEH INITIAL FORM +FB71;N # ARABIC LETTER PEHEH MEDIAL FORM +FB72;N # ARABIC LETTER DYEH ISOLATED FORM +FB73;N # ARABIC LETTER DYEH FINAL FORM +FB74;N # ARABIC LETTER DYEH INITIAL FORM +FB75;N # ARABIC LETTER DYEH MEDIAL FORM +FB76;N # ARABIC LETTER NYEH ISOLATED FORM +FB77;N # ARABIC LETTER NYEH FINAL FORM +FB78;N # ARABIC LETTER NYEH INITIAL FORM +FB79;N # ARABIC LETTER NYEH MEDIAL FORM +FB7A;N # ARABIC LETTER TCHEH ISOLATED FORM +FB7B;N # ARABIC LETTER TCHEH FINAL FORM +FB7C;N # ARABIC LETTER TCHEH INITIAL FORM +FB7D;N # ARABIC LETTER TCHEH MEDIAL FORM +FB7E;N # ARABIC LETTER TCHEHEH ISOLATED FORM +FB7F;N # ARABIC LETTER TCHEHEH FINAL FORM +FB80;N # ARABIC LETTER TCHEHEH INITIAL FORM +FB81;N # ARABIC LETTER TCHEHEH MEDIAL FORM +FB82;N # ARABIC LETTER DDAHAL ISOLATED FORM +FB83;N # ARABIC LETTER DDAHAL FINAL FORM +FB84;N # ARABIC LETTER DAHAL ISOLATED FORM +FB85;N # ARABIC LETTER DAHAL FINAL FORM +FB86;N # ARABIC LETTER DUL ISOLATED FORM +FB87;N # ARABIC LETTER DUL FINAL FORM +FB88;N # ARABIC LETTER DDAL ISOLATED FORM +FB89;N # ARABIC LETTER DDAL FINAL FORM +FB8A;N # ARABIC LETTER JEH ISOLATED FORM +FB8B;N # ARABIC LETTER JEH FINAL FORM +FB8C;N # ARABIC LETTER RREH ISOLATED FORM +FB8D;N # ARABIC LETTER RREH FINAL FORM +FB8E;N # ARABIC LETTER KEHEH ISOLATED FORM +FB8F;N # ARABIC LETTER KEHEH FINAL FORM +FB90;N # ARABIC LETTER KEHEH INITIAL FORM +FB91;N # ARABIC LETTER KEHEH MEDIAL FORM +FB92;N # ARABIC LETTER GAF ISOLATED FORM +FB93;N # ARABIC LETTER GAF FINAL FORM +FB94;N # ARABIC LETTER GAF INITIAL FORM +FB95;N # ARABIC LETTER GAF MEDIAL FORM +FB96;N # ARABIC LETTER GUEH ISOLATED FORM +FB97;N # ARABIC LETTER GUEH FINAL FORM +FB98;N # ARABIC LETTER GUEH INITIAL FORM +FB99;N # ARABIC LETTER GUEH MEDIAL FORM +FB9A;N # ARABIC LETTER NGOEH ISOLATED FORM +FB9B;N # ARABIC LETTER NGOEH FINAL FORM +FB9C;N # ARABIC LETTER NGOEH INITIAL FORM +FB9D;N # ARABIC LETTER NGOEH MEDIAL FORM +FB9E;N # ARABIC LETTER NOON GHUNNA ISOLATED FORM +FB9F;N # ARABIC LETTER NOON GHUNNA FINAL FORM +FBA0;N # ARABIC LETTER RNOON ISOLATED FORM +FBA1;N # ARABIC LETTER RNOON FINAL FORM +FBA2;N # ARABIC LETTER RNOON INITIAL FORM +FBA3;N # ARABIC LETTER RNOON MEDIAL FORM +FBA4;N # ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM +FBA5;N # ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM +FBA6;N # ARABIC LETTER HEH GOAL ISOLATED FORM +FBA7;N # ARABIC LETTER HEH GOAL FINAL FORM +FBA8;N # ARABIC LETTER HEH GOAL INITIAL FORM +FBA9;N # ARABIC LETTER HEH GOAL MEDIAL FORM +FBAA;N # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM +FBAB;N # ARABIC LETTER HEH DOACHASHMEE FINAL FORM +FBAC;N # ARABIC LETTER HEH DOACHASHMEE INITIAL FORM +FBAD;N # ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM +FBAE;N # ARABIC LETTER YEH BARREE ISOLATED FORM +FBAF;N # ARABIC LETTER YEH BARREE FINAL FORM +FBB0;N # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM +FBB1;N # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBD3;N # ARABIC LETTER NG ISOLATED FORM +FBD4;N # ARABIC LETTER NG FINAL FORM +FBD5;N # ARABIC LETTER NG INITIAL FORM +FBD6;N # ARABIC LETTER NG MEDIAL FORM +FBD7;N # ARABIC LETTER U ISOLATED FORM +FBD8;N # ARABIC LETTER U FINAL FORM +FBD9;N # ARABIC LETTER OE ISOLATED FORM +FBDA;N # ARABIC LETTER OE FINAL FORM +FBDB;N # ARABIC LETTER YU ISOLATED FORM +FBDC;N # ARABIC LETTER YU FINAL FORM +FBDD;N # ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM +FBDE;N # ARABIC LETTER VE ISOLATED FORM +FBDF;N # ARABIC LETTER VE FINAL FORM +FBE0;N # ARABIC LETTER KIRGHIZ OE ISOLATED FORM +FBE1;N # ARABIC LETTER KIRGHIZ OE FINAL FORM +FBE2;N # ARABIC LETTER KIRGHIZ YU ISOLATED FORM +FBE3;N # ARABIC LETTER KIRGHIZ YU FINAL FORM +FBE4;N # ARABIC LETTER E ISOLATED FORM +FBE5;N # ARABIC LETTER E FINAL FORM +FBE6;N # ARABIC LETTER E INITIAL FORM +FBE7;N # ARABIC LETTER E MEDIAL FORM +FBE8;N # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM +FBE9;N # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM +FBEA;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM +FBEB;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM +FBEC;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM +FBED;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM +FBEE;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM +FBEF;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM +FBF0;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM +FBF1;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM +FBF2;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM +FBF3;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM +FBF4;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM +FBF5;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM +FBF6;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM +FBF7;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM +FBF8;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM +FBF9;N # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FBFA;N # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FBFB;N # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM +FBFC;N # ARABIC LETTER FARSI YEH ISOLATED FORM +FBFD;N # ARABIC LETTER FARSI YEH FINAL FORM +FBFE;N # ARABIC LETTER FARSI YEH INITIAL FORM +FBFF;N # ARABIC LETTER FARSI YEH MEDIAL FORM +FC00;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM +FC01;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM +FC02;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM +FC03;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FC04;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM +FC05;N # ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM +FC06;N # ARABIC LIGATURE BEH WITH HAH ISOLATED FORM +FC07;N # ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM +FC08;N # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM +FC09;N # ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM +FC0A;N # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM +FC0B;N # ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM +FC0C;N # ARABIC LIGATURE TEH WITH HAH ISOLATED FORM +FC0D;N # ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM +FC0E;N # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM +FC0F;N # ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM +FC10;N # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM +FC11;N # ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM +FC12;N # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM +FC13;N # ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM +FC14;N # ARABIC LIGATURE THEH WITH YEH ISOLATED FORM +FC15;N # ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM +FC16;N # ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM +FC17;N # ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM +FC18;N # ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM +FC19;N # ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM +FC1A;N # ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM +FC1B;N # ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM +FC1C;N # ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM +FC1D;N # ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM +FC1E;N # ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM +FC1F;N # ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM +FC20;N # ARABIC LIGATURE SAD WITH HAH ISOLATED FORM +FC21;N # ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM +FC22;N # ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM +FC23;N # ARABIC LIGATURE DAD WITH HAH ISOLATED FORM +FC24;N # ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM +FC25;N # ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM +FC26;N # ARABIC LIGATURE TAH WITH HAH ISOLATED FORM +FC27;N # ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM +FC28;N # ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM +FC29;N # ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM +FC2A;N # ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM +FC2B;N # ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM +FC2C;N # ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM +FC2D;N # ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM +FC2E;N # ARABIC LIGATURE FEH WITH HAH ISOLATED FORM +FC2F;N # ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM +FC30;N # ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM +FC31;N # ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM +FC32;N # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM +FC33;N # ARABIC LIGATURE QAF WITH HAH ISOLATED FORM +FC34;N # ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM +FC35;N # ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM +FC36;N # ARABIC LIGATURE QAF WITH YEH ISOLATED FORM +FC37;N # ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM +FC38;N # ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM +FC39;N # ARABIC LIGATURE KAF WITH HAH ISOLATED FORM +FC3A;N # ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM +FC3B;N # ARABIC LIGATURE KAF WITH LAM ISOLATED FORM +FC3C;N # ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM +FC3D;N # ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM +FC3E;N # ARABIC LIGATURE KAF WITH YEH ISOLATED FORM +FC3F;N # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM +FC40;N # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM +FC41;N # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM +FC42;N # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM +FC43;N # ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM +FC44;N # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM +FC45;N # ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM +FC46;N # ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM +FC47;N # ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM +FC48;N # ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM +FC49;N # ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM +FC4A;N # ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM +FC4B;N # ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM +FC4C;N # ARABIC LIGATURE NOON WITH HAH ISOLATED FORM +FC4D;N # ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM +FC4E;N # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM +FC4F;N # ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM +FC50;N # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM +FC51;N # ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM +FC52;N # ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM +FC53;N # ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM +FC54;N # ARABIC LIGATURE HEH WITH YEH ISOLATED FORM +FC55;N # ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM +FC56;N # ARABIC LIGATURE YEH WITH HAH ISOLATED FORM +FC57;N # ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM +FC58;N # ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM +FC59;N # ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM +FC5A;N # ARABIC LIGATURE YEH WITH YEH ISOLATED FORM +FC5B;N # ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5C;N # ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5D;N # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5E;N # ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM +FC5F;N # ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM +FC60;N # ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM +FC61;N # ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM +FC62;N # ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM +FC63;N # ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM +FC64;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM +FC65;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM +FC66;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM +FC67;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM +FC68;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FC69;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM +FC6A;N # ARABIC LIGATURE BEH WITH REH FINAL FORM +FC6B;N # ARABIC LIGATURE BEH WITH ZAIN FINAL FORM +FC6C;N # ARABIC LIGATURE BEH WITH MEEM FINAL FORM +FC6D;N # ARABIC LIGATURE BEH WITH NOON FINAL FORM +FC6E;N # ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM +FC6F;N # ARABIC LIGATURE BEH WITH YEH FINAL FORM +FC70;N # ARABIC LIGATURE TEH WITH REH FINAL FORM +FC71;N # ARABIC LIGATURE TEH WITH ZAIN FINAL FORM +FC72;N # ARABIC LIGATURE TEH WITH MEEM FINAL FORM +FC73;N # ARABIC LIGATURE TEH WITH NOON FINAL FORM +FC74;N # ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM +FC75;N # ARABIC LIGATURE TEH WITH YEH FINAL FORM +FC76;N # ARABIC LIGATURE THEH WITH REH FINAL FORM +FC77;N # ARABIC LIGATURE THEH WITH ZAIN FINAL FORM +FC78;N # ARABIC LIGATURE THEH WITH MEEM FINAL FORM +FC79;N # ARABIC LIGATURE THEH WITH NOON FINAL FORM +FC7A;N # ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM +FC7B;N # ARABIC LIGATURE THEH WITH YEH FINAL FORM +FC7C;N # ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM +FC7D;N # ARABIC LIGATURE FEH WITH YEH FINAL FORM +FC7E;N # ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM +FC7F;N # ARABIC LIGATURE QAF WITH YEH FINAL FORM +FC80;N # ARABIC LIGATURE KAF WITH ALEF FINAL FORM +FC81;N # ARABIC LIGATURE KAF WITH LAM FINAL FORM +FC82;N # ARABIC LIGATURE KAF WITH MEEM FINAL FORM +FC83;N # ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM +FC84;N # ARABIC LIGATURE KAF WITH YEH FINAL FORM +FC85;N # ARABIC LIGATURE LAM WITH MEEM FINAL FORM +FC86;N # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM +FC87;N # ARABIC LIGATURE LAM WITH YEH FINAL FORM +FC88;N # ARABIC LIGATURE MEEM WITH ALEF FINAL FORM +FC89;N # ARABIC LIGATURE MEEM WITH MEEM FINAL FORM +FC8A;N # ARABIC LIGATURE NOON WITH REH FINAL FORM +FC8B;N # ARABIC LIGATURE NOON WITH ZAIN FINAL FORM +FC8C;N # ARABIC LIGATURE NOON WITH MEEM FINAL FORM +FC8D;N # ARABIC LIGATURE NOON WITH NOON FINAL FORM +FC8E;N # ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM +FC8F;N # ARABIC LIGATURE NOON WITH YEH FINAL FORM +FC90;N # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM +FC91;N # ARABIC LIGATURE YEH WITH REH FINAL FORM +FC92;N # ARABIC LIGATURE YEH WITH ZAIN FINAL FORM +FC93;N # ARABIC LIGATURE YEH WITH MEEM FINAL FORM +FC94;N # ARABIC LIGATURE YEH WITH NOON FINAL FORM +FC95;N # ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM +FC96;N # ARABIC LIGATURE YEH WITH YEH FINAL FORM +FC97;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM +FC98;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM +FC99;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM +FC9A;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM +FC9B;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM +FC9C;N # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM +FC9D;N # ARABIC LIGATURE BEH WITH HAH INITIAL FORM +FC9E;N # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM +FC9F;N # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM +FCA0;N # ARABIC LIGATURE BEH WITH HEH INITIAL FORM +FCA1;N # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM +FCA2;N # ARABIC LIGATURE TEH WITH HAH INITIAL FORM +FCA3;N # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM +FCA4;N # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM +FCA5;N # ARABIC LIGATURE TEH WITH HEH INITIAL FORM +FCA6;N # ARABIC LIGATURE THEH WITH MEEM INITIAL FORM +FCA7;N # ARABIC LIGATURE JEEM WITH HAH INITIAL FORM +FCA8;N # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM +FCA9;N # ARABIC LIGATURE HAH WITH JEEM INITIAL FORM +FCAA;N # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM +FCAB;N # ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM +FCAC;N # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM +FCAD;N # ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM +FCAE;N # ARABIC LIGATURE SEEN WITH HAH INITIAL FORM +FCAF;N # ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM +FCB0;N # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM +FCB1;N # ARABIC LIGATURE SAD WITH HAH INITIAL FORM +FCB2;N # ARABIC LIGATURE SAD WITH KHAH INITIAL FORM +FCB3;N # ARABIC LIGATURE SAD WITH MEEM INITIAL FORM +FCB4;N # ARABIC LIGATURE DAD WITH JEEM INITIAL FORM +FCB5;N # ARABIC LIGATURE DAD WITH HAH INITIAL FORM +FCB6;N # ARABIC LIGATURE DAD WITH KHAH INITIAL FORM +FCB7;N # ARABIC LIGATURE DAD WITH MEEM INITIAL FORM +FCB8;N # ARABIC LIGATURE TAH WITH HAH INITIAL FORM +FCB9;N # ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM +FCBA;N # ARABIC LIGATURE AIN WITH JEEM INITIAL FORM +FCBB;N # ARABIC LIGATURE AIN WITH MEEM INITIAL FORM +FCBC;N # ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM +FCBD;N # ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM +FCBE;N # ARABIC LIGATURE FEH WITH JEEM INITIAL FORM +FCBF;N # ARABIC LIGATURE FEH WITH HAH INITIAL FORM +FCC0;N # ARABIC LIGATURE FEH WITH KHAH INITIAL FORM +FCC1;N # ARABIC LIGATURE FEH WITH MEEM INITIAL FORM +FCC2;N # ARABIC LIGATURE QAF WITH HAH INITIAL FORM +FCC3;N # ARABIC LIGATURE QAF WITH MEEM INITIAL FORM +FCC4;N # ARABIC LIGATURE KAF WITH JEEM INITIAL FORM +FCC5;N # ARABIC LIGATURE KAF WITH HAH INITIAL FORM +FCC6;N # ARABIC LIGATURE KAF WITH KHAH INITIAL FORM +FCC7;N # ARABIC LIGATURE KAF WITH LAM INITIAL FORM +FCC8;N # ARABIC LIGATURE KAF WITH MEEM INITIAL FORM +FCC9;N # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM +FCCA;N # ARABIC LIGATURE LAM WITH HAH INITIAL FORM +FCCB;N # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM +FCCC;N # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM +FCCD;N # ARABIC LIGATURE LAM WITH HEH INITIAL FORM +FCCE;N # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM +FCCF;N # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM +FCD0;N # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM +FCD1;N # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM +FCD2;N # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM +FCD3;N # ARABIC LIGATURE NOON WITH HAH INITIAL FORM +FCD4;N # ARABIC LIGATURE NOON WITH KHAH INITIAL FORM +FCD5;N # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM +FCD6;N # ARABIC LIGATURE NOON WITH HEH INITIAL FORM +FCD7;N # ARABIC LIGATURE HEH WITH JEEM INITIAL FORM +FCD8;N # ARABIC LIGATURE HEH WITH MEEM INITIAL FORM +FCD9;N # ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM +FCDA;N # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM +FCDB;N # ARABIC LIGATURE YEH WITH HAH INITIAL FORM +FCDC;N # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM +FCDD;N # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM +FCDE;N # ARABIC LIGATURE YEH WITH HEH INITIAL FORM +FCDF;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM +FCE0;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM +FCE1;N # ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM +FCE2;N # ARABIC LIGATURE BEH WITH HEH MEDIAL FORM +FCE3;N # ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM +FCE4;N # ARABIC LIGATURE TEH WITH HEH MEDIAL FORM +FCE5;N # ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM +FCE6;N # ARABIC LIGATURE THEH WITH HEH MEDIAL FORM +FCE7;N # ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM +FCE8;N # ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM +FCE9;N # ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM +FCEA;N # ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM +FCEB;N # ARABIC LIGATURE KAF WITH LAM MEDIAL FORM +FCEC;N # ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM +FCED;N # ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM +FCEE;N # ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM +FCEF;N # ARABIC LIGATURE NOON WITH HEH MEDIAL FORM +FCF0;N # ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM +FCF1;N # ARABIC LIGATURE YEH WITH HEH MEDIAL FORM +FCF2;N # ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM +FCF3;N # ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM +FCF4;N # ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM +FCF5;N # ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM +FCF6;N # ARABIC LIGATURE TAH WITH YEH ISOLATED FORM +FCF7;N # ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM +FCF8;N # ARABIC LIGATURE AIN WITH YEH ISOLATED FORM +FCF9;N # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM +FCFA;N # ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM +FCFB;N # ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM +FCFC;N # ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM +FCFD;N # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM +FCFE;N # ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM +FCFF;N # ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM +FD00;N # ARABIC LIGATURE HAH WITH YEH ISOLATED FORM +FD01;N # ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM +FD02;N # ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM +FD03;N # ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM +FD04;N # ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM +FD05;N # ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM +FD06;N # ARABIC LIGATURE SAD WITH YEH ISOLATED FORM +FD07;N # ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM +FD08;N # ARABIC LIGATURE DAD WITH YEH ISOLATED FORM +FD09;N # ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM +FD0A;N # ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM +FD0B;N # ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM +FD0C;N # ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM +FD0D;N # ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM +FD0E;N # ARABIC LIGATURE SEEN WITH REH ISOLATED FORM +FD0F;N # ARABIC LIGATURE SAD WITH REH ISOLATED FORM +FD10;N # ARABIC LIGATURE DAD WITH REH ISOLATED FORM +FD11;N # ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM +FD12;N # ARABIC LIGATURE TAH WITH YEH FINAL FORM +FD13;N # ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM +FD14;N # ARABIC LIGATURE AIN WITH YEH FINAL FORM +FD15;N # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM +FD16;N # ARABIC LIGATURE GHAIN WITH YEH FINAL FORM +FD17;N # ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM +FD18;N # ARABIC LIGATURE SEEN WITH YEH FINAL FORM +FD19;N # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM +FD1A;N # ARABIC LIGATURE SHEEN WITH YEH FINAL FORM +FD1B;N # ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM +FD1C;N # ARABIC LIGATURE HAH WITH YEH FINAL FORM +FD1D;N # ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM +FD1E;N # ARABIC LIGATURE JEEM WITH YEH FINAL FORM +FD1F;N # ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM +FD20;N # ARABIC LIGATURE KHAH WITH YEH FINAL FORM +FD21;N # ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM +FD22;N # ARABIC LIGATURE SAD WITH YEH FINAL FORM +FD23;N # ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM +FD24;N # ARABIC LIGATURE DAD WITH YEH FINAL FORM +FD25;N # ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM +FD26;N # ARABIC LIGATURE SHEEN WITH HAH FINAL FORM +FD27;N # ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM +FD28;N # ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM +FD29;N # ARABIC LIGATURE SHEEN WITH REH FINAL FORM +FD2A;N # ARABIC LIGATURE SEEN WITH REH FINAL FORM +FD2B;N # ARABIC LIGATURE SAD WITH REH FINAL FORM +FD2C;N # ARABIC LIGATURE DAD WITH REH FINAL FORM +FD2D;N # ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM +FD2E;N # ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM +FD2F;N # ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM +FD30;N # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM +FD31;N # ARABIC LIGATURE SEEN WITH HEH INITIAL FORM +FD32;N # ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM +FD33;N # ARABIC LIGATURE TAH WITH MEEM INITIAL FORM +FD34;N # ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM +FD35;N # ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM +FD36;N # ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM +FD37;N # ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM +FD38;N # ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM +FD39;N # ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM +FD3A;N # ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM +FD3B;N # ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM +FD3C;N # ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM +FD3D;N # ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD3E;N # ORNATE LEFT PARENTHESIS +FD3F;N # ORNATE RIGHT PARENTHESIS +FD50;N # ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM +FD51;N # ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM +FD52;N # ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM +FD53;N # ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM +FD54;N # ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM +FD55;N # ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM +FD56;N # ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM +FD57;N # ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM +FD58;N # ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM +FD59;N # ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM +FD5A;N # ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM +FD5B;N # ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD5C;N # ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM +FD5D;N # ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM +FD5E;N # ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM +FD5F;N # ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM +FD60;N # ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM +FD61;N # ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM +FD62;N # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM +FD63;N # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM +FD64;N # ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM +FD65;N # ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM +FD66;N # ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM +FD67;N # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM +FD68;N # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM +FD69;N # ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM +FD6A;N # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM +FD6B;N # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM +FD6C;N # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM +FD6D;N # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM +FD6E;N # ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM +FD6F;N # ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM +FD70;N # ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM +FD71;N # ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM +FD72;N # ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM +FD73;N # ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM +FD74;N # ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM +FD75;N # ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM +FD76;N # ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM +FD77;N # ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM +FD78;N # ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD79;N # ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM +FD7A;N # ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM +FD7B;N # ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD7C;N # ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM +FD7D;N # ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM +FD7E;N # ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM +FD7F;N # ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM +FD80;N # ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM +FD81;N # ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM +FD82;N # ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM +FD83;N # ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM +FD84;N # ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM +FD85;N # ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM +FD86;N # ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM +FD87;N # ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM +FD88;N # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM +FD89;N # ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM +FD8A;N # ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM +FD8B;N # ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM +FD8C;N # ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM +FD8D;N # ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM +FD8E;N # ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM +FD8F;N # ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92;N # ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM +FD93;N # ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM +FD94;N # ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM +FD95;N # ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM +FD96;N # ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM +FD97;N # ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM +FD98;N # ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM +FD99;N # ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM +FD9A;N # ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM +FD9B;N # ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD9C;N # ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM +FD9D;N # ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM +FD9E;N # ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM +FD9F;N # ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM +FDA0;N # ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM +FDA1;N # ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM +FDA2;N # ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDA3;N # ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM +FDA4;N # ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA5;N # ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM +FDA6;N # ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM +FDA7;N # ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA8;N # ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDA9;N # ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM +FDAA;N # ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM +FDAB;N # ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM +FDAC;N # ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM +FDAD;N # ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM +FDAE;N # ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM +FDAF;N # ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM +FDB0;N # ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM +FDB1;N # ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM +FDB2;N # ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM +FDB3;N # ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM +FDB4;N # ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM +FDB5;N # ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM +FDB6;N # ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM +FDB7;N # ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM +FDB8;N # ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM +FDB9;N # ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM +FDBA;N # ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM +FDBB;N # ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM +FDBC;N # ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM +FDBD;N # ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM +FDBE;N # ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM +FDBF;N # ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM +FDC0;N # ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM +FDC1;N # ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM +FDC2;N # ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM +FDC3;N # ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM +FDC4;N # ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM +FDC5;N # ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM +FDC6;N # ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM +FDC7;N # ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDF0;N # ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM +FDF1;N # ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM +FDF2;N # ARABIC LIGATURE ALLAH ISOLATED FORM +FDF3;N # ARABIC LIGATURE AKBAR ISOLATED FORM +FDF4;N # ARABIC LIGATURE MOHAMMAD ISOLATED FORM +FDF5;N # ARABIC LIGATURE SALAM ISOLATED FORM +FDF6;N # ARABIC LIGATURE RASOUL ISOLATED FORM +FDF7;N # ARABIC LIGATURE ALAYHE ISOLATED FORM +FDF8;N # ARABIC LIGATURE WASALLAM ISOLATED FORM +FDF9;N # ARABIC LIGATURE SALLA ISOLATED FORM +FDFA;N # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM +FDFB;N # ARABIC LIGATURE JALLAJALALOUHOU +FDFC;N # RIAL SIGN +FDFD;N # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +FE00;A # VARIATION SELECTOR-1 +FE01;A # VARIATION SELECTOR-2 +FE02;A # VARIATION SELECTOR-3 +FE03;A # VARIATION SELECTOR-4 +FE04;A # VARIATION SELECTOR-5 +FE05;A # VARIATION SELECTOR-6 +FE06;A # VARIATION SELECTOR-7 +FE07;A # VARIATION SELECTOR-8 +FE08;A # VARIATION SELECTOR-9 +FE09;A # VARIATION SELECTOR-10 +FE0A;A # VARIATION SELECTOR-11 +FE0B;A # VARIATION SELECTOR-12 +FE0C;A # VARIATION SELECTOR-13 +FE0D;A # VARIATION SELECTOR-14 +FE0E;A # VARIATION SELECTOR-15 +FE0F;A # VARIATION SELECTOR-16 +FE10;W # PRESENTATION FORM FOR VERTICAL COMMA +FE11;W # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA +FE12;W # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP +FE13;W # PRESENTATION FORM FOR VERTICAL COLON +FE14;W # PRESENTATION FORM FOR VERTICAL SEMICOLON +FE15;W # PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK +FE16;W # PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17;W # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18;W # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19;W # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +FE20;N # COMBINING LIGATURE LEFT HALF +FE21;N # COMBINING LIGATURE RIGHT HALF +FE22;N # COMBINING DOUBLE TILDE LEFT HALF +FE23;N # COMBINING DOUBLE TILDE RIGHT HALF +FE30;W # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31;W # PRESENTATION FORM FOR VERTICAL EM DASH +FE32;W # PRESENTATION FORM FOR VERTICAL EN DASH +FE33;W # PRESENTATION FORM FOR VERTICAL LOW LINE +FE34;W # PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35;W # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36;W # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37;W # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38;W # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39;W # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A;W # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B;W # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C;W # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D;W # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E;W # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F;W # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40;W # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41;W # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42;W # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43;W # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44;W # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45;W # SESAME DOT +FE46;W # WHITE SESAME DOT +FE47;W # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48;W # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49;W # DASHED OVERLINE +FE4A;W # CENTRELINE OVERLINE +FE4B;W # WAVY OVERLINE +FE4C;W # DOUBLE WAVY OVERLINE +FE4D;W # DASHED LOW LINE +FE4E;W # CENTRELINE LOW LINE +FE4F;W # WAVY LOW LINE +FE50;W # SMALL COMMA +FE51;W # SMALL IDEOGRAPHIC COMMA +FE52;W # SMALL FULL STOP +FE54;W # SMALL SEMICOLON +FE55;W # SMALL COLON +FE56;W # SMALL QUESTION MARK +FE57;W # SMALL EXCLAMATION MARK +FE58;W # SMALL EM DASH +FE59;W # SMALL LEFT PARENTHESIS +FE5A;W # SMALL RIGHT PARENTHESIS +FE5B;W # SMALL LEFT CURLY BRACKET +FE5C;W # SMALL RIGHT CURLY BRACKET +FE5D;W # SMALL LEFT TORTOISE SHELL BRACKET +FE5E;W # SMALL RIGHT TORTOISE SHELL BRACKET +FE5F;W # SMALL NUMBER SIGN +FE60;W # SMALL AMPERSAND +FE61;W # SMALL ASTERISK +FE62;W # SMALL PLUS SIGN +FE63;W # SMALL HYPHEN-MINUS +FE64;W # SMALL LESS-THAN SIGN +FE65;W # SMALL GREATER-THAN SIGN +FE66;W # SMALL EQUALS SIGN +FE68;W # SMALL REVERSE SOLIDUS +FE69;W # SMALL DOLLAR SIGN +FE6A;W # SMALL PERCENT SIGN +FE6B;W # SMALL COMMERCIAL AT +FE70;N # ARABIC FATHATAN ISOLATED FORM +FE71;N # ARABIC TATWEEL WITH FATHATAN ABOVE +FE72;N # ARABIC DAMMATAN ISOLATED FORM +FE73;N # ARABIC TAIL FRAGMENT +FE74;N # ARABIC KASRATAN ISOLATED FORM +FE76;N # ARABIC FATHA ISOLATED FORM +FE77;N # ARABIC FATHA MEDIAL FORM +FE78;N # ARABIC DAMMA ISOLATED FORM +FE79;N # ARABIC DAMMA MEDIAL FORM +FE7A;N # ARABIC KASRA ISOLATED FORM +FE7B;N # ARABIC KASRA MEDIAL FORM +FE7C;N # ARABIC SHADDA ISOLATED FORM +FE7D;N # ARABIC SHADDA MEDIAL FORM +FE7E;N # ARABIC SUKUN ISOLATED FORM +FE7F;N # ARABIC SUKUN MEDIAL FORM +FE80;N # ARABIC LETTER HAMZA ISOLATED FORM +FE81;N # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM +FE82;N # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM +FE83;N # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM +FE84;N # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM +FE85;N # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM +FE86;N # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM +FE87;N # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM +FE88;N # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM +FE89;N # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM +FE8A;N # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM +FE8B;N # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM +FE8C;N # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM +FE8D;N # ARABIC LETTER ALEF ISOLATED FORM +FE8E;N # ARABIC LETTER ALEF FINAL FORM +FE8F;N # ARABIC LETTER BEH ISOLATED FORM +FE90;N # ARABIC LETTER BEH FINAL FORM +FE91;N # ARABIC LETTER BEH INITIAL FORM +FE92;N # ARABIC LETTER BEH MEDIAL FORM +FE93;N # ARABIC LETTER TEH MARBUTA ISOLATED FORM +FE94;N # ARABIC LETTER TEH MARBUTA FINAL FORM +FE95;N # ARABIC LETTER TEH ISOLATED FORM +FE96;N # ARABIC LETTER TEH FINAL FORM +FE97;N # ARABIC LETTER TEH INITIAL FORM +FE98;N # ARABIC LETTER TEH MEDIAL FORM +FE99;N # ARABIC LETTER THEH ISOLATED FORM +FE9A;N # ARABIC LETTER THEH FINAL FORM +FE9B;N # ARABIC LETTER THEH INITIAL FORM +FE9C;N # ARABIC LETTER THEH MEDIAL FORM +FE9D;N # ARABIC LETTER JEEM ISOLATED FORM +FE9E;N # ARABIC LETTER JEEM FINAL FORM +FE9F;N # ARABIC LETTER JEEM INITIAL FORM +FEA0;N # ARABIC LETTER JEEM MEDIAL FORM +FEA1;N # ARABIC LETTER HAH ISOLATED FORM +FEA2;N # ARABIC LETTER HAH FINAL FORM +FEA3;N # ARABIC LETTER HAH INITIAL FORM +FEA4;N # ARABIC LETTER HAH MEDIAL FORM +FEA5;N # ARABIC LETTER KHAH ISOLATED FORM +FEA6;N # ARABIC LETTER KHAH FINAL FORM +FEA7;N # ARABIC LETTER KHAH INITIAL FORM +FEA8;N # ARABIC LETTER KHAH MEDIAL FORM +FEA9;N # ARABIC LETTER DAL ISOLATED FORM +FEAA;N # ARABIC LETTER DAL FINAL FORM +FEAB;N # ARABIC LETTER THAL ISOLATED FORM +FEAC;N # ARABIC LETTER THAL FINAL FORM +FEAD;N # ARABIC LETTER REH ISOLATED FORM +FEAE;N # ARABIC LETTER REH FINAL FORM +FEAF;N # ARABIC LETTER ZAIN ISOLATED FORM +FEB0;N # ARABIC LETTER ZAIN FINAL FORM +FEB1;N # ARABIC LETTER SEEN ISOLATED FORM +FEB2;N # ARABIC LETTER SEEN FINAL FORM +FEB3;N # ARABIC LETTER SEEN INITIAL FORM +FEB4;N # ARABIC LETTER SEEN MEDIAL FORM +FEB5;N # ARABIC LETTER SHEEN ISOLATED FORM +FEB6;N # ARABIC LETTER SHEEN FINAL FORM +FEB7;N # ARABIC LETTER SHEEN INITIAL FORM +FEB8;N # ARABIC LETTER SHEEN MEDIAL FORM +FEB9;N # ARABIC LETTER SAD ISOLATED FORM +FEBA;N # ARABIC LETTER SAD FINAL FORM +FEBB;N # ARABIC LETTER SAD INITIAL FORM +FEBC;N # ARABIC LETTER SAD MEDIAL FORM +FEBD;N # ARABIC LETTER DAD ISOLATED FORM +FEBE;N # ARABIC LETTER DAD FINAL FORM +FEBF;N # ARABIC LETTER DAD INITIAL FORM +FEC0;N # ARABIC LETTER DAD MEDIAL FORM +FEC1;N # ARABIC LETTER TAH ISOLATED FORM +FEC2;N # ARABIC LETTER TAH FINAL FORM +FEC3;N # ARABIC LETTER TAH INITIAL FORM +FEC4;N # ARABIC LETTER TAH MEDIAL FORM +FEC5;N # ARABIC LETTER ZAH ISOLATED FORM +FEC6;N # ARABIC LETTER ZAH FINAL FORM +FEC7;N # ARABIC LETTER ZAH INITIAL FORM +FEC8;N # ARABIC LETTER ZAH MEDIAL FORM +FEC9;N # ARABIC LETTER AIN ISOLATED FORM +FECA;N # ARABIC LETTER AIN FINAL FORM +FECB;N # ARABIC LETTER AIN INITIAL FORM +FECC;N # ARABIC LETTER AIN MEDIAL FORM +FECD;N # ARABIC LETTER GHAIN ISOLATED FORM +FECE;N # ARABIC LETTER GHAIN FINAL FORM +FECF;N # ARABIC LETTER GHAIN INITIAL FORM +FED0;N # ARABIC LETTER GHAIN MEDIAL FORM +FED1;N # ARABIC LETTER FEH ISOLATED FORM +FED2;N # ARABIC LETTER FEH FINAL FORM +FED3;N # ARABIC LETTER FEH INITIAL FORM +FED4;N # ARABIC LETTER FEH MEDIAL FORM +FED5;N # ARABIC LETTER QAF ISOLATED FORM +FED6;N # ARABIC LETTER QAF FINAL FORM +FED7;N # ARABIC LETTER QAF INITIAL FORM +FED8;N # ARABIC LETTER QAF MEDIAL FORM +FED9;N # ARABIC LETTER KAF ISOLATED FORM +FEDA;N # ARABIC LETTER KAF FINAL FORM +FEDB;N # ARABIC LETTER KAF INITIAL FORM +FEDC;N # ARABIC LETTER KAF MEDIAL FORM +FEDD;N # ARABIC LETTER LAM ISOLATED FORM +FEDE;N # ARABIC LETTER LAM FINAL FORM +FEDF;N # ARABIC LETTER LAM INITIAL FORM +FEE0;N # ARABIC LETTER LAM MEDIAL FORM +FEE1;N # ARABIC LETTER MEEM ISOLATED FORM +FEE2;N # ARABIC LETTER MEEM FINAL FORM +FEE3;N # ARABIC LETTER MEEM INITIAL FORM +FEE4;N # ARABIC LETTER MEEM MEDIAL FORM +FEE5;N # ARABIC LETTER NOON ISOLATED FORM +FEE6;N # ARABIC LETTER NOON FINAL FORM +FEE7;N # ARABIC LETTER NOON INITIAL FORM +FEE8;N # ARABIC LETTER NOON MEDIAL FORM +FEE9;N # ARABIC LETTER HEH ISOLATED FORM +FEEA;N # ARABIC LETTER HEH FINAL FORM +FEEB;N # ARABIC LETTER HEH INITIAL FORM +FEEC;N # ARABIC LETTER HEH MEDIAL FORM +FEED;N # ARABIC LETTER WAW ISOLATED FORM +FEEE;N # ARABIC LETTER WAW FINAL FORM +FEEF;N # ARABIC LETTER ALEF MAKSURA ISOLATED FORM +FEF0;N # ARABIC LETTER ALEF MAKSURA FINAL FORM +FEF1;N # ARABIC LETTER YEH ISOLATED FORM +FEF2;N # ARABIC LETTER YEH FINAL FORM +FEF3;N # ARABIC LETTER YEH INITIAL FORM +FEF4;N # ARABIC LETTER YEH MEDIAL FORM +FEF5;N # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM +FEF6;N # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM +FEF7;N # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM +FEF8;N # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM +FEF9;N # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM +FEFA;N # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM +FEFB;N # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM +FEFC;N # ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FEFF;N # ZERO WIDTH NO-BREAK SPACE +FF01;F # FULLWIDTH EXCLAMATION MARK +FF02;F # FULLWIDTH QUOTATION MARK +FF03;F # FULLWIDTH NUMBER SIGN +FF04;F # FULLWIDTH DOLLAR SIGN +FF05;F # FULLWIDTH PERCENT SIGN +FF06;F # FULLWIDTH AMPERSAND +FF07;F # FULLWIDTH APOSTROPHE +FF08;F # FULLWIDTH LEFT PARENTHESIS +FF09;F # FULLWIDTH RIGHT PARENTHESIS +FF0A;F # FULLWIDTH ASTERISK +FF0B;F # FULLWIDTH PLUS SIGN +FF0C;F # FULLWIDTH COMMA +FF0D;F # FULLWIDTH HYPHEN-MINUS +FF0E;F # FULLWIDTH FULL STOP +FF0F;F # FULLWIDTH SOLIDUS +FF10;F # FULLWIDTH DIGIT ZERO +FF11;F # FULLWIDTH DIGIT ONE +FF12;F # FULLWIDTH DIGIT TWO +FF13;F # FULLWIDTH DIGIT THREE +FF14;F # FULLWIDTH DIGIT FOUR +FF15;F # FULLWIDTH DIGIT FIVE +FF16;F # FULLWIDTH DIGIT SIX +FF17;F # FULLWIDTH DIGIT SEVEN +FF18;F # FULLWIDTH DIGIT EIGHT +FF19;F # FULLWIDTH DIGIT NINE +FF1A;F # FULLWIDTH COLON +FF1B;F # FULLWIDTH SEMICOLON +FF1C;F # FULLWIDTH LESS-THAN SIGN +FF1D;F # FULLWIDTH EQUALS SIGN +FF1E;F # FULLWIDTH GREATER-THAN SIGN +FF1F;F # FULLWIDTH QUESTION MARK +FF20;F # FULLWIDTH COMMERCIAL AT +FF21;F # FULLWIDTH LATIN CAPITAL LETTER A +FF22;F # FULLWIDTH LATIN CAPITAL LETTER B +FF23;F # FULLWIDTH LATIN CAPITAL LETTER C +FF24;F # FULLWIDTH LATIN CAPITAL LETTER D +FF25;F # FULLWIDTH LATIN CAPITAL LETTER E +FF26;F # FULLWIDTH LATIN CAPITAL LETTER F +FF27;F # FULLWIDTH LATIN CAPITAL LETTER G +FF28;F # FULLWIDTH LATIN CAPITAL LETTER H +FF29;F # FULLWIDTH LATIN CAPITAL LETTER I +FF2A;F # FULLWIDTH LATIN CAPITAL LETTER J +FF2B;F # FULLWIDTH LATIN CAPITAL LETTER K +FF2C;F # FULLWIDTH LATIN CAPITAL LETTER L +FF2D;F # FULLWIDTH LATIN CAPITAL LETTER M +FF2E;F # FULLWIDTH LATIN CAPITAL LETTER N +FF2F;F # FULLWIDTH LATIN CAPITAL LETTER O +FF30;F # FULLWIDTH LATIN CAPITAL LETTER P +FF31;F # FULLWIDTH LATIN CAPITAL LETTER Q +FF32;F # FULLWIDTH LATIN CAPITAL LETTER R +FF33;F # FULLWIDTH LATIN CAPITAL LETTER S +FF34;F # FULLWIDTH LATIN CAPITAL LETTER T +FF35;F # FULLWIDTH LATIN CAPITAL LETTER U +FF36;F # FULLWIDTH LATIN CAPITAL LETTER V +FF37;F # FULLWIDTH LATIN CAPITAL LETTER W +FF38;F # FULLWIDTH LATIN CAPITAL LETTER X +FF39;F # FULLWIDTH LATIN CAPITAL LETTER Y +FF3A;F # FULLWIDTH LATIN CAPITAL LETTER Z +FF3B;F # FULLWIDTH LEFT SQUARE BRACKET +FF3C;F # FULLWIDTH REVERSE SOLIDUS +FF3D;F # FULLWIDTH RIGHT SQUARE BRACKET +FF3E;F # FULLWIDTH CIRCUMFLEX ACCENT +FF3F;F # FULLWIDTH LOW LINE +FF40;F # FULLWIDTH GRAVE ACCENT +FF41;F # FULLWIDTH LATIN SMALL LETTER A +FF42;F # FULLWIDTH LATIN SMALL LETTER B +FF43;F # FULLWIDTH LATIN SMALL LETTER C +FF44;F # FULLWIDTH LATIN SMALL LETTER D +FF45;F # FULLWIDTH LATIN SMALL LETTER E +FF46;F # FULLWIDTH LATIN SMALL LETTER F +FF47;F # FULLWIDTH LATIN SMALL LETTER G +FF48;F # FULLWIDTH LATIN SMALL LETTER H +FF49;F # FULLWIDTH LATIN SMALL LETTER I +FF4A;F # FULLWIDTH LATIN SMALL LETTER J +FF4B;F # FULLWIDTH LATIN SMALL LETTER K +FF4C;F # FULLWIDTH LATIN SMALL LETTER L +FF4D;F # FULLWIDTH LATIN SMALL LETTER M +FF4E;F # FULLWIDTH LATIN SMALL LETTER N +FF4F;F # FULLWIDTH LATIN SMALL LETTER O +FF50;F # FULLWIDTH LATIN SMALL LETTER P +FF51;F # FULLWIDTH LATIN SMALL LETTER Q +FF52;F # FULLWIDTH LATIN SMALL LETTER R +FF53;F # FULLWIDTH LATIN SMALL LETTER S +FF54;F # FULLWIDTH LATIN SMALL LETTER T +FF55;F # FULLWIDTH LATIN SMALL LETTER U +FF56;F # FULLWIDTH LATIN SMALL LETTER V +FF57;F # FULLWIDTH LATIN SMALL LETTER W +FF58;F # FULLWIDTH LATIN SMALL LETTER X +FF59;F # FULLWIDTH LATIN SMALL LETTER Y +FF5A;F # FULLWIDTH LATIN SMALL LETTER Z +FF5B;F # FULLWIDTH LEFT CURLY BRACKET +FF5C;F # FULLWIDTH VERTICAL LINE +FF5D;F # FULLWIDTH RIGHT CURLY BRACKET +FF5E;F # FULLWIDTH TILDE +FF5F;F # FULLWIDTH LEFT WHITE PARENTHESIS +FF60;F # FULLWIDTH RIGHT WHITE PARENTHESIS +FF61;H # HALFWIDTH IDEOGRAPHIC FULL STOP +FF62;H # HALFWIDTH LEFT CORNER BRACKET +FF63;H # HALFWIDTH RIGHT CORNER BRACKET +FF64;H # HALFWIDTH IDEOGRAPHIC COMMA +FF65;H # HALFWIDTH KATAKANA MIDDLE DOT +FF66;H # HALFWIDTH KATAKANA LETTER WO +FF67;H # HALFWIDTH KATAKANA LETTER SMALL A +FF68;H # HALFWIDTH KATAKANA LETTER SMALL I +FF69;H # HALFWIDTH KATAKANA LETTER SMALL U +FF6A;H # HALFWIDTH KATAKANA LETTER SMALL E +FF6B;H # HALFWIDTH KATAKANA LETTER SMALL O +FF6C;H # HALFWIDTH KATAKANA LETTER SMALL YA +FF6D;H # HALFWIDTH KATAKANA LETTER SMALL YU +FF6E;H # HALFWIDTH KATAKANA LETTER SMALL YO +FF6F;H # HALFWIDTH KATAKANA LETTER SMALL TU +FF70;H # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71;H # HALFWIDTH KATAKANA LETTER A +FF72;H # HALFWIDTH KATAKANA LETTER I +FF73;H # HALFWIDTH KATAKANA LETTER U +FF74;H # HALFWIDTH KATAKANA LETTER E +FF75;H # HALFWIDTH KATAKANA LETTER O +FF76;H # HALFWIDTH KATAKANA LETTER KA +FF77;H # HALFWIDTH KATAKANA LETTER KI +FF78;H # HALFWIDTH KATAKANA LETTER KU +FF79;H # HALFWIDTH KATAKANA LETTER KE +FF7A;H # HALFWIDTH KATAKANA LETTER KO +FF7B;H # HALFWIDTH KATAKANA LETTER SA +FF7C;H # HALFWIDTH KATAKANA LETTER SI +FF7D;H # HALFWIDTH KATAKANA LETTER SU +FF7E;H # HALFWIDTH KATAKANA LETTER SE +FF7F;H # HALFWIDTH KATAKANA LETTER SO +FF80;H # HALFWIDTH KATAKANA LETTER TA +FF81;H # HALFWIDTH KATAKANA LETTER TI +FF82;H # HALFWIDTH KATAKANA LETTER TU +FF83;H # HALFWIDTH KATAKANA LETTER TE +FF84;H # HALFWIDTH KATAKANA LETTER TO +FF85;H # HALFWIDTH KATAKANA LETTER NA +FF86;H # HALFWIDTH KATAKANA LETTER NI +FF87;H # HALFWIDTH KATAKANA LETTER NU +FF88;H # HALFWIDTH KATAKANA LETTER NE +FF89;H # HALFWIDTH KATAKANA LETTER NO +FF8A;H # HALFWIDTH KATAKANA LETTER HA +FF8B;H # HALFWIDTH KATAKANA LETTER HI +FF8C;H # HALFWIDTH KATAKANA LETTER HU +FF8D;H # HALFWIDTH KATAKANA LETTER HE +FF8E;H # HALFWIDTH KATAKANA LETTER HO +FF8F;H # HALFWIDTH KATAKANA LETTER MA +FF90;H # HALFWIDTH KATAKANA LETTER MI +FF91;H # HALFWIDTH KATAKANA LETTER MU +FF92;H # HALFWIDTH KATAKANA LETTER ME +FF93;H # HALFWIDTH KATAKANA LETTER MO +FF94;H # HALFWIDTH KATAKANA LETTER YA +FF95;H # HALFWIDTH KATAKANA LETTER YU +FF96;H # HALFWIDTH KATAKANA LETTER YO +FF97;H # HALFWIDTH KATAKANA LETTER RA +FF98;H # HALFWIDTH KATAKANA LETTER RI +FF99;H # HALFWIDTH KATAKANA LETTER RU +FF9A;H # HALFWIDTH KATAKANA LETTER RE +FF9B;H # HALFWIDTH KATAKANA LETTER RO +FF9C;H # HALFWIDTH KATAKANA LETTER WA +FF9D;H # HALFWIDTH KATAKANA LETTER N +FF9E;H # HALFWIDTH KATAKANA VOICED SOUND MARK +FF9F;H # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0;H # HALFWIDTH HANGUL FILLER +FFA1;H # HALFWIDTH HANGUL LETTER KIYEOK +FFA2;H # HALFWIDTH HANGUL LETTER SSANGKIYEOK +FFA3;H # HALFWIDTH HANGUL LETTER KIYEOK-SIOS +FFA4;H # HALFWIDTH HANGUL LETTER NIEUN +FFA5;H # HALFWIDTH HANGUL LETTER NIEUN-CIEUC +FFA6;H # HALFWIDTH HANGUL LETTER NIEUN-HIEUH +FFA7;H # HALFWIDTH HANGUL LETTER TIKEUT +FFA8;H # HALFWIDTH HANGUL LETTER SSANGTIKEUT +FFA9;H # HALFWIDTH HANGUL LETTER RIEUL +FFAA;H # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK +FFAB;H # HALFWIDTH HANGUL LETTER RIEUL-MIEUM +FFAC;H # HALFWIDTH HANGUL LETTER RIEUL-PIEUP +FFAD;H # HALFWIDTH HANGUL LETTER RIEUL-SIOS +FFAE;H # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH +FFAF;H # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH +FFB0;H # HALFWIDTH HANGUL LETTER RIEUL-HIEUH +FFB1;H # HALFWIDTH HANGUL LETTER MIEUM +FFB2;H # HALFWIDTH HANGUL LETTER PIEUP +FFB3;H # HALFWIDTH HANGUL LETTER SSANGPIEUP +FFB4;H # HALFWIDTH HANGUL LETTER PIEUP-SIOS +FFB5;H # HALFWIDTH HANGUL LETTER SIOS +FFB6;H # HALFWIDTH HANGUL LETTER SSANGSIOS +FFB7;H # HALFWIDTH HANGUL LETTER IEUNG +FFB8;H # HALFWIDTH HANGUL LETTER CIEUC +FFB9;H # HALFWIDTH HANGUL LETTER SSANGCIEUC +FFBA;H # HALFWIDTH HANGUL LETTER CHIEUCH +FFBB;H # HALFWIDTH HANGUL LETTER KHIEUKH +FFBC;H # HALFWIDTH HANGUL LETTER THIEUTH +FFBD;H # HALFWIDTH HANGUL LETTER PHIEUPH +FFBE;H # HALFWIDTH HANGUL LETTER HIEUH +FFC2;H # HALFWIDTH HANGUL LETTER A +FFC3;H # HALFWIDTH HANGUL LETTER AE +FFC4;H # HALFWIDTH HANGUL LETTER YA +FFC5;H # HALFWIDTH HANGUL LETTER YAE +FFC6;H # HALFWIDTH HANGUL LETTER EO +FFC7;H # HALFWIDTH HANGUL LETTER E +FFCA;H # HALFWIDTH HANGUL LETTER YEO +FFCB;H # HALFWIDTH HANGUL LETTER YE +FFCC;H # HALFWIDTH HANGUL LETTER O +FFCD;H # HALFWIDTH HANGUL LETTER WA +FFCE;H # HALFWIDTH HANGUL LETTER WAE +FFCF;H # HALFWIDTH HANGUL LETTER OE +FFD2;H # HALFWIDTH HANGUL LETTER YO +FFD3;H # HALFWIDTH HANGUL LETTER U +FFD4;H # HALFWIDTH HANGUL LETTER WEO +FFD5;H # HALFWIDTH HANGUL LETTER WE +FFD6;H # HALFWIDTH HANGUL LETTER WI +FFD7;H # HALFWIDTH HANGUL LETTER YU +FFDA;H # HALFWIDTH HANGUL LETTER EU +FFDB;H # HALFWIDTH HANGUL LETTER YI +FFDC;H # HALFWIDTH HANGUL LETTER I +FFE0;F # FULLWIDTH CENT SIGN +FFE1;F # FULLWIDTH POUND SIGN +FFE2;F # FULLWIDTH NOT SIGN +FFE3;F # FULLWIDTH MACRON +FFE4;F # FULLWIDTH BROKEN BAR +FFE5;F # FULLWIDTH YEN SIGN +FFE6;F # FULLWIDTH WON SIGN +FFE8;H # HALFWIDTH FORMS LIGHT VERTICAL +FFE9;H # HALFWIDTH LEFTWARDS ARROW +FFEA;H # HALFWIDTH UPWARDS ARROW +FFEB;H # HALFWIDTH RIGHTWARDS ARROW +FFEC;H # HALFWIDTH DOWNWARDS ARROW +FFED;H # HALFWIDTH BLACK SQUARE +FFEE;H # HALFWIDTH WHITE CIRCLE +FFF9;N # INTERLINEAR ANNOTATION ANCHOR +FFFA;N # INTERLINEAR ANNOTATION SEPARATOR +FFFB;N # INTERLINEAR ANNOTATION TERMINATOR +FFFC;N # OBJECT REPLACEMENT CHARACTER +FFFD;A # REPLACEMENT CHARACTER +10000;N # LINEAR B SYLLABLE B008 A +10001;N # LINEAR B SYLLABLE B038 E +10002;N # LINEAR B SYLLABLE B028 I +10003;N # LINEAR B SYLLABLE B061 O +10004;N # LINEAR B SYLLABLE B010 U +10005;N # LINEAR B SYLLABLE B001 DA +10006;N # LINEAR B SYLLABLE B045 DE +10007;N # LINEAR B SYLLABLE B007 DI +10008;N # LINEAR B SYLLABLE B014 DO +10009;N # LINEAR B SYLLABLE B051 DU +1000A;N # LINEAR B SYLLABLE B057 JA +1000B;N # LINEAR B SYLLABLE B046 JE +1000D;N # LINEAR B SYLLABLE B036 JO +1000E;N # LINEAR B SYLLABLE B065 JU +1000F;N # LINEAR B SYLLABLE B077 KA +10010;N # LINEAR B SYLLABLE B044 KE +10011;N # LINEAR B SYLLABLE B067 KI +10012;N # LINEAR B SYLLABLE B070 KO +10013;N # LINEAR B SYLLABLE B081 KU +10014;N # LINEAR B SYLLABLE B080 MA +10015;N # LINEAR B SYLLABLE B013 ME +10016;N # LINEAR B SYLLABLE B073 MI +10017;N # LINEAR B SYLLABLE B015 MO +10018;N # LINEAR B SYLLABLE B023 MU +10019;N # LINEAR B SYLLABLE B006 NA +1001A;N # LINEAR B SYLLABLE B024 NE +1001B;N # LINEAR B SYLLABLE B030 NI +1001C;N # LINEAR B SYLLABLE B052 NO +1001D;N # LINEAR B SYLLABLE B055 NU +1001E;N # LINEAR B SYLLABLE B003 PA +1001F;N # LINEAR B SYLLABLE B072 PE +10020;N # LINEAR B SYLLABLE B039 PI +10021;N # LINEAR B SYLLABLE B011 PO +10022;N # LINEAR B SYLLABLE B050 PU +10023;N # LINEAR B SYLLABLE B016 QA +10024;N # LINEAR B SYLLABLE B078 QE +10025;N # LINEAR B SYLLABLE B021 QI +10026;N # LINEAR B SYLLABLE B032 QO +10028;N # LINEAR B SYLLABLE B060 RA +10029;N # LINEAR B SYLLABLE B027 RE +1002A;N # LINEAR B SYLLABLE B053 RI +1002B;N # LINEAR B SYLLABLE B002 RO +1002C;N # LINEAR B SYLLABLE B026 RU +1002D;N # LINEAR B SYLLABLE B031 SA +1002E;N # LINEAR B SYLLABLE B009 SE +1002F;N # LINEAR B SYLLABLE B041 SI +10030;N # LINEAR B SYLLABLE B012 SO +10031;N # LINEAR B SYLLABLE B058 SU +10032;N # LINEAR B SYLLABLE B059 TA +10033;N # LINEAR B SYLLABLE B004 TE +10034;N # LINEAR B SYLLABLE B037 TI +10035;N # LINEAR B SYLLABLE B005 TO +10036;N # LINEAR B SYLLABLE B069 TU +10037;N # LINEAR B SYLLABLE B054 WA +10038;N # LINEAR B SYLLABLE B075 WE +10039;N # LINEAR B SYLLABLE B040 WI +1003A;N # LINEAR B SYLLABLE B042 WO +1003C;N # LINEAR B SYLLABLE B017 ZA +1003D;N # LINEAR B SYLLABLE B074 ZE +1003F;N # LINEAR B SYLLABLE B020 ZO +10040;N # LINEAR B SYLLABLE B025 A2 +10041;N # LINEAR B SYLLABLE B043 A3 +10042;N # LINEAR B SYLLABLE B085 AU +10043;N # LINEAR B SYLLABLE B071 DWE +10044;N # LINEAR B SYLLABLE B090 DWO +10045;N # LINEAR B SYLLABLE B048 NWA +10046;N # LINEAR B SYLLABLE B029 PU2 +10047;N # LINEAR B SYLLABLE B062 PTE +10048;N # LINEAR B SYLLABLE B076 RA2 +10049;N # LINEAR B SYLLABLE B033 RA3 +1004A;N # LINEAR B SYLLABLE B068 RO2 +1004B;N # LINEAR B SYLLABLE B066 TA2 +1004C;N # LINEAR B SYLLABLE B087 TWE +1004D;N # LINEAR B SYLLABLE B091 TWO +10050;N # LINEAR B SYMBOL B018 +10051;N # LINEAR B SYMBOL B019 +10052;N # LINEAR B SYMBOL B022 +10053;N # LINEAR B SYMBOL B034 +10054;N # LINEAR B SYMBOL B047 +10055;N # LINEAR B SYMBOL B049 +10056;N # LINEAR B SYMBOL B056 +10057;N # LINEAR B SYMBOL B063 +10058;N # LINEAR B SYMBOL B064 +10059;N # LINEAR B SYMBOL B079 +1005A;N # LINEAR B SYMBOL B082 +1005B;N # LINEAR B SYMBOL B083 +1005C;N # LINEAR B SYMBOL B086 +1005D;N # LINEAR B SYMBOL B089 +10080;N # LINEAR B IDEOGRAM B100 MAN +10081;N # LINEAR B IDEOGRAM B102 WOMAN +10082;N # LINEAR B IDEOGRAM B104 DEER +10083;N # LINEAR B IDEOGRAM B105 EQUID +10084;N # LINEAR B IDEOGRAM B105F MARE +10085;N # LINEAR B IDEOGRAM B105M STALLION +10086;N # LINEAR B IDEOGRAM B106F EWE +10087;N # LINEAR B IDEOGRAM B106M RAM +10088;N # LINEAR B IDEOGRAM B107F SHE-GOAT +10089;N # LINEAR B IDEOGRAM B107M HE-GOAT +1008A;N # LINEAR B IDEOGRAM B108F SOW +1008B;N # LINEAR B IDEOGRAM B108M BOAR +1008C;N # LINEAR B IDEOGRAM B109F COW +1008D;N # LINEAR B IDEOGRAM B109M BULL +1008E;N # LINEAR B IDEOGRAM B120 WHEAT +1008F;N # LINEAR B IDEOGRAM B121 BARLEY +10090;N # LINEAR B IDEOGRAM B122 OLIVE +10091;N # LINEAR B IDEOGRAM B123 SPICE +10092;N # LINEAR B IDEOGRAM B125 CYPERUS +10093;N # LINEAR B MONOGRAM B127 KAPO +10094;N # LINEAR B MONOGRAM B128 KANAKO +10095;N # LINEAR B IDEOGRAM B130 OIL +10096;N # LINEAR B IDEOGRAM B131 WINE +10097;N # LINEAR B IDEOGRAM B132 +10098;N # LINEAR B MONOGRAM B133 AREPA +10099;N # LINEAR B MONOGRAM B135 MERI +1009A;N # LINEAR B IDEOGRAM B140 BRONZE +1009B;N # LINEAR B IDEOGRAM B141 GOLD +1009C;N # LINEAR B IDEOGRAM B142 +1009D;N # LINEAR B IDEOGRAM B145 WOOL +1009E;N # LINEAR B IDEOGRAM B146 +1009F;N # LINEAR B IDEOGRAM B150 +100A0;N # LINEAR B IDEOGRAM B151 HORN +100A1;N # LINEAR B IDEOGRAM B152 +100A2;N # LINEAR B IDEOGRAM B153 +100A3;N # LINEAR B IDEOGRAM B154 +100A4;N # LINEAR B MONOGRAM B156 TURO2 +100A5;N # LINEAR B IDEOGRAM B157 +100A6;N # LINEAR B IDEOGRAM B158 +100A7;N # LINEAR B IDEOGRAM B159 CLOTH +100A8;N # LINEAR B IDEOGRAM B160 +100A9;N # LINEAR B IDEOGRAM B161 +100AA;N # LINEAR B IDEOGRAM B162 GARMENT +100AB;N # LINEAR B IDEOGRAM B163 ARMOUR +100AC;N # LINEAR B IDEOGRAM B164 +100AD;N # LINEAR B IDEOGRAM B165 +100AE;N # LINEAR B IDEOGRAM B166 +100AF;N # LINEAR B IDEOGRAM B167 +100B0;N # LINEAR B IDEOGRAM B168 +100B1;N # LINEAR B IDEOGRAM B169 +100B2;N # LINEAR B IDEOGRAM B170 +100B3;N # LINEAR B IDEOGRAM B171 +100B4;N # LINEAR B IDEOGRAM B172 +100B5;N # LINEAR B IDEOGRAM B173 MONTH +100B6;N # LINEAR B IDEOGRAM B174 +100B7;N # LINEAR B IDEOGRAM B176 TREE +100B8;N # LINEAR B IDEOGRAM B177 +100B9;N # LINEAR B IDEOGRAM B178 +100BA;N # LINEAR B IDEOGRAM B179 +100BB;N # LINEAR B IDEOGRAM B180 +100BC;N # LINEAR B IDEOGRAM B181 +100BD;N # LINEAR B IDEOGRAM B182 +100BE;N # LINEAR B IDEOGRAM B183 +100BF;N # LINEAR B IDEOGRAM B184 +100C0;N # LINEAR B IDEOGRAM B185 +100C1;N # LINEAR B IDEOGRAM B189 +100C2;N # LINEAR B IDEOGRAM B190 +100C3;N # LINEAR B IDEOGRAM B191 HELMET +100C4;N # LINEAR B IDEOGRAM B220 FOOTSTOOL +100C5;N # LINEAR B IDEOGRAM B225 BATHTUB +100C6;N # LINEAR B IDEOGRAM B230 SPEAR +100C7;N # LINEAR B IDEOGRAM B231 ARROW +100C8;N # LINEAR B IDEOGRAM B232 +100C9;N # LINEAR B IDEOGRAM B233 SWORD +100CA;N # LINEAR B IDEOGRAM B234 +100CB;N # LINEAR B IDEOGRAM B236 +100CC;N # LINEAR B IDEOGRAM B240 WHEELED CHARIOT +100CD;N # LINEAR B IDEOGRAM B241 CHARIOT +100CE;N # LINEAR B IDEOGRAM B242 CHARIOT FRAME +100CF;N # LINEAR B IDEOGRAM B243 WHEEL +100D0;N # LINEAR B IDEOGRAM B245 +100D1;N # LINEAR B IDEOGRAM B246 +100D2;N # LINEAR B MONOGRAM B247 DIPTE +100D3;N # LINEAR B IDEOGRAM B248 +100D4;N # LINEAR B IDEOGRAM B249 +100D5;N # LINEAR B IDEOGRAM B251 +100D6;N # LINEAR B IDEOGRAM B252 +100D7;N # LINEAR B IDEOGRAM B253 +100D8;N # LINEAR B IDEOGRAM B254 DART +100D9;N # LINEAR B IDEOGRAM B255 +100DA;N # LINEAR B IDEOGRAM B256 +100DB;N # LINEAR B IDEOGRAM B257 +100DC;N # LINEAR B IDEOGRAM B258 +100DD;N # LINEAR B IDEOGRAM B259 +100DE;N # LINEAR B IDEOGRAM VESSEL B155 +100DF;N # LINEAR B IDEOGRAM VESSEL B200 +100E0;N # LINEAR B IDEOGRAM VESSEL B201 +100E1;N # LINEAR B IDEOGRAM VESSEL B202 +100E2;N # LINEAR B IDEOGRAM VESSEL B203 +100E3;N # LINEAR B IDEOGRAM VESSEL B204 +100E4;N # LINEAR B IDEOGRAM VESSEL B205 +100E5;N # LINEAR B IDEOGRAM VESSEL B206 +100E6;N # LINEAR B IDEOGRAM VESSEL B207 +100E7;N # LINEAR B IDEOGRAM VESSEL B208 +100E8;N # LINEAR B IDEOGRAM VESSEL B209 +100E9;N # LINEAR B IDEOGRAM VESSEL B210 +100EA;N # LINEAR B IDEOGRAM VESSEL B211 +100EB;N # LINEAR B IDEOGRAM VESSEL B212 +100EC;N # LINEAR B IDEOGRAM VESSEL B213 +100ED;N # LINEAR B IDEOGRAM VESSEL B214 +100EE;N # LINEAR B IDEOGRAM VESSEL B215 +100EF;N # LINEAR B IDEOGRAM VESSEL B216 +100F0;N # LINEAR B IDEOGRAM VESSEL B217 +100F1;N # LINEAR B IDEOGRAM VESSEL B218 +100F2;N # LINEAR B IDEOGRAM VESSEL B219 +100F3;N # LINEAR B IDEOGRAM VESSEL B221 +100F4;N # LINEAR B IDEOGRAM VESSEL B222 +100F5;N # LINEAR B IDEOGRAM VESSEL B226 +100F6;N # LINEAR B IDEOGRAM VESSEL B227 +100F7;N # LINEAR B IDEOGRAM VESSEL B228 +100F8;N # LINEAR B IDEOGRAM VESSEL B229 +100F9;N # LINEAR B IDEOGRAM VESSEL B250 +100FA;N # LINEAR B IDEOGRAM VESSEL B305 +10100;N # AEGEAN WORD SEPARATOR LINE +10101;N # AEGEAN WORD SEPARATOR DOT +10102;N # AEGEAN CHECK MARK +10107;N # AEGEAN NUMBER ONE +10108;N # AEGEAN NUMBER TWO +10109;N # AEGEAN NUMBER THREE +1010A;N # AEGEAN NUMBER FOUR +1010B;N # AEGEAN NUMBER FIVE +1010C;N # AEGEAN NUMBER SIX +1010D;N # AEGEAN NUMBER SEVEN +1010E;N # AEGEAN NUMBER EIGHT +1010F;N # AEGEAN NUMBER NINE +10110;N # AEGEAN NUMBER TEN +10111;N # AEGEAN NUMBER TWENTY +10112;N # AEGEAN NUMBER THIRTY +10113;N # AEGEAN NUMBER FORTY +10114;N # AEGEAN NUMBER FIFTY +10115;N # AEGEAN NUMBER SIXTY +10116;N # AEGEAN NUMBER SEVENTY +10117;N # AEGEAN NUMBER EIGHTY +10118;N # AEGEAN NUMBER NINETY +10119;N # AEGEAN NUMBER ONE HUNDRED +1011A;N # AEGEAN NUMBER TWO HUNDRED +1011B;N # AEGEAN NUMBER THREE HUNDRED +1011C;N # AEGEAN NUMBER FOUR HUNDRED +1011D;N # AEGEAN NUMBER FIVE HUNDRED +1011E;N # AEGEAN NUMBER SIX HUNDRED +1011F;N # AEGEAN NUMBER SEVEN HUNDRED +10120;N # AEGEAN NUMBER EIGHT HUNDRED +10121;N # AEGEAN NUMBER NINE HUNDRED +10122;N # AEGEAN NUMBER ONE THOUSAND +10123;N # AEGEAN NUMBER TWO THOUSAND +10124;N # AEGEAN NUMBER THREE THOUSAND +10125;N # AEGEAN NUMBER FOUR THOUSAND +10126;N # AEGEAN NUMBER FIVE THOUSAND +10127;N # AEGEAN NUMBER SIX THOUSAND +10128;N # AEGEAN NUMBER SEVEN THOUSAND +10129;N # AEGEAN NUMBER EIGHT THOUSAND +1012A;N # AEGEAN NUMBER NINE THOUSAND +1012B;N # AEGEAN NUMBER TEN THOUSAND +1012C;N # AEGEAN NUMBER TWENTY THOUSAND +1012D;N # AEGEAN NUMBER THIRTY THOUSAND +1012E;N # AEGEAN NUMBER FORTY THOUSAND +1012F;N # AEGEAN NUMBER FIFTY THOUSAND +10130;N # AEGEAN NUMBER SIXTY THOUSAND +10131;N # AEGEAN NUMBER SEVENTY THOUSAND +10132;N # AEGEAN NUMBER EIGHTY THOUSAND +10133;N # AEGEAN NUMBER NINETY THOUSAND +10137;N # AEGEAN WEIGHT BASE UNIT +10138;N # AEGEAN WEIGHT FIRST SUBUNIT +10139;N # AEGEAN WEIGHT SECOND SUBUNIT +1013A;N # AEGEAN WEIGHT THIRD SUBUNIT +1013B;N # AEGEAN WEIGHT FOURTH SUBUNIT +1013C;N # AEGEAN DRY MEASURE FIRST SUBUNIT +1013D;N # AEGEAN LIQUID MEASURE FIRST SUBUNIT +1013E;N # AEGEAN MEASURE SECOND SUBUNIT +1013F;N # AEGEAN MEASURE THIRD SUBUNIT +10140;N # GREEK ACROPHONIC ATTIC ONE QUARTER +10141;N # GREEK ACROPHONIC ATTIC ONE HALF +10142;N # GREEK ACROPHONIC ATTIC ONE DRACHMA +10143;N # GREEK ACROPHONIC ATTIC FIVE +10144;N # GREEK ACROPHONIC ATTIC FIFTY +10145;N # GREEK ACROPHONIC ATTIC FIVE HUNDRED +10146;N # GREEK ACROPHONIC ATTIC FIVE THOUSAND +10147;N # GREEK ACROPHONIC ATTIC FIFTY THOUSAND +10148;N # GREEK ACROPHONIC ATTIC FIVE TALENTS +10149;N # GREEK ACROPHONIC ATTIC TEN TALENTS +1014A;N # GREEK ACROPHONIC ATTIC FIFTY TALENTS +1014B;N # GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS +1014C;N # GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS +1014D;N # GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS +1014E;N # GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS +1014F;N # GREEK ACROPHONIC ATTIC FIVE STATERS +10150;N # GREEK ACROPHONIC ATTIC TEN STATERS +10151;N # GREEK ACROPHONIC ATTIC FIFTY STATERS +10152;N # GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS +10153;N # GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS +10154;N # GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS +10155;N # GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS +10156;N # GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS +10157;N # GREEK ACROPHONIC ATTIC TEN MNAS +10158;N # GREEK ACROPHONIC HERAEUM ONE PLETHRON +10159;N # GREEK ACROPHONIC THESPIAN ONE +1015A;N # GREEK ACROPHONIC HERMIONIAN ONE +1015B;N # GREEK ACROPHONIC EPIDAUREAN TWO +1015C;N # GREEK ACROPHONIC THESPIAN TWO +1015D;N # GREEK ACROPHONIC CYRENAIC TWO DRACHMAS +1015E;N # GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS +1015F;N # GREEK ACROPHONIC TROEZENIAN FIVE +10160;N # GREEK ACROPHONIC TROEZENIAN TEN +10161;N # GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM +10162;N # GREEK ACROPHONIC HERMIONIAN TEN +10163;N # GREEK ACROPHONIC MESSENIAN TEN +10164;N # GREEK ACROPHONIC THESPIAN TEN +10165;N # GREEK ACROPHONIC THESPIAN THIRTY +10166;N # GREEK ACROPHONIC TROEZENIAN FIFTY +10167;N # GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM +10168;N # GREEK ACROPHONIC HERMIONIAN FIFTY +10169;N # GREEK ACROPHONIC THESPIAN FIFTY +1016A;N # GREEK ACROPHONIC THESPIAN ONE HUNDRED +1016B;N # GREEK ACROPHONIC THESPIAN THREE HUNDRED +1016C;N # GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED +1016D;N # GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED +1016E;N # GREEK ACROPHONIC THESPIAN FIVE HUNDRED +1016F;N # GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED +10170;N # GREEK ACROPHONIC NAXIAN FIVE HUNDRED +10171;N # GREEK ACROPHONIC THESPIAN ONE THOUSAND +10172;N # GREEK ACROPHONIC THESPIAN FIVE THOUSAND +10173;N # GREEK ACROPHONIC DELPHIC FIVE MNAS +10174;N # GREEK ACROPHONIC STRATIAN FIFTY MNAS +10175;N # GREEK ONE HALF SIGN +10176;N # GREEK ONE HALF SIGN ALTERNATE FORM +10177;N # GREEK TWO THIRDS SIGN +10178;N # GREEK THREE QUARTERS SIGN +10179;N # GREEK YEAR SIGN +1017A;N # GREEK TALENT SIGN +1017B;N # GREEK DRACHMA SIGN +1017C;N # GREEK OBOL SIGN +1017D;N # GREEK TWO OBOLS SIGN +1017E;N # GREEK THREE OBOLS SIGN +1017F;N # GREEK FOUR OBOLS SIGN +10180;N # GREEK FIVE OBOLS SIGN +10181;N # GREEK METRETES SIGN +10182;N # GREEK KYATHOS BASE SIGN +10183;N # GREEK LITRA SIGN +10184;N # GREEK OUNKIA SIGN +10185;N # GREEK XESTES SIGN +10186;N # GREEK ARTABE SIGN +10187;N # GREEK AROURA SIGN +10188;N # GREEK GRAMMA SIGN +10189;N # GREEK TRYBLION BASE SIGN +1018A;N # GREEK ZERO SIGN +10300;N # OLD ITALIC LETTER A +10301;N # OLD ITALIC LETTER BE +10302;N # OLD ITALIC LETTER KE +10303;N # OLD ITALIC LETTER DE +10304;N # OLD ITALIC LETTER E +10305;N # OLD ITALIC LETTER VE +10306;N # OLD ITALIC LETTER ZE +10307;N # OLD ITALIC LETTER HE +10308;N # OLD ITALIC LETTER THE +10309;N # OLD ITALIC LETTER I +1030A;N # OLD ITALIC LETTER KA +1030B;N # OLD ITALIC LETTER EL +1030C;N # OLD ITALIC LETTER EM +1030D;N # OLD ITALIC LETTER EN +1030E;N # OLD ITALIC LETTER ESH +1030F;N # OLD ITALIC LETTER O +10310;N # OLD ITALIC LETTER PE +10311;N # OLD ITALIC LETTER SHE +10312;N # OLD ITALIC LETTER KU +10313;N # OLD ITALIC LETTER ER +10314;N # OLD ITALIC LETTER ES +10315;N # OLD ITALIC LETTER TE +10316;N # OLD ITALIC LETTER U +10317;N # OLD ITALIC LETTER EKS +10318;N # OLD ITALIC LETTER PHE +10319;N # OLD ITALIC LETTER KHE +1031A;N # OLD ITALIC LETTER EF +1031B;N # OLD ITALIC LETTER ERS +1031C;N # OLD ITALIC LETTER CHE +1031D;N # OLD ITALIC LETTER II +1031E;N # OLD ITALIC LETTER UU +10320;N # OLD ITALIC NUMERAL ONE +10321;N # OLD ITALIC NUMERAL FIVE +10322;N # OLD ITALIC NUMERAL TEN +10323;N # OLD ITALIC NUMERAL FIFTY +10330;N # GOTHIC LETTER AHSA +10331;N # GOTHIC LETTER BAIRKAN +10332;N # GOTHIC LETTER GIBA +10333;N # GOTHIC LETTER DAGS +10334;N # GOTHIC LETTER AIHVUS +10335;N # GOTHIC LETTER QAIRTHRA +10336;N # GOTHIC LETTER IUJA +10337;N # GOTHIC LETTER HAGL +10338;N # GOTHIC LETTER THIUTH +10339;N # GOTHIC LETTER EIS +1033A;N # GOTHIC LETTER KUSMA +1033B;N # GOTHIC LETTER LAGUS +1033C;N # GOTHIC LETTER MANNA +1033D;N # GOTHIC LETTER NAUTHS +1033E;N # GOTHIC LETTER JER +1033F;N # GOTHIC LETTER URUS +10340;N # GOTHIC LETTER PAIRTHRA +10341;N # GOTHIC LETTER NINETY +10342;N # GOTHIC LETTER RAIDA +10343;N # GOTHIC LETTER SAUIL +10344;N # GOTHIC LETTER TEIWS +10345;N # GOTHIC LETTER WINJA +10346;N # GOTHIC LETTER FAIHU +10347;N # GOTHIC LETTER IGGWS +10348;N # GOTHIC LETTER HWAIR +10349;N # GOTHIC LETTER OTHAL +1034A;N # GOTHIC LETTER NINE HUNDRED +10380;N # UGARITIC LETTER ALPA +10381;N # UGARITIC LETTER BETA +10382;N # UGARITIC LETTER GAMLA +10383;N # UGARITIC LETTER KHA +10384;N # UGARITIC LETTER DELTA +10385;N # UGARITIC LETTER HO +10386;N # UGARITIC LETTER WO +10387;N # UGARITIC LETTER ZETA +10388;N # UGARITIC LETTER HOTA +10389;N # UGARITIC LETTER TET +1038A;N # UGARITIC LETTER YOD +1038B;N # UGARITIC LETTER KAF +1038C;N # UGARITIC LETTER SHIN +1038D;N # UGARITIC LETTER LAMDA +1038E;N # UGARITIC LETTER MEM +1038F;N # UGARITIC LETTER DHAL +10390;N # UGARITIC LETTER NUN +10391;N # UGARITIC LETTER ZU +10392;N # UGARITIC LETTER SAMKA +10393;N # UGARITIC LETTER AIN +10394;N # UGARITIC LETTER PU +10395;N # UGARITIC LETTER SADE +10396;N # UGARITIC LETTER QOPA +10397;N # UGARITIC LETTER RASHA +10398;N # UGARITIC LETTER THANNA +10399;N # UGARITIC LETTER GHAIN +1039A;N # UGARITIC LETTER TO +1039B;N # UGARITIC LETTER I +1039C;N # UGARITIC LETTER U +1039D;N # UGARITIC LETTER SSU +1039F;N # UGARITIC WORD DIVIDER +103A0;N # OLD PERSIAN SIGN A +103A1;N # OLD PERSIAN SIGN I +103A2;N # OLD PERSIAN SIGN U +103A3;N # OLD PERSIAN SIGN KA +103A4;N # OLD PERSIAN SIGN KU +103A5;N # OLD PERSIAN SIGN GA +103A6;N # OLD PERSIAN SIGN GU +103A7;N # OLD PERSIAN SIGN XA +103A8;N # OLD PERSIAN SIGN CA +103A9;N # OLD PERSIAN SIGN JA +103AA;N # OLD PERSIAN SIGN JI +103AB;N # OLD PERSIAN SIGN TA +103AC;N # OLD PERSIAN SIGN TU +103AD;N # OLD PERSIAN SIGN DA +103AE;N # OLD PERSIAN SIGN DI +103AF;N # OLD PERSIAN SIGN DU +103B0;N # OLD PERSIAN SIGN THA +103B1;N # OLD PERSIAN SIGN PA +103B2;N # OLD PERSIAN SIGN BA +103B3;N # OLD PERSIAN SIGN FA +103B4;N # OLD PERSIAN SIGN NA +103B5;N # OLD PERSIAN SIGN NU +103B6;N # OLD PERSIAN SIGN MA +103B7;N # OLD PERSIAN SIGN MI +103B8;N # OLD PERSIAN SIGN MU +103B9;N # OLD PERSIAN SIGN YA +103BA;N # OLD PERSIAN SIGN VA +103BB;N # OLD PERSIAN SIGN VI +103BC;N # OLD PERSIAN SIGN RA +103BD;N # OLD PERSIAN SIGN RU +103BE;N # OLD PERSIAN SIGN LA +103BF;N # OLD PERSIAN SIGN SA +103C0;N # OLD PERSIAN SIGN ZA +103C1;N # OLD PERSIAN SIGN SHA +103C2;N # OLD PERSIAN SIGN SSA +103C3;N # OLD PERSIAN SIGN HA +103C8;N # OLD PERSIAN SIGN AURAMAZDAA +103C9;N # OLD PERSIAN SIGN AURAMAZDAA-2 +103CA;N # OLD PERSIAN SIGN AURAMAZDAAHA +103CB;N # OLD PERSIAN SIGN XSHAAYATHIYA +103CC;N # OLD PERSIAN SIGN DAHYAAUSH +103CD;N # OLD PERSIAN SIGN DAHYAAUSH-2 +103CE;N # OLD PERSIAN SIGN BAGA +103CF;N # OLD PERSIAN SIGN BUUMISH +103D0;N # OLD PERSIAN WORD DIVIDER +103D1;N # OLD PERSIAN NUMBER ONE +103D2;N # OLD PERSIAN NUMBER TWO +103D3;N # OLD PERSIAN NUMBER TEN +103D4;N # OLD PERSIAN NUMBER TWENTY +103D5;N # OLD PERSIAN NUMBER HUNDRED +10400;N # DESERET CAPITAL LETTER LONG I +10401;N # DESERET CAPITAL LETTER LONG E +10402;N # DESERET CAPITAL LETTER LONG A +10403;N # DESERET CAPITAL LETTER LONG AH +10404;N # DESERET CAPITAL LETTER LONG O +10405;N # DESERET CAPITAL LETTER LONG OO +10406;N # DESERET CAPITAL LETTER SHORT I +10407;N # DESERET CAPITAL LETTER SHORT E +10408;N # DESERET CAPITAL LETTER SHORT A +10409;N # DESERET CAPITAL LETTER SHORT AH +1040A;N # DESERET CAPITAL LETTER SHORT O +1040B;N # DESERET CAPITAL LETTER SHORT OO +1040C;N # DESERET CAPITAL LETTER AY +1040D;N # DESERET CAPITAL LETTER OW +1040E;N # DESERET CAPITAL LETTER WU +1040F;N # DESERET CAPITAL LETTER YEE +10410;N # DESERET CAPITAL LETTER H +10411;N # DESERET CAPITAL LETTER PEE +10412;N # DESERET CAPITAL LETTER BEE +10413;N # DESERET CAPITAL LETTER TEE +10414;N # DESERET CAPITAL LETTER DEE +10415;N # DESERET CAPITAL LETTER CHEE +10416;N # DESERET CAPITAL LETTER JEE +10417;N # DESERET CAPITAL LETTER KAY +10418;N # DESERET CAPITAL LETTER GAY +10419;N # DESERET CAPITAL LETTER EF +1041A;N # DESERET CAPITAL LETTER VEE +1041B;N # DESERET CAPITAL LETTER ETH +1041C;N # DESERET CAPITAL LETTER THEE +1041D;N # DESERET CAPITAL LETTER ES +1041E;N # DESERET CAPITAL LETTER ZEE +1041F;N # DESERET CAPITAL LETTER ESH +10420;N # DESERET CAPITAL LETTER ZHEE +10421;N # DESERET CAPITAL LETTER ER +10422;N # DESERET CAPITAL LETTER EL +10423;N # DESERET CAPITAL LETTER EM +10424;N # DESERET CAPITAL LETTER EN +10425;N # DESERET CAPITAL LETTER ENG +10426;N # DESERET CAPITAL LETTER OI +10427;N # DESERET CAPITAL LETTER EW +10428;N # DESERET SMALL LETTER LONG I +10429;N # DESERET SMALL LETTER LONG E +1042A;N # DESERET SMALL LETTER LONG A +1042B;N # DESERET SMALL LETTER LONG AH +1042C;N # DESERET SMALL LETTER LONG O +1042D;N # DESERET SMALL LETTER LONG OO +1042E;N # DESERET SMALL LETTER SHORT I +1042F;N # DESERET SMALL LETTER SHORT E +10430;N # DESERET SMALL LETTER SHORT A +10431;N # DESERET SMALL LETTER SHORT AH +10432;N # DESERET SMALL LETTER SHORT O +10433;N # DESERET SMALL LETTER SHORT OO +10434;N # DESERET SMALL LETTER AY +10435;N # DESERET SMALL LETTER OW +10436;N # DESERET SMALL LETTER WU +10437;N # DESERET SMALL LETTER YEE +10438;N # DESERET SMALL LETTER H +10439;N # DESERET SMALL LETTER PEE +1043A;N # DESERET SMALL LETTER BEE +1043B;N # DESERET SMALL LETTER TEE +1043C;N # DESERET SMALL LETTER DEE +1043D;N # DESERET SMALL LETTER CHEE +1043E;N # DESERET SMALL LETTER JEE +1043F;N # DESERET SMALL LETTER KAY +10440;N # DESERET SMALL LETTER GAY +10441;N # DESERET SMALL LETTER EF +10442;N # DESERET SMALL LETTER VEE +10443;N # DESERET SMALL LETTER ETH +10444;N # DESERET SMALL LETTER THEE +10445;N # DESERET SMALL LETTER ES +10446;N # DESERET SMALL LETTER ZEE +10447;N # DESERET SMALL LETTER ESH +10448;N # DESERET SMALL LETTER ZHEE +10449;N # DESERET SMALL LETTER ER +1044A;N # DESERET SMALL LETTER EL +1044B;N # DESERET SMALL LETTER EM +1044C;N # DESERET SMALL LETTER EN +1044D;N # DESERET SMALL LETTER ENG +1044E;N # DESERET SMALL LETTER OI +1044F;N # DESERET SMALL LETTER EW +10450;N # SHAVIAN LETTER PEEP +10451;N # SHAVIAN LETTER TOT +10452;N # SHAVIAN LETTER KICK +10453;N # SHAVIAN LETTER FEE +10454;N # SHAVIAN LETTER THIGH +10455;N # SHAVIAN LETTER SO +10456;N # SHAVIAN LETTER SURE +10457;N # SHAVIAN LETTER CHURCH +10458;N # SHAVIAN LETTER YEA +10459;N # SHAVIAN LETTER HUNG +1045A;N # SHAVIAN LETTER BIB +1045B;N # SHAVIAN LETTER DEAD +1045C;N # SHAVIAN LETTER GAG +1045D;N # SHAVIAN LETTER VOW +1045E;N # SHAVIAN LETTER THEY +1045F;N # SHAVIAN LETTER ZOO +10460;N # SHAVIAN LETTER MEASURE +10461;N # SHAVIAN LETTER JUDGE +10462;N # SHAVIAN LETTER WOE +10463;N # SHAVIAN LETTER HA-HA +10464;N # SHAVIAN LETTER LOLL +10465;N # SHAVIAN LETTER MIME +10466;N # SHAVIAN LETTER IF +10467;N # SHAVIAN LETTER EGG +10468;N # SHAVIAN LETTER ASH +10469;N # SHAVIAN LETTER ADO +1046A;N # SHAVIAN LETTER ON +1046B;N # SHAVIAN LETTER WOOL +1046C;N # SHAVIAN LETTER OUT +1046D;N # SHAVIAN LETTER AH +1046E;N # SHAVIAN LETTER ROAR +1046F;N # SHAVIAN LETTER NUN +10470;N # SHAVIAN LETTER EAT +10471;N # SHAVIAN LETTER AGE +10472;N # SHAVIAN LETTER ICE +10473;N # SHAVIAN LETTER UP +10474;N # SHAVIAN LETTER OAK +10475;N # SHAVIAN LETTER OOZE +10476;N # SHAVIAN LETTER OIL +10477;N # SHAVIAN LETTER AWE +10478;N # SHAVIAN LETTER ARE +10479;N # SHAVIAN LETTER OR +1047A;N # SHAVIAN LETTER AIR +1047B;N # SHAVIAN LETTER ERR +1047C;N # SHAVIAN LETTER ARRAY +1047D;N # SHAVIAN LETTER EAR +1047E;N # SHAVIAN LETTER IAN +1047F;N # SHAVIAN LETTER YEW +10480;N # OSMANYA LETTER ALEF +10481;N # OSMANYA LETTER BA +10482;N # OSMANYA LETTER TA +10483;N # OSMANYA LETTER JA +10484;N # OSMANYA LETTER XA +10485;N # OSMANYA LETTER KHA +10486;N # OSMANYA LETTER DEEL +10487;N # OSMANYA LETTER RA +10488;N # OSMANYA LETTER SA +10489;N # OSMANYA LETTER SHIIN +1048A;N # OSMANYA LETTER DHA +1048B;N # OSMANYA LETTER CAYN +1048C;N # OSMANYA LETTER GA +1048D;N # OSMANYA LETTER FA +1048E;N # OSMANYA LETTER QAAF +1048F;N # OSMANYA LETTER KAAF +10490;N # OSMANYA LETTER LAAN +10491;N # OSMANYA LETTER MIIN +10492;N # OSMANYA LETTER NUUN +10493;N # OSMANYA LETTER WAW +10494;N # OSMANYA LETTER HA +10495;N # OSMANYA LETTER YA +10496;N # OSMANYA LETTER A +10497;N # OSMANYA LETTER E +10498;N # OSMANYA LETTER I +10499;N # OSMANYA LETTER O +1049A;N # OSMANYA LETTER U +1049B;N # OSMANYA LETTER AA +1049C;N # OSMANYA LETTER EE +1049D;N # OSMANYA LETTER OO +104A0;N # OSMANYA DIGIT ZERO +104A1;N # OSMANYA DIGIT ONE +104A2;N # OSMANYA DIGIT TWO +104A3;N # OSMANYA DIGIT THREE +104A4;N # OSMANYA DIGIT FOUR +104A5;N # OSMANYA DIGIT FIVE +104A6;N # OSMANYA DIGIT SIX +104A7;N # OSMANYA DIGIT SEVEN +104A8;N # OSMANYA DIGIT EIGHT +104A9;N # OSMANYA DIGIT NINE +10800;N # CYPRIOT SYLLABLE A +10801;N # CYPRIOT SYLLABLE E +10802;N # CYPRIOT SYLLABLE I +10803;N # CYPRIOT SYLLABLE O +10804;N # CYPRIOT SYLLABLE U +10805;N # CYPRIOT SYLLABLE JA +10808;N # CYPRIOT SYLLABLE JO +1080A;N # CYPRIOT SYLLABLE KA +1080B;N # CYPRIOT SYLLABLE KE +1080C;N # CYPRIOT SYLLABLE KI +1080D;N # CYPRIOT SYLLABLE KO +1080E;N # CYPRIOT SYLLABLE KU +1080F;N # CYPRIOT SYLLABLE LA +10810;N # CYPRIOT SYLLABLE LE +10811;N # CYPRIOT SYLLABLE LI +10812;N # CYPRIOT SYLLABLE LO +10813;N # CYPRIOT SYLLABLE LU +10814;N # CYPRIOT SYLLABLE MA +10815;N # CYPRIOT SYLLABLE ME +10816;N # CYPRIOT SYLLABLE MI +10817;N # CYPRIOT SYLLABLE MO +10818;N # CYPRIOT SYLLABLE MU +10819;N # CYPRIOT SYLLABLE NA +1081A;N # CYPRIOT SYLLABLE NE +1081B;N # CYPRIOT SYLLABLE NI +1081C;N # CYPRIOT SYLLABLE NO +1081D;N # CYPRIOT SYLLABLE NU +1081E;N # CYPRIOT SYLLABLE PA +1081F;N # CYPRIOT SYLLABLE PE +10820;N # CYPRIOT SYLLABLE PI +10821;N # CYPRIOT SYLLABLE PO +10822;N # CYPRIOT SYLLABLE PU +10823;N # CYPRIOT SYLLABLE RA +10824;N # CYPRIOT SYLLABLE RE +10825;N # CYPRIOT SYLLABLE RI +10826;N # CYPRIOT SYLLABLE RO +10827;N # CYPRIOT SYLLABLE RU +10828;N # CYPRIOT SYLLABLE SA +10829;N # CYPRIOT SYLLABLE SE +1082A;N # CYPRIOT SYLLABLE SI +1082B;N # CYPRIOT SYLLABLE SO +1082C;N # CYPRIOT SYLLABLE SU +1082D;N # CYPRIOT SYLLABLE TA +1082E;N # CYPRIOT SYLLABLE TE +1082F;N # CYPRIOT SYLLABLE TI +10830;N # CYPRIOT SYLLABLE TO +10831;N # CYPRIOT SYLLABLE TU +10832;N # CYPRIOT SYLLABLE WA +10833;N # CYPRIOT SYLLABLE WE +10834;N # CYPRIOT SYLLABLE WI +10835;N # CYPRIOT SYLLABLE WO +10837;N # CYPRIOT SYLLABLE XA +10838;N # CYPRIOT SYLLABLE XE +1083C;N # CYPRIOT SYLLABLE ZA +1083F;N # CYPRIOT SYLLABLE ZO +10A00;N # KHAROSHTHI LETTER A +10A01;N # KHAROSHTHI VOWEL SIGN I +10A02;N # KHAROSHTHI VOWEL SIGN U +10A03;N # KHAROSHTHI VOWEL SIGN VOCALIC R +10A05;N # KHAROSHTHI VOWEL SIGN E +10A06;N # KHAROSHTHI VOWEL SIGN O +10A0C;N # KHAROSHTHI VOWEL LENGTH MARK +10A0D;N # KHAROSHTHI SIGN DOUBLE RING BELOW +10A0E;N # KHAROSHTHI SIGN ANUSVARA +10A0F;N # KHAROSHTHI SIGN VISARGA +10A10;N # KHAROSHTHI LETTER KA +10A11;N # KHAROSHTHI LETTER KHA +10A12;N # KHAROSHTHI LETTER GA +10A13;N # KHAROSHTHI LETTER GHA +10A15;N # KHAROSHTHI LETTER CA +10A16;N # KHAROSHTHI LETTER CHA +10A17;N # KHAROSHTHI LETTER JA +10A19;N # KHAROSHTHI LETTER NYA +10A1A;N # KHAROSHTHI LETTER TTA +10A1B;N # KHAROSHTHI LETTER TTHA +10A1C;N # KHAROSHTHI LETTER DDA +10A1D;N # KHAROSHTHI LETTER DDHA +10A1E;N # KHAROSHTHI LETTER NNA +10A1F;N # KHAROSHTHI LETTER TA +10A20;N # KHAROSHTHI LETTER THA +10A21;N # KHAROSHTHI LETTER DA +10A22;N # KHAROSHTHI LETTER DHA +10A23;N # KHAROSHTHI LETTER NA +10A24;N # KHAROSHTHI LETTER PA +10A25;N # KHAROSHTHI LETTER PHA +10A26;N # KHAROSHTHI LETTER BA +10A27;N # KHAROSHTHI LETTER BHA +10A28;N # KHAROSHTHI LETTER MA +10A29;N # KHAROSHTHI LETTER YA +10A2A;N # KHAROSHTHI LETTER RA +10A2B;N # KHAROSHTHI LETTER LA +10A2C;N # KHAROSHTHI LETTER VA +10A2D;N # KHAROSHTHI LETTER SHA +10A2E;N # KHAROSHTHI LETTER SSA +10A2F;N # KHAROSHTHI LETTER SA +10A30;N # KHAROSHTHI LETTER ZA +10A31;N # KHAROSHTHI LETTER HA +10A32;N # KHAROSHTHI LETTER KKA +10A33;N # KHAROSHTHI LETTER TTTHA +10A38;N # KHAROSHTHI SIGN BAR ABOVE +10A39;N # KHAROSHTHI SIGN CAUDA +10A3A;N # KHAROSHTHI SIGN DOT BELOW +10A3F;N # KHAROSHTHI VIRAMA +10A40;N # KHAROSHTHI DIGIT ONE +10A41;N # KHAROSHTHI DIGIT TWO +10A42;N # KHAROSHTHI DIGIT THREE +10A43;N # KHAROSHTHI DIGIT FOUR +10A44;N # KHAROSHTHI NUMBER TEN +10A45;N # KHAROSHTHI NUMBER TWENTY +10A46;N # KHAROSHTHI NUMBER ONE HUNDRED +10A47;N # KHAROSHTHI NUMBER ONE THOUSAND +10A50;N # KHAROSHTHI PUNCTUATION DOT +10A51;N # KHAROSHTHI PUNCTUATION SMALL CIRCLE +10A52;N # KHAROSHTHI PUNCTUATION CIRCLE +10A53;N # KHAROSHTHI PUNCTUATION CRESCENT BAR +10A54;N # KHAROSHTHI PUNCTUATION MANGALAM +10A55;N # KHAROSHTHI PUNCTUATION LOTUS +10A56;N # KHAROSHTHI PUNCTUATION DANDA +10A57;N # KHAROSHTHI PUNCTUATION DOUBLE DANDA +10A58;N # KHAROSHTHI PUNCTUATION LINES +1D000;N # BYZANTINE MUSICAL SYMBOL PSILI +1D001;N # BYZANTINE MUSICAL SYMBOL DASEIA +1D002;N # BYZANTINE MUSICAL SYMBOL PERISPOMENI +1D003;N # BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON +1D004;N # BYZANTINE MUSICAL SYMBOL OXEIA DIPLI +1D005;N # BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON +1D006;N # BYZANTINE MUSICAL SYMBOL VAREIA DIPLI +1D007;N # BYZANTINE MUSICAL SYMBOL KATHISTI +1D008;N # BYZANTINE MUSICAL SYMBOL SYRMATIKI +1D009;N # BYZANTINE MUSICAL SYMBOL PARAKLITIKI +1D00A;N # BYZANTINE MUSICAL SYMBOL YPOKRISIS +1D00B;N # BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI +1D00C;N # BYZANTINE MUSICAL SYMBOL KREMASTI +1D00D;N # BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON +1D00E;N # BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON +1D00F;N # BYZANTINE MUSICAL SYMBOL TELEIA +1D010;N # BYZANTINE MUSICAL SYMBOL KENTIMATA +1D011;N # BYZANTINE MUSICAL SYMBOL APOSTROFOS +1D012;N # BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI +1D013;N # BYZANTINE MUSICAL SYMBOL SYNEVMA +1D014;N # BYZANTINE MUSICAL SYMBOL THITA +1D015;N # BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION +1D016;N # BYZANTINE MUSICAL SYMBOL GORGON ARCHAION +1D017;N # BYZANTINE MUSICAL SYMBOL PSILON +1D018;N # BYZANTINE MUSICAL SYMBOL CHAMILON +1D019;N # BYZANTINE MUSICAL SYMBOL VATHY +1D01A;N # BYZANTINE MUSICAL SYMBOL ISON ARCHAION +1D01B;N # BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION +1D01C;N # BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION +1D01D;N # BYZANTINE MUSICAL SYMBOL SAXIMATA +1D01E;N # BYZANTINE MUSICAL SYMBOL PARICHON +1D01F;N # BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA +1D020;N # BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION +1D021;N # BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION +1D022;N # BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION +1D023;N # BYZANTINE MUSICAL SYMBOL APOTHEMA +1D024;N # BYZANTINE MUSICAL SYMBOL KLASMA +1D025;N # BYZANTINE MUSICAL SYMBOL REVMA +1D026;N # BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION +1D027;N # BYZANTINE MUSICAL SYMBOL TINAGMA +1D028;N # BYZANTINE MUSICAL SYMBOL ANATRICHISMA +1D029;N # BYZANTINE MUSICAL SYMBOL SEISMA +1D02A;N # BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION +1D02B;N # BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU +1D02C;N # BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION +1D02D;N # BYZANTINE MUSICAL SYMBOL THEMA +1D02E;N # BYZANTINE MUSICAL SYMBOL LEMOI +1D02F;N # BYZANTINE MUSICAL SYMBOL DYO +1D030;N # BYZANTINE MUSICAL SYMBOL TRIA +1D031;N # BYZANTINE MUSICAL SYMBOL TESSERA +1D032;N # BYZANTINE MUSICAL SYMBOL KRATIMATA +1D033;N # BYZANTINE MUSICAL SYMBOL APESO EXO NEO +1D034;N # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION +1D035;N # BYZANTINE MUSICAL SYMBOL IMIFTHORA +1D036;N # BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION +1D037;N # BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON +1D038;N # BYZANTINE MUSICAL SYMBOL PELASTON +1D039;N # BYZANTINE MUSICAL SYMBOL PSIFISTON +1D03A;N # BYZANTINE MUSICAL SYMBOL KONTEVMA +1D03B;N # BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION +1D03C;N # BYZANTINE MUSICAL SYMBOL RAPISMA +1D03D;N # BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION +1D03E;N # BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION +1D03F;N # BYZANTINE MUSICAL SYMBOL ICHADIN +1D040;N # BYZANTINE MUSICAL SYMBOL NANA +1D041;N # BYZANTINE MUSICAL SYMBOL PETASMA +1D042;N # BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO +1D043;N # BYZANTINE MUSICAL SYMBOL TROMIKON ALLO +1D044;N # BYZANTINE MUSICAL SYMBOL STRAGGISMATA +1D045;N # BYZANTINE MUSICAL SYMBOL GRONTHISMATA +1D046;N # BYZANTINE MUSICAL SYMBOL ISON NEO +1D047;N # BYZANTINE MUSICAL SYMBOL OLIGON NEO +1D048;N # BYZANTINE MUSICAL SYMBOL OXEIA NEO +1D049;N # BYZANTINE MUSICAL SYMBOL PETASTI +1D04A;N # BYZANTINE MUSICAL SYMBOL KOUFISMA +1D04B;N # BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA +1D04C;N # BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA +1D04D;N # BYZANTINE MUSICAL SYMBOL PELASTON NEO +1D04E;N # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO +1D04F;N # BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO +1D050;N # BYZANTINE MUSICAL SYMBOL YPSILI +1D051;N # BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO +1D052;N # BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO +1D053;N # BYZANTINE MUSICAL SYMBOL YPORROI +1D054;N # BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON +1D055;N # BYZANTINE MUSICAL SYMBOL ELAFRON +1D056;N # BYZANTINE MUSICAL SYMBOL CHAMILI +1D057;N # BYZANTINE MUSICAL SYMBOL MIKRON ISON +1D058;N # BYZANTINE MUSICAL SYMBOL VAREIA NEO +1D059;N # BYZANTINE MUSICAL SYMBOL PIASMA NEO +1D05A;N # BYZANTINE MUSICAL SYMBOL PSIFISTON NEO +1D05B;N # BYZANTINE MUSICAL SYMBOL OMALON +1D05C;N # BYZANTINE MUSICAL SYMBOL ANTIKENOMA +1D05D;N # BYZANTINE MUSICAL SYMBOL LYGISMA +1D05E;N # BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO +1D05F;N # BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO +1D060;N # BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA +1D061;N # BYZANTINE MUSICAL SYMBOL KYLISMA +1D062;N # BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA +1D063;N # BYZANTINE MUSICAL SYMBOL TROMIKON NEO +1D064;N # BYZANTINE MUSICAL SYMBOL EKSTREPTON +1D065;N # BYZANTINE MUSICAL SYMBOL SYNAGMA NEO +1D066;N # BYZANTINE MUSICAL SYMBOL SYRMA +1D067;N # BYZANTINE MUSICAL SYMBOL CHOREVMA NEO +1D068;N # BYZANTINE MUSICAL SYMBOL EPEGERMA +1D069;N # BYZANTINE MUSICAL SYMBOL SEISMA NEO +1D06A;N # BYZANTINE MUSICAL SYMBOL XIRON KLASMA +1D06B;N # BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON +1D06C;N # BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA +1D06D;N # BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA +1D06E;N # BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA +1D06F;N # BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA +1D070;N # BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA +1D071;N # BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA +1D072;N # BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON +1D073;N # BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON +1D074;N # BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON +1D075;N # BYZANTINE MUSICAL SYMBOL OYRANISMA NEO +1D076;N # BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO +1D077;N # BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO +1D078;N # BYZANTINE MUSICAL SYMBOL THEMA APLOUN +1D079;N # BYZANTINE MUSICAL SYMBOL THES KAI APOTHES +1D07A;N # BYZANTINE MUSICAL SYMBOL KATAVASMA +1D07B;N # BYZANTINE MUSICAL SYMBOL ENDOFONON +1D07C;N # BYZANTINE MUSICAL SYMBOL YFEN KATO +1D07D;N # BYZANTINE MUSICAL SYMBOL YFEN ANO +1D07E;N # BYZANTINE MUSICAL SYMBOL STAVROS +1D07F;N # BYZANTINE MUSICAL SYMBOL KLASMA ANO +1D080;N # BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION +1D081;N # BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION +1D082;N # BYZANTINE MUSICAL SYMBOL KRATIMA ALLO +1D083;N # BYZANTINE MUSICAL SYMBOL KRATIMA NEO +1D084;N # BYZANTINE MUSICAL SYMBOL APODERMA NEO +1D085;N # BYZANTINE MUSICAL SYMBOL APLI +1D086;N # BYZANTINE MUSICAL SYMBOL DIPLI +1D087;N # BYZANTINE MUSICAL SYMBOL TRIPLI +1D088;N # BYZANTINE MUSICAL SYMBOL TETRAPLI +1D089;N # BYZANTINE MUSICAL SYMBOL KORONIS +1D08A;N # BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU +1D08B;N # BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON +1D08C;N # BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON +1D08D;N # BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON +1D08E;N # BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU +1D08F;N # BYZANTINE MUSICAL SYMBOL GORGON NEO ANO +1D090;N # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA +1D091;N # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA +1D092;N # BYZANTINE MUSICAL SYMBOL DIGORGON +1D093;N # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO +1D094;N # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO +1D095;N # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA +1D096;N # BYZANTINE MUSICAL SYMBOL TRIGORGON +1D097;N # BYZANTINE MUSICAL SYMBOL ARGON +1D098;N # BYZANTINE MUSICAL SYMBOL IMIDIARGON +1D099;N # BYZANTINE MUSICAL SYMBOL DIARGON +1D09A;N # BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI +1D09B;N # BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI +1D09C;N # BYZANTINE MUSICAL SYMBOL AGOGI ARGI +1D09D;N # BYZANTINE MUSICAL SYMBOL AGOGI METRIA +1D09E;N # BYZANTINE MUSICAL SYMBOL AGOGI MESI +1D09F;N # BYZANTINE MUSICAL SYMBOL AGOGI GORGI +1D0A0;N # BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI +1D0A1;N # BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI +1D0A2;N # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS +1D0A3;N # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS +1D0A4;N # BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS +1D0A5;N # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS +1D0A6;N # BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS +1D0A7;N # BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS +1D0A8;N # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS +1D0A9;N # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS +1D0AA;N # BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS +1D0AB;N # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS +1D0AC;N # BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS +1D0AD;N # BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS +1D0AE;N # BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS +1D0AF;N # BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS +1D0B0;N # BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS +1D0B1;N # BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS +1D0B2;N # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS +1D0B3;N # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS +1D0B4;N # BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN +1D0B5;N # BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN +1D0B6;N # BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU +1D0B7;N # BYZANTINE MUSICAL SYMBOL IMIFONON +1D0B8;N # BYZANTINE MUSICAL SYMBOL IMIFTHORON +1D0B9;N # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU +1D0BA;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA +1D0BB;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA +1D0BC;N # BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS +1D0BD;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI +1D0BE;N # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI +1D0BF;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE +1D0C0;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO +1D0C1;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO +1D0C2;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO +1D0C3;N # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS +1D0C4;N # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS +1D0C5;N # BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS +1D0C6;N # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI +1D0C7;N # BYZANTINE MUSICAL SYMBOL FTHORA NENANO +1D0C8;N # BYZANTINE MUSICAL SYMBOL CHROA ZYGOS +1D0C9;N # BYZANTINE MUSICAL SYMBOL CHROA KLITON +1D0CA;N # BYZANTINE MUSICAL SYMBOL CHROA SPATHI +1D0CB;N # BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION +1D0CC;N # BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA +1D0CD;N # BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION +1D0CE;N # BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION +1D0CF;N # BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION +1D0D0;N # BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA +1D0D1;N # BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA +1D0D2;N # BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA +1D0D3;N # BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA +1D0D4;N # BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA +1D0D5;N # BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA +1D0D6;N # BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA +1D0D7;N # BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA +1D0D8;N # BYZANTINE MUSICAL SYMBOL GENIKI DIESIS +1D0D9;N # BYZANTINE MUSICAL SYMBOL GENIKI YFESIS +1D0DA;N # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI +1D0DB;N # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI +1D0DC;N # BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI +1D0DD;N # BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS +1D0DE;N # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS +1D0DF;N # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU +1D0E0;N # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU +1D0E1;N # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU +1D0E2;N # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS +1D0E3;N # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU +1D0E4;N # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU +1D0E5;N # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU +1D0E6;N # BYZANTINE MUSICAL SYMBOL DIGRAMMA GG +1D0E7;N # BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU +1D0E8;N # BYZANTINE MUSICAL SYMBOL STIGMA +1D0E9;N # BYZANTINE MUSICAL SYMBOL ARKTIKO PA +1D0EA;N # BYZANTINE MUSICAL SYMBOL ARKTIKO VOU +1D0EB;N # BYZANTINE MUSICAL SYMBOL ARKTIKO GA +1D0EC;N # BYZANTINE MUSICAL SYMBOL ARKTIKO DI +1D0ED;N # BYZANTINE MUSICAL SYMBOL ARKTIKO KE +1D0EE;N # BYZANTINE MUSICAL SYMBOL ARKTIKO ZO +1D0EF;N # BYZANTINE MUSICAL SYMBOL ARKTIKO NI +1D0F0;N # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO +1D0F1;N # BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO +1D0F2;N # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO +1D0F3;N # BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO +1D0F4;N # BYZANTINE MUSICAL SYMBOL KLASMA KATO +1D0F5;N # BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100;N # MUSICAL SYMBOL SINGLE BARLINE +1D101;N # MUSICAL SYMBOL DOUBLE BARLINE +1D102;N # MUSICAL SYMBOL FINAL BARLINE +1D103;N # MUSICAL SYMBOL REVERSE FINAL BARLINE +1D104;N # MUSICAL SYMBOL DASHED BARLINE +1D105;N # MUSICAL SYMBOL SHORT BARLINE +1D106;N # MUSICAL SYMBOL LEFT REPEAT SIGN +1D107;N # MUSICAL SYMBOL RIGHT REPEAT SIGN +1D108;N # MUSICAL SYMBOL REPEAT DOTS +1D109;N # MUSICAL SYMBOL DAL SEGNO +1D10A;N # MUSICAL SYMBOL DA CAPO +1D10B;N # MUSICAL SYMBOL SEGNO +1D10C;N # MUSICAL SYMBOL CODA +1D10D;N # MUSICAL SYMBOL REPEATED FIGURE-1 +1D10E;N # MUSICAL SYMBOL REPEATED FIGURE-2 +1D10F;N # MUSICAL SYMBOL REPEATED FIGURE-3 +1D110;N # MUSICAL SYMBOL FERMATA +1D111;N # MUSICAL SYMBOL FERMATA BELOW +1D112;N # MUSICAL SYMBOL BREATH MARK +1D113;N # MUSICAL SYMBOL CAESURA +1D114;N # MUSICAL SYMBOL BRACE +1D115;N # MUSICAL SYMBOL BRACKET +1D116;N # MUSICAL SYMBOL ONE-LINE STAFF +1D117;N # MUSICAL SYMBOL TWO-LINE STAFF +1D118;N # MUSICAL SYMBOL THREE-LINE STAFF +1D119;N # MUSICAL SYMBOL FOUR-LINE STAFF +1D11A;N # MUSICAL SYMBOL FIVE-LINE STAFF +1D11B;N # MUSICAL SYMBOL SIX-LINE STAFF +1D11C;N # MUSICAL SYMBOL SIX-STRING FRETBOARD +1D11D;N # MUSICAL SYMBOL FOUR-STRING FRETBOARD +1D11E;N # MUSICAL SYMBOL G CLEF +1D11F;N # MUSICAL SYMBOL G CLEF OTTAVA ALTA +1D120;N # MUSICAL SYMBOL G CLEF OTTAVA BASSA +1D121;N # MUSICAL SYMBOL C CLEF +1D122;N # MUSICAL SYMBOL F CLEF +1D123;N # MUSICAL SYMBOL F CLEF OTTAVA ALTA +1D124;N # MUSICAL SYMBOL F CLEF OTTAVA BASSA +1D125;N # MUSICAL SYMBOL DRUM CLEF-1 +1D126;N # MUSICAL SYMBOL DRUM CLEF-2 +1D12A;N # MUSICAL SYMBOL DOUBLE SHARP +1D12B;N # MUSICAL SYMBOL DOUBLE FLAT +1D12C;N # MUSICAL SYMBOL FLAT UP +1D12D;N # MUSICAL SYMBOL FLAT DOWN +1D12E;N # MUSICAL SYMBOL NATURAL UP +1D12F;N # MUSICAL SYMBOL NATURAL DOWN +1D130;N # MUSICAL SYMBOL SHARP UP +1D131;N # MUSICAL SYMBOL SHARP DOWN +1D132;N # MUSICAL SYMBOL QUARTER TONE SHARP +1D133;N # MUSICAL SYMBOL QUARTER TONE FLAT +1D134;N # MUSICAL SYMBOL COMMON TIME +1D135;N # MUSICAL SYMBOL CUT TIME +1D136;N # MUSICAL SYMBOL OTTAVA ALTA +1D137;N # MUSICAL SYMBOL OTTAVA BASSA +1D138;N # MUSICAL SYMBOL QUINDICESIMA ALTA +1D139;N # MUSICAL SYMBOL QUINDICESIMA BASSA +1D13A;N # MUSICAL SYMBOL MULTI REST +1D13B;N # MUSICAL SYMBOL WHOLE REST +1D13C;N # MUSICAL SYMBOL HALF REST +1D13D;N # MUSICAL SYMBOL QUARTER REST +1D13E;N # MUSICAL SYMBOL EIGHTH REST +1D13F;N # MUSICAL SYMBOL SIXTEENTH REST +1D140;N # MUSICAL SYMBOL THIRTY-SECOND REST +1D141;N # MUSICAL SYMBOL SIXTY-FOURTH REST +1D142;N # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST +1D143;N # MUSICAL SYMBOL X NOTEHEAD +1D144;N # MUSICAL SYMBOL PLUS NOTEHEAD +1D145;N # MUSICAL SYMBOL CIRCLE X NOTEHEAD +1D146;N # MUSICAL SYMBOL SQUARE NOTEHEAD WHITE +1D147;N # MUSICAL SYMBOL SQUARE NOTEHEAD BLACK +1D148;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE +1D149;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK +1D14A;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE +1D14B;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK +1D14C;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE +1D14D;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK +1D14E;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE +1D14F;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK +1D150;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE +1D151;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK +1D152;N # MUSICAL SYMBOL MOON NOTEHEAD WHITE +1D153;N # MUSICAL SYMBOL MOON NOTEHEAD BLACK +1D154;N # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE +1D155;N # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK +1D156;N # MUSICAL SYMBOL PARENTHESIS NOTEHEAD +1D157;N # MUSICAL SYMBOL VOID NOTEHEAD +1D158;N # MUSICAL SYMBOL NOTEHEAD BLACK +1D159;N # MUSICAL SYMBOL NULL NOTEHEAD +1D15A;N # MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE +1D15B;N # MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK +1D15C;N # MUSICAL SYMBOL BREVE +1D15D;N # MUSICAL SYMBOL WHOLE NOTE +1D15E;N # MUSICAL SYMBOL HALF NOTE +1D15F;N # MUSICAL SYMBOL QUARTER NOTE +1D160;N # MUSICAL SYMBOL EIGHTH NOTE +1D161;N # MUSICAL SYMBOL SIXTEENTH NOTE +1D162;N # MUSICAL SYMBOL THIRTY-SECOND NOTE +1D163;N # MUSICAL SYMBOL SIXTY-FOURTH NOTE +1D164;N # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D165;N # MUSICAL SYMBOL COMBINING STEM +1D166;N # MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D167;N # MUSICAL SYMBOL COMBINING TREMOLO-1 +1D168;N # MUSICAL SYMBOL COMBINING TREMOLO-2 +1D169;N # MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16A;N # MUSICAL SYMBOL FINGERED TREMOLO-1 +1D16B;N # MUSICAL SYMBOL FINGERED TREMOLO-2 +1D16C;N # MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D;N # MUSICAL SYMBOL COMBINING AUGMENTATION DOT +1D16E;N # MUSICAL SYMBOL COMBINING FLAG-1 +1D16F;N # MUSICAL SYMBOL COMBINING FLAG-2 +1D170;N # MUSICAL SYMBOL COMBINING FLAG-3 +1D171;N # MUSICAL SYMBOL COMBINING FLAG-4 +1D172;N # MUSICAL SYMBOL COMBINING FLAG-5 +1D173;N # MUSICAL SYMBOL BEGIN BEAM +1D174;N # MUSICAL SYMBOL END BEAM +1D175;N # MUSICAL SYMBOL BEGIN TIE +1D176;N # MUSICAL SYMBOL END TIE +1D177;N # MUSICAL SYMBOL BEGIN SLUR +1D178;N # MUSICAL SYMBOL END SLUR +1D179;N # MUSICAL SYMBOL BEGIN PHRASE +1D17A;N # MUSICAL SYMBOL END PHRASE +1D17B;N # MUSICAL SYMBOL COMBINING ACCENT +1D17C;N # MUSICAL SYMBOL COMBINING STACCATO +1D17D;N # MUSICAL SYMBOL COMBINING TENUTO +1D17E;N # MUSICAL SYMBOL COMBINING STACCATISSIMO +1D17F;N # MUSICAL SYMBOL COMBINING MARCATO +1D180;N # MUSICAL SYMBOL COMBINING MARCATO-STACCATO +1D181;N # MUSICAL SYMBOL COMBINING ACCENT-STACCATO +1D182;N # MUSICAL SYMBOL COMBINING LOURE +1D183;N # MUSICAL SYMBOL ARPEGGIATO UP +1D184;N # MUSICAL SYMBOL ARPEGGIATO DOWN +1D185;N # MUSICAL SYMBOL COMBINING DOIT +1D186;N # MUSICAL SYMBOL COMBINING RIP +1D187;N # MUSICAL SYMBOL COMBINING FLIP +1D188;N # MUSICAL SYMBOL COMBINING SMEAR +1D189;N # MUSICAL SYMBOL COMBINING BEND +1D18A;N # MUSICAL SYMBOL COMBINING DOUBLE TONGUE +1D18B;N # MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D18C;N # MUSICAL SYMBOL RINFORZANDO +1D18D;N # MUSICAL SYMBOL SUBITO +1D18E;N # MUSICAL SYMBOL Z +1D18F;N # MUSICAL SYMBOL PIANO +1D190;N # MUSICAL SYMBOL MEZZO +1D191;N # MUSICAL SYMBOL FORTE +1D192;N # MUSICAL SYMBOL CRESCENDO +1D193;N # MUSICAL SYMBOL DECRESCENDO +1D194;N # MUSICAL SYMBOL GRACE NOTE SLASH +1D195;N # MUSICAL SYMBOL GRACE NOTE NO SLASH +1D196;N # MUSICAL SYMBOL TR +1D197;N # MUSICAL SYMBOL TURN +1D198;N # MUSICAL SYMBOL INVERTED TURN +1D199;N # MUSICAL SYMBOL TURN SLASH +1D19A;N # MUSICAL SYMBOL TURN UP +1D19B;N # MUSICAL SYMBOL ORNAMENT STROKE-1 +1D19C;N # MUSICAL SYMBOL ORNAMENT STROKE-2 +1D19D;N # MUSICAL SYMBOL ORNAMENT STROKE-3 +1D19E;N # MUSICAL SYMBOL ORNAMENT STROKE-4 +1D19F;N # MUSICAL SYMBOL ORNAMENT STROKE-5 +1D1A0;N # MUSICAL SYMBOL ORNAMENT STROKE-6 +1D1A1;N # MUSICAL SYMBOL ORNAMENT STROKE-7 +1D1A2;N # MUSICAL SYMBOL ORNAMENT STROKE-8 +1D1A3;N # MUSICAL SYMBOL ORNAMENT STROKE-9 +1D1A4;N # MUSICAL SYMBOL ORNAMENT STROKE-10 +1D1A5;N # MUSICAL SYMBOL ORNAMENT STROKE-11 +1D1A6;N # MUSICAL SYMBOL HAUPTSTIMME +1D1A7;N # MUSICAL SYMBOL NEBENSTIMME +1D1A8;N # MUSICAL SYMBOL END OF STIMME +1D1A9;N # MUSICAL SYMBOL DEGREE SLASH +1D1AA;N # MUSICAL SYMBOL COMBINING DOWN BOW +1D1AB;N # MUSICAL SYMBOL COMBINING UP BOW +1D1AC;N # MUSICAL SYMBOL COMBINING HARMONIC +1D1AD;N # MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D1AE;N # MUSICAL SYMBOL PEDAL MARK +1D1AF;N # MUSICAL SYMBOL PEDAL UP MARK +1D1B0;N # MUSICAL SYMBOL HALF PEDAL MARK +1D1B1;N # MUSICAL SYMBOL GLISSANDO UP +1D1B2;N # MUSICAL SYMBOL GLISSANDO DOWN +1D1B3;N # MUSICAL SYMBOL WITH FINGERNAILS +1D1B4;N # MUSICAL SYMBOL DAMP +1D1B5;N # MUSICAL SYMBOL DAMP ALL +1D1B6;N # MUSICAL SYMBOL MAXIMA +1D1B7;N # MUSICAL SYMBOL LONGA +1D1B8;N # MUSICAL SYMBOL BREVIS +1D1B9;N # MUSICAL SYMBOL SEMIBREVIS WHITE +1D1BA;N # MUSICAL SYMBOL SEMIBREVIS BLACK +1D1BB;N # MUSICAL SYMBOL MINIMA +1D1BC;N # MUSICAL SYMBOL MINIMA BLACK +1D1BD;N # MUSICAL SYMBOL SEMIMINIMA WHITE +1D1BE;N # MUSICAL SYMBOL SEMIMINIMA BLACK +1D1BF;N # MUSICAL SYMBOL FUSA WHITE +1D1C0;N # MUSICAL SYMBOL FUSA BLACK +1D1C1;N # MUSICAL SYMBOL LONGA PERFECTA REST +1D1C2;N # MUSICAL SYMBOL LONGA IMPERFECTA REST +1D1C3;N # MUSICAL SYMBOL BREVIS REST +1D1C4;N # MUSICAL SYMBOL SEMIBREVIS REST +1D1C5;N # MUSICAL SYMBOL MINIMA REST +1D1C6;N # MUSICAL SYMBOL SEMIMINIMA REST +1D1C7;N # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA +1D1C8;N # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA +1D1C9;N # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1 +1D1CA;N # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA +1D1CB;N # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA +1D1CC;N # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1 +1D1CD;N # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2 +1D1CE;N # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3 +1D1CF;N # MUSICAL SYMBOL CROIX +1D1D0;N # MUSICAL SYMBOL GREGORIAN C CLEF +1D1D1;N # MUSICAL SYMBOL GREGORIAN F CLEF +1D1D2;N # MUSICAL SYMBOL SQUARE B +1D1D3;N # MUSICAL SYMBOL VIRGA +1D1D4;N # MUSICAL SYMBOL PODATUS +1D1D5;N # MUSICAL SYMBOL CLIVIS +1D1D6;N # MUSICAL SYMBOL SCANDICUS +1D1D7;N # MUSICAL SYMBOL CLIMACUS +1D1D8;N # MUSICAL SYMBOL TORCULUS +1D1D9;N # MUSICAL SYMBOL PORRECTUS +1D1DA;N # MUSICAL SYMBOL PORRECTUS FLEXUS +1D1DB;N # MUSICAL SYMBOL SCANDICUS FLEXUS +1D1DC;N # MUSICAL SYMBOL TORCULUS RESUPINUS +1D1DD;N # MUSICAL SYMBOL PES SUBPUNCTIS +1D200;N # GREEK VOCAL NOTATION SYMBOL-1 +1D201;N # GREEK VOCAL NOTATION SYMBOL-2 +1D202;N # GREEK VOCAL NOTATION SYMBOL-3 +1D203;N # GREEK VOCAL NOTATION SYMBOL-4 +1D204;N # GREEK VOCAL NOTATION SYMBOL-5 +1D205;N # GREEK VOCAL NOTATION SYMBOL-6 +1D206;N # GREEK VOCAL NOTATION SYMBOL-7 +1D207;N # GREEK VOCAL NOTATION SYMBOL-8 +1D208;N # GREEK VOCAL NOTATION SYMBOL-9 +1D209;N # GREEK VOCAL NOTATION SYMBOL-10 +1D20A;N # GREEK VOCAL NOTATION SYMBOL-11 +1D20B;N # GREEK VOCAL NOTATION SYMBOL-12 +1D20C;N # GREEK VOCAL NOTATION SYMBOL-13 +1D20D;N # GREEK VOCAL NOTATION SYMBOL-14 +1D20E;N # GREEK VOCAL NOTATION SYMBOL-15 +1D20F;N # GREEK VOCAL NOTATION SYMBOL-16 +1D210;N # GREEK VOCAL NOTATION SYMBOL-17 +1D211;N # GREEK VOCAL NOTATION SYMBOL-18 +1D212;N # GREEK VOCAL NOTATION SYMBOL-19 +1D213;N # GREEK VOCAL NOTATION SYMBOL-20 +1D214;N # GREEK VOCAL NOTATION SYMBOL-21 +1D215;N # GREEK VOCAL NOTATION SYMBOL-22 +1D216;N # GREEK VOCAL NOTATION SYMBOL-23 +1D217;N # GREEK VOCAL NOTATION SYMBOL-24 +1D218;N # GREEK VOCAL NOTATION SYMBOL-50 +1D219;N # GREEK VOCAL NOTATION SYMBOL-51 +1D21A;N # GREEK VOCAL NOTATION SYMBOL-52 +1D21B;N # GREEK VOCAL NOTATION SYMBOL-53 +1D21C;N # GREEK VOCAL NOTATION SYMBOL-54 +1D21D;N # GREEK INSTRUMENTAL NOTATION SYMBOL-1 +1D21E;N # GREEK INSTRUMENTAL NOTATION SYMBOL-2 +1D21F;N # GREEK INSTRUMENTAL NOTATION SYMBOL-4 +1D220;N # GREEK INSTRUMENTAL NOTATION SYMBOL-5 +1D221;N # GREEK INSTRUMENTAL NOTATION SYMBOL-7 +1D222;N # GREEK INSTRUMENTAL NOTATION SYMBOL-8 +1D223;N # GREEK INSTRUMENTAL NOTATION SYMBOL-11 +1D224;N # GREEK INSTRUMENTAL NOTATION SYMBOL-12 +1D225;N # GREEK INSTRUMENTAL NOTATION SYMBOL-13 +1D226;N # GREEK INSTRUMENTAL NOTATION SYMBOL-14 +1D227;N # GREEK INSTRUMENTAL NOTATION SYMBOL-17 +1D228;N # GREEK INSTRUMENTAL NOTATION SYMBOL-18 +1D229;N # GREEK INSTRUMENTAL NOTATION SYMBOL-19 +1D22A;N # GREEK INSTRUMENTAL NOTATION SYMBOL-23 +1D22B;N # GREEK INSTRUMENTAL NOTATION SYMBOL-24 +1D22C;N # GREEK INSTRUMENTAL NOTATION SYMBOL-25 +1D22D;N # GREEK INSTRUMENTAL NOTATION SYMBOL-26 +1D22E;N # GREEK INSTRUMENTAL NOTATION SYMBOL-27 +1D22F;N # GREEK INSTRUMENTAL NOTATION SYMBOL-29 +1D230;N # GREEK INSTRUMENTAL NOTATION SYMBOL-30 +1D231;N # GREEK INSTRUMENTAL NOTATION SYMBOL-32 +1D232;N # GREEK INSTRUMENTAL NOTATION SYMBOL-36 +1D233;N # GREEK INSTRUMENTAL NOTATION SYMBOL-37 +1D234;N # GREEK INSTRUMENTAL NOTATION SYMBOL-38 +1D235;N # GREEK INSTRUMENTAL NOTATION SYMBOL-39 +1D236;N # GREEK INSTRUMENTAL NOTATION SYMBOL-40 +1D237;N # GREEK INSTRUMENTAL NOTATION SYMBOL-42 +1D238;N # GREEK INSTRUMENTAL NOTATION SYMBOL-43 +1D239;N # GREEK INSTRUMENTAL NOTATION SYMBOL-45 +1D23A;N # GREEK INSTRUMENTAL NOTATION SYMBOL-47 +1D23B;N # GREEK INSTRUMENTAL NOTATION SYMBOL-48 +1D23C;N # GREEK INSTRUMENTAL NOTATION SYMBOL-49 +1D23D;N # GREEK INSTRUMENTAL NOTATION SYMBOL-50 +1D23E;N # GREEK INSTRUMENTAL NOTATION SYMBOL-51 +1D23F;N # GREEK INSTRUMENTAL NOTATION SYMBOL-52 +1D240;N # GREEK INSTRUMENTAL NOTATION SYMBOL-53 +1D241;N # GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D242;N # COMBINING GREEK MUSICAL TRISEME +1D243;N # COMBINING GREEK MUSICAL TETRASEME +1D244;N # COMBINING GREEK MUSICAL PENTASEME +1D245;N # GREEK MUSICAL LEIMMA +1D300;N # MONOGRAM FOR EARTH +1D301;N # DIGRAM FOR HEAVENLY EARTH +1D302;N # DIGRAM FOR HUMAN EARTH +1D303;N # DIGRAM FOR EARTHLY HEAVEN +1D304;N # DIGRAM FOR EARTHLY HUMAN +1D305;N # DIGRAM FOR EARTH +1D306;N # TETRAGRAM FOR CENTRE +1D307;N # TETRAGRAM FOR FULL CIRCLE +1D308;N # TETRAGRAM FOR MIRED +1D309;N # TETRAGRAM FOR BARRIER +1D30A;N # TETRAGRAM FOR KEEPING SMALL +1D30B;N # TETRAGRAM FOR CONTRARIETY +1D30C;N # TETRAGRAM FOR ASCENT +1D30D;N # TETRAGRAM FOR OPPOSITION +1D30E;N # TETRAGRAM FOR BRANCHING OUT +1D30F;N # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION +1D310;N # TETRAGRAM FOR DIVERGENCE +1D311;N # TETRAGRAM FOR YOUTHFULNESS +1D312;N # TETRAGRAM FOR INCREASE +1D313;N # TETRAGRAM FOR PENETRATION +1D314;N # TETRAGRAM FOR REACH +1D315;N # TETRAGRAM FOR CONTACT +1D316;N # TETRAGRAM FOR HOLDING BACK +1D317;N # TETRAGRAM FOR WAITING +1D318;N # TETRAGRAM FOR FOLLOWING +1D319;N # TETRAGRAM FOR ADVANCE +1D31A;N # TETRAGRAM FOR RELEASE +1D31B;N # TETRAGRAM FOR RESISTANCE +1D31C;N # TETRAGRAM FOR EASE +1D31D;N # TETRAGRAM FOR JOY +1D31E;N # TETRAGRAM FOR CONTENTION +1D31F;N # TETRAGRAM FOR ENDEAVOUR +1D320;N # TETRAGRAM FOR DUTIES +1D321;N # TETRAGRAM FOR CHANGE +1D322;N # TETRAGRAM FOR DECISIVENESS +1D323;N # TETRAGRAM FOR BOLD RESOLUTION +1D324;N # TETRAGRAM FOR PACKING +1D325;N # TETRAGRAM FOR LEGION +1D326;N # TETRAGRAM FOR CLOSENESS +1D327;N # TETRAGRAM FOR KINSHIP +1D328;N # TETRAGRAM FOR GATHERING +1D329;N # TETRAGRAM FOR STRENGTH +1D32A;N # TETRAGRAM FOR PURITY +1D32B;N # TETRAGRAM FOR FULLNESS +1D32C;N # TETRAGRAM FOR RESIDENCE +1D32D;N # TETRAGRAM FOR LAW OR MODEL +1D32E;N # TETRAGRAM FOR RESPONSE +1D32F;N # TETRAGRAM FOR GOING TO MEET +1D330;N # TETRAGRAM FOR ENCOUNTERS +1D331;N # TETRAGRAM FOR STOVE +1D332;N # TETRAGRAM FOR GREATNESS +1D333;N # TETRAGRAM FOR ENLARGEMENT +1D334;N # TETRAGRAM FOR PATTERN +1D335;N # TETRAGRAM FOR RITUAL +1D336;N # TETRAGRAM FOR FLIGHT +1D337;N # TETRAGRAM FOR VASTNESS OR WASTING +1D338;N # TETRAGRAM FOR CONSTANCY +1D339;N # TETRAGRAM FOR MEASURE +1D33A;N # TETRAGRAM FOR ETERNITY +1D33B;N # TETRAGRAM FOR UNITY +1D33C;N # TETRAGRAM FOR DIMINISHMENT +1D33D;N # TETRAGRAM FOR CLOSED MOUTH +1D33E;N # TETRAGRAM FOR GUARDEDNESS +1D33F;N # TETRAGRAM FOR GATHERING IN +1D340;N # TETRAGRAM FOR MASSING +1D341;N # TETRAGRAM FOR ACCUMULATION +1D342;N # TETRAGRAM FOR EMBELLISHMENT +1D343;N # TETRAGRAM FOR DOUBT +1D344;N # TETRAGRAM FOR WATCH +1D345;N # TETRAGRAM FOR SINKING +1D346;N # TETRAGRAM FOR INNER +1D347;N # TETRAGRAM FOR DEPARTURE +1D348;N # TETRAGRAM FOR DARKENING +1D349;N # TETRAGRAM FOR DIMMING +1D34A;N # TETRAGRAM FOR EXHAUSTION +1D34B;N # TETRAGRAM FOR SEVERANCE +1D34C;N # TETRAGRAM FOR STOPPAGE +1D34D;N # TETRAGRAM FOR HARDNESS +1D34E;N # TETRAGRAM FOR COMPLETION +1D34F;N # TETRAGRAM FOR CLOSURE +1D350;N # TETRAGRAM FOR FAILURE +1D351;N # TETRAGRAM FOR AGGRAVATION +1D352;N # TETRAGRAM FOR COMPLIANCE +1D353;N # TETRAGRAM FOR ON THE VERGE +1D354;N # TETRAGRAM FOR DIFFICULTIES +1D355;N # TETRAGRAM FOR LABOURING +1D356;N # TETRAGRAM FOR FOSTERING +1D400;N # MATHEMATICAL BOLD CAPITAL A +1D401;N # MATHEMATICAL BOLD CAPITAL B +1D402;N # MATHEMATICAL BOLD CAPITAL C +1D403;N # MATHEMATICAL BOLD CAPITAL D +1D404;N # MATHEMATICAL BOLD CAPITAL E +1D405;N # MATHEMATICAL BOLD CAPITAL F +1D406;N # MATHEMATICAL BOLD CAPITAL G +1D407;N # MATHEMATICAL BOLD CAPITAL H +1D408;N # MATHEMATICAL BOLD CAPITAL I +1D409;N # MATHEMATICAL BOLD CAPITAL J +1D40A;N # MATHEMATICAL BOLD CAPITAL K +1D40B;N # MATHEMATICAL BOLD CAPITAL L +1D40C;N # MATHEMATICAL BOLD CAPITAL M +1D40D;N # MATHEMATICAL BOLD CAPITAL N +1D40E;N # MATHEMATICAL BOLD CAPITAL O +1D40F;N # MATHEMATICAL BOLD CAPITAL P +1D410;N # MATHEMATICAL BOLD CAPITAL Q +1D411;N # MATHEMATICAL BOLD CAPITAL R +1D412;N # MATHEMATICAL BOLD CAPITAL S +1D413;N # MATHEMATICAL BOLD CAPITAL T +1D414;N # MATHEMATICAL BOLD CAPITAL U +1D415;N # MATHEMATICAL BOLD CAPITAL V +1D416;N # MATHEMATICAL BOLD CAPITAL W +1D417;N # MATHEMATICAL BOLD CAPITAL X +1D418;N # MATHEMATICAL BOLD CAPITAL Y +1D419;N # MATHEMATICAL BOLD CAPITAL Z +1D41A;N # MATHEMATICAL BOLD SMALL A +1D41B;N # MATHEMATICAL BOLD SMALL B +1D41C;N # MATHEMATICAL BOLD SMALL C +1D41D;N # MATHEMATICAL BOLD SMALL D +1D41E;N # MATHEMATICAL BOLD SMALL E +1D41F;N # MATHEMATICAL BOLD SMALL F +1D420;N # MATHEMATICAL BOLD SMALL G +1D421;N # MATHEMATICAL BOLD SMALL H +1D422;N # MATHEMATICAL BOLD SMALL I +1D423;N # MATHEMATICAL BOLD SMALL J +1D424;N # MATHEMATICAL BOLD SMALL K +1D425;N # MATHEMATICAL BOLD SMALL L +1D426;N # MATHEMATICAL BOLD SMALL M +1D427;N # MATHEMATICAL BOLD SMALL N +1D428;N # MATHEMATICAL BOLD SMALL O +1D429;N # MATHEMATICAL BOLD SMALL P +1D42A;N # MATHEMATICAL BOLD SMALL Q +1D42B;N # MATHEMATICAL BOLD SMALL R +1D42C;N # MATHEMATICAL BOLD SMALL S +1D42D;N # MATHEMATICAL BOLD SMALL T +1D42E;N # MATHEMATICAL BOLD SMALL U +1D42F;N # MATHEMATICAL BOLD SMALL V +1D430;N # MATHEMATICAL BOLD SMALL W +1D431;N # MATHEMATICAL BOLD SMALL X +1D432;N # MATHEMATICAL BOLD SMALL Y +1D433;N # MATHEMATICAL BOLD SMALL Z +1D434;N # MATHEMATICAL ITALIC CAPITAL A +1D435;N # MATHEMATICAL ITALIC CAPITAL B +1D436;N # MATHEMATICAL ITALIC CAPITAL C +1D437;N # MATHEMATICAL ITALIC CAPITAL D +1D438;N # MATHEMATICAL ITALIC CAPITAL E +1D439;N # MATHEMATICAL ITALIC CAPITAL F +1D43A;N # MATHEMATICAL ITALIC CAPITAL G +1D43B;N # MATHEMATICAL ITALIC CAPITAL H +1D43C;N # MATHEMATICAL ITALIC CAPITAL I +1D43D;N # MATHEMATICAL ITALIC CAPITAL J +1D43E;N # MATHEMATICAL ITALIC CAPITAL K +1D43F;N # MATHEMATICAL ITALIC CAPITAL L +1D440;N # MATHEMATICAL ITALIC CAPITAL M +1D441;N # MATHEMATICAL ITALIC CAPITAL N +1D442;N # MATHEMATICAL ITALIC CAPITAL O +1D443;N # MATHEMATICAL ITALIC CAPITAL P +1D444;N # MATHEMATICAL ITALIC CAPITAL Q +1D445;N # MATHEMATICAL ITALIC CAPITAL R +1D446;N # MATHEMATICAL ITALIC CAPITAL S +1D447;N # MATHEMATICAL ITALIC CAPITAL T +1D448;N # MATHEMATICAL ITALIC CAPITAL U +1D449;N # MATHEMATICAL ITALIC CAPITAL V +1D44A;N # MATHEMATICAL ITALIC CAPITAL W +1D44B;N # MATHEMATICAL ITALIC CAPITAL X +1D44C;N # MATHEMATICAL ITALIC CAPITAL Y +1D44D;N # MATHEMATICAL ITALIC CAPITAL Z +1D44E;N # MATHEMATICAL ITALIC SMALL A +1D44F;N # MATHEMATICAL ITALIC SMALL B +1D450;N # MATHEMATICAL ITALIC SMALL C +1D451;N # MATHEMATICAL ITALIC SMALL D +1D452;N # MATHEMATICAL ITALIC SMALL E +1D453;N # MATHEMATICAL ITALIC SMALL F +1D454;N # MATHEMATICAL ITALIC SMALL G +1D456;N # MATHEMATICAL ITALIC SMALL I +1D457;N # MATHEMATICAL ITALIC SMALL J +1D458;N # MATHEMATICAL ITALIC SMALL K +1D459;N # MATHEMATICAL ITALIC SMALL L +1D45A;N # MATHEMATICAL ITALIC SMALL M +1D45B;N # MATHEMATICAL ITALIC SMALL N +1D45C;N # MATHEMATICAL ITALIC SMALL O +1D45D;N # MATHEMATICAL ITALIC SMALL P +1D45E;N # MATHEMATICAL ITALIC SMALL Q +1D45F;N # MATHEMATICAL ITALIC SMALL R +1D460;N # MATHEMATICAL ITALIC SMALL S +1D461;N # MATHEMATICAL ITALIC SMALL T +1D462;N # MATHEMATICAL ITALIC SMALL U +1D463;N # MATHEMATICAL ITALIC SMALL V +1D464;N # MATHEMATICAL ITALIC SMALL W +1D465;N # MATHEMATICAL ITALIC SMALL X +1D466;N # MATHEMATICAL ITALIC SMALL Y +1D467;N # MATHEMATICAL ITALIC SMALL Z +1D468;N # MATHEMATICAL BOLD ITALIC CAPITAL A +1D469;N # MATHEMATICAL BOLD ITALIC CAPITAL B +1D46A;N # MATHEMATICAL BOLD ITALIC CAPITAL C +1D46B;N # MATHEMATICAL BOLD ITALIC CAPITAL D +1D46C;N # MATHEMATICAL BOLD ITALIC CAPITAL E +1D46D;N # MATHEMATICAL BOLD ITALIC CAPITAL F +1D46E;N # MATHEMATICAL BOLD ITALIC CAPITAL G +1D46F;N # MATHEMATICAL BOLD ITALIC CAPITAL H +1D470;N # MATHEMATICAL BOLD ITALIC CAPITAL I +1D471;N # MATHEMATICAL BOLD ITALIC CAPITAL J +1D472;N # MATHEMATICAL BOLD ITALIC CAPITAL K +1D473;N # MATHEMATICAL BOLD ITALIC CAPITAL L +1D474;N # MATHEMATICAL BOLD ITALIC CAPITAL M +1D475;N # MATHEMATICAL BOLD ITALIC CAPITAL N +1D476;N # MATHEMATICAL BOLD ITALIC CAPITAL O +1D477;N # MATHEMATICAL BOLD ITALIC CAPITAL P +1D478;N # MATHEMATICAL BOLD ITALIC CAPITAL Q +1D479;N # MATHEMATICAL BOLD ITALIC CAPITAL R +1D47A;N # MATHEMATICAL BOLD ITALIC CAPITAL S +1D47B;N # MATHEMATICAL BOLD ITALIC CAPITAL T +1D47C;N # MATHEMATICAL BOLD ITALIC CAPITAL U +1D47D;N # MATHEMATICAL BOLD ITALIC CAPITAL V +1D47E;N # MATHEMATICAL BOLD ITALIC CAPITAL W +1D47F;N # MATHEMATICAL BOLD ITALIC CAPITAL X +1D480;N # MATHEMATICAL BOLD ITALIC CAPITAL Y +1D481;N # MATHEMATICAL BOLD ITALIC CAPITAL Z +1D482;N # MATHEMATICAL BOLD ITALIC SMALL A +1D483;N # MATHEMATICAL BOLD ITALIC SMALL B +1D484;N # MATHEMATICAL BOLD ITALIC SMALL C +1D485;N # MATHEMATICAL BOLD ITALIC SMALL D +1D486;N # MATHEMATICAL BOLD ITALIC SMALL E +1D487;N # MATHEMATICAL BOLD ITALIC SMALL F +1D488;N # MATHEMATICAL BOLD ITALIC SMALL G +1D489;N # MATHEMATICAL BOLD ITALIC SMALL H +1D48A;N # MATHEMATICAL BOLD ITALIC SMALL I +1D48B;N # MATHEMATICAL BOLD ITALIC SMALL J +1D48C;N # MATHEMATICAL BOLD ITALIC SMALL K +1D48D;N # MATHEMATICAL BOLD ITALIC SMALL L +1D48E;N # MATHEMATICAL BOLD ITALIC SMALL M +1D48F;N # MATHEMATICAL BOLD ITALIC SMALL N +1D490;N # MATHEMATICAL BOLD ITALIC SMALL O +1D491;N # MATHEMATICAL BOLD ITALIC SMALL P +1D492;N # MATHEMATICAL BOLD ITALIC SMALL Q +1D493;N # MATHEMATICAL BOLD ITALIC SMALL R +1D494;N # MATHEMATICAL BOLD ITALIC SMALL S +1D495;N # MATHEMATICAL BOLD ITALIC SMALL T +1D496;N # MATHEMATICAL BOLD ITALIC SMALL U +1D497;N # MATHEMATICAL BOLD ITALIC SMALL V +1D498;N # MATHEMATICAL BOLD ITALIC SMALL W +1D499;N # MATHEMATICAL BOLD ITALIC SMALL X +1D49A;N # MATHEMATICAL BOLD ITALIC SMALL Y +1D49B;N # MATHEMATICAL BOLD ITALIC SMALL Z +1D49C;N # MATHEMATICAL SCRIPT CAPITAL A +1D49E;N # MATHEMATICAL SCRIPT CAPITAL C +1D49F;N # MATHEMATICAL SCRIPT CAPITAL D +1D4A2;N # MATHEMATICAL SCRIPT CAPITAL G +1D4A5;N # MATHEMATICAL SCRIPT CAPITAL J +1D4A6;N # MATHEMATICAL SCRIPT CAPITAL K +1D4A9;N # MATHEMATICAL SCRIPT CAPITAL N +1D4AA;N # MATHEMATICAL SCRIPT CAPITAL O +1D4AB;N # MATHEMATICAL SCRIPT CAPITAL P +1D4AC;N # MATHEMATICAL SCRIPT CAPITAL Q +1D4AE;N # MATHEMATICAL SCRIPT CAPITAL S +1D4AF;N # MATHEMATICAL SCRIPT CAPITAL T +1D4B0;N # MATHEMATICAL SCRIPT CAPITAL U +1D4B1;N # MATHEMATICAL SCRIPT CAPITAL V +1D4B2;N # MATHEMATICAL SCRIPT CAPITAL W +1D4B3;N # MATHEMATICAL SCRIPT CAPITAL X +1D4B4;N # MATHEMATICAL SCRIPT CAPITAL Y +1D4B5;N # MATHEMATICAL SCRIPT CAPITAL Z +1D4B6;N # MATHEMATICAL SCRIPT SMALL A +1D4B7;N # MATHEMATICAL SCRIPT SMALL B +1D4B8;N # MATHEMATICAL SCRIPT SMALL C +1D4B9;N # MATHEMATICAL SCRIPT SMALL D +1D4BB;N # MATHEMATICAL SCRIPT SMALL F +1D4BD;N # MATHEMATICAL SCRIPT SMALL H +1D4BE;N # MATHEMATICAL SCRIPT SMALL I +1D4BF;N # MATHEMATICAL SCRIPT SMALL J +1D4C0;N # MATHEMATICAL SCRIPT SMALL K +1D4C1;N # MATHEMATICAL SCRIPT SMALL L +1D4C2;N # MATHEMATICAL SCRIPT SMALL M +1D4C3;N # MATHEMATICAL SCRIPT SMALL N +1D4C5;N # MATHEMATICAL SCRIPT SMALL P +1D4C6;N # MATHEMATICAL SCRIPT SMALL Q +1D4C7;N # MATHEMATICAL SCRIPT SMALL R +1D4C8;N # MATHEMATICAL SCRIPT SMALL S +1D4C9;N # MATHEMATICAL SCRIPT SMALL T +1D4CA;N # MATHEMATICAL SCRIPT SMALL U +1D4CB;N # MATHEMATICAL SCRIPT SMALL V +1D4CC;N # MATHEMATICAL SCRIPT SMALL W +1D4CD;N # MATHEMATICAL SCRIPT SMALL X +1D4CE;N # MATHEMATICAL SCRIPT SMALL Y +1D4CF;N # MATHEMATICAL SCRIPT SMALL Z +1D4D0;N # MATHEMATICAL BOLD SCRIPT CAPITAL A +1D4D1;N # MATHEMATICAL BOLD SCRIPT CAPITAL B +1D4D2;N # MATHEMATICAL BOLD SCRIPT CAPITAL C +1D4D3;N # MATHEMATICAL BOLD SCRIPT CAPITAL D +1D4D4;N # MATHEMATICAL BOLD SCRIPT CAPITAL E +1D4D5;N # MATHEMATICAL BOLD SCRIPT CAPITAL F +1D4D6;N # MATHEMATICAL BOLD SCRIPT CAPITAL G +1D4D7;N # MATHEMATICAL BOLD SCRIPT CAPITAL H +1D4D8;N # MATHEMATICAL BOLD SCRIPT CAPITAL I +1D4D9;N # MATHEMATICAL BOLD SCRIPT CAPITAL J +1D4DA;N # MATHEMATICAL BOLD SCRIPT CAPITAL K +1D4DB;N # MATHEMATICAL BOLD SCRIPT CAPITAL L +1D4DC;N # MATHEMATICAL BOLD SCRIPT CAPITAL M +1D4DD;N # MATHEMATICAL BOLD SCRIPT CAPITAL N +1D4DE;N # MATHEMATICAL BOLD SCRIPT CAPITAL O +1D4DF;N # MATHEMATICAL BOLD SCRIPT CAPITAL P +1D4E0;N # MATHEMATICAL BOLD SCRIPT CAPITAL Q +1D4E1;N # MATHEMATICAL BOLD SCRIPT CAPITAL R +1D4E2;N # MATHEMATICAL BOLD SCRIPT CAPITAL S +1D4E3;N # MATHEMATICAL BOLD SCRIPT CAPITAL T +1D4E4;N # MATHEMATICAL BOLD SCRIPT CAPITAL U +1D4E5;N # MATHEMATICAL BOLD SCRIPT CAPITAL V +1D4E6;N # MATHEMATICAL BOLD SCRIPT CAPITAL W +1D4E7;N # MATHEMATICAL BOLD SCRIPT CAPITAL X +1D4E8;N # MATHEMATICAL BOLD SCRIPT CAPITAL Y +1D4E9;N # MATHEMATICAL BOLD SCRIPT CAPITAL Z +1D4EA;N # MATHEMATICAL BOLD SCRIPT SMALL A +1D4EB;N # MATHEMATICAL BOLD SCRIPT SMALL B +1D4EC;N # MATHEMATICAL BOLD SCRIPT SMALL C +1D4ED;N # MATHEMATICAL BOLD SCRIPT SMALL D +1D4EE;N # MATHEMATICAL BOLD SCRIPT SMALL E +1D4EF;N # MATHEMATICAL BOLD SCRIPT SMALL F +1D4F0;N # MATHEMATICAL BOLD SCRIPT SMALL G +1D4F1;N # MATHEMATICAL BOLD SCRIPT SMALL H +1D4F2;N # MATHEMATICAL BOLD SCRIPT SMALL I +1D4F3;N # MATHEMATICAL BOLD SCRIPT SMALL J +1D4F4;N # MATHEMATICAL BOLD SCRIPT SMALL K +1D4F5;N # MATHEMATICAL BOLD SCRIPT SMALL L +1D4F6;N # MATHEMATICAL BOLD SCRIPT SMALL M +1D4F7;N # MATHEMATICAL BOLD SCRIPT SMALL N +1D4F8;N # MATHEMATICAL BOLD SCRIPT SMALL O +1D4F9;N # MATHEMATICAL BOLD SCRIPT SMALL P +1D4FA;N # MATHEMATICAL BOLD SCRIPT SMALL Q +1D4FB;N # MATHEMATICAL BOLD SCRIPT SMALL R +1D4FC;N # MATHEMATICAL BOLD SCRIPT SMALL S +1D4FD;N # MATHEMATICAL BOLD SCRIPT SMALL T +1D4FE;N # MATHEMATICAL BOLD SCRIPT SMALL U +1D4FF;N # MATHEMATICAL BOLD SCRIPT SMALL V +1D500;N # MATHEMATICAL BOLD SCRIPT SMALL W +1D501;N # MATHEMATICAL BOLD SCRIPT SMALL X +1D502;N # MATHEMATICAL BOLD SCRIPT SMALL Y +1D503;N # MATHEMATICAL BOLD SCRIPT SMALL Z +1D504;N # MATHEMATICAL FRAKTUR CAPITAL A +1D505;N # MATHEMATICAL FRAKTUR CAPITAL B +1D507;N # MATHEMATICAL FRAKTUR CAPITAL D +1D508;N # MATHEMATICAL FRAKTUR CAPITAL E +1D509;N # MATHEMATICAL FRAKTUR CAPITAL F +1D50A;N # MATHEMATICAL FRAKTUR CAPITAL G +1D50D;N # MATHEMATICAL FRAKTUR CAPITAL J +1D50E;N # MATHEMATICAL FRAKTUR CAPITAL K +1D50F;N # MATHEMATICAL FRAKTUR CAPITAL L +1D510;N # MATHEMATICAL FRAKTUR CAPITAL M +1D511;N # MATHEMATICAL FRAKTUR CAPITAL N +1D512;N # MATHEMATICAL FRAKTUR CAPITAL O +1D513;N # MATHEMATICAL FRAKTUR CAPITAL P +1D514;N # MATHEMATICAL FRAKTUR CAPITAL Q +1D516;N # MATHEMATICAL FRAKTUR CAPITAL S +1D517;N # MATHEMATICAL FRAKTUR CAPITAL T +1D518;N # MATHEMATICAL FRAKTUR CAPITAL U +1D519;N # MATHEMATICAL FRAKTUR CAPITAL V +1D51A;N # MATHEMATICAL FRAKTUR CAPITAL W +1D51B;N # MATHEMATICAL FRAKTUR CAPITAL X +1D51C;N # MATHEMATICAL FRAKTUR CAPITAL Y +1D51E;N # MATHEMATICAL FRAKTUR SMALL A +1D51F;N # MATHEMATICAL FRAKTUR SMALL B +1D520;N # MATHEMATICAL FRAKTUR SMALL C +1D521;N # MATHEMATICAL FRAKTUR SMALL D +1D522;N # MATHEMATICAL FRAKTUR SMALL E +1D523;N # MATHEMATICAL FRAKTUR SMALL F +1D524;N # MATHEMATICAL FRAKTUR SMALL G +1D525;N # MATHEMATICAL FRAKTUR SMALL H +1D526;N # MATHEMATICAL FRAKTUR SMALL I +1D527;N # MATHEMATICAL FRAKTUR SMALL J +1D528;N # MATHEMATICAL FRAKTUR SMALL K +1D529;N # MATHEMATICAL FRAKTUR SMALL L +1D52A;N # MATHEMATICAL FRAKTUR SMALL M +1D52B;N # MATHEMATICAL FRAKTUR SMALL N +1D52C;N # MATHEMATICAL FRAKTUR SMALL O +1D52D;N # MATHEMATICAL FRAKTUR SMALL P +1D52E;N # MATHEMATICAL FRAKTUR SMALL Q +1D52F;N # MATHEMATICAL FRAKTUR SMALL R +1D530;N # MATHEMATICAL FRAKTUR SMALL S +1D531;N # MATHEMATICAL FRAKTUR SMALL T +1D532;N # MATHEMATICAL FRAKTUR SMALL U +1D533;N # MATHEMATICAL FRAKTUR SMALL V +1D534;N # MATHEMATICAL FRAKTUR SMALL W +1D535;N # MATHEMATICAL FRAKTUR SMALL X +1D536;N # MATHEMATICAL FRAKTUR SMALL Y +1D537;N # MATHEMATICAL FRAKTUR SMALL Z +1D538;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL A +1D539;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL D +1D53C;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL E +1D53D;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL F +1D53E;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL I +1D541;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL J +1D542;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL K +1D543;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL L +1D544;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL S +1D54B;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL T +1D54C;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL U +1D54D;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL V +1D54E;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL W +1D54F;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL X +1D550;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552;N # MATHEMATICAL DOUBLE-STRUCK SMALL A +1D553;N # MATHEMATICAL DOUBLE-STRUCK SMALL B +1D554;N # MATHEMATICAL DOUBLE-STRUCK SMALL C +1D555;N # MATHEMATICAL DOUBLE-STRUCK SMALL D +1D556;N # MATHEMATICAL DOUBLE-STRUCK SMALL E +1D557;N # MATHEMATICAL DOUBLE-STRUCK SMALL F +1D558;N # MATHEMATICAL DOUBLE-STRUCK SMALL G +1D559;N # MATHEMATICAL DOUBLE-STRUCK SMALL H +1D55A;N # MATHEMATICAL DOUBLE-STRUCK SMALL I +1D55B;N # MATHEMATICAL DOUBLE-STRUCK SMALL J +1D55C;N # MATHEMATICAL DOUBLE-STRUCK SMALL K +1D55D;N # MATHEMATICAL DOUBLE-STRUCK SMALL L +1D55E;N # MATHEMATICAL DOUBLE-STRUCK SMALL M +1D55F;N # MATHEMATICAL DOUBLE-STRUCK SMALL N +1D560;N # MATHEMATICAL DOUBLE-STRUCK SMALL O +1D561;N # MATHEMATICAL DOUBLE-STRUCK SMALL P +1D562;N # MATHEMATICAL DOUBLE-STRUCK SMALL Q +1D563;N # MATHEMATICAL DOUBLE-STRUCK SMALL R +1D564;N # MATHEMATICAL DOUBLE-STRUCK SMALL S +1D565;N # MATHEMATICAL DOUBLE-STRUCK SMALL T +1D566;N # MATHEMATICAL DOUBLE-STRUCK SMALL U +1D567;N # MATHEMATICAL DOUBLE-STRUCK SMALL V +1D568;N # MATHEMATICAL DOUBLE-STRUCK SMALL W +1D569;N # MATHEMATICAL DOUBLE-STRUCK SMALL X +1D56A;N # MATHEMATICAL DOUBLE-STRUCK SMALL Y +1D56B;N # MATHEMATICAL DOUBLE-STRUCK SMALL Z +1D56C;N # MATHEMATICAL BOLD FRAKTUR CAPITAL A +1D56D;N # MATHEMATICAL BOLD FRAKTUR CAPITAL B +1D56E;N # MATHEMATICAL BOLD FRAKTUR CAPITAL C +1D56F;N # MATHEMATICAL BOLD FRAKTUR CAPITAL D +1D570;N # MATHEMATICAL BOLD FRAKTUR CAPITAL E +1D571;N # MATHEMATICAL BOLD FRAKTUR CAPITAL F +1D572;N # MATHEMATICAL BOLD FRAKTUR CAPITAL G +1D573;N # MATHEMATICAL BOLD FRAKTUR CAPITAL H +1D574;N # MATHEMATICAL BOLD FRAKTUR CAPITAL I +1D575;N # MATHEMATICAL BOLD FRAKTUR CAPITAL J +1D576;N # MATHEMATICAL BOLD FRAKTUR CAPITAL K +1D577;N # MATHEMATICAL BOLD FRAKTUR CAPITAL L +1D578;N # MATHEMATICAL BOLD FRAKTUR CAPITAL M +1D579;N # MATHEMATICAL BOLD FRAKTUR CAPITAL N +1D57A;N # MATHEMATICAL BOLD FRAKTUR CAPITAL O +1D57B;N # MATHEMATICAL BOLD FRAKTUR CAPITAL P +1D57C;N # MATHEMATICAL BOLD FRAKTUR CAPITAL Q +1D57D;N # MATHEMATICAL BOLD FRAKTUR CAPITAL R +1D57E;N # MATHEMATICAL BOLD FRAKTUR CAPITAL S +1D57F;N # MATHEMATICAL BOLD FRAKTUR CAPITAL T +1D580;N # MATHEMATICAL BOLD FRAKTUR CAPITAL U +1D581;N # MATHEMATICAL BOLD FRAKTUR CAPITAL V +1D582;N # MATHEMATICAL BOLD FRAKTUR CAPITAL W +1D583;N # MATHEMATICAL BOLD FRAKTUR CAPITAL X +1D584;N # MATHEMATICAL BOLD FRAKTUR CAPITAL Y +1D585;N # MATHEMATICAL BOLD FRAKTUR CAPITAL Z +1D586;N # MATHEMATICAL BOLD FRAKTUR SMALL A +1D587;N # MATHEMATICAL BOLD FRAKTUR SMALL B +1D588;N # MATHEMATICAL BOLD FRAKTUR SMALL C +1D589;N # MATHEMATICAL BOLD FRAKTUR SMALL D +1D58A;N # MATHEMATICAL BOLD FRAKTUR SMALL E +1D58B;N # MATHEMATICAL BOLD FRAKTUR SMALL F +1D58C;N # MATHEMATICAL BOLD FRAKTUR SMALL G +1D58D;N # MATHEMATICAL BOLD FRAKTUR SMALL H +1D58E;N # MATHEMATICAL BOLD FRAKTUR SMALL I +1D58F;N # MATHEMATICAL BOLD FRAKTUR SMALL J +1D590;N # MATHEMATICAL BOLD FRAKTUR SMALL K +1D591;N # MATHEMATICAL BOLD FRAKTUR SMALL L +1D592;N # MATHEMATICAL BOLD FRAKTUR SMALL M +1D593;N # MATHEMATICAL BOLD FRAKTUR SMALL N +1D594;N # MATHEMATICAL BOLD FRAKTUR SMALL O +1D595;N # MATHEMATICAL BOLD FRAKTUR SMALL P +1D596;N # MATHEMATICAL BOLD FRAKTUR SMALL Q +1D597;N # MATHEMATICAL BOLD FRAKTUR SMALL R +1D598;N # MATHEMATICAL BOLD FRAKTUR SMALL S +1D599;N # MATHEMATICAL BOLD FRAKTUR SMALL T +1D59A;N # MATHEMATICAL BOLD FRAKTUR SMALL U +1D59B;N # MATHEMATICAL BOLD FRAKTUR SMALL V +1D59C;N # MATHEMATICAL BOLD FRAKTUR SMALL W +1D59D;N # MATHEMATICAL BOLD FRAKTUR SMALL X +1D59E;N # MATHEMATICAL BOLD FRAKTUR SMALL Y +1D59F;N # MATHEMATICAL BOLD FRAKTUR SMALL Z +1D5A0;N # MATHEMATICAL SANS-SERIF CAPITAL A +1D5A1;N # MATHEMATICAL SANS-SERIF CAPITAL B +1D5A2;N # MATHEMATICAL SANS-SERIF CAPITAL C +1D5A3;N # MATHEMATICAL SANS-SERIF CAPITAL D +1D5A4;N # MATHEMATICAL SANS-SERIF CAPITAL E +1D5A5;N # MATHEMATICAL SANS-SERIF CAPITAL F +1D5A6;N # MATHEMATICAL SANS-SERIF CAPITAL G +1D5A7;N # MATHEMATICAL SANS-SERIF CAPITAL H +1D5A8;N # MATHEMATICAL SANS-SERIF CAPITAL I +1D5A9;N # MATHEMATICAL SANS-SERIF CAPITAL J +1D5AA;N # MATHEMATICAL SANS-SERIF CAPITAL K +1D5AB;N # MATHEMATICAL SANS-SERIF CAPITAL L +1D5AC;N # MATHEMATICAL SANS-SERIF CAPITAL M +1D5AD;N # MATHEMATICAL SANS-SERIF CAPITAL N +1D5AE;N # MATHEMATICAL SANS-SERIF CAPITAL O +1D5AF;N # MATHEMATICAL SANS-SERIF CAPITAL P +1D5B0;N # MATHEMATICAL SANS-SERIF CAPITAL Q +1D5B1;N # MATHEMATICAL SANS-SERIF CAPITAL R +1D5B2;N # MATHEMATICAL SANS-SERIF CAPITAL S +1D5B3;N # MATHEMATICAL SANS-SERIF CAPITAL T +1D5B4;N # MATHEMATICAL SANS-SERIF CAPITAL U +1D5B5;N # MATHEMATICAL SANS-SERIF CAPITAL V +1D5B6;N # MATHEMATICAL SANS-SERIF CAPITAL W +1D5B7;N # MATHEMATICAL SANS-SERIF CAPITAL X +1D5B8;N # MATHEMATICAL SANS-SERIF CAPITAL Y +1D5B9;N # MATHEMATICAL SANS-SERIF CAPITAL Z +1D5BA;N # MATHEMATICAL SANS-SERIF SMALL A +1D5BB;N # MATHEMATICAL SANS-SERIF SMALL B +1D5BC;N # MATHEMATICAL SANS-SERIF SMALL C +1D5BD;N # MATHEMATICAL SANS-SERIF SMALL D +1D5BE;N # MATHEMATICAL SANS-SERIF SMALL E +1D5BF;N # MATHEMATICAL SANS-SERIF SMALL F +1D5C0;N # MATHEMATICAL SANS-SERIF SMALL G +1D5C1;N # MATHEMATICAL SANS-SERIF SMALL H +1D5C2;N # MATHEMATICAL SANS-SERIF SMALL I +1D5C3;N # MATHEMATICAL SANS-SERIF SMALL J +1D5C4;N # MATHEMATICAL SANS-SERIF SMALL K +1D5C5;N # MATHEMATICAL SANS-SERIF SMALL L +1D5C6;N # MATHEMATICAL SANS-SERIF SMALL M +1D5C7;N # MATHEMATICAL SANS-SERIF SMALL N +1D5C8;N # MATHEMATICAL SANS-SERIF SMALL O +1D5C9;N # MATHEMATICAL SANS-SERIF SMALL P +1D5CA;N # MATHEMATICAL SANS-SERIF SMALL Q +1D5CB;N # MATHEMATICAL SANS-SERIF SMALL R +1D5CC;N # MATHEMATICAL SANS-SERIF SMALL S +1D5CD;N # MATHEMATICAL SANS-SERIF SMALL T +1D5CE;N # MATHEMATICAL SANS-SERIF SMALL U +1D5CF;N # MATHEMATICAL SANS-SERIF SMALL V +1D5D0;N # MATHEMATICAL SANS-SERIF SMALL W +1D5D1;N # MATHEMATICAL SANS-SERIF SMALL X +1D5D2;N # MATHEMATICAL SANS-SERIF SMALL Y +1D5D3;N # MATHEMATICAL SANS-SERIF SMALL Z +1D5D4;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL A +1D5D5;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL B +1D5D6;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL C +1D5D7;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL D +1D5D8;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL E +1D5D9;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL F +1D5DA;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL G +1D5DB;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL H +1D5DC;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL I +1D5DD;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL J +1D5DE;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL K +1D5DF;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL L +1D5E0;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL M +1D5E1;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL N +1D5E2;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL O +1D5E3;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL P +1D5E4;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q +1D5E5;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL R +1D5E6;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL S +1D5E7;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL T +1D5E8;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL U +1D5E9;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL V +1D5EA;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL W +1D5EB;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL X +1D5EC;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y +1D5ED;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z +1D5EE;N # MATHEMATICAL SANS-SERIF BOLD SMALL A +1D5EF;N # MATHEMATICAL SANS-SERIF BOLD SMALL B +1D5F0;N # MATHEMATICAL SANS-SERIF BOLD SMALL C +1D5F1;N # MATHEMATICAL SANS-SERIF BOLD SMALL D +1D5F2;N # MATHEMATICAL SANS-SERIF BOLD SMALL E +1D5F3;N # MATHEMATICAL SANS-SERIF BOLD SMALL F +1D5F4;N # MATHEMATICAL SANS-SERIF BOLD SMALL G +1D5F5;N # MATHEMATICAL SANS-SERIF BOLD SMALL H +1D5F6;N # MATHEMATICAL SANS-SERIF BOLD SMALL I +1D5F7;N # MATHEMATICAL SANS-SERIF BOLD SMALL J +1D5F8;N # MATHEMATICAL SANS-SERIF BOLD SMALL K +1D5F9;N # MATHEMATICAL SANS-SERIF BOLD SMALL L +1D5FA;N # MATHEMATICAL SANS-SERIF BOLD SMALL M +1D5FB;N # MATHEMATICAL SANS-SERIF BOLD SMALL N +1D5FC;N # MATHEMATICAL SANS-SERIF BOLD SMALL O +1D5FD;N # MATHEMATICAL SANS-SERIF BOLD SMALL P +1D5FE;N # MATHEMATICAL SANS-SERIF BOLD SMALL Q +1D5FF;N # MATHEMATICAL SANS-SERIF BOLD SMALL R +1D600;N # MATHEMATICAL SANS-SERIF BOLD SMALL S +1D601;N # MATHEMATICAL SANS-SERIF BOLD SMALL T +1D602;N # MATHEMATICAL SANS-SERIF BOLD SMALL U +1D603;N # MATHEMATICAL SANS-SERIF BOLD SMALL V +1D604;N # MATHEMATICAL SANS-SERIF BOLD SMALL W +1D605;N # MATHEMATICAL SANS-SERIF BOLD SMALL X +1D606;N # MATHEMATICAL SANS-SERIF BOLD SMALL Y +1D607;N # MATHEMATICAL SANS-SERIF BOLD SMALL Z +1D608;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A +1D609;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B +1D60A;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C +1D60B;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D +1D60C;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E +1D60D;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F +1D60E;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G +1D60F;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H +1D610;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I +1D611;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J +1D612;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K +1D613;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L +1D614;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M +1D615;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N +1D616;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O +1D617;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P +1D618;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q +1D619;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R +1D61A;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S +1D61B;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T +1D61C;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U +1D61D;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V +1D61E;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W +1D61F;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X +1D620;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y +1D621;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z +1D622;N # MATHEMATICAL SANS-SERIF ITALIC SMALL A +1D623;N # MATHEMATICAL SANS-SERIF ITALIC SMALL B +1D624;N # MATHEMATICAL SANS-SERIF ITALIC SMALL C +1D625;N # MATHEMATICAL SANS-SERIF ITALIC SMALL D +1D626;N # MATHEMATICAL SANS-SERIF ITALIC SMALL E +1D627;N # MATHEMATICAL SANS-SERIF ITALIC SMALL F +1D628;N # MATHEMATICAL SANS-SERIF ITALIC SMALL G +1D629;N # MATHEMATICAL SANS-SERIF ITALIC SMALL H +1D62A;N # MATHEMATICAL SANS-SERIF ITALIC SMALL I +1D62B;N # MATHEMATICAL SANS-SERIF ITALIC SMALL J +1D62C;N # MATHEMATICAL SANS-SERIF ITALIC SMALL K +1D62D;N # MATHEMATICAL SANS-SERIF ITALIC SMALL L +1D62E;N # MATHEMATICAL SANS-SERIF ITALIC SMALL M +1D62F;N # MATHEMATICAL SANS-SERIF ITALIC SMALL N +1D630;N # MATHEMATICAL SANS-SERIF ITALIC SMALL O +1D631;N # MATHEMATICAL SANS-SERIF ITALIC SMALL P +1D632;N # MATHEMATICAL SANS-SERIF ITALIC SMALL Q +1D633;N # MATHEMATICAL SANS-SERIF ITALIC SMALL R +1D634;N # MATHEMATICAL SANS-SERIF ITALIC SMALL S +1D635;N # MATHEMATICAL SANS-SERIF ITALIC SMALL T +1D636;N # MATHEMATICAL SANS-SERIF ITALIC SMALL U +1D637;N # MATHEMATICAL SANS-SERIF ITALIC SMALL V +1D638;N # MATHEMATICAL SANS-SERIF ITALIC SMALL W +1D639;N # MATHEMATICAL SANS-SERIF ITALIC SMALL X +1D63A;N # MATHEMATICAL SANS-SERIF ITALIC SMALL Y +1D63B;N # MATHEMATICAL SANS-SERIF ITALIC SMALL Z +1D63C;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A +1D63D;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B +1D63E;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C +1D63F;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D +1D640;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E +1D641;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F +1D642;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G +1D643;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H +1D644;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I +1D645;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J +1D646;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K +1D647;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L +1D648;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M +1D649;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N +1D64A;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O +1D64B;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P +1D64C;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q +1D64D;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R +1D64E;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S +1D64F;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T +1D650;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U +1D651;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V +1D652;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W +1D653;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X +1D654;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y +1D655;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z +1D656;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A +1D657;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B +1D658;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C +1D659;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D +1D65A;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E +1D65B;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F +1D65C;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G +1D65D;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H +1D65E;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I +1D65F;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J +1D660;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K +1D661;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L +1D662;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M +1D663;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N +1D664;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O +1D665;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P +1D666;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q +1D667;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R +1D668;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S +1D669;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T +1D66A;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U +1D66B;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V +1D66C;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W +1D66D;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X +1D66E;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y +1D66F;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z +1D670;N # MATHEMATICAL MONOSPACE CAPITAL A +1D671;N # MATHEMATICAL MONOSPACE CAPITAL B +1D672;N # MATHEMATICAL MONOSPACE CAPITAL C +1D673;N # MATHEMATICAL MONOSPACE CAPITAL D +1D674;N # MATHEMATICAL MONOSPACE CAPITAL E +1D675;N # MATHEMATICAL MONOSPACE CAPITAL F +1D676;N # MATHEMATICAL MONOSPACE CAPITAL G +1D677;N # MATHEMATICAL MONOSPACE CAPITAL H +1D678;N # MATHEMATICAL MONOSPACE CAPITAL I +1D679;N # MATHEMATICAL MONOSPACE CAPITAL J +1D67A;N # MATHEMATICAL MONOSPACE CAPITAL K +1D67B;N # MATHEMATICAL MONOSPACE CAPITAL L +1D67C;N # MATHEMATICAL MONOSPACE CAPITAL M +1D67D;N # MATHEMATICAL MONOSPACE CAPITAL N +1D67E;N # MATHEMATICAL MONOSPACE CAPITAL O +1D67F;N # MATHEMATICAL MONOSPACE CAPITAL P +1D680;N # MATHEMATICAL MONOSPACE CAPITAL Q +1D681;N # MATHEMATICAL MONOSPACE CAPITAL R +1D682;N # MATHEMATICAL MONOSPACE CAPITAL S +1D683;N # MATHEMATICAL MONOSPACE CAPITAL T +1D684;N # MATHEMATICAL MONOSPACE CAPITAL U +1D685;N # MATHEMATICAL MONOSPACE CAPITAL V +1D686;N # MATHEMATICAL MONOSPACE CAPITAL W +1D687;N # MATHEMATICAL MONOSPACE CAPITAL X +1D688;N # MATHEMATICAL MONOSPACE CAPITAL Y +1D689;N # MATHEMATICAL MONOSPACE CAPITAL Z +1D68A;N # MATHEMATICAL MONOSPACE SMALL A +1D68B;N # MATHEMATICAL MONOSPACE SMALL B +1D68C;N # MATHEMATICAL MONOSPACE SMALL C +1D68D;N # MATHEMATICAL MONOSPACE SMALL D +1D68E;N # MATHEMATICAL MONOSPACE SMALL E +1D68F;N # MATHEMATICAL MONOSPACE SMALL F +1D690;N # MATHEMATICAL MONOSPACE SMALL G +1D691;N # MATHEMATICAL MONOSPACE SMALL H +1D692;N # MATHEMATICAL MONOSPACE SMALL I +1D693;N # MATHEMATICAL MONOSPACE SMALL J +1D694;N # MATHEMATICAL MONOSPACE SMALL K +1D695;N # MATHEMATICAL MONOSPACE SMALL L +1D696;N # MATHEMATICAL MONOSPACE SMALL M +1D697;N # MATHEMATICAL MONOSPACE SMALL N +1D698;N # MATHEMATICAL MONOSPACE SMALL O +1D699;N # MATHEMATICAL MONOSPACE SMALL P +1D69A;N # MATHEMATICAL MONOSPACE SMALL Q +1D69B;N # MATHEMATICAL MONOSPACE SMALL R +1D69C;N # MATHEMATICAL MONOSPACE SMALL S +1D69D;N # MATHEMATICAL MONOSPACE SMALL T +1D69E;N # MATHEMATICAL MONOSPACE SMALL U +1D69F;N # MATHEMATICAL MONOSPACE SMALL V +1D6A0;N # MATHEMATICAL MONOSPACE SMALL W +1D6A1;N # MATHEMATICAL MONOSPACE SMALL X +1D6A2;N # MATHEMATICAL MONOSPACE SMALL Y +1D6A3;N # MATHEMATICAL MONOSPACE SMALL Z +1D6A4;N # MATHEMATICAL ITALIC SMALL DOTLESS I +1D6A5;N # MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8;N # MATHEMATICAL BOLD CAPITAL ALPHA +1D6A9;N # MATHEMATICAL BOLD CAPITAL BETA +1D6AA;N # MATHEMATICAL BOLD CAPITAL GAMMA +1D6AB;N # MATHEMATICAL BOLD CAPITAL DELTA +1D6AC;N # MATHEMATICAL BOLD CAPITAL EPSILON +1D6AD;N # MATHEMATICAL BOLD CAPITAL ZETA +1D6AE;N # MATHEMATICAL BOLD CAPITAL ETA +1D6AF;N # MATHEMATICAL BOLD CAPITAL THETA +1D6B0;N # MATHEMATICAL BOLD CAPITAL IOTA +1D6B1;N # MATHEMATICAL BOLD CAPITAL KAPPA +1D6B2;N # MATHEMATICAL BOLD CAPITAL LAMDA +1D6B3;N # MATHEMATICAL BOLD CAPITAL MU +1D6B4;N # MATHEMATICAL BOLD CAPITAL NU +1D6B5;N # MATHEMATICAL BOLD CAPITAL XI +1D6B6;N # MATHEMATICAL BOLD CAPITAL OMICRON +1D6B7;N # MATHEMATICAL BOLD CAPITAL PI +1D6B8;N # MATHEMATICAL BOLD CAPITAL RHO +1D6B9;N # MATHEMATICAL BOLD CAPITAL THETA SYMBOL +1D6BA;N # MATHEMATICAL BOLD CAPITAL SIGMA +1D6BB;N # MATHEMATICAL BOLD CAPITAL TAU +1D6BC;N # MATHEMATICAL BOLD CAPITAL UPSILON +1D6BD;N # MATHEMATICAL BOLD CAPITAL PHI +1D6BE;N # MATHEMATICAL BOLD CAPITAL CHI +1D6BF;N # MATHEMATICAL BOLD CAPITAL PSI +1D6C0;N # MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1;N # MATHEMATICAL BOLD NABLA +1D6C2;N # MATHEMATICAL BOLD SMALL ALPHA +1D6C3;N # MATHEMATICAL BOLD SMALL BETA +1D6C4;N # MATHEMATICAL BOLD SMALL GAMMA +1D6C5;N # MATHEMATICAL BOLD SMALL DELTA +1D6C6;N # MATHEMATICAL BOLD SMALL EPSILON +1D6C7;N # MATHEMATICAL BOLD SMALL ZETA +1D6C8;N # MATHEMATICAL BOLD SMALL ETA +1D6C9;N # MATHEMATICAL BOLD SMALL THETA +1D6CA;N # MATHEMATICAL BOLD SMALL IOTA +1D6CB;N # MATHEMATICAL BOLD SMALL KAPPA +1D6CC;N # MATHEMATICAL BOLD SMALL LAMDA +1D6CD;N # MATHEMATICAL BOLD SMALL MU +1D6CE;N # MATHEMATICAL BOLD SMALL NU +1D6CF;N # MATHEMATICAL BOLD SMALL XI +1D6D0;N # MATHEMATICAL BOLD SMALL OMICRON +1D6D1;N # MATHEMATICAL BOLD SMALL PI +1D6D2;N # MATHEMATICAL BOLD SMALL RHO +1D6D3;N # MATHEMATICAL BOLD SMALL FINAL SIGMA +1D6D4;N # MATHEMATICAL BOLD SMALL SIGMA +1D6D5;N # MATHEMATICAL BOLD SMALL TAU +1D6D6;N # MATHEMATICAL BOLD SMALL UPSILON +1D6D7;N # MATHEMATICAL BOLD SMALL PHI +1D6D8;N # MATHEMATICAL BOLD SMALL CHI +1D6D9;N # MATHEMATICAL BOLD SMALL PSI +1D6DA;N # MATHEMATICAL BOLD SMALL OMEGA +1D6DB;N # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC;N # MATHEMATICAL BOLD EPSILON SYMBOL +1D6DD;N # MATHEMATICAL BOLD THETA SYMBOL +1D6DE;N # MATHEMATICAL BOLD KAPPA SYMBOL +1D6DF;N # MATHEMATICAL BOLD PHI SYMBOL +1D6E0;N # MATHEMATICAL BOLD RHO SYMBOL +1D6E1;N # MATHEMATICAL BOLD PI SYMBOL +1D6E2;N # MATHEMATICAL ITALIC CAPITAL ALPHA +1D6E3;N # MATHEMATICAL ITALIC CAPITAL BETA +1D6E4;N # MATHEMATICAL ITALIC CAPITAL GAMMA +1D6E5;N # MATHEMATICAL ITALIC CAPITAL DELTA +1D6E6;N # MATHEMATICAL ITALIC CAPITAL EPSILON +1D6E7;N # MATHEMATICAL ITALIC CAPITAL ZETA +1D6E8;N # MATHEMATICAL ITALIC CAPITAL ETA +1D6E9;N # MATHEMATICAL ITALIC CAPITAL THETA +1D6EA;N # MATHEMATICAL ITALIC CAPITAL IOTA +1D6EB;N # MATHEMATICAL ITALIC CAPITAL KAPPA +1D6EC;N # MATHEMATICAL ITALIC CAPITAL LAMDA +1D6ED;N # MATHEMATICAL ITALIC CAPITAL MU +1D6EE;N # MATHEMATICAL ITALIC CAPITAL NU +1D6EF;N # MATHEMATICAL ITALIC CAPITAL XI +1D6F0;N # MATHEMATICAL ITALIC CAPITAL OMICRON +1D6F1;N # MATHEMATICAL ITALIC CAPITAL PI +1D6F2;N # MATHEMATICAL ITALIC CAPITAL RHO +1D6F3;N # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL +1D6F4;N # MATHEMATICAL ITALIC CAPITAL SIGMA +1D6F5;N # MATHEMATICAL ITALIC CAPITAL TAU +1D6F6;N # MATHEMATICAL ITALIC CAPITAL UPSILON +1D6F7;N # MATHEMATICAL ITALIC CAPITAL PHI +1D6F8;N # MATHEMATICAL ITALIC CAPITAL CHI +1D6F9;N # MATHEMATICAL ITALIC CAPITAL PSI +1D6FA;N # MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB;N # MATHEMATICAL ITALIC NABLA +1D6FC;N # MATHEMATICAL ITALIC SMALL ALPHA +1D6FD;N # MATHEMATICAL ITALIC SMALL BETA +1D6FE;N # MATHEMATICAL ITALIC SMALL GAMMA +1D6FF;N # MATHEMATICAL ITALIC SMALL DELTA +1D700;N # MATHEMATICAL ITALIC SMALL EPSILON +1D701;N # MATHEMATICAL ITALIC SMALL ZETA +1D702;N # MATHEMATICAL ITALIC SMALL ETA +1D703;N # MATHEMATICAL ITALIC SMALL THETA +1D704;N # MATHEMATICAL ITALIC SMALL IOTA +1D705;N # MATHEMATICAL ITALIC SMALL KAPPA +1D706;N # MATHEMATICAL ITALIC SMALL LAMDA +1D707;N # MATHEMATICAL ITALIC SMALL MU +1D708;N # MATHEMATICAL ITALIC SMALL NU +1D709;N # MATHEMATICAL ITALIC SMALL XI +1D70A;N # MATHEMATICAL ITALIC SMALL OMICRON +1D70B;N # MATHEMATICAL ITALIC SMALL PI +1D70C;N # MATHEMATICAL ITALIC SMALL RHO +1D70D;N # MATHEMATICAL ITALIC SMALL FINAL SIGMA +1D70E;N # MATHEMATICAL ITALIC SMALL SIGMA +1D70F;N # MATHEMATICAL ITALIC SMALL TAU +1D710;N # MATHEMATICAL ITALIC SMALL UPSILON +1D711;N # MATHEMATICAL ITALIC SMALL PHI +1D712;N # MATHEMATICAL ITALIC SMALL CHI +1D713;N # MATHEMATICAL ITALIC SMALL PSI +1D714;N # MATHEMATICAL ITALIC SMALL OMEGA +1D715;N # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716;N # MATHEMATICAL ITALIC EPSILON SYMBOL +1D717;N # MATHEMATICAL ITALIC THETA SYMBOL +1D718;N # MATHEMATICAL ITALIC KAPPA SYMBOL +1D719;N # MATHEMATICAL ITALIC PHI SYMBOL +1D71A;N # MATHEMATICAL ITALIC RHO SYMBOL +1D71B;N # MATHEMATICAL ITALIC PI SYMBOL +1D71C;N # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA +1D71D;N # MATHEMATICAL BOLD ITALIC CAPITAL BETA +1D71E;N # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA +1D71F;N # MATHEMATICAL BOLD ITALIC CAPITAL DELTA +1D720;N # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON +1D721;N # MATHEMATICAL BOLD ITALIC CAPITAL ZETA +1D722;N # MATHEMATICAL BOLD ITALIC CAPITAL ETA +1D723;N # MATHEMATICAL BOLD ITALIC CAPITAL THETA +1D724;N # MATHEMATICAL BOLD ITALIC CAPITAL IOTA +1D725;N # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA +1D726;N # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA +1D727;N # MATHEMATICAL BOLD ITALIC CAPITAL MU +1D728;N # MATHEMATICAL BOLD ITALIC CAPITAL NU +1D729;N # MATHEMATICAL BOLD ITALIC CAPITAL XI +1D72A;N # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON +1D72B;N # MATHEMATICAL BOLD ITALIC CAPITAL PI +1D72C;N # MATHEMATICAL BOLD ITALIC CAPITAL RHO +1D72D;N # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL +1D72E;N # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA +1D72F;N # MATHEMATICAL BOLD ITALIC CAPITAL TAU +1D730;N # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON +1D731;N # MATHEMATICAL BOLD ITALIC CAPITAL PHI +1D732;N # MATHEMATICAL BOLD ITALIC CAPITAL CHI +1D733;N # MATHEMATICAL BOLD ITALIC CAPITAL PSI +1D734;N # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735;N # MATHEMATICAL BOLD ITALIC NABLA +1D736;N # MATHEMATICAL BOLD ITALIC SMALL ALPHA +1D737;N # MATHEMATICAL BOLD ITALIC SMALL BETA +1D738;N # MATHEMATICAL BOLD ITALIC SMALL GAMMA +1D739;N # MATHEMATICAL BOLD ITALIC SMALL DELTA +1D73A;N # MATHEMATICAL BOLD ITALIC SMALL EPSILON +1D73B;N # MATHEMATICAL BOLD ITALIC SMALL ZETA +1D73C;N # MATHEMATICAL BOLD ITALIC SMALL ETA +1D73D;N # MATHEMATICAL BOLD ITALIC SMALL THETA +1D73E;N # MATHEMATICAL BOLD ITALIC SMALL IOTA +1D73F;N # MATHEMATICAL BOLD ITALIC SMALL KAPPA +1D740;N # MATHEMATICAL BOLD ITALIC SMALL LAMDA +1D741;N # MATHEMATICAL BOLD ITALIC SMALL MU +1D742;N # MATHEMATICAL BOLD ITALIC SMALL NU +1D743;N # MATHEMATICAL BOLD ITALIC SMALL XI +1D744;N # MATHEMATICAL BOLD ITALIC SMALL OMICRON +1D745;N # MATHEMATICAL BOLD ITALIC SMALL PI +1D746;N # MATHEMATICAL BOLD ITALIC SMALL RHO +1D747;N # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA +1D748;N # MATHEMATICAL BOLD ITALIC SMALL SIGMA +1D749;N # MATHEMATICAL BOLD ITALIC SMALL TAU +1D74A;N # MATHEMATICAL BOLD ITALIC SMALL UPSILON +1D74B;N # MATHEMATICAL BOLD ITALIC SMALL PHI +1D74C;N # MATHEMATICAL BOLD ITALIC SMALL CHI +1D74D;N # MATHEMATICAL BOLD ITALIC SMALL PSI +1D74E;N # MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F;N # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750;N # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL +1D751;N # MATHEMATICAL BOLD ITALIC THETA SYMBOL +1D752;N # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL +1D753;N # MATHEMATICAL BOLD ITALIC PHI SYMBOL +1D754;N # MATHEMATICAL BOLD ITALIC RHO SYMBOL +1D755;N # MATHEMATICAL BOLD ITALIC PI SYMBOL +1D756;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA +1D757;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA +1D758;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA +1D759;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA +1D75A;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON +1D75B;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA +1D75C;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA +1D75D;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA +1D75E;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA +1D75F;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA +1D760;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA +1D761;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU +1D762;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU +1D763;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI +1D764;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON +1D765;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI +1D766;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO +1D767;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL +1D768;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA +1D769;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU +1D76A;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON +1D76B;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI +1D76C;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI +1D76D;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI +1D76E;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F;N # MATHEMATICAL SANS-SERIF BOLD NABLA +1D770;N # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA +1D771;N # MATHEMATICAL SANS-SERIF BOLD SMALL BETA +1D772;N # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA +1D773;N # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA +1D774;N # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON +1D775;N # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA +1D776;N # MATHEMATICAL SANS-SERIF BOLD SMALL ETA +1D777;N # MATHEMATICAL SANS-SERIF BOLD SMALL THETA +1D778;N # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA +1D779;N # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA +1D77A;N # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA +1D77B;N # MATHEMATICAL SANS-SERIF BOLD SMALL MU +1D77C;N # MATHEMATICAL SANS-SERIF BOLD SMALL NU +1D77D;N # MATHEMATICAL SANS-SERIF BOLD SMALL XI +1D77E;N # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON +1D77F;N # MATHEMATICAL SANS-SERIF BOLD SMALL PI +1D780;N # MATHEMATICAL SANS-SERIF BOLD SMALL RHO +1D781;N # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA +1D782;N # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA +1D783;N # MATHEMATICAL SANS-SERIF BOLD SMALL TAU +1D784;N # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON +1D785;N # MATHEMATICAL SANS-SERIF BOLD SMALL PHI +1D786;N # MATHEMATICAL SANS-SERIF BOLD SMALL CHI +1D787;N # MATHEMATICAL SANS-SERIF BOLD SMALL PSI +1D788;N # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789;N # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A;N # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL +1D78B;N # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL +1D78C;N # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL +1D78D;N # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL +1D78E;N # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL +1D78F;N # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL +1D790;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA +1D791;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA +1D792;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA +1D793;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA +1D794;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON +1D795;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA +1D796;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA +1D797;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA +1D798;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA +1D799;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA +1D79A;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA +1D79B;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU +1D79C;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU +1D79D;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI +1D79E;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON +1D79F;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI +1D7A0;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO +1D7A1;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL +1D7A2;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA +1D7A3;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU +1D7A4;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON +1D7A5;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI +1D7A6;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI +1D7A7;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI +1D7A8;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9;N # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA +1D7AB;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA +1D7AC;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA +1D7AD;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA +1D7AE;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON +1D7AF;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA +1D7B0;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA +1D7B1;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA +1D7B2;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA +1D7B3;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA +1D7B4;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA +1D7B5;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU +1D7B6;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU +1D7B7;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI +1D7B8;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON +1D7B9;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI +1D7BA;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO +1D7BB;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA +1D7BC;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA +1D7BD;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU +1D7BE;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON +1D7BF;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI +1D7C0;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI +1D7C1;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI +1D7C2;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3;N # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4;N # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL +1D7C5;N # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL +1D7C6;N # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL +1D7C7;N # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL +1D7C8;N # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL +1D7C9;N # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +1D7CE;N # MATHEMATICAL BOLD DIGIT ZERO +1D7CF;N # MATHEMATICAL BOLD DIGIT ONE +1D7D0;N # MATHEMATICAL BOLD DIGIT TWO +1D7D1;N # MATHEMATICAL BOLD DIGIT THREE +1D7D2;N # MATHEMATICAL BOLD DIGIT FOUR +1D7D3;N # MATHEMATICAL BOLD DIGIT FIVE +1D7D4;N # MATHEMATICAL BOLD DIGIT SIX +1D7D5;N # MATHEMATICAL BOLD DIGIT SEVEN +1D7D6;N # MATHEMATICAL BOLD DIGIT EIGHT +1D7D7;N # MATHEMATICAL BOLD DIGIT NINE +1D7D8;N # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO +1D7D9;N # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE +1D7DA;N # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO +1D7DB;N # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE +1D7DC;N # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR +1D7DD;N # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE +1D7DE;N # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX +1D7DF;N # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN +1D7E0;N # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT +1D7E1;N # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE +1D7E2;N # MATHEMATICAL SANS-SERIF DIGIT ZERO +1D7E3;N # MATHEMATICAL SANS-SERIF DIGIT ONE +1D7E4;N # MATHEMATICAL SANS-SERIF DIGIT TWO +1D7E5;N # MATHEMATICAL SANS-SERIF DIGIT THREE +1D7E6;N # MATHEMATICAL SANS-SERIF DIGIT FOUR +1D7E7;N # MATHEMATICAL SANS-SERIF DIGIT FIVE +1D7E8;N # MATHEMATICAL SANS-SERIF DIGIT SIX +1D7E9;N # MATHEMATICAL SANS-SERIF DIGIT SEVEN +1D7EA;N # MATHEMATICAL SANS-SERIF DIGIT EIGHT +1D7EB;N # MATHEMATICAL SANS-SERIF DIGIT NINE +1D7EC;N # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO +1D7ED;N # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE +1D7EE;N # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO +1D7EF;N # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE +1D7F0;N # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR +1D7F1;N # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE +1D7F2;N # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX +1D7F3;N # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN +1D7F4;N # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT +1D7F5;N # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE +1D7F6;N # MATHEMATICAL MONOSPACE DIGIT ZERO +1D7F7;N # MATHEMATICAL MONOSPACE DIGIT ONE +1D7F8;N # MATHEMATICAL MONOSPACE DIGIT TWO +1D7F9;N # MATHEMATICAL MONOSPACE DIGIT THREE +1D7FA;N # MATHEMATICAL MONOSPACE DIGIT FOUR +1D7FB;N # MATHEMATICAL MONOSPACE DIGIT FIVE +1D7FC;N # MATHEMATICAL MONOSPACE DIGIT SIX +1D7FD;N # MATHEMATICAL MONOSPACE DIGIT SEVEN +1D7FE;N # MATHEMATICAL MONOSPACE DIGIT EIGHT +1D7FF;N # MATHEMATICAL MONOSPACE DIGIT NINE +20000..2A6D6;W # <CJK Ideograph Extension B, First>..<CJK Ideograph Extension B, Last> +2A6D7..2F7FF;W # <reserved> +2F800;W # CJK COMPATIBILITY IDEOGRAPH-2F800 +2F801;W # CJK COMPATIBILITY IDEOGRAPH-2F801 +2F802;W # CJK COMPATIBILITY IDEOGRAPH-2F802 +2F803;W # CJK COMPATIBILITY IDEOGRAPH-2F803 +2F804;W # CJK COMPATIBILITY IDEOGRAPH-2F804 +2F805;W # CJK COMPATIBILITY IDEOGRAPH-2F805 +2F806;W # CJK COMPATIBILITY IDEOGRAPH-2F806 +2F807;W # CJK COMPATIBILITY IDEOGRAPH-2F807 +2F808;W # CJK COMPATIBILITY IDEOGRAPH-2F808 +2F809;W # CJK COMPATIBILITY IDEOGRAPH-2F809 +2F80A;W # CJK COMPATIBILITY IDEOGRAPH-2F80A +2F80B;W # CJK COMPATIBILITY IDEOGRAPH-2F80B +2F80C;W # CJK COMPATIBILITY IDEOGRAPH-2F80C +2F80D;W # CJK COMPATIBILITY IDEOGRAPH-2F80D +2F80E;W # CJK COMPATIBILITY IDEOGRAPH-2F80E +2F80F;W # CJK COMPATIBILITY IDEOGRAPH-2F80F +2F810;W # CJK COMPATIBILITY IDEOGRAPH-2F810 +2F811;W # CJK COMPATIBILITY IDEOGRAPH-2F811 +2F812;W # CJK COMPATIBILITY IDEOGRAPH-2F812 +2F813;W # CJK COMPATIBILITY IDEOGRAPH-2F813 +2F814;W # CJK COMPATIBILITY IDEOGRAPH-2F814 +2F815;W # CJK COMPATIBILITY IDEOGRAPH-2F815 +2F816;W # CJK COMPATIBILITY IDEOGRAPH-2F816 +2F817;W # CJK COMPATIBILITY IDEOGRAPH-2F817 +2F818;W # CJK COMPATIBILITY IDEOGRAPH-2F818 +2F819;W # CJK COMPATIBILITY IDEOGRAPH-2F819 +2F81A;W # CJK COMPATIBILITY IDEOGRAPH-2F81A +2F81B;W # CJK COMPATIBILITY IDEOGRAPH-2F81B +2F81C;W # CJK COMPATIBILITY IDEOGRAPH-2F81C +2F81D;W # CJK COMPATIBILITY IDEOGRAPH-2F81D +2F81E;W # CJK COMPATIBILITY IDEOGRAPH-2F81E +2F81F;W # CJK COMPATIBILITY IDEOGRAPH-2F81F +2F820;W # CJK COMPATIBILITY IDEOGRAPH-2F820 +2F821;W # CJK COMPATIBILITY IDEOGRAPH-2F821 +2F822;W # CJK COMPATIBILITY IDEOGRAPH-2F822 +2F823;W # CJK COMPATIBILITY IDEOGRAPH-2F823 +2F824;W # CJK COMPATIBILITY IDEOGRAPH-2F824 +2F825;W # CJK COMPATIBILITY IDEOGRAPH-2F825 +2F826;W # CJK COMPATIBILITY IDEOGRAPH-2F826 +2F827;W # CJK COMPATIBILITY IDEOGRAPH-2F827 +2F828;W # CJK COMPATIBILITY IDEOGRAPH-2F828 +2F829;W # CJK COMPATIBILITY IDEOGRAPH-2F829 +2F82A;W # CJK COMPATIBILITY IDEOGRAPH-2F82A +2F82B;W # CJK COMPATIBILITY IDEOGRAPH-2F82B +2F82C;W # CJK COMPATIBILITY IDEOGRAPH-2F82C +2F82D;W # CJK COMPATIBILITY IDEOGRAPH-2F82D +2F82E;W # CJK COMPATIBILITY IDEOGRAPH-2F82E +2F82F;W # CJK COMPATIBILITY IDEOGRAPH-2F82F +2F830;W # CJK COMPATIBILITY IDEOGRAPH-2F830 +2F831;W # CJK COMPATIBILITY IDEOGRAPH-2F831 +2F832;W # CJK COMPATIBILITY IDEOGRAPH-2F832 +2F833;W # CJK COMPATIBILITY IDEOGRAPH-2F833 +2F834;W # CJK COMPATIBILITY IDEOGRAPH-2F834 +2F835;W # CJK COMPATIBILITY IDEOGRAPH-2F835 +2F836;W # CJK COMPATIBILITY IDEOGRAPH-2F836 +2F837;W # CJK COMPATIBILITY IDEOGRAPH-2F837 +2F838;W # CJK COMPATIBILITY IDEOGRAPH-2F838 +2F839;W # CJK COMPATIBILITY IDEOGRAPH-2F839 +2F83A;W # CJK COMPATIBILITY IDEOGRAPH-2F83A +2F83B;W # CJK COMPATIBILITY IDEOGRAPH-2F83B +2F83C;W # CJK COMPATIBILITY IDEOGRAPH-2F83C +2F83D;W # CJK COMPATIBILITY IDEOGRAPH-2F83D +2F83E;W # CJK COMPATIBILITY IDEOGRAPH-2F83E +2F83F;W # CJK COMPATIBILITY IDEOGRAPH-2F83F +2F840;W # CJK COMPATIBILITY IDEOGRAPH-2F840 +2F841;W # CJK COMPATIBILITY IDEOGRAPH-2F841 +2F842;W # CJK COMPATIBILITY IDEOGRAPH-2F842 +2F843;W # CJK COMPATIBILITY IDEOGRAPH-2F843 +2F844;W # CJK COMPATIBILITY IDEOGRAPH-2F844 +2F845;W # CJK COMPATIBILITY IDEOGRAPH-2F845 +2F846;W # CJK COMPATIBILITY IDEOGRAPH-2F846 +2F847;W # CJK COMPATIBILITY IDEOGRAPH-2F847 +2F848;W # CJK COMPATIBILITY IDEOGRAPH-2F848 +2F849;W # CJK COMPATIBILITY IDEOGRAPH-2F849 +2F84A;W # CJK COMPATIBILITY IDEOGRAPH-2F84A +2F84B;W # CJK COMPATIBILITY IDEOGRAPH-2F84B +2F84C;W # CJK COMPATIBILITY IDEOGRAPH-2F84C +2F84D;W # CJK COMPATIBILITY IDEOGRAPH-2F84D +2F84E;W # CJK COMPATIBILITY IDEOGRAPH-2F84E +2F84F;W # CJK COMPATIBILITY IDEOGRAPH-2F84F +2F850;W # CJK COMPATIBILITY IDEOGRAPH-2F850 +2F851;W # CJK COMPATIBILITY IDEOGRAPH-2F851 +2F852;W # CJK COMPATIBILITY IDEOGRAPH-2F852 +2F853;W # CJK COMPATIBILITY IDEOGRAPH-2F853 +2F854;W # CJK COMPATIBILITY IDEOGRAPH-2F854 +2F855;W # CJK COMPATIBILITY IDEOGRAPH-2F855 +2F856;W # CJK COMPATIBILITY IDEOGRAPH-2F856 +2F857;W # CJK COMPATIBILITY IDEOGRAPH-2F857 +2F858;W # CJK COMPATIBILITY IDEOGRAPH-2F858 +2F859;W # CJK COMPATIBILITY IDEOGRAPH-2F859 +2F85A;W # CJK COMPATIBILITY IDEOGRAPH-2F85A +2F85B;W # CJK COMPATIBILITY IDEOGRAPH-2F85B +2F85C;W # CJK COMPATIBILITY IDEOGRAPH-2F85C +2F85D;W # CJK COMPATIBILITY IDEOGRAPH-2F85D +2F85E;W # CJK COMPATIBILITY IDEOGRAPH-2F85E +2F85F;W # CJK COMPATIBILITY IDEOGRAPH-2F85F +2F860;W # CJK COMPATIBILITY IDEOGRAPH-2F860 +2F861;W # CJK COMPATIBILITY IDEOGRAPH-2F861 +2F862;W # CJK COMPATIBILITY IDEOGRAPH-2F862 +2F863;W # CJK COMPATIBILITY IDEOGRAPH-2F863 +2F864;W # CJK COMPATIBILITY IDEOGRAPH-2F864 +2F865;W # CJK COMPATIBILITY IDEOGRAPH-2F865 +2F866;W # CJK COMPATIBILITY IDEOGRAPH-2F866 +2F867;W # CJK COMPATIBILITY IDEOGRAPH-2F867 +2F868;W # CJK COMPATIBILITY IDEOGRAPH-2F868 +2F869;W # CJK COMPATIBILITY IDEOGRAPH-2F869 +2F86A;W # CJK COMPATIBILITY IDEOGRAPH-2F86A +2F86B;W # CJK COMPATIBILITY IDEOGRAPH-2F86B +2F86C;W # CJK COMPATIBILITY IDEOGRAPH-2F86C +2F86D;W # CJK COMPATIBILITY IDEOGRAPH-2F86D +2F86E;W # CJK COMPATIBILITY IDEOGRAPH-2F86E +2F86F;W # CJK COMPATIBILITY IDEOGRAPH-2F86F +2F870;W # CJK COMPATIBILITY IDEOGRAPH-2F870 +2F871;W # CJK COMPATIBILITY IDEOGRAPH-2F871 +2F872;W # CJK COMPATIBILITY IDEOGRAPH-2F872 +2F873;W # CJK COMPATIBILITY IDEOGRAPH-2F873 +2F874;W # CJK COMPATIBILITY IDEOGRAPH-2F874 +2F875;W # CJK COMPATIBILITY IDEOGRAPH-2F875 +2F876;W # CJK COMPATIBILITY IDEOGRAPH-2F876 +2F877;W # CJK COMPATIBILITY IDEOGRAPH-2F877 +2F878;W # CJK COMPATIBILITY IDEOGRAPH-2F878 +2F879;W # CJK COMPATIBILITY IDEOGRAPH-2F879 +2F87A;W # CJK COMPATIBILITY IDEOGRAPH-2F87A +2F87B;W # CJK COMPATIBILITY IDEOGRAPH-2F87B +2F87C;W # CJK COMPATIBILITY IDEOGRAPH-2F87C +2F87D;W # CJK COMPATIBILITY IDEOGRAPH-2F87D +2F87E;W # CJK COMPATIBILITY IDEOGRAPH-2F87E +2F87F;W # CJK COMPATIBILITY IDEOGRAPH-2F87F +2F880;W # CJK COMPATIBILITY IDEOGRAPH-2F880 +2F881;W # CJK COMPATIBILITY IDEOGRAPH-2F881 +2F882;W # CJK COMPATIBILITY IDEOGRAPH-2F882 +2F883;W # CJK COMPATIBILITY IDEOGRAPH-2F883 +2F884;W # CJK COMPATIBILITY IDEOGRAPH-2F884 +2F885;W # CJK COMPATIBILITY IDEOGRAPH-2F885 +2F886;W # CJK COMPATIBILITY IDEOGRAPH-2F886 +2F887;W # CJK COMPATIBILITY IDEOGRAPH-2F887 +2F888;W # CJK COMPATIBILITY IDEOGRAPH-2F888 +2F889;W # CJK COMPATIBILITY IDEOGRAPH-2F889 +2F88A;W # CJK COMPATIBILITY IDEOGRAPH-2F88A +2F88B;W # CJK COMPATIBILITY IDEOGRAPH-2F88B +2F88C;W # CJK COMPATIBILITY IDEOGRAPH-2F88C +2F88D;W # CJK COMPATIBILITY IDEOGRAPH-2F88D +2F88E;W # CJK COMPATIBILITY IDEOGRAPH-2F88E +2F88F;W # CJK COMPATIBILITY IDEOGRAPH-2F88F +2F890;W # CJK COMPATIBILITY IDEOGRAPH-2F890 +2F891;W # CJK COMPATIBILITY IDEOGRAPH-2F891 +2F892;W # CJK COMPATIBILITY IDEOGRAPH-2F892 +2F893;W # CJK COMPATIBILITY IDEOGRAPH-2F893 +2F894;W # CJK COMPATIBILITY IDEOGRAPH-2F894 +2F895;W # CJK COMPATIBILITY IDEOGRAPH-2F895 +2F896;W # CJK COMPATIBILITY IDEOGRAPH-2F896 +2F897;W # CJK COMPATIBILITY IDEOGRAPH-2F897 +2F898;W # CJK COMPATIBILITY IDEOGRAPH-2F898 +2F899;W # CJK COMPATIBILITY IDEOGRAPH-2F899 +2F89A;W # CJK COMPATIBILITY IDEOGRAPH-2F89A +2F89B;W # CJK COMPATIBILITY IDEOGRAPH-2F89B +2F89C;W # CJK COMPATIBILITY IDEOGRAPH-2F89C +2F89D;W # CJK COMPATIBILITY IDEOGRAPH-2F89D +2F89E;W # CJK COMPATIBILITY IDEOGRAPH-2F89E +2F89F;W # CJK COMPATIBILITY IDEOGRAPH-2F89F +2F8A0;W # CJK COMPATIBILITY IDEOGRAPH-2F8A0 +2F8A1;W # CJK COMPATIBILITY IDEOGRAPH-2F8A1 +2F8A2;W # CJK COMPATIBILITY IDEOGRAPH-2F8A2 +2F8A3;W # CJK COMPATIBILITY IDEOGRAPH-2F8A3 +2F8A4;W # CJK COMPATIBILITY IDEOGRAPH-2F8A4 +2F8A5;W # CJK COMPATIBILITY IDEOGRAPH-2F8A5 +2F8A6;W # CJK COMPATIBILITY IDEOGRAPH-2F8A6 +2F8A7;W # CJK COMPATIBILITY IDEOGRAPH-2F8A7 +2F8A8;W # CJK COMPATIBILITY IDEOGRAPH-2F8A8 +2F8A9;W # CJK COMPATIBILITY IDEOGRAPH-2F8A9 +2F8AA;W # CJK COMPATIBILITY IDEOGRAPH-2F8AA +2F8AB;W # CJK COMPATIBILITY IDEOGRAPH-2F8AB +2F8AC;W # CJK COMPATIBILITY IDEOGRAPH-2F8AC +2F8AD;W # CJK COMPATIBILITY IDEOGRAPH-2F8AD +2F8AE;W # CJK COMPATIBILITY IDEOGRAPH-2F8AE +2F8AF;W # CJK COMPATIBILITY IDEOGRAPH-2F8AF +2F8B0;W # CJK COMPATIBILITY IDEOGRAPH-2F8B0 +2F8B1;W # CJK COMPATIBILITY IDEOGRAPH-2F8B1 +2F8B2;W # CJK COMPATIBILITY IDEOGRAPH-2F8B2 +2F8B3;W # CJK COMPATIBILITY IDEOGRAPH-2F8B3 +2F8B4;W # CJK COMPATIBILITY IDEOGRAPH-2F8B4 +2F8B5;W # CJK COMPATIBILITY IDEOGRAPH-2F8B5 +2F8B6;W # CJK COMPATIBILITY IDEOGRAPH-2F8B6 +2F8B7;W # CJK COMPATIBILITY IDEOGRAPH-2F8B7 +2F8B8;W # CJK COMPATIBILITY IDEOGRAPH-2F8B8 +2F8B9;W # CJK COMPATIBILITY IDEOGRAPH-2F8B9 +2F8BA;W # CJK COMPATIBILITY IDEOGRAPH-2F8BA +2F8BB;W # CJK COMPATIBILITY IDEOGRAPH-2F8BB +2F8BC;W # CJK COMPATIBILITY IDEOGRAPH-2F8BC +2F8BD;W # CJK COMPATIBILITY IDEOGRAPH-2F8BD +2F8BE;W # CJK COMPATIBILITY IDEOGRAPH-2F8BE +2F8BF;W # CJK COMPATIBILITY IDEOGRAPH-2F8BF +2F8C0;W # CJK COMPATIBILITY IDEOGRAPH-2F8C0 +2F8C1;W # CJK COMPATIBILITY IDEOGRAPH-2F8C1 +2F8C2;W # CJK COMPATIBILITY IDEOGRAPH-2F8C2 +2F8C3;W # CJK COMPATIBILITY IDEOGRAPH-2F8C3 +2F8C4;W # CJK COMPATIBILITY IDEOGRAPH-2F8C4 +2F8C5;W # CJK COMPATIBILITY IDEOGRAPH-2F8C5 +2F8C6;W # CJK COMPATIBILITY IDEOGRAPH-2F8C6 +2F8C7;W # CJK COMPATIBILITY IDEOGRAPH-2F8C7 +2F8C8;W # CJK COMPATIBILITY IDEOGRAPH-2F8C8 +2F8C9;W # CJK COMPATIBILITY IDEOGRAPH-2F8C9 +2F8CA;W # CJK COMPATIBILITY IDEOGRAPH-2F8CA +2F8CB;W # CJK COMPATIBILITY IDEOGRAPH-2F8CB +2F8CC;W # CJK COMPATIBILITY IDEOGRAPH-2F8CC +2F8CD;W # CJK COMPATIBILITY IDEOGRAPH-2F8CD +2F8CE;W # CJK COMPATIBILITY IDEOGRAPH-2F8CE +2F8CF;W # CJK COMPATIBILITY IDEOGRAPH-2F8CF +2F8D0;W # CJK COMPATIBILITY IDEOGRAPH-2F8D0 +2F8D1;W # CJK COMPATIBILITY IDEOGRAPH-2F8D1 +2F8D2;W # CJK COMPATIBILITY IDEOGRAPH-2F8D2 +2F8D3;W # CJK COMPATIBILITY IDEOGRAPH-2F8D3 +2F8D4;W # CJK COMPATIBILITY IDEOGRAPH-2F8D4 +2F8D5;W # CJK COMPATIBILITY IDEOGRAPH-2F8D5 +2F8D6;W # CJK COMPATIBILITY IDEOGRAPH-2F8D6 +2F8D7;W # CJK COMPATIBILITY IDEOGRAPH-2F8D7 +2F8D8;W # CJK COMPATIBILITY IDEOGRAPH-2F8D8 +2F8D9;W # CJK COMPATIBILITY IDEOGRAPH-2F8D9 +2F8DA;W # CJK COMPATIBILITY IDEOGRAPH-2F8DA +2F8DB;W # CJK COMPATIBILITY IDEOGRAPH-2F8DB +2F8DC;W # CJK COMPATIBILITY IDEOGRAPH-2F8DC +2F8DD;W # CJK COMPATIBILITY IDEOGRAPH-2F8DD +2F8DE;W # CJK COMPATIBILITY IDEOGRAPH-2F8DE +2F8DF;W # CJK COMPATIBILITY IDEOGRAPH-2F8DF +2F8E0;W # CJK COMPATIBILITY IDEOGRAPH-2F8E0 +2F8E1;W # CJK COMPATIBILITY IDEOGRAPH-2F8E1 +2F8E2;W # CJK COMPATIBILITY IDEOGRAPH-2F8E2 +2F8E3;W # CJK COMPATIBILITY IDEOGRAPH-2F8E3 +2F8E4;W # CJK COMPATIBILITY IDEOGRAPH-2F8E4 +2F8E5;W # CJK COMPATIBILITY IDEOGRAPH-2F8E5 +2F8E6;W # CJK COMPATIBILITY IDEOGRAPH-2F8E6 +2F8E7;W # CJK COMPATIBILITY IDEOGRAPH-2F8E7 +2F8E8;W # CJK COMPATIBILITY IDEOGRAPH-2F8E8 +2F8E9;W # CJK COMPATIBILITY IDEOGRAPH-2F8E9 +2F8EA;W # CJK COMPATIBILITY IDEOGRAPH-2F8EA +2F8EB;W # CJK COMPATIBILITY IDEOGRAPH-2F8EB +2F8EC;W # CJK COMPATIBILITY IDEOGRAPH-2F8EC +2F8ED;W # CJK COMPATIBILITY IDEOGRAPH-2F8ED +2F8EE;W # CJK COMPATIBILITY IDEOGRAPH-2F8EE +2F8EF;W # CJK COMPATIBILITY IDEOGRAPH-2F8EF +2F8F0;W # CJK COMPATIBILITY IDEOGRAPH-2F8F0 +2F8F1;W # CJK COMPATIBILITY IDEOGRAPH-2F8F1 +2F8F2;W # CJK COMPATIBILITY IDEOGRAPH-2F8F2 +2F8F3;W # CJK COMPATIBILITY IDEOGRAPH-2F8F3 +2F8F4;W # CJK COMPATIBILITY IDEOGRAPH-2F8F4 +2F8F5;W # CJK COMPATIBILITY IDEOGRAPH-2F8F5 +2F8F6;W # CJK COMPATIBILITY IDEOGRAPH-2F8F6 +2F8F7;W # CJK COMPATIBILITY IDEOGRAPH-2F8F7 +2F8F8;W # CJK COMPATIBILITY IDEOGRAPH-2F8F8 +2F8F9;W # CJK COMPATIBILITY IDEOGRAPH-2F8F9 +2F8FA;W # CJK COMPATIBILITY IDEOGRAPH-2F8FA +2F8FB;W # CJK COMPATIBILITY IDEOGRAPH-2F8FB +2F8FC;W # CJK COMPATIBILITY IDEOGRAPH-2F8FC +2F8FD;W # CJK COMPATIBILITY IDEOGRAPH-2F8FD +2F8FE;W # CJK COMPATIBILITY IDEOGRAPH-2F8FE +2F8FF;W # CJK COMPATIBILITY IDEOGRAPH-2F8FF +2F900;W # CJK COMPATIBILITY IDEOGRAPH-2F900 +2F901;W # CJK COMPATIBILITY IDEOGRAPH-2F901 +2F902;W # CJK COMPATIBILITY IDEOGRAPH-2F902 +2F903;W # CJK COMPATIBILITY IDEOGRAPH-2F903 +2F904;W # CJK COMPATIBILITY IDEOGRAPH-2F904 +2F905;W # CJK COMPATIBILITY IDEOGRAPH-2F905 +2F906;W # CJK COMPATIBILITY IDEOGRAPH-2F906 +2F907;W # CJK COMPATIBILITY IDEOGRAPH-2F907 +2F908;W # CJK COMPATIBILITY IDEOGRAPH-2F908 +2F909;W # CJK COMPATIBILITY IDEOGRAPH-2F909 +2F90A;W # CJK COMPATIBILITY IDEOGRAPH-2F90A +2F90B;W # CJK COMPATIBILITY IDEOGRAPH-2F90B +2F90C;W # CJK COMPATIBILITY IDEOGRAPH-2F90C +2F90D;W # CJK COMPATIBILITY IDEOGRAPH-2F90D +2F90E;W # CJK COMPATIBILITY IDEOGRAPH-2F90E +2F90F;W # CJK COMPATIBILITY IDEOGRAPH-2F90F +2F910;W # CJK COMPATIBILITY IDEOGRAPH-2F910 +2F911;W # CJK COMPATIBILITY IDEOGRAPH-2F911 +2F912;W # CJK COMPATIBILITY IDEOGRAPH-2F912 +2F913;W # CJK COMPATIBILITY IDEOGRAPH-2F913 +2F914;W # CJK COMPATIBILITY IDEOGRAPH-2F914 +2F915;W # CJK COMPATIBILITY IDEOGRAPH-2F915 +2F916;W # CJK COMPATIBILITY IDEOGRAPH-2F916 +2F917;W # CJK COMPATIBILITY IDEOGRAPH-2F917 +2F918;W # CJK COMPATIBILITY IDEOGRAPH-2F918 +2F919;W # CJK COMPATIBILITY IDEOGRAPH-2F919 +2F91A;W # CJK COMPATIBILITY IDEOGRAPH-2F91A +2F91B;W # CJK COMPATIBILITY IDEOGRAPH-2F91B +2F91C;W # CJK COMPATIBILITY IDEOGRAPH-2F91C +2F91D;W # CJK COMPATIBILITY IDEOGRAPH-2F91D +2F91E;W # CJK COMPATIBILITY IDEOGRAPH-2F91E +2F91F;W # CJK COMPATIBILITY IDEOGRAPH-2F91F +2F920;W # CJK COMPATIBILITY IDEOGRAPH-2F920 +2F921;W # CJK COMPATIBILITY IDEOGRAPH-2F921 +2F922;W # CJK COMPATIBILITY IDEOGRAPH-2F922 +2F923;W # CJK COMPATIBILITY IDEOGRAPH-2F923 +2F924;W # CJK COMPATIBILITY IDEOGRAPH-2F924 +2F925;W # CJK COMPATIBILITY IDEOGRAPH-2F925 +2F926;W # CJK COMPATIBILITY IDEOGRAPH-2F926 +2F927;W # CJK COMPATIBILITY IDEOGRAPH-2F927 +2F928;W # CJK COMPATIBILITY IDEOGRAPH-2F928 +2F929;W # CJK COMPATIBILITY IDEOGRAPH-2F929 +2F92A;W # CJK COMPATIBILITY IDEOGRAPH-2F92A +2F92B;W # CJK COMPATIBILITY IDEOGRAPH-2F92B +2F92C;W # CJK COMPATIBILITY IDEOGRAPH-2F92C +2F92D;W # CJK COMPATIBILITY IDEOGRAPH-2F92D +2F92E;W # CJK COMPATIBILITY IDEOGRAPH-2F92E +2F92F;W # CJK COMPATIBILITY IDEOGRAPH-2F92F +2F930;W # CJK COMPATIBILITY IDEOGRAPH-2F930 +2F931;W # CJK COMPATIBILITY IDEOGRAPH-2F931 +2F932;W # CJK COMPATIBILITY IDEOGRAPH-2F932 +2F933;W # CJK COMPATIBILITY IDEOGRAPH-2F933 +2F934;W # CJK COMPATIBILITY IDEOGRAPH-2F934 +2F935;W # CJK COMPATIBILITY IDEOGRAPH-2F935 +2F936;W # CJK COMPATIBILITY IDEOGRAPH-2F936 +2F937;W # CJK COMPATIBILITY IDEOGRAPH-2F937 +2F938;W # CJK COMPATIBILITY IDEOGRAPH-2F938 +2F939;W # CJK COMPATIBILITY IDEOGRAPH-2F939 +2F93A;W # CJK COMPATIBILITY IDEOGRAPH-2F93A +2F93B;W # CJK COMPATIBILITY IDEOGRAPH-2F93B +2F93C;W # CJK COMPATIBILITY IDEOGRAPH-2F93C +2F93D;W # CJK COMPATIBILITY IDEOGRAPH-2F93D +2F93E;W # CJK COMPATIBILITY IDEOGRAPH-2F93E +2F93F;W # CJK COMPATIBILITY IDEOGRAPH-2F93F +2F940;W # CJK COMPATIBILITY IDEOGRAPH-2F940 +2F941;W # CJK COMPATIBILITY IDEOGRAPH-2F941 +2F942;W # CJK COMPATIBILITY IDEOGRAPH-2F942 +2F943;W # CJK COMPATIBILITY IDEOGRAPH-2F943 +2F944;W # CJK COMPATIBILITY IDEOGRAPH-2F944 +2F945;W # CJK COMPATIBILITY IDEOGRAPH-2F945 +2F946;W # CJK COMPATIBILITY IDEOGRAPH-2F946 +2F947;W # CJK COMPATIBILITY IDEOGRAPH-2F947 +2F948;W # CJK COMPATIBILITY IDEOGRAPH-2F948 +2F949;W # CJK COMPATIBILITY IDEOGRAPH-2F949 +2F94A;W # CJK COMPATIBILITY IDEOGRAPH-2F94A +2F94B;W # CJK COMPATIBILITY IDEOGRAPH-2F94B +2F94C;W # CJK COMPATIBILITY IDEOGRAPH-2F94C +2F94D;W # CJK COMPATIBILITY IDEOGRAPH-2F94D +2F94E;W # CJK COMPATIBILITY IDEOGRAPH-2F94E +2F94F;W # CJK COMPATIBILITY IDEOGRAPH-2F94F +2F950;W # CJK COMPATIBILITY IDEOGRAPH-2F950 +2F951;W # CJK COMPATIBILITY IDEOGRAPH-2F951 +2F952;W # CJK COMPATIBILITY IDEOGRAPH-2F952 +2F953;W # CJK COMPATIBILITY IDEOGRAPH-2F953 +2F954;W # CJK COMPATIBILITY IDEOGRAPH-2F954 +2F955;W # CJK COMPATIBILITY IDEOGRAPH-2F955 +2F956;W # CJK COMPATIBILITY IDEOGRAPH-2F956 +2F957;W # CJK COMPATIBILITY IDEOGRAPH-2F957 +2F958;W # CJK COMPATIBILITY IDEOGRAPH-2F958 +2F959;W # CJK COMPATIBILITY IDEOGRAPH-2F959 +2F95A;W # CJK COMPATIBILITY IDEOGRAPH-2F95A +2F95B;W # CJK COMPATIBILITY IDEOGRAPH-2F95B +2F95C;W # CJK COMPATIBILITY IDEOGRAPH-2F95C +2F95D;W # CJK COMPATIBILITY IDEOGRAPH-2F95D +2F95E;W # CJK COMPATIBILITY IDEOGRAPH-2F95E +2F95F;W # CJK COMPATIBILITY IDEOGRAPH-2F95F +2F960;W # CJK COMPATIBILITY IDEOGRAPH-2F960 +2F961;W # CJK COMPATIBILITY IDEOGRAPH-2F961 +2F962;W # CJK COMPATIBILITY IDEOGRAPH-2F962 +2F963;W # CJK COMPATIBILITY IDEOGRAPH-2F963 +2F964;W # CJK COMPATIBILITY IDEOGRAPH-2F964 +2F965;W # CJK COMPATIBILITY IDEOGRAPH-2F965 +2F966;W # CJK COMPATIBILITY IDEOGRAPH-2F966 +2F967;W # CJK COMPATIBILITY IDEOGRAPH-2F967 +2F968;W # CJK COMPATIBILITY IDEOGRAPH-2F968 +2F969;W # CJK COMPATIBILITY IDEOGRAPH-2F969 +2F96A;W # CJK COMPATIBILITY IDEOGRAPH-2F96A +2F96B;W # CJK COMPATIBILITY IDEOGRAPH-2F96B +2F96C;W # CJK COMPATIBILITY IDEOGRAPH-2F96C +2F96D;W # CJK COMPATIBILITY IDEOGRAPH-2F96D +2F96E;W # CJK COMPATIBILITY IDEOGRAPH-2F96E +2F96F;W # CJK COMPATIBILITY IDEOGRAPH-2F96F +2F970;W # CJK COMPATIBILITY IDEOGRAPH-2F970 +2F971;W # CJK COMPATIBILITY IDEOGRAPH-2F971 +2F972;W # CJK COMPATIBILITY IDEOGRAPH-2F972 +2F973;W # CJK COMPATIBILITY IDEOGRAPH-2F973 +2F974;W # CJK COMPATIBILITY IDEOGRAPH-2F974 +2F975;W # CJK COMPATIBILITY IDEOGRAPH-2F975 +2F976;W # CJK COMPATIBILITY IDEOGRAPH-2F976 +2F977;W # CJK COMPATIBILITY IDEOGRAPH-2F977 +2F978;W # CJK COMPATIBILITY IDEOGRAPH-2F978 +2F979;W # CJK COMPATIBILITY IDEOGRAPH-2F979 +2F97A;W # CJK COMPATIBILITY IDEOGRAPH-2F97A +2F97B;W # CJK COMPATIBILITY IDEOGRAPH-2F97B +2F97C;W # CJK COMPATIBILITY IDEOGRAPH-2F97C +2F97D;W # CJK COMPATIBILITY IDEOGRAPH-2F97D +2F97E;W # CJK COMPATIBILITY IDEOGRAPH-2F97E +2F97F;W # CJK COMPATIBILITY IDEOGRAPH-2F97F +2F980;W # CJK COMPATIBILITY IDEOGRAPH-2F980 +2F981;W # CJK COMPATIBILITY IDEOGRAPH-2F981 +2F982;W # CJK COMPATIBILITY IDEOGRAPH-2F982 +2F983;W # CJK COMPATIBILITY IDEOGRAPH-2F983 +2F984;W # CJK COMPATIBILITY IDEOGRAPH-2F984 +2F985;W # CJK COMPATIBILITY IDEOGRAPH-2F985 +2F986;W # CJK COMPATIBILITY IDEOGRAPH-2F986 +2F987;W # CJK COMPATIBILITY IDEOGRAPH-2F987 +2F988;W # CJK COMPATIBILITY IDEOGRAPH-2F988 +2F989;W # CJK COMPATIBILITY IDEOGRAPH-2F989 +2F98A;W # CJK COMPATIBILITY IDEOGRAPH-2F98A +2F98B;W # CJK COMPATIBILITY IDEOGRAPH-2F98B +2F98C;W # CJK COMPATIBILITY IDEOGRAPH-2F98C +2F98D;W # CJK COMPATIBILITY IDEOGRAPH-2F98D +2F98E;W # CJK COMPATIBILITY IDEOGRAPH-2F98E +2F98F;W # CJK COMPATIBILITY IDEOGRAPH-2F98F +2F990;W # CJK COMPATIBILITY IDEOGRAPH-2F990 +2F991;W # CJK COMPATIBILITY IDEOGRAPH-2F991 +2F992;W # CJK COMPATIBILITY IDEOGRAPH-2F992 +2F993;W # CJK COMPATIBILITY IDEOGRAPH-2F993 +2F994;W # CJK COMPATIBILITY IDEOGRAPH-2F994 +2F995;W # CJK COMPATIBILITY IDEOGRAPH-2F995 +2F996;W # CJK COMPATIBILITY IDEOGRAPH-2F996 +2F997;W # CJK COMPATIBILITY IDEOGRAPH-2F997 +2F998;W # CJK COMPATIBILITY IDEOGRAPH-2F998 +2F999;W # CJK COMPATIBILITY IDEOGRAPH-2F999 +2F99A;W # CJK COMPATIBILITY IDEOGRAPH-2F99A +2F99B;W # CJK COMPATIBILITY IDEOGRAPH-2F99B +2F99C;W # CJK COMPATIBILITY IDEOGRAPH-2F99C +2F99D;W # CJK COMPATIBILITY IDEOGRAPH-2F99D +2F99E;W # CJK COMPATIBILITY IDEOGRAPH-2F99E +2F99F;W # CJK COMPATIBILITY IDEOGRAPH-2F99F +2F9A0;W # CJK COMPATIBILITY IDEOGRAPH-2F9A0 +2F9A1;W # CJK COMPATIBILITY IDEOGRAPH-2F9A1 +2F9A2;W # CJK COMPATIBILITY IDEOGRAPH-2F9A2 +2F9A3;W # CJK COMPATIBILITY IDEOGRAPH-2F9A3 +2F9A4;W # CJK COMPATIBILITY IDEOGRAPH-2F9A4 +2F9A5;W # CJK COMPATIBILITY IDEOGRAPH-2F9A5 +2F9A6;W # CJK COMPATIBILITY IDEOGRAPH-2F9A6 +2F9A7;W # CJK COMPATIBILITY IDEOGRAPH-2F9A7 +2F9A8;W # CJK COMPATIBILITY IDEOGRAPH-2F9A8 +2F9A9;W # CJK COMPATIBILITY IDEOGRAPH-2F9A9 +2F9AA;W # CJK COMPATIBILITY IDEOGRAPH-2F9AA +2F9AB;W # CJK COMPATIBILITY IDEOGRAPH-2F9AB +2F9AC;W # CJK COMPATIBILITY IDEOGRAPH-2F9AC +2F9AD;W # CJK COMPATIBILITY IDEOGRAPH-2F9AD +2F9AE;W # CJK COMPATIBILITY IDEOGRAPH-2F9AE +2F9AF;W # CJK COMPATIBILITY IDEOGRAPH-2F9AF +2F9B0;W # CJK COMPATIBILITY IDEOGRAPH-2F9B0 +2F9B1;W # CJK COMPATIBILITY IDEOGRAPH-2F9B1 +2F9B2;W # CJK COMPATIBILITY IDEOGRAPH-2F9B2 +2F9B3;W # CJK COMPATIBILITY IDEOGRAPH-2F9B3 +2F9B4;W # CJK COMPATIBILITY IDEOGRAPH-2F9B4 +2F9B5;W # CJK COMPATIBILITY IDEOGRAPH-2F9B5 +2F9B6;W # CJK COMPATIBILITY IDEOGRAPH-2F9B6 +2F9B7;W # CJK COMPATIBILITY IDEOGRAPH-2F9B7 +2F9B8;W # CJK COMPATIBILITY IDEOGRAPH-2F9B8 +2F9B9;W # CJK COMPATIBILITY IDEOGRAPH-2F9B9 +2F9BA;W # CJK COMPATIBILITY IDEOGRAPH-2F9BA +2F9BB;W # CJK COMPATIBILITY IDEOGRAPH-2F9BB +2F9BC;W # CJK COMPATIBILITY IDEOGRAPH-2F9BC +2F9BD;W # CJK COMPATIBILITY IDEOGRAPH-2F9BD +2F9BE;W # CJK COMPATIBILITY IDEOGRAPH-2F9BE +2F9BF;W # CJK COMPATIBILITY IDEOGRAPH-2F9BF +2F9C0;W # CJK COMPATIBILITY IDEOGRAPH-2F9C0 +2F9C1;W # CJK COMPATIBILITY IDEOGRAPH-2F9C1 +2F9C2;W # CJK COMPATIBILITY IDEOGRAPH-2F9C2 +2F9C3;W # CJK COMPATIBILITY IDEOGRAPH-2F9C3 +2F9C4;W # CJK COMPATIBILITY IDEOGRAPH-2F9C4 +2F9C5;W # CJK COMPATIBILITY IDEOGRAPH-2F9C5 +2F9C6;W # CJK COMPATIBILITY IDEOGRAPH-2F9C6 +2F9C7;W # CJK COMPATIBILITY IDEOGRAPH-2F9C7 +2F9C8;W # CJK COMPATIBILITY IDEOGRAPH-2F9C8 +2F9C9;W # CJK COMPATIBILITY IDEOGRAPH-2F9C9 +2F9CA;W # CJK COMPATIBILITY IDEOGRAPH-2F9CA +2F9CB;W # CJK COMPATIBILITY IDEOGRAPH-2F9CB +2F9CC;W # CJK COMPATIBILITY IDEOGRAPH-2F9CC +2F9CD;W # CJK COMPATIBILITY IDEOGRAPH-2F9CD +2F9CE;W # CJK COMPATIBILITY IDEOGRAPH-2F9CE +2F9CF;W # CJK COMPATIBILITY IDEOGRAPH-2F9CF +2F9D0;W # CJK COMPATIBILITY IDEOGRAPH-2F9D0 +2F9D1;W # CJK COMPATIBILITY IDEOGRAPH-2F9D1 +2F9D2;W # CJK COMPATIBILITY IDEOGRAPH-2F9D2 +2F9D3;W # CJK COMPATIBILITY IDEOGRAPH-2F9D3 +2F9D4;W # CJK COMPATIBILITY IDEOGRAPH-2F9D4 +2F9D5;W # CJK COMPATIBILITY IDEOGRAPH-2F9D5 +2F9D6;W # CJK COMPATIBILITY IDEOGRAPH-2F9D6 +2F9D7;W # CJK COMPATIBILITY IDEOGRAPH-2F9D7 +2F9D8;W # CJK COMPATIBILITY IDEOGRAPH-2F9D8 +2F9D9;W # CJK COMPATIBILITY IDEOGRAPH-2F9D9 +2F9DA;W # CJK COMPATIBILITY IDEOGRAPH-2F9DA +2F9DB;W # CJK COMPATIBILITY IDEOGRAPH-2F9DB +2F9DC;W # CJK COMPATIBILITY IDEOGRAPH-2F9DC +2F9DD;W # CJK COMPATIBILITY IDEOGRAPH-2F9DD +2F9DE;W # CJK COMPATIBILITY IDEOGRAPH-2F9DE +2F9DF;W # CJK COMPATIBILITY IDEOGRAPH-2F9DF +2F9E0;W # CJK COMPATIBILITY IDEOGRAPH-2F9E0 +2F9E1;W # CJK COMPATIBILITY IDEOGRAPH-2F9E1 +2F9E2;W # CJK COMPATIBILITY IDEOGRAPH-2F9E2 +2F9E3;W # CJK COMPATIBILITY IDEOGRAPH-2F9E3 +2F9E4;W # CJK COMPATIBILITY IDEOGRAPH-2F9E4 +2F9E5;W # CJK COMPATIBILITY IDEOGRAPH-2F9E5 +2F9E6;W # CJK COMPATIBILITY IDEOGRAPH-2F9E6 +2F9E7;W # CJK COMPATIBILITY IDEOGRAPH-2F9E7 +2F9E8;W # CJK COMPATIBILITY IDEOGRAPH-2F9E8 +2F9E9;W # CJK COMPATIBILITY IDEOGRAPH-2F9E9 +2F9EA;W # CJK COMPATIBILITY IDEOGRAPH-2F9EA +2F9EB;W # CJK COMPATIBILITY IDEOGRAPH-2F9EB +2F9EC;W # CJK COMPATIBILITY IDEOGRAPH-2F9EC +2F9ED;W # CJK COMPATIBILITY IDEOGRAPH-2F9ED +2F9EE;W # CJK COMPATIBILITY IDEOGRAPH-2F9EE +2F9EF;W # CJK COMPATIBILITY IDEOGRAPH-2F9EF +2F9F0;W # CJK COMPATIBILITY IDEOGRAPH-2F9F0 +2F9F1;W # CJK COMPATIBILITY IDEOGRAPH-2F9F1 +2F9F2;W # CJK COMPATIBILITY IDEOGRAPH-2F9F2 +2F9F3;W # CJK COMPATIBILITY IDEOGRAPH-2F9F3 +2F9F4;W # CJK COMPATIBILITY IDEOGRAPH-2F9F4 +2F9F5;W # CJK COMPATIBILITY IDEOGRAPH-2F9F5 +2F9F6;W # CJK COMPATIBILITY IDEOGRAPH-2F9F6 +2F9F7;W # CJK COMPATIBILITY IDEOGRAPH-2F9F7 +2F9F8;W # CJK COMPATIBILITY IDEOGRAPH-2F9F8 +2F9F9;W # CJK COMPATIBILITY IDEOGRAPH-2F9F9 +2F9FA;W # CJK COMPATIBILITY IDEOGRAPH-2F9FA +2F9FB;W # CJK COMPATIBILITY IDEOGRAPH-2F9FB +2F9FC;W # CJK COMPATIBILITY IDEOGRAPH-2F9FC +2F9FD;W # CJK COMPATIBILITY IDEOGRAPH-2F9FD +2F9FE;W # CJK COMPATIBILITY IDEOGRAPH-2F9FE +2F9FF;W # CJK COMPATIBILITY IDEOGRAPH-2F9FF +2FA00;W # CJK COMPATIBILITY IDEOGRAPH-2FA00 +2FA01;W # CJK COMPATIBILITY IDEOGRAPH-2FA01 +2FA02;W # CJK COMPATIBILITY IDEOGRAPH-2FA02 +2FA03;W # CJK COMPATIBILITY IDEOGRAPH-2FA03 +2FA04;W # CJK COMPATIBILITY IDEOGRAPH-2FA04 +2FA05;W # CJK COMPATIBILITY IDEOGRAPH-2FA05 +2FA06;W # CJK COMPATIBILITY IDEOGRAPH-2FA06 +2FA07;W # CJK COMPATIBILITY IDEOGRAPH-2FA07 +2FA08;W # CJK COMPATIBILITY IDEOGRAPH-2FA08 +2FA09;W # CJK COMPATIBILITY IDEOGRAPH-2FA09 +2FA0A;W # CJK COMPATIBILITY IDEOGRAPH-2FA0A +2FA0B;W # CJK COMPATIBILITY IDEOGRAPH-2FA0B +2FA0C;W # CJK COMPATIBILITY IDEOGRAPH-2FA0C +2FA0D;W # CJK COMPATIBILITY IDEOGRAPH-2FA0D +2FA0E;W # CJK COMPATIBILITY IDEOGRAPH-2FA0E +2FA0F;W # CJK COMPATIBILITY IDEOGRAPH-2FA0F +2FA10;W # CJK COMPATIBILITY IDEOGRAPH-2FA10 +2FA11;W # CJK COMPATIBILITY IDEOGRAPH-2FA11 +2FA12;W # CJK COMPATIBILITY IDEOGRAPH-2FA12 +2FA13;W # CJK COMPATIBILITY IDEOGRAPH-2FA13 +2FA14;W # CJK COMPATIBILITY IDEOGRAPH-2FA14 +2FA15;W # CJK COMPATIBILITY IDEOGRAPH-2FA15 +2FA16;W # CJK COMPATIBILITY IDEOGRAPH-2FA16 +2FA17;W # CJK COMPATIBILITY IDEOGRAPH-2FA17 +2FA18;W # CJK COMPATIBILITY IDEOGRAPH-2FA18 +2FA19;W # CJK COMPATIBILITY IDEOGRAPH-2FA19 +2FA1A;W # CJK COMPATIBILITY IDEOGRAPH-2FA1A +2FA1B;W # CJK COMPATIBILITY IDEOGRAPH-2FA1B +2FA1C;W # CJK COMPATIBILITY IDEOGRAPH-2FA1C +2FA1D;W # CJK COMPATIBILITY IDEOGRAPH-2FA1D +2FA1E..2FFFD;W # <reserved> +30000..3FFFD;W # <reserved> +E0001;N # LANGUAGE TAG +E0020;N # TAG SPACE +E0021;N # TAG EXCLAMATION MARK +E0022;N # TAG QUOTATION MARK +E0023;N # TAG NUMBER SIGN +E0024;N # TAG DOLLAR SIGN +E0025;N # TAG PERCENT SIGN +E0026;N # TAG AMPERSAND +E0027;N # TAG APOSTROPHE +E0028;N # TAG LEFT PARENTHESIS +E0029;N # TAG RIGHT PARENTHESIS +E002A;N # TAG ASTERISK +E002B;N # TAG PLUS SIGN +E002C;N # TAG COMMA +E002D;N # TAG HYPHEN-MINUS +E002E;N # TAG FULL STOP +E002F;N # TAG SOLIDUS +E0030;N # TAG DIGIT ZERO +E0031;N # TAG DIGIT ONE +E0032;N # TAG DIGIT TWO +E0033;N # TAG DIGIT THREE +E0034;N # TAG DIGIT FOUR +E0035;N # TAG DIGIT FIVE +E0036;N # TAG DIGIT SIX +E0037;N # TAG DIGIT SEVEN +E0038;N # TAG DIGIT EIGHT +E0039;N # TAG DIGIT NINE +E003A;N # TAG COLON +E003B;N # TAG SEMICOLON +E003C;N # TAG LESS-THAN SIGN +E003D;N # TAG EQUALS SIGN +E003E;N # TAG GREATER-THAN SIGN +E003F;N # TAG QUESTION MARK +E0040;N # TAG COMMERCIAL AT +E0041;N # TAG LATIN CAPITAL LETTER A +E0042;N # TAG LATIN CAPITAL LETTER B +E0043;N # TAG LATIN CAPITAL LETTER C +E0044;N # TAG LATIN CAPITAL LETTER D +E0045;N # TAG LATIN CAPITAL LETTER E +E0046;N # TAG LATIN CAPITAL LETTER F +E0047;N # TAG LATIN CAPITAL LETTER G +E0048;N # TAG LATIN CAPITAL LETTER H +E0049;N # TAG LATIN CAPITAL LETTER I +E004A;N # TAG LATIN CAPITAL LETTER J +E004B;N # TAG LATIN CAPITAL LETTER K +E004C;N # TAG LATIN CAPITAL LETTER L +E004D;N # TAG LATIN CAPITAL LETTER M +E004E;N # TAG LATIN CAPITAL LETTER N +E004F;N # TAG LATIN CAPITAL LETTER O +E0050;N # TAG LATIN CAPITAL LETTER P +E0051;N # TAG LATIN CAPITAL LETTER Q +E0052;N # TAG LATIN CAPITAL LETTER R +E0053;N # TAG LATIN CAPITAL LETTER S +E0054;N # TAG LATIN CAPITAL LETTER T +E0055;N # TAG LATIN CAPITAL LETTER U +E0056;N # TAG LATIN CAPITAL LETTER V +E0057;N # TAG LATIN CAPITAL LETTER W +E0058;N # TAG LATIN CAPITAL LETTER X +E0059;N # TAG LATIN CAPITAL LETTER Y +E005A;N # TAG LATIN CAPITAL LETTER Z +E005B;N # TAG LEFT SQUARE BRACKET +E005C;N # TAG REVERSE SOLIDUS +E005D;N # TAG RIGHT SQUARE BRACKET +E005E;N # TAG CIRCUMFLEX ACCENT +E005F;N # TAG LOW LINE +E0060;N # TAG GRAVE ACCENT +E0061;N # TAG LATIN SMALL LETTER A +E0062;N # TAG LATIN SMALL LETTER B +E0063;N # TAG LATIN SMALL LETTER C +E0064;N # TAG LATIN SMALL LETTER D +E0065;N # TAG LATIN SMALL LETTER E +E0066;N # TAG LATIN SMALL LETTER F +E0067;N # TAG LATIN SMALL LETTER G +E0068;N # TAG LATIN SMALL LETTER H +E0069;N # TAG LATIN SMALL LETTER I +E006A;N # TAG LATIN SMALL LETTER J +E006B;N # TAG LATIN SMALL LETTER K +E006C;N # TAG LATIN SMALL LETTER L +E006D;N # TAG LATIN SMALL LETTER M +E006E;N # TAG LATIN SMALL LETTER N +E006F;N # TAG LATIN SMALL LETTER O +E0070;N # TAG LATIN SMALL LETTER P +E0071;N # TAG LATIN SMALL LETTER Q +E0072;N # TAG LATIN SMALL LETTER R +E0073;N # TAG LATIN SMALL LETTER S +E0074;N # TAG LATIN SMALL LETTER T +E0075;N # TAG LATIN SMALL LETTER U +E0076;N # TAG LATIN SMALL LETTER V +E0077;N # TAG LATIN SMALL LETTER W +E0078;N # TAG LATIN SMALL LETTER X +E0079;N # TAG LATIN SMALL LETTER Y +E007A;N # TAG LATIN SMALL LETTER Z +E007B;N # TAG LEFT CURLY BRACKET +E007C;N # TAG VERTICAL LINE +E007D;N # TAG RIGHT CURLY BRACKET +E007E;N # TAG TILDE +E007F;N # CANCEL TAG +E0100;A # VARIATION SELECTOR-17 +E0101;A # VARIATION SELECTOR-18 +E0102;A # VARIATION SELECTOR-19 +E0103;A # VARIATION SELECTOR-20 +E0104;A # VARIATION SELECTOR-21 +E0105;A # VARIATION SELECTOR-22 +E0106;A # VARIATION SELECTOR-23 +E0107;A # VARIATION SELECTOR-24 +E0108;A # VARIATION SELECTOR-25 +E0109;A # VARIATION SELECTOR-26 +E010A;A # VARIATION SELECTOR-27 +E010B;A # VARIATION SELECTOR-28 +E010C;A # VARIATION SELECTOR-29 +E010D;A # VARIATION SELECTOR-30 +E010E;A # VARIATION SELECTOR-31 +E010F;A # VARIATION SELECTOR-32 +E0110;A # VARIATION SELECTOR-33 +E0111;A # VARIATION SELECTOR-34 +E0112;A # VARIATION SELECTOR-35 +E0113;A # VARIATION SELECTOR-36 +E0114;A # VARIATION SELECTOR-37 +E0115;A # VARIATION SELECTOR-38 +E0116;A # VARIATION SELECTOR-39 +E0117;A # VARIATION SELECTOR-40 +E0118;A # VARIATION SELECTOR-41 +E0119;A # VARIATION SELECTOR-42 +E011A;A # VARIATION SELECTOR-43 +E011B;A # VARIATION SELECTOR-44 +E011C;A # VARIATION SELECTOR-45 +E011D;A # VARIATION SELECTOR-46 +E011E;A # VARIATION SELECTOR-47 +E011F;A # VARIATION SELECTOR-48 +E0120;A # VARIATION SELECTOR-49 +E0121;A # VARIATION SELECTOR-50 +E0122;A # VARIATION SELECTOR-51 +E0123;A # VARIATION SELECTOR-52 +E0124;A # VARIATION SELECTOR-53 +E0125;A # VARIATION SELECTOR-54 +E0126;A # VARIATION SELECTOR-55 +E0127;A # VARIATION SELECTOR-56 +E0128;A # VARIATION SELECTOR-57 +E0129;A # VARIATION SELECTOR-58 +E012A;A # VARIATION SELECTOR-59 +E012B;A # VARIATION SELECTOR-60 +E012C;A # VARIATION SELECTOR-61 +E012D;A # VARIATION SELECTOR-62 +E012E;A # VARIATION SELECTOR-63 +E012F;A # VARIATION SELECTOR-64 +E0130;A # VARIATION SELECTOR-65 +E0131;A # VARIATION SELECTOR-66 +E0132;A # VARIATION SELECTOR-67 +E0133;A # VARIATION SELECTOR-68 +E0134;A # VARIATION SELECTOR-69 +E0135;A # VARIATION SELECTOR-70 +E0136;A # VARIATION SELECTOR-71 +E0137;A # VARIATION SELECTOR-72 +E0138;A # VARIATION SELECTOR-73 +E0139;A # VARIATION SELECTOR-74 +E013A;A # VARIATION SELECTOR-75 +E013B;A # VARIATION SELECTOR-76 +E013C;A # VARIATION SELECTOR-77 +E013D;A # VARIATION SELECTOR-78 +E013E;A # VARIATION SELECTOR-79 +E013F;A # VARIATION SELECTOR-80 +E0140;A # VARIATION SELECTOR-81 +E0141;A # VARIATION SELECTOR-82 +E0142;A # VARIATION SELECTOR-83 +E0143;A # VARIATION SELECTOR-84 +E0144;A # VARIATION SELECTOR-85 +E0145;A # VARIATION SELECTOR-86 +E0146;A # VARIATION SELECTOR-87 +E0147;A # VARIATION SELECTOR-88 +E0148;A # VARIATION SELECTOR-89 +E0149;A # VARIATION SELECTOR-90 +E014A;A # VARIATION SELECTOR-91 +E014B;A # VARIATION SELECTOR-92 +E014C;A # VARIATION SELECTOR-93 +E014D;A # VARIATION SELECTOR-94 +E014E;A # VARIATION SELECTOR-95 +E014F;A # VARIATION SELECTOR-96 +E0150;A # VARIATION SELECTOR-97 +E0151;A # VARIATION SELECTOR-98 +E0152;A # VARIATION SELECTOR-99 +E0153;A # VARIATION SELECTOR-100 +E0154;A # VARIATION SELECTOR-101 +E0155;A # VARIATION SELECTOR-102 +E0156;A # VARIATION SELECTOR-103 +E0157;A # VARIATION SELECTOR-104 +E0158;A # VARIATION SELECTOR-105 +E0159;A # VARIATION SELECTOR-106 +E015A;A # VARIATION SELECTOR-107 +E015B;A # VARIATION SELECTOR-108 +E015C;A # VARIATION SELECTOR-109 +E015D;A # VARIATION SELECTOR-110 +E015E;A # VARIATION SELECTOR-111 +E015F;A # VARIATION SELECTOR-112 +E0160;A # VARIATION SELECTOR-113 +E0161;A # VARIATION SELECTOR-114 +E0162;A # VARIATION SELECTOR-115 +E0163;A # VARIATION SELECTOR-116 +E0164;A # VARIATION SELECTOR-117 +E0165;A # VARIATION SELECTOR-118 +E0166;A # VARIATION SELECTOR-119 +E0167;A # VARIATION SELECTOR-120 +E0168;A # VARIATION SELECTOR-121 +E0169;A # VARIATION SELECTOR-122 +E016A;A # VARIATION SELECTOR-123 +E016B;A # VARIATION SELECTOR-124 +E016C;A # VARIATION SELECTOR-125 +E016D;A # VARIATION SELECTOR-126 +E016E;A # VARIATION SELECTOR-127 +E016F;A # VARIATION SELECTOR-128 +E0170;A # VARIATION SELECTOR-129 +E0171;A # VARIATION SELECTOR-130 +E0172;A # VARIATION SELECTOR-131 +E0173;A # VARIATION SELECTOR-132 +E0174;A # VARIATION SELECTOR-133 +E0175;A # VARIATION SELECTOR-134 +E0176;A # VARIATION SELECTOR-135 +E0177;A # VARIATION SELECTOR-136 +E0178;A # VARIATION SELECTOR-137 +E0179;A # VARIATION SELECTOR-138 +E017A;A # VARIATION SELECTOR-139 +E017B;A # VARIATION SELECTOR-140 +E017C;A # VARIATION SELECTOR-141 +E017D;A # VARIATION SELECTOR-142 +E017E;A # VARIATION SELECTOR-143 +E017F;A # VARIATION SELECTOR-144 +E0180;A # VARIATION SELECTOR-145 +E0181;A # VARIATION SELECTOR-146 +E0182;A # VARIATION SELECTOR-147 +E0183;A # VARIATION SELECTOR-148 +E0184;A # VARIATION SELECTOR-149 +E0185;A # VARIATION SELECTOR-150 +E0186;A # VARIATION SELECTOR-151 +E0187;A # VARIATION SELECTOR-152 +E0188;A # VARIATION SELECTOR-153 +E0189;A # VARIATION SELECTOR-154 +E018A;A # VARIATION SELECTOR-155 +E018B;A # VARIATION SELECTOR-156 +E018C;A # VARIATION SELECTOR-157 +E018D;A # VARIATION SELECTOR-158 +E018E;A # VARIATION SELECTOR-159 +E018F;A # VARIATION SELECTOR-160 +E0190;A # VARIATION SELECTOR-161 +E0191;A # VARIATION SELECTOR-162 +E0192;A # VARIATION SELECTOR-163 +E0193;A # VARIATION SELECTOR-164 +E0194;A # VARIATION SELECTOR-165 +E0195;A # VARIATION SELECTOR-166 +E0196;A # VARIATION SELECTOR-167 +E0197;A # VARIATION SELECTOR-168 +E0198;A # VARIATION SELECTOR-169 +E0199;A # VARIATION SELECTOR-170 +E019A;A # VARIATION SELECTOR-171 +E019B;A # VARIATION SELECTOR-172 +E019C;A # VARIATION SELECTOR-173 +E019D;A # VARIATION SELECTOR-174 +E019E;A # VARIATION SELECTOR-175 +E019F;A # VARIATION SELECTOR-176 +E01A0;A # VARIATION SELECTOR-177 +E01A1;A # VARIATION SELECTOR-178 +E01A2;A # VARIATION SELECTOR-179 +E01A3;A # VARIATION SELECTOR-180 +E01A4;A # VARIATION SELECTOR-181 +E01A5;A # VARIATION SELECTOR-182 +E01A6;A # VARIATION SELECTOR-183 +E01A7;A # VARIATION SELECTOR-184 +E01A8;A # VARIATION SELECTOR-185 +E01A9;A # VARIATION SELECTOR-186 +E01AA;A # VARIATION SELECTOR-187 +E01AB;A # VARIATION SELECTOR-188 +E01AC;A # VARIATION SELECTOR-189 +E01AD;A # VARIATION SELECTOR-190 +E01AE;A # VARIATION SELECTOR-191 +E01AF;A # VARIATION SELECTOR-192 +E01B0;A # VARIATION SELECTOR-193 +E01B1;A # VARIATION SELECTOR-194 +E01B2;A # VARIATION SELECTOR-195 +E01B3;A # VARIATION SELECTOR-196 +E01B4;A # VARIATION SELECTOR-197 +E01B5;A # VARIATION SELECTOR-198 +E01B6;A # VARIATION SELECTOR-199 +E01B7;A # VARIATION SELECTOR-200 +E01B8;A # VARIATION SELECTOR-201 +E01B9;A # VARIATION SELECTOR-202 +E01BA;A # VARIATION SELECTOR-203 +E01BB;A # VARIATION SELECTOR-204 +E01BC;A # VARIATION SELECTOR-205 +E01BD;A # VARIATION SELECTOR-206 +E01BE;A # VARIATION SELECTOR-207 +E01BF;A # VARIATION SELECTOR-208 +E01C0;A # VARIATION SELECTOR-209 +E01C1;A # VARIATION SELECTOR-210 +E01C2;A # VARIATION SELECTOR-211 +E01C3;A # VARIATION SELECTOR-212 +E01C4;A # VARIATION SELECTOR-213 +E01C5;A # VARIATION SELECTOR-214 +E01C6;A # VARIATION SELECTOR-215 +E01C7;A # VARIATION SELECTOR-216 +E01C8;A # VARIATION SELECTOR-217 +E01C9;A # VARIATION SELECTOR-218 +E01CA;A # VARIATION SELECTOR-219 +E01CB;A # VARIATION SELECTOR-220 +E01CC;A # VARIATION SELECTOR-221 +E01CD;A # VARIATION SELECTOR-222 +E01CE;A # VARIATION SELECTOR-223 +E01CF;A # VARIATION SELECTOR-224 +E01D0;A # VARIATION SELECTOR-225 +E01D1;A # VARIATION SELECTOR-226 +E01D2;A # VARIATION SELECTOR-227 +E01D3;A # VARIATION SELECTOR-228 +E01D4;A # VARIATION SELECTOR-229 +E01D5;A # VARIATION SELECTOR-230 +E01D6;A # VARIATION SELECTOR-231 +E01D7;A # VARIATION SELECTOR-232 +E01D8;A # VARIATION SELECTOR-233 +E01D9;A # VARIATION SELECTOR-234 +E01DA;A # VARIATION SELECTOR-235 +E01DB;A # VARIATION SELECTOR-236 +E01DC;A # VARIATION SELECTOR-237 +E01DD;A # VARIATION SELECTOR-238 +E01DE;A # VARIATION SELECTOR-239 +E01DF;A # VARIATION SELECTOR-240 +E01E0;A # VARIATION SELECTOR-241 +E01E1;A # VARIATION SELECTOR-242 +E01E2;A # VARIATION SELECTOR-243 +E01E3;A # VARIATION SELECTOR-244 +E01E4;A # VARIATION SELECTOR-245 +E01E5;A # VARIATION SELECTOR-246 +E01E6;A # VARIATION SELECTOR-247 +E01E7;A # VARIATION SELECTOR-248 +E01E8;A # VARIATION SELECTOR-249 +E01E9;A # VARIATION SELECTOR-250 +E01EA;A # VARIATION SELECTOR-251 +E01EB;A # VARIATION SELECTOR-252 +E01EC;A # VARIATION SELECTOR-253 +E01ED;A # VARIATION SELECTOR-254 +E01EE;A # VARIATION SELECTOR-255 +E01EF;A # VARIATION SELECTOR-256 +F0000..FFFFD;A # <Plane 15 Private Use, First>..<Plane 15 Private Use, Last> +100000..10FFFD;A # <Plane 16 Private Use, First>..<Plane 16 Private Use, Last> diff --git a/Master/tlpkg/tlperl.old/lib/unicore/Exact.pl b/Master/tlpkg/tlperl.old/lib/unicore/Exact.pl new file mode 100644 index 00000000000..42312b054cc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/Exact.pl @@ -0,0 +1,73 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +## +## Data in this file used by ../utf8_heavy.pl +## + +## Mapping from name to filename in ./lib/gc_sc +%utf8::Exact = ( + ASCII => 'ASCII', + All => 'Any', + Alnum => 'Alnum', + Alpha => 'Alpha', + Any => 'Any', + Assigned => 'Assigned', + Blank => 'Blank', + C => 'C', + Cc => 'Cc', + Cf => 'Cf', + Cn => 'Cn', + Cntrl => 'Cntrl', + Co => 'Co', + Cs => 'Cs', + Digit => 'Digit', + Graph => 'Graph', + InGreek => 'InGreekA', + L => 'L', + LC => 'LC', + Ll => 'Ll', + Lm => 'Lm', + Lo => 'Lo', + Lower => 'Lower', + Lt => 'Lt', + Lu => 'Lu', + M => 'M', + Mc => 'Mc', + Me => 'Me', + Mn => 'Mn', + N => 'N', + Nd => 'Nd', + Nl => 'Nl', + No => 'No', + P => 'P', + Pc => 'Pc', + Pd => 'Pd', + Pe => 'Pe', + Pf => 'Pf', + Pi => 'Pi', + Po => 'Po', + Print => 'Print', + Ps => 'Ps', + Punct => 'Punct', + S => 'S', + Sc => 'Sc', + Sk => 'Sk', + Sm => 'Sm', + So => 'So', + Space => 'Space', + SpacePerl => 'SpacePer', + Title => 'Title', + Upper => 'Upper', + Word => 'Word', + XDigit => 'XDigit', + Z => 'Z', + Zl => 'Zl', + Zp => 'Zp', + Zs => 'Zs', + _CanonDCIJ => '_CanonDC', + _CaseIgnorable => '_CaseIgn', + _CombAbove => '_CombAbo', +); +1; diff --git a/Master/tlpkg/tlperl.old/lib/unicore/HangulSyllableType.txt b/Master/tlpkg/tlperl.old/lib/unicore/HangulSyllableType.txt new file mode 100644 index 00000000000..5c4b1f47116 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/HangulSyllableType.txt @@ -0,0 +1,851 @@ +# HangulSyllableType-4.1.0.txt +# Date: 2004-12-11, 05:44:43 GMT [MD] +# +# Unicode Character Database +# Copyright (c) 1991-2005 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html + +# ================================================ + +# Property: Hangul_Syllable_Type + +# All code points not explicitly listed for Hangul_Syllable_Type +# have the value Not_Applicable (NA). + +# ================================================ + +# Hangul_Syllable_Type=Leading_Jamo + +1100..1159 ; L # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH +115F ; L # Lo HANGUL CHOSEONG FILLER + +# Total code points: 91 + +# ================================================ + +# Hangul_Syllable_Type=Vowel_Jamo + +1160..11A2 ; V # Lo [67] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA + +# Total code points: 67 + +# ================================================ + +# Hangul_Syllable_Type=Trailing_Jamo + +11A8..11F9 ; T # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH + +# Total code points: 82 + +# ================================================ + +# Hangul_Syllable_Type=LV_Syllable + +AC00 ; LV # Lo HANGUL SYLLABLE GA +AC1C ; LV # Lo HANGUL SYLLABLE GAE +AC38 ; LV # Lo HANGUL SYLLABLE GYA +AC54 ; LV # Lo HANGUL SYLLABLE GYAE +AC70 ; LV # Lo HANGUL SYLLABLE GEO +AC8C ; LV # Lo HANGUL SYLLABLE GE +ACA8 ; LV # Lo HANGUL SYLLABLE GYEO +ACC4 ; LV # Lo HANGUL SYLLABLE GYE +ACE0 ; LV # Lo HANGUL SYLLABLE GO +ACFC ; LV # Lo HANGUL SYLLABLE GWA +AD18 ; LV # Lo HANGUL SYLLABLE GWAE +AD34 ; LV # Lo HANGUL SYLLABLE GOE +AD50 ; LV # Lo HANGUL SYLLABLE GYO +AD6C ; LV # Lo HANGUL SYLLABLE GU +AD88 ; LV # Lo HANGUL SYLLABLE GWEO +ADA4 ; LV # Lo HANGUL SYLLABLE GWE +ADC0 ; LV # Lo HANGUL SYLLABLE GWI +ADDC ; LV # Lo HANGUL SYLLABLE GYU +ADF8 ; LV # Lo HANGUL SYLLABLE GEU +AE14 ; LV # Lo HANGUL SYLLABLE GYI +AE30 ; LV # Lo HANGUL SYLLABLE GI +AE4C ; LV # Lo HANGUL SYLLABLE GGA +AE68 ; LV # Lo HANGUL SYLLABLE GGAE +AE84 ; LV # Lo HANGUL SYLLABLE GGYA +AEA0 ; LV # Lo HANGUL SYLLABLE GGYAE +AEBC ; LV # Lo HANGUL SYLLABLE GGEO +AED8 ; LV # Lo HANGUL SYLLABLE GGE +AEF4 ; LV # Lo HANGUL SYLLABLE GGYEO +AF10 ; LV # Lo HANGUL SYLLABLE GGYE +AF2C ; LV # Lo HANGUL SYLLABLE GGO +AF48 ; LV # Lo HANGUL SYLLABLE GGWA +AF64 ; LV # Lo HANGUL SYLLABLE GGWAE +AF80 ; LV # Lo HANGUL SYLLABLE GGOE +AF9C ; LV # Lo HANGUL SYLLABLE GGYO +AFB8 ; LV # Lo HANGUL SYLLABLE GGU +AFD4 ; LV # Lo HANGUL SYLLABLE GGWEO +AFF0 ; LV # Lo HANGUL SYLLABLE GGWE +B00C ; LV # Lo HANGUL SYLLABLE GGWI +B028 ; LV # Lo HANGUL SYLLABLE GGYU +B044 ; LV # Lo HANGUL SYLLABLE GGEU +B060 ; LV # Lo HANGUL SYLLABLE GGYI +B07C ; LV # Lo HANGUL SYLLABLE GGI +B098 ; LV # Lo HANGUL SYLLABLE NA +B0B4 ; LV # Lo HANGUL SYLLABLE NAE +B0D0 ; LV # Lo HANGUL SYLLABLE NYA +B0EC ; LV # Lo HANGUL SYLLABLE NYAE +B108 ; LV # Lo HANGUL SYLLABLE NEO +B124 ; LV # Lo HANGUL SYLLABLE NE +B140 ; LV # Lo HANGUL SYLLABLE NYEO +B15C ; LV # Lo HANGUL SYLLABLE NYE +B178 ; LV # Lo HANGUL SYLLABLE NO +B194 ; LV # Lo HANGUL SYLLABLE NWA +B1B0 ; LV # Lo HANGUL SYLLABLE NWAE +B1CC ; LV # Lo HANGUL SYLLABLE NOE +B1E8 ; LV # Lo HANGUL SYLLABLE NYO +B204 ; LV # Lo HANGUL SYLLABLE NU +B220 ; LV # Lo HANGUL SYLLABLE NWEO +B23C ; LV # Lo HANGUL SYLLABLE NWE +B258 ; LV # Lo HANGUL SYLLABLE NWI +B274 ; LV # Lo HANGUL SYLLABLE NYU +B290 ; LV # Lo HANGUL SYLLABLE NEU +B2AC ; LV # Lo HANGUL SYLLABLE NYI +B2C8 ; LV # Lo HANGUL SYLLABLE NI +B2E4 ; LV # Lo HANGUL SYLLABLE DA +B300 ; LV # Lo HANGUL SYLLABLE DAE +B31C ; LV # Lo HANGUL SYLLABLE DYA +B338 ; LV # Lo HANGUL SYLLABLE DYAE +B354 ; LV # Lo HANGUL SYLLABLE DEO +B370 ; LV # Lo HANGUL SYLLABLE DE +B38C ; LV # Lo HANGUL SYLLABLE DYEO +B3A8 ; LV # Lo HANGUL SYLLABLE DYE +B3C4 ; LV # Lo HANGUL SYLLABLE DO +B3E0 ; LV # Lo HANGUL SYLLABLE DWA +B3FC ; LV # Lo HANGUL SYLLABLE DWAE +B418 ; LV # Lo HANGUL SYLLABLE DOE +B434 ; LV # Lo HANGUL SYLLABLE DYO +B450 ; LV # Lo HANGUL SYLLABLE DU +B46C ; LV # Lo HANGUL SYLLABLE DWEO +B488 ; LV # Lo HANGUL SYLLABLE DWE +B4A4 ; LV # Lo HANGUL SYLLABLE DWI +B4C0 ; LV # Lo HANGUL SYLLABLE DYU +B4DC ; LV # Lo HANGUL SYLLABLE DEU +B4F8 ; LV # Lo HANGUL SYLLABLE DYI +B514 ; LV # Lo HANGUL SYLLABLE DI +B530 ; LV # Lo HANGUL SYLLABLE DDA +B54C ; LV # Lo HANGUL SYLLABLE DDAE +B568 ; LV # Lo HANGUL SYLLABLE DDYA +B584 ; LV # Lo HANGUL SYLLABLE DDYAE +B5A0 ; LV # Lo HANGUL SYLLABLE DDEO +B5BC ; LV # Lo HANGUL SYLLABLE DDE +B5D8 ; LV # Lo HANGUL SYLLABLE DDYEO +B5F4 ; LV # Lo HANGUL SYLLABLE DDYE +B610 ; LV # Lo HANGUL SYLLABLE DDO +B62C ; LV # Lo HANGUL SYLLABLE DDWA +B648 ; LV # Lo HANGUL SYLLABLE DDWAE +B664 ; LV # Lo HANGUL SYLLABLE DDOE +B680 ; LV # Lo HANGUL SYLLABLE DDYO +B69C ; LV # Lo HANGUL SYLLABLE DDU +B6B8 ; LV # Lo HANGUL SYLLABLE DDWEO +B6D4 ; LV # Lo HANGUL SYLLABLE DDWE +B6F0 ; LV # Lo HANGUL SYLLABLE DDWI +B70C ; LV # Lo HANGUL SYLLABLE DDYU +B728 ; LV # Lo HANGUL SYLLABLE DDEU +B744 ; LV # Lo HANGUL SYLLABLE DDYI +B760 ; LV # Lo HANGUL SYLLABLE DDI +B77C ; LV # Lo HANGUL SYLLABLE RA +B798 ; LV # Lo HANGUL SYLLABLE RAE +B7B4 ; LV # Lo HANGUL SYLLABLE RYA +B7D0 ; LV # Lo HANGUL SYLLABLE RYAE +B7EC ; LV # Lo HANGUL SYLLABLE REO +B808 ; LV # Lo HANGUL SYLLABLE RE +B824 ; LV # Lo HANGUL SYLLABLE RYEO +B840 ; LV # Lo HANGUL SYLLABLE RYE +B85C ; LV # Lo HANGUL SYLLABLE RO +B878 ; LV # Lo HANGUL SYLLABLE RWA +B894 ; LV # Lo HANGUL SYLLABLE RWAE +B8B0 ; LV # Lo HANGUL SYLLABLE ROE +B8CC ; LV # Lo HANGUL SYLLABLE RYO +B8E8 ; LV # Lo HANGUL SYLLABLE RU +B904 ; LV # Lo HANGUL SYLLABLE RWEO +B920 ; LV # Lo HANGUL SYLLABLE RWE +B93C ; LV # Lo HANGUL SYLLABLE RWI +B958 ; LV # Lo HANGUL SYLLABLE RYU +B974 ; LV # Lo HANGUL SYLLABLE REU +B990 ; LV # Lo HANGUL SYLLABLE RYI +B9AC ; LV # Lo HANGUL SYLLABLE RI +B9C8 ; LV # Lo HANGUL SYLLABLE MA +B9E4 ; LV # Lo HANGUL SYLLABLE MAE +BA00 ; LV # Lo HANGUL SYLLABLE MYA +BA1C ; LV # Lo HANGUL SYLLABLE MYAE +BA38 ; LV # Lo HANGUL SYLLABLE MEO +BA54 ; LV # Lo HANGUL SYLLABLE ME +BA70 ; LV # Lo HANGUL SYLLABLE MYEO +BA8C ; LV # Lo HANGUL SYLLABLE MYE +BAA8 ; LV # Lo HANGUL SYLLABLE MO +BAC4 ; LV # Lo HANGUL SYLLABLE MWA +BAE0 ; LV # Lo HANGUL SYLLABLE MWAE +BAFC ; LV # Lo HANGUL SYLLABLE MOE +BB18 ; LV # Lo HANGUL SYLLABLE MYO +BB34 ; LV # Lo HANGUL SYLLABLE MU +BB50 ; LV # Lo HANGUL SYLLABLE MWEO +BB6C ; LV # Lo HANGUL SYLLABLE MWE +BB88 ; LV # Lo HANGUL SYLLABLE MWI +BBA4 ; LV # Lo HANGUL SYLLABLE MYU +BBC0 ; LV # Lo HANGUL SYLLABLE MEU +BBDC ; LV # Lo HANGUL SYLLABLE MYI +BBF8 ; LV # Lo HANGUL SYLLABLE MI +BC14 ; LV # Lo HANGUL SYLLABLE BA +BC30 ; LV # Lo HANGUL SYLLABLE BAE +BC4C ; LV # Lo HANGUL SYLLABLE BYA +BC68 ; LV # Lo HANGUL SYLLABLE BYAE +BC84 ; LV # Lo HANGUL SYLLABLE BEO +BCA0 ; LV # Lo HANGUL SYLLABLE BE +BCBC ; LV # Lo HANGUL SYLLABLE BYEO +BCD8 ; LV # Lo HANGUL SYLLABLE BYE +BCF4 ; LV # Lo HANGUL SYLLABLE BO +BD10 ; LV # Lo HANGUL SYLLABLE BWA +BD2C ; LV # Lo HANGUL SYLLABLE BWAE +BD48 ; LV # Lo HANGUL SYLLABLE BOE +BD64 ; LV # Lo HANGUL SYLLABLE BYO +BD80 ; LV # Lo HANGUL SYLLABLE BU +BD9C ; LV # Lo HANGUL SYLLABLE BWEO +BDB8 ; LV # Lo HANGUL SYLLABLE BWE +BDD4 ; LV # Lo HANGUL SYLLABLE BWI +BDF0 ; LV # Lo HANGUL SYLLABLE BYU +BE0C ; LV # Lo HANGUL SYLLABLE BEU +BE28 ; LV # Lo HANGUL SYLLABLE BYI +BE44 ; LV # Lo HANGUL SYLLABLE BI +BE60 ; LV # Lo HANGUL SYLLABLE BBA +BE7C ; LV # Lo HANGUL SYLLABLE BBAE +BE98 ; LV # Lo HANGUL SYLLABLE BBYA +BEB4 ; LV # Lo HANGUL SYLLABLE BBYAE +BED0 ; LV # Lo HANGUL SYLLABLE BBEO +BEEC ; LV # Lo HANGUL SYLLABLE BBE +BF08 ; LV # Lo HANGUL SYLLABLE BBYEO +BF24 ; LV # Lo HANGUL SYLLABLE BBYE +BF40 ; LV # Lo HANGUL SYLLABLE BBO +BF5C ; LV # Lo HANGUL SYLLABLE BBWA +BF78 ; LV # Lo HANGUL SYLLABLE BBWAE +BF94 ; LV # Lo HANGUL SYLLABLE BBOE +BFB0 ; LV # Lo HANGUL SYLLABLE BBYO +BFCC ; LV # Lo HANGUL SYLLABLE BBU +BFE8 ; LV # Lo HANGUL SYLLABLE BBWEO +C004 ; LV # Lo HANGUL SYLLABLE BBWE +C020 ; LV # Lo HANGUL SYLLABLE BBWI +C03C ; LV # Lo HANGUL SYLLABLE BBYU +C058 ; LV # Lo HANGUL SYLLABLE BBEU +C074 ; LV # Lo HANGUL SYLLABLE BBYI +C090 ; LV # Lo HANGUL SYLLABLE BBI +C0AC ; LV # Lo HANGUL SYLLABLE SA +C0C8 ; LV # Lo HANGUL SYLLABLE SAE +C0E4 ; LV # Lo HANGUL SYLLABLE SYA +C100 ; LV # Lo HANGUL SYLLABLE SYAE +C11C ; LV # Lo HANGUL SYLLABLE SEO +C138 ; LV # Lo HANGUL SYLLABLE SE +C154 ; LV # Lo HANGUL SYLLABLE SYEO +C170 ; LV # Lo HANGUL SYLLABLE SYE +C18C ; LV # Lo HANGUL SYLLABLE SO +C1A8 ; LV # Lo HANGUL SYLLABLE SWA +C1C4 ; LV # Lo HANGUL SYLLABLE SWAE +C1E0 ; LV # Lo HANGUL SYLLABLE SOE +C1FC ; LV # Lo HANGUL SYLLABLE SYO +C218 ; LV # Lo HANGUL SYLLABLE SU +C234 ; LV # Lo HANGUL SYLLABLE SWEO +C250 ; LV # Lo HANGUL SYLLABLE SWE +C26C ; LV # Lo HANGUL SYLLABLE SWI +C288 ; LV # Lo HANGUL SYLLABLE SYU +C2A4 ; LV # Lo HANGUL SYLLABLE SEU +C2C0 ; LV # Lo HANGUL SYLLABLE SYI +C2DC ; LV # Lo HANGUL SYLLABLE SI +C2F8 ; LV # Lo HANGUL SYLLABLE SSA +C314 ; LV # Lo HANGUL SYLLABLE SSAE +C330 ; LV # Lo HANGUL SYLLABLE SSYA +C34C ; LV # Lo HANGUL SYLLABLE SSYAE +C368 ; LV # Lo HANGUL SYLLABLE SSEO +C384 ; LV # Lo HANGUL SYLLABLE SSE +C3A0 ; LV # Lo HANGUL SYLLABLE SSYEO +C3BC ; LV # Lo HANGUL SYLLABLE SSYE +C3D8 ; LV # Lo HANGUL SYLLABLE SSO +C3F4 ; LV # Lo HANGUL SYLLABLE SSWA +C410 ; LV # Lo HANGUL SYLLABLE SSWAE +C42C ; LV # Lo HANGUL SYLLABLE SSOE +C448 ; LV # Lo HANGUL SYLLABLE SSYO +C464 ; LV # Lo HANGUL SYLLABLE SSU +C480 ; LV # Lo HANGUL SYLLABLE SSWEO +C49C ; LV # Lo HANGUL SYLLABLE SSWE +C4B8 ; LV # Lo HANGUL SYLLABLE SSWI +C4D4 ; LV # Lo HANGUL SYLLABLE SSYU +C4F0 ; LV # Lo HANGUL SYLLABLE SSEU +C50C ; LV # Lo HANGUL SYLLABLE SSYI +C528 ; LV # Lo HANGUL SYLLABLE SSI +C544 ; LV # Lo HANGUL SYLLABLE A +C560 ; LV # Lo HANGUL SYLLABLE AE +C57C ; LV # Lo HANGUL SYLLABLE YA +C598 ; LV # Lo HANGUL SYLLABLE YAE +C5B4 ; LV # Lo HANGUL SYLLABLE EO +C5D0 ; LV # Lo HANGUL SYLLABLE E +C5EC ; LV # Lo HANGUL SYLLABLE YEO +C608 ; LV # Lo HANGUL SYLLABLE YE +C624 ; LV # Lo HANGUL SYLLABLE O +C640 ; LV # Lo HANGUL SYLLABLE WA +C65C ; LV # Lo HANGUL SYLLABLE WAE +C678 ; LV # Lo HANGUL SYLLABLE OE +C694 ; LV # Lo HANGUL SYLLABLE YO +C6B0 ; LV # Lo HANGUL SYLLABLE U +C6CC ; LV # Lo HANGUL SYLLABLE WEO +C6E8 ; LV # Lo HANGUL SYLLABLE WE +C704 ; LV # Lo HANGUL SYLLABLE WI +C720 ; LV # Lo HANGUL SYLLABLE YU +C73C ; LV # Lo HANGUL SYLLABLE EU +C758 ; LV # Lo HANGUL SYLLABLE YI +C774 ; LV # Lo HANGUL SYLLABLE I +C790 ; LV # Lo HANGUL SYLLABLE JA +C7AC ; LV # Lo HANGUL SYLLABLE JAE +C7C8 ; LV # Lo HANGUL SYLLABLE JYA +C7E4 ; LV # Lo HANGUL SYLLABLE JYAE +C800 ; LV # Lo HANGUL SYLLABLE JEO +C81C ; LV # Lo HANGUL SYLLABLE JE +C838 ; LV # Lo HANGUL SYLLABLE JYEO +C854 ; LV # Lo HANGUL SYLLABLE JYE +C870 ; LV # Lo HANGUL SYLLABLE JO +C88C ; LV # Lo HANGUL SYLLABLE JWA +C8A8 ; LV # Lo HANGUL SYLLABLE JWAE +C8C4 ; LV # Lo HANGUL SYLLABLE JOE +C8E0 ; LV # Lo HANGUL SYLLABLE JYO +C8FC ; LV # Lo HANGUL SYLLABLE JU +C918 ; LV # Lo HANGUL SYLLABLE JWEO +C934 ; LV # Lo HANGUL SYLLABLE JWE +C950 ; LV # Lo HANGUL SYLLABLE JWI +C96C ; LV # Lo HANGUL SYLLABLE JYU +C988 ; LV # Lo HANGUL SYLLABLE JEU +C9A4 ; LV # Lo HANGUL SYLLABLE JYI +C9C0 ; LV # Lo HANGUL SYLLABLE JI +C9DC ; LV # Lo HANGUL SYLLABLE JJA +C9F8 ; LV # Lo HANGUL SYLLABLE JJAE +CA14 ; LV # Lo HANGUL SYLLABLE JJYA +CA30 ; LV # Lo HANGUL SYLLABLE JJYAE +CA4C ; LV # Lo HANGUL SYLLABLE JJEO +CA68 ; LV # Lo HANGUL SYLLABLE JJE +CA84 ; LV # Lo HANGUL SYLLABLE JJYEO +CAA0 ; LV # Lo HANGUL SYLLABLE JJYE +CABC ; LV # Lo HANGUL SYLLABLE JJO +CAD8 ; LV # Lo HANGUL SYLLABLE JJWA +CAF4 ; LV # Lo HANGUL SYLLABLE JJWAE +CB10 ; LV # Lo HANGUL SYLLABLE JJOE +CB2C ; LV # Lo HANGUL SYLLABLE JJYO +CB48 ; LV # Lo HANGUL SYLLABLE JJU +CB64 ; LV # Lo HANGUL SYLLABLE JJWEO +CB80 ; LV # Lo HANGUL SYLLABLE JJWE +CB9C ; LV # Lo HANGUL SYLLABLE JJWI +CBB8 ; LV # Lo HANGUL SYLLABLE JJYU +CBD4 ; LV # Lo HANGUL SYLLABLE JJEU +CBF0 ; LV # Lo HANGUL SYLLABLE JJYI +CC0C ; LV # Lo HANGUL SYLLABLE JJI +CC28 ; LV # Lo HANGUL SYLLABLE CA +CC44 ; LV # Lo HANGUL SYLLABLE CAE +CC60 ; LV # Lo HANGUL SYLLABLE CYA +CC7C ; LV # Lo HANGUL SYLLABLE CYAE +CC98 ; LV # Lo HANGUL SYLLABLE CEO +CCB4 ; LV # Lo HANGUL SYLLABLE CE +CCD0 ; LV # Lo HANGUL SYLLABLE CYEO +CCEC ; LV # Lo HANGUL SYLLABLE CYE +CD08 ; LV # Lo HANGUL SYLLABLE CO +CD24 ; LV # Lo HANGUL SYLLABLE CWA +CD40 ; LV # Lo HANGUL SYLLABLE CWAE +CD5C ; LV # Lo HANGUL SYLLABLE COE +CD78 ; LV # Lo HANGUL SYLLABLE CYO +CD94 ; LV # Lo HANGUL SYLLABLE CU +CDB0 ; LV # Lo HANGUL SYLLABLE CWEO +CDCC ; LV # Lo HANGUL SYLLABLE CWE +CDE8 ; LV # Lo HANGUL SYLLABLE CWI +CE04 ; LV # Lo HANGUL SYLLABLE CYU +CE20 ; LV # Lo HANGUL SYLLABLE CEU +CE3C ; LV # Lo HANGUL SYLLABLE CYI +CE58 ; LV # Lo HANGUL SYLLABLE CI +CE74 ; LV # Lo HANGUL SYLLABLE KA +CE90 ; LV # Lo HANGUL SYLLABLE KAE +CEAC ; LV # Lo HANGUL SYLLABLE KYA +CEC8 ; LV # Lo HANGUL SYLLABLE KYAE +CEE4 ; LV # Lo HANGUL SYLLABLE KEO +CF00 ; LV # Lo HANGUL SYLLABLE KE +CF1C ; LV # Lo HANGUL SYLLABLE KYEO +CF38 ; LV # Lo HANGUL SYLLABLE KYE +CF54 ; LV # Lo HANGUL SYLLABLE KO +CF70 ; LV # Lo HANGUL SYLLABLE KWA +CF8C ; LV # Lo HANGUL SYLLABLE KWAE +CFA8 ; LV # Lo HANGUL SYLLABLE KOE +CFC4 ; LV # Lo HANGUL SYLLABLE KYO +CFE0 ; LV # Lo HANGUL SYLLABLE KU +CFFC ; LV # Lo HANGUL SYLLABLE KWEO +D018 ; LV # Lo HANGUL SYLLABLE KWE +D034 ; LV # Lo HANGUL SYLLABLE KWI +D050 ; LV # Lo HANGUL SYLLABLE KYU +D06C ; LV # Lo HANGUL SYLLABLE KEU +D088 ; LV # Lo HANGUL SYLLABLE KYI +D0A4 ; LV # Lo HANGUL SYLLABLE KI +D0C0 ; LV # Lo HANGUL SYLLABLE TA +D0DC ; LV # Lo HANGUL SYLLABLE TAE +D0F8 ; LV # Lo HANGUL SYLLABLE TYA +D114 ; LV # Lo HANGUL SYLLABLE TYAE +D130 ; LV # Lo HANGUL SYLLABLE TEO +D14C ; LV # Lo HANGUL SYLLABLE TE +D168 ; LV # Lo HANGUL SYLLABLE TYEO +D184 ; LV # Lo HANGUL SYLLABLE TYE +D1A0 ; LV # Lo HANGUL SYLLABLE TO +D1BC ; LV # Lo HANGUL SYLLABLE TWA +D1D8 ; LV # Lo HANGUL SYLLABLE TWAE +D1F4 ; LV # Lo HANGUL SYLLABLE TOE +D210 ; LV # Lo HANGUL SYLLABLE TYO +D22C ; LV # Lo HANGUL SYLLABLE TU +D248 ; LV # Lo HANGUL SYLLABLE TWEO +D264 ; LV # Lo HANGUL SYLLABLE TWE +D280 ; LV # Lo HANGUL SYLLABLE TWI +D29C ; LV # Lo HANGUL SYLLABLE TYU +D2B8 ; LV # Lo HANGUL SYLLABLE TEU +D2D4 ; LV # Lo HANGUL SYLLABLE TYI +D2F0 ; LV # Lo HANGUL SYLLABLE TI +D30C ; LV # Lo HANGUL SYLLABLE PA +D328 ; LV # Lo HANGUL SYLLABLE PAE +D344 ; LV # Lo HANGUL SYLLABLE PYA +D360 ; LV # Lo HANGUL SYLLABLE PYAE +D37C ; LV # Lo HANGUL SYLLABLE PEO +D398 ; LV # Lo HANGUL SYLLABLE PE +D3B4 ; LV # Lo HANGUL SYLLABLE PYEO +D3D0 ; LV # Lo HANGUL SYLLABLE PYE +D3EC ; LV # Lo HANGUL SYLLABLE PO +D408 ; LV # Lo HANGUL SYLLABLE PWA +D424 ; LV # Lo HANGUL SYLLABLE PWAE +D440 ; LV # Lo HANGUL SYLLABLE POE +D45C ; LV # Lo HANGUL SYLLABLE PYO +D478 ; LV # Lo HANGUL SYLLABLE PU +D494 ; LV # Lo HANGUL SYLLABLE PWEO +D4B0 ; LV # Lo HANGUL SYLLABLE PWE +D4CC ; LV # Lo HANGUL SYLLABLE PWI +D4E8 ; LV # Lo HANGUL SYLLABLE PYU +D504 ; LV # Lo HANGUL SYLLABLE PEU +D520 ; LV # Lo HANGUL SYLLABLE PYI +D53C ; LV # Lo HANGUL SYLLABLE PI +D558 ; LV # Lo HANGUL SYLLABLE HA +D574 ; LV # Lo HANGUL SYLLABLE HAE +D590 ; LV # Lo HANGUL SYLLABLE HYA +D5AC ; LV # Lo HANGUL SYLLABLE HYAE +D5C8 ; LV # Lo HANGUL SYLLABLE HEO +D5E4 ; LV # Lo HANGUL SYLLABLE HE +D600 ; LV # Lo HANGUL SYLLABLE HYEO +D61C ; LV # Lo HANGUL SYLLABLE HYE +D638 ; LV # Lo HANGUL SYLLABLE HO +D654 ; LV # Lo HANGUL SYLLABLE HWA +D670 ; LV # Lo HANGUL SYLLABLE HWAE +D68C ; LV # Lo HANGUL SYLLABLE HOE +D6A8 ; LV # Lo HANGUL SYLLABLE HYO +D6C4 ; LV # Lo HANGUL SYLLABLE HU +D6E0 ; LV # Lo HANGUL SYLLABLE HWEO +D6FC ; LV # Lo HANGUL SYLLABLE HWE +D718 ; LV # Lo HANGUL SYLLABLE HWI +D734 ; LV # Lo HANGUL SYLLABLE HYU +D750 ; LV # Lo HANGUL SYLLABLE HEU +D76C ; LV # Lo HANGUL SYLLABLE HYI +D788 ; LV # Lo HANGUL SYLLABLE HI + +# Total code points: 399 + +# ================================================ + +# Hangul_Syllable_Type=LVT_Syllable + +AC01..AC1B ; LVT # Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH +AC1D..AC37 ; LVT # Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH +AC39..AC53 ; LVT # Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH +AC55..AC6F ; LVT # Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH +AC71..AC8B ; LVT # Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH +AC8D..ACA7 ; LVT # Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH +ACA9..ACC3 ; LVT # Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH +ACC5..ACDF ; LVT # Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH +ACE1..ACFB ; LVT # Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH +ACFD..AD17 ; LVT # Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH +AD19..AD33 ; LVT # Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH +AD35..AD4F ; LVT # Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH +AD51..AD6B ; LVT # Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH +AD6D..AD87 ; LVT # Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH +AD89..ADA3 ; LVT # Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH +ADA5..ADBF ; LVT # Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH +ADC1..ADDB ; LVT # Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH +ADDD..ADF7 ; LVT # Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH +ADF9..AE13 ; LVT # Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH +AE15..AE2F ; LVT # Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH +AE31..AE4B ; LVT # Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH +AE4D..AE67 ; LVT # Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH +AE69..AE83 ; LVT # Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH +AE85..AE9F ; LVT # Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH +AEA1..AEBB ; LVT # Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH +AEBD..AED7 ; LVT # Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH +AED9..AEF3 ; LVT # Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH +AEF5..AF0F ; LVT # Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH +AF11..AF2B ; LVT # Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH +AF2D..AF47 ; LVT # Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH +AF49..AF63 ; LVT # Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH +AF65..AF7F ; LVT # Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH +AF81..AF9B ; LVT # Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH +AF9D..AFB7 ; LVT # Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH +AFB9..AFD3 ; LVT # Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH +AFD5..AFEF ; LVT # Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH +AFF1..B00B ; LVT # Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH +B00D..B027 ; LVT # Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH +B029..B043 ; LVT # Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH +B045..B05F ; LVT # Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH +B061..B07B ; LVT # Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH +B07D..B097 ; LVT # Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH +B099..B0B3 ; LVT # Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH +B0B5..B0CF ; LVT # Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH +B0D1..B0EB ; LVT # Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH +B0ED..B107 ; LVT # Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH +B109..B123 ; LVT # Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH +B125..B13F ; LVT # Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH +B141..B15B ; LVT # Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH +B15D..B177 ; LVT # Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH +B179..B193 ; LVT # Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH +B195..B1AF ; LVT # Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH +B1B1..B1CB ; LVT # Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH +B1CD..B1E7 ; LVT # Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH +B1E9..B203 ; LVT # Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH +B205..B21F ; LVT # Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH +B221..B23B ; LVT # Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH +B23D..B257 ; LVT # Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH +B259..B273 ; LVT # Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH +B275..B28F ; LVT # Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH +B291..B2AB ; LVT # Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH +B2AD..B2C7 ; LVT # Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH +B2C9..B2E3 ; LVT # Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH +B2E5..B2FF ; LVT # Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH +B301..B31B ; LVT # Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH +B31D..B337 ; LVT # Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH +B339..B353 ; LVT # Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH +B355..B36F ; LVT # Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH +B371..B38B ; LVT # Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH +B38D..B3A7 ; LVT # Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH +B3A9..B3C3 ; LVT # Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH +B3C5..B3DF ; LVT # Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH +B3E1..B3FB ; LVT # Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH +B3FD..B417 ; LVT # Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH +B419..B433 ; LVT # Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH +B435..B44F ; LVT # Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH +B451..B46B ; LVT # Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH +B46D..B487 ; LVT # Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH +B489..B4A3 ; LVT # Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH +B4A5..B4BF ; LVT # Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH +B4C1..B4DB ; LVT # Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH +B4DD..B4F7 ; LVT # Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH +B4F9..B513 ; LVT # Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH +B515..B52F ; LVT # Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH +B531..B54B ; LVT # Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH +B54D..B567 ; LVT # Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH +B569..B583 ; LVT # Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH +B585..B59F ; LVT # Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH +B5A1..B5BB ; LVT # Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH +B5BD..B5D7 ; LVT # Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH +B5D9..B5F3 ; LVT # Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH +B5F5..B60F ; LVT # Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH +B611..B62B ; LVT # Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH +B62D..B647 ; LVT # Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH +B649..B663 ; LVT # Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH +B665..B67F ; LVT # Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH +B681..B69B ; LVT # Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH +B69D..B6B7 ; LVT # Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH +B6B9..B6D3 ; LVT # Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH +B6D5..B6EF ; LVT # Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH +B6F1..B70B ; LVT # Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH +B70D..B727 ; LVT # Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH +B729..B743 ; LVT # Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH +B745..B75F ; LVT # Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH +B761..B77B ; LVT # Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH +B77D..B797 ; LVT # Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH +B799..B7B3 ; LVT # Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH +B7B5..B7CF ; LVT # Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH +B7D1..B7EB ; LVT # Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH +B7ED..B807 ; LVT # Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH +B809..B823 ; LVT # Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH +B825..B83F ; LVT # Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH +B841..B85B ; LVT # Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH +B85D..B877 ; LVT # Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH +B879..B893 ; LVT # Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH +B895..B8AF ; LVT # Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH +B8B1..B8CB ; LVT # Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH +B8CD..B8E7 ; LVT # Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH +B8E9..B903 ; LVT # Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH +B905..B91F ; LVT # Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH +B921..B93B ; LVT # Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH +B93D..B957 ; LVT # Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH +B959..B973 ; LVT # Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH +B975..B98F ; LVT # Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH +B991..B9AB ; LVT # Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH +B9AD..B9C7 ; LVT # Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH +B9C9..B9E3 ; LVT # Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH +B9E5..B9FF ; LVT # Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH +BA01..BA1B ; LVT # Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH +BA1D..BA37 ; LVT # Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH +BA39..BA53 ; LVT # Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH +BA55..BA6F ; LVT # Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH +BA71..BA8B ; LVT # Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH +BA8D..BAA7 ; LVT # Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH +BAA9..BAC3 ; LVT # Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH +BAC5..BADF ; LVT # Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH +BAE1..BAFB ; LVT # Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH +BAFD..BB17 ; LVT # Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH +BB19..BB33 ; LVT # Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH +BB35..BB4F ; LVT # Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH +BB51..BB6B ; LVT # Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH +BB6D..BB87 ; LVT # Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH +BB89..BBA3 ; LVT # Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH +BBA5..BBBF ; LVT # Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH +BBC1..BBDB ; LVT # Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH +BBDD..BBF7 ; LVT # Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH +BBF9..BC13 ; LVT # Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH +BC15..BC2F ; LVT # Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH +BC31..BC4B ; LVT # Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH +BC4D..BC67 ; LVT # Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH +BC69..BC83 ; LVT # Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH +BC85..BC9F ; LVT # Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH +BCA1..BCBB ; LVT # Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH +BCBD..BCD7 ; LVT # Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH +BCD9..BCF3 ; LVT # Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH +BCF5..BD0F ; LVT # Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH +BD11..BD2B ; LVT # Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH +BD2D..BD47 ; LVT # Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH +BD49..BD63 ; LVT # Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH +BD65..BD7F ; LVT # Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH +BD81..BD9B ; LVT # Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH +BD9D..BDB7 ; LVT # Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH +BDB9..BDD3 ; LVT # Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH +BDD5..BDEF ; LVT # Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH +BDF1..BE0B ; LVT # Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH +BE0D..BE27 ; LVT # Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH +BE29..BE43 ; LVT # Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH +BE45..BE5F ; LVT # Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH +BE61..BE7B ; LVT # Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH +BE7D..BE97 ; LVT # Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH +BE99..BEB3 ; LVT # Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH +BEB5..BECF ; LVT # Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH +BED1..BEEB ; LVT # Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH +BEED..BF07 ; LVT # Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH +BF09..BF23 ; LVT # Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH +BF25..BF3F ; LVT # Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH +BF41..BF5B ; LVT # Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH +BF5D..BF77 ; LVT # Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH +BF79..BF93 ; LVT # Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH +BF95..BFAF ; LVT # Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH +BFB1..BFCB ; LVT # Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH +BFCD..BFE7 ; LVT # Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH +BFE9..C003 ; LVT # Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH +C005..C01F ; LVT # Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH +C021..C03B ; LVT # Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH +C03D..C057 ; LVT # Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH +C059..C073 ; LVT # Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH +C075..C08F ; LVT # Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH +C091..C0AB ; LVT # Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH +C0AD..C0C7 ; LVT # Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH +C0C9..C0E3 ; LVT # Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH +C0E5..C0FF ; LVT # Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH +C101..C11B ; LVT # Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH +C11D..C137 ; LVT # Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH +C139..C153 ; LVT # Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH +C155..C16F ; LVT # Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH +C171..C18B ; LVT # Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH +C18D..C1A7 ; LVT # Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH +C1A9..C1C3 ; LVT # Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH +C1C5..C1DF ; LVT # Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH +C1E1..C1FB ; LVT # Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH +C1FD..C217 ; LVT # Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH +C219..C233 ; LVT # Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH +C235..C24F ; LVT # Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH +C251..C26B ; LVT # Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH +C26D..C287 ; LVT # Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH +C289..C2A3 ; LVT # Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH +C2A5..C2BF ; LVT # Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH +C2C1..C2DB ; LVT # Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH +C2DD..C2F7 ; LVT # Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH +C2F9..C313 ; LVT # Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH +C315..C32F ; LVT # Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH +C331..C34B ; LVT # Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH +C34D..C367 ; LVT # Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH +C369..C383 ; LVT # Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH +C385..C39F ; LVT # Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH +C3A1..C3BB ; LVT # Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH +C3BD..C3D7 ; LVT # Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH +C3D9..C3F3 ; LVT # Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH +C3F5..C40F ; LVT # Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH +C411..C42B ; LVT # Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH +C42D..C447 ; LVT # Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH +C449..C463 ; LVT # Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH +C465..C47F ; LVT # Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH +C481..C49B ; LVT # Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH +C49D..C4B7 ; LVT # Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH +C4B9..C4D3 ; LVT # Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH +C4D5..C4EF ; LVT # Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH +C4F1..C50B ; LVT # Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH +C50D..C527 ; LVT # Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH +C529..C543 ; LVT # Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH +C545..C55F ; LVT # Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH +C561..C57B ; LVT # Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH +C57D..C597 ; LVT # Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH +C599..C5B3 ; LVT # Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH +C5B5..C5CF ; LVT # Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH +C5D1..C5EB ; LVT # Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH +C5ED..C607 ; LVT # Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH +C609..C623 ; LVT # Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH +C625..C63F ; LVT # Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH +C641..C65B ; LVT # Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH +C65D..C677 ; LVT # Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH +C679..C693 ; LVT # Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH +C695..C6AF ; LVT # Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH +C6B1..C6CB ; LVT # Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH +C6CD..C6E7 ; LVT # Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH +C6E9..C703 ; LVT # Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH +C705..C71F ; LVT # Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH +C721..C73B ; LVT # Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH +C73D..C757 ; LVT # Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH +C759..C773 ; LVT # Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH +C775..C78F ; LVT # Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH +C791..C7AB ; LVT # Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH +C7AD..C7C7 ; LVT # Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH +C7C9..C7E3 ; LVT # Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH +C7E5..C7FF ; LVT # Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH +C801..C81B ; LVT # Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH +C81D..C837 ; LVT # Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH +C839..C853 ; LVT # Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH +C855..C86F ; LVT # Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH +C871..C88B ; LVT # Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH +C88D..C8A7 ; LVT # Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH +C8A9..C8C3 ; LVT # Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH +C8C5..C8DF ; LVT # Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH +C8E1..C8FB ; LVT # Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH +C8FD..C917 ; LVT # Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH +C919..C933 ; LVT # Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH +C935..C94F ; LVT # Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH +C951..C96B ; LVT # Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH +C96D..C987 ; LVT # Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH +C989..C9A3 ; LVT # Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH +C9A5..C9BF ; LVT # Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH +C9C1..C9DB ; LVT # Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH +C9DD..C9F7 ; LVT # Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH +C9F9..CA13 ; LVT # Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH +CA15..CA2F ; LVT # Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH +CA31..CA4B ; LVT # Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH +CA4D..CA67 ; LVT # Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH +CA69..CA83 ; LVT # Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH +CA85..CA9F ; LVT # Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH +CAA1..CABB ; LVT # Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH +CABD..CAD7 ; LVT # Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH +CAD9..CAF3 ; LVT # Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH +CAF5..CB0F ; LVT # Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH +CB11..CB2B ; LVT # Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH +CB2D..CB47 ; LVT # Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH +CB49..CB63 ; LVT # Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH +CB65..CB7F ; LVT # Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH +CB81..CB9B ; LVT # Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH +CB9D..CBB7 ; LVT # Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH +CBB9..CBD3 ; LVT # Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH +CBD5..CBEF ; LVT # Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH +CBF1..CC0B ; LVT # Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH +CC0D..CC27 ; LVT # Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH +CC29..CC43 ; LVT # Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH +CC45..CC5F ; LVT # Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH +CC61..CC7B ; LVT # Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH +CC7D..CC97 ; LVT # Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH +CC99..CCB3 ; LVT # Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH +CCB5..CCCF ; LVT # Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH +CCD1..CCEB ; LVT # Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH +CCED..CD07 ; LVT # Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH +CD09..CD23 ; LVT # Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH +CD25..CD3F ; LVT # Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH +CD41..CD5B ; LVT # Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH +CD5D..CD77 ; LVT # Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH +CD79..CD93 ; LVT # Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH +CD95..CDAF ; LVT # Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH +CDB1..CDCB ; LVT # Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH +CDCD..CDE7 ; LVT # Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH +CDE9..CE03 ; LVT # Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH +CE05..CE1F ; LVT # Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH +CE21..CE3B ; LVT # Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH +CE3D..CE57 ; LVT # Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH +CE59..CE73 ; LVT # Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH +CE75..CE8F ; LVT # Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH +CE91..CEAB ; LVT # Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH +CEAD..CEC7 ; LVT # Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH +CEC9..CEE3 ; LVT # Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH +CEE5..CEFF ; LVT # Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH +CF01..CF1B ; LVT # Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH +CF1D..CF37 ; LVT # Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH +CF39..CF53 ; LVT # Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH +CF55..CF6F ; LVT # Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH +CF71..CF8B ; LVT # Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH +CF8D..CFA7 ; LVT # Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH +CFA9..CFC3 ; LVT # Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH +CFC5..CFDF ; LVT # Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH +CFE1..CFFB ; LVT # Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH +CFFD..D017 ; LVT # Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH +D019..D033 ; LVT # Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH +D035..D04F ; LVT # Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH +D051..D06B ; LVT # Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH +D06D..D087 ; LVT # Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH +D089..D0A3 ; LVT # Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH +D0A5..D0BF ; LVT # Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH +D0C1..D0DB ; LVT # Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH +D0DD..D0F7 ; LVT # Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH +D0F9..D113 ; LVT # Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH +D115..D12F ; LVT # Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH +D131..D14B ; LVT # Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH +D14D..D167 ; LVT # Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH +D169..D183 ; LVT # Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH +D185..D19F ; LVT # Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH +D1A1..D1BB ; LVT # Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH +D1BD..D1D7 ; LVT # Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH +D1D9..D1F3 ; LVT # Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH +D1F5..D20F ; LVT # Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH +D211..D22B ; LVT # Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH +D22D..D247 ; LVT # Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH +D249..D263 ; LVT # Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH +D265..D27F ; LVT # Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH +D281..D29B ; LVT # Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH +D29D..D2B7 ; LVT # Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH +D2B9..D2D3 ; LVT # Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH +D2D5..D2EF ; LVT # Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH +D2F1..D30B ; LVT # Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH +D30D..D327 ; LVT # Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH +D329..D343 ; LVT # Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH +D345..D35F ; LVT # Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH +D361..D37B ; LVT # Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH +D37D..D397 ; LVT # Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH +D399..D3B3 ; LVT # Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH +D3B5..D3CF ; LVT # Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH +D3D1..D3EB ; LVT # Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH +D3ED..D407 ; LVT # Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH +D409..D423 ; LVT # Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH +D425..D43F ; LVT # Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH +D441..D45B ; LVT # Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH +D45D..D477 ; LVT # Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH +D479..D493 ; LVT # Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH +D495..D4AF ; LVT # Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH +D4B1..D4CB ; LVT # Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH +D4CD..D4E7 ; LVT # Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH +D4E9..D503 ; LVT # Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH +D505..D51F ; LVT # Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH +D521..D53B ; LVT # Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH +D53D..D557 ; LVT # Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH +D559..D573 ; LVT # Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH +D575..D58F ; LVT # Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH +D591..D5AB ; LVT # Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH +D5AD..D5C7 ; LVT # Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH +D5C9..D5E3 ; LVT # Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH +D5E5..D5FF ; LVT # Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH +D601..D61B ; LVT # Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH +D61D..D637 ; LVT # Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH +D639..D653 ; LVT # Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH +D655..D66F ; LVT # Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH +D671..D68B ; LVT # Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH +D68D..D6A7 ; LVT # Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH +D6A9..D6C3 ; LVT # Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH +D6C5..D6DF ; LVT # Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH +D6E1..D6FB ; LVT # Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH +D6FD..D717 ; LVT # Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH +D719..D733 ; LVT # Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH +D735..D74F ; LVT # Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH +D751..D76B ; LVT # Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH +D76D..D787 ; LVT # Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH +D789..D7A3 ; LVT # Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH + +# Total code points: 10773 diff --git a/Master/tlpkg/tlperl.old/lib/unicore/Index.txt b/Master/tlpkg/tlperl.old/lib/unicore/Index.txt new file mode 100644 index 00000000000..c55a1f8bca4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/Index.txt @@ -0,0 +1,4307 @@ +8859-1 (Latin-1), Based on ISO 00A0 +8859-2, -3, -4, -9 (European Latin), Based on ISO 0100 +8859-5 (Cyrillic), Based on ISO 0400 +8859-6 (Arabic), Based on ISO 0600 +8859-7 (Greek), Based on ISO 0370 +8859-8 (Hebrew), Based on ISO 05D0 +A, COMBINING LATIN SMALL LETTER 0363 +a, latin small letter script 0251 +A, LATIN SMALL LETTER TURNED 0250 +ABBREVIATION MARK, ARMENIAN 055F +ABBREVIATION MARK, SYRIAC 070F +ABBREVIATION SIGN, DEVANAGARI 0970 +Abbreviations, Squared Latin 3371 +Aboriginal Syllabics, Unified Canadian 1400 +above, cedilla 0312 +ABOVE, COMBINING ALMOST EQUAL TO 034C +ABOVE, COMBINING BRIDGE 0346 +ABOVE, COMBINING CLOCKWISE ARROW 20D5 +ABOVE, COMBINING COMMA 0313 +ABOVE, COMBINING DOT 0307 +ABOVE, COMBINING DOUBLE VERTICAL LINE 030E +ABOVE, COMBINING FOUR DOTS 20DC +ABOVE, COMBINING HOMOTHETIC 034B +ABOVE, COMBINING HOOK 0309 +ABOVE, COMBINING LEFT ANGLE 031A +ABOVE, COMBINING LEFT ARROW 20D6 +ABOVE, COMBINING LEFT HARPOON 20D0 +ABOVE, COMBINING LEFT RIGHT ARROW 20E1 +ABOVE, COMBINING NOT TILDE 034A +ABOVE, COMBINING REVERSED COMMA 0314 +ABOVE, COMBINING RING 030A +ABOVE, COMBINING THREE DOTS 20DB +ABOVE, COMBINING TURNED COMMA 0312 +ABOVE, COMBINING VERTICAL LINE 030D +ABOVE, COMBINING WIDE BRIDGE 20E9 +ABOVE, COMBINING X 033D +ABOVE, DOT 02D9 +above, double dot 0308 +ABOVE, RING 02DA +above, vee 030C +ABOVE RIGHT, COMBINING COMMA 0315 +absolute continuity 2AA1 +ACCENT, ACUTE 00B4 +ACCENT, ALMOST EQUAL TO WITH CIRCUMFLEX 2A6F +ACCENT, CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX 2A36 +ACCENT, CIRCUMFLEX 005E +ACCENT, COMBINING ACUTE 0301 +ACCENT, COMBINING CIRCUMFLEX 0302 +ACCENT, COMBINING DOUBLE ACUTE 030B +ACCENT, COMBINING DOUBLE GRAVE 030F +ACCENT, COMBINING GRAVE 0300 +ACCENT, DOUBLE ACUTE 02DD +ACCENT, GRAVE 0060 +ACCENT, MODIFIER LETTER ACUTE 02CA +ACCENT, MODIFIER LETTER CIRCUMFLEX 02C6 +ACCENT, MODIFIER LETTER CROSS 02DF +ACCENT, MODIFIER LETTER GRAVE 02CB +ACCENT, MODIFIER LETTER LOW ACUTE 02CF +ACCENT, MODIFIER LETTER LOW GRAVE 02CE +accent, swedish grave 02DF +ACCENT ABOVE, PLUS SIGN WITH CIRCUMFLEX 2A23 +ACCENT BELOW, COMBINING ACUTE 0317 +ACCENT BELOW, COMBINING CIRCUMFLEX 032D +ACCENT BELOW, COMBINING GRAVE 0316 +ACCOUNT OF 2100 +acknowledge 0006 +acknowledge, graphic for negative 237B +acknowledge, negative 0015 +ACKNOWLEDGE, SYMBOL FOR 2406 +ACKNOWLEDGE, SYMBOL FOR NEGATIVE 2415 +ACTIVATE ARABIC FORM SHAPING 206D +ACTIVATE SYMMETRIC SWAPPING 206B +actuarial bend 20E7 +acute, spacing 00B4 +ACUTE ACCENT 00B4 +ACUTE ACCENT, COMBINING 0301 +ACUTE ACCENT, COMBINING DOUBLE 030B +ACUTE ACCENT, DEVANAGARI 0954 +ACUTE ACCENT, DOUBLE 02DD +ACUTE ACCENT, MODIFIER LETTER 02CA +ACUTE ACCENT, MODIFIER LETTER LOW 02CF +ACUTE ACCENT BELOW, COMBINING 0317 +ACUTE ANGLE 299F +ACUTE TONE MARK, COMBINING 0341 +ADDRESSED TO THE SUBJECT 2101 +Addu dialect, consonant for 0780 +AE, LATIN SMALL LETTER 00E6 +Aegean Numbers 10100 +AEGEAN CHECK MARK 10102 +AEGEAN WORD SEPARATOR DOT 10101 +AEGEAN WORD SEPARATOR LINE 10100 +Ainu, Phonetic Extensions For 31F0 +AIRPLANE 2708 +aldus leaf 2766 +ALEF SYMBOL 2135 +ALL, FOR 2200 +ALL AROUND-PROFILE 232E +ALL EQUAL TO 224C +ALMOST EQUAL TO 2248 +ALMOST EQUAL TO, PRECEDES ABOVE 2AB7 +ALMOST EQUAL TO, PRECEDES ABOVE NOT 2AB9 +ALMOST EQUAL TO, SUBSET OF ABOVE 2AC9 +ALMOST EQUAL TO, SUCCEEDS ABOVE 2AB8 +ALMOST EQUAL TO, SUCCEEDS ABOVE NOT 2ABA +ALMOST EQUAL TO, SUPERSET OF ABOVE 2ACA +ALMOST EQUAL TO ABOVE, COMBINING 034C +ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT 2A6F +ALPHA, LATIN SMALL LETTER 0251 +ALPHA, LATIN SMALL LETTER TURNED 0252 +Alphabetic Presentation Forms FB00 +Alphanumerics, Enclosed 2460 +alternating current 223F +ALTERNATION MARK, PART 303D +ALTERNATIVE KEY SYMBOL 2387 +ALVEOLAR CLICK, LATIN LETTER 01C2 +always (modal operator) 25FB +always (modal operator), was 27E4 +always be (modal operator), will 27E5 +AMALGAMATION OR COPRODUCT 2A3F +AMPERSAND 0026 +AMPERSAND, TURNED 214B +AND, CURLY LOGICAL 22CF +AND, LOGICAL 2227 +AND, N-ARY LOGICAL 22C0 +andrew's, cross st. 2613 +Ands and Ors, Logical 2A51 +ANGLE 2220 +ANGLE, ACUTE 299F +ANGLE, MEASURED 2221 +ANGLE, RIGHT 221F +ANGLE, SPHERICAL 2222 +ANGLE, TURNED 29A2 +ANGLE ABOVE, COMBINING LEFT 031A +angle arc 2222 +ANGLE BELOW, COMBINING LEFT 0349 +ANGLE BRACKET, LEFT 3008 +ANGLE BRACKET, LEFT DOUBLE 300A +ANGLE BRACKET, LEFT-POINTING 2329 +ANGLE BRACKET, MATHEMATICAL LEFT 27E8 +ANGLE BRACKET, MATHEMATICAL LEFT DOUBLE 27EA +ANGLE BRACKET, RIGHT-POINTING 232A +ANGLE OPENING LEFT, SPHERICAL 29A0 +ANGLE OPENING UP, SPHERICAL 29A1 +ANGLE QUOTATION MARK, LEFT-POINTING DOUBLE 00AB +ANGLE QUOTATION MARK, RIGHT-POINTING DOUBLE 00BB +ANGLE QUOTATION MARK, SINGLE LEFT-POINTING 2039 +ANGLE QUOTATION MARK, SINGLE RIGHT-POINTING 203A +Angle Quotation Marks, Ornamental 276E +ANGLE WITH ARC, RIGHT 22BE +ANGLE WITH DOWNWARDS ZIGZAG ARROW, RIGHT 237C +angled dash 00AC +Angles and Measured Angles 299B +ANGSTROM SIGN 212B +ANKH 2625 +Annotation, Interlinear FFF9 +Annotation, Kanbun Ideographic 3190 +Annotation Signs, Koranic 06D6 +ANNUITY SYMBOL, COMBINING 20E7 +ano teleia 00B7 +ANTICLOCKWISE INTEGRATION 2A11 +ANTICLOCKWISE-ROTATED DIVISION SIGN, CIRCLED 29BC +ANTIRESTRICTION, Z NOTATION DOMAIN 2A64 +ANTIRESTRICTION, Z NOTATION RANGE 2A65 +APL 2336 +APL Functional Symbols 2336 +apl jot 2218 +apl overbar 00AF +apl quote 0022 +apl stile 2223 +apl tilde 223C +apl upstile 2308 +APOSTROPHE 0027 +apostrophe 02BC +apostrophe 2019 +APOSTROPHE, ARMENIAN 055A +APOSTROPHE, MODIFIER LETTER 02BC +APOSTROPHE, MODIFIER LETTER DOUBLE 02EE +apostrophe-quote 0027 +APPLICATION, FUNCTION 2061 +application program command 009F +APPROACHES THE LIMIT 2250 +APPROXIMATE, GREATER-THAN AND NOT 2A8A +APPROXIMATE, GREATER-THAN OR 2A86 +APPROXIMATE, LESS-THAN AND NOT 2A89 +APPROXIMATE, LESS-THAN OR 2A85 +APPROXIMATELY EQUAL OR EQUAL TO 2A70 +APPROXIMATELY EQUAL TO 2245 +approximately equal to 2257 +AQUARIUS 2652 +Arabic 0600 +Arabic, Extended 0671 +ARABIC COMMA 060C +ARABIC DECIMAL SEPARATOR 066B +ARABIC END OF AYAH 06DD +ARABIC FIVE POINTED STAR 066D +ARABIC FOOTNOTE MARKER 0602 +ARABIC FORM SHAPING, ACTIVATE 206D +ARABIC FORM SHAPING, INHIBIT 206C +ARABIC FULL STOP 06D4 +Arabic Honorifics 0610 +ARABIC LETTER DOTLESS BEH 066E +ARABIC LETTER DOTLESS QAF 066F +Arabic Letters 0627 +ARABIC NUMBER SIGN 0600 +ARABIC PERCENT SIGN 066A +Arabic Points 064B +Arabic Presentation Forms-A FB50 +Arabic Presentation Forms-B FE70 +ARABIC QUESTION MARK 061F +ARABIC SEMICOLON 061B +ARABIC SIGN SAFHA 0603 +ARABIC SIGN SANAH 0601 +Arabic Poetic Marks 0610 +Arabic Subtending Marks 0600 +ARABIC TAIL FRAGMENT FE73 +ARABIC THOUSANDS SEPARATOR 066C +Arabic-Indic Digits 0660 +Arabic-Indic Digits for Persian and Urdu, Eastern 06F0 +ARC 2312 +arc, angle 2222 +ARC, RIGHT ANGLE WITH 22BE +ARCH BELOW, COMBINING INVERTED DOUBLE 032B +Arcs 25DC +area, end of guarded 0097 +area, end of selected 0087 +area, start of guarded 0096 +area, start of selected 0086 +ARIES 2648 +Armenian 0530 +ARMENIAN ABBREVIATION MARK 055F +ARMENIAN APOSTROPHE 055A +Armenian Capital Letters 0531 +ARMENIAN COMMA 055D +ARMENIAN EMPHASIS MARK 055B +ARMENIAN EXCLAMATION MARK 055C +ARMENIAN FULL STOP 0589 +ARMENIAN HYPHEN 058A +Armenian Ligatures FB13 +ARMENIAN QUESTION MARK 055E +Armenian Small Letters 0561 +ARROW, BLACK CIRCLE WITH DOWN 29ED +ARROW, BLACK DIAMOND WITH DOWN 29EA +arrow, colon right 29F4 +ARROW, ELECTRIC 2301 +ARROW, RIGHT ANGLE WITH DOWNWARDS ZIGZAG 237C +ARROW, WHITE CIRCLE WITH DOWN 29EC +ARROW ABOVE, COMBINING CLOCKWISE 20D5 +ARROW ABOVE, COMBINING LEFT 20D6 +ARROW ABOVE, COMBINING LEFT RIGHT 20E1 +ARROW BELOW, COMBINING DOUBLE RIGHTWARDS 0362 +ARROW BELOW, COMBINING LEFT RIGHT 034D +ARROW BELOW, COMBINING UPWARDS 034E +Arrow Dingbats 2794 +ARROW OVERLAY, COMBINING LEFTWARDS 20EA +ARROW THROUGH CIRCLE, UP 29BD +ARROW WITH HOOK, INTEGRAL WITH LEFTWARDS 2A17 +ARROWHEAD, UP 2303 +Arrowheads, Modifier Letter 02C2 +Arrows 2190 +Arrows, Long 27F5 +Arrows, Other White and Black 2B00 +arrows extension 23AF +Arrows-A, Supplemental 27F0 +Arrows-B, Supplemental 2900 +ASCENDING NODE 260A +ASCII 0020 +ASCII C0 Control Codes 0000 +ASCII Digits 0030 +ASCII Variants, Fullwidth FF01 +ash 00E6 +ASSERTION 22A6 +ASTERISK 002A +ASTERISK, EQUALS WITH 2A6E +ASTERISK, LOW 204E +ASTERISK, SQUARED 29C6 +Asterisk Dingbats 2722 +ASTERISK OPERATOR 2217 +ASTERISK OPERATOR, CIRCLED 229B +ASTERISKS ALIGNED VERTICALLY, TWO 2051 +Asterisks and Snowflakes, Stars, 2721 +ASTERISM 2042 +Astrological Symbols 263D +asymptotic to 2248 +ASYMPTOTICALLY EQUAL TO 2243 +AT, COMMERCIAL 0040 +AVERAGE WITH SLASH, INTEGRAL 2A0F +AYAH, ARABIC END OF 06DD +B, LATIN LETTER SMALL CAPITAL 0299 +B, SCRIPT CAPITAL 212C +baby gamma, latin small letter 0264 +backslash 005C +BACKSLASH, COMBINING ENCLOSING CIRCLE 20E0 +backspace 0008 +BACKSPACE, SYMBOL FOR 2408 +backward difference 2207 +bag bracket, z notation left 27E6 +BAG MEMBERSHIP, Z NOTATION 22FF +bag subtraction, z notation 2A41 +BAHT, THAI CURRENCY SYMBOL 0E3F +BALLOT BOX 2610 +BALLOT BOX WITH CHECK 2611 +BALLOT BOX WITH X 2612 +BALLOT X 2717 +BALLOT X, HEAVY 2718 +bang 0021 +bar, broken vertical 00A6 +BAR, CIRCLED VERTICAL 29B6 +BAR, HORIZONTAL 2015 +BAR, N-ARY WHITE VERTICAL 2AFF +bar, vertical 007C +BAR, WHITE VERTICAL 2AFE +BAR BINARY RELATION, TRIPLE VERTICAL 2AF4 +BAR DELIMITER, TRIPLE VERTICAL 2980 +Bar Dingbats, Vertical 2758 +BAR OPERATOR, LARGE TRIPLE VERTICAL 2AFC +Bar Symbols, Error 29EE +BAR WITH DOUBLE VERTICAL STROKE, TRIPLE HORIZONTAL 2A68 +BAR WITH HORIZONTAL STROKE, TRIPLE VERTICAL 2AF5 +BAR WITH TRIPLE VERTICAL STROKE, TRIPLE HORIZONTAL 2A69 +barred o, latin capital letter 019F +BARRED O, LATIN SMALL LETTER 0275 +Basic Latin, C0 Controls and 0000 +Basic Russian Alphabet 0410 +BEAMED EIGHTH NOTES 266B +BEAMED SIXTEENTH NOTES 266C +BECAUSE 2235 +beginning of line 2310 +bell 0007 +BELL, SYMBOL FOR 2407 +BELL SYMBOL 237E +BELOW, COMBINING ACUTE ACCENT 0317 +BELOW, COMBINING BREVE 032E +BELOW, COMBINING BRIDGE 032A +BELOW, COMBINING CARON 032C +BELOW, COMBINING CIRCUMFLEX ACCENT 032D +BELOW, COMBINING COMMA 0326 +BELOW, COMBINING DIAERESIS 0324 +BELOW, COMBINING DOT 0323 +BELOW, COMBINING DOUBLE RIGHTWARDS ARROW 0362 +BELOW, COMBINING DOUBLE VERTICAL LINE 0348 +BELOW, COMBINING EQUALS SIGN 0347 +BELOW, COMBINING GRAVE ACCENT 0316 +BELOW, COMBINING INVERTED BREVE 032F +BELOW, COMBINING INVERTED BRIDGE 033A +BELOW, COMBINING INVERTED DOUBLE ARCH 032B +BELOW, COMBINING LEFT ANGLE 0349 +BELOW, COMBINING LEFT HALF RING 031C +BELOW, COMBINING LEFT RIGHT ARROW 034D +BELOW, COMBINING LEFT TACK 0318 +BELOW, COMBINING MACRON 0331 +BELOW, COMBINING MINUS SIGN 0320 +BELOW, COMBINING PALATALIZED HOOK 0321 +BELOW, COMBINING PLUS SIGN 031F +BELOW, COMBINING RETROFLEX HOOK 0322 +BELOW, COMBINING RIGHT HALF RING 0339 +BELOW, COMBINING RING 0325 +BELOW, COMBINING SEAGULL 033C +BELOW, COMBINING SQUARE 033B +BELOW, COMBINING TILDE 0330 +BELOW, COMBINING UP TACK 031D +BELOW, COMBINING UPWARDS ARROW 034E +BELOW, COMBINING VERTICAL LINE 0329 +below, greek non-spacing iota 0345 +bend, actuarial 20E7 +Bengali 0980 +Bengali Currency Signs 09F2 +Bengali Digits 09E6 +Bengali Letters 0985 +BENGALI RUPEE MARK 09F2 +BENGALI RUPEE SIGN 09F3 +BENZENE RING 232C +bernoulli function 212C +BET SYMBOL 2136 +Betty BOOP 263A +BETWEEN 226C +BEVERAGE, HOT 2615 +BIDENTAL PERCUSSIVE, LATIN LETTER 02AD +Bidirectional Formatting Controls 202A +Big 5, Duplicates from FA0C +BIG REVERSE SOLIDUS 29F9 +BIG SOLIDUS 29F8 +bijection, z notation 2917 +bijective mapping 2916 +BILABIAL CLICK, LATIN LETTER 0298 +BILABIAL PERCUSSIVE, LATIN LETTER 02AC +BINARY RELATION, TRIPLE SOLIDUS 2AFB +BINARY RELATION, TRIPLE VERTICAL BAR 2AF4 +BIOHAZARD SIGN 2623 +BLACK, BOWTIE WITH LEFT HALF 29D1 +BLACK, BOWTIE WITH RIGHT HALF 29D2 +BLACK, DOWN-POINTING TRIANGLE WITH LEFT HALF 29E8 +BLACK, DOWN-POINTING TRIANGLE WITH RIGHT HALF 29E9 +BLACK, TIMES WITH LEFT HALF 29D4 +BLACK, TIMES WITH RIGHT HALF 29D5 +BLACK BOWTIE 29D3 +BLACK CIRCLE WITH DOWN ARROW 29ED +BLACK CIRCLE WITH TWO WHITE DOTS 2689 +BLACK CIRCLE WITH WHITE DOT RIGHT 2688 +Black Circled Numbers, White On 24EB +BLACK DIAMOND WITH DOWN ARROW 29EA +BLACK FLAG 2691 +BLACK HOURGLASS 29D7 +BLACK LEFT POINTING INDEX 261A +BLACK LEFTWARDS BULLET 204C +BLACK LENTICULAR BRACKET, LEFT 3010 +BLACK LOZENGE 29EB +BLACK MEDIUM SMALL SQUARE 25FE +BLACK MEDIUM SQUARE 25FC +BLACK NIB 2712 +BLACK PARALLELOGRAM 25B0 +BLACK SCISSORS 2702 +BLACK SHOGI PIECE 2617 +black small circle 2022 +BLACK SMILING FACE 263B +BLACK STAR 2605 +BLACK SUN WITH RAYS 2600 +BLACK TELEPHONE 260E +BLACK TRIANGLE, PLUS SIGN WITH 2A28 +BLACK UNIVERSAL RECYCLING SYMBOL 267B +BLACK-LETTER CAPITAL C 212D +BLACK-LETTER CAPITAL H 210C +BLACK-LETTER CAPITAL I 2111 +BLACK-LETTER CAPITAL R 211C +BLACK-LETTER CAPITAL Z 2128 +BLANK SYMBOL 2422 +block, end of transmission 0017 +BLOCK, SYMBOL FOR END OF TRANSMISSION 2417 +Block Elements 2580 +bom FEFF +Bopomofo, Chinese 3100 +Bopomofo Extended for Minnan and Hakka, Chinese 31A0 +BOWTIE 22C8 +bowtie, large 2A1D +Bowtie Symbols 29D1 +BOX, BALLOT 2610 +BOX, OPEN 2423 +BOX, SHOULDERED OPEN 237D +BOX, X IN A RECTANGLE 2327 +Box Drawing 2500 +BOX LINE, LEFT VERTICAL 23B8 +BOX LINE, RIGHT VERTICAL 23B9 +BOX OPERATOR, SQUARE LEFT OPEN 2ACD +BOX OPERATOR, SQUARE RIGHT OPEN 2ACE +BOX WITH CHECK, BALLOT 2611 +BOX WITH X, BALLOT 2612 +bra 27E6 +brace, closing 007D +brace, opening 007B +bracket, z notation left bag 27E6 +bracket, closing curly 007D +bracket, closing square 005D +BRACKET, LEFT ANGLE 3008 +BRACKET, LEFT BLACK LENTICULAR 3010 +BRACKET, LEFT CORNER 300C +BRACKET, LEFT CURLY 007B +BRACKET, LEFT DOUBLE ANGLE 300A +BRACKET, LEFT SQUARE 005B +BRACKET, LEFT TORTOISE SHELL 3014 +BRACKET, LEFT WHITE CORNER 300E +BRACKET, LEFT WHITE LENTICULAR 3016 +BRACKET, LEFT WHITE SQUARE 301A +BRACKET, LEFT WHITE TORTOISE SHELL 3018 +BRACKET, LEFT-POINTING ANGLE 2329 +bracket, opening curly 007B +bracket, opening square 005B +BRACKET, RIGHT CURLY 007D +BRACKET, RIGHT SQUARE 005D +Bracket Pieces 239B +Bracket Pieces 23B0 +BRACKET WITH QUILL, LEFT SQUARE 2045 +Brackets 2983 +Brackets, CJK Angle 3008 +Brackets, Corner 2308 +Brackets, CJK Corner 300C +Brackets, CJK 3010 +Brackets, CJK 3014 +Brackets, Fullwidth FF5F +Brackets, Mathematical 27E6 +Brackets, Ornamental 2768 +Brackets, Ornamental 2770 +Brackets, Vertical 23B4 +Braille Patterns 2800 +brazilian currency 20A2 +break here, no 0083 +break permitted here 0082 +breathing, rough 0314 +breathing, smooth 0313 +BREVE 02D8 +BREVE, COMBINING 0306 +BREVE, COMBINING DOUBLE INVERTED 0361 +BREVE, COMBINING INVERTED 0311 +BREVE BELOW, COMBINING 032E +BREVE BELOW, COMBINING INVERTED 032F +BRIDGE ABOVE, COMBINING 0346 +BRIDGE ABOVE, COMBINING WIDE 20E9 +BRIDGE BELOW, COMBINING 032A +BRIDGE BELOW, COMBINING INVERTED 033A +broken vertical bar 00A6 +Buhid 1740 +BULLET 2022 +BULLET, BLACK LEFTWARDS 204C +BULLET, HYPHEN 2043 +BULLET, REVERSED ROTATED FLORAL HEART 2619 +bullet, tainome (japanese, a kind of) 25C9 +BULLET, TRIANGULAR 2023 +BULLET, WHITE 25E6 +BULLET OPERATOR 2219 +BULLSEYE 25CE +bullseye, latin letter 0298 +BUMPY ABOVE, EQUALS SIGN WITH 2AAE +BY, MEASURED 225E +by definition, equal to 225C +BY DEFINITION, EQUAL TO 225D +byte order mark FEFF +C, BLACK-LETTER CAPITAL 212D +C, COMBINING LATIN SMALL LETTER 0368 +C, DOUBLE-STRUCK CAPITAL 2102 +C, LATIN LETTER STRETCHED 0297 +C0 Controls and Basic Latin 0000 +C1 Controls and Latin-1 Supplement 0080 +CADA UNA 2106 +CADUCEUS 2624 +Canadian Aboriginal Syllabics, Unified 1400 +cancel 0018 +CANCEL, SYMBOL FOR 2418 +cancel character 0094 +CANCER 264B +CANDRABINDU, COMBINING 0310 +Cantillation Marks, Hebrew 0591 +cap 2229 +CAP, SQUARE 2293 +Capital Letters, Armenian 0531 +Capital Letters, Cyrillic 0401 +Capital Letters, Georgian 10A0 +Capital Letters, Greek 0391 +Capital Letters, Latin 0041 +CAPRICORN 2651 +caps lock 21EA +caps lock 21EC +Card Suits, Playing 2660 +cardinal (countable), first transfinite 2135 +cardinal (functions of a real variable), third transfinite 2137 +cardinal (the continuum), second transfinite 2136 +CARE OF 2105 +caret 028C +CARET 2038 +CARET INSERTION POINT 2041 +CARON 02C7 +CARON, COMBINING 030C +CARON BELOW, COMBINING 032C +carriage return 000D +carriage return 21B5 +CARRIAGE RETURN, SYMBOL FOR 240D +CAUTION SIGN 2621 +CEDILLA 00B8 +CEDILLA, COMBINING 0327 +cedilla, spacing 00B8 +cedilla above 0312 +CEILING, LEFT 2308 +CELSIUS, DEGREE 2103 +CENT SIGN 00A2 +centigrade, degrees 2103 +CENTRE LINE SYMBOL 2104 +CENTRED LEFT HALF RING, MODIFIER LETTER 02D3 +CENTRELINE LOW LINE FE4E +CENTRELINE OVERLINE FE4A +cgj 034F +character introducer, single 009A +character tabulation set 0088 +character tabulation with justification 0089 +CHARACTER TIE 2040 +Chart Components, Form and 2500 +CHECK, BALLOT BOX WITH 2611 +CHECK MARK 2713 +CHECK MARK, AEGEAN 10102 +CHECK MARK, HEAVY 2714 +CHECK MARK, NOT 237B +Cherokee 13A0 +Chess Pieces 2654 +Chess Symbols, Japanese 2616 +chevrons 00AB +CHI RHO 2627 +Chinese Bopomofo 3100 +Chinese Bopomofo Extended for Minnan and Hakka 31A0 +choice, dijkstra 2AFE +choice, n-ary dijkstra 2AFF +CIRCLE, BLACK 25CF +circle, black small 2022 +CIRCLE, COMBINING ENCLOSING 20DD +CIRCLE, DOTTED 25CC +circle, jis composition 20DD +CIRCLE, LARGE 25EF +CIRCLE, MULTIPLICATION SIGN IN DOUBLE 2A37 +CIRCLE, MULTIPLICATION SIGN IN LEFT HALF 2A34 +CIRCLE, MULTIPLICATION SIGN IN RIGHT HALF 2A35 +CIRCLE, PLUS SIGN IN LEFT HALF 2A2D +CIRCLE, PLUS SIGN IN RIGHT HALF 2A2E +CIRCLE, SQUARED SMALL 29C7 +CIRCLE ABOVE, PLUS SIGN WITH SMALL 2A22 +CIRCLE ABOVE, UP TACK WITH 27DF +CIRCLE ABOVE, VERTICAL LINE WITH 2AEF +CIRCLE BACKSLASH, COMBINING ENCLOSING 20E0 +CIRCLE BELOW, DOWN TACK WITH 2AF1 +CIRCLE BELOW, VERTICAL LINE WITH 2AF0 +CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR 29BA +CIRCLE INSIDE, GREATER-THAN WITH 2A7A +CIRCLE INSIDE, LESS-THAN WITH 2A79 +Circle Symbols 29B5 +CIRCLE WITH DOT RIGHT, WHITE 2686 +CIRCLE WITH DOWN ARROW, BLACK 29ED +CIRCLE WITH DOWN ARROW, WHITE 29EC +CIRCLE WITH TWO DOTS, WHITE 2687 +CIRCLE WITH TWO WHITE DOTS, BLACK 2689 +CIRCLE WITH WHITE DOT RIGHT, BLACK 2688 +CIRCLED ASTERISK OPERATOR 229B +CIRCLED DASH 229D +CIRCLED DIGIT ZERO 24EA +Circled Digits, Dingbat 2776 +CIRCLED DIVISION SIGN 2A38 +CIRCLED DIVISION SLASH 2298 +CIRCLED DOT OPERATOR 2299 +CIRCLED DOT OPERATOR, N-ARY 2A00 +CIRCLED EQUALS 229C +Circled Ideographs 3280 +Circled Inverse Numbers 2776 +Circled Japanese Katakana 32D0 +Circled Korean Hangul Elements 3260 +Circled Korean Hangul Syllables 326E +Circled Latin Letters 24B6 +CIRCLED MINUS 2296 +CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT 2A36 +Circled Numbers 2460 +Circled Numbers 3251 +Circled Numbers 32B1 +Circled Numbers, Double 24F5 +Circled Numbers, White On Black 24EB +CIRCLED PLUS 2295 +CIRCLED PLUS OPERATOR, N-ARY 2A01 +CIRCLED POSTAL MARK 3036 +CIRCLED RING OPERATOR 229A +CIRCLED TIMES 2297 +CIRCLED TIMES OPERATOR, N-ARY 2A02 +Circles 25CB +CIRCULATION FUNCTION 2A10 +circumflex, spacing 005E +CIRCUMFLEX ACCENT 005E +CIRCUMFLEX ACCENT, ALMOST EQUAL TO WITH 2A6F +CIRCUMFLEX ACCENT, CIRCLED MULTIPLICATION SIGN WITH 2A36 +CIRCUMFLEX ACCENT, COMBINING 0302 +CIRCUMFLEX ACCENT, MODIFIER LETTER 02C6 +CIRCUMFLEX ACCENT ABOVE, PLUS SIGN WITH 2A23 +CIRCUMFLEX ACCENT BELOW, COMBINING 032D +CJK Compatibility 3300 +CJK Compatibility Forms FE30 +CJK Compatibility Ideographs F900 +CJK Compatibility Ideographs, IBM FA0E +CJK Ideographs Area 3400 +CJK Letters and Ideographs, Enclosed 3200 +CJK Phonetics and Symbols Area 2E00 +CJK Radicals Supplement 2E80 +CJK Symbols and Punctuation 3000 +CJK Unified Ideographs 4E00 +CJK Unified Ideographs Extension A 3400 +clear key 2327 +CLEAR SCREEN SYMBOL 239A +clear weather 2600 +CLICK, LATIN LETTER ALVEOLAR 01C2 +CLICK, LATIN LETTER BILABIAL 0298 +CLICK, LATIN LETTER DENTAL 01C0 +CLICK, LATIN LETTER LATERAL 01C1 +CLICK, LATIN LETTER RETROFLEX 01C3 +CLOCKWISE ARROW ABOVE, COMBINING 20D5 +CLOCKWISE CONTOUR INTEGRAL 2232 +CLOCKWISE INTEGRAL 2231 +CLOCKWISE RING OVERLAY, COMBINING 20D9 +clone 2104 +Clones of Diacritics, Spacing 02D8 +CLOSE UP 2050 +closed epsilon, latin small letter 029A +CLOSED INTERSECTION WITH SERIFS 2A4D +CLOSED OMEGA, LATIN SMALL LETTER 0277 +CLOSED OPEN E, LATIN SMALL LETTER 029A +closed reversed epsilon, latin small letter 025E +CLOSED REVERSED OPEN E, LATIN SMALL LETTER 025E +CLOSED SUBSET 2ACF +CLOSED SUBSET OR EQUAL TO 2AD1 +CLOSED SUPERSET 2AD0 +CLOSED SUPERSET OR EQUAL TO 2AD2 +CLOSED UNION WITH SERIFS 2A4C +CLOSED UNION WITH SERIFS AND SMASH PRODUCT 2A50 +closing brace 007D +closing curly bracket 007D +CLOSING MARK, IDEOGRAPHIC 3006 +closing parenthesis 0029 +closing square bracket 005D +CLOUD 2601 +cloudy weather 2601 +Codes, Process Internal FDD0 +coffee 2615 +COLON 003A +COLON, ETHIOPIC 1365 +COLON, MODIFIER LETTER HALF TRIANGULAR 02D1 +COLON, MODIFIER LETTER TRIANGULAR 02D0 +COLON, MONGOLIAN 1804 +COLON, Z NOTATION TYPE 2982 +COLON EQUAL, DOUBLE 2A74 +COLON EQUALS 2254 +COLON OPERATOR, TRIPLE 2AF6 +colon right arrow 29F4 +COLON SIGN 20A1 +COMBINING ACUTE ACCENT 0301 +COMBINING ACUTE ACCENT BELOW 0317 +COMBINING ACUTE TONE MARK 0341 +COMBINING ALMOST EQUAL TO ABOVE 034C +Combining Alphabet, Korean Hangul Jamo 1100 +COMBINING ANNUITY SYMBOL 20E7 +COMBINING BREVE 0306 +COMBINING BREVE BELOW 032E +COMBINING BRIDGE ABOVE 0346 +COMBINING BRIDGE BELOW 032A +COMBINING CANDRABINDU 0310 +COMBINING CARON 030C +COMBINING CARON BELOW 032C +COMBINING CEDILLA 0327 +Combining Characters, Cyrillic 0483 +COMBINING CIRCUMFLEX ACCENT 0302 +COMBINING CIRCUMFLEX ACCENT BELOW 032D +COMBINING CLOCKWISE ARROW ABOVE 20D5 +COMBINING CLOCKWISE RING OVERLAY 20D9 +COMBINING COMMA ABOVE 0313 +COMBINING COMMA ABOVE RIGHT 0315 +COMBINING COMMA BELOW 0326 +Combining Diacritical Marks 0300 +Combining Diacritical Marks for Symbols 20D0 +COMBINING DIAERESIS 0308 +COMBINING DIAERESIS BELOW 0324 +COMBINING DOT ABOVE 0307 +COMBINING DOT BELOW 0323 +COMBINING DOUBLE ACUTE ACCENT 030B +COMBINING DOUBLE GRAVE ACCENT 030F +COMBINING DOUBLE INVERTED BREVE 0361 +COMBINING DOUBLE LOW LINE 0333 +COMBINING DOUBLE OVERLINE 033F +COMBINING DOUBLE RIGHTWARDS ARROW BELOW 0362 +COMBINING DOUBLE TILDE 0360 +COMBINING DOUBLE TILDE LEFT HALF FE22 +COMBINING DOUBLE VERTICAL LINE ABOVE 030E +COMBINING DOUBLE VERTICAL LINE BELOW 0348 +COMBINING DOUBLE VERTICAL STROKE OVERLAY 20E6 +COMBINING DOWN TACK BELOW 031E +COMBINING ENCLOSING CIRCLE 20DD +COMBINING ENCLOSING CIRCLE BACKSLASH 20E0 +COMBINING ENCLOSING DIAMOND 20DF +COMBINING ENCLOSING KEYCAP 20E3 +COMBINING ENCLOSING SCREEN 20E2 +COMBINING ENCLOSING SQUARE 20DE +COMBINING ENCLOSING UPWARD POINTING TRIANGLE 20E4 +COMBINING EQUALS SIGN BELOW 0347 +COMBINING FOUR DOTS ABOVE 20DC +COMBINING GRAPHEME JOINER 034F +COMBINING GRAVE ACCENT 0300 +COMBINING GRAVE ACCENT BELOW 0316 +COMBINING GRAVE TONE MARK 0340 +COMBINING GREEK DIALYTIKA TONOS 0344 +COMBINING GREEK KORONIS 0343 +COMBINING GREEK PERISPOMENI 0342 +COMBINING GREEK YPOGEGRAMMENI 0345 +combining hacek 030C +Combining Half Marks FE20 +COMBINING HOMOTHETIC ABOVE 034B +COMBINING HOOK ABOVE 0309 +COMBINING HORN 031B +COMBINING INVERTED BREVE 0311 +COMBINING INVERTED BREVE BELOW 032F +COMBINING INVERTED BRIDGE BELOW 033A +COMBINING INVERTED DOUBLE ARCH BELOW 032B +COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK 3099 +Combining Latin Small Letters 0363 +COMBINING LEFT ANGLE ABOVE 031A +COMBINING LEFT ANGLE BELOW 0349 +COMBINING LEFT ARROW ABOVE 20D6 +COMBINING LEFT HALF RING BELOW 031C +COMBINING LEFT HARPOON ABOVE 20D0 +COMBINING LEFT RIGHT ARROW ABOVE 20E1 +COMBINING LEFT RIGHT ARROW BELOW 034D +COMBINING LEFT TACK BELOW 0318 +COMBINING LEFTWARDS ARROW OVERLAY 20EA +COMBINING LIGATURE LEFT HALF FE20 +COMBINING LONG SOLIDUS OVERLAY 0338 +COMBINING LONG STROKE OVERLAY 0336 +COMBINING LONG VERTICAL LINE OVERLAY 20D2 +COMBINING LOW LINE 0332 +COMBINING MACRON 0304 +COMBINING MACRON BELOW 0331 +COMBINING MINUS SIGN BELOW 0320 +COMBINING NOT TILDE ABOVE 034A +COMBINING OGONEK 0328 +COMBINING OVERLINE 0305 +COMBINING PALATALIZED HOOK BELOW 0321 +COMBINING PLUS SIGN BELOW 031F +COMBINING RETROFLEX HOOK BELOW 0322 +COMBINING REVERSE SOLIDUS OVERLAY 20E5 +COMBINING REVERSED COMMA ABOVE 0314 +COMBINING RIGHT HALF RING BELOW 0339 +COMBINING RING ABOVE 030A +COMBINING RING BELOW 0325 +COMBINING RING OVERLAY 20D8 +COMBINING SEAGULL BELOW 033C +COMBINING SHORT SOLIDUS OVERLAY 0337 +COMBINING SHORT STROKE OVERLAY 0335 +COMBINING SHORT VERTICAL LINE OVERLAY 20D3 +COMBINING SQUARE BELOW 033B +COMBINING THREE DOTS ABOVE 20DB +COMBINING TILDE 0303 +COMBINING TILDE BELOW 0330 +COMBINING TILDE OVERLAY 0334 +COMBINING TRIPLE UNDERDOT 20E8 +COMBINING TURNED COMMA ABOVE 0312 +COMBINING UP TACK BELOW 031D +COMBINING UPWARDS ARROW BELOW 034E +COMBINING VERTICAL LINE ABOVE 030D +COMBINING VERTICAL LINE BELOW 0329 +COMBINING VERTICAL TILDE 033E +COMBINING WIDE BRIDGE ABOVE 20E9 +COMBINING X ABOVE 033D +COMET 2604 +COMMA 002C +COMMA, ARABIC 060C +COMMA, ARMENIAN 055D +COMMA, ETHIOPIC 1363 +comma, georgian 00B7 +COMMA, IDEOGRAPHIC 3001 +comma, invisible 2063 +COMMA, MODIFIER LETTER REVERSED 02BD +COMMA, MODIFIER LETTER TURNED 02BB +COMMA, MONGOLIAN 1802 +COMMA ABOVE, COMBINING 0313 +COMMA ABOVE, COMBINING REVERSED 0314 +COMMA ABOVE, COMBINING TURNED 0312 +COMMA ABOVE, MINUS SIGN WITH 2A29 +COMMA ABOVE RIGHT, COMBINING 0315 +COMMA BELOW, COMBINING 0326 +comma quotation mark, double 201D +comma quotation mark, double reversed 201F +comma quotation mark, double turned 201C +comma quotation mark, low double 201E +comma quotation mark, low single 201A +comma quotation mark, single 2019 +comma quotation mark, single reversed 201B +comma quotation mark, single turned 2018 +command, application program 009F +command, operating system 009D +command key 2318 +COMMERCIAL AT 0040 +COMMERCIAL MINUS SIGN 2052 +compass 263C +Compatibility, CJK 3300 +Compatibility and Specials Area F900 +Compatibility Forms, CJK FE30 +Compatibility Ideographs, CJK F900 +Compatibility Ideographs, IBM CJK FA0E +Compatibility Jamo, Korean Hangul 3130 +COMPLEMENT 2201 +complex numbers, the set of 2102 +component, radial 27DF +Components, Form and Chart 2500 +composite function 2218 +COMPOSITION, Z NOTATION RELATIONAL 2A3E +COMPOSITION, Z NOTATION SCHEMA 2A1F +composition circle, jis 20DD +COMPOSITION SYMBOL 2384 +concatenation, z notation sequence 2040 +CONCAVE-SIDED DIAMOND, WHITE 27E1 +CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK, WHITE 27E2 +CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK, WHITE 27E3 +conductance 2127 +CONGRUENT WITH DOT ABOVE 2A6D +CONICAL TAPER 2332 +CONJUGATE MATRIX, HERMITIAN 22B9 +conjunction 2227 +CONJUNCTION 260C +CONSECUTIVE EQUALS SIGNS, THREE 2A76 +CONSECUTIVE EQUALS SIGNS, TWO 2A75 +consonant for Addu dialect 0780 +CONTAINS AS MEMBER 220B +CONTAINS AS MEMBER, SMALL 220D +CONTAINS AS NORMAL SUBGROUP 22B3 +CONTAINS WITH LONG HORIZONTAL STROKE 22FA +CONTAINS WITH OVERBAR 22FD +CONTAINS WITH OVERBAR, SMALL 22FE +CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE 22FB +CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE, SMALL 22FC +continuity, absolute 2AA1 +CONTINUOUS UNDERLINE SYMBOL 2381 +continuum, second transfinite cardinal 2136 +CONTOUR INTEGRAL 222E +CONTOUR INTEGRAL, CLOCKWISE 2232 +CONTOURED OUTLINE, SQUARE WITH 29E0 +contraction operator 20E9 +control, graphic for 2388 +Control, Syriac Format 070F +Control Code Graphics 25F0 +Control Codes, ASCII C0 0000 +Control Codes, C1 0080 +Control Codes, Graphic Pictures for 2400 +Control Codes, Graphics for 237B +control sequence introducer 009B +control string, device 0090 +Controls, Bidirectional Formatting 202A +Controls, Mongolian Format 180B +Controls and Basic Latin, C0 0000 +Controls and Latin-1 Supplement, C1 0080 +COPRODUCT, AMALGAMATION OR 2A3F +COPRODUCT, N-ARY 2210 +Coptic, Greek and 0370 +Coptic-unique Letters 03E2 +COPYRIGHT, SOUND RECORDING 2117 +COPYRIGHT SIGN 00A9 +CORNER, TOP LEFT 231C +CORNER BRACKET, LEFT 300C +CORNER BRACKET, LEFT WHITE 300E +Corner brackets 2308 +Corner brackets, CJK 300C +CORNER WITH DOT, LOWER RIGHT 27D3 +CORNER WITH DOT, UPPER LEFT 27D4 +corners, Quine 231C +CORPORATION, SQUARE 337F +CORRESPONDS TO 2258 +corresponds to 2259 +costa rican currency 20A1 +countable, first transfinite cardinal 2135 +COUNTERBORE 2334 +COUNTERSINK 2335 +cr 000D +CRESCENT, STAR AND 262A +Croatian, Additions for Slovenian and 0200 +Croatian Digraphs Matching Serbian Cyrillic Letters 01C4 +CROP, TOP LEFT 230F +CROSS, EAST SYRIAC 2671 +CROSS, LATIN 271D +cross, long 2020 +CROSS, MALTESE 2720 +CROSS, ORTHODOX 2626 +cross, st. andrew's 2613 +CROSS, WEST SYRIAC 2670 +CROSS ACCENT, MODIFIER LETTER 02DF +Cross Dingbats 2719 +CROSS OF JERUSALEM 2629 +CROSS OF LORRAINE 2628 +CROSS PRODUCT, VECTOR OR 2A2F +cross ratio 211E +CROSSBONES, SKULL AND 2620 +crosshatch 0023 +CRUZEIRO SIGN 20A2 +CUBE ROOT 221B +cubed 00B3 +cup 222A +CUP, SQUARE 2294 +curly bracket, closing 007D +CURLY BRACKET, LEFT 007B +curly bracket, opening 007B +CURLY BRACKET, RIGHT 007D +CURLY LOGICAL AND 22CF +CURLY LOGICAL OR 22CE +currency, brazilian 20A2 +currency, costa rican 20A1 +currency, el salvadorian 20A1 +currency, euro european 20AC +currency, french 20A3 +currency, greek 20AF +currency, hebrew 20AA +currency, indian 20A8 +currency, iranian FDFC +currency, israeli 20AA +currency, italian 20A4 +currency, korean 20A9 +currency, laotian 20AD +currency, mongolian 20AE +currency, nigerian 20A6 +currency, phillipine 20B1 +currency, spanish 20A7 +currency, turkish 20A4 +currency, vietnamese 20AB +CURRENCY SIGN 00A4 +Currency Signs, Bengali 09F2 +currency symbol, florin 0192 +CURRENCY SYMBOL BAHT, THAI 0E3F +Currency Symbols 20A0 +current, alternating 223F +CURRENT SYMBOL FORM TWO, DIRECT 2393 +cycle 223C +CYLINDRICITY 232D +Cypriot Syllabary 10800 +Cyrillic 0400 +Cyrillic, Extended 048C +Cyrillic Capital Letters 0401 +Cyrillic Combining Characters 0483 +Cyrillic Extensions 0450 +Cyrillic Historic Letters 0460 +Cyrillic Komi Letters 0500 +Cyrillic Small Letters 0430 +Cyrillic Supplementary 0500 +D, COMBINING LATIN SMALL LETTER 0369 +D, DOUBLE-STRUCK ITALIC CAPITAL 2145 +D, DOUBLE-STRUCK ITALIC SMALL 2146 +D, LATIN CAPITAL LETTER AFRICAN 0189 +d retroflex hook, latin small letter 0256 +D WITH TAIL, LATIN SMALL LETTER 0256 +DAGGER 2020 +DAGGER, DOUBLE 2021 +d'alembertian 29E0 +DALET SYMBOL 2138 +DANDA, DEVANAGARI 0964 +DANDA, DEVANAGARI DOUBLE 0965 +dash, angled 00AC +DASH, CIRCLED 229D +DASH, EM 2014 +DASH, EN 2013 +DASH, FIGURE 2012 +dash, long 2015 +dash, quotation 2015 +DASH, SWUNG 2053 +DASH, WAVE 301C +DASH, WAVY 3030 +DASHED LOW LINE FE4D +DASHED OVERLINE FE49 +Dashes 2010 +dasia 0314 +data link escape 0010 +DATA LINK ESCAPE, SYMBOL FOR 2410 +Database Theory Operators 27D5 +DAVID, STAR OF 2721 +Days, Telegraph Symbols for 33E0 +DAY SIGN, TAMIL 0BF3 +decimal point 002E +decimal separator 002C +DECIMAL SEPARATOR, ARABIC 066B +DECIMAL SEPARATOR KEY SYMBOL 2396 +deergh viram 0965 +definition, equal to by 225C +DEFINITION, EQUAL TO BY 225D +DEGREE CELSIUS 2103 +DEGREE FAHRENHEIT 2109 +DEGREE SIGN 00B0 +degrees centigrade 2103 +degrees kelvin 212A +del 2207 +delete 007F +DELETE, SYMBOL FOR 2421 +delete, undoable 2425 +DELETE FORM TWO, SYMBOL FOR 2425 +delete to the left key 232B +delete to the right key 2326 +DELIMITER, TRIPLE VERTICAL BAR 2980 +DELTA, LATIN SMALL LETTER TURNED 018D +DELTA EQUAL TO 225C +DENTAL CLICK, LATIN LETTER 01C0 +Dentistry Notation Symbols 23BE +depth symbol 21A7 +derivative 0307 +derivative, double 0308 +derivative, fourth 20DC +derivative, third 20DB +DESCENDING NODE 260B +Description Characters, Ideographic 2FF0 +Devanagari 0900 +DEVANAGARI DANDA 0964 +Devanagari Digits 0966 +DEVANAGARI DOUBLE DANDA 0965 +Devanagari Letters 0905 +DEVANAGARI OM 0950 +device control four 0014 +DEVICE CONTROL FOUR, SYMBOL FOR 2414 +device control one 0011 +DEVICE CONTROL ONE, SYMBOL FOR 2411 +device control string 0090 +device control three 0013 +DEVICE CONTROL THREE, SYMBOL FOR 2413 +device control two 0012 +DEVICE CONTROL TWO, SYMBOL FOR 2412 +DHARMA, WHEEL OF 2638 +Diacritic-vowel Combinations, Pinyin 01CD +Diacritical Marks, Combining 0300 +Diacritical Marks for Symbols, Combining 20D0 +Diacritics, Double 0360 +Diacritics, Enclosing 20DD +Diacritics, Medieval Superscript Letter 0363 +Diacritics, Overstruck 0334 +Diacritics, Spacing Clones of 02D8 +Diacritics for Greek 0342 +Diacritics for IPA 0346 +DIAERESIS 00A8 +DIAERESIS, COMBINING 0308 +diaeresis, greek capital letter upsilon hook 03D4 +diaeresis, spacing 00A8 +DIAERESIS AND HOOK SYMBOL, GREEK UPSILON WITH 03D4 +DIAERESIS BELOW, COMBINING 0324 +DIAGONAL ELLIPSIS, UP RIGHT 22F0 +DIAGONAL SLASH, SQUARED FALLING 29C5 +DIAGONAL SLASH, SQUARED RISING 29C4 +dialytika 0308 +DIALYTIKA TONOS, COMBINING GREEK 0344 +DIAMETER SIGN 2300 +diameter symbol 2205 +DIAMOND, COMBINING ENCLOSING 20DF +DIAMOND, WHITE CONCAVE-SIDED 27E1 +DIAMOND OPERATOR 22C4 +DIAMOND WITH CENTRED DOT, WHITE 27D0 +DIAMOND WITH DOWN ARROW, BLACK 29EA +DIAMOND WITH LEFTWARDS TICK, WHITE CONCAVE-SIDED 27E2 +DIAMOND WITH RIGHTWARDS TICK, WHITE CONCAVE-SIDED 27E3 +Diamonds 25C6 +Dice 2680 +diesis 2021 +difference, backward 2207 +difference, forward 2206 +difference, sum or positive 2A26 +difference, symmetric 2238 +difference, symmetric 2296 +difference between 223C +DIFFERENCE BETWEEN 224F +difference or sum, positive 2A24 +DIFFERENTIAL, PARTIAL 2202 +DIGIT SHAPES, NATIONAL 206E +DIGIT SHAPES, NOMINAL 206F +Digits, Arabic-Indic 0660 +Digits, ASCII 0030 +Digits, Bengali 09E6 +Digits, Devanagari 0966 +Digits, Dingbat Circled 2776 +Digits, Ethiopic 1369 +Digits, Gujarati 0AE6 +Digits, Gurmukhi 0A66 +Digits, Kannada 0CE6 +Digits, Khmer 17E0 +Digits, Lao 0ED0 +Digits, Malayalam 0D66 +Digits, Mongolian 1810 +Digits, Myanmar 1040 +Digits, Oriya 0B66 +Digits, Osmanya 104A0 +Digits, Subscript 2080 +Digits, Superscript 2070 +Digits, Tamil 0BE7 +Digits, Telugu 0C66 +Digits, Thai 0E50 +Digits, Tibetan 0F20 +Digits for Persian and Urdu, Eastern Arabic-Indic 06F0 +DIGRAPH KOTO, KATAKANA 30FF +DIGRAPH YORI, HIRAGANA 309F +Digraphs, Phonetic 02A3 +Digraphs, Yiddish 05F0 +Digraphs Matching Serbian Cyrillic Letters, Croatian 01C4 +Digram Symbols, Yijing Monogram and 268A +Digram Symbols, Tai Xuan Jing 1D301 +dijkstra choice 2AFE +dijkstra choice, n-ary 2AFF +DIMENSION ORIGIN 2331 +Dingbat Circled Digits 2776 +Dingbats 2700 +Dingbats, Arrow 2794 +Dingbats, Asterisk 2722 +Dingbats, Cross 2719 +Dingbats, Drop-Shadowed 274D +Dingbats, Hazard 2620 +Dingbats, Heart 2763 +Dingbats, Miscellaneous 2600 +Dingbats, Music 2669 +Dingbats, Pencil 270E +Dingbats, Pointing Index Finger 261A +Dingbats, Quotation Mark 275B +Dingbats, Scissors 2701 +Dingbats, Snowflake 2744 +Dingbats, Star 2726 +Dingbats, Vertical Bar 2758 +Dingbats, Warning 2620 +Dingbats, Weather 2600 +Dingbats, Zapf 2700 +Dingbats Series 100, ITC Zapf 2700 +DIRECT CURRENT SYMBOL FORM TWO 2393 +direct product 2299 +direct sum 2295 +DIRECTIONAL FORMATTING, POP 202C +Directional Formatting Controls 202A +DISCONTINUOUS UNDERLINE SYMBOL 2382 +discretionary hyphen 00AD +disjunction 2228 +DITTO MARK 3003 +DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR, CIRCLE 29BA +DIVIDED BY HORIZONTAL RULE, LOZENGE 27E0 +DIVIDED BY VERTICAL BAR, CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF 29BA +DIVIDES 2223 +Divination Lore, Khmer Symbols for 17F0 +DIVISION SIGN 00F7 +DIVISION SIGN, CIRCLED 2A38 +DIVISION SIGN, CIRCLED ANTICLOCKWISE-ROTATED 29BC +Division Sign Operators, Multiplication and 2A2F +DIVISION SLASH 2215 +DIVISION SLASH, CIRCLED 2298 +DIVISION TIMES 22C7 +DOES NOT DIVIDE WITH REVERSED NEGATION SLASH 2AEE +does not yield 22A3 +DOLLAR SIGN 0024 +DOMAIN ANTIRESTRICTION, Z NOTATION 2A64 +DONG SIGN 20AB +dot 002E +DOT, AEGEAN LINE SEPARATOR 10101 +dot, greek middle 00B7 +DOT, KATAKANA MIDDLE 30FB +DOT, MIDDLE 00B7 +DOT, SESAME FE45 +DOT, WHITE SESAME FE46 +DOT ABOVE 02D9 +DOT ABOVE, COMBINING 0307 +dot above, double 0308 +DOT ABOVE, LATIN CAPITAL LETTER I WITH 0130 +DOT BELOW, COMBINING 0323 +DOT MINUS 2238 +DOT OPERATOR 22C5 +DOT OPERATOR, CIRCLED 2299 +DOT OPERATOR, N-ARY CIRCLED 2A00 +DOT OPERATOR, SQUARED 22A1 +DOT PLUS 2214 +DOTLESS BEH, ARABIC LETTER 066E +DOTLESS I, LATIN SMALL LETTER 0131 +DOTLESS QAF, ARABIC LETTER 066F +DOTS ABOVE, COMBINING FOUR 20DC +DOTS ABOVE, COMBINING THREE 20DB +DOTTED CIRCLE 25CC +DOTTED FENCE 2999 +DOUBLE ACUTE ACCENT 02DD +DOUBLE ACUTE ACCENT, COMBINING 030B +DOUBLE ANGLE BRACKET, LEFT 300A +DOUBLE ANGLE QUOTATION MARK, LEFT-POINTING 00AB +DOUBLE ANGLE QUOTATION MARK, RIGHT-POINTING 00BB +DOUBLE APOSTROPHE, MODIFIER LETTER 02EE +DOUBLE ARCH BELOW, COMBINING INVERTED 032B +double bar, latin letter pipe 01C2 +DOUBLE CIRCLE, MULTIPLICATION SIGN IN 2A37 +Double Circled Numbers 24F5 +DOUBLE COLON EQUAL 2A74 +double comma quotation mark 201D +double comma quotation mark, low 201E +DOUBLE DAGGER 2021 +DOUBLE DANDA, DEVANAGARI 0965 +double derivative 0308 +Double Diacritics 0360 +double dot above 0308 +DOUBLE DOWN TACK 2AEA +DOUBLE EXCLAMATION MARK 203C +DOUBLE GRAVE ACCENT, COMBINING 030F +DOUBLE HIGH-REVERSED-9 QUOTATION MARK 201F +DOUBLE HYPHEN, KATAKANA-HIRAGANA 30A0 +DOUBLE INTEGRAL 222C +DOUBLE INTERSECTION 22D2 +DOUBLE INVERTED BREVE, COMBINING 0361 +DOUBLE LEFT TURNSTILE, DOUBLE VERTICAL BAR 2AE5 +DOUBLE LEFT TURNSTILE, VERTICAL BAR 2AE4 +DOUBLE LOGICAL AND 2A53 +DOUBLE LOGICAL OR 2A54 +DOUBLE LOW LINE 2017 +DOUBLE LOW LINE, COMBINING 0333 +DOUBLE LOW-9 QUOTATION MARK 201E +DOUBLE NESTED GREATER-THAN 2AA2 +DOUBLE NESTED LESS-THAN 2AA1 +DOUBLE NESTED LESS-THAN WITH UNDERBAR 2AA3 +double obelisk 2021 +DOUBLE OVERBAR, LOGICAL AND WITH 2A5E +DOUBLE OVERBAR, LOGICAL OR WITH 2A62 +DOUBLE OVERLINE, COMBINING 033F +double pipe 01C1 +DOUBLE PLUS 29FA +DOUBLE PRECEDES 2ABB +DOUBLE PRIME 2033 +DOUBLE PRIME, MODIFIER LETTER 02BA +DOUBLE PRIME, REVERSED 2036 +DOUBLE PRIME QUOTATION MARK 301E +DOUBLE PRIME QUOTATION MARK, LOW 301F +DOUBLE PRIME QUOTATION MARK, REVERSED 301D +DOUBLE PUNCTUATION, PHILIPPINE 1736 +Double punctuation for vertical text 2047 +DOUBLE QUESTION MARK 2047 +DOUBLE QUOTATION MARK, LEFT 201C +DOUBLE QUOTATION MARK, RIGHT 201D +double reversed comma quotation mark 201F +DOUBLE RIGHTWARDS ARROW BELOW, COMBINING 0362 +DOUBLE SOLIDUS OPERATOR 2AFD +DOUBLE SQUARE INTERSECTION 2A4E +DOUBLE SQUARE UNION 2A4F +DOUBLE STROKE, INTEGRAL WITH 2A0E +DOUBLE STROKE NOT SIGN 2AEC +DOUBLE STROKE NOT SIGN, REVERSED 2AED +DOUBLE SUBSET 22D0 +DOUBLE SUCCEEDS 2ABC +DOUBLE SUPERSET 22D1 +DOUBLE TILDE, COMBINING 0360 +DOUBLE TILDE LEFT HALF, COMBINING FE22 +double turned comma quotation mark 201C +DOUBLE TURNSTILE, LEFT AND RIGHT 27DA +DOUBLE UNDERBAR, LOGICAL AND WITH 2A60 +DOUBLE UNDERBAR, LOGICAL OR WITH 2A63 +double underline 0333 +double underscore 0333 +double underscore, spacing 2017 +DOUBLE UNION 22D3 +DOUBLE UP TACK 2AEB +DOUBLE VERTICAL, LONG DASH FROM LEFT MEMBER OF 2AE6 +DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE 2AE5 +DOUBLE VERTICAL BAR LEFT TURNSTILE 2AE3 +DOUBLE VERTICAL LINE 2016 +DOUBLE VERTICAL LINE ABOVE, COMBINING 030E +DOUBLE VERTICAL LINE BELOW, COMBINING 0348 +DOUBLE VERTICAL STROKE, RIGHTWARDS ARROW WITH TAIL WITH 2915 +DOUBLE VERTICAL STROKE, TRIPLE HORIZONTAL BAR WITH 2A68 +DOUBLE VERTICAL STROKE OVERLAY, COMBINING 20E6 +DOUBLE WAVY OVERLINE FE4C +DOUBLE WIGGLY FENCE, LEFT 29DA +DOUBLE WIGGLY FENCE, RIGHT 29DB +double-barred pipe 01C2 +DOUBLE-ENDED MULTIMAP 29DF +DOUBLE-STRUCK CAPITAL C 2102 +DOUBLE-STRUCK CAPITAL H 210D +DOUBLE-STRUCK CAPITAL N 2115 +DOUBLE-STRUCK CAPITAL P 2119 +DOUBLE-STRUCK CAPITAL Q 211A +DOUBLE-STRUCK CAPITAL R 211D +DOUBLE-STRUCK CAPITAL Z 2124 +Double-struck Greek Letters 213D +Double-Struck Italic Mathematical Symbols 2145 +DOUBLE-STRUCK N-ARY SUMMATION 2140 +down, page 21DF +DOWN TACK 22A4 +DOWN TACK BELOW, COMBINING 031E +DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK 29E8 +DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK 29E9 +DRACHMA SIGN 20AF +Drafting Symbols 232D +dram 0292 +drop 264F +Duplicates from Big 5 FA0C +E, COMBINING LATIN SMALL LETTER 0364 +E, DOUBLE-STRUCK ITALIC SMALL 2147 +E, LATIN CAPITAL LETTER OPEN 0190 +E, LATIN CAPITAL LETTER REVERSED 018E +e, latin capital letter turned 018E +E, LATIN SMALL LETTER CLOSED OPEN 029A +E, LATIN SMALL LETTER CLOSED REVERSED OPEN 025E +E, LATIN SMALL LETTER OPEN 025B +E, LATIN SMALL LETTER REVERSED 0258 +E, LATIN SMALL LETTER REVERSED OPEN 025C +E, LATIN SMALL LETTER TURNED 01DD +E, SCRIPT CAPITAL 2130 +E, SCRIPT SMALL 212F +EARTH 2641 +Eastern Arabic-Indic Digits for Persian and Urdu 06F0 +ecu 20A0 +EIGHTH NOTE 266A +EIGHTH NOTES, BEAMED 266B +Eighths, Fractions 215B +EJECT SYMBOL 23CF +EK ONKAR, GURMUKHI 0A74 +el salvadorian currency 20A1 +ELECTRIC ARROW 2301 +electro-magnetic force, emf 2130 +electrolysis 21AF +Electrotechnical Symbols from IR 181 238D +element, unique 2129 +ELEMENT OF 2208 +ELEMENT OF, NOT AN 2209 +ELEMENT OF, SMALL 220A +ELEMENT OF OPENING DOWNWARDS 2AD9 +ELEMENT OF OPENING UPWARDS 27D2 +ELEMENT OF WITH DOT ABOVE 22F5 +ELEMENT OF WITH LONG HORIZONTAL STROKE 22F2 +ELEMENT OF WITH OVERBAR 22F6 +ELEMENT OF WITH OVERBAR, SMALL 22F7 +ELEMENT OF WITH TWO HORIZONTAL STROKES 22F9 +ELEMENT OF WITH UNDERBAR 22F8 +ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE 22F3 +ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE, SMALL 22F4 +ell, mathematical symbol 2113 +ELLIPSIS, HORIZONTAL 2026 +ELLIPSIS, MIDLINE HORIZONTAL 22EF +ELLIPSIS, UP RIGHT DIAGONAL 22F0 +ELLIPSIS, VERTICAL 22EE +elliptic function, weierstrass 2118 +EM DASH 2014 +EM QUAD 2001 +EM SPACE 2003 +EMBEDDING, LEFT-TO-RIGHT 202A +EMBEDDING, RIGHT-TO-LEFT 202B +emf 2130 +EMPHASIS MARK, ARMENIAN 055B +Emphasis Marks, Sidelining FE45 +EMPHASIS SYMBOL 2383 +EMPTY SET 2205 +Empty Sets 29B0 +EN DASH 2013 +EN QUAD 2000 +EN SPACE 2002 +Enclosed Alphanumerics 2460 +Enclosed CJK Letters and Ideographs 3200 +ENCLOSING CIRCLE, COMBINING 20DD +ENCLOSING CIRCLE BACKSLASH, COMBINING 20E0 +Enclosing Diacritics 20DD +ENCLOSING DIAMOND, COMBINING 20DF +ENCLOSING KEYCAP, COMBINING 20E3 +ENCLOSING SCREEN, COMBINING 20E2 +ENCLOSING SQUARE, COMBINING 20DE +ENCLOSING UPWARD POINTING TRIANGLE, COMBINING 20E4 +end 21F2 +end of guarded area 0097 +end of medium 0019 +end of medium, graphic for 237F +END OF MEDIUM, SYMBOL FOR 2419 +END OF PROOF 220E +end of selected area 0087 +end of text 0003 +END OF TEXT, SYMBOL FOR 2403 +end of transmission 0004 +end of transmission, graphic for 2301 +END OF TRANSMISSION, SYMBOL FOR 2404 +end of transmission block 0017 +END OF TRANSMISSION BLOCK, SYMBOL FOR 2417 +ENG, LATIN SMALL LETTER 014B +enotikon, greek 203F +enquiry 0005 +ENQUIRY, SYMBOL FOR 2405 +enter key 2324 +ENTER SYMBOL 2386 +ENVELOPE 2709 +epsilon, latin capital letter 0190 +epsilon, latin small letter 025B +epsilon, latin small letter closed 029A +epsilon, latin small letter closed reversed 025E +epsilon, reversed straight 03F6 +epsilon, reversed straight 220D +epsilon, straight 03F5 +epsilon, straight 220A +EPSILON SYMBOL, GREEK LUNATE 03F5 +EPSILON SYMBOL, GREEK REVERSED LUNATE 03F6 +EQUAL, DOUBLE COLON 2A74 +EQUAL, GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE 2A92 +EQUAL, GREATER-THAN ABOVE SIMILAR OR 2A8E +EQUAL, GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED 2A94 +EQUAL, GREATER-THAN CLOSED BY CURVE ABOVE SLANTED 2AA9 +EQUAL, LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE 2A91 +EQUAL, LESS-THAN ABOVE SIMILAR OR 2A8D +EQUAL, LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED 2A93 +EQUAL, LESS-THAN CLOSED BY CURVE ABOVE SLANTED 2AA8 +EQUAL ABOVE GREATER-THAN, LESS-THAN ABOVE DOUBLE-LINE 2A8B +EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL, LESS-THAN ABOVE SLANTED 2A93 +EQUAL ABOVE LESS-THAN, GREATER-THAN ABOVE DOUBLE-LINE 2A8C +EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL, GREATER-THAN ABOVE SLANTED 2A94 +EQUAL OR EQUAL TO, APPROXIMATELY 2A70 +EQUAL TO, ALL 224C +EQUAL TO, ALMOST 2248 +EQUAL TO, APPROXIMATELY 2245 +equal to, approximately 2257 +EQUAL TO, APPROXIMATELY EQUAL OR 2A70 +EQUAL TO, ASYMPTOTICALLY 2243 +EQUAL TO, CLOSED SUBSET OR 2AD1 +EQUAL TO, CLOSED SUPERSET OR 2AD2 +EQUAL TO, DELTA 225C +EQUAL TO, DOUBLE-LINE SLANTED GREATER-THAN OR 2AFA +EQUAL TO, DOUBLE-LINE SLANTED LESS-THAN OR 2AF9 +EQUAL TO, GEOMETRICALLY 2251 +EQUAL TO, GREATER-THAN AND SINGLE-LINE NOT 2A88 +EQUAL TO, GREATER-THAN OR 2265 +EQUAL TO, GREATER-THAN OR SLANTED 2A7E +EQUAL TO, LARGER THAN OR 2AAD +EQUAL TO, LESS-THAN AND SINGLE-LINE NOT 2A87 +EQUAL TO, LESS-THAN OR 2264 +EQUAL TO, LESS-THAN OR SLANTED 2A7D +EQUAL TO, NOT 2260 +EQUAL TO, PRECEDES ABOVE ALMOST 2AB7 +EQUAL TO, PRECEDES ABOVE NOT 2AB5 +EQUAL TO, PRECEDES ABOVE NOT ALMOST 2AB9 +EQUAL TO, PRECEDES ABOVE SINGLE-LINE NOT 2AB1 +EQUAL TO, QUESTIONED 225F +EQUAL TO, RING 2257 +EQUAL TO, RING IN 2256 +EQUAL TO, SMALLER THAN OR 2AAC +EQUAL TO, SUBSET OF ABOVE ALMOST 2AC9 +EQUAL TO, SUBSET OF ABOVE NOT 2ACB +EQUAL TO, SUCCEEDS ABOVE ALMOST 2AB8 +EQUAL TO, SUCCEEDS ABOVE NOT 2AB6 +EQUAL TO, SUCCEEDS ABOVE NOT ALMOST 2ABA +EQUAL TO, SUCCEEDS ABOVE SINGLE-LINE NOT 2AB2 +EQUAL TO, SUPERSET OF ABOVE ALMOST 2ACA +EQUAL TO, SUPERSET OF ABOVE NOT 2ACC +EQUAL TO ABOVE, COMBINING ALMOST 034C +equal to by definition 225C +EQUAL TO BY DEFINITION 225D +EQUAL TO OR GREATER-THAN, DOUBLE-LINE 2A9A +EQUAL TO OR GREATER-THAN, DOUBLE-LINE SLANTED 2A9C +EQUAL TO OR GREATER-THAN, SLANTED 2A96 +EQUAL TO OR GREATER-THAN WITH DOT INSIDE, SLANTED 2A98 +EQUAL TO OR LESS-THAN, DOUBLE-LINE 2A99 +EQUAL TO OR LESS-THAN, DOUBLE-LINE SLANTED 2A9B +EQUAL TO OR LESS-THAN, SLANTED 2A95 +EQUAL TO OR LESS-THAN WITH DOT INSIDE, SLANTED 2A97 +EQUAL TO WITH CIRCUMFLEX ACCENT, ALMOST 2A6F +EQUAL TO WITH DOT ABOVE, GREATER-THAN OR SLANTED 2A82 +EQUAL TO WITH DOT ABOVE, LESS-THAN OR SLANTED 2A81 +EQUAL TO WITH DOT ABOVE, SUBSET OF OR 2AC3 +EQUAL TO WITH DOT ABOVE, SUPERSET OF OR 2AC4 +EQUAL TO WITH DOT ABOVE LEFT, GREATER-THAN OR SLANTED 2A84 +EQUAL TO WITH DOT ABOVE RIGHT, LESS-THAN OR SLANTED 2A83 +EQUAL TO WITH DOT INSIDE, GREATER-THAN OR SLANTED 2A80 +EQUAL TO WITH DOT INSIDE, LESS-THAN OR SLANTED 2A7F +EQUALS, CIRCLED 229C +EQUALS, REVERSED TILDE 22CD +EQUALS, STAR 225B +EQUALS COLON 2255 +EQUALS SIGN 003D +EQUALS SIGN, PLUS SIGN ABOVE 2A72 +EQUALS SIGN, PRECEDES ABOVE 2AB3 +EQUALS SIGN, PRECEDES ABOVE SINGLE-LINE 2AAF +EQUALS SIGN, SIMILAR ABOVE GREATER-THAN ABOVE 2AA0 +EQUALS SIGN, SIMILAR ABOVE LESS-THAN ABOVE 2A9F +EQUALS SIGN, SUBSCRIPT 208C +EQUALS SIGN, SUBSET OF ABOVE 2AC5 +EQUALS SIGN, SUCCEEDS ABOVE 2AB4 +EQUALS SIGN, SUCCEEDS ABOVE SINGLE-LINE 2AB0 +EQUALS SIGN, SUPERSCRIPT 207C +EQUALS SIGN, SUPERSET OF ABOVE 2AC6 +EQUALS SIGN ABOVE PLUS SIGN 2A71 +EQUALS SIGN ABOVE TILDE OPERATOR 2A73 +EQUALS SIGN AND SLANTED PARALLEL 29E3 +EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE 29E4 +EQUALS SIGN BELOW, COMBINING 0347 +EQUALS SIGN WITH BUMPY ABOVE 2AAE +EQUALS SIGN WITH DOT BELOW 2A66 +EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW 2A77 +EQUALS SIGNS, THREE CONSECUTIVE 2A76 +EQUALS SIGNS, TWO CONSECUTIVE 2A75 +EQUALS WITH ASTERISK 2A6E +equiangular 225C +EQUIANGULAR TO 225A +equivalent, tautological 29E6 +EQUIVALENT TO 224D +EQUIVALENT TO, GEOMETRICALLY 224E +EQUIVALENT TO, STRICTLY 2263 +EQUIVALENT WITH FOUR DOTS ABOVE 2A78 +Era Names, Japanese 337B +ERASE TO THE LEFT 232B +ERASE TO THE RIGHT 2326 +error 212F +Error Bar Symbols 29EE +escape 001B +escape, data link 0010 +ESCAPE, SYMBOL FOR 241B +ESCAPE, SYMBOL FOR DATA LINK 2410 +escudo 0024 +ESH, LATIN CAPITAL LETTER 01A9 +ESH, LATIN SMALL LETTER 0283 +ESH, LATIN SMALL LETTER SQUAT REVERSED 0285 +ESH LOOP, LATIN LETTER REVERSED 01AA +ESTIMATED SYMBOL 212E +ESTIMATES 2259 +eszett 00DF +ET, TIRONIAN SIGN 204A +ETH, LATIN SMALL LETTER 00F0 +ethel 0153 +Ethiopic 1200 +ETHIOPIC COLON 1365 +ETHIOPIC COMMA 1363 +Ethiopic Digits 1369 +ETHIOPIC FULL STOP 1362 +ETHIOPIC QUESTION MARK 1367 +ETHIOPIC SEMICOLON 1364 +ETHIOPIC WORDSPACE 1361 +EULER CONSTANT 2107 +EURO SIGN 20AC +European Latin 0100 +european paragraph sign 00A7 +european section sign 00B6 +EXCESS 2239 +EXCLAMATION MARK 0021 +EXCLAMATION MARK, ARMENIAN 055C +EXCLAMATION MARK, DOUBLE 203C +EXCLAMATION MARK, INVERTED 00A1 +exclamation mark, latin letter 01C3 +EXCLAMATION MARK, QUESTION 2048 +EXCLAMATION MARK ORNAMENT, HEAVY 2762 +EXCLAMATION QUESTION MARK 2049 +EXISTS, THERE 2203 +Extended Additional, Latin 1E00 +Extended Arabic 0671 +Extended Cyrillic 048C +Extended for Minnan and Hakka, Chinese Bopomofo 31A0 +Extended Greek 1F00 +Extended-A, Latin 0100 +Extended-B, Latin 0180 +extension, arrows 23AF +EXTENSION, HORIZONTAL LINE 23AF +EXTENSION, INTEGRAL 23AE +EXTENSION, VERTICAL LINE 23D0 +Extension A, CJK Unified Ideographs 3400 +Extensions, Cyrillic 0450 +Extensions, IPA 0250 +Extensions, Katakana Phonetic 31F0 +Extensions, Special Characters 23AE +Extensions for Sanskrit and Tibetan, Mongolian 1880 +Extensions for Vietnamese, Latin 1EA0 +EZH, LATIN CAPITAL LETTER 01B7 +EZH, LATIN SMALL LETTER 0292 +EZH REVERSED, LATIN SMALL LETTER 01B9 +F, SCRIPT CAPITAL 2131 +F, TURNED CAPITAL 2132 +F WITH HOOK, LATIN SMALL LETTER 0192 +FACE, BLACK SMILING 263B +FACE, POSTAL MARK 3020 +FACE, WHITE FROWNING 2639 +FACE, WHITE SMILING 263A +FACSIMILE SIGN 213B +factorial 0021 +FAHRENHEIT, DEGREE 2109 +FALLING DIAGONAL SLASH, SQUARED 29C5 +FALLING DOTS, MINUS SIGN WITH 2A2B +feet 2032 +FEMALE SIGN 2640 +FEMININE ORDINAL INDICATOR 00AA +FENCE, DOTTED 2999 +FENCE, LEFT DOUBLE WIGGLY 29DA +FENCE, LEFT WIGGLY 29D8 +FENCE, RIGHT DOUBLE WIGGLY 29DB +FENCE, RIGHT WIGGLY 29D9 +Fences 2999 +Fences 29D8 +Fifths, Fractions 2155 +FIGURE DASH 2012 +FIGURE SPACE 2007 +file separator 001C +FILE SEPARATOR, SYMBOL FOR 241C +Finger Dingbats, Pointing Index 261A +finite function, z notation 20E6 +finite function, z notation 21FB +finite injection, z notation 2915 +FINITE PART INTEGRAL 2A0D +finite relation, z notation 21FC +finite surjection, z notation 2901 +finite surjective injection, z notation 2918 +FIRST QUARTER MOON 263D +first transfinite cardinal (countable) 2135 +Fish Tails 297C +FISHEYE 25C9 +fist 261E +FIVE, LATIN SMALL LETTER TONE 01BD +FIVE POINTED STAR, ARABIC 066D +FLAG, BLACK 2691 +FLAT SIGN, MUSIC 266D +FLOOR, LEFT 230A +FLORAL HEART BULLET, REVERSED ROTATED 2619 +florin currency symbol 0192 +folder 0192 +FOOT, SQUARE 23CD +FOONOTE MARKER, ARABIC 0602 +FOR ALL 2200 +FORCES 22A9 +FORKING 2ADC +Forks 2AD9 +Form and Chart Components 2500 +form feed 000C +form feed 21A1 +FORM FEED, SYMBOL FOR 240C +Format Control, Syriac 070F +Format Controls, Mongolian 180B +FORMATTING, POP DIRECTIONAL 202C +Formatting Characters 200C +Formatting Characters 2028 +Formatting Controls, Bidirectional 202A +forward difference 2206 +FOUR DOTS ABOVE, COMBINING 20DC +FOUR-PER-EM SPACE 2005 +fourier transform 2131 +fourth derivative 20DC +FOURTH ROOT 221C +fourth transfinite cardinal 2138 +Fourths, Fractions 00BC +FRACTION NUMERATOR ONE 215F +FRACTION ONE HALF, VULGAR 00BD +FRACTION ONE QUARTER, VULGAR 00BC +FRACTION SLASH 2044 +FRACTION THREE QUARTERS, VULGAR 00BE +Fractions 2153 +FRAGMENT, ARABIC TAIL FE73 +framus, white 29D6 +FRANC SIGN, FRENCH 20A3 +FRICATIVE, LATIN LETTER PHARYNGEAL VOICED 0295 +FROWN 2322 +FROWNING FACE, WHITE 2639 +FULL BLOCK 2588 +FULL OUTER JOIN 27D7 +FULL STOP 002E +FULL STOP, ARABIC 06D4 +FULL STOP, ARMENIAN 0589 +FULL STOP, ETHIOPIC 1362 +full stop, georgian 0589 +FULL STOP, IDEOGRAPHIC 3002 +FULL STOP, MONGOLIAN 1803 +Fullwidth ASCII Variants FF01 +Fullwidth Brackets FF5F +Fullwidth Forms, Halfwidth and FF00 +Fullwidth Symbol Variants FFE0 +FUNCTION, CIRCULATION 2A10 +function, gamma 0393 +function, z notation finite 20E6 +function, z notation finite 21FB +function, z notation partial 21F8 +FUNCTION APPLICATION 2061 +function symbol 0192 +fvs 180B +G, LATIN LETTER SMALL CAPITAL 0262 +G, LATIN SMALL LETTER SCRIPT 0261 +G, SCRIPT SMALL 210A +G, TURNED SANS-SERIF CAPITAL 2141 +game 2141 +GAMMA, DOUBLE-STRUCK CAPITAL 213E +GAMMA, DOUBLE-STRUCK SMALL 213D +GAMMA, LATIN CAPITAL LETTER 0194 +GAMMA, LATIN SMALL LETTER 0263 +gamma, latin small letter baby 0264 +GAMMA, MODIFIER LETTER SMALL 02E0 +gamma function 0393 +GB 2312 (Chinese), Based on 3100 +GEMINI 264A +General Punctuation 2000 +General Scripts Area 0000 +GENERIC MATERIALS, RECYCLING SYMBOL FOR 267A +Generic punctuation for Philippine scripts 1735 +GEOMETRIC PROPORTION 223A +Geometric Shapes 25A0 +GEOMETRICALLY EQUAL TO 2251 +GEOMETRICALLY EQUIVALENT TO 224E +Georgian 10A0 +Georgian Capital Letters 10A0 +georgian comma 00B7 +georgian full stop 0589 +GEORGIAN PARAGRAPH SEPARATOR 10FB +Georgian Small Letters 10D0 +german mark 2133 +GERMAN PENNY SIGN 20B0 +GETA MARK 3013 +GIMEL SYMBOL 2137 +GLEICH STARK 29E6 +glottal stop 02BC +GLOTTAL STOP, LATIN LETTER 0294 +GLOTTAL STOP, LATIN LETTER INVERTED 0296 +glottal stop, latin letter reversed 0295 +GLOTTAL STOP, MODIFIER LETTER 02C0 +GLOTTAL STOP, MODIFIER LETTER REVERSED 02C1 +GLOTTAL STOP, MODIFIER LETTER SMALL REVERSED 02E4 +Go Markers 2686 +Golden Number Runes 16EE +GRAPHEME JOINER, COMBINING 034F +Graphic Characters, Terminal 23B7 +Graphic Characters, Terminal 2596 +Graphic Pictures for Control Codes 2400 +Graphics, Control Code 25F0 +Graphics, Scan Lines For Terminal 23BA +Graphics for Control Codes 237B +grave, spacing 0060 +GRAVE ACCENT 0060 +GRAVE ACCENT, COMBINING 0300 +GRAVE ACCENT, COMBINING DOUBLE 030F +GRAVE ACCENT, DEVANAGARI 0953 +GRAVE ACCENT, MODIFIER LETTER 02CB +GRAVE ACCENT, MODIFIER LETTER LOW 02CE +grave accent, swedish 02DF +GRAVE ACCENT BELOW, COMBINING 0316 +GRAVE TONE MARK, COMBINING 0340 +GREATER-THAN, CIRCLED 29C1 +GREATER-THAN, DOUBLE NESTED 2AA2 +GREATER-THAN, DOUBLE-LINE EQUAL TO OR 2A9A +GREATER-THAN, DOUBLE-LINE SLANTED EQUAL TO OR 2A9C +GREATER-THAN, LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE 2A8B +GREATER-THAN, LESS-THAN ABOVE SIMILAR ABOVE 2A8F +GREATER-THAN, MUCH 226B +GREATER-THAN, SIMILAR OR 2A9E +GREATER-THAN, SLANTED EQUAL TO OR 2A96 +GREATER-THAN, TRIPLE NESTED 2AF8 +GREATER-THAN, VERY MUCH 22D9 +GREATER-THAN ABOVE DOUBLE-LINE EQUAL, LESS-THAN ABOVE 2A91 +GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN 2A8C +GREATER-THAN ABOVE EQUALS SIGN, SIMILAR ABOVE 2AA0 +GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL 2A92 +GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN 2A90 +GREATER-THAN ABOVE SIMILAR OR EQUAL 2A8E +GREATER-THAN ABOVE SLANTED EQUAL, LESS-THAN ABOVE SLANTED EQUAL ABOVE 2A93 +GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL 2A94 +GREATER-THAN AND NOT APPROXIMATE 2A8A +GREATER-THAN AND SINGLE-LINE NOT EQUAL TO 2A88 +GREATER-THAN BESIDE LESS-THAN 2AA5 +GREATER-THAN CLOSED BY CURVE 2AA7 +GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL 2AA9 +GREATER-THAN OR APPROXIMATE 2A86 +GREATER-THAN OR EQUAL TO 2265 +GREATER-THAN OR EQUAL TO, DOUBLE-LINE SLANTED 2AFA +GREATER-THAN OR SLANTED EQUAL TO 2A7E +GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE 2A82 +GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT 2A84 +GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE 2A80 +GREATER-THAN OVERLAPPING LESS-THAN 2AA4 +GREATER-THAN SIGN 003E +GREATER-THAN WITH CIRCLE INSIDE 2A7A +GREATER-THAN WITH DOT INSIDE, SLANTED EQUAL TO OR 2A98 +GREATER-THAN WITH QUESTION MARK ABOVE 2A7C +Greek, Diacritics for 0342 +Greek, Extended 1F00 +Greek and Coptic 0370 +Greek Capital Letters 0391 +greek currency 20AF +GREEK DIALYTIKA TONOS, COMBINING 0344 +greek enotikon 203F +GREEK KORONIS, COMBINING 0343 +greek middle dot 00B7 +greek non-spacing iota below 0345 +GREEK PERISPOMENI, COMBINING 0342 +GREEK QUESTION MARK 037E +GREEK SMALL LETTER IOTA, TURNED 2129 +Greek Small Letters 03B1 +Greek Symbols 03D0 +GREEK YPOGEGRAMMENI, COMBINING 0345 +group lock 21F0 +group separator 001D +GROUP SEPARATOR, SYMBOL FOR 241D +guarded area, end of 0097 +guarded area, start of 0096 +gui icons 231A +guillemet, left pointing 00AB +guillemet, left pointing single 2039 +guillemet, right pointing 00BB +guillemet, right pointing single 203A +Gujarati 0A80 +Gujarati Digits 0AE6 +Gujarati Letters 0A85 +GUJARATI RUPEE SIGN 0AF1 +Gurmukhi 0A00 +Gurmukhi Digits 0A66 +Gurmukhi Letters 0A05 +H, BLACK-LETTER CAPITAL 210C +H, COMBINING LATIN SMALL LETTER 036A +H, DOUBLE-STRUCK CAPITAL 210D +H, LATIN LETTER SMALL CAPITAL 029C +H, LATIN SMALL LETTER TURNED 0265 +H, MODIFIER LETTER SMALL 02B0 +H, SCRIPT CAPITAL 210B +hacek, combining 030C +hacek, modifier letter 02C7 +HAIR SPACE 200A +Hakka, Chinese Bopomofo Extended for Minnan and 31A0 +halant, bengali 09CD +halant, devanagari 094D +HALF, COMBINING DOUBLE TILDE LEFT FE22 +HALF, COMBINING LIGATURE LEFT FE20 +HALF, VULGAR FRACTION ONE 00BD +HALF CIRCLE, MULTIPLICATION SIGN IN LEFT 2A34 +HALF CIRCLE, MULTIPLICATION SIGN IN RIGHT 2A35 +HALF CIRCLE, PLUS SIGN IN LEFT 2A2D +HALF CIRCLE, PLUS SIGN IN RIGHT 2A2E +HALF FILL SPACE, IDEOGRAPHIC 303F +HALF INTEGRAL, TOP 2320 +Half Marks, Combining FE20 +HALF RING, MODIFIER LETTER CENTRED LEFT 02D3 +HALF RING, MODIFIER LETTER LEFT 02BF +HALF RING BELOW, COMBINING LEFT 031C +HALF RING BELOW, COMBINING RIGHT 0339 +HALF TRIANGULAR COLON, MODIFIER LETTER 02D1 +Halfwidth and Fullwidth Forms FF00 +Halfwidth Japanese Katakana Variants FF61 +Halfwidth Korean Hangul Variants FFA0 +hamiltonian function 210B +HAMMER AND SICKLE 262D +Han Ideographs 4E00 +HAND, VICTORY 270C +HAND, WRITING 270D +Hand Symbols, Pointing 261A +Hangul, Based on KS C 5601 (Korean) 3130 +HANGUL CHOSEONG FILLER 115F +Hangul Compatibility Jamo, Korean 3130 +Hangul Elements, Circled Korean 3260 +Hangul Elements, Parenthesized Korean 3200 +HANGUL FILLER 3164 +Hangul Jamo Combining Alphabet, Korean 1100 +HANGUL JUNGSEONG FILLER 1160 +Hangul Syllables, Circled Korean 326E +Hangul Syllables, Parenthesized Korean 320E +Hangul Syllables Area, Korean AC00 +Hangul Variants, Halfwidth Korean FFA0 +Hangzhou-style Numerals 3021 +Hanunoo 1720 +HANUNOO SIGN PAMUDPOD 1734 +Hanunóo-specific punctuation 1734 +HARPOON ABOVE, COMBINING LEFT 20D0 +hasant 09CD +hash 0023 +hat 0302 +hat 2229 +have a nice day! 263A +Hazard Dingbats 2620 +heading, start of 0001 +HEADING, SYMBOL FOR START OF 2401 +Heart Ornaments 2763 +HEAVY BALLOT X 2718 +HEAVY CHECK MARK 2714 +HEAVY MULTIPLICATION X 2716 +Hebrew 0590 +Hebrew Cantillation Marks 0591 +hebrew currency 20AA +Hebrew Letters 05D0 +Hebrew Points 05B0 +Hebrew Presentation Forms FB1D +HELM SYMBOL 2388 +HERMITIAN CONJUGATE MATRIX 22B9 +Hexagram Symbols, Yijing 4DC0 +hiding, z notation schema 29F9 +High Surrogates D800 +HIGH VOLTAGE SIGN 26A1 +HIGH-REVERSED-9 QUOTATION MARK, DOUBLE 201F +HIGH-REVERSED-9 QUOTATION MARK, SINGLE 201B +higher rank than 227B +hilbert space 210C +Hiragana, Based on JIS X 0208 (Japanese) 3040 +HIRAGANA DIGRAPH YORI 309F +HIRAGANA ITERATION MARK 309D +histogram marker 25AE +Historic Letters, Cyrillic 0460 +home 21B8 +home 21F1 +HOMOTHETIC 223B +HOMOTHETIC ABOVE, COMBINING 034B +Honorific Signs, Arabic 0610 +HOOK, MODIFIER LETTER RHOTIC 02DE +hook, nasal 0328 +HOOK ABOVE, COMBINING 0309 +HOOK BELOW, COMBINING PALATALIZED 0321 +HOOK BELOW, COMBINING RETROFLEX 0322 +HORIZONTAL BAR 2015 +HORIZONTAL BAR, CIRCLE WITH 29B5 +HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE, TRIPLE 2A68 +HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE, TRIPLE 2A69 +HORIZONTAL ELLIPSIS 2026 +HORIZONTAL ELLIPSIS, MIDLINE 22EF +HORIZONTAL LINE EXTENSION 23AF +HORIZONTAL RULE, LOZENGE DIVIDED BY 27E0 +horizontal tabulation 0009 +HORIZONTAL TABULATION, SYMBOL FOR 2409 +HORN, COMBINING 031B +HORN, LATIN SMALL LETTER RAMS 0264 +HOT BEVERAGE 2615 +HOT SPRINGS 2668 +HOURGLASS 231B +HOURGLASS, BLACK 29D7 +HOURGLASS, WHITE 29D6 +Hours, Telegraph Symbols for 3358 +HOUSE 2302 +HV, LATIN SMALL LETTER 0195 +HWAIR, LATIN CAPITAL LETTER 01F6 +HYPHEN 2010 +HYPHEN, ARMENIAN 058A +hyphen, discretionary 00AD +HYPHEN, KATAKANA-HIRAGANA DOUBLE 30A0 +HYPHEN, NON-BREAKING 2011 +HYPHEN, SOFT 00AD +HYPHEN BULLET 2043 +hyphen or minus sign 002D +HYPHEN-MINUS 002D +HYPHENATION POINT 2027 +hyphus 002D +HYSTERESIS SYMBOL 238E +I, BLACK-LETTER CAPITAL 2111 +I, COMBINING LATIN SMALL LETTER 0365 +I, DOUBLE-STRUCK ITALIC SMALL 2148 +I, LATIN LETTER SMALL CAPITAL 026A +I, LATIN SMALL LETTER DOTLESS 0131 +I, SCRIPT CAPITAL 2110 +I, SUPERSCRIPT LATIN SMALL LETTER 2071 +I WITH DOT ABOVE, LATIN CAPITAL LETTER 0130 +IBM CJK Compatibility Ideographs FA0E +icons, gui 231A +identical and parallel to 2A68 +IDENTICAL TO 2261 +IDENTICAL TO AND SLANTED PARALLEL 29E5 +IDENTICAL WITH DOT ABOVE 2A67 +Ideographic Annotation, Japanese Kanbun 3190 +IDEOGRAPHIC CLOSING MARK 3006 +IDEOGRAPHIC COMMA 3001 +Ideographic Description Characters 2FF0 +IDEOGRAPHIC FULL STOP 3002 +IDEOGRAPHIC HALF FILL SPACE 303F +IDEOGRAPHIC ITERATION MARK 3005 +IDEOGRAPHIC ITERATION MARK, VERTICAL 303B +IDEOGRAPHIC NUMBER ZERO 3007 +IDEOGRAPHIC SPACE 3000 +Ideographic Tone Marks 302A +Ideographs, Circled 3280 +Ideographs, CJK Compatibility F900 +Ideographs, CJK Unified 4E00 +Ideographs, Enclosed CJK Letters and 3200 +Ideographs, Han 4E00 +Ideographs, IBM CJK Compatibility FA0E +Ideographs, Parenthesized 3220 +Ideographs Area, CJK 3400 +Ideographs Extension A, CJK Unified 3400 +IDLE, SYMBOL FOR SYNCHRONOUS 2416 +idle, synchronous 0016 +IJ, LATIN SMALL LIGATURE 0133 +IMAGE OF 22B7 +IMAGE OF, SQUARE 228F +imaginary part 2111 +implies 22A2 +inches 2033 +included in set 2282 +includes in set 2283 +INCOMPLETE INFINITY 29DC +incorporated, japanese 337F +INCREASES AS 29E1 +INCREMENT 2206 +independence 2AEB +independent 2ADD +independent, not 2ADC +index 0084 +Index Finger Dingbats, Pointing 261A +indian currency 20A8 +inferior order to, of 2134 +INFINITY 221E +INFINITY, INCOMPLETE 29DC +INFINITY, TIE OVER 29DD +INFINITY NEGATED WITH VERTICAL BAR 29DE +INFORMATION SOURCE 2139 +INHIBIT ARABIC FORM SHAPING 206C +INHIBIT SYMMETRIC SWAPPING 206A +injection, z notation finite 2915 +injection, z notation finite surjective 2918 +injection, z notation partial 2914 +injection, z notation surjective 2917 +INSERTION POINT, CARET 2041 +INSERTION SYMBOL 2380 +integers, the set of 2124 +INTEGRAL 222B +INTEGRAL, CLOCKWISE 2231 +INTEGRAL, CLOCKWISE CONTOUR 2232 +INTEGRAL, CONTOUR 222E +INTEGRAL, DOUBLE 222C +integral, riemann 211B +INTEGRAL, SURFACE 222F +INTEGRAL, TOP HALF 2320 +INTEGRAL, TRIPLE 222D +INTEGRAL, VOLUME 2230 +Integrals, Summations and 2A0A +INTERCALATE 22BA +INTERIOR PRODUCT 2A3C +INTERIOR PRODUCT, RIGHTHAND 2A3D +interleave 2AF4 +Interlinear Annotation FFF9 +Internal Codes, Process FDD0 +International Phonetic Alphabet 0250 +INTERROBANG 203D +INTERSECTION 2229 +INTERSECTION, DOUBLE 22D2 +INTERSECTION, INTEGRAL WITH 2A19 +INTERSECTION, N-ARY 22C2 +intersection, proper 22D4 +INTERSECTION, TRANSVERSAL 2ADB +INTERSECTION OPERATOR, N-ARY SQUARE 2A05 +INTERSECTION WITH DOT 2A40 +Intersections and Unions 2A40 +introducer, control sequence 009B +introducer, single character 009A +Inverse Numbers, Circled 2776 +INVERTED BREVE, COMBINING 0311 +INVERTED BREVE, COMBINING DOUBLE 0361 +INVERTED BREVE BELOW, COMBINING 032F +INVERTED BRIDGE BELOW, COMBINING 033A +INVERTED DOUBLE ARCH BELOW, COMBINING 032B +INVERTED EXCLAMATION MARK 00A1 +INVERTED GLOTTAL STOP, LATIN LETTER 0296 +INVERTED LAZY S 223E +INVERTED OHM SIGN 2127 +INVERTED QUESTION MARK 00BF +INVERTED R, LATIN LETTER SMALL CAPITAL 0281 +INVERTED R, MODIFIER LETTER SMALL CAPITAL 02B6 +INVERTED UNDERTIE 2054 +Invisible Operators 2063 +IOTA, LATIN CAPITAL LETTER 0196 +IOTA, LATIN SMALL LETTER 0269 +IOTA, TURNED GREEK SMALL LETTER 2129 +iota below, greek non-spacing 0345 +IPA, Diacritics for 0346 +IPA Extensions 0250 +IR 181, Electrotechnical Symbols from 238D +iran, symbol of 262B +irish punt 00A3 +ISCII 1988 (Devanagari), Based on 0901 +ISO 8859-1 (Latin-1), Based on 00A0 +ISO 8859-2, -3, -4, -9 (European Latin), Based on 0100 +ISO 8859-5 (Cyrillic), Based on 0400 +ISO 8859-6 (Arabic), Based on 0600 +ISO 8859-7 (Greek), Based on 0370 +ISO 8859-8 (Hebrew), Based on 05D0 +ISO 9995-7, Keyboard Symbols from 2380 +ISO 9995-7, Keyboard Symbols from 2396 +israeli currency 20AA +italian currency 20A4 +Italic Mathematical Symbols, Double-Struck 2145 +ITC Zapf Dingbats Series 100 2700 +ITERATION MARK, HIRAGANA 309D +ITERATION MARK, IDEOGRAPHIC 3005 +ITERATION MARK, KATAKANA 30FD +ITERATION MARK, VERTICAL IDEOGRAPHIC 303B +ivy leaf 2767 +J, DOUBLE-STRUCK ITALIC SMALL 2149 +J, MODIFIER LETTER SMALL 02B2 +jack 2749 +Jamo, Korean Hangul Compatibility 3130 +Jamo Combining Alphabet, Korean Hangul 1100 +Japanese Chess Symbols 2616 +Japanese Era Names 337B +Japanese Hiragana 3040 +japanese incorporated 337F +JAPANESE INDUSTRIAL STANDARD SYMBOL 3004 +Japanese Kanbun (Ideographic Annotation) 3190 +Japanese Katakana 30A0 +Japanese Katakana, Circled 32D0 +Japanese Katakana Variants, Halfwidth FF61 +Japanese Katakana Words, Squared 3300 +japanese kome 203B +JERUSALEM, CROSS OF 2629 +jis composition circle 20DD +JIS X 0208, Based on 3040 +JIS X 0213 Compatibility Ideographs FA30 +JOIN 2A1D +JOIN, FULL OUTER 27D7 +JOIN, LEFT OUTER 27D5 +JOIN, RIGHT OUTER 27D6 +JOINER, COMBINING GRAPHEME 034F +JOINER, WORD 2060 +JOINER, ZERO WIDTH 200D +jot, apl 2218 +JUPITER 2643 +justification, character tabulation with 0089 +K, LATIN SMALL LETTER TURNED 029E +kabusiki-gaisya 337F +Kana Repeat Marks 3031 +Kanbun (Ideographic Annotation), Japanese 3190 +Kangxi Radicals 2F00 +Kannada 0C80 +Kannada Digits 0CE6 +Kannada Letters 0C85 +Katakana, Circled Japanese 32D0 +Katakana, Japanese 30A0 +KATAKANA DIGRAPH KOTO 30FF +KATAKANA ITERATION MARK 30FD +KATAKANA MIDDLE DOT 30FB +Katakana Phonetic Extensions 31F0 +Katakana Variants, Halfwidth Japanese FF61 +Katakana Words, Squared Japanese 3300 +KATAKANA-HIRAGANA DOUBLE HYPHEN 30A0 +KATAKANA-HIRAGANA PROLONGED SOUND MARK 30FC +KATAKANA-HIRAGANA VOICED SOUND MARK 309B +KATAKANA-HIRAGANA VOICED SOUND MARK, COMBINING 3099 +KELVIN SIGN 212A +ket 27E7 +key, clear 2327 +key, command 2318 +key, delete to the left 232B +key, delete to the right 2326 +key, enter 2324 +KEY, OPTION 2325 +KEY SYMBOL, ALTERNATIVE 2387 +KEY SYMBOL, DECIMAL SEPARATOR 2396 +KEYBOARD 2328 +Keyboard Symbols 2324 +Keyboard Symbols from ISO 9995-7 2380 +Keyboard Symbols from ISO 9995-7 2396 +Keyboard and UI Symbols 23CE +KEYCAP, COMBINING ENCLOSING 20E3 +Khmer 1780 +Khmer Digits 17E0 +Khmer Lunar Date Symbols 19E0 +Khmer Symbols 19E0 +Khmer Symbols for Divination Lore 17F0 +KIP SIGN 20AD +kome, japanese 203B +Komi Letters, Cyrillic 0500 +Koranic Annotation Signs 06D6 +korean currency 20A9 +Korean Hangul Compatibility Jamo 3130 +Korean Hangul Elements, Circled 3260 +Korean Hangul Elements, Parenthesized 3200 +Korean Hangul Jamo Combining Alphabet 1100 +Korean Hangul Syllables, Circled 326E +Korean Hangul Syllables, Parenthesized 320E +Korean Hangul Syllables Area AC00 +Korean Hangul Variants, Halfwidth FFA0 +KOREAN STANDARD SYMBOL 327F +KORONIS, COMBINING GREEK 0343 +KOTO, KATAKANA DIGRAPH 30FF +KRA, LATIN SMALL LETTER 0138 +KS C 5601 (Korean Hangul), Based on 3130 +L, LATIN LETTER SMALL CAPITAL 029F +L, MODIFIER LETTER SMALL 02E1 +L, REVERSED SANS-SERIF CAPITAL 2143 +L, SCRIPT CAPITAL 2112 +L, SCRIPT SMALL 2113 +L, TURNED SANS-SERIF CAPITAL 2142 +L B BAR SYMBOL 2114 +L WITH MIDDLE DOT, LATIN SMALL LETTER 0140 +L WITH MIDDLE TILDE, LATIN SMALL LETTER 026B +lambda bar, latin letter 019B +Lao 0E80 +Lao Digits 0ED0 +Lao Letters 0E81 +laotian currency 20AD +laplace operator 2206 +laplace operator 2207 +laplace symbol 2112 +LARGE AND, SLOPING 2A58 +large bowtie 2A1D +LARGE DOWN TACK 27D9 +LARGE LEFT TRIANGLE OPERATOR 2A1E +LARGE OR, SLOPING 2A57 +LARGE TRIPLE VERTICAL BAR OPERATOR 2AFC +LARGE UP TACK 27D8 +LARGER THAN 2AAB +LARGER THAN OR EQUAL TO 2AAD +LAST QUARTER MOON 263E +LATERAL CLICK, LATIN LETTER 01C1 +Latin, Based on ISO 8859-2, -3, -4, -9 (European) 0100 +Latin, C0 Controls and Basic 0000 +Latin, European 0100 +Latin Abbreviations, Squared 3371 +LATIN CAPITAL LETTER N WITH LONG RIGHT LEG 0220 +Latin Capital Letters 0041 +LATIN CROSS 271D +Latin Extended Additional 1E00 +Latin Extended-A 0100 +Latin Extended-B 0180 +Latin Extensions for Vietnamese 1EA0 +Latin Letters, Circled 24B6 +Latin Letters, Parenthesized 249C +Latin Letters, Phonetic Modifiers Derived from 02B0 +Latin Ligatures FB00 +Latin Small Letters 0061 +Latin Small Letters, Combining 0363 +Latin-1, ISO 8859-1 aka 00A0 +Latin-1 Supplement, C1 Controls and 0080 +lazy s 223D +LAZY S, INVERTED 223E +LEADER, ONE DOT 2024 +leader, three dot 2026 +LEADER, TWO DOT 2025 +leaf, aldus 2766 +leaf, ivy 2767 +LEFT-TO-RIGHT EMBEDDING 202A +LEFT-TO-RIGHT MARK 200E +LEFT-TO-RIGHT OVERRIDE 202D +leftward tab 21E4 +LEG, LATIN CAPITAL LETTER N WITH LONG RIGHT 0220 +LENTICULAR BRACKET, LEFT BLACK 3010 +LENTICULAR BRACKET, LEFT WHITE 3016 +LEO 264C +LESS-THAN, CIRCLED 29C0 +LESS-THAN, DOUBLE NESTED 2AA1 +LESS-THAN, DOUBLE-LINE EQUAL TO OR 2A99 +LESS-THAN, DOUBLE-LINE SLANTED EQUAL TO OR 2A9B +LESS-THAN, GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE 2A8C +LESS-THAN, GREATER-THAN ABOVE SIMILAR ABOVE 2A90 +LESS-THAN, GREATER-THAN BESIDE 2AA5 +LESS-THAN, GREATER-THAN OVERLAPPING 2AA4 +LESS-THAN, MUCH 226A +LESS-THAN, SIMILAR OR 2A9D +LESS-THAN, SLANTED EQUAL TO OR 2A95 +LESS-THAN, TRIPLE NESTED 2AF7 +LESS-THAN, VERY MUCH 22D8 +LESS-THAN ABOVE DOUBLE-LINE EQUAL, GREATER-THAN ABOVE 2A92 +LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN 2A8B +LESS-THAN ABOVE EQUALS SIGN, SIMILAR ABOVE 2A9F +LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL 2A91 +LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN 2A8F +LESS-THAN ABOVE SIMILAR OR EQUAL 2A8D +LESS-THAN ABOVE SLANTED EQUAL, GREATER-THAN ABOVE SLANTED EQUAL ABOVE 2A94 +LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL 2A93 +LESS-THAN AND NOT APPROXIMATE 2A89 +LESS-THAN AND SINGLE-LINE NOT EQUAL TO 2A87 +LESS-THAN CLOSED BY CURVE 2AA6 +LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL 2AA8 +LESS-THAN OR APPROXIMATE 2A85 +LESS-THAN OR EQUAL TO 2264 +LESS-THAN OR EQUAL TO, DOUBLE-LINE SLANTED 2AF9 +LESS-THAN OR SLANTED EQUAL TO 2A7D +LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE 2A81 +LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT 2A83 +LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE 2A7F +LESS-THAN SIGN 003C +LESS-THAN WITH CIRCLE INSIDE 2A79 +LESS-THAN WITH DOT INSIDE, SLANTED EQUAL TO OR 2A97 +LESS-THAN WITH QUESTION MARK ABOVE 2A7B +LESS-THAN WITH UNDERBAR, DOUBLE NESTED 2AA3 +Letterlike Symbols 2100 +level 2 lock 21EB +level 3 lock 21EF +level 3 select 21EE +LEZH, LATIN SMALL LETTER 026E +lf 000A +LIABILITY SIGN, LIMITED 32CF +LIBRA 264E +ligature ae, latin small 00E6 +LIGATURE IJ, LATIN SMALL 0133 +LIGATURE LEFT HALF, COMBINING FE20 +LIGATURE OE, LATIN SMALL 0153 +ligature tie 0361 +Ligatures, Armenian FB13 +Ligatures, Latin FB00 +LIGHTNING 2607 +LIMIT, APPROACHES THE 2250 +Limbu 1900 +Limbu Digits 1946 +LIMITED LIABILITY SIGN 32CF +LINE, AEGEAN WORD SEPARATOR 10100 +line, beginning of 2310 +LINE, CENTRELINE LOW FE4E +LINE, COMBINING DOUBLE LOW 0333 +LINE, COMBINING LOW 0332 +LINE, DASHED LOW FE4D +LINE, DOUBLE LOW 2017 +LINE, DOUBLE VERTICAL 2016 +LINE, LOW 005F +LINE, MODIFIER LETTER LOW VERTICAL 02CC +LINE, MODIFIER LETTER VERTICAL 02C8 +line, new 21B5 +line, next 0085 +LINE, VERTICAL 007C +LINE, WAVY 2307 +LINE, WAVY LOW FE4F +LINE ABOVE, COMBINING DOUBLE VERTICAL 030E +LINE ABOVE, COMBINING VERTICAL 030D +LINE BELOW, COMBINING DOUBLE VERTICAL 0348 +LINE BELOW, COMBINING VERTICAL 0329 +line down, partial 008B +line feed 000A +line feed 21B4 +line feed, reverse 008D +LINE FEED, SYMBOL FOR 240A +line marker 2319 +LINE OVERLAY, COMBINING LONG VERTICAL 20D2 +LINE OVERLAY, COMBINING SHORT VERTICAL 20D3 +LINE SEPARATOR 2028 +LINE SYMBOL, CENTRE 2104 +line tabulation set 008A +line up, partial 008C +LINE WITH MIDDLE DOT, VERTICAL 237F +Linear B Ideograms 10080 +Linear B Syllabary 10000 +Lines For Terminal Graphics, Scan 23BA +Lira, Italian 00A3 +LIRA SIGN 20A4 +liter 2113 +Livonian, Additions for 022A +LOCATION SIGN, TELEPHONE 2706 +lock, caps 21EA +lock, caps 21EC +lock, group 21F0 +lock, level 2 21EB +lock, level 3 21EF +lock, numerics 21ED +Logic Operators, Modal 27E0 +LOGICAL AND 2227 +LOGICAL AND, CURLY 22CF +LOGICAL AND, INTERSECTION WITH 2A44 +LOGICAL AND, N-ARY 22C0 +LOGICAL AND OPERATOR, TWO 2A07 +Logical Ands and Ors 2A51 +LOGICAL OR 2228 +LOGICAL OR, CURLY 22CE +LOGICAL OR, N-ARY 22C1 +LOGICAL OR, UNION WITH 2A45 +LOGICAL OR OPERATOR, TWO 2A08 +long 0304 +Long Arrows 27F5 +long cross 2020 +long dash 2015 +LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL 2AE6 +LONG HORIZONTAL STROKE, CONTAINS WITH 22FA +LONG HORIZONTAL STROKE, ELEMENT OF WITH 22F2 +LONG LEFT TACK 27DE +LONG RIGHT LEG, LATIN CAPITAL LETTER N WITH 0220 +LONG RIGHT TACK 27DD +LONG S, LATIN SMALL LETTER 017F +long slash overlay 0338 +LONG SOLIDUS OVERLAY, COMBINING 0338 +LONG STROKE OVERLAY, COMBINING 0336 +LONG VERTICAL LINE OVERLAY, COMBINING 20D2 +LORRAINE, CROSS OF 2628 +LOW ACUTE ACCENT, MODIFIER LETTER 02CF +LOW ASTERISK 204E +low double comma quotation mark 201E +LOW DOUBLE PRIME QUOTATION MARK 301F +LOW GRAVE ACCENT, MODIFIER LETTER 02CE +LOW LINE 005F +LOW LINE, CENTRELINE FE4E +LOW LINE, COMBINING 0332 +LOW LINE, COMBINING DOUBLE 0333 +LOW LINE, DASHED FE4D +LOW LINE, DOUBLE 2017 +LOW LINE, WAVY FE4F +LOW MACRON, MODIFIER LETTER 02CD +low single comma quotation mark 201A +Low Surrogates DC00 +LOW VERTICAL LINE, MODIFIER LETTER 02CC +LOW-9 QUOTATION MARK, DOUBLE 201E +LOW-9 QUOTATION MARK, SINGLE 201A +lower rank than 227A +LOZENGE 25CA +LOZENGE, BLACK 29EB +LOZENGE, SQUARE 2311 +LOZENGE DIVIDED BY HORIZONTAL RULE 27E0 +lre 202A +lrm 200E +lro 202D +M, COMBINING LATIN SMALL LETTER 036B +M, LATIN CAPITAL LETTER TURNED 019C +M, LATIN SMALL LETTER TURNED 026F +M, SCRIPT CAPITAL 2133 +m-matrix 2133 +MACRON 00AF +MACRON, COMBINING 0304 +MACRON, MODIFIER LETTER 02C9 +MACRON, MODIFIER LETTER LOW 02CD +macron, spacing 00AF +MACRON BELOW, COMBINING 0331 +Malayalam 0D00 +Malayalam Digits 0D66 +Malayalam Letters 0D05 +MALE SIGN 2642 +MALTESE CROSS 2720 +Manchu Letters, Mongolian 1873 +Map Markers 2690 +mapping, bijective 2916 +maps from 27FB +maps from 2906 +maps to 27FC +maps to 2905 +maps to 2907 +mark, german 2133 +marker, histogram 25AE +Markers, Go 2686 +Markers, Map 2690 +mars 2642 +MASCULINE ORDINAL INDICATOR 00BA +MASU MARK 303C +MATERIALS, RECYCLING SYMBOL FOR GENERIC 267A +Mathematical Brackets 27E6 +Mathematical Operators 2200 +Mathematical Operators, Supplemental 2A00 +MATHEMATICAL SPACE, MEDIUM 205F +Mathematical Symbols, Double-Struck Italic 2145 +Mathematical Symbols-A, Miscellaneous 27C0 +Mathematical Symbols-B, Miscellaneous 2980 +MATRIX, HERMITIAN CONJUGATE 22B9 +MEASURED ANGLE 2221 +Measured Angles, Angles and 299B +MEASURED BY 225E +Medieval Superscript Letter Diacritics 0363 +medium, end of 0019 +MEDIUM, SYMBOL FOR END OF 2419 +MEDIUM MATHEMATICAL SPACE 205F +MEDIUM SMALL SQUARE, BLACK 25FE +MEDIUM SMALL SQUARE, WHITE 25FD +MEDIUM SQUARE, BLACK 25FC +MEDIUM SQUARE, WHITE 25FB +MEMBER, CONTAINS AS 220B +MEMBER, SMALL CONTAINS AS 220D +MEMBER OF DOUBLE VERTICAL, LONG DASH FROM LEFT 2AE6 +MEMBERSHIP, Z NOTATION BAG 22FF +MERCURY 263F +merge 2A07 +message, privacy 009E +message waiting 0095 +mho 2127 +MICRO SIGN 00B5 +mid space 2005 +MIDDLE DOT 00B7 +middle dot, greek 00B7 +MIDDLE DOT, KATAKANA 30FB +MIDDLE DOT, LATIN SMALL LETTER L WITH 0140 +MIDDLE DOT, VERTICAL LINE WITH 237F +MIDDLE TILDE, LATIN CAPITAL LETTER O WITH 019F +MIDDLE TILDE, LATIN SMALL LETTER L WITH 026B +MIDLINE HORIZONTAL ELLIPSIS 22EF +midpoint 00B7 +MILL SIGN 20A5 +MILLE SIGN, PER 2030 +milreis 0024 +minim 264F +minim (alternate glyph) 264D +Minnan and Hakka, Chinese Bopomofo Extended for 31A0 +MINUS, CIRCLED 2296 +MINUS, DOT 2238 +MINUS, SET 2216 +MINUS, SQUARED 229F +MINUS, SUBSCRIPT 208B +MINUS, SUPERSCRIPT 207B +MINUS SIGN 2212 +MINUS SIGN, COMMERCIAL 2052 +minus sign, hyphen or 002D +MINUS SIGN, MODIFIER LETTER 02D7 +MINUS SIGN, UNION WITH 2A41 +MINUS SIGN BELOW, COMBINING 0320 +MINUS SIGN IN TRIANGLE 2A3A +Minus Sign Operators, Plus and 2A22 +MINUS SIMILAR, SIMILAR 2A6C +MINUS TILDE 2242 +MINUS-OR-PLUS SIGN 2213 +minutes 2032 +MINY 29FF +Miscellaneous Mathematical Symbols-A 27C0 +Miscellaneous Mathematical Symbols-B 2980 +Miscellaneous Symbols 2600 +Miscellaneous Symbols and Arrows 2B00 +Miscellaneous Technical 2300 +MISRA, ARABIC SIGN 060F +mmsp 205F +Modal Logic Operators 27E0 +MODELS 22A7 +Modifier Letters, Spacing 02B0 +MODULO TWO SUM 2A0A +Mongolian 1800 +MONGOLIAN COLON 1804 +MONGOLIAN COMMA 1802 +mongolian currency 20AE +Mongolian Digits 1810 +Mongolian Extensions for Sanskrit and Tibetan 1880 +Mongolian Format Controls 180B +MONGOLIAN FULL STOP 1803 +Mongolian Manchu Letters 1873 +Mongolian Sibe Letters 185D +Mongolian Todo Letters 1843 +Monogram and Digram Symbols, Yijing 268C +Monogram Symbol, Tai Xuan Jing 1D300 +MONOSTABLE SYMBOL 238D +MONTH SIGN, TAMIL 0BF4 +Months, Enclosed CJK Letters and 3200 +Months, Telegraph Symbols for 32C0 +MOON, FIRST QUARTER 263D +MOON, LAST QUARTER 263E +most positive 223E +MUCH GREATER-THAN 226B +MUCH GREATER-THAN, VERY 22D9 +MUCH LESS-THAN 226A +MUCH LESS-THAN, VERY 22D8 +MULTIMAP 22B8 +MULTIMAP, DOUBLE-ENDED 29DF +MULTIMAP, LEFT 27DC +MULTIPLICATION, MULTISET 228D +Multiplication and Division Sign Operators 2A2F +MULTIPLICATION SIGN 00D7 +MULTIPLICATION SIGN BELOW, SUBSET WITH 2AC1 +MULTIPLICATION SIGN BELOW, SUPERSET WITH 2AC2 +MULTIPLICATION X 2715 +MULTIPLICATION X, HEAVY 2716 +MULTISET 228C +MULTISET MULTIPLICATION 228D +MULTISET UNION 228E +MUSIC FLAT SIGN 266D +MUSIC NATURAL SIGN 266E +MUSIC SHARP SIGN 266F +Musical Symbols 2669 +mutton 2003 +mutton quad 2001 +mvs 180E +Myanmar 1000 +Myanmar Digits 1040 +N, DOUBLE-STRUCK CAPITAL 2115 +N, LATIN LETTER SMALL CAPITAL 0274 +N WITH LONG RIGHT LEG, LATIN CAPITAL LETTER 0220 +N-ARY COPRODUCT 2210 +n-ary dijkstra choice 2AFF +N-ARY INTERSECTION 22C2 +N-ARY LOGICAL AND 22C0 +N-ARY LOGICAL OR 22C1 +N-ary Operators 2A00 +N-ARY PRODUCT 220F +N-ARY SUMMATION 2211 +N-ARY SUMMATION, DOUBLE-STRUCK 2140 +N-ARY UNION 22C3 +N-ARY WHITE VERTICAL BAR 2AFF +NABLA 2207 +NAIRA SIGN 20A6 +NAND 22BC +nang 0323 +NARROW NO-BREAK SPACE 202F +nasal hook 0328 +NATIONAL DIGIT SHAPES 206E +natural number 2115 +NATURAL SIGN, MUSIC 266E +nbsp 0080 +necessarily satisfies 2AF1 +NEGATED WITH VERTICAL BAR, INFINITY 29DE +negation 20D3 +NEGATION SLASH, DOES NOT DIVIDE WITH REVERSED 2AEE +negative acknowledge 0015 +negative acknowledge, graphic for 237B +NEGATIVE ACKNOWLEDGE, SYMBOL FOR 2415 +NEPTUNE 2646 +never (modal operator) 27E1 +never (modal operator), was 27E2 +never be (modal operator), will 27E3 +new line 21B5 +NEW SHEQEL SIGN 20AA +NEWLINE, SYMBOL FOR 2424 +next line 0085 +NEXT PAGE 2398 +NIB, BLACK 2712 +nigerian currency 20A6 +nim-addition 2A27 +nnbsp 202F +no break here 0083 +no break space, graphic for 237D +NO-BREAK SPACE 00A0 +NO-BREAK SPACE, NARROW 202F +NO-BREAK SPACE, ZERO WIDTH FEFF +NODE, ASCENDING 260A +NODE, DESCENDING 260B +NOMINAL DIGIT SHAPES 206F +NON-BREAKING HYPHEN 2011 +non-breaking space 00A0 +NON-JOINER, ZERO WIDTH 200C +non-theorem 22A3 +Noncharacters FDD0 +Noncharacters FFFE +Noncharacters 1FFFE +Noncharacters 2FFFE +Noncharacters 3FFFE +Noncharacters 4FFFE +Noncharacters 5FFFE +Noncharacters 6FFFE +Noncharacters 7FFFE +Noncharacters 8FFFE +Noncharacters 9FFFE +Noncharacters AFFFE +Noncharacters BFFFE +Noncharacters CFFFE +Noncharacters DFFFE +Noncharacters EFFFE +Noncharacters FFFFE +Noncharacters 10FFFE +NONFORKING 2ADD +NOR 22BD +NORMAL SUBGROUP, CONTAINS AS 22B3 +NORMAL SUBGROUP OF 22B2 +not 223C +Not a Character FFFE +Not a Character FFFF +NOT ALMOST EQUAL TO, PRECEDES ABOVE 2AB9 +NOT ALMOST EQUAL TO, SUCCEEDS ABOVE 2ABA +NOT AN ELEMENT OF 2209 +NOT APPROXIMATE, GREATER-THAN AND 2A8A +NOT APPROXIMATE, LESS-THAN AND 2A89 +NOT CHECK MARK 237B +NOT DIVIDE WITH REVERSED NEGATION SLASH, DOES 2AEE +NOT EQUAL TO 2260 +NOT EQUAL TO, GREATER-THAN AND SINGLE-LINE 2A88 +NOT EQUAL TO, LESS-THAN AND SINGLE-LINE 2A87 +NOT EQUAL TO, PRECEDES ABOVE 2AB5 +NOT EQUAL TO, PRECEDES ABOVE SINGLE-LINE 2AB1 +NOT EQUAL TO, SUBSET OF ABOVE 2ACB +NOT EQUAL TO, SUCCEEDS ABOVE 2AB6 +NOT EQUAL TO, SUCCEEDS ABOVE SINGLE-LINE 2AB2 +NOT EQUAL TO, SUPERSET OF ABOVE 2ACC +not independent 2ADC +NOT SIGN 00AC +NOT SIGN, DOUBLE STROKE 2AEC +NOT SIGN, REVERSED 2310 +NOT SIGN, REVERSED DOUBLE STROKE 2AED +NOT SIGN, TURNED 2319 +NOT TILDE ABOVE, COMBINING 034A +not yield, does 22A3 +NOTE, EIGHTH 266A +NOTE, QUARTER 2669 +NOTES, BEAMED EIGHTH 266B +NOTES, BEAMED SIXTEENTH 266C +null 0000 +NULL, SYMBOL FOR 2400 +null set 2205 +number, natural 2115 +Number Forms 2150 +Number Runes, Golden 16EE +NUMBER SIGN 0023 +NUBMER SIGN, ARABIC 0600 +NUMBER SIGN, TAMIl 0BFA +number symbol, real 210A +NUMBER ZERO, IDEOGRAPHIC 3007 +Numbers, Aegean 10100 +Numbers, Circled 2460 +Numbers, Circled 3251 +Numbers, Circled 32B1 +Numbers, Circled Inverse 2776 +Numbers, Double Circled 24F5 +Numbers, Parenthesized 2474 +numbers, the set of complex 2102 +numbers, the set of rational 211A +numbers, the set of real 211D +Numbers, White On Black Circled 24EB +Numbers Period 2488 +Numerals, Hangzhou-style 3021 +Numerals, Old Italic 10320 +Numerals, Roman 2160 +NUMERATOR ONE, FRACTION 215F +numerics lock 21ED +NUMERO SIGN 2116 +nut 2002 +O, COMBINING LATIN SMALL LETTER 0366 +o, latin capital letter barred 019F +O, LATIN CAPITAL LETTER OPEN 0186 +O, LATIN SMALL LETTER BARRED 0275 +O, LATIN SMALL LETTER OPEN 0254 +O, SCRIPT SMALL 2134 +o bar 019F +o bar 0275 +o e, latin small letter 0153 +O WITH MIDDLE TILDE, LATIN CAPITAL LETTER 019F +obelisk 2020 +obelisk, double 2021 +OBJECT REPLACEMENT CHARACTER FFFC +OCR, Optical Character Recognition 2440 +octothorpe 0023 +OE, LATIN LETTER SMALL CAPITAL 0276 +OE, LATIN SMALL LIGATURE 0153 +Ogham 1680 +OGHAM SPACE MARK 1680 +OGONEK 02DB +OGONEK, COMBINING 0328 +OHM SIGN 2126 +OHM SIGN, INVERTED 2127 +OI, LATIN SMALL LETTER 01A3 +OM, DEVANAGARI 0950 +OMEGA, LATIN SMALL LETTER CLOSED 0277 +ONE, FRACTION NUMERATOR 215F +ONE, SUPERSCRIPT 00B9 +ONE DOT LEADER 2024 +ONE HALF, VULGAR FRACTION 00BD +ONE QUARTER, VULGAR FRACTION 00BC +OPEN BOX 2423 +OPEN BOX, SHOULDERED 237D +OPEN E, LATIN CAPITAL LETTER 0190 +OPEN E, LATIN SMALL LETTER 025B +OPEN E, LATIN SMALL LETTER CLOSED 029A +OPEN E, LATIN SMALL LETTER CLOSED REVERSED 025E +OPEN E, LATIN SMALL LETTER REVERSED 025C +OPEN O, LATIN CAPITAL LETTER 0186 +OPEN O, LATIN SMALL LETTER 0254 +opening brace 007B +opening curly bracket 007B +opening parenthesis 0028 +opening square bracket 005B +operating system command 009D +OPERATOR, ASTERISK 2217 +OPERATOR, BULLET 2219 +OPERATOR, CIRCLED ASTERISK 229B +OPERATOR, CIRCLED DOT 2299 +OPERATOR, CIRCLED RING 229A +OPERATOR, DIAMOND 22C4 +OPERATOR, DOT 22C5 +OPERATOR, RING 2218 +OPERATOR, SQUARED DOT 22A1 +OPERATOR, STAR 22C6 +OPERATOR, TILDE 223C +Operators, Database Theory 27D5 +Operators, Invisible 2063 +Operators, Mathematical 2200 +Operators, Modal Logic 27E0 +Operators, Multiplication and Division Sign 2A2F +Operators, N-Ary 2A00 +Operators, Plus and Minus Sign 2A22 +Operators, Relational 2A66 +Operators, Specialized plus sign 29FA +Operators, Supplemental Mathematical 2A00 +Operators, Vertical Line 2AEE +OPPOSITION 260D +Optical Character Recognition (OCR) 2440 +OPTION KEY 2325 +OR, CURLY LOGICAL 22CE +OR, DOUBLE LOGICAL 2A54 +OR, LOGICAL 2228 +OR, N-ARY LOGICAL 22C1 +OR, SLOPING LARGE 2A57 +OR, TWO INTERSECTING LOGICAL 2A56 +OR, UNION WITH LOGICAL 2A45 +OR OPERATOR, TWO LOGICAL 2A08 +OR WITH DOT ABOVE, LOGICAL 2A52 +OR WITH DOUBLE OVERBAR, LOGICAL 2A62 +OR WITH DOUBLE UNDERBAR, LOGICAL 2A63 +OR WITH HORIZONTAL DASH, LOGICAL 2A5D +OR WITH MIDDLE STEM, LOGICAL 2A5B +order 2134 +ORDINAL INDICATOR, FEMININE 00AA +ORDINAL INDICATOR, MASCULINE 00BA +ordinarily satisfies 2AE2 +ORIGIN, DIMENSION 2331 +ORIGINAL OF 22B6 +ORIGINAL OF, SQUARE 2290 +Oriya 0B00 +Oriya Digits 0B66 +Oriya Letters 0B05 +Ornamental Angle Quotation Marks 276E +Ornamental Brackets 2768 +Ornamental Brackets 2770 +Ornaments, Heart 2763 +Ornaments, Punctuation 275B +ORNATE LEFT PARENTHESIS FD3E +ors, logical ands and 2A51 +ORTHODOX CROSS 2626 +orthogonal to 22A5 +Osmanya 10480 +Osmanya Digits 104A0 +OU, LATIN SMALL LETTER 0223 +OUNCE SIGN 2125 +OUTER JOIN, FULL 27D7 +OUTER JOIN, LEFT 27D5 +OUTER JOIN, RIGHT 27D6 +OUTLINE, SQUARE WITH CONTOURED 29E0 +OVER INFINITY, TIE 29DD +OVER TOP SQUARE BRACKET, BOTTOM SQUARE BRACKET 23B6 +overbar, apl 00AF +OVERLAPPING LESS-THAN, GREATER-THAN 2AA4 +OVERLAPPING LOGICAL AND, LOGICAL OR 2A59 +OVERLAY, COMBINING CLOCKWISE RING 20D9 +OVERLAY, COMBINING DOUBLE VERTICAL STROKE 20E6 +OVERLAY, COMBINING LEFTWARDS ARROW 20EA +OVERLAY, COMBINING LONG SOLIDUS 0338 +OVERLAY, COMBINING LONG STROKE 0336 +OVERLAY, COMBINING LONG VERTICAL LINE 20D2 +OVERLAY, COMBINING REVERSE SOLIDUS 20E5 +OVERLAY, COMBINING RING 20D8 +OVERLAY, COMBINING SHORT SOLIDUS 0337 +OVERLAY, COMBINING SHORT STROKE 0335 +OVERLAY, COMBINING SHORT VERTICAL LINE 20D3 +OVERLAY, COMBINING TILDE 0334 +overlay, long slash 0338 +overlay, short slash 0337 +overline 00AF +OVERLINE 203E +OVERLINE, CENTRELINE FE4A +OVERLINE, COMBINING 0305 +OVERLINE, COMBINING DOUBLE 033F +OVERLINE, DASHED FE49 +OVERLINE, DOUBLE WAVY FE4C +OVERLINE, WAVY FE4B +OVERRIDE, LEFT-TO-RIGHT 202D +OVERRIDE, RIGHT-TO-LEFT 202E +overscore 0305 +overscore, spacing 203E +Overscores and Underscores FE49 +Overstruck Diacritics 0334 +oxia 0301 +P, DOUBLE-STRUCK CAPITAL 2119 +P, SCRIPT CAPITAL 2118 +PAGE, NEXT 2398 +PAGE, PREVIOUS 2397 +page down 21DF +page up 21DE +PALATALIZED HOOK BELOW, COMBINING 0321 +PAMUDPOD, HANUNOO SIGN 1734 +PAPER SYMBOL, PARTIALLY-RECYCLED 267D +PAPER SYMBOL, RECYCLED 267C +PARAGRAPH SEPARATOR 2029 +PARAGRAPH SEPARATOR, GEORGIAN 10FB +paragraph separator, urdu 203B +paragraph sign 00B6 +paragraph sign, european 00A7 +PARAGRAPH SIGN ORNAMENT, CURVED STEM 2761 +PARALLEL, CIRCLED 29B7 +PARALLEL, EQUALS SIGN AND SLANTED 29E3 +PARALLEL, IDENTICAL TO AND SLANTED 29E5 +PARALLEL TO 2225 +parallel to, identical and 2A68 +PARALLEL WITH HORIZONTAL STROKE 2AF2 +PARALLEL WITH TILDE ABOVE, EQUALS SIGN AND SLANTED 29E4 +PARALLEL WITH TILDE OPERATOR 2AF3 +PARALLELOGRAM, BLACK 25B0 +parenthesis, closing 0029 +PARENTHESIS, LEFT 0028 +parenthesis, opening 0028 +PARENTHESIS, ORNATE LEFT FD3E +PARENTHESIS, RIGHT 0029 +PARENTHESIS, SUBSCRIPT LEFT 208D +PARENTHESIS, SUPERSCRIPT LEFT 207D +Parenthesized Ideographs 3220 +Parenthesized Korean Hangul Elements 3200 +Parenthesized Korean Hangul Syllables 320E +Parenthesized Latin Letters 249C +Parenthesized Numbers 2474 +PART ALTERNATION MARK 303D +PART INTEGRAL, FINITE 2A0D +parted rule 00A6 +PARTIAL DIFFERENTIAL 2202 +partial function, z notation 21F8 +partial injection, z notation 2914 +partial line down 008B +partial line up 008C +partial relation, z notation 21F9 +partial surjection, z notation 2900 +PARTIALLY-RECYCLED PAPER SYMBOL 267D +PARTNERSHIP SIGN 3250 +Parts, Summation Sign 23B2 +pdf 202C +PEACE SYMBOL 262E +PENCIL, UPPER RIGHT 2710 +Pencil Dingbats 270E +PENNY SIGN, GERMAN 20B0 +per 2118 +PER MILLE SIGN 2030 +PER TEN THOUSAND SIGN 2031 +PERCENT SIGN 0025 +PERCENT SIGN, ARABIC 066A +PERCUSSIVE, LATIN LETTER BIDENTAL 02AD +PERCUSSIVE, LATIN LETTER BILABIAL 02AC +period 002E +PERISPOMENI, COMBINING GREEK 0342 +perpendicular 22A5 +PERPENDICULAR, CIRCLED 29B9 +PERPENDICULAR WITH S 2AE1 +Persian and Urdu, Eastern Arabic-Indic Digits for 06F0 +PERSPECTIVE 2306 +PESETA SIGN 20A7 +PESO SIGN 20B1 +PHARYNGEAL VOICED FRICATIVE, LATIN LETTER 0295 +PHI, LATIN SMALL LETTER 0278 +Philippine Scripts, Generic Punctuation For 1735 +Phonetic Alphabet, International 0250 +Phonetic Extensions 1D00 +Phonetic Extensions, Katakana 31F0 +Phonetic Extensions, non-IPA 1D00 +Phonetic Extensions for Ainu 31F0 +Phonetic Modifiers Derived from Latin Letters 02B0 +Phonetics and Symbols Area, CJK 2E00 +phonorecord sign 2117 +PI, DOUBLE-STRUCK CAPITAL 213F +pi, mathematical constant 03C0 +Pictures for Control Codes, Graphic 2400 +Pieces, Bracket 239B +Pieces, Bracket 23B0 +PILCROW SIGN 00B6 +PILCROW SIGN, REVERSED 204B +Pinyin Diacritic-vowel Combinations 01CD +pipe 01C0 +pipe, double 01C1 +pipe, double-barred 01C2 +PIPING, Z NOTATION SCHEMA 2A20 +PISCES 2653 +PITCHFORK 22D4 +PITCHFORK WITH TEE TOP 2ADA +PLACE OF INTEREST SIGN 2318 +plaintiff 226C +PLANCK CONSTANT 210E +PLANCK CONSTANT OVER TWO PI 210F +Planet Symbols 263F +Playing Card Suits 2660 +PLUS, CIRCLED 2295 +PLUS, DOT 2214 +PLUS, DOUBLE 29FA +PLUS, N-ARY UNION OPERATOR WITH 2A04 +PLUS, SQUARED 229E +PLUS, TRIPLE 29FB +Plus and Minus Sign Operators 2A22 +PLUS OPERATOR, N-ARY CIRCLED 2A01 +PLUS SIGN 002B +PLUS SIGN, EQUALS SIGN ABOVE 2A71 +PLUS SIGN, MODIFIER LETTER 02D6 +PLUS SIGN, SUBSCRIPT 208A +PLUS SIGN, SUPERSCRIPT 207A +PLUS SIGN ABOVE EQUALS SIGN 2A72 +PLUS SIGN BELOW, COMBINING 031F +PLUS SIGN BELOW, SUBSET WITH 2ABF +PLUS SIGN BELOW, SUPERSET WITH 2AC0 +PLUS SIGN IN LEFT HALF CIRCLE 2A2D +PLUS SIGN IN RIGHT HALF CIRCLE 2A2E +PLUS SIGN IN TRIANGLE 2A39 +Plus Sign Operators, Specialized 29FA +PLUS-MINUS SIGN 00B1 +PLUTO 2647 +POETIC VERSE SIGN, ARABIC 060E +POINT OPERATOR, INTEGRAL AROUND A 2A15 +Pointers 25BA +Points, Arabic 064B +Points, Hebrew 05B0 +poison 2620 +Political Symbols, Religious and 2626 +POP DIRECTIONAL FORMATTING 202C +POSITION INDICATOR 2316 +positive, most 223E +positive difference, sum or 2A26 +positive difference or sum 2A24 +POSTAL MARK 3012 +POSTAL MARK, CIRCLED 3036 +POSTAL MARK FACE 3020 +pound sign 0023 +POUND SIGN 00A3 +pound sterling 00A3 +pounds 2114 +power set 2118 +PRECEDES 227A +PRECEDES, DOUBLE 2ABB +PRECEDES ABOVE ALMOST EQUAL TO 2AB7 +PRECEDES ABOVE EQUALS SIGN 2AB3 +PRECEDES ABOVE NOT ALMOST EQUAL TO 2AB9 +PRECEDES ABOVE NOT EQUAL TO 2AB5 +PRECEDES ABOVE SINGLE-LINE EQUALS SIGN 2AAF +PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO 2AB1 +PRECEDES UNDER RELATION 22B0 +PRESCRIPTION TAKE 211E +Presentation Forms, Alphabetic FB00 +Presentation Forms, Hebrew FB1D +Presentation Forms-A, Arabic FB50 +Presentation Forms-B, Arabic FE70 +PREVIOUS PAGE 2397 +PRIME 2032 +PRIME, DOUBLE 2033 +PRIME, MODIFIER LETTER 02B9 +PRIME, MODIFIER LETTER DOUBLE 02BA +PRIME, QUADRUPLE 2057 +PRIME, REVERSED 2035 +PRIME, REVERSED DOUBLE 2036 +PRIME, REVERSED TRIPLE 2037 +PRIME, TRIPLE 2034 +PRIME QUOTATION MARK, DOUBLE 301E +PRIME QUOTATION MARK, LOW DOUBLE 301F +PRIME QUOTATION MARK, REVERSED DOUBLE 301D +PRINT SCREEN SYMBOL 2399 +privacy message 009E +Private Use Area E000 +Private Use Area-A, Supplementary F0000 +Private Use Area-B, Supplementary 100000 +private use one 0091 +private use two 0092 +PRODUCT, CLOSED UNION WITH SERIFS AND SMASH 2A50 +product, direct 2299 +PRODUCT, INTERIOR 2A3C +PRODUCT, LEFT SEMIDIRECT 22CB +PRODUCT, N-ARY 220F +PRODUCT, RIGHTHAND INTERIOR 2A3D +PRODUCT, SHUFFLE 29E2 +PRODUCT, SMASH 2A33 +product, tensor 2297 +PRODUCT, VECTOR OR CROSS 2A2F +PRODUCT, WREATH 2240 +PRODUCT WITH BOTTOM CLOSED, SEMIDIRECT 2A32 +PROFILE, ALL AROUND- 232E +prohibition 20E0 +PROJECTION, Z NOTATION SCHEMA 2A21 +PROJECTIVE 2305 +PROOF, END OF 220E +PROPERTY LINE 214A +PROPORTION 2237 +PROPORTION, GEOMETRIC 223A +PROPORTIONAL TO 221D +proportional to, varies with 223C +proves 22A2 +psili 0313 +published 2117 +pullback 27D3 +Punctuation, CJK Symbols and 3000 +Punctuation, General 2000 +Punctuation, Hanunóo-Specific 1734 +Punctuation, Katakana 30A0 +PUNCTUATION, PHILIPPINE DOUBLE 1736 +PUNCTUATION, PHILIPPINE SINGLE 1735 +Punctuation For Philippine Scripts, Generic 1735 +Punctuation For Vertical Text, Double 2047 +Punctuation Ornaments 275B +PUNCTUATION SPACE 2008 +punt, irish 00A3 +purna viram 0964 +pushout 27D4 +Q, DOUBLE-STRUCK CAPITAL 211A +Q, ROTATED CAPITAL 213A +QAF, ARABIC LETTER DOTLESS 066F +qed 220E +QUAD, EM 2001 +QUAD, EN 2000 +quad, mutton 2001 +Quadrants 2596 +quadrature 25A1 +QUADRUPLE INTEGRAL OPERATOR 2A0C +QUADRUPLE PRIME 2057 +quantic 226C +QUARTER MOON, FIRST 263D +QUARTER MOON, LAST 263E +QUARTER NOTE 2669 +Quarters, Fractions 00BC +QUATERNION INTEGRAL OPERATOR 2A16 +QUESTION EXCLAMATION MARK 2048 +QUESTION MARK 003F +QUESTION MARK, ARABIC 061F +QUESTION MARK, ARMENIAN 055E +QUESTION MARK, DOUBLE 2047 +QUESTION MARK, ETHIOPIC 1367 +QUESTION MARK, EXCLAMATION 2049 +QUESTION MARK, GREEK 037E +QUESTION MARK, INVERTED 00BF +QUESTION MARK ABOVE, GREATER-THAN WITH 2A7C +QUESTION MARK ABOVE, LESS-THAN WITH 2A7B +QUESTIONED EQUAL TO 225F +QUILL, LEFT SQUARE BRACKET WITH 2045 +Quine Corners 231C +quotation dash 2015 +QUOTATION MARK 0022 +quotation mark, double comma 201D +QUOTATION MARK, DOUBLE HIGH-REVERSED-9 201F +QUOTATION MARK, DOUBLE LOW-9 201E +QUOTATION MARK, DOUBLE PRIME 301E +quotation mark, double reversed comma 201F +quotation mark, double turned comma 201C +QUOTATION MARK, LEFT DOUBLE 201C +QUOTATION MARK, LEFT SINGLE 2018 +QUOTATION MARK, LEFT-POINTING DOUBLE ANGLE 00AB +quotation mark, low double comma 201E +QUOTATION MARK, LOW DOUBLE PRIME 301F +quotation mark, low single comma 201A +QUOTATION MARK, REVERSED DOUBLE PRIME 301D +QUOTATION MARK, RIGHT DOUBLE 201D +QUOTATION MARK, RIGHT SINGLE 2019 +QUOTATION MARK, RIGHT-POINTING DOUBLE ANGLE 00BB +quotation mark, single comma 2019 +QUOTATION MARK, SINGLE HIGH-REVERSED-9 201B +QUOTATION MARK, SINGLE LEFT-POINTING ANGLE 2039 +QUOTATION MARK, SINGLE LOW-9 201A +quotation mark, single reversed comma 201B +QUOTATION MARK, SINGLE RIGHT-POINTING ANGLE 203A +quotation mark, single turned comma 2018 +Quotation Mark Ornaments 275B +Quotation Marks, Ornamental Angle 276E +quote, apl 0022 +R, BLACK-LETTER CAPITAL 211C +R, COMBINING LATIN SMALL LETTER 036C +R, DOUBLE-STRUCK CAPITAL 211D +R, LATIN LETTER SMALL CAPITAL 0280 +R, LATIN LETTER SMALL CAPITAL INVERTED 0281 +R, LATIN SMALL LETTER TURNED 0279 +R, MODIFIER LETTER SMALL 02B3 +R, MODIFIER LETTER SMALL CAPITAL INVERTED 02B6 +R, MODIFIER LETTER SMALL TURNED 02B4 +R, SCRIPT CAPITAL 211B +radial component 27DF +radical sign 221A +Radicals, Kangxi 2F00 +Radicals, Yi A490 +Radicals Supplement, CJK 2E80 +RADIOACTIVE SIGN 2622 +RAIN DROPS, UMBRELLA WITH 2614 +rainy weather 2602 +RAMS HORN, LATIN SMALL LETTER 0264 +RANGE ANTIRESTRICTION, Z NOTATION 2A65 +RATIO 2236 +ratio, cross 211E +rational numbers, the set of 211A +real number symbol 210A +real numbers, the set of 211D +real part 211C +recipe 211E +record separator 001E +RECORD SEPARATOR, SYMBOL FOR 241E +RECORDER, TELEPHONE 2315 +RECORDING COPYRIGHT, SOUND 2117 +Rectangles 25AC +RECTANGULAR PATH AROUND POLE, LINE INTEGRATION WITH 2A12 +RECYCLED PAPER SYMBOL 267C +RECYCLING SYMBOL, BLACK UNIVERSAL 267B +RECYCLING SYMBOL, UNIVERSAL 2672 +RECYCLING SYMBOL FOR GENERIC MATERIALS 267A +Recycling Symbols 2672 +Recycling Symbols For Plastics 2673 +reduces to 22A6 +reducible 22A2 +REFERENCE MARK 203B +registered trade mark sign 00AE +RELATION, TRIPLE SOLIDUS BINARY 2AFB +RELATION, TRIPLE VERTICAL BAR BINARY 2AF4 +relation, z notation finite 21FC +relation, z notation partial 21F9 +RELATIONAL COMPOSITION, Z NOTATION 2A3E +Relational Operators 2A66 +Relations 29E3 +Relations 2AF7 +Relations, Subset and superset 2ABD +Religious and Political Symbols 2626 +Repeat Marks, Kana 3031 +REPLACEMENT CHARACTER FFFD +REPLACEMENT CHARACTER, OBJECT FFFC +resistance 2126 +RESPONSE 211F +results in 22A8 +RETROFLEX CLICK, LATIN LETTER 01C3 +retroflex hook, latin small letter d 0256 +RETROFLEX HOOK BELOW, COMBINING 0322 +return, carriage 000D +return, carriage 21B5 +RETURN, SYMBOL FOR CARRIAGE 240D +RETURN SYMBOL 23CE +reverse line feed 008D +REVERSE SOLIDUS 005C +REVERSE SOLIDUS, BIG 29F9 +REVERSE SOLIDUS, CIRCLED 29B8 +REVERSE SOLIDUS OPERATOR 29F5 +REVERSE SOLIDUS OVERLAY, COMBINING 20E5 +REVERSE SOLIDUS WITH HORIZONTAL STROKE 29F7 +reverse turnstile 22A3 +REVERSED, LATIN SMALL LETTER EZH 01B9 +REVERSED COMMA, MODIFIER LETTER 02BD +REVERSED COMMA ABOVE, COMBINING 0314 +reversed comma quotation mark, double 201F +reversed comma quotation mark, single 201B +REVERSED DOUBLE PRIME 2036 +REVERSED DOUBLE PRIME QUOTATION MARK 301D +REVERSED DOUBLE STROKE NOT SIGN 2AED +REVERSED E, LATIN CAPITAL LETTER 018E +REVERSED E, LATIN SMALL LETTER 0258 +reversed epsilon, latin small letter closed 025E +REVERSED ESH, LATIN SMALL LETTER SQUAT 0285 +REVERSED ESH LOOP, LATIN LETTER 01AA +reversed glottal stop, latin letter 0295 +REVERSED GLOTTAL STOP, MODIFIER LETTER 02C1 +REVERSED GLOTTAL STOP, MODIFIER LETTER SMALL 02E4 +REVERSED NEGATION SLASH, DOES NOT DIVIDE WITH 2AEE +REVERSED NOT SIGN 2310 +REVERSED OPEN E, LATIN SMALL LETTER 025C +REVERSED OPEN E, LATIN SMALL LETTER CLOSED 025E +REVERSED PILCROW SIGN 204B +REVERSED PRIME 2035 +REVERSED SANS-SERIF CAPITAL L 2143 +REVERSED SEMICOLON 204F +reversed straight epsilon 220D +REVERSED TILDE 223D +REVERSED TILDE EQUALS 22CD +REVERSED TRIPLE PRIME 2037 +RHOTIC HOOK, MODIFIER LETTER 02DE +riemann integral 211B +RIGHT ANGLE 221F +RIGHT ANGLE WITH ARC 22BE +RIGHT TRIANGLE 22BF +RIGHT-TO-LEFT EMBEDDING 202B +RIGHT-TO-LEFT MARK 200F +RIGHT-TO-LEFT OVERRIDE 202E +RIGHTHAND INTERIOR PRODUCT 2A3D +RING, BENZENE 232C +RING, MODIFIER LETTER CENTRED LEFT HALF 02D3 +RING, MODIFIER LETTER LEFT HALF 02BF +RING ABOVE 02DA +RING ABOVE, COMBINING 030A +RING BELOW, COMBINING 0325 +RING BELOW, COMBINING LEFT HALF 031C +RING BELOW, COMBINING RIGHT HALF 0339 +RING EQUAL TO 2257 +RING IN EQUAL TO 2256 +RING OPERATOR 2218 +RING OPERATOR, CIRCLED 229A +RING OVERLAY, COMBINING 20D8 +RING OVERLAY, COMBINING CLOCKWISE 20D9 +RISING DIAGONAL SLASH, SQUARED 29C4 +RISING DOTS, MINUS SIGN WITH 2A2C +RISING DOTS, TILDE OPERATOR WITH 2A6B +rle 202B +rlm 200F +rlo 202E +Roman Numerals 2160 +Romanian, Additions for 0218 +ROOT, CUBE 221B +ROOT, FOURTH 221C +ROOT, SQUARE 221A +ROTATED CAPITAL Q 213A +rotation 20D5 +rough breathing 0314 +RULE, LOZENGE DIVIDED BY HORIZONTAL 27E0 +rule, parted 00A6 +RULE-DELAYED 29F4 +Runes, Golden Number 16EE +Runic 16A0 +RUNOUT, TOTAL 2330 +RUPEE MARK, BENGALI 09F2 +RUPEE SIGN 20A8 +RUPEE SIGN, BENGALI 09F3 +RUPEE SIGN, GUJARATI 0AF1 +RUPEE SIGN, TAMIL 0BF9 +Russian Alphabet, Basic 0410 +S, INVERTED LAZY 223E +S, LATIN SMALL LETTER LONG 017F +S, LATIN SMALL LETTER SHARP 00DF +s, lazy 223D +S, MODIFIER LETTER SMALL 02E2 +S, PERPENDICULAR WITH 2AE1 +S IN TRIANGLE 29CC +SAFHA, ARABIC SIGN 0603 +SAGITTARIUS 2650 +SALTIRE 2613 +sam 070F +SANAH, ARABIC SIGN 0601 +SANS-SERIF CAPITAL G, TURNED 2141 +SANS-SERIF CAPITAL L, REVERSED 2143 +SANS-SERIF CAPITAL L, TURNED 2142 +SANS-SERIF CAPITAL Y, TURNED 2144 +Sanskrit and Tibetan, Mongolian Extensions for 1880 +satisfies 22A8 +satisfies, necessarily 2AF1 +satisfies, ordinarily 2AE2 +SATURN 2644 +SCHEMA COMPOSITION, Z NOTATION 2A1F +schema hiding, z notation 29F9 +SCHEMA PIPING, Z NOTATION 2A20 +SCHEMA PROJECTION, Z NOTATION 2A21 +SCHWA, LATIN CAPITAL LETTER 018F +SCHWA, LATIN SMALL LETTER 0259 +Scissors Dingbats 2701 +SCORPIUS 264F +SCREEN, COMBINING ENCLOSING 20E2 +script a, latin small letter 0251 +SCRIPT CAPITAL B 212C +SCRIPT CAPITAL E 2130 +SCRIPT CAPITAL F 2131 +SCRIPT CAPITAL H 210B +SCRIPT CAPITAL I 2110 +SCRIPT CAPITAL L 2112 +SCRIPT CAPITAL M 2133 +SCRIPT CAPITAL P 2118 +SCRIPT CAPITAL R 211B +script f, latin small letter 0192 +SCRIPT G, LATIN SMALL LETTER 0261 +SCRIPT SMALL E 212F +SCRIPT SMALL G 210A +SCRIPT SMALL L 2113 +SCRIPT SMALL O 2134 +script v, latin capital letter 01B2 +script v, latin small letter 028B +Scripts Area, General 0000 +scrolling 21F3 +SCRUPLE 2108 +SEAGULL BELOW, COMBINING 033C +second transfinite cardinal (the continuum) 2136 +seconds 2033 +SECTION SIGN 00A7 +section sign, european 00B6 +SECTOR 2314 +SEGMENT 2313 +selected area, end of 0087 +selected area, start of 0086 +Selectors, Variation FE00 +SEMICIRCULAR PATH AROUND POLE, LINE INTEGRATION WITH 2A13 +SEMICOLON 003B +SEMICOLON, ARABIC 061B +SEMICOLON, ETHIOPIC 1364 +SEMICOLON, REVERSED 204F +SEMIDIRECT PRODUCT, LEFT 22CB +SEMIDIRECT PRODUCT WITH BOTTOM CLOSED 2A32 +SEPARATOR DOT, AEGEAN WORD 10101 +SEPARATOR LINE, AEGEAN WORD 10100 +SEPARATOR, ARABIC DECIMAL 066B +SEPARATOR, ARABIC THOUSANDS 066C +separator, decimal 002C +separator, devanagari phrase 0964 +separator, file 001C +SEPARATOR, GEORGIAN PARAGRAPH 10FB +separator, group 001D +SEPARATOR, INVISIBLE 2063 +SEPARATOR, LINE 2028 +SEPARATOR, PARAGRAPH 2029 +separator, record 001E +SEPARATOR, SYMBOL FOR FILE 241C +SEPARATOR, SYMBOL FOR GROUP 241D +SEPARATOR, SYMBOL FOR RECORD 241E +SEPARATOR, SYMBOL FOR UNIT 241F +separator, unit 001F +separator, urdu paragraph 203B +SEPARATOR KEY SYMBOL, DECIMAL 2396 +sequence concatenation, z notation 2040 +sequence introducer, control 009B +Serbian Cyrillic Letters, Croatian Digraphs Matching 01C4 +SERIFS, CLOSED INTERSECTION WITH 2A4D +SERIFS, CLOSED UNION WITH 2A4C +SERIFS AND SMASH PRODUCT, CLOSED UNION WITH 2A50 +SERIFS AT BOTTOM, TRIANGLE WITH 29CD +SERVICE MARK 2120 +SESAME DOT FE45 +SESAME DOT, WHITE FE46 +SET, EMPTY 2205 +set, included in 2282 +set, includes in 2283 +set, null 2205 +set, power 2118 +SET MINUS 2216 +set of complex numbers, the 2102 +set of integers, the 2124 +set of rational numbers, the 211A +set of real numbers, the 211D +set transmit state 0093 +Sets, Empty 29B0 +sextile 2736 +Shade Characters 2591 +shamrock 2663 +Shapes, Geometric 25A0 +SHARP S, LATIN SMALL LETTER 00DF +SHARP SIGN, MUSIC 266F +Shavian 10450 +SHEQEL SIGN, NEW 20AA +shift 21E7 +shift in 000F +SHIFT IN, SYMBOL FOR 240F +shift out 000E +SHIFT OUT, SYMBOL FOR 240E +shilling 002F +SHOGI PIECE, BLACK 2617 +SHOGI PIECE, WHITE 2616 +short 0306 +SHORT DOWN TACK 2ADF +SHORT DOWN TACK, SHORT UP TACK ABOVE 2AE9 +SHORT DOWN TACK WITH OVERBAR 2AE7 +SHORT I WITH TAIL, CYRILLIC CAPITAL LETTER 048A +SHORT I WITH TAIL, CYRILLIC SMALL LETTER 048B +SHORT LEFT TACK 2ADE +short slash overlay 0337 +SHORT SOLIDUS OVERLAY, COMBINING 0337 +SHORT STROKE OVERLAY, COMBINING 0335 +SHORT UP TACK 2AE0 +SHORT UP TACK ABOVE SHORT DOWN TACK 2AE9 +SHORT UP TACK WITH UNDERBAR 2AE8 +SHORT VERTICAL LINE OVERLAY, COMBINING 20D3 +SHOULDERED OPEN BOX 237D +SHUFFLE PRODUCT 29E2 +shy 00AD +Sibe Letters, Mongolian 185D +Sidelining Emphasis Marks FE45 +SIMILAR, SIMILAR MINUS 2A6C +SIMILAR ABOVE GREATER-THAN, LESS-THAN ABOVE 2A8F +SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN 2AA0 +SIMILAR ABOVE LESS-THAN, GREATER-THAN ABOVE 2A90 +SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN 2A9F +SIMILAR MINUS SIMILAR 2A6C +SIMILAR OR EQUAL, GREATER-THAN ABOVE 2A8E +SIMILAR OR EQUAL, LESS-THAN ABOVE 2A8D +SIMILAR OR GREATER-THAN 2A9E +SIMILAR OR LESS-THAN 2A9D +similar to 223C +SINE WAVE 223F +single character introducer 009A +single comma quotation mark 2019 +single comma quotation mark, low 201A +single guillemet, left pointing 2039 +single guillemet, right pointing 203A +SINGLE HIGH-REVERSED-9 QUOTATION MARK 201B +SINGLE LEFT-POINTING ANGLE QUOTATION MARK 2039 +SINGLE LOW-9 QUOTATION MARK 201A +SINGLE PUNCTUATION, PHILIPPINE 1735 +SINGLE QUOTATION MARK, LEFT 2018 +SINGLE QUOTATION MARK, RIGHT 2019 +single reversed comma quotation mark 201B +SINGLE RIGHT-POINTING ANGLE QUOTATION MARK 203A +single shift three 008F +single shift two 008E +single turned comma quotation mark 2018 +Sinhala 0D80 +SIX-PER-EM SPACE 2006 +SIXTEENTH NOTES, BEAMED 266C +Sixths, Fractions 2159 +SKULL AND CROSSBONES 2620 +slash 002F +SLASH, CIRCLED DIVISION 2298 +SLASH, DIVISION 2215 +SLASH, DOES NOT DIVIDE WITH REVERSED NEGATION 2AEE +SLASH, FRACTION 2044 +SLASH, INTEGRAL AVERAGE WITH 2A0F +SLASH, SQUARED FALLING DIAGONAL 29C5 +SLASH, SQUARED RISING DIAGONAL 29C4 +slash overlay, long 0338 +slash overlay, short 0337 +SLOPE 2333 +SLOPING LARGE AND 2A58 +SLOPING LARGE OR 2A57 +Slovenian and Croatian, Additions for 0200 +SMALL CAPITAL B, LATIN LETTER 0299 +SMALL CAPITAL G, LATIN LETTER 0262 +SMALL CAPITAL H, LATIN LETTER 029C +SMALL CAPITAL I, LATIN LETTER 026A +SMALL CAPITAL INVERTED R, LATIN LETTER 0281 +SMALL CAPITAL INVERTED R, MODIFIER LETTER 02B6 +SMALL CAPITAL L, LATIN LETTER 029F +SMALL CAPITAL N, LATIN LETTER 0274 +SMALL CAPITAL OE, LATIN LETTER 0276 +SMALL CAPITAL R, LATIN LETTER 0280 +SMALL CAPITAL Y, LATIN LETTER 028F +small circle, black 2022 +SMALL CIRCLE, SQUARED 29C7 +SMALL CIRCLE ABOVE, PLUS SIGN WITH 2A22 +SMALL CIRCLE TO THE RIGHT, CIRCLE WITH 29C2 +SMALL CONTAINS AS MEMBER 220D +SMALL CONTAINS WITH OVERBAR 22FE +SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE 22FC +SMALL D, DOUBLE-STRUCK ITALIC 2146 +SMALL E, DOUBLE-STRUCK ITALIC 2147 +SMALL ELEMENT OF 220A +SMALL ELEMENT OF WITH OVERBAR 22F7 +SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE 22F4 +Small Form Variants FE50 +SMALL GAMMA, DOUBLE-STRUCK 213D +SMALL I, DOUBLE-STRUCK ITALIC 2148 +SMALL J, DOUBLE-STRUCK ITALIC 2149 +Small Letters, Armenian 0561 +Small Letters, Combining Latin 0363 +Small Letters, Cyrillic 0430 +Small Letters, Georgian 10D0 +Small Letters, Greek 03B1 +Small Letters, Latin 0061 +SMALL SQUARE, BLACK MEDIUM 25FE +SMALL SQUARE, WHITE MEDIUM 25FD +SMALL VEE WITH UNDERBAR 2A61 +SMALLER THAN 2AAA +SMALLER THAN OR EQUAL TO 2AAC +SMASH PRODUCT 2A33 +SMASH PRODUCT, CLOSED UNION WITH SERIFS AND 2A50 +SMILE 2323 +SMILING FACE, BLACK 263B +SMILING FACE, WHITE 263A +smooth breathing 0313 +Snowflake Dingbats 2744 +Snowflakes, Stars, Asterisks and 2721 +SNOWMAN 2603 +snowy weather 2603 +SOFT HYPHEN 00AD +SOFTWARE-FUNCTION SYMBOL 2394 +solid 2588 +SOLIDUS 002F +solidus 2044 +SOLIDUS, BIG 29F8 +SOLIDUS, BIG REVERSE 29F9 +SOLIDUS, CIRCLED REVERSE 29B8 +SOLIDUS, REVERSE 005C +SOLIDUS BINARY RELATION, TRIPLE 2AFB +SOLIDUS OPERATOR, DOUBLE 2AFD +SOLIDUS OPERATOR, REVERSE 29F5 +SOLIDUS OVERLAY, COMBINING LONG 0338 +SOLIDUS OVERLAY, COMBINING REVERSE 20E5 +SOLIDUS OVERLAY, COMBINING SHORT 0337 +SOLIDUS WITH HORIZONTAL STROKE, REVERSE 29F7 +SOLIDUS WITH OVERBAR 29F6 +SOUND RECORDING COPYRIGHT 2117 +SOURCE, INFORMATION 2139 +SPACE 0020 +SPACE, EM 2003 +SPACE, EN 2002 +SPACE, FIGURE 2007 +SPACE, FOUR-PER-EM 2005 +space, graphic for 2422 +space, graphic for 2423 +space, graphic for no break 237D +SPACE, HAIR 200A +SPACE, IDEOGRAPHIC 3000 +SPACE, MEDIUM MATHEMATICAL 205F +space, mid 2005 +SPACE, NARROW NO-BREAK 202F +SPACE, NO-BREAK 00A0 +SPACE, PUNCTUATION 2008 +SPACE, SIX-PER-EM 2006 +SPACE, SYMBOL FOR 2420 +space, thick 2004 +SPACE, THIN 2009 +SPACE, THREE-PER-EM 2004 +SPACE, ZERO WIDTH 200B +SPACE, ZERO WIDTH NO-BREAK FEFF +SPACE MARK, OGHAM 1680 +Spaces 2000 +spacing acute 00B4 +spacing cedilla 00B8 +spacing circumflex 005E +Spacing Clones of Diacritics 02D8 +spacing diaeresis 00A8 +spacing double underscore 2017 +spacing grave 0060 +spacing macron 00AF +Spacing Modifier Letters 02B0 +spacing overscore 203E +spacing underscore 005F +spanish currency 20A7 +Special character extensions 23AE +Specialized plus sign operators 29FA +Specials FFF0 +Specials Area, Compatibility and F900 +SPHERICAL ANGLE 2222 +SPHERICAL ANGLE OPENING LEFT 29A0 +SPHERICAL ANGLE OPENING UP 29A1 +SPOT, Z NOTATION 2981 +SQUARE, BLACK MEDIUM 25FC +SQUARE, BLACK MEDIUM SMALL 25FE +SQUARE, COMBINING ENCLOSING 20DE +SQUARE, VIEWDATA 2317 +SQUARE, WHITE MEDIUM 25FB +SQUARE, WHITE MEDIUM SMALL 25FD +SQUARE BELOW, COMBINING 033B +square bracket, closing 005D +SQUARE BRACKET, LEFT 005B +SQUARE BRACKET, LEFT WHITE 301A +square bracket, opening 005B +SQUARE BRACKET, RIGHT 005D +SQUARE BRACKET WITH QUILL, LEFT 2045 +SQUARE CAP 2293 +SQUARE CORPORATION 337F +SQUARE CUP 2294 +SQUARE FOOT 23CD +SQUARE IMAGE OF 228F +SQUARE INTERSECTION, DOUBLE 2A4E +SQUARE INTERSECTION OPERATOR, N-ARY 2A05 +SQUARE LEFT OPEN BOX OPERATOR 2ACD +SQUARE LOZENGE 2311 +SQUARE ORIGINAL OF 2290 +SQUARE RIGHT OPEN BOX OPERATOR 2ACE +SQUARE ROOT 221A +Square Symbols 29C4 +SQUARE UNION, DOUBLE 2A4F +SQUARE UNION OPERATOR, N-ARY 2A06 +SQUARE WITH CONTOURED OUTLINE 29E0 +SQUARE WITH LEFTWARDS TICK, WHITE 27E4 +SQUARE WITH RIGHTWARDS TICK, WHITE 27E5 +squared 00B2 +SQUARED DOT OPERATOR 22A1 +Squared Japanese Katakana Words 3300 +Squared Latin Abbreviations 3371 +SQUARED MINUS 229F +SQUARED PLUS 229E +SQUARED TIMES 22A0 +Squares 25A0 +SQUAT REVERSED ESH, LATIN SMALL LETTER 0285 +st. andrew's cross 2613 +star 002A +STAR, ARABIC FIVE POINTED 066D +STAR, BLACK 2605 +STAR AND CRESCENT 262A +Star Dingbats 2726 +STAR EQUALS 225B +STAR OF DAVID 2721 +STAR OPERATOR 22C6 +starburst 273A +STARK, GLEICH 29E6 +Stars, Asterisks and Snowflakes 2721 +start of guarded area 0096 +start of heading 0001 +START OF HEADING, SYMBOL FOR 2401 +start of selected area 0086 +start of string 0098 +start of text 0002 +START OF TEXT, SYMBOL FOR 2402 +statement is true 22A8 +sterling, pound 00A3 +stile, apl 2223 +straight epsilon 220A +straight epsilon, reversed 220D +stress mark 0301 +STRETCHED C, LATIN LETTER 0297 +STRICTLY EQUIVALENT TO 2263 +string, device control 0090 +string, start of 0098 +string terminator 009C +STROKE OVERLAY, COMBINING LONG 0336 +STROKE OVERLAY, COMBINING SHORT 0335 +SUBGROUP, CONTAINS AS NORMAL 22B3 +SUBGROUP OF, NORMAL 22B2 +subscript, iota 0345 +Subscript Digits 2080 +SUBSCRIPT EQUALS SIGN 208C +SUBSCRIPT LEFT PARENTHESIS 208D +SUBSCRIPT MINUS 208B +SUBSCRIPT PLUS SIGN 208A +SUBSCRIPT TWO, PLUS SIGN WITH 2A27 +Subscripts 2080 +SUBSET, DOUBLE 22D0 +Subset and Superset Relations 2ABD +SUBSET OF 2282 +substitute 001A +SUBSTITUTE, SYMBOL FOR 241A +SUBSTITUTE FORM TWO, SYMBOL FOR 2426 +Subtending Marks, Arabic 0600 +subtraction, z notation bag 2A41 +SUCCEEDS 227B +SUCCEEDS, DOUBLE 2ABC +SUCCEEDS ABOVE ALMOST EQUAL TO 2AB8 +SUCCEEDS ABOVE EQUALS SIGN 2AB4 +SUCCEEDS ABOVE NOT ALMOST EQUAL TO 2ABA +SUCCEEDS ABOVE NOT EQUAL TO 2AB6 +SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN 2AB0 +SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO 2AB2 +SUCCEEDS UNDER RELATION 22B1 +such that 220B +such that 2223 +Suits, Playing Card 2660 +sum, direct 2295 +SUM, MODULO TWO 2A0A +sum, positive difference or 2A24 +sum or positive difference 2A26 +SUMMATION, DOUBLE-STRUCK N-ARY 2140 +SUMMATION, N-ARY 2211 +SUMMATION BOTTOM 23B3 +Summation Sign Parts 23B2 +SUMMATION TOP 23B2 +Summations and Integrals 2A0A +SUN 2609 +SUN WITH RAYS, BLACK 2600 +SUPERIMPOSED X, CIRCLE WITH 29BB +SUPERSCRIPT ALEF, ARABIC LETTER 0670 +Superscript Digits 2070 +SUPERSCRIPT EQUALS SIGN 207C +SUPERSCRIPT LATIN SMALL LETTER I 2071 +SUPERSCRIPT LEFT PARENTHESIS 207D +Superscript Letter Diacritics, Medieval 0363 +SUPERSCRIPT MINUS 207B +SUPERSCRIPT ONE 00B9 +SUPERSCRIPT PLUS SIGN 207A +SUPERSCRIPT THREE 00B3 +SUPERSCRIPT TWO 00B2 +SUPERSCRIPT ZERO 2070 +Superscripts 2070 +Superscripts and Subscripts 2070 +SUPERSET, DOUBLE 22D1 +SUPERSET OF 2283 +Superset Relations, Subset and 2ABD +Supplemental Arrows-A 27F0 +Supplemental Arrows-B 2900 +Supplemental Mathematical Operators 2A00 +Supplementary, Cyrillic 0500 +Supplementary Private Use Area-A F0000 +Supplementary Private Use Area-B 100000 +SURFACE INTEGRAL 222F +surjection, z notation finite 2901 +surjection, z notation partial 2900 +surjective injection, z notation 2917 +surjective injection, z notation finite 2918 +Surrogates, High D800 +Surrogates, Low DC00 +Surrogates Area D800 +swedish grave accent 02DF +SWUNG DASH 2053 +Syllabics, Unified Canadian Aboriginal 1400 +Syllables, Yi A000 +Syllables Area, Korean Hangul AC00 +Symbol Variants, Fullwidth FFE0 +Symbols, Bowtie 29D1 +Symbols, Circle 29B5 +Symbols, Combining Diacritical Marks for 20D0 +Symbols, Dentistry Notation 23BE +Symbols, Double-Struck Italic Mathematical 2145 +Symbols, Error Bar 29EE +Symbols, Greek 03D0 +Symbols, Japanese Chess 2616 +Symbols, Letterlike 2100 +Symbols, Miscellaneous 2600 +Symbols, Recycling 2672 +Symbols, Square 29C4 +Symbols, Triangle 29CA +Symbols and Arrows, Miscellaneous 2B00 +Symbols and Punctuation, CJK 3000 +Symbols Area 2000 +Symbols Area, CJK Phonetics and 2E00 +Symbols for Control Codes, Graphic 2400 +Symbols For Plastics, Recycling 2673 +Symbols-A, Miscellaneous Mathematical 27C0 +Symbols-B, Miscellaneous Mathematical 2980 +symmetric difference 2238 +symmetric difference 2296 +SYMMETRIC SWAPPING, ACTIVATE 206B +SYMMETRIC SWAPPING, INHIBIT 206A +SYMMETRY 232F +synchronous idle 0016 +SYNCHRONOUS IDLE, SYMBOL FOR 2416 +Syriac 0700 +SYRIAC ABBREVIATION MARK 070F +SYRIAC CROSS, EAST 2671 +SYRIAC CROSS, WEST 2670 +Syriac Format Control 070F +T, COMBINING LATIN SMALL LETTER 036D +T, LATIN SMALL LETTER TURNED 0287 +tab 0009 +tab, leftward 21E4 +tab, rightward 21E5 +tab, symbol for 2409 +tab with shift tab 21B9 +tabulation, horizontal 0009 +TABULATION, SYMBOL FOR HORIZONTAL 2409 +TABULATION, SYMBOL FOR VERTICAL 240B +tabulation, vertical 000B +tabulation set, character 0088 +tabulation set, line 008A +tabulation with justification, character 0089 +TACK, LEFT 22A3 +TACK, MODIFIER LETTER UP 02D4 +TACK, RIGHT 22A2 +TACK, UP 22A5 +TACK BELOW, COMBINING LEFT 0318 +TACK BELOW, COMBINING UP 031D +Tacks and Turnstiles 27D8 +Tacks and Turnstiles 2ADE +Tagalog 1700 +TAGALOG SIGN VIRAMA 1714 +Tagbanwa 1760 +Tai Le 1950 +Tai Xuan Jing Symbols 1D300 +TAIL FRAGMENT, ARABIC FE73 +Tails, Fish 297C +tainome (japanese, a kind of bullet) 25C9 +TAKE, PRESCRIPTION 211E +Tamil 0B80 +Tamil Digits 0BE7 +Tamil Letters 0B85 +TAMIL RUPEE SIGN 0BF9 +TAMIL NUMBER SIGN 0BFA +Tamil Symbols 0BF3 +TAPE DRIVE 2707 +TAPER, CONICAL 2332 +TAURUS 2649 +tautological equivalent 29E6 +tautology 22A8 +tea 2615 +Technical, Miscellaneous 2300 +TEE TOP, PITCHFORK WITH 2ADA +Telegraph Symbols for Days 33E0 +Telegraph Symbols for Hours 3358 +Telegraph Symbols for Months 32C0 +TELEPHONE, BLACK 260E +TELEPHONE LOCATION SIGN 2706 +TELEPHONE RECORDER 2315 +TELEPHONE SIGN 2121 +Telugu 0C00 +Telugu Digits 0C66 +Telugu Letters 0C05 +TEN THOUSAND SIGN, PER 2031 +tensor 20E1 +tensor product 2297 +Terminal graphic characters 23B7 +Terminal Graphic Characters 2596 +Terminal Graphics, Scan Lines For 23BA +terminator, string 009C +Tetragram Symbols, Tai Xuan Jing 1D306 +text, end of 0003 +text, start of 0002 +TEXT, SYMBOL FOR END OF 2403 +TEXT, SYMBOL FOR START OF 2402 +Thaana 0780 +Thai 0E00 +THAI CURRENCY SYMBOL BAHT 0E3F +Thai Digits 0E50 +Thai Letters 0E01 +THERE EXISTS 2203 +THEREFORE 2234 +THERMODYNAMIC 29E7 +thick space 2004 +THIN SPACE 2009 +third derivative 20DB +third transfinite cardinal (functions of a real variable) 2137 +Thirds, Fractions 2153 +THORN, LATIN CAPITAL LETTER 00DE +THORN, LATIN SMALL LETTER 00FE +THOUSANDS SEPARATOR, ARABIC 066C +THOUSANDS SIGN, CYRILLIC 0482 +THREE, SUPERSCRIPT 00B3 +three dot leader 2026 +THREE DOTS ABOVE, COMBINING 20DB +THREE QUARTERS, VULGAR FRACTION 00BE +THREE-PER-EM SPACE 2004 +THUNDERSTORM 2608 +Tibetan 0F00 +Tibetan, Mongolian Extensions for Sanskrit and 1880 +Tibetan Digits 0F20 +Tibetan Letters 0F40 +TICK, WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS 27E2 +TICK, WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS 27E3 +TICK, WHITE SQUARE WITH LEFTWARDS 27E4 +TICK, WHITE SQUARE WITH RIGHTWARDS 27E5 +TIE, CHARACTER 2040 +tie, ligature 0361 +TIE OVER INFINITY 29DD +TILDE 007E +tilde, apl 223C +TILDE, COMBINING 0303 +TILDE, COMBINING DOUBLE 0360 +TILDE, COMBINING VERTICAL 033E +TILDE, MINUS 2242 +TILDE, REVERSED 223D +TILDE, SMALL 02DC +TILDE, TRIPLE 224B +TILDE ABOVE, COMBINING NOT 034A +TILDE BELOW, COMBINING 0330 +TILDE EQUALS, REVERSED 22CD +TILDE LEFT HALF, COMBINING DOUBLE FE22 +TILDE OPERATOR 223C +TILDE OPERATOR, EQUALS SIGN ABOVE 2A73 +TILDE OPERATOR, PARALLEL WITH 2AF3 +TILDE OPERATOR, SUBSET OF ABOVE 2AC7 +TILDE OPERATOR, SUPERSET OF ABOVE 2AC8 +TILDE OPERATOR WITH DOT ABOVE 2A6A +TILDE OPERATOR WITH RISING DOTS 2A6B +TILDE OVERLAY, COMBINING 0334 +TIMES, CIRCLED 2297 +TIMES, DIVISION 22C7 +TIMES, INVISIBLE 2062 +TIMES, SQUARED 22A0 +TIMES OPERATOR, N-ARY 2A09 +TIMES OPERATOR, N-ARY CIRCLED 2A02 +TIMES SIGN, INTEGRAL WITH 2A18 +TIMES WITH LEFT HALF BLACK 29D4 +TIMES WITH RIGHT HALF BLACK 29D5 +TINY 29FE +TIRONIAN SIGN ET 204A +TIS 620-2529 (Thai), Based on 0E01 +Todo Letters, Mongolian 1843 +Tone Bar Letters 02E5 +TONE FIVE, LATIN SMALL LETTER 01BD +TONE MARK, COMBINING ACUTE 0341 +TONE MARK, COMBINING GRAVE 0340 +Tone Marks, Ideographic 302A +Tone Marks, Vietnamese 0340 +TONE SIX, LATIN SMALL LETTER 0185 +TONE TWO, LATIN SMALL LETTER 01A8 +tonos 0301 +TONOS, COMBINING GREEK DIALYTIKA 0344 +TOP HALF INTEGRAL 2320 +TOP LEFT CORNER 231C +TOP LEFT CROP 230F +TORTOISE SHELL BRACKET, LEFT 3014 +TORTOISE SHELL BRACKET, LEFT WHITE 3018 +TOTAL RUNOUT 2330 +TRADE MARK SIGN 2122 +trade mark sign, registered 00AE +transfinite cardinal, fourth 2138 +transfinite cardinal (countable), first 2135 +transfinite cardinal (functions of a real variable), third 2137 +transfinite cardinal (the continuum), second 2136 +transmission, end of 0004 +transmission, graphic for end of 2301 +TRANSMISSION, SYMBOL FOR END OF 2404 +transmission block, end of 0017 +TRANSMISSION BLOCK, SYMBOL FOR END OF 2417 +transmit state, set 0093 +TRANSVERSAL INTERSECTION 2ADB +TRIANGLE, COMBINING ENCLOSING UPWARD POINTING 20E4 +TRIANGLE, LOWER LEFT 25FA +TRIANGLE, LOWER RIGHT 25FF +TRIANGLE, MINUS SIGN IN 2A3A +TRIANGLE, MULTIPLICATION SIGN IN 2A3B +TRIANGLE, PLUS SIGN IN 2A39 +TRIANGLE, PLUS SIGN WITH BLACK 2A28 +TRIANGLE, RIGHT 22BF +TRIANGLE, UPPER LEFT 25F8 +TRIANGLE, UPPER RIGHT 25F9 +TRIANGLE, VERTICAL BAR BESIDE RIGHT 29D0 +TRIANGLE OPERATOR, LARGE LEFT 2A1E +Triangle symbols 29CA +TRIANGLE WITH LEFT HALF BLACK, DOWN-POINTING 29E8 +TRIANGLE WITH RIGHT HALF BLACK, DOWN-POINTING 29E9 +Triangles 25B2 +TRIANGULAR BULLET 2023 +TRIANGULAR COLON, MODIFIER LETTER 02D0 +TRIANGULAR COLON, MODIFIER LETTER HALF 02D1 +Trigram Symbols, Yijing 2630 +trine 25B3 +TRIPLE COLON OPERATOR 2AF6 +TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE 2A68 +TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE 2A69 +TRIPLE INTEGRAL 222D +TRIPLE NESTED GREATER-THAN 2AF8 +TRIPLE NESTED LESS-THAN 2AF7 +TRIPLE PLUS 29FB +TRIPLE PRIME 2034 +TRIPLE PRIME, REVERSED 2037 +TRIPLE RIGHT TURNSTILE, VERTICAL BAR 2AE2 +TRIPLE SOLIDUS BINARY RELATION 2AFB +TRIPLE TILDE 224B +TRIPLE UNDERDOT, COMBINING 20E8 +TRIPLE VERTICAL BAR BINARY RELATION 2AF4 +TRIPLE VERTICAL BAR DELIMITER 2980 +TRIPLE VERTICAL BAR OPERATOR, LARGE 2AFC +TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE 2AF5 +TRIPLE VERTICAL STROKE, TRIPLE HORIZONTAL BAR WITH 2A69 +TRUE 22A8 +TUGRIK SIGN 20AE +turbofan 274B +turkish currency 20A4 +TURNED A, LATIN SMALL LETTER 0250 +TURNED ALPHA, LATIN SMALL LETTER 0252 +TURNED AMPERSAND 214B +TURNED ANGLE 29A2 +TURNED CAPITAL F 2132 +TURNED COMMA, MODIFIER LETTER 02BB +TURNED COMMA ABOVE, COMBINING 0312 +turned comma quotation mark, double 201C +turned comma quotation mark, single 2018 +TURNED DELTA, LATIN SMALL LETTER 018D +turned e, latin capital letter 018E +TURNED E, LATIN SMALL LETTER 01DD +TURNED GREEK SMALL LETTER IOTA 2129 +TURNED H, LATIN SMALL LETTER 0265 +TURNED K, LATIN SMALL LETTER 029E +TURNED M, LATIN CAPITAL LETTER 019C +TURNED M, LATIN SMALL LETTER 026F +TURNED NOT SIGN 2319 +turned question mark 00BF +TURNED R, LATIN SMALL LETTER 0279 +TURNED R, MODIFIER LETTER SMALL 02B4 +TURNED SANS-SERIF CAPITAL G 2141 +TURNED SANS-SERIF CAPITAL L 2142 +TURNED SANS-SERIF CAPITAL Y 2144 +TURNED T, LATIN SMALL LETTER 0287 +TURNED V, LATIN SMALL LETTER 028C +TURNED W, LATIN SMALL LETTER 028D +TURNED Y, LATIN SMALL LETTER 028E +turnstile 22A2 +turnstile, reverse 22A3 +Turnstiles, Tacks and 27D8 +Turnstiles, Tacks and 2ADE +TWO, SUPERSCRIPT 00B2 +TWO DOT LEADER 2025 +TWO-HEADED ARROW FROM BAR, RIGHTWARDS 2905 +TWO-HEADED ARROW WITH TAIL, RIGHTWARDS 2916 +TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE, RIGHTWARDS 2917 +TYPE COLON, Z NOTATION 2982 +U, COMBINING LATIN SMALL LETTER 0367 +Ugaritic 10380 +UMBRELLA 2602 +UMBRELLA WITH RAIN DROPS 2614 +umlaut 0308 +UNASPIRATED, MODIFIER LETTER 02ED +UNDERDOT, COMBINING TRIPLE 20E8 +underline 0332 +underline, double 0333 +UNDERLINE SYMBOL, CONTINUOUS 2381 +UNDERLINE SYMBOL, DISCONTINUOUS 2382 +underscore 0332 +underscore, double 0333 +underscore, spacing 005F +underscore, spacing double 2017 +Underscores, Overscores and FE49 +UNDERTIE 203F +UNDERTIE, INVERTED 2054 +UNDO SYMBOL 238C +undoable delete 2425 +UNION 222A +UNION, DOUBLE 22D3 +UNION, DOUBLE SQUARE 2A4F +UNION, INTEGRAL WITH 2A1A +UNION, INTERSECTION ABOVE 2A47 +UNION, INTERSECTION ABOVE BAR ABOVE 2A49 +UNION, MULTISET 228E +UNION, N-ARY 22C3 +UNION, UNION BESIDE AND JOINED WITH 2A4A +UNION ABOVE BAR ABOVE INTERSECTION 2A48 +UNION ABOVE INTERSECTION 2A46 +UNION BESIDE AND JOINED WITH UNION 2A4A +UNION OPERATOR, N-ARY SQUARE 2A06 +UNION OPERATOR WITH DOT, N-ARY 2A03 +UNION OPERATOR WITH PLUS, N-ARY 2A04 +UNION WITH LOGICAL OR 2A45 +UNION WITH MINUS SIGN 2A41 +UNION WITH OVERBAR 2A42 +UNION WITH SERIFS, CLOSED 2A4C +UNION WITH SERIFS AND SMASH PRODUCT, CLOSED 2A50 +Unions, Intersections and 2A40 +unique element 2129 +unit separator 001F +UNIT SEPARATOR, SYMBOL FOR 241F +UNIVERSAL RECYCLING SYMBOL 2672 +UNIVERSAL RECYCLING SYMBOL, BLACK 267B +up, page 21DE +UP ARROWHEAD 2303 +UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS 2324 +UP RIGHT DIAGONAL ELLIPSIS 22F0 +UP TACK 22A5 +UP TACK, MODIFIER LETTER 02D4 +UP TACK BELOW, COMBINING 031D +UPA Modifiers 02EF +UPPER BLADE SCISSORS 2701 +UPPER RIGHT PENCIL 2710 +UPSILON, LATIN CAPITAL LETTER 01B1 +UPSILON, LATIN SMALL LETTER 028A +upstile, apl 2308 +UPWARDS ARROW BELOW, COMBINING 034E +URANUS 2645 +Urdu, Eastern Arabic-Indic Digits for Persian and 06F0 +urdu paragraph separator 203B +V, COMBINING LATIN SMALL LETTER 036E +v, latin capital letter script 01B2 +v, latin small letter script 028B +V, LATIN SMALL LETTER TURNED 028C +V WITH HOOK, LATIN CAPITAL LETTER 01B2 +valentine 2665 +valid 22A8 +varia 0300 +Variation Selectors FE00 +Variation Selectors Supplement E0100 +varies with (proportional to) 223C +vector 20D0 +vector 20D6 +VECTOR OR CROSS PRODUCT 2A2F +vector pointing into page 2295 +vector pointing into page 2297 +vector pointing out of page 2299 +vee 2228 +vee above 030C +VEE WITH UNDERBAR, SMALL 2A61 +venus 2640 +VERSICLE 2123 +VERTICAL, LONG DASH FROM LEFT MEMBER OF DOUBLE 2AE6 +vertical bar 007C +vertical bar, broken 00A6 +VERTICAL BAR, CIRCLED 29B6 +VERTICAL BAR, N-ARY WHITE 2AFF +VERTICAL BAR, WHITE 2AFE +VERTICAL BAR BINARY RELATION, TRIPLE 2AF4 +VERTICAL BAR DELIMITER, TRIPLE 2980 +Vertical Bar Dingbats 2758 +VERTICAL BAR OPERATOR, LARGE TRIPLE 2AFC +VERTICAL BAR WITH HORIZONTAL STROKE, TRIPLE 2AF5 +vertical bowtie 29D6 +VERTICAL BOX LINE, LEFT 23B8 +VERTICAL BOX LINE, RIGHT 23B9 +Vertical brackets 23B4 +VERTICAL ELLIPSIS 22EE +VERTICAL IDEOGRAPHIC ITERATION MARK 303B +VERTICAL KANA REPEAT MARK 3031 +VERTICAL LINE 007C +VERTICAL LINE, DOUBLE 2016 +VERTICAL LINE, MODIFIER LETTER 02C8 +VERTICAL LINE, MODIFIER LETTER LOW 02CC +VERTICAL LINE ABOVE, COMBINING 030D +VERTICAL LINE ABOVE, COMBINING DOUBLE 030E +VERTICAL LINE BELOW, COMBINING 0329 +VERTICAL LINE BELOW, COMBINING DOUBLE 0348 +VERTICAL LINE EXTENSION 23D0 +Vertical Line Operators 2AEE +VERTICAL LINE OVERLAY, COMBINING LONG 20D2 +VERTICAL LINE OVERLAY, COMBINING SHORT 20D3 +VERTICAL LINE WITH CIRCLE ABOVE 2AEF +VERTICAL LINE WITH CIRCLE BELOW 2AF0 +VERTICAL LINE WITH MIDDLE DOT 237F +VERTICAL STROKE OVERLAY, COMBINING DOUBLE 20E6 +vertical tabulation 000B +VERTICAL TABULATION, SYMBOL FOR 240B +Vertical Text, Double Punctuation For 2047 +VERTICAL TILDE, COMBINING 033E +Vertical Variants, Glyphs for FE30 +VERTICAL ZIGZAG LINE 299A +VERY MUCH GREATER-THAN 22D9 +VERY MUCH LESS-THAN 22D8 +VICTORY HAND 270C +Vietnamese, Latin Extensions for 1EA0 +vietnamese currency 20AB +Vietnamese Tone Marks 0340 +VIEWDATA SQUARE 2317 +vinculum 0305 +viram, deergh 0965 +viram, purna 0964 +VIRAMA, BENGALI SIGN 09CD +VIRAMA, DEVANAGARI SIGN 094D +VIRAMA, GUJARATI SIGN 0ACD +VIRAMA, GURMUKHI SIGN 0A4D +VIRAMA, KANNADA SIGN 0CCD +VIRAMA, MALAYALAM SIGN 0D4D +VIRAMA, ORIYA SIGN 0B4D +VIRAMA, TAGALOG SIGN 1714 +VIRAMA, TAMIL SIGN 0BCD +VIRAMA, TELUGU SIGN 0C4D +VIRGO 264D +virgule 002F +VOICED FRICATIVE, LATIN LETTER PHARYNGEAL 0295 +VOICED SOUND MARK, COMBINING KATAKANA-HIRAGANA 3099 +VOICED SOUND MARK, KATAKANA-HIRAGANA 309B +VOICING, MODIFIER LETTER 02EC +VOLUME INTEGRAL 2230 +VOLTAGE SIGN, HIGH 26A1 +vrachy 0306 +VS1 FE00 +W, LATIN SMALL LETTER TURNED 028D +W, MODIFIER LETTER SMALL 02B7 +WARNING SIGN 26A0 +Warning Signs 2620 +Warning Signs 26A0 +WATCH 231A +WAVE, SINE 223F +WAVE DASH 301C +WAVY DASH 3030 +WAVY LINE 2307 +WAVY LOW LINE FE4F +WAVY OVERLINE FE4B +WAVY OVERLINE, DOUBLE FE4C +Weather and Astrological Symbols 2600 +wedge 028C +wedge 2227 +weierstrass elliptic function 2118 +WHEEL OF DHARMA 2638 +WHITE BULLET, CIRCLED 29BE +WHITE CIRCLE WITH DOT RIGHT 2686 +WHITE CIRCLE WITH DOWN ARROW 29EC +WHITE CIRCLE WITH TWO DOTS 2687 +WHITE CONCAVE-SIDED DIAMOND 27E1 +WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK 27E2 +WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK 27E3 +WHITE DIAMOND WITH CENTRED DOT 27D0 +WHITE DOT RIGHT, BLACK CIRCLE WITH 2688 +WHITE DOTS, BLACK CIRCLE WITH TWO 2689 +WHITE FLAG 2690 +white framus 29D6 +WHITE HOURGLASS 29D6 +WHITE MEDIUM SMALL SQUARE 25FD +WHITE MEDIUM SQUARE 25FB +White On Black Circled Numbers 24EB +WHITE SESAME DOT FE46 +WHITE SHOGI PIECE 2616 +WHITE SQUARE WITH LEFTWARDS TICK 27E4 +WHITE SQUARE WITH RIGHTWARDS TICK 27E5 +WHITE VERTICAL BAR 2AFE +WHITE VERTICAL BAR, N-ARY 2AFF +WIDE BRIDGE ABOVE, COMBINING 20E9 +WIGGLY FENCE, LEFT 29D8 +WIGGLY FENCE, LEFT DOUBLE 29DA +WIGGLY FENCE, RIGHT 29D9 +WIGGLY FENCE, RIGHT DOUBLE 29DB +wj 2060 +WON SIGN 20A9 +WORD DIVIDER, UGARITIC 1039F +WORD JOINER 2060 +Word Separators, Aegean 10100 +Words, Squared Japanese Katakana 3300 +WORDSPACE, ETHIOPIC 1361 +WREATH PRODUCT 2240 +WRITING HAND 270D +WYNN, LATIN CAPITAL LETTER 01F7 +WYNN, LATIN LETTER 01BF +X, BALLOT 2717 +X, BALLOT BOX WITH 2612 +X, CIRCLE WITH SUPERIMPOSED 29BB +X, COMBINING LATIN SMALL LETTER 036F +X, HEAVY BALLOT 2718 +X, HEAVY MULTIPLICATION 2716 +X, MODIFIER LETTER SMALL 02E3 +X, MULTIPLICATION 2715 +X ABOVE, COMBINING 033D +X IN A RECTANGLE BOX 2327 +XOR 22BB +Y, LATIN LETTER SMALL CAPITAL 028F +Y, LATIN SMALL LETTER TURNED 028E +Y, MODIFIER LETTER SMALL 02B8 +Y, TURNED SANS-SERIF CAPITAL 2144 +YANG, YIN 262F +YEN SIGN 00A5 +Yi Radicals A490 +Yi Syllables A000 +Yiddish Digraphs 05F0 +yields 22A2 +Yijing Monogram and Digram Symbols 268A +Yijing Hexagram Symbols 4DC0 +Yijing Trigram Symbols 2630 +YIN YANG 262F +yogh, latin capital letter 01B7 +YOGH, LATIN SMALL LETTER 021D +yogh, latin small letter 0292 +YPOGEGRAMMENI, COMBINING GREEK 0345 +YR, LATIN LETTER 01A6 +yuan sign 00A5 +Z, BLACK-LETTER CAPITAL 2128 +Z, DOUBLE-STRUCK CAPITAL 2124 +Z NOTATION BAG MEMBERSHIP 22FF +z notation bag subtraction 2A41 +z notation bijection 2917 +Z Notation Binding Brackets 2989 +Z NOTATION DOMAIN ANTIRESTRICTION 2A64 +z notation finite function 20E6 +z notation finite function 21FB +z notation finite injection 2915 +z notation finite relation 21FC +z notation finite surjection 2901 +z notation finite surjective injection 2918 +Z Notation Image Brackets 2987 +z notation left bag bracket 27E6 +z notation partial function 21F8 +z notation partial injection 2914 +z notation partial relation 21F9 +z notation partial surjection 2900 +Z NOTATION RANGE ANTIRESTRICTION 2A65 +Z NOTATION RELATIONAL COMPOSITION 2A3E +Z NOTATION SCHEMA COMPOSITION 2A1F +z notation schema hiding 29F9 +Z NOTATION SCHEMA PIPING 2A20 +Z NOTATION SCHEMA PROJECTION 2A21 +z notations sequence concatenation 2040 +Z NOTATION SPOT 2981 +z notation surjective injection 2917 +Z NOTATION TYPE COLON 2982 +Zapf Dingbats Series 100, ITC 2700 +ZERO, CIRCLED DIGIT 24EA +ZERO, IDEOGRAPHIC NUMBER 3007 +ZERO, SUPERSCRIPT 2070 +ZERO WIDTH JOINER 200D +ZERO WIDTH NO-BREAK SPACE FEFF +ZERO WIDTH NON-JOINER 200C +ZERO WIDTH SPACE 200B +ZIGZAG ARROW, RIGHT ANGLE WITH DOWNWARDS 237C +ZIGZAG LINE, VERTICAL 299A +Zodiacal Symbols 2648 +zwj 200D +zwnbsp FEFF +zwnj 200C +zwsp 200B + diff --git a/Master/tlpkg/tlperl.old/lib/unicore/Jamo.txt b/Master/tlpkg/tlperl.old/lib/unicore/Jamo.txt new file mode 100644 index 00000000000..84f54bea902 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/Jamo.txt @@ -0,0 +1,92 @@ +# Jamo-4.1.0.txt +# Date: 2004-12-09, 17:48 PST [KW] +# +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html +# +# This file defines the Jamo Short Name property. +# +# See Section 3.12 of The Unicode Standard, Version 4.0 +# for more information. +# +# Each line contains two fields, separated by a semicolon. +# +# The first field gives the code point, in 4-digit hexadecimal +# form, of a combining jamo character that participates in +# the algorithmic determination Hangul syllable character names. +# The second field gives the Jamo Short Name as a one-, two-, +# or three-character ASCII string (or in one case, for U+110B, +# the null string). +# +# ############################################################# + +1100; G # HANGUL CHOSEONG KIYEOK +1101; GG # HANGUL CHOSEONG SSANGKIYEOK +1102; N # HANGUL CHOSEONG NIEUN +1103; D # HANGUL CHOSEONG TIKEUT +1104; DD # HANGUL CHOSEONG SSANGTIKEUT +1105; R # HANGUL CHOSEONG RIEUL +1106; M # HANGUL CHOSEONG MIEUM +1107; B # HANGUL CHOSEONG PIEUP +1108; BB # HANGUL CHOSEONG SSANGPIEUP +1109; S # HANGUL CHOSEONG SIOS +110A; SS # HANGUL CHOSEONG SSANGSIOS +110B; # HANGUL CHOSEONG IEUNG +110C; J # HANGUL CHOSEONG CIEUC +110D; JJ # HANGUL CHOSEONG SSANGCIEUC +110E; C # HANGUL CHOSEONG CHIEUCH +110F; K # HANGUL CHOSEONG KHIEUKH +1110; T # HANGUL CHOSEONG THIEUTH +1111; P # HANGUL CHOSEONG PHIEUPH +1112; H # HANGUL CHOSEONG HIEUH +1161; A # HANGUL JUNGSEONG A +1162; AE # HANGUL JUNGSEONG AE +1163; YA # HANGUL JUNGSEONG YA +1164; YAE # HANGUL JUNGSEONG YAE +1165; EO # HANGUL JUNGSEONG EO +1166; E # HANGUL JUNGSEONG E +1167; YEO # HANGUL JUNGSEONG YEO +1168; YE # HANGUL JUNGSEONG YE +1169; O # HANGUL JUNGSEONG O +116A; WA # HANGUL JUNGSEONG WA +116B; WAE # HANGUL JUNGSEONG WAE +116C; OE # HANGUL JUNGSEONG OE +116D; YO # HANGUL JUNGSEONG YO +116E; U # HANGUL JUNGSEONG U +116F; WEO # HANGUL JUNGSEONG WEO +1170; WE # HANGUL JUNGSEONG WE +1171; WI # HANGUL JUNGSEONG WI +1172; YU # HANGUL JUNGSEONG YU +1173; EU # HANGUL JUNGSEONG EU +1174; YI # HANGUL JUNGSEONG YI +1175; I # HANGUL JUNGSEONG I +11A8; G # HANGUL JONGSEONG KIYEOK +11A9; GG # HANGUL JONGSEONG SSANGKIYEOK +11AA; GS # HANGUL JONGSEONG KIYEOK-SIOS +11AB; N # HANGUL JONGSEONG NIEUN +11AC; NJ # HANGUL JONGSEONG NIEUN-CIEUC +11AD; NH # HANGUL JONGSEONG NIEUN-HIEUH +11AE; D # HANGUL JONGSEONG TIKEUT +11AF; L # HANGUL JONGSEONG RIEUL +11B0; LG # HANGUL JONGSEONG RIEUL-KIYEOK +11B1; LM # HANGUL JONGSEONG RIEUL-MIEUM +11B2; LB # HANGUL JONGSEONG RIEUL-PIEUP +11B3; LS # HANGUL JONGSEONG RIEUL-SIOS +11B4; LT # HANGUL JONGSEONG RIEUL-THIEUTH +11B5; LP # HANGUL JONGSEONG RIEUL-PHIEUPH +11B6; LH # HANGUL JONGSEONG RIEUL-HIEUH +11B7; M # HANGUL JONGSEONG MIEUM +11B8; B # HANGUL JONGSEONG PIEUP +11B9; BS # HANGUL JONGSEONG PIEUP-SIOS +11BA; S # HANGUL JONGSEONG SIOS +11BB; SS # HANGUL JONGSEONG SSANGSIOS +11BC; NG # HANGUL JONGSEONG IEUNG +11BD; J # HANGUL JONGSEONG CIEUC +11BE; C # HANGUL JONGSEONG CHIEUCH +11BF; K # HANGUL JONGSEONG KHIEUKH +11C0; T # HANGUL JONGSEONG THIEUTH +11C1; P # HANGUL JONGSEONG PHIEUPH +11C2; H # HANGUL JONGSEONG HIEUH + diff --git a/Master/tlpkg/tlperl.old/lib/unicore/LineBreak.txt b/Master/tlpkg/tlperl.old/lib/unicore/LineBreak.txt new file mode 100644 index 00000000000..988f1caf866 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/LineBreak.txt @@ -0,0 +1,17169 @@ +# LineBreak-4.1.0.txt +# Date: 2005-03-17, 15:21:00 PST [KW] +# +# Line Break Properties +# +# This file is a normative contributory data file in the +# Unicode Character Database. +# It contains both normative and informative data. +# +# Copyright (c) 1991-2005 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# The format is two fields separated by a semicolon. +# Field 0: Unicode value +# Field 1: LineBreak property, consisting of one of the following values: +# Normative: +# "BK", "CR", "LF", "CM", "SG", "GL", "CB", "SP", "ZW", +# "NL", "WJ", "JL", "JV", "JT", "H2", "H3" +# Informative: +# "XX", "OP", "CL", "QU", "NS", "EX", "SY", +# "IS", "PR", "PO", "NU", "AL", "ID", "IN", "HY", +# "BB", "BA", "SA", "AI", "B2" +# - All code points, assigned and unassigned, that are not listed +# explicitly 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 UAX #14: Line Breaking Properties, for more information +0000;CM # <control> +0001;CM # <control> +0002;CM # <control> +0003;CM # <control> +0004;CM # <control> +0005;CM # <control> +0006;CM # <control> +0007;CM # <control> +0008;CM # <control> +0009;BA # <control> +000A;LF # <control> +000B;CM # <control> +000C;BK # <control> +000D;CR # <control> +000E;CM # <control> +000F;CM # <control> +0010;CM # <control> +0011;CM # <control> +0012;CM # <control> +0013;CM # <control> +0014;CM # <control> +0015;CM # <control> +0016;CM # <control> +0017;CM # <control> +0018;CM # <control> +0019;CM # <control> +001A;CM # <control> +001B;CM # <control> +001C;CM # <control> +001D;CM # <control> +001E;CM # <control> +001F;CM # <control> +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 # <control> +0080;CM # <control> +0081;CM # <control> +0082;CM # <control> +0083;CM # <control> +0084;CM # <control> +0085;NL # <control> +0086;CM # <control> +0087;CM # <control> +0088;CM # <control> +0089;CM # <control> +008A;CM # <control> +008B;CM # <control> +008C;CM # <control> +008D;CM # <control> +008E;CM # <control> +008F;CM # <control> +0090;CM # <control> +0091;CM # <control> +0092;CM # <control> +0093;CM # <control> +0094;CM # <control> +0095;CM # <control> +0096;CM # <control> +0097;CM # <control> +0098;CM # <control> +0099;CM # <control> +009A;CM # <control> +009B;CM # <control> +009C;CM # <control> +009D;CM # <control> +009E;CM # <control> +009F;CM # <control> +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;AL # 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;AL # 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;AL # 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;AL # LATIN CAPITAL LETTER THORN +00DF;AL # LATIN SMALL LETTER SHARP S +00E0;AL # LATIN SMALL LETTER A WITH GRAVE +00E1;AL # 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;AL # LATIN SMALL LETTER AE +00E7;AL # LATIN SMALL LETTER C WITH CEDILLA +00E8;AL # LATIN SMALL LETTER E WITH GRAVE +00E9;AL # LATIN SMALL LETTER E WITH ACUTE +00EA;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX +00EB;AL # LATIN SMALL LETTER E WITH DIAERESIS +00EC;AL # LATIN SMALL LETTER I WITH GRAVE +00ED;AL # LATIN SMALL LETTER I WITH ACUTE +00EE;AL # LATIN SMALL LETTER I WITH CIRCUMFLEX +00EF;AL # LATIN SMALL LETTER I WITH DIAERESIS +00F0;AL # LATIN SMALL LETTER ETH +00F1;AL # LATIN SMALL LETTER N WITH TILDE +00F2;AL # LATIN SMALL LETTER O WITH GRAVE +00F3;AL # 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;AL # LATIN SMALL LETTER O WITH STROKE +00F9;AL # LATIN SMALL LETTER U WITH GRAVE +00FA;AL # LATIN SMALL LETTER U WITH ACUTE +00FB;AL # LATIN SMALL LETTER U WITH CIRCUMFLEX +00FC;AL # LATIN SMALL LETTER U WITH DIAERESIS +00FD;AL # LATIN SMALL LETTER Y WITH ACUTE +00FE;AL # LATIN SMALL LETTER THORN +00FF;AL # LATIN SMALL LETTER Y WITH DIAERESIS +0100;AL # LATIN CAPITAL LETTER A WITH MACRON +0101;AL # 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;AL # LATIN SMALL LETTER D WITH STROKE +0112;AL # LATIN CAPITAL LETTER E WITH MACRON +0113;AL # 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;AL # 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;AL # LATIN CAPITAL LETTER H WITH STROKE +0127;AL # 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;AL # 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;AL # LATIN SMALL LETTER DOTLESS I +0132;AL # LATIN CAPITAL LIGATURE IJ +0133;AL # 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;AL # 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;AL # LATIN CAPITAL LETTER L WITH MIDDLE DOT +0140;AL # LATIN SMALL LETTER L WITH MIDDLE DOT +0141;AL # LATIN CAPITAL LETTER L WITH STROKE +0142;AL # LATIN SMALL LETTER L WITH STROKE +0143;AL # LATIN CAPITAL LETTER N WITH ACUTE +0144;AL # 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;AL # LATIN SMALL LETTER N WITH CARON +0149;AL # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +014A;AL # LATIN CAPITAL LETTER ENG +014B;AL # LATIN SMALL LETTER ENG +014C;AL # LATIN CAPITAL LETTER O WITH MACRON +014D;AL # 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;AL # LATIN CAPITAL LIGATURE OE +0153;AL # 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;AL # LATIN CAPITAL LETTER T WITH STROKE +0167;AL # 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;AL # 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;AL # LATIN SMALL LETTER A WITH CARON +01CF;AL # LATIN CAPITAL LETTER I WITH CARON +01D0;AL # LATIN SMALL LETTER I WITH CARON +01D1;AL # LATIN CAPITAL LETTER O WITH CARON +01D2;AL # LATIN SMALL LETTER O WITH CARON +01D3;AL # LATIN CAPITAL LETTER U WITH CARON +01D4;AL # LATIN SMALL LETTER U WITH CARON +01D5;AL # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D6;AL # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D7;AL # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D8;AL # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01D9;AL # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DA;AL # LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01DB;AL # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DC;AL # 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 +0221;AL # LATIN SMALL LETTER D WITH CURL +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 +0234;AL # LATIN SMALL LETTER L WITH CURL +0235;AL # LATIN SMALL LETTER N WITH CURL +0236;AL # LATIN SMALL LETTER T WITH CURL +0237;AL # LATIN SMALL LETTER DOTLESS J +0238;AL # LATIN SMALL LETTER DB DIGRAPH +0239;AL # LATIN SMALL LETTER QP DIGRAPH +023A;AL # LATIN CAPITAL LETTER A WITH STROKE +023B;AL # LATIN CAPITAL LETTER C WITH STROKE +023C;AL # LATIN SMALL LETTER C WITH STROKE +023D;AL # LATIN CAPITAL LETTER L WITH BAR +023E;AL # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +023F;AL # LATIN SMALL LETTER S WITH SWASH TAIL +0240;AL # LATIN SMALL LETTER Z WITH SWASH TAIL +0241;AL # LATIN CAPITAL LETTER GLOTTAL STOP +0250;AL # LATIN SMALL LETTER TURNED A +0251;AL # 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;AL # 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 +02AE;AL # LATIN SMALL LETTER TURNED H WITH FISHHOOK +02AF;AL # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +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 +02EF;AL # MODIFIER LETTER LOW DOWN ARROWHEAD +02F0;AL # MODIFIER LETTER LOW UP ARROWHEAD +02F1;AL # MODIFIER LETTER LOW LEFT ARROWHEAD +02F2;AL # MODIFIER LETTER LOW RIGHT ARROWHEAD +02F3;AL # MODIFIER LETTER LOW RING +02F4;AL # MODIFIER LETTER MIDDLE GRAVE ACCENT +02F5;AL # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT +02F6;AL # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT +02F7;AL # MODIFIER LETTER LOW TILDE +02F8;AL # MODIFIER LETTER RAISED COLON +02F9;AL # MODIFIER LETTER BEGIN HIGH TONE +02FA;AL # MODIFIER LETTER END HIGH TONE +02FB;AL # MODIFIER LETTER BEGIN LOW TONE +02FC;AL # MODIFIER LETTER END LOW TONE +02FD;AL # MODIFIER LETTER SHELF +02FE;AL # MODIFIER LETTER OPEN SHELF +02FF;AL # MODIFIER LETTER LOW LEFT ARROW +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;GL # COMBINING GRAPHEME JOINER +0350;CM # COMBINING RIGHT ARROWHEAD ABOVE +0351;CM # COMBINING LEFT HALF RING ABOVE +0352;CM # COMBINING FERMATA +0353;CM # COMBINING X BELOW +0354;CM # COMBINING LEFT ARROWHEAD BELOW +0355;CM # COMBINING RIGHT ARROWHEAD BELOW +0356;CM # COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW +0357;CM # COMBINING RIGHT HALF RING ABOVE +0358;CM # COMBINING DOT ABOVE RIGHT +0359;CM # COMBINING ASTERISK BELOW +035A;CM # COMBINING DOUBLE RING BELOW +035B;CM # COMBINING ZIGZAG ABOVE +035C;CM # COMBINING DOUBLE BREVE BELOW +035D;GL # COMBINING DOUBLE BREVE +035E;GL # COMBINING DOUBLE MACRON +035F;GL # COMBINING DOUBLE MACRON BELOW +0360;GL # COMBINING DOUBLE TILDE +0361;GL # COMBINING DOUBLE INVERTED BREVE +0362;GL # 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;IS # 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;AL # GREEK CAPITAL LETTER ALPHA +0392;AL # GREEK CAPITAL LETTER BETA +0393;AL # GREEK CAPITAL LETTER GAMMA +0394;AL # GREEK CAPITAL LETTER DELTA +0395;AL # GREEK CAPITAL LETTER EPSILON +0396;AL # GREEK CAPITAL LETTER ZETA +0397;AL # GREEK CAPITAL LETTER ETA +0398;AL # GREEK CAPITAL LETTER THETA +0399;AL # GREEK CAPITAL LETTER IOTA +039A;AL # GREEK CAPITAL LETTER KAPPA +039B;AL # GREEK CAPITAL LETTER LAMDA +039C;AL # GREEK CAPITAL LETTER MU +039D;AL # GREEK CAPITAL LETTER NU +039E;AL # GREEK CAPITAL LETTER XI +039F;AL # GREEK CAPITAL LETTER OMICRON +03A0;AL # GREEK CAPITAL LETTER PI +03A1;AL # GREEK CAPITAL LETTER RHO +03A3;AL # GREEK CAPITAL LETTER SIGMA +03A4;AL # GREEK CAPITAL LETTER TAU +03A5;AL # GREEK CAPITAL LETTER UPSILON +03A6;AL # GREEK CAPITAL LETTER PHI +03A7;AL # GREEK CAPITAL LETTER CHI +03A8;AL # GREEK CAPITAL LETTER PSI +03A9;AL # 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;AL # GREEK SMALL LETTER ALPHA +03B2;AL # GREEK SMALL LETTER BETA +03B3;AL # GREEK SMALL LETTER GAMMA +03B4;AL # GREEK SMALL LETTER DELTA +03B5;AL # GREEK SMALL LETTER EPSILON +03B6;AL # GREEK SMALL LETTER ZETA +03B7;AL # GREEK SMALL LETTER ETA +03B8;AL # GREEK SMALL LETTER THETA +03B9;AL # GREEK SMALL LETTER IOTA +03BA;AL # GREEK SMALL LETTER KAPPA +03BB;AL # GREEK SMALL LETTER LAMDA +03BC;AL # GREEK SMALL LETTER MU +03BD;AL # GREEK SMALL LETTER NU +03BE;AL # GREEK SMALL LETTER XI +03BF;AL # GREEK SMALL LETTER OMICRON +03C0;AL # GREEK SMALL LETTER PI +03C1;AL # GREEK SMALL LETTER RHO +03C2;AL # GREEK SMALL LETTER FINAL SIGMA +03C3;AL # GREEK SMALL LETTER SIGMA +03C4;AL # GREEK SMALL LETTER TAU +03C5;AL # GREEK SMALL LETTER UPSILON +03C6;AL # GREEK SMALL LETTER PHI +03C7;AL # GREEK SMALL LETTER CHI +03C8;AL # GREEK SMALL LETTER PSI +03C9;AL # 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 +03F7;AL # GREEK CAPITAL LETTER SHO +03F8;AL # GREEK SMALL LETTER SHO +03F9;AL # GREEK CAPITAL LUNATE SIGMA SYMBOL +03FA;AL # GREEK CAPITAL LETTER SAN +03FB;AL # GREEK SMALL LETTER SAN +03FC;AL # GREEK RHO WITH STROKE SYMBOL +03FD;AL # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL +03FE;AL # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL +03FF;AL # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +0400;AL # CYRILLIC CAPITAL LETTER IE WITH GRAVE +0401;AL # 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;AL # CYRILLIC CAPITAL LETTER A +0411;AL # CYRILLIC CAPITAL LETTER BE +0412;AL # CYRILLIC CAPITAL LETTER VE +0413;AL # CYRILLIC CAPITAL LETTER GHE +0414;AL # CYRILLIC CAPITAL LETTER DE +0415;AL # CYRILLIC CAPITAL LETTER IE +0416;AL # CYRILLIC CAPITAL LETTER ZHE +0417;AL # CYRILLIC CAPITAL LETTER ZE +0418;AL # CYRILLIC CAPITAL LETTER I +0419;AL # CYRILLIC CAPITAL LETTER SHORT I +041A;AL # CYRILLIC CAPITAL LETTER KA +041B;AL # CYRILLIC CAPITAL LETTER EL +041C;AL # CYRILLIC CAPITAL LETTER EM +041D;AL # CYRILLIC CAPITAL LETTER EN +041E;AL # CYRILLIC CAPITAL LETTER O +041F;AL # CYRILLIC CAPITAL LETTER PE +0420;AL # CYRILLIC CAPITAL LETTER ER +0421;AL # CYRILLIC CAPITAL LETTER ES +0422;AL # CYRILLIC CAPITAL LETTER TE +0423;AL # CYRILLIC CAPITAL LETTER U +0424;AL # CYRILLIC CAPITAL LETTER EF +0425;AL # CYRILLIC CAPITAL LETTER HA +0426;AL # CYRILLIC CAPITAL LETTER TSE +0427;AL # CYRILLIC CAPITAL LETTER CHE +0428;AL # CYRILLIC CAPITAL LETTER SHA +0429;AL # CYRILLIC CAPITAL LETTER SHCHA +042A;AL # CYRILLIC CAPITAL LETTER HARD SIGN +042B;AL # CYRILLIC CAPITAL LETTER YERU +042C;AL # CYRILLIC CAPITAL LETTER SOFT SIGN +042D;AL # CYRILLIC CAPITAL LETTER E +042E;AL # CYRILLIC CAPITAL LETTER YU +042F;AL # CYRILLIC CAPITAL LETTER YA +0430;AL # CYRILLIC SMALL LETTER A +0431;AL # CYRILLIC SMALL LETTER BE +0432;AL # CYRILLIC SMALL LETTER VE +0433;AL # CYRILLIC SMALL LETTER GHE +0434;AL # CYRILLIC SMALL LETTER DE +0435;AL # CYRILLIC SMALL LETTER IE +0436;AL # CYRILLIC SMALL LETTER ZHE +0437;AL # CYRILLIC SMALL LETTER ZE +0438;AL # CYRILLIC SMALL LETTER I +0439;AL # CYRILLIC SMALL LETTER SHORT I +043A;AL # CYRILLIC SMALL LETTER KA +043B;AL # CYRILLIC SMALL LETTER EL +043C;AL # CYRILLIC SMALL LETTER EM +043D;AL # CYRILLIC SMALL LETTER EN +043E;AL # CYRILLIC SMALL LETTER O +043F;AL # CYRILLIC SMALL LETTER PE +0440;AL # CYRILLIC SMALL LETTER ER +0441;AL # CYRILLIC SMALL LETTER ES +0442;AL # CYRILLIC SMALL LETTER TE +0443;AL # CYRILLIC SMALL LETTER U +0444;AL # CYRILLIC SMALL LETTER EF +0445;AL # CYRILLIC SMALL LETTER HA +0446;AL # CYRILLIC SMALL LETTER TSE +0447;AL # CYRILLIC SMALL LETTER CHE +0448;AL # CYRILLIC SMALL LETTER SHA +0449;AL # CYRILLIC SMALL LETTER SHCHA +044A;AL # CYRILLIC SMALL LETTER HARD SIGN +044B;AL # CYRILLIC SMALL LETTER YERU +044C;AL # CYRILLIC SMALL LETTER SOFT SIGN +044D;AL # CYRILLIC SMALL LETTER E +044E;AL # CYRILLIC SMALL LETTER YU +044F;AL # CYRILLIC SMALL LETTER YA +0450;AL # CYRILLIC SMALL LETTER IE WITH GRAVE +0451;AL # 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 +04F6;AL # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +04F7;AL # CYRILLIC SMALL LETTER GHE WITH DESCENDER +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 +05A2;CM # HEBREW ACCENT ATNAH HAFUKH +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 +05C5;CM # HEBREW MARK LOWER DOT +05C6;EX # HEBREW PUNCTUATION NUN HAFUKHA +05C7;CM # HEBREW POINT QAMATS QATAN +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 +0600;AL # ARABIC NUMBER SIGN +0601;AL # ARABIC SIGN SANAH +0602;AL # ARABIC FOOTNOTE MARKER +0603;AL # ARABIC SIGN SAFHA +060B;PO # AFGHANI SIGN +060C;EX # ARABIC COMMA +060D;IS # ARABIC DATE SEPARATOR +060E;AL # ARABIC POETIC VERSE SIGN +060F;AL # ARABIC SIGN MISRA +0610;CM # ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM +0611;CM # ARABIC SIGN ALAYHE ASSALLAM +0612;CM # ARABIC SIGN RAHMATULLAH ALAYHE +0613;CM # ARABIC SIGN RADI ALLAHOU ANHU +0614;CM # ARABIC SIGN TAKHALLUS +0615;CM # ARABIC SMALL HIGH TAH +061B;EX # ARABIC SEMICOLON +061E;EX # ARABIC TRIPLE DOT PUNCTUATION MARK +061F;EX # 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 +0656;CM # ARABIC SUBSCRIPT ALEF +0657;CM # ARABIC INVERTED DAMMA +0658;CM # ARABIC MARK NOON GHUNNA +0659;CM # ARABIC ZWARAKAY +065A;CM # ARABIC VOWEL SIGN SMALL V ABOVE +065B;CM # ARABIC VOWEL SIGN INVERTED SMALL V ABOVE +065C;CM # ARABIC VOWEL SIGN DOT BELOW +065D;CM # ARABIC REVERSED DAMMA +065E;CM # ARABIC FATHA WITH TWO DOTS +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;EX # ARABIC PERCENT SIGN +066B;NU # ARABIC DECIMAL SEPARATOR +066C;NU # 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;EX # 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;AL # 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 +06EE;AL # ARABIC LETTER DAL WITH INVERTED V +06EF;AL # ARABIC LETTER REH WITH INVERTED V +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 +06FF;AL # ARABIC LETTER HEH WITH INVERTED V +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;AL # 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 +072D;AL # SYRIAC LETTER PERSIAN BHETH +072E;AL # SYRIAC LETTER PERSIAN GHAMAL +072F;AL # SYRIAC LETTER PERSIAN DHALATH +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 +074D;AL # SYRIAC LETTER SOGDIAN ZHAIN +074E;AL # SYRIAC LETTER SOGDIAN KHAPH +074F;AL # SYRIAC LETTER SOGDIAN FE +0750;AL # ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW +0751;AL # ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE +0752;AL # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW +0753;AL # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE +0754;AL # ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE +0755;AL # ARABIC LETTER BEH WITH INVERTED SMALL V BELOW +0756;AL # ARABIC LETTER BEH WITH SMALL V +0757;AL # ARABIC LETTER HAH WITH TWO DOTS ABOVE +0758;AL # ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW +0759;AL # ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH +075A;AL # ARABIC LETTER DAL WITH INVERTED SMALL V BELOW +075B;AL # ARABIC LETTER REH WITH STROKE +075C;AL # ARABIC LETTER SEEN WITH FOUR DOTS ABOVE +075D;AL # ARABIC LETTER AIN WITH TWO DOTS ABOVE +075E;AL # ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE +075F;AL # ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE +0760;AL # ARABIC LETTER FEH WITH TWO DOTS BELOW +0761;AL # ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW +0762;AL # ARABIC LETTER KEHEH WITH DOT ABOVE +0763;AL # ARABIC LETTER KEHEH WITH THREE DOTS ABOVE +0764;AL # ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW +0765;AL # ARABIC LETTER MEEM WITH DOT ABOVE +0766;AL # ARABIC LETTER MEEM WITH DOT BELOW +0767;AL # ARABIC LETTER NOON WITH TWO DOTS BELOW +0768;AL # ARABIC LETTER NOON WITH SMALL TAH +0769;AL # ARABIC LETTER NOON WITH SMALL V +076A;AL # ARABIC LETTER LAM WITH BAR +076B;AL # ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE +076C;AL # ARABIC LETTER REH WITH HAMZA ABOVE +076D;AL # ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE +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 +0904;AL # DEVANAGARI LETTER SHORT A +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;BA # DEVANAGARI DANDA +0965;BA # 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 +097D;AL # DEVANAGARI LETTER GLOTTAL STOP +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 +09BD;AL # BENGALI SIGN AVAGRAHA +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 +09CE;AL # BENGALI LETTER KHANDA TA +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 +0A01;CM # GURMUKHI SIGN ADAK BINDI +0A02;CM # GURMUKHI SIGN BINDI +0A03;CM # GURMUKHI SIGN VISARGA +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 +0A8C;AL # GUJARATI LETTER VOCALIC L +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 +0AE1;AL # GUJARATI LETTER VOCALIC LL +0AE2;CM # GUJARATI VOWEL SIGN VOCALIC L +0AE3;CM # GUJARATI VOWEL SIGN VOCALIC LL +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 +0AF1;PR # GUJARATI RUPEE SIGN +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 +0B35;AL # ORIYA LETTER VA +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 +0B71;AL # ORIYA LETTER WA +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 +0BB6;AL # TAMIL LETTER SHA +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 +0BE6;NU # TAMIL DIGIT ZERO +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 +0BF3;AL # TAMIL DAY SIGN +0BF4;AL # TAMIL MONTH SIGN +0BF5;AL # TAMIL YEAR SIGN +0BF6;AL # TAMIL DEBIT SIGN +0BF7;AL # TAMIL CREDIT SIGN +0BF8;AL # TAMIL AS ABOVE SIGN +0BF9;PR # TAMIL RUPEE SIGN +0BFA;AL # TAMIL NUMBER SIGN +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 +0CBC;CM # KANNADA SIGN NUKTA +0CBD;AL # KANNADA SIGN AVAGRAHA +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;BA # THAI CHARACTER ANGKHANKHU +0E5B;BA # 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;BB # TIBETAN MARK GTER YIG MGO TRUNCATED A +0F02;BB # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA +0F03;BB # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04;BB # TIBETAN MARK INITIAL YIG MGO MDUN MA +0F05;AL # TIBETAN MARK CLOSING YIG MGO SGAB MA +0F06;BB # TIBETAN MARK CARET YIG MGO PHUR SHAD MA +0F07;BB # TIBETAN MARK YIG MGO TSHEG SHAD MA +0F08;GL # TIBETAN MARK SBRUL SHAD +0F09;BB # TIBETAN MARK BSKUR YIG MGO +0F0A;BB # TIBETAN MARK BKA- SHOG YIG MGO +0F0B;BA # TIBETAN MARK INTERSYLLABIC TSHEG +0F0C;GL # TIBETAN MARK DELIMITER TSHEG BSTAR +0F0D;EX # TIBETAN MARK SHAD +0F0E;EX # TIBETAN MARK NYIS SHAD +0F0F;EX # TIBETAN MARK TSHEG SHAD +0F10;EX # TIBETAN MARK NYIS TSHEG SHAD +0F11;EX # TIBETAN MARK RIN CHEN SPUNGS SHAD +0F12;GL # TIBETAN MARK RGYA GRAM SHAD +0F13;AL # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +0F14;EX # 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;BA # 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;BA # 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;BA # 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;BA # TIBETAN KU RU KHA +0FBF;BA # 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 +0FD0;BB # TIBETAN MARK BSKA- SHOG GI MGO RGYAN +0FD1;BB # TIBETAN MARK MNYAM YIG GI MGO RGYAN +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;BA # MYANMAR SIGN LITTLE SECTION +104B;BA # 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 +10F9;AL # GEORGIAN LETTER TURNED GAN +10FA;AL # GEORGIAN LETTER AIN +10FB;AL # GEORGIAN PARAGRAPH SEPARATOR +10FC;AL # MODIFIER LETTER GEORGIAN NAR +1100;JL # HANGUL CHOSEONG KIYEOK +1101;JL # HANGUL CHOSEONG SSANGKIYEOK +1102;JL # HANGUL CHOSEONG NIEUN +1103;JL # HANGUL CHOSEONG TIKEUT +1104;JL # HANGUL CHOSEONG SSANGTIKEUT +1105;JL # HANGUL CHOSEONG RIEUL +1106;JL # HANGUL CHOSEONG MIEUM +1107;JL # HANGUL CHOSEONG PIEUP +1108;JL # HANGUL CHOSEONG SSANGPIEUP +1109;JL # HANGUL CHOSEONG SIOS +110A;JL # HANGUL CHOSEONG SSANGSIOS +110B;JL # HANGUL CHOSEONG IEUNG +110C;JL # HANGUL CHOSEONG CIEUC +110D;JL # HANGUL CHOSEONG SSANGCIEUC +110E;JL # HANGUL CHOSEONG CHIEUCH +110F;JL # HANGUL CHOSEONG KHIEUKH +1110;JL # HANGUL CHOSEONG THIEUTH +1111;JL # HANGUL CHOSEONG PHIEUPH +1112;JL # HANGUL CHOSEONG HIEUH +1113;JL # HANGUL CHOSEONG NIEUN-KIYEOK +1114;JL # HANGUL CHOSEONG SSANGNIEUN +1115;JL # HANGUL CHOSEONG NIEUN-TIKEUT +1116;JL # HANGUL CHOSEONG NIEUN-PIEUP +1117;JL # HANGUL CHOSEONG TIKEUT-KIYEOK +1118;JL # HANGUL CHOSEONG RIEUL-NIEUN +1119;JL # HANGUL CHOSEONG SSANGRIEUL +111A;JL # HANGUL CHOSEONG RIEUL-HIEUH +111B;JL # HANGUL CHOSEONG KAPYEOUNRIEUL +111C;JL # HANGUL CHOSEONG MIEUM-PIEUP +111D;JL # HANGUL CHOSEONG KAPYEOUNMIEUM +111E;JL # HANGUL CHOSEONG PIEUP-KIYEOK +111F;JL # HANGUL CHOSEONG PIEUP-NIEUN +1120;JL # HANGUL CHOSEONG PIEUP-TIKEUT +1121;JL # HANGUL CHOSEONG PIEUP-SIOS +1122;JL # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK +1123;JL # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT +1124;JL # HANGUL CHOSEONG PIEUP-SIOS-PIEUP +1125;JL # HANGUL CHOSEONG PIEUP-SSANGSIOS +1126;JL # HANGUL CHOSEONG PIEUP-SIOS-CIEUC +1127;JL # HANGUL CHOSEONG PIEUP-CIEUC +1128;JL # HANGUL CHOSEONG PIEUP-CHIEUCH +1129;JL # HANGUL CHOSEONG PIEUP-THIEUTH +112A;JL # HANGUL CHOSEONG PIEUP-PHIEUPH +112B;JL # HANGUL CHOSEONG KAPYEOUNPIEUP +112C;JL # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP +112D;JL # HANGUL CHOSEONG SIOS-KIYEOK +112E;JL # HANGUL CHOSEONG SIOS-NIEUN +112F;JL # HANGUL CHOSEONG SIOS-TIKEUT +1130;JL # HANGUL CHOSEONG SIOS-RIEUL +1131;JL # HANGUL CHOSEONG SIOS-MIEUM +1132;JL # HANGUL CHOSEONG SIOS-PIEUP +1133;JL # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK +1134;JL # HANGUL CHOSEONG SIOS-SSANGSIOS +1135;JL # HANGUL CHOSEONG SIOS-IEUNG +1136;JL # HANGUL CHOSEONG SIOS-CIEUC +1137;JL # HANGUL CHOSEONG SIOS-CHIEUCH +1138;JL # HANGUL CHOSEONG SIOS-KHIEUKH +1139;JL # HANGUL CHOSEONG SIOS-THIEUTH +113A;JL # HANGUL CHOSEONG SIOS-PHIEUPH +113B;JL # HANGUL CHOSEONG SIOS-HIEUH +113C;JL # HANGUL CHOSEONG CHITUEUMSIOS +113D;JL # HANGUL CHOSEONG CHITUEUMSSANGSIOS +113E;JL # HANGUL CHOSEONG CEONGCHIEUMSIOS +113F;JL # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS +1140;JL # HANGUL CHOSEONG PANSIOS +1141;JL # HANGUL CHOSEONG IEUNG-KIYEOK +1142;JL # HANGUL CHOSEONG IEUNG-TIKEUT +1143;JL # HANGUL CHOSEONG IEUNG-MIEUM +1144;JL # HANGUL CHOSEONG IEUNG-PIEUP +1145;JL # HANGUL CHOSEONG IEUNG-SIOS +1146;JL # HANGUL CHOSEONG IEUNG-PANSIOS +1147;JL # HANGUL CHOSEONG SSANGIEUNG +1148;JL # HANGUL CHOSEONG IEUNG-CIEUC +1149;JL # HANGUL CHOSEONG IEUNG-CHIEUCH +114A;JL # HANGUL CHOSEONG IEUNG-THIEUTH +114B;JL # HANGUL CHOSEONG IEUNG-PHIEUPH +114C;JL # HANGUL CHOSEONG YESIEUNG +114D;JL # HANGUL CHOSEONG CIEUC-IEUNG +114E;JL # HANGUL CHOSEONG CHITUEUMCIEUC +114F;JL # HANGUL CHOSEONG CHITUEUMSSANGCIEUC +1150;JL # HANGUL CHOSEONG CEONGCHIEUMCIEUC +1151;JL # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC +1152;JL # HANGUL CHOSEONG CHIEUCH-KHIEUKH +1153;JL # HANGUL CHOSEONG CHIEUCH-HIEUH +1154;JL # HANGUL CHOSEONG CHITUEUMCHIEUCH +1155;JL # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH +1156;JL # HANGUL CHOSEONG PHIEUPH-PIEUP +1157;JL # HANGUL CHOSEONG KAPYEOUNPHIEUPH +1158;JL # HANGUL CHOSEONG SSANGHIEUH +1159;JL # HANGUL CHOSEONG YEORINHIEUH +115F;JL # HANGUL CHOSEONG FILLER +1160;JV # HANGUL JUNGSEONG FILLER +1161;JV # HANGUL JUNGSEONG A +1162;JV # HANGUL JUNGSEONG AE +1163;JV # HANGUL JUNGSEONG YA +1164;JV # HANGUL JUNGSEONG YAE +1165;JV # HANGUL JUNGSEONG EO +1166;JV # HANGUL JUNGSEONG E +1167;JV # HANGUL JUNGSEONG YEO +1168;JV # HANGUL JUNGSEONG YE +1169;JV # HANGUL JUNGSEONG O +116A;JV # HANGUL JUNGSEONG WA +116B;JV # HANGUL JUNGSEONG WAE +116C;JV # HANGUL JUNGSEONG OE +116D;JV # HANGUL JUNGSEONG YO +116E;JV # HANGUL JUNGSEONG U +116F;JV # HANGUL JUNGSEONG WEO +1170;JV # HANGUL JUNGSEONG WE +1171;JV # HANGUL JUNGSEONG WI +1172;JV # HANGUL JUNGSEONG YU +1173;JV # HANGUL JUNGSEONG EU +1174;JV # HANGUL JUNGSEONG YI +1175;JV # HANGUL JUNGSEONG I +1176;JV # HANGUL JUNGSEONG A-O +1177;JV # HANGUL JUNGSEONG A-U +1178;JV # HANGUL JUNGSEONG YA-O +1179;JV # HANGUL JUNGSEONG YA-YO +117A;JV # HANGUL JUNGSEONG EO-O +117B;JV # HANGUL JUNGSEONG EO-U +117C;JV # HANGUL JUNGSEONG EO-EU +117D;JV # HANGUL JUNGSEONG YEO-O +117E;JV # HANGUL JUNGSEONG YEO-U +117F;JV # HANGUL JUNGSEONG O-EO +1180;JV # HANGUL JUNGSEONG O-E +1181;JV # HANGUL JUNGSEONG O-YE +1182;JV # HANGUL JUNGSEONG O-O +1183;JV # HANGUL JUNGSEONG O-U +1184;JV # HANGUL JUNGSEONG YO-YA +1185;JV # HANGUL JUNGSEONG YO-YAE +1186;JV # HANGUL JUNGSEONG YO-YEO +1187;JV # HANGUL JUNGSEONG YO-O +1188;JV # HANGUL JUNGSEONG YO-I +1189;JV # HANGUL JUNGSEONG U-A +118A;JV # HANGUL JUNGSEONG U-AE +118B;JV # HANGUL JUNGSEONG U-EO-EU +118C;JV # HANGUL JUNGSEONG U-YE +118D;JV # HANGUL JUNGSEONG U-U +118E;JV # HANGUL JUNGSEONG YU-A +118F;JV # HANGUL JUNGSEONG YU-EO +1190;JV # HANGUL JUNGSEONG YU-E +1191;JV # HANGUL JUNGSEONG YU-YEO +1192;JV # HANGUL JUNGSEONG YU-YE +1193;JV # HANGUL JUNGSEONG YU-U +1194;JV # HANGUL JUNGSEONG YU-I +1195;JV # HANGUL JUNGSEONG EU-U +1196;JV # HANGUL JUNGSEONG EU-EU +1197;JV # HANGUL JUNGSEONG YI-U +1198;JV # HANGUL JUNGSEONG I-A +1199;JV # HANGUL JUNGSEONG I-YA +119A;JV # HANGUL JUNGSEONG I-O +119B;JV # HANGUL JUNGSEONG I-U +119C;JV # HANGUL JUNGSEONG I-EU +119D;JV # HANGUL JUNGSEONG I-ARAEA +119E;JV # HANGUL JUNGSEONG ARAEA +119F;JV # HANGUL JUNGSEONG ARAEA-EO +11A0;JV # HANGUL JUNGSEONG ARAEA-U +11A1;JV # HANGUL JUNGSEONG ARAEA-I +11A2;JV # HANGUL JUNGSEONG SSANGARAEA +11A8;JT # HANGUL JONGSEONG KIYEOK +11A9;JT # HANGUL JONGSEONG SSANGKIYEOK +11AA;JT # HANGUL JONGSEONG KIYEOK-SIOS +11AB;JT # HANGUL JONGSEONG NIEUN +11AC;JT # HANGUL JONGSEONG NIEUN-CIEUC +11AD;JT # HANGUL JONGSEONG NIEUN-HIEUH +11AE;JT # HANGUL JONGSEONG TIKEUT +11AF;JT # HANGUL JONGSEONG RIEUL +11B0;JT # HANGUL JONGSEONG RIEUL-KIYEOK +11B1;JT # HANGUL JONGSEONG RIEUL-MIEUM +11B2;JT # HANGUL JONGSEONG RIEUL-PIEUP +11B3;JT # HANGUL JONGSEONG RIEUL-SIOS +11B4;JT # HANGUL JONGSEONG RIEUL-THIEUTH +11B5;JT # HANGUL JONGSEONG RIEUL-PHIEUPH +11B6;JT # HANGUL JONGSEONG RIEUL-HIEUH +11B7;JT # HANGUL JONGSEONG MIEUM +11B8;JT # HANGUL JONGSEONG PIEUP +11B9;JT # HANGUL JONGSEONG PIEUP-SIOS +11BA;JT # HANGUL JONGSEONG SIOS +11BB;JT # HANGUL JONGSEONG SSANGSIOS +11BC;JT # HANGUL JONGSEONG IEUNG +11BD;JT # HANGUL JONGSEONG CIEUC +11BE;JT # HANGUL JONGSEONG CHIEUCH +11BF;JT # HANGUL JONGSEONG KHIEUKH +11C0;JT # HANGUL JONGSEONG THIEUTH +11C1;JT # HANGUL JONGSEONG PHIEUPH +11C2;JT # HANGUL JONGSEONG HIEUH +11C3;JT # HANGUL JONGSEONG KIYEOK-RIEUL +11C4;JT # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK +11C5;JT # HANGUL JONGSEONG NIEUN-KIYEOK +11C6;JT # HANGUL JONGSEONG NIEUN-TIKEUT +11C7;JT # HANGUL JONGSEONG NIEUN-SIOS +11C8;JT # HANGUL JONGSEONG NIEUN-PANSIOS +11C9;JT # HANGUL JONGSEONG NIEUN-THIEUTH +11CA;JT # HANGUL JONGSEONG TIKEUT-KIYEOK +11CB;JT # HANGUL JONGSEONG TIKEUT-RIEUL +11CC;JT # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS +11CD;JT # HANGUL JONGSEONG RIEUL-NIEUN +11CE;JT # HANGUL JONGSEONG RIEUL-TIKEUT +11CF;JT # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH +11D0;JT # HANGUL JONGSEONG SSANGRIEUL +11D1;JT # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK +11D2;JT # HANGUL JONGSEONG RIEUL-MIEUM-SIOS +11D3;JT # HANGUL JONGSEONG RIEUL-PIEUP-SIOS +11D4;JT # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH +11D5;JT # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP +11D6;JT # HANGUL JONGSEONG RIEUL-SSANGSIOS +11D7;JT # HANGUL JONGSEONG RIEUL-PANSIOS +11D8;JT # HANGUL JONGSEONG RIEUL-KHIEUKH +11D9;JT # HANGUL JONGSEONG RIEUL-YEORINHIEUH +11DA;JT # HANGUL JONGSEONG MIEUM-KIYEOK +11DB;JT # HANGUL JONGSEONG MIEUM-RIEUL +11DC;JT # HANGUL JONGSEONG MIEUM-PIEUP +11DD;JT # HANGUL JONGSEONG MIEUM-SIOS +11DE;JT # HANGUL JONGSEONG MIEUM-SSANGSIOS +11DF;JT # HANGUL JONGSEONG MIEUM-PANSIOS +11E0;JT # HANGUL JONGSEONG MIEUM-CHIEUCH +11E1;JT # HANGUL JONGSEONG MIEUM-HIEUH +11E2;JT # HANGUL JONGSEONG KAPYEOUNMIEUM +11E3;JT # HANGUL JONGSEONG PIEUP-RIEUL +11E4;JT # HANGUL JONGSEONG PIEUP-PHIEUPH +11E5;JT # HANGUL JONGSEONG PIEUP-HIEUH +11E6;JT # HANGUL JONGSEONG KAPYEOUNPIEUP +11E7;JT # HANGUL JONGSEONG SIOS-KIYEOK +11E8;JT # HANGUL JONGSEONG SIOS-TIKEUT +11E9;JT # HANGUL JONGSEONG SIOS-RIEUL +11EA;JT # HANGUL JONGSEONG SIOS-PIEUP +11EB;JT # HANGUL JONGSEONG PANSIOS +11EC;JT # HANGUL JONGSEONG IEUNG-KIYEOK +11ED;JT # HANGUL JONGSEONG IEUNG-SSANGKIYEOK +11EE;JT # HANGUL JONGSEONG SSANGIEUNG +11EF;JT # HANGUL JONGSEONG IEUNG-KHIEUKH +11F0;JT # HANGUL JONGSEONG YESIEUNG +11F1;JT # HANGUL JONGSEONG YESIEUNG-SIOS +11F2;JT # HANGUL JONGSEONG YESIEUNG-PANSIOS +11F3;JT # HANGUL JONGSEONG PHIEUPH-PIEUP +11F4;JT # HANGUL JONGSEONG KAPYEOUNPHIEUPH +11F5;JT # HANGUL JONGSEONG HIEUH-NIEUN +11F6;JT # HANGUL JONGSEONG HIEUH-RIEUL +11F7;JT # HANGUL JONGSEONG HIEUH-MIEUM +11F8;JT # HANGUL JONGSEONG HIEUH-PIEUP +11F9;JT # 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 +1207;AL # ETHIOPIC SYLLABLE HOA +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 +1247;AL # ETHIOPIC SYLLABLE QOA +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 +1287;AL # ETHIOPIC SYLLABLE XOA +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 +12AF;AL # ETHIOPIC SYLLABLE KOA +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 +12CF;AL # ETHIOPIC SYLLABLE WOA +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 +12EF;AL # ETHIOPIC SYLLABLE YOA +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 +130F;AL # ETHIOPIC SYLLABLE GOA +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 +131F;AL # ETHIOPIC SYLLABLE GGWAA +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 +1347;AL # ETHIOPIC SYLLABLE TZOA +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 +135F;CM # ETHIOPIC COMBINING GEMINATION MARK +1360;AL # ETHIOPIC SECTION MARK +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;AL # ETHIOPIC DIGIT ONE +136A;AL # ETHIOPIC DIGIT TWO +136B;AL # ETHIOPIC DIGIT THREE +136C;AL # ETHIOPIC DIGIT FOUR +136D;AL # ETHIOPIC DIGIT FIVE +136E;AL # ETHIOPIC DIGIT SIX +136F;AL # ETHIOPIC DIGIT SEVEN +1370;AL # ETHIOPIC DIGIT EIGHT +1371;AL # 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 +1380;AL # ETHIOPIC SYLLABLE SEBATBEIT MWA +1381;AL # ETHIOPIC SYLLABLE MWI +1382;AL # ETHIOPIC SYLLABLE MWEE +1383;AL # ETHIOPIC SYLLABLE MWE +1384;AL # ETHIOPIC SYLLABLE SEBATBEIT BWA +1385;AL # ETHIOPIC SYLLABLE BWI +1386;AL # ETHIOPIC SYLLABLE BWEE +1387;AL # ETHIOPIC SYLLABLE BWE +1388;AL # ETHIOPIC SYLLABLE SEBATBEIT FWA +1389;AL # ETHIOPIC SYLLABLE FWI +138A;AL # ETHIOPIC SYLLABLE FWEE +138B;AL # ETHIOPIC SYLLABLE FWE +138C;AL # ETHIOPIC SYLLABLE SEBATBEIT PWA +138D;AL # ETHIOPIC SYLLABLE PWI +138E;AL # ETHIOPIC SYLLABLE PWEE +138F;AL # ETHIOPIC SYLLABLE PWE +1390;AL # ETHIOPIC TONAL MARK YIZET +1391;AL # ETHIOPIC TONAL MARK DERET +1392;AL # ETHIOPIC TONAL MARK RIKRIK +1393;AL # ETHIOPIC TONAL MARK SHORT RIKRIK +1394;AL # ETHIOPIC TONAL MARK DIFAT +1395;AL # ETHIOPIC TONAL MARK KENAT +1396;AL # ETHIOPIC TONAL MARK CHIRET +1397;AL # ETHIOPIC TONAL MARK HIDET +1398;AL # ETHIOPIC TONAL MARK DERET-HIDET +1399;AL # ETHIOPIC TONAL MARK KURT +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;BA # RUNIC SINGLE PUNCTUATION +16EC;BA # RUNIC MULTIPLE PUNCTUATION +16ED;BA # 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;SA # KHMER VOWEL INHERENT AQ +17B5;SA # 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;BA # KHMER SIGN KHAN +17D5;BA # KHMER SIGN BARIYOOSAN +17D6;NS # KHMER SIGN CAMNUC PII KUUH +17D7;NS # KHMER SIGN LEK TOO +17D8;BA # KHMER SIGN BEYYAL +17D9;NS # KHMER SIGN PHNAEK MUAN +17DA;BA # KHMER SIGN KOOMUUT +17DB;PR # KHMER CURRENCY SYMBOL RIEL +17DC;AL # KHMER SIGN AVAKRAHASANYA +17DD;CM # KHMER SIGN ATTHACAN +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 +17F0;AL # KHMER SYMBOL LEK ATTAK SON +17F1;AL # KHMER SYMBOL LEK ATTAK MUOY +17F2;AL # KHMER SYMBOL LEK ATTAK PII +17F3;AL # KHMER SYMBOL LEK ATTAK BEI +17F4;AL # KHMER SYMBOL LEK ATTAK BUON +17F5;AL # KHMER SYMBOL LEK ATTAK PRAM +17F6;AL # KHMER SYMBOL LEK ATTAK PRAM-MUOY +17F7;AL # KHMER SYMBOL LEK ATTAK PRAM-PII +17F8;AL # KHMER SYMBOL LEK ATTAK PRAM-BEI +17F9;AL # KHMER SYMBOL LEK ATTAK PRAM-BUON +1800;AL # MONGOLIAN BIRGA +1801;AL # MONGOLIAN ELLIPSIS +1802;BA # MONGOLIAN COMMA +1803;BA # MONGOLIAN FULL STOP +1804;BA # MONGOLIAN COLON +1805;BA # MONGOLIAN FOUR DOTS +1806;BB # MONGOLIAN TODO SOFT HYPHEN +1807;AL # MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER +1808;BA # MONGOLIAN MANCHU COMMA +1809;BA # 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;GL # 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 +1900;AL # LIMBU VOWEL-CARRIER LETTER +1901;AL # LIMBU LETTER KA +1902;AL # LIMBU LETTER KHA +1903;AL # LIMBU LETTER GA +1904;AL # LIMBU LETTER GHA +1905;AL # LIMBU LETTER NGA +1906;AL # LIMBU LETTER CA +1907;AL # LIMBU LETTER CHA +1908;AL # LIMBU LETTER JA +1909;AL # LIMBU LETTER JHA +190A;AL # LIMBU LETTER YAN +190B;AL # LIMBU LETTER TA +190C;AL # LIMBU LETTER THA +190D;AL # LIMBU LETTER DA +190E;AL # LIMBU LETTER DHA +190F;AL # LIMBU LETTER NA +1910;AL # LIMBU LETTER PA +1911;AL # LIMBU LETTER PHA +1912;AL # LIMBU LETTER BA +1913;AL # LIMBU LETTER BHA +1914;AL # LIMBU LETTER MA +1915;AL # LIMBU LETTER YA +1916;AL # LIMBU LETTER RA +1917;AL # LIMBU LETTER LA +1918;AL # LIMBU LETTER WA +1919;AL # LIMBU LETTER SHA +191A;AL # LIMBU LETTER SSA +191B;AL # LIMBU LETTER SA +191C;AL # LIMBU LETTER HA +1920;CM # LIMBU VOWEL SIGN A +1921;CM # LIMBU VOWEL SIGN I +1922;CM # LIMBU VOWEL SIGN U +1923;CM # LIMBU VOWEL SIGN EE +1924;CM # LIMBU VOWEL SIGN AI +1925;CM # LIMBU VOWEL SIGN OO +1926;CM # LIMBU VOWEL SIGN AU +1927;CM # LIMBU VOWEL SIGN E +1928;CM # LIMBU VOWEL SIGN O +1929;CM # LIMBU SUBJOINED LETTER YA +192A;CM # LIMBU SUBJOINED LETTER RA +192B;CM # LIMBU SUBJOINED LETTER WA +1930;CM # LIMBU SMALL LETTER KA +1931;CM # LIMBU SMALL LETTER NGA +1932;CM # LIMBU SMALL LETTER ANUSVARA +1933;CM # LIMBU SMALL LETTER TA +1934;CM # LIMBU SMALL LETTER NA +1935;CM # LIMBU SMALL LETTER PA +1936;CM # LIMBU SMALL LETTER MA +1937;CM # LIMBU SMALL LETTER RA +1938;CM # LIMBU SMALL LETTER LA +1939;CM # LIMBU SIGN MUKPHRENG +193A;CM # LIMBU SIGN KEMPHRENG +193B;CM # LIMBU SIGN SA-I +1940;AL # LIMBU SIGN LOO +1944;EX # LIMBU EXCLAMATION MARK +1945;EX # LIMBU QUESTION MARK +1946;NU # LIMBU DIGIT ZERO +1947;NU # LIMBU DIGIT ONE +1948;NU # LIMBU DIGIT TWO +1949;NU # LIMBU DIGIT THREE +194A;NU # LIMBU DIGIT FOUR +194B;NU # LIMBU DIGIT FIVE +194C;NU # LIMBU DIGIT SIX +194D;NU # LIMBU DIGIT SEVEN +194E;NU # LIMBU DIGIT EIGHT +194F;NU # LIMBU DIGIT NINE +1950;AL # TAI LE LETTER KA +1951;AL # TAI LE LETTER XA +1952;AL # TAI LE LETTER NGA +1953;AL # TAI LE LETTER TSA +1954;AL # TAI LE LETTER SA +1955;AL # TAI LE LETTER YA +1956;AL # TAI LE LETTER TA +1957;AL # TAI LE LETTER THA +1958;AL # TAI LE LETTER LA +1959;AL # TAI LE LETTER PA +195A;AL # TAI LE LETTER PHA +195B;AL # TAI LE LETTER MA +195C;AL # TAI LE LETTER FA +195D;AL # TAI LE LETTER VA +195E;AL # TAI LE LETTER HA +195F;AL # TAI LE LETTER QA +1960;AL # TAI LE LETTER KHA +1961;AL # TAI LE LETTER TSHA +1962;AL # TAI LE LETTER NA +1963;AL # TAI LE LETTER A +1964;AL # TAI LE LETTER I +1965;AL # TAI LE LETTER EE +1966;AL # TAI LE LETTER EH +1967;AL # TAI LE LETTER U +1968;AL # TAI LE LETTER OO +1969;AL # TAI LE LETTER O +196A;AL # TAI LE LETTER UE +196B;AL # TAI LE LETTER E +196C;AL # TAI LE LETTER AUE +196D;AL # TAI LE LETTER AI +1970;AL # TAI LE LETTER TONE-2 +1971;AL # TAI LE LETTER TONE-3 +1972;AL # TAI LE LETTER TONE-4 +1973;AL # TAI LE LETTER TONE-5 +1974;AL # TAI LE LETTER TONE-6 +1980;AL # NEW TAI LUE LETTER HIGH QA +1981;AL # NEW TAI LUE LETTER LOW QA +1982;AL # NEW TAI LUE LETTER HIGH KA +1983;AL # NEW TAI LUE LETTER HIGH XA +1984;AL # NEW TAI LUE LETTER HIGH NGA +1985;AL # NEW TAI LUE LETTER LOW KA +1986;AL # NEW TAI LUE LETTER LOW XA +1987;AL # NEW TAI LUE LETTER LOW NGA +1988;AL # NEW TAI LUE LETTER HIGH TSA +1989;AL # NEW TAI LUE LETTER HIGH SA +198A;AL # NEW TAI LUE LETTER HIGH YA +198B;AL # NEW TAI LUE LETTER LOW TSA +198C;AL # NEW TAI LUE LETTER LOW SA +198D;AL # NEW TAI LUE LETTER LOW YA +198E;AL # NEW TAI LUE LETTER HIGH TA +198F;AL # NEW TAI LUE LETTER HIGH THA +1990;AL # NEW TAI LUE LETTER HIGH NA +1991;AL # NEW TAI LUE LETTER LOW TA +1992;AL # NEW TAI LUE LETTER LOW THA +1993;AL # NEW TAI LUE LETTER LOW NA +1994;AL # NEW TAI LUE LETTER HIGH PA +1995;AL # NEW TAI LUE LETTER HIGH PHA +1996;AL # NEW TAI LUE LETTER HIGH MA +1997;AL # NEW TAI LUE LETTER LOW PA +1998;AL # NEW TAI LUE LETTER LOW PHA +1999;AL # NEW TAI LUE LETTER LOW MA +199A;AL # NEW TAI LUE LETTER HIGH FA +199B;AL # NEW TAI LUE LETTER HIGH VA +199C;AL # NEW TAI LUE LETTER HIGH LA +199D;AL # NEW TAI LUE LETTER LOW FA +199E;AL # NEW TAI LUE LETTER LOW VA +199F;AL # NEW TAI LUE LETTER LOW LA +19A0;AL # NEW TAI LUE LETTER HIGH HA +19A1;AL # NEW TAI LUE LETTER HIGH DA +19A2;AL # NEW TAI LUE LETTER HIGH BA +19A3;AL # NEW TAI LUE LETTER LOW HA +19A4;AL # NEW TAI LUE LETTER LOW DA +19A5;AL # NEW TAI LUE LETTER LOW BA +19A6;AL # NEW TAI LUE LETTER HIGH KVA +19A7;AL # NEW TAI LUE LETTER HIGH XVA +19A8;AL # NEW TAI LUE LETTER LOW KVA +19A9;AL # NEW TAI LUE LETTER LOW XVA +19B0;CM # NEW TAI LUE VOWEL SIGN VOWEL SHORTENER +19B1;CM # NEW TAI LUE VOWEL SIGN AA +19B2;CM # NEW TAI LUE VOWEL SIGN II +19B3;CM # NEW TAI LUE VOWEL SIGN U +19B4;CM # NEW TAI LUE VOWEL SIGN UU +19B5;CM # NEW TAI LUE VOWEL SIGN E +19B6;CM # NEW TAI LUE VOWEL SIGN AE +19B7;CM # NEW TAI LUE VOWEL SIGN O +19B8;CM # NEW TAI LUE VOWEL SIGN OA +19B9;CM # NEW TAI LUE VOWEL SIGN UE +19BA;CM # NEW TAI LUE VOWEL SIGN AY +19BB;CM # NEW TAI LUE VOWEL SIGN AAY +19BC;CM # NEW TAI LUE VOWEL SIGN UY +19BD;CM # NEW TAI LUE VOWEL SIGN OY +19BE;CM # NEW TAI LUE VOWEL SIGN OAY +19BF;CM # NEW TAI LUE VOWEL SIGN UEY +19C0;CM # NEW TAI LUE VOWEL SIGN IY +19C1;AL # NEW TAI LUE LETTER FINAL V +19C2;AL # NEW TAI LUE LETTER FINAL NG +19C3;AL # NEW TAI LUE LETTER FINAL N +19C4;AL # NEW TAI LUE LETTER FINAL M +19C5;AL # NEW TAI LUE LETTER FINAL K +19C6;AL # NEW TAI LUE LETTER FINAL D +19C7;AL # NEW TAI LUE LETTER FINAL B +19C8;CM # NEW TAI LUE TONE MARK-1 +19C9;CM # NEW TAI LUE TONE MARK-2 +19D0;NU # NEW TAI LUE DIGIT ZERO +19D1;NU # NEW TAI LUE DIGIT ONE +19D2;NU # NEW TAI LUE DIGIT TWO +19D3;NU # NEW TAI LUE DIGIT THREE +19D4;NU # NEW TAI LUE DIGIT FOUR +19D5;NU # NEW TAI LUE DIGIT FIVE +19D6;NU # NEW TAI LUE DIGIT SIX +19D7;NU # NEW TAI LUE DIGIT SEVEN +19D8;NU # NEW TAI LUE DIGIT EIGHT +19D9;NU # NEW TAI LUE DIGIT NINE +19DE;AL # NEW TAI LUE SIGN LAE +19DF;AL # NEW TAI LUE SIGN LAEV +19E0;AL # KHMER SYMBOL PATHAMASAT +19E1;AL # KHMER SYMBOL MUOY KOET +19E2;AL # KHMER SYMBOL PII KOET +19E3;AL # KHMER SYMBOL BEI KOET +19E4;AL # KHMER SYMBOL BUON KOET +19E5;AL # KHMER SYMBOL PRAM KOET +19E6;AL # KHMER SYMBOL PRAM-MUOY KOET +19E7;AL # KHMER SYMBOL PRAM-PII KOET +19E8;AL # KHMER SYMBOL PRAM-BEI KOET +19E9;AL # KHMER SYMBOL PRAM-BUON KOET +19EA;AL # KHMER SYMBOL DAP KOET +19EB;AL # KHMER SYMBOL DAP-MUOY KOET +19EC;AL # KHMER SYMBOL DAP-PII KOET +19ED;AL # KHMER SYMBOL DAP-BEI KOET +19EE;AL # KHMER SYMBOL DAP-BUON KOET +19EF;AL # KHMER SYMBOL DAP-PRAM KOET +19F0;AL # KHMER SYMBOL TUTEYASAT +19F1;AL # KHMER SYMBOL MUOY ROC +19F2;AL # KHMER SYMBOL PII ROC +19F3;AL # KHMER SYMBOL BEI ROC +19F4;AL # KHMER SYMBOL BUON ROC +19F5;AL # KHMER SYMBOL PRAM ROC +19F6;AL # KHMER SYMBOL PRAM-MUOY ROC +19F7;AL # KHMER SYMBOL PRAM-PII ROC +19F8;AL # KHMER SYMBOL PRAM-BEI ROC +19F9;AL # KHMER SYMBOL PRAM-BUON ROC +19FA;AL # KHMER SYMBOL DAP ROC +19FB;AL # KHMER SYMBOL DAP-MUOY ROC +19FC;AL # KHMER SYMBOL DAP-PII ROC +19FD;AL # KHMER SYMBOL DAP-BEI ROC +19FE;AL # KHMER SYMBOL DAP-BUON ROC +19FF;AL # KHMER SYMBOL DAP-PRAM ROC +1A00;AL # BUGINESE LETTER KA +1A01;AL # BUGINESE LETTER GA +1A02;AL # BUGINESE LETTER NGA +1A03;AL # BUGINESE LETTER NGKA +1A04;AL # BUGINESE LETTER PA +1A05;AL # BUGINESE LETTER BA +1A06;AL # BUGINESE LETTER MA +1A07;AL # BUGINESE LETTER MPA +1A08;AL # BUGINESE LETTER TA +1A09;AL # BUGINESE LETTER DA +1A0A;AL # BUGINESE LETTER NA +1A0B;AL # BUGINESE LETTER NRA +1A0C;AL # BUGINESE LETTER CA +1A0D;AL # BUGINESE LETTER JA +1A0E;AL # BUGINESE LETTER NYA +1A0F;AL # BUGINESE LETTER NYCA +1A10;AL # BUGINESE LETTER YA +1A11;AL # BUGINESE LETTER RA +1A12;AL # BUGINESE LETTER LA +1A13;AL # BUGINESE LETTER VA +1A14;AL # BUGINESE LETTER SA +1A15;AL # BUGINESE LETTER A +1A16;AL # BUGINESE LETTER HA +1A17;CM # BUGINESE VOWEL SIGN I +1A18;CM # BUGINESE VOWEL SIGN U +1A19;CM # BUGINESE VOWEL SIGN E +1A1A;CM # BUGINESE VOWEL SIGN O +1A1B;CM # BUGINESE VOWEL SIGN AE +1A1E;BA # BUGINESE PALLAWA +1A1F;AL # BUGINESE END OF SECTION +1D00;AL # LATIN LETTER SMALL CAPITAL A +1D01;AL # LATIN LETTER SMALL CAPITAL AE +1D02;AL # LATIN SMALL LETTER TURNED AE +1D03;AL # LATIN LETTER SMALL CAPITAL BARRED B +1D04;AL # LATIN LETTER SMALL CAPITAL C +1D05;AL # LATIN LETTER SMALL CAPITAL D +1D06;AL # LATIN LETTER SMALL CAPITAL ETH +1D07;AL # LATIN LETTER SMALL CAPITAL E +1D08;AL # LATIN SMALL LETTER TURNED OPEN E +1D09;AL # LATIN SMALL LETTER TURNED I +1D0A;AL # LATIN LETTER SMALL CAPITAL J +1D0B;AL # LATIN LETTER SMALL CAPITAL K +1D0C;AL # LATIN LETTER SMALL CAPITAL L WITH STROKE +1D0D;AL # LATIN LETTER SMALL CAPITAL M +1D0E;AL # LATIN LETTER SMALL CAPITAL REVERSED N +1D0F;AL # LATIN LETTER SMALL CAPITAL O +1D10;AL # LATIN LETTER SMALL CAPITAL OPEN O +1D11;AL # LATIN SMALL LETTER SIDEWAYS O +1D12;AL # LATIN SMALL LETTER SIDEWAYS OPEN O +1D13;AL # LATIN SMALL LETTER SIDEWAYS O WITH STROKE +1D14;AL # LATIN SMALL LETTER TURNED OE +1D15;AL # LATIN LETTER SMALL CAPITAL OU +1D16;AL # LATIN SMALL LETTER TOP HALF O +1D17;AL # LATIN SMALL LETTER BOTTOM HALF O +1D18;AL # LATIN LETTER SMALL CAPITAL P +1D19;AL # LATIN LETTER SMALL CAPITAL REVERSED R +1D1A;AL # LATIN LETTER SMALL CAPITAL TURNED R +1D1B;AL # LATIN LETTER SMALL CAPITAL T +1D1C;AL # LATIN LETTER SMALL CAPITAL U +1D1D;AL # LATIN SMALL LETTER SIDEWAYS U +1D1E;AL # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U +1D1F;AL # LATIN SMALL LETTER SIDEWAYS TURNED M +1D20;AL # LATIN LETTER SMALL CAPITAL V +1D21;AL # LATIN LETTER SMALL CAPITAL W +1D22;AL # LATIN LETTER SMALL CAPITAL Z +1D23;AL # LATIN LETTER SMALL CAPITAL EZH +1D24;AL # LATIN LETTER VOICED LARYNGEAL SPIRANT +1D25;AL # LATIN LETTER AIN +1D26;AL # GREEK LETTER SMALL CAPITAL GAMMA +1D27;AL # GREEK LETTER SMALL CAPITAL LAMDA +1D28;AL # GREEK LETTER SMALL CAPITAL PI +1D29;AL # GREEK LETTER SMALL CAPITAL RHO +1D2A;AL # GREEK LETTER SMALL CAPITAL PSI +1D2B;AL # CYRILLIC LETTER SMALL CAPITAL EL +1D2C;AL # MODIFIER LETTER CAPITAL A +1D2D;AL # MODIFIER LETTER CAPITAL AE +1D2E;AL # MODIFIER LETTER CAPITAL B +1D2F;AL # MODIFIER LETTER CAPITAL BARRED B +1D30;AL # MODIFIER LETTER CAPITAL D +1D31;AL # MODIFIER LETTER CAPITAL E +1D32;AL # MODIFIER LETTER CAPITAL REVERSED E +1D33;AL # MODIFIER LETTER CAPITAL G +1D34;AL # MODIFIER LETTER CAPITAL H +1D35;AL # MODIFIER LETTER CAPITAL I +1D36;AL # MODIFIER LETTER CAPITAL J +1D37;AL # MODIFIER LETTER CAPITAL K +1D38;AL # MODIFIER LETTER CAPITAL L +1D39;AL # MODIFIER LETTER CAPITAL M +1D3A;AL # MODIFIER LETTER CAPITAL N +1D3B;AL # MODIFIER LETTER CAPITAL REVERSED N +1D3C;AL # MODIFIER LETTER CAPITAL O +1D3D;AL # MODIFIER LETTER CAPITAL OU +1D3E;AL # MODIFIER LETTER CAPITAL P +1D3F;AL # MODIFIER LETTER CAPITAL R +1D40;AL # MODIFIER LETTER CAPITAL T +1D41;AL # MODIFIER LETTER CAPITAL U +1D42;AL # MODIFIER LETTER CAPITAL W +1D43;AL # MODIFIER LETTER SMALL A +1D44;AL # MODIFIER LETTER SMALL TURNED A +1D45;AL # MODIFIER LETTER SMALL ALPHA +1D46;AL # MODIFIER LETTER SMALL TURNED AE +1D47;AL # MODIFIER LETTER SMALL B +1D48;AL # MODIFIER LETTER SMALL D +1D49;AL # MODIFIER LETTER SMALL E +1D4A;AL # MODIFIER LETTER SMALL SCHWA +1D4B;AL # MODIFIER LETTER SMALL OPEN E +1D4C;AL # MODIFIER LETTER SMALL TURNED OPEN E +1D4D;AL # MODIFIER LETTER SMALL G +1D4E;AL # MODIFIER LETTER SMALL TURNED I +1D4F;AL # MODIFIER LETTER SMALL K +1D50;AL # MODIFIER LETTER SMALL M +1D51;AL # MODIFIER LETTER SMALL ENG +1D52;AL # MODIFIER LETTER SMALL O +1D53;AL # MODIFIER LETTER SMALL OPEN O +1D54;AL # MODIFIER LETTER SMALL TOP HALF O +1D55;AL # MODIFIER LETTER SMALL BOTTOM HALF O +1D56;AL # MODIFIER LETTER SMALL P +1D57;AL # MODIFIER LETTER SMALL T +1D58;AL # MODIFIER LETTER SMALL U +1D59;AL # MODIFIER LETTER SMALL SIDEWAYS U +1D5A;AL # MODIFIER LETTER SMALL TURNED M +1D5B;AL # MODIFIER LETTER SMALL V +1D5C;AL # MODIFIER LETTER SMALL AIN +1D5D;AL # MODIFIER LETTER SMALL BETA +1D5E;AL # MODIFIER LETTER SMALL GREEK GAMMA +1D5F;AL # MODIFIER LETTER SMALL DELTA +1D60;AL # MODIFIER LETTER SMALL GREEK PHI +1D61;AL # MODIFIER LETTER SMALL CHI +1D62;AL # LATIN SUBSCRIPT SMALL LETTER I +1D63;AL # LATIN SUBSCRIPT SMALL LETTER R +1D64;AL # LATIN SUBSCRIPT SMALL LETTER U +1D65;AL # LATIN SUBSCRIPT SMALL LETTER V +1D66;AL # GREEK SUBSCRIPT SMALL LETTER BETA +1D67;AL # GREEK SUBSCRIPT SMALL LETTER GAMMA +1D68;AL # GREEK SUBSCRIPT SMALL LETTER RHO +1D69;AL # GREEK SUBSCRIPT SMALL LETTER PHI +1D6A;AL # GREEK SUBSCRIPT SMALL LETTER CHI +1D6B;AL # LATIN SMALL LETTER UE +1D6C;AL # LATIN SMALL LETTER B WITH MIDDLE TILDE +1D6D;AL # LATIN SMALL LETTER D WITH MIDDLE TILDE +1D6E;AL # LATIN SMALL LETTER F WITH MIDDLE TILDE +1D6F;AL # LATIN SMALL LETTER M WITH MIDDLE TILDE +1D70;AL # LATIN SMALL LETTER N WITH MIDDLE TILDE +1D71;AL # LATIN SMALL LETTER P WITH MIDDLE TILDE +1D72;AL # LATIN SMALL LETTER R WITH MIDDLE TILDE +1D73;AL # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE +1D74;AL # LATIN SMALL LETTER S WITH MIDDLE TILDE +1D75;AL # LATIN SMALL LETTER T WITH MIDDLE TILDE +1D76;AL # LATIN SMALL LETTER Z WITH MIDDLE TILDE +1D77;AL # LATIN SMALL LETTER TURNED G +1D78;AL # MODIFIER LETTER CYRILLIC EN +1D79;AL # LATIN SMALL LETTER INSULAR G +1D7A;AL # LATIN SMALL LETTER TH WITH STRIKETHROUGH +1D7B;AL # LATIN SMALL CAPITAL LETTER I WITH STROKE +1D7C;AL # LATIN SMALL LETTER IOTA WITH STROKE +1D7D;AL # LATIN SMALL LETTER P WITH STROKE +1D7E;AL # LATIN SMALL CAPITAL LETTER U WITH STROKE +1D7F;AL # LATIN SMALL LETTER UPSILON WITH STROKE +1D80;AL # LATIN SMALL LETTER B WITH PALATAL HOOK +1D81;AL # LATIN SMALL LETTER D WITH PALATAL HOOK +1D82;AL # LATIN SMALL LETTER F WITH PALATAL HOOK +1D83;AL # LATIN SMALL LETTER G WITH PALATAL HOOK +1D84;AL # LATIN SMALL LETTER K WITH PALATAL HOOK +1D85;AL # LATIN SMALL LETTER L WITH PALATAL HOOK +1D86;AL # LATIN SMALL LETTER M WITH PALATAL HOOK +1D87;AL # LATIN SMALL LETTER N WITH PALATAL HOOK +1D88;AL # LATIN SMALL LETTER P WITH PALATAL HOOK +1D89;AL # LATIN SMALL LETTER R WITH PALATAL HOOK +1D8A;AL # LATIN SMALL LETTER S WITH PALATAL HOOK +1D8B;AL # LATIN SMALL LETTER ESH WITH PALATAL HOOK +1D8C;AL # LATIN SMALL LETTER V WITH PALATAL HOOK +1D8D;AL # LATIN SMALL LETTER X WITH PALATAL HOOK +1D8E;AL # LATIN SMALL LETTER Z WITH PALATAL HOOK +1D8F;AL # LATIN SMALL LETTER A WITH RETROFLEX HOOK +1D90;AL # LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK +1D91;AL # LATIN SMALL LETTER D WITH HOOK AND TAIL +1D92;AL # LATIN SMALL LETTER E WITH RETROFLEX HOOK +1D93;AL # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK +1D94;AL # LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK +1D95;AL # LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK +1D96;AL # LATIN SMALL LETTER I WITH RETROFLEX HOOK +1D97;AL # LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK +1D98;AL # LATIN SMALL LETTER ESH WITH RETROFLEX HOOK +1D99;AL # LATIN SMALL LETTER U WITH RETROFLEX HOOK +1D9A;AL # LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B;AL # MODIFIER LETTER SMALL TURNED ALPHA +1D9C;AL # MODIFIER LETTER SMALL C +1D9D;AL # MODIFIER LETTER SMALL C WITH CURL +1D9E;AL # MODIFIER LETTER SMALL ETH +1D9F;AL # MODIFIER LETTER SMALL REVERSED OPEN E +1DA0;AL # MODIFIER LETTER SMALL F +1DA1;AL # MODIFIER LETTER SMALL DOTLESS J WITH STROKE +1DA2;AL # MODIFIER LETTER SMALL SCRIPT G +1DA3;AL # MODIFIER LETTER SMALL TURNED H +1DA4;AL # MODIFIER LETTER SMALL I WITH STROKE +1DA5;AL # MODIFIER LETTER SMALL IOTA +1DA6;AL # MODIFIER LETTER SMALL CAPITAL I +1DA7;AL # MODIFIER LETTER SMALL CAPITAL I WITH STROKE +1DA8;AL # MODIFIER LETTER SMALL J WITH CROSSED-TAIL +1DA9;AL # MODIFIER LETTER SMALL L WITH RETROFLEX HOOK +1DAA;AL # MODIFIER LETTER SMALL L WITH PALATAL HOOK +1DAB;AL # MODIFIER LETTER SMALL CAPITAL L +1DAC;AL # MODIFIER LETTER SMALL M WITH HOOK +1DAD;AL # MODIFIER LETTER SMALL TURNED M WITH LONG LEG +1DAE;AL # MODIFIER LETTER SMALL N WITH LEFT HOOK +1DAF;AL # MODIFIER LETTER SMALL N WITH RETROFLEX HOOK +1DB0;AL # MODIFIER LETTER SMALL CAPITAL N +1DB1;AL # MODIFIER LETTER SMALL BARRED O +1DB2;AL # MODIFIER LETTER SMALL PHI +1DB3;AL # MODIFIER LETTER SMALL S WITH HOOK +1DB4;AL # MODIFIER LETTER SMALL ESH +1DB5;AL # MODIFIER LETTER SMALL T WITH PALATAL HOOK +1DB6;AL # MODIFIER LETTER SMALL U BAR +1DB7;AL # MODIFIER LETTER SMALL UPSILON +1DB8;AL # MODIFIER LETTER SMALL CAPITAL U +1DB9;AL # MODIFIER LETTER SMALL V WITH HOOK +1DBA;AL # MODIFIER LETTER SMALL TURNED V +1DBB;AL # MODIFIER LETTER SMALL Z +1DBC;AL # MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK +1DBD;AL # MODIFIER LETTER SMALL Z WITH CURL +1DBE;AL # MODIFIER LETTER SMALL EZH +1DBF;AL # MODIFIER LETTER SMALL THETA +1DC0;CM # COMBINING DOTTED GRAVE ACCENT +1DC1;CM # COMBINING DOTTED ACUTE ACCENT +1DC2;CM # COMBINING SNAKE BELOW +1DC3;CM # COMBINING SUSPENSION MARK +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;IS # 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 +2053;AL # SWUNG DASH +2054;AL # INVERTED UNDERTIE +2055;AL # FLOWER PUNCTUATION MARK +2056;BA # THREE DOT PUNCTUATION +2057;AL # QUADRUPLE PRIME +2058;BA # FOUR DOT PUNCTUATION +2059;BA # FIVE DOT PUNCTUATION +205A;BA # TWO DOT PUNCTUATION +205B;BA # FOUR DOT MARK +205C;AL # DOTTED CROSS +205D;BA # TRICOLON +205E;BA # VERTICAL FOUR DOTS +205F;BA # MEDIUM MATHEMATICAL SPACE +2060;WJ # 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 +2090;AL # LATIN SUBSCRIPT SMALL LETTER A +2091;AL # LATIN SUBSCRIPT SMALL LETTER E +2092;AL # LATIN SUBSCRIPT SMALL LETTER O +2093;AL # LATIN SUBSCRIPT SMALL LETTER X +2094;AL # LATIN SUBSCRIPT SMALL LETTER SCHWA +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 +20B2;PR # GUARANI SIGN +20B3;PR # AUSTRAL SIGN +20B4;PR # HRYVNIA SIGN +20B5;PR # CEDI 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 +20EB;CM # COMBINING LONG DOUBLE SOLIDUS 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;AL # 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 +213B;AL # FACSIMILE SIGN +213C;AL # DOUBLE-STRUCK SMALL PI +213D;AL # DOUBLE-STRUCK SMALL GAMMA +213E;AL # DOUBLE-STRUCK CAPITAL GAMMA +213F;AL # DOUBLE-STRUCK CAPITAL PI +2140;AL # 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 +214C;AL # PER SIGN +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 +23CF;AL # EJECT SYMBOL +23D0;AL # VERTICAL LINE EXTENSION +23D1;AL # METRICAL BREVE +23D2;AL # METRICAL LONG OVER SHORT +23D3;AL # METRICAL SHORT OVER LONG +23D4;AL # METRICAL LONG OVER TWO SHORTS +23D5;AL # METRICAL TWO SHORTS OVER LONG +23D6;AL # METRICAL TWO SHORTS JOINED +23D7;AL # METRICAL TRISEME +23D8;AL # METRICAL TETRASEME +23D9;AL # METRICAL PENTASEME +23DA;AL # EARTH GROUND +23DB;AL # FUSE +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;AI # CIRCLED LATIN CAPITAL LETTER K +24C1;AI # CIRCLED LATIN CAPITAL LETTER L +24C2;AI # CIRCLED LATIN CAPITAL LETTER M +24C3;AI # CIRCLED LATIN CAPITAL LETTER N +24C4;AI # CIRCLED LATIN CAPITAL LETTER O +24C5;AI # CIRCLED LATIN CAPITAL LETTER P +24C6;AI # CIRCLED LATIN CAPITAL LETTER Q +24C7;AI # CIRCLED LATIN CAPITAL LETTER R +24C8;AI # CIRCLED LATIN CAPITAL LETTER S +24C9;AI # CIRCLED LATIN CAPITAL LETTER T +24CA;AI # CIRCLED LATIN CAPITAL LETTER U +24CB;AI # CIRCLED LATIN CAPITAL LETTER V +24CC;AI # CIRCLED LATIN CAPITAL LETTER W +24CD;AI # CIRCLED LATIN CAPITAL LETTER X +24CE;AI # CIRCLED LATIN CAPITAL LETTER Y +24CF;AI # 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;AI # 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 +24FF;AL # NEGATIVE CIRCLED DIGIT ZERO +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 +2614;AI # UMBRELLA WITH RAIN DROPS +2615;AI # HOT BEVERAGE +2616;AI # WHITE SHOGI PIECE +2617;AI # BLACK SHOGI PIECE +2618;AL # SHAMROCK +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 +267E;AL # PERMANENT PAPER SIGN +267F;AL # WHEELCHAIR 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 +268A;AL # MONOGRAM FOR YANG +268B;AL # MONOGRAM FOR YIN +268C;AL # DIGRAM FOR GREATER YANG +268D;AL # DIGRAM FOR LESSER YIN +268E;AL # DIGRAM FOR LESSER YANG +268F;AL # DIGRAM FOR GREATER YIN +2690;AL # WHITE FLAG +2691;AL # BLACK FLAG +2692;AL # HAMMER AND PICK +2693;AL # ANCHOR +2694;AL # CROSSED SWORDS +2695;AL # STAFF OF AESCULAPIUS +2696;AL # SCALES +2697;AL # ALEMBIC +2698;AL # FLOWER +2699;AL # GEAR +269A;AL # STAFF OF HERMES +269B;AL # ATOM SYMBOL +269C;AL # FLEUR-DE-LIS +26A0;AL # WARNING SIGN +26A1;AL # HIGH VOLTAGE SIGN +26A2;AL # DOUBLED FEMALE SIGN +26A3;AL # DOUBLED MALE SIGN +26A4;AL # INTERLOCKED FEMALE AND MALE SIGN +26A5;AL # MALE AND FEMALE SIGN +26A6;AL # MALE WITH STROKE SIGN +26A7;AL # MALE WITH STROKE AND MALE AND FEMALE SIGN +26A8;AL # VERTICAL MALE WITH STROKE SIGN +26A9;AL # HORIZONTAL MALE WITH STROKE SIGN +26AA;AL # MEDIUM WHITE CIRCLE +26AB;AL # MEDIUM BLACK CIRCLE +26AC;AL # MEDIUM SMALL WHITE CIRCLE +26AD;AL # MARRIAGE SYMBOL +26AE;AL # DIVORCE SYMBOL +26AF;AL # UNMARRIED PARTNERSHIP SYMBOL +26B0;AL # COFFIN +26B1;AL # FUNERAL URN +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;AI # DINGBAT NEGATIVE CIRCLED DIGIT ONE +2777;AI # DINGBAT NEGATIVE CIRCLED DIGIT TWO +2778;AI # DINGBAT NEGATIVE CIRCLED DIGIT THREE +2779;AI # DINGBAT NEGATIVE CIRCLED DIGIT FOUR +277A;AI # DINGBAT NEGATIVE CIRCLED DIGIT FIVE +277B;AI # DINGBAT NEGATIVE CIRCLED DIGIT SIX +277C;AI # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN +277D;AI # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT +277E;AI # DINGBAT NEGATIVE CIRCLED DIGIT NINE +277F;AI # DINGBAT NEGATIVE CIRCLED NUMBER TEN +2780;AI # DINGBAT CIRCLED SANS-SERIF DIGIT ONE +2781;AI # DINGBAT CIRCLED SANS-SERIF DIGIT TWO +2782;AI # DINGBAT CIRCLED SANS-SERIF DIGIT THREE +2783;AI # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR +2784;AI # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE +2785;AI # DINGBAT CIRCLED SANS-SERIF DIGIT SIX +2786;AI # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN +2787;AI # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT +2788;AI # DINGBAT CIRCLED SANS-SERIF DIGIT NINE +2789;AI # DINGBAT CIRCLED SANS-SERIF NUMBER TEN +278A;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE +278B;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO +278C;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE +278D;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR +278E;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE +278F;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX +2790;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN +2791;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT +2792;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE +2793;AI # 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 +27C0;AL # THREE DIMENSIONAL ANGLE +27C1;AL # WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE +27C2;AL # PERPENDICULAR +27C3;AL # OPEN SUBSET +27C4;AL # OPEN SUPERSET +27C5;OP # LEFT S-SHAPED BAG DELIMITER +27C6;CL # RIGHT S-SHAPED BAG DELIMITER +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 +2B00;AL # NORTH EAST WHITE ARROW +2B01;AL # NORTH WEST WHITE ARROW +2B02;AL # SOUTH EAST WHITE ARROW +2B03;AL # SOUTH WEST WHITE ARROW +2B04;AL # LEFT RIGHT WHITE ARROW +2B05;AL # LEFTWARDS BLACK ARROW +2B06;AL # UPWARDS BLACK ARROW +2B07;AL # DOWNWARDS BLACK ARROW +2B08;AL # NORTH EAST BLACK ARROW +2B09;AL # NORTH WEST BLACK ARROW +2B0A;AL # SOUTH EAST BLACK ARROW +2B0B;AL # SOUTH WEST BLACK ARROW +2B0C;AL # LEFT RIGHT BLACK ARROW +2B0D;AL # UP DOWN BLACK ARROW +2B0E;AL # RIGHTWARDS ARROW WITH TIP DOWNWARDS +2B0F;AL # RIGHTWARDS ARROW WITH TIP UPWARDS +2B10;AL # LEFTWARDS ARROW WITH TIP DOWNWARDS +2B11;AL # LEFTWARDS ARROW WITH TIP UPWARDS +2B12;AL # SQUARE WITH TOP HALF BLACK +2B13;AL # SQUARE WITH BOTTOM HALF BLACK +2C00;AL # GLAGOLITIC CAPITAL LETTER AZU +2C01;AL # GLAGOLITIC CAPITAL LETTER BUKY +2C02;AL # GLAGOLITIC CAPITAL LETTER VEDE +2C03;AL # GLAGOLITIC CAPITAL LETTER GLAGOLI +2C04;AL # GLAGOLITIC CAPITAL LETTER DOBRO +2C05;AL # GLAGOLITIC CAPITAL LETTER YESTU +2C06;AL # GLAGOLITIC CAPITAL LETTER ZHIVETE +2C07;AL # GLAGOLITIC CAPITAL LETTER DZELO +2C08;AL # GLAGOLITIC CAPITAL LETTER ZEMLJA +2C09;AL # GLAGOLITIC CAPITAL LETTER IZHE +2C0A;AL # GLAGOLITIC CAPITAL LETTER INITIAL IZHE +2C0B;AL # GLAGOLITIC CAPITAL LETTER I +2C0C;AL # GLAGOLITIC CAPITAL LETTER DJERVI +2C0D;AL # GLAGOLITIC CAPITAL LETTER KAKO +2C0E;AL # GLAGOLITIC CAPITAL LETTER LJUDIJE +2C0F;AL # GLAGOLITIC CAPITAL LETTER MYSLITE +2C10;AL # GLAGOLITIC CAPITAL LETTER NASHI +2C11;AL # GLAGOLITIC CAPITAL LETTER ONU +2C12;AL # GLAGOLITIC CAPITAL LETTER POKOJI +2C13;AL # GLAGOLITIC CAPITAL LETTER RITSI +2C14;AL # GLAGOLITIC CAPITAL LETTER SLOVO +2C15;AL # GLAGOLITIC CAPITAL LETTER TVRIDO +2C16;AL # GLAGOLITIC CAPITAL LETTER UKU +2C17;AL # GLAGOLITIC CAPITAL LETTER FRITU +2C18;AL # GLAGOLITIC CAPITAL LETTER HERU +2C19;AL # GLAGOLITIC CAPITAL LETTER OTU +2C1A;AL # GLAGOLITIC CAPITAL LETTER PE +2C1B;AL # GLAGOLITIC CAPITAL LETTER SHTA +2C1C;AL # GLAGOLITIC CAPITAL LETTER TSI +2C1D;AL # GLAGOLITIC CAPITAL LETTER CHRIVI +2C1E;AL # GLAGOLITIC CAPITAL LETTER SHA +2C1F;AL # GLAGOLITIC CAPITAL LETTER YERU +2C20;AL # GLAGOLITIC CAPITAL LETTER YERI +2C21;AL # GLAGOLITIC CAPITAL LETTER YATI +2C22;AL # GLAGOLITIC CAPITAL LETTER SPIDERY HA +2C23;AL # GLAGOLITIC CAPITAL LETTER YU +2C24;AL # GLAGOLITIC CAPITAL LETTER SMALL YUS +2C25;AL # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +2C26;AL # GLAGOLITIC CAPITAL LETTER YO +2C27;AL # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +2C28;AL # GLAGOLITIC CAPITAL LETTER BIG YUS +2C29;AL # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +2C2A;AL # GLAGOLITIC CAPITAL LETTER FITA +2C2B;AL # GLAGOLITIC CAPITAL LETTER IZHITSA +2C2C;AL # GLAGOLITIC CAPITAL LETTER SHTAPIC +2C2D;AL # GLAGOLITIC CAPITAL LETTER TROKUTASTI A +2C2E;AL # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C30;AL # GLAGOLITIC SMALL LETTER AZU +2C31;AL # GLAGOLITIC SMALL LETTER BUKY +2C32;AL # GLAGOLITIC SMALL LETTER VEDE +2C33;AL # GLAGOLITIC SMALL LETTER GLAGOLI +2C34;AL # GLAGOLITIC SMALL LETTER DOBRO +2C35;AL # GLAGOLITIC SMALL LETTER YESTU +2C36;AL # GLAGOLITIC SMALL LETTER ZHIVETE +2C37;AL # GLAGOLITIC SMALL LETTER DZELO +2C38;AL # GLAGOLITIC SMALL LETTER ZEMLJA +2C39;AL # GLAGOLITIC SMALL LETTER IZHE +2C3A;AL # GLAGOLITIC SMALL LETTER INITIAL IZHE +2C3B;AL # GLAGOLITIC SMALL LETTER I +2C3C;AL # GLAGOLITIC SMALL LETTER DJERVI +2C3D;AL # GLAGOLITIC SMALL LETTER KAKO +2C3E;AL # GLAGOLITIC SMALL LETTER LJUDIJE +2C3F;AL # GLAGOLITIC SMALL LETTER MYSLITE +2C40;AL # GLAGOLITIC SMALL LETTER NASHI +2C41;AL # GLAGOLITIC SMALL LETTER ONU +2C42;AL # GLAGOLITIC SMALL LETTER POKOJI +2C43;AL # GLAGOLITIC SMALL LETTER RITSI +2C44;AL # GLAGOLITIC SMALL LETTER SLOVO +2C45;AL # GLAGOLITIC SMALL LETTER TVRIDO +2C46;AL # GLAGOLITIC SMALL LETTER UKU +2C47;AL # GLAGOLITIC SMALL LETTER FRITU +2C48;AL # GLAGOLITIC SMALL LETTER HERU +2C49;AL # GLAGOLITIC SMALL LETTER OTU +2C4A;AL # GLAGOLITIC SMALL LETTER PE +2C4B;AL # GLAGOLITIC SMALL LETTER SHTA +2C4C;AL # GLAGOLITIC SMALL LETTER TSI +2C4D;AL # GLAGOLITIC SMALL LETTER CHRIVI +2C4E;AL # GLAGOLITIC SMALL LETTER SHA +2C4F;AL # GLAGOLITIC SMALL LETTER YERU +2C50;AL # GLAGOLITIC SMALL LETTER YERI +2C51;AL # GLAGOLITIC SMALL LETTER YATI +2C52;AL # GLAGOLITIC SMALL LETTER SPIDERY HA +2C53;AL # GLAGOLITIC SMALL LETTER YU +2C54;AL # GLAGOLITIC SMALL LETTER SMALL YUS +2C55;AL # GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL +2C56;AL # GLAGOLITIC SMALL LETTER YO +2C57;AL # GLAGOLITIC SMALL LETTER IOTATED SMALL YUS +2C58;AL # GLAGOLITIC SMALL LETTER BIG YUS +2C59;AL # GLAGOLITIC SMALL LETTER IOTATED BIG YUS +2C5A;AL # GLAGOLITIC SMALL LETTER FITA +2C5B;AL # GLAGOLITIC SMALL LETTER IZHITSA +2C5C;AL # GLAGOLITIC SMALL LETTER SHTAPIC +2C5D;AL # GLAGOLITIC SMALL LETTER TROKUTASTI A +2C5E;AL # GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C80;AL # COPTIC CAPITAL LETTER ALFA +2C81;AL # COPTIC SMALL LETTER ALFA +2C82;AL # COPTIC CAPITAL LETTER VIDA +2C83;AL # COPTIC SMALL LETTER VIDA +2C84;AL # COPTIC CAPITAL LETTER GAMMA +2C85;AL # COPTIC SMALL LETTER GAMMA +2C86;AL # COPTIC CAPITAL LETTER DALDA +2C87;AL # COPTIC SMALL LETTER DALDA +2C88;AL # COPTIC CAPITAL LETTER EIE +2C89;AL # COPTIC SMALL LETTER EIE +2C8A;AL # COPTIC CAPITAL LETTER SOU +2C8B;AL # COPTIC SMALL LETTER SOU +2C8C;AL # COPTIC CAPITAL LETTER ZATA +2C8D;AL # COPTIC SMALL LETTER ZATA +2C8E;AL # COPTIC CAPITAL LETTER HATE +2C8F;AL # COPTIC SMALL LETTER HATE +2C90;AL # COPTIC CAPITAL LETTER THETHE +2C91;AL # COPTIC SMALL LETTER THETHE +2C92;AL # COPTIC CAPITAL LETTER IAUDA +2C93;AL # COPTIC SMALL LETTER IAUDA +2C94;AL # COPTIC CAPITAL LETTER KAPA +2C95;AL # COPTIC SMALL LETTER KAPA +2C96;AL # COPTIC CAPITAL LETTER LAULA +2C97;AL # COPTIC SMALL LETTER LAULA +2C98;AL # COPTIC CAPITAL LETTER MI +2C99;AL # COPTIC SMALL LETTER MI +2C9A;AL # COPTIC CAPITAL LETTER NI +2C9B;AL # COPTIC SMALL LETTER NI +2C9C;AL # COPTIC CAPITAL LETTER KSI +2C9D;AL # COPTIC SMALL LETTER KSI +2C9E;AL # COPTIC CAPITAL LETTER O +2C9F;AL # COPTIC SMALL LETTER O +2CA0;AL # COPTIC CAPITAL LETTER PI +2CA1;AL # COPTIC SMALL LETTER PI +2CA2;AL # COPTIC CAPITAL LETTER RO +2CA3;AL # COPTIC SMALL LETTER RO +2CA4;AL # COPTIC CAPITAL LETTER SIMA +2CA5;AL # COPTIC SMALL LETTER SIMA +2CA6;AL # COPTIC CAPITAL LETTER TAU +2CA7;AL # COPTIC SMALL LETTER TAU +2CA8;AL # COPTIC CAPITAL LETTER UA +2CA9;AL # COPTIC SMALL LETTER UA +2CAA;AL # COPTIC CAPITAL LETTER FI +2CAB;AL # COPTIC SMALL LETTER FI +2CAC;AL # COPTIC CAPITAL LETTER KHI +2CAD;AL # COPTIC SMALL LETTER KHI +2CAE;AL # COPTIC CAPITAL LETTER PSI +2CAF;AL # COPTIC SMALL LETTER PSI +2CB0;AL # COPTIC CAPITAL LETTER OOU +2CB1;AL # COPTIC SMALL LETTER OOU +2CB2;AL # COPTIC CAPITAL LETTER DIALECT-P ALEF +2CB3;AL # COPTIC SMALL LETTER DIALECT-P ALEF +2CB4;AL # COPTIC CAPITAL LETTER OLD COPTIC AIN +2CB5;AL # COPTIC SMALL LETTER OLD COPTIC AIN +2CB6;AL # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +2CB7;AL # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE +2CB8;AL # COPTIC CAPITAL LETTER DIALECT-P KAPA +2CB9;AL # COPTIC SMALL LETTER DIALECT-P KAPA +2CBA;AL # COPTIC CAPITAL LETTER DIALECT-P NI +2CBB;AL # COPTIC SMALL LETTER DIALECT-P NI +2CBC;AL # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +2CBD;AL # COPTIC SMALL LETTER CRYPTOGRAMMIC NI +2CBE;AL # COPTIC CAPITAL LETTER OLD COPTIC OOU +2CBF;AL # COPTIC SMALL LETTER OLD COPTIC OOU +2CC0;AL # COPTIC CAPITAL LETTER SAMPI +2CC1;AL # COPTIC SMALL LETTER SAMPI +2CC2;AL # COPTIC CAPITAL LETTER CROSSED SHEI +2CC3;AL # COPTIC SMALL LETTER CROSSED SHEI +2CC4;AL # COPTIC CAPITAL LETTER OLD COPTIC SHEI +2CC5;AL # COPTIC SMALL LETTER OLD COPTIC SHEI +2CC6;AL # COPTIC CAPITAL LETTER OLD COPTIC ESH +2CC7;AL # COPTIC SMALL LETTER OLD COPTIC ESH +2CC8;AL # COPTIC CAPITAL LETTER AKHMIMIC KHEI +2CC9;AL # COPTIC SMALL LETTER AKHMIMIC KHEI +2CCA;AL # COPTIC CAPITAL LETTER DIALECT-P HORI +2CCB;AL # COPTIC SMALL LETTER DIALECT-P HORI +2CCC;AL # COPTIC CAPITAL LETTER OLD COPTIC HORI +2CCD;AL # COPTIC SMALL LETTER OLD COPTIC HORI +2CCE;AL # COPTIC CAPITAL LETTER OLD COPTIC HA +2CCF;AL # COPTIC SMALL LETTER OLD COPTIC HA +2CD0;AL # COPTIC CAPITAL LETTER L-SHAPED HA +2CD1;AL # COPTIC SMALL LETTER L-SHAPED HA +2CD2;AL # COPTIC CAPITAL LETTER OLD COPTIC HEI +2CD3;AL # COPTIC SMALL LETTER OLD COPTIC HEI +2CD4;AL # COPTIC CAPITAL LETTER OLD COPTIC HAT +2CD5;AL # COPTIC SMALL LETTER OLD COPTIC HAT +2CD6;AL # COPTIC CAPITAL LETTER OLD COPTIC GANGIA +2CD7;AL # COPTIC SMALL LETTER OLD COPTIC GANGIA +2CD8;AL # COPTIC CAPITAL LETTER OLD COPTIC DJA +2CD9;AL # COPTIC SMALL LETTER OLD COPTIC DJA +2CDA;AL # COPTIC CAPITAL LETTER OLD COPTIC SHIMA +2CDB;AL # COPTIC SMALL LETTER OLD COPTIC SHIMA +2CDC;AL # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +2CDD;AL # COPTIC SMALL LETTER OLD NUBIAN SHIMA +2CDE;AL # COPTIC CAPITAL LETTER OLD NUBIAN NGI +2CDF;AL # COPTIC SMALL LETTER OLD NUBIAN NGI +2CE0;AL # COPTIC CAPITAL LETTER OLD NUBIAN NYI +2CE1;AL # COPTIC SMALL LETTER OLD NUBIAN NYI +2CE2;AL # COPTIC CAPITAL LETTER OLD NUBIAN WAU +2CE3;AL # COPTIC SMALL LETTER OLD NUBIAN WAU +2CE4;AL # COPTIC SYMBOL KAI +2CE5;AL # COPTIC SYMBOL MI RO +2CE6;AL # COPTIC SYMBOL PI RO +2CE7;AL # COPTIC SYMBOL STAUROS +2CE8;AL # COPTIC SYMBOL TAU RO +2CE9;AL # COPTIC SYMBOL KHI RO +2CEA;AL # COPTIC SYMBOL SHIMA SIMA +2CF9;BA # COPTIC OLD NUBIAN FULL STOP +2CFA;BA # COPTIC OLD NUBIAN DIRECT QUESTION MARK +2CFB;BA # COPTIC OLD NUBIAN INDIRECT QUESTION MARK +2CFC;BA # COPTIC OLD NUBIAN VERSE DIVIDER +2CFD;AL # COPTIC FRACTION ONE HALF +2CFE;BA # COPTIC FULL STOP +2CFF;BA # COPTIC MORPHOLOGICAL DIVIDER +2D00;AL # GEORGIAN SMALL LETTER AN +2D01;AL # GEORGIAN SMALL LETTER BAN +2D02;AL # GEORGIAN SMALL LETTER GAN +2D03;AL # GEORGIAN SMALL LETTER DON +2D04;AL # GEORGIAN SMALL LETTER EN +2D05;AL # GEORGIAN SMALL LETTER VIN +2D06;AL # GEORGIAN SMALL LETTER ZEN +2D07;AL # GEORGIAN SMALL LETTER TAN +2D08;AL # GEORGIAN SMALL LETTER IN +2D09;AL # GEORGIAN SMALL LETTER KAN +2D0A;AL # GEORGIAN SMALL LETTER LAS +2D0B;AL # GEORGIAN SMALL LETTER MAN +2D0C;AL # GEORGIAN SMALL LETTER NAR +2D0D;AL # GEORGIAN SMALL LETTER ON +2D0E;AL # GEORGIAN SMALL LETTER PAR +2D0F;AL # GEORGIAN SMALL LETTER ZHAR +2D10;AL # GEORGIAN SMALL LETTER RAE +2D11;AL # GEORGIAN SMALL LETTER SAN +2D12;AL # GEORGIAN SMALL LETTER TAR +2D13;AL # GEORGIAN SMALL LETTER UN +2D14;AL # GEORGIAN SMALL LETTER PHAR +2D15;AL # GEORGIAN SMALL LETTER KHAR +2D16;AL # GEORGIAN SMALL LETTER GHAN +2D17;AL # GEORGIAN SMALL LETTER QAR +2D18;AL # GEORGIAN SMALL LETTER SHIN +2D19;AL # GEORGIAN SMALL LETTER CHIN +2D1A;AL # GEORGIAN SMALL LETTER CAN +2D1B;AL # GEORGIAN SMALL LETTER JIL +2D1C;AL # GEORGIAN SMALL LETTER CIL +2D1D;AL # GEORGIAN SMALL LETTER CHAR +2D1E;AL # GEORGIAN SMALL LETTER XAN +2D1F;AL # GEORGIAN SMALL LETTER JHAN +2D20;AL # GEORGIAN SMALL LETTER HAE +2D21;AL # GEORGIAN SMALL LETTER HE +2D22;AL # GEORGIAN SMALL LETTER HIE +2D23;AL # GEORGIAN SMALL LETTER WE +2D24;AL # GEORGIAN SMALL LETTER HAR +2D25;AL # GEORGIAN SMALL LETTER HOE +2D30;AL # TIFINAGH LETTER YA +2D31;AL # TIFINAGH LETTER YAB +2D32;AL # TIFINAGH LETTER YABH +2D33;AL # TIFINAGH LETTER YAG +2D34;AL # TIFINAGH LETTER YAGHH +2D35;AL # TIFINAGH LETTER BERBER ACADEMY YAJ +2D36;AL # TIFINAGH LETTER YAJ +2D37;AL # TIFINAGH LETTER YAD +2D38;AL # TIFINAGH LETTER YADH +2D39;AL # TIFINAGH LETTER YADD +2D3A;AL # TIFINAGH LETTER YADDH +2D3B;AL # TIFINAGH LETTER YEY +2D3C;AL # TIFINAGH LETTER YAF +2D3D;AL # TIFINAGH LETTER YAK +2D3E;AL # TIFINAGH LETTER TUAREG YAK +2D3F;AL # TIFINAGH LETTER YAKHH +2D40;AL # TIFINAGH LETTER YAH +2D41;AL # TIFINAGH LETTER BERBER ACADEMY YAH +2D42;AL # TIFINAGH LETTER TUAREG YAH +2D43;AL # TIFINAGH LETTER YAHH +2D44;AL # TIFINAGH LETTER YAA +2D45;AL # TIFINAGH LETTER YAKH +2D46;AL # TIFINAGH LETTER TUAREG YAKH +2D47;AL # TIFINAGH LETTER YAQ +2D48;AL # TIFINAGH LETTER TUAREG YAQ +2D49;AL # TIFINAGH LETTER YI +2D4A;AL # TIFINAGH LETTER YAZH +2D4B;AL # TIFINAGH LETTER AHAGGAR YAZH +2D4C;AL # TIFINAGH LETTER TUAREG YAZH +2D4D;AL # TIFINAGH LETTER YAL +2D4E;AL # TIFINAGH LETTER YAM +2D4F;AL # TIFINAGH LETTER YAN +2D50;AL # TIFINAGH LETTER TUAREG YAGN +2D51;AL # TIFINAGH LETTER TUAREG YANG +2D52;AL # TIFINAGH LETTER YAP +2D53;AL # TIFINAGH LETTER YU +2D54;AL # TIFINAGH LETTER YAR +2D55;AL # TIFINAGH LETTER YARR +2D56;AL # TIFINAGH LETTER YAGH +2D57;AL # TIFINAGH LETTER TUAREG YAGH +2D58;AL # TIFINAGH LETTER AYER YAGH +2D59;AL # TIFINAGH LETTER YAS +2D5A;AL # TIFINAGH LETTER YASS +2D5B;AL # TIFINAGH LETTER YASH +2D5C;AL # TIFINAGH LETTER YAT +2D5D;AL # TIFINAGH LETTER YATH +2D5E;AL # TIFINAGH LETTER YACH +2D5F;AL # TIFINAGH LETTER YATT +2D60;AL # TIFINAGH LETTER YAV +2D61;AL # TIFINAGH LETTER YAW +2D62;AL # TIFINAGH LETTER YAY +2D63;AL # TIFINAGH LETTER YAZ +2D64;AL # TIFINAGH LETTER TAWELLEMET YAZ +2D65;AL # TIFINAGH LETTER YAZZ +2D6F;AL # TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D80;AL # ETHIOPIC SYLLABLE LOA +2D81;AL # ETHIOPIC SYLLABLE MOA +2D82;AL # ETHIOPIC SYLLABLE ROA +2D83;AL # ETHIOPIC SYLLABLE SOA +2D84;AL # ETHIOPIC SYLLABLE SHOA +2D85;AL # ETHIOPIC SYLLABLE BOA +2D86;AL # ETHIOPIC SYLLABLE TOA +2D87;AL # ETHIOPIC SYLLABLE COA +2D88;AL # ETHIOPIC SYLLABLE NOA +2D89;AL # ETHIOPIC SYLLABLE NYOA +2D8A;AL # ETHIOPIC SYLLABLE GLOTTAL OA +2D8B;AL # ETHIOPIC SYLLABLE ZOA +2D8C;AL # ETHIOPIC SYLLABLE DOA +2D8D;AL # ETHIOPIC SYLLABLE DDOA +2D8E;AL # ETHIOPIC SYLLABLE JOA +2D8F;AL # ETHIOPIC SYLLABLE THOA +2D90;AL # ETHIOPIC SYLLABLE CHOA +2D91;AL # ETHIOPIC SYLLABLE PHOA +2D92;AL # ETHIOPIC SYLLABLE POA +2D93;AL # ETHIOPIC SYLLABLE GGWA +2D94;AL # ETHIOPIC SYLLABLE GGWI +2D95;AL # ETHIOPIC SYLLABLE GGWEE +2D96;AL # ETHIOPIC SYLLABLE GGWE +2DA0;AL # ETHIOPIC SYLLABLE SSA +2DA1;AL # ETHIOPIC SYLLABLE SSU +2DA2;AL # ETHIOPIC SYLLABLE SSI +2DA3;AL # ETHIOPIC SYLLABLE SSAA +2DA4;AL # ETHIOPIC SYLLABLE SSEE +2DA5;AL # ETHIOPIC SYLLABLE SSE +2DA6;AL # ETHIOPIC SYLLABLE SSO +2DA8;AL # ETHIOPIC SYLLABLE CCA +2DA9;AL # ETHIOPIC SYLLABLE CCU +2DAA;AL # ETHIOPIC SYLLABLE CCI +2DAB;AL # ETHIOPIC SYLLABLE CCAA +2DAC;AL # ETHIOPIC SYLLABLE CCEE +2DAD;AL # ETHIOPIC SYLLABLE CCE +2DAE;AL # ETHIOPIC SYLLABLE CCO +2DB0;AL # ETHIOPIC SYLLABLE ZZA +2DB1;AL # ETHIOPIC SYLLABLE ZZU +2DB2;AL # ETHIOPIC SYLLABLE ZZI +2DB3;AL # ETHIOPIC SYLLABLE ZZAA +2DB4;AL # ETHIOPIC SYLLABLE ZZEE +2DB5;AL # ETHIOPIC SYLLABLE ZZE +2DB6;AL # ETHIOPIC SYLLABLE ZZO +2DB8;AL # ETHIOPIC SYLLABLE CCHA +2DB9;AL # ETHIOPIC SYLLABLE CCHU +2DBA;AL # ETHIOPIC SYLLABLE CCHI +2DBB;AL # ETHIOPIC SYLLABLE CCHAA +2DBC;AL # ETHIOPIC SYLLABLE CCHEE +2DBD;AL # ETHIOPIC SYLLABLE CCHE +2DBE;AL # ETHIOPIC SYLLABLE CCHO +2DC0;AL # ETHIOPIC SYLLABLE QYA +2DC1;AL # ETHIOPIC SYLLABLE QYU +2DC2;AL # ETHIOPIC SYLLABLE QYI +2DC3;AL # ETHIOPIC SYLLABLE QYAA +2DC4;AL # ETHIOPIC SYLLABLE QYEE +2DC5;AL # ETHIOPIC SYLLABLE QYE +2DC6;AL # ETHIOPIC SYLLABLE QYO +2DC8;AL # ETHIOPIC SYLLABLE KYA +2DC9;AL # ETHIOPIC SYLLABLE KYU +2DCA;AL # ETHIOPIC SYLLABLE KYI +2DCB;AL # ETHIOPIC SYLLABLE KYAA +2DCC;AL # ETHIOPIC SYLLABLE KYEE +2DCD;AL # ETHIOPIC SYLLABLE KYE +2DCE;AL # ETHIOPIC SYLLABLE KYO +2DD0;AL # ETHIOPIC SYLLABLE XYA +2DD1;AL # ETHIOPIC SYLLABLE XYU +2DD2;AL # ETHIOPIC SYLLABLE XYI +2DD3;AL # ETHIOPIC SYLLABLE XYAA +2DD4;AL # ETHIOPIC SYLLABLE XYEE +2DD5;AL # ETHIOPIC SYLLABLE XYE +2DD6;AL # ETHIOPIC SYLLABLE XYO +2DD8;AL # ETHIOPIC SYLLABLE GYA +2DD9;AL # ETHIOPIC SYLLABLE GYU +2DDA;AL # ETHIOPIC SYLLABLE GYI +2DDB;AL # ETHIOPIC SYLLABLE GYAA +2DDC;AL # ETHIOPIC SYLLABLE GYEE +2DDD;AL # ETHIOPIC SYLLABLE GYE +2DDE;AL # ETHIOPIC SYLLABLE GYO +2E00;QU # RIGHT ANGLE SUBSTITUTION MARKER +2E01;QU # RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02;QU # LEFT SUBSTITUTION BRACKET +2E03;QU # RIGHT SUBSTITUTION BRACKET +2E04;QU # LEFT DOTTED SUBSTITUTION BRACKET +2E05;QU # RIGHT DOTTED SUBSTITUTION BRACKET +2E06;QU # RAISED INTERPOLATION MARKER +2E07;QU # RAISED DOTTED INTERPOLATION MARKER +2E08;QU # DOTTED TRANSPOSITION MARKER +2E09;QU # LEFT TRANSPOSITION BRACKET +2E0A;QU # RIGHT TRANSPOSITION BRACKET +2E0B;QU # RAISED SQUARE +2E0C;QU # LEFT RAISED OMISSION BRACKET +2E0D;QU # RIGHT RAISED OMISSION BRACKET +2E0E;BA # EDITORIAL CORONIS +2E0F;BA # PARAGRAPHOS +2E10;BA # FORKED PARAGRAPHOS +2E11;BA # REVERSED FORKED PARAGRAPHOS +2E12;BA # HYPODIASTOLE +2E13;BA # DOTTED OBELOS +2E14;BA # DOWNWARDS ANCORA +2E15;BA # UPWARDS ANCORA +2E16;AL # DOTTED RIGHT-POINTING ANGLE +2E17;BA # DOUBLE OBLIQUE HYPHEN +2E1C;QU # LEFT LOW PARAPHRASE BRACKET +2E1D;QU # RIGHT LOW PARAPHRASE BRACKET +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;NS # KATAKANA-HIRAGANA PROLONGED SOUND MARK +30FD;NS # KATAKANA ITERATION MARK +30FE;NS # 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 +31C0;ID # CJK STROKE T +31C1;ID # CJK STROKE WG +31C2;ID # CJK STROKE XG +31C3;ID # CJK STROKE BXG +31C4;ID # CJK STROKE SW +31C5;ID # CJK STROKE HZZ +31C6;ID # CJK STROKE HZG +31C7;ID # CJK STROKE HP +31C8;ID # CJK STROKE HZWG +31C9;ID # CJK STROKE SZWG +31CA;ID # CJK STROKE HZT +31CB;ID # CJK STROKE HZZP +31CC;ID # CJK STROKE HPWG +31CD;ID # CJK STROKE HZW +31CE;ID # CJK STROKE HZZZ +31CF;ID # CJK STROKE N +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 +321D;ID # PARENTHESIZED KOREAN CHARACTER OJEON +321E;ID # PARENTHESIZED KOREAN CHARACTER O HU +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 +3250;ID # PARTNERSHIP SIGN +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 +327C;ID # CIRCLED KOREAN CHARACTER CHAMKO +327D;ID # CIRCLED KOREAN CHARACTER JUEUI +327E;ID # CIRCLED HANGUL IEUNG U +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 +32CC;ID # SQUARE HG +32CD;ID # SQUARE ERG +32CE;ID # SQUARE EV +32CF;ID # LIMITED LIABILITY SIGN +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 +3377;ID # SQUARE DM +3378;ID # SQUARE DM SQUARED +3379;ID # SQUARE DM CUBED +337A;ID # SQUARE IU +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 +33DE;ID # SQUARE V OVER M +33DF;ID # SQUARE A OVER M +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 +33FF;ID # SQUARE GAL +3400..4DB5;ID # <CJK Ideograph Extension A, First>..<CJK Ideograph Extension A, Last> +4DC0;AL # HEXAGRAM FOR THE CREATIVE HEAVEN +4DC1;AL # HEXAGRAM FOR THE RECEPTIVE EARTH +4DC2;AL # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING +4DC3;AL # HEXAGRAM FOR YOUTHFUL FOLLY +4DC4;AL # HEXAGRAM FOR WAITING +4DC5;AL # HEXAGRAM FOR CONFLICT +4DC6;AL # HEXAGRAM FOR THE ARMY +4DC7;AL # HEXAGRAM FOR HOLDING TOGETHER +4DC8;AL # HEXAGRAM FOR SMALL TAMING +4DC9;AL # HEXAGRAM FOR TREADING +4DCA;AL # HEXAGRAM FOR PEACE +4DCB;AL # HEXAGRAM FOR STANDSTILL +4DCC;AL # HEXAGRAM FOR FELLOWSHIP +4DCD;AL # HEXAGRAM FOR GREAT POSSESSION +4DCE;AL # HEXAGRAM FOR MODESTY +4DCF;AL # HEXAGRAM FOR ENTHUSIASM +4DD0;AL # HEXAGRAM FOR FOLLOWING +4DD1;AL # HEXAGRAM FOR WORK ON THE DECAYED +4DD2;AL # HEXAGRAM FOR APPROACH +4DD3;AL # HEXAGRAM FOR CONTEMPLATION +4DD4;AL # HEXAGRAM FOR BITING THROUGH +4DD5;AL # HEXAGRAM FOR GRACE +4DD6;AL # HEXAGRAM FOR SPLITTING APART +4DD7;AL # HEXAGRAM FOR RETURN +4DD8;AL # HEXAGRAM FOR INNOCENCE +4DD9;AL # HEXAGRAM FOR GREAT TAMING +4DDA;AL # HEXAGRAM FOR MOUTH CORNERS +4DDB;AL # HEXAGRAM FOR GREAT PREPONDERANCE +4DDC;AL # HEXAGRAM FOR THE ABYSMAL WATER +4DDD;AL # HEXAGRAM FOR THE CLINGING FIRE +4DDE;AL # HEXAGRAM FOR INFLUENCE +4DDF;AL # HEXAGRAM FOR DURATION +4DE0;AL # HEXAGRAM FOR RETREAT +4DE1;AL # HEXAGRAM FOR GREAT POWER +4DE2;AL # HEXAGRAM FOR PROGRESS +4DE3;AL # HEXAGRAM FOR DARKENING OF THE LIGHT +4DE4;AL # HEXAGRAM FOR THE FAMILY +4DE5;AL # HEXAGRAM FOR OPPOSITION +4DE6;AL # HEXAGRAM FOR OBSTRUCTION +4DE7;AL # HEXAGRAM FOR DELIVERANCE +4DE8;AL # HEXAGRAM FOR DECREASE +4DE9;AL # HEXAGRAM FOR INCREASE +4DEA;AL # HEXAGRAM FOR BREAKTHROUGH +4DEB;AL # HEXAGRAM FOR COMING TO MEET +4DEC;AL # HEXAGRAM FOR GATHERING TOGETHER +4DED;AL # HEXAGRAM FOR PUSHING UPWARD +4DEE;AL # HEXAGRAM FOR OPPRESSION +4DEF;AL # HEXAGRAM FOR THE WELL +4DF0;AL # HEXAGRAM FOR REVOLUTION +4DF1;AL # HEXAGRAM FOR THE CAULDRON +4DF2;AL # HEXAGRAM FOR THE AROUSING THUNDER +4DF3;AL # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN +4DF4;AL # HEXAGRAM FOR DEVELOPMENT +4DF5;AL # HEXAGRAM FOR THE MARRYING MAIDEN +4DF6;AL # HEXAGRAM FOR ABUNDANCE +4DF7;AL # HEXAGRAM FOR THE WANDERER +4DF8;AL # HEXAGRAM FOR THE GENTLE WIND +4DF9;AL # HEXAGRAM FOR THE JOYOUS LAKE +4DFA;AL # HEXAGRAM FOR DISPERSION +4DFB;AL # HEXAGRAM FOR LIMITATION +4DFC;AL # HEXAGRAM FOR INNER TRUTH +4DFD;AL # HEXAGRAM FOR SMALL PREPONDERANCE +4DFE;AL # HEXAGRAM FOR AFTER COMPLETION +4DFF;AL # HEXAGRAM FOR BEFORE COMPLETION +4E00..9FBB;ID # <CJK Ideograph, First>..<CJK Ideograph, Last> +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;NS # 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 +A700;AL # MODIFIER LETTER CHINESE TONE YIN PING +A701;AL # MODIFIER LETTER CHINESE TONE YANG PING +A702;AL # MODIFIER LETTER CHINESE TONE YIN SHANG +A703;AL # MODIFIER LETTER CHINESE TONE YANG SHANG +A704;AL # MODIFIER LETTER CHINESE TONE YIN QU +A705;AL # MODIFIER LETTER CHINESE TONE YANG QU +A706;AL # MODIFIER LETTER CHINESE TONE YIN RU +A707;AL # MODIFIER LETTER CHINESE TONE YANG RU +A708;AL # MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR +A709;AL # MODIFIER LETTER HIGH DOTTED TONE BAR +A70A;AL # MODIFIER LETTER MID DOTTED TONE BAR +A70B;AL # MODIFIER LETTER LOW DOTTED TONE BAR +A70C;AL # MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR +A70D;AL # MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR +A70E;AL # MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR +A70F;AL # MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR +A710;AL # MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR +A711;AL # MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR +A712;AL # MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR +A713;AL # MODIFIER LETTER HIGH LEFT-STEM TONE BAR +A714;AL # MODIFIER LETTER MID LEFT-STEM TONE BAR +A715;AL # MODIFIER LETTER LOW LEFT-STEM TONE BAR +A716;AL # MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A800;AL # SYLOTI NAGRI LETTER A +A801;AL # SYLOTI NAGRI LETTER I +A802;CM # SYLOTI NAGRI SIGN DVISVARA +A803;AL # SYLOTI NAGRI LETTER U +A804;AL # SYLOTI NAGRI LETTER E +A805;AL # SYLOTI NAGRI LETTER O +A806;CM # SYLOTI NAGRI SIGN HASANTA +A807;AL # SYLOTI NAGRI LETTER KO +A808;AL # SYLOTI NAGRI LETTER KHO +A809;AL # SYLOTI NAGRI LETTER GO +A80A;AL # SYLOTI NAGRI LETTER GHO +A80B;CM # SYLOTI NAGRI SIGN ANUSVARA +A80C;AL # SYLOTI NAGRI LETTER CO +A80D;AL # SYLOTI NAGRI LETTER CHO +A80E;AL # SYLOTI NAGRI LETTER JO +A80F;AL # SYLOTI NAGRI LETTER JHO +A810;AL # SYLOTI NAGRI LETTER TTO +A811;AL # SYLOTI NAGRI LETTER TTHO +A812;AL # SYLOTI NAGRI LETTER DDO +A813;AL # SYLOTI NAGRI LETTER DDHO +A814;AL # SYLOTI NAGRI LETTER TO +A815;AL # SYLOTI NAGRI LETTER THO +A816;AL # SYLOTI NAGRI LETTER DO +A817;AL # SYLOTI NAGRI LETTER DHO +A818;AL # SYLOTI NAGRI LETTER NO +A819;AL # SYLOTI NAGRI LETTER PO +A81A;AL # SYLOTI NAGRI LETTER PHO +A81B;AL # SYLOTI NAGRI LETTER BO +A81C;AL # SYLOTI NAGRI LETTER BHO +A81D;AL # SYLOTI NAGRI LETTER MO +A81E;AL # SYLOTI NAGRI LETTER RO +A81F;AL # SYLOTI NAGRI LETTER LO +A820;AL # SYLOTI NAGRI LETTER RRO +A821;AL # SYLOTI NAGRI LETTER SO +A822;AL # SYLOTI NAGRI LETTER HO +A823;CM # SYLOTI NAGRI VOWEL SIGN A +A824;CM # SYLOTI NAGRI VOWEL SIGN I +A825;CM # SYLOTI NAGRI VOWEL SIGN U +A826;CM # SYLOTI NAGRI VOWEL SIGN E +A827;CM # SYLOTI NAGRI VOWEL SIGN OO +A828;AL # SYLOTI NAGRI POETRY MARK-1 +A829;AL # SYLOTI NAGRI POETRY MARK-2 +A82A;AL # SYLOTI NAGRI POETRY MARK-3 +A82B;AL # SYLOTI NAGRI POETRY MARK-4 +AC00;H2 # HANGUL SYLLABLE GA +AC01..AC1B;H3 # HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH +AC1C;H2 # HANGUL SYLLABLE GAE +AC1D..AC37;H3 # HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH +AC38;H2 # HANGUL SYLLABLE GYA +AC39..AC53;H3 # HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH +AC54;H2 # HANGUL SYLLABLE GYAE +AC55..AC6F;H3 # HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH +AC70;H2 # HANGUL SYLLABLE GEO +AC71..AC8B;H3 # HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH +AC8C;H2 # HANGUL SYLLABLE GE +AC8D..ACA7;H3 # HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH +ACA8;H2 # HANGUL SYLLABLE GYEO +ACA9..ACC3;H3 # HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH +ACC4;H2 # HANGUL SYLLABLE GYE +ACC5..ACDF;H3 # HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH +ACE0;H2 # HANGUL SYLLABLE GO +ACE1..ACFB;H3 # HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH +ACFC;H2 # HANGUL SYLLABLE GWA +ACFD..AD17;H3 # HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH +AD18;H2 # HANGUL SYLLABLE GWAE +AD19..AD33;H3 # HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH +AD34;H2 # HANGUL SYLLABLE GOE +AD35..AD4F;H3 # HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH +AD50;H2 # HANGUL SYLLABLE GYO +AD51..AD6B;H3 # HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH +AD6C;H2 # HANGUL SYLLABLE GU +AD6D..AD87;H3 # HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH +AD88;H2 # HANGUL SYLLABLE GWEO +AD89..ADA3;H3 # HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH +ADA4;H2 # HANGUL SYLLABLE GWE +ADA5..ADBF;H3 # HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH +ADC0;H2 # HANGUL SYLLABLE GWI +ADC1..ADDB;H3 # HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH +ADDC;H2 # HANGUL SYLLABLE GYU +ADDD..ADF7;H3 # HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH +ADF8;H2 # HANGUL SYLLABLE GEU +ADF9..AE13;H3 # HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH +AE14;H2 # HANGUL SYLLABLE GYI +AE15..AE2F;H3 # HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH +AE30;H2 # HANGUL SYLLABLE GI +AE31..AE4B;H3 # HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH +AE4C;H2 # HANGUL SYLLABLE GGA +AE4D..AE67;H3 # HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH +AE68;H2 # HANGUL SYLLABLE GGAE +AE69..AE83;H3 # HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH +AE84;H2 # HANGUL SYLLABLE GGYA +AE85..AE9F;H3 # HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH +AEA0;H2 # HANGUL SYLLABLE GGYAE +AEA1..AEBB;H3 # HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH +AEBC;H2 # HANGUL SYLLABLE GGEO +AEBD..AED7;H3 # HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH +AED8;H2 # HANGUL SYLLABLE GGE +AED9..AEF3;H3 # HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH +AEF4;H2 # HANGUL SYLLABLE GGYEO +AEF5..AF0F;H3 # HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH +AF10;H2 # HANGUL SYLLABLE GGYE +AF11..AF2B;H3 # HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH +AF2C;H2 # HANGUL SYLLABLE GGO +AF2D..AF47;H3 # HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH +AF48;H2 # HANGUL SYLLABLE GGWA +AF49..AF63;H3 # HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH +AF64;H2 # HANGUL SYLLABLE GGWAE +AF65..AF7F;H3 # HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH +AF80;H2 # HANGUL SYLLABLE GGOE +AF81..AF9B;H3 # HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH +AF9C;H2 # HANGUL SYLLABLE GGYO +AF9D..AFB7;H3 # HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH +AFB8;H2 # HANGUL SYLLABLE GGU +AFB9..AFD3;H3 # HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH +AFD4;H2 # HANGUL SYLLABLE GGWEO +AFD5..AFEF;H3 # HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH +AFF0;H2 # HANGUL SYLLABLE GGWE +AFF1..B00B;H3 # HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH +B00C;H2 # HANGUL SYLLABLE GGWI +B00D..B027;H3 # HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH +B028;H2 # HANGUL SYLLABLE GGYU +B029..B043;H3 # HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH +B044;H2 # HANGUL SYLLABLE GGEU +B045..B05F;H3 # HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH +B060;H2 # HANGUL SYLLABLE GGYI +B061..B07B;H3 # HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH +B07C;H2 # HANGUL SYLLABLE GGI +B07D..B097;H3 # HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH +B098;H2 # HANGUL SYLLABLE NA +B099..B0B3;H3 # HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH +B0B4;H2 # HANGUL SYLLABLE NAE +B0B5..B0CF;H3 # HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH +B0D0;H2 # HANGUL SYLLABLE NYA +B0D1..B0EB;H3 # HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH +B0EC;H2 # HANGUL SYLLABLE NYAE +B0ED..B107;H3 # HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH +B108;H2 # HANGUL SYLLABLE NEO +B109..B123;H3 # HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH +B124;H2 # HANGUL SYLLABLE NE +B125..B13F;H3 # HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH +B140;H2 # HANGUL SYLLABLE NYEO +B141..B15B;H3 # HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH +B15C;H2 # HANGUL SYLLABLE NYE +B15D..B177;H3 # HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH +B178;H2 # HANGUL SYLLABLE NO +B179..B193;H3 # HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH +B194;H2 # HANGUL SYLLABLE NWA +B195..B1AF;H3 # HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH +B1B0;H2 # HANGUL SYLLABLE NWAE +B1B1..B1CB;H3 # HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH +B1CC;H2 # HANGUL SYLLABLE NOE +B1CD..B1E7;H3 # HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH +B1E8;H2 # HANGUL SYLLABLE NYO +B1E9..B203;H3 # HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH +B204;H2 # HANGUL SYLLABLE NU +B205..B21F;H3 # HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH +B220;H2 # HANGUL SYLLABLE NWEO +B221..B23B;H3 # HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH +B23C;H2 # HANGUL SYLLABLE NWE +B23D..B257;H3 # HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH +B258;H2 # HANGUL SYLLABLE NWI +B259..B273;H3 # HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH +B274;H2 # HANGUL SYLLABLE NYU +B275..B28F;H3 # HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH +B290;H2 # HANGUL SYLLABLE NEU +B291..B2AB;H3 # HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH +B2AC;H2 # HANGUL SYLLABLE NYI +B2AD..B2C7;H3 # HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH +B2C8;H2 # HANGUL SYLLABLE NI +B2C9..B2E3;H3 # HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH +B2E4;H2 # HANGUL SYLLABLE DA +B2E5..B2FF;H3 # HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH +B300;H2 # HANGUL SYLLABLE DAE +B301..B31B;H3 # HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH +B31C;H2 # HANGUL SYLLABLE DYA +B31D..B337;H3 # HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH +B338;H2 # HANGUL SYLLABLE DYAE +B339..B353;H3 # HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH +B354;H2 # HANGUL SYLLABLE DEO +B355..B36F;H3 # HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH +B370;H2 # HANGUL SYLLABLE DE +B371..B38B;H3 # HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH +B38C;H2 # HANGUL SYLLABLE DYEO +B38D..B3A7;H3 # HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH +B3A8;H2 # HANGUL SYLLABLE DYE +B3A9..B3C3;H3 # HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH +B3C4;H2 # HANGUL SYLLABLE DO +B3C5..B3DF;H3 # HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH +B3E0;H2 # HANGUL SYLLABLE DWA +B3E1..B3FB;H3 # HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH +B3FC;H2 # HANGUL SYLLABLE DWAE +B3FD..B417;H3 # HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH +B418;H2 # HANGUL SYLLABLE DOE +B419..B433;H3 # HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH +B434;H2 # HANGUL SYLLABLE DYO +B435..B44F;H3 # HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH +B450;H2 # HANGUL SYLLABLE DU +B451..B46B;H3 # HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH +B46C;H2 # HANGUL SYLLABLE DWEO +B46D..B487;H3 # HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH +B488;H2 # HANGUL SYLLABLE DWE +B489..B4A3;H3 # HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH +B4A4;H2 # HANGUL SYLLABLE DWI +B4A5..B4BF;H3 # HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH +B4C0;H2 # HANGUL SYLLABLE DYU +B4C1..B4DB;H3 # HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH +B4DC;H2 # HANGUL SYLLABLE DEU +B4DD..B4F7;H3 # HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH +B4F8;H2 # HANGUL SYLLABLE DYI +B4F9..B513;H3 # HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH +B514;H2 # HANGUL SYLLABLE DI +B515..B52F;H3 # HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH +B530;H2 # HANGUL SYLLABLE DDA +B531..B54B;H3 # HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH +B54C;H2 # HANGUL SYLLABLE DDAE +B54D..B567;H3 # HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH +B568;H2 # HANGUL SYLLABLE DDYA +B569..B583;H3 # HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH +B584;H2 # HANGUL SYLLABLE DDYAE +B585..B59F;H3 # HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH +B5A0;H2 # HANGUL SYLLABLE DDEO +B5A1..B5BB;H3 # HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH +B5BC;H2 # HANGUL SYLLABLE DDE +B5BD..B5D7;H3 # HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH +B5D8;H2 # HANGUL SYLLABLE DDYEO +B5D9..B5F3;H3 # HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH +B5F4;H2 # HANGUL SYLLABLE DDYE +B5F5..B60F;H3 # HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH +B610;H2 # HANGUL SYLLABLE DDO +B611..B62B;H3 # HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH +B62C;H2 # HANGUL SYLLABLE DDWA +B62D..B647;H3 # HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH +B648;H2 # HANGUL SYLLABLE DDWAE +B649..B663;H3 # HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH +B664;H2 # HANGUL SYLLABLE DDOE +B665..B67F;H3 # HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH +B680;H2 # HANGUL SYLLABLE DDYO +B681..B69B;H3 # HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH +B69C;H2 # HANGUL SYLLABLE DDU +B69D..B6B7;H3 # HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH +B6B8;H2 # HANGUL SYLLABLE DDWEO +B6B9..B6D3;H3 # HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH +B6D4;H2 # HANGUL SYLLABLE DDWE +B6D5..B6EF;H3 # HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH +B6F0;H2 # HANGUL SYLLABLE DDWI +B6F1..B70B;H3 # HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH +B70C;H2 # HANGUL SYLLABLE DDYU +B70D..B727;H3 # HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH +B728;H2 # HANGUL SYLLABLE DDEU +B729..B743;H3 # HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH +B744;H2 # HANGUL SYLLABLE DDYI +B745..B75F;H3 # HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH +B760;H2 # HANGUL SYLLABLE DDI +B761..B77B;H3 # HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH +B77C;H2 # HANGUL SYLLABLE RA +B77D..B797;H3 # HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH +B798;H2 # HANGUL SYLLABLE RAE +B799..B7B3;H3 # HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH +B7B4;H2 # HANGUL SYLLABLE RYA +B7B5..B7CF;H3 # HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH +B7D0;H2 # HANGUL SYLLABLE RYAE +B7D1..B7EB;H3 # HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH +B7EC;H2 # HANGUL SYLLABLE REO +B7ED..B807;H3 # HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH +B808;H2 # HANGUL SYLLABLE RE +B809..B823;H3 # HANGUL SYLLABLE REG..HANGUL SYLLABLE REH +B824;H2 # HANGUL SYLLABLE RYEO +B825..B83F;H3 # HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH +B840;H2 # HANGUL SYLLABLE RYE +B841..B85B;H3 # HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH +B85C;H2 # HANGUL SYLLABLE RO +B85D..B877;H3 # HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH +B878;H2 # HANGUL SYLLABLE RWA +B879..B893;H3 # HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH +B894;H2 # HANGUL SYLLABLE RWAE +B895..B8AF;H3 # HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH +B8B0;H2 # HANGUL SYLLABLE ROE +B8B1..B8CB;H3 # HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH +B8CC;H2 # HANGUL SYLLABLE RYO +B8CD..B8E7;H3 # HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH +B8E8;H2 # HANGUL SYLLABLE RU +B8E9..B903;H3 # HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH +B904;H2 # HANGUL SYLLABLE RWEO +B905..B91F;H3 # HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH +B920;H2 # HANGUL SYLLABLE RWE +B921..B93B;H3 # HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH +B93C;H2 # HANGUL SYLLABLE RWI +B93D..B957;H3 # HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH +B958;H2 # HANGUL SYLLABLE RYU +B959..B973;H3 # HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH +B974;H2 # HANGUL SYLLABLE REU +B975..B98F;H3 # HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH +B990;H2 # HANGUL SYLLABLE RYI +B991..B9AB;H3 # HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH +B9AC;H2 # HANGUL SYLLABLE RI +B9AD..B9C7;H3 # HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH +B9C8;H2 # HANGUL SYLLABLE MA +B9C9..B9E3;H3 # HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH +B9E4;H2 # HANGUL SYLLABLE MAE +B9E5..B9FF;H3 # HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH +BA00;H2 # HANGUL SYLLABLE MYA +BA01..BA1B;H3 # HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH +BA1C;H2 # HANGUL SYLLABLE MYAE +BA1D..BA37;H3 # HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH +BA38;H2 # HANGUL SYLLABLE MEO +BA39..BA53;H3 # HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH +BA54;H2 # HANGUL SYLLABLE ME +BA55..BA6F;H3 # HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH +BA70;H2 # HANGUL SYLLABLE MYEO +BA71..BA8B;H3 # HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH +BA8C;H2 # HANGUL SYLLABLE MYE +BA8D..BAA7;H3 # HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH +BAA8;H2 # HANGUL SYLLABLE MO +BAA9..BAC3;H3 # HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH +BAC4;H2 # HANGUL SYLLABLE MWA +BAC5..BADF;H3 # HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH +BAE0;H2 # HANGUL SYLLABLE MWAE +BAE1..BAFB;H3 # HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH +BAFC;H2 # HANGUL SYLLABLE MOE +BAFD..BB17;H3 # HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH +BB18;H2 # HANGUL SYLLABLE MYO +BB19..BB33;H3 # HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH +BB34;H2 # HANGUL SYLLABLE MU +BB35..BB4F;H3 # HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH +BB50;H2 # HANGUL SYLLABLE MWEO +BB51..BB6B;H3 # HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH +BB6C;H2 # HANGUL SYLLABLE MWE +BB6D..BB87;H3 # HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH +BB88;H2 # HANGUL SYLLABLE MWI +BB89..BBA3;H3 # HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH +BBA4;H2 # HANGUL SYLLABLE MYU +BBA5..BBBF;H3 # HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH +BBC0;H2 # HANGUL SYLLABLE MEU +BBC1..BBDB;H3 # HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH +BBDC;H2 # HANGUL SYLLABLE MYI +BBDD..BBF7;H3 # HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH +BBF8;H2 # HANGUL SYLLABLE MI +BBF9..BC13;H3 # HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH +BC14;H2 # HANGUL SYLLABLE BA +BC15..BC2F;H3 # HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH +BC30;H2 # HANGUL SYLLABLE BAE +BC31..BC4B;H3 # HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH +BC4C;H2 # HANGUL SYLLABLE BYA +BC4D..BC67;H3 # HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH +BC68;H2 # HANGUL SYLLABLE BYAE +BC69..BC83;H3 # HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH +BC84;H2 # HANGUL SYLLABLE BEO +BC85..BC9F;H3 # HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH +BCA0;H2 # HANGUL SYLLABLE BE +BCA1..BCBB;H3 # HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH +BCBC;H2 # HANGUL SYLLABLE BYEO +BCBD..BCD7;H3 # HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH +BCD8;H2 # HANGUL SYLLABLE BYE +BCD9..BCF3;H3 # HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH +BCF4;H2 # HANGUL SYLLABLE BO +BCF5..BD0F;H3 # HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH +BD10;H2 # HANGUL SYLLABLE BWA +BD11..BD2B;H3 # HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH +BD2C;H2 # HANGUL SYLLABLE BWAE +BD2D..BD47;H3 # HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH +BD48;H2 # HANGUL SYLLABLE BOE +BD49..BD63;H3 # HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH +BD64;H2 # HANGUL SYLLABLE BYO +BD65..BD7F;H3 # HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH +BD80;H2 # HANGUL SYLLABLE BU +BD81..BD9B;H3 # HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH +BD9C;H2 # HANGUL SYLLABLE BWEO +BD9D..BDB7;H3 # HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH +BDB8;H2 # HANGUL SYLLABLE BWE +BDB9..BDD3;H3 # HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH +BDD4;H2 # HANGUL SYLLABLE BWI +BDD5..BDEF;H3 # HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH +BDF0;H2 # HANGUL SYLLABLE BYU +BDF1..BE0B;H3 # HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH +BE0C;H2 # HANGUL SYLLABLE BEU +BE0D..BE27;H3 # HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH +BE28;H2 # HANGUL SYLLABLE BYI +BE29..BE43;H3 # HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH +BE44;H2 # HANGUL SYLLABLE BI +BE45..BE5F;H3 # HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH +BE60;H2 # HANGUL SYLLABLE BBA +BE61..BE7B;H3 # HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH +BE7C;H2 # HANGUL SYLLABLE BBAE +BE7D..BE97;H3 # HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH +BE98;H2 # HANGUL SYLLABLE BBYA +BE99..BEB3;H3 # HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH +BEB4;H2 # HANGUL SYLLABLE BBYAE +BEB5..BECF;H3 # HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH +BED0;H2 # HANGUL SYLLABLE BBEO +BED1..BEEB;H3 # HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH +BEEC;H2 # HANGUL SYLLABLE BBE +BEED..BF07;H3 # HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH +BF08;H2 # HANGUL SYLLABLE BBYEO +BF09..BF23;H3 # HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH +BF24;H2 # HANGUL SYLLABLE BBYE +BF25..BF3F;H3 # HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH +BF40;H2 # HANGUL SYLLABLE BBO +BF41..BF5B;H3 # HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH +BF5C;H2 # HANGUL SYLLABLE BBWA +BF5D..BF77;H3 # HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH +BF78;H2 # HANGUL SYLLABLE BBWAE +BF79..BF93;H3 # HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH +BF94;H2 # HANGUL SYLLABLE BBOE +BF95..BFAF;H3 # HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH +BFB0;H2 # HANGUL SYLLABLE BBYO +BFB1..BFCB;H3 # HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH +BFCC;H2 # HANGUL SYLLABLE BBU +BFCD..BFE7;H3 # HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH +BFE8;H2 # HANGUL SYLLABLE BBWEO +BFE9..C003;H3 # HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH +C004;H2 # HANGUL SYLLABLE BBWE +C005..C01F;H3 # HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH +C020;H2 # HANGUL SYLLABLE BBWI +C021..C03B;H3 # HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH +C03C;H2 # HANGUL SYLLABLE BBYU +C03D..C057;H3 # HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH +C058;H2 # HANGUL SYLLABLE BBEU +C059..C073;H3 # HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH +C074;H2 # HANGUL SYLLABLE BBYI +C075..C08F;H3 # HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH +C090;H2 # HANGUL SYLLABLE BBI +C091..C0AB;H3 # HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH +C0AC;H2 # HANGUL SYLLABLE SA +C0AD..C0C7;H3 # HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH +C0C8;H2 # HANGUL SYLLABLE SAE +C0C9..C0E3;H3 # HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH +C0E4;H2 # HANGUL SYLLABLE SYA +C0E5..C0FF;H3 # HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH +C100;H2 # HANGUL SYLLABLE SYAE +C101..C11B;H3 # HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH +C11C;H2 # HANGUL SYLLABLE SEO +C11D..C137;H3 # HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH +C138;H2 # HANGUL SYLLABLE SE +C139..C153;H3 # HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH +C154;H2 # HANGUL SYLLABLE SYEO +C155..C16F;H3 # HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH +C170;H2 # HANGUL SYLLABLE SYE +C171..C18B;H3 # HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH +C18C;H2 # HANGUL SYLLABLE SO +C18D..C1A7;H3 # HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH +C1A8;H2 # HANGUL SYLLABLE SWA +C1A9..C1C3;H3 # HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH +C1C4;H2 # HANGUL SYLLABLE SWAE +C1C5..C1DF;H3 # HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH +C1E0;H2 # HANGUL SYLLABLE SOE +C1E1..C1FB;H3 # HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH +C1FC;H2 # HANGUL SYLLABLE SYO +C1FD..C217;H3 # HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH +C218;H2 # HANGUL SYLLABLE SU +C219..C233;H3 # HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH +C234;H2 # HANGUL SYLLABLE SWEO +C235..C24F;H3 # HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH +C250;H2 # HANGUL SYLLABLE SWE +C251..C26B;H3 # HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH +C26C;H2 # HANGUL SYLLABLE SWI +C26D..C287;H3 # HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH +C288;H2 # HANGUL SYLLABLE SYU +C289..C2A3;H3 # HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH +C2A4;H2 # HANGUL SYLLABLE SEU +C2A5..C2BF;H3 # HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH +C2C0;H2 # HANGUL SYLLABLE SYI +C2C1..C2DB;H3 # HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH +C2DC;H2 # HANGUL SYLLABLE SI +C2DD..C2F7;H3 # HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH +C2F8;H2 # HANGUL SYLLABLE SSA +C2F9..C313;H3 # HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH +C314;H2 # HANGUL SYLLABLE SSAE +C315..C32F;H3 # HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH +C330;H2 # HANGUL SYLLABLE SSYA +C331..C34B;H3 # HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH +C34C;H2 # HANGUL SYLLABLE SSYAE +C34D..C367;H3 # HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH +C368;H2 # HANGUL SYLLABLE SSEO +C369..C383;H3 # HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH +C384;H2 # HANGUL SYLLABLE SSE +C385..C39F;H3 # HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH +C3A0;H2 # HANGUL SYLLABLE SSYEO +C3A1..C3BB;H3 # HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH +C3BC;H2 # HANGUL SYLLABLE SSYE +C3BD..C3D7;H3 # HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH +C3D8;H2 # HANGUL SYLLABLE SSO +C3D9..C3F3;H3 # HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH +C3F4;H2 # HANGUL SYLLABLE SSWA +C3F5..C40F;H3 # HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH +C410;H2 # HANGUL SYLLABLE SSWAE +C411..C42B;H3 # HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH +C42C;H2 # HANGUL SYLLABLE SSOE +C42D..C447;H3 # HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH +C448;H2 # HANGUL SYLLABLE SSYO +C449..C463;H3 # HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH +C464;H2 # HANGUL SYLLABLE SSU +C465..C47F;H3 # HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH +C480;H2 # HANGUL SYLLABLE SSWEO +C481..C49B;H3 # HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH +C49C;H2 # HANGUL SYLLABLE SSWE +C49D..C4B7;H3 # HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH +C4B8;H2 # HANGUL SYLLABLE SSWI +C4B9..C4D3;H3 # HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH +C4D4;H2 # HANGUL SYLLABLE SSYU +C4D5..C4EF;H3 # HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH +C4F0;H2 # HANGUL SYLLABLE SSEU +C4F1..C50B;H3 # HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH +C50C;H2 # HANGUL SYLLABLE SSYI +C50D..C527;H3 # HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH +C528;H2 # HANGUL SYLLABLE SSI +C529..C543;H3 # HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH +C544;H2 # HANGUL SYLLABLE A +C545..C55F;H3 # HANGUL SYLLABLE AG..HANGUL SYLLABLE AH +C560;H2 # HANGUL SYLLABLE AE +C561..C57B;H3 # HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH +C57C;H2 # HANGUL SYLLABLE YA +C57D..C597;H3 # HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH +C598;H2 # HANGUL SYLLABLE YAE +C599..C5B3;H3 # HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH +C5B4;H2 # HANGUL SYLLABLE EO +C5B5..C5CF;H3 # HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH +C5D0;H2 # HANGUL SYLLABLE E +C5D1..C5EB;H3 # HANGUL SYLLABLE EG..HANGUL SYLLABLE EH +C5EC;H2 # HANGUL SYLLABLE YEO +C5ED..C607;H3 # HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH +C608;H2 # HANGUL SYLLABLE YE +C609..C623;H3 # HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH +C624;H2 # HANGUL SYLLABLE O +C625..C63F;H3 # HANGUL SYLLABLE OG..HANGUL SYLLABLE OH +C640;H2 # HANGUL SYLLABLE WA +C641..C65B;H3 # HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH +C65C;H2 # HANGUL SYLLABLE WAE +C65D..C677;H3 # HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH +C678;H2 # HANGUL SYLLABLE OE +C679..C693;H3 # HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH +C694;H2 # HANGUL SYLLABLE YO +C695..C6AF;H3 # HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH +C6B0;H2 # HANGUL SYLLABLE U +C6B1..C6CB;H3 # HANGUL SYLLABLE UG..HANGUL SYLLABLE UH +C6CC;H2 # HANGUL SYLLABLE WEO +C6CD..C6E7;H3 # HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH +C6E8;H2 # HANGUL SYLLABLE WE +C6E9..C703;H3 # HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH +C704;H2 # HANGUL SYLLABLE WI +C705..C71F;H3 # HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH +C720;H2 # HANGUL SYLLABLE YU +C721..C73B;H3 # HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH +C73C;H2 # HANGUL SYLLABLE EU +C73D..C757;H3 # HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH +C758;H2 # HANGUL SYLLABLE YI +C759..C773;H3 # HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH +C774;H2 # HANGUL SYLLABLE I +C775..C78F;H3 # HANGUL SYLLABLE IG..HANGUL SYLLABLE IH +C790;H2 # HANGUL SYLLABLE JA +C791..C7AB;H3 # HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH +C7AC;H2 # HANGUL SYLLABLE JAE +C7AD..C7C7;H3 # HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH +C7C8;H2 # HANGUL SYLLABLE JYA +C7C9..C7E3;H3 # HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH +C7E4;H2 # HANGUL SYLLABLE JYAE +C7E5..C7FF;H3 # HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH +C800;H2 # HANGUL SYLLABLE JEO +C801..C81B;H3 # HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH +C81C;H2 # HANGUL SYLLABLE JE +C81D..C837;H3 # HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH +C838;H2 # HANGUL SYLLABLE JYEO +C839..C853;H3 # HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH +C854;H2 # HANGUL SYLLABLE JYE +C855..C86F;H3 # HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH +C870;H2 # HANGUL SYLLABLE JO +C871..C88B;H3 # HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH +C88C;H2 # HANGUL SYLLABLE JWA +C88D..C8A7;H3 # HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH +C8A8;H2 # HANGUL SYLLABLE JWAE +C8A9..C8C3;H3 # HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH +C8C4;H2 # HANGUL SYLLABLE JOE +C8C5..C8DF;H3 # HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH +C8E0;H2 # HANGUL SYLLABLE JYO +C8E1..C8FB;H3 # HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH +C8FC;H2 # HANGUL SYLLABLE JU +C8FD..C917;H3 # HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH +C918;H2 # HANGUL SYLLABLE JWEO +C919..C933;H3 # HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH +C934;H2 # HANGUL SYLLABLE JWE +C935..C94F;H3 # HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH +C950;H2 # HANGUL SYLLABLE JWI +C951..C96B;H3 # HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH +C96C;H2 # HANGUL SYLLABLE JYU +C96D..C987;H3 # HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH +C988;H2 # HANGUL SYLLABLE JEU +C989..C9A3;H3 # HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH +C9A4;H2 # HANGUL SYLLABLE JYI +C9A5..C9BF;H3 # HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH +C9C0;H2 # HANGUL SYLLABLE JI +C9C1..C9DB;H3 # HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH +C9DC;H2 # HANGUL SYLLABLE JJA +C9DD..C9F7;H3 # HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH +C9F8;H2 # HANGUL SYLLABLE JJAE +C9F9..CA13;H3 # HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH +CA14;H2 # HANGUL SYLLABLE JJYA +CA15..CA2F;H3 # HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH +CA30;H2 # HANGUL SYLLABLE JJYAE +CA31..CA4B;H3 # HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH +CA4C;H2 # HANGUL SYLLABLE JJEO +CA4D..CA67;H3 # HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH +CA68;H2 # HANGUL SYLLABLE JJE +CA69..CA83;H3 # HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH +CA84;H2 # HANGUL SYLLABLE JJYEO +CA85..CA9F;H3 # HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH +CAA0;H2 # HANGUL SYLLABLE JJYE +CAA1..CABB;H3 # HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH +CABC;H2 # HANGUL SYLLABLE JJO +CABD..CAD7;H3 # HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH +CAD8;H2 # HANGUL SYLLABLE JJWA +CAD9..CAF3;H3 # HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH +CAF4;H2 # HANGUL SYLLABLE JJWAE +CAF5..CB0F;H3 # HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH +CB10;H2 # HANGUL SYLLABLE JJOE +CB11..CB2B;H3 # HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH +CB2C;H2 # HANGUL SYLLABLE JJYO +CB2D..CB47;H3 # HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH +CB48;H2 # HANGUL SYLLABLE JJU +CB49..CB63;H3 # HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH +CB64;H2 # HANGUL SYLLABLE JJWEO +CB65..CB7F;H3 # HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH +CB80;H2 # HANGUL SYLLABLE JJWE +CB81..CB9B;H3 # HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH +CB9C;H2 # HANGUL SYLLABLE JJWI +CB9D..CBB7;H3 # HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH +CBB8;H2 # HANGUL SYLLABLE JJYU +CBB9..CBD3;H3 # HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH +CBD4;H2 # HANGUL SYLLABLE JJEU +CBD5..CBEF;H3 # HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH +CBF0;H2 # HANGUL SYLLABLE JJYI +CBF1..CC0B;H3 # HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH +CC0C;H2 # HANGUL SYLLABLE JJI +CC0D..CC27;H3 # HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH +CC28;H2 # HANGUL SYLLABLE CA +CC29..CC43;H3 # HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH +CC44;H2 # HANGUL SYLLABLE CAE +CC45..CC5F;H3 # HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH +CC60;H2 # HANGUL SYLLABLE CYA +CC61..CC7B;H3 # HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH +CC7C;H2 # HANGUL SYLLABLE CYAE +CC7D..CC97;H3 # HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH +CC98;H2 # HANGUL SYLLABLE CEO +CC99..CCB3;H3 # HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH +CCB4;H2 # HANGUL SYLLABLE CE +CCB5..CCCF;H3 # HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH +CCD0;H2 # HANGUL SYLLABLE CYEO +CCD1..CCEB;H3 # HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH +CCEC;H2 # HANGUL SYLLABLE CYE +CCED..CD07;H3 # HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH +CD08;H2 # HANGUL SYLLABLE CO +CD09..CD23;H3 # HANGUL SYLLABLE COG..HANGUL SYLLABLE COH +CD24;H2 # HANGUL SYLLABLE CWA +CD25..CD3F;H3 # HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH +CD40;H2 # HANGUL SYLLABLE CWAE +CD41..CD5B;H3 # HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH +CD5C;H2 # HANGUL SYLLABLE COE +CD5D..CD77;H3 # HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH +CD78;H2 # HANGUL SYLLABLE CYO +CD79..CD93;H3 # HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH +CD94;H2 # HANGUL SYLLABLE CU +CD95..CDAF;H3 # HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH +CDB0;H2 # HANGUL SYLLABLE CWEO +CDB1..CDCB;H3 # HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH +CDCC;H2 # HANGUL SYLLABLE CWE +CDCD..CDE7;H3 # HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH +CDE8;H2 # HANGUL SYLLABLE CWI +CDE9..CE03;H3 # HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH +CE04;H2 # HANGUL SYLLABLE CYU +CE05..CE1F;H3 # HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH +CE20;H2 # HANGUL SYLLABLE CEU +CE21..CE3B;H3 # HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH +CE3C;H2 # HANGUL SYLLABLE CYI +CE3D..CE57;H3 # HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH +CE58;H2 # HANGUL SYLLABLE CI +CE59..CE73;H3 # HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH +CE74;H2 # HANGUL SYLLABLE KA +CE75..CE8F;H3 # HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH +CE90;H2 # HANGUL SYLLABLE KAE +CE91..CEAB;H3 # HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH +CEAC;H2 # HANGUL SYLLABLE KYA +CEAD..CEC7;H3 # HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH +CEC8;H2 # HANGUL SYLLABLE KYAE +CEC9..CEE3;H3 # HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH +CEE4;H2 # HANGUL SYLLABLE KEO +CEE5..CEFF;H3 # HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH +CF00;H2 # HANGUL SYLLABLE KE +CF01..CF1B;H3 # HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH +CF1C;H2 # HANGUL SYLLABLE KYEO +CF1D..CF37;H3 # HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH +CF38;H2 # HANGUL SYLLABLE KYE +CF39..CF53;H3 # HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH +CF54;H2 # HANGUL SYLLABLE KO +CF55..CF6F;H3 # HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH +CF70;H2 # HANGUL SYLLABLE KWA +CF71..CF8B;H3 # HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH +CF8C;H2 # HANGUL SYLLABLE KWAE +CF8D..CFA7;H3 # HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH +CFA8;H2 # HANGUL SYLLABLE KOE +CFA9..CFC3;H3 # HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH +CFC4;H2 # HANGUL SYLLABLE KYO +CFC5..CFDF;H3 # HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH +CFE0;H2 # HANGUL SYLLABLE KU +CFE1..CFFB;H3 # HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH +CFFC;H2 # HANGUL SYLLABLE KWEO +CFFD..D017;H3 # HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH +D018;H2 # HANGUL SYLLABLE KWE +D019..D033;H3 # HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH +D034;H2 # HANGUL SYLLABLE KWI +D035..D04F;H3 # HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH +D050;H2 # HANGUL SYLLABLE KYU +D051..D06B;H3 # HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH +D06C;H2 # HANGUL SYLLABLE KEU +D06D..D087;H3 # HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH +D088;H2 # HANGUL SYLLABLE KYI +D089..D0A3;H3 # HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH +D0A4;H2 # HANGUL SYLLABLE KI +D0A5..D0BF;H3 # HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH +D0C0;H2 # HANGUL SYLLABLE TA +D0C1..D0DB;H3 # HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH +D0DC;H2 # HANGUL SYLLABLE TAE +D0DD..D0F7;H3 # HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH +D0F8;H2 # HANGUL SYLLABLE TYA +D0F9..D113;H3 # HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH +D114;H2 # HANGUL SYLLABLE TYAE +D115..D12F;H3 # HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH +D130;H2 # HANGUL SYLLABLE TEO +D131..D14B;H3 # HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH +D14C;H2 # HANGUL SYLLABLE TE +D14D..D167;H3 # HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH +D168;H2 # HANGUL SYLLABLE TYEO +D169..D183;H3 # HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH +D184;H2 # HANGUL SYLLABLE TYE +D185..D19F;H3 # HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH +D1A0;H2 # HANGUL SYLLABLE TO +D1A1..D1BB;H3 # HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH +D1BC;H2 # HANGUL SYLLABLE TWA +D1BD..D1D7;H3 # HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH +D1D8;H2 # HANGUL SYLLABLE TWAE +D1D9..D1F3;H3 # HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH +D1F4;H2 # HANGUL SYLLABLE TOE +D1F5..D20F;H3 # HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH +D210;H2 # HANGUL SYLLABLE TYO +D211..D22B;H3 # HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH +D22C;H2 # HANGUL SYLLABLE TU +D22D..D247;H3 # HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH +D248;H2 # HANGUL SYLLABLE TWEO +D249..D263;H3 # HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH +D264;H2 # HANGUL SYLLABLE TWE +D265..D27F;H3 # HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH +D280;H2 # HANGUL SYLLABLE TWI +D281..D29B;H3 # HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH +D29C;H2 # HANGUL SYLLABLE TYU +D29D..D2B7;H3 # HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH +D2B8;H2 # HANGUL SYLLABLE TEU +D2B9..D2D3;H3 # HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH +D2D4;H2 # HANGUL SYLLABLE TYI +D2D5..D2EF;H3 # HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH +D2F0;H2 # HANGUL SYLLABLE TI +D2F1..D30B;H3 # HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH +D30C;H2 # HANGUL SYLLABLE PA +D30D..D327;H3 # HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH +D328;H2 # HANGUL SYLLABLE PAE +D329..D343;H3 # HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH +D344;H2 # HANGUL SYLLABLE PYA +D345..D35F;H3 # HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH +D360;H2 # HANGUL SYLLABLE PYAE +D361..D37B;H3 # HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH +D37C;H2 # HANGUL SYLLABLE PEO +D37D..D397;H3 # HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH +D398;H2 # HANGUL SYLLABLE PE +D399..D3B3;H3 # HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH +D3B4;H2 # HANGUL SYLLABLE PYEO +D3B5..D3CF;H3 # HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH +D3D0;H2 # HANGUL SYLLABLE PYE +D3D1..D3EB;H3 # HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH +D3EC;H2 # HANGUL SYLLABLE PO +D3ED..D407;H3 # HANGUL SYLLABLE POG..HANGUL SYLLABLE POH +D408;H2 # HANGUL SYLLABLE PWA +D409..D423;H3 # HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH +D424;H2 # HANGUL SYLLABLE PWAE +D425..D43F;H3 # HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH +D440;H2 # HANGUL SYLLABLE POE +D441..D45B;H3 # HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH +D45C;H2 # HANGUL SYLLABLE PYO +D45D..D477;H3 # HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH +D478;H2 # HANGUL SYLLABLE PU +D479..D493;H3 # HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH +D494;H2 # HANGUL SYLLABLE PWEO +D495..D4AF;H3 # HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH +D4B0;H2 # HANGUL SYLLABLE PWE +D4B1..D4CB;H3 # HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH +D4CC;H2 # HANGUL SYLLABLE PWI +D4CD..D4E7;H3 # HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH +D4E8;H2 # HANGUL SYLLABLE PYU +D4E9..D503;H3 # HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH +D504;H2 # HANGUL SYLLABLE PEU +D505..D51F;H3 # HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH +D520;H2 # HANGUL SYLLABLE PYI +D521..D53B;H3 # HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH +D53C;H2 # HANGUL SYLLABLE PI +D53D..D557;H3 # HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH +D558;H2 # HANGUL SYLLABLE HA +D559..D573;H3 # HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH +D574;H2 # HANGUL SYLLABLE HAE +D575..D58F;H3 # HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH +D590;H2 # HANGUL SYLLABLE HYA +D591..D5AB;H3 # HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH +D5AC;H2 # HANGUL SYLLABLE HYAE +D5AD..D5C7;H3 # HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH +D5C8;H2 # HANGUL SYLLABLE HEO +D5C9..D5E3;H3 # HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH +D5E4;H2 # HANGUL SYLLABLE HE +D5E5..D5FF;H3 # HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH +D600;H2 # HANGUL SYLLABLE HYEO +D601..D61B;H3 # HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH +D61C;H2 # HANGUL SYLLABLE HYE +D61D..D637;H3 # HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH +D638;H2 # HANGUL SYLLABLE HO +D639..D653;H3 # HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH +D654;H2 # HANGUL SYLLABLE HWA +D655..D66F;H3 # HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH +D670;H2 # HANGUL SYLLABLE HWAE +D671..D68B;H3 # HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH +D68C;H2 # HANGUL SYLLABLE HOE +D68D..D6A7;H3 # HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH +D6A8;H2 # HANGUL SYLLABLE HYO +D6A9..D6C3;H3 # HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH +D6C4;H2 # HANGUL SYLLABLE HU +D6C5..D6DF;H3 # HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH +D6E0;H2 # HANGUL SYLLABLE HWEO +D6E1..D6FB;H3 # HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH +D6FC;H2 # HANGUL SYLLABLE HWE +D6FD..D717;H3 # HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH +D718;H2 # HANGUL SYLLABLE HWI +D719..D733;H3 # HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH +D734;H2 # HANGUL SYLLABLE HYU +D735..D74F;H3 # HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH +D750;H2 # HANGUL SYLLABLE HEU +D751..D76B;H3 # HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH +D76C;H2 # HANGUL SYLLABLE HYI +D76D..D787;H3 # HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH +D788;H2 # HANGUL SYLLABLE HI +D789..D7A3;H3 # HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH +D800..DB7F;SG # <Non Private Use High Surrogate, First>..<Non Private Use High Surrogate, Last> +DB80..DBFF;SG # <Private Use High Surrogate, First>..<Private Use High Surrogate, Last> +DC00..DFFF;SG # <Low Surrogate, First>..<Low Surrogate, Last> +E000..F8FF;XX # <Private Use, First>..<Private Use, Last> +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 +FA70;ID # CJK COMPATIBILITY IDEOGRAPH-FA70 +FA71;ID # CJK COMPATIBILITY IDEOGRAPH-FA71 +FA72;ID # CJK COMPATIBILITY IDEOGRAPH-FA72 +FA73;ID # CJK COMPATIBILITY IDEOGRAPH-FA73 +FA74;ID # CJK COMPATIBILITY IDEOGRAPH-FA74 +FA75;ID # CJK COMPATIBILITY IDEOGRAPH-FA75 +FA76;ID # CJK COMPATIBILITY IDEOGRAPH-FA76 +FA77;ID # CJK COMPATIBILITY IDEOGRAPH-FA77 +FA78;ID # CJK COMPATIBILITY IDEOGRAPH-FA78 +FA79;ID # CJK COMPATIBILITY IDEOGRAPH-FA79 +FA7A;ID # CJK COMPATIBILITY IDEOGRAPH-FA7A +FA7B;ID # CJK COMPATIBILITY IDEOGRAPH-FA7B +FA7C;ID # CJK COMPATIBILITY IDEOGRAPH-FA7C +FA7D;ID # CJK COMPATIBILITY IDEOGRAPH-FA7D +FA7E;ID # CJK COMPATIBILITY IDEOGRAPH-FA7E +FA7F;ID # CJK COMPATIBILITY IDEOGRAPH-FA7F +FA80;ID # CJK COMPATIBILITY IDEOGRAPH-FA80 +FA81;ID # CJK COMPATIBILITY IDEOGRAPH-FA81 +FA82;ID # CJK COMPATIBILITY IDEOGRAPH-FA82 +FA83;ID # CJK COMPATIBILITY IDEOGRAPH-FA83 +FA84;ID # CJK COMPATIBILITY IDEOGRAPH-FA84 +FA85;ID # CJK COMPATIBILITY IDEOGRAPH-FA85 +FA86;ID # CJK COMPATIBILITY IDEOGRAPH-FA86 +FA87;ID # CJK COMPATIBILITY IDEOGRAPH-FA87 +FA88;ID # CJK COMPATIBILITY IDEOGRAPH-FA88 +FA89;ID # CJK COMPATIBILITY IDEOGRAPH-FA89 +FA8A;ID # CJK COMPATIBILITY IDEOGRAPH-FA8A +FA8B;ID # CJK COMPATIBILITY IDEOGRAPH-FA8B +FA8C;ID # CJK COMPATIBILITY IDEOGRAPH-FA8C +FA8D;ID # CJK COMPATIBILITY IDEOGRAPH-FA8D +FA8E;ID # CJK COMPATIBILITY IDEOGRAPH-FA8E +FA8F;ID # CJK COMPATIBILITY IDEOGRAPH-FA8F +FA90;ID # CJK COMPATIBILITY IDEOGRAPH-FA90 +FA91;ID # CJK COMPATIBILITY IDEOGRAPH-FA91 +FA92;ID # CJK COMPATIBILITY IDEOGRAPH-FA92 +FA93;ID # CJK COMPATIBILITY IDEOGRAPH-FA93 +FA94;ID # CJK COMPATIBILITY IDEOGRAPH-FA94 +FA95;ID # CJK COMPATIBILITY IDEOGRAPH-FA95 +FA96;ID # CJK COMPATIBILITY IDEOGRAPH-FA96 +FA97;ID # CJK COMPATIBILITY IDEOGRAPH-FA97 +FA98;ID # CJK COMPATIBILITY IDEOGRAPH-FA98 +FA99;ID # CJK COMPATIBILITY IDEOGRAPH-FA99 +FA9A;ID # CJK COMPATIBILITY IDEOGRAPH-FA9A +FA9B;ID # CJK COMPATIBILITY IDEOGRAPH-FA9B +FA9C;ID # CJK COMPATIBILITY IDEOGRAPH-FA9C +FA9D;ID # CJK COMPATIBILITY IDEOGRAPH-FA9D +FA9E;ID # CJK COMPATIBILITY IDEOGRAPH-FA9E +FA9F;ID # CJK COMPATIBILITY IDEOGRAPH-FA9F +FAA0;ID # CJK COMPATIBILITY IDEOGRAPH-FAA0 +FAA1;ID # CJK COMPATIBILITY IDEOGRAPH-FAA1 +FAA2;ID # CJK COMPATIBILITY IDEOGRAPH-FAA2 +FAA3;ID # CJK COMPATIBILITY IDEOGRAPH-FAA3 +FAA4;ID # CJK COMPATIBILITY IDEOGRAPH-FAA4 +FAA5;ID # CJK COMPATIBILITY IDEOGRAPH-FAA5 +FAA6;ID # CJK COMPATIBILITY IDEOGRAPH-FAA6 +FAA7;ID # CJK COMPATIBILITY IDEOGRAPH-FAA7 +FAA8;ID # CJK COMPATIBILITY IDEOGRAPH-FAA8 +FAA9;ID # CJK COMPATIBILITY IDEOGRAPH-FAA9 +FAAA;ID # CJK COMPATIBILITY IDEOGRAPH-FAAA +FAAB;ID # CJK COMPATIBILITY IDEOGRAPH-FAAB +FAAC;ID # CJK COMPATIBILITY IDEOGRAPH-FAAC +FAAD;ID # CJK COMPATIBILITY IDEOGRAPH-FAAD +FAAE;ID # CJK COMPATIBILITY IDEOGRAPH-FAAE +FAAF;ID # CJK COMPATIBILITY IDEOGRAPH-FAAF +FAB0;ID # CJK COMPATIBILITY IDEOGRAPH-FAB0 +FAB1;ID # CJK COMPATIBILITY IDEOGRAPH-FAB1 +FAB2;ID # CJK COMPATIBILITY IDEOGRAPH-FAB2 +FAB3;ID # CJK COMPATIBILITY IDEOGRAPH-FAB3 +FAB4;ID # CJK COMPATIBILITY IDEOGRAPH-FAB4 +FAB5;ID # CJK COMPATIBILITY IDEOGRAPH-FAB5 +FAB6;ID # CJK COMPATIBILITY IDEOGRAPH-FAB6 +FAB7;ID # CJK COMPATIBILITY IDEOGRAPH-FAB7 +FAB8;ID # CJK COMPATIBILITY IDEOGRAPH-FAB8 +FAB9;ID # CJK COMPATIBILITY IDEOGRAPH-FAB9 +FABA;ID # CJK COMPATIBILITY IDEOGRAPH-FABA +FABB;ID # CJK COMPATIBILITY IDEOGRAPH-FABB +FABC;ID # CJK COMPATIBILITY IDEOGRAPH-FABC +FABD;ID # CJK COMPATIBILITY IDEOGRAPH-FABD +FABE;ID # CJK COMPATIBILITY IDEOGRAPH-FABE +FABF;ID # CJK COMPATIBILITY IDEOGRAPH-FABF +FAC0;ID # CJK COMPATIBILITY IDEOGRAPH-FAC0 +FAC1;ID # CJK COMPATIBILITY IDEOGRAPH-FAC1 +FAC2;ID # CJK COMPATIBILITY IDEOGRAPH-FAC2 +FAC3;ID # CJK COMPATIBILITY IDEOGRAPH-FAC3 +FAC4;ID # CJK COMPATIBILITY IDEOGRAPH-FAC4 +FAC5;ID # CJK COMPATIBILITY IDEOGRAPH-FAC5 +FAC6;ID # CJK COMPATIBILITY IDEOGRAPH-FAC6 +FAC7;ID # CJK COMPATIBILITY IDEOGRAPH-FAC7 +FAC8;ID # CJK COMPATIBILITY IDEOGRAPH-FAC8 +FAC9;ID # CJK COMPATIBILITY IDEOGRAPH-FAC9 +FACA;ID # CJK COMPATIBILITY IDEOGRAPH-FACA +FACB;ID # CJK COMPATIBILITY IDEOGRAPH-FACB +FACC;ID # CJK COMPATIBILITY IDEOGRAPH-FACC +FACD;ID # CJK COMPATIBILITY IDEOGRAPH-FACD +FACE;ID # CJK COMPATIBILITY IDEOGRAPH-FACE +FACF;ID # CJK COMPATIBILITY IDEOGRAPH-FACF +FAD0;ID # CJK COMPATIBILITY IDEOGRAPH-FAD0 +FAD1;ID # CJK COMPATIBILITY IDEOGRAPH-FAD1 +FAD2;ID # CJK COMPATIBILITY IDEOGRAPH-FAD2 +FAD3;ID # CJK COMPATIBILITY IDEOGRAPH-FAD3 +FAD4;ID # CJK COMPATIBILITY IDEOGRAPH-FAD4 +FAD5;ID # CJK COMPATIBILITY IDEOGRAPH-FAD5 +FAD6;ID # CJK COMPATIBILITY IDEOGRAPH-FAD6 +FAD7;ID # CJK COMPATIBILITY IDEOGRAPH-FAD7 +FAD8;ID # CJK COMPATIBILITY IDEOGRAPH-FAD8 +FAD9;ID # CJK COMPATIBILITY IDEOGRAPH-FAD9 +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 +FDFD;AL # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +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 +FE10;IS # PRESENTATION FORM FOR VERTICAL COMMA +FE11;CL # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA +FE12;CL # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP +FE13;IS # PRESENTATION FORM FOR VERTICAL COLON +FE14;IS # PRESENTATION FORM FOR VERTICAL SEMICOLON +FE15;EX # PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK +FE16;EX # PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17;OP # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18;CL # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19;IN # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +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 +FE47;OP # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48;CL # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +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;WJ # 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 +10000;AL # LINEAR B SYLLABLE B008 A +10001;AL # LINEAR B SYLLABLE B038 E +10002;AL # LINEAR B SYLLABLE B028 I +10003;AL # LINEAR B SYLLABLE B061 O +10004;AL # LINEAR B SYLLABLE B010 U +10005;AL # LINEAR B SYLLABLE B001 DA +10006;AL # LINEAR B SYLLABLE B045 DE +10007;AL # LINEAR B SYLLABLE B007 DI +10008;AL # LINEAR B SYLLABLE B014 DO +10009;AL # LINEAR B SYLLABLE B051 DU +1000A;AL # LINEAR B SYLLABLE B057 JA +1000B;AL # LINEAR B SYLLABLE B046 JE +1000D;AL # LINEAR B SYLLABLE B036 JO +1000E;AL # LINEAR B SYLLABLE B065 JU +1000F;AL # LINEAR B SYLLABLE B077 KA +10010;AL # LINEAR B SYLLABLE B044 KE +10011;AL # LINEAR B SYLLABLE B067 KI +10012;AL # LINEAR B SYLLABLE B070 KO +10013;AL # LINEAR B SYLLABLE B081 KU +10014;AL # LINEAR B SYLLABLE B080 MA +10015;AL # LINEAR B SYLLABLE B013 ME +10016;AL # LINEAR B SYLLABLE B073 MI +10017;AL # LINEAR B SYLLABLE B015 MO +10018;AL # LINEAR B SYLLABLE B023 MU +10019;AL # LINEAR B SYLLABLE B006 NA +1001A;AL # LINEAR B SYLLABLE B024 NE +1001B;AL # LINEAR B SYLLABLE B030 NI +1001C;AL # LINEAR B SYLLABLE B052 NO +1001D;AL # LINEAR B SYLLABLE B055 NU +1001E;AL # LINEAR B SYLLABLE B003 PA +1001F;AL # LINEAR B SYLLABLE B072 PE +10020;AL # LINEAR B SYLLABLE B039 PI +10021;AL # LINEAR B SYLLABLE B011 PO +10022;AL # LINEAR B SYLLABLE B050 PU +10023;AL # LINEAR B SYLLABLE B016 QA +10024;AL # LINEAR B SYLLABLE B078 QE +10025;AL # LINEAR B SYLLABLE B021 QI +10026;AL # LINEAR B SYLLABLE B032 QO +10028;AL # LINEAR B SYLLABLE B060 RA +10029;AL # LINEAR B SYLLABLE B027 RE +1002A;AL # LINEAR B SYLLABLE B053 RI +1002B;AL # LINEAR B SYLLABLE B002 RO +1002C;AL # LINEAR B SYLLABLE B026 RU +1002D;AL # LINEAR B SYLLABLE B031 SA +1002E;AL # LINEAR B SYLLABLE B009 SE +1002F;AL # LINEAR B SYLLABLE B041 SI +10030;AL # LINEAR B SYLLABLE B012 SO +10031;AL # LINEAR B SYLLABLE B058 SU +10032;AL # LINEAR B SYLLABLE B059 TA +10033;AL # LINEAR B SYLLABLE B004 TE +10034;AL # LINEAR B SYLLABLE B037 TI +10035;AL # LINEAR B SYLLABLE B005 TO +10036;AL # LINEAR B SYLLABLE B069 TU +10037;AL # LINEAR B SYLLABLE B054 WA +10038;AL # LINEAR B SYLLABLE B075 WE +10039;AL # LINEAR B SYLLABLE B040 WI +1003A;AL # LINEAR B SYLLABLE B042 WO +1003C;AL # LINEAR B SYLLABLE B017 ZA +1003D;AL # LINEAR B SYLLABLE B074 ZE +1003F;AL # LINEAR B SYLLABLE B020 ZO +10040;AL # LINEAR B SYLLABLE B025 A2 +10041;AL # LINEAR B SYLLABLE B043 A3 +10042;AL # LINEAR B SYLLABLE B085 AU +10043;AL # LINEAR B SYLLABLE B071 DWE +10044;AL # LINEAR B SYLLABLE B090 DWO +10045;AL # LINEAR B SYLLABLE B048 NWA +10046;AL # LINEAR B SYLLABLE B029 PU2 +10047;AL # LINEAR B SYLLABLE B062 PTE +10048;AL # LINEAR B SYLLABLE B076 RA2 +10049;AL # LINEAR B SYLLABLE B033 RA3 +1004A;AL # LINEAR B SYLLABLE B068 RO2 +1004B;AL # LINEAR B SYLLABLE B066 TA2 +1004C;AL # LINEAR B SYLLABLE B087 TWE +1004D;AL # LINEAR B SYLLABLE B091 TWO +10050;AL # LINEAR B SYMBOL B018 +10051;AL # LINEAR B SYMBOL B019 +10052;AL # LINEAR B SYMBOL B022 +10053;AL # LINEAR B SYMBOL B034 +10054;AL # LINEAR B SYMBOL B047 +10055;AL # LINEAR B SYMBOL B049 +10056;AL # LINEAR B SYMBOL B056 +10057;AL # LINEAR B SYMBOL B063 +10058;AL # LINEAR B SYMBOL B064 +10059;AL # LINEAR B SYMBOL B079 +1005A;AL # LINEAR B SYMBOL B082 +1005B;AL # LINEAR B SYMBOL B083 +1005C;AL # LINEAR B SYMBOL B086 +1005D;AL # LINEAR B SYMBOL B089 +10080;AL # LINEAR B IDEOGRAM B100 MAN +10081;AL # LINEAR B IDEOGRAM B102 WOMAN +10082;AL # LINEAR B IDEOGRAM B104 DEER +10083;AL # LINEAR B IDEOGRAM B105 EQUID +10084;AL # LINEAR B IDEOGRAM B105F MARE +10085;AL # LINEAR B IDEOGRAM B105M STALLION +10086;AL # LINEAR B IDEOGRAM B106F EWE +10087;AL # LINEAR B IDEOGRAM B106M RAM +10088;AL # LINEAR B IDEOGRAM B107F SHE-GOAT +10089;AL # LINEAR B IDEOGRAM B107M HE-GOAT +1008A;AL # LINEAR B IDEOGRAM B108F SOW +1008B;AL # LINEAR B IDEOGRAM B108M BOAR +1008C;AL # LINEAR B IDEOGRAM B109F COW +1008D;AL # LINEAR B IDEOGRAM B109M BULL +1008E;AL # LINEAR B IDEOGRAM B120 WHEAT +1008F;AL # LINEAR B IDEOGRAM B121 BARLEY +10090;AL # LINEAR B IDEOGRAM B122 OLIVE +10091;AL # LINEAR B IDEOGRAM B123 SPICE +10092;AL # LINEAR B IDEOGRAM B125 CYPERUS +10093;AL # LINEAR B MONOGRAM B127 KAPO +10094;AL # LINEAR B MONOGRAM B128 KANAKO +10095;AL # LINEAR B IDEOGRAM B130 OIL +10096;AL # LINEAR B IDEOGRAM B131 WINE +10097;AL # LINEAR B IDEOGRAM B132 +10098;AL # LINEAR B MONOGRAM B133 AREPA +10099;AL # LINEAR B MONOGRAM B135 MERI +1009A;AL # LINEAR B IDEOGRAM B140 BRONZE +1009B;AL # LINEAR B IDEOGRAM B141 GOLD +1009C;AL # LINEAR B IDEOGRAM B142 +1009D;AL # LINEAR B IDEOGRAM B145 WOOL +1009E;AL # LINEAR B IDEOGRAM B146 +1009F;AL # LINEAR B IDEOGRAM B150 +100A0;AL # LINEAR B IDEOGRAM B151 HORN +100A1;AL # LINEAR B IDEOGRAM B152 +100A2;AL # LINEAR B IDEOGRAM B153 +100A3;AL # LINEAR B IDEOGRAM B154 +100A4;AL # LINEAR B MONOGRAM B156 TURO2 +100A5;AL # LINEAR B IDEOGRAM B157 +100A6;AL # LINEAR B IDEOGRAM B158 +100A7;AL # LINEAR B IDEOGRAM B159 CLOTH +100A8;AL # LINEAR B IDEOGRAM B160 +100A9;AL # LINEAR B IDEOGRAM B161 +100AA;AL # LINEAR B IDEOGRAM B162 GARMENT +100AB;AL # LINEAR B IDEOGRAM B163 ARMOUR +100AC;AL # LINEAR B IDEOGRAM B164 +100AD;AL # LINEAR B IDEOGRAM B165 +100AE;AL # LINEAR B IDEOGRAM B166 +100AF;AL # LINEAR B IDEOGRAM B167 +100B0;AL # LINEAR B IDEOGRAM B168 +100B1;AL # LINEAR B IDEOGRAM B169 +100B2;AL # LINEAR B IDEOGRAM B170 +100B3;AL # LINEAR B IDEOGRAM B171 +100B4;AL # LINEAR B IDEOGRAM B172 +100B5;AL # LINEAR B IDEOGRAM B173 MONTH +100B6;AL # LINEAR B IDEOGRAM B174 +100B7;AL # LINEAR B IDEOGRAM B176 TREE +100B8;AL # LINEAR B IDEOGRAM B177 +100B9;AL # LINEAR B IDEOGRAM B178 +100BA;AL # LINEAR B IDEOGRAM B179 +100BB;AL # LINEAR B IDEOGRAM B180 +100BC;AL # LINEAR B IDEOGRAM B181 +100BD;AL # LINEAR B IDEOGRAM B182 +100BE;AL # LINEAR B IDEOGRAM B183 +100BF;AL # LINEAR B IDEOGRAM B184 +100C0;AL # LINEAR B IDEOGRAM B185 +100C1;AL # LINEAR B IDEOGRAM B189 +100C2;AL # LINEAR B IDEOGRAM B190 +100C3;AL # LINEAR B IDEOGRAM B191 HELMET +100C4;AL # LINEAR B IDEOGRAM B220 FOOTSTOOL +100C5;AL # LINEAR B IDEOGRAM B225 BATHTUB +100C6;AL # LINEAR B IDEOGRAM B230 SPEAR +100C7;AL # LINEAR B IDEOGRAM B231 ARROW +100C8;AL # LINEAR B IDEOGRAM B232 +100C9;AL # LINEAR B IDEOGRAM B233 SWORD +100CA;AL # LINEAR B IDEOGRAM B234 +100CB;AL # LINEAR B IDEOGRAM B236 +100CC;AL # LINEAR B IDEOGRAM B240 WHEELED CHARIOT +100CD;AL # LINEAR B IDEOGRAM B241 CHARIOT +100CE;AL # LINEAR B IDEOGRAM B242 CHARIOT FRAME +100CF;AL # LINEAR B IDEOGRAM B243 WHEEL +100D0;AL # LINEAR B IDEOGRAM B245 +100D1;AL # LINEAR B IDEOGRAM B246 +100D2;AL # LINEAR B MONOGRAM B247 DIPTE +100D3;AL # LINEAR B IDEOGRAM B248 +100D4;AL # LINEAR B IDEOGRAM B249 +100D5;AL # LINEAR B IDEOGRAM B251 +100D6;AL # LINEAR B IDEOGRAM B252 +100D7;AL # LINEAR B IDEOGRAM B253 +100D8;AL # LINEAR B IDEOGRAM B254 DART +100D9;AL # LINEAR B IDEOGRAM B255 +100DA;AL # LINEAR B IDEOGRAM B256 +100DB;AL # LINEAR B IDEOGRAM B257 +100DC;AL # LINEAR B IDEOGRAM B258 +100DD;AL # LINEAR B IDEOGRAM B259 +100DE;AL # LINEAR B IDEOGRAM VESSEL B155 +100DF;AL # LINEAR B IDEOGRAM VESSEL B200 +100E0;AL # LINEAR B IDEOGRAM VESSEL B201 +100E1;AL # LINEAR B IDEOGRAM VESSEL B202 +100E2;AL # LINEAR B IDEOGRAM VESSEL B203 +100E3;AL # LINEAR B IDEOGRAM VESSEL B204 +100E4;AL # LINEAR B IDEOGRAM VESSEL B205 +100E5;AL # LINEAR B IDEOGRAM VESSEL B206 +100E6;AL # LINEAR B IDEOGRAM VESSEL B207 +100E7;AL # LINEAR B IDEOGRAM VESSEL B208 +100E8;AL # LINEAR B IDEOGRAM VESSEL B209 +100E9;AL # LINEAR B IDEOGRAM VESSEL B210 +100EA;AL # LINEAR B IDEOGRAM VESSEL B211 +100EB;AL # LINEAR B IDEOGRAM VESSEL B212 +100EC;AL # LINEAR B IDEOGRAM VESSEL B213 +100ED;AL # LINEAR B IDEOGRAM VESSEL B214 +100EE;AL # LINEAR B IDEOGRAM VESSEL B215 +100EF;AL # LINEAR B IDEOGRAM VESSEL B216 +100F0;AL # LINEAR B IDEOGRAM VESSEL B217 +100F1;AL # LINEAR B IDEOGRAM VESSEL B218 +100F2;AL # LINEAR B IDEOGRAM VESSEL B219 +100F3;AL # LINEAR B IDEOGRAM VESSEL B221 +100F4;AL # LINEAR B IDEOGRAM VESSEL B222 +100F5;AL # LINEAR B IDEOGRAM VESSEL B226 +100F6;AL # LINEAR B IDEOGRAM VESSEL B227 +100F7;AL # LINEAR B IDEOGRAM VESSEL B228 +100F8;AL # LINEAR B IDEOGRAM VESSEL B229 +100F9;AL # LINEAR B IDEOGRAM VESSEL B250 +100FA;AL # LINEAR B IDEOGRAM VESSEL B305 +10100;BA # AEGEAN WORD SEPARATOR LINE +10101;BA # AEGEAN WORD SEPARATOR DOT +10102;BA # AEGEAN CHECK MARK +10107;AL # AEGEAN NUMBER ONE +10108;AL # AEGEAN NUMBER TWO +10109;AL # AEGEAN NUMBER THREE +1010A;AL # AEGEAN NUMBER FOUR +1010B;AL # AEGEAN NUMBER FIVE +1010C;AL # AEGEAN NUMBER SIX +1010D;AL # AEGEAN NUMBER SEVEN +1010E;AL # AEGEAN NUMBER EIGHT +1010F;AL # AEGEAN NUMBER NINE +10110;AL # AEGEAN NUMBER TEN +10111;AL # AEGEAN NUMBER TWENTY +10112;AL # AEGEAN NUMBER THIRTY +10113;AL # AEGEAN NUMBER FORTY +10114;AL # AEGEAN NUMBER FIFTY +10115;AL # AEGEAN NUMBER SIXTY +10116;AL # AEGEAN NUMBER SEVENTY +10117;AL # AEGEAN NUMBER EIGHTY +10118;AL # AEGEAN NUMBER NINETY +10119;AL # AEGEAN NUMBER ONE HUNDRED +1011A;AL # AEGEAN NUMBER TWO HUNDRED +1011B;AL # AEGEAN NUMBER THREE HUNDRED +1011C;AL # AEGEAN NUMBER FOUR HUNDRED +1011D;AL # AEGEAN NUMBER FIVE HUNDRED +1011E;AL # AEGEAN NUMBER SIX HUNDRED +1011F;AL # AEGEAN NUMBER SEVEN HUNDRED +10120;AL # AEGEAN NUMBER EIGHT HUNDRED +10121;AL # AEGEAN NUMBER NINE HUNDRED +10122;AL # AEGEAN NUMBER ONE THOUSAND +10123;AL # AEGEAN NUMBER TWO THOUSAND +10124;AL # AEGEAN NUMBER THREE THOUSAND +10125;AL # AEGEAN NUMBER FOUR THOUSAND +10126;AL # AEGEAN NUMBER FIVE THOUSAND +10127;AL # AEGEAN NUMBER SIX THOUSAND +10128;AL # AEGEAN NUMBER SEVEN THOUSAND +10129;AL # AEGEAN NUMBER EIGHT THOUSAND +1012A;AL # AEGEAN NUMBER NINE THOUSAND +1012B;AL # AEGEAN NUMBER TEN THOUSAND +1012C;AL # AEGEAN NUMBER TWENTY THOUSAND +1012D;AL # AEGEAN NUMBER THIRTY THOUSAND +1012E;AL # AEGEAN NUMBER FORTY THOUSAND +1012F;AL # AEGEAN NUMBER FIFTY THOUSAND +10130;AL # AEGEAN NUMBER SIXTY THOUSAND +10131;AL # AEGEAN NUMBER SEVENTY THOUSAND +10132;AL # AEGEAN NUMBER EIGHTY THOUSAND +10133;AL # AEGEAN NUMBER NINETY THOUSAND +10137;AL # AEGEAN WEIGHT BASE UNIT +10138;AL # AEGEAN WEIGHT FIRST SUBUNIT +10139;AL # AEGEAN WEIGHT SECOND SUBUNIT +1013A;AL # AEGEAN WEIGHT THIRD SUBUNIT +1013B;AL # AEGEAN WEIGHT FOURTH SUBUNIT +1013C;AL # AEGEAN DRY MEASURE FIRST SUBUNIT +1013D;AL # AEGEAN LIQUID MEASURE FIRST SUBUNIT +1013E;AL # AEGEAN MEASURE SECOND SUBUNIT +1013F;AL # AEGEAN MEASURE THIRD SUBUNIT +10140;AL # GREEK ACROPHONIC ATTIC ONE QUARTER +10141;AL # GREEK ACROPHONIC ATTIC ONE HALF +10142;AL # GREEK ACROPHONIC ATTIC ONE DRACHMA +10143;AL # GREEK ACROPHONIC ATTIC FIVE +10144;AL # GREEK ACROPHONIC ATTIC FIFTY +10145;AL # GREEK ACROPHONIC ATTIC FIVE HUNDRED +10146;AL # GREEK ACROPHONIC ATTIC FIVE THOUSAND +10147;AL # GREEK ACROPHONIC ATTIC FIFTY THOUSAND +10148;AL # GREEK ACROPHONIC ATTIC FIVE TALENTS +10149;AL # GREEK ACROPHONIC ATTIC TEN TALENTS +1014A;AL # GREEK ACROPHONIC ATTIC FIFTY TALENTS +1014B;AL # GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS +1014C;AL # GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS +1014D;AL # GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS +1014E;AL # GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS +1014F;AL # GREEK ACROPHONIC ATTIC FIVE STATERS +10150;AL # GREEK ACROPHONIC ATTIC TEN STATERS +10151;AL # GREEK ACROPHONIC ATTIC FIFTY STATERS +10152;AL # GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS +10153;AL # GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS +10154;AL # GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS +10155;AL # GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS +10156;AL # GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS +10157;AL # GREEK ACROPHONIC ATTIC TEN MNAS +10158;AL # GREEK ACROPHONIC HERAEUM ONE PLETHRON +10159;AL # GREEK ACROPHONIC THESPIAN ONE +1015A;AL # GREEK ACROPHONIC HERMIONIAN ONE +1015B;AL # GREEK ACROPHONIC EPIDAUREAN TWO +1015C;AL # GREEK ACROPHONIC THESPIAN TWO +1015D;AL # GREEK ACROPHONIC CYRENAIC TWO DRACHMAS +1015E;AL # GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS +1015F;AL # GREEK ACROPHONIC TROEZENIAN FIVE +10160;AL # GREEK ACROPHONIC TROEZENIAN TEN +10161;AL # GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM +10162;AL # GREEK ACROPHONIC HERMIONIAN TEN +10163;AL # GREEK ACROPHONIC MESSENIAN TEN +10164;AL # GREEK ACROPHONIC THESPIAN TEN +10165;AL # GREEK ACROPHONIC THESPIAN THIRTY +10166;AL # GREEK ACROPHONIC TROEZENIAN FIFTY +10167;AL # GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM +10168;AL # GREEK ACROPHONIC HERMIONIAN FIFTY +10169;AL # GREEK ACROPHONIC THESPIAN FIFTY +1016A;AL # GREEK ACROPHONIC THESPIAN ONE HUNDRED +1016B;AL # GREEK ACROPHONIC THESPIAN THREE HUNDRED +1016C;AL # GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED +1016D;AL # GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED +1016E;AL # GREEK ACROPHONIC THESPIAN FIVE HUNDRED +1016F;AL # GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED +10170;AL # GREEK ACROPHONIC NAXIAN FIVE HUNDRED +10171;AL # GREEK ACROPHONIC THESPIAN ONE THOUSAND +10172;AL # GREEK ACROPHONIC THESPIAN FIVE THOUSAND +10173;AL # GREEK ACROPHONIC DELPHIC FIVE MNAS +10174;AL # GREEK ACROPHONIC STRATIAN FIFTY MNAS +10175;AL # GREEK ONE HALF SIGN +10176;AL # GREEK ONE HALF SIGN ALTERNATE FORM +10177;AL # GREEK TWO THIRDS SIGN +10178;AL # GREEK THREE QUARTERS SIGN +10179;AL # GREEK YEAR SIGN +1017A;AL # GREEK TALENT SIGN +1017B;AL # GREEK DRACHMA SIGN +1017C;AL # GREEK OBOL SIGN +1017D;AL # GREEK TWO OBOLS SIGN +1017E;AL # GREEK THREE OBOLS SIGN +1017F;AL # GREEK FOUR OBOLS SIGN +10180;AL # GREEK FIVE OBOLS SIGN +10181;AL # GREEK METRETES SIGN +10182;AL # GREEK KYATHOS BASE SIGN +10183;AL # GREEK LITRA SIGN +10184;AL # GREEK OUNKIA SIGN +10185;AL # GREEK XESTES SIGN +10186;AL # GREEK ARTABE SIGN +10187;AL # GREEK AROURA SIGN +10188;AL # GREEK GRAMMA SIGN +10189;AL # GREEK TRYBLION BASE SIGN +1018A;AL # GREEK ZERO SIGN +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 +10380;AL # UGARITIC LETTER ALPA +10381;AL # UGARITIC LETTER BETA +10382;AL # UGARITIC LETTER GAMLA +10383;AL # UGARITIC LETTER KHA +10384;AL # UGARITIC LETTER DELTA +10385;AL # UGARITIC LETTER HO +10386;AL # UGARITIC LETTER WO +10387;AL # UGARITIC LETTER ZETA +10388;AL # UGARITIC LETTER HOTA +10389;AL # UGARITIC LETTER TET +1038A;AL # UGARITIC LETTER YOD +1038B;AL # UGARITIC LETTER KAF +1038C;AL # UGARITIC LETTER SHIN +1038D;AL # UGARITIC LETTER LAMDA +1038E;AL # UGARITIC LETTER MEM +1038F;AL # UGARITIC LETTER DHAL +10390;AL # UGARITIC LETTER NUN +10391;AL # UGARITIC LETTER ZU +10392;AL # UGARITIC LETTER SAMKA +10393;AL # UGARITIC LETTER AIN +10394;AL # UGARITIC LETTER PU +10395;AL # UGARITIC LETTER SADE +10396;AL # UGARITIC LETTER QOPA +10397;AL # UGARITIC LETTER RASHA +10398;AL # UGARITIC LETTER THANNA +10399;AL # UGARITIC LETTER GHAIN +1039A;AL # UGARITIC LETTER TO +1039B;AL # UGARITIC LETTER I +1039C;AL # UGARITIC LETTER U +1039D;AL # UGARITIC LETTER SSU +1039F;BA # UGARITIC WORD DIVIDER +103A0;AL # OLD PERSIAN SIGN A +103A1;AL # OLD PERSIAN SIGN I +103A2;AL # OLD PERSIAN SIGN U +103A3;AL # OLD PERSIAN SIGN KA +103A4;AL # OLD PERSIAN SIGN KU +103A5;AL # OLD PERSIAN SIGN GA +103A6;AL # OLD PERSIAN SIGN GU +103A7;AL # OLD PERSIAN SIGN XA +103A8;AL # OLD PERSIAN SIGN CA +103A9;AL # OLD PERSIAN SIGN JA +103AA;AL # OLD PERSIAN SIGN JI +103AB;AL # OLD PERSIAN SIGN TA +103AC;AL # OLD PERSIAN SIGN TU +103AD;AL # OLD PERSIAN SIGN DA +103AE;AL # OLD PERSIAN SIGN DI +103AF;AL # OLD PERSIAN SIGN DU +103B0;AL # OLD PERSIAN SIGN THA +103B1;AL # OLD PERSIAN SIGN PA +103B2;AL # OLD PERSIAN SIGN BA +103B3;AL # OLD PERSIAN SIGN FA +103B4;AL # OLD PERSIAN SIGN NA +103B5;AL # OLD PERSIAN SIGN NU +103B6;AL # OLD PERSIAN SIGN MA +103B7;AL # OLD PERSIAN SIGN MI +103B8;AL # OLD PERSIAN SIGN MU +103B9;AL # OLD PERSIAN SIGN YA +103BA;AL # OLD PERSIAN SIGN VA +103BB;AL # OLD PERSIAN SIGN VI +103BC;AL # OLD PERSIAN SIGN RA +103BD;AL # OLD PERSIAN SIGN RU +103BE;AL # OLD PERSIAN SIGN LA +103BF;AL # OLD PERSIAN SIGN SA +103C0;AL # OLD PERSIAN SIGN ZA +103C1;AL # OLD PERSIAN SIGN SHA +103C2;AL # OLD PERSIAN SIGN SSA +103C3;AL # OLD PERSIAN SIGN HA +103C8;AL # OLD PERSIAN SIGN AURAMAZDAA +103C9;AL # OLD PERSIAN SIGN AURAMAZDAA-2 +103CA;AL # OLD PERSIAN SIGN AURAMAZDAAHA +103CB;AL # OLD PERSIAN SIGN XSHAAYATHIYA +103CC;AL # OLD PERSIAN SIGN DAHYAAUSH +103CD;AL # OLD PERSIAN SIGN DAHYAAUSH-2 +103CE;AL # OLD PERSIAN SIGN BAGA +103CF;AL # OLD PERSIAN SIGN BUUMISH +103D0;AL # OLD PERSIAN WORD DIVIDER +103D1;AL # OLD PERSIAN NUMBER ONE +103D2;AL # OLD PERSIAN NUMBER TWO +103D3;AL # OLD PERSIAN NUMBER TEN +103D4;AL # OLD PERSIAN NUMBER TWENTY +103D5;AL # OLD PERSIAN NUMBER 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 +10426;AL # DESERET CAPITAL LETTER OI +10427;AL # DESERET CAPITAL LETTER EW +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 +1044E;AL # DESERET SMALL LETTER OI +1044F;AL # DESERET SMALL LETTER EW +10450;AL # SHAVIAN LETTER PEEP +10451;AL # SHAVIAN LETTER TOT +10452;AL # SHAVIAN LETTER KICK +10453;AL # SHAVIAN LETTER FEE +10454;AL # SHAVIAN LETTER THIGH +10455;AL # SHAVIAN LETTER SO +10456;AL # SHAVIAN LETTER SURE +10457;AL # SHAVIAN LETTER CHURCH +10458;AL # SHAVIAN LETTER YEA +10459;AL # SHAVIAN LETTER HUNG +1045A;AL # SHAVIAN LETTER BIB +1045B;AL # SHAVIAN LETTER DEAD +1045C;AL # SHAVIAN LETTER GAG +1045D;AL # SHAVIAN LETTER VOW +1045E;AL # SHAVIAN LETTER THEY +1045F;AL # SHAVIAN LETTER ZOO +10460;AL # SHAVIAN LETTER MEASURE +10461;AL # SHAVIAN LETTER JUDGE +10462;AL # SHAVIAN LETTER WOE +10463;AL # SHAVIAN LETTER HA-HA +10464;AL # SHAVIAN LETTER LOLL +10465;AL # SHAVIAN LETTER MIME +10466;AL # SHAVIAN LETTER IF +10467;AL # SHAVIAN LETTER EGG +10468;AL # SHAVIAN LETTER ASH +10469;AL # SHAVIAN LETTER ADO +1046A;AL # SHAVIAN LETTER ON +1046B;AL # SHAVIAN LETTER WOOL +1046C;AL # SHAVIAN LETTER OUT +1046D;AL # SHAVIAN LETTER AH +1046E;AL # SHAVIAN LETTER ROAR +1046F;AL # SHAVIAN LETTER NUN +10470;AL # SHAVIAN LETTER EAT +10471;AL # SHAVIAN LETTER AGE +10472;AL # SHAVIAN LETTER ICE +10473;AL # SHAVIAN LETTER UP +10474;AL # SHAVIAN LETTER OAK +10475;AL # SHAVIAN LETTER OOZE +10476;AL # SHAVIAN LETTER OIL +10477;AL # SHAVIAN LETTER AWE +10478;AL # SHAVIAN LETTER ARE +10479;AL # SHAVIAN LETTER OR +1047A;AL # SHAVIAN LETTER AIR +1047B;AL # SHAVIAN LETTER ERR +1047C;AL # SHAVIAN LETTER ARRAY +1047D;AL # SHAVIAN LETTER EAR +1047E;AL # SHAVIAN LETTER IAN +1047F;AL # SHAVIAN LETTER YEW +10480;AL # OSMANYA LETTER ALEF +10481;AL # OSMANYA LETTER BA +10482;AL # OSMANYA LETTER TA +10483;AL # OSMANYA LETTER JA +10484;AL # OSMANYA LETTER XA +10485;AL # OSMANYA LETTER KHA +10486;AL # OSMANYA LETTER DEEL +10487;AL # OSMANYA LETTER RA +10488;AL # OSMANYA LETTER SA +10489;AL # OSMANYA LETTER SHIIN +1048A;AL # OSMANYA LETTER DHA +1048B;AL # OSMANYA LETTER CAYN +1048C;AL # OSMANYA LETTER GA +1048D;AL # OSMANYA LETTER FA +1048E;AL # OSMANYA LETTER QAAF +1048F;AL # OSMANYA LETTER KAAF +10490;AL # OSMANYA LETTER LAAN +10491;AL # OSMANYA LETTER MIIN +10492;AL # OSMANYA LETTER NUUN +10493;AL # OSMANYA LETTER WAW +10494;AL # OSMANYA LETTER HA +10495;AL # OSMANYA LETTER YA +10496;AL # OSMANYA LETTER A +10497;AL # OSMANYA LETTER E +10498;AL # OSMANYA LETTER I +10499;AL # OSMANYA LETTER O +1049A;AL # OSMANYA LETTER U +1049B;AL # OSMANYA LETTER AA +1049C;AL # OSMANYA LETTER EE +1049D;AL # OSMANYA LETTER OO +104A0;NU # OSMANYA DIGIT ZERO +104A1;NU # OSMANYA DIGIT ONE +104A2;NU # OSMANYA DIGIT TWO +104A3;NU # OSMANYA DIGIT THREE +104A4;NU # OSMANYA DIGIT FOUR +104A5;NU # OSMANYA DIGIT FIVE +104A6;NU # OSMANYA DIGIT SIX +104A7;NU # OSMANYA DIGIT SEVEN +104A8;NU # OSMANYA DIGIT EIGHT +104A9;NU # OSMANYA DIGIT NINE +10800;AL # CYPRIOT SYLLABLE A +10801;AL # CYPRIOT SYLLABLE E +10802;AL # CYPRIOT SYLLABLE I +10803;AL # CYPRIOT SYLLABLE O +10804;AL # CYPRIOT SYLLABLE U +10805;AL # CYPRIOT SYLLABLE JA +10808;AL # CYPRIOT SYLLABLE JO +1080A;AL # CYPRIOT SYLLABLE KA +1080B;AL # CYPRIOT SYLLABLE KE +1080C;AL # CYPRIOT SYLLABLE KI +1080D;AL # CYPRIOT SYLLABLE KO +1080E;AL # CYPRIOT SYLLABLE KU +1080F;AL # CYPRIOT SYLLABLE LA +10810;AL # CYPRIOT SYLLABLE LE +10811;AL # CYPRIOT SYLLABLE LI +10812;AL # CYPRIOT SYLLABLE LO +10813;AL # CYPRIOT SYLLABLE LU +10814;AL # CYPRIOT SYLLABLE MA +10815;AL # CYPRIOT SYLLABLE ME +10816;AL # CYPRIOT SYLLABLE MI +10817;AL # CYPRIOT SYLLABLE MO +10818;AL # CYPRIOT SYLLABLE MU +10819;AL # CYPRIOT SYLLABLE NA +1081A;AL # CYPRIOT SYLLABLE NE +1081B;AL # CYPRIOT SYLLABLE NI +1081C;AL # CYPRIOT SYLLABLE NO +1081D;AL # CYPRIOT SYLLABLE NU +1081E;AL # CYPRIOT SYLLABLE PA +1081F;AL # CYPRIOT SYLLABLE PE +10820;AL # CYPRIOT SYLLABLE PI +10821;AL # CYPRIOT SYLLABLE PO +10822;AL # CYPRIOT SYLLABLE PU +10823;AL # CYPRIOT SYLLABLE RA +10824;AL # CYPRIOT SYLLABLE RE +10825;AL # CYPRIOT SYLLABLE RI +10826;AL # CYPRIOT SYLLABLE RO +10827;AL # CYPRIOT SYLLABLE RU +10828;AL # CYPRIOT SYLLABLE SA +10829;AL # CYPRIOT SYLLABLE SE +1082A;AL # CYPRIOT SYLLABLE SI +1082B;AL # CYPRIOT SYLLABLE SO +1082C;AL # CYPRIOT SYLLABLE SU +1082D;AL # CYPRIOT SYLLABLE TA +1082E;AL # CYPRIOT SYLLABLE TE +1082F;AL # CYPRIOT SYLLABLE TI +10830;AL # CYPRIOT SYLLABLE TO +10831;AL # CYPRIOT SYLLABLE TU +10832;AL # CYPRIOT SYLLABLE WA +10833;AL # CYPRIOT SYLLABLE WE +10834;AL # CYPRIOT SYLLABLE WI +10835;AL # CYPRIOT SYLLABLE WO +10837;AL # CYPRIOT SYLLABLE XA +10838;AL # CYPRIOT SYLLABLE XE +1083C;AL # CYPRIOT SYLLABLE ZA +1083F;AL # CYPRIOT SYLLABLE ZO +10A00;AL # KHAROSHTHI LETTER A +10A01;CM # KHAROSHTHI VOWEL SIGN I +10A02;CM # KHAROSHTHI VOWEL SIGN U +10A03;CM # KHAROSHTHI VOWEL SIGN VOCALIC R +10A05;CM # KHAROSHTHI VOWEL SIGN E +10A06;CM # KHAROSHTHI VOWEL SIGN O +10A0C;CM # KHAROSHTHI VOWEL LENGTH MARK +10A0D;CM # KHAROSHTHI SIGN DOUBLE RING BELOW +10A0E;CM # KHAROSHTHI SIGN ANUSVARA +10A0F;CM # KHAROSHTHI SIGN VISARGA +10A10;AL # KHAROSHTHI LETTER KA +10A11;AL # KHAROSHTHI LETTER KHA +10A12;AL # KHAROSHTHI LETTER GA +10A13;AL # KHAROSHTHI LETTER GHA +10A15;AL # KHAROSHTHI LETTER CA +10A16;AL # KHAROSHTHI LETTER CHA +10A17;AL # KHAROSHTHI LETTER JA +10A19;AL # KHAROSHTHI LETTER NYA +10A1A;AL # KHAROSHTHI LETTER TTA +10A1B;AL # KHAROSHTHI LETTER TTHA +10A1C;AL # KHAROSHTHI LETTER DDA +10A1D;AL # KHAROSHTHI LETTER DDHA +10A1E;AL # KHAROSHTHI LETTER NNA +10A1F;AL # KHAROSHTHI LETTER TA +10A20;AL # KHAROSHTHI LETTER THA +10A21;AL # KHAROSHTHI LETTER DA +10A22;AL # KHAROSHTHI LETTER DHA +10A23;AL # KHAROSHTHI LETTER NA +10A24;AL # KHAROSHTHI LETTER PA +10A25;AL # KHAROSHTHI LETTER PHA +10A26;AL # KHAROSHTHI LETTER BA +10A27;AL # KHAROSHTHI LETTER BHA +10A28;AL # KHAROSHTHI LETTER MA +10A29;AL # KHAROSHTHI LETTER YA +10A2A;AL # KHAROSHTHI LETTER RA +10A2B;AL # KHAROSHTHI LETTER LA +10A2C;AL # KHAROSHTHI LETTER VA +10A2D;AL # KHAROSHTHI LETTER SHA +10A2E;AL # KHAROSHTHI LETTER SSA +10A2F;AL # KHAROSHTHI LETTER SA +10A30;AL # KHAROSHTHI LETTER ZA +10A31;AL # KHAROSHTHI LETTER HA +10A32;AL # KHAROSHTHI LETTER KKA +10A33;AL # KHAROSHTHI LETTER TTTHA +10A38;CM # KHAROSHTHI SIGN BAR ABOVE +10A39;CM # KHAROSHTHI SIGN CAUDA +10A3A;CM # KHAROSHTHI SIGN DOT BELOW +10A3F;CM # KHAROSHTHI VIRAMA +10A40;AL # KHAROSHTHI DIGIT ONE +10A41;AL # KHAROSHTHI DIGIT TWO +10A42;AL # KHAROSHTHI DIGIT THREE +10A43;AL # KHAROSHTHI DIGIT FOUR +10A44;AL # KHAROSHTHI NUMBER TEN +10A45;AL # KHAROSHTHI NUMBER TWENTY +10A46;AL # KHAROSHTHI NUMBER ONE HUNDRED +10A47;AL # KHAROSHTHI NUMBER ONE THOUSAND +10A50;BA # KHAROSHTHI PUNCTUATION DOT +10A51;BA # KHAROSHTHI PUNCTUATION SMALL CIRCLE +10A52;BA # KHAROSHTHI PUNCTUATION CIRCLE +10A53;BA # KHAROSHTHI PUNCTUATION CRESCENT BAR +10A54;BA # KHAROSHTHI PUNCTUATION MANGALAM +10A55;BA # KHAROSHTHI PUNCTUATION LOTUS +10A56;BA # KHAROSHTHI PUNCTUATION DANDA +10A57;BA # KHAROSHTHI PUNCTUATION DOUBLE DANDA +10A58;AL # KHAROSHTHI PUNCTUATION LINES +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 +1D200;AL # GREEK VOCAL NOTATION SYMBOL-1 +1D201;AL # GREEK VOCAL NOTATION SYMBOL-2 +1D202;AL # GREEK VOCAL NOTATION SYMBOL-3 +1D203;AL # GREEK VOCAL NOTATION SYMBOL-4 +1D204;AL # GREEK VOCAL NOTATION SYMBOL-5 +1D205;AL # GREEK VOCAL NOTATION SYMBOL-6 +1D206;AL # GREEK VOCAL NOTATION SYMBOL-7 +1D207;AL # GREEK VOCAL NOTATION SYMBOL-8 +1D208;AL # GREEK VOCAL NOTATION SYMBOL-9 +1D209;AL # GREEK VOCAL NOTATION SYMBOL-10 +1D20A;AL # GREEK VOCAL NOTATION SYMBOL-11 +1D20B;AL # GREEK VOCAL NOTATION SYMBOL-12 +1D20C;AL # GREEK VOCAL NOTATION SYMBOL-13 +1D20D;AL # GREEK VOCAL NOTATION SYMBOL-14 +1D20E;AL # GREEK VOCAL NOTATION SYMBOL-15 +1D20F;AL # GREEK VOCAL NOTATION SYMBOL-16 +1D210;AL # GREEK VOCAL NOTATION SYMBOL-17 +1D211;AL # GREEK VOCAL NOTATION SYMBOL-18 +1D212;AL # GREEK VOCAL NOTATION SYMBOL-19 +1D213;AL # GREEK VOCAL NOTATION SYMBOL-20 +1D214;AL # GREEK VOCAL NOTATION SYMBOL-21 +1D215;AL # GREEK VOCAL NOTATION SYMBOL-22 +1D216;AL # GREEK VOCAL NOTATION SYMBOL-23 +1D217;AL # GREEK VOCAL NOTATION SYMBOL-24 +1D218;AL # GREEK VOCAL NOTATION SYMBOL-50 +1D219;AL # GREEK VOCAL NOTATION SYMBOL-51 +1D21A;AL # GREEK VOCAL NOTATION SYMBOL-52 +1D21B;AL # GREEK VOCAL NOTATION SYMBOL-53 +1D21C;AL # GREEK VOCAL NOTATION SYMBOL-54 +1D21D;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-1 +1D21E;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-2 +1D21F;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-4 +1D220;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-5 +1D221;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-7 +1D222;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-8 +1D223;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-11 +1D224;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-12 +1D225;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-13 +1D226;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-14 +1D227;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-17 +1D228;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-18 +1D229;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-19 +1D22A;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-23 +1D22B;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-24 +1D22C;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-25 +1D22D;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-26 +1D22E;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-27 +1D22F;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-29 +1D230;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-30 +1D231;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-32 +1D232;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-36 +1D233;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-37 +1D234;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-38 +1D235;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-39 +1D236;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-40 +1D237;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-42 +1D238;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-43 +1D239;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-45 +1D23A;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-47 +1D23B;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-48 +1D23C;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-49 +1D23D;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-50 +1D23E;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-51 +1D23F;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-52 +1D240;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-53 +1D241;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D242;CM # COMBINING GREEK MUSICAL TRISEME +1D243;CM # COMBINING GREEK MUSICAL TETRASEME +1D244;CM # COMBINING GREEK MUSICAL PENTASEME +1D245;AL # GREEK MUSICAL LEIMMA +1D300;AL # MONOGRAM FOR EARTH +1D301;AL # DIGRAM FOR HEAVENLY EARTH +1D302;AL # DIGRAM FOR HUMAN EARTH +1D303;AL # DIGRAM FOR EARTHLY HEAVEN +1D304;AL # DIGRAM FOR EARTHLY HUMAN +1D305;AL # DIGRAM FOR EARTH +1D306;AL # TETRAGRAM FOR CENTRE +1D307;AL # TETRAGRAM FOR FULL CIRCLE +1D308;AL # TETRAGRAM FOR MIRED +1D309;AL # TETRAGRAM FOR BARRIER +1D30A;AL # TETRAGRAM FOR KEEPING SMALL +1D30B;AL # TETRAGRAM FOR CONTRARIETY +1D30C;AL # TETRAGRAM FOR ASCENT +1D30D;AL # TETRAGRAM FOR OPPOSITION +1D30E;AL # TETRAGRAM FOR BRANCHING OUT +1D30F;AL # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION +1D310;AL # TETRAGRAM FOR DIVERGENCE +1D311;AL # TETRAGRAM FOR YOUTHFULNESS +1D312;AL # TETRAGRAM FOR INCREASE +1D313;AL # TETRAGRAM FOR PENETRATION +1D314;AL # TETRAGRAM FOR REACH +1D315;AL # TETRAGRAM FOR CONTACT +1D316;AL # TETRAGRAM FOR HOLDING BACK +1D317;AL # TETRAGRAM FOR WAITING +1D318;AL # TETRAGRAM FOR FOLLOWING +1D319;AL # TETRAGRAM FOR ADVANCE +1D31A;AL # TETRAGRAM FOR RELEASE +1D31B;AL # TETRAGRAM FOR RESISTANCE +1D31C;AL # TETRAGRAM FOR EASE +1D31D;AL # TETRAGRAM FOR JOY +1D31E;AL # TETRAGRAM FOR CONTENTION +1D31F;AL # TETRAGRAM FOR ENDEAVOUR +1D320;AL # TETRAGRAM FOR DUTIES +1D321;AL # TETRAGRAM FOR CHANGE +1D322;AL # TETRAGRAM FOR DECISIVENESS +1D323;AL # TETRAGRAM FOR BOLD RESOLUTION +1D324;AL # TETRAGRAM FOR PACKING +1D325;AL # TETRAGRAM FOR LEGION +1D326;AL # TETRAGRAM FOR CLOSENESS +1D327;AL # TETRAGRAM FOR KINSHIP +1D328;AL # TETRAGRAM FOR GATHERING +1D329;AL # TETRAGRAM FOR STRENGTH +1D32A;AL # TETRAGRAM FOR PURITY +1D32B;AL # TETRAGRAM FOR FULLNESS +1D32C;AL # TETRAGRAM FOR RESIDENCE +1D32D;AL # TETRAGRAM FOR LAW OR MODEL +1D32E;AL # TETRAGRAM FOR RESPONSE +1D32F;AL # TETRAGRAM FOR GOING TO MEET +1D330;AL # TETRAGRAM FOR ENCOUNTERS +1D331;AL # TETRAGRAM FOR STOVE +1D332;AL # TETRAGRAM FOR GREATNESS +1D333;AL # TETRAGRAM FOR ENLARGEMENT +1D334;AL # TETRAGRAM FOR PATTERN +1D335;AL # TETRAGRAM FOR RITUAL +1D336;AL # TETRAGRAM FOR FLIGHT +1D337;AL # TETRAGRAM FOR VASTNESS OR WASTING +1D338;AL # TETRAGRAM FOR CONSTANCY +1D339;AL # TETRAGRAM FOR MEASURE +1D33A;AL # TETRAGRAM FOR ETERNITY +1D33B;AL # TETRAGRAM FOR UNITY +1D33C;AL # TETRAGRAM FOR DIMINISHMENT +1D33D;AL # TETRAGRAM FOR CLOSED MOUTH +1D33E;AL # TETRAGRAM FOR GUARDEDNESS +1D33F;AL # TETRAGRAM FOR GATHERING IN +1D340;AL # TETRAGRAM FOR MASSING +1D341;AL # TETRAGRAM FOR ACCUMULATION +1D342;AL # TETRAGRAM FOR EMBELLISHMENT +1D343;AL # TETRAGRAM FOR DOUBT +1D344;AL # TETRAGRAM FOR WATCH +1D345;AL # TETRAGRAM FOR SINKING +1D346;AL # TETRAGRAM FOR INNER +1D347;AL # TETRAGRAM FOR DEPARTURE +1D348;AL # TETRAGRAM FOR DARKENING +1D349;AL # TETRAGRAM FOR DIMMING +1D34A;AL # TETRAGRAM FOR EXHAUSTION +1D34B;AL # TETRAGRAM FOR SEVERANCE +1D34C;AL # TETRAGRAM FOR STOPPAGE +1D34D;AL # TETRAGRAM FOR HARDNESS +1D34E;AL # TETRAGRAM FOR COMPLETION +1D34F;AL # TETRAGRAM FOR CLOSURE +1D350;AL # TETRAGRAM FOR FAILURE +1D351;AL # TETRAGRAM FOR AGGRAVATION +1D352;AL # TETRAGRAM FOR COMPLIANCE +1D353;AL # TETRAGRAM FOR ON THE VERGE +1D354;AL # TETRAGRAM FOR DIFFICULTIES +1D355;AL # TETRAGRAM FOR LABOURING +1D356;AL # TETRAGRAM FOR FOSTERING +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 +1D4C1;AL # MATHEMATICAL SCRIPT SMALL L +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 +1D6A4;AL # MATHEMATICAL ITALIC SMALL DOTLESS I +1D6A5;AL # MATHEMATICAL ITALIC SMALL DOTLESS J +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 # <CJK Ideograph Extension B, First>..<CJK Ideograph Extension B, Last> +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 +E0100;CM # VARIATION SELECTOR-17 +E0101;CM # VARIATION SELECTOR-18 +E0102;CM # VARIATION SELECTOR-19 +E0103;CM # VARIATION SELECTOR-20 +E0104;CM # VARIATION SELECTOR-21 +E0105;CM # VARIATION SELECTOR-22 +E0106;CM # VARIATION SELECTOR-23 +E0107;CM # VARIATION SELECTOR-24 +E0108;CM # VARIATION SELECTOR-25 +E0109;CM # VARIATION SELECTOR-26 +E010A;CM # VARIATION SELECTOR-27 +E010B;CM # VARIATION SELECTOR-28 +E010C;CM # VARIATION SELECTOR-29 +E010D;CM # VARIATION SELECTOR-30 +E010E;CM # VARIATION SELECTOR-31 +E010F;CM # VARIATION SELECTOR-32 +E0110;CM # VARIATION SELECTOR-33 +E0111;CM # VARIATION SELECTOR-34 +E0112;CM # VARIATION SELECTOR-35 +E0113;CM # VARIATION SELECTOR-36 +E0114;CM # VARIATION SELECTOR-37 +E0115;CM # VARIATION SELECTOR-38 +E0116;CM # VARIATION SELECTOR-39 +E0117;CM # VARIATION SELECTOR-40 +E0118;CM # VARIATION SELECTOR-41 +E0119;CM # VARIATION SELECTOR-42 +E011A;CM # VARIATION SELECTOR-43 +E011B;CM # VARIATION SELECTOR-44 +E011C;CM # VARIATION SELECTOR-45 +E011D;CM # VARIATION SELECTOR-46 +E011E;CM # VARIATION SELECTOR-47 +E011F;CM # VARIATION SELECTOR-48 +E0120;CM # VARIATION SELECTOR-49 +E0121;CM # VARIATION SELECTOR-50 +E0122;CM # VARIATION SELECTOR-51 +E0123;CM # VARIATION SELECTOR-52 +E0124;CM # VARIATION SELECTOR-53 +E0125;CM # VARIATION SELECTOR-54 +E0126;CM # VARIATION SELECTOR-55 +E0127;CM # VARIATION SELECTOR-56 +E0128;CM # VARIATION SELECTOR-57 +E0129;CM # VARIATION SELECTOR-58 +E012A;CM # VARIATION SELECTOR-59 +E012B;CM # VARIATION SELECTOR-60 +E012C;CM # VARIATION SELECTOR-61 +E012D;CM # VARIATION SELECTOR-62 +E012E;CM # VARIATION SELECTOR-63 +E012F;CM # VARIATION SELECTOR-64 +E0130;CM # VARIATION SELECTOR-65 +E0131;CM # VARIATION SELECTOR-66 +E0132;CM # VARIATION SELECTOR-67 +E0133;CM # VARIATION SELECTOR-68 +E0134;CM # VARIATION SELECTOR-69 +E0135;CM # VARIATION SELECTOR-70 +E0136;CM # VARIATION SELECTOR-71 +E0137;CM # VARIATION SELECTOR-72 +E0138;CM # VARIATION SELECTOR-73 +E0139;CM # VARIATION SELECTOR-74 +E013A;CM # VARIATION SELECTOR-75 +E013B;CM # VARIATION SELECTOR-76 +E013C;CM # VARIATION SELECTOR-77 +E013D;CM # VARIATION SELECTOR-78 +E013E;CM # VARIATION SELECTOR-79 +E013F;CM # VARIATION SELECTOR-80 +E0140;CM # VARIATION SELECTOR-81 +E0141;CM # VARIATION SELECTOR-82 +E0142;CM # VARIATION SELECTOR-83 +E0143;CM # VARIATION SELECTOR-84 +E0144;CM # VARIATION SELECTOR-85 +E0145;CM # VARIATION SELECTOR-86 +E0146;CM # VARIATION SELECTOR-87 +E0147;CM # VARIATION SELECTOR-88 +E0148;CM # VARIATION SELECTOR-89 +E0149;CM # VARIATION SELECTOR-90 +E014A;CM # VARIATION SELECTOR-91 +E014B;CM # VARIATION SELECTOR-92 +E014C;CM # VARIATION SELECTOR-93 +E014D;CM # VARIATION SELECTOR-94 +E014E;CM # VARIATION SELECTOR-95 +E014F;CM # VARIATION SELECTOR-96 +E0150;CM # VARIATION SELECTOR-97 +E0151;CM # VARIATION SELECTOR-98 +E0152;CM # VARIATION SELECTOR-99 +E0153;CM # VARIATION SELECTOR-100 +E0154;CM # VARIATION SELECTOR-101 +E0155;CM # VARIATION SELECTOR-102 +E0156;CM # VARIATION SELECTOR-103 +E0157;CM # VARIATION SELECTOR-104 +E0158;CM # VARIATION SELECTOR-105 +E0159;CM # VARIATION SELECTOR-106 +E015A;CM # VARIATION SELECTOR-107 +E015B;CM # VARIATION SELECTOR-108 +E015C;CM # VARIATION SELECTOR-109 +E015D;CM # VARIATION SELECTOR-110 +E015E;CM # VARIATION SELECTOR-111 +E015F;CM # VARIATION SELECTOR-112 +E0160;CM # VARIATION SELECTOR-113 +E0161;CM # VARIATION SELECTOR-114 +E0162;CM # VARIATION SELECTOR-115 +E0163;CM # VARIATION SELECTOR-116 +E0164;CM # VARIATION SELECTOR-117 +E0165;CM # VARIATION SELECTOR-118 +E0166;CM # VARIATION SELECTOR-119 +E0167;CM # VARIATION SELECTOR-120 +E0168;CM # VARIATION SELECTOR-121 +E0169;CM # VARIATION SELECTOR-122 +E016A;CM # VARIATION SELECTOR-123 +E016B;CM # VARIATION SELECTOR-124 +E016C;CM # VARIATION SELECTOR-125 +E016D;CM # VARIATION SELECTOR-126 +E016E;CM # VARIATION SELECTOR-127 +E016F;CM # VARIATION SELECTOR-128 +E0170;CM # VARIATION SELECTOR-129 +E0171;CM # VARIATION SELECTOR-130 +E0172;CM # VARIATION SELECTOR-131 +E0173;CM # VARIATION SELECTOR-132 +E0174;CM # VARIATION SELECTOR-133 +E0175;CM # VARIATION SELECTOR-134 +E0176;CM # VARIATION SELECTOR-135 +E0177;CM # VARIATION SELECTOR-136 +E0178;CM # VARIATION SELECTOR-137 +E0179;CM # VARIATION SELECTOR-138 +E017A;CM # VARIATION SELECTOR-139 +E017B;CM # VARIATION SELECTOR-140 +E017C;CM # VARIATION SELECTOR-141 +E017D;CM # VARIATION SELECTOR-142 +E017E;CM # VARIATION SELECTOR-143 +E017F;CM # VARIATION SELECTOR-144 +E0180;CM # VARIATION SELECTOR-145 +E0181;CM # VARIATION SELECTOR-146 +E0182;CM # VARIATION SELECTOR-147 +E0183;CM # VARIATION SELECTOR-148 +E0184;CM # VARIATION SELECTOR-149 +E0185;CM # VARIATION SELECTOR-150 +E0186;CM # VARIATION SELECTOR-151 +E0187;CM # VARIATION SELECTOR-152 +E0188;CM # VARIATION SELECTOR-153 +E0189;CM # VARIATION SELECTOR-154 +E018A;CM # VARIATION SELECTOR-155 +E018B;CM # VARIATION SELECTOR-156 +E018C;CM # VARIATION SELECTOR-157 +E018D;CM # VARIATION SELECTOR-158 +E018E;CM # VARIATION SELECTOR-159 +E018F;CM # VARIATION SELECTOR-160 +E0190;CM # VARIATION SELECTOR-161 +E0191;CM # VARIATION SELECTOR-162 +E0192;CM # VARIATION SELECTOR-163 +E0193;CM # VARIATION SELECTOR-164 +E0194;CM # VARIATION SELECTOR-165 +E0195;CM # VARIATION SELECTOR-166 +E0196;CM # VARIATION SELECTOR-167 +E0197;CM # VARIATION SELECTOR-168 +E0198;CM # VARIATION SELECTOR-169 +E0199;CM # VARIATION SELECTOR-170 +E019A;CM # VARIATION SELECTOR-171 +E019B;CM # VARIATION SELECTOR-172 +E019C;CM # VARIATION SELECTOR-173 +E019D;CM # VARIATION SELECTOR-174 +E019E;CM # VARIATION SELECTOR-175 +E019F;CM # VARIATION SELECTOR-176 +E01A0;CM # VARIATION SELECTOR-177 +E01A1;CM # VARIATION SELECTOR-178 +E01A2;CM # VARIATION SELECTOR-179 +E01A3;CM # VARIATION SELECTOR-180 +E01A4;CM # VARIATION SELECTOR-181 +E01A5;CM # VARIATION SELECTOR-182 +E01A6;CM # VARIATION SELECTOR-183 +E01A7;CM # VARIATION SELECTOR-184 +E01A8;CM # VARIATION SELECTOR-185 +E01A9;CM # VARIATION SELECTOR-186 +E01AA;CM # VARIATION SELECTOR-187 +E01AB;CM # VARIATION SELECTOR-188 +E01AC;CM # VARIATION SELECTOR-189 +E01AD;CM # VARIATION SELECTOR-190 +E01AE;CM # VARIATION SELECTOR-191 +E01AF;CM # VARIATION SELECTOR-192 +E01B0;CM # VARIATION SELECTOR-193 +E01B1;CM # VARIATION SELECTOR-194 +E01B2;CM # VARIATION SELECTOR-195 +E01B3;CM # VARIATION SELECTOR-196 +E01B4;CM # VARIATION SELECTOR-197 +E01B5;CM # VARIATION SELECTOR-198 +E01B6;CM # VARIATION SELECTOR-199 +E01B7;CM # VARIATION SELECTOR-200 +E01B8;CM # VARIATION SELECTOR-201 +E01B9;CM # VARIATION SELECTOR-202 +E01BA;CM # VARIATION SELECTOR-203 +E01BB;CM # VARIATION SELECTOR-204 +E01BC;CM # VARIATION SELECTOR-205 +E01BD;CM # VARIATION SELECTOR-206 +E01BE;CM # VARIATION SELECTOR-207 +E01BF;CM # VARIATION SELECTOR-208 +E01C0;CM # VARIATION SELECTOR-209 +E01C1;CM # VARIATION SELECTOR-210 +E01C2;CM # VARIATION SELECTOR-211 +E01C3;CM # VARIATION SELECTOR-212 +E01C4;CM # VARIATION SELECTOR-213 +E01C5;CM # VARIATION SELECTOR-214 +E01C6;CM # VARIATION SELECTOR-215 +E01C7;CM # VARIATION SELECTOR-216 +E01C8;CM # VARIATION SELECTOR-217 +E01C9;CM # VARIATION SELECTOR-218 +E01CA;CM # VARIATION SELECTOR-219 +E01CB;CM # VARIATION SELECTOR-220 +E01CC;CM # VARIATION SELECTOR-221 +E01CD;CM # VARIATION SELECTOR-222 +E01CE;CM # VARIATION SELECTOR-223 +E01CF;CM # VARIATION SELECTOR-224 +E01D0;CM # VARIATION SELECTOR-225 +E01D1;CM # VARIATION SELECTOR-226 +E01D2;CM # VARIATION SELECTOR-227 +E01D3;CM # VARIATION SELECTOR-228 +E01D4;CM # VARIATION SELECTOR-229 +E01D5;CM # VARIATION SELECTOR-230 +E01D6;CM # VARIATION SELECTOR-231 +E01D7;CM # VARIATION SELECTOR-232 +E01D8;CM # VARIATION SELECTOR-233 +E01D9;CM # VARIATION SELECTOR-234 +E01DA;CM # VARIATION SELECTOR-235 +E01DB;CM # VARIATION SELECTOR-236 +E01DC;CM # VARIATION SELECTOR-237 +E01DD;CM # VARIATION SELECTOR-238 +E01DE;CM # VARIATION SELECTOR-239 +E01DF;CM # VARIATION SELECTOR-240 +E01E0;CM # VARIATION SELECTOR-241 +E01E1;CM # VARIATION SELECTOR-242 +E01E2;CM # VARIATION SELECTOR-243 +E01E3;CM # VARIATION SELECTOR-244 +E01E4;CM # VARIATION SELECTOR-245 +E01E5;CM # VARIATION SELECTOR-246 +E01E6;CM # VARIATION SELECTOR-247 +E01E7;CM # VARIATION SELECTOR-248 +E01E8;CM # VARIATION SELECTOR-249 +E01E9;CM # VARIATION SELECTOR-250 +E01EA;CM # VARIATION SELECTOR-251 +E01EB;CM # VARIATION SELECTOR-252 +E01EC;CM # VARIATION SELECTOR-253 +E01ED;CM # VARIATION SELECTOR-254 +E01EE;CM # VARIATION SELECTOR-255 +E01EF;CM # VARIATION SELECTOR-256 +F0000..FFFFD;XX # <Plane 15 Private Use, First>..<Plane 15 Private Use, Last> +100000..10FFFD;XX # <Plane 16 Private Use, First>..<Plane 16 Private Use, Last> diff --git a/Master/tlpkg/tlperl.old/lib/unicore/Name.pl b/Master/tlpkg/tlperl.old/lib/unicore/Name.pl new file mode 100644 index 00000000000..6074a8ae3c7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/Name.pl @@ -0,0 +1,16346 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +return <<'END'; +0000 NULL +0001 START OF HEADING +0002 START OF TEXT +0003 END OF TEXT +0004 END OF TRANSMISSION +0005 ENQUIRY +0006 ACKNOWLEDGE +0007 BELL +0008 BACKSPACE +0009 CHARACTER TABULATION +000A LINE FEED (LF) +000B LINE TABULATION +000C FORM FEED (FF) +000D CARRIAGE RETURN (CR) +000E SHIFT OUT +000F SHIFT IN +0010 DATA LINK ESCAPE +0011 DEVICE CONTROL ONE +0012 DEVICE CONTROL TWO +0013 DEVICE CONTROL THREE +0014 DEVICE CONTROL FOUR +0015 NEGATIVE ACKNOWLEDGE +0016 SYNCHRONOUS IDLE +0017 END OF TRANSMISSION BLOCK +0018 CANCEL +0019 END OF MEDIUM +001A SUBSTITUTE +001B ESCAPE +001C INFORMATION SEPARATOR FOUR +001D INFORMATION SEPARATOR THREE +001E INFORMATION SEPARATOR TWO +001F INFORMATION SEPARATOR ONE +0020 SPACE +0021 EXCLAMATION MARK +0022 QUOTATION MARK +0023 NUMBER SIGN +0024 DOLLAR SIGN +0025 PERCENT SIGN +0026 AMPERSAND +0027 APOSTROPHE +0028 LEFT PARENTHESIS +0029 RIGHT PARENTHESIS +002A ASTERISK +002B PLUS SIGN +002C COMMA +002D HYPHEN-MINUS +002E FULL STOP +002F SOLIDUS +0030 DIGIT ZERO +0031 DIGIT ONE +0032 DIGIT TWO +0033 DIGIT THREE +0034 DIGIT FOUR +0035 DIGIT FIVE +0036 DIGIT SIX +0037 DIGIT SEVEN +0038 DIGIT EIGHT +0039 DIGIT NINE +003A COLON +003B SEMICOLON +003C LESS-THAN SIGN +003D EQUALS SIGN +003E GREATER-THAN SIGN +003F QUESTION MARK +0040 COMMERCIAL AT +0041 LATIN CAPITAL LETTER A +0042 LATIN CAPITAL LETTER B +0043 LATIN CAPITAL LETTER C +0044 LATIN CAPITAL LETTER D +0045 LATIN CAPITAL LETTER E +0046 LATIN CAPITAL LETTER F +0047 LATIN CAPITAL LETTER G +0048 LATIN CAPITAL LETTER H +0049 LATIN CAPITAL LETTER I +004A LATIN CAPITAL LETTER J +004B LATIN CAPITAL LETTER K +004C LATIN CAPITAL LETTER L +004D LATIN CAPITAL LETTER M +004E LATIN CAPITAL LETTER N +004F LATIN CAPITAL LETTER O +0050 LATIN CAPITAL LETTER P +0051 LATIN CAPITAL LETTER Q +0052 LATIN CAPITAL LETTER R +0053 LATIN CAPITAL LETTER S +0054 LATIN CAPITAL LETTER T +0055 LATIN CAPITAL LETTER U +0056 LATIN CAPITAL LETTER V +0057 LATIN CAPITAL LETTER W +0058 LATIN CAPITAL LETTER X +0059 LATIN CAPITAL LETTER Y +005A LATIN CAPITAL LETTER Z +005B LEFT SQUARE BRACKET +005C REVERSE SOLIDUS +005D RIGHT SQUARE BRACKET +005E CIRCUMFLEX ACCENT +005F LOW LINE +0060 GRAVE ACCENT +0061 LATIN SMALL LETTER A +0062 LATIN SMALL LETTER B +0063 LATIN SMALL LETTER C +0064 LATIN SMALL LETTER D +0065 LATIN SMALL LETTER E +0066 LATIN SMALL LETTER F +0067 LATIN SMALL LETTER G +0068 LATIN SMALL LETTER H +0069 LATIN SMALL LETTER I +006A LATIN SMALL LETTER J +006B LATIN SMALL LETTER K +006C LATIN SMALL LETTER L +006D LATIN SMALL LETTER M +006E LATIN SMALL LETTER N +006F LATIN SMALL LETTER O +0070 LATIN SMALL LETTER P +0071 LATIN SMALL LETTER Q +0072 LATIN SMALL LETTER R +0073 LATIN SMALL LETTER S +0074 LATIN SMALL LETTER T +0075 LATIN SMALL LETTER U +0076 LATIN SMALL LETTER V +0077 LATIN SMALL LETTER W +0078 LATIN SMALL LETTER X +0079 LATIN SMALL LETTER Y +007A LATIN SMALL LETTER Z +007B LEFT CURLY BRACKET +007C VERTICAL LINE +007D RIGHT CURLY BRACKET +007E TILDE +007F DELETE +0080 0081 <control> +0082 BREAK PERMITTED HERE +0083 NO BREAK HERE +0084 <control> +0085 NEXT LINE (NEL) +0086 START OF SELECTED AREA +0087 END OF SELECTED AREA +0088 CHARACTER TABULATION SET +0089 CHARACTER TABULATION WITH JUSTIFICATION +008A LINE TABULATION SET +008B PARTIAL LINE FORWARD +008C PARTIAL LINE BACKWARD +008D REVERSE LINE FEED +008E SINGLE SHIFT TWO +008F SINGLE SHIFT THREE +0090 DEVICE CONTROL STRING +0091 PRIVATE USE ONE +0092 PRIVATE USE TWO +0093 SET TRANSMIT STATE +0094 CANCEL CHARACTER +0095 MESSAGE WAITING +0096 START OF GUARDED AREA +0097 END OF GUARDED AREA +0098 START OF STRING +0099 <control> +009A SINGLE CHARACTER INTRODUCER +009B CONTROL SEQUENCE INTRODUCER +009C STRING TERMINATOR +009D OPERATING SYSTEM COMMAND +009E PRIVACY MESSAGE +009F APPLICATION PROGRAM COMMAND +00A0 NO-BREAK SPACE +00A1 INVERTED EXCLAMATION MARK +00A2 CENT SIGN +00A3 POUND SIGN +00A4 CURRENCY SIGN +00A5 YEN SIGN +00A6 BROKEN BAR +00A7 SECTION SIGN +00A8 DIAERESIS +00A9 COPYRIGHT SIGN +00AA FEMININE ORDINAL INDICATOR +00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC NOT SIGN +00AD SOFT HYPHEN +00AE REGISTERED SIGN +00AF MACRON +00B0 DEGREE SIGN +00B1 PLUS-MINUS SIGN +00B2 SUPERSCRIPT TWO +00B3 SUPERSCRIPT THREE +00B4 ACUTE ACCENT +00B5 MICRO SIGN +00B6 PILCROW SIGN +00B7 MIDDLE DOT +00B8 CEDILLA +00B9 SUPERSCRIPT ONE +00BA MASCULINE ORDINAL INDICATOR +00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BC VULGAR FRACTION ONE QUARTER +00BD VULGAR FRACTION ONE HALF +00BE VULGAR FRACTION THREE QUARTERS +00BF INVERTED QUESTION MARK +00C0 LATIN CAPITAL LETTER A WITH GRAVE +00C1 LATIN CAPITAL LETTER A WITH ACUTE +00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX +00C3 LATIN CAPITAL LETTER A WITH TILDE +00C4 LATIN CAPITAL LETTER A WITH DIAERESIS +00C5 LATIN CAPITAL LETTER A WITH RING ABOVE +00C6 LATIN CAPITAL LETTER AE +00C7 LATIN CAPITAL LETTER C WITH CEDILLA +00C8 LATIN CAPITAL LETTER E WITH GRAVE +00C9 LATIN CAPITAL LETTER E WITH ACUTE +00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX +00CB LATIN CAPITAL LETTER E WITH DIAERESIS +00CC LATIN CAPITAL LETTER I WITH GRAVE +00CD LATIN CAPITAL LETTER I WITH ACUTE +00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX +00CF LATIN CAPITAL LETTER I WITH DIAERESIS +00D0 LATIN CAPITAL LETTER ETH +00D1 LATIN CAPITAL LETTER N WITH TILDE +00D2 LATIN CAPITAL LETTER O WITH GRAVE +00D3 LATIN CAPITAL LETTER O WITH ACUTE +00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX +00D5 LATIN CAPITAL LETTER O WITH TILDE +00D6 LATIN CAPITAL LETTER O WITH DIAERESIS +00D7 MULTIPLICATION SIGN +00D8 LATIN CAPITAL LETTER O WITH STROKE +00D9 LATIN CAPITAL LETTER U WITH GRAVE +00DA LATIN CAPITAL LETTER U WITH ACUTE +00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX +00DC LATIN CAPITAL LETTER U WITH DIAERESIS +00DD LATIN CAPITAL LETTER Y WITH ACUTE +00DE LATIN CAPITAL LETTER THORN +00DF LATIN SMALL LETTER SHARP S +00E0 LATIN SMALL LETTER A WITH GRAVE +00E1 LATIN SMALL LETTER A WITH ACUTE +00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX +00E3 LATIN SMALL LETTER A WITH TILDE +00E4 LATIN SMALL LETTER A WITH DIAERESIS +00E5 LATIN SMALL LETTER A WITH RING ABOVE +00E6 LATIN SMALL LETTER AE +00E7 LATIN SMALL LETTER C WITH CEDILLA +00E8 LATIN SMALL LETTER E WITH GRAVE +00E9 LATIN SMALL LETTER E WITH ACUTE +00EA LATIN SMALL LETTER E WITH CIRCUMFLEX +00EB LATIN SMALL LETTER E WITH DIAERESIS +00EC LATIN SMALL LETTER I WITH GRAVE +00ED LATIN SMALL LETTER I WITH ACUTE +00EE LATIN SMALL LETTER I WITH CIRCUMFLEX +00EF LATIN SMALL LETTER I WITH DIAERESIS +00F0 LATIN SMALL LETTER ETH +00F1 LATIN SMALL LETTER N WITH TILDE +00F2 LATIN SMALL LETTER O WITH GRAVE +00F3 LATIN SMALL LETTER O WITH ACUTE +00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX +00F5 LATIN SMALL LETTER O WITH TILDE +00F6 LATIN SMALL LETTER O WITH DIAERESIS +00F7 DIVISION SIGN +00F8 LATIN SMALL LETTER O WITH STROKE +00F9 LATIN SMALL LETTER U WITH GRAVE +00FA LATIN SMALL LETTER U WITH ACUTE +00FB LATIN SMALL LETTER U WITH CIRCUMFLEX +00FC LATIN SMALL LETTER U WITH DIAERESIS +00FD LATIN SMALL LETTER Y WITH ACUTE +00FE LATIN SMALL LETTER THORN +00FF LATIN SMALL LETTER Y WITH DIAERESIS +0100 LATIN CAPITAL LETTER A WITH MACRON +0101 LATIN SMALL LETTER A WITH MACRON +0102 LATIN CAPITAL LETTER A WITH BREVE +0103 LATIN SMALL LETTER A WITH BREVE +0104 LATIN CAPITAL LETTER A WITH OGONEK +0105 LATIN SMALL LETTER A WITH OGONEK +0106 LATIN CAPITAL LETTER C WITH ACUTE +0107 LATIN SMALL LETTER C WITH ACUTE +0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX +0109 LATIN SMALL LETTER C WITH CIRCUMFLEX +010A LATIN CAPITAL LETTER C WITH DOT ABOVE +010B LATIN SMALL LETTER C WITH DOT ABOVE +010C LATIN CAPITAL LETTER C WITH CARON +010D LATIN SMALL LETTER C WITH CARON +010E LATIN CAPITAL LETTER D WITH CARON +010F LATIN SMALL LETTER D WITH CARON +0110 LATIN CAPITAL LETTER D WITH STROKE +0111 LATIN SMALL LETTER D WITH STROKE +0112 LATIN CAPITAL LETTER E WITH MACRON +0113 LATIN SMALL LETTER E WITH MACRON +0114 LATIN CAPITAL LETTER E WITH BREVE +0115 LATIN SMALL LETTER E WITH BREVE +0116 LATIN CAPITAL LETTER E WITH DOT ABOVE +0117 LATIN SMALL LETTER E WITH DOT ABOVE +0118 LATIN CAPITAL LETTER E WITH OGONEK +0119 LATIN SMALL LETTER E WITH OGONEK +011A LATIN CAPITAL LETTER E WITH CARON +011B LATIN SMALL LETTER E WITH CARON +011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX +011D LATIN SMALL LETTER G WITH CIRCUMFLEX +011E LATIN CAPITAL LETTER G WITH BREVE +011F LATIN SMALL LETTER G WITH BREVE +0120 LATIN CAPITAL LETTER G WITH DOT ABOVE +0121 LATIN SMALL LETTER G WITH DOT ABOVE +0122 LATIN CAPITAL LETTER G WITH CEDILLA +0123 LATIN SMALL LETTER G WITH CEDILLA +0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0125 LATIN SMALL LETTER H WITH CIRCUMFLEX +0126 LATIN CAPITAL LETTER H WITH STROKE +0127 LATIN SMALL LETTER H WITH STROKE +0128 LATIN CAPITAL LETTER I WITH TILDE +0129 LATIN SMALL LETTER I WITH TILDE +012A LATIN CAPITAL LETTER I WITH MACRON +012B LATIN SMALL LETTER I WITH MACRON +012C LATIN CAPITAL LETTER I WITH BREVE +012D LATIN SMALL LETTER I WITH BREVE +012E LATIN CAPITAL LETTER I WITH OGONEK +012F LATIN SMALL LETTER I WITH OGONEK +0130 LATIN CAPITAL LETTER I WITH DOT ABOVE +0131 LATIN SMALL LETTER DOTLESS I +0132 LATIN CAPITAL LIGATURE IJ +0133 LATIN SMALL LIGATURE IJ +0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0135 LATIN SMALL LETTER J WITH CIRCUMFLEX +0136 LATIN CAPITAL LETTER K WITH CEDILLA +0137 LATIN SMALL LETTER K WITH CEDILLA +0138 LATIN SMALL LETTER KRA +0139 LATIN CAPITAL LETTER L WITH ACUTE +013A LATIN SMALL LETTER L WITH ACUTE +013B LATIN CAPITAL LETTER L WITH CEDILLA +013C LATIN SMALL LETTER L WITH CEDILLA +013D LATIN CAPITAL LETTER L WITH CARON +013E LATIN SMALL LETTER L WITH CARON +013F LATIN CAPITAL LETTER L WITH MIDDLE DOT +0140 LATIN SMALL LETTER L WITH MIDDLE DOT +0141 LATIN CAPITAL LETTER L WITH STROKE +0142 LATIN SMALL LETTER L WITH STROKE +0143 LATIN CAPITAL LETTER N WITH ACUTE +0144 LATIN SMALL LETTER N WITH ACUTE +0145 LATIN CAPITAL LETTER N WITH CEDILLA +0146 LATIN SMALL LETTER N WITH CEDILLA +0147 LATIN CAPITAL LETTER N WITH CARON +0148 LATIN SMALL LETTER N WITH CARON +0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +014A LATIN CAPITAL LETTER ENG +014B LATIN SMALL LETTER ENG +014C LATIN CAPITAL LETTER O WITH MACRON +014D LATIN SMALL LETTER O WITH MACRON +014E LATIN CAPITAL LETTER O WITH BREVE +014F LATIN SMALL LETTER O WITH BREVE +0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE +0152 LATIN CAPITAL LIGATURE OE +0153 LATIN SMALL LIGATURE OE +0154 LATIN CAPITAL LETTER R WITH ACUTE +0155 LATIN SMALL LETTER R WITH ACUTE +0156 LATIN CAPITAL LETTER R WITH CEDILLA +0157 LATIN SMALL LETTER R WITH CEDILLA +0158 LATIN CAPITAL LETTER R WITH CARON +0159 LATIN SMALL LETTER R WITH CARON +015A LATIN CAPITAL LETTER S WITH ACUTE +015B LATIN SMALL LETTER S WITH ACUTE +015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX +015D LATIN SMALL LETTER S WITH CIRCUMFLEX +015E LATIN CAPITAL LETTER S WITH CEDILLA +015F LATIN SMALL LETTER S WITH CEDILLA +0160 LATIN CAPITAL LETTER S WITH CARON +0161 LATIN SMALL LETTER S WITH CARON +0162 LATIN CAPITAL LETTER T WITH CEDILLA +0163 LATIN SMALL LETTER T WITH CEDILLA +0164 LATIN CAPITAL LETTER T WITH CARON +0165 LATIN SMALL LETTER T WITH CARON +0166 LATIN CAPITAL LETTER T WITH STROKE +0167 LATIN SMALL LETTER T WITH STROKE +0168 LATIN CAPITAL LETTER U WITH TILDE +0169 LATIN SMALL LETTER U WITH TILDE +016A LATIN CAPITAL LETTER U WITH MACRON +016B LATIN SMALL LETTER U WITH MACRON +016C LATIN CAPITAL LETTER U WITH BREVE +016D LATIN SMALL LETTER U WITH BREVE +016E LATIN CAPITAL LETTER U WITH RING ABOVE +016F LATIN SMALL LETTER U WITH RING ABOVE +0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE +0172 LATIN CAPITAL LETTER U WITH OGONEK +0173 LATIN SMALL LETTER U WITH OGONEK +0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0175 LATIN SMALL LETTER W WITH CIRCUMFLEX +0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX +0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +0179 LATIN CAPITAL LETTER Z WITH ACUTE +017A LATIN SMALL LETTER Z WITH ACUTE +017B LATIN CAPITAL LETTER Z WITH DOT ABOVE +017C LATIN SMALL LETTER Z WITH DOT ABOVE +017D LATIN CAPITAL LETTER Z WITH CARON +017E LATIN SMALL LETTER Z WITH CARON +017F LATIN SMALL LETTER LONG S +0180 LATIN SMALL LETTER B WITH STROKE +0181 LATIN CAPITAL LETTER B WITH HOOK +0182 LATIN CAPITAL LETTER B WITH TOPBAR +0183 LATIN SMALL LETTER B WITH TOPBAR +0184 LATIN CAPITAL LETTER TONE SIX +0185 LATIN SMALL LETTER TONE SIX +0186 LATIN CAPITAL LETTER OPEN O +0187 LATIN CAPITAL LETTER C WITH HOOK +0188 LATIN SMALL LETTER C WITH HOOK +0189 LATIN CAPITAL LETTER AFRICAN D +018A LATIN CAPITAL LETTER D WITH HOOK +018B LATIN CAPITAL LETTER D WITH TOPBAR +018C LATIN SMALL LETTER D WITH TOPBAR +018D LATIN SMALL LETTER TURNED DELTA +018E LATIN CAPITAL LETTER REVERSED E +018F LATIN CAPITAL LETTER SCHWA +0190 LATIN CAPITAL LETTER OPEN E +0191 LATIN CAPITAL LETTER F WITH HOOK +0192 LATIN SMALL LETTER F WITH HOOK +0193 LATIN CAPITAL LETTER G WITH HOOK +0194 LATIN CAPITAL LETTER GAMMA +0195 LATIN SMALL LETTER HV +0196 LATIN CAPITAL LETTER IOTA +0197 LATIN CAPITAL LETTER I WITH STROKE +0198 LATIN CAPITAL LETTER K WITH HOOK +0199 LATIN SMALL LETTER K WITH HOOK +019A LATIN SMALL LETTER L WITH BAR +019B LATIN SMALL LETTER LAMBDA WITH STROKE +019C LATIN CAPITAL LETTER TURNED M +019D LATIN CAPITAL LETTER N WITH LEFT HOOK +019E LATIN SMALL LETTER N WITH LONG RIGHT LEG +019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE +01A0 LATIN CAPITAL LETTER O WITH HORN +01A1 LATIN SMALL LETTER O WITH HORN +01A2 LATIN CAPITAL LETTER OI +01A3 LATIN SMALL LETTER OI +01A4 LATIN CAPITAL LETTER P WITH HOOK +01A5 LATIN SMALL LETTER P WITH HOOK +01A6 LATIN LETTER YR +01A7 LATIN CAPITAL LETTER TONE TWO +01A8 LATIN SMALL LETTER TONE TWO +01A9 LATIN CAPITAL LETTER ESH +01AA LATIN LETTER REVERSED ESH LOOP +01AB LATIN SMALL LETTER T WITH PALATAL HOOK +01AC LATIN CAPITAL LETTER T WITH HOOK +01AD LATIN SMALL LETTER T WITH HOOK +01AE LATIN CAPITAL LETTER T WITH RETROFLEX HOOK +01AF LATIN CAPITAL LETTER U WITH HORN +01B0 LATIN SMALL LETTER U WITH HORN +01B1 LATIN CAPITAL LETTER UPSILON +01B2 LATIN CAPITAL LETTER V WITH HOOK +01B3 LATIN CAPITAL LETTER Y WITH HOOK +01B4 LATIN SMALL LETTER Y WITH HOOK +01B5 LATIN CAPITAL LETTER Z WITH STROKE +01B6 LATIN SMALL LETTER Z WITH STROKE +01B7 LATIN CAPITAL LETTER EZH +01B8 LATIN CAPITAL LETTER EZH REVERSED +01B9 LATIN SMALL LETTER EZH REVERSED +01BA LATIN SMALL LETTER EZH WITH TAIL +01BB LATIN LETTER TWO WITH STROKE +01BC LATIN CAPITAL LETTER TONE FIVE +01BD LATIN SMALL LETTER TONE FIVE +01BE LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE +01BF LATIN LETTER WYNN +01C0 LATIN LETTER DENTAL CLICK +01C1 LATIN LETTER LATERAL CLICK +01C2 LATIN LETTER ALVEOLAR CLICK +01C3 LATIN LETTER RETROFLEX CLICK +01C4 LATIN CAPITAL LETTER DZ WITH CARON +01C5 LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +01C6 LATIN SMALL LETTER DZ WITH CARON +01C7 LATIN CAPITAL LETTER LJ +01C8 LATIN CAPITAL LETTER L WITH SMALL LETTER J +01C9 LATIN SMALL LETTER LJ +01CA LATIN CAPITAL LETTER NJ +01CB LATIN CAPITAL LETTER N WITH SMALL LETTER J +01CC LATIN SMALL LETTER NJ +01CD LATIN CAPITAL LETTER A WITH CARON +01CE LATIN SMALL LETTER A WITH CARON +01CF LATIN CAPITAL LETTER I WITH CARON +01D0 LATIN SMALL LETTER I WITH CARON +01D1 LATIN CAPITAL LETTER O WITH CARON +01D2 LATIN SMALL LETTER O WITH CARON +01D3 LATIN CAPITAL LETTER U WITH CARON +01D4 LATIN SMALL LETTER U WITH CARON +01D5 LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D6 LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D7 LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D8 LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01D9 LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DA LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01DB LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DC LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +01DD LATIN SMALL LETTER TURNED E +01DE LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +01DF LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +01E0 LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +01E1 LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +01E2 LATIN CAPITAL LETTER AE WITH MACRON +01E3 LATIN SMALL LETTER AE WITH MACRON +01E4 LATIN CAPITAL LETTER G WITH STROKE +01E5 LATIN SMALL LETTER G WITH STROKE +01E6 LATIN CAPITAL LETTER G WITH CARON +01E7 LATIN SMALL LETTER G WITH CARON +01E8 LATIN CAPITAL LETTER K WITH CARON +01E9 LATIN SMALL LETTER K WITH CARON +01EA LATIN CAPITAL LETTER O WITH OGONEK +01EB LATIN SMALL LETTER O WITH OGONEK +01EC LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +01ED LATIN SMALL LETTER O WITH OGONEK AND MACRON +01EE LATIN CAPITAL LETTER EZH WITH CARON +01EF LATIN SMALL LETTER EZH WITH CARON +01F0 LATIN SMALL LETTER J WITH CARON +01F1 LATIN CAPITAL LETTER DZ +01F2 LATIN CAPITAL LETTER D WITH SMALL LETTER Z +01F3 LATIN SMALL LETTER DZ +01F4 LATIN CAPITAL LETTER G WITH ACUTE +01F5 LATIN SMALL LETTER G WITH ACUTE +01F6 LATIN CAPITAL LETTER HWAIR +01F7 LATIN CAPITAL LETTER WYNN +01F8 LATIN CAPITAL LETTER N WITH GRAVE +01F9 LATIN SMALL LETTER N WITH GRAVE +01FA LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +01FB LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +01FC LATIN CAPITAL LETTER AE WITH ACUTE +01FD LATIN SMALL LETTER AE WITH ACUTE +01FE LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +01FF LATIN SMALL LETTER O WITH STROKE AND ACUTE +0200 LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0201 LATIN SMALL LETTER A WITH DOUBLE GRAVE +0202 LATIN CAPITAL LETTER A WITH INVERTED BREVE +0203 LATIN SMALL LETTER A WITH INVERTED BREVE +0204 LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0205 LATIN SMALL LETTER E WITH DOUBLE GRAVE +0206 LATIN CAPITAL LETTER E WITH INVERTED BREVE +0207 LATIN SMALL LETTER E WITH INVERTED BREVE +0208 LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +0209 LATIN SMALL LETTER I WITH DOUBLE GRAVE +020A LATIN CAPITAL LETTER I WITH INVERTED BREVE +020B LATIN SMALL LETTER I WITH INVERTED BREVE +020C LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020D LATIN SMALL LETTER O WITH DOUBLE GRAVE +020E LATIN CAPITAL LETTER O WITH INVERTED BREVE +020F LATIN SMALL LETTER O WITH INVERTED BREVE +0210 LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0211 LATIN SMALL LETTER R WITH DOUBLE GRAVE +0212 LATIN CAPITAL LETTER R WITH INVERTED BREVE +0213 LATIN SMALL LETTER R WITH INVERTED BREVE +0214 LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0215 LATIN SMALL LETTER U WITH DOUBLE GRAVE +0216 LATIN CAPITAL LETTER U WITH INVERTED BREVE +0217 LATIN SMALL LETTER U WITH INVERTED BREVE +0218 LATIN CAPITAL LETTER S WITH COMMA BELOW +0219 LATIN SMALL LETTER S WITH COMMA BELOW +021A LATIN CAPITAL LETTER T WITH COMMA BELOW +021B LATIN SMALL LETTER T WITH COMMA BELOW +021C LATIN CAPITAL LETTER YOGH +021D LATIN SMALL LETTER YOGH +021E LATIN CAPITAL LETTER H WITH CARON +021F LATIN SMALL LETTER H WITH CARON +0220 LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +0221 LATIN SMALL LETTER D WITH CURL +0222 LATIN CAPITAL LETTER OU +0223 LATIN SMALL LETTER OU +0224 LATIN CAPITAL LETTER Z WITH HOOK +0225 LATIN SMALL LETTER Z WITH HOOK +0226 LATIN CAPITAL LETTER A WITH DOT ABOVE +0227 LATIN SMALL LETTER A WITH DOT ABOVE +0228 LATIN CAPITAL LETTER E WITH CEDILLA +0229 LATIN SMALL LETTER E WITH CEDILLA +022A LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +022B LATIN SMALL LETTER O WITH DIAERESIS AND MACRON +022C LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022D LATIN SMALL LETTER O WITH TILDE AND MACRON +022E LATIN CAPITAL LETTER O WITH DOT ABOVE +022F LATIN SMALL LETTER O WITH DOT ABOVE +0230 LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +0231 LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON +0232 LATIN CAPITAL LETTER Y WITH MACRON +0233 LATIN SMALL LETTER Y WITH MACRON +0234 LATIN SMALL LETTER L WITH CURL +0235 LATIN SMALL LETTER N WITH CURL +0236 LATIN SMALL LETTER T WITH CURL +0237 LATIN SMALL LETTER DOTLESS J +0238 LATIN SMALL LETTER DB DIGRAPH +0239 LATIN SMALL LETTER QP DIGRAPH +023A LATIN CAPITAL LETTER A WITH STROKE +023B LATIN CAPITAL LETTER C WITH STROKE +023C LATIN SMALL LETTER C WITH STROKE +023D LATIN CAPITAL LETTER L WITH BAR +023E LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +023F LATIN SMALL LETTER S WITH SWASH TAIL +0240 LATIN SMALL LETTER Z WITH SWASH TAIL +0241 LATIN CAPITAL LETTER GLOTTAL STOP +0250 LATIN SMALL LETTER TURNED A +0251 LATIN SMALL LETTER ALPHA +0252 LATIN SMALL LETTER TURNED ALPHA +0253 LATIN SMALL LETTER B WITH HOOK +0254 LATIN SMALL LETTER OPEN O +0255 LATIN SMALL LETTER C WITH CURL +0256 LATIN SMALL LETTER D WITH TAIL +0257 LATIN SMALL LETTER D WITH HOOK +0258 LATIN SMALL LETTER REVERSED E +0259 LATIN SMALL LETTER SCHWA +025A LATIN SMALL LETTER SCHWA WITH HOOK +025B LATIN SMALL LETTER OPEN E +025C LATIN SMALL LETTER REVERSED OPEN E +025D LATIN SMALL LETTER REVERSED OPEN E WITH HOOK +025E LATIN SMALL LETTER CLOSED REVERSED OPEN E +025F LATIN SMALL LETTER DOTLESS J WITH STROKE +0260 LATIN SMALL LETTER G WITH HOOK +0261 LATIN SMALL LETTER SCRIPT G +0262 LATIN LETTER SMALL CAPITAL G +0263 LATIN SMALL LETTER GAMMA +0264 LATIN SMALL LETTER RAMS HORN +0265 LATIN SMALL LETTER TURNED H +0266 LATIN SMALL LETTER H WITH HOOK +0267 LATIN SMALL LETTER HENG WITH HOOK +0268 LATIN SMALL LETTER I WITH STROKE +0269 LATIN SMALL LETTER IOTA +026A LATIN LETTER SMALL CAPITAL I +026B LATIN SMALL LETTER L WITH MIDDLE TILDE +026C LATIN SMALL LETTER L WITH BELT +026D LATIN SMALL LETTER L WITH RETROFLEX HOOK +026E LATIN SMALL LETTER LEZH +026F LATIN SMALL LETTER TURNED M +0270 LATIN SMALL LETTER TURNED M WITH LONG LEG +0271 LATIN SMALL LETTER M WITH HOOK +0272 LATIN SMALL LETTER N WITH LEFT HOOK +0273 LATIN SMALL LETTER N WITH RETROFLEX HOOK +0274 LATIN LETTER SMALL CAPITAL N +0275 LATIN SMALL LETTER BARRED O +0276 LATIN LETTER SMALL CAPITAL OE +0277 LATIN SMALL LETTER CLOSED OMEGA +0278 LATIN SMALL LETTER PHI +0279 LATIN SMALL LETTER TURNED R +027A LATIN SMALL LETTER TURNED R WITH LONG LEG +027B LATIN SMALL LETTER TURNED R WITH HOOK +027C LATIN SMALL LETTER R WITH LONG LEG +027D LATIN SMALL LETTER R WITH TAIL +027E LATIN SMALL LETTER R WITH FISHHOOK +027F LATIN SMALL LETTER REVERSED R WITH FISHHOOK +0280 LATIN LETTER SMALL CAPITAL R +0281 LATIN LETTER SMALL CAPITAL INVERTED R +0282 LATIN SMALL LETTER S WITH HOOK +0283 LATIN SMALL LETTER ESH +0284 LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK +0285 LATIN SMALL LETTER SQUAT REVERSED ESH +0286 LATIN SMALL LETTER ESH WITH CURL +0287 LATIN SMALL LETTER TURNED T +0288 LATIN SMALL LETTER T WITH RETROFLEX HOOK +0289 LATIN SMALL LETTER U BAR +028A LATIN SMALL LETTER UPSILON +028B LATIN SMALL LETTER V WITH HOOK +028C LATIN SMALL LETTER TURNED V +028D LATIN SMALL LETTER TURNED W +028E LATIN SMALL LETTER TURNED Y +028F LATIN LETTER SMALL CAPITAL Y +0290 LATIN SMALL LETTER Z WITH RETROFLEX HOOK +0291 LATIN SMALL LETTER Z WITH CURL +0292 LATIN SMALL LETTER EZH +0293 LATIN SMALL LETTER EZH WITH CURL +0294 LATIN LETTER GLOTTAL STOP +0295 LATIN LETTER PHARYNGEAL VOICED FRICATIVE +0296 LATIN LETTER INVERTED GLOTTAL STOP +0297 LATIN LETTER STRETCHED C +0298 LATIN LETTER BILABIAL CLICK +0299 LATIN LETTER SMALL CAPITAL B +029A LATIN SMALL LETTER CLOSED OPEN E +029B LATIN LETTER SMALL CAPITAL G WITH HOOK +029C LATIN LETTER SMALL CAPITAL H +029D LATIN SMALL LETTER J WITH CROSSED-TAIL +029E LATIN SMALL LETTER TURNED K +029F LATIN LETTER SMALL CAPITAL L +02A0 LATIN SMALL LETTER Q WITH HOOK +02A1 LATIN LETTER GLOTTAL STOP WITH STROKE +02A2 LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE +02A3 LATIN SMALL LETTER DZ DIGRAPH +02A4 LATIN SMALL LETTER DEZH DIGRAPH +02A5 LATIN SMALL LETTER DZ DIGRAPH WITH CURL +02A6 LATIN SMALL LETTER TS DIGRAPH +02A7 LATIN SMALL LETTER TESH DIGRAPH +02A8 LATIN SMALL LETTER TC DIGRAPH WITH CURL +02A9 LATIN SMALL LETTER FENG DIGRAPH +02AA LATIN SMALL LETTER LS DIGRAPH +02AB LATIN SMALL LETTER LZ DIGRAPH +02AC LATIN LETTER BILABIAL PERCUSSIVE +02AD LATIN LETTER BIDENTAL PERCUSSIVE +02AE LATIN SMALL LETTER TURNED H WITH FISHHOOK +02AF LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0 MODIFIER LETTER SMALL H +02B1 MODIFIER LETTER SMALL H WITH HOOK +02B2 MODIFIER LETTER SMALL J +02B3 MODIFIER LETTER SMALL R +02B4 MODIFIER LETTER SMALL TURNED R +02B5 MODIFIER LETTER SMALL TURNED R WITH HOOK +02B6 MODIFIER LETTER SMALL CAPITAL INVERTED R +02B7 MODIFIER LETTER SMALL W +02B8 MODIFIER LETTER SMALL Y +02B9 MODIFIER LETTER PRIME +02BA MODIFIER LETTER DOUBLE PRIME +02BB MODIFIER LETTER TURNED COMMA +02BC MODIFIER LETTER APOSTROPHE +02BD MODIFIER LETTER REVERSED COMMA +02BE MODIFIER LETTER RIGHT HALF RING +02BF MODIFIER LETTER LEFT HALF RING +02C0 MODIFIER LETTER GLOTTAL STOP +02C1 MODIFIER LETTER REVERSED GLOTTAL STOP +02C2 MODIFIER LETTER LEFT ARROWHEAD +02C3 MODIFIER LETTER RIGHT ARROWHEAD +02C4 MODIFIER LETTER UP ARROWHEAD +02C5 MODIFIER LETTER DOWN ARROWHEAD +02C6 MODIFIER LETTER CIRCUMFLEX ACCENT +02C7 CARON +02C8 MODIFIER LETTER VERTICAL LINE +02C9 MODIFIER LETTER MACRON +02CA MODIFIER LETTER ACUTE ACCENT +02CB MODIFIER LETTER GRAVE ACCENT +02CC MODIFIER LETTER LOW VERTICAL LINE +02CD MODIFIER LETTER LOW MACRON +02CE MODIFIER LETTER LOW GRAVE ACCENT +02CF MODIFIER LETTER LOW ACUTE ACCENT +02D0 MODIFIER LETTER TRIANGULAR COLON +02D1 MODIFIER LETTER HALF TRIANGULAR COLON +02D2 MODIFIER LETTER CENTRED RIGHT HALF RING +02D3 MODIFIER LETTER CENTRED LEFT HALF RING +02D4 MODIFIER LETTER UP TACK +02D5 MODIFIER LETTER DOWN TACK +02D6 MODIFIER LETTER PLUS SIGN +02D7 MODIFIER LETTER MINUS SIGN +02D8 BREVE +02D9 DOT ABOVE +02DA RING ABOVE +02DB OGONEK +02DC SMALL TILDE +02DD DOUBLE ACUTE ACCENT +02DE MODIFIER LETTER RHOTIC HOOK +02DF MODIFIER LETTER CROSS ACCENT +02E0 MODIFIER LETTER SMALL GAMMA +02E1 MODIFIER LETTER SMALL L +02E2 MODIFIER LETTER SMALL S +02E3 MODIFIER LETTER SMALL X +02E4 MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02E5 MODIFIER LETTER EXTRA-HIGH TONE BAR +02E6 MODIFIER LETTER HIGH TONE BAR +02E7 MODIFIER LETTER MID TONE BAR +02E8 MODIFIER LETTER LOW TONE BAR +02E9 MODIFIER LETTER EXTRA-LOW TONE BAR +02EA MODIFIER LETTER YIN DEPARTING TONE MARK +02EB MODIFIER LETTER YANG DEPARTING TONE MARK +02EC MODIFIER LETTER VOICING +02ED MODIFIER LETTER UNASPIRATED +02EE MODIFIER LETTER DOUBLE APOSTROPHE +02EF MODIFIER LETTER LOW DOWN ARROWHEAD +02F0 MODIFIER LETTER LOW UP ARROWHEAD +02F1 MODIFIER LETTER LOW LEFT ARROWHEAD +02F2 MODIFIER LETTER LOW RIGHT ARROWHEAD +02F3 MODIFIER LETTER LOW RING +02F4 MODIFIER LETTER MIDDLE GRAVE ACCENT +02F5 MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT +02F6 MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT +02F7 MODIFIER LETTER LOW TILDE +02F8 MODIFIER LETTER RAISED COLON +02F9 MODIFIER LETTER BEGIN HIGH TONE +02FA MODIFIER LETTER END HIGH TONE +02FB MODIFIER LETTER BEGIN LOW TONE +02FC MODIFIER LETTER END LOW TONE +02FD MODIFIER LETTER SHELF +02FE MODIFIER LETTER OPEN SHELF +02FF MODIFIER LETTER LOW LEFT ARROW +0300 COMBINING GRAVE ACCENT +0301 COMBINING ACUTE ACCENT +0302 COMBINING CIRCUMFLEX ACCENT +0303 COMBINING TILDE +0304 COMBINING MACRON +0305 COMBINING OVERLINE +0306 COMBINING BREVE +0307 COMBINING DOT ABOVE +0308 COMBINING DIAERESIS +0309 COMBINING HOOK ABOVE +030A COMBINING RING ABOVE +030B COMBINING DOUBLE ACUTE ACCENT +030C COMBINING CARON +030D COMBINING VERTICAL LINE ABOVE +030E COMBINING DOUBLE VERTICAL LINE ABOVE +030F COMBINING DOUBLE GRAVE ACCENT +0310 COMBINING CANDRABINDU +0311 COMBINING INVERTED BREVE +0312 COMBINING TURNED COMMA ABOVE +0313 COMBINING COMMA ABOVE +0314 COMBINING REVERSED COMMA ABOVE +0315 COMBINING COMMA ABOVE RIGHT +0316 COMBINING GRAVE ACCENT BELOW +0317 COMBINING ACUTE ACCENT BELOW +0318 COMBINING LEFT TACK BELOW +0319 COMBINING RIGHT TACK BELOW +031A COMBINING LEFT ANGLE ABOVE +031B COMBINING HORN +031C COMBINING LEFT HALF RING BELOW +031D COMBINING UP TACK BELOW +031E COMBINING DOWN TACK BELOW +031F COMBINING PLUS SIGN BELOW +0320 COMBINING MINUS SIGN BELOW +0321 COMBINING PALATALIZED HOOK BELOW +0322 COMBINING RETROFLEX HOOK BELOW +0323 COMBINING DOT BELOW +0324 COMBINING DIAERESIS BELOW +0325 COMBINING RING BELOW +0326 COMBINING COMMA BELOW +0327 COMBINING CEDILLA +0328 COMBINING OGONEK +0329 COMBINING VERTICAL LINE BELOW +032A COMBINING BRIDGE BELOW +032B COMBINING INVERTED DOUBLE ARCH BELOW +032C COMBINING CARON BELOW +032D COMBINING CIRCUMFLEX ACCENT BELOW +032E COMBINING BREVE BELOW +032F COMBINING INVERTED BREVE BELOW +0330 COMBINING TILDE BELOW +0331 COMBINING MACRON BELOW +0332 COMBINING LOW LINE +0333 COMBINING DOUBLE LOW LINE +0334 COMBINING TILDE OVERLAY +0335 COMBINING SHORT STROKE OVERLAY +0336 COMBINING LONG STROKE OVERLAY +0337 COMBINING SHORT SOLIDUS OVERLAY +0338 COMBINING LONG SOLIDUS OVERLAY +0339 COMBINING RIGHT HALF RING BELOW +033A COMBINING INVERTED BRIDGE BELOW +033B COMBINING SQUARE BELOW +033C COMBINING SEAGULL BELOW +033D COMBINING X ABOVE +033E COMBINING VERTICAL TILDE +033F COMBINING DOUBLE OVERLINE +0340 COMBINING GRAVE TONE MARK +0341 COMBINING ACUTE TONE MARK +0342 COMBINING GREEK PERISPOMENI +0343 COMBINING GREEK KORONIS +0344 COMBINING GREEK DIALYTIKA TONOS +0345 COMBINING GREEK YPOGEGRAMMENI +0346 COMBINING BRIDGE ABOVE +0347 COMBINING EQUALS SIGN BELOW +0348 COMBINING DOUBLE VERTICAL LINE BELOW +0349 COMBINING LEFT ANGLE BELOW +034A COMBINING NOT TILDE ABOVE +034B COMBINING HOMOTHETIC ABOVE +034C COMBINING ALMOST EQUAL TO ABOVE +034D COMBINING LEFT RIGHT ARROW BELOW +034E COMBINING UPWARDS ARROW BELOW +034F COMBINING GRAPHEME JOINER +0350 COMBINING RIGHT ARROWHEAD ABOVE +0351 COMBINING LEFT HALF RING ABOVE +0352 COMBINING FERMATA +0353 COMBINING X BELOW +0354 COMBINING LEFT ARROWHEAD BELOW +0355 COMBINING RIGHT ARROWHEAD BELOW +0356 COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW +0357 COMBINING RIGHT HALF RING ABOVE +0358 COMBINING DOT ABOVE RIGHT +0359 COMBINING ASTERISK BELOW +035A COMBINING DOUBLE RING BELOW +035B COMBINING ZIGZAG ABOVE +035C COMBINING DOUBLE BREVE BELOW +035D COMBINING DOUBLE BREVE +035E COMBINING DOUBLE MACRON +035F COMBINING DOUBLE MACRON BELOW +0360 COMBINING DOUBLE TILDE +0361 COMBINING DOUBLE INVERTED BREVE +0362 COMBINING DOUBLE RIGHTWARDS ARROW BELOW +0363 COMBINING LATIN SMALL LETTER A +0364 COMBINING LATIN SMALL LETTER E +0365 COMBINING LATIN SMALL LETTER I +0366 COMBINING LATIN SMALL LETTER O +0367 COMBINING LATIN SMALL LETTER U +0368 COMBINING LATIN SMALL LETTER C +0369 COMBINING LATIN SMALL LETTER D +036A COMBINING LATIN SMALL LETTER H +036B COMBINING LATIN SMALL LETTER M +036C COMBINING LATIN SMALL LETTER R +036D COMBINING LATIN SMALL LETTER T +036E COMBINING LATIN SMALL LETTER V +036F COMBINING LATIN SMALL LETTER X +0374 GREEK NUMERAL SIGN +0375 GREEK LOWER NUMERAL SIGN +037A GREEK YPOGEGRAMMENI +037E GREEK QUESTION MARK +0384 GREEK TONOS +0385 GREEK DIALYTIKA TONOS +0386 GREEK CAPITAL LETTER ALPHA WITH TONOS +0387 GREEK ANO TELEIA +0388 GREEK CAPITAL LETTER EPSILON WITH TONOS +0389 GREEK CAPITAL LETTER ETA WITH TONOS +038A GREEK CAPITAL LETTER IOTA WITH TONOS +038C GREEK CAPITAL LETTER OMICRON WITH TONOS +038E GREEK CAPITAL LETTER UPSILON WITH TONOS +038F GREEK CAPITAL LETTER OMEGA WITH TONOS +0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0391 GREEK CAPITAL LETTER ALPHA +0392 GREEK CAPITAL LETTER BETA +0393 GREEK CAPITAL LETTER GAMMA +0394 GREEK CAPITAL LETTER DELTA +0395 GREEK CAPITAL LETTER EPSILON +0396 GREEK CAPITAL LETTER ZETA +0397 GREEK CAPITAL LETTER ETA +0398 GREEK CAPITAL LETTER THETA +0399 GREEK CAPITAL LETTER IOTA +039A GREEK CAPITAL LETTER KAPPA +039B GREEK CAPITAL LETTER LAMDA +039C GREEK CAPITAL LETTER MU +039D GREEK CAPITAL LETTER NU +039E GREEK CAPITAL LETTER XI +039F GREEK CAPITAL LETTER OMICRON +03A0 GREEK CAPITAL LETTER PI +03A1 GREEK CAPITAL LETTER RHO +03A3 GREEK CAPITAL LETTER SIGMA +03A4 GREEK CAPITAL LETTER TAU +03A5 GREEK CAPITAL LETTER UPSILON +03A6 GREEK CAPITAL LETTER PHI +03A7 GREEK CAPITAL LETTER CHI +03A8 GREEK CAPITAL LETTER PSI +03A9 GREEK CAPITAL LETTER OMEGA +03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03AC GREEK SMALL LETTER ALPHA WITH TONOS +03AD GREEK SMALL LETTER EPSILON WITH TONOS +03AE GREEK SMALL LETTER ETA WITH TONOS +03AF GREEK SMALL LETTER IOTA WITH TONOS +03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +03B1 GREEK SMALL LETTER ALPHA +03B2 GREEK SMALL LETTER BETA +03B3 GREEK SMALL LETTER GAMMA +03B4 GREEK SMALL LETTER DELTA +03B5 GREEK SMALL LETTER EPSILON +03B6 GREEK SMALL LETTER ZETA +03B7 GREEK SMALL LETTER ETA +03B8 GREEK SMALL LETTER THETA +03B9 GREEK SMALL LETTER IOTA +03BA GREEK SMALL LETTER KAPPA +03BB GREEK SMALL LETTER LAMDA +03BC GREEK SMALL LETTER MU +03BD GREEK SMALL LETTER NU +03BE GREEK SMALL LETTER XI +03BF GREEK SMALL LETTER OMICRON +03C0 GREEK SMALL LETTER PI +03C1 GREEK SMALL LETTER RHO +03C2 GREEK SMALL LETTER FINAL SIGMA +03C3 GREEK SMALL LETTER SIGMA +03C4 GREEK SMALL LETTER TAU +03C5 GREEK SMALL LETTER UPSILON +03C6 GREEK SMALL LETTER PHI +03C7 GREEK SMALL LETTER CHI +03C8 GREEK SMALL LETTER PSI +03C9 GREEK SMALL LETTER OMEGA +03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA +03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA +03CC GREEK SMALL LETTER OMICRON WITH TONOS +03CD GREEK SMALL LETTER UPSILON WITH TONOS +03CE GREEK SMALL LETTER OMEGA WITH TONOS +03D0 GREEK BETA SYMBOL +03D1 GREEK THETA SYMBOL +03D2 GREEK UPSILON WITH HOOK SYMBOL +03D3 GREEK UPSILON WITH ACUTE AND HOOK SYMBOL +03D4 GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL +03D5 GREEK PHI SYMBOL +03D6 GREEK PI SYMBOL +03D7 GREEK KAI SYMBOL +03D8 GREEK LETTER ARCHAIC KOPPA +03D9 GREEK SMALL LETTER ARCHAIC KOPPA +03DA GREEK LETTER STIGMA +03DB GREEK SMALL LETTER STIGMA +03DC GREEK LETTER DIGAMMA +03DD GREEK SMALL LETTER DIGAMMA +03DE GREEK LETTER KOPPA +03DF GREEK SMALL LETTER KOPPA +03E0 GREEK LETTER SAMPI +03E1 GREEK SMALL LETTER SAMPI +03E2 COPTIC CAPITAL LETTER SHEI +03E3 COPTIC SMALL LETTER SHEI +03E4 COPTIC CAPITAL LETTER FEI +03E5 COPTIC SMALL LETTER FEI +03E6 COPTIC CAPITAL LETTER KHEI +03E7 COPTIC SMALL LETTER KHEI +03E8 COPTIC CAPITAL LETTER HORI +03E9 COPTIC SMALL LETTER HORI +03EA COPTIC CAPITAL LETTER GANGIA +03EB COPTIC SMALL LETTER GANGIA +03EC COPTIC CAPITAL LETTER SHIMA +03ED COPTIC SMALL LETTER SHIMA +03EE COPTIC CAPITAL LETTER DEI +03EF COPTIC SMALL LETTER DEI +03F0 GREEK KAPPA SYMBOL +03F1 GREEK RHO SYMBOL +03F2 GREEK LUNATE SIGMA SYMBOL +03F3 GREEK LETTER YOT +03F4 GREEK CAPITAL THETA SYMBOL +03F5 GREEK LUNATE EPSILON SYMBOL +03F6 GREEK REVERSED LUNATE EPSILON SYMBOL +03F7 GREEK CAPITAL LETTER SHO +03F8 GREEK SMALL LETTER SHO +03F9 GREEK CAPITAL LUNATE SIGMA SYMBOL +03FA GREEK CAPITAL LETTER SAN +03FB GREEK SMALL LETTER SAN +03FC GREEK RHO WITH STROKE SYMBOL +03FD GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL +03FE GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL +03FF GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +0400 CYRILLIC CAPITAL LETTER IE WITH GRAVE +0401 CYRILLIC CAPITAL LETTER IO +0402 CYRILLIC CAPITAL LETTER DJE +0403 CYRILLIC CAPITAL LETTER GJE +0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE +0405 CYRILLIC CAPITAL LETTER DZE +0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0407 CYRILLIC CAPITAL LETTER YI +0408 CYRILLIC CAPITAL LETTER JE +0409 CYRILLIC CAPITAL LETTER LJE +040A CYRILLIC CAPITAL LETTER NJE +040B CYRILLIC CAPITAL LETTER TSHE +040C CYRILLIC CAPITAL LETTER KJE +040D CYRILLIC CAPITAL LETTER I WITH GRAVE +040E CYRILLIC CAPITAL LETTER SHORT U +040F CYRILLIC CAPITAL LETTER DZHE +0410 CYRILLIC CAPITAL LETTER A +0411 CYRILLIC CAPITAL LETTER BE +0412 CYRILLIC CAPITAL LETTER VE +0413 CYRILLIC CAPITAL LETTER GHE +0414 CYRILLIC CAPITAL LETTER DE +0415 CYRILLIC CAPITAL LETTER IE +0416 CYRILLIC CAPITAL LETTER ZHE +0417 CYRILLIC CAPITAL LETTER ZE +0418 CYRILLIC CAPITAL LETTER I +0419 CYRILLIC CAPITAL LETTER SHORT I +041A CYRILLIC CAPITAL LETTER KA +041B CYRILLIC CAPITAL LETTER EL +041C CYRILLIC CAPITAL LETTER EM +041D CYRILLIC CAPITAL LETTER EN +041E CYRILLIC CAPITAL LETTER O +041F CYRILLIC CAPITAL LETTER PE +0420 CYRILLIC CAPITAL LETTER ER +0421 CYRILLIC CAPITAL LETTER ES +0422 CYRILLIC CAPITAL LETTER TE +0423 CYRILLIC CAPITAL LETTER U +0424 CYRILLIC CAPITAL LETTER EF +0425 CYRILLIC CAPITAL LETTER HA +0426 CYRILLIC CAPITAL LETTER TSE +0427 CYRILLIC CAPITAL LETTER CHE +0428 CYRILLIC CAPITAL LETTER SHA +0429 CYRILLIC CAPITAL LETTER SHCHA +042A CYRILLIC CAPITAL LETTER HARD SIGN +042B CYRILLIC CAPITAL LETTER YERU +042C CYRILLIC CAPITAL LETTER SOFT SIGN +042D CYRILLIC CAPITAL LETTER E +042E CYRILLIC CAPITAL LETTER YU +042F CYRILLIC CAPITAL LETTER YA +0430 CYRILLIC SMALL LETTER A +0431 CYRILLIC SMALL LETTER BE +0432 CYRILLIC SMALL LETTER VE +0433 CYRILLIC SMALL LETTER GHE +0434 CYRILLIC SMALL LETTER DE +0435 CYRILLIC SMALL LETTER IE +0436 CYRILLIC SMALL LETTER ZHE +0437 CYRILLIC SMALL LETTER ZE +0438 CYRILLIC SMALL LETTER I +0439 CYRILLIC SMALL LETTER SHORT I +043A CYRILLIC SMALL LETTER KA +043B CYRILLIC SMALL LETTER EL +043C CYRILLIC SMALL LETTER EM +043D CYRILLIC SMALL LETTER EN +043E CYRILLIC SMALL LETTER O +043F CYRILLIC SMALL LETTER PE +0440 CYRILLIC SMALL LETTER ER +0441 CYRILLIC SMALL LETTER ES +0442 CYRILLIC SMALL LETTER TE +0443 CYRILLIC SMALL LETTER U +0444 CYRILLIC SMALL LETTER EF +0445 CYRILLIC SMALL LETTER HA +0446 CYRILLIC SMALL LETTER TSE +0447 CYRILLIC SMALL LETTER CHE +0448 CYRILLIC SMALL LETTER SHA +0449 CYRILLIC SMALL LETTER SHCHA +044A CYRILLIC SMALL LETTER HARD SIGN +044B CYRILLIC SMALL LETTER YERU +044C CYRILLIC SMALL LETTER SOFT SIGN +044D CYRILLIC SMALL LETTER E +044E CYRILLIC SMALL LETTER YU +044F CYRILLIC SMALL LETTER YA +0450 CYRILLIC SMALL LETTER IE WITH GRAVE +0451 CYRILLIC SMALL LETTER IO +0452 CYRILLIC SMALL LETTER DJE +0453 CYRILLIC SMALL LETTER GJE +0454 CYRILLIC SMALL LETTER UKRAINIAN IE +0455 CYRILLIC SMALL LETTER DZE +0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0457 CYRILLIC SMALL LETTER YI +0458 CYRILLIC SMALL LETTER JE +0459 CYRILLIC SMALL LETTER LJE +045A CYRILLIC SMALL LETTER NJE +045B CYRILLIC SMALL LETTER TSHE +045C CYRILLIC SMALL LETTER KJE +045D CYRILLIC SMALL LETTER I WITH GRAVE +045E CYRILLIC SMALL LETTER SHORT U +045F CYRILLIC SMALL LETTER DZHE +0460 CYRILLIC CAPITAL LETTER OMEGA +0461 CYRILLIC SMALL LETTER OMEGA +0462 CYRILLIC CAPITAL LETTER YAT +0463 CYRILLIC SMALL LETTER YAT +0464 CYRILLIC CAPITAL LETTER IOTIFIED E +0465 CYRILLIC SMALL LETTER IOTIFIED E +0466 CYRILLIC CAPITAL LETTER LITTLE YUS +0467 CYRILLIC SMALL LETTER LITTLE YUS +0468 CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +0469 CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS +046A CYRILLIC CAPITAL LETTER BIG YUS +046B CYRILLIC SMALL LETTER BIG YUS +046C CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +046D CYRILLIC SMALL LETTER IOTIFIED BIG YUS +046E CYRILLIC CAPITAL LETTER KSI +046F CYRILLIC SMALL LETTER KSI +0470 CYRILLIC CAPITAL LETTER PSI +0471 CYRILLIC SMALL LETTER PSI +0472 CYRILLIC CAPITAL LETTER FITA +0473 CYRILLIC SMALL LETTER FITA +0474 CYRILLIC CAPITAL LETTER IZHITSA +0475 CYRILLIC SMALL LETTER IZHITSA +0476 CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0477 CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0478 CYRILLIC CAPITAL LETTER UK +0479 CYRILLIC SMALL LETTER UK +047A CYRILLIC CAPITAL LETTER ROUND OMEGA +047B CYRILLIC SMALL LETTER ROUND OMEGA +047C CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +047D CYRILLIC SMALL LETTER OMEGA WITH TITLO +047E CYRILLIC CAPITAL LETTER OT +047F CYRILLIC SMALL LETTER OT +0480 CYRILLIC CAPITAL LETTER KOPPA +0481 CYRILLIC SMALL LETTER KOPPA +0482 CYRILLIC THOUSANDS SIGN +0483 COMBINING CYRILLIC TITLO +0484 COMBINING CYRILLIC PALATALIZATION +0485 COMBINING CYRILLIC DASIA PNEUMATA +0486 COMBINING CYRILLIC PSILI PNEUMATA +0488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN +0489 COMBINING CYRILLIC MILLIONS SIGN +048A CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +048B CYRILLIC SMALL LETTER SHORT I WITH TAIL +048C CYRILLIC CAPITAL LETTER SEMISOFT SIGN +048D CYRILLIC SMALL LETTER SEMISOFT SIGN +048E CYRILLIC CAPITAL LETTER ER WITH TICK +048F CYRILLIC SMALL LETTER ER WITH TICK +0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0491 CYRILLIC SMALL LETTER GHE WITH UPTURN +0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE +0493 CYRILLIC SMALL LETTER GHE WITH STROKE +0494 CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +0495 CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK +0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER +0498 CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +0499 CYRILLIC SMALL LETTER ZE WITH DESCENDER +049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER +049B CYRILLIC SMALL LETTER KA WITH DESCENDER +049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE +049E CYRILLIC CAPITAL LETTER KA WITH STROKE +049F CYRILLIC SMALL LETTER KA WITH STROKE +04A0 CYRILLIC CAPITAL LETTER BASHKIR KA +04A1 CYRILLIC SMALL LETTER BASHKIR KA +04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER +04A4 CYRILLIC CAPITAL LIGATURE EN GHE +04A5 CYRILLIC SMALL LIGATURE EN GHE +04A6 CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +04A7 CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK +04A8 CYRILLIC CAPITAL LETTER ABKHASIAN HA +04A9 CYRILLIC SMALL LETTER ABKHASIAN HA +04AA CYRILLIC CAPITAL LETTER ES WITH DESCENDER +04AB CYRILLIC SMALL LETTER ES WITH DESCENDER +04AC CYRILLIC CAPITAL LETTER TE WITH DESCENDER +04AD CYRILLIC SMALL LETTER TE WITH DESCENDER +04AE CYRILLIC CAPITAL LETTER STRAIGHT U +04AF CYRILLIC SMALL LETTER STRAIGHT U +04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE +04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER +04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER +04B4 CYRILLIC CAPITAL LIGATURE TE TSE +04B5 CYRILLIC SMALL LIGATURE TE TSE +04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER +04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE +04BA CYRILLIC CAPITAL LETTER SHHA +04BB CYRILLIC SMALL LETTER SHHA +04BC CYRILLIC CAPITAL LETTER ABKHASIAN CHE +04BD CYRILLIC SMALL LETTER ABKHASIAN CHE +04BE CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +04BF CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER +04C0 CYRILLIC LETTER PALOCHKA +04C1 CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04C2 CYRILLIC SMALL LETTER ZHE WITH BREVE +04C3 CYRILLIC CAPITAL LETTER KA WITH HOOK +04C4 CYRILLIC SMALL LETTER KA WITH HOOK +04C5 CYRILLIC CAPITAL LETTER EL WITH TAIL +04C6 CYRILLIC SMALL LETTER EL WITH TAIL +04C7 CYRILLIC CAPITAL LETTER EN WITH HOOK +04C8 CYRILLIC SMALL LETTER EN WITH HOOK +04C9 CYRILLIC CAPITAL LETTER EN WITH TAIL +04CA CYRILLIC SMALL LETTER EN WITH TAIL +04CB CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +04CC CYRILLIC SMALL LETTER KHAKASSIAN CHE +04CD CYRILLIC CAPITAL LETTER EM WITH TAIL +04CE CYRILLIC SMALL LETTER EM WITH TAIL +04D0 CYRILLIC CAPITAL LETTER A WITH BREVE +04D1 CYRILLIC SMALL LETTER A WITH BREVE +04D2 CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D3 CYRILLIC SMALL LETTER A WITH DIAERESIS +04D4 CYRILLIC CAPITAL LIGATURE A IE +04D5 CYRILLIC SMALL LIGATURE A IE +04D6 CYRILLIC CAPITAL LETTER IE WITH BREVE +04D7 CYRILLIC SMALL LETTER IE WITH BREVE +04D8 CYRILLIC CAPITAL LETTER SCHWA +04D9 CYRILLIC SMALL LETTER SCHWA +04DA CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04DB CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS +04DC CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +04DD CYRILLIC SMALL LETTER ZHE WITH DIAERESIS +04DE CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +04DF CYRILLIC SMALL LETTER ZE WITH DIAERESIS +04E0 CYRILLIC CAPITAL LETTER ABKHASIAN DZE +04E1 CYRILLIC SMALL LETTER ABKHASIAN DZE +04E2 CYRILLIC CAPITAL LETTER I WITH MACRON +04E3 CYRILLIC SMALL LETTER I WITH MACRON +04E4 CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E5 CYRILLIC SMALL LETTER I WITH DIAERESIS +04E6 CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E7 CYRILLIC SMALL LETTER O WITH DIAERESIS +04E8 CYRILLIC CAPITAL LETTER BARRED O +04E9 CYRILLIC SMALL LETTER BARRED O +04EA CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +04EB CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS +04EC CYRILLIC CAPITAL LETTER E WITH DIAERESIS +04ED CYRILLIC SMALL LETTER E WITH DIAERESIS +04EE CYRILLIC CAPITAL LETTER U WITH MACRON +04EF CYRILLIC SMALL LETTER U WITH MACRON +04F0 CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F1 CYRILLIC SMALL LETTER U WITH DIAERESIS +04F2 CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04F3 CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE +04F4 CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +04F5 CYRILLIC SMALL LETTER CHE WITH DIAERESIS +04F6 CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +04F7 CYRILLIC SMALL LETTER GHE WITH DESCENDER +04F8 CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +04F9 CYRILLIC SMALL LETTER YERU WITH DIAERESIS +0500 CYRILLIC CAPITAL LETTER KOMI DE +0501 CYRILLIC SMALL LETTER KOMI DE +0502 CYRILLIC CAPITAL LETTER KOMI DJE +0503 CYRILLIC SMALL LETTER KOMI DJE +0504 CYRILLIC CAPITAL LETTER KOMI ZJE +0505 CYRILLIC SMALL LETTER KOMI ZJE +0506 CYRILLIC CAPITAL LETTER KOMI DZJE +0507 CYRILLIC SMALL LETTER KOMI DZJE +0508 CYRILLIC CAPITAL LETTER KOMI LJE +0509 CYRILLIC SMALL LETTER KOMI LJE +050A CYRILLIC CAPITAL LETTER KOMI NJE +050B CYRILLIC SMALL LETTER KOMI NJE +050C CYRILLIC CAPITAL LETTER KOMI SJE +050D CYRILLIC SMALL LETTER KOMI SJE +050E CYRILLIC CAPITAL LETTER KOMI TJE +050F CYRILLIC SMALL LETTER KOMI TJE +0531 ARMENIAN CAPITAL LETTER AYB +0532 ARMENIAN CAPITAL LETTER BEN +0533 ARMENIAN CAPITAL LETTER GIM +0534 ARMENIAN CAPITAL LETTER DA +0535 ARMENIAN CAPITAL LETTER ECH +0536 ARMENIAN CAPITAL LETTER ZA +0537 ARMENIAN CAPITAL LETTER EH +0538 ARMENIAN CAPITAL LETTER ET +0539 ARMENIAN CAPITAL LETTER TO +053A ARMENIAN CAPITAL LETTER ZHE +053B ARMENIAN CAPITAL LETTER INI +053C ARMENIAN CAPITAL LETTER LIWN +053D ARMENIAN CAPITAL LETTER XEH +053E ARMENIAN CAPITAL LETTER CA +053F ARMENIAN CAPITAL LETTER KEN +0540 ARMENIAN CAPITAL LETTER HO +0541 ARMENIAN CAPITAL LETTER JA +0542 ARMENIAN CAPITAL LETTER GHAD +0543 ARMENIAN CAPITAL LETTER CHEH +0544 ARMENIAN CAPITAL LETTER MEN +0545 ARMENIAN CAPITAL LETTER YI +0546 ARMENIAN CAPITAL LETTER NOW +0547 ARMENIAN CAPITAL LETTER SHA +0548 ARMENIAN CAPITAL LETTER VO +0549 ARMENIAN CAPITAL LETTER CHA +054A ARMENIAN CAPITAL LETTER PEH +054B ARMENIAN CAPITAL LETTER JHEH +054C ARMENIAN CAPITAL LETTER RA +054D ARMENIAN CAPITAL LETTER SEH +054E ARMENIAN CAPITAL LETTER VEW +054F ARMENIAN CAPITAL LETTER TIWN +0550 ARMENIAN CAPITAL LETTER REH +0551 ARMENIAN CAPITAL LETTER CO +0552 ARMENIAN CAPITAL LETTER YIWN +0553 ARMENIAN CAPITAL LETTER PIWR +0554 ARMENIAN CAPITAL LETTER KEH +0555 ARMENIAN CAPITAL LETTER OH +0556 ARMENIAN CAPITAL LETTER FEH +0559 ARMENIAN MODIFIER LETTER LEFT HALF RING +055A ARMENIAN APOSTROPHE +055B ARMENIAN EMPHASIS MARK +055C ARMENIAN EXCLAMATION MARK +055D ARMENIAN COMMA +055E ARMENIAN QUESTION MARK +055F ARMENIAN ABBREVIATION MARK +0561 ARMENIAN SMALL LETTER AYB +0562 ARMENIAN SMALL LETTER BEN +0563 ARMENIAN SMALL LETTER GIM +0564 ARMENIAN SMALL LETTER DA +0565 ARMENIAN SMALL LETTER ECH +0566 ARMENIAN SMALL LETTER ZA +0567 ARMENIAN SMALL LETTER EH +0568 ARMENIAN SMALL LETTER ET +0569 ARMENIAN SMALL LETTER TO +056A ARMENIAN SMALL LETTER ZHE +056B ARMENIAN SMALL LETTER INI +056C ARMENIAN SMALL LETTER LIWN +056D ARMENIAN SMALL LETTER XEH +056E ARMENIAN SMALL LETTER CA +056F ARMENIAN SMALL LETTER KEN +0570 ARMENIAN SMALL LETTER HO +0571 ARMENIAN SMALL LETTER JA +0572 ARMENIAN SMALL LETTER GHAD +0573 ARMENIAN SMALL LETTER CHEH +0574 ARMENIAN SMALL LETTER MEN +0575 ARMENIAN SMALL LETTER YI +0576 ARMENIAN SMALL LETTER NOW +0577 ARMENIAN SMALL LETTER SHA +0578 ARMENIAN SMALL LETTER VO +0579 ARMENIAN SMALL LETTER CHA +057A ARMENIAN SMALL LETTER PEH +057B ARMENIAN SMALL LETTER JHEH +057C ARMENIAN SMALL LETTER RA +057D ARMENIAN SMALL LETTER SEH +057E ARMENIAN SMALL LETTER VEW +057F ARMENIAN SMALL LETTER TIWN +0580 ARMENIAN SMALL LETTER REH +0581 ARMENIAN SMALL LETTER CO +0582 ARMENIAN SMALL LETTER YIWN +0583 ARMENIAN SMALL LETTER PIWR +0584 ARMENIAN SMALL LETTER KEH +0585 ARMENIAN SMALL LETTER OH +0586 ARMENIAN SMALL LETTER FEH +0587 ARMENIAN SMALL LIGATURE ECH YIWN +0589 ARMENIAN FULL STOP +058A ARMENIAN HYPHEN +0591 HEBREW ACCENT ETNAHTA +0592 HEBREW ACCENT SEGOL +0593 HEBREW ACCENT SHALSHELET +0594 HEBREW ACCENT ZAQEF QATAN +0595 HEBREW ACCENT ZAQEF GADOL +0596 HEBREW ACCENT TIPEHA +0597 HEBREW ACCENT REVIA +0598 HEBREW ACCENT ZARQA +0599 HEBREW ACCENT PASHTA +059A HEBREW ACCENT YETIV +059B HEBREW ACCENT TEVIR +059C HEBREW ACCENT GERESH +059D HEBREW ACCENT GERESH MUQDAM +059E HEBREW ACCENT GERSHAYIM +059F HEBREW ACCENT QARNEY PARA +05A0 HEBREW ACCENT TELISHA GEDOLA +05A1 HEBREW ACCENT PAZER +05A2 HEBREW ACCENT ATNAH HAFUKH +05A3 HEBREW ACCENT MUNAH +05A4 HEBREW ACCENT MAHAPAKH +05A5 HEBREW ACCENT MERKHA +05A6 HEBREW ACCENT MERKHA KEFULA +05A7 HEBREW ACCENT DARGA +05A8 HEBREW ACCENT QADMA +05A9 HEBREW ACCENT TELISHA QETANA +05AA HEBREW ACCENT YERAH BEN YOMO +05AB HEBREW ACCENT OLE +05AC HEBREW ACCENT ILUY +05AD HEBREW ACCENT DEHI +05AE HEBREW ACCENT ZINOR +05AF HEBREW MARK MASORA CIRCLE +05B0 HEBREW POINT SHEVA +05B1 HEBREW POINT HATAF SEGOL +05B2 HEBREW POINT HATAF PATAH +05B3 HEBREW POINT HATAF QAMATS +05B4 HEBREW POINT HIRIQ +05B5 HEBREW POINT TSERE +05B6 HEBREW POINT SEGOL +05B7 HEBREW POINT PATAH +05B8 HEBREW POINT QAMATS +05B9 HEBREW POINT HOLAM +05BB HEBREW POINT QUBUTS +05BC HEBREW POINT DAGESH OR MAPIQ +05BD HEBREW POINT METEG +05BE HEBREW PUNCTUATION MAQAF +05BF HEBREW POINT RAFE +05C0 HEBREW PUNCTUATION PASEQ +05C1 HEBREW POINT SHIN DOT +05C2 HEBREW POINT SIN DOT +05C3 HEBREW PUNCTUATION SOF PASUQ +05C4 HEBREW MARK UPPER DOT +05C5 HEBREW MARK LOWER DOT +05C6 HEBREW PUNCTUATION NUN HAFUKHA +05C7 HEBREW POINT QAMATS QATAN +05D0 HEBREW LETTER ALEF +05D1 HEBREW LETTER BET +05D2 HEBREW LETTER GIMEL +05D3 HEBREW LETTER DALET +05D4 HEBREW LETTER HE +05D5 HEBREW LETTER VAV +05D6 HEBREW LETTER ZAYIN +05D7 HEBREW LETTER HET +05D8 HEBREW LETTER TET +05D9 HEBREW LETTER YOD +05DA HEBREW LETTER FINAL KAF +05DB HEBREW LETTER KAF +05DC HEBREW LETTER LAMED +05DD HEBREW LETTER FINAL MEM +05DE HEBREW LETTER MEM +05DF HEBREW LETTER FINAL NUN +05E0 HEBREW LETTER NUN +05E1 HEBREW LETTER SAMEKH +05E2 HEBREW LETTER AYIN +05E3 HEBREW LETTER FINAL PE +05E4 HEBREW LETTER PE +05E5 HEBREW LETTER FINAL TSADI +05E6 HEBREW LETTER TSADI +05E7 HEBREW LETTER QOF +05E8 HEBREW LETTER RESH +05E9 HEBREW LETTER SHIN +05EA HEBREW LETTER TAV +05F0 HEBREW LIGATURE YIDDISH DOUBLE VAV +05F1 HEBREW LIGATURE YIDDISH VAV YOD +05F2 HEBREW LIGATURE YIDDISH DOUBLE YOD +05F3 HEBREW PUNCTUATION GERESH +05F4 HEBREW PUNCTUATION GERSHAYIM +0600 ARABIC NUMBER SIGN +0601 ARABIC SIGN SANAH +0602 ARABIC FOOTNOTE MARKER +0603 ARABIC SIGN SAFHA +060B AFGHANI SIGN +060C ARABIC COMMA +060D ARABIC DATE SEPARATOR +060E ARABIC POETIC VERSE SIGN +060F ARABIC SIGN MISRA +0610 ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM +0611 ARABIC SIGN ALAYHE ASSALLAM +0612 ARABIC SIGN RAHMATULLAH ALAYHE +0613 ARABIC SIGN RADI ALLAHOU ANHU +0614 ARABIC SIGN TAKHALLUS +0615 ARABIC SMALL HIGH TAH +061B ARABIC SEMICOLON +061E ARABIC TRIPLE DOT PUNCTUATION MARK +061F ARABIC QUESTION MARK +0621 ARABIC LETTER HAMZA +0622 ARABIC LETTER ALEF WITH MADDA ABOVE +0623 ARABIC LETTER ALEF WITH HAMZA ABOVE +0624 ARABIC LETTER WAW WITH HAMZA ABOVE +0625 ARABIC LETTER ALEF WITH HAMZA BELOW +0626 ARABIC LETTER YEH WITH HAMZA ABOVE +0627 ARABIC LETTER ALEF +0628 ARABIC LETTER BEH +0629 ARABIC LETTER TEH MARBUTA +062A ARABIC LETTER TEH +062B ARABIC LETTER THEH +062C ARABIC LETTER JEEM +062D ARABIC LETTER HAH +062E ARABIC LETTER KHAH +062F ARABIC LETTER DAL +0630 ARABIC LETTER THAL +0631 ARABIC LETTER REH +0632 ARABIC LETTER ZAIN +0633 ARABIC LETTER SEEN +0634 ARABIC LETTER SHEEN +0635 ARABIC LETTER SAD +0636 ARABIC LETTER DAD +0637 ARABIC LETTER TAH +0638 ARABIC LETTER ZAH +0639 ARABIC LETTER AIN +063A ARABIC LETTER GHAIN +0640 ARABIC TATWEEL +0641 ARABIC LETTER FEH +0642 ARABIC LETTER QAF +0643 ARABIC LETTER KAF +0644 ARABIC LETTER LAM +0645 ARABIC LETTER MEEM +0646 ARABIC LETTER NOON +0647 ARABIC LETTER HEH +0648 ARABIC LETTER WAW +0649 ARABIC LETTER ALEF MAKSURA +064A ARABIC LETTER YEH +064B ARABIC FATHATAN +064C ARABIC DAMMATAN +064D ARABIC KASRATAN +064E ARABIC FATHA +064F ARABIC DAMMA +0650 ARABIC KASRA +0651 ARABIC SHADDA +0652 ARABIC SUKUN +0653 ARABIC MADDAH ABOVE +0654 ARABIC HAMZA ABOVE +0655 ARABIC HAMZA BELOW +0656 ARABIC SUBSCRIPT ALEF +0657 ARABIC INVERTED DAMMA +0658 ARABIC MARK NOON GHUNNA +0659 ARABIC ZWARAKAY +065A ARABIC VOWEL SIGN SMALL V ABOVE +065B ARABIC VOWEL SIGN INVERTED SMALL V ABOVE +065C ARABIC VOWEL SIGN DOT BELOW +065D ARABIC REVERSED DAMMA +065E ARABIC FATHA WITH TWO DOTS +0660 ARABIC-INDIC DIGIT ZERO +0661 ARABIC-INDIC DIGIT ONE +0662 ARABIC-INDIC DIGIT TWO +0663 ARABIC-INDIC DIGIT THREE +0664 ARABIC-INDIC DIGIT FOUR +0665 ARABIC-INDIC DIGIT FIVE +0666 ARABIC-INDIC DIGIT SIX +0667 ARABIC-INDIC DIGIT SEVEN +0668 ARABIC-INDIC DIGIT EIGHT +0669 ARABIC-INDIC DIGIT NINE +066A ARABIC PERCENT SIGN +066B ARABIC DECIMAL SEPARATOR +066C ARABIC THOUSANDS SEPARATOR +066D ARABIC FIVE POINTED STAR +066E ARABIC LETTER DOTLESS BEH +066F ARABIC LETTER DOTLESS QAF +0670 ARABIC LETTER SUPERSCRIPT ALEF +0671 ARABIC LETTER ALEF WASLA +0672 ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE +0673 ARABIC LETTER ALEF WITH WAVY HAMZA BELOW +0674 ARABIC LETTER HIGH HAMZA +0675 ARABIC LETTER HIGH HAMZA ALEF +0676 ARABIC LETTER HIGH HAMZA WAW +0677 ARABIC LETTER U WITH HAMZA ABOVE +0678 ARABIC LETTER HIGH HAMZA YEH +0679 ARABIC LETTER TTEH +067A ARABIC LETTER TTEHEH +067B ARABIC LETTER BEEH +067C ARABIC LETTER TEH WITH RING +067D ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS +067E ARABIC LETTER PEH +067F ARABIC LETTER TEHEH +0680 ARABIC LETTER BEHEH +0681 ARABIC LETTER HAH WITH HAMZA ABOVE +0682 ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE +0683 ARABIC LETTER NYEH +0684 ARABIC LETTER DYEH +0685 ARABIC LETTER HAH WITH THREE DOTS ABOVE +0686 ARABIC LETTER TCHEH +0687 ARABIC LETTER TCHEHEH +0688 ARABIC LETTER DDAL +0689 ARABIC LETTER DAL WITH RING +068A ARABIC LETTER DAL WITH DOT BELOW +068B ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH +068C ARABIC LETTER DAHAL +068D ARABIC LETTER DDAHAL +068E ARABIC LETTER DUL +068F ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS +0690 ARABIC LETTER DAL WITH FOUR DOTS ABOVE +0691 ARABIC LETTER RREH +0692 ARABIC LETTER REH WITH SMALL V +0693 ARABIC LETTER REH WITH RING +0694 ARABIC LETTER REH WITH DOT BELOW +0695 ARABIC LETTER REH WITH SMALL V BELOW +0696 ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE +0697 ARABIC LETTER REH WITH TWO DOTS ABOVE +0698 ARABIC LETTER JEH +0699 ARABIC LETTER REH WITH FOUR DOTS ABOVE +069A ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE +069B ARABIC LETTER SEEN WITH THREE DOTS BELOW +069C ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE +069D ARABIC LETTER SAD WITH TWO DOTS BELOW +069E ARABIC LETTER SAD WITH THREE DOTS ABOVE +069F ARABIC LETTER TAH WITH THREE DOTS ABOVE +06A0 ARABIC LETTER AIN WITH THREE DOTS ABOVE +06A1 ARABIC LETTER DOTLESS FEH +06A2 ARABIC LETTER FEH WITH DOT MOVED BELOW +06A3 ARABIC LETTER FEH WITH DOT BELOW +06A4 ARABIC LETTER VEH +06A5 ARABIC LETTER FEH WITH THREE DOTS BELOW +06A6 ARABIC LETTER PEHEH +06A7 ARABIC LETTER QAF WITH DOT ABOVE +06A8 ARABIC LETTER QAF WITH THREE DOTS ABOVE +06A9 ARABIC LETTER KEHEH +06AA ARABIC LETTER SWASH KAF +06AB ARABIC LETTER KAF WITH RING +06AC ARABIC LETTER KAF WITH DOT ABOVE +06AD ARABIC LETTER NG +06AE ARABIC LETTER KAF WITH THREE DOTS BELOW +06AF ARABIC LETTER GAF +06B0 ARABIC LETTER GAF WITH RING +06B1 ARABIC LETTER NGOEH +06B2 ARABIC LETTER GAF WITH TWO DOTS BELOW +06B3 ARABIC LETTER GUEH +06B4 ARABIC LETTER GAF WITH THREE DOTS ABOVE +06B5 ARABIC LETTER LAM WITH SMALL V +06B6 ARABIC LETTER LAM WITH DOT ABOVE +06B7 ARABIC LETTER LAM WITH THREE DOTS ABOVE +06B8 ARABIC LETTER LAM WITH THREE DOTS BELOW +06B9 ARABIC LETTER NOON WITH DOT BELOW +06BA ARABIC LETTER NOON GHUNNA +06BB ARABIC LETTER RNOON +06BC ARABIC LETTER NOON WITH RING +06BD ARABIC LETTER NOON WITH THREE DOTS ABOVE +06BE ARABIC LETTER HEH DOACHASHMEE +06BF ARABIC LETTER TCHEH WITH DOT ABOVE +06C0 ARABIC LETTER HEH WITH YEH ABOVE +06C1 ARABIC LETTER HEH GOAL +06C2 ARABIC LETTER HEH GOAL WITH HAMZA ABOVE +06C3 ARABIC LETTER TEH MARBUTA GOAL +06C4 ARABIC LETTER WAW WITH RING +06C5 ARABIC LETTER KIRGHIZ OE +06C6 ARABIC LETTER OE +06C7 ARABIC LETTER U +06C8 ARABIC LETTER YU +06C9 ARABIC LETTER KIRGHIZ YU +06CA ARABIC LETTER WAW WITH TWO DOTS ABOVE +06CB ARABIC LETTER VE +06CC ARABIC LETTER FARSI YEH +06CD ARABIC LETTER YEH WITH TAIL +06CE ARABIC LETTER YEH WITH SMALL V +06CF ARABIC LETTER WAW WITH DOT ABOVE +06D0 ARABIC LETTER E +06D1 ARABIC LETTER YEH WITH THREE DOTS BELOW +06D2 ARABIC LETTER YEH BARREE +06D3 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D4 ARABIC FULL STOP +06D5 ARABIC LETTER AE +06D6 ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA +06D7 ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA +06D8 ARABIC SMALL HIGH MEEM INITIAL FORM +06D9 ARABIC SMALL HIGH LAM ALEF +06DA ARABIC SMALL HIGH JEEM +06DB ARABIC SMALL HIGH THREE DOTS +06DC ARABIC SMALL HIGH SEEN +06DD ARABIC END OF AYAH +06DE ARABIC START OF RUB EL HIZB +06DF ARABIC SMALL HIGH ROUNDED ZERO +06E0 ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO +06E1 ARABIC SMALL HIGH DOTLESS HEAD OF KHAH +06E2 ARABIC SMALL HIGH MEEM ISOLATED FORM +06E3 ARABIC SMALL LOW SEEN +06E4 ARABIC SMALL HIGH MADDA +06E5 ARABIC SMALL WAW +06E6 ARABIC SMALL YEH +06E7 ARABIC SMALL HIGH YEH +06E8 ARABIC SMALL HIGH NOON +06E9 ARABIC PLACE OF SAJDAH +06EA ARABIC EMPTY CENTRE LOW STOP +06EB ARABIC EMPTY CENTRE HIGH STOP +06EC ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE +06ED ARABIC SMALL LOW MEEM +06EE ARABIC LETTER DAL WITH INVERTED V +06EF ARABIC LETTER REH WITH INVERTED V +06F0 EXTENDED ARABIC-INDIC DIGIT ZERO +06F1 EXTENDED ARABIC-INDIC DIGIT ONE +06F2 EXTENDED ARABIC-INDIC DIGIT TWO +06F3 EXTENDED ARABIC-INDIC DIGIT THREE +06F4 EXTENDED ARABIC-INDIC DIGIT FOUR +06F5 EXTENDED ARABIC-INDIC DIGIT FIVE +06F6 EXTENDED ARABIC-INDIC DIGIT SIX +06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN +06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT +06F9 EXTENDED ARABIC-INDIC DIGIT NINE +06FA ARABIC LETTER SHEEN WITH DOT BELOW +06FB ARABIC LETTER DAD WITH DOT BELOW +06FC ARABIC LETTER GHAIN WITH DOT BELOW +06FD ARABIC SIGN SINDHI AMPERSAND +06FE ARABIC SIGN SINDHI POSTPOSITION MEN +06FF ARABIC LETTER HEH WITH INVERTED V +0700 SYRIAC END OF PARAGRAPH +0701 SYRIAC SUPRALINEAR FULL STOP +0702 SYRIAC SUBLINEAR FULL STOP +0703 SYRIAC SUPRALINEAR COLON +0704 SYRIAC SUBLINEAR COLON +0705 SYRIAC HORIZONTAL COLON +0706 SYRIAC COLON SKEWED LEFT +0707 SYRIAC COLON SKEWED RIGHT +0708 SYRIAC SUPRALINEAR COLON SKEWED LEFT +0709 SYRIAC SUBLINEAR COLON SKEWED RIGHT +070A SYRIAC CONTRACTION +070B SYRIAC HARKLEAN OBELUS +070C SYRIAC HARKLEAN METOBELUS +070D SYRIAC HARKLEAN ASTERISCUS +070F SYRIAC ABBREVIATION MARK +0710 SYRIAC LETTER ALAPH +0711 SYRIAC LETTER SUPERSCRIPT ALAPH +0712 SYRIAC LETTER BETH +0713 SYRIAC LETTER GAMAL +0714 SYRIAC LETTER GAMAL GARSHUNI +0715 SYRIAC LETTER DALATH +0716 SYRIAC LETTER DOTLESS DALATH RISH +0717 SYRIAC LETTER HE +0718 SYRIAC LETTER WAW +0719 SYRIAC LETTER ZAIN +071A SYRIAC LETTER HETH +071B SYRIAC LETTER TETH +071C SYRIAC LETTER TETH GARSHUNI +071D SYRIAC LETTER YUDH +071E SYRIAC LETTER YUDH HE +071F SYRIAC LETTER KAPH +0720 SYRIAC LETTER LAMADH +0721 SYRIAC LETTER MIM +0722 SYRIAC LETTER NUN +0723 SYRIAC LETTER SEMKATH +0724 SYRIAC LETTER FINAL SEMKATH +0725 SYRIAC LETTER E +0726 SYRIAC LETTER PE +0727 SYRIAC LETTER REVERSED PE +0728 SYRIAC LETTER SADHE +0729 SYRIAC LETTER QAPH +072A SYRIAC LETTER RISH +072B SYRIAC LETTER SHIN +072C SYRIAC LETTER TAW +072D SYRIAC LETTER PERSIAN BHETH +072E SYRIAC LETTER PERSIAN GHAMAL +072F SYRIAC LETTER PERSIAN DHALATH +0730 SYRIAC PTHAHA ABOVE +0731 SYRIAC PTHAHA BELOW +0732 SYRIAC PTHAHA DOTTED +0733 SYRIAC ZQAPHA ABOVE +0734 SYRIAC ZQAPHA BELOW +0735 SYRIAC ZQAPHA DOTTED +0736 SYRIAC RBASA ABOVE +0737 SYRIAC RBASA BELOW +0738 SYRIAC DOTTED ZLAMA HORIZONTAL +0739 SYRIAC DOTTED ZLAMA ANGULAR +073A SYRIAC HBASA ABOVE +073B SYRIAC HBASA BELOW +073C SYRIAC HBASA-ESASA DOTTED +073D SYRIAC ESASA ABOVE +073E SYRIAC ESASA BELOW +073F SYRIAC RWAHA +0740 SYRIAC FEMININE DOT +0741 SYRIAC QUSHSHAYA +0742 SYRIAC RUKKAKHA +0743 SYRIAC TWO VERTICAL DOTS ABOVE +0744 SYRIAC TWO VERTICAL DOTS BELOW +0745 SYRIAC THREE DOTS ABOVE +0746 SYRIAC THREE DOTS BELOW +0747 SYRIAC OBLIQUE LINE ABOVE +0748 SYRIAC OBLIQUE LINE BELOW +0749 SYRIAC MUSIC +074A SYRIAC BARREKH +074D SYRIAC LETTER SOGDIAN ZHAIN +074E SYRIAC LETTER SOGDIAN KHAPH +074F SYRIAC LETTER SOGDIAN FE +0750 ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW +0751 ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE +0752 ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW +0753 ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE +0754 ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE +0755 ARABIC LETTER BEH WITH INVERTED SMALL V BELOW +0756 ARABIC LETTER BEH WITH SMALL V +0757 ARABIC LETTER HAH WITH TWO DOTS ABOVE +0758 ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW +0759 ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH +075A ARABIC LETTER DAL WITH INVERTED SMALL V BELOW +075B ARABIC LETTER REH WITH STROKE +075C ARABIC LETTER SEEN WITH FOUR DOTS ABOVE +075D ARABIC LETTER AIN WITH TWO DOTS ABOVE +075E ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE +075F ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE +0760 ARABIC LETTER FEH WITH TWO DOTS BELOW +0761 ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW +0762 ARABIC LETTER KEHEH WITH DOT ABOVE +0763 ARABIC LETTER KEHEH WITH THREE DOTS ABOVE +0764 ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW +0765 ARABIC LETTER MEEM WITH DOT ABOVE +0766 ARABIC LETTER MEEM WITH DOT BELOW +0767 ARABIC LETTER NOON WITH TWO DOTS BELOW +0768 ARABIC LETTER NOON WITH SMALL TAH +0769 ARABIC LETTER NOON WITH SMALL V +076A ARABIC LETTER LAM WITH BAR +076B ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE +076C ARABIC LETTER REH WITH HAMZA ABOVE +076D ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE +0780 THAANA LETTER HAA +0781 THAANA LETTER SHAVIYANI +0782 THAANA LETTER NOONU +0783 THAANA LETTER RAA +0784 THAANA LETTER BAA +0785 THAANA LETTER LHAVIYANI +0786 THAANA LETTER KAAFU +0787 THAANA LETTER ALIFU +0788 THAANA LETTER VAAVU +0789 THAANA LETTER MEEMU +078A THAANA LETTER FAAFU +078B THAANA LETTER DHAALU +078C THAANA LETTER THAA +078D THAANA LETTER LAAMU +078E THAANA LETTER GAAFU +078F THAANA LETTER GNAVIYANI +0790 THAANA LETTER SEENU +0791 THAANA LETTER DAVIYANI +0792 THAANA LETTER ZAVIYANI +0793 THAANA LETTER TAVIYANI +0794 THAANA LETTER YAA +0795 THAANA LETTER PAVIYANI +0796 THAANA LETTER JAVIYANI +0797 THAANA LETTER CHAVIYANI +0798 THAANA LETTER TTAA +0799 THAANA LETTER HHAA +079A THAANA LETTER KHAA +079B THAANA LETTER THAALU +079C THAANA LETTER ZAA +079D THAANA LETTER SHEENU +079E THAANA LETTER SAADHU +079F THAANA LETTER DAADHU +07A0 THAANA LETTER TO +07A1 THAANA LETTER ZO +07A2 THAANA LETTER AINU +07A3 THAANA LETTER GHAINU +07A4 THAANA LETTER QAAFU +07A5 THAANA LETTER WAAVU +07A6 THAANA ABAFILI +07A7 THAANA AABAAFILI +07A8 THAANA IBIFILI +07A9 THAANA EEBEEFILI +07AA THAANA UBUFILI +07AB THAANA OOBOOFILI +07AC THAANA EBEFILI +07AD THAANA EYBEYFILI +07AE THAANA OBOFILI +07AF THAANA OABOAFILI +07B0 THAANA SUKUN +07B1 THAANA LETTER NAA +0901 DEVANAGARI SIGN CANDRABINDU +0902 DEVANAGARI SIGN ANUSVARA +0903 DEVANAGARI SIGN VISARGA +0904 DEVANAGARI LETTER SHORT A +0905 DEVANAGARI LETTER A +0906 DEVANAGARI LETTER AA +0907 DEVANAGARI LETTER I +0908 DEVANAGARI LETTER II +0909 DEVANAGARI LETTER U +090A DEVANAGARI LETTER UU +090B DEVANAGARI LETTER VOCALIC R +090C DEVANAGARI LETTER VOCALIC L +090D DEVANAGARI LETTER CANDRA E +090E DEVANAGARI LETTER SHORT E +090F DEVANAGARI LETTER E +0910 DEVANAGARI LETTER AI +0911 DEVANAGARI LETTER CANDRA O +0912 DEVANAGARI LETTER SHORT O +0913 DEVANAGARI LETTER O +0914 DEVANAGARI LETTER AU +0915 DEVANAGARI LETTER KA +0916 DEVANAGARI LETTER KHA +0917 DEVANAGARI LETTER GA +0918 DEVANAGARI LETTER GHA +0919 DEVANAGARI LETTER NGA +091A DEVANAGARI LETTER CA +091B DEVANAGARI LETTER CHA +091C DEVANAGARI LETTER JA +091D DEVANAGARI LETTER JHA +091E DEVANAGARI LETTER NYA +091F DEVANAGARI LETTER TTA +0920 DEVANAGARI LETTER TTHA +0921 DEVANAGARI LETTER DDA +0922 DEVANAGARI LETTER DDHA +0923 DEVANAGARI LETTER NNA +0924 DEVANAGARI LETTER TA +0925 DEVANAGARI LETTER THA +0926 DEVANAGARI LETTER DA +0927 DEVANAGARI LETTER DHA +0928 DEVANAGARI LETTER NA +0929 DEVANAGARI LETTER NNNA +092A DEVANAGARI LETTER PA +092B DEVANAGARI LETTER PHA +092C DEVANAGARI LETTER BA +092D DEVANAGARI LETTER BHA +092E DEVANAGARI LETTER MA +092F DEVANAGARI LETTER YA +0930 DEVANAGARI LETTER RA +0931 DEVANAGARI LETTER RRA +0932 DEVANAGARI LETTER LA +0933 DEVANAGARI LETTER LLA +0934 DEVANAGARI LETTER LLLA +0935 DEVANAGARI LETTER VA +0936 DEVANAGARI LETTER SHA +0937 DEVANAGARI LETTER SSA +0938 DEVANAGARI LETTER SA +0939 DEVANAGARI LETTER HA +093C DEVANAGARI SIGN NUKTA +093D DEVANAGARI SIGN AVAGRAHA +093E DEVANAGARI VOWEL SIGN AA +093F DEVANAGARI VOWEL SIGN I +0940 DEVANAGARI VOWEL SIGN II +0941 DEVANAGARI VOWEL SIGN U +0942 DEVANAGARI VOWEL SIGN UU +0943 DEVANAGARI VOWEL SIGN VOCALIC R +0944 DEVANAGARI VOWEL SIGN VOCALIC RR +0945 DEVANAGARI VOWEL SIGN CANDRA E +0946 DEVANAGARI VOWEL SIGN SHORT E +0947 DEVANAGARI VOWEL SIGN E +0948 DEVANAGARI VOWEL SIGN AI +0949 DEVANAGARI VOWEL SIGN CANDRA O +094A DEVANAGARI VOWEL SIGN SHORT O +094B DEVANAGARI VOWEL SIGN O +094C DEVANAGARI VOWEL SIGN AU +094D DEVANAGARI SIGN VIRAMA +0950 DEVANAGARI OM +0951 DEVANAGARI STRESS SIGN UDATTA +0952 DEVANAGARI STRESS SIGN ANUDATTA +0953 DEVANAGARI GRAVE ACCENT +0954 DEVANAGARI ACUTE ACCENT +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 +0960 DEVANAGARI LETTER VOCALIC RR +0961 DEVANAGARI LETTER VOCALIC LL +0962 DEVANAGARI VOWEL SIGN VOCALIC L +0963 DEVANAGARI VOWEL SIGN VOCALIC LL +0964 DEVANAGARI DANDA +0965 DEVANAGARI DOUBLE DANDA +0966 DEVANAGARI DIGIT ZERO +0967 DEVANAGARI DIGIT ONE +0968 DEVANAGARI DIGIT TWO +0969 DEVANAGARI DIGIT THREE +096A DEVANAGARI DIGIT FOUR +096B DEVANAGARI DIGIT FIVE +096C DEVANAGARI DIGIT SIX +096D DEVANAGARI DIGIT SEVEN +096E DEVANAGARI DIGIT EIGHT +096F DEVANAGARI DIGIT NINE +0970 DEVANAGARI ABBREVIATION SIGN +097D DEVANAGARI LETTER GLOTTAL STOP +0981 BENGALI SIGN CANDRABINDU +0982 BENGALI SIGN ANUSVARA +0983 BENGALI SIGN VISARGA +0985 BENGALI LETTER A +0986 BENGALI LETTER AA +0987 BENGALI LETTER I +0988 BENGALI LETTER II +0989 BENGALI LETTER U +098A BENGALI LETTER UU +098B BENGALI LETTER VOCALIC R +098C BENGALI LETTER VOCALIC L +098F BENGALI LETTER E +0990 BENGALI LETTER AI +0993 BENGALI LETTER O +0994 BENGALI LETTER AU +0995 BENGALI LETTER KA +0996 BENGALI LETTER KHA +0997 BENGALI LETTER GA +0998 BENGALI LETTER GHA +0999 BENGALI LETTER NGA +099A BENGALI LETTER CA +099B BENGALI LETTER CHA +099C BENGALI LETTER JA +099D BENGALI LETTER JHA +099E BENGALI LETTER NYA +099F BENGALI LETTER TTA +09A0 BENGALI LETTER TTHA +09A1 BENGALI LETTER DDA +09A2 BENGALI LETTER DDHA +09A3 BENGALI LETTER NNA +09A4 BENGALI LETTER TA +09A5 BENGALI LETTER THA +09A6 BENGALI LETTER DA +09A7 BENGALI LETTER DHA +09A8 BENGALI LETTER NA +09AA BENGALI LETTER PA +09AB BENGALI LETTER PHA +09AC BENGALI LETTER BA +09AD BENGALI LETTER BHA +09AE BENGALI LETTER MA +09AF BENGALI LETTER YA +09B0 BENGALI LETTER RA +09B2 BENGALI LETTER LA +09B6 BENGALI LETTER SHA +09B7 BENGALI LETTER SSA +09B8 BENGALI LETTER SA +09B9 BENGALI LETTER HA +09BC BENGALI SIGN NUKTA +09BD BENGALI SIGN AVAGRAHA +09BE BENGALI VOWEL SIGN AA +09BF BENGALI VOWEL SIGN I +09C0 BENGALI VOWEL SIGN II +09C1 BENGALI VOWEL SIGN U +09C2 BENGALI VOWEL SIGN UU +09C3 BENGALI VOWEL SIGN VOCALIC R +09C4 BENGALI VOWEL SIGN VOCALIC RR +09C7 BENGALI VOWEL SIGN E +09C8 BENGALI VOWEL SIGN AI +09CB BENGALI VOWEL SIGN O +09CC BENGALI VOWEL SIGN AU +09CD BENGALI SIGN VIRAMA +09CE BENGALI LETTER KHANDA TA +09D7 BENGALI AU LENGTH MARK +09DC BENGALI LETTER RRA +09DD BENGALI LETTER RHA +09DF BENGALI LETTER YYA +09E0 BENGALI LETTER VOCALIC RR +09E1 BENGALI LETTER VOCALIC LL +09E2 BENGALI VOWEL SIGN VOCALIC L +09E3 BENGALI VOWEL SIGN VOCALIC LL +09E6 BENGALI DIGIT ZERO +09E7 BENGALI DIGIT ONE +09E8 BENGALI DIGIT TWO +09E9 BENGALI DIGIT THREE +09EA BENGALI DIGIT FOUR +09EB BENGALI DIGIT FIVE +09EC BENGALI DIGIT SIX +09ED BENGALI DIGIT SEVEN +09EE BENGALI DIGIT EIGHT +09EF BENGALI DIGIT NINE +09F0 BENGALI LETTER RA WITH MIDDLE DIAGONAL +09F1 BENGALI LETTER RA WITH LOWER DIAGONAL +09F2 BENGALI RUPEE MARK +09F3 BENGALI RUPEE SIGN +09F4 BENGALI CURRENCY NUMERATOR ONE +09F5 BENGALI CURRENCY NUMERATOR TWO +09F6 BENGALI CURRENCY NUMERATOR THREE +09F7 BENGALI CURRENCY NUMERATOR FOUR +09F8 BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +09F9 BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA BENGALI ISSHAR +0A01 GURMUKHI SIGN ADAK BINDI +0A02 GURMUKHI SIGN BINDI +0A03 GURMUKHI SIGN VISARGA +0A05 GURMUKHI LETTER A +0A06 GURMUKHI LETTER AA +0A07 GURMUKHI LETTER I +0A08 GURMUKHI LETTER II +0A09 GURMUKHI LETTER U +0A0A GURMUKHI LETTER UU +0A0F GURMUKHI LETTER EE +0A10 GURMUKHI LETTER AI +0A13 GURMUKHI LETTER OO +0A14 GURMUKHI LETTER AU +0A15 GURMUKHI LETTER KA +0A16 GURMUKHI LETTER KHA +0A17 GURMUKHI LETTER GA +0A18 GURMUKHI LETTER GHA +0A19 GURMUKHI LETTER NGA +0A1A GURMUKHI LETTER CA +0A1B GURMUKHI LETTER CHA +0A1C GURMUKHI LETTER JA +0A1D GURMUKHI LETTER JHA +0A1E GURMUKHI LETTER NYA +0A1F GURMUKHI LETTER TTA +0A20 GURMUKHI LETTER TTHA +0A21 GURMUKHI LETTER DDA +0A22 GURMUKHI LETTER DDHA +0A23 GURMUKHI LETTER NNA +0A24 GURMUKHI LETTER TA +0A25 GURMUKHI LETTER THA +0A26 GURMUKHI LETTER DA +0A27 GURMUKHI LETTER DHA +0A28 GURMUKHI LETTER NA +0A2A GURMUKHI LETTER PA +0A2B GURMUKHI LETTER PHA +0A2C GURMUKHI LETTER BA +0A2D GURMUKHI LETTER BHA +0A2E GURMUKHI LETTER MA +0A2F GURMUKHI LETTER YA +0A30 GURMUKHI LETTER RA +0A32 GURMUKHI LETTER LA +0A33 GURMUKHI LETTER LLA +0A35 GURMUKHI LETTER VA +0A36 GURMUKHI LETTER SHA +0A38 GURMUKHI LETTER SA +0A39 GURMUKHI LETTER HA +0A3C GURMUKHI SIGN NUKTA +0A3E GURMUKHI VOWEL SIGN AA +0A3F GURMUKHI VOWEL SIGN I +0A40 GURMUKHI VOWEL SIGN II +0A41 GURMUKHI VOWEL SIGN U +0A42 GURMUKHI VOWEL SIGN UU +0A47 GURMUKHI VOWEL SIGN EE +0A48 GURMUKHI VOWEL SIGN AI +0A4B GURMUKHI VOWEL SIGN OO +0A4C GURMUKHI VOWEL SIGN AU +0A4D GURMUKHI SIGN VIRAMA +0A59 GURMUKHI LETTER KHHA +0A5A GURMUKHI LETTER GHHA +0A5B GURMUKHI LETTER ZA +0A5C GURMUKHI LETTER RRA +0A5E GURMUKHI LETTER FA +0A66 GURMUKHI DIGIT ZERO +0A67 GURMUKHI DIGIT ONE +0A68 GURMUKHI DIGIT TWO +0A69 GURMUKHI DIGIT THREE +0A6A GURMUKHI DIGIT FOUR +0A6B GURMUKHI DIGIT FIVE +0A6C GURMUKHI DIGIT SIX +0A6D GURMUKHI DIGIT SEVEN +0A6E GURMUKHI DIGIT EIGHT +0A6F GURMUKHI DIGIT NINE +0A70 GURMUKHI TIPPI +0A71 GURMUKHI ADDAK +0A72 GURMUKHI IRI +0A73 GURMUKHI URA +0A74 GURMUKHI EK ONKAR +0A81 GUJARATI SIGN CANDRABINDU +0A82 GUJARATI SIGN ANUSVARA +0A83 GUJARATI SIGN VISARGA +0A85 GUJARATI LETTER A +0A86 GUJARATI LETTER AA +0A87 GUJARATI LETTER I +0A88 GUJARATI LETTER II +0A89 GUJARATI LETTER U +0A8A GUJARATI LETTER UU +0A8B GUJARATI LETTER VOCALIC R +0A8C GUJARATI LETTER VOCALIC L +0A8D GUJARATI VOWEL CANDRA E +0A8F GUJARATI LETTER E +0A90 GUJARATI LETTER AI +0A91 GUJARATI VOWEL CANDRA O +0A93 GUJARATI LETTER O +0A94 GUJARATI LETTER AU +0A95 GUJARATI LETTER KA +0A96 GUJARATI LETTER KHA +0A97 GUJARATI LETTER GA +0A98 GUJARATI LETTER GHA +0A99 GUJARATI LETTER NGA +0A9A GUJARATI LETTER CA +0A9B GUJARATI LETTER CHA +0A9C GUJARATI LETTER JA +0A9D GUJARATI LETTER JHA +0A9E GUJARATI LETTER NYA +0A9F GUJARATI LETTER TTA +0AA0 GUJARATI LETTER TTHA +0AA1 GUJARATI LETTER DDA +0AA2 GUJARATI LETTER DDHA +0AA3 GUJARATI LETTER NNA +0AA4 GUJARATI LETTER TA +0AA5 GUJARATI LETTER THA +0AA6 GUJARATI LETTER DA +0AA7 GUJARATI LETTER DHA +0AA8 GUJARATI LETTER NA +0AAA GUJARATI LETTER PA +0AAB GUJARATI LETTER PHA +0AAC GUJARATI LETTER BA +0AAD GUJARATI LETTER BHA +0AAE GUJARATI LETTER MA +0AAF GUJARATI LETTER YA +0AB0 GUJARATI LETTER RA +0AB2 GUJARATI LETTER LA +0AB3 GUJARATI LETTER LLA +0AB5 GUJARATI LETTER VA +0AB6 GUJARATI LETTER SHA +0AB7 GUJARATI LETTER SSA +0AB8 GUJARATI LETTER SA +0AB9 GUJARATI LETTER HA +0ABC GUJARATI SIGN NUKTA +0ABD GUJARATI SIGN AVAGRAHA +0ABE GUJARATI VOWEL SIGN AA +0ABF GUJARATI VOWEL SIGN I +0AC0 GUJARATI VOWEL SIGN II +0AC1 GUJARATI VOWEL SIGN U +0AC2 GUJARATI VOWEL SIGN UU +0AC3 GUJARATI VOWEL SIGN VOCALIC R +0AC4 GUJARATI VOWEL SIGN VOCALIC RR +0AC5 GUJARATI VOWEL SIGN CANDRA E +0AC7 GUJARATI VOWEL SIGN E +0AC8 GUJARATI VOWEL SIGN AI +0AC9 GUJARATI VOWEL SIGN CANDRA O +0ACB GUJARATI VOWEL SIGN O +0ACC GUJARATI VOWEL SIGN AU +0ACD GUJARATI SIGN VIRAMA +0AD0 GUJARATI OM +0AE0 GUJARATI LETTER VOCALIC RR +0AE1 GUJARATI LETTER VOCALIC LL +0AE2 GUJARATI VOWEL SIGN VOCALIC L +0AE3 GUJARATI VOWEL SIGN VOCALIC LL +0AE6 GUJARATI DIGIT ZERO +0AE7 GUJARATI DIGIT ONE +0AE8 GUJARATI DIGIT TWO +0AE9 GUJARATI DIGIT THREE +0AEA GUJARATI DIGIT FOUR +0AEB GUJARATI DIGIT FIVE +0AEC GUJARATI DIGIT SIX +0AED GUJARATI DIGIT SEVEN +0AEE GUJARATI DIGIT EIGHT +0AEF GUJARATI DIGIT NINE +0AF1 GUJARATI RUPEE SIGN +0B01 ORIYA SIGN CANDRABINDU +0B02 ORIYA SIGN ANUSVARA +0B03 ORIYA SIGN VISARGA +0B05 ORIYA LETTER A +0B06 ORIYA LETTER AA +0B07 ORIYA LETTER I +0B08 ORIYA LETTER II +0B09 ORIYA LETTER U +0B0A ORIYA LETTER UU +0B0B ORIYA LETTER VOCALIC R +0B0C ORIYA LETTER VOCALIC L +0B0F ORIYA LETTER E +0B10 ORIYA LETTER AI +0B13 ORIYA LETTER O +0B14 ORIYA LETTER AU +0B15 ORIYA LETTER KA +0B16 ORIYA LETTER KHA +0B17 ORIYA LETTER GA +0B18 ORIYA LETTER GHA +0B19 ORIYA LETTER NGA +0B1A ORIYA LETTER CA +0B1B ORIYA LETTER CHA +0B1C ORIYA LETTER JA +0B1D ORIYA LETTER JHA +0B1E ORIYA LETTER NYA +0B1F ORIYA LETTER TTA +0B20 ORIYA LETTER TTHA +0B21 ORIYA LETTER DDA +0B22 ORIYA LETTER DDHA +0B23 ORIYA LETTER NNA +0B24 ORIYA LETTER TA +0B25 ORIYA LETTER THA +0B26 ORIYA LETTER DA +0B27 ORIYA LETTER DHA +0B28 ORIYA LETTER NA +0B2A ORIYA LETTER PA +0B2B ORIYA LETTER PHA +0B2C ORIYA LETTER BA +0B2D ORIYA LETTER BHA +0B2E ORIYA LETTER MA +0B2F ORIYA LETTER YA +0B30 ORIYA LETTER RA +0B32 ORIYA LETTER LA +0B33 ORIYA LETTER LLA +0B35 ORIYA LETTER VA +0B36 ORIYA LETTER SHA +0B37 ORIYA LETTER SSA +0B38 ORIYA LETTER SA +0B39 ORIYA LETTER HA +0B3C ORIYA SIGN NUKTA +0B3D ORIYA SIGN AVAGRAHA +0B3E ORIYA VOWEL SIGN AA +0B3F ORIYA VOWEL SIGN I +0B40 ORIYA VOWEL SIGN II +0B41 ORIYA VOWEL SIGN U +0B42 ORIYA VOWEL SIGN UU +0B43 ORIYA VOWEL SIGN VOCALIC R +0B47 ORIYA VOWEL SIGN E +0B48 ORIYA VOWEL SIGN AI +0B4B ORIYA VOWEL SIGN O +0B4C ORIYA VOWEL SIGN AU +0B4D ORIYA SIGN VIRAMA +0B56 ORIYA AI LENGTH MARK +0B57 ORIYA AU LENGTH MARK +0B5C ORIYA LETTER RRA +0B5D ORIYA LETTER RHA +0B5F ORIYA LETTER YYA +0B60 ORIYA LETTER VOCALIC RR +0B61 ORIYA LETTER VOCALIC LL +0B66 ORIYA DIGIT ZERO +0B67 ORIYA DIGIT ONE +0B68 ORIYA DIGIT TWO +0B69 ORIYA DIGIT THREE +0B6A ORIYA DIGIT FOUR +0B6B ORIYA DIGIT FIVE +0B6C ORIYA DIGIT SIX +0B6D ORIYA DIGIT SEVEN +0B6E ORIYA DIGIT EIGHT +0B6F ORIYA DIGIT NINE +0B70 ORIYA ISSHAR +0B71 ORIYA LETTER WA +0B82 TAMIL SIGN ANUSVARA +0B83 TAMIL SIGN VISARGA +0B85 TAMIL LETTER A +0B86 TAMIL LETTER AA +0B87 TAMIL LETTER I +0B88 TAMIL LETTER II +0B89 TAMIL LETTER U +0B8A TAMIL LETTER UU +0B8E TAMIL LETTER E +0B8F TAMIL LETTER EE +0B90 TAMIL LETTER AI +0B92 TAMIL LETTER O +0B93 TAMIL LETTER OO +0B94 TAMIL LETTER AU +0B95 TAMIL LETTER KA +0B99 TAMIL LETTER NGA +0B9A TAMIL LETTER CA +0B9C TAMIL LETTER JA +0B9E TAMIL LETTER NYA +0B9F TAMIL LETTER TTA +0BA3 TAMIL LETTER NNA +0BA4 TAMIL LETTER TA +0BA8 TAMIL LETTER NA +0BA9 TAMIL LETTER NNNA +0BAA TAMIL LETTER PA +0BAE TAMIL LETTER MA +0BAF TAMIL LETTER YA +0BB0 TAMIL LETTER RA +0BB1 TAMIL LETTER RRA +0BB2 TAMIL LETTER LA +0BB3 TAMIL LETTER LLA +0BB4 TAMIL LETTER LLLA +0BB5 TAMIL LETTER VA +0BB6 TAMIL LETTER SHA +0BB7 TAMIL LETTER SSA +0BB8 TAMIL LETTER SA +0BB9 TAMIL LETTER HA +0BBE TAMIL VOWEL SIGN AA +0BBF TAMIL VOWEL SIGN I +0BC0 TAMIL VOWEL SIGN II +0BC1 TAMIL VOWEL SIGN U +0BC2 TAMIL VOWEL SIGN UU +0BC6 TAMIL VOWEL SIGN E +0BC7 TAMIL VOWEL SIGN EE +0BC8 TAMIL VOWEL SIGN AI +0BCA TAMIL VOWEL SIGN O +0BCB TAMIL VOWEL SIGN OO +0BCC TAMIL VOWEL SIGN AU +0BCD TAMIL SIGN VIRAMA +0BD7 TAMIL AU LENGTH MARK +0BE6 TAMIL DIGIT ZERO +0BE7 TAMIL DIGIT ONE +0BE8 TAMIL DIGIT TWO +0BE9 TAMIL DIGIT THREE +0BEA TAMIL DIGIT FOUR +0BEB TAMIL DIGIT FIVE +0BEC TAMIL DIGIT SIX +0BED TAMIL DIGIT SEVEN +0BEE TAMIL DIGIT EIGHT +0BEF TAMIL DIGIT NINE +0BF0 TAMIL NUMBER TEN +0BF1 TAMIL NUMBER ONE HUNDRED +0BF2 TAMIL NUMBER ONE THOUSAND +0BF3 TAMIL DAY SIGN +0BF4 TAMIL MONTH SIGN +0BF5 TAMIL YEAR SIGN +0BF6 TAMIL DEBIT SIGN +0BF7 TAMIL CREDIT SIGN +0BF8 TAMIL AS ABOVE SIGN +0BF9 TAMIL RUPEE SIGN +0BFA TAMIL NUMBER SIGN +0C01 TELUGU SIGN CANDRABINDU +0C02 TELUGU SIGN ANUSVARA +0C03 TELUGU SIGN VISARGA +0C05 TELUGU LETTER A +0C06 TELUGU LETTER AA +0C07 TELUGU LETTER I +0C08 TELUGU LETTER II +0C09 TELUGU LETTER U +0C0A TELUGU LETTER UU +0C0B TELUGU LETTER VOCALIC R +0C0C TELUGU LETTER VOCALIC L +0C0E TELUGU LETTER E +0C0F TELUGU LETTER EE +0C10 TELUGU LETTER AI +0C12 TELUGU LETTER O +0C13 TELUGU LETTER OO +0C14 TELUGU LETTER AU +0C15 TELUGU LETTER KA +0C16 TELUGU LETTER KHA +0C17 TELUGU LETTER GA +0C18 TELUGU LETTER GHA +0C19 TELUGU LETTER NGA +0C1A TELUGU LETTER CA +0C1B TELUGU LETTER CHA +0C1C TELUGU LETTER JA +0C1D TELUGU LETTER JHA +0C1E TELUGU LETTER NYA +0C1F TELUGU LETTER TTA +0C20 TELUGU LETTER TTHA +0C21 TELUGU LETTER DDA +0C22 TELUGU LETTER DDHA +0C23 TELUGU LETTER NNA +0C24 TELUGU LETTER TA +0C25 TELUGU LETTER THA +0C26 TELUGU LETTER DA +0C27 TELUGU LETTER DHA +0C28 TELUGU LETTER NA +0C2A TELUGU LETTER PA +0C2B TELUGU LETTER PHA +0C2C TELUGU LETTER BA +0C2D TELUGU LETTER BHA +0C2E TELUGU LETTER MA +0C2F TELUGU LETTER YA +0C30 TELUGU LETTER RA +0C31 TELUGU LETTER RRA +0C32 TELUGU LETTER LA +0C33 TELUGU LETTER LLA +0C35 TELUGU LETTER VA +0C36 TELUGU LETTER SHA +0C37 TELUGU LETTER SSA +0C38 TELUGU LETTER SA +0C39 TELUGU LETTER HA +0C3E TELUGU VOWEL SIGN AA +0C3F TELUGU VOWEL SIGN I +0C40 TELUGU VOWEL SIGN II +0C41 TELUGU VOWEL SIGN U +0C42 TELUGU VOWEL SIGN UU +0C43 TELUGU VOWEL SIGN VOCALIC R +0C44 TELUGU VOWEL SIGN VOCALIC RR +0C46 TELUGU VOWEL SIGN E +0C47 TELUGU VOWEL SIGN EE +0C48 TELUGU VOWEL SIGN AI +0C4A TELUGU VOWEL SIGN O +0C4B TELUGU VOWEL SIGN OO +0C4C TELUGU VOWEL SIGN AU +0C4D TELUGU SIGN VIRAMA +0C55 TELUGU LENGTH MARK +0C56 TELUGU AI LENGTH MARK +0C60 TELUGU LETTER VOCALIC RR +0C61 TELUGU LETTER VOCALIC LL +0C66 TELUGU DIGIT ZERO +0C67 TELUGU DIGIT ONE +0C68 TELUGU DIGIT TWO +0C69 TELUGU DIGIT THREE +0C6A TELUGU DIGIT FOUR +0C6B TELUGU DIGIT FIVE +0C6C TELUGU DIGIT SIX +0C6D TELUGU DIGIT SEVEN +0C6E TELUGU DIGIT EIGHT +0C6F TELUGU DIGIT NINE +0C82 KANNADA SIGN ANUSVARA +0C83 KANNADA SIGN VISARGA +0C85 KANNADA LETTER A +0C86 KANNADA LETTER AA +0C87 KANNADA LETTER I +0C88 KANNADA LETTER II +0C89 KANNADA LETTER U +0C8A KANNADA LETTER UU +0C8B KANNADA LETTER VOCALIC R +0C8C KANNADA LETTER VOCALIC L +0C8E KANNADA LETTER E +0C8F KANNADA LETTER EE +0C90 KANNADA LETTER AI +0C92 KANNADA LETTER O +0C93 KANNADA LETTER OO +0C94 KANNADA LETTER AU +0C95 KANNADA LETTER KA +0C96 KANNADA LETTER KHA +0C97 KANNADA LETTER GA +0C98 KANNADA LETTER GHA +0C99 KANNADA LETTER NGA +0C9A KANNADA LETTER CA +0C9B KANNADA LETTER CHA +0C9C KANNADA LETTER JA +0C9D KANNADA LETTER JHA +0C9E KANNADA LETTER NYA +0C9F KANNADA LETTER TTA +0CA0 KANNADA LETTER TTHA +0CA1 KANNADA LETTER DDA +0CA2 KANNADA LETTER DDHA +0CA3 KANNADA LETTER NNA +0CA4 KANNADA LETTER TA +0CA5 KANNADA LETTER THA +0CA6 KANNADA LETTER DA +0CA7 KANNADA LETTER DHA +0CA8 KANNADA LETTER NA +0CAA KANNADA LETTER PA +0CAB KANNADA LETTER PHA +0CAC KANNADA LETTER BA +0CAD KANNADA LETTER BHA +0CAE KANNADA LETTER MA +0CAF KANNADA LETTER YA +0CB0 KANNADA LETTER RA +0CB1 KANNADA LETTER RRA +0CB2 KANNADA LETTER LA +0CB3 KANNADA LETTER LLA +0CB5 KANNADA LETTER VA +0CB6 KANNADA LETTER SHA +0CB7 KANNADA LETTER SSA +0CB8 KANNADA LETTER SA +0CB9 KANNADA LETTER HA +0CBC KANNADA SIGN NUKTA +0CBD KANNADA SIGN AVAGRAHA +0CBE KANNADA VOWEL SIGN AA +0CBF KANNADA VOWEL SIGN I +0CC0 KANNADA VOWEL SIGN II +0CC1 KANNADA VOWEL SIGN U +0CC2 KANNADA VOWEL SIGN UU +0CC3 KANNADA VOWEL SIGN VOCALIC R +0CC4 KANNADA VOWEL SIGN VOCALIC RR +0CC6 KANNADA VOWEL SIGN E +0CC7 KANNADA VOWEL SIGN EE +0CC8 KANNADA VOWEL SIGN AI +0CCA KANNADA VOWEL SIGN O +0CCB KANNADA VOWEL SIGN OO +0CCC KANNADA VOWEL SIGN AU +0CCD KANNADA SIGN VIRAMA +0CD5 KANNADA LENGTH MARK +0CD6 KANNADA AI LENGTH MARK +0CDE KANNADA LETTER FA +0CE0 KANNADA LETTER VOCALIC RR +0CE1 KANNADA LETTER VOCALIC LL +0CE6 KANNADA DIGIT ZERO +0CE7 KANNADA DIGIT ONE +0CE8 KANNADA DIGIT TWO +0CE9 KANNADA DIGIT THREE +0CEA KANNADA DIGIT FOUR +0CEB KANNADA DIGIT FIVE +0CEC KANNADA DIGIT SIX +0CED KANNADA DIGIT SEVEN +0CEE KANNADA DIGIT EIGHT +0CEF KANNADA DIGIT NINE +0D02 MALAYALAM SIGN ANUSVARA +0D03 MALAYALAM SIGN VISARGA +0D05 MALAYALAM LETTER A +0D06 MALAYALAM LETTER AA +0D07 MALAYALAM LETTER I +0D08 MALAYALAM LETTER II +0D09 MALAYALAM LETTER U +0D0A MALAYALAM LETTER UU +0D0B MALAYALAM LETTER VOCALIC R +0D0C MALAYALAM LETTER VOCALIC L +0D0E MALAYALAM LETTER E +0D0F MALAYALAM LETTER EE +0D10 MALAYALAM LETTER AI +0D12 MALAYALAM LETTER O +0D13 MALAYALAM LETTER OO +0D14 MALAYALAM LETTER AU +0D15 MALAYALAM LETTER KA +0D16 MALAYALAM LETTER KHA +0D17 MALAYALAM LETTER GA +0D18 MALAYALAM LETTER GHA +0D19 MALAYALAM LETTER NGA +0D1A MALAYALAM LETTER CA +0D1B MALAYALAM LETTER CHA +0D1C MALAYALAM LETTER JA +0D1D MALAYALAM LETTER JHA +0D1E MALAYALAM LETTER NYA +0D1F MALAYALAM LETTER TTA +0D20 MALAYALAM LETTER TTHA +0D21 MALAYALAM LETTER DDA +0D22 MALAYALAM LETTER DDHA +0D23 MALAYALAM LETTER NNA +0D24 MALAYALAM LETTER TA +0D25 MALAYALAM LETTER THA +0D26 MALAYALAM LETTER DA +0D27 MALAYALAM LETTER DHA +0D28 MALAYALAM LETTER NA +0D2A MALAYALAM LETTER PA +0D2B MALAYALAM LETTER PHA +0D2C MALAYALAM LETTER BA +0D2D MALAYALAM LETTER BHA +0D2E MALAYALAM LETTER MA +0D2F MALAYALAM LETTER YA +0D30 MALAYALAM LETTER RA +0D31 MALAYALAM LETTER RRA +0D32 MALAYALAM LETTER LA +0D33 MALAYALAM LETTER LLA +0D34 MALAYALAM LETTER LLLA +0D35 MALAYALAM LETTER VA +0D36 MALAYALAM LETTER SHA +0D37 MALAYALAM LETTER SSA +0D38 MALAYALAM LETTER SA +0D39 MALAYALAM LETTER HA +0D3E MALAYALAM VOWEL SIGN AA +0D3F MALAYALAM VOWEL SIGN I +0D40 MALAYALAM VOWEL SIGN II +0D41 MALAYALAM VOWEL SIGN U +0D42 MALAYALAM VOWEL SIGN UU +0D43 MALAYALAM VOWEL SIGN VOCALIC R +0D46 MALAYALAM VOWEL SIGN E +0D47 MALAYALAM VOWEL SIGN EE +0D48 MALAYALAM VOWEL SIGN AI +0D4A MALAYALAM VOWEL SIGN O +0D4B MALAYALAM VOWEL SIGN OO +0D4C MALAYALAM VOWEL SIGN AU +0D4D MALAYALAM SIGN VIRAMA +0D57 MALAYALAM AU LENGTH MARK +0D60 MALAYALAM LETTER VOCALIC RR +0D61 MALAYALAM LETTER VOCALIC LL +0D66 MALAYALAM DIGIT ZERO +0D67 MALAYALAM DIGIT ONE +0D68 MALAYALAM DIGIT TWO +0D69 MALAYALAM DIGIT THREE +0D6A MALAYALAM DIGIT FOUR +0D6B MALAYALAM DIGIT FIVE +0D6C MALAYALAM DIGIT SIX +0D6D MALAYALAM DIGIT SEVEN +0D6E MALAYALAM DIGIT EIGHT +0D6F MALAYALAM DIGIT NINE +0D82 SINHALA SIGN ANUSVARAYA +0D83 SINHALA SIGN VISARGAYA +0D85 SINHALA LETTER AYANNA +0D86 SINHALA LETTER AAYANNA +0D87 SINHALA LETTER AEYANNA +0D88 SINHALA LETTER AEEYANNA +0D89 SINHALA LETTER IYANNA +0D8A SINHALA LETTER IIYANNA +0D8B SINHALA LETTER UYANNA +0D8C SINHALA LETTER UUYANNA +0D8D SINHALA LETTER IRUYANNA +0D8E SINHALA LETTER IRUUYANNA +0D8F SINHALA LETTER ILUYANNA +0D90 SINHALA LETTER ILUUYANNA +0D91 SINHALA LETTER EYANNA +0D92 SINHALA LETTER EEYANNA +0D93 SINHALA LETTER AIYANNA +0D94 SINHALA LETTER OYANNA +0D95 SINHALA LETTER OOYANNA +0D96 SINHALA LETTER AUYANNA +0D9A SINHALA LETTER ALPAPRAANA KAYANNA +0D9B SINHALA LETTER MAHAAPRAANA KAYANNA +0D9C SINHALA LETTER ALPAPRAANA GAYANNA +0D9D SINHALA LETTER MAHAAPRAANA GAYANNA +0D9E SINHALA LETTER KANTAJA NAASIKYAYA +0D9F SINHALA LETTER SANYAKA GAYANNA +0DA0 SINHALA LETTER ALPAPRAANA CAYANNA +0DA1 SINHALA LETTER MAHAAPRAANA CAYANNA +0DA2 SINHALA LETTER ALPAPRAANA JAYANNA +0DA3 SINHALA LETTER MAHAAPRAANA JAYANNA +0DA4 SINHALA LETTER TAALUJA NAASIKYAYA +0DA5 SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA +0DA6 SINHALA LETTER SANYAKA JAYANNA +0DA7 SINHALA LETTER ALPAPRAANA TTAYANNA +0DA8 SINHALA LETTER MAHAAPRAANA TTAYANNA +0DA9 SINHALA LETTER ALPAPRAANA DDAYANNA +0DAA SINHALA LETTER MAHAAPRAANA DDAYANNA +0DAB SINHALA LETTER MUURDHAJA NAYANNA +0DAC SINHALA LETTER SANYAKA DDAYANNA +0DAD SINHALA LETTER ALPAPRAANA TAYANNA +0DAE SINHALA LETTER MAHAAPRAANA TAYANNA +0DAF SINHALA LETTER ALPAPRAANA DAYANNA +0DB0 SINHALA LETTER MAHAAPRAANA DAYANNA +0DB1 SINHALA LETTER DANTAJA NAYANNA +0DB3 SINHALA LETTER SANYAKA DAYANNA +0DB4 SINHALA LETTER ALPAPRAANA PAYANNA +0DB5 SINHALA LETTER MAHAAPRAANA PAYANNA +0DB6 SINHALA LETTER ALPAPRAANA BAYANNA +0DB7 SINHALA LETTER MAHAAPRAANA BAYANNA +0DB8 SINHALA LETTER MAYANNA +0DB9 SINHALA LETTER AMBA BAYANNA +0DBA SINHALA LETTER YAYANNA +0DBB SINHALA LETTER RAYANNA +0DBD SINHALA LETTER DANTAJA LAYANNA +0DC0 SINHALA LETTER VAYANNA +0DC1 SINHALA LETTER TAALUJA SAYANNA +0DC2 SINHALA LETTER MUURDHAJA SAYANNA +0DC3 SINHALA LETTER DANTAJA SAYANNA +0DC4 SINHALA LETTER HAYANNA +0DC5 SINHALA LETTER MUURDHAJA LAYANNA +0DC6 SINHALA LETTER FAYANNA +0DCA SINHALA SIGN AL-LAKUNA +0DCF SINHALA VOWEL SIGN AELA-PILLA +0DD0 SINHALA VOWEL SIGN KETTI AEDA-PILLA +0DD1 SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2 SINHALA VOWEL SIGN KETTI IS-PILLA +0DD3 SINHALA VOWEL SIGN DIGA IS-PILLA +0DD4 SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8 SINHALA VOWEL SIGN GAETTA-PILLA +0DD9 SINHALA VOWEL SIGN KOMBUVA +0DDA SINHALA VOWEL SIGN DIGA KOMBUVA +0DDB SINHALA VOWEL SIGN KOMBU DEKA +0DDC SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA +0DDD SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA +0DDE SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA +0DDF SINHALA VOWEL SIGN GAYANUKITTA +0DF2 SINHALA VOWEL SIGN DIGA GAETTA-PILLA +0DF3 SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DF4 SINHALA PUNCTUATION KUNDDALIYA +0E01 THAI CHARACTER KO KAI +0E02 THAI CHARACTER KHO KHAI +0E03 THAI CHARACTER KHO KHUAT +0E04 THAI CHARACTER KHO KHWAI +0E05 THAI CHARACTER KHO KHON +0E06 THAI CHARACTER KHO RAKHANG +0E07 THAI CHARACTER NGO NGU +0E08 THAI CHARACTER CHO CHAN +0E09 THAI CHARACTER CHO CHING +0E0A THAI CHARACTER CHO CHANG +0E0B THAI CHARACTER SO SO +0E0C THAI CHARACTER CHO CHOE +0E0D THAI CHARACTER YO YING +0E0E THAI CHARACTER DO CHADA +0E0F THAI CHARACTER TO PATAK +0E10 THAI CHARACTER THO THAN +0E11 THAI CHARACTER THO NANGMONTHO +0E12 THAI CHARACTER THO PHUTHAO +0E13 THAI CHARACTER NO NEN +0E14 THAI CHARACTER DO DEK +0E15 THAI CHARACTER TO TAO +0E16 THAI CHARACTER THO THUNG +0E17 THAI CHARACTER THO THAHAN +0E18 THAI CHARACTER THO THONG +0E19 THAI CHARACTER NO NU +0E1A THAI CHARACTER BO BAIMAI +0E1B THAI CHARACTER PO PLA +0E1C THAI CHARACTER PHO PHUNG +0E1D THAI CHARACTER FO FA +0E1E THAI CHARACTER PHO PHAN +0E1F THAI CHARACTER FO FAN +0E20 THAI CHARACTER PHO SAMPHAO +0E21 THAI CHARACTER MO MA +0E22 THAI CHARACTER YO YAK +0E23 THAI CHARACTER RO RUA +0E24 THAI CHARACTER RU +0E25 THAI CHARACTER LO LING +0E26 THAI CHARACTER LU +0E27 THAI CHARACTER WO WAEN +0E28 THAI CHARACTER SO SALA +0E29 THAI CHARACTER SO RUSI +0E2A THAI CHARACTER SO SUA +0E2B THAI CHARACTER HO HIP +0E2C THAI CHARACTER LO CHULA +0E2D THAI CHARACTER O ANG +0E2E THAI CHARACTER HO NOKHUK +0E2F THAI CHARACTER PAIYANNOI +0E30 THAI CHARACTER SARA A +0E31 THAI CHARACTER MAI HAN-AKAT +0E32 THAI CHARACTER SARA AA +0E33 THAI CHARACTER SARA AM +0E34 THAI CHARACTER SARA I +0E35 THAI CHARACTER SARA II +0E36 THAI CHARACTER SARA UE +0E37 THAI CHARACTER SARA UEE +0E38 THAI CHARACTER SARA U +0E39 THAI CHARACTER SARA UU +0E3A THAI CHARACTER PHINTHU +0E3F THAI CURRENCY SYMBOL BAHT +0E40 THAI CHARACTER SARA E +0E41 THAI CHARACTER SARA AE +0E42 THAI CHARACTER SARA O +0E43 THAI CHARACTER SARA AI MAIMUAN +0E44 THAI CHARACTER SARA AI MAIMALAI +0E45 THAI CHARACTER LAKKHANGYAO +0E46 THAI CHARACTER MAIYAMOK +0E47 THAI CHARACTER MAITAIKHU +0E48 THAI CHARACTER MAI EK +0E49 THAI CHARACTER MAI THO +0E4A THAI CHARACTER MAI TRI +0E4B THAI CHARACTER MAI CHATTAWA +0E4C THAI CHARACTER THANTHAKHAT +0E4D THAI CHARACTER NIKHAHIT +0E4E THAI CHARACTER YAMAKKAN +0E4F THAI CHARACTER FONGMAN +0E50 THAI DIGIT ZERO +0E51 THAI DIGIT ONE +0E52 THAI DIGIT TWO +0E53 THAI DIGIT THREE +0E54 THAI DIGIT FOUR +0E55 THAI DIGIT FIVE +0E56 THAI DIGIT SIX +0E57 THAI DIGIT SEVEN +0E58 THAI DIGIT EIGHT +0E59 THAI DIGIT NINE +0E5A THAI CHARACTER ANGKHANKHU +0E5B THAI CHARACTER KHOMUT +0E81 LAO LETTER KO +0E82 LAO LETTER KHO SUNG +0E84 LAO LETTER KHO TAM +0E87 LAO LETTER NGO +0E88 LAO LETTER CO +0E8A LAO LETTER SO TAM +0E8D LAO LETTER NYO +0E94 LAO LETTER DO +0E95 LAO LETTER TO +0E96 LAO LETTER THO SUNG +0E97 LAO LETTER THO TAM +0E99 LAO LETTER NO +0E9A LAO LETTER BO +0E9B LAO LETTER PO +0E9C LAO LETTER PHO SUNG +0E9D LAO LETTER FO TAM +0E9E LAO LETTER PHO TAM +0E9F LAO LETTER FO SUNG +0EA1 LAO LETTER MO +0EA2 LAO LETTER YO +0EA3 LAO LETTER LO LING +0EA5 LAO LETTER LO LOOT +0EA7 LAO LETTER WO +0EAA LAO LETTER SO SUNG +0EAB LAO LETTER HO SUNG +0EAD LAO LETTER O +0EAE LAO LETTER HO TAM +0EAF LAO ELLIPSIS +0EB0 LAO VOWEL SIGN A +0EB1 LAO VOWEL SIGN MAI KAN +0EB2 LAO VOWEL SIGN AA +0EB3 LAO VOWEL SIGN AM +0EB4 LAO VOWEL SIGN I +0EB5 LAO VOWEL SIGN II +0EB6 LAO VOWEL SIGN Y +0EB7 LAO VOWEL SIGN YY +0EB8 LAO VOWEL SIGN U +0EB9 LAO VOWEL SIGN UU +0EBB LAO VOWEL SIGN MAI KON +0EBC LAO SEMIVOWEL SIGN LO +0EBD LAO SEMIVOWEL SIGN NYO +0EC0 LAO VOWEL SIGN E +0EC1 LAO VOWEL SIGN EI +0EC2 LAO VOWEL SIGN O +0EC3 LAO VOWEL SIGN AY +0EC4 LAO VOWEL SIGN AI +0EC6 LAO KO LA +0EC8 LAO TONE MAI EK +0EC9 LAO TONE MAI THO +0ECA LAO TONE MAI TI +0ECB LAO TONE MAI CATAWA +0ECC LAO CANCELLATION MARK +0ECD LAO NIGGAHITA +0ED0 LAO DIGIT ZERO +0ED1 LAO DIGIT ONE +0ED2 LAO DIGIT TWO +0ED3 LAO DIGIT THREE +0ED4 LAO DIGIT FOUR +0ED5 LAO DIGIT FIVE +0ED6 LAO DIGIT SIX +0ED7 LAO DIGIT SEVEN +0ED8 LAO DIGIT EIGHT +0ED9 LAO DIGIT NINE +0EDC LAO HO NO +0EDD LAO HO MO +0F00 TIBETAN SYLLABLE OM +0F01 TIBETAN MARK GTER YIG MGO TRUNCATED A +0F02 TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA +0F03 TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04 TIBETAN MARK INITIAL YIG MGO MDUN MA +0F05 TIBETAN MARK CLOSING YIG MGO SGAB MA +0F06 TIBETAN MARK CARET YIG MGO PHUR SHAD MA +0F07 TIBETAN MARK YIG MGO TSHEG SHAD MA +0F08 TIBETAN MARK SBRUL SHAD +0F09 TIBETAN MARK BSKUR YIG MGO +0F0A TIBETAN MARK BKA- SHOG YIG MGO +0F0B TIBETAN MARK INTERSYLLABIC TSHEG +0F0C TIBETAN MARK DELIMITER TSHEG BSTAR +0F0D TIBETAN MARK SHAD +0F0E TIBETAN MARK NYIS SHAD +0F0F TIBETAN MARK TSHEG SHAD +0F10 TIBETAN MARK NYIS TSHEG SHAD +0F11 TIBETAN MARK RIN CHEN SPUNGS SHAD +0F12 TIBETAN MARK RGYA GRAM SHAD +0F13 TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +0F14 TIBETAN MARK GTER TSHEG +0F15 TIBETAN LOGOTYPE SIGN CHAD RTAGS +0F16 TIBETAN LOGOTYPE SIGN LHAG RTAGS +0F17 TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F18 TIBETAN ASTROLOGICAL SIGN -KHYUD PA +0F19 TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F1A TIBETAN SIGN RDEL DKAR GCIG +0F1B TIBETAN SIGN RDEL DKAR GNYIS +0F1C TIBETAN SIGN RDEL DKAR GSUM +0F1D TIBETAN SIGN RDEL NAG GCIG +0F1E TIBETAN SIGN RDEL NAG GNYIS +0F1F TIBETAN SIGN RDEL DKAR RDEL NAG +0F20 TIBETAN DIGIT ZERO +0F21 TIBETAN DIGIT ONE +0F22 TIBETAN DIGIT TWO +0F23 TIBETAN DIGIT THREE +0F24 TIBETAN DIGIT FOUR +0F25 TIBETAN DIGIT FIVE +0F26 TIBETAN DIGIT SIX +0F27 TIBETAN DIGIT SEVEN +0F28 TIBETAN DIGIT EIGHT +0F29 TIBETAN DIGIT NINE +0F2A TIBETAN DIGIT HALF ONE +0F2B TIBETAN DIGIT HALF TWO +0F2C TIBETAN DIGIT HALF THREE +0F2D TIBETAN DIGIT HALF FOUR +0F2E TIBETAN DIGIT HALF FIVE +0F2F TIBETAN DIGIT HALF SIX +0F30 TIBETAN DIGIT HALF SEVEN +0F31 TIBETAN DIGIT HALF EIGHT +0F32 TIBETAN DIGIT HALF NINE +0F33 TIBETAN DIGIT HALF ZERO +0F34 TIBETAN MARK BSDUS RTAGS +0F35 TIBETAN MARK NGAS BZUNG NYI ZLA +0F36 TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F37 TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F38 TIBETAN MARK CHE MGO +0F39 TIBETAN MARK TSA -PHRU +0F3A TIBETAN MARK GUG RTAGS GYON +0F3B TIBETAN MARK GUG RTAGS GYAS +0F3C TIBETAN MARK ANG KHANG GYON +0F3D TIBETAN MARK ANG KHANG GYAS +0F3E TIBETAN SIGN YAR TSHES +0F3F TIBETAN SIGN MAR TSHES +0F40 TIBETAN LETTER KA +0F41 TIBETAN LETTER KHA +0F42 TIBETAN LETTER GA +0F43 TIBETAN LETTER GHA +0F44 TIBETAN LETTER NGA +0F45 TIBETAN LETTER CA +0F46 TIBETAN LETTER CHA +0F47 TIBETAN LETTER JA +0F49 TIBETAN LETTER NYA +0F4A TIBETAN LETTER TTA +0F4B TIBETAN LETTER TTHA +0F4C TIBETAN LETTER DDA +0F4D TIBETAN LETTER DDHA +0F4E TIBETAN LETTER NNA +0F4F TIBETAN LETTER TA +0F50 TIBETAN LETTER THA +0F51 TIBETAN LETTER DA +0F52 TIBETAN LETTER DHA +0F53 TIBETAN LETTER NA +0F54 TIBETAN LETTER PA +0F55 TIBETAN LETTER PHA +0F56 TIBETAN LETTER BA +0F57 TIBETAN LETTER BHA +0F58 TIBETAN LETTER MA +0F59 TIBETAN LETTER TSA +0F5A TIBETAN LETTER TSHA +0F5B TIBETAN LETTER DZA +0F5C TIBETAN LETTER DZHA +0F5D TIBETAN LETTER WA +0F5E TIBETAN LETTER ZHA +0F5F TIBETAN LETTER ZA +0F60 TIBETAN LETTER -A +0F61 TIBETAN LETTER YA +0F62 TIBETAN LETTER RA +0F63 TIBETAN LETTER LA +0F64 TIBETAN LETTER SHA +0F65 TIBETAN LETTER SSA +0F66 TIBETAN LETTER SA +0F67 TIBETAN LETTER HA +0F68 TIBETAN LETTER A +0F69 TIBETAN LETTER KSSA +0F6A TIBETAN LETTER FIXED-FORM RA +0F71 TIBETAN VOWEL SIGN AA +0F72 TIBETAN VOWEL SIGN I +0F73 TIBETAN VOWEL SIGN II +0F74 TIBETAN VOWEL SIGN U +0F75 TIBETAN VOWEL SIGN UU +0F76 TIBETAN VOWEL SIGN VOCALIC R +0F77 TIBETAN VOWEL SIGN VOCALIC RR +0F78 TIBETAN VOWEL SIGN VOCALIC L +0F79 TIBETAN VOWEL SIGN VOCALIC LL +0F7A TIBETAN VOWEL SIGN E +0F7B TIBETAN VOWEL SIGN EE +0F7C TIBETAN VOWEL SIGN O +0F7D TIBETAN VOWEL SIGN OO +0F7E TIBETAN SIGN RJES SU NGA RO +0F7F TIBETAN SIGN RNAM BCAD +0F80 TIBETAN VOWEL SIGN REVERSED I +0F81 TIBETAN VOWEL SIGN REVERSED II +0F82 TIBETAN SIGN NYI ZLA NAA DA +0F83 TIBETAN SIGN SNA LDAN +0F84 TIBETAN MARK HALANTA +0F85 TIBETAN MARK PALUTA +0F86 TIBETAN SIGN LCI RTAGS +0F87 TIBETAN SIGN YANG RTAGS +0F88 TIBETAN SIGN LCE TSA CAN +0F89 TIBETAN SIGN MCHU CAN +0F8A TIBETAN SIGN GRU CAN RGYINGS +0F8B TIBETAN SIGN GRU MED RGYINGS +0F90 TIBETAN SUBJOINED LETTER KA +0F91 TIBETAN SUBJOINED LETTER KHA +0F92 TIBETAN SUBJOINED LETTER GA +0F93 TIBETAN SUBJOINED LETTER GHA +0F94 TIBETAN SUBJOINED LETTER NGA +0F95 TIBETAN SUBJOINED LETTER CA +0F96 TIBETAN SUBJOINED LETTER CHA +0F97 TIBETAN SUBJOINED LETTER JA +0F99 TIBETAN SUBJOINED LETTER NYA +0F9A TIBETAN SUBJOINED LETTER TTA +0F9B TIBETAN SUBJOINED LETTER TTHA +0F9C TIBETAN SUBJOINED LETTER DDA +0F9D TIBETAN SUBJOINED LETTER DDHA +0F9E TIBETAN SUBJOINED LETTER NNA +0F9F TIBETAN SUBJOINED LETTER TA +0FA0 TIBETAN SUBJOINED LETTER THA +0FA1 TIBETAN SUBJOINED LETTER DA +0FA2 TIBETAN SUBJOINED LETTER DHA +0FA3 TIBETAN SUBJOINED LETTER NA +0FA4 TIBETAN SUBJOINED LETTER PA +0FA5 TIBETAN SUBJOINED LETTER PHA +0FA6 TIBETAN SUBJOINED LETTER BA +0FA7 TIBETAN SUBJOINED LETTER BHA +0FA8 TIBETAN SUBJOINED LETTER MA +0FA9 TIBETAN SUBJOINED LETTER TSA +0FAA TIBETAN SUBJOINED LETTER TSHA +0FAB TIBETAN SUBJOINED LETTER DZA +0FAC TIBETAN SUBJOINED LETTER DZHA +0FAD TIBETAN SUBJOINED LETTER WA +0FAE TIBETAN SUBJOINED LETTER ZHA +0FAF TIBETAN SUBJOINED LETTER ZA +0FB0 TIBETAN SUBJOINED LETTER -A +0FB1 TIBETAN SUBJOINED LETTER YA +0FB2 TIBETAN SUBJOINED LETTER RA +0FB3 TIBETAN SUBJOINED LETTER LA +0FB4 TIBETAN SUBJOINED LETTER SHA +0FB5 TIBETAN SUBJOINED LETTER SSA +0FB6 TIBETAN SUBJOINED LETTER SA +0FB7 TIBETAN SUBJOINED LETTER HA +0FB8 TIBETAN SUBJOINED LETTER A +0FB9 TIBETAN SUBJOINED LETTER KSSA +0FBA TIBETAN SUBJOINED LETTER FIXED-FORM WA +0FBB TIBETAN SUBJOINED LETTER FIXED-FORM YA +0FBC TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FBE TIBETAN KU RU KHA +0FBF TIBETAN KU RU KHA BZHI MIG CAN +0FC0 TIBETAN CANTILLATION SIGN HEAVY BEAT +0FC1 TIBETAN CANTILLATION SIGN LIGHT BEAT +0FC2 TIBETAN CANTILLATION SIGN CANG TE-U +0FC3 TIBETAN CANTILLATION SIGN SBUB -CHAL +0FC4 TIBETAN SYMBOL DRIL BU +0FC5 TIBETAN SYMBOL RDO RJE +0FC6 TIBETAN SYMBOL PADMA GDAN +0FC7 TIBETAN SYMBOL RDO RJE RGYA GRAM +0FC8 TIBETAN SYMBOL PHUR PA +0FC9 TIBETAN SYMBOL NOR BU +0FCA TIBETAN SYMBOL NOR BU NYIS -KHYIL +0FCB TIBETAN SYMBOL NOR BU GSUM -KHYIL +0FCC TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCF TIBETAN SIGN RDEL NAG GSUM +0FD0 TIBETAN MARK BSKA- SHOG GI MGO RGYAN +0FD1 TIBETAN MARK MNYAM YIG GI MGO RGYAN +1000 MYANMAR LETTER KA +1001 MYANMAR LETTER KHA +1002 MYANMAR LETTER GA +1003 MYANMAR LETTER GHA +1004 MYANMAR LETTER NGA +1005 MYANMAR LETTER CA +1006 MYANMAR LETTER CHA +1007 MYANMAR LETTER JA +1008 MYANMAR LETTER JHA +1009 MYANMAR LETTER NYA +100A MYANMAR LETTER NNYA +100B MYANMAR LETTER TTA +100C MYANMAR LETTER TTHA +100D MYANMAR LETTER DDA +100E MYANMAR LETTER DDHA +100F MYANMAR LETTER NNA +1010 MYANMAR LETTER TA +1011 MYANMAR LETTER THA +1012 MYANMAR LETTER DA +1013 MYANMAR LETTER DHA +1014 MYANMAR LETTER NA +1015 MYANMAR LETTER PA +1016 MYANMAR LETTER PHA +1017 MYANMAR LETTER BA +1018 MYANMAR LETTER BHA +1019 MYANMAR LETTER MA +101A MYANMAR LETTER YA +101B MYANMAR LETTER RA +101C MYANMAR LETTER LA +101D MYANMAR LETTER WA +101E MYANMAR LETTER SA +101F MYANMAR LETTER HA +1020 MYANMAR LETTER LLA +1021 MYANMAR LETTER A +1023 MYANMAR LETTER I +1024 MYANMAR LETTER II +1025 MYANMAR LETTER U +1026 MYANMAR LETTER UU +1027 MYANMAR LETTER E +1029 MYANMAR LETTER O +102A MYANMAR LETTER AU +102C MYANMAR VOWEL SIGN AA +102D MYANMAR VOWEL SIGN I +102E MYANMAR VOWEL SIGN II +102F MYANMAR VOWEL SIGN U +1030 MYANMAR VOWEL SIGN UU +1031 MYANMAR VOWEL SIGN E +1032 MYANMAR VOWEL SIGN AI +1036 MYANMAR SIGN ANUSVARA +1037 MYANMAR SIGN DOT BELOW +1038 MYANMAR SIGN VISARGA +1039 MYANMAR SIGN VIRAMA +1040 MYANMAR DIGIT ZERO +1041 MYANMAR DIGIT ONE +1042 MYANMAR DIGIT TWO +1043 MYANMAR DIGIT THREE +1044 MYANMAR DIGIT FOUR +1045 MYANMAR DIGIT FIVE +1046 MYANMAR DIGIT SIX +1047 MYANMAR DIGIT SEVEN +1048 MYANMAR DIGIT EIGHT +1049 MYANMAR DIGIT NINE +104A MYANMAR SIGN LITTLE SECTION +104B MYANMAR SIGN SECTION +104C MYANMAR SYMBOL LOCATIVE +104D MYANMAR SYMBOL COMPLETED +104E MYANMAR SYMBOL AFOREMENTIONED +104F MYANMAR SYMBOL GENITIVE +1050 MYANMAR LETTER SHA +1051 MYANMAR LETTER SSA +1052 MYANMAR LETTER VOCALIC R +1053 MYANMAR LETTER VOCALIC RR +1054 MYANMAR LETTER VOCALIC L +1055 MYANMAR LETTER VOCALIC LL +1056 MYANMAR VOWEL SIGN VOCALIC R +1057 MYANMAR VOWEL SIGN VOCALIC RR +1058 MYANMAR VOWEL SIGN VOCALIC L +1059 MYANMAR VOWEL SIGN VOCALIC LL +10A0 GEORGIAN CAPITAL LETTER AN +10A1 GEORGIAN CAPITAL LETTER BAN +10A2 GEORGIAN CAPITAL LETTER GAN +10A3 GEORGIAN CAPITAL LETTER DON +10A4 GEORGIAN CAPITAL LETTER EN +10A5 GEORGIAN CAPITAL LETTER VIN +10A6 GEORGIAN CAPITAL LETTER ZEN +10A7 GEORGIAN CAPITAL LETTER TAN +10A8 GEORGIAN CAPITAL LETTER IN +10A9 GEORGIAN CAPITAL LETTER KAN +10AA GEORGIAN CAPITAL LETTER LAS +10AB GEORGIAN CAPITAL LETTER MAN +10AC GEORGIAN CAPITAL LETTER NAR +10AD GEORGIAN CAPITAL LETTER ON +10AE GEORGIAN CAPITAL LETTER PAR +10AF GEORGIAN CAPITAL LETTER ZHAR +10B0 GEORGIAN CAPITAL LETTER RAE +10B1 GEORGIAN CAPITAL LETTER SAN +10B2 GEORGIAN CAPITAL LETTER TAR +10B3 GEORGIAN CAPITAL LETTER UN +10B4 GEORGIAN CAPITAL LETTER PHAR +10B5 GEORGIAN CAPITAL LETTER KHAR +10B6 GEORGIAN CAPITAL LETTER GHAN +10B7 GEORGIAN CAPITAL LETTER QAR +10B8 GEORGIAN CAPITAL LETTER SHIN +10B9 GEORGIAN CAPITAL LETTER CHIN +10BA GEORGIAN CAPITAL LETTER CAN +10BB GEORGIAN CAPITAL LETTER JIL +10BC GEORGIAN CAPITAL LETTER CIL +10BD GEORGIAN CAPITAL LETTER CHAR +10BE GEORGIAN CAPITAL LETTER XAN +10BF GEORGIAN CAPITAL LETTER JHAN +10C0 GEORGIAN CAPITAL LETTER HAE +10C1 GEORGIAN CAPITAL LETTER HE +10C2 GEORGIAN CAPITAL LETTER HIE +10C3 GEORGIAN CAPITAL LETTER WE +10C4 GEORGIAN CAPITAL LETTER HAR +10C5 GEORGIAN CAPITAL LETTER HOE +10D0 GEORGIAN LETTER AN +10D1 GEORGIAN LETTER BAN +10D2 GEORGIAN LETTER GAN +10D3 GEORGIAN LETTER DON +10D4 GEORGIAN LETTER EN +10D5 GEORGIAN LETTER VIN +10D6 GEORGIAN LETTER ZEN +10D7 GEORGIAN LETTER TAN +10D8 GEORGIAN LETTER IN +10D9 GEORGIAN LETTER KAN +10DA GEORGIAN LETTER LAS +10DB GEORGIAN LETTER MAN +10DC GEORGIAN LETTER NAR +10DD GEORGIAN LETTER ON +10DE GEORGIAN LETTER PAR +10DF GEORGIAN LETTER ZHAR +10E0 GEORGIAN LETTER RAE +10E1 GEORGIAN LETTER SAN +10E2 GEORGIAN LETTER TAR +10E3 GEORGIAN LETTER UN +10E4 GEORGIAN LETTER PHAR +10E5 GEORGIAN LETTER KHAR +10E6 GEORGIAN LETTER GHAN +10E7 GEORGIAN LETTER QAR +10E8 GEORGIAN LETTER SHIN +10E9 GEORGIAN LETTER CHIN +10EA GEORGIAN LETTER CAN +10EB GEORGIAN LETTER JIL +10EC GEORGIAN LETTER CIL +10ED GEORGIAN LETTER CHAR +10EE GEORGIAN LETTER XAN +10EF GEORGIAN LETTER JHAN +10F0 GEORGIAN LETTER HAE +10F1 GEORGIAN LETTER HE +10F2 GEORGIAN LETTER HIE +10F3 GEORGIAN LETTER WE +10F4 GEORGIAN LETTER HAR +10F5 GEORGIAN LETTER HOE +10F6 GEORGIAN LETTER FI +10F7 GEORGIAN LETTER YN +10F8 GEORGIAN LETTER ELIFI +10F9 GEORGIAN LETTER TURNED GAN +10FA GEORGIAN LETTER AIN +10FB GEORGIAN PARAGRAPH SEPARATOR +10FC MODIFIER LETTER GEORGIAN NAR +1100 HANGUL CHOSEONG KIYEOK +1101 HANGUL CHOSEONG SSANGKIYEOK +1102 HANGUL CHOSEONG NIEUN +1103 HANGUL CHOSEONG TIKEUT +1104 HANGUL CHOSEONG SSANGTIKEUT +1105 HANGUL CHOSEONG RIEUL +1106 HANGUL CHOSEONG MIEUM +1107 HANGUL CHOSEONG PIEUP +1108 HANGUL CHOSEONG SSANGPIEUP +1109 HANGUL CHOSEONG SIOS +110A HANGUL CHOSEONG SSANGSIOS +110B HANGUL CHOSEONG IEUNG +110C HANGUL CHOSEONG CIEUC +110D HANGUL CHOSEONG SSANGCIEUC +110E HANGUL CHOSEONG CHIEUCH +110F HANGUL CHOSEONG KHIEUKH +1110 HANGUL CHOSEONG THIEUTH +1111 HANGUL CHOSEONG PHIEUPH +1112 HANGUL CHOSEONG HIEUH +1113 HANGUL CHOSEONG NIEUN-KIYEOK +1114 HANGUL CHOSEONG SSANGNIEUN +1115 HANGUL CHOSEONG NIEUN-TIKEUT +1116 HANGUL CHOSEONG NIEUN-PIEUP +1117 HANGUL CHOSEONG TIKEUT-KIYEOK +1118 HANGUL CHOSEONG RIEUL-NIEUN +1119 HANGUL CHOSEONG SSANGRIEUL +111A HANGUL CHOSEONG RIEUL-HIEUH +111B HANGUL CHOSEONG KAPYEOUNRIEUL +111C HANGUL CHOSEONG MIEUM-PIEUP +111D HANGUL CHOSEONG KAPYEOUNMIEUM +111E HANGUL CHOSEONG PIEUP-KIYEOK +111F HANGUL CHOSEONG PIEUP-NIEUN +1120 HANGUL CHOSEONG PIEUP-TIKEUT +1121 HANGUL CHOSEONG PIEUP-SIOS +1122 HANGUL CHOSEONG PIEUP-SIOS-KIYEOK +1123 HANGUL CHOSEONG PIEUP-SIOS-TIKEUT +1124 HANGUL CHOSEONG PIEUP-SIOS-PIEUP +1125 HANGUL CHOSEONG PIEUP-SSANGSIOS +1126 HANGUL CHOSEONG PIEUP-SIOS-CIEUC +1127 HANGUL CHOSEONG PIEUP-CIEUC +1128 HANGUL CHOSEONG PIEUP-CHIEUCH +1129 HANGUL CHOSEONG PIEUP-THIEUTH +112A HANGUL CHOSEONG PIEUP-PHIEUPH +112B HANGUL CHOSEONG KAPYEOUNPIEUP +112C HANGUL CHOSEONG KAPYEOUNSSANGPIEUP +112D HANGUL CHOSEONG SIOS-KIYEOK +112E HANGUL CHOSEONG SIOS-NIEUN +112F HANGUL CHOSEONG SIOS-TIKEUT +1130 HANGUL CHOSEONG SIOS-RIEUL +1131 HANGUL CHOSEONG SIOS-MIEUM +1132 HANGUL CHOSEONG SIOS-PIEUP +1133 HANGUL CHOSEONG SIOS-PIEUP-KIYEOK +1134 HANGUL CHOSEONG SIOS-SSANGSIOS +1135 HANGUL CHOSEONG SIOS-IEUNG +1136 HANGUL CHOSEONG SIOS-CIEUC +1137 HANGUL CHOSEONG SIOS-CHIEUCH +1138 HANGUL CHOSEONG SIOS-KHIEUKH +1139 HANGUL CHOSEONG SIOS-THIEUTH +113A HANGUL CHOSEONG SIOS-PHIEUPH +113B HANGUL CHOSEONG SIOS-HIEUH +113C HANGUL CHOSEONG CHITUEUMSIOS +113D HANGUL CHOSEONG CHITUEUMSSANGSIOS +113E HANGUL CHOSEONG CEONGCHIEUMSIOS +113F HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS +1140 HANGUL CHOSEONG PANSIOS +1141 HANGUL CHOSEONG IEUNG-KIYEOK +1142 HANGUL CHOSEONG IEUNG-TIKEUT +1143 HANGUL CHOSEONG IEUNG-MIEUM +1144 HANGUL CHOSEONG IEUNG-PIEUP +1145 HANGUL CHOSEONG IEUNG-SIOS +1146 HANGUL CHOSEONG IEUNG-PANSIOS +1147 HANGUL CHOSEONG SSANGIEUNG +1148 HANGUL CHOSEONG IEUNG-CIEUC +1149 HANGUL CHOSEONG IEUNG-CHIEUCH +114A HANGUL CHOSEONG IEUNG-THIEUTH +114B HANGUL CHOSEONG IEUNG-PHIEUPH +114C HANGUL CHOSEONG YESIEUNG +114D HANGUL CHOSEONG CIEUC-IEUNG +114E HANGUL CHOSEONG CHITUEUMCIEUC +114F HANGUL CHOSEONG CHITUEUMSSANGCIEUC +1150 HANGUL CHOSEONG CEONGCHIEUMCIEUC +1151 HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC +1152 HANGUL CHOSEONG CHIEUCH-KHIEUKH +1153 HANGUL CHOSEONG CHIEUCH-HIEUH +1154 HANGUL CHOSEONG CHITUEUMCHIEUCH +1155 HANGUL CHOSEONG CEONGCHIEUMCHIEUCH +1156 HANGUL CHOSEONG PHIEUPH-PIEUP +1157 HANGUL CHOSEONG KAPYEOUNPHIEUPH +1158 HANGUL CHOSEONG SSANGHIEUH +1159 HANGUL CHOSEONG YEORINHIEUH +115F HANGUL CHOSEONG FILLER +1160 HANGUL JUNGSEONG FILLER +1161 HANGUL JUNGSEONG A +1162 HANGUL JUNGSEONG AE +1163 HANGUL JUNGSEONG YA +1164 HANGUL JUNGSEONG YAE +1165 HANGUL JUNGSEONG EO +1166 HANGUL JUNGSEONG E +1167 HANGUL JUNGSEONG YEO +1168 HANGUL JUNGSEONG YE +1169 HANGUL JUNGSEONG O +116A HANGUL JUNGSEONG WA +116B HANGUL JUNGSEONG WAE +116C HANGUL JUNGSEONG OE +116D HANGUL JUNGSEONG YO +116E HANGUL JUNGSEONG U +116F HANGUL JUNGSEONG WEO +1170 HANGUL JUNGSEONG WE +1171 HANGUL JUNGSEONG WI +1172 HANGUL JUNGSEONG YU +1173 HANGUL JUNGSEONG EU +1174 HANGUL JUNGSEONG YI +1175 HANGUL JUNGSEONG I +1176 HANGUL JUNGSEONG A-O +1177 HANGUL JUNGSEONG A-U +1178 HANGUL JUNGSEONG YA-O +1179 HANGUL JUNGSEONG YA-YO +117A HANGUL JUNGSEONG EO-O +117B HANGUL JUNGSEONG EO-U +117C HANGUL JUNGSEONG EO-EU +117D HANGUL JUNGSEONG YEO-O +117E HANGUL JUNGSEONG YEO-U +117F HANGUL JUNGSEONG O-EO +1180 HANGUL JUNGSEONG O-E +1181 HANGUL JUNGSEONG O-YE +1182 HANGUL JUNGSEONG O-O +1183 HANGUL JUNGSEONG O-U +1184 HANGUL JUNGSEONG YO-YA +1185 HANGUL JUNGSEONG YO-YAE +1186 HANGUL JUNGSEONG YO-YEO +1187 HANGUL JUNGSEONG YO-O +1188 HANGUL JUNGSEONG YO-I +1189 HANGUL JUNGSEONG U-A +118A HANGUL JUNGSEONG U-AE +118B HANGUL JUNGSEONG U-EO-EU +118C HANGUL JUNGSEONG U-YE +118D HANGUL JUNGSEONG U-U +118E HANGUL JUNGSEONG YU-A +118F HANGUL JUNGSEONG YU-EO +1190 HANGUL JUNGSEONG YU-E +1191 HANGUL JUNGSEONG YU-YEO +1192 HANGUL JUNGSEONG YU-YE +1193 HANGUL JUNGSEONG YU-U +1194 HANGUL JUNGSEONG YU-I +1195 HANGUL JUNGSEONG EU-U +1196 HANGUL JUNGSEONG EU-EU +1197 HANGUL JUNGSEONG YI-U +1198 HANGUL JUNGSEONG I-A +1199 HANGUL JUNGSEONG I-YA +119A HANGUL JUNGSEONG I-O +119B HANGUL JUNGSEONG I-U +119C HANGUL JUNGSEONG I-EU +119D HANGUL JUNGSEONG I-ARAEA +119E HANGUL JUNGSEONG ARAEA +119F HANGUL JUNGSEONG ARAEA-EO +11A0 HANGUL JUNGSEONG ARAEA-U +11A1 HANGUL JUNGSEONG ARAEA-I +11A2 HANGUL JUNGSEONG SSANGARAEA +11A8 HANGUL JONGSEONG KIYEOK +11A9 HANGUL JONGSEONG SSANGKIYEOK +11AA HANGUL JONGSEONG KIYEOK-SIOS +11AB HANGUL JONGSEONG NIEUN +11AC HANGUL JONGSEONG NIEUN-CIEUC +11AD HANGUL JONGSEONG NIEUN-HIEUH +11AE HANGUL JONGSEONG TIKEUT +11AF HANGUL JONGSEONG RIEUL +11B0 HANGUL JONGSEONG RIEUL-KIYEOK +11B1 HANGUL JONGSEONG RIEUL-MIEUM +11B2 HANGUL JONGSEONG RIEUL-PIEUP +11B3 HANGUL JONGSEONG RIEUL-SIOS +11B4 HANGUL JONGSEONG RIEUL-THIEUTH +11B5 HANGUL JONGSEONG RIEUL-PHIEUPH +11B6 HANGUL JONGSEONG RIEUL-HIEUH +11B7 HANGUL JONGSEONG MIEUM +11B8 HANGUL JONGSEONG PIEUP +11B9 HANGUL JONGSEONG PIEUP-SIOS +11BA HANGUL JONGSEONG SIOS +11BB HANGUL JONGSEONG SSANGSIOS +11BC HANGUL JONGSEONG IEUNG +11BD HANGUL JONGSEONG CIEUC +11BE HANGUL JONGSEONG CHIEUCH +11BF HANGUL JONGSEONG KHIEUKH +11C0 HANGUL JONGSEONG THIEUTH +11C1 HANGUL JONGSEONG PHIEUPH +11C2 HANGUL JONGSEONG HIEUH +11C3 HANGUL JONGSEONG KIYEOK-RIEUL +11C4 HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK +11C5 HANGUL JONGSEONG NIEUN-KIYEOK +11C6 HANGUL JONGSEONG NIEUN-TIKEUT +11C7 HANGUL JONGSEONG NIEUN-SIOS +11C8 HANGUL JONGSEONG NIEUN-PANSIOS +11C9 HANGUL JONGSEONG NIEUN-THIEUTH +11CA HANGUL JONGSEONG TIKEUT-KIYEOK +11CB HANGUL JONGSEONG TIKEUT-RIEUL +11CC HANGUL JONGSEONG RIEUL-KIYEOK-SIOS +11CD HANGUL JONGSEONG RIEUL-NIEUN +11CE HANGUL JONGSEONG RIEUL-TIKEUT +11CF HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH +11D0 HANGUL JONGSEONG SSANGRIEUL +11D1 HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK +11D2 HANGUL JONGSEONG RIEUL-MIEUM-SIOS +11D3 HANGUL JONGSEONG RIEUL-PIEUP-SIOS +11D4 HANGUL JONGSEONG RIEUL-PIEUP-HIEUH +11D5 HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP +11D6 HANGUL JONGSEONG RIEUL-SSANGSIOS +11D7 HANGUL JONGSEONG RIEUL-PANSIOS +11D8 HANGUL JONGSEONG RIEUL-KHIEUKH +11D9 HANGUL JONGSEONG RIEUL-YEORINHIEUH +11DA HANGUL JONGSEONG MIEUM-KIYEOK +11DB HANGUL JONGSEONG MIEUM-RIEUL +11DC HANGUL JONGSEONG MIEUM-PIEUP +11DD HANGUL JONGSEONG MIEUM-SIOS +11DE HANGUL JONGSEONG MIEUM-SSANGSIOS +11DF HANGUL JONGSEONG MIEUM-PANSIOS +11E0 HANGUL JONGSEONG MIEUM-CHIEUCH +11E1 HANGUL JONGSEONG MIEUM-HIEUH +11E2 HANGUL JONGSEONG KAPYEOUNMIEUM +11E3 HANGUL JONGSEONG PIEUP-RIEUL +11E4 HANGUL JONGSEONG PIEUP-PHIEUPH +11E5 HANGUL JONGSEONG PIEUP-HIEUH +11E6 HANGUL JONGSEONG KAPYEOUNPIEUP +11E7 HANGUL JONGSEONG SIOS-KIYEOK +11E8 HANGUL JONGSEONG SIOS-TIKEUT +11E9 HANGUL JONGSEONG SIOS-RIEUL +11EA HANGUL JONGSEONG SIOS-PIEUP +11EB HANGUL JONGSEONG PANSIOS +11EC HANGUL JONGSEONG IEUNG-KIYEOK +11ED HANGUL JONGSEONG IEUNG-SSANGKIYEOK +11EE HANGUL JONGSEONG SSANGIEUNG +11EF HANGUL JONGSEONG IEUNG-KHIEUKH +11F0 HANGUL JONGSEONG YESIEUNG +11F1 HANGUL JONGSEONG YESIEUNG-SIOS +11F2 HANGUL JONGSEONG YESIEUNG-PANSIOS +11F3 HANGUL JONGSEONG PHIEUPH-PIEUP +11F4 HANGUL JONGSEONG KAPYEOUNPHIEUPH +11F5 HANGUL JONGSEONG HIEUH-NIEUN +11F6 HANGUL JONGSEONG HIEUH-RIEUL +11F7 HANGUL JONGSEONG HIEUH-MIEUM +11F8 HANGUL JONGSEONG HIEUH-PIEUP +11F9 HANGUL JONGSEONG YEORINHIEUH +1200 ETHIOPIC SYLLABLE HA +1201 ETHIOPIC SYLLABLE HU +1202 ETHIOPIC SYLLABLE HI +1203 ETHIOPIC SYLLABLE HAA +1204 ETHIOPIC SYLLABLE HEE +1205 ETHIOPIC SYLLABLE HE +1206 ETHIOPIC SYLLABLE HO +1207 ETHIOPIC SYLLABLE HOA +1208 ETHIOPIC SYLLABLE LA +1209 ETHIOPIC SYLLABLE LU +120A ETHIOPIC SYLLABLE LI +120B ETHIOPIC SYLLABLE LAA +120C ETHIOPIC SYLLABLE LEE +120D ETHIOPIC SYLLABLE LE +120E ETHIOPIC SYLLABLE LO +120F ETHIOPIC SYLLABLE LWA +1210 ETHIOPIC SYLLABLE HHA +1211 ETHIOPIC SYLLABLE HHU +1212 ETHIOPIC SYLLABLE HHI +1213 ETHIOPIC SYLLABLE HHAA +1214 ETHIOPIC SYLLABLE HHEE +1215 ETHIOPIC SYLLABLE HHE +1216 ETHIOPIC SYLLABLE HHO +1217 ETHIOPIC SYLLABLE HHWA +1218 ETHIOPIC SYLLABLE MA +1219 ETHIOPIC SYLLABLE MU +121A ETHIOPIC SYLLABLE MI +121B ETHIOPIC SYLLABLE MAA +121C ETHIOPIC SYLLABLE MEE +121D ETHIOPIC SYLLABLE ME +121E ETHIOPIC SYLLABLE MO +121F ETHIOPIC SYLLABLE MWA +1220 ETHIOPIC SYLLABLE SZA +1221 ETHIOPIC SYLLABLE SZU +1222 ETHIOPIC SYLLABLE SZI +1223 ETHIOPIC SYLLABLE SZAA +1224 ETHIOPIC SYLLABLE SZEE +1225 ETHIOPIC SYLLABLE SZE +1226 ETHIOPIC SYLLABLE SZO +1227 ETHIOPIC SYLLABLE SZWA +1228 ETHIOPIC SYLLABLE RA +1229 ETHIOPIC SYLLABLE RU +122A ETHIOPIC SYLLABLE RI +122B ETHIOPIC SYLLABLE RAA +122C ETHIOPIC SYLLABLE REE +122D ETHIOPIC SYLLABLE RE +122E ETHIOPIC SYLLABLE RO +122F ETHIOPIC SYLLABLE RWA +1230 ETHIOPIC SYLLABLE SA +1231 ETHIOPIC SYLLABLE SU +1232 ETHIOPIC SYLLABLE SI +1233 ETHIOPIC SYLLABLE SAA +1234 ETHIOPIC SYLLABLE SEE +1235 ETHIOPIC SYLLABLE SE +1236 ETHIOPIC SYLLABLE SO +1237 ETHIOPIC SYLLABLE SWA +1238 ETHIOPIC SYLLABLE SHA +1239 ETHIOPIC SYLLABLE SHU +123A ETHIOPIC SYLLABLE SHI +123B ETHIOPIC SYLLABLE SHAA +123C ETHIOPIC SYLLABLE SHEE +123D ETHIOPIC SYLLABLE SHE +123E ETHIOPIC SYLLABLE SHO +123F ETHIOPIC SYLLABLE SHWA +1240 ETHIOPIC SYLLABLE QA +1241 ETHIOPIC SYLLABLE QU +1242 ETHIOPIC SYLLABLE QI +1243 ETHIOPIC SYLLABLE QAA +1244 ETHIOPIC SYLLABLE QEE +1245 ETHIOPIC SYLLABLE QE +1246 ETHIOPIC SYLLABLE QO +1247 ETHIOPIC SYLLABLE QOA +1248 ETHIOPIC SYLLABLE QWA +124A ETHIOPIC SYLLABLE QWI +124B ETHIOPIC SYLLABLE QWAA +124C ETHIOPIC SYLLABLE QWEE +124D ETHIOPIC SYLLABLE QWE +1250 ETHIOPIC SYLLABLE QHA +1251 ETHIOPIC SYLLABLE QHU +1252 ETHIOPIC SYLLABLE QHI +1253 ETHIOPIC SYLLABLE QHAA +1254 ETHIOPIC SYLLABLE QHEE +1255 ETHIOPIC SYLLABLE QHE +1256 ETHIOPIC SYLLABLE QHO +1258 ETHIOPIC SYLLABLE QHWA +125A ETHIOPIC SYLLABLE QHWI +125B ETHIOPIC SYLLABLE QHWAA +125C ETHIOPIC SYLLABLE QHWEE +125D ETHIOPIC SYLLABLE QHWE +1260 ETHIOPIC SYLLABLE BA +1261 ETHIOPIC SYLLABLE BU +1262 ETHIOPIC SYLLABLE BI +1263 ETHIOPIC SYLLABLE BAA +1264 ETHIOPIC SYLLABLE BEE +1265 ETHIOPIC SYLLABLE BE +1266 ETHIOPIC SYLLABLE BO +1267 ETHIOPIC SYLLABLE BWA +1268 ETHIOPIC SYLLABLE VA +1269 ETHIOPIC SYLLABLE VU +126A ETHIOPIC SYLLABLE VI +126B ETHIOPIC SYLLABLE VAA +126C ETHIOPIC SYLLABLE VEE +126D ETHIOPIC SYLLABLE VE +126E ETHIOPIC SYLLABLE VO +126F ETHIOPIC SYLLABLE VWA +1270 ETHIOPIC SYLLABLE TA +1271 ETHIOPIC SYLLABLE TU +1272 ETHIOPIC SYLLABLE TI +1273 ETHIOPIC SYLLABLE TAA +1274 ETHIOPIC SYLLABLE TEE +1275 ETHIOPIC SYLLABLE TE +1276 ETHIOPIC SYLLABLE TO +1277 ETHIOPIC SYLLABLE TWA +1278 ETHIOPIC SYLLABLE CA +1279 ETHIOPIC SYLLABLE CU +127A ETHIOPIC SYLLABLE CI +127B ETHIOPIC SYLLABLE CAA +127C ETHIOPIC SYLLABLE CEE +127D ETHIOPIC SYLLABLE CE +127E ETHIOPIC SYLLABLE CO +127F ETHIOPIC SYLLABLE CWA +1280 ETHIOPIC SYLLABLE XA +1281 ETHIOPIC SYLLABLE XU +1282 ETHIOPIC SYLLABLE XI +1283 ETHIOPIC SYLLABLE XAA +1284 ETHIOPIC SYLLABLE XEE +1285 ETHIOPIC SYLLABLE XE +1286 ETHIOPIC SYLLABLE XO +1287 ETHIOPIC SYLLABLE XOA +1288 ETHIOPIC SYLLABLE XWA +128A ETHIOPIC SYLLABLE XWI +128B ETHIOPIC SYLLABLE XWAA +128C ETHIOPIC SYLLABLE XWEE +128D ETHIOPIC SYLLABLE XWE +1290 ETHIOPIC SYLLABLE NA +1291 ETHIOPIC SYLLABLE NU +1292 ETHIOPIC SYLLABLE NI +1293 ETHIOPIC SYLLABLE NAA +1294 ETHIOPIC SYLLABLE NEE +1295 ETHIOPIC SYLLABLE NE +1296 ETHIOPIC SYLLABLE NO +1297 ETHIOPIC SYLLABLE NWA +1298 ETHIOPIC SYLLABLE NYA +1299 ETHIOPIC SYLLABLE NYU +129A ETHIOPIC SYLLABLE NYI +129B ETHIOPIC SYLLABLE NYAA +129C ETHIOPIC SYLLABLE NYEE +129D ETHIOPIC SYLLABLE NYE +129E ETHIOPIC SYLLABLE NYO +129F ETHIOPIC SYLLABLE NYWA +12A0 ETHIOPIC SYLLABLE GLOTTAL A +12A1 ETHIOPIC SYLLABLE GLOTTAL U +12A2 ETHIOPIC SYLLABLE GLOTTAL I +12A3 ETHIOPIC SYLLABLE GLOTTAL AA +12A4 ETHIOPIC SYLLABLE GLOTTAL EE +12A5 ETHIOPIC SYLLABLE GLOTTAL E +12A6 ETHIOPIC SYLLABLE GLOTTAL O +12A7 ETHIOPIC SYLLABLE GLOTTAL WA +12A8 ETHIOPIC SYLLABLE KA +12A9 ETHIOPIC SYLLABLE KU +12AA ETHIOPIC SYLLABLE KI +12AB ETHIOPIC SYLLABLE KAA +12AC ETHIOPIC SYLLABLE KEE +12AD ETHIOPIC SYLLABLE KE +12AE ETHIOPIC SYLLABLE KO +12AF ETHIOPIC SYLLABLE KOA +12B0 ETHIOPIC SYLLABLE KWA +12B2 ETHIOPIC SYLLABLE KWI +12B3 ETHIOPIC SYLLABLE KWAA +12B4 ETHIOPIC SYLLABLE KWEE +12B5 ETHIOPIC SYLLABLE KWE +12B8 ETHIOPIC SYLLABLE KXA +12B9 ETHIOPIC SYLLABLE KXU +12BA ETHIOPIC SYLLABLE KXI +12BB ETHIOPIC SYLLABLE KXAA +12BC ETHIOPIC SYLLABLE KXEE +12BD ETHIOPIC SYLLABLE KXE +12BE ETHIOPIC SYLLABLE KXO +12C0 ETHIOPIC SYLLABLE KXWA +12C2 ETHIOPIC SYLLABLE KXWI +12C3 ETHIOPIC SYLLABLE KXWAA +12C4 ETHIOPIC SYLLABLE KXWEE +12C5 ETHIOPIC SYLLABLE KXWE +12C8 ETHIOPIC SYLLABLE WA +12C9 ETHIOPIC SYLLABLE WU +12CA ETHIOPIC SYLLABLE WI +12CB ETHIOPIC SYLLABLE WAA +12CC ETHIOPIC SYLLABLE WEE +12CD ETHIOPIC SYLLABLE WE +12CE ETHIOPIC SYLLABLE WO +12CF ETHIOPIC SYLLABLE WOA +12D0 ETHIOPIC SYLLABLE PHARYNGEAL A +12D1 ETHIOPIC SYLLABLE PHARYNGEAL U +12D2 ETHIOPIC SYLLABLE PHARYNGEAL I +12D3 ETHIOPIC SYLLABLE PHARYNGEAL AA +12D4 ETHIOPIC SYLLABLE PHARYNGEAL EE +12D5 ETHIOPIC SYLLABLE PHARYNGEAL E +12D6 ETHIOPIC SYLLABLE PHARYNGEAL O +12D8 ETHIOPIC SYLLABLE ZA +12D9 ETHIOPIC SYLLABLE ZU +12DA ETHIOPIC SYLLABLE ZI +12DB ETHIOPIC SYLLABLE ZAA +12DC ETHIOPIC SYLLABLE ZEE +12DD ETHIOPIC SYLLABLE ZE +12DE ETHIOPIC SYLLABLE ZO +12DF ETHIOPIC SYLLABLE ZWA +12E0 ETHIOPIC SYLLABLE ZHA +12E1 ETHIOPIC SYLLABLE ZHU +12E2 ETHIOPIC SYLLABLE ZHI +12E3 ETHIOPIC SYLLABLE ZHAA +12E4 ETHIOPIC SYLLABLE ZHEE +12E5 ETHIOPIC SYLLABLE ZHE +12E6 ETHIOPIC SYLLABLE ZHO +12E7 ETHIOPIC SYLLABLE ZHWA +12E8 ETHIOPIC SYLLABLE YA +12E9 ETHIOPIC SYLLABLE YU +12EA ETHIOPIC SYLLABLE YI +12EB ETHIOPIC SYLLABLE YAA +12EC ETHIOPIC SYLLABLE YEE +12ED ETHIOPIC SYLLABLE YE +12EE ETHIOPIC SYLLABLE YO +12EF ETHIOPIC SYLLABLE YOA +12F0 ETHIOPIC SYLLABLE DA +12F1 ETHIOPIC SYLLABLE DU +12F2 ETHIOPIC SYLLABLE DI +12F3 ETHIOPIC SYLLABLE DAA +12F4 ETHIOPIC SYLLABLE DEE +12F5 ETHIOPIC SYLLABLE DE +12F6 ETHIOPIC SYLLABLE DO +12F7 ETHIOPIC SYLLABLE DWA +12F8 ETHIOPIC SYLLABLE DDA +12F9 ETHIOPIC SYLLABLE DDU +12FA ETHIOPIC SYLLABLE DDI +12FB ETHIOPIC SYLLABLE DDAA +12FC ETHIOPIC SYLLABLE DDEE +12FD ETHIOPIC SYLLABLE DDE +12FE ETHIOPIC SYLLABLE DDO +12FF ETHIOPIC SYLLABLE DDWA +1300 ETHIOPIC SYLLABLE JA +1301 ETHIOPIC SYLLABLE JU +1302 ETHIOPIC SYLLABLE JI +1303 ETHIOPIC SYLLABLE JAA +1304 ETHIOPIC SYLLABLE JEE +1305 ETHIOPIC SYLLABLE JE +1306 ETHIOPIC SYLLABLE JO +1307 ETHIOPIC SYLLABLE JWA +1308 ETHIOPIC SYLLABLE GA +1309 ETHIOPIC SYLLABLE GU +130A ETHIOPIC SYLLABLE GI +130B ETHIOPIC SYLLABLE GAA +130C ETHIOPIC SYLLABLE GEE +130D ETHIOPIC SYLLABLE GE +130E ETHIOPIC SYLLABLE GO +130F ETHIOPIC SYLLABLE GOA +1310 ETHIOPIC SYLLABLE GWA +1312 ETHIOPIC SYLLABLE GWI +1313 ETHIOPIC SYLLABLE GWAA +1314 ETHIOPIC SYLLABLE GWEE +1315 ETHIOPIC SYLLABLE GWE +1318 ETHIOPIC SYLLABLE GGA +1319 ETHIOPIC SYLLABLE GGU +131A ETHIOPIC SYLLABLE GGI +131B ETHIOPIC SYLLABLE GGAA +131C ETHIOPIC SYLLABLE GGEE +131D ETHIOPIC SYLLABLE GGE +131E ETHIOPIC SYLLABLE GGO +131F ETHIOPIC SYLLABLE GGWAA +1320 ETHIOPIC SYLLABLE THA +1321 ETHIOPIC SYLLABLE THU +1322 ETHIOPIC SYLLABLE THI +1323 ETHIOPIC SYLLABLE THAA +1324 ETHIOPIC SYLLABLE THEE +1325 ETHIOPIC SYLLABLE THE +1326 ETHIOPIC SYLLABLE THO +1327 ETHIOPIC SYLLABLE THWA +1328 ETHIOPIC SYLLABLE CHA +1329 ETHIOPIC SYLLABLE CHU +132A ETHIOPIC SYLLABLE CHI +132B ETHIOPIC SYLLABLE CHAA +132C ETHIOPIC SYLLABLE CHEE +132D ETHIOPIC SYLLABLE CHE +132E ETHIOPIC SYLLABLE CHO +132F ETHIOPIC SYLLABLE CHWA +1330 ETHIOPIC SYLLABLE PHA +1331 ETHIOPIC SYLLABLE PHU +1332 ETHIOPIC SYLLABLE PHI +1333 ETHIOPIC SYLLABLE PHAA +1334 ETHIOPIC SYLLABLE PHEE +1335 ETHIOPIC SYLLABLE PHE +1336 ETHIOPIC SYLLABLE PHO +1337 ETHIOPIC SYLLABLE PHWA +1338 ETHIOPIC SYLLABLE TSA +1339 ETHIOPIC SYLLABLE TSU +133A ETHIOPIC SYLLABLE TSI +133B ETHIOPIC SYLLABLE TSAA +133C ETHIOPIC SYLLABLE TSEE +133D ETHIOPIC SYLLABLE TSE +133E ETHIOPIC SYLLABLE TSO +133F ETHIOPIC SYLLABLE TSWA +1340 ETHIOPIC SYLLABLE TZA +1341 ETHIOPIC SYLLABLE TZU +1342 ETHIOPIC SYLLABLE TZI +1343 ETHIOPIC SYLLABLE TZAA +1344 ETHIOPIC SYLLABLE TZEE +1345 ETHIOPIC SYLLABLE TZE +1346 ETHIOPIC SYLLABLE TZO +1347 ETHIOPIC SYLLABLE TZOA +1348 ETHIOPIC SYLLABLE FA +1349 ETHIOPIC SYLLABLE FU +134A ETHIOPIC SYLLABLE FI +134B ETHIOPIC SYLLABLE FAA +134C ETHIOPIC SYLLABLE FEE +134D ETHIOPIC SYLLABLE FE +134E ETHIOPIC SYLLABLE FO +134F ETHIOPIC SYLLABLE FWA +1350 ETHIOPIC SYLLABLE PA +1351 ETHIOPIC SYLLABLE PU +1352 ETHIOPIC SYLLABLE PI +1353 ETHIOPIC SYLLABLE PAA +1354 ETHIOPIC SYLLABLE PEE +1355 ETHIOPIC SYLLABLE PE +1356 ETHIOPIC SYLLABLE PO +1357 ETHIOPIC SYLLABLE PWA +1358 ETHIOPIC SYLLABLE RYA +1359 ETHIOPIC SYLLABLE MYA +135A ETHIOPIC SYLLABLE FYA +135F ETHIOPIC COMBINING GEMINATION MARK +1360 ETHIOPIC SECTION MARK +1361 ETHIOPIC WORDSPACE +1362 ETHIOPIC FULL STOP +1363 ETHIOPIC COMMA +1364 ETHIOPIC SEMICOLON +1365 ETHIOPIC COLON +1366 ETHIOPIC PREFACE COLON +1367 ETHIOPIC QUESTION MARK +1368 ETHIOPIC PARAGRAPH SEPARATOR +1369 ETHIOPIC DIGIT ONE +136A ETHIOPIC DIGIT TWO +136B ETHIOPIC DIGIT THREE +136C ETHIOPIC DIGIT FOUR +136D ETHIOPIC DIGIT FIVE +136E ETHIOPIC DIGIT SIX +136F ETHIOPIC DIGIT SEVEN +1370 ETHIOPIC DIGIT EIGHT +1371 ETHIOPIC DIGIT NINE +1372 ETHIOPIC NUMBER TEN +1373 ETHIOPIC NUMBER TWENTY +1374 ETHIOPIC NUMBER THIRTY +1375 ETHIOPIC NUMBER FORTY +1376 ETHIOPIC NUMBER FIFTY +1377 ETHIOPIC NUMBER SIXTY +1378 ETHIOPIC NUMBER SEVENTY +1379 ETHIOPIC NUMBER EIGHTY +137A ETHIOPIC NUMBER NINETY +137B ETHIOPIC NUMBER HUNDRED +137C ETHIOPIC NUMBER TEN THOUSAND +1380 ETHIOPIC SYLLABLE SEBATBEIT MWA +1381 ETHIOPIC SYLLABLE MWI +1382 ETHIOPIC SYLLABLE MWEE +1383 ETHIOPIC SYLLABLE MWE +1384 ETHIOPIC SYLLABLE SEBATBEIT BWA +1385 ETHIOPIC SYLLABLE BWI +1386 ETHIOPIC SYLLABLE BWEE +1387 ETHIOPIC SYLLABLE BWE +1388 ETHIOPIC SYLLABLE SEBATBEIT FWA +1389 ETHIOPIC SYLLABLE FWI +138A ETHIOPIC SYLLABLE FWEE +138B ETHIOPIC SYLLABLE FWE +138C ETHIOPIC SYLLABLE SEBATBEIT PWA +138D ETHIOPIC SYLLABLE PWI +138E ETHIOPIC SYLLABLE PWEE +138F ETHIOPIC SYLLABLE PWE +1390 ETHIOPIC TONAL MARK YIZET +1391 ETHIOPIC TONAL MARK DERET +1392 ETHIOPIC TONAL MARK RIKRIK +1393 ETHIOPIC TONAL MARK SHORT RIKRIK +1394 ETHIOPIC TONAL MARK DIFAT +1395 ETHIOPIC TONAL MARK KENAT +1396 ETHIOPIC TONAL MARK CHIRET +1397 ETHIOPIC TONAL MARK HIDET +1398 ETHIOPIC TONAL MARK DERET-HIDET +1399 ETHIOPIC TONAL MARK KURT +13A0 CHEROKEE LETTER A +13A1 CHEROKEE LETTER E +13A2 CHEROKEE LETTER I +13A3 CHEROKEE LETTER O +13A4 CHEROKEE LETTER U +13A5 CHEROKEE LETTER V +13A6 CHEROKEE LETTER GA +13A7 CHEROKEE LETTER KA +13A8 CHEROKEE LETTER GE +13A9 CHEROKEE LETTER GI +13AA CHEROKEE LETTER GO +13AB CHEROKEE LETTER GU +13AC CHEROKEE LETTER GV +13AD CHEROKEE LETTER HA +13AE CHEROKEE LETTER HE +13AF CHEROKEE LETTER HI +13B0 CHEROKEE LETTER HO +13B1 CHEROKEE LETTER HU +13B2 CHEROKEE LETTER HV +13B3 CHEROKEE LETTER LA +13B4 CHEROKEE LETTER LE +13B5 CHEROKEE LETTER LI +13B6 CHEROKEE LETTER LO +13B7 CHEROKEE LETTER LU +13B8 CHEROKEE LETTER LV +13B9 CHEROKEE LETTER MA +13BA CHEROKEE LETTER ME +13BB CHEROKEE LETTER MI +13BC CHEROKEE LETTER MO +13BD CHEROKEE LETTER MU +13BE CHEROKEE LETTER NA +13BF CHEROKEE LETTER HNA +13C0 CHEROKEE LETTER NAH +13C1 CHEROKEE LETTER NE +13C2 CHEROKEE LETTER NI +13C3 CHEROKEE LETTER NO +13C4 CHEROKEE LETTER NU +13C5 CHEROKEE LETTER NV +13C6 CHEROKEE LETTER QUA +13C7 CHEROKEE LETTER QUE +13C8 CHEROKEE LETTER QUI +13C9 CHEROKEE LETTER QUO +13CA CHEROKEE LETTER QUU +13CB CHEROKEE LETTER QUV +13CC CHEROKEE LETTER SA +13CD CHEROKEE LETTER S +13CE CHEROKEE LETTER SE +13CF CHEROKEE LETTER SI +13D0 CHEROKEE LETTER SO +13D1 CHEROKEE LETTER SU +13D2 CHEROKEE LETTER SV +13D3 CHEROKEE LETTER DA +13D4 CHEROKEE LETTER TA +13D5 CHEROKEE LETTER DE +13D6 CHEROKEE LETTER TE +13D7 CHEROKEE LETTER DI +13D8 CHEROKEE LETTER TI +13D9 CHEROKEE LETTER DO +13DA CHEROKEE LETTER DU +13DB CHEROKEE LETTER DV +13DC CHEROKEE LETTER DLA +13DD CHEROKEE LETTER TLA +13DE CHEROKEE LETTER TLE +13DF CHEROKEE LETTER TLI +13E0 CHEROKEE LETTER TLO +13E1 CHEROKEE LETTER TLU +13E2 CHEROKEE LETTER TLV +13E3 CHEROKEE LETTER TSA +13E4 CHEROKEE LETTER TSE +13E5 CHEROKEE LETTER TSI +13E6 CHEROKEE LETTER TSO +13E7 CHEROKEE LETTER TSU +13E8 CHEROKEE LETTER TSV +13E9 CHEROKEE LETTER WA +13EA CHEROKEE LETTER WE +13EB CHEROKEE LETTER WI +13EC CHEROKEE LETTER WO +13ED CHEROKEE LETTER WU +13EE CHEROKEE LETTER WV +13EF CHEROKEE LETTER YA +13F0 CHEROKEE LETTER YE +13F1 CHEROKEE LETTER YI +13F2 CHEROKEE LETTER YO +13F3 CHEROKEE LETTER YU +13F4 CHEROKEE LETTER YV +1401 CANADIAN SYLLABICS E +1402 CANADIAN SYLLABICS AAI +1403 CANADIAN SYLLABICS I +1404 CANADIAN SYLLABICS II +1405 CANADIAN SYLLABICS O +1406 CANADIAN SYLLABICS OO +1407 CANADIAN SYLLABICS Y-CREE OO +1408 CANADIAN SYLLABICS CARRIER EE +1409 CANADIAN SYLLABICS CARRIER I +140A CANADIAN SYLLABICS A +140B CANADIAN SYLLABICS AA +140C CANADIAN SYLLABICS WE +140D CANADIAN SYLLABICS WEST-CREE WE +140E CANADIAN SYLLABICS WI +140F CANADIAN SYLLABICS WEST-CREE WI +1410 CANADIAN SYLLABICS WII +1411 CANADIAN SYLLABICS WEST-CREE WII +1412 CANADIAN SYLLABICS WO +1413 CANADIAN SYLLABICS WEST-CREE WO +1414 CANADIAN SYLLABICS WOO +1415 CANADIAN SYLLABICS WEST-CREE WOO +1416 CANADIAN SYLLABICS NASKAPI WOO +1417 CANADIAN SYLLABICS WA +1418 CANADIAN SYLLABICS WEST-CREE WA +1419 CANADIAN SYLLABICS WAA +141A CANADIAN SYLLABICS WEST-CREE WAA +141B CANADIAN SYLLABICS NASKAPI WAA +141C CANADIAN SYLLABICS AI +141D CANADIAN SYLLABICS Y-CREE W +141E CANADIAN SYLLABICS GLOTTAL STOP +141F CANADIAN SYLLABICS FINAL ACUTE +1420 CANADIAN SYLLABICS FINAL GRAVE +1421 CANADIAN SYLLABICS FINAL BOTTOM HALF RING +1422 CANADIAN SYLLABICS FINAL TOP HALF RING +1423 CANADIAN SYLLABICS FINAL RIGHT HALF RING +1424 CANADIAN SYLLABICS FINAL RING +1425 CANADIAN SYLLABICS FINAL DOUBLE ACUTE +1426 CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES +1427 CANADIAN SYLLABICS FINAL MIDDLE DOT +1428 CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE +1429 CANADIAN SYLLABICS FINAL PLUS +142A CANADIAN SYLLABICS FINAL DOWN TACK +142B CANADIAN SYLLABICS EN +142C CANADIAN SYLLABICS IN +142D CANADIAN SYLLABICS ON +142E CANADIAN SYLLABICS AN +142F CANADIAN SYLLABICS PE +1430 CANADIAN SYLLABICS PAAI +1431 CANADIAN SYLLABICS PI +1432 CANADIAN SYLLABICS PII +1433 CANADIAN SYLLABICS PO +1434 CANADIAN SYLLABICS POO +1435 CANADIAN SYLLABICS Y-CREE POO +1436 CANADIAN SYLLABICS CARRIER HEE +1437 CANADIAN SYLLABICS CARRIER HI +1438 CANADIAN SYLLABICS PA +1439 CANADIAN SYLLABICS PAA +143A CANADIAN SYLLABICS PWE +143B CANADIAN SYLLABICS WEST-CREE PWE +143C CANADIAN SYLLABICS PWI +143D CANADIAN SYLLABICS WEST-CREE PWI +143E CANADIAN SYLLABICS PWII +143F CANADIAN SYLLABICS WEST-CREE PWII +1440 CANADIAN SYLLABICS PWO +1441 CANADIAN SYLLABICS WEST-CREE PWO +1442 CANADIAN SYLLABICS PWOO +1443 CANADIAN SYLLABICS WEST-CREE PWOO +1444 CANADIAN SYLLABICS PWA +1445 CANADIAN SYLLABICS WEST-CREE PWA +1446 CANADIAN SYLLABICS PWAA +1447 CANADIAN SYLLABICS WEST-CREE PWAA +1448 CANADIAN SYLLABICS Y-CREE PWAA +1449 CANADIAN SYLLABICS P +144A CANADIAN SYLLABICS WEST-CREE P +144B CANADIAN SYLLABICS CARRIER H +144C CANADIAN SYLLABICS TE +144D CANADIAN SYLLABICS TAAI +144E CANADIAN SYLLABICS TI +144F CANADIAN SYLLABICS TII +1450 CANADIAN SYLLABICS TO +1451 CANADIAN SYLLABICS TOO +1452 CANADIAN SYLLABICS Y-CREE TOO +1453 CANADIAN SYLLABICS CARRIER DEE +1454 CANADIAN SYLLABICS CARRIER DI +1455 CANADIAN SYLLABICS TA +1456 CANADIAN SYLLABICS TAA +1457 CANADIAN SYLLABICS TWE +1458 CANADIAN SYLLABICS WEST-CREE TWE +1459 CANADIAN SYLLABICS TWI +145A CANADIAN SYLLABICS WEST-CREE TWI +145B CANADIAN SYLLABICS TWII +145C CANADIAN SYLLABICS WEST-CREE TWII +145D CANADIAN SYLLABICS TWO +145E CANADIAN SYLLABICS WEST-CREE TWO +145F CANADIAN SYLLABICS TWOO +1460 CANADIAN SYLLABICS WEST-CREE TWOO +1461 CANADIAN SYLLABICS TWA +1462 CANADIAN SYLLABICS WEST-CREE TWA +1463 CANADIAN SYLLABICS TWAA +1464 CANADIAN SYLLABICS WEST-CREE TWAA +1465 CANADIAN SYLLABICS NASKAPI TWAA +1466 CANADIAN SYLLABICS T +1467 CANADIAN SYLLABICS TTE +1468 CANADIAN SYLLABICS TTI +1469 CANADIAN SYLLABICS TTO +146A CANADIAN SYLLABICS TTA +146B CANADIAN SYLLABICS KE +146C CANADIAN SYLLABICS KAAI +146D CANADIAN SYLLABICS KI +146E CANADIAN SYLLABICS KII +146F CANADIAN SYLLABICS KO +1470 CANADIAN SYLLABICS KOO +1471 CANADIAN SYLLABICS Y-CREE KOO +1472 CANADIAN SYLLABICS KA +1473 CANADIAN SYLLABICS KAA +1474 CANADIAN SYLLABICS KWE +1475 CANADIAN SYLLABICS WEST-CREE KWE +1476 CANADIAN SYLLABICS KWI +1477 CANADIAN SYLLABICS WEST-CREE KWI +1478 CANADIAN SYLLABICS KWII +1479 CANADIAN SYLLABICS WEST-CREE KWII +147A CANADIAN SYLLABICS KWO +147B CANADIAN SYLLABICS WEST-CREE KWO +147C CANADIAN SYLLABICS KWOO +147D CANADIAN SYLLABICS WEST-CREE KWOO +147E CANADIAN SYLLABICS KWA +147F CANADIAN SYLLABICS WEST-CREE KWA +1480 CANADIAN SYLLABICS KWAA +1481 CANADIAN SYLLABICS WEST-CREE KWAA +1482 CANADIAN SYLLABICS NASKAPI KWAA +1483 CANADIAN SYLLABICS K +1484 CANADIAN SYLLABICS KW +1485 CANADIAN SYLLABICS SOUTH-SLAVEY KEH +1486 CANADIAN SYLLABICS SOUTH-SLAVEY KIH +1487 CANADIAN SYLLABICS SOUTH-SLAVEY KOH +1488 CANADIAN SYLLABICS SOUTH-SLAVEY KAH +1489 CANADIAN SYLLABICS CE +148A CANADIAN SYLLABICS CAAI +148B CANADIAN SYLLABICS CI +148C CANADIAN SYLLABICS CII +148D CANADIAN SYLLABICS CO +148E CANADIAN SYLLABICS COO +148F CANADIAN SYLLABICS Y-CREE COO +1490 CANADIAN SYLLABICS CA +1491 CANADIAN SYLLABICS CAA +1492 CANADIAN SYLLABICS CWE +1493 CANADIAN SYLLABICS WEST-CREE CWE +1494 CANADIAN SYLLABICS CWI +1495 CANADIAN SYLLABICS WEST-CREE CWI +1496 CANADIAN SYLLABICS CWII +1497 CANADIAN SYLLABICS WEST-CREE CWII +1498 CANADIAN SYLLABICS CWO +1499 CANADIAN SYLLABICS WEST-CREE CWO +149A CANADIAN SYLLABICS CWOO +149B CANADIAN SYLLABICS WEST-CREE CWOO +149C CANADIAN SYLLABICS CWA +149D CANADIAN SYLLABICS WEST-CREE CWA +149E CANADIAN SYLLABICS CWAA +149F CANADIAN SYLLABICS WEST-CREE CWAA +14A0 CANADIAN SYLLABICS NASKAPI CWAA +14A1 CANADIAN SYLLABICS C +14A2 CANADIAN SYLLABICS SAYISI TH +14A3 CANADIAN SYLLABICS ME +14A4 CANADIAN SYLLABICS MAAI +14A5 CANADIAN SYLLABICS MI +14A6 CANADIAN SYLLABICS MII +14A7 CANADIAN SYLLABICS MO +14A8 CANADIAN SYLLABICS MOO +14A9 CANADIAN SYLLABICS Y-CREE MOO +14AA CANADIAN SYLLABICS MA +14AB CANADIAN SYLLABICS MAA +14AC CANADIAN SYLLABICS MWE +14AD CANADIAN SYLLABICS WEST-CREE MWE +14AE CANADIAN SYLLABICS MWI +14AF CANADIAN SYLLABICS WEST-CREE MWI +14B0 CANADIAN SYLLABICS MWII +14B1 CANADIAN SYLLABICS WEST-CREE MWII +14B2 CANADIAN SYLLABICS MWO +14B3 CANADIAN SYLLABICS WEST-CREE MWO +14B4 CANADIAN SYLLABICS MWOO +14B5 CANADIAN SYLLABICS WEST-CREE MWOO +14B6 CANADIAN SYLLABICS MWA +14B7 CANADIAN SYLLABICS WEST-CREE MWA +14B8 CANADIAN SYLLABICS MWAA +14B9 CANADIAN SYLLABICS WEST-CREE MWAA +14BA CANADIAN SYLLABICS NASKAPI MWAA +14BB CANADIAN SYLLABICS M +14BC CANADIAN SYLLABICS WEST-CREE M +14BD CANADIAN SYLLABICS MH +14BE CANADIAN SYLLABICS ATHAPASCAN M +14BF CANADIAN SYLLABICS SAYISI M +14C0 CANADIAN SYLLABICS NE +14C1 CANADIAN SYLLABICS NAAI +14C2 CANADIAN SYLLABICS NI +14C3 CANADIAN SYLLABICS NII +14C4 CANADIAN SYLLABICS NO +14C5 CANADIAN SYLLABICS NOO +14C6 CANADIAN SYLLABICS Y-CREE NOO +14C7 CANADIAN SYLLABICS NA +14C8 CANADIAN SYLLABICS NAA +14C9 CANADIAN SYLLABICS NWE +14CA CANADIAN SYLLABICS WEST-CREE NWE +14CB CANADIAN SYLLABICS NWA +14CC CANADIAN SYLLABICS WEST-CREE NWA +14CD CANADIAN SYLLABICS NWAA +14CE CANADIAN SYLLABICS WEST-CREE NWAA +14CF CANADIAN SYLLABICS NASKAPI NWAA +14D0 CANADIAN SYLLABICS N +14D1 CANADIAN SYLLABICS CARRIER NG +14D2 CANADIAN SYLLABICS NH +14D3 CANADIAN SYLLABICS LE +14D4 CANADIAN SYLLABICS LAAI +14D5 CANADIAN SYLLABICS LI +14D6 CANADIAN SYLLABICS LII +14D7 CANADIAN SYLLABICS LO +14D8 CANADIAN SYLLABICS LOO +14D9 CANADIAN SYLLABICS Y-CREE LOO +14DA CANADIAN SYLLABICS LA +14DB CANADIAN SYLLABICS LAA +14DC CANADIAN SYLLABICS LWE +14DD CANADIAN SYLLABICS WEST-CREE LWE +14DE CANADIAN SYLLABICS LWI +14DF CANADIAN SYLLABICS WEST-CREE LWI +14E0 CANADIAN SYLLABICS LWII +14E1 CANADIAN SYLLABICS WEST-CREE LWII +14E2 CANADIAN SYLLABICS LWO +14E3 CANADIAN SYLLABICS WEST-CREE LWO +14E4 CANADIAN SYLLABICS LWOO +14E5 CANADIAN SYLLABICS WEST-CREE LWOO +14E6 CANADIAN SYLLABICS LWA +14E7 CANADIAN SYLLABICS WEST-CREE LWA +14E8 CANADIAN SYLLABICS LWAA +14E9 CANADIAN SYLLABICS WEST-CREE LWAA +14EA CANADIAN SYLLABICS L +14EB CANADIAN SYLLABICS WEST-CREE L +14EC CANADIAN SYLLABICS MEDIAL L +14ED CANADIAN SYLLABICS SE +14EE CANADIAN SYLLABICS SAAI +14EF CANADIAN SYLLABICS SI +14F0 CANADIAN SYLLABICS SII +14F1 CANADIAN SYLLABICS SO +14F2 CANADIAN SYLLABICS SOO +14F3 CANADIAN SYLLABICS Y-CREE SOO +14F4 CANADIAN SYLLABICS SA +14F5 CANADIAN SYLLABICS SAA +14F6 CANADIAN SYLLABICS SWE +14F7 CANADIAN SYLLABICS WEST-CREE SWE +14F8 CANADIAN SYLLABICS SWI +14F9 CANADIAN SYLLABICS WEST-CREE SWI +14FA CANADIAN SYLLABICS SWII +14FB CANADIAN SYLLABICS WEST-CREE SWII +14FC CANADIAN SYLLABICS SWO +14FD CANADIAN SYLLABICS WEST-CREE SWO +14FE CANADIAN SYLLABICS SWOO +14FF CANADIAN SYLLABICS WEST-CREE SWOO +1500 CANADIAN SYLLABICS SWA +1501 CANADIAN SYLLABICS WEST-CREE SWA +1502 CANADIAN SYLLABICS SWAA +1503 CANADIAN SYLLABICS WEST-CREE SWAA +1504 CANADIAN SYLLABICS NASKAPI SWAA +1505 CANADIAN SYLLABICS S +1506 CANADIAN SYLLABICS ATHAPASCAN S +1507 CANADIAN SYLLABICS SW +1508 CANADIAN SYLLABICS BLACKFOOT S +1509 CANADIAN SYLLABICS MOOSE-CREE SK +150A CANADIAN SYLLABICS NASKAPI SKW +150B CANADIAN SYLLABICS NASKAPI S-W +150C CANADIAN SYLLABICS NASKAPI SPWA +150D CANADIAN SYLLABICS NASKAPI STWA +150E CANADIAN SYLLABICS NASKAPI SKWA +150F CANADIAN SYLLABICS NASKAPI SCWA +1510 CANADIAN SYLLABICS SHE +1511 CANADIAN SYLLABICS SHI +1512 CANADIAN SYLLABICS SHII +1513 CANADIAN SYLLABICS SHO +1514 CANADIAN SYLLABICS SHOO +1515 CANADIAN SYLLABICS SHA +1516 CANADIAN SYLLABICS SHAA +1517 CANADIAN SYLLABICS SHWE +1518 CANADIAN SYLLABICS WEST-CREE SHWE +1519 CANADIAN SYLLABICS SHWI +151A CANADIAN SYLLABICS WEST-CREE SHWI +151B CANADIAN SYLLABICS SHWII +151C CANADIAN SYLLABICS WEST-CREE SHWII +151D CANADIAN SYLLABICS SHWO +151E CANADIAN SYLLABICS WEST-CREE SHWO +151F CANADIAN SYLLABICS SHWOO +1520 CANADIAN SYLLABICS WEST-CREE SHWOO +1521 CANADIAN SYLLABICS SHWA +1522 CANADIAN SYLLABICS WEST-CREE SHWA +1523 CANADIAN SYLLABICS SHWAA +1524 CANADIAN SYLLABICS WEST-CREE SHWAA +1525 CANADIAN SYLLABICS SH +1526 CANADIAN SYLLABICS YE +1527 CANADIAN SYLLABICS YAAI +1528 CANADIAN SYLLABICS YI +1529 CANADIAN SYLLABICS YII +152A CANADIAN SYLLABICS YO +152B CANADIAN SYLLABICS YOO +152C CANADIAN SYLLABICS Y-CREE YOO +152D CANADIAN SYLLABICS YA +152E CANADIAN SYLLABICS YAA +152F CANADIAN SYLLABICS YWE +1530 CANADIAN SYLLABICS WEST-CREE YWE +1531 CANADIAN SYLLABICS YWI +1532 CANADIAN SYLLABICS WEST-CREE YWI +1533 CANADIAN SYLLABICS YWII +1534 CANADIAN SYLLABICS WEST-CREE YWII +1535 CANADIAN SYLLABICS YWO +1536 CANADIAN SYLLABICS WEST-CREE YWO +1537 CANADIAN SYLLABICS YWOO +1538 CANADIAN SYLLABICS WEST-CREE YWOO +1539 CANADIAN SYLLABICS YWA +153A CANADIAN SYLLABICS WEST-CREE YWA +153B CANADIAN SYLLABICS YWAA +153C CANADIAN SYLLABICS WEST-CREE YWAA +153D CANADIAN SYLLABICS NASKAPI YWAA +153E CANADIAN SYLLABICS Y +153F CANADIAN SYLLABICS BIBLE-CREE Y +1540 CANADIAN SYLLABICS WEST-CREE Y +1541 CANADIAN SYLLABICS SAYISI YI +1542 CANADIAN SYLLABICS RE +1543 CANADIAN SYLLABICS R-CREE RE +1544 CANADIAN SYLLABICS WEST-CREE LE +1545 CANADIAN SYLLABICS RAAI +1546 CANADIAN SYLLABICS RI +1547 CANADIAN SYLLABICS RII +1548 CANADIAN SYLLABICS RO +1549 CANADIAN SYLLABICS ROO +154A CANADIAN SYLLABICS WEST-CREE LO +154B CANADIAN SYLLABICS RA +154C CANADIAN SYLLABICS RAA +154D CANADIAN SYLLABICS WEST-CREE LA +154E CANADIAN SYLLABICS RWAA +154F CANADIAN SYLLABICS WEST-CREE RWAA +1550 CANADIAN SYLLABICS R +1551 CANADIAN SYLLABICS WEST-CREE R +1552 CANADIAN SYLLABICS MEDIAL R +1553 CANADIAN SYLLABICS FE +1554 CANADIAN SYLLABICS FAAI +1555 CANADIAN SYLLABICS FI +1556 CANADIAN SYLLABICS FII +1557 CANADIAN SYLLABICS FO +1558 CANADIAN SYLLABICS FOO +1559 CANADIAN SYLLABICS FA +155A CANADIAN SYLLABICS FAA +155B CANADIAN SYLLABICS FWAA +155C CANADIAN SYLLABICS WEST-CREE FWAA +155D CANADIAN SYLLABICS F +155E CANADIAN SYLLABICS THE +155F CANADIAN SYLLABICS N-CREE THE +1560 CANADIAN SYLLABICS THI +1561 CANADIAN SYLLABICS N-CREE THI +1562 CANADIAN SYLLABICS THII +1563 CANADIAN SYLLABICS N-CREE THII +1564 CANADIAN SYLLABICS THO +1565 CANADIAN SYLLABICS THOO +1566 CANADIAN SYLLABICS THA +1567 CANADIAN SYLLABICS THAA +1568 CANADIAN SYLLABICS THWAA +1569 CANADIAN SYLLABICS WEST-CREE THWAA +156A CANADIAN SYLLABICS TH +156B CANADIAN SYLLABICS TTHE +156C CANADIAN SYLLABICS TTHI +156D CANADIAN SYLLABICS TTHO +156E CANADIAN SYLLABICS TTHA +156F CANADIAN SYLLABICS TTH +1570 CANADIAN SYLLABICS TYE +1571 CANADIAN SYLLABICS TYI +1572 CANADIAN SYLLABICS TYO +1573 CANADIAN SYLLABICS TYA +1574 CANADIAN SYLLABICS NUNAVIK HE +1575 CANADIAN SYLLABICS NUNAVIK HI +1576 CANADIAN SYLLABICS NUNAVIK HII +1577 CANADIAN SYLLABICS NUNAVIK HO +1578 CANADIAN SYLLABICS NUNAVIK HOO +1579 CANADIAN SYLLABICS NUNAVIK HA +157A CANADIAN SYLLABICS NUNAVIK HAA +157B CANADIAN SYLLABICS NUNAVIK H +157C CANADIAN SYLLABICS NUNAVUT H +157D CANADIAN SYLLABICS HK +157E CANADIAN SYLLABICS QAAI +157F CANADIAN SYLLABICS QI +1580 CANADIAN SYLLABICS QII +1581 CANADIAN SYLLABICS QO +1582 CANADIAN SYLLABICS QOO +1583 CANADIAN SYLLABICS QA +1584 CANADIAN SYLLABICS QAA +1585 CANADIAN SYLLABICS Q +1586 CANADIAN SYLLABICS TLHE +1587 CANADIAN SYLLABICS TLHI +1588 CANADIAN SYLLABICS TLHO +1589 CANADIAN SYLLABICS TLHA +158A CANADIAN SYLLABICS WEST-CREE RE +158B CANADIAN SYLLABICS WEST-CREE RI +158C CANADIAN SYLLABICS WEST-CREE RO +158D CANADIAN SYLLABICS WEST-CREE RA +158E CANADIAN SYLLABICS NGAAI +158F CANADIAN SYLLABICS NGI +1590 CANADIAN SYLLABICS NGII +1591 CANADIAN SYLLABICS NGO +1592 CANADIAN SYLLABICS NGOO +1593 CANADIAN SYLLABICS NGA +1594 CANADIAN SYLLABICS NGAA +1595 CANADIAN SYLLABICS NG +1596 CANADIAN SYLLABICS NNG +1597 CANADIAN SYLLABICS SAYISI SHE +1598 CANADIAN SYLLABICS SAYISI SHI +1599 CANADIAN SYLLABICS SAYISI SHO +159A CANADIAN SYLLABICS SAYISI SHA +159B CANADIAN SYLLABICS WOODS-CREE THE +159C CANADIAN SYLLABICS WOODS-CREE THI +159D CANADIAN SYLLABICS WOODS-CREE THO +159E CANADIAN SYLLABICS WOODS-CREE THA +159F CANADIAN SYLLABICS WOODS-CREE TH +15A0 CANADIAN SYLLABICS LHI +15A1 CANADIAN SYLLABICS LHII +15A2 CANADIAN SYLLABICS LHO +15A3 CANADIAN SYLLABICS LHOO +15A4 CANADIAN SYLLABICS LHA +15A5 CANADIAN SYLLABICS LHAA +15A6 CANADIAN SYLLABICS LH +15A7 CANADIAN SYLLABICS TH-CREE THE +15A8 CANADIAN SYLLABICS TH-CREE THI +15A9 CANADIAN SYLLABICS TH-CREE THII +15AA CANADIAN SYLLABICS TH-CREE THO +15AB CANADIAN SYLLABICS TH-CREE THOO +15AC CANADIAN SYLLABICS TH-CREE THA +15AD CANADIAN SYLLABICS TH-CREE THAA +15AE CANADIAN SYLLABICS TH-CREE TH +15AF CANADIAN SYLLABICS AIVILIK B +15B0 CANADIAN SYLLABICS BLACKFOOT E +15B1 CANADIAN SYLLABICS BLACKFOOT I +15B2 CANADIAN SYLLABICS BLACKFOOT O +15B3 CANADIAN SYLLABICS BLACKFOOT A +15B4 CANADIAN SYLLABICS BLACKFOOT WE +15B5 CANADIAN SYLLABICS BLACKFOOT WI +15B6 CANADIAN SYLLABICS BLACKFOOT WO +15B7 CANADIAN SYLLABICS BLACKFOOT WA +15B8 CANADIAN SYLLABICS BLACKFOOT NE +15B9 CANADIAN SYLLABICS BLACKFOOT NI +15BA CANADIAN SYLLABICS BLACKFOOT NO +15BB CANADIAN SYLLABICS BLACKFOOT NA +15BC CANADIAN SYLLABICS BLACKFOOT KE +15BD CANADIAN SYLLABICS BLACKFOOT KI +15BE CANADIAN SYLLABICS BLACKFOOT KO +15BF CANADIAN SYLLABICS BLACKFOOT KA +15C0 CANADIAN SYLLABICS SAYISI HE +15C1 CANADIAN SYLLABICS SAYISI HI +15C2 CANADIAN SYLLABICS SAYISI HO +15C3 CANADIAN SYLLABICS SAYISI HA +15C4 CANADIAN SYLLABICS CARRIER GHU +15C5 CANADIAN SYLLABICS CARRIER GHO +15C6 CANADIAN SYLLABICS CARRIER GHE +15C7 CANADIAN SYLLABICS CARRIER GHEE +15C8 CANADIAN SYLLABICS CARRIER GHI +15C9 CANADIAN SYLLABICS CARRIER GHA +15CA CANADIAN SYLLABICS CARRIER RU +15CB CANADIAN SYLLABICS CARRIER RO +15CC CANADIAN SYLLABICS CARRIER RE +15CD CANADIAN SYLLABICS CARRIER REE +15CE CANADIAN SYLLABICS CARRIER RI +15CF CANADIAN SYLLABICS CARRIER RA +15D0 CANADIAN SYLLABICS CARRIER WU +15D1 CANADIAN SYLLABICS CARRIER WO +15D2 CANADIAN SYLLABICS CARRIER WE +15D3 CANADIAN SYLLABICS CARRIER WEE +15D4 CANADIAN SYLLABICS CARRIER WI +15D5 CANADIAN SYLLABICS CARRIER WA +15D6 CANADIAN SYLLABICS CARRIER HWU +15D7 CANADIAN SYLLABICS CARRIER HWO +15D8 CANADIAN SYLLABICS CARRIER HWE +15D9 CANADIAN SYLLABICS CARRIER HWEE +15DA CANADIAN SYLLABICS CARRIER HWI +15DB CANADIAN SYLLABICS CARRIER HWA +15DC CANADIAN SYLLABICS CARRIER THU +15DD CANADIAN SYLLABICS CARRIER THO +15DE CANADIAN SYLLABICS CARRIER THE +15DF CANADIAN SYLLABICS CARRIER THEE +15E0 CANADIAN SYLLABICS CARRIER THI +15E1 CANADIAN SYLLABICS CARRIER THA +15E2 CANADIAN SYLLABICS CARRIER TTU +15E3 CANADIAN SYLLABICS CARRIER TTO +15E4 CANADIAN SYLLABICS CARRIER TTE +15E5 CANADIAN SYLLABICS CARRIER TTEE +15E6 CANADIAN SYLLABICS CARRIER TTI +15E7 CANADIAN SYLLABICS CARRIER TTA +15E8 CANADIAN SYLLABICS CARRIER PU +15E9 CANADIAN SYLLABICS CARRIER PO +15EA CANADIAN SYLLABICS CARRIER PE +15EB CANADIAN SYLLABICS CARRIER PEE +15EC CANADIAN SYLLABICS CARRIER PI +15ED CANADIAN SYLLABICS CARRIER PA +15EE CANADIAN SYLLABICS CARRIER P +15EF CANADIAN SYLLABICS CARRIER GU +15F0 CANADIAN SYLLABICS CARRIER GO +15F1 CANADIAN SYLLABICS CARRIER GE +15F2 CANADIAN SYLLABICS CARRIER GEE +15F3 CANADIAN SYLLABICS CARRIER GI +15F4 CANADIAN SYLLABICS CARRIER GA +15F5 CANADIAN SYLLABICS CARRIER KHU +15F6 CANADIAN SYLLABICS CARRIER KHO +15F7 CANADIAN SYLLABICS CARRIER KHE +15F8 CANADIAN SYLLABICS CARRIER KHEE +15F9 CANADIAN SYLLABICS CARRIER KHI +15FA CANADIAN SYLLABICS CARRIER KHA +15FB CANADIAN SYLLABICS CARRIER KKU +15FC CANADIAN SYLLABICS CARRIER KKO +15FD CANADIAN SYLLABICS CARRIER KKE +15FE CANADIAN SYLLABICS CARRIER KKEE +15FF CANADIAN SYLLABICS CARRIER KKI +1600 CANADIAN SYLLABICS CARRIER KKA +1601 CANADIAN SYLLABICS CARRIER KK +1602 CANADIAN SYLLABICS CARRIER NU +1603 CANADIAN SYLLABICS CARRIER NO +1604 CANADIAN SYLLABICS CARRIER NE +1605 CANADIAN SYLLABICS CARRIER NEE +1606 CANADIAN SYLLABICS CARRIER NI +1607 CANADIAN SYLLABICS CARRIER NA +1608 CANADIAN SYLLABICS CARRIER MU +1609 CANADIAN SYLLABICS CARRIER MO +160A CANADIAN SYLLABICS CARRIER ME +160B CANADIAN SYLLABICS CARRIER MEE +160C CANADIAN SYLLABICS CARRIER MI +160D CANADIAN SYLLABICS CARRIER MA +160E CANADIAN SYLLABICS CARRIER YU +160F CANADIAN SYLLABICS CARRIER YO +1610 CANADIAN SYLLABICS CARRIER YE +1611 CANADIAN SYLLABICS CARRIER YEE +1612 CANADIAN SYLLABICS CARRIER YI +1613 CANADIAN SYLLABICS CARRIER YA +1614 CANADIAN SYLLABICS CARRIER JU +1615 CANADIAN SYLLABICS SAYISI JU +1616 CANADIAN SYLLABICS CARRIER JO +1617 CANADIAN SYLLABICS CARRIER JE +1618 CANADIAN SYLLABICS CARRIER JEE +1619 CANADIAN SYLLABICS CARRIER JI +161A CANADIAN SYLLABICS SAYISI JI +161B CANADIAN SYLLABICS CARRIER JA +161C CANADIAN SYLLABICS CARRIER JJU +161D CANADIAN SYLLABICS CARRIER JJO +161E CANADIAN SYLLABICS CARRIER JJE +161F CANADIAN SYLLABICS CARRIER JJEE +1620 CANADIAN SYLLABICS CARRIER JJI +1621 CANADIAN SYLLABICS CARRIER JJA +1622 CANADIAN SYLLABICS CARRIER LU +1623 CANADIAN SYLLABICS CARRIER LO +1624 CANADIAN SYLLABICS CARRIER LE +1625 CANADIAN SYLLABICS CARRIER LEE +1626 CANADIAN SYLLABICS CARRIER LI +1627 CANADIAN SYLLABICS CARRIER LA +1628 CANADIAN SYLLABICS CARRIER DLU +1629 CANADIAN SYLLABICS CARRIER DLO +162A CANADIAN SYLLABICS CARRIER DLE +162B CANADIAN SYLLABICS CARRIER DLEE +162C CANADIAN SYLLABICS CARRIER DLI +162D CANADIAN SYLLABICS CARRIER DLA +162E CANADIAN SYLLABICS CARRIER LHU +162F CANADIAN SYLLABICS CARRIER LHO +1630 CANADIAN SYLLABICS CARRIER LHE +1631 CANADIAN SYLLABICS CARRIER LHEE +1632 CANADIAN SYLLABICS CARRIER LHI +1633 CANADIAN SYLLABICS CARRIER LHA +1634 CANADIAN SYLLABICS CARRIER TLHU +1635 CANADIAN SYLLABICS CARRIER TLHO +1636 CANADIAN SYLLABICS CARRIER TLHE +1637 CANADIAN SYLLABICS CARRIER TLHEE +1638 CANADIAN SYLLABICS CARRIER TLHI +1639 CANADIAN SYLLABICS CARRIER TLHA +163A CANADIAN SYLLABICS CARRIER TLU +163B CANADIAN SYLLABICS CARRIER TLO +163C CANADIAN SYLLABICS CARRIER TLE +163D CANADIAN SYLLABICS CARRIER TLEE +163E CANADIAN SYLLABICS CARRIER TLI +163F CANADIAN SYLLABICS CARRIER TLA +1640 CANADIAN SYLLABICS CARRIER ZU +1641 CANADIAN SYLLABICS CARRIER ZO +1642 CANADIAN SYLLABICS CARRIER ZE +1643 CANADIAN SYLLABICS CARRIER ZEE +1644 CANADIAN SYLLABICS CARRIER ZI +1645 CANADIAN SYLLABICS CARRIER ZA +1646 CANADIAN SYLLABICS CARRIER Z +1647 CANADIAN SYLLABICS CARRIER INITIAL Z +1648 CANADIAN SYLLABICS CARRIER DZU +1649 CANADIAN SYLLABICS CARRIER DZO +164A CANADIAN SYLLABICS CARRIER DZE +164B CANADIAN SYLLABICS CARRIER DZEE +164C CANADIAN SYLLABICS CARRIER DZI +164D CANADIAN SYLLABICS CARRIER DZA +164E CANADIAN SYLLABICS CARRIER SU +164F CANADIAN SYLLABICS CARRIER SO +1650 CANADIAN SYLLABICS CARRIER SE +1651 CANADIAN SYLLABICS CARRIER SEE +1652 CANADIAN SYLLABICS CARRIER SI +1653 CANADIAN SYLLABICS CARRIER SA +1654 CANADIAN SYLLABICS CARRIER SHU +1655 CANADIAN SYLLABICS CARRIER SHO +1656 CANADIAN SYLLABICS CARRIER SHE +1657 CANADIAN SYLLABICS CARRIER SHEE +1658 CANADIAN SYLLABICS CARRIER SHI +1659 CANADIAN SYLLABICS CARRIER SHA +165A CANADIAN SYLLABICS CARRIER SH +165B CANADIAN SYLLABICS CARRIER TSU +165C CANADIAN SYLLABICS CARRIER TSO +165D CANADIAN SYLLABICS CARRIER TSE +165E CANADIAN SYLLABICS CARRIER TSEE +165F CANADIAN SYLLABICS CARRIER TSI +1660 CANADIAN SYLLABICS CARRIER TSA +1661 CANADIAN SYLLABICS CARRIER CHU +1662 CANADIAN SYLLABICS CARRIER CHO +1663 CANADIAN SYLLABICS CARRIER CHE +1664 CANADIAN SYLLABICS CARRIER CHEE +1665 CANADIAN SYLLABICS CARRIER CHI +1666 CANADIAN SYLLABICS CARRIER CHA +1667 CANADIAN SYLLABICS CARRIER TTSU +1668 CANADIAN SYLLABICS CARRIER TTSO +1669 CANADIAN SYLLABICS CARRIER TTSE +166A CANADIAN SYLLABICS CARRIER TTSEE +166B CANADIAN SYLLABICS CARRIER TTSI +166C CANADIAN SYLLABICS CARRIER TTSA +166D CANADIAN SYLLABICS CHI SIGN +166E CANADIAN SYLLABICS FULL STOP +166F CANADIAN SYLLABICS QAI +1670 CANADIAN SYLLABICS NGAI +1671 CANADIAN SYLLABICS NNGI +1672 CANADIAN SYLLABICS NNGII +1673 CANADIAN SYLLABICS NNGO +1674 CANADIAN SYLLABICS NNGOO +1675 CANADIAN SYLLABICS NNGA +1676 CANADIAN SYLLABICS NNGAA +1680 OGHAM SPACE MARK +1681 OGHAM LETTER BEITH +1682 OGHAM LETTER LUIS +1683 OGHAM LETTER FEARN +1684 OGHAM LETTER SAIL +1685 OGHAM LETTER NION +1686 OGHAM LETTER UATH +1687 OGHAM LETTER DAIR +1688 OGHAM LETTER TINNE +1689 OGHAM LETTER COLL +168A OGHAM LETTER CEIRT +168B OGHAM LETTER MUIN +168C OGHAM LETTER GORT +168D OGHAM LETTER NGEADAL +168E OGHAM LETTER STRAIF +168F OGHAM LETTER RUIS +1690 OGHAM LETTER AILM +1691 OGHAM LETTER ONN +1692 OGHAM LETTER UR +1693 OGHAM LETTER EADHADH +1694 OGHAM LETTER IODHADH +1695 OGHAM LETTER EABHADH +1696 OGHAM LETTER OR +1697 OGHAM LETTER UILLEANN +1698 OGHAM LETTER IFIN +1699 OGHAM LETTER EAMHANCHOLL +169A OGHAM LETTER PEITH +169B OGHAM FEATHER MARK +169C OGHAM REVERSED FEATHER MARK +16A0 RUNIC LETTER FEHU FEOH FE F +16A1 RUNIC LETTER V +16A2 RUNIC LETTER URUZ UR U +16A3 RUNIC LETTER YR +16A4 RUNIC LETTER Y +16A5 RUNIC LETTER W +16A6 RUNIC LETTER THURISAZ THURS THORN +16A7 RUNIC LETTER ETH +16A8 RUNIC LETTER ANSUZ A +16A9 RUNIC LETTER OS O +16AA RUNIC LETTER AC A +16AB RUNIC LETTER AESC +16AC RUNIC LETTER LONG-BRANCH-OSS O +16AD RUNIC LETTER SHORT-TWIG-OSS O +16AE RUNIC LETTER O +16AF RUNIC LETTER OE +16B0 RUNIC LETTER ON +16B1 RUNIC LETTER RAIDO RAD REID R +16B2 RUNIC LETTER KAUNA +16B3 RUNIC LETTER CEN +16B4 RUNIC LETTER KAUN K +16B5 RUNIC LETTER G +16B6 RUNIC LETTER ENG +16B7 RUNIC LETTER GEBO GYFU G +16B8 RUNIC LETTER GAR +16B9 RUNIC LETTER WUNJO WYNN W +16BA RUNIC LETTER HAGLAZ H +16BB RUNIC LETTER HAEGL H +16BC RUNIC LETTER LONG-BRANCH-HAGALL H +16BD RUNIC LETTER SHORT-TWIG-HAGALL H +16BE RUNIC LETTER NAUDIZ NYD NAUD N +16BF RUNIC LETTER SHORT-TWIG-NAUD N +16C0 RUNIC LETTER DOTTED-N +16C1 RUNIC LETTER ISAZ IS ISS I +16C2 RUNIC LETTER E +16C3 RUNIC LETTER JERAN J +16C4 RUNIC LETTER GER +16C5 RUNIC LETTER LONG-BRANCH-AR AE +16C6 RUNIC LETTER SHORT-TWIG-AR A +16C7 RUNIC LETTER IWAZ EOH +16C8 RUNIC LETTER PERTHO PEORTH P +16C9 RUNIC LETTER ALGIZ EOLHX +16CA RUNIC LETTER SOWILO S +16CB RUNIC LETTER SIGEL LONG-BRANCH-SOL S +16CC RUNIC LETTER SHORT-TWIG-SOL S +16CD RUNIC LETTER C +16CE RUNIC LETTER Z +16CF RUNIC LETTER TIWAZ TIR TYR T +16D0 RUNIC LETTER SHORT-TWIG-TYR T +16D1 RUNIC LETTER D +16D2 RUNIC LETTER BERKANAN BEORC BJARKAN B +16D3 RUNIC LETTER SHORT-TWIG-BJARKAN B +16D4 RUNIC LETTER DOTTED-P +16D5 RUNIC LETTER OPEN-P +16D6 RUNIC LETTER EHWAZ EH E +16D7 RUNIC LETTER MANNAZ MAN M +16D8 RUNIC LETTER LONG-BRANCH-MADR M +16D9 RUNIC LETTER SHORT-TWIG-MADR M +16DA RUNIC LETTER LAUKAZ LAGU LOGR L +16DB RUNIC LETTER DOTTED-L +16DC RUNIC LETTER INGWAZ +16DD RUNIC LETTER ING +16DE RUNIC LETTER DAGAZ DAEG D +16DF RUNIC LETTER OTHALAN ETHEL O +16E0 RUNIC LETTER EAR +16E1 RUNIC LETTER IOR +16E2 RUNIC LETTER CWEORTH +16E3 RUNIC LETTER CALC +16E4 RUNIC LETTER CEALC +16E5 RUNIC LETTER STAN +16E6 RUNIC LETTER LONG-BRANCH-YR +16E7 RUNIC LETTER SHORT-TWIG-YR +16E8 RUNIC LETTER ICELANDIC-YR +16E9 RUNIC LETTER Q +16EA RUNIC LETTER X +16EB RUNIC SINGLE PUNCTUATION +16EC RUNIC MULTIPLE PUNCTUATION +16ED RUNIC CROSS PUNCTUATION +16EE RUNIC ARLAUG SYMBOL +16EF RUNIC TVIMADUR SYMBOL +16F0 RUNIC BELGTHOR SYMBOL +1700 TAGALOG LETTER A +1701 TAGALOG LETTER I +1702 TAGALOG LETTER U +1703 TAGALOG LETTER KA +1704 TAGALOG LETTER GA +1705 TAGALOG LETTER NGA +1706 TAGALOG LETTER TA +1707 TAGALOG LETTER DA +1708 TAGALOG LETTER NA +1709 TAGALOG LETTER PA +170A TAGALOG LETTER BA +170B TAGALOG LETTER MA +170C TAGALOG LETTER YA +170E TAGALOG LETTER LA +170F TAGALOG LETTER WA +1710 TAGALOG LETTER SA +1711 TAGALOG LETTER HA +1712 TAGALOG VOWEL SIGN I +1713 TAGALOG VOWEL SIGN U +1714 TAGALOG SIGN VIRAMA +1720 HANUNOO LETTER A +1721 HANUNOO LETTER I +1722 HANUNOO LETTER U +1723 HANUNOO LETTER KA +1724 HANUNOO LETTER GA +1725 HANUNOO LETTER NGA +1726 HANUNOO LETTER TA +1727 HANUNOO LETTER DA +1728 HANUNOO LETTER NA +1729 HANUNOO LETTER PA +172A HANUNOO LETTER BA +172B HANUNOO LETTER MA +172C HANUNOO LETTER YA +172D HANUNOO LETTER RA +172E HANUNOO LETTER LA +172F HANUNOO LETTER WA +1730 HANUNOO LETTER SA +1731 HANUNOO LETTER HA +1732 HANUNOO VOWEL SIGN I +1733 HANUNOO VOWEL SIGN U +1734 HANUNOO SIGN PAMUDPOD +1735 PHILIPPINE SINGLE PUNCTUATION +1736 PHILIPPINE DOUBLE PUNCTUATION +1740 BUHID LETTER A +1741 BUHID LETTER I +1742 BUHID LETTER U +1743 BUHID LETTER KA +1744 BUHID LETTER GA +1745 BUHID LETTER NGA +1746 BUHID LETTER TA +1747 BUHID LETTER DA +1748 BUHID LETTER NA +1749 BUHID LETTER PA +174A BUHID LETTER BA +174B BUHID LETTER MA +174C BUHID LETTER YA +174D BUHID LETTER RA +174E BUHID LETTER LA +174F BUHID LETTER WA +1750 BUHID LETTER SA +1751 BUHID LETTER HA +1752 BUHID VOWEL SIGN I +1753 BUHID VOWEL SIGN U +1760 TAGBANWA LETTER A +1761 TAGBANWA LETTER I +1762 TAGBANWA LETTER U +1763 TAGBANWA LETTER KA +1764 TAGBANWA LETTER GA +1765 TAGBANWA LETTER NGA +1766 TAGBANWA LETTER TA +1767 TAGBANWA LETTER DA +1768 TAGBANWA LETTER NA +1769 TAGBANWA LETTER PA +176A TAGBANWA LETTER BA +176B TAGBANWA LETTER MA +176C TAGBANWA LETTER YA +176E TAGBANWA LETTER LA +176F TAGBANWA LETTER WA +1770 TAGBANWA LETTER SA +1772 TAGBANWA VOWEL SIGN I +1773 TAGBANWA VOWEL SIGN U +1780 KHMER LETTER KA +1781 KHMER LETTER KHA +1782 KHMER LETTER KO +1783 KHMER LETTER KHO +1784 KHMER LETTER NGO +1785 KHMER LETTER CA +1786 KHMER LETTER CHA +1787 KHMER LETTER CO +1788 KHMER LETTER CHO +1789 KHMER LETTER NYO +178A KHMER LETTER DA +178B KHMER LETTER TTHA +178C KHMER LETTER DO +178D KHMER LETTER TTHO +178E KHMER LETTER NNO +178F KHMER LETTER TA +1790 KHMER LETTER THA +1791 KHMER LETTER TO +1792 KHMER LETTER THO +1793 KHMER LETTER NO +1794 KHMER LETTER BA +1795 KHMER LETTER PHA +1796 KHMER LETTER PO +1797 KHMER LETTER PHO +1798 KHMER LETTER MO +1799 KHMER LETTER YO +179A KHMER LETTER RO +179B KHMER LETTER LO +179C KHMER LETTER VO +179D KHMER LETTER SHA +179E KHMER LETTER SSO +179F KHMER LETTER SA +17A0 KHMER LETTER HA +17A1 KHMER LETTER LA +17A2 KHMER LETTER QA +17A3 KHMER INDEPENDENT VOWEL QAQ +17A4 KHMER INDEPENDENT VOWEL QAA +17A5 KHMER INDEPENDENT VOWEL QI +17A6 KHMER INDEPENDENT VOWEL QII +17A7 KHMER INDEPENDENT VOWEL QU +17A8 KHMER INDEPENDENT VOWEL QUK +17A9 KHMER INDEPENDENT VOWEL QUU +17AA KHMER INDEPENDENT VOWEL QUUV +17AB KHMER INDEPENDENT VOWEL RY +17AC KHMER INDEPENDENT VOWEL RYY +17AD KHMER INDEPENDENT VOWEL LY +17AE KHMER INDEPENDENT VOWEL LYY +17AF KHMER INDEPENDENT VOWEL QE +17B0 KHMER INDEPENDENT VOWEL QAI +17B1 KHMER INDEPENDENT VOWEL QOO TYPE ONE +17B2 KHMER INDEPENDENT VOWEL QOO TYPE TWO +17B3 KHMER INDEPENDENT VOWEL QAU +17B4 KHMER VOWEL INHERENT AQ +17B5 KHMER VOWEL INHERENT AA +17B6 KHMER VOWEL SIGN AA +17B7 KHMER VOWEL SIGN I +17B8 KHMER VOWEL SIGN II +17B9 KHMER VOWEL SIGN Y +17BA KHMER VOWEL SIGN YY +17BB KHMER VOWEL SIGN U +17BC KHMER VOWEL SIGN UU +17BD KHMER VOWEL SIGN UA +17BE KHMER VOWEL SIGN OE +17BF KHMER VOWEL SIGN YA +17C0 KHMER VOWEL SIGN IE +17C1 KHMER VOWEL SIGN E +17C2 KHMER VOWEL SIGN AE +17C3 KHMER VOWEL SIGN AI +17C4 KHMER VOWEL SIGN OO +17C5 KHMER VOWEL SIGN AU +17C6 KHMER SIGN NIKAHIT +17C7 KHMER SIGN REAHMUK +17C8 KHMER SIGN YUUKALEAPINTU +17C9 KHMER SIGN MUUSIKATOAN +17CA KHMER SIGN TRIISAP +17CB KHMER SIGN BANTOC +17CC KHMER SIGN ROBAT +17CD KHMER SIGN TOANDAKHIAT +17CE KHMER SIGN KAKABAT +17CF KHMER SIGN AHSDA +17D0 KHMER SIGN SAMYOK SANNYA +17D1 KHMER SIGN VIRIAM +17D2 KHMER SIGN COENG +17D3 KHMER SIGN BATHAMASAT +17D4 KHMER SIGN KHAN +17D5 KHMER SIGN BARIYOOSAN +17D6 KHMER SIGN CAMNUC PII KUUH +17D7 KHMER SIGN LEK TOO +17D8 KHMER SIGN BEYYAL +17D9 KHMER SIGN PHNAEK MUAN +17DA KHMER SIGN KOOMUUT +17DB KHMER CURRENCY SYMBOL RIEL +17DC KHMER SIGN AVAKRAHASANYA +17DD KHMER SIGN ATTHACAN +17E0 KHMER DIGIT ZERO +17E1 KHMER DIGIT ONE +17E2 KHMER DIGIT TWO +17E3 KHMER DIGIT THREE +17E4 KHMER DIGIT FOUR +17E5 KHMER DIGIT FIVE +17E6 KHMER DIGIT SIX +17E7 KHMER DIGIT SEVEN +17E8 KHMER DIGIT EIGHT +17E9 KHMER DIGIT NINE +17F0 KHMER SYMBOL LEK ATTAK SON +17F1 KHMER SYMBOL LEK ATTAK MUOY +17F2 KHMER SYMBOL LEK ATTAK PII +17F3 KHMER SYMBOL LEK ATTAK BEI +17F4 KHMER SYMBOL LEK ATTAK BUON +17F5 KHMER SYMBOL LEK ATTAK PRAM +17F6 KHMER SYMBOL LEK ATTAK PRAM-MUOY +17F7 KHMER SYMBOL LEK ATTAK PRAM-PII +17F8 KHMER SYMBOL LEK ATTAK PRAM-BEI +17F9 KHMER SYMBOL LEK ATTAK PRAM-BUON +1800 MONGOLIAN BIRGA +1801 MONGOLIAN ELLIPSIS +1802 MONGOLIAN COMMA +1803 MONGOLIAN FULL STOP +1804 MONGOLIAN COLON +1805 MONGOLIAN FOUR DOTS +1806 MONGOLIAN TODO SOFT HYPHEN +1807 MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER +1808 MONGOLIAN MANCHU COMMA +1809 MONGOLIAN MANCHU FULL STOP +180A MONGOLIAN NIRUGU +180B MONGOLIAN FREE VARIATION SELECTOR ONE +180C MONGOLIAN FREE VARIATION SELECTOR TWO +180D MONGOLIAN FREE VARIATION SELECTOR THREE +180E MONGOLIAN VOWEL SEPARATOR +1810 MONGOLIAN DIGIT ZERO +1811 MONGOLIAN DIGIT ONE +1812 MONGOLIAN DIGIT TWO +1813 MONGOLIAN DIGIT THREE +1814 MONGOLIAN DIGIT FOUR +1815 MONGOLIAN DIGIT FIVE +1816 MONGOLIAN DIGIT SIX +1817 MONGOLIAN DIGIT SEVEN +1818 MONGOLIAN DIGIT EIGHT +1819 MONGOLIAN DIGIT NINE +1820 MONGOLIAN LETTER A +1821 MONGOLIAN LETTER E +1822 MONGOLIAN LETTER I +1823 MONGOLIAN LETTER O +1824 MONGOLIAN LETTER U +1825 MONGOLIAN LETTER OE +1826 MONGOLIAN LETTER UE +1827 MONGOLIAN LETTER EE +1828 MONGOLIAN LETTER NA +1829 MONGOLIAN LETTER ANG +182A MONGOLIAN LETTER BA +182B MONGOLIAN LETTER PA +182C MONGOLIAN LETTER QA +182D MONGOLIAN LETTER GA +182E MONGOLIAN LETTER MA +182F MONGOLIAN LETTER LA +1830 MONGOLIAN LETTER SA +1831 MONGOLIAN LETTER SHA +1832 MONGOLIAN LETTER TA +1833 MONGOLIAN LETTER DA +1834 MONGOLIAN LETTER CHA +1835 MONGOLIAN LETTER JA +1836 MONGOLIAN LETTER YA +1837 MONGOLIAN LETTER RA +1838 MONGOLIAN LETTER WA +1839 MONGOLIAN LETTER FA +183A MONGOLIAN LETTER KA +183B MONGOLIAN LETTER KHA +183C MONGOLIAN LETTER TSA +183D MONGOLIAN LETTER ZA +183E MONGOLIAN LETTER HAA +183F MONGOLIAN LETTER ZRA +1840 MONGOLIAN LETTER LHA +1841 MONGOLIAN LETTER ZHI +1842 MONGOLIAN LETTER CHI +1843 MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844 MONGOLIAN LETTER TODO E +1845 MONGOLIAN LETTER TODO I +1846 MONGOLIAN LETTER TODO O +1847 MONGOLIAN LETTER TODO U +1848 MONGOLIAN LETTER TODO OE +1849 MONGOLIAN LETTER TODO UE +184A MONGOLIAN LETTER TODO ANG +184B MONGOLIAN LETTER TODO BA +184C MONGOLIAN LETTER TODO PA +184D MONGOLIAN LETTER TODO QA +184E MONGOLIAN LETTER TODO GA +184F MONGOLIAN LETTER TODO MA +1850 MONGOLIAN LETTER TODO TA +1851 MONGOLIAN LETTER TODO DA +1852 MONGOLIAN LETTER TODO CHA +1853 MONGOLIAN LETTER TODO JA +1854 MONGOLIAN LETTER TODO TSA +1855 MONGOLIAN LETTER TODO YA +1856 MONGOLIAN LETTER TODO WA +1857 MONGOLIAN LETTER TODO KA +1858 MONGOLIAN LETTER TODO GAA +1859 MONGOLIAN LETTER TODO HAA +185A MONGOLIAN LETTER TODO JIA +185B MONGOLIAN LETTER TODO NIA +185C MONGOLIAN LETTER TODO DZA +185D MONGOLIAN LETTER SIBE E +185E MONGOLIAN LETTER SIBE I +185F MONGOLIAN LETTER SIBE IY +1860 MONGOLIAN LETTER SIBE UE +1861 MONGOLIAN LETTER SIBE U +1862 MONGOLIAN LETTER SIBE ANG +1863 MONGOLIAN LETTER SIBE KA +1864 MONGOLIAN LETTER SIBE GA +1865 MONGOLIAN LETTER SIBE HA +1866 MONGOLIAN LETTER SIBE PA +1867 MONGOLIAN LETTER SIBE SHA +1868 MONGOLIAN LETTER SIBE TA +1869 MONGOLIAN LETTER SIBE DA +186A MONGOLIAN LETTER SIBE JA +186B MONGOLIAN LETTER SIBE FA +186C MONGOLIAN LETTER SIBE GAA +186D MONGOLIAN LETTER SIBE HAA +186E MONGOLIAN LETTER SIBE TSA +186F MONGOLIAN LETTER SIBE ZA +1870 MONGOLIAN LETTER SIBE RAA +1871 MONGOLIAN LETTER SIBE CHA +1872 MONGOLIAN LETTER SIBE ZHA +1873 MONGOLIAN LETTER MANCHU I +1874 MONGOLIAN LETTER MANCHU KA +1875 MONGOLIAN LETTER MANCHU RA +1876 MONGOLIAN LETTER MANCHU FA +1877 MONGOLIAN LETTER MANCHU ZHA +1880 MONGOLIAN LETTER ALI GALI ANUSVARA ONE +1881 MONGOLIAN LETTER ALI GALI VISARGA ONE +1882 MONGOLIAN LETTER ALI GALI DAMARU +1883 MONGOLIAN LETTER ALI GALI UBADAMA +1884 MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885 MONGOLIAN LETTER ALI GALI BALUDA +1886 MONGOLIAN LETTER ALI GALI THREE BALUDA +1887 MONGOLIAN LETTER ALI GALI A +1888 MONGOLIAN LETTER ALI GALI I +1889 MONGOLIAN LETTER ALI GALI KA +188A MONGOLIAN LETTER ALI GALI NGA +188B MONGOLIAN LETTER ALI GALI CA +188C MONGOLIAN LETTER ALI GALI TTA +188D MONGOLIAN LETTER ALI GALI TTHA +188E MONGOLIAN LETTER ALI GALI DDA +188F MONGOLIAN LETTER ALI GALI NNA +1890 MONGOLIAN LETTER ALI GALI TA +1891 MONGOLIAN LETTER ALI GALI DA +1892 MONGOLIAN LETTER ALI GALI PA +1893 MONGOLIAN LETTER ALI GALI PHA +1894 MONGOLIAN LETTER ALI GALI SSA +1895 MONGOLIAN LETTER ALI GALI ZHA +1896 MONGOLIAN LETTER ALI GALI ZA +1897 MONGOLIAN LETTER ALI GALI AH +1898 MONGOLIAN LETTER TODO ALI GALI TA +1899 MONGOLIAN LETTER TODO ALI GALI ZHA +189A MONGOLIAN LETTER MANCHU ALI GALI GHA +189B MONGOLIAN LETTER MANCHU ALI GALI NGA +189C MONGOLIAN LETTER MANCHU ALI GALI CA +189D MONGOLIAN LETTER MANCHU ALI GALI JHA +189E MONGOLIAN LETTER MANCHU ALI GALI TTA +189F MONGOLIAN LETTER MANCHU ALI GALI DDHA +18A0 MONGOLIAN LETTER MANCHU ALI GALI TA +18A1 MONGOLIAN LETTER MANCHU ALI GALI DHA +18A2 MONGOLIAN LETTER MANCHU ALI GALI SSA +18A3 MONGOLIAN LETTER MANCHU ALI GALI CYA +18A4 MONGOLIAN LETTER MANCHU ALI GALI ZHA +18A5 MONGOLIAN LETTER MANCHU ALI GALI ZA +18A6 MONGOLIAN LETTER ALI GALI HALF U +18A7 MONGOLIAN LETTER ALI GALI HALF YA +18A8 MONGOLIAN LETTER MANCHU ALI GALI BHA +18A9 MONGOLIAN LETTER ALI GALI DAGALGA +1900 LIMBU VOWEL-CARRIER LETTER +1901 LIMBU LETTER KA +1902 LIMBU LETTER KHA +1903 LIMBU LETTER GA +1904 LIMBU LETTER GHA +1905 LIMBU LETTER NGA +1906 LIMBU LETTER CA +1907 LIMBU LETTER CHA +1908 LIMBU LETTER JA +1909 LIMBU LETTER JHA +190A LIMBU LETTER YAN +190B LIMBU LETTER TA +190C LIMBU LETTER THA +190D LIMBU LETTER DA +190E LIMBU LETTER DHA +190F LIMBU LETTER NA +1910 LIMBU LETTER PA +1911 LIMBU LETTER PHA +1912 LIMBU LETTER BA +1913 LIMBU LETTER BHA +1914 LIMBU LETTER MA +1915 LIMBU LETTER YA +1916 LIMBU LETTER RA +1917 LIMBU LETTER LA +1918 LIMBU LETTER WA +1919 LIMBU LETTER SHA +191A LIMBU LETTER SSA +191B LIMBU LETTER SA +191C LIMBU LETTER HA +1920 LIMBU VOWEL SIGN A +1921 LIMBU VOWEL SIGN I +1922 LIMBU VOWEL SIGN U +1923 LIMBU VOWEL SIGN EE +1924 LIMBU VOWEL SIGN AI +1925 LIMBU VOWEL SIGN OO +1926 LIMBU VOWEL SIGN AU +1927 LIMBU VOWEL SIGN E +1928 LIMBU VOWEL SIGN O +1929 LIMBU SUBJOINED LETTER YA +192A LIMBU SUBJOINED LETTER RA +192B LIMBU SUBJOINED LETTER WA +1930 LIMBU SMALL LETTER KA +1931 LIMBU SMALL LETTER NGA +1932 LIMBU SMALL LETTER ANUSVARA +1933 LIMBU SMALL LETTER TA +1934 LIMBU SMALL LETTER NA +1935 LIMBU SMALL LETTER PA +1936 LIMBU SMALL LETTER MA +1937 LIMBU SMALL LETTER RA +1938 LIMBU SMALL LETTER LA +1939 LIMBU SIGN MUKPHRENG +193A LIMBU SIGN KEMPHRENG +193B LIMBU SIGN SA-I +1940 LIMBU SIGN LOO +1944 LIMBU EXCLAMATION MARK +1945 LIMBU QUESTION MARK +1946 LIMBU DIGIT ZERO +1947 LIMBU DIGIT ONE +1948 LIMBU DIGIT TWO +1949 LIMBU DIGIT THREE +194A LIMBU DIGIT FOUR +194B LIMBU DIGIT FIVE +194C LIMBU DIGIT SIX +194D LIMBU DIGIT SEVEN +194E LIMBU DIGIT EIGHT +194F LIMBU DIGIT NINE +1950 TAI LE LETTER KA +1951 TAI LE LETTER XA +1952 TAI LE LETTER NGA +1953 TAI LE LETTER TSA +1954 TAI LE LETTER SA +1955 TAI LE LETTER YA +1956 TAI LE LETTER TA +1957 TAI LE LETTER THA +1958 TAI LE LETTER LA +1959 TAI LE LETTER PA +195A TAI LE LETTER PHA +195B TAI LE LETTER MA +195C TAI LE LETTER FA +195D TAI LE LETTER VA +195E TAI LE LETTER HA +195F TAI LE LETTER QA +1960 TAI LE LETTER KHA +1961 TAI LE LETTER TSHA +1962 TAI LE LETTER NA +1963 TAI LE LETTER A +1964 TAI LE LETTER I +1965 TAI LE LETTER EE +1966 TAI LE LETTER EH +1967 TAI LE LETTER U +1968 TAI LE LETTER OO +1969 TAI LE LETTER O +196A TAI LE LETTER UE +196B TAI LE LETTER E +196C TAI LE LETTER AUE +196D TAI LE LETTER AI +1970 TAI LE LETTER TONE-2 +1971 TAI LE LETTER TONE-3 +1972 TAI LE LETTER TONE-4 +1973 TAI LE LETTER TONE-5 +1974 TAI LE LETTER TONE-6 +1980 NEW TAI LUE LETTER HIGH QA +1981 NEW TAI LUE LETTER LOW QA +1982 NEW TAI LUE LETTER HIGH KA +1983 NEW TAI LUE LETTER HIGH XA +1984 NEW TAI LUE LETTER HIGH NGA +1985 NEW TAI LUE LETTER LOW KA +1986 NEW TAI LUE LETTER LOW XA +1987 NEW TAI LUE LETTER LOW NGA +1988 NEW TAI LUE LETTER HIGH TSA +1989 NEW TAI LUE LETTER HIGH SA +198A NEW TAI LUE LETTER HIGH YA +198B NEW TAI LUE LETTER LOW TSA +198C NEW TAI LUE LETTER LOW SA +198D NEW TAI LUE LETTER LOW YA +198E NEW TAI LUE LETTER HIGH TA +198F NEW TAI LUE LETTER HIGH THA +1990 NEW TAI LUE LETTER HIGH NA +1991 NEW TAI LUE LETTER LOW TA +1992 NEW TAI LUE LETTER LOW THA +1993 NEW TAI LUE LETTER LOW NA +1994 NEW TAI LUE LETTER HIGH PA +1995 NEW TAI LUE LETTER HIGH PHA +1996 NEW TAI LUE LETTER HIGH MA +1997 NEW TAI LUE LETTER LOW PA +1998 NEW TAI LUE LETTER LOW PHA +1999 NEW TAI LUE LETTER LOW MA +199A NEW TAI LUE LETTER HIGH FA +199B NEW TAI LUE LETTER HIGH VA +199C NEW TAI LUE LETTER HIGH LA +199D NEW TAI LUE LETTER LOW FA +199E NEW TAI LUE LETTER LOW VA +199F NEW TAI LUE LETTER LOW LA +19A0 NEW TAI LUE LETTER HIGH HA +19A1 NEW TAI LUE LETTER HIGH DA +19A2 NEW TAI LUE LETTER HIGH BA +19A3 NEW TAI LUE LETTER LOW HA +19A4 NEW TAI LUE LETTER LOW DA +19A5 NEW TAI LUE LETTER LOW BA +19A6 NEW TAI LUE LETTER HIGH KVA +19A7 NEW TAI LUE LETTER HIGH XVA +19A8 NEW TAI LUE LETTER LOW KVA +19A9 NEW TAI LUE LETTER LOW XVA +19B0 NEW TAI LUE VOWEL SIGN VOWEL SHORTENER +19B1 NEW TAI LUE VOWEL SIGN AA +19B2 NEW TAI LUE VOWEL SIGN II +19B3 NEW TAI LUE VOWEL SIGN U +19B4 NEW TAI LUE VOWEL SIGN UU +19B5 NEW TAI LUE VOWEL SIGN E +19B6 NEW TAI LUE VOWEL SIGN AE +19B7 NEW TAI LUE VOWEL SIGN O +19B8 NEW TAI LUE VOWEL SIGN OA +19B9 NEW TAI LUE VOWEL SIGN UE +19BA NEW TAI LUE VOWEL SIGN AY +19BB NEW TAI LUE VOWEL SIGN AAY +19BC NEW TAI LUE VOWEL SIGN UY +19BD NEW TAI LUE VOWEL SIGN OY +19BE NEW TAI LUE VOWEL SIGN OAY +19BF NEW TAI LUE VOWEL SIGN UEY +19C0 NEW TAI LUE VOWEL SIGN IY +19C1 NEW TAI LUE LETTER FINAL V +19C2 NEW TAI LUE LETTER FINAL NG +19C3 NEW TAI LUE LETTER FINAL N +19C4 NEW TAI LUE LETTER FINAL M +19C5 NEW TAI LUE LETTER FINAL K +19C6 NEW TAI LUE LETTER FINAL D +19C7 NEW TAI LUE LETTER FINAL B +19C8 NEW TAI LUE TONE MARK-1 +19C9 NEW TAI LUE TONE MARK-2 +19D0 NEW TAI LUE DIGIT ZERO +19D1 NEW TAI LUE DIGIT ONE +19D2 NEW TAI LUE DIGIT TWO +19D3 NEW TAI LUE DIGIT THREE +19D4 NEW TAI LUE DIGIT FOUR +19D5 NEW TAI LUE DIGIT FIVE +19D6 NEW TAI LUE DIGIT SIX +19D7 NEW TAI LUE DIGIT SEVEN +19D8 NEW TAI LUE DIGIT EIGHT +19D9 NEW TAI LUE DIGIT NINE +19DE NEW TAI LUE SIGN LAE +19DF NEW TAI LUE SIGN LAEV +19E0 KHMER SYMBOL PATHAMASAT +19E1 KHMER SYMBOL MUOY KOET +19E2 KHMER SYMBOL PII KOET +19E3 KHMER SYMBOL BEI KOET +19E4 KHMER SYMBOL BUON KOET +19E5 KHMER SYMBOL PRAM KOET +19E6 KHMER SYMBOL PRAM-MUOY KOET +19E7 KHMER SYMBOL PRAM-PII KOET +19E8 KHMER SYMBOL PRAM-BEI KOET +19E9 KHMER SYMBOL PRAM-BUON KOET +19EA KHMER SYMBOL DAP KOET +19EB KHMER SYMBOL DAP-MUOY KOET +19EC KHMER SYMBOL DAP-PII KOET +19ED KHMER SYMBOL DAP-BEI KOET +19EE KHMER SYMBOL DAP-BUON KOET +19EF KHMER SYMBOL DAP-PRAM KOET +19F0 KHMER SYMBOL TUTEYASAT +19F1 KHMER SYMBOL MUOY ROC +19F2 KHMER SYMBOL PII ROC +19F3 KHMER SYMBOL BEI ROC +19F4 KHMER SYMBOL BUON ROC +19F5 KHMER SYMBOL PRAM ROC +19F6 KHMER SYMBOL PRAM-MUOY ROC +19F7 KHMER SYMBOL PRAM-PII ROC +19F8 KHMER SYMBOL PRAM-BEI ROC +19F9 KHMER SYMBOL PRAM-BUON ROC +19FA KHMER SYMBOL DAP ROC +19FB KHMER SYMBOL DAP-MUOY ROC +19FC KHMER SYMBOL DAP-PII ROC +19FD KHMER SYMBOL DAP-BEI ROC +19FE KHMER SYMBOL DAP-BUON ROC +19FF KHMER SYMBOL DAP-PRAM ROC +1A00 BUGINESE LETTER KA +1A01 BUGINESE LETTER GA +1A02 BUGINESE LETTER NGA +1A03 BUGINESE LETTER NGKA +1A04 BUGINESE LETTER PA +1A05 BUGINESE LETTER BA +1A06 BUGINESE LETTER MA +1A07 BUGINESE LETTER MPA +1A08 BUGINESE LETTER TA +1A09 BUGINESE LETTER DA +1A0A BUGINESE LETTER NA +1A0B BUGINESE LETTER NRA +1A0C BUGINESE LETTER CA +1A0D BUGINESE LETTER JA +1A0E BUGINESE LETTER NYA +1A0F BUGINESE LETTER NYCA +1A10 BUGINESE LETTER YA +1A11 BUGINESE LETTER RA +1A12 BUGINESE LETTER LA +1A13 BUGINESE LETTER VA +1A14 BUGINESE LETTER SA +1A15 BUGINESE LETTER A +1A16 BUGINESE LETTER HA +1A17 BUGINESE VOWEL SIGN I +1A18 BUGINESE VOWEL SIGN U +1A19 BUGINESE VOWEL SIGN E +1A1A BUGINESE VOWEL SIGN O +1A1B BUGINESE VOWEL SIGN AE +1A1E BUGINESE PALLAWA +1A1F BUGINESE END OF SECTION +1D00 LATIN LETTER SMALL CAPITAL A +1D01 LATIN LETTER SMALL CAPITAL AE +1D02 LATIN SMALL LETTER TURNED AE +1D03 LATIN LETTER SMALL CAPITAL BARRED B +1D04 LATIN LETTER SMALL CAPITAL C +1D05 LATIN LETTER SMALL CAPITAL D +1D06 LATIN LETTER SMALL CAPITAL ETH +1D07 LATIN LETTER SMALL CAPITAL E +1D08 LATIN SMALL LETTER TURNED OPEN E +1D09 LATIN SMALL LETTER TURNED I +1D0A LATIN LETTER SMALL CAPITAL J +1D0B LATIN LETTER SMALL CAPITAL K +1D0C LATIN LETTER SMALL CAPITAL L WITH STROKE +1D0D LATIN LETTER SMALL CAPITAL M +1D0E LATIN LETTER SMALL CAPITAL REVERSED N +1D0F LATIN LETTER SMALL CAPITAL O +1D10 LATIN LETTER SMALL CAPITAL OPEN O +1D11 LATIN SMALL LETTER SIDEWAYS O +1D12 LATIN SMALL LETTER SIDEWAYS OPEN O +1D13 LATIN SMALL LETTER SIDEWAYS O WITH STROKE +1D14 LATIN SMALL LETTER TURNED OE +1D15 LATIN LETTER SMALL CAPITAL OU +1D16 LATIN SMALL LETTER TOP HALF O +1D17 LATIN SMALL LETTER BOTTOM HALF O +1D18 LATIN LETTER SMALL CAPITAL P +1D19 LATIN LETTER SMALL CAPITAL REVERSED R +1D1A LATIN LETTER SMALL CAPITAL TURNED R +1D1B LATIN LETTER SMALL CAPITAL T +1D1C LATIN LETTER SMALL CAPITAL U +1D1D LATIN SMALL LETTER SIDEWAYS U +1D1E LATIN SMALL LETTER SIDEWAYS DIAERESIZED U +1D1F LATIN SMALL LETTER SIDEWAYS TURNED M +1D20 LATIN LETTER SMALL CAPITAL V +1D21 LATIN LETTER SMALL CAPITAL W +1D22 LATIN LETTER SMALL CAPITAL Z +1D23 LATIN LETTER SMALL CAPITAL EZH +1D24 LATIN LETTER VOICED LARYNGEAL SPIRANT +1D25 LATIN LETTER AIN +1D26 GREEK LETTER SMALL CAPITAL GAMMA +1D27 GREEK LETTER SMALL CAPITAL LAMDA +1D28 GREEK LETTER SMALL CAPITAL PI +1D29 GREEK LETTER SMALL CAPITAL RHO +1D2A GREEK LETTER SMALL CAPITAL PSI +1D2B CYRILLIC LETTER SMALL CAPITAL EL +1D2C MODIFIER LETTER CAPITAL A +1D2D MODIFIER LETTER CAPITAL AE +1D2E MODIFIER LETTER CAPITAL B +1D2F MODIFIER LETTER CAPITAL BARRED B +1D30 MODIFIER LETTER CAPITAL D +1D31 MODIFIER LETTER CAPITAL E +1D32 MODIFIER LETTER CAPITAL REVERSED E +1D33 MODIFIER LETTER CAPITAL G +1D34 MODIFIER LETTER CAPITAL H +1D35 MODIFIER LETTER CAPITAL I +1D36 MODIFIER LETTER CAPITAL J +1D37 MODIFIER LETTER CAPITAL K +1D38 MODIFIER LETTER CAPITAL L +1D39 MODIFIER LETTER CAPITAL M +1D3A MODIFIER LETTER CAPITAL N +1D3B MODIFIER LETTER CAPITAL REVERSED N +1D3C MODIFIER LETTER CAPITAL O +1D3D MODIFIER LETTER CAPITAL OU +1D3E MODIFIER LETTER CAPITAL P +1D3F MODIFIER LETTER CAPITAL R +1D40 MODIFIER LETTER CAPITAL T +1D41 MODIFIER LETTER CAPITAL U +1D42 MODIFIER LETTER CAPITAL W +1D43 MODIFIER LETTER SMALL A +1D44 MODIFIER LETTER SMALL TURNED A +1D45 MODIFIER LETTER SMALL ALPHA +1D46 MODIFIER LETTER SMALL TURNED AE +1D47 MODIFIER LETTER SMALL B +1D48 MODIFIER LETTER SMALL D +1D49 MODIFIER LETTER SMALL E +1D4A MODIFIER LETTER SMALL SCHWA +1D4B MODIFIER LETTER SMALL OPEN E +1D4C MODIFIER LETTER SMALL TURNED OPEN E +1D4D MODIFIER LETTER SMALL G +1D4E MODIFIER LETTER SMALL TURNED I +1D4F MODIFIER LETTER SMALL K +1D50 MODIFIER LETTER SMALL M +1D51 MODIFIER LETTER SMALL ENG +1D52 MODIFIER LETTER SMALL O +1D53 MODIFIER LETTER SMALL OPEN O +1D54 MODIFIER LETTER SMALL TOP HALF O +1D55 MODIFIER LETTER SMALL BOTTOM HALF O +1D56 MODIFIER LETTER SMALL P +1D57 MODIFIER LETTER SMALL T +1D58 MODIFIER LETTER SMALL U +1D59 MODIFIER LETTER SMALL SIDEWAYS U +1D5A MODIFIER LETTER SMALL TURNED M +1D5B MODIFIER LETTER SMALL V +1D5C MODIFIER LETTER SMALL AIN +1D5D MODIFIER LETTER SMALL BETA +1D5E MODIFIER LETTER SMALL GREEK GAMMA +1D5F MODIFIER LETTER SMALL DELTA +1D60 MODIFIER LETTER SMALL GREEK PHI +1D61 MODIFIER LETTER SMALL CHI +1D62 LATIN SUBSCRIPT SMALL LETTER I +1D63 LATIN SUBSCRIPT SMALL LETTER R +1D64 LATIN SUBSCRIPT SMALL LETTER U +1D65 LATIN SUBSCRIPT SMALL LETTER V +1D66 GREEK SUBSCRIPT SMALL LETTER BETA +1D67 GREEK SUBSCRIPT SMALL LETTER GAMMA +1D68 GREEK SUBSCRIPT SMALL LETTER RHO +1D69 GREEK SUBSCRIPT SMALL LETTER PHI +1D6A GREEK SUBSCRIPT SMALL LETTER CHI +1D6B LATIN SMALL LETTER UE +1D6C LATIN SMALL LETTER B WITH MIDDLE TILDE +1D6D LATIN SMALL LETTER D WITH MIDDLE TILDE +1D6E LATIN SMALL LETTER F WITH MIDDLE TILDE +1D6F LATIN SMALL LETTER M WITH MIDDLE TILDE +1D70 LATIN SMALL LETTER N WITH MIDDLE TILDE +1D71 LATIN SMALL LETTER P WITH MIDDLE TILDE +1D72 LATIN SMALL LETTER R WITH MIDDLE TILDE +1D73 LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE +1D74 LATIN SMALL LETTER S WITH MIDDLE TILDE +1D75 LATIN SMALL LETTER T WITH MIDDLE TILDE +1D76 LATIN SMALL LETTER Z WITH MIDDLE TILDE +1D77 LATIN SMALL LETTER TURNED G +1D78 MODIFIER LETTER CYRILLIC EN +1D79 LATIN SMALL LETTER INSULAR G +1D7A LATIN SMALL LETTER TH WITH STRIKETHROUGH +1D7B LATIN SMALL CAPITAL LETTER I WITH STROKE +1D7C LATIN SMALL LETTER IOTA WITH STROKE +1D7D LATIN SMALL LETTER P WITH STROKE +1D7E LATIN SMALL CAPITAL LETTER U WITH STROKE +1D7F LATIN SMALL LETTER UPSILON WITH STROKE +1D80 LATIN SMALL LETTER B WITH PALATAL HOOK +1D81 LATIN SMALL LETTER D WITH PALATAL HOOK +1D82 LATIN SMALL LETTER F WITH PALATAL HOOK +1D83 LATIN SMALL LETTER G WITH PALATAL HOOK +1D84 LATIN SMALL LETTER K WITH PALATAL HOOK +1D85 LATIN SMALL LETTER L WITH PALATAL HOOK +1D86 LATIN SMALL LETTER M WITH PALATAL HOOK +1D87 LATIN SMALL LETTER N WITH PALATAL HOOK +1D88 LATIN SMALL LETTER P WITH PALATAL HOOK +1D89 LATIN SMALL LETTER R WITH PALATAL HOOK +1D8A LATIN SMALL LETTER S WITH PALATAL HOOK +1D8B LATIN SMALL LETTER ESH WITH PALATAL HOOK +1D8C LATIN SMALL LETTER V WITH PALATAL HOOK +1D8D LATIN SMALL LETTER X WITH PALATAL HOOK +1D8E LATIN SMALL LETTER Z WITH PALATAL HOOK +1D8F LATIN SMALL LETTER A WITH RETROFLEX HOOK +1D90 LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK +1D91 LATIN SMALL LETTER D WITH HOOK AND TAIL +1D92 LATIN SMALL LETTER E WITH RETROFLEX HOOK +1D93 LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK +1D94 LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK +1D95 LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK +1D96 LATIN SMALL LETTER I WITH RETROFLEX HOOK +1D97 LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK +1D98 LATIN SMALL LETTER ESH WITH RETROFLEX HOOK +1D99 LATIN SMALL LETTER U WITH RETROFLEX HOOK +1D9A LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B MODIFIER LETTER SMALL TURNED ALPHA +1D9C MODIFIER LETTER SMALL C +1D9D MODIFIER LETTER SMALL C WITH CURL +1D9E MODIFIER LETTER SMALL ETH +1D9F MODIFIER LETTER SMALL REVERSED OPEN E +1DA0 MODIFIER LETTER SMALL F +1DA1 MODIFIER LETTER SMALL DOTLESS J WITH STROKE +1DA2 MODIFIER LETTER SMALL SCRIPT G +1DA3 MODIFIER LETTER SMALL TURNED H +1DA4 MODIFIER LETTER SMALL I WITH STROKE +1DA5 MODIFIER LETTER SMALL IOTA +1DA6 MODIFIER LETTER SMALL CAPITAL I +1DA7 MODIFIER LETTER SMALL CAPITAL I WITH STROKE +1DA8 MODIFIER LETTER SMALL J WITH CROSSED-TAIL +1DA9 MODIFIER LETTER SMALL L WITH RETROFLEX HOOK +1DAA MODIFIER LETTER SMALL L WITH PALATAL HOOK +1DAB MODIFIER LETTER SMALL CAPITAL L +1DAC MODIFIER LETTER SMALL M WITH HOOK +1DAD MODIFIER LETTER SMALL TURNED M WITH LONG LEG +1DAE MODIFIER LETTER SMALL N WITH LEFT HOOK +1DAF MODIFIER LETTER SMALL N WITH RETROFLEX HOOK +1DB0 MODIFIER LETTER SMALL CAPITAL N +1DB1 MODIFIER LETTER SMALL BARRED O +1DB2 MODIFIER LETTER SMALL PHI +1DB3 MODIFIER LETTER SMALL S WITH HOOK +1DB4 MODIFIER LETTER SMALL ESH +1DB5 MODIFIER LETTER SMALL T WITH PALATAL HOOK +1DB6 MODIFIER LETTER SMALL U BAR +1DB7 MODIFIER LETTER SMALL UPSILON +1DB8 MODIFIER LETTER SMALL CAPITAL U +1DB9 MODIFIER LETTER SMALL V WITH HOOK +1DBA MODIFIER LETTER SMALL TURNED V +1DBB MODIFIER LETTER SMALL Z +1DBC MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK +1DBD MODIFIER LETTER SMALL Z WITH CURL +1DBE MODIFIER LETTER SMALL EZH +1DBF MODIFIER LETTER SMALL THETA +1DC0 COMBINING DOTTED GRAVE ACCENT +1DC1 COMBINING DOTTED ACUTE ACCENT +1DC2 COMBINING SNAKE BELOW +1DC3 COMBINING SUSPENSION MARK +1E00 LATIN CAPITAL LETTER A WITH RING BELOW +1E01 LATIN SMALL LETTER A WITH RING BELOW +1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE +1E03 LATIN SMALL LETTER B WITH DOT ABOVE +1E04 LATIN CAPITAL LETTER B WITH DOT BELOW +1E05 LATIN SMALL LETTER B WITH DOT BELOW +1E06 LATIN CAPITAL LETTER B WITH LINE BELOW +1E07 LATIN SMALL LETTER B WITH LINE BELOW +1E08 LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +1E09 LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0B LATIN SMALL LETTER D WITH DOT ABOVE +1E0C LATIN CAPITAL LETTER D WITH DOT BELOW +1E0D LATIN SMALL LETTER D WITH DOT BELOW +1E0E LATIN CAPITAL LETTER D WITH LINE BELOW +1E0F LATIN SMALL LETTER D WITH LINE BELOW +1E10 LATIN CAPITAL LETTER D WITH CEDILLA +1E11 LATIN SMALL LETTER D WITH CEDILLA +1E12 LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E13 LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +1E14 LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1E15 LATIN SMALL LETTER E WITH MACRON AND GRAVE +1E16 LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E17 LATIN SMALL LETTER E WITH MACRON AND ACUTE +1E18 LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E19 LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +1E1A LATIN CAPITAL LETTER E WITH TILDE BELOW +1E1B LATIN SMALL LETTER E WITH TILDE BELOW +1E1C LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +1E1D LATIN SMALL LETTER E WITH CEDILLA AND BREVE +1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE +1E1F LATIN SMALL LETTER F WITH DOT ABOVE +1E20 LATIN CAPITAL LETTER G WITH MACRON +1E21 LATIN SMALL LETTER G WITH MACRON +1E22 LATIN CAPITAL LETTER H WITH DOT ABOVE +1E23 LATIN SMALL LETTER H WITH DOT ABOVE +1E24 LATIN CAPITAL LETTER H WITH DOT BELOW +1E25 LATIN SMALL LETTER H WITH DOT BELOW +1E26 LATIN CAPITAL LETTER H WITH DIAERESIS +1E27 LATIN SMALL LETTER H WITH DIAERESIS +1E28 LATIN CAPITAL LETTER H WITH CEDILLA +1E29 LATIN SMALL LETTER H WITH CEDILLA +1E2A LATIN CAPITAL LETTER H WITH BREVE BELOW +1E2B LATIN SMALL LETTER H WITH BREVE BELOW +1E2C LATIN CAPITAL LETTER I WITH TILDE BELOW +1E2D LATIN SMALL LETTER I WITH TILDE BELOW +1E2E LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +1E2F LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +1E30 LATIN CAPITAL LETTER K WITH ACUTE +1E31 LATIN SMALL LETTER K WITH ACUTE +1E32 LATIN CAPITAL LETTER K WITH DOT BELOW +1E33 LATIN SMALL LETTER K WITH DOT BELOW +1E34 LATIN CAPITAL LETTER K WITH LINE BELOW +1E35 LATIN SMALL LETTER K WITH LINE BELOW +1E36 LATIN CAPITAL LETTER L WITH DOT BELOW +1E37 LATIN SMALL LETTER L WITH DOT BELOW +1E38 LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E39 LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +1E3A LATIN CAPITAL LETTER L WITH LINE BELOW +1E3B LATIN SMALL LETTER L WITH LINE BELOW +1E3C LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3D LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +1E3E LATIN CAPITAL LETTER M WITH ACUTE +1E3F LATIN SMALL LETTER M WITH ACUTE +1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE +1E41 LATIN SMALL LETTER M WITH DOT ABOVE +1E42 LATIN CAPITAL LETTER M WITH DOT BELOW +1E43 LATIN SMALL LETTER M WITH DOT BELOW +1E44 LATIN CAPITAL LETTER N WITH DOT ABOVE +1E45 LATIN SMALL LETTER N WITH DOT ABOVE +1E46 LATIN CAPITAL LETTER N WITH DOT BELOW +1E47 LATIN SMALL LETTER N WITH DOT BELOW +1E48 LATIN CAPITAL LETTER N WITH LINE BELOW +1E49 LATIN SMALL LETTER N WITH LINE BELOW +1E4A LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E4B LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +1E4C LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4D LATIN SMALL LETTER O WITH TILDE AND ACUTE +1E4E LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +1E4F LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +1E50 LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1E51 LATIN SMALL LETTER O WITH MACRON AND GRAVE +1E52 LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E53 LATIN SMALL LETTER O WITH MACRON AND ACUTE +1E54 LATIN CAPITAL LETTER P WITH ACUTE +1E55 LATIN SMALL LETTER P WITH ACUTE +1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE +1E57 LATIN SMALL LETTER P WITH DOT ABOVE +1E58 LATIN CAPITAL LETTER R WITH DOT ABOVE +1E59 LATIN SMALL LETTER R WITH DOT ABOVE +1E5A LATIN CAPITAL LETTER R WITH DOT BELOW +1E5B LATIN SMALL LETTER R WITH DOT BELOW +1E5C LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5D LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +1E5E LATIN CAPITAL LETTER R WITH LINE BELOW +1E5F LATIN SMALL LETTER R WITH LINE BELOW +1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE +1E61 LATIN SMALL LETTER S WITH DOT ABOVE +1E62 LATIN CAPITAL LETTER S WITH DOT BELOW +1E63 LATIN SMALL LETTER S WITH DOT BELOW +1E64 LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +1E65 LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +1E66 LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E67 LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +1E68 LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +1E69 LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE +1E6B LATIN SMALL LETTER T WITH DOT ABOVE +1E6C LATIN CAPITAL LETTER T WITH DOT BELOW +1E6D LATIN SMALL LETTER T WITH DOT BELOW +1E6E LATIN CAPITAL LETTER T WITH LINE BELOW +1E6F LATIN SMALL LETTER T WITH LINE BELOW +1E70 LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E71 LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +1E72 LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E73 LATIN SMALL LETTER U WITH DIAERESIS BELOW +1E74 LATIN CAPITAL LETTER U WITH TILDE BELOW +1E75 LATIN SMALL LETTER U WITH TILDE BELOW +1E76 LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E77 LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +1E78 LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +1E79 LATIN SMALL LETTER U WITH TILDE AND ACUTE +1E7A LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1E7B LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +1E7C LATIN CAPITAL LETTER V WITH TILDE +1E7D LATIN SMALL LETTER V WITH TILDE +1E7E LATIN CAPITAL LETTER V WITH DOT BELOW +1E7F LATIN SMALL LETTER V WITH DOT BELOW +1E80 LATIN CAPITAL LETTER W WITH GRAVE +1E81 LATIN SMALL LETTER W WITH GRAVE +1E82 LATIN CAPITAL LETTER W WITH ACUTE +1E83 LATIN SMALL LETTER W WITH ACUTE +1E84 LATIN CAPITAL LETTER W WITH DIAERESIS +1E85 LATIN SMALL LETTER W WITH DIAERESIS +1E86 LATIN CAPITAL LETTER W WITH DOT ABOVE +1E87 LATIN SMALL LETTER W WITH DOT ABOVE +1E88 LATIN CAPITAL LETTER W WITH DOT BELOW +1E89 LATIN SMALL LETTER W WITH DOT BELOW +1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE +1E8B LATIN SMALL LETTER X WITH DOT ABOVE +1E8C LATIN CAPITAL LETTER X WITH DIAERESIS +1E8D LATIN SMALL LETTER X WITH DIAERESIS +1E8E LATIN CAPITAL LETTER Y WITH DOT ABOVE +1E8F LATIN SMALL LETTER Y WITH DOT ABOVE +1E90 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +1E91 LATIN SMALL LETTER Z WITH CIRCUMFLEX +1E92 LATIN CAPITAL LETTER Z WITH DOT BELOW +1E93 LATIN SMALL LETTER Z WITH DOT BELOW +1E94 LATIN CAPITAL LETTER Z WITH LINE BELOW +1E95 LATIN SMALL LETTER Z WITH LINE BELOW +1E96 LATIN SMALL LETTER H WITH LINE BELOW +1E97 LATIN SMALL LETTER T WITH DIAERESIS +1E98 LATIN SMALL LETTER W WITH RING ABOVE +1E99 LATIN SMALL LETTER Y WITH RING ABOVE +1E9A LATIN SMALL LETTER A WITH RIGHT HALF RING +1E9B LATIN SMALL LETTER LONG S WITH DOT ABOVE +1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW +1EA1 LATIN SMALL LETTER A WITH DOT BELOW +1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE +1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE +1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE +1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE +1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE +1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW +1EB9 LATIN SMALL LETTER E WITH DOT BELOW +1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE +1EBB LATIN SMALL LETTER E WITH HOOK ABOVE +1EBC LATIN CAPITAL LETTER E WITH TILDE +1EBD LATIN SMALL LETTER E WITH TILDE +1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE +1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE +1ECA LATIN CAPITAL LETTER I WITH DOT BELOW +1ECB LATIN SMALL LETTER I WITH DOT BELOW +1ECC LATIN CAPITAL LETTER O WITH DOT BELOW +1ECD LATIN SMALL LETTER O WITH DOT BELOW +1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE +1ECF LATIN SMALL LETTER O WITH HOOK ABOVE +1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE +1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE +1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE +1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW +1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW +1EE5 LATIN SMALL LETTER U WITH DOT BELOW +1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE +1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE +1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE +1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE +1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EEF LATIN SMALL LETTER U WITH HORN AND TILDE +1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW +1EF2 LATIN CAPITAL LETTER Y WITH GRAVE +1EF3 LATIN SMALL LETTER Y WITH GRAVE +1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW +1EF5 LATIN SMALL LETTER Y WITH DOT BELOW +1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE +1EF8 LATIN CAPITAL LETTER Y WITH TILDE +1EF9 LATIN SMALL LETTER Y WITH TILDE +1F00 GREEK SMALL LETTER ALPHA WITH PSILI +1F01 GREEK SMALL LETTER ALPHA WITH DASIA +1F02 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA +1F03 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA +1F04 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA +1F05 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA +1F06 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F07 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F08 GREEK CAPITAL LETTER ALPHA WITH PSILI +1F09 GREEK CAPITAL LETTER ALPHA WITH DASIA +1F0A GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +1F0B GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +1F0C GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +1F0D GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +1F0E GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F0F GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F10 GREEK SMALL LETTER EPSILON WITH PSILI +1F11 GREEK SMALL LETTER EPSILON WITH DASIA +1F12 GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA +1F13 GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA +1F14 GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA +1F15 GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18 GREEK CAPITAL LETTER EPSILON WITH PSILI +1F19 GREEK CAPITAL LETTER EPSILON WITH DASIA +1F1A GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +1F1B GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +1F1C GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +1F1D GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20 GREEK SMALL LETTER ETA WITH PSILI +1F21 GREEK SMALL LETTER ETA WITH DASIA +1F22 GREEK SMALL LETTER ETA WITH PSILI AND VARIA +1F23 GREEK SMALL LETTER ETA WITH DASIA AND VARIA +1F24 GREEK SMALL LETTER ETA WITH PSILI AND OXIA +1F25 GREEK SMALL LETTER ETA WITH DASIA AND OXIA +1F26 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI +1F27 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI +1F28 GREEK CAPITAL LETTER ETA WITH PSILI +1F29 GREEK CAPITAL LETTER ETA WITH DASIA +1F2A GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +1F2B GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +1F2C GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +1F2D GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +1F2E GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +1F2F GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F30 GREEK SMALL LETTER IOTA WITH PSILI +1F31 GREEK SMALL LETTER IOTA WITH DASIA +1F32 GREEK SMALL LETTER IOTA WITH PSILI AND VARIA +1F33 GREEK SMALL LETTER IOTA WITH DASIA AND VARIA +1F34 GREEK SMALL LETTER IOTA WITH PSILI AND OXIA +1F35 GREEK SMALL LETTER IOTA WITH DASIA AND OXIA +1F36 GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI +1F37 GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI +1F38 GREEK CAPITAL LETTER IOTA WITH PSILI +1F39 GREEK CAPITAL LETTER IOTA WITH DASIA +1F3A GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +1F3B GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +1F3C GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +1F3D GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +1F3E GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +1F3F GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +1F40 GREEK SMALL LETTER OMICRON WITH PSILI +1F41 GREEK SMALL LETTER OMICRON WITH DASIA +1F42 GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA +1F43 GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA +1F44 GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA +1F45 GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48 GREEK CAPITAL LETTER OMICRON WITH PSILI +1F49 GREEK CAPITAL LETTER OMICRON WITH DASIA +1F4A GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +1F4B GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +1F4C GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +1F4D GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50 GREEK SMALL LETTER UPSILON WITH PSILI +1F51 GREEK SMALL LETTER UPSILON WITH DASIA +1F52 GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F53 GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA +1F54 GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F55 GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA +1F56 GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1F57 GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F60 GREEK SMALL LETTER OMEGA WITH PSILI +1F61 GREEK SMALL LETTER OMEGA WITH DASIA +1F62 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA +1F63 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA +1F64 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA +1F65 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA +1F66 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F67 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F68 GREEK CAPITAL LETTER OMEGA WITH PSILI +1F69 GREEK CAPITAL LETTER OMEGA WITH DASIA +1F6A GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +1F6B GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +1F6C GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +1F6D GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +1F6E GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F6F GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F70 GREEK SMALL LETTER ALPHA WITH VARIA +1F71 GREEK SMALL LETTER ALPHA WITH OXIA +1F72 GREEK SMALL LETTER EPSILON WITH VARIA +1F73 GREEK SMALL LETTER EPSILON WITH OXIA +1F74 GREEK SMALL LETTER ETA WITH VARIA +1F75 GREEK SMALL LETTER ETA WITH OXIA +1F76 GREEK SMALL LETTER IOTA WITH VARIA +1F77 GREEK SMALL LETTER IOTA WITH OXIA +1F78 GREEK SMALL LETTER OMICRON WITH VARIA +1F79 GREEK SMALL LETTER OMICRON WITH OXIA +1F7A GREEK SMALL LETTER UPSILON WITH VARIA +1F7B GREEK SMALL LETTER UPSILON WITH OXIA +1F7C GREEK SMALL LETTER OMEGA WITH VARIA +1F7D GREEK SMALL LETTER OMEGA WITH OXIA +1F80 GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F81 GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F82 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F83 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F84 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F85 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F86 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F87 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F88 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F89 GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F8A GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8B GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8C GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8D GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8E GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8F GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F90 GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F91 GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F92 GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F93 GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F94 GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F95 GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F96 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F97 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F98 GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F99 GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F9A GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9B GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9C GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9D GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9E GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9F GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA0 GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA1 GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA2 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FA3 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FA4 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FA5 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FA6 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FA7 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA8 GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA9 GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FAA GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAB GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAC GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAD GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAE GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAF GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB0 GREEK SMALL LETTER ALPHA WITH VRACHY +1FB1 GREEK SMALL LETTER ALPHA WITH MACRON +1FB2 GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB3 GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FB4 GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6 GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FB7 GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FB8 GREEK CAPITAL LETTER ALPHA WITH VRACHY +1FB9 GREEK CAPITAL LETTER ALPHA WITH MACRON +1FBA GREEK CAPITAL LETTER ALPHA WITH VARIA +1FBB GREEK CAPITAL LETTER ALPHA WITH OXIA +1FBC GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD GREEK KORONIS +1FBE GREEK PROSGEGRAMMENI +1FBF GREEK PSILI +1FC0 GREEK PERISPOMENI +1FC1 GREEK DIALYTIKA AND PERISPOMENI +1FC2 GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC3 GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FC4 GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6 GREEK SMALL LETTER ETA WITH PERISPOMENI +1FC7 GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC8 GREEK CAPITAL LETTER EPSILON WITH VARIA +1FC9 GREEK CAPITAL LETTER EPSILON WITH OXIA +1FCA GREEK CAPITAL LETTER ETA WITH VARIA +1FCB GREEK CAPITAL LETTER ETA WITH OXIA +1FCC GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD GREEK PSILI AND VARIA +1FCE GREEK PSILI AND OXIA +1FCF GREEK PSILI AND PERISPOMENI +1FD0 GREEK SMALL LETTER IOTA WITH VRACHY +1FD1 GREEK SMALL LETTER IOTA WITH MACRON +1FD2 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6 GREEK SMALL LETTER IOTA WITH PERISPOMENI +1FD7 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FD8 GREEK CAPITAL LETTER IOTA WITH VRACHY +1FD9 GREEK CAPITAL LETTER IOTA WITH MACRON +1FDA GREEK CAPITAL LETTER IOTA WITH VARIA +1FDB GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD GREEK DASIA AND VARIA +1FDE GREEK DASIA AND OXIA +1FDF GREEK DASIA AND PERISPOMENI +1FE0 GREEK SMALL LETTER UPSILON WITH VRACHY +1FE1 GREEK SMALL LETTER UPSILON WITH MACRON +1FE2 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE3 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE4 GREEK SMALL LETTER RHO WITH PSILI +1FE5 GREEK SMALL LETTER RHO WITH DASIA +1FE6 GREEK SMALL LETTER UPSILON WITH PERISPOMENI +1FE7 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FE8 GREEK CAPITAL LETTER UPSILON WITH VRACHY +1FE9 GREEK CAPITAL LETTER UPSILON WITH MACRON +1FEA GREEK CAPITAL LETTER UPSILON WITH VARIA +1FEB GREEK CAPITAL LETTER UPSILON WITH OXIA +1FEC GREEK CAPITAL LETTER RHO WITH DASIA +1FED GREEK DIALYTIKA AND VARIA +1FEE GREEK DIALYTIKA AND OXIA +1FEF GREEK VARIA +1FF2 GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF3 GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FF4 GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6 GREEK SMALL LETTER OMEGA WITH PERISPOMENI +1FF7 GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF8 GREEK CAPITAL LETTER OMICRON WITH VARIA +1FF9 GREEK CAPITAL LETTER OMICRON WITH OXIA +1FFA GREEK CAPITAL LETTER OMEGA WITH VARIA +1FFB GREEK CAPITAL LETTER OMEGA WITH OXIA +1FFC GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD GREEK OXIA +1FFE GREEK DASIA +2000 EN QUAD +2001 EM QUAD +2002 EN SPACE +2003 EM SPACE +2004 THREE-PER-EM SPACE +2005 FOUR-PER-EM SPACE +2006 SIX-PER-EM SPACE +2007 FIGURE SPACE +2008 PUNCTUATION SPACE +2009 THIN SPACE +200A HAIR SPACE +200B ZERO WIDTH SPACE +200C ZERO WIDTH NON-JOINER +200D ZERO WIDTH JOINER +200E LEFT-TO-RIGHT MARK +200F RIGHT-TO-LEFT MARK +2010 HYPHEN +2011 NON-BREAKING HYPHEN +2012 FIGURE DASH +2013 EN DASH +2014 EM DASH +2015 HORIZONTAL BAR +2016 DOUBLE VERTICAL LINE +2017 DOUBLE LOW LINE +2018 LEFT SINGLE QUOTATION MARK +2019 RIGHT SINGLE QUOTATION MARK +201A SINGLE LOW-9 QUOTATION MARK +201B SINGLE HIGH-REVERSED-9 QUOTATION MARK +201C LEFT DOUBLE QUOTATION MARK +201D RIGHT DOUBLE QUOTATION MARK +201E DOUBLE LOW-9 QUOTATION MARK +201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020 DAGGER +2021 DOUBLE DAGGER +2022 BULLET +2023 TRIANGULAR BULLET +2024 ONE DOT LEADER +2025 TWO DOT LEADER +2026 HORIZONTAL ELLIPSIS +2027 HYPHENATION POINT +2028 LINE SEPARATOR +2029 PARAGRAPH SEPARATOR +202A LEFT-TO-RIGHT EMBEDDING +202B RIGHT-TO-LEFT EMBEDDING +202C POP DIRECTIONAL FORMATTING +202D LEFT-TO-RIGHT OVERRIDE +202E RIGHT-TO-LEFT OVERRIDE +202F NARROW NO-BREAK SPACE +2030 PER MILLE SIGN +2031 PER TEN THOUSAND SIGN +2032 PRIME +2033 DOUBLE PRIME +2034 TRIPLE PRIME +2035 REVERSED PRIME +2036 REVERSED DOUBLE PRIME +2037 REVERSED TRIPLE PRIME +2038 CARET +2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B REFERENCE MARK +203C DOUBLE EXCLAMATION MARK +203D INTERROBANG +203E OVERLINE +203F UNDERTIE +2040 CHARACTER TIE +2041 CARET INSERTION POINT +2042 ASTERISM +2043 HYPHEN BULLET +2044 FRACTION SLASH +2045 LEFT SQUARE BRACKET WITH QUILL +2046 RIGHT SQUARE BRACKET WITH QUILL +2047 DOUBLE QUESTION MARK +2048 QUESTION EXCLAMATION MARK +2049 EXCLAMATION QUESTION MARK +204A TIRONIAN SIGN ET +204B REVERSED PILCROW SIGN +204C BLACK LEFTWARDS BULLET +204D BLACK RIGHTWARDS BULLET +204E LOW ASTERISK +204F REVERSED SEMICOLON +2050 CLOSE UP +2051 TWO ASTERISKS ALIGNED VERTICALLY +2052 COMMERCIAL MINUS SIGN +2053 SWUNG DASH +2054 INVERTED UNDERTIE +2055 FLOWER PUNCTUATION MARK +2056 THREE DOT PUNCTUATION +2057 QUADRUPLE PRIME +2058 FOUR DOT PUNCTUATION +2059 FIVE DOT PUNCTUATION +205A TWO DOT PUNCTUATION +205B FOUR DOT MARK +205C DOTTED CROSS +205D TRICOLON +205E VERTICAL FOUR DOTS +205F MEDIUM MATHEMATICAL SPACE +2060 WORD JOINER +2061 FUNCTION APPLICATION +2062 INVISIBLE TIMES +2063 INVISIBLE SEPARATOR +206A INHIBIT SYMMETRIC SWAPPING +206B ACTIVATE SYMMETRIC SWAPPING +206C INHIBIT ARABIC FORM SHAPING +206D ACTIVATE ARABIC FORM SHAPING +206E NATIONAL DIGIT SHAPES +206F NOMINAL DIGIT SHAPES +2070 SUPERSCRIPT ZERO +2071 SUPERSCRIPT LATIN SMALL LETTER I +2074 SUPERSCRIPT FOUR +2075 SUPERSCRIPT FIVE +2076 SUPERSCRIPT SIX +2077 SUPERSCRIPT SEVEN +2078 SUPERSCRIPT EIGHT +2079 SUPERSCRIPT NINE +207A SUPERSCRIPT PLUS SIGN +207B SUPERSCRIPT MINUS +207C SUPERSCRIPT EQUALS SIGN +207D SUPERSCRIPT LEFT PARENTHESIS +207E SUPERSCRIPT RIGHT PARENTHESIS +207F SUPERSCRIPT LATIN SMALL LETTER N +2080 SUBSCRIPT ZERO +2081 SUBSCRIPT ONE +2082 SUBSCRIPT TWO +2083 SUBSCRIPT THREE +2084 SUBSCRIPT FOUR +2085 SUBSCRIPT FIVE +2086 SUBSCRIPT SIX +2087 SUBSCRIPT SEVEN +2088 SUBSCRIPT EIGHT +2089 SUBSCRIPT NINE +208A SUBSCRIPT PLUS SIGN +208B SUBSCRIPT MINUS +208C SUBSCRIPT EQUALS SIGN +208D SUBSCRIPT LEFT PARENTHESIS +208E SUBSCRIPT RIGHT PARENTHESIS +2090 LATIN SUBSCRIPT SMALL LETTER A +2091 LATIN SUBSCRIPT SMALL LETTER E +2092 LATIN SUBSCRIPT SMALL LETTER O +2093 LATIN SUBSCRIPT SMALL LETTER X +2094 LATIN SUBSCRIPT SMALL LETTER SCHWA +20A0 EURO-CURRENCY SIGN +20A1 COLON SIGN +20A2 CRUZEIRO SIGN +20A3 FRENCH FRANC SIGN +20A4 LIRA SIGN +20A5 MILL SIGN +20A6 NAIRA SIGN +20A7 PESETA SIGN +20A8 RUPEE SIGN +20A9 WON SIGN +20AA NEW SHEQEL SIGN +20AB DONG SIGN +20AC EURO SIGN +20AD KIP SIGN +20AE TUGRIK SIGN +20AF DRACHMA SIGN +20B0 GERMAN PENNY SIGN +20B1 PESO SIGN +20B2 GUARANI SIGN +20B3 AUSTRAL SIGN +20B4 HRYVNIA SIGN +20B5 CEDI SIGN +20D0 COMBINING LEFT HARPOON ABOVE +20D1 COMBINING RIGHT HARPOON ABOVE +20D2 COMBINING LONG VERTICAL LINE OVERLAY +20D3 COMBINING SHORT VERTICAL LINE OVERLAY +20D4 COMBINING ANTICLOCKWISE ARROW ABOVE +20D5 COMBINING CLOCKWISE ARROW ABOVE +20D6 COMBINING LEFT ARROW ABOVE +20D7 COMBINING RIGHT ARROW ABOVE +20D8 COMBINING RING OVERLAY +20D9 COMBINING CLOCKWISE RING OVERLAY +20DA COMBINING ANTICLOCKWISE RING OVERLAY +20DB COMBINING THREE DOTS ABOVE +20DC COMBINING FOUR DOTS ABOVE +20DD COMBINING ENCLOSING CIRCLE +20DE COMBINING ENCLOSING SQUARE +20DF COMBINING ENCLOSING DIAMOND +20E0 COMBINING ENCLOSING CIRCLE BACKSLASH +20E1 COMBINING LEFT RIGHT ARROW ABOVE +20E2 COMBINING ENCLOSING SCREEN +20E3 COMBINING ENCLOSING KEYCAP +20E4 COMBINING ENCLOSING UPWARD POINTING TRIANGLE +20E5 COMBINING REVERSE SOLIDUS OVERLAY +20E6 COMBINING DOUBLE VERTICAL STROKE OVERLAY +20E7 COMBINING ANNUITY SYMBOL +20E8 COMBINING TRIPLE UNDERDOT +20E9 COMBINING WIDE BRIDGE ABOVE +20EA COMBINING LEFTWARDS ARROW OVERLAY +20EB COMBINING LONG DOUBLE SOLIDUS OVERLAY +2100 ACCOUNT OF +2101 ADDRESSED TO THE SUBJECT +2102 DOUBLE-STRUCK CAPITAL C +2103 DEGREE CELSIUS +2104 CENTRE LINE SYMBOL +2105 CARE OF +2106 CADA UNA +2107 EULER CONSTANT +2108 SCRUPLE +2109 DEGREE FAHRENHEIT +210A SCRIPT SMALL G +210B SCRIPT CAPITAL H +210C BLACK-LETTER CAPITAL H +210D DOUBLE-STRUCK CAPITAL H +210E PLANCK CONSTANT +210F PLANCK CONSTANT OVER TWO PI +2110 SCRIPT CAPITAL I +2111 BLACK-LETTER CAPITAL I +2112 SCRIPT CAPITAL L +2113 SCRIPT SMALL L +2114 L B BAR SYMBOL +2115 DOUBLE-STRUCK CAPITAL N +2116 NUMERO SIGN +2117 SOUND RECORDING COPYRIGHT +2118 SCRIPT CAPITAL P +2119 DOUBLE-STRUCK CAPITAL P +211A DOUBLE-STRUCK CAPITAL Q +211B SCRIPT CAPITAL R +211C BLACK-LETTER CAPITAL R +211D DOUBLE-STRUCK CAPITAL R +211E PRESCRIPTION TAKE +211F RESPONSE +2120 SERVICE MARK +2121 TELEPHONE SIGN +2122 TRADE MARK SIGN +2123 VERSICLE +2124 DOUBLE-STRUCK CAPITAL Z +2125 OUNCE SIGN +2126 OHM SIGN +2127 INVERTED OHM SIGN +2128 BLACK-LETTER CAPITAL Z +2129 TURNED GREEK SMALL LETTER IOTA +212A KELVIN SIGN +212B ANGSTROM SIGN +212C SCRIPT CAPITAL B +212D BLACK-LETTER CAPITAL C +212E ESTIMATED SYMBOL +212F SCRIPT SMALL E +2130 SCRIPT CAPITAL E +2131 SCRIPT CAPITAL F +2132 TURNED CAPITAL F +2133 SCRIPT CAPITAL M +2134 SCRIPT SMALL O +2135 ALEF SYMBOL +2136 BET SYMBOL +2137 GIMEL SYMBOL +2138 DALET SYMBOL +2139 INFORMATION SOURCE +213A ROTATED CAPITAL Q +213B FACSIMILE SIGN +213C DOUBLE-STRUCK SMALL PI +213D DOUBLE-STRUCK SMALL GAMMA +213E DOUBLE-STRUCK CAPITAL GAMMA +213F DOUBLE-STRUCK CAPITAL PI +2140 DOUBLE-STRUCK N-ARY SUMMATION +2141 TURNED SANS-SERIF CAPITAL G +2142 TURNED SANS-SERIF CAPITAL L +2143 REVERSED SANS-SERIF CAPITAL L +2144 TURNED SANS-SERIF CAPITAL Y +2145 DOUBLE-STRUCK ITALIC CAPITAL D +2146 DOUBLE-STRUCK ITALIC SMALL D +2147 DOUBLE-STRUCK ITALIC SMALL E +2148 DOUBLE-STRUCK ITALIC SMALL I +2149 DOUBLE-STRUCK ITALIC SMALL J +214A PROPERTY LINE +214B TURNED AMPERSAND +214C PER SIGN +2153 VULGAR FRACTION ONE THIRD +2154 VULGAR FRACTION TWO THIRDS +2155 VULGAR FRACTION ONE FIFTH +2156 VULGAR FRACTION TWO FIFTHS +2157 VULGAR FRACTION THREE FIFTHS +2158 VULGAR FRACTION FOUR FIFTHS +2159 VULGAR FRACTION ONE SIXTH +215A VULGAR FRACTION FIVE SIXTHS +215B VULGAR FRACTION ONE EIGHTH +215C VULGAR FRACTION THREE EIGHTHS +215D VULGAR FRACTION FIVE EIGHTHS +215E VULGAR FRACTION SEVEN EIGHTHS +215F FRACTION NUMERATOR ONE +2160 ROMAN NUMERAL ONE +2161 ROMAN NUMERAL TWO +2162 ROMAN NUMERAL THREE +2163 ROMAN NUMERAL FOUR +2164 ROMAN NUMERAL FIVE +2165 ROMAN NUMERAL SIX +2166 ROMAN NUMERAL SEVEN +2167 ROMAN NUMERAL EIGHT +2168 ROMAN NUMERAL NINE +2169 ROMAN NUMERAL TEN +216A ROMAN NUMERAL ELEVEN +216B ROMAN NUMERAL TWELVE +216C ROMAN NUMERAL FIFTY +216D ROMAN NUMERAL ONE HUNDRED +216E ROMAN NUMERAL FIVE HUNDRED +216F ROMAN NUMERAL ONE THOUSAND +2170 SMALL ROMAN NUMERAL ONE +2171 SMALL ROMAN NUMERAL TWO +2172 SMALL ROMAN NUMERAL THREE +2173 SMALL ROMAN NUMERAL FOUR +2174 SMALL ROMAN NUMERAL FIVE +2175 SMALL ROMAN NUMERAL SIX +2176 SMALL ROMAN NUMERAL SEVEN +2177 SMALL ROMAN NUMERAL EIGHT +2178 SMALL ROMAN NUMERAL NINE +2179 SMALL ROMAN NUMERAL TEN +217A SMALL ROMAN NUMERAL ELEVEN +217B SMALL ROMAN NUMERAL TWELVE +217C SMALL ROMAN NUMERAL FIFTY +217D SMALL ROMAN NUMERAL ONE HUNDRED +217E SMALL ROMAN NUMERAL FIVE HUNDRED +217F SMALL ROMAN NUMERAL ONE THOUSAND +2180 ROMAN NUMERAL ONE THOUSAND C D +2181 ROMAN NUMERAL FIVE THOUSAND +2182 ROMAN NUMERAL TEN THOUSAND +2183 ROMAN NUMERAL REVERSED ONE HUNDRED +2190 LEFTWARDS ARROW +2191 UPWARDS ARROW +2192 RIGHTWARDS ARROW +2193 DOWNWARDS ARROW +2194 LEFT RIGHT ARROW +2195 UP DOWN ARROW +2196 NORTH WEST ARROW +2197 NORTH EAST ARROW +2198 SOUTH EAST ARROW +2199 SOUTH WEST ARROW +219A LEFTWARDS ARROW WITH STROKE +219B RIGHTWARDS ARROW WITH STROKE +219C LEFTWARDS WAVE ARROW +219D RIGHTWARDS WAVE ARROW +219E LEFTWARDS TWO HEADED ARROW +219F UPWARDS TWO HEADED ARROW +21A0 RIGHTWARDS TWO HEADED ARROW +21A1 DOWNWARDS TWO HEADED ARROW +21A2 LEFTWARDS ARROW WITH TAIL +21A3 RIGHTWARDS ARROW WITH TAIL +21A4 LEFTWARDS ARROW FROM BAR +21A5 UPWARDS ARROW FROM BAR +21A6 RIGHTWARDS ARROW FROM BAR +21A7 DOWNWARDS ARROW FROM BAR +21A8 UP DOWN ARROW WITH BASE +21A9 LEFTWARDS ARROW WITH HOOK +21AA RIGHTWARDS ARROW WITH HOOK +21AB LEFTWARDS ARROW WITH LOOP +21AC RIGHTWARDS ARROW WITH LOOP +21AD LEFT RIGHT WAVE ARROW +21AE LEFT RIGHT ARROW WITH STROKE +21AF DOWNWARDS ZIGZAG ARROW +21B0 UPWARDS ARROW WITH TIP LEFTWARDS +21B1 UPWARDS ARROW WITH TIP RIGHTWARDS +21B2 DOWNWARDS ARROW WITH TIP LEFTWARDS +21B3 DOWNWARDS ARROW WITH TIP RIGHTWARDS +21B4 RIGHTWARDS ARROW WITH CORNER DOWNWARDS +21B5 DOWNWARDS ARROW WITH CORNER LEFTWARDS +21B6 ANTICLOCKWISE TOP SEMICIRCLE ARROW +21B7 CLOCKWISE TOP SEMICIRCLE ARROW +21B8 NORTH WEST ARROW TO LONG BAR +21B9 LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR +21BA ANTICLOCKWISE OPEN CIRCLE ARROW +21BB CLOCKWISE OPEN CIRCLE ARROW +21BC LEFTWARDS HARPOON WITH BARB UPWARDS +21BD LEFTWARDS HARPOON WITH BARB DOWNWARDS +21BE UPWARDS HARPOON WITH BARB RIGHTWARDS +21BF UPWARDS HARPOON WITH BARB LEFTWARDS +21C0 RIGHTWARDS HARPOON WITH BARB UPWARDS +21C1 RIGHTWARDS HARPOON WITH BARB DOWNWARDS +21C2 DOWNWARDS HARPOON WITH BARB RIGHTWARDS +21C3 DOWNWARDS HARPOON WITH BARB LEFTWARDS +21C4 RIGHTWARDS ARROW OVER LEFTWARDS ARROW +21C5 UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW +21C6 LEFTWARDS ARROW OVER RIGHTWARDS ARROW +21C7 LEFTWARDS PAIRED ARROWS +21C8 UPWARDS PAIRED ARROWS +21C9 RIGHTWARDS PAIRED ARROWS +21CA DOWNWARDS PAIRED ARROWS +21CB LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +21CC RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +21CD LEFTWARDS DOUBLE ARROW WITH STROKE +21CE LEFT RIGHT DOUBLE ARROW WITH STROKE +21CF RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0 LEFTWARDS DOUBLE ARROW +21D1 UPWARDS DOUBLE ARROW +21D2 RIGHTWARDS DOUBLE ARROW +21D3 DOWNWARDS DOUBLE ARROW +21D4 LEFT RIGHT DOUBLE ARROW +21D5 UP DOWN DOUBLE ARROW +21D6 NORTH WEST DOUBLE ARROW +21D7 NORTH EAST DOUBLE ARROW +21D8 SOUTH EAST DOUBLE ARROW +21D9 SOUTH WEST DOUBLE ARROW +21DA LEFTWARDS TRIPLE ARROW +21DB RIGHTWARDS TRIPLE ARROW +21DC LEFTWARDS SQUIGGLE ARROW +21DD RIGHTWARDS SQUIGGLE ARROW +21DE UPWARDS ARROW WITH DOUBLE STROKE +21DF DOWNWARDS ARROW WITH DOUBLE STROKE +21E0 LEFTWARDS DASHED ARROW +21E1 UPWARDS DASHED ARROW +21E2 RIGHTWARDS DASHED ARROW +21E3 DOWNWARDS DASHED ARROW +21E4 LEFTWARDS ARROW TO BAR +21E5 RIGHTWARDS ARROW TO BAR +21E6 LEFTWARDS WHITE ARROW +21E7 UPWARDS WHITE ARROW +21E8 RIGHTWARDS WHITE ARROW +21E9 DOWNWARDS WHITE ARROW +21EA UPWARDS WHITE ARROW FROM BAR +21EB UPWARDS WHITE ARROW ON PEDESTAL +21EC UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR +21ED UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR +21EE UPWARDS WHITE DOUBLE ARROW +21EF UPWARDS WHITE DOUBLE ARROW ON PEDESTAL +21F0 RIGHTWARDS WHITE ARROW FROM WALL +21F1 NORTH WEST ARROW TO CORNER +21F2 SOUTH EAST ARROW TO CORNER +21F3 UP DOWN WHITE ARROW +21F4 RIGHT ARROW WITH SMALL CIRCLE +21F5 DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW +21F6 THREE RIGHTWARDS ARROWS +21F7 LEFTWARDS ARROW WITH VERTICAL STROKE +21F8 RIGHTWARDS ARROW WITH VERTICAL STROKE +21F9 LEFT RIGHT ARROW WITH VERTICAL STROKE +21FA LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE +21FB RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE +21FC LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE +21FD LEFTWARDS OPEN-HEADED ARROW +21FE RIGHTWARDS OPEN-HEADED ARROW +21FF LEFT RIGHT OPEN-HEADED ARROW +2200 FOR ALL +2201 COMPLEMENT +2202 PARTIAL DIFFERENTIAL +2203 THERE EXISTS +2204 THERE DOES NOT EXIST +2205 EMPTY SET +2206 INCREMENT +2207 NABLA +2208 ELEMENT OF +2209 NOT AN ELEMENT OF +220A SMALL ELEMENT OF +220B CONTAINS AS MEMBER +220C DOES NOT CONTAIN AS MEMBER +220D SMALL CONTAINS AS MEMBER +220E END OF PROOF +220F N-ARY PRODUCT +2210 N-ARY COPRODUCT +2211 N-ARY SUMMATION +2212 MINUS SIGN +2213 MINUS-OR-PLUS SIGN +2214 DOT PLUS +2215 DIVISION SLASH +2216 SET MINUS +2217 ASTERISK OPERATOR +2218 RING OPERATOR +2219 BULLET OPERATOR +221A SQUARE ROOT +221B CUBE ROOT +221C FOURTH ROOT +221D PROPORTIONAL TO +221E INFINITY +221F RIGHT ANGLE +2220 ANGLE +2221 MEASURED ANGLE +2222 SPHERICAL ANGLE +2223 DIVIDES +2224 DOES NOT DIVIDE +2225 PARALLEL TO +2226 NOT PARALLEL TO +2227 LOGICAL AND +2228 LOGICAL OR +2229 INTERSECTION +222A UNION +222B INTEGRAL +222C DOUBLE INTEGRAL +222D TRIPLE INTEGRAL +222E CONTOUR INTEGRAL +222F SURFACE INTEGRAL +2230 VOLUME INTEGRAL +2231 CLOCKWISE INTEGRAL +2232 CLOCKWISE CONTOUR INTEGRAL +2233 ANTICLOCKWISE CONTOUR INTEGRAL +2234 THEREFORE +2235 BECAUSE +2236 RATIO +2237 PROPORTION +2238 DOT MINUS +2239 EXCESS +223A GEOMETRIC PROPORTION +223B HOMOTHETIC +223C TILDE OPERATOR +223D REVERSED TILDE +223E INVERTED LAZY S +223F SINE WAVE +2240 WREATH PRODUCT +2241 NOT TILDE +2242 MINUS TILDE +2243 ASYMPTOTICALLY EQUAL TO +2244 NOT ASYMPTOTICALLY EQUAL TO +2245 APPROXIMATELY EQUAL TO +2246 APPROXIMATELY BUT NOT ACTUALLY EQUAL TO +2247 NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +2248 ALMOST EQUAL TO +2249 NOT ALMOST EQUAL TO +224A ALMOST EQUAL OR EQUAL TO +224B TRIPLE TILDE +224C ALL EQUAL TO +224D EQUIVALENT TO +224E GEOMETRICALLY EQUIVALENT TO +224F DIFFERENCE BETWEEN +2250 APPROACHES THE LIMIT +2251 GEOMETRICALLY EQUAL TO +2252 APPROXIMATELY EQUAL TO OR THE IMAGE OF +2253 IMAGE OF OR APPROXIMATELY EQUAL TO +2254 COLON EQUALS +2255 EQUALS COLON +2256 RING IN EQUAL TO +2257 RING EQUAL TO +2258 CORRESPONDS TO +2259 ESTIMATES +225A EQUIANGULAR TO +225B STAR EQUALS +225C DELTA EQUAL TO +225D EQUAL TO BY DEFINITION +225E MEASURED BY +225F QUESTIONED EQUAL TO +2260 NOT EQUAL TO +2261 IDENTICAL TO +2262 NOT IDENTICAL TO +2263 STRICTLY EQUIVALENT TO +2264 LESS-THAN OR EQUAL TO +2265 GREATER-THAN OR EQUAL TO +2266 LESS-THAN OVER EQUAL TO +2267 GREATER-THAN OVER EQUAL TO +2268 LESS-THAN BUT NOT EQUAL TO +2269 GREATER-THAN BUT NOT EQUAL TO +226A MUCH LESS-THAN +226B MUCH GREATER-THAN +226C BETWEEN +226D NOT EQUIVALENT TO +226E NOT LESS-THAN +226F NOT GREATER-THAN +2270 NEITHER LESS-THAN NOR EQUAL TO +2271 NEITHER GREATER-THAN NOR EQUAL TO +2272 LESS-THAN OR EQUIVALENT TO +2273 GREATER-THAN OR EQUIVALENT TO +2274 NEITHER LESS-THAN NOR EQUIVALENT TO +2275 NEITHER GREATER-THAN NOR EQUIVALENT TO +2276 LESS-THAN OR GREATER-THAN +2277 GREATER-THAN OR LESS-THAN +2278 NEITHER LESS-THAN NOR GREATER-THAN +2279 NEITHER GREATER-THAN NOR LESS-THAN +227A PRECEDES +227B SUCCEEDS +227C PRECEDES OR EQUAL TO +227D SUCCEEDS OR EQUAL TO +227E PRECEDES OR EQUIVALENT TO +227F SUCCEEDS OR EQUIVALENT TO +2280 DOES NOT PRECEDE +2281 DOES NOT SUCCEED +2282 SUBSET OF +2283 SUPERSET OF +2284 NOT A SUBSET OF +2285 NOT A SUPERSET OF +2286 SUBSET OF OR EQUAL TO +2287 SUPERSET OF OR EQUAL TO +2288 NEITHER A SUBSET OF NOR EQUAL TO +2289 NEITHER A SUPERSET OF NOR EQUAL TO +228A SUBSET OF WITH NOT EQUAL TO +228B SUPERSET OF WITH NOT EQUAL TO +228C MULTISET +228D MULTISET MULTIPLICATION +228E MULTISET UNION +228F SQUARE IMAGE OF +2290 SQUARE ORIGINAL OF +2291 SQUARE IMAGE OF OR EQUAL TO +2292 SQUARE ORIGINAL OF OR EQUAL TO +2293 SQUARE CAP +2294 SQUARE CUP +2295 CIRCLED PLUS +2296 CIRCLED MINUS +2297 CIRCLED TIMES +2298 CIRCLED DIVISION SLASH +2299 CIRCLED DOT OPERATOR +229A CIRCLED RING OPERATOR +229B CIRCLED ASTERISK OPERATOR +229C CIRCLED EQUALS +229D CIRCLED DASH +229E SQUARED PLUS +229F SQUARED MINUS +22A0 SQUARED TIMES +22A1 SQUARED DOT OPERATOR +22A2 RIGHT TACK +22A3 LEFT TACK +22A4 DOWN TACK +22A5 UP TACK +22A6 ASSERTION +22A7 MODELS +22A8 TRUE +22A9 FORCES +22AA TRIPLE VERTICAL BAR RIGHT TURNSTILE +22AB DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22AC DOES NOT PROVE +22AD NOT TRUE +22AE DOES NOT FORCE +22AF NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22B0 PRECEDES UNDER RELATION +22B1 SUCCEEDS UNDER RELATION +22B2 NORMAL SUBGROUP OF +22B3 CONTAINS AS NORMAL SUBGROUP +22B4 NORMAL SUBGROUP OF OR EQUAL TO +22B5 CONTAINS AS NORMAL SUBGROUP OR EQUAL TO +22B6 ORIGINAL OF +22B7 IMAGE OF +22B8 MULTIMAP +22B9 HERMITIAN CONJUGATE MATRIX +22BA INTERCALATE +22BB XOR +22BC NAND +22BD NOR +22BE RIGHT ANGLE WITH ARC +22BF RIGHT TRIANGLE +22C0 N-ARY LOGICAL AND +22C1 N-ARY LOGICAL OR +22C2 N-ARY INTERSECTION +22C3 N-ARY UNION +22C4 DIAMOND OPERATOR +22C5 DOT OPERATOR +22C6 STAR OPERATOR +22C7 DIVISION TIMES +22C8 BOWTIE +22C9 LEFT NORMAL FACTOR SEMIDIRECT PRODUCT +22CA RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT +22CB LEFT SEMIDIRECT PRODUCT +22CC RIGHT SEMIDIRECT PRODUCT +22CD REVERSED TILDE EQUALS +22CE CURLY LOGICAL OR +22CF CURLY LOGICAL AND +22D0 DOUBLE SUBSET +22D1 DOUBLE SUPERSET +22D2 DOUBLE INTERSECTION +22D3 DOUBLE UNION +22D4 PITCHFORK +22D5 EQUAL AND PARALLEL TO +22D6 LESS-THAN WITH DOT +22D7 GREATER-THAN WITH DOT +22D8 VERY MUCH LESS-THAN +22D9 VERY MUCH GREATER-THAN +22DA LESS-THAN EQUAL TO OR GREATER-THAN +22DB GREATER-THAN EQUAL TO OR LESS-THAN +22DC EQUAL TO OR LESS-THAN +22DD EQUAL TO OR GREATER-THAN +22DE EQUAL TO OR PRECEDES +22DF EQUAL TO OR SUCCEEDS +22E0 DOES NOT PRECEDE OR EQUAL +22E1 DOES NOT SUCCEED OR EQUAL +22E2 NOT SQUARE IMAGE OF OR EQUAL TO +22E3 NOT SQUARE ORIGINAL OF OR EQUAL TO +22E4 SQUARE IMAGE OF OR NOT EQUAL TO +22E5 SQUARE ORIGINAL OF OR NOT EQUAL TO +22E6 LESS-THAN BUT NOT EQUIVALENT TO +22E7 GREATER-THAN BUT NOT EQUIVALENT TO +22E8 PRECEDES BUT NOT EQUIVALENT TO +22E9 SUCCEEDS BUT NOT EQUIVALENT TO +22EA NOT NORMAL SUBGROUP OF +22EB DOES NOT CONTAIN AS NORMAL SUBGROUP +22EC NOT NORMAL SUBGROUP OF OR EQUAL TO +22ED DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +22EE VERTICAL ELLIPSIS +22EF MIDLINE HORIZONTAL ELLIPSIS +22F0 UP RIGHT DIAGONAL ELLIPSIS +22F1 DOWN RIGHT DIAGONAL ELLIPSIS +22F2 ELEMENT OF WITH LONG HORIZONTAL STROKE +22F3 ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F4 SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F5 ELEMENT OF WITH DOT ABOVE +22F6 ELEMENT OF WITH OVERBAR +22F7 SMALL ELEMENT OF WITH OVERBAR +22F8 ELEMENT OF WITH UNDERBAR +22F9 ELEMENT OF WITH TWO HORIZONTAL STROKES +22FA CONTAINS WITH LONG HORIZONTAL STROKE +22FB CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FC SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FD CONTAINS WITH OVERBAR +22FE SMALL CONTAINS WITH OVERBAR +22FF Z NOTATION BAG MEMBERSHIP +2300 DIAMETER SIGN +2301 ELECTRIC ARROW +2302 HOUSE +2303 UP ARROWHEAD +2304 DOWN ARROWHEAD +2305 PROJECTIVE +2306 PERSPECTIVE +2307 WAVY LINE +2308 LEFT CEILING +2309 RIGHT CEILING +230A LEFT FLOOR +230B RIGHT FLOOR +230C BOTTOM RIGHT CROP +230D BOTTOM LEFT CROP +230E TOP RIGHT CROP +230F TOP LEFT CROP +2310 REVERSED NOT SIGN +2311 SQUARE LOZENGE +2312 ARC +2313 SEGMENT +2314 SECTOR +2315 TELEPHONE RECORDER +2316 POSITION INDICATOR +2317 VIEWDATA SQUARE +2318 PLACE OF INTEREST SIGN +2319 TURNED NOT SIGN +231A WATCH +231B HOURGLASS +231C TOP LEFT CORNER +231D TOP RIGHT CORNER +231E BOTTOM LEFT CORNER +231F BOTTOM RIGHT CORNER +2320 TOP HALF INTEGRAL +2321 BOTTOM HALF INTEGRAL +2322 FROWN +2323 SMILE +2324 UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS +2325 OPTION KEY +2326 ERASE TO THE RIGHT +2327 X IN A RECTANGLE BOX +2328 KEYBOARD +2329 LEFT-POINTING ANGLE BRACKET +232A RIGHT-POINTING ANGLE BRACKET +232B ERASE TO THE LEFT +232C BENZENE RING +232D CYLINDRICITY +232E ALL AROUND-PROFILE +232F SYMMETRY +2330 TOTAL RUNOUT +2331 DIMENSION ORIGIN +2332 CONICAL TAPER +2333 SLOPE +2334 COUNTERBORE +2335 COUNTERSINK +2336 APL FUNCTIONAL SYMBOL I-BEAM +2337 APL FUNCTIONAL SYMBOL SQUISH QUAD +2338 APL FUNCTIONAL SYMBOL QUAD EQUAL +2339 APL FUNCTIONAL SYMBOL QUAD DIVIDE +233A APL FUNCTIONAL SYMBOL QUAD DIAMOND +233B APL FUNCTIONAL SYMBOL QUAD JOT +233C APL FUNCTIONAL SYMBOL QUAD CIRCLE +233D APL FUNCTIONAL SYMBOL CIRCLE STILE +233E APL FUNCTIONAL SYMBOL CIRCLE JOT +233F APL FUNCTIONAL SYMBOL SLASH BAR +2340 APL FUNCTIONAL SYMBOL BACKSLASH BAR +2341 APL FUNCTIONAL SYMBOL QUAD SLASH +2342 APL FUNCTIONAL SYMBOL QUAD BACKSLASH +2343 APL FUNCTIONAL SYMBOL QUAD LESS-THAN +2344 APL FUNCTIONAL SYMBOL QUAD GREATER-THAN +2345 APL FUNCTIONAL SYMBOL LEFTWARDS VANE +2346 APL FUNCTIONAL SYMBOL RIGHTWARDS VANE +2347 APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW +2348 APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW +2349 APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH +234A APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR +234B APL FUNCTIONAL SYMBOL DELTA STILE +234C APL FUNCTIONAL SYMBOL QUAD DOWN CARET +234D APL FUNCTIONAL SYMBOL QUAD DELTA +234E APL FUNCTIONAL SYMBOL DOWN TACK JOT +234F APL FUNCTIONAL SYMBOL UPWARDS VANE +2350 APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW +2351 APL FUNCTIONAL SYMBOL UP TACK OVERBAR +2352 APL FUNCTIONAL SYMBOL DEL STILE +2353 APL FUNCTIONAL SYMBOL QUAD UP CARET +2354 APL FUNCTIONAL SYMBOL QUAD DEL +2355 APL FUNCTIONAL SYMBOL UP TACK JOT +2356 APL FUNCTIONAL SYMBOL DOWNWARDS VANE +2357 APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW +2358 APL FUNCTIONAL SYMBOL QUOTE UNDERBAR +2359 APL FUNCTIONAL SYMBOL DELTA UNDERBAR +235A APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR +235B APL FUNCTIONAL SYMBOL JOT UNDERBAR +235C APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR +235D APL FUNCTIONAL SYMBOL UP SHOE JOT +235E APL FUNCTIONAL SYMBOL QUOTE QUAD +235F APL FUNCTIONAL SYMBOL CIRCLE STAR +2360 APL FUNCTIONAL SYMBOL QUAD COLON +2361 APL FUNCTIONAL SYMBOL UP TACK DIAERESIS +2362 APL FUNCTIONAL SYMBOL DEL DIAERESIS +2363 APL FUNCTIONAL SYMBOL STAR DIAERESIS +2364 APL FUNCTIONAL SYMBOL JOT DIAERESIS +2365 APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS +2366 APL FUNCTIONAL SYMBOL DOWN SHOE STILE +2367 APL FUNCTIONAL SYMBOL LEFT SHOE STILE +2368 APL FUNCTIONAL SYMBOL TILDE DIAERESIS +2369 APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS +236A APL FUNCTIONAL SYMBOL COMMA BAR +236B APL FUNCTIONAL SYMBOL DEL TILDE +236C APL FUNCTIONAL SYMBOL ZILDE +236D APL FUNCTIONAL SYMBOL STILE TILDE +236E APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR +236F APL FUNCTIONAL SYMBOL QUAD NOT EQUAL +2370 APL FUNCTIONAL SYMBOL QUAD QUESTION +2371 APL FUNCTIONAL SYMBOL DOWN CARET TILDE +2372 APL FUNCTIONAL SYMBOL UP CARET TILDE +2373 APL FUNCTIONAL SYMBOL IOTA +2374 APL FUNCTIONAL SYMBOL RHO +2375 APL FUNCTIONAL SYMBOL OMEGA +2376 APL FUNCTIONAL SYMBOL ALPHA UNDERBAR +2377 APL FUNCTIONAL SYMBOL EPSILON UNDERBAR +2378 APL FUNCTIONAL SYMBOL IOTA UNDERBAR +2379 APL FUNCTIONAL SYMBOL OMEGA UNDERBAR +237A APL FUNCTIONAL SYMBOL ALPHA +237B NOT CHECK MARK +237C RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D SHOULDERED OPEN BOX +237E BELL SYMBOL +237F VERTICAL LINE WITH MIDDLE DOT +2380 INSERTION SYMBOL +2381 CONTINUOUS UNDERLINE SYMBOL +2382 DISCONTINUOUS UNDERLINE SYMBOL +2383 EMPHASIS SYMBOL +2384 COMPOSITION SYMBOL +2385 WHITE SQUARE WITH CENTRE VERTICAL LINE +2386 ENTER SYMBOL +2387 ALTERNATIVE KEY SYMBOL +2388 HELM SYMBOL +2389 CIRCLED HORIZONTAL BAR WITH NOTCH +238A CIRCLED TRIANGLE DOWN +238B BROKEN CIRCLE WITH NORTHWEST ARROW +238C UNDO SYMBOL +238D MONOSTABLE SYMBOL +238E HYSTERESIS SYMBOL +238F OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL +2390 OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL +2391 PASSIVE-PULL-DOWN-OUTPUT SYMBOL +2392 PASSIVE-PULL-UP-OUTPUT SYMBOL +2393 DIRECT CURRENT SYMBOL FORM TWO +2394 SOFTWARE-FUNCTION SYMBOL +2395 APL FUNCTIONAL SYMBOL QUAD +2396 DECIMAL SEPARATOR KEY SYMBOL +2397 PREVIOUS PAGE +2398 NEXT PAGE +2399 PRINT SCREEN SYMBOL +239A CLEAR SCREEN SYMBOL +239B LEFT PARENTHESIS UPPER HOOK +239C LEFT PARENTHESIS EXTENSION +239D LEFT PARENTHESIS LOWER HOOK +239E RIGHT PARENTHESIS UPPER HOOK +239F RIGHT PARENTHESIS EXTENSION +23A0 RIGHT PARENTHESIS LOWER HOOK +23A1 LEFT SQUARE BRACKET UPPER CORNER +23A2 LEFT SQUARE BRACKET EXTENSION +23A3 LEFT SQUARE BRACKET LOWER CORNER +23A4 RIGHT SQUARE BRACKET UPPER CORNER +23A5 RIGHT SQUARE BRACKET EXTENSION +23A6 RIGHT SQUARE BRACKET LOWER CORNER +23A7 LEFT CURLY BRACKET UPPER HOOK +23A8 LEFT CURLY BRACKET MIDDLE PIECE +23A9 LEFT CURLY BRACKET LOWER HOOK +23AA CURLY BRACKET EXTENSION +23AB RIGHT CURLY BRACKET UPPER HOOK +23AC RIGHT CURLY BRACKET MIDDLE PIECE +23AD RIGHT CURLY BRACKET LOWER HOOK +23AE INTEGRAL EXTENSION +23AF HORIZONTAL LINE EXTENSION +23B0 UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION +23B1 UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION +23B2 SUMMATION TOP +23B3 SUMMATION BOTTOM +23B4 TOP SQUARE BRACKET +23B5 BOTTOM SQUARE BRACKET +23B6 BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET +23B7 RADICAL SYMBOL BOTTOM +23B8 LEFT VERTICAL BOX LINE +23B9 RIGHT VERTICAL BOX LINE +23BA HORIZONTAL SCAN LINE-1 +23BB HORIZONTAL SCAN LINE-3 +23BC HORIZONTAL SCAN LINE-7 +23BD HORIZONTAL SCAN LINE-9 +23BE DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT +23BF DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT +23C0 DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE +23C1 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE +23C2 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE +23C3 DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE +23C4 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE +23C5 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE +23C6 DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE +23C7 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE +23C8 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE +23C9 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL +23CA DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL +23CB DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT +23CC DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT +23CD SQUARE FOOT +23CE RETURN SYMBOL +23CF EJECT SYMBOL +23D0 VERTICAL LINE EXTENSION +23D1 METRICAL BREVE +23D2 METRICAL LONG OVER SHORT +23D3 METRICAL SHORT OVER LONG +23D4 METRICAL LONG OVER TWO SHORTS +23D5 METRICAL TWO SHORTS OVER LONG +23D6 METRICAL TWO SHORTS JOINED +23D7 METRICAL TRISEME +23D8 METRICAL TETRASEME +23D9 METRICAL PENTASEME +23DA EARTH GROUND +23DB FUSE +2400 SYMBOL FOR NULL +2401 SYMBOL FOR START OF HEADING +2402 SYMBOL FOR START OF TEXT +2403 SYMBOL FOR END OF TEXT +2404 SYMBOL FOR END OF TRANSMISSION +2405 SYMBOL FOR ENQUIRY +2406 SYMBOL FOR ACKNOWLEDGE +2407 SYMBOL FOR BELL +2408 SYMBOL FOR BACKSPACE +2409 SYMBOL FOR HORIZONTAL TABULATION +240A SYMBOL FOR LINE FEED +240B SYMBOL FOR VERTICAL TABULATION +240C SYMBOL FOR FORM FEED +240D SYMBOL FOR CARRIAGE RETURN +240E SYMBOL FOR SHIFT OUT +240F SYMBOL FOR SHIFT IN +2410 SYMBOL FOR DATA LINK ESCAPE +2411 SYMBOL FOR DEVICE CONTROL ONE +2412 SYMBOL FOR DEVICE CONTROL TWO +2413 SYMBOL FOR DEVICE CONTROL THREE +2414 SYMBOL FOR DEVICE CONTROL FOUR +2415 SYMBOL FOR NEGATIVE ACKNOWLEDGE +2416 SYMBOL FOR SYNCHRONOUS IDLE +2417 SYMBOL FOR END OF TRANSMISSION BLOCK +2418 SYMBOL FOR CANCEL +2419 SYMBOL FOR END OF MEDIUM +241A SYMBOL FOR SUBSTITUTE +241B SYMBOL FOR ESCAPE +241C SYMBOL FOR FILE SEPARATOR +241D SYMBOL FOR GROUP SEPARATOR +241E SYMBOL FOR RECORD SEPARATOR +241F SYMBOL FOR UNIT SEPARATOR +2420 SYMBOL FOR SPACE +2421 SYMBOL FOR DELETE +2422 BLANK SYMBOL +2423 OPEN BOX +2424 SYMBOL FOR NEWLINE +2425 SYMBOL FOR DELETE FORM TWO +2426 SYMBOL FOR SUBSTITUTE FORM TWO +2440 OCR HOOK +2441 OCR CHAIR +2442 OCR FORK +2443 OCR INVERTED FORK +2444 OCR BELT BUCKLE +2445 OCR BOW TIE +2446 OCR BRANCH BANK IDENTIFICATION +2447 OCR AMOUNT OF CHECK +2448 OCR DASH +2449 OCR CUSTOMER ACCOUNT NUMBER +244A OCR DOUBLE BACKSLASH +2460 CIRCLED DIGIT ONE +2461 CIRCLED DIGIT TWO +2462 CIRCLED DIGIT THREE +2463 CIRCLED DIGIT FOUR +2464 CIRCLED DIGIT FIVE +2465 CIRCLED DIGIT SIX +2466 CIRCLED DIGIT SEVEN +2467 CIRCLED DIGIT EIGHT +2468 CIRCLED DIGIT NINE +2469 CIRCLED NUMBER TEN +246A CIRCLED NUMBER ELEVEN +246B CIRCLED NUMBER TWELVE +246C CIRCLED NUMBER THIRTEEN +246D CIRCLED NUMBER FOURTEEN +246E CIRCLED NUMBER FIFTEEN +246F CIRCLED NUMBER SIXTEEN +2470 CIRCLED NUMBER SEVENTEEN +2471 CIRCLED NUMBER EIGHTEEN +2472 CIRCLED NUMBER NINETEEN +2473 CIRCLED NUMBER TWENTY +2474 PARENTHESIZED DIGIT ONE +2475 PARENTHESIZED DIGIT TWO +2476 PARENTHESIZED DIGIT THREE +2477 PARENTHESIZED DIGIT FOUR +2478 PARENTHESIZED DIGIT FIVE +2479 PARENTHESIZED DIGIT SIX +247A PARENTHESIZED DIGIT SEVEN +247B PARENTHESIZED DIGIT EIGHT +247C PARENTHESIZED DIGIT NINE +247D PARENTHESIZED NUMBER TEN +247E PARENTHESIZED NUMBER ELEVEN +247F PARENTHESIZED NUMBER TWELVE +2480 PARENTHESIZED NUMBER THIRTEEN +2481 PARENTHESIZED NUMBER FOURTEEN +2482 PARENTHESIZED NUMBER FIFTEEN +2483 PARENTHESIZED NUMBER SIXTEEN +2484 PARENTHESIZED NUMBER SEVENTEEN +2485 PARENTHESIZED NUMBER EIGHTEEN +2486 PARENTHESIZED NUMBER NINETEEN +2487 PARENTHESIZED NUMBER TWENTY +2488 DIGIT ONE FULL STOP +2489 DIGIT TWO FULL STOP +248A DIGIT THREE FULL STOP +248B DIGIT FOUR FULL STOP +248C DIGIT FIVE FULL STOP +248D DIGIT SIX FULL STOP +248E DIGIT SEVEN FULL STOP +248F DIGIT EIGHT FULL STOP +2490 DIGIT NINE FULL STOP +2491 NUMBER TEN FULL STOP +2492 NUMBER ELEVEN FULL STOP +2493 NUMBER TWELVE FULL STOP +2494 NUMBER THIRTEEN FULL STOP +2495 NUMBER FOURTEEN FULL STOP +2496 NUMBER FIFTEEN FULL STOP +2497 NUMBER SIXTEEN FULL STOP +2498 NUMBER SEVENTEEN FULL STOP +2499 NUMBER EIGHTEEN FULL STOP +249A NUMBER NINETEEN FULL STOP +249B NUMBER TWENTY FULL STOP +249C PARENTHESIZED LATIN SMALL LETTER A +249D PARENTHESIZED LATIN SMALL LETTER B +249E PARENTHESIZED LATIN SMALL LETTER C +249F PARENTHESIZED LATIN SMALL LETTER D +24A0 PARENTHESIZED LATIN SMALL LETTER E +24A1 PARENTHESIZED LATIN SMALL LETTER F +24A2 PARENTHESIZED LATIN SMALL LETTER G +24A3 PARENTHESIZED LATIN SMALL LETTER H +24A4 PARENTHESIZED LATIN SMALL LETTER I +24A5 PARENTHESIZED LATIN SMALL LETTER J +24A6 PARENTHESIZED LATIN SMALL LETTER K +24A7 PARENTHESIZED LATIN SMALL LETTER L +24A8 PARENTHESIZED LATIN SMALL LETTER M +24A9 PARENTHESIZED LATIN SMALL LETTER N +24AA PARENTHESIZED LATIN SMALL LETTER O +24AB PARENTHESIZED LATIN SMALL LETTER P +24AC PARENTHESIZED LATIN SMALL LETTER Q +24AD PARENTHESIZED LATIN SMALL LETTER R +24AE PARENTHESIZED LATIN SMALL LETTER S +24AF PARENTHESIZED LATIN SMALL LETTER T +24B0 PARENTHESIZED LATIN SMALL LETTER U +24B1 PARENTHESIZED LATIN SMALL LETTER V +24B2 PARENTHESIZED LATIN SMALL LETTER W +24B3 PARENTHESIZED LATIN SMALL LETTER X +24B4 PARENTHESIZED LATIN SMALL LETTER Y +24B5 PARENTHESIZED LATIN SMALL LETTER Z +24B6 CIRCLED LATIN CAPITAL LETTER A +24B7 CIRCLED LATIN CAPITAL LETTER B +24B8 CIRCLED LATIN CAPITAL LETTER C +24B9 CIRCLED LATIN CAPITAL LETTER D +24BA CIRCLED LATIN CAPITAL LETTER E +24BB CIRCLED LATIN CAPITAL LETTER F +24BC CIRCLED LATIN CAPITAL LETTER G +24BD CIRCLED LATIN CAPITAL LETTER H +24BE CIRCLED LATIN CAPITAL LETTER I +24BF CIRCLED LATIN CAPITAL LETTER J +24C0 CIRCLED LATIN CAPITAL LETTER K +24C1 CIRCLED LATIN CAPITAL LETTER L +24C2 CIRCLED LATIN CAPITAL LETTER M +24C3 CIRCLED LATIN CAPITAL LETTER N +24C4 CIRCLED LATIN CAPITAL LETTER O +24C5 CIRCLED LATIN CAPITAL LETTER P +24C6 CIRCLED LATIN CAPITAL LETTER Q +24C7 CIRCLED LATIN CAPITAL LETTER R +24C8 CIRCLED LATIN CAPITAL LETTER S +24C9 CIRCLED LATIN CAPITAL LETTER T +24CA CIRCLED LATIN CAPITAL LETTER U +24CB CIRCLED LATIN CAPITAL LETTER V +24CC CIRCLED LATIN CAPITAL LETTER W +24CD CIRCLED LATIN CAPITAL LETTER X +24CE CIRCLED LATIN CAPITAL LETTER Y +24CF CIRCLED LATIN CAPITAL LETTER Z +24D0 CIRCLED LATIN SMALL LETTER A +24D1 CIRCLED LATIN SMALL LETTER B +24D2 CIRCLED LATIN SMALL LETTER C +24D3 CIRCLED LATIN SMALL LETTER D +24D4 CIRCLED LATIN SMALL LETTER E +24D5 CIRCLED LATIN SMALL LETTER F +24D6 CIRCLED LATIN SMALL LETTER G +24D7 CIRCLED LATIN SMALL LETTER H +24D8 CIRCLED LATIN SMALL LETTER I +24D9 CIRCLED LATIN SMALL LETTER J +24DA CIRCLED LATIN SMALL LETTER K +24DB CIRCLED LATIN SMALL LETTER L +24DC CIRCLED LATIN SMALL LETTER M +24DD CIRCLED LATIN SMALL LETTER N +24DE CIRCLED LATIN SMALL LETTER O +24DF CIRCLED LATIN SMALL LETTER P +24E0 CIRCLED LATIN SMALL LETTER Q +24E1 CIRCLED LATIN SMALL LETTER R +24E2 CIRCLED LATIN SMALL LETTER S +24E3 CIRCLED LATIN SMALL LETTER T +24E4 CIRCLED LATIN SMALL LETTER U +24E5 CIRCLED LATIN SMALL LETTER V +24E6 CIRCLED LATIN SMALL LETTER W +24E7 CIRCLED LATIN SMALL LETTER X +24E8 CIRCLED LATIN SMALL LETTER Y +24E9 CIRCLED LATIN SMALL LETTER Z +24EA CIRCLED DIGIT ZERO +24EB NEGATIVE CIRCLED NUMBER ELEVEN +24EC NEGATIVE CIRCLED NUMBER TWELVE +24ED NEGATIVE CIRCLED NUMBER THIRTEEN +24EE NEGATIVE CIRCLED NUMBER FOURTEEN +24EF NEGATIVE CIRCLED NUMBER FIFTEEN +24F0 NEGATIVE CIRCLED NUMBER SIXTEEN +24F1 NEGATIVE CIRCLED NUMBER SEVENTEEN +24F2 NEGATIVE CIRCLED NUMBER EIGHTEEN +24F3 NEGATIVE CIRCLED NUMBER NINETEEN +24F4 NEGATIVE CIRCLED NUMBER TWENTY +24F5 DOUBLE CIRCLED DIGIT ONE +24F6 DOUBLE CIRCLED DIGIT TWO +24F7 DOUBLE CIRCLED DIGIT THREE +24F8 DOUBLE CIRCLED DIGIT FOUR +24F9 DOUBLE CIRCLED DIGIT FIVE +24FA DOUBLE CIRCLED DIGIT SIX +24FB DOUBLE CIRCLED DIGIT SEVEN +24FC DOUBLE CIRCLED DIGIT EIGHT +24FD DOUBLE CIRCLED DIGIT NINE +24FE DOUBLE CIRCLED NUMBER TEN +24FF NEGATIVE CIRCLED DIGIT ZERO +2500 BOX DRAWINGS LIGHT HORIZONTAL +2501 BOX DRAWINGS HEAVY HORIZONTAL +2502 BOX DRAWINGS LIGHT VERTICAL +2503 BOX DRAWINGS HEAVY VERTICAL +2504 BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL +2505 BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL +2506 BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL +2507 BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL +2508 BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL +2509 BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL +250A BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL +250B BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL +250C BOX DRAWINGS LIGHT DOWN AND RIGHT +250D BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY +250E BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT +250F BOX DRAWINGS HEAVY DOWN AND RIGHT +2510 BOX DRAWINGS LIGHT DOWN AND LEFT +2511 BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY +2512 BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT +2513 BOX DRAWINGS HEAVY DOWN AND LEFT +2514 BOX DRAWINGS LIGHT UP AND RIGHT +2515 BOX DRAWINGS UP LIGHT AND RIGHT HEAVY +2516 BOX DRAWINGS UP HEAVY AND RIGHT LIGHT +2517 BOX DRAWINGS HEAVY UP AND RIGHT +2518 BOX DRAWINGS LIGHT UP AND LEFT +2519 BOX DRAWINGS UP LIGHT AND LEFT HEAVY +251A BOX DRAWINGS UP HEAVY AND LEFT LIGHT +251B BOX DRAWINGS HEAVY UP AND LEFT +251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT +251D BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +251E BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT +251F BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT +2520 BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +2521 BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY +2522 BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY +2523 BOX DRAWINGS HEAVY VERTICAL AND RIGHT +2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT +2525 BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +2526 BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT +2527 BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT +2528 BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +2529 BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY +252A BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY +252B BOX DRAWINGS HEAVY VERTICAL AND LEFT +252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +252D BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT +252E BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT +252F BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +2530 BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +2531 BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY +2532 BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY +2533 BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL +2535 BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT +2536 BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT +2537 BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +2538 BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +2539 BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY +253A BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY +253B BOX DRAWINGS HEAVY UP AND HORIZONTAL +253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +253D BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT +253E BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT +253F BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +2540 BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT +2541 BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT +2542 BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +2543 BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT +2544 BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT +2545 BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT +2546 BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT +2547 BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY +2548 BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY +2549 BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY +254A BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY +254B BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +254C BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL +254D BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL +254E BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL +254F BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL +2550 BOX DRAWINGS DOUBLE HORIZONTAL +2551 BOX DRAWINGS DOUBLE VERTICAL +2552 BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +2553 BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +2554 BOX DRAWINGS DOUBLE DOWN AND RIGHT +2555 BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +2556 BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +2557 BOX DRAWINGS DOUBLE DOWN AND LEFT +2558 BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +2559 BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +255A BOX DRAWINGS DOUBLE UP AND RIGHT +255B BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +255C BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +255D BOX DRAWINGS DOUBLE UP AND LEFT +255E BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +255F BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +2560 BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +2561 BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +2562 BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +2563 BOX DRAWINGS DOUBLE VERTICAL AND LEFT +2564 BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +2565 BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +2566 BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +2567 BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +2568 BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +2569 BOX DRAWINGS DOUBLE UP AND HORIZONTAL +256A BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +256B BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +256C BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +256D BOX DRAWINGS LIGHT ARC DOWN AND RIGHT +256E BOX DRAWINGS LIGHT ARC DOWN AND LEFT +256F BOX DRAWINGS LIGHT ARC UP AND LEFT +2570 BOX DRAWINGS LIGHT ARC UP AND RIGHT +2571 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT +2572 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT +2573 BOX DRAWINGS LIGHT DIAGONAL CROSS +2574 BOX DRAWINGS LIGHT LEFT +2575 BOX DRAWINGS LIGHT UP +2576 BOX DRAWINGS LIGHT RIGHT +2577 BOX DRAWINGS LIGHT DOWN +2578 BOX DRAWINGS HEAVY LEFT +2579 BOX DRAWINGS HEAVY UP +257A BOX DRAWINGS HEAVY RIGHT +257B BOX DRAWINGS HEAVY DOWN +257C BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT +257D BOX DRAWINGS LIGHT UP AND HEAVY DOWN +257E BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT +257F BOX DRAWINGS HEAVY UP AND LIGHT DOWN +2580 UPPER HALF BLOCK +2581 LOWER ONE EIGHTH BLOCK +2582 LOWER ONE QUARTER BLOCK +2583 LOWER THREE EIGHTHS BLOCK +2584 LOWER HALF BLOCK +2585 LOWER FIVE EIGHTHS BLOCK +2586 LOWER THREE QUARTERS BLOCK +2587 LOWER SEVEN EIGHTHS BLOCK +2588 FULL BLOCK +2589 LEFT SEVEN EIGHTHS BLOCK +258A LEFT THREE QUARTERS BLOCK +258B LEFT FIVE EIGHTHS BLOCK +258C LEFT HALF BLOCK +258D LEFT THREE EIGHTHS BLOCK +258E LEFT ONE QUARTER BLOCK +258F LEFT ONE EIGHTH BLOCK +2590 RIGHT HALF BLOCK +2591 LIGHT SHADE +2592 MEDIUM SHADE +2593 DARK SHADE +2594 UPPER ONE EIGHTH BLOCK +2595 RIGHT ONE EIGHTH BLOCK +2596 QUADRANT LOWER LEFT +2597 QUADRANT LOWER RIGHT +2598 QUADRANT UPPER LEFT +2599 QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT +259A QUADRANT UPPER LEFT AND LOWER RIGHT +259B QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT +259C QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT +259D QUADRANT UPPER RIGHT +259E QUADRANT UPPER RIGHT AND LOWER LEFT +259F QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT +25A0 BLACK SQUARE +25A1 WHITE SQUARE +25A2 WHITE SQUARE WITH ROUNDED CORNERS +25A3 WHITE SQUARE CONTAINING BLACK SMALL SQUARE +25A4 SQUARE WITH HORIZONTAL FILL +25A5 SQUARE WITH VERTICAL FILL +25A6 SQUARE WITH ORTHOGONAL CROSSHATCH FILL +25A7 SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL +25A8 SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL +25A9 SQUARE WITH DIAGONAL CROSSHATCH FILL +25AA BLACK SMALL SQUARE +25AB WHITE SMALL SQUARE +25AC BLACK RECTANGLE +25AD WHITE RECTANGLE +25AE BLACK VERTICAL RECTANGLE +25AF WHITE VERTICAL RECTANGLE +25B0 BLACK PARALLELOGRAM +25B1 WHITE PARALLELOGRAM +25B2 BLACK UP-POINTING TRIANGLE +25B3 WHITE UP-POINTING TRIANGLE +25B4 BLACK UP-POINTING SMALL TRIANGLE +25B5 WHITE UP-POINTING SMALL TRIANGLE +25B6 BLACK RIGHT-POINTING TRIANGLE +25B7 WHITE RIGHT-POINTING TRIANGLE +25B8 BLACK RIGHT-POINTING SMALL TRIANGLE +25B9 WHITE RIGHT-POINTING SMALL TRIANGLE +25BA BLACK RIGHT-POINTING POINTER +25BB WHITE RIGHT-POINTING POINTER +25BC BLACK DOWN-POINTING TRIANGLE +25BD WHITE DOWN-POINTING TRIANGLE +25BE BLACK DOWN-POINTING SMALL TRIANGLE +25BF WHITE DOWN-POINTING SMALL TRIANGLE +25C0 BLACK LEFT-POINTING TRIANGLE +25C1 WHITE LEFT-POINTING TRIANGLE +25C2 BLACK LEFT-POINTING SMALL TRIANGLE +25C3 WHITE LEFT-POINTING SMALL TRIANGLE +25C4 BLACK LEFT-POINTING POINTER +25C5 WHITE LEFT-POINTING POINTER +25C6 BLACK DIAMOND +25C7 WHITE DIAMOND +25C8 WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND +25C9 FISHEYE +25CA LOZENGE +25CB WHITE CIRCLE +25CC DOTTED CIRCLE +25CD CIRCLE WITH VERTICAL FILL +25CE BULLSEYE +25CF BLACK CIRCLE +25D0 CIRCLE WITH LEFT HALF BLACK +25D1 CIRCLE WITH RIGHT HALF BLACK +25D2 CIRCLE WITH LOWER HALF BLACK +25D3 CIRCLE WITH UPPER HALF BLACK +25D4 CIRCLE WITH UPPER RIGHT QUADRANT BLACK +25D5 CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK +25D6 LEFT HALF BLACK CIRCLE +25D7 RIGHT HALF BLACK CIRCLE +25D8 INVERSE BULLET +25D9 INVERSE WHITE CIRCLE +25DA UPPER HALF INVERSE WHITE CIRCLE +25DB LOWER HALF INVERSE WHITE CIRCLE +25DC UPPER LEFT QUADRANT CIRCULAR ARC +25DD UPPER RIGHT QUADRANT CIRCULAR ARC +25DE LOWER RIGHT QUADRANT CIRCULAR ARC +25DF LOWER LEFT QUADRANT CIRCULAR ARC +25E0 UPPER HALF CIRCLE +25E1 LOWER HALF CIRCLE +25E2 BLACK LOWER RIGHT TRIANGLE +25E3 BLACK LOWER LEFT TRIANGLE +25E4 BLACK UPPER LEFT TRIANGLE +25E5 BLACK UPPER RIGHT TRIANGLE +25E6 WHITE BULLET +25E7 SQUARE WITH LEFT HALF BLACK +25E8 SQUARE WITH RIGHT HALF BLACK +25E9 SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK +25EA SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK +25EB WHITE SQUARE WITH VERTICAL BISECTING LINE +25EC WHITE UP-POINTING TRIANGLE WITH DOT +25ED UP-POINTING TRIANGLE WITH LEFT HALF BLACK +25EE UP-POINTING TRIANGLE WITH RIGHT HALF BLACK +25EF LARGE CIRCLE +25F0 WHITE SQUARE WITH UPPER LEFT QUADRANT +25F1 WHITE SQUARE WITH LOWER LEFT QUADRANT +25F2 WHITE SQUARE WITH LOWER RIGHT QUADRANT +25F3 WHITE SQUARE WITH UPPER RIGHT QUADRANT +25F4 WHITE CIRCLE WITH UPPER LEFT QUADRANT +25F5 WHITE CIRCLE WITH LOWER LEFT QUADRANT +25F6 WHITE CIRCLE WITH LOWER RIGHT QUADRANT +25F7 WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8 UPPER LEFT TRIANGLE +25F9 UPPER RIGHT TRIANGLE +25FA LOWER LEFT TRIANGLE +25FB WHITE MEDIUM SQUARE +25FC BLACK MEDIUM SQUARE +25FD WHITE MEDIUM SMALL SQUARE +25FE BLACK MEDIUM SMALL SQUARE +25FF LOWER RIGHT TRIANGLE +2600 BLACK SUN WITH RAYS +2601 CLOUD +2602 UMBRELLA +2603 SNOWMAN +2604 COMET +2605 BLACK STAR +2606 WHITE STAR +2607 LIGHTNING +2608 THUNDERSTORM +2609 SUN +260A ASCENDING NODE +260B DESCENDING NODE +260C CONJUNCTION +260D OPPOSITION +260E BLACK TELEPHONE +260F WHITE TELEPHONE +2610 BALLOT BOX +2611 BALLOT BOX WITH CHECK +2612 BALLOT BOX WITH X +2613 SALTIRE +2614 UMBRELLA WITH RAIN DROPS +2615 HOT BEVERAGE +2616 WHITE SHOGI PIECE +2617 BLACK SHOGI PIECE +2618 SHAMROCK +2619 REVERSED ROTATED FLORAL HEART BULLET +261A BLACK LEFT POINTING INDEX +261B BLACK RIGHT POINTING INDEX +261C WHITE LEFT POINTING INDEX +261D WHITE UP POINTING INDEX +261E WHITE RIGHT POINTING INDEX +261F WHITE DOWN POINTING INDEX +2620 SKULL AND CROSSBONES +2621 CAUTION SIGN +2622 RADIOACTIVE SIGN +2623 BIOHAZARD SIGN +2624 CADUCEUS +2625 ANKH +2626 ORTHODOX CROSS +2627 CHI RHO +2628 CROSS OF LORRAINE +2629 CROSS OF JERUSALEM +262A STAR AND CRESCENT +262B FARSI SYMBOL +262C ADI SHAKTI +262D HAMMER AND SICKLE +262E PEACE SYMBOL +262F YIN YANG +2630 TRIGRAM FOR HEAVEN +2631 TRIGRAM FOR LAKE +2632 TRIGRAM FOR FIRE +2633 TRIGRAM FOR THUNDER +2634 TRIGRAM FOR WIND +2635 TRIGRAM FOR WATER +2636 TRIGRAM FOR MOUNTAIN +2637 TRIGRAM FOR EARTH +2638 WHEEL OF DHARMA +2639 WHITE FROWNING FACE +263A WHITE SMILING FACE +263B BLACK SMILING FACE +263C WHITE SUN WITH RAYS +263D FIRST QUARTER MOON +263E LAST QUARTER MOON +263F MERCURY +2640 FEMALE SIGN +2641 EARTH +2642 MALE SIGN +2643 JUPITER +2644 SATURN +2645 URANUS +2646 NEPTUNE +2647 PLUTO +2648 ARIES +2649 TAURUS +264A GEMINI +264B CANCER +264C LEO +264D VIRGO +264E LIBRA +264F SCORPIUS +2650 SAGITTARIUS +2651 CAPRICORN +2652 AQUARIUS +2653 PISCES +2654 WHITE CHESS KING +2655 WHITE CHESS QUEEN +2656 WHITE CHESS ROOK +2657 WHITE CHESS BISHOP +2658 WHITE CHESS KNIGHT +2659 WHITE CHESS PAWN +265A BLACK CHESS KING +265B BLACK CHESS QUEEN +265C BLACK CHESS ROOK +265D BLACK CHESS BISHOP +265E BLACK CHESS KNIGHT +265F BLACK CHESS PAWN +2660 BLACK SPADE SUIT +2661 WHITE HEART SUIT +2662 WHITE DIAMOND SUIT +2663 BLACK CLUB SUIT +2664 WHITE SPADE SUIT +2665 BLACK HEART SUIT +2666 BLACK DIAMOND SUIT +2667 WHITE CLUB SUIT +2668 HOT SPRINGS +2669 QUARTER NOTE +266A EIGHTH NOTE +266B BEAMED EIGHTH NOTES +266C BEAMED SIXTEENTH NOTES +266D MUSIC FLAT SIGN +266E MUSIC NATURAL SIGN +266F MUSIC SHARP SIGN +2670 WEST SYRIAC CROSS +2671 EAST SYRIAC CROSS +2672 UNIVERSAL RECYCLING SYMBOL +2673 RECYCLING SYMBOL FOR TYPE-1 PLASTICS +2674 RECYCLING SYMBOL FOR TYPE-2 PLASTICS +2675 RECYCLING SYMBOL FOR TYPE-3 PLASTICS +2676 RECYCLING SYMBOL FOR TYPE-4 PLASTICS +2677 RECYCLING SYMBOL FOR TYPE-5 PLASTICS +2678 RECYCLING SYMBOL FOR TYPE-6 PLASTICS +2679 RECYCLING SYMBOL FOR TYPE-7 PLASTICS +267A RECYCLING SYMBOL FOR GENERIC MATERIALS +267B BLACK UNIVERSAL RECYCLING SYMBOL +267C RECYCLED PAPER SYMBOL +267D PARTIALLY-RECYCLED PAPER SYMBOL +267E PERMANENT PAPER SIGN +267F WHEELCHAIR SYMBOL +2680 DIE FACE-1 +2681 DIE FACE-2 +2682 DIE FACE-3 +2683 DIE FACE-4 +2684 DIE FACE-5 +2685 DIE FACE-6 +2686 WHITE CIRCLE WITH DOT RIGHT +2687 WHITE CIRCLE WITH TWO DOTS +2688 BLACK CIRCLE WITH WHITE DOT RIGHT +2689 BLACK CIRCLE WITH TWO WHITE DOTS +268A MONOGRAM FOR YANG +268B MONOGRAM FOR YIN +268C DIGRAM FOR GREATER YANG +268D DIGRAM FOR LESSER YIN +268E DIGRAM FOR LESSER YANG +268F DIGRAM FOR GREATER YIN +2690 WHITE FLAG +2691 BLACK FLAG +2692 HAMMER AND PICK +2693 ANCHOR +2694 CROSSED SWORDS +2695 STAFF OF AESCULAPIUS +2696 SCALES +2697 ALEMBIC +2698 FLOWER +2699 GEAR +269A STAFF OF HERMES +269B ATOM SYMBOL +269C FLEUR-DE-LIS +26A0 WARNING SIGN +26A1 HIGH VOLTAGE SIGN +26A2 DOUBLED FEMALE SIGN +26A3 DOUBLED MALE SIGN +26A4 INTERLOCKED FEMALE AND MALE SIGN +26A5 MALE AND FEMALE SIGN +26A6 MALE WITH STROKE SIGN +26A7 MALE WITH STROKE AND MALE AND FEMALE SIGN +26A8 VERTICAL MALE WITH STROKE SIGN +26A9 HORIZONTAL MALE WITH STROKE SIGN +26AA MEDIUM WHITE CIRCLE +26AB MEDIUM BLACK CIRCLE +26AC MEDIUM SMALL WHITE CIRCLE +26AD MARRIAGE SYMBOL +26AE DIVORCE SYMBOL +26AF UNMARRIED PARTNERSHIP SYMBOL +26B0 COFFIN +26B1 FUNERAL URN +2701 UPPER BLADE SCISSORS +2702 BLACK SCISSORS +2703 LOWER BLADE SCISSORS +2704 WHITE SCISSORS +2706 TELEPHONE LOCATION SIGN +2707 TAPE DRIVE +2708 AIRPLANE +2709 ENVELOPE +270C VICTORY HAND +270D WRITING HAND +270E LOWER RIGHT PENCIL +270F PENCIL +2710 UPPER RIGHT PENCIL +2711 WHITE NIB +2712 BLACK NIB +2713 CHECK MARK +2714 HEAVY CHECK MARK +2715 MULTIPLICATION X +2716 HEAVY MULTIPLICATION X +2717 BALLOT X +2718 HEAVY BALLOT X +2719 OUTLINED GREEK CROSS +271A HEAVY GREEK CROSS +271B OPEN CENTRE CROSS +271C HEAVY OPEN CENTRE CROSS +271D LATIN CROSS +271E SHADOWED WHITE LATIN CROSS +271F OUTLINED LATIN CROSS +2720 MALTESE CROSS +2721 STAR OF DAVID +2722 FOUR TEARDROP-SPOKED ASTERISK +2723 FOUR BALLOON-SPOKED ASTERISK +2724 HEAVY FOUR BALLOON-SPOKED ASTERISK +2725 FOUR CLUB-SPOKED ASTERISK +2726 BLACK FOUR POINTED STAR +2727 WHITE FOUR POINTED STAR +2729 STRESS OUTLINED WHITE STAR +272A CIRCLED WHITE STAR +272B OPEN CENTRE BLACK STAR +272C BLACK CENTRE WHITE STAR +272D OUTLINED BLACK STAR +272E HEAVY OUTLINED BLACK STAR +272F PINWHEEL STAR +2730 SHADOWED WHITE STAR +2731 HEAVY ASTERISK +2732 OPEN CENTRE ASTERISK +2733 EIGHT SPOKED ASTERISK +2734 EIGHT POINTED BLACK STAR +2735 EIGHT POINTED PINWHEEL STAR +2736 SIX POINTED BLACK STAR +2737 EIGHT POINTED RECTILINEAR BLACK STAR +2738 HEAVY EIGHT POINTED RECTILINEAR BLACK STAR +2739 TWELVE POINTED BLACK STAR +273A SIXTEEN POINTED ASTERISK +273B TEARDROP-SPOKED ASTERISK +273C OPEN CENTRE TEARDROP-SPOKED ASTERISK +273D HEAVY TEARDROP-SPOKED ASTERISK +273E SIX PETALLED BLACK AND WHITE FLORETTE +273F BLACK FLORETTE +2740 WHITE FLORETTE +2741 EIGHT PETALLED OUTLINED BLACK FLORETTE +2742 CIRCLED OPEN CENTRE EIGHT POINTED STAR +2743 HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK +2744 SNOWFLAKE +2745 TIGHT TRIFOLIATE SNOWFLAKE +2746 HEAVY CHEVRON SNOWFLAKE +2747 SPARKLE +2748 HEAVY SPARKLE +2749 BALLOON-SPOKED ASTERISK +274A EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274B HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274D SHADOWED WHITE CIRCLE +274F LOWER RIGHT DROP-SHADOWED WHITE SQUARE +2750 UPPER RIGHT DROP-SHADOWED WHITE SQUARE +2751 LOWER RIGHT SHADOWED WHITE SQUARE +2752 UPPER RIGHT SHADOWED WHITE SQUARE +2756 BLACK DIAMOND MINUS WHITE X +2758 LIGHT VERTICAL BAR +2759 MEDIUM VERTICAL BAR +275A HEAVY VERTICAL BAR +275B HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT +275C HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT +275D HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT +275E HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +2761 CURVED STEM PARAGRAPH SIGN ORNAMENT +2762 HEAVY EXCLAMATION MARK ORNAMENT +2763 HEAVY HEART EXCLAMATION MARK ORNAMENT +2764 HEAVY BLACK HEART +2765 ROTATED HEAVY BLACK HEART BULLET +2766 FLORAL HEART +2767 ROTATED FLORAL HEART BULLET +2768 MEDIUM LEFT PARENTHESIS ORNAMENT +2769 MEDIUM RIGHT PARENTHESIS ORNAMENT +276A MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 MEDIUM RIGHT CURLY BRACKET ORNAMENT +2776 DINGBAT NEGATIVE CIRCLED DIGIT ONE +2777 DINGBAT NEGATIVE CIRCLED DIGIT TWO +2778 DINGBAT NEGATIVE CIRCLED DIGIT THREE +2779 DINGBAT NEGATIVE CIRCLED DIGIT FOUR +277A DINGBAT NEGATIVE CIRCLED DIGIT FIVE +277B DINGBAT NEGATIVE CIRCLED DIGIT SIX +277C DINGBAT NEGATIVE CIRCLED DIGIT SEVEN +277D DINGBAT NEGATIVE CIRCLED DIGIT EIGHT +277E DINGBAT NEGATIVE CIRCLED DIGIT NINE +277F DINGBAT NEGATIVE CIRCLED NUMBER TEN +2780 DINGBAT CIRCLED SANS-SERIF DIGIT ONE +2781 DINGBAT CIRCLED SANS-SERIF DIGIT TWO +2782 DINGBAT CIRCLED SANS-SERIF DIGIT THREE +2783 DINGBAT CIRCLED SANS-SERIF DIGIT FOUR +2784 DINGBAT CIRCLED SANS-SERIF DIGIT FIVE +2785 DINGBAT CIRCLED SANS-SERIF DIGIT SIX +2786 DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN +2787 DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT +2788 DINGBAT CIRCLED SANS-SERIF DIGIT NINE +2789 DINGBAT CIRCLED SANS-SERIF NUMBER TEN +278A DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE +278B DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO +278C DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE +278D DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR +278E DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE +278F DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX +2790 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN +2791 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT +2792 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE +2793 DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +2794 HEAVY WIDE-HEADED RIGHTWARDS ARROW +2798 HEAVY SOUTH EAST ARROW +2799 HEAVY RIGHTWARDS ARROW +279A HEAVY NORTH EAST ARROW +279B DRAFTING POINT RIGHTWARDS ARROW +279C HEAVY ROUND-TIPPED RIGHTWARDS ARROW +279D TRIANGLE-HEADED RIGHTWARDS ARROW +279E HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW +279F DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +27A0 HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +27A1 BLACK RIGHTWARDS ARROW +27A2 THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD +27A3 THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD +27A4 BLACK RIGHTWARDS ARROWHEAD +27A5 HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW +27A6 HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW +27A7 SQUAT BLACK RIGHTWARDS ARROW +27A8 HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW +27A9 RIGHT-SHADED WHITE RIGHTWARDS ARROW +27AA LEFT-SHADED WHITE RIGHTWARDS ARROW +27AB BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW +27AC FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW +27AD HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27AE HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27AF NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B1 NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B2 CIRCLED HEAVY WHITE RIGHTWARDS ARROW +27B3 WHITE-FEATHERED RIGHTWARDS ARROW +27B4 BLACK-FEATHERED SOUTH EAST ARROW +27B5 BLACK-FEATHERED RIGHTWARDS ARROW +27B6 BLACK-FEATHERED NORTH EAST ARROW +27B7 HEAVY BLACK-FEATHERED SOUTH EAST ARROW +27B8 HEAVY BLACK-FEATHERED RIGHTWARDS ARROW +27B9 HEAVY BLACK-FEATHERED NORTH EAST ARROW +27BA TEARDROP-BARBED RIGHTWARDS ARROW +27BB HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW +27BC WEDGE-TAILED RIGHTWARDS ARROW +27BD HEAVY WEDGE-TAILED RIGHTWARDS ARROW +27BE OPEN-OUTLINED RIGHTWARDS ARROW +27C0 THREE DIMENSIONAL ANGLE +27C1 WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE +27C2 PERPENDICULAR +27C3 OPEN SUBSET +27C4 OPEN SUPERSET +27C5 LEFT S-SHAPED BAG DELIMITER +27C6 RIGHT S-SHAPED BAG DELIMITER +27D0 WHITE DIAMOND WITH CENTRED DOT +27D1 AND WITH DOT +27D2 ELEMENT OF OPENING UPWARDS +27D3 LOWER RIGHT CORNER WITH DOT +27D4 UPPER LEFT CORNER WITH DOT +27D5 LEFT OUTER JOIN +27D6 RIGHT OUTER JOIN +27D7 FULL OUTER JOIN +27D8 LARGE UP TACK +27D9 LARGE DOWN TACK +27DA LEFT AND RIGHT DOUBLE TURNSTILE +27DB LEFT AND RIGHT TACK +27DC LEFT MULTIMAP +27DD LONG RIGHT TACK +27DE LONG LEFT TACK +27DF UP TACK WITH CIRCLE ABOVE +27E0 LOZENGE DIVIDED BY HORIZONTAL RULE +27E1 WHITE CONCAVE-SIDED DIAMOND +27E2 WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK +27E3 WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK +27E4 WHITE SQUARE WITH LEFTWARDS TICK +27E5 WHITE SQUARE WITH RIGHTWARDS TICK +27E6 MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 MATHEMATICAL LEFT ANGLE BRACKET +27E9 MATHEMATICAL RIGHT ANGLE BRACKET +27EA MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27F0 UPWARDS QUADRUPLE ARROW +27F1 DOWNWARDS QUADRUPLE ARROW +27F2 ANTICLOCKWISE GAPPED CIRCLE ARROW +27F3 CLOCKWISE GAPPED CIRCLE ARROW +27F4 RIGHT ARROW WITH CIRCLED PLUS +27F5 LONG LEFTWARDS ARROW +27F6 LONG RIGHTWARDS ARROW +27F7 LONG LEFT RIGHT ARROW +27F8 LONG LEFTWARDS DOUBLE ARROW +27F9 LONG RIGHTWARDS DOUBLE ARROW +27FA LONG LEFT RIGHT DOUBLE ARROW +27FB LONG LEFTWARDS ARROW FROM BAR +27FC LONG RIGHTWARDS ARROW FROM BAR +27FD LONG LEFTWARDS DOUBLE ARROW FROM BAR +27FE LONG RIGHTWARDS DOUBLE ARROW FROM BAR +27FF LONG RIGHTWARDS SQUIGGLE ARROW +2800 BRAILLE PATTERN BLANK +2801 BRAILLE PATTERN DOTS-1 +2802 BRAILLE PATTERN DOTS-2 +2803 BRAILLE PATTERN DOTS-12 +2804 BRAILLE PATTERN DOTS-3 +2805 BRAILLE PATTERN DOTS-13 +2806 BRAILLE PATTERN DOTS-23 +2807 BRAILLE PATTERN DOTS-123 +2808 BRAILLE PATTERN DOTS-4 +2809 BRAILLE PATTERN DOTS-14 +280A BRAILLE PATTERN DOTS-24 +280B BRAILLE PATTERN DOTS-124 +280C BRAILLE PATTERN DOTS-34 +280D BRAILLE PATTERN DOTS-134 +280E BRAILLE PATTERN DOTS-234 +280F BRAILLE PATTERN DOTS-1234 +2810 BRAILLE PATTERN DOTS-5 +2811 BRAILLE PATTERN DOTS-15 +2812 BRAILLE PATTERN DOTS-25 +2813 BRAILLE PATTERN DOTS-125 +2814 BRAILLE PATTERN DOTS-35 +2815 BRAILLE PATTERN DOTS-135 +2816 BRAILLE PATTERN DOTS-235 +2817 BRAILLE PATTERN DOTS-1235 +2818 BRAILLE PATTERN DOTS-45 +2819 BRAILLE PATTERN DOTS-145 +281A BRAILLE PATTERN DOTS-245 +281B BRAILLE PATTERN DOTS-1245 +281C BRAILLE PATTERN DOTS-345 +281D BRAILLE PATTERN DOTS-1345 +281E BRAILLE PATTERN DOTS-2345 +281F BRAILLE PATTERN DOTS-12345 +2820 BRAILLE PATTERN DOTS-6 +2821 BRAILLE PATTERN DOTS-16 +2822 BRAILLE PATTERN DOTS-26 +2823 BRAILLE PATTERN DOTS-126 +2824 BRAILLE PATTERN DOTS-36 +2825 BRAILLE PATTERN DOTS-136 +2826 BRAILLE PATTERN DOTS-236 +2827 BRAILLE PATTERN DOTS-1236 +2828 BRAILLE PATTERN DOTS-46 +2829 BRAILLE PATTERN DOTS-146 +282A BRAILLE PATTERN DOTS-246 +282B BRAILLE PATTERN DOTS-1246 +282C BRAILLE PATTERN DOTS-346 +282D BRAILLE PATTERN DOTS-1346 +282E BRAILLE PATTERN DOTS-2346 +282F BRAILLE PATTERN DOTS-12346 +2830 BRAILLE PATTERN DOTS-56 +2831 BRAILLE PATTERN DOTS-156 +2832 BRAILLE PATTERN DOTS-256 +2833 BRAILLE PATTERN DOTS-1256 +2834 BRAILLE PATTERN DOTS-356 +2835 BRAILLE PATTERN DOTS-1356 +2836 BRAILLE PATTERN DOTS-2356 +2837 BRAILLE PATTERN DOTS-12356 +2838 BRAILLE PATTERN DOTS-456 +2839 BRAILLE PATTERN DOTS-1456 +283A BRAILLE PATTERN DOTS-2456 +283B BRAILLE PATTERN DOTS-12456 +283C BRAILLE PATTERN DOTS-3456 +283D BRAILLE PATTERN DOTS-13456 +283E BRAILLE PATTERN DOTS-23456 +283F BRAILLE PATTERN DOTS-123456 +2840 BRAILLE PATTERN DOTS-7 +2841 BRAILLE PATTERN DOTS-17 +2842 BRAILLE PATTERN DOTS-27 +2843 BRAILLE PATTERN DOTS-127 +2844 BRAILLE PATTERN DOTS-37 +2845 BRAILLE PATTERN DOTS-137 +2846 BRAILLE PATTERN DOTS-237 +2847 BRAILLE PATTERN DOTS-1237 +2848 BRAILLE PATTERN DOTS-47 +2849 BRAILLE PATTERN DOTS-147 +284A BRAILLE PATTERN DOTS-247 +284B BRAILLE PATTERN DOTS-1247 +284C BRAILLE PATTERN DOTS-347 +284D BRAILLE PATTERN DOTS-1347 +284E BRAILLE PATTERN DOTS-2347 +284F BRAILLE PATTERN DOTS-12347 +2850 BRAILLE PATTERN DOTS-57 +2851 BRAILLE PATTERN DOTS-157 +2852 BRAILLE PATTERN DOTS-257 +2853 BRAILLE PATTERN DOTS-1257 +2854 BRAILLE PATTERN DOTS-357 +2855 BRAILLE PATTERN DOTS-1357 +2856 BRAILLE PATTERN DOTS-2357 +2857 BRAILLE PATTERN DOTS-12357 +2858 BRAILLE PATTERN DOTS-457 +2859 BRAILLE PATTERN DOTS-1457 +285A BRAILLE PATTERN DOTS-2457 +285B BRAILLE PATTERN DOTS-12457 +285C BRAILLE PATTERN DOTS-3457 +285D BRAILLE PATTERN DOTS-13457 +285E BRAILLE PATTERN DOTS-23457 +285F BRAILLE PATTERN DOTS-123457 +2860 BRAILLE PATTERN DOTS-67 +2861 BRAILLE PATTERN DOTS-167 +2862 BRAILLE PATTERN DOTS-267 +2863 BRAILLE PATTERN DOTS-1267 +2864 BRAILLE PATTERN DOTS-367 +2865 BRAILLE PATTERN DOTS-1367 +2866 BRAILLE PATTERN DOTS-2367 +2867 BRAILLE PATTERN DOTS-12367 +2868 BRAILLE PATTERN DOTS-467 +2869 BRAILLE PATTERN DOTS-1467 +286A BRAILLE PATTERN DOTS-2467 +286B BRAILLE PATTERN DOTS-12467 +286C BRAILLE PATTERN DOTS-3467 +286D BRAILLE PATTERN DOTS-13467 +286E BRAILLE PATTERN DOTS-23467 +286F BRAILLE PATTERN DOTS-123467 +2870 BRAILLE PATTERN DOTS-567 +2871 BRAILLE PATTERN DOTS-1567 +2872 BRAILLE PATTERN DOTS-2567 +2873 BRAILLE PATTERN DOTS-12567 +2874 BRAILLE PATTERN DOTS-3567 +2875 BRAILLE PATTERN DOTS-13567 +2876 BRAILLE PATTERN DOTS-23567 +2877 BRAILLE PATTERN DOTS-123567 +2878 BRAILLE PATTERN DOTS-4567 +2879 BRAILLE PATTERN DOTS-14567 +287A BRAILLE PATTERN DOTS-24567 +287B BRAILLE PATTERN DOTS-124567 +287C BRAILLE PATTERN DOTS-34567 +287D BRAILLE PATTERN DOTS-134567 +287E BRAILLE PATTERN DOTS-234567 +287F BRAILLE PATTERN DOTS-1234567 +2880 BRAILLE PATTERN DOTS-8 +2881 BRAILLE PATTERN DOTS-18 +2882 BRAILLE PATTERN DOTS-28 +2883 BRAILLE PATTERN DOTS-128 +2884 BRAILLE PATTERN DOTS-38 +2885 BRAILLE PATTERN DOTS-138 +2886 BRAILLE PATTERN DOTS-238 +2887 BRAILLE PATTERN DOTS-1238 +2888 BRAILLE PATTERN DOTS-48 +2889 BRAILLE PATTERN DOTS-148 +288A BRAILLE PATTERN DOTS-248 +288B BRAILLE PATTERN DOTS-1248 +288C BRAILLE PATTERN DOTS-348 +288D BRAILLE PATTERN DOTS-1348 +288E BRAILLE PATTERN DOTS-2348 +288F BRAILLE PATTERN DOTS-12348 +2890 BRAILLE PATTERN DOTS-58 +2891 BRAILLE PATTERN DOTS-158 +2892 BRAILLE PATTERN DOTS-258 +2893 BRAILLE PATTERN DOTS-1258 +2894 BRAILLE PATTERN DOTS-358 +2895 BRAILLE PATTERN DOTS-1358 +2896 BRAILLE PATTERN DOTS-2358 +2897 BRAILLE PATTERN DOTS-12358 +2898 BRAILLE PATTERN DOTS-458 +2899 BRAILLE PATTERN DOTS-1458 +289A BRAILLE PATTERN DOTS-2458 +289B BRAILLE PATTERN DOTS-12458 +289C BRAILLE PATTERN DOTS-3458 +289D BRAILLE PATTERN DOTS-13458 +289E BRAILLE PATTERN DOTS-23458 +289F BRAILLE PATTERN DOTS-123458 +28A0 BRAILLE PATTERN DOTS-68 +28A1 BRAILLE PATTERN DOTS-168 +28A2 BRAILLE PATTERN DOTS-268 +28A3 BRAILLE PATTERN DOTS-1268 +28A4 BRAILLE PATTERN DOTS-368 +28A5 BRAILLE PATTERN DOTS-1368 +28A6 BRAILLE PATTERN DOTS-2368 +28A7 BRAILLE PATTERN DOTS-12368 +28A8 BRAILLE PATTERN DOTS-468 +28A9 BRAILLE PATTERN DOTS-1468 +28AA BRAILLE PATTERN DOTS-2468 +28AB BRAILLE PATTERN DOTS-12468 +28AC BRAILLE PATTERN DOTS-3468 +28AD BRAILLE PATTERN DOTS-13468 +28AE BRAILLE PATTERN DOTS-23468 +28AF BRAILLE PATTERN DOTS-123468 +28B0 BRAILLE PATTERN DOTS-568 +28B1 BRAILLE PATTERN DOTS-1568 +28B2 BRAILLE PATTERN DOTS-2568 +28B3 BRAILLE PATTERN DOTS-12568 +28B4 BRAILLE PATTERN DOTS-3568 +28B5 BRAILLE PATTERN DOTS-13568 +28B6 BRAILLE PATTERN DOTS-23568 +28B7 BRAILLE PATTERN DOTS-123568 +28B8 BRAILLE PATTERN DOTS-4568 +28B9 BRAILLE PATTERN DOTS-14568 +28BA BRAILLE PATTERN DOTS-24568 +28BB BRAILLE PATTERN DOTS-124568 +28BC BRAILLE PATTERN DOTS-34568 +28BD BRAILLE PATTERN DOTS-134568 +28BE BRAILLE PATTERN DOTS-234568 +28BF BRAILLE PATTERN DOTS-1234568 +28C0 BRAILLE PATTERN DOTS-78 +28C1 BRAILLE PATTERN DOTS-178 +28C2 BRAILLE PATTERN DOTS-278 +28C3 BRAILLE PATTERN DOTS-1278 +28C4 BRAILLE PATTERN DOTS-378 +28C5 BRAILLE PATTERN DOTS-1378 +28C6 BRAILLE PATTERN DOTS-2378 +28C7 BRAILLE PATTERN DOTS-12378 +28C8 BRAILLE PATTERN DOTS-478 +28C9 BRAILLE PATTERN DOTS-1478 +28CA BRAILLE PATTERN DOTS-2478 +28CB BRAILLE PATTERN DOTS-12478 +28CC BRAILLE PATTERN DOTS-3478 +28CD BRAILLE PATTERN DOTS-13478 +28CE BRAILLE PATTERN DOTS-23478 +28CF BRAILLE PATTERN DOTS-123478 +28D0 BRAILLE PATTERN DOTS-578 +28D1 BRAILLE PATTERN DOTS-1578 +28D2 BRAILLE PATTERN DOTS-2578 +28D3 BRAILLE PATTERN DOTS-12578 +28D4 BRAILLE PATTERN DOTS-3578 +28D5 BRAILLE PATTERN DOTS-13578 +28D6 BRAILLE PATTERN DOTS-23578 +28D7 BRAILLE PATTERN DOTS-123578 +28D8 BRAILLE PATTERN DOTS-4578 +28D9 BRAILLE PATTERN DOTS-14578 +28DA BRAILLE PATTERN DOTS-24578 +28DB BRAILLE PATTERN DOTS-124578 +28DC BRAILLE PATTERN DOTS-34578 +28DD BRAILLE PATTERN DOTS-134578 +28DE BRAILLE PATTERN DOTS-234578 +28DF BRAILLE PATTERN DOTS-1234578 +28E0 BRAILLE PATTERN DOTS-678 +28E1 BRAILLE PATTERN DOTS-1678 +28E2 BRAILLE PATTERN DOTS-2678 +28E3 BRAILLE PATTERN DOTS-12678 +28E4 BRAILLE PATTERN DOTS-3678 +28E5 BRAILLE PATTERN DOTS-13678 +28E6 BRAILLE PATTERN DOTS-23678 +28E7 BRAILLE PATTERN DOTS-123678 +28E8 BRAILLE PATTERN DOTS-4678 +28E9 BRAILLE PATTERN DOTS-14678 +28EA BRAILLE PATTERN DOTS-24678 +28EB BRAILLE PATTERN DOTS-124678 +28EC BRAILLE PATTERN DOTS-34678 +28ED BRAILLE PATTERN DOTS-134678 +28EE BRAILLE PATTERN DOTS-234678 +28EF BRAILLE PATTERN DOTS-1234678 +28F0 BRAILLE PATTERN DOTS-5678 +28F1 BRAILLE PATTERN DOTS-15678 +28F2 BRAILLE PATTERN DOTS-25678 +28F3 BRAILLE PATTERN DOTS-125678 +28F4 BRAILLE PATTERN DOTS-35678 +28F5 BRAILLE PATTERN DOTS-135678 +28F6 BRAILLE PATTERN DOTS-235678 +28F7 BRAILLE PATTERN DOTS-1235678 +28F8 BRAILLE PATTERN DOTS-45678 +28F9 BRAILLE PATTERN DOTS-145678 +28FA BRAILLE PATTERN DOTS-245678 +28FB BRAILLE PATTERN DOTS-1245678 +28FC BRAILLE PATTERN DOTS-345678 +28FD BRAILLE PATTERN DOTS-1345678 +28FE BRAILLE PATTERN DOTS-2345678 +28FF BRAILLE PATTERN DOTS-12345678 +2900 RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE +2901 RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE +2902 LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE +2903 RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE +2904 LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE +2905 RIGHTWARDS TWO-HEADED ARROW FROM BAR +2906 LEFTWARDS DOUBLE ARROW FROM BAR +2907 RIGHTWARDS DOUBLE ARROW FROM BAR +2908 DOWNWARDS ARROW WITH HORIZONTAL STROKE +2909 UPWARDS ARROW WITH HORIZONTAL STROKE +290A UPWARDS TRIPLE ARROW +290B DOWNWARDS TRIPLE ARROW +290C LEFTWARDS DOUBLE DASH ARROW +290D RIGHTWARDS DOUBLE DASH ARROW +290E LEFTWARDS TRIPLE DASH ARROW +290F RIGHTWARDS TRIPLE DASH ARROW +2910 RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW +2911 RIGHTWARDS ARROW WITH DOTTED STEM +2912 UPWARDS ARROW TO BAR +2913 DOWNWARDS ARROW TO BAR +2914 RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE +2915 RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2916 RIGHTWARDS TWO-HEADED ARROW WITH TAIL +2917 RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE +2918 RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2919 LEFTWARDS ARROW-TAIL +291A RIGHTWARDS ARROW-TAIL +291B LEFTWARDS DOUBLE ARROW-TAIL +291C RIGHTWARDS DOUBLE ARROW-TAIL +291D LEFTWARDS ARROW TO BLACK DIAMOND +291E RIGHTWARDS ARROW TO BLACK DIAMOND +291F LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND +2920 RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND +2921 NORTH WEST AND SOUTH EAST ARROW +2922 NORTH EAST AND SOUTH WEST ARROW +2923 NORTH WEST ARROW WITH HOOK +2924 NORTH EAST ARROW WITH HOOK +2925 SOUTH EAST ARROW WITH HOOK +2926 SOUTH WEST ARROW WITH HOOK +2927 NORTH WEST ARROW AND NORTH EAST ARROW +2928 NORTH EAST ARROW AND SOUTH EAST ARROW +2929 SOUTH EAST ARROW AND SOUTH WEST ARROW +292A SOUTH WEST ARROW AND NORTH WEST ARROW +292B RISING DIAGONAL CROSSING FALLING DIAGONAL +292C FALLING DIAGONAL CROSSING RISING DIAGONAL +292D SOUTH EAST ARROW CROSSING NORTH EAST ARROW +292E NORTH EAST ARROW CROSSING SOUTH EAST ARROW +292F FALLING DIAGONAL CROSSING NORTH EAST ARROW +2930 RISING DIAGONAL CROSSING SOUTH EAST ARROW +2931 NORTH EAST ARROW CROSSING NORTH WEST ARROW +2932 NORTH WEST ARROW CROSSING NORTH EAST ARROW +2933 WAVE ARROW POINTING DIRECTLY RIGHT +2934 ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS +2935 ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS +2936 ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS +2937 ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS +2938 RIGHT-SIDE ARC CLOCKWISE ARROW +2939 LEFT-SIDE ARC ANTICLOCKWISE ARROW +293A TOP ARC ANTICLOCKWISE ARROW +293B BOTTOM ARC ANTICLOCKWISE ARROW +293C TOP ARC CLOCKWISE ARROW WITH MINUS +293D TOP ARC ANTICLOCKWISE ARROW WITH PLUS +293E LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW +293F LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW +2940 ANTICLOCKWISE CLOSED CIRCLE ARROW +2941 CLOCKWISE CLOSED CIRCLE ARROW +2942 RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW +2943 LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW +2944 SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW +2945 RIGHTWARDS ARROW WITH PLUS BELOW +2946 LEFTWARDS ARROW WITH PLUS BELOW +2947 RIGHTWARDS ARROW THROUGH X +2948 LEFT RIGHT ARROW THROUGH SMALL CIRCLE +2949 UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE +294A LEFT BARB UP RIGHT BARB DOWN HARPOON +294B LEFT BARB DOWN RIGHT BARB UP HARPOON +294C UP BARB RIGHT DOWN BARB LEFT HARPOON +294D UP BARB LEFT DOWN BARB RIGHT HARPOON +294E LEFT BARB UP RIGHT BARB UP HARPOON +294F UP BARB RIGHT DOWN BARB RIGHT HARPOON +2950 LEFT BARB DOWN RIGHT BARB DOWN HARPOON +2951 UP BARB LEFT DOWN BARB LEFT HARPOON +2952 LEFTWARDS HARPOON WITH BARB UP TO BAR +2953 RIGHTWARDS HARPOON WITH BARB UP TO BAR +2954 UPWARDS HARPOON WITH BARB RIGHT TO BAR +2955 DOWNWARDS HARPOON WITH BARB RIGHT TO BAR +2956 LEFTWARDS HARPOON WITH BARB DOWN TO BAR +2957 RIGHTWARDS HARPOON WITH BARB DOWN TO BAR +2958 UPWARDS HARPOON WITH BARB LEFT TO BAR +2959 DOWNWARDS HARPOON WITH BARB LEFT TO BAR +295A LEFTWARDS HARPOON WITH BARB UP FROM BAR +295B RIGHTWARDS HARPOON WITH BARB UP FROM BAR +295C UPWARDS HARPOON WITH BARB RIGHT FROM BAR +295D DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR +295E LEFTWARDS HARPOON WITH BARB DOWN FROM BAR +295F RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR +2960 UPWARDS HARPOON WITH BARB LEFT FROM BAR +2961 DOWNWARDS HARPOON WITH BARB LEFT FROM BAR +2962 LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN +2963 UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +2964 RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +2965 DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +2966 LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP +2967 LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +2968 RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP +2969 RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN +296A LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +296B LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +296C RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +296D RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +296E UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +296F DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +2970 RIGHT DOUBLE ARROW WITH ROUNDED HEAD +2971 EQUALS SIGN ABOVE RIGHTWARDS ARROW +2972 TILDE OPERATOR ABOVE RIGHTWARDS ARROW +2973 LEFTWARDS ARROW ABOVE TILDE OPERATOR +2974 RIGHTWARDS ARROW ABOVE TILDE OPERATOR +2975 RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO +2976 LESS-THAN ABOVE LEFTWARDS ARROW +2977 LEFTWARDS ARROW THROUGH LESS-THAN +2978 GREATER-THAN ABOVE RIGHTWARDS ARROW +2979 SUBSET ABOVE RIGHTWARDS ARROW +297A LEFTWARDS ARROW THROUGH SUBSET +297B SUPERSET ABOVE LEFTWARDS ARROW +297C LEFT FISH TAIL +297D RIGHT FISH TAIL +297E UP FISH TAIL +297F DOWN FISH TAIL +2980 TRIPLE VERTICAL BAR DELIMITER +2981 Z NOTATION SPOT +2982 Z NOTATION TYPE COLON +2983 LEFT WHITE CURLY BRACKET +2984 RIGHT WHITE CURLY BRACKET +2985 LEFT WHITE PARENTHESIS +2986 RIGHT WHITE PARENTHESIS +2987 Z NOTATION LEFT IMAGE BRACKET +2988 Z NOTATION RIGHT IMAGE BRACKET +2989 Z NOTATION LEFT BINDING BRACKET +298A Z NOTATION RIGHT BINDING BRACKET +298B LEFT SQUARE BRACKET WITH UNDERBAR +298C RIGHT SQUARE BRACKET WITH UNDERBAR +298D LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 LEFT ANGLE BRACKET WITH DOT +2992 RIGHT ANGLE BRACKET WITH DOT +2993 LEFT ARC LESS-THAN BRACKET +2994 RIGHT ARC GREATER-THAN BRACKET +2995 DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 LEFT BLACK TORTOISE SHELL BRACKET +2998 RIGHT BLACK TORTOISE SHELL BRACKET +2999 DOTTED FENCE +299A VERTICAL ZIGZAG LINE +299B MEASURED ANGLE OPENING LEFT +299C RIGHT ANGLE VARIANT WITH SQUARE +299D MEASURED RIGHT ANGLE WITH DOT +299E ANGLE WITH S INSIDE +299F ACUTE ANGLE +29A0 SPHERICAL ANGLE OPENING LEFT +29A1 SPHERICAL ANGLE OPENING UP +29A2 TURNED ANGLE +29A3 REVERSED ANGLE +29A4 ANGLE WITH UNDERBAR +29A5 REVERSED ANGLE WITH UNDERBAR +29A6 OBLIQUE ANGLE OPENING UP +29A7 OBLIQUE ANGLE OPENING DOWN +29A8 MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT +29A9 MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT +29AA MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT +29AB MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT +29AC MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP +29AD MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP +29AE MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN +29AF MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN +29B0 REVERSED EMPTY SET +29B1 EMPTY SET WITH OVERBAR +29B2 EMPTY SET WITH SMALL CIRCLE ABOVE +29B3 EMPTY SET WITH RIGHT ARROW ABOVE +29B4 EMPTY SET WITH LEFT ARROW ABOVE +29B5 CIRCLE WITH HORIZONTAL BAR +29B6 CIRCLED VERTICAL BAR +29B7 CIRCLED PARALLEL +29B8 CIRCLED REVERSE SOLIDUS +29B9 CIRCLED PERPENDICULAR +29BA CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR +29BB CIRCLE WITH SUPERIMPOSED X +29BC CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN +29BD UP ARROW THROUGH CIRCLE +29BE CIRCLED WHITE BULLET +29BF CIRCLED BULLET +29C0 CIRCLED LESS-THAN +29C1 CIRCLED GREATER-THAN +29C2 CIRCLE WITH SMALL CIRCLE TO THE RIGHT +29C3 CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT +29C4 SQUARED RISING DIAGONAL SLASH +29C5 SQUARED FALLING DIAGONAL SLASH +29C6 SQUARED ASTERISK +29C7 SQUARED SMALL CIRCLE +29C8 SQUARED SQUARE +29C9 TWO JOINED SQUARES +29CA TRIANGLE WITH DOT ABOVE +29CB TRIANGLE WITH UNDERBAR +29CC S IN TRIANGLE +29CD TRIANGLE WITH SERIFS AT BOTTOM +29CE RIGHT TRIANGLE ABOVE LEFT TRIANGLE +29CF LEFT TRIANGLE BESIDE VERTICAL BAR +29D0 VERTICAL BAR BESIDE RIGHT TRIANGLE +29D1 BOWTIE WITH LEFT HALF BLACK +29D2 BOWTIE WITH RIGHT HALF BLACK +29D3 BLACK BOWTIE +29D4 TIMES WITH LEFT HALF BLACK +29D5 TIMES WITH RIGHT HALF BLACK +29D6 WHITE HOURGLASS +29D7 BLACK HOURGLASS +29D8 LEFT WIGGLY FENCE +29D9 RIGHT WIGGLY FENCE +29DA LEFT DOUBLE WIGGLY FENCE +29DB RIGHT DOUBLE WIGGLY FENCE +29DC INCOMPLETE INFINITY +29DD TIE OVER INFINITY +29DE INFINITY NEGATED WITH VERTICAL BAR +29DF DOUBLE-ENDED MULTIMAP +29E0 SQUARE WITH CONTOURED OUTLINE +29E1 INCREASES AS +29E2 SHUFFLE PRODUCT +29E3 EQUALS SIGN AND SLANTED PARALLEL +29E4 EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE +29E5 IDENTICAL TO AND SLANTED PARALLEL +29E6 GLEICH STARK +29E7 THERMODYNAMIC +29E8 DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK +29E9 DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK +29EA BLACK DIAMOND WITH DOWN ARROW +29EB BLACK LOZENGE +29EC WHITE CIRCLE WITH DOWN ARROW +29ED BLACK CIRCLE WITH DOWN ARROW +29EE ERROR-BARRED WHITE SQUARE +29EF ERROR-BARRED BLACK SQUARE +29F0 ERROR-BARRED WHITE DIAMOND +29F1 ERROR-BARRED BLACK DIAMOND +29F2 ERROR-BARRED WHITE CIRCLE +29F3 ERROR-BARRED BLACK CIRCLE +29F4 RULE-DELAYED +29F5 REVERSE SOLIDUS OPERATOR +29F6 SOLIDUS WITH OVERBAR +29F7 REVERSE SOLIDUS WITH HORIZONTAL STROKE +29F8 BIG SOLIDUS +29F9 BIG REVERSE SOLIDUS +29FA DOUBLE PLUS +29FB TRIPLE PLUS +29FC LEFT-POINTING CURVED ANGLE BRACKET +29FD RIGHT-POINTING CURVED ANGLE BRACKET +29FE TINY +29FF MINY +2A00 N-ARY CIRCLED DOT OPERATOR +2A01 N-ARY CIRCLED PLUS OPERATOR +2A02 N-ARY CIRCLED TIMES OPERATOR +2A03 N-ARY UNION OPERATOR WITH DOT +2A04 N-ARY UNION OPERATOR WITH PLUS +2A05 N-ARY SQUARE INTERSECTION OPERATOR +2A06 N-ARY SQUARE UNION OPERATOR +2A07 TWO LOGICAL AND OPERATOR +2A08 TWO LOGICAL OR OPERATOR +2A09 N-ARY TIMES OPERATOR +2A0A MODULO TWO SUM +2A0B SUMMATION WITH INTEGRAL +2A0C QUADRUPLE INTEGRAL OPERATOR +2A0D FINITE PART INTEGRAL +2A0E INTEGRAL WITH DOUBLE STROKE +2A0F INTEGRAL AVERAGE WITH SLASH +2A10 CIRCULATION FUNCTION +2A11 ANTICLOCKWISE INTEGRATION +2A12 LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE +2A13 LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE +2A14 LINE INTEGRATION NOT INCLUDING THE POLE +2A15 INTEGRAL AROUND A POINT OPERATOR +2A16 QUATERNION INTEGRAL OPERATOR +2A17 INTEGRAL WITH LEFTWARDS ARROW WITH HOOK +2A18 INTEGRAL WITH TIMES SIGN +2A19 INTEGRAL WITH INTERSECTION +2A1A INTEGRAL WITH UNION +2A1B INTEGRAL WITH OVERBAR +2A1C INTEGRAL WITH UNDERBAR +2A1D JOIN +2A1E LARGE LEFT TRIANGLE OPERATOR +2A1F Z NOTATION SCHEMA COMPOSITION +2A20 Z NOTATION SCHEMA PIPING +2A21 Z NOTATION SCHEMA PROJECTION +2A22 PLUS SIGN WITH SMALL CIRCLE ABOVE +2A23 PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE +2A24 PLUS SIGN WITH TILDE ABOVE +2A25 PLUS SIGN WITH DOT BELOW +2A26 PLUS SIGN WITH TILDE BELOW +2A27 PLUS SIGN WITH SUBSCRIPT TWO +2A28 PLUS SIGN WITH BLACK TRIANGLE +2A29 MINUS SIGN WITH COMMA ABOVE +2A2A MINUS SIGN WITH DOT BELOW +2A2B MINUS SIGN WITH FALLING DOTS +2A2C MINUS SIGN WITH RISING DOTS +2A2D PLUS SIGN IN LEFT HALF CIRCLE +2A2E PLUS SIGN IN RIGHT HALF CIRCLE +2A2F VECTOR OR CROSS PRODUCT +2A30 MULTIPLICATION SIGN WITH DOT ABOVE +2A31 MULTIPLICATION SIGN WITH UNDERBAR +2A32 SEMIDIRECT PRODUCT WITH BOTTOM CLOSED +2A33 SMASH PRODUCT +2A34 MULTIPLICATION SIGN IN LEFT HALF CIRCLE +2A35 MULTIPLICATION SIGN IN RIGHT HALF CIRCLE +2A36 CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT +2A37 MULTIPLICATION SIGN IN DOUBLE CIRCLE +2A38 CIRCLED DIVISION SIGN +2A39 PLUS SIGN IN TRIANGLE +2A3A MINUS SIGN IN TRIANGLE +2A3B MULTIPLICATION SIGN IN TRIANGLE +2A3C INTERIOR PRODUCT +2A3D RIGHTHAND INTERIOR PRODUCT +2A3E Z NOTATION RELATIONAL COMPOSITION +2A3F AMALGAMATION OR COPRODUCT +2A40 INTERSECTION WITH DOT +2A41 UNION WITH MINUS SIGN +2A42 UNION WITH OVERBAR +2A43 INTERSECTION WITH OVERBAR +2A44 INTERSECTION WITH LOGICAL AND +2A45 UNION WITH LOGICAL OR +2A46 UNION ABOVE INTERSECTION +2A47 INTERSECTION ABOVE UNION +2A48 UNION ABOVE BAR ABOVE INTERSECTION +2A49 INTERSECTION ABOVE BAR ABOVE UNION +2A4A UNION BESIDE AND JOINED WITH UNION +2A4B INTERSECTION BESIDE AND JOINED WITH INTERSECTION +2A4C CLOSED UNION WITH SERIFS +2A4D CLOSED INTERSECTION WITH SERIFS +2A4E DOUBLE SQUARE INTERSECTION +2A4F DOUBLE SQUARE UNION +2A50 CLOSED UNION WITH SERIFS AND SMASH PRODUCT +2A51 LOGICAL AND WITH DOT ABOVE +2A52 LOGICAL OR WITH DOT ABOVE +2A53 DOUBLE LOGICAL AND +2A54 DOUBLE LOGICAL OR +2A55 TWO INTERSECTING LOGICAL AND +2A56 TWO INTERSECTING LOGICAL OR +2A57 SLOPING LARGE OR +2A58 SLOPING LARGE AND +2A59 LOGICAL OR OVERLAPPING LOGICAL AND +2A5A LOGICAL AND WITH MIDDLE STEM +2A5B LOGICAL OR WITH MIDDLE STEM +2A5C LOGICAL AND WITH HORIZONTAL DASH +2A5D LOGICAL OR WITH HORIZONTAL DASH +2A5E LOGICAL AND WITH DOUBLE OVERBAR +2A5F LOGICAL AND WITH UNDERBAR +2A60 LOGICAL AND WITH DOUBLE UNDERBAR +2A61 SMALL VEE WITH UNDERBAR +2A62 LOGICAL OR WITH DOUBLE OVERBAR +2A63 LOGICAL OR WITH DOUBLE UNDERBAR +2A64 Z NOTATION DOMAIN ANTIRESTRICTION +2A65 Z NOTATION RANGE ANTIRESTRICTION +2A66 EQUALS SIGN WITH DOT BELOW +2A67 IDENTICAL WITH DOT ABOVE +2A68 TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE +2A69 TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE +2A6A TILDE OPERATOR WITH DOT ABOVE +2A6B TILDE OPERATOR WITH RISING DOTS +2A6C SIMILAR MINUS SIMILAR +2A6D CONGRUENT WITH DOT ABOVE +2A6E EQUALS WITH ASTERISK +2A6F ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT +2A70 APPROXIMATELY EQUAL OR EQUAL TO +2A71 EQUALS SIGN ABOVE PLUS SIGN +2A72 PLUS SIGN ABOVE EQUALS SIGN +2A73 EQUALS SIGN ABOVE TILDE OPERATOR +2A74 DOUBLE COLON EQUAL +2A75 TWO CONSECUTIVE EQUALS SIGNS +2A76 THREE CONSECUTIVE EQUALS SIGNS +2A77 EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW +2A78 EQUIVALENT WITH FOUR DOTS ABOVE +2A79 LESS-THAN WITH CIRCLE INSIDE +2A7A GREATER-THAN WITH CIRCLE INSIDE +2A7B LESS-THAN WITH QUESTION MARK ABOVE +2A7C GREATER-THAN WITH QUESTION MARK ABOVE +2A7D LESS-THAN OR SLANTED EQUAL TO +2A7E GREATER-THAN OR SLANTED EQUAL TO +2A7F LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A80 GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A81 LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A82 GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A83 LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT +2A84 GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT +2A85 LESS-THAN OR APPROXIMATE +2A86 GREATER-THAN OR APPROXIMATE +2A87 LESS-THAN AND SINGLE-LINE NOT EQUAL TO +2A88 GREATER-THAN AND SINGLE-LINE NOT EQUAL TO +2A89 LESS-THAN AND NOT APPROXIMATE +2A8A GREATER-THAN AND NOT APPROXIMATE +2A8B LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN +2A8C GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN +2A8D LESS-THAN ABOVE SIMILAR OR EQUAL +2A8E GREATER-THAN ABOVE SIMILAR OR EQUAL +2A8F LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN +2A90 GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN +2A91 LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL +2A92 GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL +2A93 LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL +2A94 GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL +2A95 SLANTED EQUAL TO OR LESS-THAN +2A96 SLANTED EQUAL TO OR GREATER-THAN +2A97 SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE +2A98 SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE +2A99 DOUBLE-LINE EQUAL TO OR LESS-THAN +2A9A DOUBLE-LINE EQUAL TO OR GREATER-THAN +2A9B DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN +2A9C DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN +2A9D SIMILAR OR LESS-THAN +2A9E SIMILAR OR GREATER-THAN +2A9F SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN +2AA0 SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN +2AA1 DOUBLE NESTED LESS-THAN +2AA2 DOUBLE NESTED GREATER-THAN +2AA3 DOUBLE NESTED LESS-THAN WITH UNDERBAR +2AA4 GREATER-THAN OVERLAPPING LESS-THAN +2AA5 GREATER-THAN BESIDE LESS-THAN +2AA6 LESS-THAN CLOSED BY CURVE +2AA7 GREATER-THAN CLOSED BY CURVE +2AA8 LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AA9 GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AAA SMALLER THAN +2AAB LARGER THAN +2AAC SMALLER THAN OR EQUAL TO +2AAD LARGER THAN OR EQUAL TO +2AAE EQUALS SIGN WITH BUMPY ABOVE +2AAF PRECEDES ABOVE SINGLE-LINE EQUALS SIGN +2AB0 SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN +2AB1 PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO +2AB2 SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO +2AB3 PRECEDES ABOVE EQUALS SIGN +2AB4 SUCCEEDS ABOVE EQUALS SIGN +2AB5 PRECEDES ABOVE NOT EQUAL TO +2AB6 SUCCEEDS ABOVE NOT EQUAL TO +2AB7 PRECEDES ABOVE ALMOST EQUAL TO +2AB8 SUCCEEDS ABOVE ALMOST EQUAL TO +2AB9 PRECEDES ABOVE NOT ALMOST EQUAL TO +2ABA SUCCEEDS ABOVE NOT ALMOST EQUAL TO +2ABB DOUBLE PRECEDES +2ABC DOUBLE SUCCEEDS +2ABD SUBSET WITH DOT +2ABE SUPERSET WITH DOT +2ABF SUBSET WITH PLUS SIGN BELOW +2AC0 SUPERSET WITH PLUS SIGN BELOW +2AC1 SUBSET WITH MULTIPLICATION SIGN BELOW +2AC2 SUPERSET WITH MULTIPLICATION SIGN BELOW +2AC3 SUBSET OF OR EQUAL TO WITH DOT ABOVE +2AC4 SUPERSET OF OR EQUAL TO WITH DOT ABOVE +2AC5 SUBSET OF ABOVE EQUALS SIGN +2AC6 SUPERSET OF ABOVE EQUALS SIGN +2AC7 SUBSET OF ABOVE TILDE OPERATOR +2AC8 SUPERSET OF ABOVE TILDE OPERATOR +2AC9 SUBSET OF ABOVE ALMOST EQUAL TO +2ACA SUPERSET OF ABOVE ALMOST EQUAL TO +2ACB SUBSET OF ABOVE NOT EQUAL TO +2ACC SUPERSET OF ABOVE NOT EQUAL TO +2ACD SQUARE LEFT OPEN BOX OPERATOR +2ACE SQUARE RIGHT OPEN BOX OPERATOR +2ACF CLOSED SUBSET +2AD0 CLOSED SUPERSET +2AD1 CLOSED SUBSET OR EQUAL TO +2AD2 CLOSED SUPERSET OR EQUAL TO +2AD3 SUBSET ABOVE SUPERSET +2AD4 SUPERSET ABOVE SUBSET +2AD5 SUBSET ABOVE SUBSET +2AD6 SUPERSET ABOVE SUPERSET +2AD7 SUPERSET BESIDE SUBSET +2AD8 SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET +2AD9 ELEMENT OF OPENING DOWNWARDS +2ADA PITCHFORK WITH TEE TOP +2ADB TRANSVERSAL INTERSECTION +2ADC FORKING +2ADD NONFORKING +2ADE SHORT LEFT TACK +2ADF SHORT DOWN TACK +2AE0 SHORT UP TACK +2AE1 PERPENDICULAR WITH S +2AE2 VERTICAL BAR TRIPLE RIGHT TURNSTILE +2AE3 DOUBLE VERTICAL BAR LEFT TURNSTILE +2AE4 VERTICAL BAR DOUBLE LEFT TURNSTILE +2AE5 DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE +2AE6 LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL +2AE7 SHORT DOWN TACK WITH OVERBAR +2AE8 SHORT UP TACK WITH UNDERBAR +2AE9 SHORT UP TACK ABOVE SHORT DOWN TACK +2AEA DOUBLE DOWN TACK +2AEB DOUBLE UP TACK +2AEC DOUBLE STROKE NOT SIGN +2AED REVERSED DOUBLE STROKE NOT SIGN +2AEE DOES NOT DIVIDE WITH REVERSED NEGATION SLASH +2AEF VERTICAL LINE WITH CIRCLE ABOVE +2AF0 VERTICAL LINE WITH CIRCLE BELOW +2AF1 DOWN TACK WITH CIRCLE BELOW +2AF2 PARALLEL WITH HORIZONTAL STROKE +2AF3 PARALLEL WITH TILDE OPERATOR +2AF4 TRIPLE VERTICAL BAR BINARY RELATION +2AF5 TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE +2AF6 TRIPLE COLON OPERATOR +2AF7 TRIPLE NESTED LESS-THAN +2AF8 TRIPLE NESTED GREATER-THAN +2AF9 DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO +2AFA DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO +2AFB TRIPLE SOLIDUS BINARY RELATION +2AFC LARGE TRIPLE VERTICAL BAR OPERATOR +2AFD DOUBLE SOLIDUS OPERATOR +2AFE WHITE VERTICAL BAR +2AFF N-ARY WHITE VERTICAL BAR +2B00 NORTH EAST WHITE ARROW +2B01 NORTH WEST WHITE ARROW +2B02 SOUTH EAST WHITE ARROW +2B03 SOUTH WEST WHITE ARROW +2B04 LEFT RIGHT WHITE ARROW +2B05 LEFTWARDS BLACK ARROW +2B06 UPWARDS BLACK ARROW +2B07 DOWNWARDS BLACK ARROW +2B08 NORTH EAST BLACK ARROW +2B09 NORTH WEST BLACK ARROW +2B0A SOUTH EAST BLACK ARROW +2B0B SOUTH WEST BLACK ARROW +2B0C LEFT RIGHT BLACK ARROW +2B0D UP DOWN BLACK ARROW +2B0E RIGHTWARDS ARROW WITH TIP DOWNWARDS +2B0F RIGHTWARDS ARROW WITH TIP UPWARDS +2B10 LEFTWARDS ARROW WITH TIP DOWNWARDS +2B11 LEFTWARDS ARROW WITH TIP UPWARDS +2B12 SQUARE WITH TOP HALF BLACK +2B13 SQUARE WITH BOTTOM HALF BLACK +2C00 GLAGOLITIC CAPITAL LETTER AZU +2C01 GLAGOLITIC CAPITAL LETTER BUKY +2C02 GLAGOLITIC CAPITAL LETTER VEDE +2C03 GLAGOLITIC CAPITAL LETTER GLAGOLI +2C04 GLAGOLITIC CAPITAL LETTER DOBRO +2C05 GLAGOLITIC CAPITAL LETTER YESTU +2C06 GLAGOLITIC CAPITAL LETTER ZHIVETE +2C07 GLAGOLITIC CAPITAL LETTER DZELO +2C08 GLAGOLITIC CAPITAL LETTER ZEMLJA +2C09 GLAGOLITIC CAPITAL LETTER IZHE +2C0A GLAGOLITIC CAPITAL LETTER INITIAL IZHE +2C0B GLAGOLITIC CAPITAL LETTER I +2C0C GLAGOLITIC CAPITAL LETTER DJERVI +2C0D GLAGOLITIC CAPITAL LETTER KAKO +2C0E GLAGOLITIC CAPITAL LETTER LJUDIJE +2C0F GLAGOLITIC CAPITAL LETTER MYSLITE +2C10 GLAGOLITIC CAPITAL LETTER NASHI +2C11 GLAGOLITIC CAPITAL LETTER ONU +2C12 GLAGOLITIC CAPITAL LETTER POKOJI +2C13 GLAGOLITIC CAPITAL LETTER RITSI +2C14 GLAGOLITIC CAPITAL LETTER SLOVO +2C15 GLAGOLITIC CAPITAL LETTER TVRIDO +2C16 GLAGOLITIC CAPITAL LETTER UKU +2C17 GLAGOLITIC CAPITAL LETTER FRITU +2C18 GLAGOLITIC CAPITAL LETTER HERU +2C19 GLAGOLITIC CAPITAL LETTER OTU +2C1A GLAGOLITIC CAPITAL LETTER PE +2C1B GLAGOLITIC CAPITAL LETTER SHTA +2C1C GLAGOLITIC CAPITAL LETTER TSI +2C1D GLAGOLITIC CAPITAL LETTER CHRIVI +2C1E GLAGOLITIC CAPITAL LETTER SHA +2C1F GLAGOLITIC CAPITAL LETTER YERU +2C20 GLAGOLITIC CAPITAL LETTER YERI +2C21 GLAGOLITIC CAPITAL LETTER YATI +2C22 GLAGOLITIC CAPITAL LETTER SPIDERY HA +2C23 GLAGOLITIC CAPITAL LETTER YU +2C24 GLAGOLITIC CAPITAL LETTER SMALL YUS +2C25 GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +2C26 GLAGOLITIC CAPITAL LETTER YO +2C27 GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +2C28 GLAGOLITIC CAPITAL LETTER BIG YUS +2C29 GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +2C2A GLAGOLITIC CAPITAL LETTER FITA +2C2B GLAGOLITIC CAPITAL LETTER IZHITSA +2C2C GLAGOLITIC CAPITAL LETTER SHTAPIC +2C2D GLAGOLITIC CAPITAL LETTER TROKUTASTI A +2C2E GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C30 GLAGOLITIC SMALL LETTER AZU +2C31 GLAGOLITIC SMALL LETTER BUKY +2C32 GLAGOLITIC SMALL LETTER VEDE +2C33 GLAGOLITIC SMALL LETTER GLAGOLI +2C34 GLAGOLITIC SMALL LETTER DOBRO +2C35 GLAGOLITIC SMALL LETTER YESTU +2C36 GLAGOLITIC SMALL LETTER ZHIVETE +2C37 GLAGOLITIC SMALL LETTER DZELO +2C38 GLAGOLITIC SMALL LETTER ZEMLJA +2C39 GLAGOLITIC SMALL LETTER IZHE +2C3A GLAGOLITIC SMALL LETTER INITIAL IZHE +2C3B GLAGOLITIC SMALL LETTER I +2C3C GLAGOLITIC SMALL LETTER DJERVI +2C3D GLAGOLITIC SMALL LETTER KAKO +2C3E GLAGOLITIC SMALL LETTER LJUDIJE +2C3F GLAGOLITIC SMALL LETTER MYSLITE +2C40 GLAGOLITIC SMALL LETTER NASHI +2C41 GLAGOLITIC SMALL LETTER ONU +2C42 GLAGOLITIC SMALL LETTER POKOJI +2C43 GLAGOLITIC SMALL LETTER RITSI +2C44 GLAGOLITIC SMALL LETTER SLOVO +2C45 GLAGOLITIC SMALL LETTER TVRIDO +2C46 GLAGOLITIC SMALL LETTER UKU +2C47 GLAGOLITIC SMALL LETTER FRITU +2C48 GLAGOLITIC SMALL LETTER HERU +2C49 GLAGOLITIC SMALL LETTER OTU +2C4A GLAGOLITIC SMALL LETTER PE +2C4B GLAGOLITIC SMALL LETTER SHTA +2C4C GLAGOLITIC SMALL LETTER TSI +2C4D GLAGOLITIC SMALL LETTER CHRIVI +2C4E GLAGOLITIC SMALL LETTER SHA +2C4F GLAGOLITIC SMALL LETTER YERU +2C50 GLAGOLITIC SMALL LETTER YERI +2C51 GLAGOLITIC SMALL LETTER YATI +2C52 GLAGOLITIC SMALL LETTER SPIDERY HA +2C53 GLAGOLITIC SMALL LETTER YU +2C54 GLAGOLITIC SMALL LETTER SMALL YUS +2C55 GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL +2C56 GLAGOLITIC SMALL LETTER YO +2C57 GLAGOLITIC SMALL LETTER IOTATED SMALL YUS +2C58 GLAGOLITIC SMALL LETTER BIG YUS +2C59 GLAGOLITIC SMALL LETTER IOTATED BIG YUS +2C5A GLAGOLITIC SMALL LETTER FITA +2C5B GLAGOLITIC SMALL LETTER IZHITSA +2C5C GLAGOLITIC SMALL LETTER SHTAPIC +2C5D GLAGOLITIC SMALL LETTER TROKUTASTI A +2C5E GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C80 COPTIC CAPITAL LETTER ALFA +2C81 COPTIC SMALL LETTER ALFA +2C82 COPTIC CAPITAL LETTER VIDA +2C83 COPTIC SMALL LETTER VIDA +2C84 COPTIC CAPITAL LETTER GAMMA +2C85 COPTIC SMALL LETTER GAMMA +2C86 COPTIC CAPITAL LETTER DALDA +2C87 COPTIC SMALL LETTER DALDA +2C88 COPTIC CAPITAL LETTER EIE +2C89 COPTIC SMALL LETTER EIE +2C8A COPTIC CAPITAL LETTER SOU +2C8B COPTIC SMALL LETTER SOU +2C8C COPTIC CAPITAL LETTER ZATA +2C8D COPTIC SMALL LETTER ZATA +2C8E COPTIC CAPITAL LETTER HATE +2C8F COPTIC SMALL LETTER HATE +2C90 COPTIC CAPITAL LETTER THETHE +2C91 COPTIC SMALL LETTER THETHE +2C92 COPTIC CAPITAL LETTER IAUDA +2C93 COPTIC SMALL LETTER IAUDA +2C94 COPTIC CAPITAL LETTER KAPA +2C95 COPTIC SMALL LETTER KAPA +2C96 COPTIC CAPITAL LETTER LAULA +2C97 COPTIC SMALL LETTER LAULA +2C98 COPTIC CAPITAL LETTER MI +2C99 COPTIC SMALL LETTER MI +2C9A COPTIC CAPITAL LETTER NI +2C9B COPTIC SMALL LETTER NI +2C9C COPTIC CAPITAL LETTER KSI +2C9D COPTIC SMALL LETTER KSI +2C9E COPTIC CAPITAL LETTER O +2C9F COPTIC SMALL LETTER O +2CA0 COPTIC CAPITAL LETTER PI +2CA1 COPTIC SMALL LETTER PI +2CA2 COPTIC CAPITAL LETTER RO +2CA3 COPTIC SMALL LETTER RO +2CA4 COPTIC CAPITAL LETTER SIMA +2CA5 COPTIC SMALL LETTER SIMA +2CA6 COPTIC CAPITAL LETTER TAU +2CA7 COPTIC SMALL LETTER TAU +2CA8 COPTIC CAPITAL LETTER UA +2CA9 COPTIC SMALL LETTER UA +2CAA COPTIC CAPITAL LETTER FI +2CAB COPTIC SMALL LETTER FI +2CAC COPTIC CAPITAL LETTER KHI +2CAD COPTIC SMALL LETTER KHI +2CAE COPTIC CAPITAL LETTER PSI +2CAF COPTIC SMALL LETTER PSI +2CB0 COPTIC CAPITAL LETTER OOU +2CB1 COPTIC SMALL LETTER OOU +2CB2 COPTIC CAPITAL LETTER DIALECT-P ALEF +2CB3 COPTIC SMALL LETTER DIALECT-P ALEF +2CB4 COPTIC CAPITAL LETTER OLD COPTIC AIN +2CB5 COPTIC SMALL LETTER OLD COPTIC AIN +2CB6 COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +2CB7 COPTIC SMALL LETTER CRYPTOGRAMMIC EIE +2CB8 COPTIC CAPITAL LETTER DIALECT-P KAPA +2CB9 COPTIC SMALL LETTER DIALECT-P KAPA +2CBA COPTIC CAPITAL LETTER DIALECT-P NI +2CBB COPTIC SMALL LETTER DIALECT-P NI +2CBC COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +2CBD COPTIC SMALL LETTER CRYPTOGRAMMIC NI +2CBE COPTIC CAPITAL LETTER OLD COPTIC OOU +2CBF COPTIC SMALL LETTER OLD COPTIC OOU +2CC0 COPTIC CAPITAL LETTER SAMPI +2CC1 COPTIC SMALL LETTER SAMPI +2CC2 COPTIC CAPITAL LETTER CROSSED SHEI +2CC3 COPTIC SMALL LETTER CROSSED SHEI +2CC4 COPTIC CAPITAL LETTER OLD COPTIC SHEI +2CC5 COPTIC SMALL LETTER OLD COPTIC SHEI +2CC6 COPTIC CAPITAL LETTER OLD COPTIC ESH +2CC7 COPTIC SMALL LETTER OLD COPTIC ESH +2CC8 COPTIC CAPITAL LETTER AKHMIMIC KHEI +2CC9 COPTIC SMALL LETTER AKHMIMIC KHEI +2CCA COPTIC CAPITAL LETTER DIALECT-P HORI +2CCB COPTIC SMALL LETTER DIALECT-P HORI +2CCC COPTIC CAPITAL LETTER OLD COPTIC HORI +2CCD COPTIC SMALL LETTER OLD COPTIC HORI +2CCE COPTIC CAPITAL LETTER OLD COPTIC HA +2CCF COPTIC SMALL LETTER OLD COPTIC HA +2CD0 COPTIC CAPITAL LETTER L-SHAPED HA +2CD1 COPTIC SMALL LETTER L-SHAPED HA +2CD2 COPTIC CAPITAL LETTER OLD COPTIC HEI +2CD3 COPTIC SMALL LETTER OLD COPTIC HEI +2CD4 COPTIC CAPITAL LETTER OLD COPTIC HAT +2CD5 COPTIC SMALL LETTER OLD COPTIC HAT +2CD6 COPTIC CAPITAL LETTER OLD COPTIC GANGIA +2CD7 COPTIC SMALL LETTER OLD COPTIC GANGIA +2CD8 COPTIC CAPITAL LETTER OLD COPTIC DJA +2CD9 COPTIC SMALL LETTER OLD COPTIC DJA +2CDA COPTIC CAPITAL LETTER OLD COPTIC SHIMA +2CDB COPTIC SMALL LETTER OLD COPTIC SHIMA +2CDC COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +2CDD COPTIC SMALL LETTER OLD NUBIAN SHIMA +2CDE COPTIC CAPITAL LETTER OLD NUBIAN NGI +2CDF COPTIC SMALL LETTER OLD NUBIAN NGI +2CE0 COPTIC CAPITAL LETTER OLD NUBIAN NYI +2CE1 COPTIC SMALL LETTER OLD NUBIAN NYI +2CE2 COPTIC CAPITAL LETTER OLD NUBIAN WAU +2CE3 COPTIC SMALL LETTER OLD NUBIAN WAU +2CE4 COPTIC SYMBOL KAI +2CE5 COPTIC SYMBOL MI RO +2CE6 COPTIC SYMBOL PI RO +2CE7 COPTIC SYMBOL STAUROS +2CE8 COPTIC SYMBOL TAU RO +2CE9 COPTIC SYMBOL KHI RO +2CEA COPTIC SYMBOL SHIMA SIMA +2CF9 COPTIC OLD NUBIAN FULL STOP +2CFA COPTIC OLD NUBIAN DIRECT QUESTION MARK +2CFB COPTIC OLD NUBIAN INDIRECT QUESTION MARK +2CFC COPTIC OLD NUBIAN VERSE DIVIDER +2CFD COPTIC FRACTION ONE HALF +2CFE COPTIC FULL STOP +2CFF COPTIC MORPHOLOGICAL DIVIDER +2D00 GEORGIAN SMALL LETTER AN +2D01 GEORGIAN SMALL LETTER BAN +2D02 GEORGIAN SMALL LETTER GAN +2D03 GEORGIAN SMALL LETTER DON +2D04 GEORGIAN SMALL LETTER EN +2D05 GEORGIAN SMALL LETTER VIN +2D06 GEORGIAN SMALL LETTER ZEN +2D07 GEORGIAN SMALL LETTER TAN +2D08 GEORGIAN SMALL LETTER IN +2D09 GEORGIAN SMALL LETTER KAN +2D0A GEORGIAN SMALL LETTER LAS +2D0B GEORGIAN SMALL LETTER MAN +2D0C GEORGIAN SMALL LETTER NAR +2D0D GEORGIAN SMALL LETTER ON +2D0E GEORGIAN SMALL LETTER PAR +2D0F GEORGIAN SMALL LETTER ZHAR +2D10 GEORGIAN SMALL LETTER RAE +2D11 GEORGIAN SMALL LETTER SAN +2D12 GEORGIAN SMALL LETTER TAR +2D13 GEORGIAN SMALL LETTER UN +2D14 GEORGIAN SMALL LETTER PHAR +2D15 GEORGIAN SMALL LETTER KHAR +2D16 GEORGIAN SMALL LETTER GHAN +2D17 GEORGIAN SMALL LETTER QAR +2D18 GEORGIAN SMALL LETTER SHIN +2D19 GEORGIAN SMALL LETTER CHIN +2D1A GEORGIAN SMALL LETTER CAN +2D1B GEORGIAN SMALL LETTER JIL +2D1C GEORGIAN SMALL LETTER CIL +2D1D GEORGIAN SMALL LETTER CHAR +2D1E GEORGIAN SMALL LETTER XAN +2D1F GEORGIAN SMALL LETTER JHAN +2D20 GEORGIAN SMALL LETTER HAE +2D21 GEORGIAN SMALL LETTER HE +2D22 GEORGIAN SMALL LETTER HIE +2D23 GEORGIAN SMALL LETTER WE +2D24 GEORGIAN SMALL LETTER HAR +2D25 GEORGIAN SMALL LETTER HOE +2D30 TIFINAGH LETTER YA +2D31 TIFINAGH LETTER YAB +2D32 TIFINAGH LETTER YABH +2D33 TIFINAGH LETTER YAG +2D34 TIFINAGH LETTER YAGHH +2D35 TIFINAGH LETTER BERBER ACADEMY YAJ +2D36 TIFINAGH LETTER YAJ +2D37 TIFINAGH LETTER YAD +2D38 TIFINAGH LETTER YADH +2D39 TIFINAGH LETTER YADD +2D3A TIFINAGH LETTER YADDH +2D3B TIFINAGH LETTER YEY +2D3C TIFINAGH LETTER YAF +2D3D TIFINAGH LETTER YAK +2D3E TIFINAGH LETTER TUAREG YAK +2D3F TIFINAGH LETTER YAKHH +2D40 TIFINAGH LETTER YAH +2D41 TIFINAGH LETTER BERBER ACADEMY YAH +2D42 TIFINAGH LETTER TUAREG YAH +2D43 TIFINAGH LETTER YAHH +2D44 TIFINAGH LETTER YAA +2D45 TIFINAGH LETTER YAKH +2D46 TIFINAGH LETTER TUAREG YAKH +2D47 TIFINAGH LETTER YAQ +2D48 TIFINAGH LETTER TUAREG YAQ +2D49 TIFINAGH LETTER YI +2D4A TIFINAGH LETTER YAZH +2D4B TIFINAGH LETTER AHAGGAR YAZH +2D4C TIFINAGH LETTER TUAREG YAZH +2D4D TIFINAGH LETTER YAL +2D4E TIFINAGH LETTER YAM +2D4F TIFINAGH LETTER YAN +2D50 TIFINAGH LETTER TUAREG YAGN +2D51 TIFINAGH LETTER TUAREG YANG +2D52 TIFINAGH LETTER YAP +2D53 TIFINAGH LETTER YU +2D54 TIFINAGH LETTER YAR +2D55 TIFINAGH LETTER YARR +2D56 TIFINAGH LETTER YAGH +2D57 TIFINAGH LETTER TUAREG YAGH +2D58 TIFINAGH LETTER AYER YAGH +2D59 TIFINAGH LETTER YAS +2D5A TIFINAGH LETTER YASS +2D5B TIFINAGH LETTER YASH +2D5C TIFINAGH LETTER YAT +2D5D TIFINAGH LETTER YATH +2D5E TIFINAGH LETTER YACH +2D5F TIFINAGH LETTER YATT +2D60 TIFINAGH LETTER YAV +2D61 TIFINAGH LETTER YAW +2D62 TIFINAGH LETTER YAY +2D63 TIFINAGH LETTER YAZ +2D64 TIFINAGH LETTER TAWELLEMET YAZ +2D65 TIFINAGH LETTER YAZZ +2D6F TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D80 ETHIOPIC SYLLABLE LOA +2D81 ETHIOPIC SYLLABLE MOA +2D82 ETHIOPIC SYLLABLE ROA +2D83 ETHIOPIC SYLLABLE SOA +2D84 ETHIOPIC SYLLABLE SHOA +2D85 ETHIOPIC SYLLABLE BOA +2D86 ETHIOPIC SYLLABLE TOA +2D87 ETHIOPIC SYLLABLE COA +2D88 ETHIOPIC SYLLABLE NOA +2D89 ETHIOPIC SYLLABLE NYOA +2D8A ETHIOPIC SYLLABLE GLOTTAL OA +2D8B ETHIOPIC SYLLABLE ZOA +2D8C ETHIOPIC SYLLABLE DOA +2D8D ETHIOPIC SYLLABLE DDOA +2D8E ETHIOPIC SYLLABLE JOA +2D8F ETHIOPIC SYLLABLE THOA +2D90 ETHIOPIC SYLLABLE CHOA +2D91 ETHIOPIC SYLLABLE PHOA +2D92 ETHIOPIC SYLLABLE POA +2D93 ETHIOPIC SYLLABLE GGWA +2D94 ETHIOPIC SYLLABLE GGWI +2D95 ETHIOPIC SYLLABLE GGWEE +2D96 ETHIOPIC SYLLABLE GGWE +2DA0 ETHIOPIC SYLLABLE SSA +2DA1 ETHIOPIC SYLLABLE SSU +2DA2 ETHIOPIC SYLLABLE SSI +2DA3 ETHIOPIC SYLLABLE SSAA +2DA4 ETHIOPIC SYLLABLE SSEE +2DA5 ETHIOPIC SYLLABLE SSE +2DA6 ETHIOPIC SYLLABLE SSO +2DA8 ETHIOPIC SYLLABLE CCA +2DA9 ETHIOPIC SYLLABLE CCU +2DAA ETHIOPIC SYLLABLE CCI +2DAB ETHIOPIC SYLLABLE CCAA +2DAC ETHIOPIC SYLLABLE CCEE +2DAD ETHIOPIC SYLLABLE CCE +2DAE ETHIOPIC SYLLABLE CCO +2DB0 ETHIOPIC SYLLABLE ZZA +2DB1 ETHIOPIC SYLLABLE ZZU +2DB2 ETHIOPIC SYLLABLE ZZI +2DB3 ETHIOPIC SYLLABLE ZZAA +2DB4 ETHIOPIC SYLLABLE ZZEE +2DB5 ETHIOPIC SYLLABLE ZZE +2DB6 ETHIOPIC SYLLABLE ZZO +2DB8 ETHIOPIC SYLLABLE CCHA +2DB9 ETHIOPIC SYLLABLE CCHU +2DBA ETHIOPIC SYLLABLE CCHI +2DBB ETHIOPIC SYLLABLE CCHAA +2DBC ETHIOPIC SYLLABLE CCHEE +2DBD ETHIOPIC SYLLABLE CCHE +2DBE ETHIOPIC SYLLABLE CCHO +2DC0 ETHIOPIC SYLLABLE QYA +2DC1 ETHIOPIC SYLLABLE QYU +2DC2 ETHIOPIC SYLLABLE QYI +2DC3 ETHIOPIC SYLLABLE QYAA +2DC4 ETHIOPIC SYLLABLE QYEE +2DC5 ETHIOPIC SYLLABLE QYE +2DC6 ETHIOPIC SYLLABLE QYO +2DC8 ETHIOPIC SYLLABLE KYA +2DC9 ETHIOPIC SYLLABLE KYU +2DCA ETHIOPIC SYLLABLE KYI +2DCB ETHIOPIC SYLLABLE KYAA +2DCC ETHIOPIC SYLLABLE KYEE +2DCD ETHIOPIC SYLLABLE KYE +2DCE ETHIOPIC SYLLABLE KYO +2DD0 ETHIOPIC SYLLABLE XYA +2DD1 ETHIOPIC SYLLABLE XYU +2DD2 ETHIOPIC SYLLABLE XYI +2DD3 ETHIOPIC SYLLABLE XYAA +2DD4 ETHIOPIC SYLLABLE XYEE +2DD5 ETHIOPIC SYLLABLE XYE +2DD6 ETHIOPIC SYLLABLE XYO +2DD8 ETHIOPIC SYLLABLE GYA +2DD9 ETHIOPIC SYLLABLE GYU +2DDA ETHIOPIC SYLLABLE GYI +2DDB ETHIOPIC SYLLABLE GYAA +2DDC ETHIOPIC SYLLABLE GYEE +2DDD ETHIOPIC SYLLABLE GYE +2DDE ETHIOPIC SYLLABLE GYO +2E00 RIGHT ANGLE SUBSTITUTION MARKER +2E01 RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02 LEFT SUBSTITUTION BRACKET +2E03 RIGHT SUBSTITUTION BRACKET +2E04 LEFT DOTTED SUBSTITUTION BRACKET +2E05 RIGHT DOTTED SUBSTITUTION BRACKET +2E06 RAISED INTERPOLATION MARKER +2E07 RAISED DOTTED INTERPOLATION MARKER +2E08 DOTTED TRANSPOSITION MARKER +2E09 LEFT TRANSPOSITION BRACKET +2E0A RIGHT TRANSPOSITION BRACKET +2E0B RAISED SQUARE +2E0C LEFT RAISED OMISSION BRACKET +2E0D RIGHT RAISED OMISSION BRACKET +2E0E EDITORIAL CORONIS +2E0F PARAGRAPHOS +2E10 FORKED PARAGRAPHOS +2E11 REVERSED FORKED PARAGRAPHOS +2E12 HYPODIASTOLE +2E13 DOTTED OBELOS +2E14 DOWNWARDS ANCORA +2E15 UPWARDS ANCORA +2E16 DOTTED RIGHT-POINTING ANGLE +2E17 DOUBLE OBLIQUE HYPHEN +2E1C LEFT LOW PARAPHRASE BRACKET +2E1D RIGHT LOW PARAPHRASE BRACKET +2E80 CJK RADICAL REPEAT +2E81 CJK RADICAL CLIFF +2E82 CJK RADICAL SECOND ONE +2E83 CJK RADICAL SECOND TWO +2E84 CJK RADICAL SECOND THREE +2E85 CJK RADICAL PERSON +2E86 CJK RADICAL BOX +2E87 CJK RADICAL TABLE +2E88 CJK RADICAL KNIFE ONE +2E89 CJK RADICAL KNIFE TWO +2E8A CJK RADICAL DIVINATION +2E8B CJK RADICAL SEAL +2E8C CJK RADICAL SMALL ONE +2E8D CJK RADICAL SMALL TWO +2E8E CJK RADICAL LAME ONE +2E8F CJK RADICAL LAME TWO +2E90 CJK RADICAL LAME THREE +2E91 CJK RADICAL LAME FOUR +2E92 CJK RADICAL SNAKE +2E93 CJK RADICAL THREAD +2E94 CJK RADICAL SNOUT ONE +2E95 CJK RADICAL SNOUT TWO +2E96 CJK RADICAL HEART ONE +2E97 CJK RADICAL HEART TWO +2E98 CJK RADICAL HAND +2E99 CJK RADICAL RAP +2E9B CJK RADICAL CHOKE +2E9C CJK RADICAL SUN +2E9D CJK RADICAL MOON +2E9E CJK RADICAL DEATH +2E9F CJK RADICAL MOTHER +2EA0 CJK RADICAL CIVILIAN +2EA1 CJK RADICAL WATER ONE +2EA2 CJK RADICAL WATER TWO +2EA3 CJK RADICAL FIRE +2EA4 CJK RADICAL PAW ONE +2EA5 CJK RADICAL PAW TWO +2EA6 CJK RADICAL SIMPLIFIED HALF TREE TRUNK +2EA7 CJK RADICAL COW +2EA8 CJK RADICAL DOG +2EA9 CJK RADICAL JADE +2EAA CJK RADICAL BOLT OF CLOTH +2EAB CJK RADICAL EYE +2EAC CJK RADICAL SPIRIT ONE +2EAD CJK RADICAL SPIRIT TWO +2EAE CJK RADICAL BAMBOO +2EAF CJK RADICAL SILK +2EB0 CJK RADICAL C-SIMPLIFIED SILK +2EB1 CJK RADICAL NET ONE +2EB2 CJK RADICAL NET TWO +2EB3 CJK RADICAL NET THREE +2EB4 CJK RADICAL NET FOUR +2EB5 CJK RADICAL MESH +2EB6 CJK RADICAL SHEEP +2EB7 CJK RADICAL RAM +2EB8 CJK RADICAL EWE +2EB9 CJK RADICAL OLD +2EBA CJK RADICAL BRUSH ONE +2EBB CJK RADICAL BRUSH TWO +2EBC CJK RADICAL MEAT +2EBD CJK RADICAL MORTAR +2EBE CJK RADICAL GRASS ONE +2EBF CJK RADICAL GRASS TWO +2EC0 CJK RADICAL GRASS THREE +2EC1 CJK RADICAL TIGER +2EC2 CJK RADICAL CLOTHES +2EC3 CJK RADICAL WEST ONE +2EC4 CJK RADICAL WEST TWO +2EC5 CJK RADICAL C-SIMPLIFIED SEE +2EC6 CJK RADICAL SIMPLIFIED HORN +2EC7 CJK RADICAL HORN +2EC8 CJK RADICAL C-SIMPLIFIED SPEECH +2EC9 CJK RADICAL C-SIMPLIFIED SHELL +2ECA CJK RADICAL FOOT +2ECB CJK RADICAL C-SIMPLIFIED CART +2ECC CJK RADICAL SIMPLIFIED WALK +2ECD CJK RADICAL WALK ONE +2ECE CJK RADICAL WALK TWO +2ECF CJK RADICAL CITY +2ED0 CJK RADICAL C-SIMPLIFIED GOLD +2ED1 CJK RADICAL LONG ONE +2ED2 CJK RADICAL LONG TWO +2ED3 CJK RADICAL C-SIMPLIFIED LONG +2ED4 CJK RADICAL C-SIMPLIFIED GATE +2ED5 CJK RADICAL MOUND ONE +2ED6 CJK RADICAL MOUND TWO +2ED7 CJK RADICAL RAIN +2ED8 CJK RADICAL BLUE +2ED9 CJK RADICAL C-SIMPLIFIED TANNED LEATHER +2EDA CJK RADICAL C-SIMPLIFIED LEAF +2EDB CJK RADICAL C-SIMPLIFIED WIND +2EDC CJK RADICAL C-SIMPLIFIED FLY +2EDD CJK RADICAL EAT ONE +2EDE CJK RADICAL EAT TWO +2EDF CJK RADICAL EAT THREE +2EE0 CJK RADICAL C-SIMPLIFIED EAT +2EE1 CJK RADICAL HEAD +2EE2 CJK RADICAL C-SIMPLIFIED HORSE +2EE3 CJK RADICAL BONE +2EE4 CJK RADICAL GHOST +2EE5 CJK RADICAL C-SIMPLIFIED FISH +2EE6 CJK RADICAL C-SIMPLIFIED BIRD +2EE7 CJK RADICAL C-SIMPLIFIED SALT +2EE8 CJK RADICAL SIMPLIFIED WHEAT +2EE9 CJK RADICAL SIMPLIFIED YELLOW +2EEA CJK RADICAL C-SIMPLIFIED FROG +2EEB CJK RADICAL J-SIMPLIFIED EVEN +2EEC CJK RADICAL C-SIMPLIFIED EVEN +2EED CJK RADICAL J-SIMPLIFIED TOOTH +2EEE CJK RADICAL C-SIMPLIFIED TOOTH +2EEF CJK RADICAL J-SIMPLIFIED DRAGON +2EF0 CJK RADICAL C-SIMPLIFIED DRAGON +2EF1 CJK RADICAL TURTLE +2EF2 CJK RADICAL J-SIMPLIFIED TURTLE +2EF3 CJK RADICAL C-SIMPLIFIED TURTLE +2F00 KANGXI RADICAL ONE +2F01 KANGXI RADICAL LINE +2F02 KANGXI RADICAL DOT +2F03 KANGXI RADICAL SLASH +2F04 KANGXI RADICAL SECOND +2F05 KANGXI RADICAL HOOK +2F06 KANGXI RADICAL TWO +2F07 KANGXI RADICAL LID +2F08 KANGXI RADICAL MAN +2F09 KANGXI RADICAL LEGS +2F0A KANGXI RADICAL ENTER +2F0B KANGXI RADICAL EIGHT +2F0C KANGXI RADICAL DOWN BOX +2F0D KANGXI RADICAL COVER +2F0E KANGXI RADICAL ICE +2F0F KANGXI RADICAL TABLE +2F10 KANGXI RADICAL OPEN BOX +2F11 KANGXI RADICAL KNIFE +2F12 KANGXI RADICAL POWER +2F13 KANGXI RADICAL WRAP +2F14 KANGXI RADICAL SPOON +2F15 KANGXI RADICAL RIGHT OPEN BOX +2F16 KANGXI RADICAL HIDING ENCLOSURE +2F17 KANGXI RADICAL TEN +2F18 KANGXI RADICAL DIVINATION +2F19 KANGXI RADICAL SEAL +2F1A KANGXI RADICAL CLIFF +2F1B KANGXI RADICAL PRIVATE +2F1C KANGXI RADICAL AGAIN +2F1D KANGXI RADICAL MOUTH +2F1E KANGXI RADICAL ENCLOSURE +2F1F KANGXI RADICAL EARTH +2F20 KANGXI RADICAL SCHOLAR +2F21 KANGXI RADICAL GO +2F22 KANGXI RADICAL GO SLOWLY +2F23 KANGXI RADICAL EVENING +2F24 KANGXI RADICAL BIG +2F25 KANGXI RADICAL WOMAN +2F26 KANGXI RADICAL CHILD +2F27 KANGXI RADICAL ROOF +2F28 KANGXI RADICAL INCH +2F29 KANGXI RADICAL SMALL +2F2A KANGXI RADICAL LAME +2F2B KANGXI RADICAL CORPSE +2F2C KANGXI RADICAL SPROUT +2F2D KANGXI RADICAL MOUNTAIN +2F2E KANGXI RADICAL RIVER +2F2F KANGXI RADICAL WORK +2F30 KANGXI RADICAL ONESELF +2F31 KANGXI RADICAL TURBAN +2F32 KANGXI RADICAL DRY +2F33 KANGXI RADICAL SHORT THREAD +2F34 KANGXI RADICAL DOTTED CLIFF +2F35 KANGXI RADICAL LONG STRIDE +2F36 KANGXI RADICAL TWO HANDS +2F37 KANGXI RADICAL SHOOT +2F38 KANGXI RADICAL BOW +2F39 KANGXI RADICAL SNOUT +2F3A KANGXI RADICAL BRISTLE +2F3B KANGXI RADICAL STEP +2F3C KANGXI RADICAL HEART +2F3D KANGXI RADICAL HALBERD +2F3E KANGXI RADICAL DOOR +2F3F KANGXI RADICAL HAND +2F40 KANGXI RADICAL BRANCH +2F41 KANGXI RADICAL RAP +2F42 KANGXI RADICAL SCRIPT +2F43 KANGXI RADICAL DIPPER +2F44 KANGXI RADICAL AXE +2F45 KANGXI RADICAL SQUARE +2F46 KANGXI RADICAL NOT +2F47 KANGXI RADICAL SUN +2F48 KANGXI RADICAL SAY +2F49 KANGXI RADICAL MOON +2F4A KANGXI RADICAL TREE +2F4B KANGXI RADICAL LACK +2F4C KANGXI RADICAL STOP +2F4D KANGXI RADICAL DEATH +2F4E KANGXI RADICAL WEAPON +2F4F KANGXI RADICAL DO NOT +2F50 KANGXI RADICAL COMPARE +2F51 KANGXI RADICAL FUR +2F52 KANGXI RADICAL CLAN +2F53 KANGXI RADICAL STEAM +2F54 KANGXI RADICAL WATER +2F55 KANGXI RADICAL FIRE +2F56 KANGXI RADICAL CLAW +2F57 KANGXI RADICAL FATHER +2F58 KANGXI RADICAL DOUBLE X +2F59 KANGXI RADICAL HALF TREE TRUNK +2F5A KANGXI RADICAL SLICE +2F5B KANGXI RADICAL FANG +2F5C KANGXI RADICAL COW +2F5D KANGXI RADICAL DOG +2F5E KANGXI RADICAL PROFOUND +2F5F KANGXI RADICAL JADE +2F60 KANGXI RADICAL MELON +2F61 KANGXI RADICAL TILE +2F62 KANGXI RADICAL SWEET +2F63 KANGXI RADICAL LIFE +2F64 KANGXI RADICAL USE +2F65 KANGXI RADICAL FIELD +2F66 KANGXI RADICAL BOLT OF CLOTH +2F67 KANGXI RADICAL SICKNESS +2F68 KANGXI RADICAL DOTTED TENT +2F69 KANGXI RADICAL WHITE +2F6A KANGXI RADICAL SKIN +2F6B KANGXI RADICAL DISH +2F6C KANGXI RADICAL EYE +2F6D KANGXI RADICAL SPEAR +2F6E KANGXI RADICAL ARROW +2F6F KANGXI RADICAL STONE +2F70 KANGXI RADICAL SPIRIT +2F71 KANGXI RADICAL TRACK +2F72 KANGXI RADICAL GRAIN +2F73 KANGXI RADICAL CAVE +2F74 KANGXI RADICAL STAND +2F75 KANGXI RADICAL BAMBOO +2F76 KANGXI RADICAL RICE +2F77 KANGXI RADICAL SILK +2F78 KANGXI RADICAL JAR +2F79 KANGXI RADICAL NET +2F7A KANGXI RADICAL SHEEP +2F7B KANGXI RADICAL FEATHER +2F7C KANGXI RADICAL OLD +2F7D KANGXI RADICAL AND +2F7E KANGXI RADICAL PLOW +2F7F KANGXI RADICAL EAR +2F80 KANGXI RADICAL BRUSH +2F81 KANGXI RADICAL MEAT +2F82 KANGXI RADICAL MINISTER +2F83 KANGXI RADICAL SELF +2F84 KANGXI RADICAL ARRIVE +2F85 KANGXI RADICAL MORTAR +2F86 KANGXI RADICAL TONGUE +2F87 KANGXI RADICAL OPPOSE +2F88 KANGXI RADICAL BOAT +2F89 KANGXI RADICAL STOPPING +2F8A KANGXI RADICAL COLOR +2F8B KANGXI RADICAL GRASS +2F8C KANGXI RADICAL TIGER +2F8D KANGXI RADICAL INSECT +2F8E KANGXI RADICAL BLOOD +2F8F KANGXI RADICAL WALK ENCLOSURE +2F90 KANGXI RADICAL CLOTHES +2F91 KANGXI RADICAL WEST +2F92 KANGXI RADICAL SEE +2F93 KANGXI RADICAL HORN +2F94 KANGXI RADICAL SPEECH +2F95 KANGXI RADICAL VALLEY +2F96 KANGXI RADICAL BEAN +2F97 KANGXI RADICAL PIG +2F98 KANGXI RADICAL BADGER +2F99 KANGXI RADICAL SHELL +2F9A KANGXI RADICAL RED +2F9B KANGXI RADICAL RUN +2F9C KANGXI RADICAL FOOT +2F9D KANGXI RADICAL BODY +2F9E KANGXI RADICAL CART +2F9F KANGXI RADICAL BITTER +2FA0 KANGXI RADICAL MORNING +2FA1 KANGXI RADICAL WALK +2FA2 KANGXI RADICAL CITY +2FA3 KANGXI RADICAL WINE +2FA4 KANGXI RADICAL DISTINGUISH +2FA5 KANGXI RADICAL VILLAGE +2FA6 KANGXI RADICAL GOLD +2FA7 KANGXI RADICAL LONG +2FA8 KANGXI RADICAL GATE +2FA9 KANGXI RADICAL MOUND +2FAA KANGXI RADICAL SLAVE +2FAB KANGXI RADICAL SHORT TAILED BIRD +2FAC KANGXI RADICAL RAIN +2FAD KANGXI RADICAL BLUE +2FAE KANGXI RADICAL WRONG +2FAF KANGXI RADICAL FACE +2FB0 KANGXI RADICAL LEATHER +2FB1 KANGXI RADICAL TANNED LEATHER +2FB2 KANGXI RADICAL LEEK +2FB3 KANGXI RADICAL SOUND +2FB4 KANGXI RADICAL LEAF +2FB5 KANGXI RADICAL WIND +2FB6 KANGXI RADICAL FLY +2FB7 KANGXI RADICAL EAT +2FB8 KANGXI RADICAL HEAD +2FB9 KANGXI RADICAL FRAGRANT +2FBA KANGXI RADICAL HORSE +2FBB KANGXI RADICAL BONE +2FBC KANGXI RADICAL TALL +2FBD KANGXI RADICAL HAIR +2FBE KANGXI RADICAL FIGHT +2FBF KANGXI RADICAL SACRIFICIAL WINE +2FC0 KANGXI RADICAL CAULDRON +2FC1 KANGXI RADICAL GHOST +2FC2 KANGXI RADICAL FISH +2FC3 KANGXI RADICAL BIRD +2FC4 KANGXI RADICAL SALT +2FC5 KANGXI RADICAL DEER +2FC6 KANGXI RADICAL WHEAT +2FC7 KANGXI RADICAL HEMP +2FC8 KANGXI RADICAL YELLOW +2FC9 KANGXI RADICAL MILLET +2FCA KANGXI RADICAL BLACK +2FCB KANGXI RADICAL EMBROIDERY +2FCC KANGXI RADICAL FROG +2FCD KANGXI RADICAL TRIPOD +2FCE KANGXI RADICAL DRUM +2FCF KANGXI RADICAL RAT +2FD0 KANGXI RADICAL NOSE +2FD1 KANGXI RADICAL EVEN +2FD2 KANGXI RADICAL TOOTH +2FD3 KANGXI RADICAL DRAGON +2FD4 KANGXI RADICAL TURTLE +2FD5 KANGXI RADICAL FLUTE +2FF0 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT +2FF1 IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW +2FF2 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT +2FF3 IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW +2FF4 IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND +2FF5 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE +2FF6 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW +2FF7 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT +2FF8 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT +2FF9 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT +2FFA IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT +2FFB IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +3000 IDEOGRAPHIC SPACE +3001 IDEOGRAPHIC COMMA +3002 IDEOGRAPHIC FULL STOP +3003 DITTO MARK +3004 JAPANESE INDUSTRIAL STANDARD SYMBOL +3005 IDEOGRAPHIC ITERATION MARK +3006 IDEOGRAPHIC CLOSING MARK +3007 IDEOGRAPHIC NUMBER ZERO +3008 LEFT ANGLE BRACKET +3009 RIGHT ANGLE BRACKET +300A LEFT DOUBLE ANGLE BRACKET +300B RIGHT DOUBLE ANGLE BRACKET +300C LEFT CORNER BRACKET +300D RIGHT CORNER BRACKET +300E LEFT WHITE CORNER BRACKET +300F RIGHT WHITE CORNER BRACKET +3010 LEFT BLACK LENTICULAR BRACKET +3011 RIGHT BLACK LENTICULAR BRACKET +3012 POSTAL MARK +3013 GETA MARK +3014 LEFT TORTOISE SHELL BRACKET +3015 RIGHT TORTOISE SHELL BRACKET +3016 LEFT WHITE LENTICULAR BRACKET +3017 RIGHT WHITE LENTICULAR BRACKET +3018 LEFT WHITE TORTOISE SHELL BRACKET +3019 RIGHT WHITE TORTOISE SHELL BRACKET +301A LEFT WHITE SQUARE BRACKET +301B RIGHT WHITE SQUARE BRACKET +301C WAVE DASH +301D REVERSED DOUBLE PRIME QUOTATION MARK +301E DOUBLE PRIME QUOTATION MARK +301F LOW DOUBLE PRIME QUOTATION MARK +3020 POSTAL MARK FACE +3021 HANGZHOU NUMERAL ONE +3022 HANGZHOU NUMERAL TWO +3023 HANGZHOU NUMERAL THREE +3024 HANGZHOU NUMERAL FOUR +3025 HANGZHOU NUMERAL FIVE +3026 HANGZHOU NUMERAL SIX +3027 HANGZHOU NUMERAL SEVEN +3028 HANGZHOU NUMERAL EIGHT +3029 HANGZHOU NUMERAL NINE +302A IDEOGRAPHIC LEVEL TONE MARK +302B IDEOGRAPHIC RISING TONE MARK +302C IDEOGRAPHIC DEPARTING TONE MARK +302D IDEOGRAPHIC ENTERING TONE MARK +302E HANGUL SINGLE DOT TONE MARK +302F HANGUL DOUBLE DOT TONE MARK +3030 WAVY DASH +3031 VERTICAL KANA REPEAT MARK +3032 VERTICAL KANA REPEAT WITH VOICED SOUND MARK +3033 VERTICAL KANA REPEAT MARK UPPER HALF +3034 VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF +3035 VERTICAL KANA REPEAT MARK LOWER HALF +3036 CIRCLED POSTAL MARK +3037 IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +3038 HANGZHOU NUMERAL TEN +3039 HANGZHOU NUMERAL TWENTY +303A HANGZHOU NUMERAL THIRTY +303B VERTICAL IDEOGRAPHIC ITERATION MARK +303C MASU MARK +303D PART ALTERNATION MARK +303E IDEOGRAPHIC VARIATION INDICATOR +303F IDEOGRAPHIC HALF FILL SPACE +3041 HIRAGANA LETTER SMALL A +3042 HIRAGANA LETTER A +3043 HIRAGANA LETTER SMALL I +3044 HIRAGANA LETTER I +3045 HIRAGANA LETTER SMALL U +3046 HIRAGANA LETTER U +3047 HIRAGANA LETTER SMALL E +3048 HIRAGANA LETTER E +3049 HIRAGANA LETTER SMALL O +304A HIRAGANA LETTER O +304B HIRAGANA LETTER KA +304C HIRAGANA LETTER GA +304D HIRAGANA LETTER KI +304E HIRAGANA LETTER GI +304F HIRAGANA LETTER KU +3050 HIRAGANA LETTER GU +3051 HIRAGANA LETTER KE +3052 HIRAGANA LETTER GE +3053 HIRAGANA LETTER KO +3054 HIRAGANA LETTER GO +3055 HIRAGANA LETTER SA +3056 HIRAGANA LETTER ZA +3057 HIRAGANA LETTER SI +3058 HIRAGANA LETTER ZI +3059 HIRAGANA LETTER SU +305A HIRAGANA LETTER ZU +305B HIRAGANA LETTER SE +305C HIRAGANA LETTER ZE +305D HIRAGANA LETTER SO +305E HIRAGANA LETTER ZO +305F HIRAGANA LETTER TA +3060 HIRAGANA LETTER DA +3061 HIRAGANA LETTER TI +3062 HIRAGANA LETTER DI +3063 HIRAGANA LETTER SMALL TU +3064 HIRAGANA LETTER TU +3065 HIRAGANA LETTER DU +3066 HIRAGANA LETTER TE +3067 HIRAGANA LETTER DE +3068 HIRAGANA LETTER TO +3069 HIRAGANA LETTER DO +306A HIRAGANA LETTER NA +306B HIRAGANA LETTER NI +306C HIRAGANA LETTER NU +306D HIRAGANA LETTER NE +306E HIRAGANA LETTER NO +306F HIRAGANA LETTER HA +3070 HIRAGANA LETTER BA +3071 HIRAGANA LETTER PA +3072 HIRAGANA LETTER HI +3073 HIRAGANA LETTER BI +3074 HIRAGANA LETTER PI +3075 HIRAGANA LETTER HU +3076 HIRAGANA LETTER BU +3077 HIRAGANA LETTER PU +3078 HIRAGANA LETTER HE +3079 HIRAGANA LETTER BE +307A HIRAGANA LETTER PE +307B HIRAGANA LETTER HO +307C HIRAGANA LETTER BO +307D HIRAGANA LETTER PO +307E HIRAGANA LETTER MA +307F HIRAGANA LETTER MI +3080 HIRAGANA LETTER MU +3081 HIRAGANA LETTER ME +3082 HIRAGANA LETTER MO +3083 HIRAGANA LETTER SMALL YA +3084 HIRAGANA LETTER YA +3085 HIRAGANA LETTER SMALL YU +3086 HIRAGANA LETTER YU +3087 HIRAGANA LETTER SMALL YO +3088 HIRAGANA LETTER YO +3089 HIRAGANA LETTER RA +308A HIRAGANA LETTER RI +308B HIRAGANA LETTER RU +308C HIRAGANA LETTER RE +308D HIRAGANA LETTER RO +308E HIRAGANA LETTER SMALL WA +308F HIRAGANA LETTER WA +3090 HIRAGANA LETTER WI +3091 HIRAGANA LETTER WE +3092 HIRAGANA LETTER WO +3093 HIRAGANA LETTER N +3094 HIRAGANA LETTER VU +3095 HIRAGANA LETTER SMALL KA +3096 HIRAGANA LETTER SMALL KE +3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK +309A COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309B KATAKANA-HIRAGANA VOICED SOUND MARK +309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309D HIRAGANA ITERATION MARK +309E HIRAGANA VOICED ITERATION MARK +309F HIRAGANA DIGRAPH YORI +30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN +30A1 KATAKANA LETTER SMALL A +30A2 KATAKANA LETTER A +30A3 KATAKANA LETTER SMALL I +30A4 KATAKANA LETTER I +30A5 KATAKANA LETTER SMALL U +30A6 KATAKANA LETTER U +30A7 KATAKANA LETTER SMALL E +30A8 KATAKANA LETTER E +30A9 KATAKANA LETTER SMALL O +30AA KATAKANA LETTER O +30AB KATAKANA LETTER KA +30AC KATAKANA LETTER GA +30AD KATAKANA LETTER KI +30AE KATAKANA LETTER GI +30AF KATAKANA LETTER KU +30B0 KATAKANA LETTER GU +30B1 KATAKANA LETTER KE +30B2 KATAKANA LETTER GE +30B3 KATAKANA LETTER KO +30B4 KATAKANA LETTER GO +30B5 KATAKANA LETTER SA +30B6 KATAKANA LETTER ZA +30B7 KATAKANA LETTER SI +30B8 KATAKANA LETTER ZI +30B9 KATAKANA LETTER SU +30BA KATAKANA LETTER ZU +30BB KATAKANA LETTER SE +30BC KATAKANA LETTER ZE +30BD KATAKANA LETTER SO +30BE KATAKANA LETTER ZO +30BF KATAKANA LETTER TA +30C0 KATAKANA LETTER DA +30C1 KATAKANA LETTER TI +30C2 KATAKANA LETTER DI +30C3 KATAKANA LETTER SMALL TU +30C4 KATAKANA LETTER TU +30C5 KATAKANA LETTER DU +30C6 KATAKANA LETTER TE +30C7 KATAKANA LETTER DE +30C8 KATAKANA LETTER TO +30C9 KATAKANA LETTER DO +30CA KATAKANA LETTER NA +30CB KATAKANA LETTER NI +30CC KATAKANA LETTER NU +30CD KATAKANA LETTER NE +30CE KATAKANA LETTER NO +30CF KATAKANA LETTER HA +30D0 KATAKANA LETTER BA +30D1 KATAKANA LETTER PA +30D2 KATAKANA LETTER HI +30D3 KATAKANA LETTER BI +30D4 KATAKANA LETTER PI +30D5 KATAKANA LETTER HU +30D6 KATAKANA LETTER BU +30D7 KATAKANA LETTER PU +30D8 KATAKANA LETTER HE +30D9 KATAKANA LETTER BE +30DA KATAKANA LETTER PE +30DB KATAKANA LETTER HO +30DC KATAKANA LETTER BO +30DD KATAKANA LETTER PO +30DE KATAKANA LETTER MA +30DF KATAKANA LETTER MI +30E0 KATAKANA LETTER MU +30E1 KATAKANA LETTER ME +30E2 KATAKANA LETTER MO +30E3 KATAKANA LETTER SMALL YA +30E4 KATAKANA LETTER YA +30E5 KATAKANA LETTER SMALL YU +30E6 KATAKANA LETTER YU +30E7 KATAKANA LETTER SMALL YO +30E8 KATAKANA LETTER YO +30E9 KATAKANA LETTER RA +30EA KATAKANA LETTER RI +30EB KATAKANA LETTER RU +30EC KATAKANA LETTER RE +30ED KATAKANA LETTER RO +30EE KATAKANA LETTER SMALL WA +30EF KATAKANA LETTER WA +30F0 KATAKANA LETTER WI +30F1 KATAKANA LETTER WE +30F2 KATAKANA LETTER WO +30F3 KATAKANA LETTER N +30F4 KATAKANA LETTER VU +30F5 KATAKANA LETTER SMALL KA +30F6 KATAKANA LETTER SMALL KE +30F7 KATAKANA LETTER VA +30F8 KATAKANA LETTER VI +30F9 KATAKANA LETTER VE +30FA KATAKANA LETTER VO +30FB KATAKANA MIDDLE DOT +30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK +30FD KATAKANA ITERATION MARK +30FE KATAKANA VOICED ITERATION MARK +30FF KATAKANA DIGRAPH KOTO +3105 BOPOMOFO LETTER B +3106 BOPOMOFO LETTER P +3107 BOPOMOFO LETTER M +3108 BOPOMOFO LETTER F +3109 BOPOMOFO LETTER D +310A BOPOMOFO LETTER T +310B BOPOMOFO LETTER N +310C BOPOMOFO LETTER L +310D BOPOMOFO LETTER G +310E BOPOMOFO LETTER K +310F BOPOMOFO LETTER H +3110 BOPOMOFO LETTER J +3111 BOPOMOFO LETTER Q +3112 BOPOMOFO LETTER X +3113 BOPOMOFO LETTER ZH +3114 BOPOMOFO LETTER CH +3115 BOPOMOFO LETTER SH +3116 BOPOMOFO LETTER R +3117 BOPOMOFO LETTER Z +3118 BOPOMOFO LETTER C +3119 BOPOMOFO LETTER S +311A BOPOMOFO LETTER A +311B BOPOMOFO LETTER O +311C BOPOMOFO LETTER E +311D BOPOMOFO LETTER EH +311E BOPOMOFO LETTER AI +311F BOPOMOFO LETTER EI +3120 BOPOMOFO LETTER AU +3121 BOPOMOFO LETTER OU +3122 BOPOMOFO LETTER AN +3123 BOPOMOFO LETTER EN +3124 BOPOMOFO LETTER ANG +3125 BOPOMOFO LETTER ENG +3126 BOPOMOFO LETTER ER +3127 BOPOMOFO LETTER I +3128 BOPOMOFO LETTER U +3129 BOPOMOFO LETTER IU +312A BOPOMOFO LETTER V +312B BOPOMOFO LETTER NG +312C BOPOMOFO LETTER GN +3131 HANGUL LETTER KIYEOK +3132 HANGUL LETTER SSANGKIYEOK +3133 HANGUL LETTER KIYEOK-SIOS +3134 HANGUL LETTER NIEUN +3135 HANGUL LETTER NIEUN-CIEUC +3136 HANGUL LETTER NIEUN-HIEUH +3137 HANGUL LETTER TIKEUT +3138 HANGUL LETTER SSANGTIKEUT +3139 HANGUL LETTER RIEUL +313A HANGUL LETTER RIEUL-KIYEOK +313B HANGUL LETTER RIEUL-MIEUM +313C HANGUL LETTER RIEUL-PIEUP +313D HANGUL LETTER RIEUL-SIOS +313E HANGUL LETTER RIEUL-THIEUTH +313F HANGUL LETTER RIEUL-PHIEUPH +3140 HANGUL LETTER RIEUL-HIEUH +3141 HANGUL LETTER MIEUM +3142 HANGUL LETTER PIEUP +3143 HANGUL LETTER SSANGPIEUP +3144 HANGUL LETTER PIEUP-SIOS +3145 HANGUL LETTER SIOS +3146 HANGUL LETTER SSANGSIOS +3147 HANGUL LETTER IEUNG +3148 HANGUL LETTER CIEUC +3149 HANGUL LETTER SSANGCIEUC +314A HANGUL LETTER CHIEUCH +314B HANGUL LETTER KHIEUKH +314C HANGUL LETTER THIEUTH +314D HANGUL LETTER PHIEUPH +314E HANGUL LETTER HIEUH +314F HANGUL LETTER A +3150 HANGUL LETTER AE +3151 HANGUL LETTER YA +3152 HANGUL LETTER YAE +3153 HANGUL LETTER EO +3154 HANGUL LETTER E +3155 HANGUL LETTER YEO +3156 HANGUL LETTER YE +3157 HANGUL LETTER O +3158 HANGUL LETTER WA +3159 HANGUL LETTER WAE +315A HANGUL LETTER OE +315B HANGUL LETTER YO +315C HANGUL LETTER U +315D HANGUL LETTER WEO +315E HANGUL LETTER WE +315F HANGUL LETTER WI +3160 HANGUL LETTER YU +3161 HANGUL LETTER EU +3162 HANGUL LETTER YI +3163 HANGUL LETTER I +3164 HANGUL FILLER +3165 HANGUL LETTER SSANGNIEUN +3166 HANGUL LETTER NIEUN-TIKEUT +3167 HANGUL LETTER NIEUN-SIOS +3168 HANGUL LETTER NIEUN-PANSIOS +3169 HANGUL LETTER RIEUL-KIYEOK-SIOS +316A HANGUL LETTER RIEUL-TIKEUT +316B HANGUL LETTER RIEUL-PIEUP-SIOS +316C HANGUL LETTER RIEUL-PANSIOS +316D HANGUL LETTER RIEUL-YEORINHIEUH +316E HANGUL LETTER MIEUM-PIEUP +316F HANGUL LETTER MIEUM-SIOS +3170 HANGUL LETTER MIEUM-PANSIOS +3171 HANGUL LETTER KAPYEOUNMIEUM +3172 HANGUL LETTER PIEUP-KIYEOK +3173 HANGUL LETTER PIEUP-TIKEUT +3174 HANGUL LETTER PIEUP-SIOS-KIYEOK +3175 HANGUL LETTER PIEUP-SIOS-TIKEUT +3176 HANGUL LETTER PIEUP-CIEUC +3177 HANGUL LETTER PIEUP-THIEUTH +3178 HANGUL LETTER KAPYEOUNPIEUP +3179 HANGUL LETTER KAPYEOUNSSANGPIEUP +317A HANGUL LETTER SIOS-KIYEOK +317B HANGUL LETTER SIOS-NIEUN +317C HANGUL LETTER SIOS-TIKEUT +317D HANGUL LETTER SIOS-PIEUP +317E HANGUL LETTER SIOS-CIEUC +317F HANGUL LETTER PANSIOS +3180 HANGUL LETTER SSANGIEUNG +3181 HANGUL LETTER YESIEUNG +3182 HANGUL LETTER YESIEUNG-SIOS +3183 HANGUL LETTER YESIEUNG-PANSIOS +3184 HANGUL LETTER KAPYEOUNPHIEUPH +3185 HANGUL LETTER SSANGHIEUH +3186 HANGUL LETTER YEORINHIEUH +3187 HANGUL LETTER YO-YA +3188 HANGUL LETTER YO-YAE +3189 HANGUL LETTER YO-I +318A HANGUL LETTER YU-YEO +318B HANGUL LETTER YU-YE +318C HANGUL LETTER YU-I +318D HANGUL LETTER ARAEA +318E HANGUL LETTER ARAEAE +3190 IDEOGRAPHIC ANNOTATION LINKING MARK +3191 IDEOGRAPHIC ANNOTATION REVERSE MARK +3192 IDEOGRAPHIC ANNOTATION ONE MARK +3193 IDEOGRAPHIC ANNOTATION TWO MARK +3194 IDEOGRAPHIC ANNOTATION THREE MARK +3195 IDEOGRAPHIC ANNOTATION FOUR MARK +3196 IDEOGRAPHIC ANNOTATION TOP MARK +3197 IDEOGRAPHIC ANNOTATION MIDDLE MARK +3198 IDEOGRAPHIC ANNOTATION BOTTOM MARK +3199 IDEOGRAPHIC ANNOTATION FIRST MARK +319A IDEOGRAPHIC ANNOTATION SECOND MARK +319B IDEOGRAPHIC ANNOTATION THIRD MARK +319C IDEOGRAPHIC ANNOTATION FOURTH MARK +319D IDEOGRAPHIC ANNOTATION HEAVEN MARK +319E IDEOGRAPHIC ANNOTATION EARTH MARK +319F IDEOGRAPHIC ANNOTATION MAN MARK +31A0 BOPOMOFO LETTER BU +31A1 BOPOMOFO LETTER ZI +31A2 BOPOMOFO LETTER JI +31A3 BOPOMOFO LETTER GU +31A4 BOPOMOFO LETTER EE +31A5 BOPOMOFO LETTER ENN +31A6 BOPOMOFO LETTER OO +31A7 BOPOMOFO LETTER ONN +31A8 BOPOMOFO LETTER IR +31A9 BOPOMOFO LETTER ANN +31AA BOPOMOFO LETTER INN +31AB BOPOMOFO LETTER UNN +31AC BOPOMOFO LETTER IM +31AD BOPOMOFO LETTER NGG +31AE BOPOMOFO LETTER AINN +31AF BOPOMOFO LETTER AUNN +31B0 BOPOMOFO LETTER AM +31B1 BOPOMOFO LETTER OM +31B2 BOPOMOFO LETTER ONG +31B3 BOPOMOFO LETTER INNN +31B4 BOPOMOFO FINAL LETTER P +31B5 BOPOMOFO FINAL LETTER T +31B6 BOPOMOFO FINAL LETTER K +31B7 BOPOMOFO FINAL LETTER H +31C0 CJK STROKE T +31C1 CJK STROKE WG +31C2 CJK STROKE XG +31C3 CJK STROKE BXG +31C4 CJK STROKE SW +31C5 CJK STROKE HZZ +31C6 CJK STROKE HZG +31C7 CJK STROKE HP +31C8 CJK STROKE HZWG +31C9 CJK STROKE SZWG +31CA CJK STROKE HZT +31CB CJK STROKE HZZP +31CC CJK STROKE HPWG +31CD CJK STROKE HZW +31CE CJK STROKE HZZZ +31CF CJK STROKE N +31F0 KATAKANA LETTER SMALL KU +31F1 KATAKANA LETTER SMALL SI +31F2 KATAKANA LETTER SMALL SU +31F3 KATAKANA LETTER SMALL TO +31F4 KATAKANA LETTER SMALL NU +31F5 KATAKANA LETTER SMALL HA +31F6 KATAKANA LETTER SMALL HI +31F7 KATAKANA LETTER SMALL HU +31F8 KATAKANA LETTER SMALL HE +31F9 KATAKANA LETTER SMALL HO +31FA KATAKANA LETTER SMALL MU +31FB KATAKANA LETTER SMALL RA +31FC KATAKANA LETTER SMALL RI +31FD KATAKANA LETTER SMALL RU +31FE KATAKANA LETTER SMALL RE +31FF KATAKANA LETTER SMALL RO +3200 PARENTHESIZED HANGUL KIYEOK +3201 PARENTHESIZED HANGUL NIEUN +3202 PARENTHESIZED HANGUL TIKEUT +3203 PARENTHESIZED HANGUL RIEUL +3204 PARENTHESIZED HANGUL MIEUM +3205 PARENTHESIZED HANGUL PIEUP +3206 PARENTHESIZED HANGUL SIOS +3207 PARENTHESIZED HANGUL IEUNG +3208 PARENTHESIZED HANGUL CIEUC +3209 PARENTHESIZED HANGUL CHIEUCH +320A PARENTHESIZED HANGUL KHIEUKH +320B PARENTHESIZED HANGUL THIEUTH +320C PARENTHESIZED HANGUL PHIEUPH +320D PARENTHESIZED HANGUL HIEUH +320E PARENTHESIZED HANGUL KIYEOK A +320F PARENTHESIZED HANGUL NIEUN A +3210 PARENTHESIZED HANGUL TIKEUT A +3211 PARENTHESIZED HANGUL RIEUL A +3212 PARENTHESIZED HANGUL MIEUM A +3213 PARENTHESIZED HANGUL PIEUP A +3214 PARENTHESIZED HANGUL SIOS A +3215 PARENTHESIZED HANGUL IEUNG A +3216 PARENTHESIZED HANGUL CIEUC A +3217 PARENTHESIZED HANGUL CHIEUCH A +3218 PARENTHESIZED HANGUL KHIEUKH A +3219 PARENTHESIZED HANGUL THIEUTH A +321A PARENTHESIZED HANGUL PHIEUPH A +321B PARENTHESIZED HANGUL HIEUH A +321C PARENTHESIZED HANGUL CIEUC U +321D PARENTHESIZED KOREAN CHARACTER OJEON +321E PARENTHESIZED KOREAN CHARACTER O HU +3220 PARENTHESIZED IDEOGRAPH ONE +3221 PARENTHESIZED IDEOGRAPH TWO +3222 PARENTHESIZED IDEOGRAPH THREE +3223 PARENTHESIZED IDEOGRAPH FOUR +3224 PARENTHESIZED IDEOGRAPH FIVE +3225 PARENTHESIZED IDEOGRAPH SIX +3226 PARENTHESIZED IDEOGRAPH SEVEN +3227 PARENTHESIZED IDEOGRAPH EIGHT +3228 PARENTHESIZED IDEOGRAPH NINE +3229 PARENTHESIZED IDEOGRAPH TEN +322A PARENTHESIZED IDEOGRAPH MOON +322B PARENTHESIZED IDEOGRAPH FIRE +322C PARENTHESIZED IDEOGRAPH WATER +322D PARENTHESIZED IDEOGRAPH WOOD +322E PARENTHESIZED IDEOGRAPH METAL +322F PARENTHESIZED IDEOGRAPH EARTH +3230 PARENTHESIZED IDEOGRAPH SUN +3231 PARENTHESIZED IDEOGRAPH STOCK +3232 PARENTHESIZED IDEOGRAPH HAVE +3233 PARENTHESIZED IDEOGRAPH SOCIETY +3234 PARENTHESIZED IDEOGRAPH NAME +3235 PARENTHESIZED IDEOGRAPH SPECIAL +3236 PARENTHESIZED IDEOGRAPH FINANCIAL +3237 PARENTHESIZED IDEOGRAPH CONGRATULATION +3238 PARENTHESIZED IDEOGRAPH LABOR +3239 PARENTHESIZED IDEOGRAPH REPRESENT +323A PARENTHESIZED IDEOGRAPH CALL +323B PARENTHESIZED IDEOGRAPH STUDY +323C PARENTHESIZED IDEOGRAPH SUPERVISE +323D PARENTHESIZED IDEOGRAPH ENTERPRISE +323E PARENTHESIZED IDEOGRAPH RESOURCE +323F PARENTHESIZED IDEOGRAPH ALLIANCE +3240 PARENTHESIZED IDEOGRAPH FESTIVAL +3241 PARENTHESIZED IDEOGRAPH REST +3242 PARENTHESIZED IDEOGRAPH SELF +3243 PARENTHESIZED IDEOGRAPH REACH +3250 PARTNERSHIP SIGN +3251 CIRCLED NUMBER TWENTY ONE +3252 CIRCLED NUMBER TWENTY TWO +3253 CIRCLED NUMBER TWENTY THREE +3254 CIRCLED NUMBER TWENTY FOUR +3255 CIRCLED NUMBER TWENTY FIVE +3256 CIRCLED NUMBER TWENTY SIX +3257 CIRCLED NUMBER TWENTY SEVEN +3258 CIRCLED NUMBER TWENTY EIGHT +3259 CIRCLED NUMBER TWENTY NINE +325A CIRCLED NUMBER THIRTY +325B CIRCLED NUMBER THIRTY ONE +325C CIRCLED NUMBER THIRTY TWO +325D CIRCLED NUMBER THIRTY THREE +325E CIRCLED NUMBER THIRTY FOUR +325F CIRCLED NUMBER THIRTY FIVE +3260 CIRCLED HANGUL KIYEOK +3261 CIRCLED HANGUL NIEUN +3262 CIRCLED HANGUL TIKEUT +3263 CIRCLED HANGUL RIEUL +3264 CIRCLED HANGUL MIEUM +3265 CIRCLED HANGUL PIEUP +3266 CIRCLED HANGUL SIOS +3267 CIRCLED HANGUL IEUNG +3268 CIRCLED HANGUL CIEUC +3269 CIRCLED HANGUL CHIEUCH +326A CIRCLED HANGUL KHIEUKH +326B CIRCLED HANGUL THIEUTH +326C CIRCLED HANGUL PHIEUPH +326D CIRCLED HANGUL HIEUH +326E CIRCLED HANGUL KIYEOK A +326F CIRCLED HANGUL NIEUN A +3270 CIRCLED HANGUL TIKEUT A +3271 CIRCLED HANGUL RIEUL A +3272 CIRCLED HANGUL MIEUM A +3273 CIRCLED HANGUL PIEUP A +3274 CIRCLED HANGUL SIOS A +3275 CIRCLED HANGUL IEUNG A +3276 CIRCLED HANGUL CIEUC A +3277 CIRCLED HANGUL CHIEUCH A +3278 CIRCLED HANGUL KHIEUKH A +3279 CIRCLED HANGUL THIEUTH A +327A CIRCLED HANGUL PHIEUPH A +327B CIRCLED HANGUL HIEUH A +327C CIRCLED KOREAN CHARACTER CHAMKO +327D CIRCLED KOREAN CHARACTER JUEUI +327E CIRCLED HANGUL IEUNG U +327F KOREAN STANDARD SYMBOL +3280 CIRCLED IDEOGRAPH ONE +3281 CIRCLED IDEOGRAPH TWO +3282 CIRCLED IDEOGRAPH THREE +3283 CIRCLED IDEOGRAPH FOUR +3284 CIRCLED IDEOGRAPH FIVE +3285 CIRCLED IDEOGRAPH SIX +3286 CIRCLED IDEOGRAPH SEVEN +3287 CIRCLED IDEOGRAPH EIGHT +3288 CIRCLED IDEOGRAPH NINE +3289 CIRCLED IDEOGRAPH TEN +328A CIRCLED IDEOGRAPH MOON +328B CIRCLED IDEOGRAPH FIRE +328C CIRCLED IDEOGRAPH WATER +328D CIRCLED IDEOGRAPH WOOD +328E CIRCLED IDEOGRAPH METAL +328F CIRCLED IDEOGRAPH EARTH +3290 CIRCLED IDEOGRAPH SUN +3291 CIRCLED IDEOGRAPH STOCK +3292 CIRCLED IDEOGRAPH HAVE +3293 CIRCLED IDEOGRAPH SOCIETY +3294 CIRCLED IDEOGRAPH NAME +3295 CIRCLED IDEOGRAPH SPECIAL +3296 CIRCLED IDEOGRAPH FINANCIAL +3297 CIRCLED IDEOGRAPH CONGRATULATION +3298 CIRCLED IDEOGRAPH LABOR +3299 CIRCLED IDEOGRAPH SECRET +329A CIRCLED IDEOGRAPH MALE +329B CIRCLED IDEOGRAPH FEMALE +329C CIRCLED IDEOGRAPH SUITABLE +329D CIRCLED IDEOGRAPH EXCELLENT +329E CIRCLED IDEOGRAPH PRINT +329F CIRCLED IDEOGRAPH ATTENTION +32A0 CIRCLED IDEOGRAPH ITEM +32A1 CIRCLED IDEOGRAPH REST +32A2 CIRCLED IDEOGRAPH COPY +32A3 CIRCLED IDEOGRAPH CORRECT +32A4 CIRCLED IDEOGRAPH HIGH +32A5 CIRCLED IDEOGRAPH CENTRE +32A6 CIRCLED IDEOGRAPH LOW +32A7 CIRCLED IDEOGRAPH LEFT +32A8 CIRCLED IDEOGRAPH RIGHT +32A9 CIRCLED IDEOGRAPH MEDICINE +32AA CIRCLED IDEOGRAPH RELIGION +32AB CIRCLED IDEOGRAPH STUDY +32AC CIRCLED IDEOGRAPH SUPERVISE +32AD CIRCLED IDEOGRAPH ENTERPRISE +32AE CIRCLED IDEOGRAPH RESOURCE +32AF CIRCLED IDEOGRAPH ALLIANCE +32B0 CIRCLED IDEOGRAPH NIGHT +32B1 CIRCLED NUMBER THIRTY SIX +32B2 CIRCLED NUMBER THIRTY SEVEN +32B3 CIRCLED NUMBER THIRTY EIGHT +32B4 CIRCLED NUMBER THIRTY NINE +32B5 CIRCLED NUMBER FORTY +32B6 CIRCLED NUMBER FORTY ONE +32B7 CIRCLED NUMBER FORTY TWO +32B8 CIRCLED NUMBER FORTY THREE +32B9 CIRCLED NUMBER FORTY FOUR +32BA CIRCLED NUMBER FORTY FIVE +32BB CIRCLED NUMBER FORTY SIX +32BC CIRCLED NUMBER FORTY SEVEN +32BD CIRCLED NUMBER FORTY EIGHT +32BE CIRCLED NUMBER FORTY NINE +32BF CIRCLED NUMBER FIFTY +32C0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY +32C1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY +32C2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH +32C3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL +32C4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY +32C5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE +32C6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY +32C7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST +32C8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER +32C9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER +32CA IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER +32CB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER +32CC SQUARE HG +32CD SQUARE ERG +32CE SQUARE EV +32CF LIMITED LIABILITY SIGN +32D0 CIRCLED KATAKANA A +32D1 CIRCLED KATAKANA I +32D2 CIRCLED KATAKANA U +32D3 CIRCLED KATAKANA E +32D4 CIRCLED KATAKANA O +32D5 CIRCLED KATAKANA KA +32D6 CIRCLED KATAKANA KI +32D7 CIRCLED KATAKANA KU +32D8 CIRCLED KATAKANA KE +32D9 CIRCLED KATAKANA KO +32DA CIRCLED KATAKANA SA +32DB CIRCLED KATAKANA SI +32DC CIRCLED KATAKANA SU +32DD CIRCLED KATAKANA SE +32DE CIRCLED KATAKANA SO +32DF CIRCLED KATAKANA TA +32E0 CIRCLED KATAKANA TI +32E1 CIRCLED KATAKANA TU +32E2 CIRCLED KATAKANA TE +32E3 CIRCLED KATAKANA TO +32E4 CIRCLED KATAKANA NA +32E5 CIRCLED KATAKANA NI +32E6 CIRCLED KATAKANA NU +32E7 CIRCLED KATAKANA NE +32E8 CIRCLED KATAKANA NO +32E9 CIRCLED KATAKANA HA +32EA CIRCLED KATAKANA HI +32EB CIRCLED KATAKANA HU +32EC CIRCLED KATAKANA HE +32ED CIRCLED KATAKANA HO +32EE CIRCLED KATAKANA MA +32EF CIRCLED KATAKANA MI +32F0 CIRCLED KATAKANA MU +32F1 CIRCLED KATAKANA ME +32F2 CIRCLED KATAKANA MO +32F3 CIRCLED KATAKANA YA +32F4 CIRCLED KATAKANA YU +32F5 CIRCLED KATAKANA YO +32F6 CIRCLED KATAKANA RA +32F7 CIRCLED KATAKANA RI +32F8 CIRCLED KATAKANA RU +32F9 CIRCLED KATAKANA RE +32FA CIRCLED KATAKANA RO +32FB CIRCLED KATAKANA WA +32FC CIRCLED KATAKANA WI +32FD CIRCLED KATAKANA WE +32FE CIRCLED KATAKANA WO +3300 SQUARE APAATO +3301 SQUARE ARUHUA +3302 SQUARE ANPEA +3303 SQUARE AARU +3304 SQUARE ININGU +3305 SQUARE INTI +3306 SQUARE UON +3307 SQUARE ESUKUUDO +3308 SQUARE EEKAA +3309 SQUARE ONSU +330A SQUARE OOMU +330B SQUARE KAIRI +330C SQUARE KARATTO +330D SQUARE KARORII +330E SQUARE GARON +330F SQUARE GANMA +3310 SQUARE GIGA +3311 SQUARE GINII +3312 SQUARE KYURII +3313 SQUARE GIRUDAA +3314 SQUARE KIRO +3315 SQUARE KIROGURAMU +3316 SQUARE KIROMEETORU +3317 SQUARE KIROWATTO +3318 SQUARE GURAMU +3319 SQUARE GURAMUTON +331A SQUARE KURUZEIRO +331B SQUARE KUROONE +331C SQUARE KEESU +331D SQUARE KORUNA +331E SQUARE KOOPO +331F SQUARE SAIKURU +3320 SQUARE SANTIIMU +3321 SQUARE SIRINGU +3322 SQUARE SENTI +3323 SQUARE SENTO +3324 SQUARE DAASU +3325 SQUARE DESI +3326 SQUARE DORU +3327 SQUARE TON +3328 SQUARE NANO +3329 SQUARE NOTTO +332A SQUARE HAITU +332B SQUARE PAASENTO +332C SQUARE PAATU +332D SQUARE BAARERU +332E SQUARE PIASUTORU +332F SQUARE PIKURU +3330 SQUARE PIKO +3331 SQUARE BIRU +3332 SQUARE HUARADDO +3333 SQUARE HUIITO +3334 SQUARE BUSSYERU +3335 SQUARE HURAN +3336 SQUARE HEKUTAARU +3337 SQUARE PESO +3338 SQUARE PENIHI +3339 SQUARE HERUTU +333A SQUARE PENSU +333B SQUARE PEEZI +333C SQUARE BEETA +333D SQUARE POINTO +333E SQUARE BORUTO +333F SQUARE HON +3340 SQUARE PONDO +3341 SQUARE HOORU +3342 SQUARE HOON +3343 SQUARE MAIKURO +3344 SQUARE MAIRU +3345 SQUARE MAHHA +3346 SQUARE MARUKU +3347 SQUARE MANSYON +3348 SQUARE MIKURON +3349 SQUARE MIRI +334A SQUARE MIRIBAARU +334B SQUARE MEGA +334C SQUARE MEGATON +334D SQUARE MEETORU +334E SQUARE YAADO +334F SQUARE YAARU +3350 SQUARE YUAN +3351 SQUARE RITTORU +3352 SQUARE RIRA +3353 SQUARE RUPII +3354 SQUARE RUUBURU +3355 SQUARE REMU +3356 SQUARE RENTOGEN +3357 SQUARE WATTO +3358 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO +3359 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE +335A IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO +335B IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE +335C IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR +335D IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE +335E IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX +335F IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN +3360 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT +3361 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE +3362 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN +3363 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN +3364 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE +3365 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN +3366 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN +3367 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN +3368 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN +3369 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN +336A IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN +336B IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN +336C IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY +336D IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE +336E IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO +336F IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE +3370 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR +3371 SQUARE HPA +3372 SQUARE DA +3373 SQUARE AU +3374 SQUARE BAR +3375 SQUARE OV +3376 SQUARE PC +3377 SQUARE DM +3378 SQUARE DM SQUARED +3379 SQUARE DM CUBED +337A SQUARE IU +337B SQUARE ERA NAME HEISEI +337C SQUARE ERA NAME SYOUWA +337D SQUARE ERA NAME TAISYOU +337E SQUARE ERA NAME MEIZI +337F SQUARE CORPORATION +3380 SQUARE PA AMPS +3381 SQUARE NA +3382 SQUARE MU A +3383 SQUARE MA +3384 SQUARE KA +3385 SQUARE KB +3386 SQUARE MB +3387 SQUARE GB +3388 SQUARE CAL +3389 SQUARE KCAL +338A SQUARE PF +338B SQUARE NF +338C SQUARE MU F +338D SQUARE MU G +338E SQUARE MG +338F SQUARE KG +3390 SQUARE HZ +3391 SQUARE KHZ +3392 SQUARE MHZ +3393 SQUARE GHZ +3394 SQUARE THZ +3395 SQUARE MU L +3396 SQUARE ML +3397 SQUARE DL +3398 SQUARE KL +3399 SQUARE FM +339A SQUARE NM +339B SQUARE MU M +339C SQUARE MM +339D SQUARE CM +339E SQUARE KM +339F SQUARE MM SQUARED +33A0 SQUARE CM SQUARED +33A1 SQUARE M SQUARED +33A2 SQUARE KM SQUARED +33A3 SQUARE MM CUBED +33A4 SQUARE CM CUBED +33A5 SQUARE M CUBED +33A6 SQUARE KM CUBED +33A7 SQUARE M OVER S +33A8 SQUARE M OVER S SQUARED +33A9 SQUARE PA +33AA SQUARE KPA +33AB SQUARE MPA +33AC SQUARE GPA +33AD SQUARE RAD +33AE SQUARE RAD OVER S +33AF SQUARE RAD OVER S SQUARED +33B0 SQUARE PS +33B1 SQUARE NS +33B2 SQUARE MU S +33B3 SQUARE MS +33B4 SQUARE PV +33B5 SQUARE NV +33B6 SQUARE MU V +33B7 SQUARE MV +33B8 SQUARE KV +33B9 SQUARE MV MEGA +33BA SQUARE PW +33BB SQUARE NW +33BC SQUARE MU W +33BD SQUARE MW +33BE SQUARE KW +33BF SQUARE MW MEGA +33C0 SQUARE K OHM +33C1 SQUARE M OHM +33C2 SQUARE AM +33C3 SQUARE BQ +33C4 SQUARE CC +33C5 SQUARE CD +33C6 SQUARE C OVER KG +33C7 SQUARE CO +33C8 SQUARE DB +33C9 SQUARE GY +33CA SQUARE HA +33CB SQUARE HP +33CC SQUARE IN +33CD SQUARE KK +33CE SQUARE KM CAPITAL +33CF SQUARE KT +33D0 SQUARE LM +33D1 SQUARE LN +33D2 SQUARE LOG +33D3 SQUARE LX +33D4 SQUARE MB SMALL +33D5 SQUARE MIL +33D6 SQUARE MOL +33D7 SQUARE PH +33D8 SQUARE PM +33D9 SQUARE PPM +33DA SQUARE PR +33DB SQUARE SR +33DC SQUARE SV +33DD SQUARE WB +33DE SQUARE V OVER M +33DF SQUARE A OVER M +33E0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE +33E1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO +33E2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE +33E3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR +33E4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE +33E5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX +33E6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN +33E7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT +33E8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE +33E9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN +33EA IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN +33EB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE +33EC IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN +33ED IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN +33EE IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN +33EF IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN +33F0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN +33F1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN +33F2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN +33F3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY +33F4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE +33F5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO +33F6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE +33F7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR +33F8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE +33F9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX +33FA IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN +33FB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT +33FC IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE +33FD IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY +33FE IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE +33FF SQUARE GAL +3400 4DB5 CJK Ideograph Extension A +4DC0 HEXAGRAM FOR THE CREATIVE HEAVEN +4DC1 HEXAGRAM FOR THE RECEPTIVE EARTH +4DC2 HEXAGRAM FOR DIFFICULTY AT THE BEGINNING +4DC3 HEXAGRAM FOR YOUTHFUL FOLLY +4DC4 HEXAGRAM FOR WAITING +4DC5 HEXAGRAM FOR CONFLICT +4DC6 HEXAGRAM FOR THE ARMY +4DC7 HEXAGRAM FOR HOLDING TOGETHER +4DC8 HEXAGRAM FOR SMALL TAMING +4DC9 HEXAGRAM FOR TREADING +4DCA HEXAGRAM FOR PEACE +4DCB HEXAGRAM FOR STANDSTILL +4DCC HEXAGRAM FOR FELLOWSHIP +4DCD HEXAGRAM FOR GREAT POSSESSION +4DCE HEXAGRAM FOR MODESTY +4DCF HEXAGRAM FOR ENTHUSIASM +4DD0 HEXAGRAM FOR FOLLOWING +4DD1 HEXAGRAM FOR WORK ON THE DECAYED +4DD2 HEXAGRAM FOR APPROACH +4DD3 HEXAGRAM FOR CONTEMPLATION +4DD4 HEXAGRAM FOR BITING THROUGH +4DD5 HEXAGRAM FOR GRACE +4DD6 HEXAGRAM FOR SPLITTING APART +4DD7 HEXAGRAM FOR RETURN +4DD8 HEXAGRAM FOR INNOCENCE +4DD9 HEXAGRAM FOR GREAT TAMING +4DDA HEXAGRAM FOR MOUTH CORNERS +4DDB HEXAGRAM FOR GREAT PREPONDERANCE +4DDC HEXAGRAM FOR THE ABYSMAL WATER +4DDD HEXAGRAM FOR THE CLINGING FIRE +4DDE HEXAGRAM FOR INFLUENCE +4DDF HEXAGRAM FOR DURATION +4DE0 HEXAGRAM FOR RETREAT +4DE1 HEXAGRAM FOR GREAT POWER +4DE2 HEXAGRAM FOR PROGRESS +4DE3 HEXAGRAM FOR DARKENING OF THE LIGHT +4DE4 HEXAGRAM FOR THE FAMILY +4DE5 HEXAGRAM FOR OPPOSITION +4DE6 HEXAGRAM FOR OBSTRUCTION +4DE7 HEXAGRAM FOR DELIVERANCE +4DE8 HEXAGRAM FOR DECREASE +4DE9 HEXAGRAM FOR INCREASE +4DEA HEXAGRAM FOR BREAKTHROUGH +4DEB HEXAGRAM FOR COMING TO MEET +4DEC HEXAGRAM FOR GATHERING TOGETHER +4DED HEXAGRAM FOR PUSHING UPWARD +4DEE HEXAGRAM FOR OPPRESSION +4DEF HEXAGRAM FOR THE WELL +4DF0 HEXAGRAM FOR REVOLUTION +4DF1 HEXAGRAM FOR THE CAULDRON +4DF2 HEXAGRAM FOR THE AROUSING THUNDER +4DF3 HEXAGRAM FOR THE KEEPING STILL MOUNTAIN +4DF4 HEXAGRAM FOR DEVELOPMENT +4DF5 HEXAGRAM FOR THE MARRYING MAIDEN +4DF6 HEXAGRAM FOR ABUNDANCE +4DF7 HEXAGRAM FOR THE WANDERER +4DF8 HEXAGRAM FOR THE GENTLE WIND +4DF9 HEXAGRAM FOR THE JOYOUS LAKE +4DFA HEXAGRAM FOR DISPERSION +4DFB HEXAGRAM FOR LIMITATION +4DFC HEXAGRAM FOR INNER TRUTH +4DFD HEXAGRAM FOR SMALL PREPONDERANCE +4DFE HEXAGRAM FOR AFTER COMPLETION +4DFF HEXAGRAM FOR BEFORE COMPLETION +4E00 9FBB CJK Ideograph +A000 YI SYLLABLE IT +A001 YI SYLLABLE IX +A002 YI SYLLABLE I +A003 YI SYLLABLE IP +A004 YI SYLLABLE IET +A005 YI SYLLABLE IEX +A006 YI SYLLABLE IE +A007 YI SYLLABLE IEP +A008 YI SYLLABLE AT +A009 YI SYLLABLE AX +A00A YI SYLLABLE A +A00B YI SYLLABLE AP +A00C YI SYLLABLE UOX +A00D YI SYLLABLE UO +A00E YI SYLLABLE UOP +A00F YI SYLLABLE OT +A010 YI SYLLABLE OX +A011 YI SYLLABLE O +A012 YI SYLLABLE OP +A013 YI SYLLABLE EX +A014 YI SYLLABLE E +A015 YI SYLLABLE WU +A016 YI SYLLABLE BIT +A017 YI SYLLABLE BIX +A018 YI SYLLABLE BI +A019 YI SYLLABLE BIP +A01A YI SYLLABLE BIET +A01B YI SYLLABLE BIEX +A01C YI SYLLABLE BIE +A01D YI SYLLABLE BIEP +A01E YI SYLLABLE BAT +A01F YI SYLLABLE BAX +A020 YI SYLLABLE BA +A021 YI SYLLABLE BAP +A022 YI SYLLABLE BUOX +A023 YI SYLLABLE BUO +A024 YI SYLLABLE BUOP +A025 YI SYLLABLE BOT +A026 YI SYLLABLE BOX +A027 YI SYLLABLE BO +A028 YI SYLLABLE BOP +A029 YI SYLLABLE BEX +A02A YI SYLLABLE BE +A02B YI SYLLABLE BEP +A02C YI SYLLABLE BUT +A02D YI SYLLABLE BUX +A02E YI SYLLABLE BU +A02F YI SYLLABLE BUP +A030 YI SYLLABLE BURX +A031 YI SYLLABLE BUR +A032 YI SYLLABLE BYT +A033 YI SYLLABLE BYX +A034 YI SYLLABLE BY +A035 YI SYLLABLE BYP +A036 YI SYLLABLE BYRX +A037 YI SYLLABLE BYR +A038 YI SYLLABLE PIT +A039 YI SYLLABLE PIX +A03A YI SYLLABLE PI +A03B YI SYLLABLE PIP +A03C YI SYLLABLE PIEX +A03D YI SYLLABLE PIE +A03E YI SYLLABLE PIEP +A03F YI SYLLABLE PAT +A040 YI SYLLABLE PAX +A041 YI SYLLABLE PA +A042 YI SYLLABLE PAP +A043 YI SYLLABLE PUOX +A044 YI SYLLABLE PUO +A045 YI SYLLABLE PUOP +A046 YI SYLLABLE POT +A047 YI SYLLABLE POX +A048 YI SYLLABLE PO +A049 YI SYLLABLE POP +A04A YI SYLLABLE PUT +A04B YI SYLLABLE PUX +A04C YI SYLLABLE PU +A04D YI SYLLABLE PUP +A04E YI SYLLABLE PURX +A04F YI SYLLABLE PUR +A050 YI SYLLABLE PYT +A051 YI SYLLABLE PYX +A052 YI SYLLABLE PY +A053 YI SYLLABLE PYP +A054 YI SYLLABLE PYRX +A055 YI SYLLABLE PYR +A056 YI SYLLABLE BBIT +A057 YI SYLLABLE BBIX +A058 YI SYLLABLE BBI +A059 YI SYLLABLE BBIP +A05A YI SYLLABLE BBIET +A05B YI SYLLABLE BBIEX +A05C YI SYLLABLE BBIE +A05D YI SYLLABLE BBIEP +A05E YI SYLLABLE BBAT +A05F YI SYLLABLE BBAX +A060 YI SYLLABLE BBA +A061 YI SYLLABLE BBAP +A062 YI SYLLABLE BBUOX +A063 YI SYLLABLE BBUO +A064 YI SYLLABLE BBUOP +A065 YI SYLLABLE BBOT +A066 YI SYLLABLE BBOX +A067 YI SYLLABLE BBO +A068 YI SYLLABLE BBOP +A069 YI SYLLABLE BBEX +A06A YI SYLLABLE BBE +A06B YI SYLLABLE BBEP +A06C YI SYLLABLE BBUT +A06D YI SYLLABLE BBUX +A06E YI SYLLABLE BBU +A06F YI SYLLABLE BBUP +A070 YI SYLLABLE BBURX +A071 YI SYLLABLE BBUR +A072 YI SYLLABLE BBYT +A073 YI SYLLABLE BBYX +A074 YI SYLLABLE BBY +A075 YI SYLLABLE BBYP +A076 YI SYLLABLE NBIT +A077 YI SYLLABLE NBIX +A078 YI SYLLABLE NBI +A079 YI SYLLABLE NBIP +A07A YI SYLLABLE NBIEX +A07B YI SYLLABLE NBIE +A07C YI SYLLABLE NBIEP +A07D YI SYLLABLE NBAT +A07E YI SYLLABLE NBAX +A07F YI SYLLABLE NBA +A080 YI SYLLABLE NBAP +A081 YI SYLLABLE NBOT +A082 YI SYLLABLE NBOX +A083 YI SYLLABLE NBO +A084 YI SYLLABLE NBOP +A085 YI SYLLABLE NBUT +A086 YI SYLLABLE NBUX +A087 YI SYLLABLE NBU +A088 YI SYLLABLE NBUP +A089 YI SYLLABLE NBURX +A08A YI SYLLABLE NBUR +A08B YI SYLLABLE NBYT +A08C YI SYLLABLE NBYX +A08D YI SYLLABLE NBY +A08E YI SYLLABLE NBYP +A08F YI SYLLABLE NBYRX +A090 YI SYLLABLE NBYR +A091 YI SYLLABLE HMIT +A092 YI SYLLABLE HMIX +A093 YI SYLLABLE HMI +A094 YI SYLLABLE HMIP +A095 YI SYLLABLE HMIEX +A096 YI SYLLABLE HMIE +A097 YI SYLLABLE HMIEP +A098 YI SYLLABLE HMAT +A099 YI SYLLABLE HMAX +A09A YI SYLLABLE HMA +A09B YI SYLLABLE HMAP +A09C YI SYLLABLE HMUOX +A09D YI SYLLABLE HMUO +A09E YI SYLLABLE HMUOP +A09F YI SYLLABLE HMOT +A0A0 YI SYLLABLE HMOX +A0A1 YI SYLLABLE HMO +A0A2 YI SYLLABLE HMOP +A0A3 YI SYLLABLE HMUT +A0A4 YI SYLLABLE HMUX +A0A5 YI SYLLABLE HMU +A0A6 YI SYLLABLE HMUP +A0A7 YI SYLLABLE HMURX +A0A8 YI SYLLABLE HMUR +A0A9 YI SYLLABLE HMYX +A0AA YI SYLLABLE HMY +A0AB YI SYLLABLE HMYP +A0AC YI SYLLABLE HMYRX +A0AD YI SYLLABLE HMYR +A0AE YI SYLLABLE MIT +A0AF YI SYLLABLE MIX +A0B0 YI SYLLABLE MI +A0B1 YI SYLLABLE MIP +A0B2 YI SYLLABLE MIEX +A0B3 YI SYLLABLE MIE +A0B4 YI SYLLABLE MIEP +A0B5 YI SYLLABLE MAT +A0B6 YI SYLLABLE MAX +A0B7 YI SYLLABLE MA +A0B8 YI SYLLABLE MAP +A0B9 YI SYLLABLE MUOT +A0BA YI SYLLABLE MUOX +A0BB YI SYLLABLE MUO +A0BC YI SYLLABLE MUOP +A0BD YI SYLLABLE MOT +A0BE YI SYLLABLE MOX +A0BF YI SYLLABLE MO +A0C0 YI SYLLABLE MOP +A0C1 YI SYLLABLE MEX +A0C2 YI SYLLABLE ME +A0C3 YI SYLLABLE MUT +A0C4 YI SYLLABLE MUX +A0C5 YI SYLLABLE MU +A0C6 YI SYLLABLE MUP +A0C7 YI SYLLABLE MURX +A0C8 YI SYLLABLE MUR +A0C9 YI SYLLABLE MYT +A0CA YI SYLLABLE MYX +A0CB YI SYLLABLE MY +A0CC YI SYLLABLE MYP +A0CD YI SYLLABLE FIT +A0CE YI SYLLABLE FIX +A0CF YI SYLLABLE FI +A0D0 YI SYLLABLE FIP +A0D1 YI SYLLABLE FAT +A0D2 YI SYLLABLE FAX +A0D3 YI SYLLABLE FA +A0D4 YI SYLLABLE FAP +A0D5 YI SYLLABLE FOX +A0D6 YI SYLLABLE FO +A0D7 YI SYLLABLE FOP +A0D8 YI SYLLABLE FUT +A0D9 YI SYLLABLE FUX +A0DA YI SYLLABLE FU +A0DB YI SYLLABLE FUP +A0DC YI SYLLABLE FURX +A0DD YI SYLLABLE FUR +A0DE YI SYLLABLE FYT +A0DF YI SYLLABLE FYX +A0E0 YI SYLLABLE FY +A0E1 YI SYLLABLE FYP +A0E2 YI SYLLABLE VIT +A0E3 YI SYLLABLE VIX +A0E4 YI SYLLABLE VI +A0E5 YI SYLLABLE VIP +A0E6 YI SYLLABLE VIET +A0E7 YI SYLLABLE VIEX +A0E8 YI SYLLABLE VIE +A0E9 YI SYLLABLE VIEP +A0EA YI SYLLABLE VAT +A0EB YI SYLLABLE VAX +A0EC YI SYLLABLE VA +A0ED YI SYLLABLE VAP +A0EE YI SYLLABLE VOT +A0EF YI SYLLABLE VOX +A0F0 YI SYLLABLE VO +A0F1 YI SYLLABLE VOP +A0F2 YI SYLLABLE VEX +A0F3 YI SYLLABLE VEP +A0F4 YI SYLLABLE VUT +A0F5 YI SYLLABLE VUX +A0F6 YI SYLLABLE VU +A0F7 YI SYLLABLE VUP +A0F8 YI SYLLABLE VURX +A0F9 YI SYLLABLE VUR +A0FA YI SYLLABLE VYT +A0FB YI SYLLABLE VYX +A0FC YI SYLLABLE VY +A0FD YI SYLLABLE VYP +A0FE YI SYLLABLE VYRX +A0FF YI SYLLABLE VYR +A100 YI SYLLABLE DIT +A101 YI SYLLABLE DIX +A102 YI SYLLABLE DI +A103 YI SYLLABLE DIP +A104 YI SYLLABLE DIEX +A105 YI SYLLABLE DIE +A106 YI SYLLABLE DIEP +A107 YI SYLLABLE DAT +A108 YI SYLLABLE DAX +A109 YI SYLLABLE DA +A10A YI SYLLABLE DAP +A10B YI SYLLABLE DUOX +A10C YI SYLLABLE DUO +A10D YI SYLLABLE DOT +A10E YI SYLLABLE DOX +A10F YI SYLLABLE DO +A110 YI SYLLABLE DOP +A111 YI SYLLABLE DEX +A112 YI SYLLABLE DE +A113 YI SYLLABLE DEP +A114 YI SYLLABLE DUT +A115 YI SYLLABLE DUX +A116 YI SYLLABLE DU +A117 YI SYLLABLE DUP +A118 YI SYLLABLE DURX +A119 YI SYLLABLE DUR +A11A YI SYLLABLE TIT +A11B YI SYLLABLE TIX +A11C YI SYLLABLE TI +A11D YI SYLLABLE TIP +A11E YI SYLLABLE TIEX +A11F YI SYLLABLE TIE +A120 YI SYLLABLE TIEP +A121 YI SYLLABLE TAT +A122 YI SYLLABLE TAX +A123 YI SYLLABLE TA +A124 YI SYLLABLE TAP +A125 YI SYLLABLE TUOT +A126 YI SYLLABLE TUOX +A127 YI SYLLABLE TUO +A128 YI SYLLABLE TUOP +A129 YI SYLLABLE TOT +A12A YI SYLLABLE TOX +A12B YI SYLLABLE TO +A12C YI SYLLABLE TOP +A12D YI SYLLABLE TEX +A12E YI SYLLABLE TE +A12F YI SYLLABLE TEP +A130 YI SYLLABLE TUT +A131 YI SYLLABLE TUX +A132 YI SYLLABLE TU +A133 YI SYLLABLE TUP +A134 YI SYLLABLE TURX +A135 YI SYLLABLE TUR +A136 YI SYLLABLE DDIT +A137 YI SYLLABLE DDIX +A138 YI SYLLABLE DDI +A139 YI SYLLABLE DDIP +A13A YI SYLLABLE DDIEX +A13B YI SYLLABLE DDIE +A13C YI SYLLABLE DDIEP +A13D YI SYLLABLE DDAT +A13E YI SYLLABLE DDAX +A13F YI SYLLABLE DDA +A140 YI SYLLABLE DDAP +A141 YI SYLLABLE DDUOX +A142 YI SYLLABLE DDUO +A143 YI SYLLABLE DDUOP +A144 YI SYLLABLE DDOT +A145 YI SYLLABLE DDOX +A146 YI SYLLABLE DDO +A147 YI SYLLABLE DDOP +A148 YI SYLLABLE DDEX +A149 YI SYLLABLE DDE +A14A YI SYLLABLE DDEP +A14B YI SYLLABLE DDUT +A14C YI SYLLABLE DDUX +A14D YI SYLLABLE DDU +A14E YI SYLLABLE DDUP +A14F YI SYLLABLE DDURX +A150 YI SYLLABLE DDUR +A151 YI SYLLABLE NDIT +A152 YI SYLLABLE NDIX +A153 YI SYLLABLE NDI +A154 YI SYLLABLE NDIP +A155 YI SYLLABLE NDIEX +A156 YI SYLLABLE NDIE +A157 YI SYLLABLE NDAT +A158 YI SYLLABLE NDAX +A159 YI SYLLABLE NDA +A15A YI SYLLABLE NDAP +A15B YI SYLLABLE NDOT +A15C YI SYLLABLE NDOX +A15D YI SYLLABLE NDO +A15E YI SYLLABLE NDOP +A15F YI SYLLABLE NDEX +A160 YI SYLLABLE NDE +A161 YI SYLLABLE NDEP +A162 YI SYLLABLE NDUT +A163 YI SYLLABLE NDUX +A164 YI SYLLABLE NDU +A165 YI SYLLABLE NDUP +A166 YI SYLLABLE NDURX +A167 YI SYLLABLE NDUR +A168 YI SYLLABLE HNIT +A169 YI SYLLABLE HNIX +A16A YI SYLLABLE HNI +A16B YI SYLLABLE HNIP +A16C YI SYLLABLE HNIET +A16D YI SYLLABLE HNIEX +A16E YI SYLLABLE HNIE +A16F YI SYLLABLE HNIEP +A170 YI SYLLABLE HNAT +A171 YI SYLLABLE HNAX +A172 YI SYLLABLE HNA +A173 YI SYLLABLE HNAP +A174 YI SYLLABLE HNUOX +A175 YI SYLLABLE HNUO +A176 YI SYLLABLE HNOT +A177 YI SYLLABLE HNOX +A178 YI SYLLABLE HNOP +A179 YI SYLLABLE HNEX +A17A YI SYLLABLE HNE +A17B YI SYLLABLE HNEP +A17C YI SYLLABLE HNUT +A17D YI SYLLABLE NIT +A17E YI SYLLABLE NIX +A17F YI SYLLABLE NI +A180 YI SYLLABLE NIP +A181 YI SYLLABLE NIEX +A182 YI SYLLABLE NIE +A183 YI SYLLABLE NIEP +A184 YI SYLLABLE NAX +A185 YI SYLLABLE NA +A186 YI SYLLABLE NAP +A187 YI SYLLABLE NUOX +A188 YI SYLLABLE NUO +A189 YI SYLLABLE NUOP +A18A YI SYLLABLE NOT +A18B YI SYLLABLE NOX +A18C YI SYLLABLE NO +A18D YI SYLLABLE NOP +A18E YI SYLLABLE NEX +A18F YI SYLLABLE NE +A190 YI SYLLABLE NEP +A191 YI SYLLABLE NUT +A192 YI SYLLABLE NUX +A193 YI SYLLABLE NU +A194 YI SYLLABLE NUP +A195 YI SYLLABLE NURX +A196 YI SYLLABLE NUR +A197 YI SYLLABLE HLIT +A198 YI SYLLABLE HLIX +A199 YI SYLLABLE HLI +A19A YI SYLLABLE HLIP +A19B YI SYLLABLE HLIEX +A19C YI SYLLABLE HLIE +A19D YI SYLLABLE HLIEP +A19E YI SYLLABLE HLAT +A19F YI SYLLABLE HLAX +A1A0 YI SYLLABLE HLA +A1A1 YI SYLLABLE HLAP +A1A2 YI SYLLABLE HLUOX +A1A3 YI SYLLABLE HLUO +A1A4 YI SYLLABLE HLUOP +A1A5 YI SYLLABLE HLOX +A1A6 YI SYLLABLE HLO +A1A7 YI SYLLABLE HLOP +A1A8 YI SYLLABLE HLEX +A1A9 YI SYLLABLE HLE +A1AA YI SYLLABLE HLEP +A1AB YI SYLLABLE HLUT +A1AC YI SYLLABLE HLUX +A1AD YI SYLLABLE HLU +A1AE YI SYLLABLE HLUP +A1AF YI SYLLABLE HLURX +A1B0 YI SYLLABLE HLUR +A1B1 YI SYLLABLE HLYT +A1B2 YI SYLLABLE HLYX +A1B3 YI SYLLABLE HLY +A1B4 YI SYLLABLE HLYP +A1B5 YI SYLLABLE HLYRX +A1B6 YI SYLLABLE HLYR +A1B7 YI SYLLABLE LIT +A1B8 YI SYLLABLE LIX +A1B9 YI SYLLABLE LI +A1BA YI SYLLABLE LIP +A1BB YI SYLLABLE LIET +A1BC YI SYLLABLE LIEX +A1BD YI SYLLABLE LIE +A1BE YI SYLLABLE LIEP +A1BF YI SYLLABLE LAT +A1C0 YI SYLLABLE LAX +A1C1 YI SYLLABLE LA +A1C2 YI SYLLABLE LAP +A1C3 YI SYLLABLE LUOT +A1C4 YI SYLLABLE LUOX +A1C5 YI SYLLABLE LUO +A1C6 YI SYLLABLE LUOP +A1C7 YI SYLLABLE LOT +A1C8 YI SYLLABLE LOX +A1C9 YI SYLLABLE LO +A1CA YI SYLLABLE LOP +A1CB YI SYLLABLE LEX +A1CC YI SYLLABLE LE +A1CD YI SYLLABLE LEP +A1CE YI SYLLABLE LUT +A1CF YI SYLLABLE LUX +A1D0 YI SYLLABLE LU +A1D1 YI SYLLABLE LUP +A1D2 YI SYLLABLE LURX +A1D3 YI SYLLABLE LUR +A1D4 YI SYLLABLE LYT +A1D5 YI SYLLABLE LYX +A1D6 YI SYLLABLE LY +A1D7 YI SYLLABLE LYP +A1D8 YI SYLLABLE LYRX +A1D9 YI SYLLABLE LYR +A1DA YI SYLLABLE GIT +A1DB YI SYLLABLE GIX +A1DC YI SYLLABLE GI +A1DD YI SYLLABLE GIP +A1DE YI SYLLABLE GIET +A1DF YI SYLLABLE GIEX +A1E0 YI SYLLABLE GIE +A1E1 YI SYLLABLE GIEP +A1E2 YI SYLLABLE GAT +A1E3 YI SYLLABLE GAX +A1E4 YI SYLLABLE GA +A1E5 YI SYLLABLE GAP +A1E6 YI SYLLABLE GUOT +A1E7 YI SYLLABLE GUOX +A1E8 YI SYLLABLE GUO +A1E9 YI SYLLABLE GUOP +A1EA YI SYLLABLE GOT +A1EB YI SYLLABLE GOX +A1EC YI SYLLABLE GO +A1ED YI SYLLABLE GOP +A1EE YI SYLLABLE GET +A1EF YI SYLLABLE GEX +A1F0 YI SYLLABLE GE +A1F1 YI SYLLABLE GEP +A1F2 YI SYLLABLE GUT +A1F3 YI SYLLABLE GUX +A1F4 YI SYLLABLE GU +A1F5 YI SYLLABLE GUP +A1F6 YI SYLLABLE GURX +A1F7 YI SYLLABLE GUR +A1F8 YI SYLLABLE KIT +A1F9 YI SYLLABLE KIX +A1FA YI SYLLABLE KI +A1FB YI SYLLABLE KIP +A1FC YI SYLLABLE KIEX +A1FD YI SYLLABLE KIE +A1FE YI SYLLABLE KIEP +A1FF YI SYLLABLE KAT +A200 YI SYLLABLE KAX +A201 YI SYLLABLE KA +A202 YI SYLLABLE KAP +A203 YI SYLLABLE KUOX +A204 YI SYLLABLE KUO +A205 YI SYLLABLE KUOP +A206 YI SYLLABLE KOT +A207 YI SYLLABLE KOX +A208 YI SYLLABLE KO +A209 YI SYLLABLE KOP +A20A YI SYLLABLE KET +A20B YI SYLLABLE KEX +A20C YI SYLLABLE KE +A20D YI SYLLABLE KEP +A20E YI SYLLABLE KUT +A20F YI SYLLABLE KUX +A210 YI SYLLABLE KU +A211 YI SYLLABLE KUP +A212 YI SYLLABLE KURX +A213 YI SYLLABLE KUR +A214 YI SYLLABLE GGIT +A215 YI SYLLABLE GGIX +A216 YI SYLLABLE GGI +A217 YI SYLLABLE GGIEX +A218 YI SYLLABLE GGIE +A219 YI SYLLABLE GGIEP +A21A YI SYLLABLE GGAT +A21B YI SYLLABLE GGAX +A21C YI SYLLABLE GGA +A21D YI SYLLABLE GGAP +A21E YI SYLLABLE GGUOT +A21F YI SYLLABLE GGUOX +A220 YI SYLLABLE GGUO +A221 YI SYLLABLE GGUOP +A222 YI SYLLABLE GGOT +A223 YI SYLLABLE GGOX +A224 YI SYLLABLE GGO +A225 YI SYLLABLE GGOP +A226 YI SYLLABLE GGET +A227 YI SYLLABLE GGEX +A228 YI SYLLABLE GGE +A229 YI SYLLABLE GGEP +A22A YI SYLLABLE GGUT +A22B YI SYLLABLE GGUX +A22C YI SYLLABLE GGU +A22D YI SYLLABLE GGUP +A22E YI SYLLABLE GGURX +A22F YI SYLLABLE GGUR +A230 YI SYLLABLE MGIEX +A231 YI SYLLABLE MGIE +A232 YI SYLLABLE MGAT +A233 YI SYLLABLE MGAX +A234 YI SYLLABLE MGA +A235 YI SYLLABLE MGAP +A236 YI SYLLABLE MGUOX +A237 YI SYLLABLE MGUO +A238 YI SYLLABLE MGUOP +A239 YI SYLLABLE MGOT +A23A YI SYLLABLE MGOX +A23B YI SYLLABLE MGO +A23C YI SYLLABLE MGOP +A23D YI SYLLABLE MGEX +A23E YI SYLLABLE MGE +A23F YI SYLLABLE MGEP +A240 YI SYLLABLE MGUT +A241 YI SYLLABLE MGUX +A242 YI SYLLABLE MGU +A243 YI SYLLABLE MGUP +A244 YI SYLLABLE MGURX +A245 YI SYLLABLE MGUR +A246 YI SYLLABLE HXIT +A247 YI SYLLABLE HXIX +A248 YI SYLLABLE HXI +A249 YI SYLLABLE HXIP +A24A YI SYLLABLE HXIET +A24B YI SYLLABLE HXIEX +A24C YI SYLLABLE HXIE +A24D YI SYLLABLE HXIEP +A24E YI SYLLABLE HXAT +A24F YI SYLLABLE HXAX +A250 YI SYLLABLE HXA +A251 YI SYLLABLE HXAP +A252 YI SYLLABLE HXUOT +A253 YI SYLLABLE HXUOX +A254 YI SYLLABLE HXUO +A255 YI SYLLABLE HXUOP +A256 YI SYLLABLE HXOT +A257 YI SYLLABLE HXOX +A258 YI SYLLABLE HXO +A259 YI SYLLABLE HXOP +A25A YI SYLLABLE HXEX +A25B YI SYLLABLE HXE +A25C YI SYLLABLE HXEP +A25D YI SYLLABLE NGIEX +A25E YI SYLLABLE NGIE +A25F YI SYLLABLE NGIEP +A260 YI SYLLABLE NGAT +A261 YI SYLLABLE NGAX +A262 YI SYLLABLE NGA +A263 YI SYLLABLE NGAP +A264 YI SYLLABLE NGUOT +A265 YI SYLLABLE NGUOX +A266 YI SYLLABLE NGUO +A267 YI SYLLABLE NGOT +A268 YI SYLLABLE NGOX +A269 YI SYLLABLE NGO +A26A YI SYLLABLE NGOP +A26B YI SYLLABLE NGEX +A26C YI SYLLABLE NGE +A26D YI SYLLABLE NGEP +A26E YI SYLLABLE HIT +A26F YI SYLLABLE HIEX +A270 YI SYLLABLE HIE +A271 YI SYLLABLE HAT +A272 YI SYLLABLE HAX +A273 YI SYLLABLE HA +A274 YI SYLLABLE HAP +A275 YI SYLLABLE HUOT +A276 YI SYLLABLE HUOX +A277 YI SYLLABLE HUO +A278 YI SYLLABLE HUOP +A279 YI SYLLABLE HOT +A27A YI SYLLABLE HOX +A27B YI SYLLABLE HO +A27C YI SYLLABLE HOP +A27D YI SYLLABLE HEX +A27E YI SYLLABLE HE +A27F YI SYLLABLE HEP +A280 YI SYLLABLE WAT +A281 YI SYLLABLE WAX +A282 YI SYLLABLE WA +A283 YI SYLLABLE WAP +A284 YI SYLLABLE WUOX +A285 YI SYLLABLE WUO +A286 YI SYLLABLE WUOP +A287 YI SYLLABLE WOX +A288 YI SYLLABLE WO +A289 YI SYLLABLE WOP +A28A YI SYLLABLE WEX +A28B YI SYLLABLE WE +A28C YI SYLLABLE WEP +A28D YI SYLLABLE ZIT +A28E YI SYLLABLE ZIX +A28F YI SYLLABLE ZI +A290 YI SYLLABLE ZIP +A291 YI SYLLABLE ZIEX +A292 YI SYLLABLE ZIE +A293 YI SYLLABLE ZIEP +A294 YI SYLLABLE ZAT +A295 YI SYLLABLE ZAX +A296 YI SYLLABLE ZA +A297 YI SYLLABLE ZAP +A298 YI SYLLABLE ZUOX +A299 YI SYLLABLE ZUO +A29A YI SYLLABLE ZUOP +A29B YI SYLLABLE ZOT +A29C YI SYLLABLE ZOX +A29D YI SYLLABLE ZO +A29E YI SYLLABLE ZOP +A29F YI SYLLABLE ZEX +A2A0 YI SYLLABLE ZE +A2A1 YI SYLLABLE ZEP +A2A2 YI SYLLABLE ZUT +A2A3 YI SYLLABLE ZUX +A2A4 YI SYLLABLE ZU +A2A5 YI SYLLABLE ZUP +A2A6 YI SYLLABLE ZURX +A2A7 YI SYLLABLE ZUR +A2A8 YI SYLLABLE ZYT +A2A9 YI SYLLABLE ZYX +A2AA YI SYLLABLE ZY +A2AB YI SYLLABLE ZYP +A2AC YI SYLLABLE ZYRX +A2AD YI SYLLABLE ZYR +A2AE YI SYLLABLE CIT +A2AF YI SYLLABLE CIX +A2B0 YI SYLLABLE CI +A2B1 YI SYLLABLE CIP +A2B2 YI SYLLABLE CIET +A2B3 YI SYLLABLE CIEX +A2B4 YI SYLLABLE CIE +A2B5 YI SYLLABLE CIEP +A2B6 YI SYLLABLE CAT +A2B7 YI SYLLABLE CAX +A2B8 YI SYLLABLE CA +A2B9 YI SYLLABLE CAP +A2BA YI SYLLABLE CUOX +A2BB YI SYLLABLE CUO +A2BC YI SYLLABLE CUOP +A2BD YI SYLLABLE COT +A2BE YI SYLLABLE COX +A2BF YI SYLLABLE CO +A2C0 YI SYLLABLE COP +A2C1 YI SYLLABLE CEX +A2C2 YI SYLLABLE CE +A2C3 YI SYLLABLE CEP +A2C4 YI SYLLABLE CUT +A2C5 YI SYLLABLE CUX +A2C6 YI SYLLABLE CU +A2C7 YI SYLLABLE CUP +A2C8 YI SYLLABLE CURX +A2C9 YI SYLLABLE CUR +A2CA YI SYLLABLE CYT +A2CB YI SYLLABLE CYX +A2CC YI SYLLABLE CY +A2CD YI SYLLABLE CYP +A2CE YI SYLLABLE CYRX +A2CF YI SYLLABLE CYR +A2D0 YI SYLLABLE ZZIT +A2D1 YI SYLLABLE ZZIX +A2D2 YI SYLLABLE ZZI +A2D3 YI SYLLABLE ZZIP +A2D4 YI SYLLABLE ZZIET +A2D5 YI SYLLABLE ZZIEX +A2D6 YI SYLLABLE ZZIE +A2D7 YI SYLLABLE ZZIEP +A2D8 YI SYLLABLE ZZAT +A2D9 YI SYLLABLE ZZAX +A2DA YI SYLLABLE ZZA +A2DB YI SYLLABLE ZZAP +A2DC YI SYLLABLE ZZOX +A2DD YI SYLLABLE ZZO +A2DE YI SYLLABLE ZZOP +A2DF YI SYLLABLE ZZEX +A2E0 YI SYLLABLE ZZE +A2E1 YI SYLLABLE ZZEP +A2E2 YI SYLLABLE ZZUX +A2E3 YI SYLLABLE ZZU +A2E4 YI SYLLABLE ZZUP +A2E5 YI SYLLABLE ZZURX +A2E6 YI SYLLABLE ZZUR +A2E7 YI SYLLABLE ZZYT +A2E8 YI SYLLABLE ZZYX +A2E9 YI SYLLABLE ZZY +A2EA YI SYLLABLE ZZYP +A2EB YI SYLLABLE ZZYRX +A2EC YI SYLLABLE ZZYR +A2ED YI SYLLABLE NZIT +A2EE YI SYLLABLE NZIX +A2EF YI SYLLABLE NZI +A2F0 YI SYLLABLE NZIP +A2F1 YI SYLLABLE NZIEX +A2F2 YI SYLLABLE NZIE +A2F3 YI SYLLABLE NZIEP +A2F4 YI SYLLABLE NZAT +A2F5 YI SYLLABLE NZAX +A2F6 YI SYLLABLE NZA +A2F7 YI SYLLABLE NZAP +A2F8 YI SYLLABLE NZUOX +A2F9 YI SYLLABLE NZUO +A2FA YI SYLLABLE NZOX +A2FB YI SYLLABLE NZOP +A2FC YI SYLLABLE NZEX +A2FD YI SYLLABLE NZE +A2FE YI SYLLABLE NZUX +A2FF YI SYLLABLE NZU +A300 YI SYLLABLE NZUP +A301 YI SYLLABLE NZURX +A302 YI SYLLABLE NZUR +A303 YI SYLLABLE NZYT +A304 YI SYLLABLE NZYX +A305 YI SYLLABLE NZY +A306 YI SYLLABLE NZYP +A307 YI SYLLABLE NZYRX +A308 YI SYLLABLE NZYR +A309 YI SYLLABLE SIT +A30A YI SYLLABLE SIX +A30B YI SYLLABLE SI +A30C YI SYLLABLE SIP +A30D YI SYLLABLE SIEX +A30E YI SYLLABLE SIE +A30F YI SYLLABLE SIEP +A310 YI SYLLABLE SAT +A311 YI SYLLABLE SAX +A312 YI SYLLABLE SA +A313 YI SYLLABLE SAP +A314 YI SYLLABLE SUOX +A315 YI SYLLABLE SUO +A316 YI SYLLABLE SUOP +A317 YI SYLLABLE SOT +A318 YI SYLLABLE SOX +A319 YI SYLLABLE SO +A31A YI SYLLABLE SOP +A31B YI SYLLABLE SEX +A31C YI SYLLABLE SE +A31D YI SYLLABLE SEP +A31E YI SYLLABLE SUT +A31F YI SYLLABLE SUX +A320 YI SYLLABLE SU +A321 YI SYLLABLE SUP +A322 YI SYLLABLE SURX +A323 YI SYLLABLE SUR +A324 YI SYLLABLE SYT +A325 YI SYLLABLE SYX +A326 YI SYLLABLE SY +A327 YI SYLLABLE SYP +A328 YI SYLLABLE SYRX +A329 YI SYLLABLE SYR +A32A YI SYLLABLE SSIT +A32B YI SYLLABLE SSIX +A32C YI SYLLABLE SSI +A32D YI SYLLABLE SSIP +A32E YI SYLLABLE SSIEX +A32F YI SYLLABLE SSIE +A330 YI SYLLABLE SSIEP +A331 YI SYLLABLE SSAT +A332 YI SYLLABLE SSAX +A333 YI SYLLABLE SSA +A334 YI SYLLABLE SSAP +A335 YI SYLLABLE SSOT +A336 YI SYLLABLE SSOX +A337 YI SYLLABLE SSO +A338 YI SYLLABLE SSOP +A339 YI SYLLABLE SSEX +A33A YI SYLLABLE SSE +A33B YI SYLLABLE SSEP +A33C YI SYLLABLE SSUT +A33D YI SYLLABLE SSUX +A33E YI SYLLABLE SSU +A33F YI SYLLABLE SSUP +A340 YI SYLLABLE SSYT +A341 YI SYLLABLE SSYX +A342 YI SYLLABLE SSY +A343 YI SYLLABLE SSYP +A344 YI SYLLABLE SSYRX +A345 YI SYLLABLE SSYR +A346 YI SYLLABLE ZHAT +A347 YI SYLLABLE ZHAX +A348 YI SYLLABLE ZHA +A349 YI SYLLABLE ZHAP +A34A YI SYLLABLE ZHUOX +A34B YI SYLLABLE ZHUO +A34C YI SYLLABLE ZHUOP +A34D YI SYLLABLE ZHOT +A34E YI SYLLABLE ZHOX +A34F YI SYLLABLE ZHO +A350 YI SYLLABLE ZHOP +A351 YI SYLLABLE ZHET +A352 YI SYLLABLE ZHEX +A353 YI SYLLABLE ZHE +A354 YI SYLLABLE ZHEP +A355 YI SYLLABLE ZHUT +A356 YI SYLLABLE ZHUX +A357 YI SYLLABLE ZHU +A358 YI SYLLABLE ZHUP +A359 YI SYLLABLE ZHURX +A35A YI SYLLABLE ZHUR +A35B YI SYLLABLE ZHYT +A35C YI SYLLABLE ZHYX +A35D YI SYLLABLE ZHY +A35E YI SYLLABLE ZHYP +A35F YI SYLLABLE ZHYRX +A360 YI SYLLABLE ZHYR +A361 YI SYLLABLE CHAT +A362 YI SYLLABLE CHAX +A363 YI SYLLABLE CHA +A364 YI SYLLABLE CHAP +A365 YI SYLLABLE CHUOT +A366 YI SYLLABLE CHUOX +A367 YI SYLLABLE CHUO +A368 YI SYLLABLE CHUOP +A369 YI SYLLABLE CHOT +A36A YI SYLLABLE CHOX +A36B YI SYLLABLE CHO +A36C YI SYLLABLE CHOP +A36D YI SYLLABLE CHET +A36E YI SYLLABLE CHEX +A36F YI SYLLABLE CHE +A370 YI SYLLABLE CHEP +A371 YI SYLLABLE CHUX +A372 YI SYLLABLE CHU +A373 YI SYLLABLE CHUP +A374 YI SYLLABLE CHURX +A375 YI SYLLABLE CHUR +A376 YI SYLLABLE CHYT +A377 YI SYLLABLE CHYX +A378 YI SYLLABLE CHY +A379 YI SYLLABLE CHYP +A37A YI SYLLABLE CHYRX +A37B YI SYLLABLE CHYR +A37C YI SYLLABLE RRAX +A37D YI SYLLABLE RRA +A37E YI SYLLABLE RRUOX +A37F YI SYLLABLE RRUO +A380 YI SYLLABLE RROT +A381 YI SYLLABLE RROX +A382 YI SYLLABLE RRO +A383 YI SYLLABLE RROP +A384 YI SYLLABLE RRET +A385 YI SYLLABLE RREX +A386 YI SYLLABLE RRE +A387 YI SYLLABLE RREP +A388 YI SYLLABLE RRUT +A389 YI SYLLABLE RRUX +A38A YI SYLLABLE RRU +A38B YI SYLLABLE RRUP +A38C YI SYLLABLE RRURX +A38D YI SYLLABLE RRUR +A38E YI SYLLABLE RRYT +A38F YI SYLLABLE RRYX +A390 YI SYLLABLE RRY +A391 YI SYLLABLE RRYP +A392 YI SYLLABLE RRYRX +A393 YI SYLLABLE RRYR +A394 YI SYLLABLE NRAT +A395 YI SYLLABLE NRAX +A396 YI SYLLABLE NRA +A397 YI SYLLABLE NRAP +A398 YI SYLLABLE NROX +A399 YI SYLLABLE NRO +A39A YI SYLLABLE NROP +A39B YI SYLLABLE NRET +A39C YI SYLLABLE NREX +A39D YI SYLLABLE NRE +A39E YI SYLLABLE NREP +A39F YI SYLLABLE NRUT +A3A0 YI SYLLABLE NRUX +A3A1 YI SYLLABLE NRU +A3A2 YI SYLLABLE NRUP +A3A3 YI SYLLABLE NRURX +A3A4 YI SYLLABLE NRUR +A3A5 YI SYLLABLE NRYT +A3A6 YI SYLLABLE NRYX +A3A7 YI SYLLABLE NRY +A3A8 YI SYLLABLE NRYP +A3A9 YI SYLLABLE NRYRX +A3AA YI SYLLABLE NRYR +A3AB YI SYLLABLE SHAT +A3AC YI SYLLABLE SHAX +A3AD YI SYLLABLE SHA +A3AE YI SYLLABLE SHAP +A3AF YI SYLLABLE SHUOX +A3B0 YI SYLLABLE SHUO +A3B1 YI SYLLABLE SHUOP +A3B2 YI SYLLABLE SHOT +A3B3 YI SYLLABLE SHOX +A3B4 YI SYLLABLE SHO +A3B5 YI SYLLABLE SHOP +A3B6 YI SYLLABLE SHET +A3B7 YI SYLLABLE SHEX +A3B8 YI SYLLABLE SHE +A3B9 YI SYLLABLE SHEP +A3BA YI SYLLABLE SHUT +A3BB YI SYLLABLE SHUX +A3BC YI SYLLABLE SHU +A3BD YI SYLLABLE SHUP +A3BE YI SYLLABLE SHURX +A3BF YI SYLLABLE SHUR +A3C0 YI SYLLABLE SHYT +A3C1 YI SYLLABLE SHYX +A3C2 YI SYLLABLE SHY +A3C3 YI SYLLABLE SHYP +A3C4 YI SYLLABLE SHYRX +A3C5 YI SYLLABLE SHYR +A3C6 YI SYLLABLE RAT +A3C7 YI SYLLABLE RAX +A3C8 YI SYLLABLE RA +A3C9 YI SYLLABLE RAP +A3CA YI SYLLABLE RUOX +A3CB YI SYLLABLE RUO +A3CC YI SYLLABLE RUOP +A3CD YI SYLLABLE ROT +A3CE YI SYLLABLE ROX +A3CF YI SYLLABLE RO +A3D0 YI SYLLABLE ROP +A3D1 YI SYLLABLE REX +A3D2 YI SYLLABLE RE +A3D3 YI SYLLABLE REP +A3D4 YI SYLLABLE RUT +A3D5 YI SYLLABLE RUX +A3D6 YI SYLLABLE RU +A3D7 YI SYLLABLE RUP +A3D8 YI SYLLABLE RURX +A3D9 YI SYLLABLE RUR +A3DA YI SYLLABLE RYT +A3DB YI SYLLABLE RYX +A3DC YI SYLLABLE RY +A3DD YI SYLLABLE RYP +A3DE YI SYLLABLE RYRX +A3DF YI SYLLABLE RYR +A3E0 YI SYLLABLE JIT +A3E1 YI SYLLABLE JIX +A3E2 YI SYLLABLE JI +A3E3 YI SYLLABLE JIP +A3E4 YI SYLLABLE JIET +A3E5 YI SYLLABLE JIEX +A3E6 YI SYLLABLE JIE +A3E7 YI SYLLABLE JIEP +A3E8 YI SYLLABLE JUOT +A3E9 YI SYLLABLE JUOX +A3EA YI SYLLABLE JUO +A3EB YI SYLLABLE JUOP +A3EC YI SYLLABLE JOT +A3ED YI SYLLABLE JOX +A3EE YI SYLLABLE JO +A3EF YI SYLLABLE JOP +A3F0 YI SYLLABLE JUT +A3F1 YI SYLLABLE JUX +A3F2 YI SYLLABLE JU +A3F3 YI SYLLABLE JUP +A3F4 YI SYLLABLE JURX +A3F5 YI SYLLABLE JUR +A3F6 YI SYLLABLE JYT +A3F7 YI SYLLABLE JYX +A3F8 YI SYLLABLE JY +A3F9 YI SYLLABLE JYP +A3FA YI SYLLABLE JYRX +A3FB YI SYLLABLE JYR +A3FC YI SYLLABLE QIT +A3FD YI SYLLABLE QIX +A3FE YI SYLLABLE QI +A3FF YI SYLLABLE QIP +A400 YI SYLLABLE QIET +A401 YI SYLLABLE QIEX +A402 YI SYLLABLE QIE +A403 YI SYLLABLE QIEP +A404 YI SYLLABLE QUOT +A405 YI SYLLABLE QUOX +A406 YI SYLLABLE QUO +A407 YI SYLLABLE QUOP +A408 YI SYLLABLE QOT +A409 YI SYLLABLE QOX +A40A YI SYLLABLE QO +A40B YI SYLLABLE QOP +A40C YI SYLLABLE QUT +A40D YI SYLLABLE QUX +A40E YI SYLLABLE QU +A40F YI SYLLABLE QUP +A410 YI SYLLABLE QURX +A411 YI SYLLABLE QUR +A412 YI SYLLABLE QYT +A413 YI SYLLABLE QYX +A414 YI SYLLABLE QY +A415 YI SYLLABLE QYP +A416 YI SYLLABLE QYRX +A417 YI SYLLABLE QYR +A418 YI SYLLABLE JJIT +A419 YI SYLLABLE JJIX +A41A YI SYLLABLE JJI +A41B YI SYLLABLE JJIP +A41C YI SYLLABLE JJIET +A41D YI SYLLABLE JJIEX +A41E YI SYLLABLE JJIE +A41F YI SYLLABLE JJIEP +A420 YI SYLLABLE JJUOX +A421 YI SYLLABLE JJUO +A422 YI SYLLABLE JJUOP +A423 YI SYLLABLE JJOT +A424 YI SYLLABLE JJOX +A425 YI SYLLABLE JJO +A426 YI SYLLABLE JJOP +A427 YI SYLLABLE JJUT +A428 YI SYLLABLE JJUX +A429 YI SYLLABLE JJU +A42A YI SYLLABLE JJUP +A42B YI SYLLABLE JJURX +A42C YI SYLLABLE JJUR +A42D YI SYLLABLE JJYT +A42E YI SYLLABLE JJYX +A42F YI SYLLABLE JJY +A430 YI SYLLABLE JJYP +A431 YI SYLLABLE NJIT +A432 YI SYLLABLE NJIX +A433 YI SYLLABLE NJI +A434 YI SYLLABLE NJIP +A435 YI SYLLABLE NJIET +A436 YI SYLLABLE NJIEX +A437 YI SYLLABLE NJIE +A438 YI SYLLABLE NJIEP +A439 YI SYLLABLE NJUOX +A43A YI SYLLABLE NJUO +A43B YI SYLLABLE NJOT +A43C YI SYLLABLE NJOX +A43D YI SYLLABLE NJO +A43E YI SYLLABLE NJOP +A43F YI SYLLABLE NJUX +A440 YI SYLLABLE NJU +A441 YI SYLLABLE NJUP +A442 YI SYLLABLE NJURX +A443 YI SYLLABLE NJUR +A444 YI SYLLABLE NJYT +A445 YI SYLLABLE NJYX +A446 YI SYLLABLE NJY +A447 YI SYLLABLE NJYP +A448 YI SYLLABLE NJYRX +A449 YI SYLLABLE NJYR +A44A YI SYLLABLE NYIT +A44B YI SYLLABLE NYIX +A44C YI SYLLABLE NYI +A44D YI SYLLABLE NYIP +A44E YI SYLLABLE NYIET +A44F YI SYLLABLE NYIEX +A450 YI SYLLABLE NYIE +A451 YI SYLLABLE NYIEP +A452 YI SYLLABLE NYUOX +A453 YI SYLLABLE NYUO +A454 YI SYLLABLE NYUOP +A455 YI SYLLABLE NYOT +A456 YI SYLLABLE NYOX +A457 YI SYLLABLE NYO +A458 YI SYLLABLE NYOP +A459 YI SYLLABLE NYUT +A45A YI SYLLABLE NYUX +A45B YI SYLLABLE NYU +A45C YI SYLLABLE NYUP +A45D YI SYLLABLE XIT +A45E YI SYLLABLE XIX +A45F YI SYLLABLE XI +A460 YI SYLLABLE XIP +A461 YI SYLLABLE XIET +A462 YI SYLLABLE XIEX +A463 YI SYLLABLE XIE +A464 YI SYLLABLE XIEP +A465 YI SYLLABLE XUOX +A466 YI SYLLABLE XUO +A467 YI SYLLABLE XOT +A468 YI SYLLABLE XOX +A469 YI SYLLABLE XO +A46A YI SYLLABLE XOP +A46B YI SYLLABLE XYT +A46C YI SYLLABLE XYX +A46D YI SYLLABLE XY +A46E YI SYLLABLE XYP +A46F YI SYLLABLE XYRX +A470 YI SYLLABLE XYR +A471 YI SYLLABLE YIT +A472 YI SYLLABLE YIX +A473 YI SYLLABLE YI +A474 YI SYLLABLE YIP +A475 YI SYLLABLE YIET +A476 YI SYLLABLE YIEX +A477 YI SYLLABLE YIE +A478 YI SYLLABLE YIEP +A479 YI SYLLABLE YUOT +A47A YI SYLLABLE YUOX +A47B YI SYLLABLE YUO +A47C YI SYLLABLE YUOP +A47D YI SYLLABLE YOT +A47E YI SYLLABLE YOX +A47F YI SYLLABLE YO +A480 YI SYLLABLE YOP +A481 YI SYLLABLE YUT +A482 YI SYLLABLE YUX +A483 YI SYLLABLE YU +A484 YI SYLLABLE YUP +A485 YI SYLLABLE YURX +A486 YI SYLLABLE YUR +A487 YI SYLLABLE YYT +A488 YI SYLLABLE YYX +A489 YI SYLLABLE YY +A48A YI SYLLABLE YYP +A48B YI SYLLABLE YYRX +A48C YI SYLLABLE YYR +A490 YI RADICAL QOT +A491 YI RADICAL LI +A492 YI RADICAL KIT +A493 YI RADICAL NYIP +A494 YI RADICAL CYP +A495 YI RADICAL SSI +A496 YI RADICAL GGOP +A497 YI RADICAL GEP +A498 YI RADICAL MI +A499 YI RADICAL HXIT +A49A YI RADICAL LYR +A49B YI RADICAL BBUT +A49C YI RADICAL MOP +A49D YI RADICAL YO +A49E YI RADICAL PUT +A49F YI RADICAL HXUO +A4A0 YI RADICAL TAT +A4A1 YI RADICAL GA +A4A2 YI RADICAL ZUP +A4A3 YI RADICAL CYT +A4A4 YI RADICAL DDUR +A4A5 YI RADICAL BUR +A4A6 YI RADICAL GGUO +A4A7 YI RADICAL NYOP +A4A8 YI RADICAL TU +A4A9 YI RADICAL OP +A4AA YI RADICAL JJUT +A4AB YI RADICAL ZOT +A4AC YI RADICAL PYT +A4AD YI RADICAL HMO +A4AE YI RADICAL YIT +A4AF YI RADICAL VUR +A4B0 YI RADICAL SHY +A4B1 YI RADICAL VEP +A4B2 YI RADICAL ZA +A4B3 YI RADICAL JO +A4B4 YI RADICAL NZUP +A4B5 YI RADICAL JJY +A4B6 YI RADICAL GOT +A4B7 YI RADICAL JJIE +A4B8 YI RADICAL WO +A4B9 YI RADICAL DU +A4BA YI RADICAL SHUR +A4BB YI RADICAL LIE +A4BC YI RADICAL CY +A4BD YI RADICAL CUOP +A4BE YI RADICAL CIP +A4BF YI RADICAL HXOP +A4C0 YI RADICAL SHAT +A4C1 YI RADICAL ZUR +A4C2 YI RADICAL SHOP +A4C3 YI RADICAL CHE +A4C4 YI RADICAL ZZIET +A4C5 YI RADICAL NBIE +A4C6 YI RADICAL KE +A700 MODIFIER LETTER CHINESE TONE YIN PING +A701 MODIFIER LETTER CHINESE TONE YANG PING +A702 MODIFIER LETTER CHINESE TONE YIN SHANG +A703 MODIFIER LETTER CHINESE TONE YANG SHANG +A704 MODIFIER LETTER CHINESE TONE YIN QU +A705 MODIFIER LETTER CHINESE TONE YANG QU +A706 MODIFIER LETTER CHINESE TONE YIN RU +A707 MODIFIER LETTER CHINESE TONE YANG RU +A708 MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR +A709 MODIFIER LETTER HIGH DOTTED TONE BAR +A70A MODIFIER LETTER MID DOTTED TONE BAR +A70B MODIFIER LETTER LOW DOTTED TONE BAR +A70C MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR +A70D MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR +A70E MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR +A70F MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR +A710 MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR +A711 MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR +A712 MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR +A713 MODIFIER LETTER HIGH LEFT-STEM TONE BAR +A714 MODIFIER LETTER MID LEFT-STEM TONE BAR +A715 MODIFIER LETTER LOW LEFT-STEM TONE BAR +A716 MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A800 SYLOTI NAGRI LETTER A +A801 SYLOTI NAGRI LETTER I +A802 SYLOTI NAGRI SIGN DVISVARA +A803 SYLOTI NAGRI LETTER U +A804 SYLOTI NAGRI LETTER E +A805 SYLOTI NAGRI LETTER O +A806 SYLOTI NAGRI SIGN HASANTA +A807 SYLOTI NAGRI LETTER KO +A808 SYLOTI NAGRI LETTER KHO +A809 SYLOTI NAGRI LETTER GO +A80A SYLOTI NAGRI LETTER GHO +A80B SYLOTI NAGRI SIGN ANUSVARA +A80C SYLOTI NAGRI LETTER CO +A80D SYLOTI NAGRI LETTER CHO +A80E SYLOTI NAGRI LETTER JO +A80F SYLOTI NAGRI LETTER JHO +A810 SYLOTI NAGRI LETTER TTO +A811 SYLOTI NAGRI LETTER TTHO +A812 SYLOTI NAGRI LETTER DDO +A813 SYLOTI NAGRI LETTER DDHO +A814 SYLOTI NAGRI LETTER TO +A815 SYLOTI NAGRI LETTER THO +A816 SYLOTI NAGRI LETTER DO +A817 SYLOTI NAGRI LETTER DHO +A818 SYLOTI NAGRI LETTER NO +A819 SYLOTI NAGRI LETTER PO +A81A SYLOTI NAGRI LETTER PHO +A81B SYLOTI NAGRI LETTER BO +A81C SYLOTI NAGRI LETTER BHO +A81D SYLOTI NAGRI LETTER MO +A81E SYLOTI NAGRI LETTER RO +A81F SYLOTI NAGRI LETTER LO +A820 SYLOTI NAGRI LETTER RRO +A821 SYLOTI NAGRI LETTER SO +A822 SYLOTI NAGRI LETTER HO +A823 SYLOTI NAGRI VOWEL SIGN A +A824 SYLOTI NAGRI VOWEL SIGN I +A825 SYLOTI NAGRI VOWEL SIGN U +A826 SYLOTI NAGRI VOWEL SIGN E +A827 SYLOTI NAGRI VOWEL SIGN OO +A828 SYLOTI NAGRI POETRY MARK-1 +A829 SYLOTI NAGRI POETRY MARK-2 +A82A SYLOTI NAGRI POETRY MARK-3 +A82B SYLOTI NAGRI POETRY MARK-4 +AC00 D7A3 Hangul Syllable +D800 DB7F Non Private Use High Surrogate +DB80 DBFF Private Use High Surrogate +DC00 DFFF Low Surrogate +E000 F8FF Private Use +F900 CJK COMPATIBILITY IDEOGRAPH-F900 +F901 CJK COMPATIBILITY IDEOGRAPH-F901 +F902 CJK COMPATIBILITY IDEOGRAPH-F902 +F903 CJK COMPATIBILITY IDEOGRAPH-F903 +F904 CJK COMPATIBILITY IDEOGRAPH-F904 +F905 CJK COMPATIBILITY IDEOGRAPH-F905 +F906 CJK COMPATIBILITY IDEOGRAPH-F906 +F907 CJK COMPATIBILITY IDEOGRAPH-F907 +F908 CJK COMPATIBILITY IDEOGRAPH-F908 +F909 CJK COMPATIBILITY IDEOGRAPH-F909 +F90A CJK COMPATIBILITY IDEOGRAPH-F90A +F90B CJK COMPATIBILITY IDEOGRAPH-F90B +F90C CJK COMPATIBILITY IDEOGRAPH-F90C +F90D CJK COMPATIBILITY IDEOGRAPH-F90D +F90E CJK COMPATIBILITY IDEOGRAPH-F90E +F90F CJK COMPATIBILITY IDEOGRAPH-F90F +F910 CJK COMPATIBILITY IDEOGRAPH-F910 +F911 CJK COMPATIBILITY IDEOGRAPH-F911 +F912 CJK COMPATIBILITY IDEOGRAPH-F912 +F913 CJK COMPATIBILITY IDEOGRAPH-F913 +F914 CJK COMPATIBILITY IDEOGRAPH-F914 +F915 CJK COMPATIBILITY IDEOGRAPH-F915 +F916 CJK COMPATIBILITY IDEOGRAPH-F916 +F917 CJK COMPATIBILITY IDEOGRAPH-F917 +F918 CJK COMPATIBILITY IDEOGRAPH-F918 +F919 CJK COMPATIBILITY IDEOGRAPH-F919 +F91A CJK COMPATIBILITY IDEOGRAPH-F91A +F91B CJK COMPATIBILITY IDEOGRAPH-F91B +F91C CJK COMPATIBILITY IDEOGRAPH-F91C +F91D CJK COMPATIBILITY IDEOGRAPH-F91D +F91E CJK COMPATIBILITY IDEOGRAPH-F91E +F91F CJK COMPATIBILITY IDEOGRAPH-F91F +F920 CJK COMPATIBILITY IDEOGRAPH-F920 +F921 CJK COMPATIBILITY IDEOGRAPH-F921 +F922 CJK COMPATIBILITY IDEOGRAPH-F922 +F923 CJK COMPATIBILITY IDEOGRAPH-F923 +F924 CJK COMPATIBILITY IDEOGRAPH-F924 +F925 CJK COMPATIBILITY IDEOGRAPH-F925 +F926 CJK COMPATIBILITY IDEOGRAPH-F926 +F927 CJK COMPATIBILITY IDEOGRAPH-F927 +F928 CJK COMPATIBILITY IDEOGRAPH-F928 +F929 CJK COMPATIBILITY IDEOGRAPH-F929 +F92A CJK COMPATIBILITY IDEOGRAPH-F92A +F92B CJK COMPATIBILITY IDEOGRAPH-F92B +F92C CJK COMPATIBILITY IDEOGRAPH-F92C +F92D CJK COMPATIBILITY IDEOGRAPH-F92D +F92E CJK COMPATIBILITY IDEOGRAPH-F92E +F92F CJK COMPATIBILITY IDEOGRAPH-F92F +F930 CJK COMPATIBILITY IDEOGRAPH-F930 +F931 CJK COMPATIBILITY IDEOGRAPH-F931 +F932 CJK COMPATIBILITY IDEOGRAPH-F932 +F933 CJK COMPATIBILITY IDEOGRAPH-F933 +F934 CJK COMPATIBILITY IDEOGRAPH-F934 +F935 CJK COMPATIBILITY IDEOGRAPH-F935 +F936 CJK COMPATIBILITY IDEOGRAPH-F936 +F937 CJK COMPATIBILITY IDEOGRAPH-F937 +F938 CJK COMPATIBILITY IDEOGRAPH-F938 +F939 CJK COMPATIBILITY IDEOGRAPH-F939 +F93A CJK COMPATIBILITY IDEOGRAPH-F93A +F93B CJK COMPATIBILITY IDEOGRAPH-F93B +F93C CJK COMPATIBILITY IDEOGRAPH-F93C +F93D CJK COMPATIBILITY IDEOGRAPH-F93D +F93E CJK COMPATIBILITY IDEOGRAPH-F93E +F93F CJK COMPATIBILITY IDEOGRAPH-F93F +F940 CJK COMPATIBILITY IDEOGRAPH-F940 +F941 CJK COMPATIBILITY IDEOGRAPH-F941 +F942 CJK COMPATIBILITY IDEOGRAPH-F942 +F943 CJK COMPATIBILITY IDEOGRAPH-F943 +F944 CJK COMPATIBILITY IDEOGRAPH-F944 +F945 CJK COMPATIBILITY IDEOGRAPH-F945 +F946 CJK COMPATIBILITY IDEOGRAPH-F946 +F947 CJK COMPATIBILITY IDEOGRAPH-F947 +F948 CJK COMPATIBILITY IDEOGRAPH-F948 +F949 CJK COMPATIBILITY IDEOGRAPH-F949 +F94A CJK COMPATIBILITY IDEOGRAPH-F94A +F94B CJK COMPATIBILITY IDEOGRAPH-F94B +F94C CJK COMPATIBILITY IDEOGRAPH-F94C +F94D CJK COMPATIBILITY IDEOGRAPH-F94D +F94E CJK COMPATIBILITY IDEOGRAPH-F94E +F94F CJK COMPATIBILITY IDEOGRAPH-F94F +F950 CJK COMPATIBILITY IDEOGRAPH-F950 +F951 CJK COMPATIBILITY IDEOGRAPH-F951 +F952 CJK COMPATIBILITY IDEOGRAPH-F952 +F953 CJK COMPATIBILITY IDEOGRAPH-F953 +F954 CJK COMPATIBILITY IDEOGRAPH-F954 +F955 CJK COMPATIBILITY IDEOGRAPH-F955 +F956 CJK COMPATIBILITY IDEOGRAPH-F956 +F957 CJK COMPATIBILITY IDEOGRAPH-F957 +F958 CJK COMPATIBILITY IDEOGRAPH-F958 +F959 CJK COMPATIBILITY IDEOGRAPH-F959 +F95A CJK COMPATIBILITY IDEOGRAPH-F95A +F95B CJK COMPATIBILITY IDEOGRAPH-F95B +F95C CJK COMPATIBILITY IDEOGRAPH-F95C +F95D CJK COMPATIBILITY IDEOGRAPH-F95D +F95E CJK COMPATIBILITY IDEOGRAPH-F95E +F95F CJK COMPATIBILITY IDEOGRAPH-F95F +F960 CJK COMPATIBILITY IDEOGRAPH-F960 +F961 CJK COMPATIBILITY IDEOGRAPH-F961 +F962 CJK COMPATIBILITY IDEOGRAPH-F962 +F963 CJK COMPATIBILITY IDEOGRAPH-F963 +F964 CJK COMPATIBILITY IDEOGRAPH-F964 +F965 CJK COMPATIBILITY IDEOGRAPH-F965 +F966 CJK COMPATIBILITY IDEOGRAPH-F966 +F967 CJK COMPATIBILITY IDEOGRAPH-F967 +F968 CJK COMPATIBILITY IDEOGRAPH-F968 +F969 CJK COMPATIBILITY IDEOGRAPH-F969 +F96A CJK COMPATIBILITY IDEOGRAPH-F96A +F96B CJK COMPATIBILITY IDEOGRAPH-F96B +F96C CJK COMPATIBILITY IDEOGRAPH-F96C +F96D CJK COMPATIBILITY IDEOGRAPH-F96D +F96E CJK COMPATIBILITY IDEOGRAPH-F96E +F96F CJK COMPATIBILITY IDEOGRAPH-F96F +F970 CJK COMPATIBILITY IDEOGRAPH-F970 +F971 CJK COMPATIBILITY IDEOGRAPH-F971 +F972 CJK COMPATIBILITY IDEOGRAPH-F972 +F973 CJK COMPATIBILITY IDEOGRAPH-F973 +F974 CJK COMPATIBILITY IDEOGRAPH-F974 +F975 CJK COMPATIBILITY IDEOGRAPH-F975 +F976 CJK COMPATIBILITY IDEOGRAPH-F976 +F977 CJK COMPATIBILITY IDEOGRAPH-F977 +F978 CJK COMPATIBILITY IDEOGRAPH-F978 +F979 CJK COMPATIBILITY IDEOGRAPH-F979 +F97A CJK COMPATIBILITY IDEOGRAPH-F97A +F97B CJK COMPATIBILITY IDEOGRAPH-F97B +F97C CJK COMPATIBILITY IDEOGRAPH-F97C +F97D CJK COMPATIBILITY IDEOGRAPH-F97D +F97E CJK COMPATIBILITY IDEOGRAPH-F97E +F97F CJK COMPATIBILITY IDEOGRAPH-F97F +F980 CJK COMPATIBILITY IDEOGRAPH-F980 +F981 CJK COMPATIBILITY IDEOGRAPH-F981 +F982 CJK COMPATIBILITY IDEOGRAPH-F982 +F983 CJK COMPATIBILITY IDEOGRAPH-F983 +F984 CJK COMPATIBILITY IDEOGRAPH-F984 +F985 CJK COMPATIBILITY IDEOGRAPH-F985 +F986 CJK COMPATIBILITY IDEOGRAPH-F986 +F987 CJK COMPATIBILITY IDEOGRAPH-F987 +F988 CJK COMPATIBILITY IDEOGRAPH-F988 +F989 CJK COMPATIBILITY IDEOGRAPH-F989 +F98A CJK COMPATIBILITY IDEOGRAPH-F98A +F98B CJK COMPATIBILITY IDEOGRAPH-F98B +F98C CJK COMPATIBILITY IDEOGRAPH-F98C +F98D CJK COMPATIBILITY IDEOGRAPH-F98D +F98E CJK COMPATIBILITY IDEOGRAPH-F98E +F98F CJK COMPATIBILITY IDEOGRAPH-F98F +F990 CJK COMPATIBILITY IDEOGRAPH-F990 +F991 CJK COMPATIBILITY IDEOGRAPH-F991 +F992 CJK COMPATIBILITY IDEOGRAPH-F992 +F993 CJK COMPATIBILITY IDEOGRAPH-F993 +F994 CJK COMPATIBILITY IDEOGRAPH-F994 +F995 CJK COMPATIBILITY IDEOGRAPH-F995 +F996 CJK COMPATIBILITY IDEOGRAPH-F996 +F997 CJK COMPATIBILITY IDEOGRAPH-F997 +F998 CJK COMPATIBILITY IDEOGRAPH-F998 +F999 CJK COMPATIBILITY IDEOGRAPH-F999 +F99A CJK COMPATIBILITY IDEOGRAPH-F99A +F99B CJK COMPATIBILITY IDEOGRAPH-F99B +F99C CJK COMPATIBILITY IDEOGRAPH-F99C +F99D CJK COMPATIBILITY IDEOGRAPH-F99D +F99E CJK COMPATIBILITY IDEOGRAPH-F99E +F99F CJK COMPATIBILITY IDEOGRAPH-F99F +F9A0 CJK COMPATIBILITY IDEOGRAPH-F9A0 +F9A1 CJK COMPATIBILITY IDEOGRAPH-F9A1 +F9A2 CJK COMPATIBILITY IDEOGRAPH-F9A2 +F9A3 CJK COMPATIBILITY IDEOGRAPH-F9A3 +F9A4 CJK COMPATIBILITY IDEOGRAPH-F9A4 +F9A5 CJK COMPATIBILITY IDEOGRAPH-F9A5 +F9A6 CJK COMPATIBILITY IDEOGRAPH-F9A6 +F9A7 CJK COMPATIBILITY IDEOGRAPH-F9A7 +F9A8 CJK COMPATIBILITY IDEOGRAPH-F9A8 +F9A9 CJK COMPATIBILITY IDEOGRAPH-F9A9 +F9AA CJK COMPATIBILITY IDEOGRAPH-F9AA +F9AB CJK COMPATIBILITY IDEOGRAPH-F9AB +F9AC CJK COMPATIBILITY IDEOGRAPH-F9AC +F9AD CJK COMPATIBILITY IDEOGRAPH-F9AD +F9AE CJK COMPATIBILITY IDEOGRAPH-F9AE +F9AF CJK COMPATIBILITY IDEOGRAPH-F9AF +F9B0 CJK COMPATIBILITY IDEOGRAPH-F9B0 +F9B1 CJK COMPATIBILITY IDEOGRAPH-F9B1 +F9B2 CJK COMPATIBILITY IDEOGRAPH-F9B2 +F9B3 CJK COMPATIBILITY IDEOGRAPH-F9B3 +F9B4 CJK COMPATIBILITY IDEOGRAPH-F9B4 +F9B5 CJK COMPATIBILITY IDEOGRAPH-F9B5 +F9B6 CJK COMPATIBILITY IDEOGRAPH-F9B6 +F9B7 CJK COMPATIBILITY IDEOGRAPH-F9B7 +F9B8 CJK COMPATIBILITY IDEOGRAPH-F9B8 +F9B9 CJK COMPATIBILITY IDEOGRAPH-F9B9 +F9BA CJK COMPATIBILITY IDEOGRAPH-F9BA +F9BB CJK COMPATIBILITY IDEOGRAPH-F9BB +F9BC CJK COMPATIBILITY IDEOGRAPH-F9BC +F9BD CJK COMPATIBILITY IDEOGRAPH-F9BD +F9BE CJK COMPATIBILITY IDEOGRAPH-F9BE +F9BF CJK COMPATIBILITY IDEOGRAPH-F9BF +F9C0 CJK COMPATIBILITY IDEOGRAPH-F9C0 +F9C1 CJK COMPATIBILITY IDEOGRAPH-F9C1 +F9C2 CJK COMPATIBILITY IDEOGRAPH-F9C2 +F9C3 CJK COMPATIBILITY IDEOGRAPH-F9C3 +F9C4 CJK COMPATIBILITY IDEOGRAPH-F9C4 +F9C5 CJK COMPATIBILITY IDEOGRAPH-F9C5 +F9C6 CJK COMPATIBILITY IDEOGRAPH-F9C6 +F9C7 CJK COMPATIBILITY IDEOGRAPH-F9C7 +F9C8 CJK COMPATIBILITY IDEOGRAPH-F9C8 +F9C9 CJK COMPATIBILITY IDEOGRAPH-F9C9 +F9CA CJK COMPATIBILITY IDEOGRAPH-F9CA +F9CB CJK COMPATIBILITY IDEOGRAPH-F9CB +F9CC CJK COMPATIBILITY IDEOGRAPH-F9CC +F9CD CJK COMPATIBILITY IDEOGRAPH-F9CD +F9CE CJK COMPATIBILITY IDEOGRAPH-F9CE +F9CF CJK COMPATIBILITY IDEOGRAPH-F9CF +F9D0 CJK COMPATIBILITY IDEOGRAPH-F9D0 +F9D1 CJK COMPATIBILITY IDEOGRAPH-F9D1 +F9D2 CJK COMPATIBILITY IDEOGRAPH-F9D2 +F9D3 CJK COMPATIBILITY IDEOGRAPH-F9D3 +F9D4 CJK COMPATIBILITY IDEOGRAPH-F9D4 +F9D5 CJK COMPATIBILITY IDEOGRAPH-F9D5 +F9D6 CJK COMPATIBILITY IDEOGRAPH-F9D6 +F9D7 CJK COMPATIBILITY IDEOGRAPH-F9D7 +F9D8 CJK COMPATIBILITY IDEOGRAPH-F9D8 +F9D9 CJK COMPATIBILITY IDEOGRAPH-F9D9 +F9DA CJK COMPATIBILITY IDEOGRAPH-F9DA +F9DB CJK COMPATIBILITY IDEOGRAPH-F9DB +F9DC CJK COMPATIBILITY IDEOGRAPH-F9DC +F9DD CJK COMPATIBILITY IDEOGRAPH-F9DD +F9DE CJK COMPATIBILITY IDEOGRAPH-F9DE +F9DF CJK COMPATIBILITY IDEOGRAPH-F9DF +F9E0 CJK COMPATIBILITY IDEOGRAPH-F9E0 +F9E1 CJK COMPATIBILITY IDEOGRAPH-F9E1 +F9E2 CJK COMPATIBILITY IDEOGRAPH-F9E2 +F9E3 CJK COMPATIBILITY IDEOGRAPH-F9E3 +F9E4 CJK COMPATIBILITY IDEOGRAPH-F9E4 +F9E5 CJK COMPATIBILITY IDEOGRAPH-F9E5 +F9E6 CJK COMPATIBILITY IDEOGRAPH-F9E6 +F9E7 CJK COMPATIBILITY IDEOGRAPH-F9E7 +F9E8 CJK COMPATIBILITY IDEOGRAPH-F9E8 +F9E9 CJK COMPATIBILITY IDEOGRAPH-F9E9 +F9EA CJK COMPATIBILITY IDEOGRAPH-F9EA +F9EB CJK COMPATIBILITY IDEOGRAPH-F9EB +F9EC CJK COMPATIBILITY IDEOGRAPH-F9EC +F9ED CJK COMPATIBILITY IDEOGRAPH-F9ED +F9EE CJK COMPATIBILITY IDEOGRAPH-F9EE +F9EF CJK COMPATIBILITY IDEOGRAPH-F9EF +F9F0 CJK COMPATIBILITY IDEOGRAPH-F9F0 +F9F1 CJK COMPATIBILITY IDEOGRAPH-F9F1 +F9F2 CJK COMPATIBILITY IDEOGRAPH-F9F2 +F9F3 CJK COMPATIBILITY IDEOGRAPH-F9F3 +F9F4 CJK COMPATIBILITY IDEOGRAPH-F9F4 +F9F5 CJK COMPATIBILITY IDEOGRAPH-F9F5 +F9F6 CJK COMPATIBILITY IDEOGRAPH-F9F6 +F9F7 CJK COMPATIBILITY IDEOGRAPH-F9F7 +F9F8 CJK COMPATIBILITY IDEOGRAPH-F9F8 +F9F9 CJK COMPATIBILITY IDEOGRAPH-F9F9 +F9FA CJK COMPATIBILITY IDEOGRAPH-F9FA +F9FB CJK COMPATIBILITY IDEOGRAPH-F9FB +F9FC CJK COMPATIBILITY IDEOGRAPH-F9FC +F9FD CJK COMPATIBILITY IDEOGRAPH-F9FD +F9FE CJK COMPATIBILITY IDEOGRAPH-F9FE +F9FF CJK COMPATIBILITY IDEOGRAPH-F9FF +FA00 CJK COMPATIBILITY IDEOGRAPH-FA00 +FA01 CJK COMPATIBILITY IDEOGRAPH-FA01 +FA02 CJK COMPATIBILITY IDEOGRAPH-FA02 +FA03 CJK COMPATIBILITY IDEOGRAPH-FA03 +FA04 CJK COMPATIBILITY IDEOGRAPH-FA04 +FA05 CJK COMPATIBILITY IDEOGRAPH-FA05 +FA06 CJK COMPATIBILITY IDEOGRAPH-FA06 +FA07 CJK COMPATIBILITY IDEOGRAPH-FA07 +FA08 CJK COMPATIBILITY IDEOGRAPH-FA08 +FA09 CJK COMPATIBILITY IDEOGRAPH-FA09 +FA0A CJK COMPATIBILITY IDEOGRAPH-FA0A +FA0B CJK COMPATIBILITY IDEOGRAPH-FA0B +FA0C CJK COMPATIBILITY IDEOGRAPH-FA0C +FA0D CJK COMPATIBILITY IDEOGRAPH-FA0D +FA0E CJK COMPATIBILITY IDEOGRAPH-FA0E +FA0F CJK COMPATIBILITY IDEOGRAPH-FA0F +FA10 CJK COMPATIBILITY IDEOGRAPH-FA10 +FA11 CJK COMPATIBILITY IDEOGRAPH-FA11 +FA12 CJK COMPATIBILITY IDEOGRAPH-FA12 +FA13 CJK COMPATIBILITY IDEOGRAPH-FA13 +FA14 CJK COMPATIBILITY IDEOGRAPH-FA14 +FA15 CJK COMPATIBILITY IDEOGRAPH-FA15 +FA16 CJK COMPATIBILITY IDEOGRAPH-FA16 +FA17 CJK COMPATIBILITY IDEOGRAPH-FA17 +FA18 CJK COMPATIBILITY IDEOGRAPH-FA18 +FA19 CJK COMPATIBILITY IDEOGRAPH-FA19 +FA1A CJK COMPATIBILITY IDEOGRAPH-FA1A +FA1B CJK COMPATIBILITY IDEOGRAPH-FA1B +FA1C CJK COMPATIBILITY IDEOGRAPH-FA1C +FA1D CJK COMPATIBILITY IDEOGRAPH-FA1D +FA1E CJK COMPATIBILITY IDEOGRAPH-FA1E +FA1F CJK COMPATIBILITY IDEOGRAPH-FA1F +FA20 CJK COMPATIBILITY IDEOGRAPH-FA20 +FA21 CJK COMPATIBILITY IDEOGRAPH-FA21 +FA22 CJK COMPATIBILITY IDEOGRAPH-FA22 +FA23 CJK COMPATIBILITY IDEOGRAPH-FA23 +FA24 CJK COMPATIBILITY IDEOGRAPH-FA24 +FA25 CJK COMPATIBILITY IDEOGRAPH-FA25 +FA26 CJK COMPATIBILITY IDEOGRAPH-FA26 +FA27 CJK COMPATIBILITY IDEOGRAPH-FA27 +FA28 CJK COMPATIBILITY IDEOGRAPH-FA28 +FA29 CJK COMPATIBILITY IDEOGRAPH-FA29 +FA2A CJK COMPATIBILITY IDEOGRAPH-FA2A +FA2B CJK COMPATIBILITY IDEOGRAPH-FA2B +FA2C CJK COMPATIBILITY IDEOGRAPH-FA2C +FA2D CJK COMPATIBILITY IDEOGRAPH-FA2D +FA30 CJK COMPATIBILITY IDEOGRAPH-FA30 +FA31 CJK COMPATIBILITY IDEOGRAPH-FA31 +FA32 CJK COMPATIBILITY IDEOGRAPH-FA32 +FA33 CJK COMPATIBILITY IDEOGRAPH-FA33 +FA34 CJK COMPATIBILITY IDEOGRAPH-FA34 +FA35 CJK COMPATIBILITY IDEOGRAPH-FA35 +FA36 CJK COMPATIBILITY IDEOGRAPH-FA36 +FA37 CJK COMPATIBILITY IDEOGRAPH-FA37 +FA38 CJK COMPATIBILITY IDEOGRAPH-FA38 +FA39 CJK COMPATIBILITY IDEOGRAPH-FA39 +FA3A CJK COMPATIBILITY IDEOGRAPH-FA3A +FA3B CJK COMPATIBILITY IDEOGRAPH-FA3B +FA3C CJK COMPATIBILITY IDEOGRAPH-FA3C +FA3D CJK COMPATIBILITY IDEOGRAPH-FA3D +FA3E CJK COMPATIBILITY IDEOGRAPH-FA3E +FA3F CJK COMPATIBILITY IDEOGRAPH-FA3F +FA40 CJK COMPATIBILITY IDEOGRAPH-FA40 +FA41 CJK COMPATIBILITY IDEOGRAPH-FA41 +FA42 CJK COMPATIBILITY IDEOGRAPH-FA42 +FA43 CJK COMPATIBILITY IDEOGRAPH-FA43 +FA44 CJK COMPATIBILITY IDEOGRAPH-FA44 +FA45 CJK COMPATIBILITY IDEOGRAPH-FA45 +FA46 CJK COMPATIBILITY IDEOGRAPH-FA46 +FA47 CJK COMPATIBILITY IDEOGRAPH-FA47 +FA48 CJK COMPATIBILITY IDEOGRAPH-FA48 +FA49 CJK COMPATIBILITY IDEOGRAPH-FA49 +FA4A CJK COMPATIBILITY IDEOGRAPH-FA4A +FA4B CJK COMPATIBILITY IDEOGRAPH-FA4B +FA4C CJK COMPATIBILITY IDEOGRAPH-FA4C +FA4D CJK COMPATIBILITY IDEOGRAPH-FA4D +FA4E CJK COMPATIBILITY IDEOGRAPH-FA4E +FA4F CJK COMPATIBILITY IDEOGRAPH-FA4F +FA50 CJK COMPATIBILITY IDEOGRAPH-FA50 +FA51 CJK COMPATIBILITY IDEOGRAPH-FA51 +FA52 CJK COMPATIBILITY IDEOGRAPH-FA52 +FA53 CJK COMPATIBILITY IDEOGRAPH-FA53 +FA54 CJK COMPATIBILITY IDEOGRAPH-FA54 +FA55 CJK COMPATIBILITY IDEOGRAPH-FA55 +FA56 CJK COMPATIBILITY IDEOGRAPH-FA56 +FA57 CJK COMPATIBILITY IDEOGRAPH-FA57 +FA58 CJK COMPATIBILITY IDEOGRAPH-FA58 +FA59 CJK COMPATIBILITY IDEOGRAPH-FA59 +FA5A CJK COMPATIBILITY IDEOGRAPH-FA5A +FA5B CJK COMPATIBILITY IDEOGRAPH-FA5B +FA5C CJK COMPATIBILITY IDEOGRAPH-FA5C +FA5D CJK COMPATIBILITY IDEOGRAPH-FA5D +FA5E CJK COMPATIBILITY IDEOGRAPH-FA5E +FA5F CJK COMPATIBILITY IDEOGRAPH-FA5F +FA60 CJK COMPATIBILITY IDEOGRAPH-FA60 +FA61 CJK COMPATIBILITY IDEOGRAPH-FA61 +FA62 CJK COMPATIBILITY IDEOGRAPH-FA62 +FA63 CJK COMPATIBILITY IDEOGRAPH-FA63 +FA64 CJK COMPATIBILITY IDEOGRAPH-FA64 +FA65 CJK COMPATIBILITY IDEOGRAPH-FA65 +FA66 CJK COMPATIBILITY IDEOGRAPH-FA66 +FA67 CJK COMPATIBILITY IDEOGRAPH-FA67 +FA68 CJK COMPATIBILITY IDEOGRAPH-FA68 +FA69 CJK COMPATIBILITY IDEOGRAPH-FA69 +FA6A CJK COMPATIBILITY IDEOGRAPH-FA6A +FA70 CJK COMPATIBILITY IDEOGRAPH-FA70 +FA71 CJK COMPATIBILITY IDEOGRAPH-FA71 +FA72 CJK COMPATIBILITY IDEOGRAPH-FA72 +FA73 CJK COMPATIBILITY IDEOGRAPH-FA73 +FA74 CJK COMPATIBILITY IDEOGRAPH-FA74 +FA75 CJK COMPATIBILITY IDEOGRAPH-FA75 +FA76 CJK COMPATIBILITY IDEOGRAPH-FA76 +FA77 CJK COMPATIBILITY IDEOGRAPH-FA77 +FA78 CJK COMPATIBILITY IDEOGRAPH-FA78 +FA79 CJK COMPATIBILITY IDEOGRAPH-FA79 +FA7A CJK COMPATIBILITY IDEOGRAPH-FA7A +FA7B CJK COMPATIBILITY IDEOGRAPH-FA7B +FA7C CJK COMPATIBILITY IDEOGRAPH-FA7C +FA7D CJK COMPATIBILITY IDEOGRAPH-FA7D +FA7E CJK COMPATIBILITY IDEOGRAPH-FA7E +FA7F CJK COMPATIBILITY IDEOGRAPH-FA7F +FA80 CJK COMPATIBILITY IDEOGRAPH-FA80 +FA81 CJK COMPATIBILITY IDEOGRAPH-FA81 +FA82 CJK COMPATIBILITY IDEOGRAPH-FA82 +FA83 CJK COMPATIBILITY IDEOGRAPH-FA83 +FA84 CJK COMPATIBILITY IDEOGRAPH-FA84 +FA85 CJK COMPATIBILITY IDEOGRAPH-FA85 +FA86 CJK COMPATIBILITY IDEOGRAPH-FA86 +FA87 CJK COMPATIBILITY IDEOGRAPH-FA87 +FA88 CJK COMPATIBILITY IDEOGRAPH-FA88 +FA89 CJK COMPATIBILITY IDEOGRAPH-FA89 +FA8A CJK COMPATIBILITY IDEOGRAPH-FA8A +FA8B CJK COMPATIBILITY IDEOGRAPH-FA8B +FA8C CJK COMPATIBILITY IDEOGRAPH-FA8C +FA8D CJK COMPATIBILITY IDEOGRAPH-FA8D +FA8E CJK COMPATIBILITY IDEOGRAPH-FA8E +FA8F CJK COMPATIBILITY IDEOGRAPH-FA8F +FA90 CJK COMPATIBILITY IDEOGRAPH-FA90 +FA91 CJK COMPATIBILITY IDEOGRAPH-FA91 +FA92 CJK COMPATIBILITY IDEOGRAPH-FA92 +FA93 CJK COMPATIBILITY IDEOGRAPH-FA93 +FA94 CJK COMPATIBILITY IDEOGRAPH-FA94 +FA95 CJK COMPATIBILITY IDEOGRAPH-FA95 +FA96 CJK COMPATIBILITY IDEOGRAPH-FA96 +FA97 CJK COMPATIBILITY IDEOGRAPH-FA97 +FA98 CJK COMPATIBILITY IDEOGRAPH-FA98 +FA99 CJK COMPATIBILITY IDEOGRAPH-FA99 +FA9A CJK COMPATIBILITY IDEOGRAPH-FA9A +FA9B CJK COMPATIBILITY IDEOGRAPH-FA9B +FA9C CJK COMPATIBILITY IDEOGRAPH-FA9C +FA9D CJK COMPATIBILITY IDEOGRAPH-FA9D +FA9E CJK COMPATIBILITY IDEOGRAPH-FA9E +FA9F CJK COMPATIBILITY IDEOGRAPH-FA9F +FAA0 CJK COMPATIBILITY IDEOGRAPH-FAA0 +FAA1 CJK COMPATIBILITY IDEOGRAPH-FAA1 +FAA2 CJK COMPATIBILITY IDEOGRAPH-FAA2 +FAA3 CJK COMPATIBILITY IDEOGRAPH-FAA3 +FAA4 CJK COMPATIBILITY IDEOGRAPH-FAA4 +FAA5 CJK COMPATIBILITY IDEOGRAPH-FAA5 +FAA6 CJK COMPATIBILITY IDEOGRAPH-FAA6 +FAA7 CJK COMPATIBILITY IDEOGRAPH-FAA7 +FAA8 CJK COMPATIBILITY IDEOGRAPH-FAA8 +FAA9 CJK COMPATIBILITY IDEOGRAPH-FAA9 +FAAA CJK COMPATIBILITY IDEOGRAPH-FAAA +FAAB CJK COMPATIBILITY IDEOGRAPH-FAAB +FAAC CJK COMPATIBILITY IDEOGRAPH-FAAC +FAAD CJK COMPATIBILITY IDEOGRAPH-FAAD +FAAE CJK COMPATIBILITY IDEOGRAPH-FAAE +FAAF CJK COMPATIBILITY IDEOGRAPH-FAAF +FAB0 CJK COMPATIBILITY IDEOGRAPH-FAB0 +FAB1 CJK COMPATIBILITY IDEOGRAPH-FAB1 +FAB2 CJK COMPATIBILITY IDEOGRAPH-FAB2 +FAB3 CJK COMPATIBILITY IDEOGRAPH-FAB3 +FAB4 CJK COMPATIBILITY IDEOGRAPH-FAB4 +FAB5 CJK COMPATIBILITY IDEOGRAPH-FAB5 +FAB6 CJK COMPATIBILITY IDEOGRAPH-FAB6 +FAB7 CJK COMPATIBILITY IDEOGRAPH-FAB7 +FAB8 CJK COMPATIBILITY IDEOGRAPH-FAB8 +FAB9 CJK COMPATIBILITY IDEOGRAPH-FAB9 +FABA CJK COMPATIBILITY IDEOGRAPH-FABA +FABB CJK COMPATIBILITY IDEOGRAPH-FABB +FABC CJK COMPATIBILITY IDEOGRAPH-FABC +FABD CJK COMPATIBILITY IDEOGRAPH-FABD +FABE CJK COMPATIBILITY IDEOGRAPH-FABE +FABF CJK COMPATIBILITY IDEOGRAPH-FABF +FAC0 CJK COMPATIBILITY IDEOGRAPH-FAC0 +FAC1 CJK COMPATIBILITY IDEOGRAPH-FAC1 +FAC2 CJK COMPATIBILITY IDEOGRAPH-FAC2 +FAC3 CJK COMPATIBILITY IDEOGRAPH-FAC3 +FAC4 CJK COMPATIBILITY IDEOGRAPH-FAC4 +FAC5 CJK COMPATIBILITY IDEOGRAPH-FAC5 +FAC6 CJK COMPATIBILITY IDEOGRAPH-FAC6 +FAC7 CJK COMPATIBILITY IDEOGRAPH-FAC7 +FAC8 CJK COMPATIBILITY IDEOGRAPH-FAC8 +FAC9 CJK COMPATIBILITY IDEOGRAPH-FAC9 +FACA CJK COMPATIBILITY IDEOGRAPH-FACA +FACB CJK COMPATIBILITY IDEOGRAPH-FACB +FACC CJK COMPATIBILITY IDEOGRAPH-FACC +FACD CJK COMPATIBILITY IDEOGRAPH-FACD +FACE CJK COMPATIBILITY IDEOGRAPH-FACE +FACF CJK COMPATIBILITY IDEOGRAPH-FACF +FAD0 CJK COMPATIBILITY IDEOGRAPH-FAD0 +FAD1 CJK COMPATIBILITY IDEOGRAPH-FAD1 +FAD2 CJK COMPATIBILITY IDEOGRAPH-FAD2 +FAD3 CJK COMPATIBILITY IDEOGRAPH-FAD3 +FAD4 CJK COMPATIBILITY IDEOGRAPH-FAD4 +FAD5 CJK COMPATIBILITY IDEOGRAPH-FAD5 +FAD6 CJK COMPATIBILITY IDEOGRAPH-FAD6 +FAD7 CJK COMPATIBILITY IDEOGRAPH-FAD7 +FAD8 CJK COMPATIBILITY IDEOGRAPH-FAD8 +FAD9 CJK COMPATIBILITY IDEOGRAPH-FAD9 +FB00 LATIN SMALL LIGATURE FF +FB01 LATIN SMALL LIGATURE FI +FB02 LATIN SMALL LIGATURE FL +FB03 LATIN SMALL LIGATURE FFI +FB04 LATIN SMALL LIGATURE FFL +FB05 LATIN SMALL LIGATURE LONG S T +FB06 LATIN SMALL LIGATURE ST +FB13 ARMENIAN SMALL LIGATURE MEN NOW +FB14 ARMENIAN SMALL LIGATURE MEN ECH +FB15 ARMENIAN SMALL LIGATURE MEN INI +FB16 ARMENIAN SMALL LIGATURE VEW NOW +FB17 ARMENIAN SMALL LIGATURE MEN XEH +FB1D HEBREW LETTER YOD WITH HIRIQ +FB1E HEBREW POINT JUDEO-SPANISH VARIKA +FB1F HEBREW LIGATURE YIDDISH YOD YOD PATAH +FB20 HEBREW LETTER ALTERNATIVE AYIN +FB21 HEBREW LETTER WIDE ALEF +FB22 HEBREW LETTER WIDE DALET +FB23 HEBREW LETTER WIDE HE +FB24 HEBREW LETTER WIDE KAF +FB25 HEBREW LETTER WIDE LAMED +FB26 HEBREW LETTER WIDE FINAL MEM +FB27 HEBREW LETTER WIDE RESH +FB28 HEBREW LETTER WIDE TAV +FB29 HEBREW LETTER ALTERNATIVE PLUS SIGN +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 +FB4F HEBREW LIGATURE ALEF LAMED +FB50 ARABIC LETTER ALEF WASLA ISOLATED FORM +FB51 ARABIC LETTER ALEF WASLA FINAL FORM +FB52 ARABIC LETTER BEEH ISOLATED FORM +FB53 ARABIC LETTER BEEH FINAL FORM +FB54 ARABIC LETTER BEEH INITIAL FORM +FB55 ARABIC LETTER BEEH MEDIAL FORM +FB56 ARABIC LETTER PEH ISOLATED FORM +FB57 ARABIC LETTER PEH FINAL FORM +FB58 ARABIC LETTER PEH INITIAL FORM +FB59 ARABIC LETTER PEH MEDIAL FORM +FB5A ARABIC LETTER BEHEH ISOLATED FORM +FB5B ARABIC LETTER BEHEH FINAL FORM +FB5C ARABIC LETTER BEHEH INITIAL FORM +FB5D ARABIC LETTER BEHEH MEDIAL FORM +FB5E ARABIC LETTER TTEHEH ISOLATED FORM +FB5F ARABIC LETTER TTEHEH FINAL FORM +FB60 ARABIC LETTER TTEHEH INITIAL FORM +FB61 ARABIC LETTER TTEHEH MEDIAL FORM +FB62 ARABIC LETTER TEHEH ISOLATED FORM +FB63 ARABIC LETTER TEHEH FINAL FORM +FB64 ARABIC LETTER TEHEH INITIAL FORM +FB65 ARABIC LETTER TEHEH MEDIAL FORM +FB66 ARABIC LETTER TTEH ISOLATED FORM +FB67 ARABIC LETTER TTEH FINAL FORM +FB68 ARABIC LETTER TTEH INITIAL FORM +FB69 ARABIC LETTER TTEH MEDIAL FORM +FB6A ARABIC LETTER VEH ISOLATED FORM +FB6B ARABIC LETTER VEH FINAL FORM +FB6C ARABIC LETTER VEH INITIAL FORM +FB6D ARABIC LETTER VEH MEDIAL FORM +FB6E ARABIC LETTER PEHEH ISOLATED FORM +FB6F ARABIC LETTER PEHEH FINAL FORM +FB70 ARABIC LETTER PEHEH INITIAL FORM +FB71 ARABIC LETTER PEHEH MEDIAL FORM +FB72 ARABIC LETTER DYEH ISOLATED FORM +FB73 ARABIC LETTER DYEH FINAL FORM +FB74 ARABIC LETTER DYEH INITIAL FORM +FB75 ARABIC LETTER DYEH MEDIAL FORM +FB76 ARABIC LETTER NYEH ISOLATED FORM +FB77 ARABIC LETTER NYEH FINAL FORM +FB78 ARABIC LETTER NYEH INITIAL FORM +FB79 ARABIC LETTER NYEH MEDIAL FORM +FB7A ARABIC LETTER TCHEH ISOLATED FORM +FB7B ARABIC LETTER TCHEH FINAL FORM +FB7C ARABIC LETTER TCHEH INITIAL FORM +FB7D ARABIC LETTER TCHEH MEDIAL FORM +FB7E ARABIC LETTER TCHEHEH ISOLATED FORM +FB7F ARABIC LETTER TCHEHEH FINAL FORM +FB80 ARABIC LETTER TCHEHEH INITIAL FORM +FB81 ARABIC LETTER TCHEHEH MEDIAL FORM +FB82 ARABIC LETTER DDAHAL ISOLATED FORM +FB83 ARABIC LETTER DDAHAL FINAL FORM +FB84 ARABIC LETTER DAHAL ISOLATED FORM +FB85 ARABIC LETTER DAHAL FINAL FORM +FB86 ARABIC LETTER DUL ISOLATED FORM +FB87 ARABIC LETTER DUL FINAL FORM +FB88 ARABIC LETTER DDAL ISOLATED FORM +FB89 ARABIC LETTER DDAL FINAL FORM +FB8A ARABIC LETTER JEH ISOLATED FORM +FB8B ARABIC LETTER JEH FINAL FORM +FB8C ARABIC LETTER RREH ISOLATED FORM +FB8D ARABIC LETTER RREH FINAL FORM +FB8E ARABIC LETTER KEHEH ISOLATED FORM +FB8F ARABIC LETTER KEHEH FINAL FORM +FB90 ARABIC LETTER KEHEH INITIAL FORM +FB91 ARABIC LETTER KEHEH MEDIAL FORM +FB92 ARABIC LETTER GAF ISOLATED FORM +FB93 ARABIC LETTER GAF FINAL FORM +FB94 ARABIC LETTER GAF INITIAL FORM +FB95 ARABIC LETTER GAF MEDIAL FORM +FB96 ARABIC LETTER GUEH ISOLATED FORM +FB97 ARABIC LETTER GUEH FINAL FORM +FB98 ARABIC LETTER GUEH INITIAL FORM +FB99 ARABIC LETTER GUEH MEDIAL FORM +FB9A ARABIC LETTER NGOEH ISOLATED FORM +FB9B ARABIC LETTER NGOEH FINAL FORM +FB9C ARABIC LETTER NGOEH INITIAL FORM +FB9D ARABIC LETTER NGOEH MEDIAL FORM +FB9E ARABIC LETTER NOON GHUNNA ISOLATED FORM +FB9F ARABIC LETTER NOON GHUNNA FINAL FORM +FBA0 ARABIC LETTER RNOON ISOLATED FORM +FBA1 ARABIC LETTER RNOON FINAL FORM +FBA2 ARABIC LETTER RNOON INITIAL FORM +FBA3 ARABIC LETTER RNOON MEDIAL FORM +FBA4 ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM +FBA5 ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM +FBA6 ARABIC LETTER HEH GOAL ISOLATED FORM +FBA7 ARABIC LETTER HEH GOAL FINAL FORM +FBA8 ARABIC LETTER HEH GOAL INITIAL FORM +FBA9 ARABIC LETTER HEH GOAL MEDIAL FORM +FBAA ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM +FBAB ARABIC LETTER HEH DOACHASHMEE FINAL FORM +FBAC ARABIC LETTER HEH DOACHASHMEE INITIAL FORM +FBAD ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM +FBAE ARABIC LETTER YEH BARREE ISOLATED FORM +FBAF ARABIC LETTER YEH BARREE FINAL FORM +FBB0 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM +FBB1 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBD3 ARABIC LETTER NG ISOLATED FORM +FBD4 ARABIC LETTER NG FINAL FORM +FBD5 ARABIC LETTER NG INITIAL FORM +FBD6 ARABIC LETTER NG MEDIAL FORM +FBD7 ARABIC LETTER U ISOLATED FORM +FBD8 ARABIC LETTER U FINAL FORM +FBD9 ARABIC LETTER OE ISOLATED FORM +FBDA ARABIC LETTER OE FINAL FORM +FBDB ARABIC LETTER YU ISOLATED FORM +FBDC ARABIC LETTER YU FINAL FORM +FBDD ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM +FBDE ARABIC LETTER VE ISOLATED FORM +FBDF ARABIC LETTER VE FINAL FORM +FBE0 ARABIC LETTER KIRGHIZ OE ISOLATED FORM +FBE1 ARABIC LETTER KIRGHIZ OE FINAL FORM +FBE2 ARABIC LETTER KIRGHIZ YU ISOLATED FORM +FBE3 ARABIC LETTER KIRGHIZ YU FINAL FORM +FBE4 ARABIC LETTER E ISOLATED FORM +FBE5 ARABIC LETTER E FINAL FORM +FBE6 ARABIC LETTER E INITIAL FORM +FBE7 ARABIC LETTER E MEDIAL FORM +FBE8 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM +FBE9 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM +FBEA ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM +FBEB ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM +FBEC ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM +FBED ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM +FBEE ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM +FBEF ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM +FBF0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM +FBF1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM +FBF2 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM +FBF3 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM +FBF4 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM +FBF5 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM +FBF6 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM +FBF7 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM +FBF8 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM +FBF9 ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FBFA ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FBFB ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM +FBFC ARABIC LETTER FARSI YEH ISOLATED FORM +FBFD ARABIC LETTER FARSI YEH FINAL FORM +FBFE ARABIC LETTER FARSI YEH INITIAL FORM +FBFF ARABIC LETTER FARSI YEH MEDIAL FORM +FC00 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM +FC01 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM +FC02 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM +FC03 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FC04 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM +FC05 ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM +FC06 ARABIC LIGATURE BEH WITH HAH ISOLATED FORM +FC07 ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM +FC08 ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM +FC09 ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM +FC0A ARABIC LIGATURE BEH WITH YEH ISOLATED FORM +FC0B ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM +FC0C ARABIC LIGATURE TEH WITH HAH ISOLATED FORM +FC0D ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM +FC0E ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM +FC0F ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM +FC10 ARABIC LIGATURE TEH WITH YEH ISOLATED FORM +FC11 ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM +FC12 ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM +FC13 ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM +FC14 ARABIC LIGATURE THEH WITH YEH ISOLATED FORM +FC15 ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM +FC16 ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM +FC17 ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM +FC18 ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM +FC19 ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM +FC1A ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM +FC1B ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM +FC1C ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM +FC1D ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM +FC1E ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM +FC1F ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM +FC20 ARABIC LIGATURE SAD WITH HAH ISOLATED FORM +FC21 ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM +FC22 ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM +FC23 ARABIC LIGATURE DAD WITH HAH ISOLATED FORM +FC24 ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM +FC25 ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM +FC26 ARABIC LIGATURE TAH WITH HAH ISOLATED FORM +FC27 ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM +FC28 ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM +FC29 ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM +FC2A ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM +FC2B ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM +FC2C ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM +FC2D ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM +FC2E ARABIC LIGATURE FEH WITH HAH ISOLATED FORM +FC2F ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM +FC30 ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM +FC31 ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM +FC32 ARABIC LIGATURE FEH WITH YEH ISOLATED FORM +FC33 ARABIC LIGATURE QAF WITH HAH ISOLATED FORM +FC34 ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM +FC35 ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM +FC36 ARABIC LIGATURE QAF WITH YEH ISOLATED FORM +FC37 ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM +FC38 ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM +FC39 ARABIC LIGATURE KAF WITH HAH ISOLATED FORM +FC3A ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM +FC3B ARABIC LIGATURE KAF WITH LAM ISOLATED FORM +FC3C ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM +FC3D ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM +FC3E ARABIC LIGATURE KAF WITH YEH ISOLATED FORM +FC3F ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM +FC40 ARABIC LIGATURE LAM WITH HAH ISOLATED FORM +FC41 ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM +FC42 ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM +FC43 ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM +FC44 ARABIC LIGATURE LAM WITH YEH ISOLATED FORM +FC45 ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM +FC46 ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM +FC47 ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM +FC48 ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM +FC49 ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM +FC4A ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM +FC4B ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM +FC4C ARABIC LIGATURE NOON WITH HAH ISOLATED FORM +FC4D ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM +FC4E ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM +FC4F ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM +FC50 ARABIC LIGATURE NOON WITH YEH ISOLATED FORM +FC51 ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM +FC52 ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM +FC53 ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM +FC54 ARABIC LIGATURE HEH WITH YEH ISOLATED FORM +FC55 ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM +FC56 ARABIC LIGATURE YEH WITH HAH ISOLATED FORM +FC57 ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM +FC58 ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM +FC59 ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM +FC5A ARABIC LIGATURE YEH WITH YEH ISOLATED FORM +FC5B ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5C ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5D ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5E ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM +FC5F ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM +FC60 ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM +FC61 ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM +FC62 ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM +FC63 ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM +FC64 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM +FC65 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM +FC66 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM +FC67 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM +FC68 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FC69 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM +FC6A ARABIC LIGATURE BEH WITH REH FINAL FORM +FC6B ARABIC LIGATURE BEH WITH ZAIN FINAL FORM +FC6C ARABIC LIGATURE BEH WITH MEEM FINAL FORM +FC6D ARABIC LIGATURE BEH WITH NOON FINAL FORM +FC6E ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM +FC6F ARABIC LIGATURE BEH WITH YEH FINAL FORM +FC70 ARABIC LIGATURE TEH WITH REH FINAL FORM +FC71 ARABIC LIGATURE TEH WITH ZAIN FINAL FORM +FC72 ARABIC LIGATURE TEH WITH MEEM FINAL FORM +FC73 ARABIC LIGATURE TEH WITH NOON FINAL FORM +FC74 ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM +FC75 ARABIC LIGATURE TEH WITH YEH FINAL FORM +FC76 ARABIC LIGATURE THEH WITH REH FINAL FORM +FC77 ARABIC LIGATURE THEH WITH ZAIN FINAL FORM +FC78 ARABIC LIGATURE THEH WITH MEEM FINAL FORM +FC79 ARABIC LIGATURE THEH WITH NOON FINAL FORM +FC7A ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM +FC7B ARABIC LIGATURE THEH WITH YEH FINAL FORM +FC7C ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM +FC7D ARABIC LIGATURE FEH WITH YEH FINAL FORM +FC7E ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM +FC7F ARABIC LIGATURE QAF WITH YEH FINAL FORM +FC80 ARABIC LIGATURE KAF WITH ALEF FINAL FORM +FC81 ARABIC LIGATURE KAF WITH LAM FINAL FORM +FC82 ARABIC LIGATURE KAF WITH MEEM FINAL FORM +FC83 ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM +FC84 ARABIC LIGATURE KAF WITH YEH FINAL FORM +FC85 ARABIC LIGATURE LAM WITH MEEM FINAL FORM +FC86 ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM +FC87 ARABIC LIGATURE LAM WITH YEH FINAL FORM +FC88 ARABIC LIGATURE MEEM WITH ALEF FINAL FORM +FC89 ARABIC LIGATURE MEEM WITH MEEM FINAL FORM +FC8A ARABIC LIGATURE NOON WITH REH FINAL FORM +FC8B ARABIC LIGATURE NOON WITH ZAIN FINAL FORM +FC8C ARABIC LIGATURE NOON WITH MEEM FINAL FORM +FC8D ARABIC LIGATURE NOON WITH NOON FINAL FORM +FC8E ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM +FC8F ARABIC LIGATURE NOON WITH YEH FINAL FORM +FC90 ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM +FC91 ARABIC LIGATURE YEH WITH REH FINAL FORM +FC92 ARABIC LIGATURE YEH WITH ZAIN FINAL FORM +FC93 ARABIC LIGATURE YEH WITH MEEM FINAL FORM +FC94 ARABIC LIGATURE YEH WITH NOON FINAL FORM +FC95 ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM +FC96 ARABIC LIGATURE YEH WITH YEH FINAL FORM +FC97 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM +FC98 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM +FC99 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM +FC9A ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM +FC9B ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM +FC9C ARABIC LIGATURE BEH WITH JEEM INITIAL FORM +FC9D ARABIC LIGATURE BEH WITH HAH INITIAL FORM +FC9E ARABIC LIGATURE BEH WITH KHAH INITIAL FORM +FC9F ARABIC LIGATURE BEH WITH MEEM INITIAL FORM +FCA0 ARABIC LIGATURE BEH WITH HEH INITIAL FORM +FCA1 ARABIC LIGATURE TEH WITH JEEM INITIAL FORM +FCA2 ARABIC LIGATURE TEH WITH HAH INITIAL FORM +FCA3 ARABIC LIGATURE TEH WITH KHAH INITIAL FORM +FCA4 ARABIC LIGATURE TEH WITH MEEM INITIAL FORM +FCA5 ARABIC LIGATURE TEH WITH HEH INITIAL FORM +FCA6 ARABIC LIGATURE THEH WITH MEEM INITIAL FORM +FCA7 ARABIC LIGATURE JEEM WITH HAH INITIAL FORM +FCA8 ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM +FCA9 ARABIC LIGATURE HAH WITH JEEM INITIAL FORM +FCAA ARABIC LIGATURE HAH WITH MEEM INITIAL FORM +FCAB ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM +FCAC ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM +FCAD ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM +FCAE ARABIC LIGATURE SEEN WITH HAH INITIAL FORM +FCAF ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM +FCB0 ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM +FCB1 ARABIC LIGATURE SAD WITH HAH INITIAL FORM +FCB2 ARABIC LIGATURE SAD WITH KHAH INITIAL FORM +FCB3 ARABIC LIGATURE SAD WITH MEEM INITIAL FORM +FCB4 ARABIC LIGATURE DAD WITH JEEM INITIAL FORM +FCB5 ARABIC LIGATURE DAD WITH HAH INITIAL FORM +FCB6 ARABIC LIGATURE DAD WITH KHAH INITIAL FORM +FCB7 ARABIC LIGATURE DAD WITH MEEM INITIAL FORM +FCB8 ARABIC LIGATURE TAH WITH HAH INITIAL FORM +FCB9 ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM +FCBA ARABIC LIGATURE AIN WITH JEEM INITIAL FORM +FCBB ARABIC LIGATURE AIN WITH MEEM INITIAL FORM +FCBC ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM +FCBD ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM +FCBE ARABIC LIGATURE FEH WITH JEEM INITIAL FORM +FCBF ARABIC LIGATURE FEH WITH HAH INITIAL FORM +FCC0 ARABIC LIGATURE FEH WITH KHAH INITIAL FORM +FCC1 ARABIC LIGATURE FEH WITH MEEM INITIAL FORM +FCC2 ARABIC LIGATURE QAF WITH HAH INITIAL FORM +FCC3 ARABIC LIGATURE QAF WITH MEEM INITIAL FORM +FCC4 ARABIC LIGATURE KAF WITH JEEM INITIAL FORM +FCC5 ARABIC LIGATURE KAF WITH HAH INITIAL FORM +FCC6 ARABIC LIGATURE KAF WITH KHAH INITIAL FORM +FCC7 ARABIC LIGATURE KAF WITH LAM INITIAL FORM +FCC8 ARABIC LIGATURE KAF WITH MEEM INITIAL FORM +FCC9 ARABIC LIGATURE LAM WITH JEEM INITIAL FORM +FCCA ARABIC LIGATURE LAM WITH HAH INITIAL FORM +FCCB ARABIC LIGATURE LAM WITH KHAH INITIAL FORM +FCCC ARABIC LIGATURE LAM WITH MEEM INITIAL FORM +FCCD ARABIC LIGATURE LAM WITH HEH INITIAL FORM +FCCE ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM +FCCF ARABIC LIGATURE MEEM WITH HAH INITIAL FORM +FCD0 ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM +FCD1 ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM +FCD2 ARABIC LIGATURE NOON WITH JEEM INITIAL FORM +FCD3 ARABIC LIGATURE NOON WITH HAH INITIAL FORM +FCD4 ARABIC LIGATURE NOON WITH KHAH INITIAL FORM +FCD5 ARABIC LIGATURE NOON WITH MEEM INITIAL FORM +FCD6 ARABIC LIGATURE NOON WITH HEH INITIAL FORM +FCD7 ARABIC LIGATURE HEH WITH JEEM INITIAL FORM +FCD8 ARABIC LIGATURE HEH WITH MEEM INITIAL FORM +FCD9 ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM +FCDA ARABIC LIGATURE YEH WITH JEEM INITIAL FORM +FCDB ARABIC LIGATURE YEH WITH HAH INITIAL FORM +FCDC ARABIC LIGATURE YEH WITH KHAH INITIAL FORM +FCDD ARABIC LIGATURE YEH WITH MEEM INITIAL FORM +FCDE ARABIC LIGATURE YEH WITH HEH INITIAL FORM +FCDF ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM +FCE0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM +FCE1 ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM +FCE2 ARABIC LIGATURE BEH WITH HEH MEDIAL FORM +FCE3 ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM +FCE4 ARABIC LIGATURE TEH WITH HEH MEDIAL FORM +FCE5 ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM +FCE6 ARABIC LIGATURE THEH WITH HEH MEDIAL FORM +FCE7 ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM +FCE8 ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM +FCE9 ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM +FCEA ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM +FCEB ARABIC LIGATURE KAF WITH LAM MEDIAL FORM +FCEC ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM +FCED ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM +FCEE ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM +FCEF ARABIC LIGATURE NOON WITH HEH MEDIAL FORM +FCF0 ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM +FCF1 ARABIC LIGATURE YEH WITH HEH MEDIAL FORM +FCF2 ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM +FCF3 ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM +FCF4 ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM +FCF5 ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM +FCF6 ARABIC LIGATURE TAH WITH YEH ISOLATED FORM +FCF7 ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM +FCF8 ARABIC LIGATURE AIN WITH YEH ISOLATED FORM +FCF9 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM +FCFA ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM +FCFB ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM +FCFC ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM +FCFD ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM +FCFE ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM +FCFF ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM +FD00 ARABIC LIGATURE HAH WITH YEH ISOLATED FORM +FD01 ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM +FD02 ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM +FD03 ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM +FD04 ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM +FD05 ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM +FD06 ARABIC LIGATURE SAD WITH YEH ISOLATED FORM +FD07 ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM +FD08 ARABIC LIGATURE DAD WITH YEH ISOLATED FORM +FD09 ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM +FD0A ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM +FD0B ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM +FD0C ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM +FD0D ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM +FD0E ARABIC LIGATURE SEEN WITH REH ISOLATED FORM +FD0F ARABIC LIGATURE SAD WITH REH ISOLATED FORM +FD10 ARABIC LIGATURE DAD WITH REH ISOLATED FORM +FD11 ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM +FD12 ARABIC LIGATURE TAH WITH YEH FINAL FORM +FD13 ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM +FD14 ARABIC LIGATURE AIN WITH YEH FINAL FORM +FD15 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM +FD16 ARABIC LIGATURE GHAIN WITH YEH FINAL FORM +FD17 ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM +FD18 ARABIC LIGATURE SEEN WITH YEH FINAL FORM +FD19 ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM +FD1A ARABIC LIGATURE SHEEN WITH YEH FINAL FORM +FD1B ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM +FD1C ARABIC LIGATURE HAH WITH YEH FINAL FORM +FD1D ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM +FD1E ARABIC LIGATURE JEEM WITH YEH FINAL FORM +FD1F ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM +FD20 ARABIC LIGATURE KHAH WITH YEH FINAL FORM +FD21 ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM +FD22 ARABIC LIGATURE SAD WITH YEH FINAL FORM +FD23 ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM +FD24 ARABIC LIGATURE DAD WITH YEH FINAL FORM +FD25 ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM +FD26 ARABIC LIGATURE SHEEN WITH HAH FINAL FORM +FD27 ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM +FD28 ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM +FD29 ARABIC LIGATURE SHEEN WITH REH FINAL FORM +FD2A ARABIC LIGATURE SEEN WITH REH FINAL FORM +FD2B ARABIC LIGATURE SAD WITH REH FINAL FORM +FD2C ARABIC LIGATURE DAD WITH REH FINAL FORM +FD2D ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM +FD2E ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM +FD2F ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM +FD30 ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM +FD31 ARABIC LIGATURE SEEN WITH HEH INITIAL FORM +FD32 ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM +FD33 ARABIC LIGATURE TAH WITH MEEM INITIAL FORM +FD34 ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM +FD35 ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM +FD36 ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM +FD37 ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM +FD38 ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM +FD39 ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM +FD3A ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM +FD3B ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM +FD3C ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM +FD3D ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD3E ORNATE LEFT PARENTHESIS +FD3F ORNATE RIGHT PARENTHESIS +FD50 ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM +FD51 ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM +FD52 ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM +FD53 ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM +FD54 ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM +FD55 ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM +FD56 ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM +FD57 ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM +FD58 ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM +FD59 ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM +FD5A ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM +FD5B ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD5C ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM +FD5D ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM +FD5E ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM +FD5F ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM +FD60 ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM +FD61 ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM +FD62 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM +FD63 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM +FD64 ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM +FD65 ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM +FD66 ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM +FD67 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM +FD68 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM +FD69 ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM +FD6A ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM +FD6B ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM +FD6C ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM +FD6D ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM +FD6E ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM +FD6F ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM +FD70 ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM +FD71 ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM +FD72 ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM +FD73 ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM +FD74 ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM +FD75 ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM +FD76 ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM +FD77 ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM +FD78 ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD79 ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM +FD7A ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM +FD7B ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD7C ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM +FD7D ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM +FD7E ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM +FD7F ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM +FD80 ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM +FD81 ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM +FD82 ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM +FD83 ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM +FD84 ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM +FD85 ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM +FD86 ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM +FD87 ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM +FD88 ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM +FD89 ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM +FD8A ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM +FD8B ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM +FD8C ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM +FD8D ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM +FD8E ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM +FD8F ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92 ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM +FD93 ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM +FD94 ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM +FD95 ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM +FD96 ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM +FD97 ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM +FD98 ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM +FD99 ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM +FD9A ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM +FD9B ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD9C ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM +FD9D ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM +FD9E ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM +FD9F ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM +FDA0 ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM +FDA1 ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM +FDA2 ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDA3 ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM +FDA4 ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA5 ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM +FDA6 ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM +FDA7 ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA8 ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDA9 ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM +FDAA ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM +FDAB ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM +FDAC ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM +FDAD ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM +FDAE ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM +FDAF ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM +FDB0 ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM +FDB1 ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM +FDB2 ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM +FDB3 ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM +FDB4 ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM +FDB5 ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM +FDB6 ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM +FDB7 ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM +FDB8 ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM +FDB9 ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM +FDBA ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM +FDBB ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM +FDBC ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM +FDBD ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM +FDBE ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM +FDBF ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM +FDC0 ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM +FDC1 ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM +FDC2 ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM +FDC3 ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM +FDC4 ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM +FDC5 ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM +FDC6 ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM +FDC7 ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDF0 ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM +FDF1 ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM +FDF2 ARABIC LIGATURE ALLAH ISOLATED FORM +FDF3 ARABIC LIGATURE AKBAR ISOLATED FORM +FDF4 ARABIC LIGATURE MOHAMMAD ISOLATED FORM +FDF5 ARABIC LIGATURE SALAM ISOLATED FORM +FDF6 ARABIC LIGATURE RASOUL ISOLATED FORM +FDF7 ARABIC LIGATURE ALAYHE ISOLATED FORM +FDF8 ARABIC LIGATURE WASALLAM ISOLATED FORM +FDF9 ARABIC LIGATURE SALLA ISOLATED FORM +FDFA ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM +FDFB ARABIC LIGATURE JALLAJALALOUHOU +FDFC RIAL SIGN +FDFD ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +FE00 VARIATION SELECTOR-1 +FE01 VARIATION SELECTOR-2 +FE02 VARIATION SELECTOR-3 +FE03 VARIATION SELECTOR-4 +FE04 VARIATION SELECTOR-5 +FE05 VARIATION SELECTOR-6 +FE06 VARIATION SELECTOR-7 +FE07 VARIATION SELECTOR-8 +FE08 VARIATION SELECTOR-9 +FE09 VARIATION SELECTOR-10 +FE0A VARIATION SELECTOR-11 +FE0B VARIATION SELECTOR-12 +FE0C VARIATION SELECTOR-13 +FE0D VARIATION SELECTOR-14 +FE0E VARIATION SELECTOR-15 +FE0F VARIATION SELECTOR-16 +FE10 PRESENTATION FORM FOR VERTICAL COMMA +FE11 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA +FE12 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP +FE13 PRESENTATION FORM FOR VERTICAL COLON +FE14 PRESENTATION FORM FOR VERTICAL SEMICOLON +FE15 PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK +FE16 PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17 PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18 PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +FE20 COMBINING LIGATURE LEFT HALF +FE21 COMBINING LIGATURE RIGHT HALF +FE22 COMBINING DOUBLE TILDE LEFT HALF +FE23 COMBINING DOUBLE TILDE RIGHT HALF +FE30 PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31 PRESENTATION FORM FOR VERTICAL EM DASH +FE32 PRESENTATION FORM FOR VERTICAL EN DASH +FE33 PRESENTATION FORM FOR VERTICAL LOW LINE +FE34 PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35 PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36 PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37 PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38 PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39 PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40 PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41 PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45 SESAME DOT +FE46 WHITE SESAME DOT +FE47 PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48 PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49 DASHED OVERLINE +FE4A CENTRELINE OVERLINE +FE4B WAVY OVERLINE +FE4C DOUBLE WAVY OVERLINE +FE4D DASHED LOW LINE +FE4E CENTRELINE LOW LINE +FE4F WAVY LOW LINE +FE50 SMALL COMMA +FE51 SMALL IDEOGRAPHIC COMMA +FE52 SMALL FULL STOP +FE54 SMALL SEMICOLON +FE55 SMALL COLON +FE56 SMALL QUESTION MARK +FE57 SMALL EXCLAMATION MARK +FE58 SMALL EM DASH +FE59 SMALL LEFT PARENTHESIS +FE5A SMALL RIGHT PARENTHESIS +FE5B SMALL LEFT CURLY BRACKET +FE5C SMALL RIGHT CURLY BRACKET +FE5D SMALL LEFT TORTOISE SHELL BRACKET +FE5E SMALL RIGHT TORTOISE SHELL BRACKET +FE5F SMALL NUMBER SIGN +FE60 SMALL AMPERSAND +FE61 SMALL ASTERISK +FE62 SMALL PLUS SIGN +FE63 SMALL HYPHEN-MINUS +FE64 SMALL LESS-THAN SIGN +FE65 SMALL GREATER-THAN SIGN +FE66 SMALL EQUALS SIGN +FE68 SMALL REVERSE SOLIDUS +FE69 SMALL DOLLAR SIGN +FE6A SMALL PERCENT SIGN +FE6B SMALL COMMERCIAL AT +FE70 ARABIC FATHATAN ISOLATED FORM +FE71 ARABIC TATWEEL WITH FATHATAN ABOVE +FE72 ARABIC DAMMATAN ISOLATED FORM +FE73 ARABIC TAIL FRAGMENT +FE74 ARABIC KASRATAN ISOLATED FORM +FE76 ARABIC FATHA ISOLATED FORM +FE77 ARABIC FATHA MEDIAL FORM +FE78 ARABIC DAMMA ISOLATED FORM +FE79 ARABIC DAMMA MEDIAL FORM +FE7A ARABIC KASRA ISOLATED FORM +FE7B ARABIC KASRA MEDIAL FORM +FE7C ARABIC SHADDA ISOLATED FORM +FE7D ARABIC SHADDA MEDIAL FORM +FE7E ARABIC SUKUN ISOLATED FORM +FE7F ARABIC SUKUN MEDIAL FORM +FE80 ARABIC LETTER HAMZA ISOLATED FORM +FE81 ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM +FE82 ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM +FE83 ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM +FE84 ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM +FE85 ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM +FE86 ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM +FE87 ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM +FE88 ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM +FE89 ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM +FE8A ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM +FE8B ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM +FE8C ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM +FE8D ARABIC LETTER ALEF ISOLATED FORM +FE8E ARABIC LETTER ALEF FINAL FORM +FE8F ARABIC LETTER BEH ISOLATED FORM +FE90 ARABIC LETTER BEH FINAL FORM +FE91 ARABIC LETTER BEH INITIAL FORM +FE92 ARABIC LETTER BEH MEDIAL FORM +FE93 ARABIC LETTER TEH MARBUTA ISOLATED FORM +FE94 ARABIC LETTER TEH MARBUTA FINAL FORM +FE95 ARABIC LETTER TEH ISOLATED FORM +FE96 ARABIC LETTER TEH FINAL FORM +FE97 ARABIC LETTER TEH INITIAL FORM +FE98 ARABIC LETTER TEH MEDIAL FORM +FE99 ARABIC LETTER THEH ISOLATED FORM +FE9A ARABIC LETTER THEH FINAL FORM +FE9B ARABIC LETTER THEH INITIAL FORM +FE9C ARABIC LETTER THEH MEDIAL FORM +FE9D ARABIC LETTER JEEM ISOLATED FORM +FE9E ARABIC LETTER JEEM FINAL FORM +FE9F ARABIC LETTER JEEM INITIAL FORM +FEA0 ARABIC LETTER JEEM MEDIAL FORM +FEA1 ARABIC LETTER HAH ISOLATED FORM +FEA2 ARABIC LETTER HAH FINAL FORM +FEA3 ARABIC LETTER HAH INITIAL FORM +FEA4 ARABIC LETTER HAH MEDIAL FORM +FEA5 ARABIC LETTER KHAH ISOLATED FORM +FEA6 ARABIC LETTER KHAH FINAL FORM +FEA7 ARABIC LETTER KHAH INITIAL FORM +FEA8 ARABIC LETTER KHAH MEDIAL FORM +FEA9 ARABIC LETTER DAL ISOLATED FORM +FEAA ARABIC LETTER DAL FINAL FORM +FEAB ARABIC LETTER THAL ISOLATED FORM +FEAC ARABIC LETTER THAL FINAL FORM +FEAD ARABIC LETTER REH ISOLATED FORM +FEAE ARABIC LETTER REH FINAL FORM +FEAF ARABIC LETTER ZAIN ISOLATED FORM +FEB0 ARABIC LETTER ZAIN FINAL FORM +FEB1 ARABIC LETTER SEEN ISOLATED FORM +FEB2 ARABIC LETTER SEEN FINAL FORM +FEB3 ARABIC LETTER SEEN INITIAL FORM +FEB4 ARABIC LETTER SEEN MEDIAL FORM +FEB5 ARABIC LETTER SHEEN ISOLATED FORM +FEB6 ARABIC LETTER SHEEN FINAL FORM +FEB7 ARABIC LETTER SHEEN INITIAL FORM +FEB8 ARABIC LETTER SHEEN MEDIAL FORM +FEB9 ARABIC LETTER SAD ISOLATED FORM +FEBA ARABIC LETTER SAD FINAL FORM +FEBB ARABIC LETTER SAD INITIAL FORM +FEBC ARABIC LETTER SAD MEDIAL FORM +FEBD ARABIC LETTER DAD ISOLATED FORM +FEBE ARABIC LETTER DAD FINAL FORM +FEBF ARABIC LETTER DAD INITIAL FORM +FEC0 ARABIC LETTER DAD MEDIAL FORM +FEC1 ARABIC LETTER TAH ISOLATED FORM +FEC2 ARABIC LETTER TAH FINAL FORM +FEC3 ARABIC LETTER TAH INITIAL FORM +FEC4 ARABIC LETTER TAH MEDIAL FORM +FEC5 ARABIC LETTER ZAH ISOLATED FORM +FEC6 ARABIC LETTER ZAH FINAL FORM +FEC7 ARABIC LETTER ZAH INITIAL FORM +FEC8 ARABIC LETTER ZAH MEDIAL FORM +FEC9 ARABIC LETTER AIN ISOLATED FORM +FECA ARABIC LETTER AIN FINAL FORM +FECB ARABIC LETTER AIN INITIAL FORM +FECC ARABIC LETTER AIN MEDIAL FORM +FECD ARABIC LETTER GHAIN ISOLATED FORM +FECE ARABIC LETTER GHAIN FINAL FORM +FECF ARABIC LETTER GHAIN INITIAL FORM +FED0 ARABIC LETTER GHAIN MEDIAL FORM +FED1 ARABIC LETTER FEH ISOLATED FORM +FED2 ARABIC LETTER FEH FINAL FORM +FED3 ARABIC LETTER FEH INITIAL FORM +FED4 ARABIC LETTER FEH MEDIAL FORM +FED5 ARABIC LETTER QAF ISOLATED FORM +FED6 ARABIC LETTER QAF FINAL FORM +FED7 ARABIC LETTER QAF INITIAL FORM +FED8 ARABIC LETTER QAF MEDIAL FORM +FED9 ARABIC LETTER KAF ISOLATED FORM +FEDA ARABIC LETTER KAF FINAL FORM +FEDB ARABIC LETTER KAF INITIAL FORM +FEDC ARABIC LETTER KAF MEDIAL FORM +FEDD ARABIC LETTER LAM ISOLATED FORM +FEDE ARABIC LETTER LAM FINAL FORM +FEDF ARABIC LETTER LAM INITIAL FORM +FEE0 ARABIC LETTER LAM MEDIAL FORM +FEE1 ARABIC LETTER MEEM ISOLATED FORM +FEE2 ARABIC LETTER MEEM FINAL FORM +FEE3 ARABIC LETTER MEEM INITIAL FORM +FEE4 ARABIC LETTER MEEM MEDIAL FORM +FEE5 ARABIC LETTER NOON ISOLATED FORM +FEE6 ARABIC LETTER NOON FINAL FORM +FEE7 ARABIC LETTER NOON INITIAL FORM +FEE8 ARABIC LETTER NOON MEDIAL FORM +FEE9 ARABIC LETTER HEH ISOLATED FORM +FEEA ARABIC LETTER HEH FINAL FORM +FEEB ARABIC LETTER HEH INITIAL FORM +FEEC ARABIC LETTER HEH MEDIAL FORM +FEED ARABIC LETTER WAW ISOLATED FORM +FEEE ARABIC LETTER WAW FINAL FORM +FEEF ARABIC LETTER ALEF MAKSURA ISOLATED FORM +FEF0 ARABIC LETTER ALEF MAKSURA FINAL FORM +FEF1 ARABIC LETTER YEH ISOLATED FORM +FEF2 ARABIC LETTER YEH FINAL FORM +FEF3 ARABIC LETTER YEH INITIAL FORM +FEF4 ARABIC LETTER YEH MEDIAL FORM +FEF5 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM +FEF6 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM +FEF7 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM +FEF8 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM +FEF9 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM +FEFA ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM +FEFB ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM +FEFC ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FEFF ZERO WIDTH NO-BREAK SPACE +FF01 FULLWIDTH EXCLAMATION MARK +FF02 FULLWIDTH QUOTATION MARK +FF03 FULLWIDTH NUMBER SIGN +FF04 FULLWIDTH DOLLAR SIGN +FF05 FULLWIDTH PERCENT SIGN +FF06 FULLWIDTH AMPERSAND +FF07 FULLWIDTH APOSTROPHE +FF08 FULLWIDTH LEFT PARENTHESIS +FF09 FULLWIDTH RIGHT PARENTHESIS +FF0A FULLWIDTH ASTERISK +FF0B FULLWIDTH PLUS SIGN +FF0C FULLWIDTH COMMA +FF0D FULLWIDTH HYPHEN-MINUS +FF0E FULLWIDTH FULL STOP +FF0F FULLWIDTH SOLIDUS +FF10 FULLWIDTH DIGIT ZERO +FF11 FULLWIDTH DIGIT ONE +FF12 FULLWIDTH DIGIT TWO +FF13 FULLWIDTH DIGIT THREE +FF14 FULLWIDTH DIGIT FOUR +FF15 FULLWIDTH DIGIT FIVE +FF16 FULLWIDTH DIGIT SIX +FF17 FULLWIDTH DIGIT SEVEN +FF18 FULLWIDTH DIGIT EIGHT +FF19 FULLWIDTH DIGIT NINE +FF1A FULLWIDTH COLON +FF1B FULLWIDTH SEMICOLON +FF1C FULLWIDTH LESS-THAN SIGN +FF1D FULLWIDTH EQUALS SIGN +FF1E FULLWIDTH GREATER-THAN SIGN +FF1F FULLWIDTH QUESTION MARK +FF20 FULLWIDTH COMMERCIAL AT +FF21 FULLWIDTH LATIN CAPITAL LETTER A +FF22 FULLWIDTH LATIN CAPITAL LETTER B +FF23 FULLWIDTH LATIN CAPITAL LETTER C +FF24 FULLWIDTH LATIN CAPITAL LETTER D +FF25 FULLWIDTH LATIN CAPITAL LETTER E +FF26 FULLWIDTH LATIN CAPITAL LETTER F +FF27 FULLWIDTH LATIN CAPITAL LETTER G +FF28 FULLWIDTH LATIN CAPITAL LETTER H +FF29 FULLWIDTH LATIN CAPITAL LETTER I +FF2A FULLWIDTH LATIN CAPITAL LETTER J +FF2B FULLWIDTH LATIN CAPITAL LETTER K +FF2C FULLWIDTH LATIN CAPITAL LETTER L +FF2D FULLWIDTH LATIN CAPITAL LETTER M +FF2E FULLWIDTH LATIN CAPITAL LETTER N +FF2F FULLWIDTH LATIN CAPITAL LETTER O +FF30 FULLWIDTH LATIN CAPITAL LETTER P +FF31 FULLWIDTH LATIN CAPITAL LETTER Q +FF32 FULLWIDTH LATIN CAPITAL LETTER R +FF33 FULLWIDTH LATIN CAPITAL LETTER S +FF34 FULLWIDTH LATIN CAPITAL LETTER T +FF35 FULLWIDTH LATIN CAPITAL LETTER U +FF36 FULLWIDTH LATIN CAPITAL LETTER V +FF37 FULLWIDTH LATIN CAPITAL LETTER W +FF38 FULLWIDTH LATIN CAPITAL LETTER X +FF39 FULLWIDTH LATIN CAPITAL LETTER Y +FF3A FULLWIDTH LATIN CAPITAL LETTER Z +FF3B FULLWIDTH LEFT SQUARE BRACKET +FF3C FULLWIDTH REVERSE SOLIDUS +FF3D FULLWIDTH RIGHT SQUARE BRACKET +FF3E FULLWIDTH CIRCUMFLEX ACCENT +FF3F FULLWIDTH LOW LINE +FF40 FULLWIDTH GRAVE ACCENT +FF41 FULLWIDTH LATIN SMALL LETTER A +FF42 FULLWIDTH LATIN SMALL LETTER B +FF43 FULLWIDTH LATIN SMALL LETTER C +FF44 FULLWIDTH LATIN SMALL LETTER D +FF45 FULLWIDTH LATIN SMALL LETTER E +FF46 FULLWIDTH LATIN SMALL LETTER F +FF47 FULLWIDTH LATIN SMALL LETTER G +FF48 FULLWIDTH LATIN SMALL LETTER H +FF49 FULLWIDTH LATIN SMALL LETTER I +FF4A FULLWIDTH LATIN SMALL LETTER J +FF4B FULLWIDTH LATIN SMALL LETTER K +FF4C FULLWIDTH LATIN SMALL LETTER L +FF4D FULLWIDTH LATIN SMALL LETTER M +FF4E FULLWIDTH LATIN SMALL LETTER N +FF4F FULLWIDTH LATIN SMALL LETTER O +FF50 FULLWIDTH LATIN SMALL LETTER P +FF51 FULLWIDTH LATIN SMALL LETTER Q +FF52 FULLWIDTH LATIN SMALL LETTER R +FF53 FULLWIDTH LATIN SMALL LETTER S +FF54 FULLWIDTH LATIN SMALL LETTER T +FF55 FULLWIDTH LATIN SMALL LETTER U +FF56 FULLWIDTH LATIN SMALL LETTER V +FF57 FULLWIDTH LATIN SMALL LETTER W +FF58 FULLWIDTH LATIN SMALL LETTER X +FF59 FULLWIDTH LATIN SMALL LETTER Y +FF5A FULLWIDTH LATIN SMALL LETTER Z +FF5B FULLWIDTH LEFT CURLY BRACKET +FF5C FULLWIDTH VERTICAL LINE +FF5D FULLWIDTH RIGHT CURLY BRACKET +FF5E FULLWIDTH TILDE +FF5F FULLWIDTH LEFT WHITE PARENTHESIS +FF60 FULLWIDTH RIGHT WHITE PARENTHESIS +FF61 HALFWIDTH IDEOGRAPHIC FULL STOP +FF62 HALFWIDTH LEFT CORNER BRACKET +FF63 HALFWIDTH RIGHT CORNER BRACKET +FF64 HALFWIDTH IDEOGRAPHIC COMMA +FF65 HALFWIDTH KATAKANA MIDDLE DOT +FF66 HALFWIDTH KATAKANA LETTER WO +FF67 HALFWIDTH KATAKANA LETTER SMALL A +FF68 HALFWIDTH KATAKANA LETTER SMALL I +FF69 HALFWIDTH KATAKANA LETTER SMALL U +FF6A HALFWIDTH KATAKANA LETTER SMALL E +FF6B HALFWIDTH KATAKANA LETTER SMALL O +FF6C HALFWIDTH KATAKANA LETTER SMALL YA +FF6D HALFWIDTH KATAKANA LETTER SMALL YU +FF6E HALFWIDTH KATAKANA LETTER SMALL YO +FF6F HALFWIDTH KATAKANA LETTER SMALL TU +FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71 HALFWIDTH KATAKANA LETTER A +FF72 HALFWIDTH KATAKANA LETTER I +FF73 HALFWIDTH KATAKANA LETTER U +FF74 HALFWIDTH KATAKANA LETTER E +FF75 HALFWIDTH KATAKANA LETTER O +FF76 HALFWIDTH KATAKANA LETTER KA +FF77 HALFWIDTH KATAKANA LETTER KI +FF78 HALFWIDTH KATAKANA LETTER KU +FF79 HALFWIDTH KATAKANA LETTER KE +FF7A HALFWIDTH KATAKANA LETTER KO +FF7B HALFWIDTH KATAKANA LETTER SA +FF7C HALFWIDTH KATAKANA LETTER SI +FF7D HALFWIDTH KATAKANA LETTER SU +FF7E HALFWIDTH KATAKANA LETTER SE +FF7F HALFWIDTH KATAKANA LETTER SO +FF80 HALFWIDTH KATAKANA LETTER TA +FF81 HALFWIDTH KATAKANA LETTER TI +FF82 HALFWIDTH KATAKANA LETTER TU +FF83 HALFWIDTH KATAKANA LETTER TE +FF84 HALFWIDTH KATAKANA LETTER TO +FF85 HALFWIDTH KATAKANA LETTER NA +FF86 HALFWIDTH KATAKANA LETTER NI +FF87 HALFWIDTH KATAKANA LETTER NU +FF88 HALFWIDTH KATAKANA LETTER NE +FF89 HALFWIDTH KATAKANA LETTER NO +FF8A HALFWIDTH KATAKANA LETTER HA +FF8B HALFWIDTH KATAKANA LETTER HI +FF8C HALFWIDTH KATAKANA LETTER HU +FF8D HALFWIDTH KATAKANA LETTER HE +FF8E HALFWIDTH KATAKANA LETTER HO +FF8F HALFWIDTH KATAKANA LETTER MA +FF90 HALFWIDTH KATAKANA LETTER MI +FF91 HALFWIDTH KATAKANA LETTER MU +FF92 HALFWIDTH KATAKANA LETTER ME +FF93 HALFWIDTH KATAKANA LETTER MO +FF94 HALFWIDTH KATAKANA LETTER YA +FF95 HALFWIDTH KATAKANA LETTER YU +FF96 HALFWIDTH KATAKANA LETTER YO +FF97 HALFWIDTH KATAKANA LETTER RA +FF98 HALFWIDTH KATAKANA LETTER RI +FF99 HALFWIDTH KATAKANA LETTER RU +FF9A HALFWIDTH KATAKANA LETTER RE +FF9B HALFWIDTH KATAKANA LETTER RO +FF9C HALFWIDTH KATAKANA LETTER WA +FF9D HALFWIDTH KATAKANA LETTER N +FF9E HALFWIDTH KATAKANA VOICED SOUND MARK +FF9F HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0 HALFWIDTH HANGUL FILLER +FFA1 HALFWIDTH HANGUL LETTER KIYEOK +FFA2 HALFWIDTH HANGUL LETTER SSANGKIYEOK +FFA3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS +FFA4 HALFWIDTH HANGUL LETTER NIEUN +FFA5 HALFWIDTH HANGUL LETTER NIEUN-CIEUC +FFA6 HALFWIDTH HANGUL LETTER NIEUN-HIEUH +FFA7 HALFWIDTH HANGUL LETTER TIKEUT +FFA8 HALFWIDTH HANGUL LETTER SSANGTIKEUT +FFA9 HALFWIDTH HANGUL LETTER RIEUL +FFAA HALFWIDTH HANGUL LETTER RIEUL-KIYEOK +FFAB HALFWIDTH HANGUL LETTER RIEUL-MIEUM +FFAC HALFWIDTH HANGUL LETTER RIEUL-PIEUP +FFAD HALFWIDTH HANGUL LETTER RIEUL-SIOS +FFAE HALFWIDTH HANGUL LETTER RIEUL-THIEUTH +FFAF HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH +FFB0 HALFWIDTH HANGUL LETTER RIEUL-HIEUH +FFB1 HALFWIDTH HANGUL LETTER MIEUM +FFB2 HALFWIDTH HANGUL LETTER PIEUP +FFB3 HALFWIDTH HANGUL LETTER SSANGPIEUP +FFB4 HALFWIDTH HANGUL LETTER PIEUP-SIOS +FFB5 HALFWIDTH HANGUL LETTER SIOS +FFB6 HALFWIDTH HANGUL LETTER SSANGSIOS +FFB7 HALFWIDTH HANGUL LETTER IEUNG +FFB8 HALFWIDTH HANGUL LETTER CIEUC +FFB9 HALFWIDTH HANGUL LETTER SSANGCIEUC +FFBA HALFWIDTH HANGUL LETTER CHIEUCH +FFBB HALFWIDTH HANGUL LETTER KHIEUKH +FFBC HALFWIDTH HANGUL LETTER THIEUTH +FFBD HALFWIDTH HANGUL LETTER PHIEUPH +FFBE HALFWIDTH HANGUL LETTER HIEUH +FFC2 HALFWIDTH HANGUL LETTER A +FFC3 HALFWIDTH HANGUL LETTER AE +FFC4 HALFWIDTH HANGUL LETTER YA +FFC5 HALFWIDTH HANGUL LETTER YAE +FFC6 HALFWIDTH HANGUL LETTER EO +FFC7 HALFWIDTH HANGUL LETTER E +FFCA HALFWIDTH HANGUL LETTER YEO +FFCB HALFWIDTH HANGUL LETTER YE +FFCC HALFWIDTH HANGUL LETTER O +FFCD HALFWIDTH HANGUL LETTER WA +FFCE HALFWIDTH HANGUL LETTER WAE +FFCF HALFWIDTH HANGUL LETTER OE +FFD2 HALFWIDTH HANGUL LETTER YO +FFD3 HALFWIDTH HANGUL LETTER U +FFD4 HALFWIDTH HANGUL LETTER WEO +FFD5 HALFWIDTH HANGUL LETTER WE +FFD6 HALFWIDTH HANGUL LETTER WI +FFD7 HALFWIDTH HANGUL LETTER YU +FFDA HALFWIDTH HANGUL LETTER EU +FFDB HALFWIDTH HANGUL LETTER YI +FFDC HALFWIDTH HANGUL LETTER I +FFE0 FULLWIDTH CENT SIGN +FFE1 FULLWIDTH POUND SIGN +FFE2 FULLWIDTH NOT SIGN +FFE3 FULLWIDTH MACRON +FFE4 FULLWIDTH BROKEN BAR +FFE5 FULLWIDTH YEN SIGN +FFE6 FULLWIDTH WON SIGN +FFE8 HALFWIDTH FORMS LIGHT VERTICAL +FFE9 HALFWIDTH LEFTWARDS ARROW +FFEA HALFWIDTH UPWARDS ARROW +FFEB HALFWIDTH RIGHTWARDS ARROW +FFEC HALFWIDTH DOWNWARDS ARROW +FFED HALFWIDTH BLACK SQUARE +FFEE HALFWIDTH WHITE CIRCLE +FFF9 INTERLINEAR ANNOTATION ANCHOR +FFFA INTERLINEAR ANNOTATION SEPARATOR +FFFB INTERLINEAR ANNOTATION TERMINATOR +FFFC OBJECT REPLACEMENT CHARACTER +FFFD REPLACEMENT CHARACTER +10000 LINEAR B SYLLABLE B008 A +10001 LINEAR B SYLLABLE B038 E +10002 LINEAR B SYLLABLE B028 I +10003 LINEAR B SYLLABLE B061 O +10004 LINEAR B SYLLABLE B010 U +10005 LINEAR B SYLLABLE B001 DA +10006 LINEAR B SYLLABLE B045 DE +10007 LINEAR B SYLLABLE B007 DI +10008 LINEAR B SYLLABLE B014 DO +10009 LINEAR B SYLLABLE B051 DU +1000A LINEAR B SYLLABLE B057 JA +1000B LINEAR B SYLLABLE B046 JE +1000D LINEAR B SYLLABLE B036 JO +1000E LINEAR B SYLLABLE B065 JU +1000F LINEAR B SYLLABLE B077 KA +10010 LINEAR B SYLLABLE B044 KE +10011 LINEAR B SYLLABLE B067 KI +10012 LINEAR B SYLLABLE B070 KO +10013 LINEAR B SYLLABLE B081 KU +10014 LINEAR B SYLLABLE B080 MA +10015 LINEAR B SYLLABLE B013 ME +10016 LINEAR B SYLLABLE B073 MI +10017 LINEAR B SYLLABLE B015 MO +10018 LINEAR B SYLLABLE B023 MU +10019 LINEAR B SYLLABLE B006 NA +1001A LINEAR B SYLLABLE B024 NE +1001B LINEAR B SYLLABLE B030 NI +1001C LINEAR B SYLLABLE B052 NO +1001D LINEAR B SYLLABLE B055 NU +1001E LINEAR B SYLLABLE B003 PA +1001F LINEAR B SYLLABLE B072 PE +10020 LINEAR B SYLLABLE B039 PI +10021 LINEAR B SYLLABLE B011 PO +10022 LINEAR B SYLLABLE B050 PU +10023 LINEAR B SYLLABLE B016 QA +10024 LINEAR B SYLLABLE B078 QE +10025 LINEAR B SYLLABLE B021 QI +10026 LINEAR B SYLLABLE B032 QO +10028 LINEAR B SYLLABLE B060 RA +10029 LINEAR B SYLLABLE B027 RE +1002A LINEAR B SYLLABLE B053 RI +1002B LINEAR B SYLLABLE B002 RO +1002C LINEAR B SYLLABLE B026 RU +1002D LINEAR B SYLLABLE B031 SA +1002E LINEAR B SYLLABLE B009 SE +1002F LINEAR B SYLLABLE B041 SI +10030 LINEAR B SYLLABLE B012 SO +10031 LINEAR B SYLLABLE B058 SU +10032 LINEAR B SYLLABLE B059 TA +10033 LINEAR B SYLLABLE B004 TE +10034 LINEAR B SYLLABLE B037 TI +10035 LINEAR B SYLLABLE B005 TO +10036 LINEAR B SYLLABLE B069 TU +10037 LINEAR B SYLLABLE B054 WA +10038 LINEAR B SYLLABLE B075 WE +10039 LINEAR B SYLLABLE B040 WI +1003A LINEAR B SYLLABLE B042 WO +1003C LINEAR B SYLLABLE B017 ZA +1003D LINEAR B SYLLABLE B074 ZE +1003F LINEAR B SYLLABLE B020 ZO +10040 LINEAR B SYLLABLE B025 A2 +10041 LINEAR B SYLLABLE B043 A3 +10042 LINEAR B SYLLABLE B085 AU +10043 LINEAR B SYLLABLE B071 DWE +10044 LINEAR B SYLLABLE B090 DWO +10045 LINEAR B SYLLABLE B048 NWA +10046 LINEAR B SYLLABLE B029 PU2 +10047 LINEAR B SYLLABLE B062 PTE +10048 LINEAR B SYLLABLE B076 RA2 +10049 LINEAR B SYLLABLE B033 RA3 +1004A LINEAR B SYLLABLE B068 RO2 +1004B LINEAR B SYLLABLE B066 TA2 +1004C LINEAR B SYLLABLE B087 TWE +1004D LINEAR B SYLLABLE B091 TWO +10050 LINEAR B SYMBOL B018 +10051 LINEAR B SYMBOL B019 +10052 LINEAR B SYMBOL B022 +10053 LINEAR B SYMBOL B034 +10054 LINEAR B SYMBOL B047 +10055 LINEAR B SYMBOL B049 +10056 LINEAR B SYMBOL B056 +10057 LINEAR B SYMBOL B063 +10058 LINEAR B SYMBOL B064 +10059 LINEAR B SYMBOL B079 +1005A LINEAR B SYMBOL B082 +1005B LINEAR B SYMBOL B083 +1005C LINEAR B SYMBOL B086 +1005D LINEAR B SYMBOL B089 +10080 LINEAR B IDEOGRAM B100 MAN +10081 LINEAR B IDEOGRAM B102 WOMAN +10082 LINEAR B IDEOGRAM B104 DEER +10083 LINEAR B IDEOGRAM B105 EQUID +10084 LINEAR B IDEOGRAM B105F MARE +10085 LINEAR B IDEOGRAM B105M STALLION +10086 LINEAR B IDEOGRAM B106F EWE +10087 LINEAR B IDEOGRAM B106M RAM +10088 LINEAR B IDEOGRAM B107F SHE-GOAT +10089 LINEAR B IDEOGRAM B107M HE-GOAT +1008A LINEAR B IDEOGRAM B108F SOW +1008B LINEAR B IDEOGRAM B108M BOAR +1008C LINEAR B IDEOGRAM B109F COW +1008D LINEAR B IDEOGRAM B109M BULL +1008E LINEAR B IDEOGRAM B120 WHEAT +1008F LINEAR B IDEOGRAM B121 BARLEY +10090 LINEAR B IDEOGRAM B122 OLIVE +10091 LINEAR B IDEOGRAM B123 SPICE +10092 LINEAR B IDEOGRAM B125 CYPERUS +10093 LINEAR B MONOGRAM B127 KAPO +10094 LINEAR B MONOGRAM B128 KANAKO +10095 LINEAR B IDEOGRAM B130 OIL +10096 LINEAR B IDEOGRAM B131 WINE +10097 LINEAR B IDEOGRAM B132 +10098 LINEAR B MONOGRAM B133 AREPA +10099 LINEAR B MONOGRAM B135 MERI +1009A LINEAR B IDEOGRAM B140 BRONZE +1009B LINEAR B IDEOGRAM B141 GOLD +1009C LINEAR B IDEOGRAM B142 +1009D LINEAR B IDEOGRAM B145 WOOL +1009E LINEAR B IDEOGRAM B146 +1009F LINEAR B IDEOGRAM B150 +100A0 LINEAR B IDEOGRAM B151 HORN +100A1 LINEAR B IDEOGRAM B152 +100A2 LINEAR B IDEOGRAM B153 +100A3 LINEAR B IDEOGRAM B154 +100A4 LINEAR B MONOGRAM B156 TURO2 +100A5 LINEAR B IDEOGRAM B157 +100A6 LINEAR B IDEOGRAM B158 +100A7 LINEAR B IDEOGRAM B159 CLOTH +100A8 LINEAR B IDEOGRAM B160 +100A9 LINEAR B IDEOGRAM B161 +100AA LINEAR B IDEOGRAM B162 GARMENT +100AB LINEAR B IDEOGRAM B163 ARMOUR +100AC LINEAR B IDEOGRAM B164 +100AD LINEAR B IDEOGRAM B165 +100AE LINEAR B IDEOGRAM B166 +100AF LINEAR B IDEOGRAM B167 +100B0 LINEAR B IDEOGRAM B168 +100B1 LINEAR B IDEOGRAM B169 +100B2 LINEAR B IDEOGRAM B170 +100B3 LINEAR B IDEOGRAM B171 +100B4 LINEAR B IDEOGRAM B172 +100B5 LINEAR B IDEOGRAM B173 MONTH +100B6 LINEAR B IDEOGRAM B174 +100B7 LINEAR B IDEOGRAM B176 TREE +100B8 LINEAR B IDEOGRAM B177 +100B9 LINEAR B IDEOGRAM B178 +100BA LINEAR B IDEOGRAM B179 +100BB LINEAR B IDEOGRAM B180 +100BC LINEAR B IDEOGRAM B181 +100BD LINEAR B IDEOGRAM B182 +100BE LINEAR B IDEOGRAM B183 +100BF LINEAR B IDEOGRAM B184 +100C0 LINEAR B IDEOGRAM B185 +100C1 LINEAR B IDEOGRAM B189 +100C2 LINEAR B IDEOGRAM B190 +100C3 LINEAR B IDEOGRAM B191 HELMET +100C4 LINEAR B IDEOGRAM B220 FOOTSTOOL +100C5 LINEAR B IDEOGRAM B225 BATHTUB +100C6 LINEAR B IDEOGRAM B230 SPEAR +100C7 LINEAR B IDEOGRAM B231 ARROW +100C8 LINEAR B IDEOGRAM B232 +100C9 LINEAR B IDEOGRAM B233 SWORD +100CA LINEAR B IDEOGRAM B234 +100CB LINEAR B IDEOGRAM B236 +100CC LINEAR B IDEOGRAM B240 WHEELED CHARIOT +100CD LINEAR B IDEOGRAM B241 CHARIOT +100CE LINEAR B IDEOGRAM B242 CHARIOT FRAME +100CF LINEAR B IDEOGRAM B243 WHEEL +100D0 LINEAR B IDEOGRAM B245 +100D1 LINEAR B IDEOGRAM B246 +100D2 LINEAR B MONOGRAM B247 DIPTE +100D3 LINEAR B IDEOGRAM B248 +100D4 LINEAR B IDEOGRAM B249 +100D5 LINEAR B IDEOGRAM B251 +100D6 LINEAR B IDEOGRAM B252 +100D7 LINEAR B IDEOGRAM B253 +100D8 LINEAR B IDEOGRAM B254 DART +100D9 LINEAR B IDEOGRAM B255 +100DA LINEAR B IDEOGRAM B256 +100DB LINEAR B IDEOGRAM B257 +100DC LINEAR B IDEOGRAM B258 +100DD LINEAR B IDEOGRAM B259 +100DE LINEAR B IDEOGRAM VESSEL B155 +100DF LINEAR B IDEOGRAM VESSEL B200 +100E0 LINEAR B IDEOGRAM VESSEL B201 +100E1 LINEAR B IDEOGRAM VESSEL B202 +100E2 LINEAR B IDEOGRAM VESSEL B203 +100E3 LINEAR B IDEOGRAM VESSEL B204 +100E4 LINEAR B IDEOGRAM VESSEL B205 +100E5 LINEAR B IDEOGRAM VESSEL B206 +100E6 LINEAR B IDEOGRAM VESSEL B207 +100E7 LINEAR B IDEOGRAM VESSEL B208 +100E8 LINEAR B IDEOGRAM VESSEL B209 +100E9 LINEAR B IDEOGRAM VESSEL B210 +100EA LINEAR B IDEOGRAM VESSEL B211 +100EB LINEAR B IDEOGRAM VESSEL B212 +100EC LINEAR B IDEOGRAM VESSEL B213 +100ED LINEAR B IDEOGRAM VESSEL B214 +100EE LINEAR B IDEOGRAM VESSEL B215 +100EF LINEAR B IDEOGRAM VESSEL B216 +100F0 LINEAR B IDEOGRAM VESSEL B217 +100F1 LINEAR B IDEOGRAM VESSEL B218 +100F2 LINEAR B IDEOGRAM VESSEL B219 +100F3 LINEAR B IDEOGRAM VESSEL B221 +100F4 LINEAR B IDEOGRAM VESSEL B222 +100F5 LINEAR B IDEOGRAM VESSEL B226 +100F6 LINEAR B IDEOGRAM VESSEL B227 +100F7 LINEAR B IDEOGRAM VESSEL B228 +100F8 LINEAR B IDEOGRAM VESSEL B229 +100F9 LINEAR B IDEOGRAM VESSEL B250 +100FA LINEAR B IDEOGRAM VESSEL B305 +10100 AEGEAN WORD SEPARATOR LINE +10101 AEGEAN WORD SEPARATOR DOT +10102 AEGEAN CHECK MARK +10107 AEGEAN NUMBER ONE +10108 AEGEAN NUMBER TWO +10109 AEGEAN NUMBER THREE +1010A AEGEAN NUMBER FOUR +1010B AEGEAN NUMBER FIVE +1010C AEGEAN NUMBER SIX +1010D AEGEAN NUMBER SEVEN +1010E AEGEAN NUMBER EIGHT +1010F AEGEAN NUMBER NINE +10110 AEGEAN NUMBER TEN +10111 AEGEAN NUMBER TWENTY +10112 AEGEAN NUMBER THIRTY +10113 AEGEAN NUMBER FORTY +10114 AEGEAN NUMBER FIFTY +10115 AEGEAN NUMBER SIXTY +10116 AEGEAN NUMBER SEVENTY +10117 AEGEAN NUMBER EIGHTY +10118 AEGEAN NUMBER NINETY +10119 AEGEAN NUMBER ONE HUNDRED +1011A AEGEAN NUMBER TWO HUNDRED +1011B AEGEAN NUMBER THREE HUNDRED +1011C AEGEAN NUMBER FOUR HUNDRED +1011D AEGEAN NUMBER FIVE HUNDRED +1011E AEGEAN NUMBER SIX HUNDRED +1011F AEGEAN NUMBER SEVEN HUNDRED +10120 AEGEAN NUMBER EIGHT HUNDRED +10121 AEGEAN NUMBER NINE HUNDRED +10122 AEGEAN NUMBER ONE THOUSAND +10123 AEGEAN NUMBER TWO THOUSAND +10124 AEGEAN NUMBER THREE THOUSAND +10125 AEGEAN NUMBER FOUR THOUSAND +10126 AEGEAN NUMBER FIVE THOUSAND +10127 AEGEAN NUMBER SIX THOUSAND +10128 AEGEAN NUMBER SEVEN THOUSAND +10129 AEGEAN NUMBER EIGHT THOUSAND +1012A AEGEAN NUMBER NINE THOUSAND +1012B AEGEAN NUMBER TEN THOUSAND +1012C AEGEAN NUMBER TWENTY THOUSAND +1012D AEGEAN NUMBER THIRTY THOUSAND +1012E AEGEAN NUMBER FORTY THOUSAND +1012F AEGEAN NUMBER FIFTY THOUSAND +10130 AEGEAN NUMBER SIXTY THOUSAND +10131 AEGEAN NUMBER SEVENTY THOUSAND +10132 AEGEAN NUMBER EIGHTY THOUSAND +10133 AEGEAN NUMBER NINETY THOUSAND +10137 AEGEAN WEIGHT BASE UNIT +10138 AEGEAN WEIGHT FIRST SUBUNIT +10139 AEGEAN WEIGHT SECOND SUBUNIT +1013A AEGEAN WEIGHT THIRD SUBUNIT +1013B AEGEAN WEIGHT FOURTH SUBUNIT +1013C AEGEAN DRY MEASURE FIRST SUBUNIT +1013D AEGEAN LIQUID MEASURE FIRST SUBUNIT +1013E AEGEAN MEASURE SECOND SUBUNIT +1013F AEGEAN MEASURE THIRD SUBUNIT +10140 GREEK ACROPHONIC ATTIC ONE QUARTER +10141 GREEK ACROPHONIC ATTIC ONE HALF +10142 GREEK ACROPHONIC ATTIC ONE DRACHMA +10143 GREEK ACROPHONIC ATTIC FIVE +10144 GREEK ACROPHONIC ATTIC FIFTY +10145 GREEK ACROPHONIC ATTIC FIVE HUNDRED +10146 GREEK ACROPHONIC ATTIC FIVE THOUSAND +10147 GREEK ACROPHONIC ATTIC FIFTY THOUSAND +10148 GREEK ACROPHONIC ATTIC FIVE TALENTS +10149 GREEK ACROPHONIC ATTIC TEN TALENTS +1014A GREEK ACROPHONIC ATTIC FIFTY TALENTS +1014B GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS +1014C GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS +1014D GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS +1014E GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS +1014F GREEK ACROPHONIC ATTIC FIVE STATERS +10150 GREEK ACROPHONIC ATTIC TEN STATERS +10151 GREEK ACROPHONIC ATTIC FIFTY STATERS +10152 GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS +10153 GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS +10154 GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS +10155 GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS +10156 GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS +10157 GREEK ACROPHONIC ATTIC TEN MNAS +10158 GREEK ACROPHONIC HERAEUM ONE PLETHRON +10159 GREEK ACROPHONIC THESPIAN ONE +1015A GREEK ACROPHONIC HERMIONIAN ONE +1015B GREEK ACROPHONIC EPIDAUREAN TWO +1015C GREEK ACROPHONIC THESPIAN TWO +1015D GREEK ACROPHONIC CYRENAIC TWO DRACHMAS +1015E GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS +1015F GREEK ACROPHONIC TROEZENIAN FIVE +10160 GREEK ACROPHONIC TROEZENIAN TEN +10161 GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM +10162 GREEK ACROPHONIC HERMIONIAN TEN +10163 GREEK ACROPHONIC MESSENIAN TEN +10164 GREEK ACROPHONIC THESPIAN TEN +10165 GREEK ACROPHONIC THESPIAN THIRTY +10166 GREEK ACROPHONIC TROEZENIAN FIFTY +10167 GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM +10168 GREEK ACROPHONIC HERMIONIAN FIFTY +10169 GREEK ACROPHONIC THESPIAN FIFTY +1016A GREEK ACROPHONIC THESPIAN ONE HUNDRED +1016B GREEK ACROPHONIC THESPIAN THREE HUNDRED +1016C GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED +1016D GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED +1016E GREEK ACROPHONIC THESPIAN FIVE HUNDRED +1016F GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED +10170 GREEK ACROPHONIC NAXIAN FIVE HUNDRED +10171 GREEK ACROPHONIC THESPIAN ONE THOUSAND +10172 GREEK ACROPHONIC THESPIAN FIVE THOUSAND +10173 GREEK ACROPHONIC DELPHIC FIVE MNAS +10174 GREEK ACROPHONIC STRATIAN FIFTY MNAS +10175 GREEK ONE HALF SIGN +10176 GREEK ONE HALF SIGN ALTERNATE FORM +10177 GREEK TWO THIRDS SIGN +10178 GREEK THREE QUARTERS SIGN +10179 GREEK YEAR SIGN +1017A GREEK TALENT SIGN +1017B GREEK DRACHMA SIGN +1017C GREEK OBOL SIGN +1017D GREEK TWO OBOLS SIGN +1017E GREEK THREE OBOLS SIGN +1017F GREEK FOUR OBOLS SIGN +10180 GREEK FIVE OBOLS SIGN +10181 GREEK METRETES SIGN +10182 GREEK KYATHOS BASE SIGN +10183 GREEK LITRA SIGN +10184 GREEK OUNKIA SIGN +10185 GREEK XESTES SIGN +10186 GREEK ARTABE SIGN +10187 GREEK AROURA SIGN +10188 GREEK GRAMMA SIGN +10189 GREEK TRYBLION BASE SIGN +1018A GREEK ZERO SIGN +10300 OLD ITALIC LETTER A +10301 OLD ITALIC LETTER BE +10302 OLD ITALIC LETTER KE +10303 OLD ITALIC LETTER DE +10304 OLD ITALIC LETTER E +10305 OLD ITALIC LETTER VE +10306 OLD ITALIC LETTER ZE +10307 OLD ITALIC LETTER HE +10308 OLD ITALIC LETTER THE +10309 OLD ITALIC LETTER I +1030A OLD ITALIC LETTER KA +1030B OLD ITALIC LETTER EL +1030C OLD ITALIC LETTER EM +1030D OLD ITALIC LETTER EN +1030E OLD ITALIC LETTER ESH +1030F OLD ITALIC LETTER O +10310 OLD ITALIC LETTER PE +10311 OLD ITALIC LETTER SHE +10312 OLD ITALIC LETTER KU +10313 OLD ITALIC LETTER ER +10314 OLD ITALIC LETTER ES +10315 OLD ITALIC LETTER TE +10316 OLD ITALIC LETTER U +10317 OLD ITALIC LETTER EKS +10318 OLD ITALIC LETTER PHE +10319 OLD ITALIC LETTER KHE +1031A OLD ITALIC LETTER EF +1031B OLD ITALIC LETTER ERS +1031C OLD ITALIC LETTER CHE +1031D OLD ITALIC LETTER II +1031E OLD ITALIC LETTER UU +10320 OLD ITALIC NUMERAL ONE +10321 OLD ITALIC NUMERAL FIVE +10322 OLD ITALIC NUMERAL TEN +10323 OLD ITALIC NUMERAL FIFTY +10330 GOTHIC LETTER AHSA +10331 GOTHIC LETTER BAIRKAN +10332 GOTHIC LETTER GIBA +10333 GOTHIC LETTER DAGS +10334 GOTHIC LETTER AIHVUS +10335 GOTHIC LETTER QAIRTHRA +10336 GOTHIC LETTER IUJA +10337 GOTHIC LETTER HAGL +10338 GOTHIC LETTER THIUTH +10339 GOTHIC LETTER EIS +1033A GOTHIC LETTER KUSMA +1033B GOTHIC LETTER LAGUS +1033C GOTHIC LETTER MANNA +1033D GOTHIC LETTER NAUTHS +1033E GOTHIC LETTER JER +1033F GOTHIC LETTER URUS +10340 GOTHIC LETTER PAIRTHRA +10341 GOTHIC LETTER NINETY +10342 GOTHIC LETTER RAIDA +10343 GOTHIC LETTER SAUIL +10344 GOTHIC LETTER TEIWS +10345 GOTHIC LETTER WINJA +10346 GOTHIC LETTER FAIHU +10347 GOTHIC LETTER IGGWS +10348 GOTHIC LETTER HWAIR +10349 GOTHIC LETTER OTHAL +1034A GOTHIC LETTER NINE HUNDRED +10380 UGARITIC LETTER ALPA +10381 UGARITIC LETTER BETA +10382 UGARITIC LETTER GAMLA +10383 UGARITIC LETTER KHA +10384 UGARITIC LETTER DELTA +10385 UGARITIC LETTER HO +10386 UGARITIC LETTER WO +10387 UGARITIC LETTER ZETA +10388 UGARITIC LETTER HOTA +10389 UGARITIC LETTER TET +1038A UGARITIC LETTER YOD +1038B UGARITIC LETTER KAF +1038C UGARITIC LETTER SHIN +1038D UGARITIC LETTER LAMDA +1038E UGARITIC LETTER MEM +1038F UGARITIC LETTER DHAL +10390 UGARITIC LETTER NUN +10391 UGARITIC LETTER ZU +10392 UGARITIC LETTER SAMKA +10393 UGARITIC LETTER AIN +10394 UGARITIC LETTER PU +10395 UGARITIC LETTER SADE +10396 UGARITIC LETTER QOPA +10397 UGARITIC LETTER RASHA +10398 UGARITIC LETTER THANNA +10399 UGARITIC LETTER GHAIN +1039A UGARITIC LETTER TO +1039B UGARITIC LETTER I +1039C UGARITIC LETTER U +1039D UGARITIC LETTER SSU +1039F UGARITIC WORD DIVIDER +103A0 OLD PERSIAN SIGN A +103A1 OLD PERSIAN SIGN I +103A2 OLD PERSIAN SIGN U +103A3 OLD PERSIAN SIGN KA +103A4 OLD PERSIAN SIGN KU +103A5 OLD PERSIAN SIGN GA +103A6 OLD PERSIAN SIGN GU +103A7 OLD PERSIAN SIGN XA +103A8 OLD PERSIAN SIGN CA +103A9 OLD PERSIAN SIGN JA +103AA OLD PERSIAN SIGN JI +103AB OLD PERSIAN SIGN TA +103AC OLD PERSIAN SIGN TU +103AD OLD PERSIAN SIGN DA +103AE OLD PERSIAN SIGN DI +103AF OLD PERSIAN SIGN DU +103B0 OLD PERSIAN SIGN THA +103B1 OLD PERSIAN SIGN PA +103B2 OLD PERSIAN SIGN BA +103B3 OLD PERSIAN SIGN FA +103B4 OLD PERSIAN SIGN NA +103B5 OLD PERSIAN SIGN NU +103B6 OLD PERSIAN SIGN MA +103B7 OLD PERSIAN SIGN MI +103B8 OLD PERSIAN SIGN MU +103B9 OLD PERSIAN SIGN YA +103BA OLD PERSIAN SIGN VA +103BB OLD PERSIAN SIGN VI +103BC OLD PERSIAN SIGN RA +103BD OLD PERSIAN SIGN RU +103BE OLD PERSIAN SIGN LA +103BF OLD PERSIAN SIGN SA +103C0 OLD PERSIAN SIGN ZA +103C1 OLD PERSIAN SIGN SHA +103C2 OLD PERSIAN SIGN SSA +103C3 OLD PERSIAN SIGN HA +103C8 OLD PERSIAN SIGN AURAMAZDAA +103C9 OLD PERSIAN SIGN AURAMAZDAA-2 +103CA OLD PERSIAN SIGN AURAMAZDAAHA +103CB OLD PERSIAN SIGN XSHAAYATHIYA +103CC OLD PERSIAN SIGN DAHYAAUSH +103CD OLD PERSIAN SIGN DAHYAAUSH-2 +103CE OLD PERSIAN SIGN BAGA +103CF OLD PERSIAN SIGN BUUMISH +103D0 OLD PERSIAN WORD DIVIDER +103D1 OLD PERSIAN NUMBER ONE +103D2 OLD PERSIAN NUMBER TWO +103D3 OLD PERSIAN NUMBER TEN +103D4 OLD PERSIAN NUMBER TWENTY +103D5 OLD PERSIAN NUMBER HUNDRED +10400 DESERET CAPITAL LETTER LONG I +10401 DESERET CAPITAL LETTER LONG E +10402 DESERET CAPITAL LETTER LONG A +10403 DESERET CAPITAL LETTER LONG AH +10404 DESERET CAPITAL LETTER LONG O +10405 DESERET CAPITAL LETTER LONG OO +10406 DESERET CAPITAL LETTER SHORT I +10407 DESERET CAPITAL LETTER SHORT E +10408 DESERET CAPITAL LETTER SHORT A +10409 DESERET CAPITAL LETTER SHORT AH +1040A DESERET CAPITAL LETTER SHORT O +1040B DESERET CAPITAL LETTER SHORT OO +1040C DESERET CAPITAL LETTER AY +1040D DESERET CAPITAL LETTER OW +1040E DESERET CAPITAL LETTER WU +1040F DESERET CAPITAL LETTER YEE +10410 DESERET CAPITAL LETTER H +10411 DESERET CAPITAL LETTER PEE +10412 DESERET CAPITAL LETTER BEE +10413 DESERET CAPITAL LETTER TEE +10414 DESERET CAPITAL LETTER DEE +10415 DESERET CAPITAL LETTER CHEE +10416 DESERET CAPITAL LETTER JEE +10417 DESERET CAPITAL LETTER KAY +10418 DESERET CAPITAL LETTER GAY +10419 DESERET CAPITAL LETTER EF +1041A DESERET CAPITAL LETTER VEE +1041B DESERET CAPITAL LETTER ETH +1041C DESERET CAPITAL LETTER THEE +1041D DESERET CAPITAL LETTER ES +1041E DESERET CAPITAL LETTER ZEE +1041F DESERET CAPITAL LETTER ESH +10420 DESERET CAPITAL LETTER ZHEE +10421 DESERET CAPITAL LETTER ER +10422 DESERET CAPITAL LETTER EL +10423 DESERET CAPITAL LETTER EM +10424 DESERET CAPITAL LETTER EN +10425 DESERET CAPITAL LETTER ENG +10426 DESERET CAPITAL LETTER OI +10427 DESERET CAPITAL LETTER EW +10428 DESERET SMALL LETTER LONG I +10429 DESERET SMALL LETTER LONG E +1042A DESERET SMALL LETTER LONG A +1042B DESERET SMALL LETTER LONG AH +1042C DESERET SMALL LETTER LONG O +1042D DESERET SMALL LETTER LONG OO +1042E DESERET SMALL LETTER SHORT I +1042F DESERET SMALL LETTER SHORT E +10430 DESERET SMALL LETTER SHORT A +10431 DESERET SMALL LETTER SHORT AH +10432 DESERET SMALL LETTER SHORT O +10433 DESERET SMALL LETTER SHORT OO +10434 DESERET SMALL LETTER AY +10435 DESERET SMALL LETTER OW +10436 DESERET SMALL LETTER WU +10437 DESERET SMALL LETTER YEE +10438 DESERET SMALL LETTER H +10439 DESERET SMALL LETTER PEE +1043A DESERET SMALL LETTER BEE +1043B DESERET SMALL LETTER TEE +1043C DESERET SMALL LETTER DEE +1043D DESERET SMALL LETTER CHEE +1043E DESERET SMALL LETTER JEE +1043F DESERET SMALL LETTER KAY +10440 DESERET SMALL LETTER GAY +10441 DESERET SMALL LETTER EF +10442 DESERET SMALL LETTER VEE +10443 DESERET SMALL LETTER ETH +10444 DESERET SMALL LETTER THEE +10445 DESERET SMALL LETTER ES +10446 DESERET SMALL LETTER ZEE +10447 DESERET SMALL LETTER ESH +10448 DESERET SMALL LETTER ZHEE +10449 DESERET SMALL LETTER ER +1044A DESERET SMALL LETTER EL +1044B DESERET SMALL LETTER EM +1044C DESERET SMALL LETTER EN +1044D DESERET SMALL LETTER ENG +1044E DESERET SMALL LETTER OI +1044F DESERET SMALL LETTER EW +10450 SHAVIAN LETTER PEEP +10451 SHAVIAN LETTER TOT +10452 SHAVIAN LETTER KICK +10453 SHAVIAN LETTER FEE +10454 SHAVIAN LETTER THIGH +10455 SHAVIAN LETTER SO +10456 SHAVIAN LETTER SURE +10457 SHAVIAN LETTER CHURCH +10458 SHAVIAN LETTER YEA +10459 SHAVIAN LETTER HUNG +1045A SHAVIAN LETTER BIB +1045B SHAVIAN LETTER DEAD +1045C SHAVIAN LETTER GAG +1045D SHAVIAN LETTER VOW +1045E SHAVIAN LETTER THEY +1045F SHAVIAN LETTER ZOO +10460 SHAVIAN LETTER MEASURE +10461 SHAVIAN LETTER JUDGE +10462 SHAVIAN LETTER WOE +10463 SHAVIAN LETTER HA-HA +10464 SHAVIAN LETTER LOLL +10465 SHAVIAN LETTER MIME +10466 SHAVIAN LETTER IF +10467 SHAVIAN LETTER EGG +10468 SHAVIAN LETTER ASH +10469 SHAVIAN LETTER ADO +1046A SHAVIAN LETTER ON +1046B SHAVIAN LETTER WOOL +1046C SHAVIAN LETTER OUT +1046D SHAVIAN LETTER AH +1046E SHAVIAN LETTER ROAR +1046F SHAVIAN LETTER NUN +10470 SHAVIAN LETTER EAT +10471 SHAVIAN LETTER AGE +10472 SHAVIAN LETTER ICE +10473 SHAVIAN LETTER UP +10474 SHAVIAN LETTER OAK +10475 SHAVIAN LETTER OOZE +10476 SHAVIAN LETTER OIL +10477 SHAVIAN LETTER AWE +10478 SHAVIAN LETTER ARE +10479 SHAVIAN LETTER OR +1047A SHAVIAN LETTER AIR +1047B SHAVIAN LETTER ERR +1047C SHAVIAN LETTER ARRAY +1047D SHAVIAN LETTER EAR +1047E SHAVIAN LETTER IAN +1047F SHAVIAN LETTER YEW +10480 OSMANYA LETTER ALEF +10481 OSMANYA LETTER BA +10482 OSMANYA LETTER TA +10483 OSMANYA LETTER JA +10484 OSMANYA LETTER XA +10485 OSMANYA LETTER KHA +10486 OSMANYA LETTER DEEL +10487 OSMANYA LETTER RA +10488 OSMANYA LETTER SA +10489 OSMANYA LETTER SHIIN +1048A OSMANYA LETTER DHA +1048B OSMANYA LETTER CAYN +1048C OSMANYA LETTER GA +1048D OSMANYA LETTER FA +1048E OSMANYA LETTER QAAF +1048F OSMANYA LETTER KAAF +10490 OSMANYA LETTER LAAN +10491 OSMANYA LETTER MIIN +10492 OSMANYA LETTER NUUN +10493 OSMANYA LETTER WAW +10494 OSMANYA LETTER HA +10495 OSMANYA LETTER YA +10496 OSMANYA LETTER A +10497 OSMANYA LETTER E +10498 OSMANYA LETTER I +10499 OSMANYA LETTER O +1049A OSMANYA LETTER U +1049B OSMANYA LETTER AA +1049C OSMANYA LETTER EE +1049D OSMANYA LETTER OO +104A0 OSMANYA DIGIT ZERO +104A1 OSMANYA DIGIT ONE +104A2 OSMANYA DIGIT TWO +104A3 OSMANYA DIGIT THREE +104A4 OSMANYA DIGIT FOUR +104A5 OSMANYA DIGIT FIVE +104A6 OSMANYA DIGIT SIX +104A7 OSMANYA DIGIT SEVEN +104A8 OSMANYA DIGIT EIGHT +104A9 OSMANYA DIGIT NINE +10800 CYPRIOT SYLLABLE A +10801 CYPRIOT SYLLABLE E +10802 CYPRIOT SYLLABLE I +10803 CYPRIOT SYLLABLE O +10804 CYPRIOT SYLLABLE U +10805 CYPRIOT SYLLABLE JA +10808 CYPRIOT SYLLABLE JO +1080A CYPRIOT SYLLABLE KA +1080B CYPRIOT SYLLABLE KE +1080C CYPRIOT SYLLABLE KI +1080D CYPRIOT SYLLABLE KO +1080E CYPRIOT SYLLABLE KU +1080F CYPRIOT SYLLABLE LA +10810 CYPRIOT SYLLABLE LE +10811 CYPRIOT SYLLABLE LI +10812 CYPRIOT SYLLABLE LO +10813 CYPRIOT SYLLABLE LU +10814 CYPRIOT SYLLABLE MA +10815 CYPRIOT SYLLABLE ME +10816 CYPRIOT SYLLABLE MI +10817 CYPRIOT SYLLABLE MO +10818 CYPRIOT SYLLABLE MU +10819 CYPRIOT SYLLABLE NA +1081A CYPRIOT SYLLABLE NE +1081B CYPRIOT SYLLABLE NI +1081C CYPRIOT SYLLABLE NO +1081D CYPRIOT SYLLABLE NU +1081E CYPRIOT SYLLABLE PA +1081F CYPRIOT SYLLABLE PE +10820 CYPRIOT SYLLABLE PI +10821 CYPRIOT SYLLABLE PO +10822 CYPRIOT SYLLABLE PU +10823 CYPRIOT SYLLABLE RA +10824 CYPRIOT SYLLABLE RE +10825 CYPRIOT SYLLABLE RI +10826 CYPRIOT SYLLABLE RO +10827 CYPRIOT SYLLABLE RU +10828 CYPRIOT SYLLABLE SA +10829 CYPRIOT SYLLABLE SE +1082A CYPRIOT SYLLABLE SI +1082B CYPRIOT SYLLABLE SO +1082C CYPRIOT SYLLABLE SU +1082D CYPRIOT SYLLABLE TA +1082E CYPRIOT SYLLABLE TE +1082F CYPRIOT SYLLABLE TI +10830 CYPRIOT SYLLABLE TO +10831 CYPRIOT SYLLABLE TU +10832 CYPRIOT SYLLABLE WA +10833 CYPRIOT SYLLABLE WE +10834 CYPRIOT SYLLABLE WI +10835 CYPRIOT SYLLABLE WO +10837 CYPRIOT SYLLABLE XA +10838 CYPRIOT SYLLABLE XE +1083C CYPRIOT SYLLABLE ZA +1083F CYPRIOT SYLLABLE ZO +10A00 KHAROSHTHI LETTER A +10A01 KHAROSHTHI VOWEL SIGN I +10A02 KHAROSHTHI VOWEL SIGN U +10A03 KHAROSHTHI VOWEL SIGN VOCALIC R +10A05 KHAROSHTHI VOWEL SIGN E +10A06 KHAROSHTHI VOWEL SIGN O +10A0C KHAROSHTHI VOWEL LENGTH MARK +10A0D KHAROSHTHI SIGN DOUBLE RING BELOW +10A0E KHAROSHTHI SIGN ANUSVARA +10A0F KHAROSHTHI SIGN VISARGA +10A10 KHAROSHTHI LETTER KA +10A11 KHAROSHTHI LETTER KHA +10A12 KHAROSHTHI LETTER GA +10A13 KHAROSHTHI LETTER GHA +10A15 KHAROSHTHI LETTER CA +10A16 KHAROSHTHI LETTER CHA +10A17 KHAROSHTHI LETTER JA +10A19 KHAROSHTHI LETTER NYA +10A1A KHAROSHTHI LETTER TTA +10A1B KHAROSHTHI LETTER TTHA +10A1C KHAROSHTHI LETTER DDA +10A1D KHAROSHTHI LETTER DDHA +10A1E KHAROSHTHI LETTER NNA +10A1F KHAROSHTHI LETTER TA +10A20 KHAROSHTHI LETTER THA +10A21 KHAROSHTHI LETTER DA +10A22 KHAROSHTHI LETTER DHA +10A23 KHAROSHTHI LETTER NA +10A24 KHAROSHTHI LETTER PA +10A25 KHAROSHTHI LETTER PHA +10A26 KHAROSHTHI LETTER BA +10A27 KHAROSHTHI LETTER BHA +10A28 KHAROSHTHI LETTER MA +10A29 KHAROSHTHI LETTER YA +10A2A KHAROSHTHI LETTER RA +10A2B KHAROSHTHI LETTER LA +10A2C KHAROSHTHI LETTER VA +10A2D KHAROSHTHI LETTER SHA +10A2E KHAROSHTHI LETTER SSA +10A2F KHAROSHTHI LETTER SA +10A30 KHAROSHTHI LETTER ZA +10A31 KHAROSHTHI LETTER HA +10A32 KHAROSHTHI LETTER KKA +10A33 KHAROSHTHI LETTER TTTHA +10A38 KHAROSHTHI SIGN BAR ABOVE +10A39 KHAROSHTHI SIGN CAUDA +10A3A KHAROSHTHI SIGN DOT BELOW +10A3F KHAROSHTHI VIRAMA +10A40 KHAROSHTHI DIGIT ONE +10A41 KHAROSHTHI DIGIT TWO +10A42 KHAROSHTHI DIGIT THREE +10A43 KHAROSHTHI DIGIT FOUR +10A44 KHAROSHTHI NUMBER TEN +10A45 KHAROSHTHI NUMBER TWENTY +10A46 KHAROSHTHI NUMBER ONE HUNDRED +10A47 KHAROSHTHI NUMBER ONE THOUSAND +10A50 KHAROSHTHI PUNCTUATION DOT +10A51 KHAROSHTHI PUNCTUATION SMALL CIRCLE +10A52 KHAROSHTHI PUNCTUATION CIRCLE +10A53 KHAROSHTHI PUNCTUATION CRESCENT BAR +10A54 KHAROSHTHI PUNCTUATION MANGALAM +10A55 KHAROSHTHI PUNCTUATION LOTUS +10A56 KHAROSHTHI PUNCTUATION DANDA +10A57 KHAROSHTHI PUNCTUATION DOUBLE DANDA +10A58 KHAROSHTHI PUNCTUATION LINES +1D000 BYZANTINE MUSICAL SYMBOL PSILI +1D001 BYZANTINE MUSICAL SYMBOL DASEIA +1D002 BYZANTINE MUSICAL SYMBOL PERISPOMENI +1D003 BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON +1D004 BYZANTINE MUSICAL SYMBOL OXEIA DIPLI +1D005 BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON +1D006 BYZANTINE MUSICAL SYMBOL VAREIA DIPLI +1D007 BYZANTINE MUSICAL SYMBOL KATHISTI +1D008 BYZANTINE MUSICAL SYMBOL SYRMATIKI +1D009 BYZANTINE MUSICAL SYMBOL PARAKLITIKI +1D00A BYZANTINE MUSICAL SYMBOL YPOKRISIS +1D00B BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI +1D00C BYZANTINE MUSICAL SYMBOL KREMASTI +1D00D BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON +1D00E BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON +1D00F BYZANTINE MUSICAL SYMBOL TELEIA +1D010 BYZANTINE MUSICAL SYMBOL KENTIMATA +1D011 BYZANTINE MUSICAL SYMBOL APOSTROFOS +1D012 BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI +1D013 BYZANTINE MUSICAL SYMBOL SYNEVMA +1D014 BYZANTINE MUSICAL SYMBOL THITA +1D015 BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION +1D016 BYZANTINE MUSICAL SYMBOL GORGON ARCHAION +1D017 BYZANTINE MUSICAL SYMBOL PSILON +1D018 BYZANTINE MUSICAL SYMBOL CHAMILON +1D019 BYZANTINE MUSICAL SYMBOL VATHY +1D01A BYZANTINE MUSICAL SYMBOL ISON ARCHAION +1D01B BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION +1D01C BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION +1D01D BYZANTINE MUSICAL SYMBOL SAXIMATA +1D01E BYZANTINE MUSICAL SYMBOL PARICHON +1D01F BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA +1D020 BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION +1D021 BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION +1D022 BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION +1D023 BYZANTINE MUSICAL SYMBOL APOTHEMA +1D024 BYZANTINE MUSICAL SYMBOL KLASMA +1D025 BYZANTINE MUSICAL SYMBOL REVMA +1D026 BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION +1D027 BYZANTINE MUSICAL SYMBOL TINAGMA +1D028 BYZANTINE MUSICAL SYMBOL ANATRICHISMA +1D029 BYZANTINE MUSICAL SYMBOL SEISMA +1D02A BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION +1D02B BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU +1D02C BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION +1D02D BYZANTINE MUSICAL SYMBOL THEMA +1D02E BYZANTINE MUSICAL SYMBOL LEMOI +1D02F BYZANTINE MUSICAL SYMBOL DYO +1D030 BYZANTINE MUSICAL SYMBOL TRIA +1D031 BYZANTINE MUSICAL SYMBOL TESSERA +1D032 BYZANTINE MUSICAL SYMBOL KRATIMATA +1D033 BYZANTINE MUSICAL SYMBOL APESO EXO NEO +1D034 BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION +1D035 BYZANTINE MUSICAL SYMBOL IMIFTHORA +1D036 BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION +1D037 BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON +1D038 BYZANTINE MUSICAL SYMBOL PELASTON +1D039 BYZANTINE MUSICAL SYMBOL PSIFISTON +1D03A BYZANTINE MUSICAL SYMBOL KONTEVMA +1D03B BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION +1D03C BYZANTINE MUSICAL SYMBOL RAPISMA +1D03D BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION +1D03E BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION +1D03F BYZANTINE MUSICAL SYMBOL ICHADIN +1D040 BYZANTINE MUSICAL SYMBOL NANA +1D041 BYZANTINE MUSICAL SYMBOL PETASMA +1D042 BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO +1D043 BYZANTINE MUSICAL SYMBOL TROMIKON ALLO +1D044 BYZANTINE MUSICAL SYMBOL STRAGGISMATA +1D045 BYZANTINE MUSICAL SYMBOL GRONTHISMATA +1D046 BYZANTINE MUSICAL SYMBOL ISON NEO +1D047 BYZANTINE MUSICAL SYMBOL OLIGON NEO +1D048 BYZANTINE MUSICAL SYMBOL OXEIA NEO +1D049 BYZANTINE MUSICAL SYMBOL PETASTI +1D04A BYZANTINE MUSICAL SYMBOL KOUFISMA +1D04B BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA +1D04C BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA +1D04D BYZANTINE MUSICAL SYMBOL PELASTON NEO +1D04E BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO +1D04F BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO +1D050 BYZANTINE MUSICAL SYMBOL YPSILI +1D051 BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO +1D052 BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO +1D053 BYZANTINE MUSICAL SYMBOL YPORROI +1D054 BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON +1D055 BYZANTINE MUSICAL SYMBOL ELAFRON +1D056 BYZANTINE MUSICAL SYMBOL CHAMILI +1D057 BYZANTINE MUSICAL SYMBOL MIKRON ISON +1D058 BYZANTINE MUSICAL SYMBOL VAREIA NEO +1D059 BYZANTINE MUSICAL SYMBOL PIASMA NEO +1D05A BYZANTINE MUSICAL SYMBOL PSIFISTON NEO +1D05B BYZANTINE MUSICAL SYMBOL OMALON +1D05C BYZANTINE MUSICAL SYMBOL ANTIKENOMA +1D05D BYZANTINE MUSICAL SYMBOL LYGISMA +1D05E BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO +1D05F BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO +1D060 BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA +1D061 BYZANTINE MUSICAL SYMBOL KYLISMA +1D062 BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA +1D063 BYZANTINE MUSICAL SYMBOL TROMIKON NEO +1D064 BYZANTINE MUSICAL SYMBOL EKSTREPTON +1D065 BYZANTINE MUSICAL SYMBOL SYNAGMA NEO +1D066 BYZANTINE MUSICAL SYMBOL SYRMA +1D067 BYZANTINE MUSICAL SYMBOL CHOREVMA NEO +1D068 BYZANTINE MUSICAL SYMBOL EPEGERMA +1D069 BYZANTINE MUSICAL SYMBOL SEISMA NEO +1D06A BYZANTINE MUSICAL SYMBOL XIRON KLASMA +1D06B BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON +1D06C BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA +1D06D BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA +1D06E BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA +1D06F BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA +1D070 BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA +1D071 BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA +1D072 BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON +1D073 BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON +1D074 BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON +1D075 BYZANTINE MUSICAL SYMBOL OYRANISMA NEO +1D076 BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO +1D077 BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO +1D078 BYZANTINE MUSICAL SYMBOL THEMA APLOUN +1D079 BYZANTINE MUSICAL SYMBOL THES KAI APOTHES +1D07A BYZANTINE MUSICAL SYMBOL KATAVASMA +1D07B BYZANTINE MUSICAL SYMBOL ENDOFONON +1D07C BYZANTINE MUSICAL SYMBOL YFEN KATO +1D07D BYZANTINE MUSICAL SYMBOL YFEN ANO +1D07E BYZANTINE MUSICAL SYMBOL STAVROS +1D07F BYZANTINE MUSICAL SYMBOL KLASMA ANO +1D080 BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION +1D081 BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION +1D082 BYZANTINE MUSICAL SYMBOL KRATIMA ALLO +1D083 BYZANTINE MUSICAL SYMBOL KRATIMA NEO +1D084 BYZANTINE MUSICAL SYMBOL APODERMA NEO +1D085 BYZANTINE MUSICAL SYMBOL APLI +1D086 BYZANTINE MUSICAL SYMBOL DIPLI +1D087 BYZANTINE MUSICAL SYMBOL TRIPLI +1D088 BYZANTINE MUSICAL SYMBOL TETRAPLI +1D089 BYZANTINE MUSICAL SYMBOL KORONIS +1D08A BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU +1D08B BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON +1D08C BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON +1D08D BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON +1D08E BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU +1D08F BYZANTINE MUSICAL SYMBOL GORGON NEO ANO +1D090 BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA +1D091 BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA +1D092 BYZANTINE MUSICAL SYMBOL DIGORGON +1D093 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO +1D094 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO +1D095 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA +1D096 BYZANTINE MUSICAL SYMBOL TRIGORGON +1D097 BYZANTINE MUSICAL SYMBOL ARGON +1D098 BYZANTINE MUSICAL SYMBOL IMIDIARGON +1D099 BYZANTINE MUSICAL SYMBOL DIARGON +1D09A BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI +1D09B BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI +1D09C BYZANTINE MUSICAL SYMBOL AGOGI ARGI +1D09D BYZANTINE MUSICAL SYMBOL AGOGI METRIA +1D09E BYZANTINE MUSICAL SYMBOL AGOGI MESI +1D09F BYZANTINE MUSICAL SYMBOL AGOGI GORGI +1D0A0 BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI +1D0A1 BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI +1D0A2 BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS +1D0A3 BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS +1D0A4 BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS +1D0A5 BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS +1D0A6 BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS +1D0A7 BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS +1D0A8 BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS +1D0A9 BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS +1D0AA BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS +1D0AB BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS +1D0AC BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS +1D0AD BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS +1D0AE BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS +1D0AF BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS +1D0B0 BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS +1D0B1 BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS +1D0B2 BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS +1D0B3 BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS +1D0B4 BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN +1D0B5 BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN +1D0B6 BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU +1D0B7 BYZANTINE MUSICAL SYMBOL IMIFONON +1D0B8 BYZANTINE MUSICAL SYMBOL IMIFTHORON +1D0B9 BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU +1D0BA BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA +1D0BB BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA +1D0BC BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS +1D0BD BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI +1D0BE BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI +1D0BF BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE +1D0C0 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO +1D0C1 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO +1D0C2 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO +1D0C3 BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS +1D0C4 BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS +1D0C5 BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS +1D0C6 BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI +1D0C7 BYZANTINE MUSICAL SYMBOL FTHORA NENANO +1D0C8 BYZANTINE MUSICAL SYMBOL CHROA ZYGOS +1D0C9 BYZANTINE MUSICAL SYMBOL CHROA KLITON +1D0CA BYZANTINE MUSICAL SYMBOL CHROA SPATHI +1D0CB BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION +1D0CC BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA +1D0CD BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION +1D0CE BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION +1D0CF BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION +1D0D0 BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA +1D0D1 BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA +1D0D2 BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA +1D0D3 BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA +1D0D4 BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA +1D0D5 BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA +1D0D6 BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA +1D0D7 BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA +1D0D8 BYZANTINE MUSICAL SYMBOL GENIKI DIESIS +1D0D9 BYZANTINE MUSICAL SYMBOL GENIKI YFESIS +1D0DA BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI +1D0DB BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI +1D0DC BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI +1D0DD BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS +1D0DE BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS +1D0DF BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU +1D0E0 BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU +1D0E1 BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU +1D0E2 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS +1D0E3 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU +1D0E4 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU +1D0E5 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU +1D0E6 BYZANTINE MUSICAL SYMBOL DIGRAMMA GG +1D0E7 BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU +1D0E8 BYZANTINE MUSICAL SYMBOL STIGMA +1D0E9 BYZANTINE MUSICAL SYMBOL ARKTIKO PA +1D0EA BYZANTINE MUSICAL SYMBOL ARKTIKO VOU +1D0EB BYZANTINE MUSICAL SYMBOL ARKTIKO GA +1D0EC BYZANTINE MUSICAL SYMBOL ARKTIKO DI +1D0ED BYZANTINE MUSICAL SYMBOL ARKTIKO KE +1D0EE BYZANTINE MUSICAL SYMBOL ARKTIKO ZO +1D0EF BYZANTINE MUSICAL SYMBOL ARKTIKO NI +1D0F0 BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO +1D0F1 BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO +1D0F2 BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO +1D0F3 BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO +1D0F4 BYZANTINE MUSICAL SYMBOL KLASMA KATO +1D0F5 BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100 MUSICAL SYMBOL SINGLE BARLINE +1D101 MUSICAL SYMBOL DOUBLE BARLINE +1D102 MUSICAL SYMBOL FINAL BARLINE +1D103 MUSICAL SYMBOL REVERSE FINAL BARLINE +1D104 MUSICAL SYMBOL DASHED BARLINE +1D105 MUSICAL SYMBOL SHORT BARLINE +1D106 MUSICAL SYMBOL LEFT REPEAT SIGN +1D107 MUSICAL SYMBOL RIGHT REPEAT SIGN +1D108 MUSICAL SYMBOL REPEAT DOTS +1D109 MUSICAL SYMBOL DAL SEGNO +1D10A MUSICAL SYMBOL DA CAPO +1D10B MUSICAL SYMBOL SEGNO +1D10C MUSICAL SYMBOL CODA +1D10D MUSICAL SYMBOL REPEATED FIGURE-1 +1D10E MUSICAL SYMBOL REPEATED FIGURE-2 +1D10F MUSICAL SYMBOL REPEATED FIGURE-3 +1D110 MUSICAL SYMBOL FERMATA +1D111 MUSICAL SYMBOL FERMATA BELOW +1D112 MUSICAL SYMBOL BREATH MARK +1D113 MUSICAL SYMBOL CAESURA +1D114 MUSICAL SYMBOL BRACE +1D115 MUSICAL SYMBOL BRACKET +1D116 MUSICAL SYMBOL ONE-LINE STAFF +1D117 MUSICAL SYMBOL TWO-LINE STAFF +1D118 MUSICAL SYMBOL THREE-LINE STAFF +1D119 MUSICAL SYMBOL FOUR-LINE STAFF +1D11A MUSICAL SYMBOL FIVE-LINE STAFF +1D11B MUSICAL SYMBOL SIX-LINE STAFF +1D11C MUSICAL SYMBOL SIX-STRING FRETBOARD +1D11D MUSICAL SYMBOL FOUR-STRING FRETBOARD +1D11E MUSICAL SYMBOL G CLEF +1D11F MUSICAL SYMBOL G CLEF OTTAVA ALTA +1D120 MUSICAL SYMBOL G CLEF OTTAVA BASSA +1D121 MUSICAL SYMBOL C CLEF +1D122 MUSICAL SYMBOL F CLEF +1D123 MUSICAL SYMBOL F CLEF OTTAVA ALTA +1D124 MUSICAL SYMBOL F CLEF OTTAVA BASSA +1D125 MUSICAL SYMBOL DRUM CLEF-1 +1D126 MUSICAL SYMBOL DRUM CLEF-2 +1D12A MUSICAL SYMBOL DOUBLE SHARP +1D12B MUSICAL SYMBOL DOUBLE FLAT +1D12C MUSICAL SYMBOL FLAT UP +1D12D MUSICAL SYMBOL FLAT DOWN +1D12E MUSICAL SYMBOL NATURAL UP +1D12F MUSICAL SYMBOL NATURAL DOWN +1D130 MUSICAL SYMBOL SHARP UP +1D131 MUSICAL SYMBOL SHARP DOWN +1D132 MUSICAL SYMBOL QUARTER TONE SHARP +1D133 MUSICAL SYMBOL QUARTER TONE FLAT +1D134 MUSICAL SYMBOL COMMON TIME +1D135 MUSICAL SYMBOL CUT TIME +1D136 MUSICAL SYMBOL OTTAVA ALTA +1D137 MUSICAL SYMBOL OTTAVA BASSA +1D138 MUSICAL SYMBOL QUINDICESIMA ALTA +1D139 MUSICAL SYMBOL QUINDICESIMA BASSA +1D13A MUSICAL SYMBOL MULTI REST +1D13B MUSICAL SYMBOL WHOLE REST +1D13C MUSICAL SYMBOL HALF REST +1D13D MUSICAL SYMBOL QUARTER REST +1D13E MUSICAL SYMBOL EIGHTH REST +1D13F MUSICAL SYMBOL SIXTEENTH REST +1D140 MUSICAL SYMBOL THIRTY-SECOND REST +1D141 MUSICAL SYMBOL SIXTY-FOURTH REST +1D142 MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST +1D143 MUSICAL SYMBOL X NOTEHEAD +1D144 MUSICAL SYMBOL PLUS NOTEHEAD +1D145 MUSICAL SYMBOL CIRCLE X NOTEHEAD +1D146 MUSICAL SYMBOL SQUARE NOTEHEAD WHITE +1D147 MUSICAL SYMBOL SQUARE NOTEHEAD BLACK +1D148 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE +1D149 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK +1D14A MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE +1D14B MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK +1D14C MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE +1D14D MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK +1D14E MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE +1D14F MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK +1D150 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE +1D151 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK +1D152 MUSICAL SYMBOL MOON NOTEHEAD WHITE +1D153 MUSICAL SYMBOL MOON NOTEHEAD BLACK +1D154 MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE +1D155 MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK +1D156 MUSICAL SYMBOL PARENTHESIS NOTEHEAD +1D157 MUSICAL SYMBOL VOID NOTEHEAD +1D158 MUSICAL SYMBOL NOTEHEAD BLACK +1D159 MUSICAL SYMBOL NULL NOTEHEAD +1D15A MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE +1D15B MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK +1D15C MUSICAL SYMBOL BREVE +1D15D MUSICAL SYMBOL WHOLE NOTE +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 +1D165 MUSICAL SYMBOL COMBINING STEM +1D166 MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D167 MUSICAL SYMBOL COMBINING TREMOLO-1 +1D168 MUSICAL SYMBOL COMBINING TREMOLO-2 +1D169 MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16A MUSICAL SYMBOL FINGERED TREMOLO-1 +1D16B MUSICAL SYMBOL FINGERED TREMOLO-2 +1D16C MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D MUSICAL SYMBOL COMBINING AUGMENTATION DOT +1D16E MUSICAL SYMBOL COMBINING FLAG-1 +1D16F MUSICAL SYMBOL COMBINING FLAG-2 +1D170 MUSICAL SYMBOL COMBINING FLAG-3 +1D171 MUSICAL SYMBOL COMBINING FLAG-4 +1D172 MUSICAL SYMBOL COMBINING FLAG-5 +1D173 MUSICAL SYMBOL BEGIN BEAM +1D174 MUSICAL SYMBOL END BEAM +1D175 MUSICAL SYMBOL BEGIN TIE +1D176 MUSICAL SYMBOL END TIE +1D177 MUSICAL SYMBOL BEGIN SLUR +1D178 MUSICAL SYMBOL END SLUR +1D179 MUSICAL SYMBOL BEGIN PHRASE +1D17A MUSICAL SYMBOL END PHRASE +1D17B MUSICAL SYMBOL COMBINING ACCENT +1D17C MUSICAL SYMBOL COMBINING STACCATO +1D17D MUSICAL SYMBOL COMBINING TENUTO +1D17E MUSICAL SYMBOL COMBINING STACCATISSIMO +1D17F MUSICAL SYMBOL COMBINING MARCATO +1D180 MUSICAL SYMBOL COMBINING MARCATO-STACCATO +1D181 MUSICAL SYMBOL COMBINING ACCENT-STACCATO +1D182 MUSICAL SYMBOL COMBINING LOURE +1D183 MUSICAL SYMBOL ARPEGGIATO UP +1D184 MUSICAL SYMBOL ARPEGGIATO DOWN +1D185 MUSICAL SYMBOL COMBINING DOIT +1D186 MUSICAL SYMBOL COMBINING RIP +1D187 MUSICAL SYMBOL COMBINING FLIP +1D188 MUSICAL SYMBOL COMBINING SMEAR +1D189 MUSICAL SYMBOL COMBINING BEND +1D18A MUSICAL SYMBOL COMBINING DOUBLE TONGUE +1D18B MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D18C MUSICAL SYMBOL RINFORZANDO +1D18D MUSICAL SYMBOL SUBITO +1D18E MUSICAL SYMBOL Z +1D18F MUSICAL SYMBOL PIANO +1D190 MUSICAL SYMBOL MEZZO +1D191 MUSICAL SYMBOL FORTE +1D192 MUSICAL SYMBOL CRESCENDO +1D193 MUSICAL SYMBOL DECRESCENDO +1D194 MUSICAL SYMBOL GRACE NOTE SLASH +1D195 MUSICAL SYMBOL GRACE NOTE NO SLASH +1D196 MUSICAL SYMBOL TR +1D197 MUSICAL SYMBOL TURN +1D198 MUSICAL SYMBOL INVERTED TURN +1D199 MUSICAL SYMBOL TURN SLASH +1D19A MUSICAL SYMBOL TURN UP +1D19B MUSICAL SYMBOL ORNAMENT STROKE-1 +1D19C MUSICAL SYMBOL ORNAMENT STROKE-2 +1D19D MUSICAL SYMBOL ORNAMENT STROKE-3 +1D19E MUSICAL SYMBOL ORNAMENT STROKE-4 +1D19F MUSICAL SYMBOL ORNAMENT STROKE-5 +1D1A0 MUSICAL SYMBOL ORNAMENT STROKE-6 +1D1A1 MUSICAL SYMBOL ORNAMENT STROKE-7 +1D1A2 MUSICAL SYMBOL ORNAMENT STROKE-8 +1D1A3 MUSICAL SYMBOL ORNAMENT STROKE-9 +1D1A4 MUSICAL SYMBOL ORNAMENT STROKE-10 +1D1A5 MUSICAL SYMBOL ORNAMENT STROKE-11 +1D1A6 MUSICAL SYMBOL HAUPTSTIMME +1D1A7 MUSICAL SYMBOL NEBENSTIMME +1D1A8 MUSICAL SYMBOL END OF STIMME +1D1A9 MUSICAL SYMBOL DEGREE SLASH +1D1AA MUSICAL SYMBOL COMBINING DOWN BOW +1D1AB MUSICAL SYMBOL COMBINING UP BOW +1D1AC MUSICAL SYMBOL COMBINING HARMONIC +1D1AD MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D1AE MUSICAL SYMBOL PEDAL MARK +1D1AF MUSICAL SYMBOL PEDAL UP MARK +1D1B0 MUSICAL SYMBOL HALF PEDAL MARK +1D1B1 MUSICAL SYMBOL GLISSANDO UP +1D1B2 MUSICAL SYMBOL GLISSANDO DOWN +1D1B3 MUSICAL SYMBOL WITH FINGERNAILS +1D1B4 MUSICAL SYMBOL DAMP +1D1B5 MUSICAL SYMBOL DAMP ALL +1D1B6 MUSICAL SYMBOL MAXIMA +1D1B7 MUSICAL SYMBOL LONGA +1D1B8 MUSICAL SYMBOL BREVIS +1D1B9 MUSICAL SYMBOL SEMIBREVIS WHITE +1D1BA MUSICAL SYMBOL SEMIBREVIS BLACK +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 +1D1C1 MUSICAL SYMBOL LONGA PERFECTA REST +1D1C2 MUSICAL SYMBOL LONGA IMPERFECTA REST +1D1C3 MUSICAL SYMBOL BREVIS REST +1D1C4 MUSICAL SYMBOL SEMIBREVIS REST +1D1C5 MUSICAL SYMBOL MINIMA REST +1D1C6 MUSICAL SYMBOL SEMIMINIMA REST +1D1C7 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA +1D1C8 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA +1D1C9 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1 +1D1CA MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA +1D1CB MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA +1D1CC MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1 +1D1CD MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2 +1D1CE MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3 +1D1CF MUSICAL SYMBOL CROIX +1D1D0 MUSICAL SYMBOL GREGORIAN C CLEF +1D1D1 MUSICAL SYMBOL GREGORIAN F CLEF +1D1D2 MUSICAL SYMBOL SQUARE B +1D1D3 MUSICAL SYMBOL VIRGA +1D1D4 MUSICAL SYMBOL PODATUS +1D1D5 MUSICAL SYMBOL CLIVIS +1D1D6 MUSICAL SYMBOL SCANDICUS +1D1D7 MUSICAL SYMBOL CLIMACUS +1D1D8 MUSICAL SYMBOL TORCULUS +1D1D9 MUSICAL SYMBOL PORRECTUS +1D1DA MUSICAL SYMBOL PORRECTUS FLEXUS +1D1DB MUSICAL SYMBOL SCANDICUS FLEXUS +1D1DC MUSICAL SYMBOL TORCULUS RESUPINUS +1D1DD MUSICAL SYMBOL PES SUBPUNCTIS +1D200 GREEK VOCAL NOTATION SYMBOL-1 +1D201 GREEK VOCAL NOTATION SYMBOL-2 +1D202 GREEK VOCAL NOTATION SYMBOL-3 +1D203 GREEK VOCAL NOTATION SYMBOL-4 +1D204 GREEK VOCAL NOTATION SYMBOL-5 +1D205 GREEK VOCAL NOTATION SYMBOL-6 +1D206 GREEK VOCAL NOTATION SYMBOL-7 +1D207 GREEK VOCAL NOTATION SYMBOL-8 +1D208 GREEK VOCAL NOTATION SYMBOL-9 +1D209 GREEK VOCAL NOTATION SYMBOL-10 +1D20A GREEK VOCAL NOTATION SYMBOL-11 +1D20B GREEK VOCAL NOTATION SYMBOL-12 +1D20C GREEK VOCAL NOTATION SYMBOL-13 +1D20D GREEK VOCAL NOTATION SYMBOL-14 +1D20E GREEK VOCAL NOTATION SYMBOL-15 +1D20F GREEK VOCAL NOTATION SYMBOL-16 +1D210 GREEK VOCAL NOTATION SYMBOL-17 +1D211 GREEK VOCAL NOTATION SYMBOL-18 +1D212 GREEK VOCAL NOTATION SYMBOL-19 +1D213 GREEK VOCAL NOTATION SYMBOL-20 +1D214 GREEK VOCAL NOTATION SYMBOL-21 +1D215 GREEK VOCAL NOTATION SYMBOL-22 +1D216 GREEK VOCAL NOTATION SYMBOL-23 +1D217 GREEK VOCAL NOTATION SYMBOL-24 +1D218 GREEK VOCAL NOTATION SYMBOL-50 +1D219 GREEK VOCAL NOTATION SYMBOL-51 +1D21A GREEK VOCAL NOTATION SYMBOL-52 +1D21B GREEK VOCAL NOTATION SYMBOL-53 +1D21C GREEK VOCAL NOTATION SYMBOL-54 +1D21D GREEK INSTRUMENTAL NOTATION SYMBOL-1 +1D21E GREEK INSTRUMENTAL NOTATION SYMBOL-2 +1D21F GREEK INSTRUMENTAL NOTATION SYMBOL-4 +1D220 GREEK INSTRUMENTAL NOTATION SYMBOL-5 +1D221 GREEK INSTRUMENTAL NOTATION SYMBOL-7 +1D222 GREEK INSTRUMENTAL NOTATION SYMBOL-8 +1D223 GREEK INSTRUMENTAL NOTATION SYMBOL-11 +1D224 GREEK INSTRUMENTAL NOTATION SYMBOL-12 +1D225 GREEK INSTRUMENTAL NOTATION SYMBOL-13 +1D226 GREEK INSTRUMENTAL NOTATION SYMBOL-14 +1D227 GREEK INSTRUMENTAL NOTATION SYMBOL-17 +1D228 GREEK INSTRUMENTAL NOTATION SYMBOL-18 +1D229 GREEK INSTRUMENTAL NOTATION SYMBOL-19 +1D22A GREEK INSTRUMENTAL NOTATION SYMBOL-23 +1D22B GREEK INSTRUMENTAL NOTATION SYMBOL-24 +1D22C GREEK INSTRUMENTAL NOTATION SYMBOL-25 +1D22D GREEK INSTRUMENTAL NOTATION SYMBOL-26 +1D22E GREEK INSTRUMENTAL NOTATION SYMBOL-27 +1D22F GREEK INSTRUMENTAL NOTATION SYMBOL-29 +1D230 GREEK INSTRUMENTAL NOTATION SYMBOL-30 +1D231 GREEK INSTRUMENTAL NOTATION SYMBOL-32 +1D232 GREEK INSTRUMENTAL NOTATION SYMBOL-36 +1D233 GREEK INSTRUMENTAL NOTATION SYMBOL-37 +1D234 GREEK INSTRUMENTAL NOTATION SYMBOL-38 +1D235 GREEK INSTRUMENTAL NOTATION SYMBOL-39 +1D236 GREEK INSTRUMENTAL NOTATION SYMBOL-40 +1D237 GREEK INSTRUMENTAL NOTATION SYMBOL-42 +1D238 GREEK INSTRUMENTAL NOTATION SYMBOL-43 +1D239 GREEK INSTRUMENTAL NOTATION SYMBOL-45 +1D23A GREEK INSTRUMENTAL NOTATION SYMBOL-47 +1D23B GREEK INSTRUMENTAL NOTATION SYMBOL-48 +1D23C GREEK INSTRUMENTAL NOTATION SYMBOL-49 +1D23D GREEK INSTRUMENTAL NOTATION SYMBOL-50 +1D23E GREEK INSTRUMENTAL NOTATION SYMBOL-51 +1D23F GREEK INSTRUMENTAL NOTATION SYMBOL-52 +1D240 GREEK INSTRUMENTAL NOTATION SYMBOL-53 +1D241 GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D242 COMBINING GREEK MUSICAL TRISEME +1D243 COMBINING GREEK MUSICAL TETRASEME +1D244 COMBINING GREEK MUSICAL PENTASEME +1D245 GREEK MUSICAL LEIMMA +1D300 MONOGRAM FOR EARTH +1D301 DIGRAM FOR HEAVENLY EARTH +1D302 DIGRAM FOR HUMAN EARTH +1D303 DIGRAM FOR EARTHLY HEAVEN +1D304 DIGRAM FOR EARTHLY HUMAN +1D305 DIGRAM FOR EARTH +1D306 TETRAGRAM FOR CENTRE +1D307 TETRAGRAM FOR FULL CIRCLE +1D308 TETRAGRAM FOR MIRED +1D309 TETRAGRAM FOR BARRIER +1D30A TETRAGRAM FOR KEEPING SMALL +1D30B TETRAGRAM FOR CONTRARIETY +1D30C TETRAGRAM FOR ASCENT +1D30D TETRAGRAM FOR OPPOSITION +1D30E TETRAGRAM FOR BRANCHING OUT +1D30F TETRAGRAM FOR DEFECTIVENESS OR DISTORTION +1D310 TETRAGRAM FOR DIVERGENCE +1D311 TETRAGRAM FOR YOUTHFULNESS +1D312 TETRAGRAM FOR INCREASE +1D313 TETRAGRAM FOR PENETRATION +1D314 TETRAGRAM FOR REACH +1D315 TETRAGRAM FOR CONTACT +1D316 TETRAGRAM FOR HOLDING BACK +1D317 TETRAGRAM FOR WAITING +1D318 TETRAGRAM FOR FOLLOWING +1D319 TETRAGRAM FOR ADVANCE +1D31A TETRAGRAM FOR RELEASE +1D31B TETRAGRAM FOR RESISTANCE +1D31C TETRAGRAM FOR EASE +1D31D TETRAGRAM FOR JOY +1D31E TETRAGRAM FOR CONTENTION +1D31F TETRAGRAM FOR ENDEAVOUR +1D320 TETRAGRAM FOR DUTIES +1D321 TETRAGRAM FOR CHANGE +1D322 TETRAGRAM FOR DECISIVENESS +1D323 TETRAGRAM FOR BOLD RESOLUTION +1D324 TETRAGRAM FOR PACKING +1D325 TETRAGRAM FOR LEGION +1D326 TETRAGRAM FOR CLOSENESS +1D327 TETRAGRAM FOR KINSHIP +1D328 TETRAGRAM FOR GATHERING +1D329 TETRAGRAM FOR STRENGTH +1D32A TETRAGRAM FOR PURITY +1D32B TETRAGRAM FOR FULLNESS +1D32C TETRAGRAM FOR RESIDENCE +1D32D TETRAGRAM FOR LAW OR MODEL +1D32E TETRAGRAM FOR RESPONSE +1D32F TETRAGRAM FOR GOING TO MEET +1D330 TETRAGRAM FOR ENCOUNTERS +1D331 TETRAGRAM FOR STOVE +1D332 TETRAGRAM FOR GREATNESS +1D333 TETRAGRAM FOR ENLARGEMENT +1D334 TETRAGRAM FOR PATTERN +1D335 TETRAGRAM FOR RITUAL +1D336 TETRAGRAM FOR FLIGHT +1D337 TETRAGRAM FOR VASTNESS OR WASTING +1D338 TETRAGRAM FOR CONSTANCY +1D339 TETRAGRAM FOR MEASURE +1D33A TETRAGRAM FOR ETERNITY +1D33B TETRAGRAM FOR UNITY +1D33C TETRAGRAM FOR DIMINISHMENT +1D33D TETRAGRAM FOR CLOSED MOUTH +1D33E TETRAGRAM FOR GUARDEDNESS +1D33F TETRAGRAM FOR GATHERING IN +1D340 TETRAGRAM FOR MASSING +1D341 TETRAGRAM FOR ACCUMULATION +1D342 TETRAGRAM FOR EMBELLISHMENT +1D343 TETRAGRAM FOR DOUBT +1D344 TETRAGRAM FOR WATCH +1D345 TETRAGRAM FOR SINKING +1D346 TETRAGRAM FOR INNER +1D347 TETRAGRAM FOR DEPARTURE +1D348 TETRAGRAM FOR DARKENING +1D349 TETRAGRAM FOR DIMMING +1D34A TETRAGRAM FOR EXHAUSTION +1D34B TETRAGRAM FOR SEVERANCE +1D34C TETRAGRAM FOR STOPPAGE +1D34D TETRAGRAM FOR HARDNESS +1D34E TETRAGRAM FOR COMPLETION +1D34F TETRAGRAM FOR CLOSURE +1D350 TETRAGRAM FOR FAILURE +1D351 TETRAGRAM FOR AGGRAVATION +1D352 TETRAGRAM FOR COMPLIANCE +1D353 TETRAGRAM FOR ON THE VERGE +1D354 TETRAGRAM FOR DIFFICULTIES +1D355 TETRAGRAM FOR LABOURING +1D356 TETRAGRAM FOR FOSTERING +1D400 MATHEMATICAL BOLD CAPITAL A +1D401 MATHEMATICAL BOLD CAPITAL B +1D402 MATHEMATICAL BOLD CAPITAL C +1D403 MATHEMATICAL BOLD CAPITAL D +1D404 MATHEMATICAL BOLD CAPITAL E +1D405 MATHEMATICAL BOLD CAPITAL F +1D406 MATHEMATICAL BOLD CAPITAL G +1D407 MATHEMATICAL BOLD CAPITAL H +1D408 MATHEMATICAL BOLD CAPITAL I +1D409 MATHEMATICAL BOLD CAPITAL J +1D40A MATHEMATICAL BOLD CAPITAL K +1D40B MATHEMATICAL BOLD CAPITAL L +1D40C MATHEMATICAL BOLD CAPITAL M +1D40D MATHEMATICAL BOLD CAPITAL N +1D40E MATHEMATICAL BOLD CAPITAL O +1D40F MATHEMATICAL BOLD CAPITAL P +1D410 MATHEMATICAL BOLD CAPITAL Q +1D411 MATHEMATICAL BOLD CAPITAL R +1D412 MATHEMATICAL BOLD CAPITAL S +1D413 MATHEMATICAL BOLD CAPITAL T +1D414 MATHEMATICAL BOLD CAPITAL U +1D415 MATHEMATICAL BOLD CAPITAL V +1D416 MATHEMATICAL BOLD CAPITAL W +1D417 MATHEMATICAL BOLD CAPITAL X +1D418 MATHEMATICAL BOLD CAPITAL Y +1D419 MATHEMATICAL BOLD CAPITAL Z +1D41A MATHEMATICAL BOLD SMALL A +1D41B MATHEMATICAL BOLD SMALL B +1D41C MATHEMATICAL BOLD SMALL C +1D41D MATHEMATICAL BOLD SMALL D +1D41E MATHEMATICAL BOLD SMALL E +1D41F MATHEMATICAL BOLD SMALL F +1D420 MATHEMATICAL BOLD SMALL G +1D421 MATHEMATICAL BOLD SMALL H +1D422 MATHEMATICAL BOLD SMALL I +1D423 MATHEMATICAL BOLD SMALL J +1D424 MATHEMATICAL BOLD SMALL K +1D425 MATHEMATICAL BOLD SMALL L +1D426 MATHEMATICAL BOLD SMALL M +1D427 MATHEMATICAL BOLD SMALL N +1D428 MATHEMATICAL BOLD SMALL O +1D429 MATHEMATICAL BOLD SMALL P +1D42A MATHEMATICAL BOLD SMALL Q +1D42B MATHEMATICAL BOLD SMALL R +1D42C MATHEMATICAL BOLD SMALL S +1D42D MATHEMATICAL BOLD SMALL T +1D42E MATHEMATICAL BOLD SMALL U +1D42F MATHEMATICAL BOLD SMALL V +1D430 MATHEMATICAL BOLD SMALL W +1D431 MATHEMATICAL BOLD SMALL X +1D432 MATHEMATICAL BOLD SMALL Y +1D433 MATHEMATICAL BOLD SMALL Z +1D434 MATHEMATICAL ITALIC CAPITAL A +1D435 MATHEMATICAL ITALIC CAPITAL B +1D436 MATHEMATICAL ITALIC CAPITAL C +1D437 MATHEMATICAL ITALIC CAPITAL D +1D438 MATHEMATICAL ITALIC CAPITAL E +1D439 MATHEMATICAL ITALIC CAPITAL F +1D43A MATHEMATICAL ITALIC CAPITAL G +1D43B MATHEMATICAL ITALIC CAPITAL H +1D43C MATHEMATICAL ITALIC CAPITAL I +1D43D MATHEMATICAL ITALIC CAPITAL J +1D43E MATHEMATICAL ITALIC CAPITAL K +1D43F MATHEMATICAL ITALIC CAPITAL L +1D440 MATHEMATICAL ITALIC CAPITAL M +1D441 MATHEMATICAL ITALIC CAPITAL N +1D442 MATHEMATICAL ITALIC CAPITAL O +1D443 MATHEMATICAL ITALIC CAPITAL P +1D444 MATHEMATICAL ITALIC CAPITAL Q +1D445 MATHEMATICAL ITALIC CAPITAL R +1D446 MATHEMATICAL ITALIC CAPITAL S +1D447 MATHEMATICAL ITALIC CAPITAL T +1D448 MATHEMATICAL ITALIC CAPITAL U +1D449 MATHEMATICAL ITALIC CAPITAL V +1D44A MATHEMATICAL ITALIC CAPITAL W +1D44B MATHEMATICAL ITALIC CAPITAL X +1D44C MATHEMATICAL ITALIC CAPITAL Y +1D44D MATHEMATICAL ITALIC CAPITAL Z +1D44E MATHEMATICAL ITALIC SMALL A +1D44F MATHEMATICAL ITALIC SMALL B +1D450 MATHEMATICAL ITALIC SMALL C +1D451 MATHEMATICAL ITALIC SMALL D +1D452 MATHEMATICAL ITALIC SMALL E +1D453 MATHEMATICAL ITALIC SMALL F +1D454 MATHEMATICAL ITALIC SMALL G +1D456 MATHEMATICAL ITALIC SMALL I +1D457 MATHEMATICAL ITALIC SMALL J +1D458 MATHEMATICAL ITALIC SMALL K +1D459 MATHEMATICAL ITALIC SMALL L +1D45A MATHEMATICAL ITALIC SMALL M +1D45B MATHEMATICAL ITALIC SMALL N +1D45C MATHEMATICAL ITALIC SMALL O +1D45D MATHEMATICAL ITALIC SMALL P +1D45E MATHEMATICAL ITALIC SMALL Q +1D45F MATHEMATICAL ITALIC SMALL R +1D460 MATHEMATICAL ITALIC SMALL S +1D461 MATHEMATICAL ITALIC SMALL T +1D462 MATHEMATICAL ITALIC SMALL U +1D463 MATHEMATICAL ITALIC SMALL V +1D464 MATHEMATICAL ITALIC SMALL W +1D465 MATHEMATICAL ITALIC SMALL X +1D466 MATHEMATICAL ITALIC SMALL Y +1D467 MATHEMATICAL ITALIC SMALL Z +1D468 MATHEMATICAL BOLD ITALIC CAPITAL A +1D469 MATHEMATICAL BOLD ITALIC CAPITAL B +1D46A MATHEMATICAL BOLD ITALIC CAPITAL C +1D46B MATHEMATICAL BOLD ITALIC CAPITAL D +1D46C MATHEMATICAL BOLD ITALIC CAPITAL E +1D46D MATHEMATICAL BOLD ITALIC CAPITAL F +1D46E MATHEMATICAL BOLD ITALIC CAPITAL G +1D46F MATHEMATICAL BOLD ITALIC CAPITAL H +1D470 MATHEMATICAL BOLD ITALIC CAPITAL I +1D471 MATHEMATICAL BOLD ITALIC CAPITAL J +1D472 MATHEMATICAL BOLD ITALIC CAPITAL K +1D473 MATHEMATICAL BOLD ITALIC CAPITAL L +1D474 MATHEMATICAL BOLD ITALIC CAPITAL M +1D475 MATHEMATICAL BOLD ITALIC CAPITAL N +1D476 MATHEMATICAL BOLD ITALIC CAPITAL O +1D477 MATHEMATICAL BOLD ITALIC CAPITAL P +1D478 MATHEMATICAL BOLD ITALIC CAPITAL Q +1D479 MATHEMATICAL BOLD ITALIC CAPITAL R +1D47A MATHEMATICAL BOLD ITALIC CAPITAL S +1D47B MATHEMATICAL BOLD ITALIC CAPITAL T +1D47C MATHEMATICAL BOLD ITALIC CAPITAL U +1D47D MATHEMATICAL BOLD ITALIC CAPITAL V +1D47E MATHEMATICAL BOLD ITALIC CAPITAL W +1D47F MATHEMATICAL BOLD ITALIC CAPITAL X +1D480 MATHEMATICAL BOLD ITALIC CAPITAL Y +1D481 MATHEMATICAL BOLD ITALIC CAPITAL Z +1D482 MATHEMATICAL BOLD ITALIC SMALL A +1D483 MATHEMATICAL BOLD ITALIC SMALL B +1D484 MATHEMATICAL BOLD ITALIC SMALL C +1D485 MATHEMATICAL BOLD ITALIC SMALL D +1D486 MATHEMATICAL BOLD ITALIC SMALL E +1D487 MATHEMATICAL BOLD ITALIC SMALL F +1D488 MATHEMATICAL BOLD ITALIC SMALL G +1D489 MATHEMATICAL BOLD ITALIC SMALL H +1D48A MATHEMATICAL BOLD ITALIC SMALL I +1D48B MATHEMATICAL BOLD ITALIC SMALL J +1D48C MATHEMATICAL BOLD ITALIC SMALL K +1D48D MATHEMATICAL BOLD ITALIC SMALL L +1D48E MATHEMATICAL BOLD ITALIC SMALL M +1D48F MATHEMATICAL BOLD ITALIC SMALL N +1D490 MATHEMATICAL BOLD ITALIC SMALL O +1D491 MATHEMATICAL BOLD ITALIC SMALL P +1D492 MATHEMATICAL BOLD ITALIC SMALL Q +1D493 MATHEMATICAL BOLD ITALIC SMALL R +1D494 MATHEMATICAL BOLD ITALIC SMALL S +1D495 MATHEMATICAL BOLD ITALIC SMALL T +1D496 MATHEMATICAL BOLD ITALIC SMALL U +1D497 MATHEMATICAL BOLD ITALIC SMALL V +1D498 MATHEMATICAL BOLD ITALIC SMALL W +1D499 MATHEMATICAL BOLD ITALIC SMALL X +1D49A MATHEMATICAL BOLD ITALIC SMALL Y +1D49B MATHEMATICAL BOLD ITALIC SMALL Z +1D49C MATHEMATICAL SCRIPT CAPITAL A +1D49E MATHEMATICAL SCRIPT CAPITAL C +1D49F MATHEMATICAL SCRIPT CAPITAL D +1D4A2 MATHEMATICAL SCRIPT CAPITAL G +1D4A5 MATHEMATICAL SCRIPT CAPITAL J +1D4A6 MATHEMATICAL SCRIPT CAPITAL K +1D4A9 MATHEMATICAL SCRIPT CAPITAL N +1D4AA MATHEMATICAL SCRIPT CAPITAL O +1D4AB MATHEMATICAL SCRIPT CAPITAL P +1D4AC MATHEMATICAL SCRIPT CAPITAL Q +1D4AE MATHEMATICAL SCRIPT CAPITAL S +1D4AF MATHEMATICAL SCRIPT CAPITAL T +1D4B0 MATHEMATICAL SCRIPT CAPITAL U +1D4B1 MATHEMATICAL SCRIPT CAPITAL V +1D4B2 MATHEMATICAL SCRIPT CAPITAL W +1D4B3 MATHEMATICAL SCRIPT CAPITAL X +1D4B4 MATHEMATICAL SCRIPT CAPITAL Y +1D4B5 MATHEMATICAL SCRIPT CAPITAL Z +1D4B6 MATHEMATICAL SCRIPT SMALL A +1D4B7 MATHEMATICAL SCRIPT SMALL B +1D4B8 MATHEMATICAL SCRIPT SMALL C +1D4B9 MATHEMATICAL SCRIPT SMALL D +1D4BB MATHEMATICAL SCRIPT SMALL F +1D4BD MATHEMATICAL SCRIPT SMALL H +1D4BE MATHEMATICAL SCRIPT SMALL I +1D4BF MATHEMATICAL SCRIPT SMALL J +1D4C0 MATHEMATICAL SCRIPT SMALL K +1D4C1 MATHEMATICAL SCRIPT SMALL L +1D4C2 MATHEMATICAL SCRIPT SMALL M +1D4C3 MATHEMATICAL SCRIPT SMALL N +1D4C5 MATHEMATICAL SCRIPT SMALL P +1D4C6 MATHEMATICAL SCRIPT SMALL Q +1D4C7 MATHEMATICAL SCRIPT SMALL R +1D4C8 MATHEMATICAL SCRIPT SMALL S +1D4C9 MATHEMATICAL SCRIPT SMALL T +1D4CA MATHEMATICAL SCRIPT SMALL U +1D4CB MATHEMATICAL SCRIPT SMALL V +1D4CC MATHEMATICAL SCRIPT SMALL W +1D4CD MATHEMATICAL SCRIPT SMALL X +1D4CE MATHEMATICAL SCRIPT SMALL Y +1D4CF MATHEMATICAL SCRIPT SMALL Z +1D4D0 MATHEMATICAL BOLD SCRIPT CAPITAL A +1D4D1 MATHEMATICAL BOLD SCRIPT CAPITAL B +1D4D2 MATHEMATICAL BOLD SCRIPT CAPITAL C +1D4D3 MATHEMATICAL BOLD SCRIPT CAPITAL D +1D4D4 MATHEMATICAL BOLD SCRIPT CAPITAL E +1D4D5 MATHEMATICAL BOLD SCRIPT CAPITAL F +1D4D6 MATHEMATICAL BOLD SCRIPT CAPITAL G +1D4D7 MATHEMATICAL BOLD SCRIPT CAPITAL H +1D4D8 MATHEMATICAL BOLD SCRIPT CAPITAL I +1D4D9 MATHEMATICAL BOLD SCRIPT CAPITAL J +1D4DA MATHEMATICAL BOLD SCRIPT CAPITAL K +1D4DB MATHEMATICAL BOLD SCRIPT CAPITAL L +1D4DC MATHEMATICAL BOLD SCRIPT CAPITAL M +1D4DD MATHEMATICAL BOLD SCRIPT CAPITAL N +1D4DE MATHEMATICAL BOLD SCRIPT CAPITAL O +1D4DF MATHEMATICAL BOLD SCRIPT CAPITAL P +1D4E0 MATHEMATICAL BOLD SCRIPT CAPITAL Q +1D4E1 MATHEMATICAL BOLD SCRIPT CAPITAL R +1D4E2 MATHEMATICAL BOLD SCRIPT CAPITAL S +1D4E3 MATHEMATICAL BOLD SCRIPT CAPITAL T +1D4E4 MATHEMATICAL BOLD SCRIPT CAPITAL U +1D4E5 MATHEMATICAL BOLD SCRIPT CAPITAL V +1D4E6 MATHEMATICAL BOLD SCRIPT CAPITAL W +1D4E7 MATHEMATICAL BOLD SCRIPT CAPITAL X +1D4E8 MATHEMATICAL BOLD SCRIPT CAPITAL Y +1D4E9 MATHEMATICAL BOLD SCRIPT CAPITAL Z +1D4EA MATHEMATICAL BOLD SCRIPT SMALL A +1D4EB MATHEMATICAL BOLD SCRIPT SMALL B +1D4EC MATHEMATICAL BOLD SCRIPT SMALL C +1D4ED MATHEMATICAL BOLD SCRIPT SMALL D +1D4EE MATHEMATICAL BOLD SCRIPT SMALL E +1D4EF MATHEMATICAL BOLD SCRIPT SMALL F +1D4F0 MATHEMATICAL BOLD SCRIPT SMALL G +1D4F1 MATHEMATICAL BOLD SCRIPT SMALL H +1D4F2 MATHEMATICAL BOLD SCRIPT SMALL I +1D4F3 MATHEMATICAL BOLD SCRIPT SMALL J +1D4F4 MATHEMATICAL BOLD SCRIPT SMALL K +1D4F5 MATHEMATICAL BOLD SCRIPT SMALL L +1D4F6 MATHEMATICAL BOLD SCRIPT SMALL M +1D4F7 MATHEMATICAL BOLD SCRIPT SMALL N +1D4F8 MATHEMATICAL BOLD SCRIPT SMALL O +1D4F9 MATHEMATICAL BOLD SCRIPT SMALL P +1D4FA MATHEMATICAL BOLD SCRIPT SMALL Q +1D4FB MATHEMATICAL BOLD SCRIPT SMALL R +1D4FC MATHEMATICAL BOLD SCRIPT SMALL S +1D4FD MATHEMATICAL BOLD SCRIPT SMALL T +1D4FE MATHEMATICAL BOLD SCRIPT SMALL U +1D4FF MATHEMATICAL BOLD SCRIPT SMALL V +1D500 MATHEMATICAL BOLD SCRIPT SMALL W +1D501 MATHEMATICAL BOLD SCRIPT SMALL X +1D502 MATHEMATICAL BOLD SCRIPT SMALL Y +1D503 MATHEMATICAL BOLD SCRIPT SMALL Z +1D504 MATHEMATICAL FRAKTUR CAPITAL A +1D505 MATHEMATICAL FRAKTUR CAPITAL B +1D507 MATHEMATICAL FRAKTUR CAPITAL D +1D508 MATHEMATICAL FRAKTUR CAPITAL E +1D509 MATHEMATICAL FRAKTUR CAPITAL F +1D50A MATHEMATICAL FRAKTUR CAPITAL G +1D50D MATHEMATICAL FRAKTUR CAPITAL J +1D50E MATHEMATICAL FRAKTUR CAPITAL K +1D50F MATHEMATICAL FRAKTUR CAPITAL L +1D510 MATHEMATICAL FRAKTUR CAPITAL M +1D511 MATHEMATICAL FRAKTUR CAPITAL N +1D512 MATHEMATICAL FRAKTUR CAPITAL O +1D513 MATHEMATICAL FRAKTUR CAPITAL P +1D514 MATHEMATICAL FRAKTUR CAPITAL Q +1D516 MATHEMATICAL FRAKTUR CAPITAL S +1D517 MATHEMATICAL FRAKTUR CAPITAL T +1D518 MATHEMATICAL FRAKTUR CAPITAL U +1D519 MATHEMATICAL FRAKTUR CAPITAL V +1D51A MATHEMATICAL FRAKTUR CAPITAL W +1D51B MATHEMATICAL FRAKTUR CAPITAL X +1D51C MATHEMATICAL FRAKTUR CAPITAL Y +1D51E MATHEMATICAL FRAKTUR SMALL A +1D51F MATHEMATICAL FRAKTUR SMALL B +1D520 MATHEMATICAL FRAKTUR SMALL C +1D521 MATHEMATICAL FRAKTUR SMALL D +1D522 MATHEMATICAL FRAKTUR SMALL E +1D523 MATHEMATICAL FRAKTUR SMALL F +1D524 MATHEMATICAL FRAKTUR SMALL G +1D525 MATHEMATICAL FRAKTUR SMALL H +1D526 MATHEMATICAL FRAKTUR SMALL I +1D527 MATHEMATICAL FRAKTUR SMALL J +1D528 MATHEMATICAL FRAKTUR SMALL K +1D529 MATHEMATICAL FRAKTUR SMALL L +1D52A MATHEMATICAL FRAKTUR SMALL M +1D52B MATHEMATICAL FRAKTUR SMALL N +1D52C MATHEMATICAL FRAKTUR SMALL O +1D52D MATHEMATICAL FRAKTUR SMALL P +1D52E MATHEMATICAL FRAKTUR SMALL Q +1D52F MATHEMATICAL FRAKTUR SMALL R +1D530 MATHEMATICAL FRAKTUR SMALL S +1D531 MATHEMATICAL FRAKTUR SMALL T +1D532 MATHEMATICAL FRAKTUR SMALL U +1D533 MATHEMATICAL FRAKTUR SMALL V +1D534 MATHEMATICAL FRAKTUR SMALL W +1D535 MATHEMATICAL FRAKTUR SMALL X +1D536 MATHEMATICAL FRAKTUR SMALL Y +1D537 MATHEMATICAL FRAKTUR SMALL Z +1D538 MATHEMATICAL DOUBLE-STRUCK CAPITAL A +1D539 MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B MATHEMATICAL DOUBLE-STRUCK CAPITAL D +1D53C MATHEMATICAL DOUBLE-STRUCK CAPITAL E +1D53D MATHEMATICAL DOUBLE-STRUCK CAPITAL F +1D53E MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540 MATHEMATICAL DOUBLE-STRUCK CAPITAL I +1D541 MATHEMATICAL DOUBLE-STRUCK CAPITAL J +1D542 MATHEMATICAL DOUBLE-STRUCK CAPITAL K +1D543 MATHEMATICAL DOUBLE-STRUCK CAPITAL L +1D544 MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A MATHEMATICAL DOUBLE-STRUCK CAPITAL S +1D54B MATHEMATICAL DOUBLE-STRUCK CAPITAL T +1D54C MATHEMATICAL DOUBLE-STRUCK CAPITAL U +1D54D MATHEMATICAL DOUBLE-STRUCK CAPITAL V +1D54E MATHEMATICAL DOUBLE-STRUCK CAPITAL W +1D54F MATHEMATICAL DOUBLE-STRUCK CAPITAL X +1D550 MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552 MATHEMATICAL DOUBLE-STRUCK SMALL A +1D553 MATHEMATICAL DOUBLE-STRUCK SMALL B +1D554 MATHEMATICAL DOUBLE-STRUCK SMALL C +1D555 MATHEMATICAL DOUBLE-STRUCK SMALL D +1D556 MATHEMATICAL DOUBLE-STRUCK SMALL E +1D557 MATHEMATICAL DOUBLE-STRUCK SMALL F +1D558 MATHEMATICAL DOUBLE-STRUCK SMALL G +1D559 MATHEMATICAL DOUBLE-STRUCK SMALL H +1D55A MATHEMATICAL DOUBLE-STRUCK SMALL I +1D55B MATHEMATICAL DOUBLE-STRUCK SMALL J +1D55C MATHEMATICAL DOUBLE-STRUCK SMALL K +1D55D MATHEMATICAL DOUBLE-STRUCK SMALL L +1D55E MATHEMATICAL DOUBLE-STRUCK SMALL M +1D55F MATHEMATICAL DOUBLE-STRUCK SMALL N +1D560 MATHEMATICAL DOUBLE-STRUCK SMALL O +1D561 MATHEMATICAL DOUBLE-STRUCK SMALL P +1D562 MATHEMATICAL DOUBLE-STRUCK SMALL Q +1D563 MATHEMATICAL DOUBLE-STRUCK SMALL R +1D564 MATHEMATICAL DOUBLE-STRUCK SMALL S +1D565 MATHEMATICAL DOUBLE-STRUCK SMALL T +1D566 MATHEMATICAL DOUBLE-STRUCK SMALL U +1D567 MATHEMATICAL DOUBLE-STRUCK SMALL V +1D568 MATHEMATICAL DOUBLE-STRUCK SMALL W +1D569 MATHEMATICAL DOUBLE-STRUCK SMALL X +1D56A MATHEMATICAL DOUBLE-STRUCK SMALL Y +1D56B MATHEMATICAL DOUBLE-STRUCK SMALL Z +1D56C MATHEMATICAL BOLD FRAKTUR CAPITAL A +1D56D MATHEMATICAL BOLD FRAKTUR CAPITAL B +1D56E MATHEMATICAL BOLD FRAKTUR CAPITAL C +1D56F MATHEMATICAL BOLD FRAKTUR CAPITAL D +1D570 MATHEMATICAL BOLD FRAKTUR CAPITAL E +1D571 MATHEMATICAL BOLD FRAKTUR CAPITAL F +1D572 MATHEMATICAL BOLD FRAKTUR CAPITAL G +1D573 MATHEMATICAL BOLD FRAKTUR CAPITAL H +1D574 MATHEMATICAL BOLD FRAKTUR CAPITAL I +1D575 MATHEMATICAL BOLD FRAKTUR CAPITAL J +1D576 MATHEMATICAL BOLD FRAKTUR CAPITAL K +1D577 MATHEMATICAL BOLD FRAKTUR CAPITAL L +1D578 MATHEMATICAL BOLD FRAKTUR CAPITAL M +1D579 MATHEMATICAL BOLD FRAKTUR CAPITAL N +1D57A MATHEMATICAL BOLD FRAKTUR CAPITAL O +1D57B MATHEMATICAL BOLD FRAKTUR CAPITAL P +1D57C MATHEMATICAL BOLD FRAKTUR CAPITAL Q +1D57D MATHEMATICAL BOLD FRAKTUR CAPITAL R +1D57E MATHEMATICAL BOLD FRAKTUR CAPITAL S +1D57F MATHEMATICAL BOLD FRAKTUR CAPITAL T +1D580 MATHEMATICAL BOLD FRAKTUR CAPITAL U +1D581 MATHEMATICAL BOLD FRAKTUR CAPITAL V +1D582 MATHEMATICAL BOLD FRAKTUR CAPITAL W +1D583 MATHEMATICAL BOLD FRAKTUR CAPITAL X +1D584 MATHEMATICAL BOLD FRAKTUR CAPITAL Y +1D585 MATHEMATICAL BOLD FRAKTUR CAPITAL Z +1D586 MATHEMATICAL BOLD FRAKTUR SMALL A +1D587 MATHEMATICAL BOLD FRAKTUR SMALL B +1D588 MATHEMATICAL BOLD FRAKTUR SMALL C +1D589 MATHEMATICAL BOLD FRAKTUR SMALL D +1D58A MATHEMATICAL BOLD FRAKTUR SMALL E +1D58B MATHEMATICAL BOLD FRAKTUR SMALL F +1D58C MATHEMATICAL BOLD FRAKTUR SMALL G +1D58D MATHEMATICAL BOLD FRAKTUR SMALL H +1D58E MATHEMATICAL BOLD FRAKTUR SMALL I +1D58F MATHEMATICAL BOLD FRAKTUR SMALL J +1D590 MATHEMATICAL BOLD FRAKTUR SMALL K +1D591 MATHEMATICAL BOLD FRAKTUR SMALL L +1D592 MATHEMATICAL BOLD FRAKTUR SMALL M +1D593 MATHEMATICAL BOLD FRAKTUR SMALL N +1D594 MATHEMATICAL BOLD FRAKTUR SMALL O +1D595 MATHEMATICAL BOLD FRAKTUR SMALL P +1D596 MATHEMATICAL BOLD FRAKTUR SMALL Q +1D597 MATHEMATICAL BOLD FRAKTUR SMALL R +1D598 MATHEMATICAL BOLD FRAKTUR SMALL S +1D599 MATHEMATICAL BOLD FRAKTUR SMALL T +1D59A MATHEMATICAL BOLD FRAKTUR SMALL U +1D59B MATHEMATICAL BOLD FRAKTUR SMALL V +1D59C MATHEMATICAL BOLD FRAKTUR SMALL W +1D59D MATHEMATICAL BOLD FRAKTUR SMALL X +1D59E MATHEMATICAL BOLD FRAKTUR SMALL Y +1D59F MATHEMATICAL BOLD FRAKTUR SMALL Z +1D5A0 MATHEMATICAL SANS-SERIF CAPITAL A +1D5A1 MATHEMATICAL SANS-SERIF CAPITAL B +1D5A2 MATHEMATICAL SANS-SERIF CAPITAL C +1D5A3 MATHEMATICAL SANS-SERIF CAPITAL D +1D5A4 MATHEMATICAL SANS-SERIF CAPITAL E +1D5A5 MATHEMATICAL SANS-SERIF CAPITAL F +1D5A6 MATHEMATICAL SANS-SERIF CAPITAL G +1D5A7 MATHEMATICAL SANS-SERIF CAPITAL H +1D5A8 MATHEMATICAL SANS-SERIF CAPITAL I +1D5A9 MATHEMATICAL SANS-SERIF CAPITAL J +1D5AA MATHEMATICAL SANS-SERIF CAPITAL K +1D5AB MATHEMATICAL SANS-SERIF CAPITAL L +1D5AC MATHEMATICAL SANS-SERIF CAPITAL M +1D5AD MATHEMATICAL SANS-SERIF CAPITAL N +1D5AE MATHEMATICAL SANS-SERIF CAPITAL O +1D5AF MATHEMATICAL SANS-SERIF CAPITAL P +1D5B0 MATHEMATICAL SANS-SERIF CAPITAL Q +1D5B1 MATHEMATICAL SANS-SERIF CAPITAL R +1D5B2 MATHEMATICAL SANS-SERIF CAPITAL S +1D5B3 MATHEMATICAL SANS-SERIF CAPITAL T +1D5B4 MATHEMATICAL SANS-SERIF CAPITAL U +1D5B5 MATHEMATICAL SANS-SERIF CAPITAL V +1D5B6 MATHEMATICAL SANS-SERIF CAPITAL W +1D5B7 MATHEMATICAL SANS-SERIF CAPITAL X +1D5B8 MATHEMATICAL SANS-SERIF CAPITAL Y +1D5B9 MATHEMATICAL SANS-SERIF CAPITAL Z +1D5BA MATHEMATICAL SANS-SERIF SMALL A +1D5BB MATHEMATICAL SANS-SERIF SMALL B +1D5BC MATHEMATICAL SANS-SERIF SMALL C +1D5BD MATHEMATICAL SANS-SERIF SMALL D +1D5BE MATHEMATICAL SANS-SERIF SMALL E +1D5BF MATHEMATICAL SANS-SERIF SMALL F +1D5C0 MATHEMATICAL SANS-SERIF SMALL G +1D5C1 MATHEMATICAL SANS-SERIF SMALL H +1D5C2 MATHEMATICAL SANS-SERIF SMALL I +1D5C3 MATHEMATICAL SANS-SERIF SMALL J +1D5C4 MATHEMATICAL SANS-SERIF SMALL K +1D5C5 MATHEMATICAL SANS-SERIF SMALL L +1D5C6 MATHEMATICAL SANS-SERIF SMALL M +1D5C7 MATHEMATICAL SANS-SERIF SMALL N +1D5C8 MATHEMATICAL SANS-SERIF SMALL O +1D5C9 MATHEMATICAL SANS-SERIF SMALL P +1D5CA MATHEMATICAL SANS-SERIF SMALL Q +1D5CB MATHEMATICAL SANS-SERIF SMALL R +1D5CC MATHEMATICAL SANS-SERIF SMALL S +1D5CD MATHEMATICAL SANS-SERIF SMALL T +1D5CE MATHEMATICAL SANS-SERIF SMALL U +1D5CF MATHEMATICAL SANS-SERIF SMALL V +1D5D0 MATHEMATICAL SANS-SERIF SMALL W +1D5D1 MATHEMATICAL SANS-SERIF SMALL X +1D5D2 MATHEMATICAL SANS-SERIF SMALL Y +1D5D3 MATHEMATICAL SANS-SERIF SMALL Z +1D5D4 MATHEMATICAL SANS-SERIF BOLD CAPITAL A +1D5D5 MATHEMATICAL SANS-SERIF BOLD CAPITAL B +1D5D6 MATHEMATICAL SANS-SERIF BOLD CAPITAL C +1D5D7 MATHEMATICAL SANS-SERIF BOLD CAPITAL D +1D5D8 MATHEMATICAL SANS-SERIF BOLD CAPITAL E +1D5D9 MATHEMATICAL SANS-SERIF BOLD CAPITAL F +1D5DA MATHEMATICAL SANS-SERIF BOLD CAPITAL G +1D5DB MATHEMATICAL SANS-SERIF BOLD CAPITAL H +1D5DC MATHEMATICAL SANS-SERIF BOLD CAPITAL I +1D5DD MATHEMATICAL SANS-SERIF BOLD CAPITAL J +1D5DE MATHEMATICAL SANS-SERIF BOLD CAPITAL K +1D5DF MATHEMATICAL SANS-SERIF BOLD CAPITAL L +1D5E0 MATHEMATICAL SANS-SERIF BOLD CAPITAL M +1D5E1 MATHEMATICAL SANS-SERIF BOLD CAPITAL N +1D5E2 MATHEMATICAL SANS-SERIF BOLD CAPITAL O +1D5E3 MATHEMATICAL SANS-SERIF BOLD CAPITAL P +1D5E4 MATHEMATICAL SANS-SERIF BOLD CAPITAL Q +1D5E5 MATHEMATICAL SANS-SERIF BOLD CAPITAL R +1D5E6 MATHEMATICAL SANS-SERIF BOLD CAPITAL S +1D5E7 MATHEMATICAL SANS-SERIF BOLD CAPITAL T +1D5E8 MATHEMATICAL SANS-SERIF BOLD CAPITAL U +1D5E9 MATHEMATICAL SANS-SERIF BOLD CAPITAL V +1D5EA MATHEMATICAL SANS-SERIF BOLD CAPITAL W +1D5EB MATHEMATICAL SANS-SERIF BOLD CAPITAL X +1D5EC MATHEMATICAL SANS-SERIF BOLD CAPITAL Y +1D5ED MATHEMATICAL SANS-SERIF BOLD CAPITAL Z +1D5EE MATHEMATICAL SANS-SERIF BOLD SMALL A +1D5EF MATHEMATICAL SANS-SERIF BOLD SMALL B +1D5F0 MATHEMATICAL SANS-SERIF BOLD SMALL C +1D5F1 MATHEMATICAL SANS-SERIF BOLD SMALL D +1D5F2 MATHEMATICAL SANS-SERIF BOLD SMALL E +1D5F3 MATHEMATICAL SANS-SERIF BOLD SMALL F +1D5F4 MATHEMATICAL SANS-SERIF BOLD SMALL G +1D5F5 MATHEMATICAL SANS-SERIF BOLD SMALL H +1D5F6 MATHEMATICAL SANS-SERIF BOLD SMALL I +1D5F7 MATHEMATICAL SANS-SERIF BOLD SMALL J +1D5F8 MATHEMATICAL SANS-SERIF BOLD SMALL K +1D5F9 MATHEMATICAL SANS-SERIF BOLD SMALL L +1D5FA MATHEMATICAL SANS-SERIF BOLD SMALL M +1D5FB MATHEMATICAL SANS-SERIF BOLD SMALL N +1D5FC MATHEMATICAL SANS-SERIF BOLD SMALL O +1D5FD MATHEMATICAL SANS-SERIF BOLD SMALL P +1D5FE MATHEMATICAL SANS-SERIF BOLD SMALL Q +1D5FF MATHEMATICAL SANS-SERIF BOLD SMALL R +1D600 MATHEMATICAL SANS-SERIF BOLD SMALL S +1D601 MATHEMATICAL SANS-SERIF BOLD SMALL T +1D602 MATHEMATICAL SANS-SERIF BOLD SMALL U +1D603 MATHEMATICAL SANS-SERIF BOLD SMALL V +1D604 MATHEMATICAL SANS-SERIF BOLD SMALL W +1D605 MATHEMATICAL SANS-SERIF BOLD SMALL X +1D606 MATHEMATICAL SANS-SERIF BOLD SMALL Y +1D607 MATHEMATICAL SANS-SERIF BOLD SMALL Z +1D608 MATHEMATICAL SANS-SERIF ITALIC CAPITAL A +1D609 MATHEMATICAL SANS-SERIF ITALIC CAPITAL B +1D60A MATHEMATICAL SANS-SERIF ITALIC CAPITAL C +1D60B MATHEMATICAL SANS-SERIF ITALIC CAPITAL D +1D60C MATHEMATICAL SANS-SERIF ITALIC CAPITAL E +1D60D MATHEMATICAL SANS-SERIF ITALIC CAPITAL F +1D60E MATHEMATICAL SANS-SERIF ITALIC CAPITAL G +1D60F MATHEMATICAL SANS-SERIF ITALIC CAPITAL H +1D610 MATHEMATICAL SANS-SERIF ITALIC CAPITAL I +1D611 MATHEMATICAL SANS-SERIF ITALIC CAPITAL J +1D612 MATHEMATICAL SANS-SERIF ITALIC CAPITAL K +1D613 MATHEMATICAL SANS-SERIF ITALIC CAPITAL L +1D614 MATHEMATICAL SANS-SERIF ITALIC CAPITAL M +1D615 MATHEMATICAL SANS-SERIF ITALIC CAPITAL N +1D616 MATHEMATICAL SANS-SERIF ITALIC CAPITAL O +1D617 MATHEMATICAL SANS-SERIF ITALIC CAPITAL P +1D618 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q +1D619 MATHEMATICAL SANS-SERIF ITALIC CAPITAL R +1D61A MATHEMATICAL SANS-SERIF ITALIC CAPITAL S +1D61B MATHEMATICAL SANS-SERIF ITALIC CAPITAL T +1D61C MATHEMATICAL SANS-SERIF ITALIC CAPITAL U +1D61D MATHEMATICAL SANS-SERIF ITALIC CAPITAL V +1D61E MATHEMATICAL SANS-SERIF ITALIC CAPITAL W +1D61F MATHEMATICAL SANS-SERIF ITALIC CAPITAL X +1D620 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y +1D621 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z +1D622 MATHEMATICAL SANS-SERIF ITALIC SMALL A +1D623 MATHEMATICAL SANS-SERIF ITALIC SMALL B +1D624 MATHEMATICAL SANS-SERIF ITALIC SMALL C +1D625 MATHEMATICAL SANS-SERIF ITALIC SMALL D +1D626 MATHEMATICAL SANS-SERIF ITALIC SMALL E +1D627 MATHEMATICAL SANS-SERIF ITALIC SMALL F +1D628 MATHEMATICAL SANS-SERIF ITALIC SMALL G +1D629 MATHEMATICAL SANS-SERIF ITALIC SMALL H +1D62A MATHEMATICAL SANS-SERIF ITALIC SMALL I +1D62B MATHEMATICAL SANS-SERIF ITALIC SMALL J +1D62C MATHEMATICAL SANS-SERIF ITALIC SMALL K +1D62D MATHEMATICAL SANS-SERIF ITALIC SMALL L +1D62E MATHEMATICAL SANS-SERIF ITALIC SMALL M +1D62F MATHEMATICAL SANS-SERIF ITALIC SMALL N +1D630 MATHEMATICAL SANS-SERIF ITALIC SMALL O +1D631 MATHEMATICAL SANS-SERIF ITALIC SMALL P +1D632 MATHEMATICAL SANS-SERIF ITALIC SMALL Q +1D633 MATHEMATICAL SANS-SERIF ITALIC SMALL R +1D634 MATHEMATICAL SANS-SERIF ITALIC SMALL S +1D635 MATHEMATICAL SANS-SERIF ITALIC SMALL T +1D636 MATHEMATICAL SANS-SERIF ITALIC SMALL U +1D637 MATHEMATICAL SANS-SERIF ITALIC SMALL V +1D638 MATHEMATICAL SANS-SERIF ITALIC SMALL W +1D639 MATHEMATICAL SANS-SERIF ITALIC SMALL X +1D63A MATHEMATICAL SANS-SERIF ITALIC SMALL Y +1D63B MATHEMATICAL SANS-SERIF ITALIC SMALL Z +1D63C MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A +1D63D MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B +1D63E MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C +1D63F MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D +1D640 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E +1D641 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F +1D642 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G +1D643 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H +1D644 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I +1D645 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J +1D646 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K +1D647 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L +1D648 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M +1D649 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N +1D64A MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O +1D64B MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P +1D64C MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q +1D64D MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R +1D64E MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S +1D64F MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T +1D650 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U +1D651 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V +1D652 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W +1D653 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X +1D654 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y +1D655 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z +1D656 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A +1D657 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B +1D658 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C +1D659 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D +1D65A MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E +1D65B MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F +1D65C MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G +1D65D MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H +1D65E MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I +1D65F MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J +1D660 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K +1D661 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L +1D662 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M +1D663 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N +1D664 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O +1D665 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P +1D666 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q +1D667 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R +1D668 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S +1D669 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T +1D66A MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U +1D66B MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V +1D66C MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W +1D66D MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X +1D66E MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y +1D66F MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z +1D670 MATHEMATICAL MONOSPACE CAPITAL A +1D671 MATHEMATICAL MONOSPACE CAPITAL B +1D672 MATHEMATICAL MONOSPACE CAPITAL C +1D673 MATHEMATICAL MONOSPACE CAPITAL D +1D674 MATHEMATICAL MONOSPACE CAPITAL E +1D675 MATHEMATICAL MONOSPACE CAPITAL F +1D676 MATHEMATICAL MONOSPACE CAPITAL G +1D677 MATHEMATICAL MONOSPACE CAPITAL H +1D678 MATHEMATICAL MONOSPACE CAPITAL I +1D679 MATHEMATICAL MONOSPACE CAPITAL J +1D67A MATHEMATICAL MONOSPACE CAPITAL K +1D67B MATHEMATICAL MONOSPACE CAPITAL L +1D67C MATHEMATICAL MONOSPACE CAPITAL M +1D67D MATHEMATICAL MONOSPACE CAPITAL N +1D67E MATHEMATICAL MONOSPACE CAPITAL O +1D67F MATHEMATICAL MONOSPACE CAPITAL P +1D680 MATHEMATICAL MONOSPACE CAPITAL Q +1D681 MATHEMATICAL MONOSPACE CAPITAL R +1D682 MATHEMATICAL MONOSPACE CAPITAL S +1D683 MATHEMATICAL MONOSPACE CAPITAL T +1D684 MATHEMATICAL MONOSPACE CAPITAL U +1D685 MATHEMATICAL MONOSPACE CAPITAL V +1D686 MATHEMATICAL MONOSPACE CAPITAL W +1D687 MATHEMATICAL MONOSPACE CAPITAL X +1D688 MATHEMATICAL MONOSPACE CAPITAL Y +1D689 MATHEMATICAL MONOSPACE CAPITAL Z +1D68A MATHEMATICAL MONOSPACE SMALL A +1D68B MATHEMATICAL MONOSPACE SMALL B +1D68C MATHEMATICAL MONOSPACE SMALL C +1D68D MATHEMATICAL MONOSPACE SMALL D +1D68E MATHEMATICAL MONOSPACE SMALL E +1D68F MATHEMATICAL MONOSPACE SMALL F +1D690 MATHEMATICAL MONOSPACE SMALL G +1D691 MATHEMATICAL MONOSPACE SMALL H +1D692 MATHEMATICAL MONOSPACE SMALL I +1D693 MATHEMATICAL MONOSPACE SMALL J +1D694 MATHEMATICAL MONOSPACE SMALL K +1D695 MATHEMATICAL MONOSPACE SMALL L +1D696 MATHEMATICAL MONOSPACE SMALL M +1D697 MATHEMATICAL MONOSPACE SMALL N +1D698 MATHEMATICAL MONOSPACE SMALL O +1D699 MATHEMATICAL MONOSPACE SMALL P +1D69A MATHEMATICAL MONOSPACE SMALL Q +1D69B MATHEMATICAL MONOSPACE SMALL R +1D69C MATHEMATICAL MONOSPACE SMALL S +1D69D MATHEMATICAL MONOSPACE SMALL T +1D69E MATHEMATICAL MONOSPACE SMALL U +1D69F MATHEMATICAL MONOSPACE SMALL V +1D6A0 MATHEMATICAL MONOSPACE SMALL W +1D6A1 MATHEMATICAL MONOSPACE SMALL X +1D6A2 MATHEMATICAL MONOSPACE SMALL Y +1D6A3 MATHEMATICAL MONOSPACE SMALL Z +1D6A4 MATHEMATICAL ITALIC SMALL DOTLESS I +1D6A5 MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8 MATHEMATICAL BOLD CAPITAL ALPHA +1D6A9 MATHEMATICAL BOLD CAPITAL BETA +1D6AA MATHEMATICAL BOLD CAPITAL GAMMA +1D6AB MATHEMATICAL BOLD CAPITAL DELTA +1D6AC MATHEMATICAL BOLD CAPITAL EPSILON +1D6AD MATHEMATICAL BOLD CAPITAL ZETA +1D6AE MATHEMATICAL BOLD CAPITAL ETA +1D6AF MATHEMATICAL BOLD CAPITAL THETA +1D6B0 MATHEMATICAL BOLD CAPITAL IOTA +1D6B1 MATHEMATICAL BOLD CAPITAL KAPPA +1D6B2 MATHEMATICAL BOLD CAPITAL LAMDA +1D6B3 MATHEMATICAL BOLD CAPITAL MU +1D6B4 MATHEMATICAL BOLD CAPITAL NU +1D6B5 MATHEMATICAL BOLD CAPITAL XI +1D6B6 MATHEMATICAL BOLD CAPITAL OMICRON +1D6B7 MATHEMATICAL BOLD CAPITAL PI +1D6B8 MATHEMATICAL BOLD CAPITAL RHO +1D6B9 MATHEMATICAL BOLD CAPITAL THETA SYMBOL +1D6BA MATHEMATICAL BOLD CAPITAL SIGMA +1D6BB MATHEMATICAL BOLD CAPITAL TAU +1D6BC MATHEMATICAL BOLD CAPITAL UPSILON +1D6BD MATHEMATICAL BOLD CAPITAL PHI +1D6BE MATHEMATICAL BOLD CAPITAL CHI +1D6BF MATHEMATICAL BOLD CAPITAL PSI +1D6C0 MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1 MATHEMATICAL BOLD NABLA +1D6C2 MATHEMATICAL BOLD SMALL ALPHA +1D6C3 MATHEMATICAL BOLD SMALL BETA +1D6C4 MATHEMATICAL BOLD SMALL GAMMA +1D6C5 MATHEMATICAL BOLD SMALL DELTA +1D6C6 MATHEMATICAL BOLD SMALL EPSILON +1D6C7 MATHEMATICAL BOLD SMALL ZETA +1D6C8 MATHEMATICAL BOLD SMALL ETA +1D6C9 MATHEMATICAL BOLD SMALL THETA +1D6CA MATHEMATICAL BOLD SMALL IOTA +1D6CB MATHEMATICAL BOLD SMALL KAPPA +1D6CC MATHEMATICAL BOLD SMALL LAMDA +1D6CD MATHEMATICAL BOLD SMALL MU +1D6CE MATHEMATICAL BOLD SMALL NU +1D6CF MATHEMATICAL BOLD SMALL XI +1D6D0 MATHEMATICAL BOLD SMALL OMICRON +1D6D1 MATHEMATICAL BOLD SMALL PI +1D6D2 MATHEMATICAL BOLD SMALL RHO +1D6D3 MATHEMATICAL BOLD SMALL FINAL SIGMA +1D6D4 MATHEMATICAL BOLD SMALL SIGMA +1D6D5 MATHEMATICAL BOLD SMALL TAU +1D6D6 MATHEMATICAL BOLD SMALL UPSILON +1D6D7 MATHEMATICAL BOLD SMALL PHI +1D6D8 MATHEMATICAL BOLD SMALL CHI +1D6D9 MATHEMATICAL BOLD SMALL PSI +1D6DA MATHEMATICAL BOLD SMALL OMEGA +1D6DB MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC MATHEMATICAL BOLD EPSILON SYMBOL +1D6DD MATHEMATICAL BOLD THETA SYMBOL +1D6DE MATHEMATICAL BOLD KAPPA SYMBOL +1D6DF MATHEMATICAL BOLD PHI SYMBOL +1D6E0 MATHEMATICAL BOLD RHO SYMBOL +1D6E1 MATHEMATICAL BOLD PI SYMBOL +1D6E2 MATHEMATICAL ITALIC CAPITAL ALPHA +1D6E3 MATHEMATICAL ITALIC CAPITAL BETA +1D6E4 MATHEMATICAL ITALIC CAPITAL GAMMA +1D6E5 MATHEMATICAL ITALIC CAPITAL DELTA +1D6E6 MATHEMATICAL ITALIC CAPITAL EPSILON +1D6E7 MATHEMATICAL ITALIC CAPITAL ZETA +1D6E8 MATHEMATICAL ITALIC CAPITAL ETA +1D6E9 MATHEMATICAL ITALIC CAPITAL THETA +1D6EA MATHEMATICAL ITALIC CAPITAL IOTA +1D6EB MATHEMATICAL ITALIC CAPITAL KAPPA +1D6EC MATHEMATICAL ITALIC CAPITAL LAMDA +1D6ED MATHEMATICAL ITALIC CAPITAL MU +1D6EE MATHEMATICAL ITALIC CAPITAL NU +1D6EF MATHEMATICAL ITALIC CAPITAL XI +1D6F0 MATHEMATICAL ITALIC CAPITAL OMICRON +1D6F1 MATHEMATICAL ITALIC CAPITAL PI +1D6F2 MATHEMATICAL ITALIC CAPITAL RHO +1D6F3 MATHEMATICAL ITALIC CAPITAL THETA SYMBOL +1D6F4 MATHEMATICAL ITALIC CAPITAL SIGMA +1D6F5 MATHEMATICAL ITALIC CAPITAL TAU +1D6F6 MATHEMATICAL ITALIC CAPITAL UPSILON +1D6F7 MATHEMATICAL ITALIC CAPITAL PHI +1D6F8 MATHEMATICAL ITALIC CAPITAL CHI +1D6F9 MATHEMATICAL ITALIC CAPITAL PSI +1D6FA MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB MATHEMATICAL ITALIC NABLA +1D6FC MATHEMATICAL ITALIC SMALL ALPHA +1D6FD MATHEMATICAL ITALIC SMALL BETA +1D6FE MATHEMATICAL ITALIC SMALL GAMMA +1D6FF MATHEMATICAL ITALIC SMALL DELTA +1D700 MATHEMATICAL ITALIC SMALL EPSILON +1D701 MATHEMATICAL ITALIC SMALL ZETA +1D702 MATHEMATICAL ITALIC SMALL ETA +1D703 MATHEMATICAL ITALIC SMALL THETA +1D704 MATHEMATICAL ITALIC SMALL IOTA +1D705 MATHEMATICAL ITALIC SMALL KAPPA +1D706 MATHEMATICAL ITALIC SMALL LAMDA +1D707 MATHEMATICAL ITALIC SMALL MU +1D708 MATHEMATICAL ITALIC SMALL NU +1D709 MATHEMATICAL ITALIC SMALL XI +1D70A MATHEMATICAL ITALIC SMALL OMICRON +1D70B MATHEMATICAL ITALIC SMALL PI +1D70C MATHEMATICAL ITALIC SMALL RHO +1D70D MATHEMATICAL ITALIC SMALL FINAL SIGMA +1D70E MATHEMATICAL ITALIC SMALL SIGMA +1D70F MATHEMATICAL ITALIC SMALL TAU +1D710 MATHEMATICAL ITALIC SMALL UPSILON +1D711 MATHEMATICAL ITALIC SMALL PHI +1D712 MATHEMATICAL ITALIC SMALL CHI +1D713 MATHEMATICAL ITALIC SMALL PSI +1D714 MATHEMATICAL ITALIC SMALL OMEGA +1D715 MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716 MATHEMATICAL ITALIC EPSILON SYMBOL +1D717 MATHEMATICAL ITALIC THETA SYMBOL +1D718 MATHEMATICAL ITALIC KAPPA SYMBOL +1D719 MATHEMATICAL ITALIC PHI SYMBOL +1D71A MATHEMATICAL ITALIC RHO SYMBOL +1D71B MATHEMATICAL ITALIC PI SYMBOL +1D71C MATHEMATICAL BOLD ITALIC CAPITAL ALPHA +1D71D MATHEMATICAL BOLD ITALIC CAPITAL BETA +1D71E MATHEMATICAL BOLD ITALIC CAPITAL GAMMA +1D71F MATHEMATICAL BOLD ITALIC CAPITAL DELTA +1D720 MATHEMATICAL BOLD ITALIC CAPITAL EPSILON +1D721 MATHEMATICAL BOLD ITALIC CAPITAL ZETA +1D722 MATHEMATICAL BOLD ITALIC CAPITAL ETA +1D723 MATHEMATICAL BOLD ITALIC CAPITAL THETA +1D724 MATHEMATICAL BOLD ITALIC CAPITAL IOTA +1D725 MATHEMATICAL BOLD ITALIC CAPITAL KAPPA +1D726 MATHEMATICAL BOLD ITALIC CAPITAL LAMDA +1D727 MATHEMATICAL BOLD ITALIC CAPITAL MU +1D728 MATHEMATICAL BOLD ITALIC CAPITAL NU +1D729 MATHEMATICAL BOLD ITALIC CAPITAL XI +1D72A MATHEMATICAL BOLD ITALIC CAPITAL OMICRON +1D72B MATHEMATICAL BOLD ITALIC CAPITAL PI +1D72C MATHEMATICAL BOLD ITALIC CAPITAL RHO +1D72D MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL +1D72E MATHEMATICAL BOLD ITALIC CAPITAL SIGMA +1D72F MATHEMATICAL BOLD ITALIC CAPITAL TAU +1D730 MATHEMATICAL BOLD ITALIC CAPITAL UPSILON +1D731 MATHEMATICAL BOLD ITALIC CAPITAL PHI +1D732 MATHEMATICAL BOLD ITALIC CAPITAL CHI +1D733 MATHEMATICAL BOLD ITALIC CAPITAL PSI +1D734 MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735 MATHEMATICAL BOLD ITALIC NABLA +1D736 MATHEMATICAL BOLD ITALIC SMALL ALPHA +1D737 MATHEMATICAL BOLD ITALIC SMALL BETA +1D738 MATHEMATICAL BOLD ITALIC SMALL GAMMA +1D739 MATHEMATICAL BOLD ITALIC SMALL DELTA +1D73A MATHEMATICAL BOLD ITALIC SMALL EPSILON +1D73B MATHEMATICAL BOLD ITALIC SMALL ZETA +1D73C MATHEMATICAL BOLD ITALIC SMALL ETA +1D73D MATHEMATICAL BOLD ITALIC SMALL THETA +1D73E MATHEMATICAL BOLD ITALIC SMALL IOTA +1D73F MATHEMATICAL BOLD ITALIC SMALL KAPPA +1D740 MATHEMATICAL BOLD ITALIC SMALL LAMDA +1D741 MATHEMATICAL BOLD ITALIC SMALL MU +1D742 MATHEMATICAL BOLD ITALIC SMALL NU +1D743 MATHEMATICAL BOLD ITALIC SMALL XI +1D744 MATHEMATICAL BOLD ITALIC SMALL OMICRON +1D745 MATHEMATICAL BOLD ITALIC SMALL PI +1D746 MATHEMATICAL BOLD ITALIC SMALL RHO +1D747 MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA +1D748 MATHEMATICAL BOLD ITALIC SMALL SIGMA +1D749 MATHEMATICAL BOLD ITALIC SMALL TAU +1D74A MATHEMATICAL BOLD ITALIC SMALL UPSILON +1D74B MATHEMATICAL BOLD ITALIC SMALL PHI +1D74C MATHEMATICAL BOLD ITALIC SMALL CHI +1D74D MATHEMATICAL BOLD ITALIC SMALL PSI +1D74E MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750 MATHEMATICAL BOLD ITALIC EPSILON SYMBOL +1D751 MATHEMATICAL BOLD ITALIC THETA SYMBOL +1D752 MATHEMATICAL BOLD ITALIC KAPPA SYMBOL +1D753 MATHEMATICAL BOLD ITALIC PHI SYMBOL +1D754 MATHEMATICAL BOLD ITALIC RHO SYMBOL +1D755 MATHEMATICAL BOLD ITALIC PI SYMBOL +1D756 MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA +1D757 MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA +1D758 MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA +1D759 MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA +1D75A MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON +1D75B MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA +1D75C MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA +1D75D MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA +1D75E MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA +1D75F MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA +1D760 MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA +1D761 MATHEMATICAL SANS-SERIF BOLD CAPITAL MU +1D762 MATHEMATICAL SANS-SERIF BOLD CAPITAL NU +1D763 MATHEMATICAL SANS-SERIF BOLD CAPITAL XI +1D764 MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON +1D765 MATHEMATICAL SANS-SERIF BOLD CAPITAL PI +1D766 MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO +1D767 MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL +1D768 MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA +1D769 MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU +1D76A MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON +1D76B MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI +1D76C MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI +1D76D MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI +1D76E MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F MATHEMATICAL SANS-SERIF BOLD NABLA +1D770 MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA +1D771 MATHEMATICAL SANS-SERIF BOLD SMALL BETA +1D772 MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA +1D773 MATHEMATICAL SANS-SERIF BOLD SMALL DELTA +1D774 MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON +1D775 MATHEMATICAL SANS-SERIF BOLD SMALL ZETA +1D776 MATHEMATICAL SANS-SERIF BOLD SMALL ETA +1D777 MATHEMATICAL SANS-SERIF BOLD SMALL THETA +1D778 MATHEMATICAL SANS-SERIF BOLD SMALL IOTA +1D779 MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA +1D77A MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA +1D77B MATHEMATICAL SANS-SERIF BOLD SMALL MU +1D77C MATHEMATICAL SANS-SERIF BOLD SMALL NU +1D77D MATHEMATICAL SANS-SERIF BOLD SMALL XI +1D77E MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON +1D77F MATHEMATICAL SANS-SERIF BOLD SMALL PI +1D780 MATHEMATICAL SANS-SERIF BOLD SMALL RHO +1D781 MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA +1D782 MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA +1D783 MATHEMATICAL SANS-SERIF BOLD SMALL TAU +1D784 MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON +1D785 MATHEMATICAL SANS-SERIF BOLD SMALL PHI +1D786 MATHEMATICAL SANS-SERIF BOLD SMALL CHI +1D787 MATHEMATICAL SANS-SERIF BOLD SMALL PSI +1D788 MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789 MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL +1D78B MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL +1D78C MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL +1D78D MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL +1D78E MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL +1D78F MATHEMATICAL SANS-SERIF BOLD PI SYMBOL +1D790 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA +1D791 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA +1D792 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA +1D793 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA +1D794 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON +1D795 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA +1D796 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA +1D797 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA +1D798 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA +1D799 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA +1D79A MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA +1D79B MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU +1D79C MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU +1D79D MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI +1D79E MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON +1D79F MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI +1D7A0 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO +1D7A1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL +1D7A2 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA +1D7A3 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU +1D7A4 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON +1D7A5 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI +1D7A6 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI +1D7A7 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI +1D7A8 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9 MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA +1D7AB MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA +1D7AC MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA +1D7AD MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA +1D7AE MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON +1D7AF MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA +1D7B0 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA +1D7B1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA +1D7B2 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA +1D7B3 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA +1D7B4 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA +1D7B5 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU +1D7B6 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU +1D7B7 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI +1D7B8 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON +1D7B9 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI +1D7BA MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO +1D7BB MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA +1D7BC MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA +1D7BD MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU +1D7BE MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON +1D7BF MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI +1D7C0 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI +1D7C1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI +1D7C2 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3 MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4 MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL +1D7C5 MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL +1D7C6 MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL +1D7C7 MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL +1D7C8 MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL +1D7C9 MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +1D7CE MATHEMATICAL BOLD DIGIT ZERO +1D7CF MATHEMATICAL BOLD DIGIT ONE +1D7D0 MATHEMATICAL BOLD DIGIT TWO +1D7D1 MATHEMATICAL BOLD DIGIT THREE +1D7D2 MATHEMATICAL BOLD DIGIT FOUR +1D7D3 MATHEMATICAL BOLD DIGIT FIVE +1D7D4 MATHEMATICAL BOLD DIGIT SIX +1D7D5 MATHEMATICAL BOLD DIGIT SEVEN +1D7D6 MATHEMATICAL BOLD DIGIT EIGHT +1D7D7 MATHEMATICAL BOLD DIGIT NINE +1D7D8 MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO +1D7D9 MATHEMATICAL DOUBLE-STRUCK DIGIT ONE +1D7DA MATHEMATICAL DOUBLE-STRUCK DIGIT TWO +1D7DB MATHEMATICAL DOUBLE-STRUCK DIGIT THREE +1D7DC MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR +1D7DD MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE +1D7DE MATHEMATICAL DOUBLE-STRUCK DIGIT SIX +1D7DF MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN +1D7E0 MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT +1D7E1 MATHEMATICAL DOUBLE-STRUCK DIGIT NINE +1D7E2 MATHEMATICAL SANS-SERIF DIGIT ZERO +1D7E3 MATHEMATICAL SANS-SERIF DIGIT ONE +1D7E4 MATHEMATICAL SANS-SERIF DIGIT TWO +1D7E5 MATHEMATICAL SANS-SERIF DIGIT THREE +1D7E6 MATHEMATICAL SANS-SERIF DIGIT FOUR +1D7E7 MATHEMATICAL SANS-SERIF DIGIT FIVE +1D7E8 MATHEMATICAL SANS-SERIF DIGIT SIX +1D7E9 MATHEMATICAL SANS-SERIF DIGIT SEVEN +1D7EA MATHEMATICAL SANS-SERIF DIGIT EIGHT +1D7EB MATHEMATICAL SANS-SERIF DIGIT NINE +1D7EC MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO +1D7ED MATHEMATICAL SANS-SERIF BOLD DIGIT ONE +1D7EE MATHEMATICAL SANS-SERIF BOLD DIGIT TWO +1D7EF MATHEMATICAL SANS-SERIF BOLD DIGIT THREE +1D7F0 MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR +1D7F1 MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE +1D7F2 MATHEMATICAL SANS-SERIF BOLD DIGIT SIX +1D7F3 MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN +1D7F4 MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT +1D7F5 MATHEMATICAL SANS-SERIF BOLD DIGIT NINE +1D7F6 MATHEMATICAL MONOSPACE DIGIT ZERO +1D7F7 MATHEMATICAL MONOSPACE DIGIT ONE +1D7F8 MATHEMATICAL MONOSPACE DIGIT TWO +1D7F9 MATHEMATICAL MONOSPACE DIGIT THREE +1D7FA MATHEMATICAL MONOSPACE DIGIT FOUR +1D7FB MATHEMATICAL MONOSPACE DIGIT FIVE +1D7FC MATHEMATICAL MONOSPACE DIGIT SIX +1D7FD MATHEMATICAL MONOSPACE DIGIT SEVEN +1D7FE MATHEMATICAL MONOSPACE DIGIT EIGHT +1D7FF MATHEMATICAL MONOSPACE DIGIT NINE +20000 2A6D6 CJK Ideograph Extension B +2F800 CJK COMPATIBILITY IDEOGRAPH-2F800 +2F801 CJK COMPATIBILITY IDEOGRAPH-2F801 +2F802 CJK COMPATIBILITY IDEOGRAPH-2F802 +2F803 CJK COMPATIBILITY IDEOGRAPH-2F803 +2F804 CJK COMPATIBILITY IDEOGRAPH-2F804 +2F805 CJK COMPATIBILITY IDEOGRAPH-2F805 +2F806 CJK COMPATIBILITY IDEOGRAPH-2F806 +2F807 CJK COMPATIBILITY IDEOGRAPH-2F807 +2F808 CJK COMPATIBILITY IDEOGRAPH-2F808 +2F809 CJK COMPATIBILITY IDEOGRAPH-2F809 +2F80A CJK COMPATIBILITY IDEOGRAPH-2F80A +2F80B CJK COMPATIBILITY IDEOGRAPH-2F80B +2F80C CJK COMPATIBILITY IDEOGRAPH-2F80C +2F80D CJK COMPATIBILITY IDEOGRAPH-2F80D +2F80E CJK COMPATIBILITY IDEOGRAPH-2F80E +2F80F CJK COMPATIBILITY IDEOGRAPH-2F80F +2F810 CJK COMPATIBILITY IDEOGRAPH-2F810 +2F811 CJK COMPATIBILITY IDEOGRAPH-2F811 +2F812 CJK COMPATIBILITY IDEOGRAPH-2F812 +2F813 CJK COMPATIBILITY IDEOGRAPH-2F813 +2F814 CJK COMPATIBILITY IDEOGRAPH-2F814 +2F815 CJK COMPATIBILITY IDEOGRAPH-2F815 +2F816 CJK COMPATIBILITY IDEOGRAPH-2F816 +2F817 CJK COMPATIBILITY IDEOGRAPH-2F817 +2F818 CJK COMPATIBILITY IDEOGRAPH-2F818 +2F819 CJK COMPATIBILITY IDEOGRAPH-2F819 +2F81A CJK COMPATIBILITY IDEOGRAPH-2F81A +2F81B CJK COMPATIBILITY IDEOGRAPH-2F81B +2F81C CJK COMPATIBILITY IDEOGRAPH-2F81C +2F81D CJK COMPATIBILITY IDEOGRAPH-2F81D +2F81E CJK COMPATIBILITY IDEOGRAPH-2F81E +2F81F CJK COMPATIBILITY IDEOGRAPH-2F81F +2F820 CJK COMPATIBILITY IDEOGRAPH-2F820 +2F821 CJK COMPATIBILITY IDEOGRAPH-2F821 +2F822 CJK COMPATIBILITY IDEOGRAPH-2F822 +2F823 CJK COMPATIBILITY IDEOGRAPH-2F823 +2F824 CJK COMPATIBILITY IDEOGRAPH-2F824 +2F825 CJK COMPATIBILITY IDEOGRAPH-2F825 +2F826 CJK COMPATIBILITY IDEOGRAPH-2F826 +2F827 CJK COMPATIBILITY IDEOGRAPH-2F827 +2F828 CJK COMPATIBILITY IDEOGRAPH-2F828 +2F829 CJK COMPATIBILITY IDEOGRAPH-2F829 +2F82A CJK COMPATIBILITY IDEOGRAPH-2F82A +2F82B CJK COMPATIBILITY IDEOGRAPH-2F82B +2F82C CJK COMPATIBILITY IDEOGRAPH-2F82C +2F82D CJK COMPATIBILITY IDEOGRAPH-2F82D +2F82E CJK COMPATIBILITY IDEOGRAPH-2F82E +2F82F CJK COMPATIBILITY IDEOGRAPH-2F82F +2F830 CJK COMPATIBILITY IDEOGRAPH-2F830 +2F831 CJK COMPATIBILITY IDEOGRAPH-2F831 +2F832 CJK COMPATIBILITY IDEOGRAPH-2F832 +2F833 CJK COMPATIBILITY IDEOGRAPH-2F833 +2F834 CJK COMPATIBILITY IDEOGRAPH-2F834 +2F835 CJK COMPATIBILITY IDEOGRAPH-2F835 +2F836 CJK COMPATIBILITY IDEOGRAPH-2F836 +2F837 CJK COMPATIBILITY IDEOGRAPH-2F837 +2F838 CJK COMPATIBILITY IDEOGRAPH-2F838 +2F839 CJK COMPATIBILITY IDEOGRAPH-2F839 +2F83A CJK COMPATIBILITY IDEOGRAPH-2F83A +2F83B CJK COMPATIBILITY IDEOGRAPH-2F83B +2F83C CJK COMPATIBILITY IDEOGRAPH-2F83C +2F83D CJK COMPATIBILITY IDEOGRAPH-2F83D +2F83E CJK COMPATIBILITY IDEOGRAPH-2F83E +2F83F CJK COMPATIBILITY IDEOGRAPH-2F83F +2F840 CJK COMPATIBILITY IDEOGRAPH-2F840 +2F841 CJK COMPATIBILITY IDEOGRAPH-2F841 +2F842 CJK COMPATIBILITY IDEOGRAPH-2F842 +2F843 CJK COMPATIBILITY IDEOGRAPH-2F843 +2F844 CJK COMPATIBILITY IDEOGRAPH-2F844 +2F845 CJK COMPATIBILITY IDEOGRAPH-2F845 +2F846 CJK COMPATIBILITY IDEOGRAPH-2F846 +2F847 CJK COMPATIBILITY IDEOGRAPH-2F847 +2F848 CJK COMPATIBILITY IDEOGRAPH-2F848 +2F849 CJK COMPATIBILITY IDEOGRAPH-2F849 +2F84A CJK COMPATIBILITY IDEOGRAPH-2F84A +2F84B CJK COMPATIBILITY IDEOGRAPH-2F84B +2F84C CJK COMPATIBILITY IDEOGRAPH-2F84C +2F84D CJK COMPATIBILITY IDEOGRAPH-2F84D +2F84E CJK COMPATIBILITY IDEOGRAPH-2F84E +2F84F CJK COMPATIBILITY IDEOGRAPH-2F84F +2F850 CJK COMPATIBILITY IDEOGRAPH-2F850 +2F851 CJK COMPATIBILITY IDEOGRAPH-2F851 +2F852 CJK COMPATIBILITY IDEOGRAPH-2F852 +2F853 CJK COMPATIBILITY IDEOGRAPH-2F853 +2F854 CJK COMPATIBILITY IDEOGRAPH-2F854 +2F855 CJK COMPATIBILITY IDEOGRAPH-2F855 +2F856 CJK COMPATIBILITY IDEOGRAPH-2F856 +2F857 CJK COMPATIBILITY IDEOGRAPH-2F857 +2F858 CJK COMPATIBILITY IDEOGRAPH-2F858 +2F859 CJK COMPATIBILITY IDEOGRAPH-2F859 +2F85A CJK COMPATIBILITY IDEOGRAPH-2F85A +2F85B CJK COMPATIBILITY IDEOGRAPH-2F85B +2F85C CJK COMPATIBILITY IDEOGRAPH-2F85C +2F85D CJK COMPATIBILITY IDEOGRAPH-2F85D +2F85E CJK COMPATIBILITY IDEOGRAPH-2F85E +2F85F CJK COMPATIBILITY IDEOGRAPH-2F85F +2F860 CJK COMPATIBILITY IDEOGRAPH-2F860 +2F861 CJK COMPATIBILITY IDEOGRAPH-2F861 +2F862 CJK COMPATIBILITY IDEOGRAPH-2F862 +2F863 CJK COMPATIBILITY IDEOGRAPH-2F863 +2F864 CJK COMPATIBILITY IDEOGRAPH-2F864 +2F865 CJK COMPATIBILITY IDEOGRAPH-2F865 +2F866 CJK COMPATIBILITY IDEOGRAPH-2F866 +2F867 CJK COMPATIBILITY IDEOGRAPH-2F867 +2F868 CJK COMPATIBILITY IDEOGRAPH-2F868 +2F869 CJK COMPATIBILITY IDEOGRAPH-2F869 +2F86A CJK COMPATIBILITY IDEOGRAPH-2F86A +2F86B CJK COMPATIBILITY IDEOGRAPH-2F86B +2F86C CJK COMPATIBILITY IDEOGRAPH-2F86C +2F86D CJK COMPATIBILITY IDEOGRAPH-2F86D +2F86E CJK COMPATIBILITY IDEOGRAPH-2F86E +2F86F CJK COMPATIBILITY IDEOGRAPH-2F86F +2F870 CJK COMPATIBILITY IDEOGRAPH-2F870 +2F871 CJK COMPATIBILITY IDEOGRAPH-2F871 +2F872 CJK COMPATIBILITY IDEOGRAPH-2F872 +2F873 CJK COMPATIBILITY IDEOGRAPH-2F873 +2F874 CJK COMPATIBILITY IDEOGRAPH-2F874 +2F875 CJK COMPATIBILITY IDEOGRAPH-2F875 +2F876 CJK COMPATIBILITY IDEOGRAPH-2F876 +2F877 CJK COMPATIBILITY IDEOGRAPH-2F877 +2F878 CJK COMPATIBILITY IDEOGRAPH-2F878 +2F879 CJK COMPATIBILITY IDEOGRAPH-2F879 +2F87A CJK COMPATIBILITY IDEOGRAPH-2F87A +2F87B CJK COMPATIBILITY IDEOGRAPH-2F87B +2F87C CJK COMPATIBILITY IDEOGRAPH-2F87C +2F87D CJK COMPATIBILITY IDEOGRAPH-2F87D +2F87E CJK COMPATIBILITY IDEOGRAPH-2F87E +2F87F CJK COMPATIBILITY IDEOGRAPH-2F87F +2F880 CJK COMPATIBILITY IDEOGRAPH-2F880 +2F881 CJK COMPATIBILITY IDEOGRAPH-2F881 +2F882 CJK COMPATIBILITY IDEOGRAPH-2F882 +2F883 CJK COMPATIBILITY IDEOGRAPH-2F883 +2F884 CJK COMPATIBILITY IDEOGRAPH-2F884 +2F885 CJK COMPATIBILITY IDEOGRAPH-2F885 +2F886 CJK COMPATIBILITY IDEOGRAPH-2F886 +2F887 CJK COMPATIBILITY IDEOGRAPH-2F887 +2F888 CJK COMPATIBILITY IDEOGRAPH-2F888 +2F889 CJK COMPATIBILITY IDEOGRAPH-2F889 +2F88A CJK COMPATIBILITY IDEOGRAPH-2F88A +2F88B CJK COMPATIBILITY IDEOGRAPH-2F88B +2F88C CJK COMPATIBILITY IDEOGRAPH-2F88C +2F88D CJK COMPATIBILITY IDEOGRAPH-2F88D +2F88E CJK COMPATIBILITY IDEOGRAPH-2F88E +2F88F CJK COMPATIBILITY IDEOGRAPH-2F88F +2F890 CJK COMPATIBILITY IDEOGRAPH-2F890 +2F891 CJK COMPATIBILITY IDEOGRAPH-2F891 +2F892 CJK COMPATIBILITY IDEOGRAPH-2F892 +2F893 CJK COMPATIBILITY IDEOGRAPH-2F893 +2F894 CJK COMPATIBILITY IDEOGRAPH-2F894 +2F895 CJK COMPATIBILITY IDEOGRAPH-2F895 +2F896 CJK COMPATIBILITY IDEOGRAPH-2F896 +2F897 CJK COMPATIBILITY IDEOGRAPH-2F897 +2F898 CJK COMPATIBILITY IDEOGRAPH-2F898 +2F899 CJK COMPATIBILITY IDEOGRAPH-2F899 +2F89A CJK COMPATIBILITY IDEOGRAPH-2F89A +2F89B CJK COMPATIBILITY IDEOGRAPH-2F89B +2F89C CJK COMPATIBILITY IDEOGRAPH-2F89C +2F89D CJK COMPATIBILITY IDEOGRAPH-2F89D +2F89E CJK COMPATIBILITY IDEOGRAPH-2F89E +2F89F CJK COMPATIBILITY IDEOGRAPH-2F89F +2F8A0 CJK COMPATIBILITY IDEOGRAPH-2F8A0 +2F8A1 CJK COMPATIBILITY IDEOGRAPH-2F8A1 +2F8A2 CJK COMPATIBILITY IDEOGRAPH-2F8A2 +2F8A3 CJK COMPATIBILITY IDEOGRAPH-2F8A3 +2F8A4 CJK COMPATIBILITY IDEOGRAPH-2F8A4 +2F8A5 CJK COMPATIBILITY IDEOGRAPH-2F8A5 +2F8A6 CJK COMPATIBILITY IDEOGRAPH-2F8A6 +2F8A7 CJK COMPATIBILITY IDEOGRAPH-2F8A7 +2F8A8 CJK COMPATIBILITY IDEOGRAPH-2F8A8 +2F8A9 CJK COMPATIBILITY IDEOGRAPH-2F8A9 +2F8AA CJK COMPATIBILITY IDEOGRAPH-2F8AA +2F8AB CJK COMPATIBILITY IDEOGRAPH-2F8AB +2F8AC CJK COMPATIBILITY IDEOGRAPH-2F8AC +2F8AD CJK COMPATIBILITY IDEOGRAPH-2F8AD +2F8AE CJK COMPATIBILITY IDEOGRAPH-2F8AE +2F8AF CJK COMPATIBILITY IDEOGRAPH-2F8AF +2F8B0 CJK COMPATIBILITY IDEOGRAPH-2F8B0 +2F8B1 CJK COMPATIBILITY IDEOGRAPH-2F8B1 +2F8B2 CJK COMPATIBILITY IDEOGRAPH-2F8B2 +2F8B3 CJK COMPATIBILITY IDEOGRAPH-2F8B3 +2F8B4 CJK COMPATIBILITY IDEOGRAPH-2F8B4 +2F8B5 CJK COMPATIBILITY IDEOGRAPH-2F8B5 +2F8B6 CJK COMPATIBILITY IDEOGRAPH-2F8B6 +2F8B7 CJK COMPATIBILITY IDEOGRAPH-2F8B7 +2F8B8 CJK COMPATIBILITY IDEOGRAPH-2F8B8 +2F8B9 CJK COMPATIBILITY IDEOGRAPH-2F8B9 +2F8BA CJK COMPATIBILITY IDEOGRAPH-2F8BA +2F8BB CJK COMPATIBILITY IDEOGRAPH-2F8BB +2F8BC CJK COMPATIBILITY IDEOGRAPH-2F8BC +2F8BD CJK COMPATIBILITY IDEOGRAPH-2F8BD +2F8BE CJK COMPATIBILITY IDEOGRAPH-2F8BE +2F8BF CJK COMPATIBILITY IDEOGRAPH-2F8BF +2F8C0 CJK COMPATIBILITY IDEOGRAPH-2F8C0 +2F8C1 CJK COMPATIBILITY IDEOGRAPH-2F8C1 +2F8C2 CJK COMPATIBILITY IDEOGRAPH-2F8C2 +2F8C3 CJK COMPATIBILITY IDEOGRAPH-2F8C3 +2F8C4 CJK COMPATIBILITY IDEOGRAPH-2F8C4 +2F8C5 CJK COMPATIBILITY IDEOGRAPH-2F8C5 +2F8C6 CJK COMPATIBILITY IDEOGRAPH-2F8C6 +2F8C7 CJK COMPATIBILITY IDEOGRAPH-2F8C7 +2F8C8 CJK COMPATIBILITY IDEOGRAPH-2F8C8 +2F8C9 CJK COMPATIBILITY IDEOGRAPH-2F8C9 +2F8CA CJK COMPATIBILITY IDEOGRAPH-2F8CA +2F8CB CJK COMPATIBILITY IDEOGRAPH-2F8CB +2F8CC CJK COMPATIBILITY IDEOGRAPH-2F8CC +2F8CD CJK COMPATIBILITY IDEOGRAPH-2F8CD +2F8CE CJK COMPATIBILITY IDEOGRAPH-2F8CE +2F8CF CJK COMPATIBILITY IDEOGRAPH-2F8CF +2F8D0 CJK COMPATIBILITY IDEOGRAPH-2F8D0 +2F8D1 CJK COMPATIBILITY IDEOGRAPH-2F8D1 +2F8D2 CJK COMPATIBILITY IDEOGRAPH-2F8D2 +2F8D3 CJK COMPATIBILITY IDEOGRAPH-2F8D3 +2F8D4 CJK COMPATIBILITY IDEOGRAPH-2F8D4 +2F8D5 CJK COMPATIBILITY IDEOGRAPH-2F8D5 +2F8D6 CJK COMPATIBILITY IDEOGRAPH-2F8D6 +2F8D7 CJK COMPATIBILITY IDEOGRAPH-2F8D7 +2F8D8 CJK COMPATIBILITY IDEOGRAPH-2F8D8 +2F8D9 CJK COMPATIBILITY IDEOGRAPH-2F8D9 +2F8DA CJK COMPATIBILITY IDEOGRAPH-2F8DA +2F8DB CJK COMPATIBILITY IDEOGRAPH-2F8DB +2F8DC CJK COMPATIBILITY IDEOGRAPH-2F8DC +2F8DD CJK COMPATIBILITY IDEOGRAPH-2F8DD +2F8DE CJK COMPATIBILITY IDEOGRAPH-2F8DE +2F8DF CJK COMPATIBILITY IDEOGRAPH-2F8DF +2F8E0 CJK COMPATIBILITY IDEOGRAPH-2F8E0 +2F8E1 CJK COMPATIBILITY IDEOGRAPH-2F8E1 +2F8E2 CJK COMPATIBILITY IDEOGRAPH-2F8E2 +2F8E3 CJK COMPATIBILITY IDEOGRAPH-2F8E3 +2F8E4 CJK COMPATIBILITY IDEOGRAPH-2F8E4 +2F8E5 CJK COMPATIBILITY IDEOGRAPH-2F8E5 +2F8E6 CJK COMPATIBILITY IDEOGRAPH-2F8E6 +2F8E7 CJK COMPATIBILITY IDEOGRAPH-2F8E7 +2F8E8 CJK COMPATIBILITY IDEOGRAPH-2F8E8 +2F8E9 CJK COMPATIBILITY IDEOGRAPH-2F8E9 +2F8EA CJK COMPATIBILITY IDEOGRAPH-2F8EA +2F8EB CJK COMPATIBILITY IDEOGRAPH-2F8EB +2F8EC CJK COMPATIBILITY IDEOGRAPH-2F8EC +2F8ED CJK COMPATIBILITY IDEOGRAPH-2F8ED +2F8EE CJK COMPATIBILITY IDEOGRAPH-2F8EE +2F8EF CJK COMPATIBILITY IDEOGRAPH-2F8EF +2F8F0 CJK COMPATIBILITY IDEOGRAPH-2F8F0 +2F8F1 CJK COMPATIBILITY IDEOGRAPH-2F8F1 +2F8F2 CJK COMPATIBILITY IDEOGRAPH-2F8F2 +2F8F3 CJK COMPATIBILITY IDEOGRAPH-2F8F3 +2F8F4 CJK COMPATIBILITY IDEOGRAPH-2F8F4 +2F8F5 CJK COMPATIBILITY IDEOGRAPH-2F8F5 +2F8F6 CJK COMPATIBILITY IDEOGRAPH-2F8F6 +2F8F7 CJK COMPATIBILITY IDEOGRAPH-2F8F7 +2F8F8 CJK COMPATIBILITY IDEOGRAPH-2F8F8 +2F8F9 CJK COMPATIBILITY IDEOGRAPH-2F8F9 +2F8FA CJK COMPATIBILITY IDEOGRAPH-2F8FA +2F8FB CJK COMPATIBILITY IDEOGRAPH-2F8FB +2F8FC CJK COMPATIBILITY IDEOGRAPH-2F8FC +2F8FD CJK COMPATIBILITY IDEOGRAPH-2F8FD +2F8FE CJK COMPATIBILITY IDEOGRAPH-2F8FE +2F8FF CJK COMPATIBILITY IDEOGRAPH-2F8FF +2F900 CJK COMPATIBILITY IDEOGRAPH-2F900 +2F901 CJK COMPATIBILITY IDEOGRAPH-2F901 +2F902 CJK COMPATIBILITY IDEOGRAPH-2F902 +2F903 CJK COMPATIBILITY IDEOGRAPH-2F903 +2F904 CJK COMPATIBILITY IDEOGRAPH-2F904 +2F905 CJK COMPATIBILITY IDEOGRAPH-2F905 +2F906 CJK COMPATIBILITY IDEOGRAPH-2F906 +2F907 CJK COMPATIBILITY IDEOGRAPH-2F907 +2F908 CJK COMPATIBILITY IDEOGRAPH-2F908 +2F909 CJK COMPATIBILITY IDEOGRAPH-2F909 +2F90A CJK COMPATIBILITY IDEOGRAPH-2F90A +2F90B CJK COMPATIBILITY IDEOGRAPH-2F90B +2F90C CJK COMPATIBILITY IDEOGRAPH-2F90C +2F90D CJK COMPATIBILITY IDEOGRAPH-2F90D +2F90E CJK COMPATIBILITY IDEOGRAPH-2F90E +2F90F CJK COMPATIBILITY IDEOGRAPH-2F90F +2F910 CJK COMPATIBILITY IDEOGRAPH-2F910 +2F911 CJK COMPATIBILITY IDEOGRAPH-2F911 +2F912 CJK COMPATIBILITY IDEOGRAPH-2F912 +2F913 CJK COMPATIBILITY IDEOGRAPH-2F913 +2F914 CJK COMPATIBILITY IDEOGRAPH-2F914 +2F915 CJK COMPATIBILITY IDEOGRAPH-2F915 +2F916 CJK COMPATIBILITY IDEOGRAPH-2F916 +2F917 CJK COMPATIBILITY IDEOGRAPH-2F917 +2F918 CJK COMPATIBILITY IDEOGRAPH-2F918 +2F919 CJK COMPATIBILITY IDEOGRAPH-2F919 +2F91A CJK COMPATIBILITY IDEOGRAPH-2F91A +2F91B CJK COMPATIBILITY IDEOGRAPH-2F91B +2F91C CJK COMPATIBILITY IDEOGRAPH-2F91C +2F91D CJK COMPATIBILITY IDEOGRAPH-2F91D +2F91E CJK COMPATIBILITY IDEOGRAPH-2F91E +2F91F CJK COMPATIBILITY IDEOGRAPH-2F91F +2F920 CJK COMPATIBILITY IDEOGRAPH-2F920 +2F921 CJK COMPATIBILITY IDEOGRAPH-2F921 +2F922 CJK COMPATIBILITY IDEOGRAPH-2F922 +2F923 CJK COMPATIBILITY IDEOGRAPH-2F923 +2F924 CJK COMPATIBILITY IDEOGRAPH-2F924 +2F925 CJK COMPATIBILITY IDEOGRAPH-2F925 +2F926 CJK COMPATIBILITY IDEOGRAPH-2F926 +2F927 CJK COMPATIBILITY IDEOGRAPH-2F927 +2F928 CJK COMPATIBILITY IDEOGRAPH-2F928 +2F929 CJK COMPATIBILITY IDEOGRAPH-2F929 +2F92A CJK COMPATIBILITY IDEOGRAPH-2F92A +2F92B CJK COMPATIBILITY IDEOGRAPH-2F92B +2F92C CJK COMPATIBILITY IDEOGRAPH-2F92C +2F92D CJK COMPATIBILITY IDEOGRAPH-2F92D +2F92E CJK COMPATIBILITY IDEOGRAPH-2F92E +2F92F CJK COMPATIBILITY IDEOGRAPH-2F92F +2F930 CJK COMPATIBILITY IDEOGRAPH-2F930 +2F931 CJK COMPATIBILITY IDEOGRAPH-2F931 +2F932 CJK COMPATIBILITY IDEOGRAPH-2F932 +2F933 CJK COMPATIBILITY IDEOGRAPH-2F933 +2F934 CJK COMPATIBILITY IDEOGRAPH-2F934 +2F935 CJK COMPATIBILITY IDEOGRAPH-2F935 +2F936 CJK COMPATIBILITY IDEOGRAPH-2F936 +2F937 CJK COMPATIBILITY IDEOGRAPH-2F937 +2F938 CJK COMPATIBILITY IDEOGRAPH-2F938 +2F939 CJK COMPATIBILITY IDEOGRAPH-2F939 +2F93A CJK COMPATIBILITY IDEOGRAPH-2F93A +2F93B CJK COMPATIBILITY IDEOGRAPH-2F93B +2F93C CJK COMPATIBILITY IDEOGRAPH-2F93C +2F93D CJK COMPATIBILITY IDEOGRAPH-2F93D +2F93E CJK COMPATIBILITY IDEOGRAPH-2F93E +2F93F CJK COMPATIBILITY IDEOGRAPH-2F93F +2F940 CJK COMPATIBILITY IDEOGRAPH-2F940 +2F941 CJK COMPATIBILITY IDEOGRAPH-2F941 +2F942 CJK COMPATIBILITY IDEOGRAPH-2F942 +2F943 CJK COMPATIBILITY IDEOGRAPH-2F943 +2F944 CJK COMPATIBILITY IDEOGRAPH-2F944 +2F945 CJK COMPATIBILITY IDEOGRAPH-2F945 +2F946 CJK COMPATIBILITY IDEOGRAPH-2F946 +2F947 CJK COMPATIBILITY IDEOGRAPH-2F947 +2F948 CJK COMPATIBILITY IDEOGRAPH-2F948 +2F949 CJK COMPATIBILITY IDEOGRAPH-2F949 +2F94A CJK COMPATIBILITY IDEOGRAPH-2F94A +2F94B CJK COMPATIBILITY IDEOGRAPH-2F94B +2F94C CJK COMPATIBILITY IDEOGRAPH-2F94C +2F94D CJK COMPATIBILITY IDEOGRAPH-2F94D +2F94E CJK COMPATIBILITY IDEOGRAPH-2F94E +2F94F CJK COMPATIBILITY IDEOGRAPH-2F94F +2F950 CJK COMPATIBILITY IDEOGRAPH-2F950 +2F951 CJK COMPATIBILITY IDEOGRAPH-2F951 +2F952 CJK COMPATIBILITY IDEOGRAPH-2F952 +2F953 CJK COMPATIBILITY IDEOGRAPH-2F953 +2F954 CJK COMPATIBILITY IDEOGRAPH-2F954 +2F955 CJK COMPATIBILITY IDEOGRAPH-2F955 +2F956 CJK COMPATIBILITY IDEOGRAPH-2F956 +2F957 CJK COMPATIBILITY IDEOGRAPH-2F957 +2F958 CJK COMPATIBILITY IDEOGRAPH-2F958 +2F959 CJK COMPATIBILITY IDEOGRAPH-2F959 +2F95A CJK COMPATIBILITY IDEOGRAPH-2F95A +2F95B CJK COMPATIBILITY IDEOGRAPH-2F95B +2F95C CJK COMPATIBILITY IDEOGRAPH-2F95C +2F95D CJK COMPATIBILITY IDEOGRAPH-2F95D +2F95E CJK COMPATIBILITY IDEOGRAPH-2F95E +2F95F CJK COMPATIBILITY IDEOGRAPH-2F95F +2F960 CJK COMPATIBILITY IDEOGRAPH-2F960 +2F961 CJK COMPATIBILITY IDEOGRAPH-2F961 +2F962 CJK COMPATIBILITY IDEOGRAPH-2F962 +2F963 CJK COMPATIBILITY IDEOGRAPH-2F963 +2F964 CJK COMPATIBILITY IDEOGRAPH-2F964 +2F965 CJK COMPATIBILITY IDEOGRAPH-2F965 +2F966 CJK COMPATIBILITY IDEOGRAPH-2F966 +2F967 CJK COMPATIBILITY IDEOGRAPH-2F967 +2F968 CJK COMPATIBILITY IDEOGRAPH-2F968 +2F969 CJK COMPATIBILITY IDEOGRAPH-2F969 +2F96A CJK COMPATIBILITY IDEOGRAPH-2F96A +2F96B CJK COMPATIBILITY IDEOGRAPH-2F96B +2F96C CJK COMPATIBILITY IDEOGRAPH-2F96C +2F96D CJK COMPATIBILITY IDEOGRAPH-2F96D +2F96E CJK COMPATIBILITY IDEOGRAPH-2F96E +2F96F CJK COMPATIBILITY IDEOGRAPH-2F96F +2F970 CJK COMPATIBILITY IDEOGRAPH-2F970 +2F971 CJK COMPATIBILITY IDEOGRAPH-2F971 +2F972 CJK COMPATIBILITY IDEOGRAPH-2F972 +2F973 CJK COMPATIBILITY IDEOGRAPH-2F973 +2F974 CJK COMPATIBILITY IDEOGRAPH-2F974 +2F975 CJK COMPATIBILITY IDEOGRAPH-2F975 +2F976 CJK COMPATIBILITY IDEOGRAPH-2F976 +2F977 CJK COMPATIBILITY IDEOGRAPH-2F977 +2F978 CJK COMPATIBILITY IDEOGRAPH-2F978 +2F979 CJK COMPATIBILITY IDEOGRAPH-2F979 +2F97A CJK COMPATIBILITY IDEOGRAPH-2F97A +2F97B CJK COMPATIBILITY IDEOGRAPH-2F97B +2F97C CJK COMPATIBILITY IDEOGRAPH-2F97C +2F97D CJK COMPATIBILITY IDEOGRAPH-2F97D +2F97E CJK COMPATIBILITY IDEOGRAPH-2F97E +2F97F CJK COMPATIBILITY IDEOGRAPH-2F97F +2F980 CJK COMPATIBILITY IDEOGRAPH-2F980 +2F981 CJK COMPATIBILITY IDEOGRAPH-2F981 +2F982 CJK COMPATIBILITY IDEOGRAPH-2F982 +2F983 CJK COMPATIBILITY IDEOGRAPH-2F983 +2F984 CJK COMPATIBILITY IDEOGRAPH-2F984 +2F985 CJK COMPATIBILITY IDEOGRAPH-2F985 +2F986 CJK COMPATIBILITY IDEOGRAPH-2F986 +2F987 CJK COMPATIBILITY IDEOGRAPH-2F987 +2F988 CJK COMPATIBILITY IDEOGRAPH-2F988 +2F989 CJK COMPATIBILITY IDEOGRAPH-2F989 +2F98A CJK COMPATIBILITY IDEOGRAPH-2F98A +2F98B CJK COMPATIBILITY IDEOGRAPH-2F98B +2F98C CJK COMPATIBILITY IDEOGRAPH-2F98C +2F98D CJK COMPATIBILITY IDEOGRAPH-2F98D +2F98E CJK COMPATIBILITY IDEOGRAPH-2F98E +2F98F CJK COMPATIBILITY IDEOGRAPH-2F98F +2F990 CJK COMPATIBILITY IDEOGRAPH-2F990 +2F991 CJK COMPATIBILITY IDEOGRAPH-2F991 +2F992 CJK COMPATIBILITY IDEOGRAPH-2F992 +2F993 CJK COMPATIBILITY IDEOGRAPH-2F993 +2F994 CJK COMPATIBILITY IDEOGRAPH-2F994 +2F995 CJK COMPATIBILITY IDEOGRAPH-2F995 +2F996 CJK COMPATIBILITY IDEOGRAPH-2F996 +2F997 CJK COMPATIBILITY IDEOGRAPH-2F997 +2F998 CJK COMPATIBILITY IDEOGRAPH-2F998 +2F999 CJK COMPATIBILITY IDEOGRAPH-2F999 +2F99A CJK COMPATIBILITY IDEOGRAPH-2F99A +2F99B CJK COMPATIBILITY IDEOGRAPH-2F99B +2F99C CJK COMPATIBILITY IDEOGRAPH-2F99C +2F99D CJK COMPATIBILITY IDEOGRAPH-2F99D +2F99E CJK COMPATIBILITY IDEOGRAPH-2F99E +2F99F CJK COMPATIBILITY IDEOGRAPH-2F99F +2F9A0 CJK COMPATIBILITY IDEOGRAPH-2F9A0 +2F9A1 CJK COMPATIBILITY IDEOGRAPH-2F9A1 +2F9A2 CJK COMPATIBILITY IDEOGRAPH-2F9A2 +2F9A3 CJK COMPATIBILITY IDEOGRAPH-2F9A3 +2F9A4 CJK COMPATIBILITY IDEOGRAPH-2F9A4 +2F9A5 CJK COMPATIBILITY IDEOGRAPH-2F9A5 +2F9A6 CJK COMPATIBILITY IDEOGRAPH-2F9A6 +2F9A7 CJK COMPATIBILITY IDEOGRAPH-2F9A7 +2F9A8 CJK COMPATIBILITY IDEOGRAPH-2F9A8 +2F9A9 CJK COMPATIBILITY IDEOGRAPH-2F9A9 +2F9AA CJK COMPATIBILITY IDEOGRAPH-2F9AA +2F9AB CJK COMPATIBILITY IDEOGRAPH-2F9AB +2F9AC CJK COMPATIBILITY IDEOGRAPH-2F9AC +2F9AD CJK COMPATIBILITY IDEOGRAPH-2F9AD +2F9AE CJK COMPATIBILITY IDEOGRAPH-2F9AE +2F9AF CJK COMPATIBILITY IDEOGRAPH-2F9AF +2F9B0 CJK COMPATIBILITY IDEOGRAPH-2F9B0 +2F9B1 CJK COMPATIBILITY IDEOGRAPH-2F9B1 +2F9B2 CJK COMPATIBILITY IDEOGRAPH-2F9B2 +2F9B3 CJK COMPATIBILITY IDEOGRAPH-2F9B3 +2F9B4 CJK COMPATIBILITY IDEOGRAPH-2F9B4 +2F9B5 CJK COMPATIBILITY IDEOGRAPH-2F9B5 +2F9B6 CJK COMPATIBILITY IDEOGRAPH-2F9B6 +2F9B7 CJK COMPATIBILITY IDEOGRAPH-2F9B7 +2F9B8 CJK COMPATIBILITY IDEOGRAPH-2F9B8 +2F9B9 CJK COMPATIBILITY IDEOGRAPH-2F9B9 +2F9BA CJK COMPATIBILITY IDEOGRAPH-2F9BA +2F9BB CJK COMPATIBILITY IDEOGRAPH-2F9BB +2F9BC CJK COMPATIBILITY IDEOGRAPH-2F9BC +2F9BD CJK COMPATIBILITY IDEOGRAPH-2F9BD +2F9BE CJK COMPATIBILITY IDEOGRAPH-2F9BE +2F9BF CJK COMPATIBILITY IDEOGRAPH-2F9BF +2F9C0 CJK COMPATIBILITY IDEOGRAPH-2F9C0 +2F9C1 CJK COMPATIBILITY IDEOGRAPH-2F9C1 +2F9C2 CJK COMPATIBILITY IDEOGRAPH-2F9C2 +2F9C3 CJK COMPATIBILITY IDEOGRAPH-2F9C3 +2F9C4 CJK COMPATIBILITY IDEOGRAPH-2F9C4 +2F9C5 CJK COMPATIBILITY IDEOGRAPH-2F9C5 +2F9C6 CJK COMPATIBILITY IDEOGRAPH-2F9C6 +2F9C7 CJK COMPATIBILITY IDEOGRAPH-2F9C7 +2F9C8 CJK COMPATIBILITY IDEOGRAPH-2F9C8 +2F9C9 CJK COMPATIBILITY IDEOGRAPH-2F9C9 +2F9CA CJK COMPATIBILITY IDEOGRAPH-2F9CA +2F9CB CJK COMPATIBILITY IDEOGRAPH-2F9CB +2F9CC CJK COMPATIBILITY IDEOGRAPH-2F9CC +2F9CD CJK COMPATIBILITY IDEOGRAPH-2F9CD +2F9CE CJK COMPATIBILITY IDEOGRAPH-2F9CE +2F9CF CJK COMPATIBILITY IDEOGRAPH-2F9CF +2F9D0 CJK COMPATIBILITY IDEOGRAPH-2F9D0 +2F9D1 CJK COMPATIBILITY IDEOGRAPH-2F9D1 +2F9D2 CJK COMPATIBILITY IDEOGRAPH-2F9D2 +2F9D3 CJK COMPATIBILITY IDEOGRAPH-2F9D3 +2F9D4 CJK COMPATIBILITY IDEOGRAPH-2F9D4 +2F9D5 CJK COMPATIBILITY IDEOGRAPH-2F9D5 +2F9D6 CJK COMPATIBILITY IDEOGRAPH-2F9D6 +2F9D7 CJK COMPATIBILITY IDEOGRAPH-2F9D7 +2F9D8 CJK COMPATIBILITY IDEOGRAPH-2F9D8 +2F9D9 CJK COMPATIBILITY IDEOGRAPH-2F9D9 +2F9DA CJK COMPATIBILITY IDEOGRAPH-2F9DA +2F9DB CJK COMPATIBILITY IDEOGRAPH-2F9DB +2F9DC CJK COMPATIBILITY IDEOGRAPH-2F9DC +2F9DD CJK COMPATIBILITY IDEOGRAPH-2F9DD +2F9DE CJK COMPATIBILITY IDEOGRAPH-2F9DE +2F9DF CJK COMPATIBILITY IDEOGRAPH-2F9DF +2F9E0 CJK COMPATIBILITY IDEOGRAPH-2F9E0 +2F9E1 CJK COMPATIBILITY IDEOGRAPH-2F9E1 +2F9E2 CJK COMPATIBILITY IDEOGRAPH-2F9E2 +2F9E3 CJK COMPATIBILITY IDEOGRAPH-2F9E3 +2F9E4 CJK COMPATIBILITY IDEOGRAPH-2F9E4 +2F9E5 CJK COMPATIBILITY IDEOGRAPH-2F9E5 +2F9E6 CJK COMPATIBILITY IDEOGRAPH-2F9E6 +2F9E7 CJK COMPATIBILITY IDEOGRAPH-2F9E7 +2F9E8 CJK COMPATIBILITY IDEOGRAPH-2F9E8 +2F9E9 CJK COMPATIBILITY IDEOGRAPH-2F9E9 +2F9EA CJK COMPATIBILITY IDEOGRAPH-2F9EA +2F9EB CJK COMPATIBILITY IDEOGRAPH-2F9EB +2F9EC CJK COMPATIBILITY IDEOGRAPH-2F9EC +2F9ED CJK COMPATIBILITY IDEOGRAPH-2F9ED +2F9EE CJK COMPATIBILITY IDEOGRAPH-2F9EE +2F9EF CJK COMPATIBILITY IDEOGRAPH-2F9EF +2F9F0 CJK COMPATIBILITY IDEOGRAPH-2F9F0 +2F9F1 CJK COMPATIBILITY IDEOGRAPH-2F9F1 +2F9F2 CJK COMPATIBILITY IDEOGRAPH-2F9F2 +2F9F3 CJK COMPATIBILITY IDEOGRAPH-2F9F3 +2F9F4 CJK COMPATIBILITY IDEOGRAPH-2F9F4 +2F9F5 CJK COMPATIBILITY IDEOGRAPH-2F9F5 +2F9F6 CJK COMPATIBILITY IDEOGRAPH-2F9F6 +2F9F7 CJK COMPATIBILITY IDEOGRAPH-2F9F7 +2F9F8 CJK COMPATIBILITY IDEOGRAPH-2F9F8 +2F9F9 CJK COMPATIBILITY IDEOGRAPH-2F9F9 +2F9FA CJK COMPATIBILITY IDEOGRAPH-2F9FA +2F9FB CJK COMPATIBILITY IDEOGRAPH-2F9FB +2F9FC CJK COMPATIBILITY IDEOGRAPH-2F9FC +2F9FD CJK COMPATIBILITY IDEOGRAPH-2F9FD +2F9FE CJK COMPATIBILITY IDEOGRAPH-2F9FE +2F9FF CJK COMPATIBILITY IDEOGRAPH-2F9FF +2FA00 CJK COMPATIBILITY IDEOGRAPH-2FA00 +2FA01 CJK COMPATIBILITY IDEOGRAPH-2FA01 +2FA02 CJK COMPATIBILITY IDEOGRAPH-2FA02 +2FA03 CJK COMPATIBILITY IDEOGRAPH-2FA03 +2FA04 CJK COMPATIBILITY IDEOGRAPH-2FA04 +2FA05 CJK COMPATIBILITY IDEOGRAPH-2FA05 +2FA06 CJK COMPATIBILITY IDEOGRAPH-2FA06 +2FA07 CJK COMPATIBILITY IDEOGRAPH-2FA07 +2FA08 CJK COMPATIBILITY IDEOGRAPH-2FA08 +2FA09 CJK COMPATIBILITY IDEOGRAPH-2FA09 +2FA0A CJK COMPATIBILITY IDEOGRAPH-2FA0A +2FA0B CJK COMPATIBILITY IDEOGRAPH-2FA0B +2FA0C CJK COMPATIBILITY IDEOGRAPH-2FA0C +2FA0D CJK COMPATIBILITY IDEOGRAPH-2FA0D +2FA0E CJK COMPATIBILITY IDEOGRAPH-2FA0E +2FA0F CJK COMPATIBILITY IDEOGRAPH-2FA0F +2FA10 CJK COMPATIBILITY IDEOGRAPH-2FA10 +2FA11 CJK COMPATIBILITY IDEOGRAPH-2FA11 +2FA12 CJK COMPATIBILITY IDEOGRAPH-2FA12 +2FA13 CJK COMPATIBILITY IDEOGRAPH-2FA13 +2FA14 CJK COMPATIBILITY IDEOGRAPH-2FA14 +2FA15 CJK COMPATIBILITY IDEOGRAPH-2FA15 +2FA16 CJK COMPATIBILITY IDEOGRAPH-2FA16 +2FA17 CJK COMPATIBILITY IDEOGRAPH-2FA17 +2FA18 CJK COMPATIBILITY IDEOGRAPH-2FA18 +2FA19 CJK COMPATIBILITY IDEOGRAPH-2FA19 +2FA1A CJK COMPATIBILITY IDEOGRAPH-2FA1A +2FA1B CJK COMPATIBILITY IDEOGRAPH-2FA1B +2FA1C CJK COMPATIBILITY IDEOGRAPH-2FA1C +2FA1D CJK COMPATIBILITY IDEOGRAPH-2FA1D +E0001 LANGUAGE TAG +E0020 TAG SPACE +E0021 TAG EXCLAMATION MARK +E0022 TAG QUOTATION MARK +E0023 TAG NUMBER SIGN +E0024 TAG DOLLAR SIGN +E0025 TAG PERCENT SIGN +E0026 TAG AMPERSAND +E0027 TAG APOSTROPHE +E0028 TAG LEFT PARENTHESIS +E0029 TAG RIGHT PARENTHESIS +E002A TAG ASTERISK +E002B TAG PLUS SIGN +E002C TAG COMMA +E002D TAG HYPHEN-MINUS +E002E TAG FULL STOP +E002F TAG SOLIDUS +E0030 TAG DIGIT ZERO +E0031 TAG DIGIT ONE +E0032 TAG DIGIT TWO +E0033 TAG DIGIT THREE +E0034 TAG DIGIT FOUR +E0035 TAG DIGIT FIVE +E0036 TAG DIGIT SIX +E0037 TAG DIGIT SEVEN +E0038 TAG DIGIT EIGHT +E0039 TAG DIGIT NINE +E003A TAG COLON +E003B TAG SEMICOLON +E003C TAG LESS-THAN SIGN +E003D TAG EQUALS SIGN +E003E TAG GREATER-THAN SIGN +E003F TAG QUESTION MARK +E0040 TAG COMMERCIAL AT +E0041 TAG LATIN CAPITAL LETTER A +E0042 TAG LATIN CAPITAL LETTER B +E0043 TAG LATIN CAPITAL LETTER C +E0044 TAG LATIN CAPITAL LETTER D +E0045 TAG LATIN CAPITAL LETTER E +E0046 TAG LATIN CAPITAL LETTER F +E0047 TAG LATIN CAPITAL LETTER G +E0048 TAG LATIN CAPITAL LETTER H +E0049 TAG LATIN CAPITAL LETTER I +E004A TAG LATIN CAPITAL LETTER J +E004B TAG LATIN CAPITAL LETTER K +E004C TAG LATIN CAPITAL LETTER L +E004D TAG LATIN CAPITAL LETTER M +E004E TAG LATIN CAPITAL LETTER N +E004F TAG LATIN CAPITAL LETTER O +E0050 TAG LATIN CAPITAL LETTER P +E0051 TAG LATIN CAPITAL LETTER Q +E0052 TAG LATIN CAPITAL LETTER R +E0053 TAG LATIN CAPITAL LETTER S +E0054 TAG LATIN CAPITAL LETTER T +E0055 TAG LATIN CAPITAL LETTER U +E0056 TAG LATIN CAPITAL LETTER V +E0057 TAG LATIN CAPITAL LETTER W +E0058 TAG LATIN CAPITAL LETTER X +E0059 TAG LATIN CAPITAL LETTER Y +E005A TAG LATIN CAPITAL LETTER Z +E005B TAG LEFT SQUARE BRACKET +E005C TAG REVERSE SOLIDUS +E005D TAG RIGHT SQUARE BRACKET +E005E TAG CIRCUMFLEX ACCENT +E005F TAG LOW LINE +E0060 TAG GRAVE ACCENT +E0061 TAG LATIN SMALL LETTER A +E0062 TAG LATIN SMALL LETTER B +E0063 TAG LATIN SMALL LETTER C +E0064 TAG LATIN SMALL LETTER D +E0065 TAG LATIN SMALL LETTER E +E0066 TAG LATIN SMALL LETTER F +E0067 TAG LATIN SMALL LETTER G +E0068 TAG LATIN SMALL LETTER H +E0069 TAG LATIN SMALL LETTER I +E006A TAG LATIN SMALL LETTER J +E006B TAG LATIN SMALL LETTER K +E006C TAG LATIN SMALL LETTER L +E006D TAG LATIN SMALL LETTER M +E006E TAG LATIN SMALL LETTER N +E006F TAG LATIN SMALL LETTER O +E0070 TAG LATIN SMALL LETTER P +E0071 TAG LATIN SMALL LETTER Q +E0072 TAG LATIN SMALL LETTER R +E0073 TAG LATIN SMALL LETTER S +E0074 TAG LATIN SMALL LETTER T +E0075 TAG LATIN SMALL LETTER U +E0076 TAG LATIN SMALL LETTER V +E0077 TAG LATIN SMALL LETTER W +E0078 TAG LATIN SMALL LETTER X +E0079 TAG LATIN SMALL LETTER Y +E007A TAG LATIN SMALL LETTER Z +E007B TAG LEFT CURLY BRACKET +E007C TAG VERTICAL LINE +E007D TAG RIGHT CURLY BRACKET +E007E TAG TILDE +E007F CANCEL TAG +E0100 VARIATION SELECTOR-17 +E0101 VARIATION SELECTOR-18 +E0102 VARIATION SELECTOR-19 +E0103 VARIATION SELECTOR-20 +E0104 VARIATION SELECTOR-21 +E0105 VARIATION SELECTOR-22 +E0106 VARIATION SELECTOR-23 +E0107 VARIATION SELECTOR-24 +E0108 VARIATION SELECTOR-25 +E0109 VARIATION SELECTOR-26 +E010A VARIATION SELECTOR-27 +E010B VARIATION SELECTOR-28 +E010C VARIATION SELECTOR-29 +E010D VARIATION SELECTOR-30 +E010E VARIATION SELECTOR-31 +E010F VARIATION SELECTOR-32 +E0110 VARIATION SELECTOR-33 +E0111 VARIATION SELECTOR-34 +E0112 VARIATION SELECTOR-35 +E0113 VARIATION SELECTOR-36 +E0114 VARIATION SELECTOR-37 +E0115 VARIATION SELECTOR-38 +E0116 VARIATION SELECTOR-39 +E0117 VARIATION SELECTOR-40 +E0118 VARIATION SELECTOR-41 +E0119 VARIATION SELECTOR-42 +E011A VARIATION SELECTOR-43 +E011B VARIATION SELECTOR-44 +E011C VARIATION SELECTOR-45 +E011D VARIATION SELECTOR-46 +E011E VARIATION SELECTOR-47 +E011F VARIATION SELECTOR-48 +E0120 VARIATION SELECTOR-49 +E0121 VARIATION SELECTOR-50 +E0122 VARIATION SELECTOR-51 +E0123 VARIATION SELECTOR-52 +E0124 VARIATION SELECTOR-53 +E0125 VARIATION SELECTOR-54 +E0126 VARIATION SELECTOR-55 +E0127 VARIATION SELECTOR-56 +E0128 VARIATION SELECTOR-57 +E0129 VARIATION SELECTOR-58 +E012A VARIATION SELECTOR-59 +E012B VARIATION SELECTOR-60 +E012C VARIATION SELECTOR-61 +E012D VARIATION SELECTOR-62 +E012E VARIATION SELECTOR-63 +E012F VARIATION SELECTOR-64 +E0130 VARIATION SELECTOR-65 +E0131 VARIATION SELECTOR-66 +E0132 VARIATION SELECTOR-67 +E0133 VARIATION SELECTOR-68 +E0134 VARIATION SELECTOR-69 +E0135 VARIATION SELECTOR-70 +E0136 VARIATION SELECTOR-71 +E0137 VARIATION SELECTOR-72 +E0138 VARIATION SELECTOR-73 +E0139 VARIATION SELECTOR-74 +E013A VARIATION SELECTOR-75 +E013B VARIATION SELECTOR-76 +E013C VARIATION SELECTOR-77 +E013D VARIATION SELECTOR-78 +E013E VARIATION SELECTOR-79 +E013F VARIATION SELECTOR-80 +E0140 VARIATION SELECTOR-81 +E0141 VARIATION SELECTOR-82 +E0142 VARIATION SELECTOR-83 +E0143 VARIATION SELECTOR-84 +E0144 VARIATION SELECTOR-85 +E0145 VARIATION SELECTOR-86 +E0146 VARIATION SELECTOR-87 +E0147 VARIATION SELECTOR-88 +E0148 VARIATION SELECTOR-89 +E0149 VARIATION SELECTOR-90 +E014A VARIATION SELECTOR-91 +E014B VARIATION SELECTOR-92 +E014C VARIATION SELECTOR-93 +E014D VARIATION SELECTOR-94 +E014E VARIATION SELECTOR-95 +E014F VARIATION SELECTOR-96 +E0150 VARIATION SELECTOR-97 +E0151 VARIATION SELECTOR-98 +E0152 VARIATION SELECTOR-99 +E0153 VARIATION SELECTOR-100 +E0154 VARIATION SELECTOR-101 +E0155 VARIATION SELECTOR-102 +E0156 VARIATION SELECTOR-103 +E0157 VARIATION SELECTOR-104 +E0158 VARIATION SELECTOR-105 +E0159 VARIATION SELECTOR-106 +E015A VARIATION SELECTOR-107 +E015B VARIATION SELECTOR-108 +E015C VARIATION SELECTOR-109 +E015D VARIATION SELECTOR-110 +E015E VARIATION SELECTOR-111 +E015F VARIATION SELECTOR-112 +E0160 VARIATION SELECTOR-113 +E0161 VARIATION SELECTOR-114 +E0162 VARIATION SELECTOR-115 +E0163 VARIATION SELECTOR-116 +E0164 VARIATION SELECTOR-117 +E0165 VARIATION SELECTOR-118 +E0166 VARIATION SELECTOR-119 +E0167 VARIATION SELECTOR-120 +E0168 VARIATION SELECTOR-121 +E0169 VARIATION SELECTOR-122 +E016A VARIATION SELECTOR-123 +E016B VARIATION SELECTOR-124 +E016C VARIATION SELECTOR-125 +E016D VARIATION SELECTOR-126 +E016E VARIATION SELECTOR-127 +E016F VARIATION SELECTOR-128 +E0170 VARIATION SELECTOR-129 +E0171 VARIATION SELECTOR-130 +E0172 VARIATION SELECTOR-131 +E0173 VARIATION SELECTOR-132 +E0174 VARIATION SELECTOR-133 +E0175 VARIATION SELECTOR-134 +E0176 VARIATION SELECTOR-135 +E0177 VARIATION SELECTOR-136 +E0178 VARIATION SELECTOR-137 +E0179 VARIATION SELECTOR-138 +E017A VARIATION SELECTOR-139 +E017B VARIATION SELECTOR-140 +E017C VARIATION SELECTOR-141 +E017D VARIATION SELECTOR-142 +E017E VARIATION SELECTOR-143 +E017F VARIATION SELECTOR-144 +E0180 VARIATION SELECTOR-145 +E0181 VARIATION SELECTOR-146 +E0182 VARIATION SELECTOR-147 +E0183 VARIATION SELECTOR-148 +E0184 VARIATION SELECTOR-149 +E0185 VARIATION SELECTOR-150 +E0186 VARIATION SELECTOR-151 +E0187 VARIATION SELECTOR-152 +E0188 VARIATION SELECTOR-153 +E0189 VARIATION SELECTOR-154 +E018A VARIATION SELECTOR-155 +E018B VARIATION SELECTOR-156 +E018C VARIATION SELECTOR-157 +E018D VARIATION SELECTOR-158 +E018E VARIATION SELECTOR-159 +E018F VARIATION SELECTOR-160 +E0190 VARIATION SELECTOR-161 +E0191 VARIATION SELECTOR-162 +E0192 VARIATION SELECTOR-163 +E0193 VARIATION SELECTOR-164 +E0194 VARIATION SELECTOR-165 +E0195 VARIATION SELECTOR-166 +E0196 VARIATION SELECTOR-167 +E0197 VARIATION SELECTOR-168 +E0198 VARIATION SELECTOR-169 +E0199 VARIATION SELECTOR-170 +E019A VARIATION SELECTOR-171 +E019B VARIATION SELECTOR-172 +E019C VARIATION SELECTOR-173 +E019D VARIATION SELECTOR-174 +E019E VARIATION SELECTOR-175 +E019F VARIATION SELECTOR-176 +E01A0 VARIATION SELECTOR-177 +E01A1 VARIATION SELECTOR-178 +E01A2 VARIATION SELECTOR-179 +E01A3 VARIATION SELECTOR-180 +E01A4 VARIATION SELECTOR-181 +E01A5 VARIATION SELECTOR-182 +E01A6 VARIATION SELECTOR-183 +E01A7 VARIATION SELECTOR-184 +E01A8 VARIATION SELECTOR-185 +E01A9 VARIATION SELECTOR-186 +E01AA VARIATION SELECTOR-187 +E01AB VARIATION SELECTOR-188 +E01AC VARIATION SELECTOR-189 +E01AD VARIATION SELECTOR-190 +E01AE VARIATION SELECTOR-191 +E01AF VARIATION SELECTOR-192 +E01B0 VARIATION SELECTOR-193 +E01B1 VARIATION SELECTOR-194 +E01B2 VARIATION SELECTOR-195 +E01B3 VARIATION SELECTOR-196 +E01B4 VARIATION SELECTOR-197 +E01B5 VARIATION SELECTOR-198 +E01B6 VARIATION SELECTOR-199 +E01B7 VARIATION SELECTOR-200 +E01B8 VARIATION SELECTOR-201 +E01B9 VARIATION SELECTOR-202 +E01BA VARIATION SELECTOR-203 +E01BB VARIATION SELECTOR-204 +E01BC VARIATION SELECTOR-205 +E01BD VARIATION SELECTOR-206 +E01BE VARIATION SELECTOR-207 +E01BF VARIATION SELECTOR-208 +E01C0 VARIATION SELECTOR-209 +E01C1 VARIATION SELECTOR-210 +E01C2 VARIATION SELECTOR-211 +E01C3 VARIATION SELECTOR-212 +E01C4 VARIATION SELECTOR-213 +E01C5 VARIATION SELECTOR-214 +E01C6 VARIATION SELECTOR-215 +E01C7 VARIATION SELECTOR-216 +E01C8 VARIATION SELECTOR-217 +E01C9 VARIATION SELECTOR-218 +E01CA VARIATION SELECTOR-219 +E01CB VARIATION SELECTOR-220 +E01CC VARIATION SELECTOR-221 +E01CD VARIATION SELECTOR-222 +E01CE VARIATION SELECTOR-223 +E01CF VARIATION SELECTOR-224 +E01D0 VARIATION SELECTOR-225 +E01D1 VARIATION SELECTOR-226 +E01D2 VARIATION SELECTOR-227 +E01D3 VARIATION SELECTOR-228 +E01D4 VARIATION SELECTOR-229 +E01D5 VARIATION SELECTOR-230 +E01D6 VARIATION SELECTOR-231 +E01D7 VARIATION SELECTOR-232 +E01D8 VARIATION SELECTOR-233 +E01D9 VARIATION SELECTOR-234 +E01DA VARIATION SELECTOR-235 +E01DB VARIATION SELECTOR-236 +E01DC VARIATION SELECTOR-237 +E01DD VARIATION SELECTOR-238 +E01DE VARIATION SELECTOR-239 +E01DF VARIATION SELECTOR-240 +E01E0 VARIATION SELECTOR-241 +E01E1 VARIATION SELECTOR-242 +E01E2 VARIATION SELECTOR-243 +E01E3 VARIATION SELECTOR-244 +E01E4 VARIATION SELECTOR-245 +E01E5 VARIATION SELECTOR-246 +E01E6 VARIATION SELECTOR-247 +E01E7 VARIATION SELECTOR-248 +E01E8 VARIATION SELECTOR-249 +E01E9 VARIATION SELECTOR-250 +E01EA VARIATION SELECTOR-251 +E01EB VARIATION SELECTOR-252 +E01EC VARIATION SELECTOR-253 +E01ED VARIATION SELECTOR-254 +E01EE VARIATION SELECTOR-255 +E01EF VARIATION SELECTOR-256 +F0000 FFFFD Plane 15 Private Use +100000 10FFFD Plane 16 Private Use +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/NamedSequences.txt b/Master/tlpkg/tlperl.old/lib/unicore/NamedSequences.txt new file mode 100644 index 00000000000..c880c50b911 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/NamedSequences.txt @@ -0,0 +1,95 @@ +# NamedSequences-4.1.0.txt +# Date: 2005-214, 13:10 PST [KW] +# +# Unicode Character Database +# Copyright (c) 1991-2005 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html +# +# Format: +# Name of Sequence; Code Point Sequence for USI +# +# Note: The order of entries in this file is not significant. +# However, entries are generally in script order corresponding +# to block order in the Unicode Standard, to make it easier +# to find entries in the list. + +# ================================================ + +LATIN CAPITAL LETTER A WITH MACRON AND GRAVE;0100 0300 +LATIN SMALL LETTER A WITH MACRON AND GRAVE;0101 0300 +LATIN SMALL LETTER A WITH ACUTE AND OGONEK;00E1 0328 +LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW;0045 0329 +LATIN SMALL LETTER E WITH VERTICAL LINE BELOW;0065 0329 +LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND GRAVE;00C8 0329 +LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND GRAVE;00E8 0329 +LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND ACUTE;00C9 0329 +LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND ACUTE;00E9 0329 +LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON;00CA 0304 +LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON;00EA 0304 +LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON;00CA 030C +LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON;00EA 030C +LATIN CAPITAL LETTER I WITH MACRON AND GRAVE;012A 0300 +LATIN SMALL LETTER I WITH MACRON AND GRAVE;012B 0300 +LATIN SMALL LETTER I WITH DOT ABOVE AND ACUTE;0069 0307 0301 +LATIN SMALL LETTER NG WITH TILDE ABOVE;006E 0360 0067 +LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW;004F 0329 +LATIN SMALL LETTER O WITH VERTICAL LINE BELOW;006F 0329 +LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND GRAVE;00D2 0329 +LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND GRAVE;00F2 0329 +LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND ACUTE;00D3 0329 +LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND ACUTE;00F3 0329 +LATIN CAPITAL LETTER S WITH VERTICAL LINE BELOW;0053 0329 +LATIN SMALL LETTER S WITH VERTICAL LINE BELOW;0073 0329 +LATIN CAPITAL LETTER U WITH MACRON AND GRAVE;016A 0300 +LATIN SMALL LETTER U WITH MACRON AND GRAVE;016B 0300 +GURMUKHI HALF YA;0A2F 0A4D +GURMUKHI PARI CA;0A4D 0A1A +GURMUKHI PARI TA;0A4D 0A24 +GURMUKHI PARI NA;0A4D 0A28 +GURMUKHI PARI YA;0A4D 0A2F +GURMUKHI PARI VA;0A4D 0A35 +GEORGIAN LETTER U-BRJGU;10E3 0302 +KHMER CONSONANT SIGN COENG KA;17D2 1780 +KHMER CONSONANT SIGN COENG KHA;17D2 1781 +KHMER CONSONANT SIGN COENG KO;17D2 1782 +KHMER CONSONANT SIGN COENG KHO;17D2 1783 +KHMER CONSONANT SIGN COENG NGO;17D2 1784 +KHMER CONSONANT SIGN COENG CA;17D2 1785 +KHMER CONSONANT SIGN COENG CHA;17D2 1786 +KHMER CONSONANT SIGN COENG CO;17D2 1787 +KHMER CONSONANT SIGN COENG CHO;17D2 1788 +KHMER CONSONANT SIGN COENG NYO;17D2 1789 +KHMER CONSONANT SIGN COENG DA;17D2 178A +KHMER CONSONANT SIGN COENG TTHA;17D2 178B +KHMER CONSONANT SIGN COENG DO;17D2 178C +KHMER CONSONANT SIGN COENG TTHO;17D2 178D +KHMER CONSONANT SIGN COENG NA;17D2 178E +KHMER CONSONANT SIGN COENG TA;17D2 178F +KHMER CONSONANT SIGN COENG THA;17D2 1790 +KHMER CONSONANT SIGN COENG TO;17D2 1791 +KHMER CONSONANT SIGN COENG THO;17D2 1792 +KHMER CONSONANT SIGN COENG NO;17D2 1793 +KHMER CONSONANT SIGN COENG BA;17D2 1794 +KHMER CONSONANT SIGN COENG PHA;17D2 1795 +KHMER CONSONANT SIGN COENG PO;17D2 1796 +KHMER CONSONANT SIGN COENG PHO;17D2 1797 +KHMER CONSONANT SIGN COENG MO;17D2 1798 +KHMER CONSONANT SIGN COENG YO;17D2 1799 +KHMER CONSONANT SIGN COENG RO;17D2 179A +KHMER CONSONANT SIGN COENG LO;17D2 179B +KHMER CONSONANT SIGN COENG VO;17D2 179C +KHMER CONSONANT SIGN COENG SHA;17D2 179D +KHMER CONSONANT SIGN COENG SSA;17D2 179E +KHMER CONSONANT SIGN COENG SA;17D2 179F +KHMER CONSONANT SIGN COENG HA;17D2 17A0 +KHMER CONSONANT SIGN COENG LA;17D2 17A1 +KHMER VOWEL SIGN COENG QA;17D2 17A2 +KHMER INDEPENDENT VOWEL SIGN COENG QU;17D2 17A7 +KHMER INDEPENDENT VOWEL SIGN COENG RY;17D2 17AB +KHMER INDEPENDENT VOWEL SIGN COENG RYY;17D2 17AC +KHMER INDEPENDENT VOWEL SIGN COENG QE;17D2 17AF +KHMER VOWEL SIGN OM;17BB 17C6 +KHMER VOWEL SIGN AAM;17B6 17C6 +KATAKANA LETTER AINU P;31F7 309A +MODIFIER LETTER EXTRA-HIGH EXTRA-LOW CONTOUR TONE BAR;02E5 02E9 diff --git a/Master/tlpkg/tlperl.old/lib/unicore/NamesList.txt b/Master/tlpkg/tlperl.old/lib/unicore/NamesList.txt new file mode 100644 index 00000000000..6adb13d920c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/NamesList.txt @@ -0,0 +1,27024 @@ +@@@ The Unicode Standard 4.1 +@@@+ U41M050317.lst + Draft Unicode 4.1 names list. + Major merger of post-Unicode 4.0 additions with Amd1 name file (xia050208.lst). + Accumulation of fixes post-Unicode 4.0. (5th collection) + Add alias for 2D53. + Corrected alias for 2697. + Subdivided headers for Modifier Tone Letters. + Add xrefs for 1DC0 and 1DC3. + Updated annotation for 301C. + Add xref to 2026 and 22EE for FE19. + This file is semi-automatically derived from UnicodeData.txt and + a set of manually created annotations using a script to select + or suppress information from the data file. The rules used + for this process are aimed at readability for the human reader, + at the expense of some details; therefore, this file should not + be parsed for machine-readable information. +@+ Copyright (c) 1991-2005 Unicode, Inc. + For terms of use, see http://www.unicode.org/terms_of_use.html +@@ 0000 C0 Controls and Basic Latin (Basic Latin) 007F +@ C0 controls +@+ Alias names are those for ISO/IEC 6429:1992. Commonly used alternative aliases are also shown. +0000 <control> + = NULL +0001 <control> + = START OF HEADING +0002 <control> + = START OF TEXT +0003 <control> + = END OF TEXT +0004 <control> + = END OF TRANSMISSION +0005 <control> + = ENQUIRY +0006 <control> + = ACKNOWLEDGE +0007 <control> + = BELL +0008 <control> + = BACKSPACE +0009 <control> + = CHARACTER TABULATION + = horizontal tabulation (HT), tab +000A <control> + = LINE FEED (LF) + = new line (NL), end of line (EOL) +000B <control> + = LINE TABULATION + = vertical tabulation (VT) +000C <control> + = FORM FEED (FF) +000D <control> + = CARRIAGE RETURN (CR) +000E <control> + = SHIFT OUT +000F <control> + = SHIFT IN +0010 <control> + = DATA LINK ESCAPE +0011 <control> + = DEVICE CONTROL ONE +0012 <control> + = DEVICE CONTROL TWO +0013 <control> + = DEVICE CONTROL THREE +0014 <control> + = DEVICE CONTROL FOUR +0015 <control> + = NEGATIVE ACKNOWLEDGE +0016 <control> + = SYNCHRONOUS IDLE +0017 <control> + = END OF TRANSMISSION BLOCK +0018 <control> + = CANCEL +0019 <control> + = END OF MEDIUM +001A <control> + = SUBSTITUTE + x (replacement character - FFFD) +001B <control> + = ESCAPE +001C <control> + = INFORMATION SEPARATOR FOUR + = file separator (FS) +001D <control> + = INFORMATION SEPARATOR THREE + = group separator (GS) +001E <control> + = INFORMATION SEPARATOR TWO + = record separator (RS) +001F <control> + = INFORMATION SEPARATOR ONE + = unit separator (US) +@ ASCII punctuation and symbols +@+ Based on ISO/IEC 646 from here. +0020 SPACE + * sometimes considered a control code + * other space characters: 2000-200A + x (no-break space - 00A0) + x (zero width space - 200B) + x (word joiner - 2060) + x (ideographic space - 3000) + x (zero width no-break space - FEFF) +0021 EXCLAMATION MARK + = factorial + = bang + x (inverted exclamation mark - 00A1) + x (latin letter retroflex click - 01C3) + x (double exclamation mark - 203C) + x (interrobang - 203D) + x (heavy exclamation mark ornament - 2762) +0022 QUOTATION MARK + * neutral (vertical), used as opening or closing quotation mark + * preferred characters in English for paired quotation marks are 201C & 201D + x (modifier letter double prime - 02BA) + x (combining double acute accent - 030B) + x (combining double vertical line above - 030E) + x (double prime - 2033) + x (ditto mark - 3003) +0023 NUMBER SIGN + = pound sign, hash, crosshatch, octothorpe + x (music sharp sign - 266F) +0024 DOLLAR SIGN + = milreis, escudo + * glyph may have one or two vertical bars + * other currency symbol characters: 20A0-20AF + x (currency sign - 00A4) +0025 PERCENT SIGN + x (arabic percent sign - 066A) + x (per mille sign - 2030) + x (per ten thousand sign - 2031) + x (commercial minus sign - 2052) +0026 AMPERSAND +0027 APOSTROPHE + = APOSTROPHE-QUOTE + = APL quote + * neutral (vertical) glyph with mixed usage + * 2019 is preferred for apostrophe + * preferred characters in English for paired quotation marks are 2018 & 2019 + x (modifier letter prime - 02B9) + x (modifier letter apostrophe - 02BC) + x (modifier letter vertical line - 02C8) + x (combining acute accent - 0301) + x (prime - 2032) +0028 LEFT PARENTHESIS + = OPENING PARENTHESIS +0029 RIGHT PARENTHESIS + = CLOSING PARENTHESIS + * see discussion on semantics of paired bracketing characters +002A ASTERISK + = star (on phone keypads) + x (arabic five pointed star - 066D) + x (low asterisk - 204E) + x (asterisk operator - 2217) + x (heavy asterisk - 2731) +002B PLUS SIGN +002C COMMA + = decimal separator + x (arabic comma - 060C) + x (single low-9 quotation mark - 201A) + x (ideographic comma - 3001) +002D HYPHEN-MINUS + = hyphen or minus sign + * used for either hyphen or minus sign + x (hyphen - 2010) + x (non-breaking hyphen - 2011) + x (figure dash - 2012) + x (en dash - 2013) + x (minus sign - 2212) +002E FULL STOP + = PERIOD + = dot, decimal point + * may be rendered as a raised decimal point in old style numbers + x (arabic full stop - 06D4) + x (ideographic full stop - 3002) +002F SOLIDUS + = SLASH + = virgule, shilling (British) + x (latin letter dental click - 01C0) + x (combining long solidus overlay - 0338) + x (fraction slash - 2044) + x (division slash - 2215) +@ ASCII digits +0030 DIGIT ZERO +0031 DIGIT ONE +0032 DIGIT TWO +0033 DIGIT THREE +0034 DIGIT FOUR +0035 DIGIT FIVE +0036 DIGIT SIX +0037 DIGIT SEVEN +0038 DIGIT EIGHT +0039 DIGIT NINE +@ ASCII punctuation and symbols +003A COLON + x (armenian full stop - 0589) + x (hebrew punctuation sof pasuq - 05C3) + x (ratio - 2236) +003B SEMICOLON + * this, and not 037E, is the preferred character for 'Greek question mark' + x (greek question mark - 037E) + x (arabic semicolon - 061B) + x (reversed semicolon - 204F) +003C LESS-THAN SIGN + x (single left-pointing angle quotation mark - 2039) + x (left-pointing angle bracket - 2329) + x (mathematical left angle bracket - 27E8) + x (left angle bracket - 3008) +003D EQUALS SIGN + * other related characters: 2241-2263 + x (not equal to - 2260) + x (identical to - 2261) +003E GREATER-THAN SIGN + x (single right-pointing angle quotation mark - 203A) + x (right-pointing angle bracket - 232A) + x (mathematical right angle bracket - 27E9) + x (right angle bracket - 3009) +003F QUESTION MARK + x (inverted question mark - 00BF) + x (greek question mark - 037E) + x (arabic question mark - 061F) + x (interrobang - 203D) + x (question exclamation mark - 2048) + x (exclamation question mark - 2049) +0040 COMMERCIAL AT + = Klammeraffe (common, humorous slang German name) +@ Uppercase Latin alphabet +0041 LATIN CAPITAL LETTER A +0042 LATIN CAPITAL LETTER B + x (script capital b - 212C) +0043 LATIN CAPITAL LETTER C + x (double-struck capital c - 2102) + x (black-letter capital c - 212D) +0044 LATIN CAPITAL LETTER D +0045 LATIN CAPITAL LETTER E + x (euler constant - 2107) + x (script capital e - 2130) +0046 LATIN CAPITAL LETTER F + x (script capital f - 2131) + x (turned capital f - 2132) +0047 LATIN CAPITAL LETTER G + * invented circa 300 BCE by Spurius Carvilius Ruga, who added a stroke to the letter C +0048 LATIN CAPITAL LETTER H + x (script capital h - 210B) + x (black-letter capital h - 210C) + x (double-struck capital h - 210D) +0049 LATIN CAPITAL LETTER I + * Turkish and Azerbaijani use 0131 for lowercase + x (latin capital letter i with dot above - 0130) + x (cyrillic capital letter byelorussian-ukrainian i - 0406) + x (cyrillic letter palochka - 04C0) + x (script capital i - 2110) + x (black-letter capital i - 2111) + x (roman numeral one - 2160) +004A LATIN CAPITAL LETTER J +004B LATIN CAPITAL LETTER K + x (kelvin sign - 212A) +004C LATIN CAPITAL LETTER L + x (script capital l - 2112) +004D LATIN CAPITAL LETTER M + x (script capital m - 2133) +004E LATIN CAPITAL LETTER N + x (double-struck capital n - 2115) +004F LATIN CAPITAL LETTER O +0050 LATIN CAPITAL LETTER P + x (double-struck capital p - 2119) +0051 LATIN CAPITAL LETTER Q + x (double-struck capital q - 211A) +0052 LATIN CAPITAL LETTER R + x (script capital r - 211B) + x (black-letter capital r - 211C) + x (double-struck capital r - 211D) +0053 LATIN CAPITAL LETTER S +0054 LATIN CAPITAL LETTER T +0055 LATIN CAPITAL LETTER U +0056 LATIN CAPITAL LETTER V +0057 LATIN CAPITAL LETTER W +0058 LATIN CAPITAL LETTER X +0059 LATIN CAPITAL LETTER Y +005A LATIN CAPITAL LETTER Z + x (double-struck capital z - 2124) + x (black-letter capital z - 2128) +@ ASCII punctuation and symbols +005B LEFT SQUARE BRACKET + = OPENING SQUARE BRACKET + * other bracket characters: 3008-301B +005C REVERSE SOLIDUS + = BACKSLASH + x (combining reverse solidus overlay - 20E5) + x (set minus - 2216) +005D RIGHT SQUARE BRACKET + = CLOSING SQUARE BRACKET +005E CIRCUMFLEX ACCENT + * this is a spacing character + x (modifier letter up arrowhead - 02C4) + x (modifier letter circumflex accent - 02C6) + x (combining circumflex accent - 0302) + x (up arrowhead - 2303) +005F LOW LINE + = SPACING UNDERSCORE + * this is a spacing character + x (modifier letter low macron - 02CD) + x (combining macron below - 0331) + x (combining low line - 0332) + x (double low line - 2017) +0060 GRAVE ACCENT + * this is a spacing character + x (modifier letter grave accent - 02CB) + x (combining grave accent - 0300) + x (reversed prime - 2035) +@ Lowercase Latin alphabet +0061 LATIN SMALL LETTER A +0062 LATIN SMALL LETTER B +0063 LATIN SMALL LETTER C +0064 LATIN SMALL LETTER D +0065 LATIN SMALL LETTER E + x (estimated symbol - 212E) + x (script small e - 212F) +0066 LATIN SMALL LETTER F +0067 LATIN SMALL LETTER G + x (latin small letter script g - 0261) + x (script small g - 210A) +0068 LATIN SMALL LETTER H + x (cyrillic small letter shha - 04BB) + x (planck constant - 210E) +0069 LATIN SMALL LETTER I + * Turkish and Azerbaijani use 0130 for uppercase + x (latin small letter dotless i - 0131) +006A LATIN SMALL LETTER J +006B LATIN SMALL LETTER K +006C LATIN SMALL LETTER L + x (script small l - 2113) +006D LATIN SMALL LETTER M +006E LATIN SMALL LETTER N + x (superscript latin small letter n - 207F) +006F LATIN SMALL LETTER O + x (script small o - 2134) +0070 LATIN SMALL LETTER P +0071 LATIN SMALL LETTER Q +0072 LATIN SMALL LETTER R +0073 LATIN SMALL LETTER S +0074 LATIN SMALL LETTER T +0075 LATIN SMALL LETTER U +0076 LATIN SMALL LETTER V +0077 LATIN SMALL LETTER W +0078 LATIN SMALL LETTER X +0079 LATIN SMALL LETTER Y +007A LATIN SMALL LETTER Z + x (latin small letter z with stroke - 01B6) +@ ASCII punctuation and symbols +007B LEFT CURLY BRACKET + = OPENING CURLY BRACKET + = opening brace +007C VERTICAL LINE + = VERTICAL BAR + * used in pairs to indicate absolute value + x (latin letter dental click - 01C0) + x (hebrew punctuation paseq - 05C0) + x (divides - 2223) + x (light vertical bar - 2758) +007D RIGHT CURLY BRACKET + = CLOSING CURLY BRACKET + = closing brace +007E TILDE + * this is a spacing character + x (small tilde - 02DC) + x (combining tilde - 0303) + x (swung dash - 2053) + x (tilde operator - 223C) + x (fullwidth tilde - FF5E) +@ Control character +007F <control> + = DELETE +@@ 0080 C1 Controls and Latin-1 Supplement (Latin-1 Supplement) 00FF +@ C1 controls +@+ Alias names are those for ISO/IEC 6429:1992. +0080 <control> +0081 <control> +0082 <control> + = BREAK PERMITTED HERE +0083 <control> + = NO BREAK HERE +0084 <control> +0085 <control> + = NEXT LINE (NEL) +0086 <control> + = START OF SELECTED AREA +0087 <control> + = END OF SELECTED AREA +0088 <control> + = CHARACTER TABULATION SET +0089 <control> + = CHARACTER TABULATION WITH JUSTIFICATION +008A <control> + = LINE TABULATION SET +008B <control> + = PARTIAL LINE FORWARD +008C <control> + = PARTIAL LINE BACKWARD +008D <control> + = REVERSE LINE FEED +008E <control> + = SINGLE SHIFT TWO +008F <control> + = SINGLE SHIFT THREE +0090 <control> + = DEVICE CONTROL STRING +0091 <control> + = PRIVATE USE ONE +0092 <control> + = PRIVATE USE TWO +0093 <control> + = SET TRANSMIT STATE +0094 <control> + = CANCEL CHARACTER +0095 <control> + = MESSAGE WAITING +0096 <control> + = START OF GUARDED AREA +0097 <control> + = END OF GUARDED AREA +0098 <control> + = START OF STRING +0099 <control> +009A <control> + = SINGLE CHARACTER INTRODUCER +009B <control> + = CONTROL SEQUENCE INTRODUCER +009C <control> + = STRING TERMINATOR +009D <control> + = OPERATING SYSTEM COMMAND +009E <control> + = PRIVACY MESSAGE +009F <control> + = APPLICATION PROGRAM COMMAND +@ Latin-1 punctuation and symbols +@+ Based on ISO/IEC 8859-1 (aka Latin-1) from here. +00A0 NO-BREAK SPACE + = NBSP + x (space - 0020) + x (figure space - 2007) + x (narrow no-break space - 202F) + x (word joiner - 2060) + x (zero width no-break space - FEFF) + # <noBreak> 0020 +00A1 INVERTED EXCLAMATION MARK + * Spanish, Asturian, Galician + x (exclamation mark - 0021) +00A2 CENT SIGN +00A3 POUND SIGN + = pound sterling, Irish punt, Italian lira, Turkish lira, etc. + x (lira sign - 20A4) +00A4 CURRENCY SIGN + * other currency symbol characters: 20A0-20AF + x (dollar sign - 0024) +00A5 YEN SIGN + = yuan sign + * glyph may have one or two crossbars +00A6 BROKEN BAR + = BROKEN VERTICAL BAR + = parted rule (in typography) +00A7 SECTION SIGN + * paragraph sign in some European usage +00A8 DIAERESIS + * this is a spacing character + x (combining diaeresis - 0308) + # 0020 0308 +00A9 COPYRIGHT SIGN + x (sound recording copyright - 2117) +00AA FEMININE ORDINAL INDICATOR + * Spanish + # <super> 0061 +00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK * + = LEFT POINTING GUILLEMET + = chevrons (in typography) + * usually opening, sometimes closing + x (much less-than - 226A) + x (left double angle bracket - 300A) +00AC NOT SIGN + = angled dash (in typography) + x (reversed not sign - 2310) +00AD SOFT HYPHEN + = SHY + = discretionary hyphen + x (mongolian todo soft hyphen - 1806) +00AE REGISTERED SIGN + = REGISTERED TRADE MARK SIGN +00AF MACRON + = overline, APL overbar + * this is a spacing character + x (modifier letter macron - 02C9) + x (combining macron - 0304) + x (combining overline - 0305) + # 0020 0304 +00B0 DEGREE SIGN + * this is a spacing character + x (ring above - 02DA) + x (combining ring above - 030A) + x (superscript zero - 2070) + x (ring operator - 2218) +00B1 PLUS-MINUS SIGN + x (minus-or-plus sign - 2213) +00B2 SUPERSCRIPT TWO + = squared + * other superscript digit characters: 2070-2079 + x (superscript one - 00B9) + # <super> 0032 +00B3 SUPERSCRIPT THREE + = cubed + x (superscript one - 00B9) + # <super> 0033 +00B4 ACUTE ACCENT + * this is a spacing character + x (modifier letter prime - 02B9) + x (modifier letter acute accent - 02CA) + x (combining acute accent - 0301) + x (prime - 2032) + # 0020 0301 +00B5 MICRO SIGN + # 03BC greek small letter mu +00B6 PILCROW SIGN + = PARAGRAPH SIGN + * section sign in some European usage + x (reversed pilcrow sign - 204B) + x (curved stem paragraph sign ornament - 2761) +00B7 MIDDLE DOT + = midpoint (in typography) + = Georgian comma + = Greek middle dot (ano teleia) + x (greek ano teleia - 0387) + x (bullet - 2022) + x (one dot leader - 2024) + x (hyphenation point - 2027) + x (bullet operator - 2219) + x (dot operator - 22C5) + x (katakana middle dot - 30FB) +00B8 CEDILLA + * this is a spacing character + * other spacing accent characters: 02D8-02DB + x (combining cedilla - 0327) + # 0020 0327 +00B9 SUPERSCRIPT ONE + x (superscript two - 00B2) + x (superscript three - 00B3) + # <super> 0031 +00BA MASCULINE ORDINAL INDICATOR + * Spanish + # <super> 006F +00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK * + = RIGHT POINTING GUILLEMET + * usually closing, sometimes opening + x (much greater-than - 226B) + x (right double angle bracket - 300B) +00BC VULGAR FRACTION ONE QUARTER + * bar may be horizontal or slanted + * other fraction characters: 2153-215E + # <fraction> 0031 2044 0034 +00BD VULGAR FRACTION ONE HALF + * bar may be horizontal or slanted + # <fraction> 0031 2044 0032 +00BE VULGAR FRACTION THREE QUARTERS + * bar may be horizontal or slanted + # <fraction> 0033 2044 0034 +00BF INVERTED QUESTION MARK + = turned question mark + * Spanish + x (question mark - 003F) +@ Letters +00C0 LATIN CAPITAL LETTER A WITH GRAVE + : 0041 0300 +00C1 LATIN CAPITAL LETTER A WITH ACUTE + : 0041 0301 +00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + : 0041 0302 +00C3 LATIN CAPITAL LETTER A WITH TILDE + : 0041 0303 +00C4 LATIN CAPITAL LETTER A WITH DIAERESIS + : 0041 0308 +00C5 LATIN CAPITAL LETTER A WITH RING ABOVE + x (angstrom sign - 212B) + : 0041 030A +00C6 LATIN CAPITAL LETTER AE (ash) * + = LATIN CAPITAL LIGATURE AE +00C7 LATIN CAPITAL LETTER C WITH CEDILLA + : 0043 0327 +00C8 LATIN CAPITAL LETTER E WITH GRAVE + : 0045 0300 +00C9 LATIN CAPITAL LETTER E WITH ACUTE + : 0045 0301 +00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX + : 0045 0302 +00CB LATIN CAPITAL LETTER E WITH DIAERESIS + : 0045 0308 +00CC LATIN CAPITAL LETTER I WITH GRAVE + : 0049 0300 +00CD LATIN CAPITAL LETTER I WITH ACUTE + : 0049 0301 +00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX + : 0049 0302 +00CF LATIN CAPITAL LETTER I WITH DIAERESIS + : 0049 0308 +00D0 LATIN CAPITAL LETTER ETH (Icelandic) + x (latin small letter eth - 00F0) + x (latin capital letter d with stroke - 0110) + x (latin capital letter african d - 0189) +00D1 LATIN CAPITAL LETTER N WITH TILDE + : 004E 0303 +00D2 LATIN CAPITAL LETTER O WITH GRAVE + : 004F 0300 +00D3 LATIN CAPITAL LETTER O WITH ACUTE + : 004F 0301 +00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + : 004F 0302 +00D5 LATIN CAPITAL LETTER O WITH TILDE + : 004F 0303 +00D6 LATIN CAPITAL LETTER O WITH DIAERESIS + : 004F 0308 +@ Mathematical operator +00D7 MULTIPLICATION SIGN + = z notation Cartesian product +@ Letters +00D8 LATIN CAPITAL LETTER O WITH STROKE + = LATIN CAPITAL LETTER O SLASH + x (empty set - 2205) +00D9 LATIN CAPITAL LETTER U WITH GRAVE + : 0055 0300 +00DA LATIN CAPITAL LETTER U WITH ACUTE + : 0055 0301 +00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX + : 0055 0302 +00DC LATIN CAPITAL LETTER U WITH DIAERESIS + : 0055 0308 +00DD LATIN CAPITAL LETTER Y WITH ACUTE + : 0059 0301 +00DE LATIN CAPITAL LETTER THORN (Icelandic) +00DF LATIN SMALL LETTER SHARP S (German) + = Eszett + * German + * uppercase is "SS" + * in origin a ligature of 017F and 0073 + x (greek small letter beta - 03B2) +00E0 LATIN SMALL LETTER A WITH GRAVE + : 0061 0300 +00E1 LATIN SMALL LETTER A WITH ACUTE + : 0061 0301 +00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX + : 0061 0302 +00E3 LATIN SMALL LETTER A WITH TILDE + * Portuguese + : 0061 0303 +00E4 LATIN SMALL LETTER A WITH DIAERESIS + : 0061 0308 +00E5 LATIN SMALL LETTER A WITH RING ABOVE + * Danish, Norwegian, Swedish, Walloon + : 0061 030A +00E6 LATIN SMALL LETTER AE (ash) * + = LATIN SMALL LIGATURE AE + = ash (from Old English æsc) + * Danish, Norwegian, Icelandic, Faroese, Old English, French, IPA + x (latin small ligature oe - 0153) + x (cyrillic small ligature a ie - 04D5) +00E7 LATIN SMALL LETTER C WITH CEDILLA + : 0063 0327 +00E8 LATIN SMALL LETTER E WITH GRAVE + : 0065 0300 +00E9 LATIN SMALL LETTER E WITH ACUTE + : 0065 0301 +00EA LATIN SMALL LETTER E WITH CIRCUMFLEX + : 0065 0302 +00EB LATIN SMALL LETTER E WITH DIAERESIS + : 0065 0308 +00EC LATIN SMALL LETTER I WITH GRAVE + * Italian, Malagasy + : 0069 0300 +00ED LATIN SMALL LETTER I WITH ACUTE + : 0069 0301 +00EE LATIN SMALL LETTER I WITH CIRCUMFLEX + : 0069 0302 +00EF LATIN SMALL LETTER I WITH DIAERESIS + : 0069 0308 +00F0 LATIN SMALL LETTER ETH (Icelandic) + * Icelandic, Faroese, Old English, IPA + x (latin capital letter eth - 00D0) + x (greek small letter delta - 03B4) + x (partial differential - 2202) +00F1 LATIN SMALL LETTER N WITH TILDE + : 006E 0303 +00F2 LATIN SMALL LETTER O WITH GRAVE + : 006F 0300 +00F3 LATIN SMALL LETTER O WITH ACUTE + : 006F 0301 +00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX + : 006F 0302 +00F5 LATIN SMALL LETTER O WITH TILDE + * Portuguese, Estonian + : 006F 0303 +00F6 LATIN SMALL LETTER O WITH DIAERESIS + : 006F 0308 +@ Mathematical operator +00F7 DIVISION SIGN + x (division slash - 2215) + x (divides - 2223) +@ Letters +00F8 LATIN SMALL LETTER O WITH STROKE + = LATIN SMALL LETTER O SLASH + * Danish, Norwegian, Faroese, IPA +00F9 LATIN SMALL LETTER U WITH GRAVE + * French, Italian + : 0075 0300 +00FA LATIN SMALL LETTER U WITH ACUTE + : 0075 0301 +00FB LATIN SMALL LETTER U WITH CIRCUMFLEX + : 0075 0302 +00FC LATIN SMALL LETTER U WITH DIAERESIS + : 0075 0308 +00FD LATIN SMALL LETTER Y WITH ACUTE + * Czech, Slovak, Icelandic, Faroese, Welsh, Malagasy + : 0079 0301 +00FE LATIN SMALL LETTER THORN (Icelandic) + * Icelandic, Old English, phonetics + * Runic letter borrowed into Latin script + x (runic letter thurisaz thurs thorn - 16A6) +00FF LATIN SMALL LETTER Y WITH DIAERESIS + * French + x (latin capital letter y with diaeresis - 0178) + : 0079 0308 +@@ 0100 Latin Extended-A 017F +@ European Latin +0100 LATIN CAPITAL LETTER A WITH MACRON + : 0041 0304 +0101 LATIN SMALL LETTER A WITH MACRON + * Latvian, Latin, ... + : 0061 0304 +0102 LATIN CAPITAL LETTER A WITH BREVE + : 0041 0306 +0103 LATIN SMALL LETTER A WITH BREVE + * Romanian, Vietnamese, Latin, ... + : 0061 0306 +0104 LATIN CAPITAL LETTER A WITH OGONEK + : 0041 0328 +0105 LATIN SMALL LETTER A WITH OGONEK + * Polish, Lithuanian, ... + : 0061 0328 +0106 LATIN CAPITAL LETTER C WITH ACUTE + : 0043 0301 +0107 LATIN SMALL LETTER C WITH ACUTE + * Polish, Croatian, ... + x (cyrillic small letter tshe - 045B) + : 0063 0301 +0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX + : 0043 0302 +0109 LATIN SMALL LETTER C WITH CIRCUMFLEX + * Esperanto + : 0063 0302 +010A LATIN CAPITAL LETTER C WITH DOT ABOVE + : 0043 0307 +010B LATIN SMALL LETTER C WITH DOT ABOVE + * Maltese, Irish Gaelic (old orthography) + : 0063 0307 +010C LATIN CAPITAL LETTER C WITH CARON + : 0043 030C +010D LATIN SMALL LETTER C WITH CARON + * Czech, Slovak, Slovenian, and many other languages + : 0063 030C +010E LATIN CAPITAL LETTER D WITH CARON + * the form using caron/hacek is preferred in all contexts + : 0044 030C +010F LATIN SMALL LETTER D WITH CARON + * Czech, Slovak + * the form using apostrophe is preferred in typesetting + : 0064 030C +0110 LATIN CAPITAL LETTER D WITH STROKE + x (latin capital letter eth - 00D0) + x (latin small letter d with stroke - 0111) + x (latin capital letter african d - 0189) +0111 LATIN SMALL LETTER D WITH STROKE + * Croatian, Vietnamese, Sami + * an alternate glyph with the stroke through the bowl is used in Americanist orthographies + x (latin capital letter d with stroke - 0110) + x (cyrillic small letter dje - 0452) +0112 LATIN CAPITAL LETTER E WITH MACRON + : 0045 0304 +0113 LATIN SMALL LETTER E WITH MACRON + * Latvian, Latin, ... + : 0065 0304 +0114 LATIN CAPITAL LETTER E WITH BREVE + : 0045 0306 +0115 LATIN SMALL LETTER E WITH BREVE + * Malay, Latin, ... + : 0065 0306 +0116 LATIN CAPITAL LETTER E WITH DOT ABOVE + : 0045 0307 +0117 LATIN SMALL LETTER E WITH DOT ABOVE + * Lithuanian + : 0065 0307 +0118 LATIN CAPITAL LETTER E WITH OGONEK + : 0045 0328 +0119 LATIN SMALL LETTER E WITH OGONEK + * Polish, Lithuanian, ... + : 0065 0328 +011A LATIN CAPITAL LETTER E WITH CARON + : 0045 030C +011B LATIN SMALL LETTER E WITH CARON + * Czech, ... + : 0065 030C +011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX + : 0047 0302 +011D LATIN SMALL LETTER G WITH CIRCUMFLEX + * Esperanto + : 0067 0302 +011E LATIN CAPITAL LETTER G WITH BREVE + : 0047 0306 +011F LATIN SMALL LETTER G WITH BREVE + * Turkish, Azerbaijani + x (latin small letter g with caron - 01E7) + : 0067 0306 +0120 LATIN CAPITAL LETTER G WITH DOT ABOVE + : 0047 0307 +0121 LATIN SMALL LETTER G WITH DOT ABOVE + * Maltese, Irish Gaelic (old orthography) + : 0067 0307 +0122 LATIN CAPITAL LETTER G WITH CEDILLA + : 0047 0327 +0123 LATIN SMALL LETTER G WITH CEDILLA + * Latvian + * there are three major glyph variants + : 0067 0327 +0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX + : 0048 0302 +0125 LATIN SMALL LETTER H WITH CIRCUMFLEX + * Esperanto + : 0068 0302 +0126 LATIN CAPITAL LETTER H WITH STROKE +0127 LATIN SMALL LETTER H WITH STROKE + * Maltese, IPA, ... + x (cyrillic small letter tshe - 045B) + x (planck constant over two pi - 210F) +0128 LATIN CAPITAL LETTER I WITH TILDE + : 0049 0303 +0129 LATIN SMALL LETTER I WITH TILDE + * Greenlandic (old orthography) + : 0069 0303 +012A LATIN CAPITAL LETTER I WITH MACRON + : 0049 0304 +012B LATIN SMALL LETTER I WITH MACRON + * Latvian, Latin, ... + : 0069 0304 +012C LATIN CAPITAL LETTER I WITH BREVE + : 0049 0306 +012D LATIN SMALL LETTER I WITH BREVE + * Latin, ... + : 0069 0306 +012E LATIN CAPITAL LETTER I WITH OGONEK + : 0049 0328 +012F LATIN SMALL LETTER I WITH OGONEK + * Lithuanian, ... + : 0069 0328 +0130 LATIN CAPITAL LETTER I WITH DOT ABOVE + = LATIN CAPITAL LETTER I DOT + * Turkish, Azerbaijani + * lowercase is 0069 + x (latin capital letter i - 0049) + : 0049 0307 +0131 LATIN SMALL LETTER DOTLESS I + * Turkish, Azerbaijani + * uppercase is 0049 + x (latin small letter i - 0069) +0132 LATIN CAPITAL LIGATURE IJ + # 0049 004A +0133 LATIN SMALL LIGATURE IJ + * Dutch + # 0069 006A +0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX + : 004A 0302 +0135 LATIN SMALL LETTER J WITH CIRCUMFLEX + * Esperanto + : 006A 0302 +0136 LATIN CAPITAL LETTER K WITH CEDILLA + : 004B 0327 +0137 LATIN SMALL LETTER K WITH CEDILLA + * Latvian + : 006B 0327 +0138 LATIN SMALL LETTER KRA (Greenlandic) + * Greenlandic (old orthography) +0139 LATIN CAPITAL LETTER L WITH ACUTE + : 004C 0301 +013A LATIN SMALL LETTER L WITH ACUTE + * Slovak + : 006C 0301 +013B LATIN CAPITAL LETTER L WITH CEDILLA + : 004C 0327 +013C LATIN SMALL LETTER L WITH CEDILLA + * Latvian + : 006C 0327 +013D LATIN CAPITAL LETTER L WITH CARON + * the form using apostrophe is preferred in typesetting + : 004C 030C +013E LATIN SMALL LETTER L WITH CARON + * Slovak + * the form using apostrophe is preferred in typesetting + : 006C 030C +013F LATIN CAPITAL LETTER L WITH MIDDLE DOT + * some fonts show the middle dot inside the L, but the preferred form has the dot following the L + # 004C 00B7 +0140 LATIN SMALL LETTER L WITH MIDDLE DOT + * Catalan + # 006C 00B7 +0141 LATIN CAPITAL LETTER L WITH STROKE +0142 LATIN SMALL LETTER L WITH STROKE + * Polish, ... + x (latin small letter l with bar - 019A) +0143 LATIN CAPITAL LETTER N WITH ACUTE + : 004E 0301 +0144 LATIN SMALL LETTER N WITH ACUTE + * Polish, ... + : 006E 0301 +0145 LATIN CAPITAL LETTER N WITH CEDILLA + : 004E 0327 +0146 LATIN SMALL LETTER N WITH CEDILLA + * Latvian + : 006E 0327 +0147 LATIN CAPITAL LETTER N WITH CARON + : 004E 030C +0148 LATIN SMALL LETTER N WITH CARON + * Czech, Slovak + : 006E 030C +0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE + = LATIN SMALL LETTER APOSTROPHE N + * Afrikaans + * this is not actually a single letter + # 02BC 006E +014A LATIN CAPITAL LETTER ENG (Sami) + * glyph may also have appearance of large form of the small letter +014B LATIN SMALL LETTER ENG (Sami) + * Sami, Mende, IPA, ... +014C LATIN CAPITAL LETTER O WITH MACRON + : 004F 0304 +014D LATIN SMALL LETTER O WITH MACRON + * Latvian, Latin, ... + : 006F 0304 +014E LATIN CAPITAL LETTER O WITH BREVE + : 004F 0306 +014F LATIN SMALL LETTER O WITH BREVE + * Latin + : 006F 0306 +0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + : 004F 030B +0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE + * Hungarian + : 006F 030B +0152 LATIN CAPITAL LIGATURE OE +0153 LATIN SMALL LIGATURE OE + = LATIN SMALL LETTER O E + = ethel (from Old English eðel) + * French, IPA, Old Icelandic, Old English, ... + x (latin small letter ae - 00E6) + x (latin letter small capital oe - 0276) +0154 LATIN CAPITAL LETTER R WITH ACUTE + : 0052 0301 +0155 LATIN SMALL LETTER R WITH ACUTE + * Slovak, ... + : 0072 0301 +0156 LATIN CAPITAL LETTER R WITH CEDILLA + : 0052 0327 +0157 LATIN SMALL LETTER R WITH CEDILLA + * Latvian + : 0072 0327 +0158 LATIN CAPITAL LETTER R WITH CARON + : 0052 030C +0159 LATIN SMALL LETTER R WITH CARON + * Czech, ... + : 0072 030C +015A LATIN CAPITAL LETTER S WITH ACUTE + : 0053 0301 +015B LATIN SMALL LETTER S WITH ACUTE + * Polish, Indic transliteration, ... + : 0073 0301 +015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX + : 0053 0302 +015D LATIN SMALL LETTER S WITH CIRCUMFLEX + * Esperanto + : 0073 0302 +015E LATIN CAPITAL LETTER S WITH CEDILLA * + : 0053 0327 +015F LATIN SMALL LETTER S WITH CEDILLA * + * Turkish, Azerbaijani, Romanian, ... + * this character is used in both Turkish and Romanian data + * a glyph variant with comma below is preferred for Romanian + x (latin small letter s with comma below - 0219) + : 0073 0327 +0160 LATIN CAPITAL LETTER S WITH CARON + : 0053 030C +0161 LATIN SMALL LETTER S WITH CARON + * Czech, Estonian, Finnish, Slovak, and many other languages + : 0073 030C +0162 LATIN CAPITAL LETTER T WITH CEDILLA * + : 0054 0327 +0163 LATIN SMALL LETTER T WITH CEDILLA * + * Romanian, Semitic transliteration, ... + * this character is used in Romanian data + * a glyph variant with comma below is preferred for Romanian + x (latin small letter t with comma below - 021B) + : 0074 0327 +0164 LATIN CAPITAL LETTER T WITH CARON + * the form using caron/hacek is preferred in all contexts + : 0054 030C +0165 LATIN SMALL LETTER T WITH CARON + * Czech, Slovak + * the form using apostrophe is preferred in typesetting + : 0074 030C +0166 LATIN CAPITAL LETTER T WITH STROKE +0167 LATIN SMALL LETTER T WITH STROKE + * Sami +0168 LATIN CAPITAL LETTER U WITH TILDE + : 0055 0303 +0169 LATIN SMALL LETTER U WITH TILDE + * Greenlandic (old orthography) + : 0075 0303 +016A LATIN CAPITAL LETTER U WITH MACRON + : 0055 0304 +016B LATIN SMALL LETTER U WITH MACRON + * Latvian, Lithuanian, Latin, ... + : 0075 0304 +016C LATIN CAPITAL LETTER U WITH BREVE + : 0055 0306 +016D LATIN SMALL LETTER U WITH BREVE + * Latin, Esperanto, ... + : 0075 0306 +016E LATIN CAPITAL LETTER U WITH RING ABOVE + : 0055 030A +016F LATIN SMALL LETTER U WITH RING ABOVE + * Czech, ... + : 0075 030A +0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + : 0055 030B +0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE + * Hungarian + : 0075 030B +0172 LATIN CAPITAL LETTER U WITH OGONEK + : 0055 0328 +0173 LATIN SMALL LETTER U WITH OGONEK + * Lithuanian + : 0075 0328 +0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX + : 0057 0302 +0175 LATIN SMALL LETTER W WITH CIRCUMFLEX + * Welsh + : 0077 0302 +0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + : 0059 0302 +0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX + * Welsh + : 0079 0302 +0178 LATIN CAPITAL LETTER Y WITH DIAERESIS + * French, Igbo + x (latin small letter y with diaeresis - 00FF) + : 0059 0308 +0179 LATIN CAPITAL LETTER Z WITH ACUTE + : 005A 0301 +017A LATIN SMALL LETTER Z WITH ACUTE + * Polish, ... + : 007A 0301 +017B LATIN CAPITAL LETTER Z WITH DOT ABOVE + : 005A 0307 +017C LATIN SMALL LETTER Z WITH DOT ABOVE + * Polish, ... + : 007A 0307 +017D LATIN CAPITAL LETTER Z WITH CARON + : 005A 030C +017E LATIN SMALL LETTER Z WITH CARON + * Czech, Estonian, Finnish, Slovak, Slovenian, and many other languages + : 007A 030C +017F LATIN SMALL LETTER LONG S + * in common use in Roman types until the 18th century + * in current use in Fraktur and Gaelic types + # 0073 latin small letter s +@@ 0180 Latin Extended-B 024F +@ Latin Extended-B +0180 LATIN SMALL LETTER B WITH STROKE + * Americanist and Indo-Europeanist usage for phonetic beta + * Americanist orthographies use an alternate glyph with the stroke through the bowl + * Old Saxon + x (greek small letter beta - 03B2) + x (blank symbol - 2422) +0181 LATIN CAPITAL LETTER B WITH HOOK + * Zulu, Pan-Nigerian alphabet + x (latin small letter b with hook - 0253) +0182 LATIN CAPITAL LETTER B WITH TOPBAR +0183 LATIN SMALL LETTER B WITH TOPBAR + * Zhuang + * former Soviet minority language scripts + x (cyrillic capital letter be - 0411) +0184 LATIN CAPITAL LETTER TONE SIX +0185 LATIN SMALL LETTER TONE SIX + * Zhuang + * Zhuang tone three is Cyrillic ze + * Zhuang tone four is Cyrillic che + x (latin small letter tone two - 01A8) + x (latin small letter tone five - 01BD) + x (cyrillic small letter ze - 0437) + x (cyrillic small letter che - 0447) + x (cyrillic small letter soft sign - 044C) +0186 LATIN CAPITAL LETTER OPEN O + * typographically a turned C + * African + x (latin small letter open o - 0254) +0187 LATIN CAPITAL LETTER C WITH HOOK +0188 LATIN SMALL LETTER C WITH HOOK + * African +0189 LATIN CAPITAL LETTER AFRICAN D * + * Ewe + x (latin capital letter eth - 00D0) + x (latin capital letter d with stroke - 0110) + x (latin small letter d with tail - 0256) +018A LATIN CAPITAL LETTER D WITH HOOK + * Pan-Nigerian alphabet + x (latin small letter d with hook - 0257) +018B LATIN CAPITAL LETTER D WITH TOPBAR +018C LATIN SMALL LETTER D WITH TOPBAR + * former-Soviet minority language scripts +018D LATIN SMALL LETTER TURNED DELTA + = reversed Polish-hook o + * archaic phonetic for labialized alveolar fricative + * recommended spellings 007A 02B7 or 007A 032B +018E LATIN CAPITAL LETTER REVERSED E + = LATIN CAPITAL LETTER TURNED E + * Pan-Nigerian alphabet + * lowercase is 01DD +018F LATIN CAPITAL LETTER SCHWA + * Azerbaijani, ... + x (latin small letter schwa - 0259) + x (cyrillic capital letter schwa - 04D8) +0190 LATIN CAPITAL LETTER OPEN E + = LATIN CAPITAL LETTER EPSILON + * African + x (latin small letter open e - 025B) + x (euler constant - 2107) +0191 LATIN CAPITAL LETTER F WITH HOOK + * African +0192 LATIN SMALL LETTER F WITH HOOK + = LATIN SMALL LETTER SCRIPT F + = Florin currency symbol (Netherlands) + = function symbol + = abbreviation convention for folder +0193 LATIN CAPITAL LETTER G WITH HOOK + * African + x (latin small letter g with hook - 0260) +0194 LATIN CAPITAL LETTER GAMMA + * African + x (latin small letter gamma - 0263) +0195 LATIN SMALL LETTER HV (hwair) + * Gothic transliteration + * uppercase is 01F6 +0196 LATIN CAPITAL LETTER IOTA + * African + x (latin small letter iota - 0269) +0197 LATIN CAPITAL LETTER I WITH STROKE + = barred i, i bar + * African + * ISO 6438 gives lowercase as 026A, not 0268 + x (latin letter small capital i - 026A) +0198 LATIN CAPITAL LETTER K WITH HOOK +0199 LATIN SMALL LETTER K WITH HOOK + * Hausa, Pan-Nigerian alphabet +019A LATIN SMALL LETTER L WITH BAR + = barred l + * Americanist phonetic usage for 026C + x (latin small letter l with stroke - 0142) +019B LATIN SMALL LETTER LAMBDA WITH STROKE + = barred lambda, lambda bar + * Americanist phonetic usage +019C LATIN CAPITAL LETTER TURNED M + * Zhuang + x (latin small letter turned m - 026F) +019D LATIN CAPITAL LETTER N WITH LEFT HOOK + * African + x (latin small letter n with left hook - 0272) +019E LATIN SMALL LETTER N WITH LONG RIGHT LEG + * archaic phonetic for Japanese 3093 + * recommended spelling for syllabic n is 006E 0329 + * Lakota (indicates nasalization of vowel) + x (latin capital letter n with long right leg - 0220) +019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE * + = barred o, o bar + * lowercase is 0275 + * African + x (cyrillic capital letter barred o - 04E8) +01A0 LATIN CAPITAL LETTER O WITH HORN + : 004F 031B +01A1 LATIN SMALL LETTER O WITH HORN + * Vietnamese + : 006F 031B +01A2 LATIN CAPITAL LETTER OI (gha) +01A3 LATIN SMALL LETTER OI (gha) + = gha + * Pan-Turkic Latin alphabets +01A4 LATIN CAPITAL LETTER P WITH HOOK +01A5 LATIN SMALL LETTER P WITH HOOK + * African +01A6 LATIN LETTER YR * + * Old Norse + * from German Standard DIN 31624 and ISO 5246-2 + * lowercase is 0280 +01A7 LATIN CAPITAL LETTER TONE TWO +01A8 LATIN SMALL LETTER TONE TWO + * Zhuang + * typographically a reversed S + x (latin small letter tone six - 0185) +01A9 LATIN CAPITAL LETTER ESH + * African + x (latin small letter esh - 0283) + x (greek capital letter sigma - 03A3) +01AA LATIN LETTER REVERSED ESH LOOP + * archaic phonetic for labialized palatoalveolar or palatal fricative + * Twi + * recommended spellings 0283 02B7, 00E7 02B7, 0068 0265, etc. +01AB LATIN SMALL LETTER T WITH PALATAL HOOK + * archaic phonetic for palatalized alveolar or dental stop + * recommended spelling 0074 02B2 +01AC LATIN CAPITAL LETTER T WITH HOOK + * a glyph variant with hook at the right also occurs +01AD LATIN SMALL LETTER T WITH HOOK + * African +01AE LATIN CAPITAL LETTER T WITH RETROFLEX HOOK + * African + x (latin small letter t with retroflex hook - 0288) +01AF LATIN CAPITAL LETTER U WITH HORN + : 0055 031B +01B0 LATIN SMALL LETTER U WITH HORN + * Vietnamese + : 0075 031B +01B1 LATIN CAPITAL LETTER UPSILON + * African + * typographically based on turned capital Greek omega + x (latin small letter upsilon - 028A) + x (inverted ohm sign - 2127) +01B2 LATIN CAPITAL LETTER V WITH HOOK + = LATIN CAPITAL LETTER SCRIPT V + * African + x (latin small letter v with hook - 028B) +01B3 LATIN CAPITAL LETTER Y WITH HOOK + * a glyph variant with hook at the right also occurs +01B4 LATIN SMALL LETTER Y WITH HOOK + * Bini, Esoko, and other Edo languages in West Africa +01B5 LATIN CAPITAL LETTER Z WITH STROKE +01B6 LATIN SMALL LETTER Z WITH STROKE + = barred z, z bar + * Pan-Turkic Latin orthography + * handwritten variant of Latin "z" + x (latin small letter z - 007A) +01B7 LATIN CAPITAL LETTER EZH + * African, Skolt Sami + * lowercase is 0292 + x (latin capital letter yogh - 021C) + x (cyrillic capital letter abkhasian dze - 04E0) +01B8 LATIN CAPITAL LETTER EZH REVERSED +01B9 LATIN SMALL LETTER EZH REVERSED + * archaic phonetic for voiced pharyngeal fricative + * sometimes typographically rendered with a turned digit 3 + * recommended spelling 0295 + x (latin letter pharyngeal voiced fricative - 0295) + x (arabic letter ain - 0639) +01BA LATIN SMALL LETTER EZH WITH TAIL + * archaic phonetic for labialized voiced palatoalveolar or palatal fricative + * Twi + * recommended spellings 0292 02B7 or 006A 02B7 +01BB LATIN LETTER TWO WITH STROKE + * archaic phonetic for [dz] affricate + * recommended spellings 0292 or 0064 007A +01BC LATIN CAPITAL LETTER TONE FIVE +01BD LATIN SMALL LETTER TONE FIVE + * Zhuang + x (latin small letter tone six - 0185) +01BE LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE + * archaic phonetic for [ts] affricate + * recommended spelling 0074 0073 + * letter form is actually derived from ligation of ts, rather than inverted glottal stop +01BF LATIN LETTER WYNN + = wen + * Runic letter borrowed into Latin script + * replaced by "w" in modern transcriptions of Old English + * uppercase is 01F7 + x (runic letter wunjo wynn w - 16B9) +@ African letters for clicks +01C0 LATIN LETTER DENTAL CLICK + = pipe + * Khoisan tradition + * "c" in Zulu orthography + x (solidus - 002F) + x (vertical line - 007C) + x (latin small letter turned t - 0287) + x (divides - 2223) +01C1 LATIN LETTER LATERAL CLICK + = double pipe + * Khoisan tradition + * "x" in Zulu orthography + x (latin letter inverted glottal stop - 0296) + x (parallel to - 2225) +01C2 LATIN LETTER ALVEOLAR CLICK + = double-barred pipe + * Khoisan tradition + x (not equal to - 2260) +01C3 LATIN LETTER RETROFLEX CLICK + = LATIN LETTER EXCLAMATION MARK + * Khoisan tradition + * "q" in Zulu orthography + x (exclamation mark - 0021) + x (latin letter stretched c - 0297) +@ Croatian digraphs matching Serbian Cyrillic letters +01C4 LATIN CAPITAL LETTER DZ WITH CARON + # 0044 017D +01C5 LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON + # 0044 017E +01C6 LATIN SMALL LETTER DZ WITH CARON + x (cyrillic small letter dzhe - 045F) + # 0064 017E +01C7 LATIN CAPITAL LETTER LJ + # 004C 004A +01C8 LATIN CAPITAL LETTER L WITH SMALL LETTER J + # 004C 006A +01C9 LATIN SMALL LETTER LJ + x (cyrillic small letter lje - 0459) + # 006C 006A +01CA LATIN CAPITAL LETTER NJ + # 004E 004A +01CB LATIN CAPITAL LETTER N WITH SMALL LETTER J + # 004E 006A +01CC LATIN SMALL LETTER NJ + x (cyrillic small letter nje - 045A) + # 006E 006A +@ Pinyin diacritic-vowel combinations +01CD LATIN CAPITAL LETTER A WITH CARON + : 0041 030C +01CE LATIN SMALL LETTER A WITH CARON + * Pinyin third tone + : 0061 030C +01CF LATIN CAPITAL LETTER I WITH CARON + : 0049 030C +01D0 LATIN SMALL LETTER I WITH CARON + * Pinyin third tone + : 0069 030C +01D1 LATIN CAPITAL LETTER O WITH CARON + : 004F 030C +01D2 LATIN SMALL LETTER O WITH CARON + * Pinyin third tone + : 006F 030C +01D3 LATIN CAPITAL LETTER U WITH CARON + : 0055 030C +01D4 LATIN SMALL LETTER U WITH CARON + * Pinyin third tone + : 0075 030C +01D5 LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON + : 00DC 0304 +01D6 LATIN SMALL LETTER U WITH DIAERESIS AND MACRON + * Pinyin first tone + : 00FC 0304 +01D7 LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + : 00DC 0301 +01D8 LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + * Pinyin second tone + : 00FC 0301 +01D9 LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON + : 00DC 030C +01DA LATIN SMALL LETTER U WITH DIAERESIS AND CARON + * Pinyin third tone + : 00FC 030C +01DB LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE + : 00DC 0300 +01DC LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE + * Pinyin fourth tone + : 00FC 0300 +@ Additions +01DD LATIN SMALL LETTER TURNED E + * Pan-Nigerian alphabet + * all other usages of schwa are 0259 + * uppercase is 018E + x (latin small letter schwa - 0259) +01DE LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON + : 00C4 0304 +01DF LATIN SMALL LETTER A WITH DIAERESIS AND MACRON + * Livonian, Uralicist usage + : 00E4 0304 +01E0 LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON + : 0226 0304 +01E1 LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON + * Uralicist usage + : 0227 0304 +01E2 LATIN CAPITAL LETTER AE WITH MACRON (ash) * + : 00C6 0304 +01E3 LATIN SMALL LETTER AE WITH MACRON (ash) * + * Old Norse, Old English + : 00E6 0304 +01E4 LATIN CAPITAL LETTER G WITH STROKE +01E5 LATIN SMALL LETTER G WITH STROKE + * Skolt Sami +01E6 LATIN CAPITAL LETTER G WITH CARON + : 0047 030C +01E7 LATIN SMALL LETTER G WITH CARON + * Skolt Sami + x (latin small letter g with breve - 011F) + : 0067 030C +01E8 LATIN CAPITAL LETTER K WITH CARON + : 004B 030C +01E9 LATIN SMALL LETTER K WITH CARON + * Skolt Sami + : 006B 030C +01EA LATIN CAPITAL LETTER O WITH OGONEK + : 004F 0328 +01EB LATIN SMALL LETTER O WITH OGONEK + * Sami, Iroquoian, Old Icelandic + : 006F 0328 +01EC LATIN CAPITAL LETTER O WITH OGONEK AND MACRON + : 01EA 0304 +01ED LATIN SMALL LETTER O WITH OGONEK AND MACRON + * Old Icelandic + : 01EB 0304 +01EE LATIN CAPITAL LETTER EZH WITH CARON + : 01B7 030C +01EF LATIN SMALL LETTER EZH WITH CARON + * Skolt Sami + : 0292 030C +01F0 LATIN SMALL LETTER J WITH CARON + * IPA and many languages + : 006A 030C +01F1 LATIN CAPITAL LETTER DZ + # 0044 005A +01F2 LATIN CAPITAL LETTER D WITH SMALL LETTER Z + # 0044 007A +01F3 LATIN SMALL LETTER DZ + # 0064 007A +01F4 LATIN CAPITAL LETTER G WITH ACUTE + : 0047 0301 +01F5 LATIN SMALL LETTER G WITH ACUTE + * Macedonian and Serbian transliteration + : 0067 0301 +01F6 LATIN CAPITAL LETTER HWAIR + * lowercase is 0195 +01F7 LATIN CAPITAL LETTER WYNN + = wen + * lowercase is 01BF +01F8 LATIN CAPITAL LETTER N WITH GRAVE + : 004E 0300 +01F9 LATIN SMALL LETTER N WITH GRAVE + * Pinyin + : 006E 0300 +01FA LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE + : 00C5 0301 +01FB LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE + : 00E5 0301 +01FC LATIN CAPITAL LETTER AE WITH ACUTE (ash) * + : 00C6 0301 +01FD LATIN SMALL LETTER AE WITH ACUTE (ash) * + : 00E6 0301 +01FE LATIN CAPITAL LETTER O WITH STROKE AND ACUTE + : 00D8 0301 +01FF LATIN SMALL LETTER O WITH STROKE AND ACUTE + : 00F8 0301 +@ Additions for Slovenian and Croatian +0200 LATIN CAPITAL LETTER A WITH DOUBLE GRAVE + : 0041 030F +0201 LATIN SMALL LETTER A WITH DOUBLE GRAVE + : 0061 030F +0202 LATIN CAPITAL LETTER A WITH INVERTED BREVE + : 0041 0311 +0203 LATIN SMALL LETTER A WITH INVERTED BREVE + : 0061 0311 +0204 LATIN CAPITAL LETTER E WITH DOUBLE GRAVE + : 0045 030F +0205 LATIN SMALL LETTER E WITH DOUBLE GRAVE + : 0065 030F +0206 LATIN CAPITAL LETTER E WITH INVERTED BREVE + : 0045 0311 +0207 LATIN SMALL LETTER E WITH INVERTED BREVE + : 0065 0311 +0208 LATIN CAPITAL LETTER I WITH DOUBLE GRAVE + : 0049 030F +0209 LATIN SMALL LETTER I WITH DOUBLE GRAVE + : 0069 030F +020A LATIN CAPITAL LETTER I WITH INVERTED BREVE + : 0049 0311 +020B LATIN SMALL LETTER I WITH INVERTED BREVE + : 0069 0311 +020C LATIN CAPITAL LETTER O WITH DOUBLE GRAVE + : 004F 030F +020D LATIN SMALL LETTER O WITH DOUBLE GRAVE + : 006F 030F +020E LATIN CAPITAL LETTER O WITH INVERTED BREVE + : 004F 0311 +020F LATIN SMALL LETTER O WITH INVERTED BREVE + : 006F 0311 +0210 LATIN CAPITAL LETTER R WITH DOUBLE GRAVE + : 0052 030F +0211 LATIN SMALL LETTER R WITH DOUBLE GRAVE + : 0072 030F +0212 LATIN CAPITAL LETTER R WITH INVERTED BREVE + : 0052 0311 +0213 LATIN SMALL LETTER R WITH INVERTED BREVE + : 0072 0311 +0214 LATIN CAPITAL LETTER U WITH DOUBLE GRAVE + : 0055 030F +0215 LATIN SMALL LETTER U WITH DOUBLE GRAVE + : 0075 030F +0216 LATIN CAPITAL LETTER U WITH INVERTED BREVE + : 0055 0311 +0217 LATIN SMALL LETTER U WITH INVERTED BREVE + : 0075 0311 +@ Additions for Romanian +0218 LATIN CAPITAL LETTER S WITH COMMA BELOW * + : 0053 0326 +0219 LATIN SMALL LETTER S WITH COMMA BELOW * + * Romanian, when distinct comma below form is required + x (latin small letter s with cedilla - 015F) + : 0073 0326 +021A LATIN CAPITAL LETTER T WITH COMMA BELOW * + : 0054 0326 +021B LATIN SMALL LETTER T WITH COMMA BELOW * + * Romanian, when distinct comma below form is required + x (latin small letter t with cedilla - 0163) + : 0074 0326 +@ Miscellaneous additions +021C LATIN CAPITAL LETTER YOGH + x (latin capital letter ezh - 01B7) +021D LATIN SMALL LETTER YOGH + * Middle English, Scots + x (latin small letter ezh - 0292) + x (ounce sign - 2125) +021E LATIN CAPITAL LETTER H WITH CARON + : 0048 030C +021F LATIN SMALL LETTER H WITH CARON + * Finnish Romany + : 0068 030C +0220 LATIN CAPITAL LETTER N WITH LONG RIGHT LEG + * Lakota + x (latin small letter n with long right leg - 019E) +0221 LATIN SMALL LETTER D WITH CURL + * phonetic use in Sinology +0222 LATIN CAPITAL LETTER OU +0223 LATIN SMALL LETTER OU + * Algonquin, Huron + x (digit eight - 0038) +0224 LATIN CAPITAL LETTER Z WITH HOOK +0225 LATIN SMALL LETTER Z WITH HOOK + * Middle High German +0226 LATIN CAPITAL LETTER A WITH DOT ABOVE + : 0041 0307 +0227 LATIN SMALL LETTER A WITH DOT ABOVE + * Uralicist usage + : 0061 0307 +0228 LATIN CAPITAL LETTER E WITH CEDILLA + : 0045 0327 +0229 LATIN SMALL LETTER E WITH CEDILLA + : 0065 0327 +@ Additions for Livonian +022A LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON + : 00D6 0304 +022B LATIN SMALL LETTER O WITH DIAERESIS AND MACRON + * Livonian + : 00F6 0304 +022C LATIN CAPITAL LETTER O WITH TILDE AND MACRON + : 00D5 0304 +022D LATIN SMALL LETTER O WITH TILDE AND MACRON + * Livonian + : 00F5 0304 +022E LATIN CAPITAL LETTER O WITH DOT ABOVE + : 004F 0307 +022F LATIN SMALL LETTER O WITH DOT ABOVE + * Livonian + : 006F 0307 +0230 LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON + : 022E 0304 +0231 LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON + * Livonian + : 022F 0304 +0232 LATIN CAPITAL LETTER Y WITH MACRON + : 0059 0304 +0233 LATIN SMALL LETTER Y WITH MACRON + * Livonian, Cornish + : 0079 0304 +@ Additions for Sinology +0234 LATIN SMALL LETTER L WITH CURL +0235 LATIN SMALL LETTER N WITH CURL +0236 LATIN SMALL LETTER T WITH CURL +@ Miscellaneous additions +0237 LATIN SMALL LETTER DOTLESS J + x (mathematical italic small dotless j - 1D6A5) +0238 LATIN SMALL LETTER DB DIGRAPH + * used in Africanist linguistics +0239 LATIN SMALL LETTER QP DIGRAPH + * used in Africanist linguistics +023A LATIN CAPITAL LETTER A WITH STROKE + * Sencoten +023B LATIN CAPITAL LETTER C WITH STROKE + * Sencoten +023C LATIN SMALL LETTER C WITH STROKE + * used in Americanist linguistics +023D LATIN CAPITAL LETTER L WITH BAR + * Sencoten +023E LATIN CAPITAL LETTER T WITH DIAGONAL STROKE + * Sencoten +023F LATIN SMALL LETTER S WITH SWASH TAIL +0240 LATIN SMALL LETTER Z WITH SWASH TAIL +0241 LATIN CAPITAL LETTER GLOTTAL STOP + * lowercase is 0294 +@@ 0250 IPA Extensions 02AF +@ IPA extensions +@+ IPA includes basic Latin letters and a number of Latin or Greek letters from other blocks. + x (latin small letter ae - 00E6) + x (latin small letter c with cedilla - 00E7) + x (latin small letter eth - 00F0) + x (latin small letter o with stroke - 00F8) + x (latin small letter h with stroke - 0127) + x (latin small letter eng - 014B) + x (latin small ligature oe - 0153) + x (greek small letter beta - 03B2) + x (greek small letter theta - 03B8) + x (greek small letter lamda - 03BB) + x (greek small letter chi - 03C7) +0250 LATIN SMALL LETTER TURNED A + * low central unrounded vowel +0251 LATIN SMALL LETTER ALPHA + = LATIN SMALL LETTER SCRIPT A + * low back unrounded vowel + x (greek small letter alpha - 03B1) +0252 LATIN SMALL LETTER TURNED ALPHA + * low back rounded vowel +0253 LATIN SMALL LETTER B WITH HOOK + * implosive bilabial stop + * Pan-Nigerian alphabet + x (latin capital letter b with hook - 0181) +0254 LATIN SMALL LETTER OPEN O + * typographically a turned c + * lower-mid back rounded vowel + x (latin capital letter open o - 0186) +0255 LATIN SMALL LETTER C WITH CURL + * voiceless alveolo-palatal laminal fricative + * used in transcription of Mandarin Chinese + * sound spelled with 015B in Polish +0256 LATIN SMALL LETTER D WITH TAIL + = LATIN SMALL LETTER D RETROFLEX HOOK + * voiced retroflex stop + x (latin capital letter african d - 0189) +0257 LATIN SMALL LETTER D WITH HOOK + * implosive dental or alveolar stop + * Ewe, Pan-Nigerian alphabet + x (latin capital letter d with hook - 018A) +0258 LATIN SMALL LETTER REVERSED E + * upper-mid central unrounded vowel +0259 LATIN SMALL LETTER SCHWA + * mid-central unrounded vowel + * variant uppercase form 018E is associated with 01DD + x (latin capital letter schwa - 018F) + x (latin small letter turned e - 01DD) + x (cyrillic small letter schwa - 04D9) +025A LATIN SMALL LETTER SCHWA WITH HOOK + * rhotacized schwa +025B LATIN SMALL LETTER OPEN E + = LATIN SMALL LETTER EPSILON + * lower-mid front unrounded vowel + x (latin capital letter open e - 0190) + x (greek small letter epsilon - 03B5) +025C LATIN SMALL LETTER REVERSED OPEN E + * lower-mid central unrounded vowel +025D LATIN SMALL LETTER REVERSED OPEN E WITH HOOK + * rhotacized lower-mid central vowel +025E LATIN SMALL LETTER CLOSED REVERSED OPEN E + = LATIN SMALL LETTER CLOSED REVERSED EPSILON + * lower-mid central rounded vowel +025F LATIN SMALL LETTER DOTLESS J WITH STROKE + * voiced palatal stop + * typographically a turned f, but better thought of as a form of j + * "gy" in Hungarian orthography + * also archaic phonetic for palatoalveolar affricate 02A4 +0260 LATIN SMALL LETTER G WITH HOOK + * implosive velar stop + x (latin capital letter g with hook - 0193) +0261 LATIN SMALL LETTER SCRIPT G + * voiced velar stop + x (latin small letter g - 0067) +0262 LATIN LETTER SMALL CAPITAL G + * voiced uvular stop +0263 LATIN SMALL LETTER GAMMA + * voiced velar fricative + x (latin capital letter gamma - 0194) + x (greek small letter gamma - 03B3) +0264 LATIN SMALL LETTER RAMS HORN + = LATIN SMALL LETTER BABY GAMMA + * upper-mid back unrounded vowel +0265 LATIN SMALL LETTER TURNED H + * voiced rounded palatal approximant +0266 LATIN SMALL LETTER H WITH HOOK + * breathy-voiced glottal fricative + x (modifier letter small h with hook - 02B1) +0267 LATIN SMALL LETTER HENG WITH HOOK + * voiceless coarticulated velar and palatoalveolar fricative + * "tj" or "kj" or "sj" in some Swedish dialects +0268 LATIN SMALL LETTER I WITH STROKE + = barred i, i bar + * high central unrounded vowel + * ISO 6438 gives lowercase of 0197 as 026A, not 0268 +0269 LATIN SMALL LETTER IOTA + * semi-high front unrounded vowel +@+ * obsoleted by IPA in 1989 + * preferred use is 026A LATIN LETTER SMALL CAPITAL I + x (latin capital letter iota - 0196) + x (greek small letter iota - 03B9) +026A LATIN LETTER SMALL CAPITAL I + * semi-high front unrounded vowel + * preferred IPA alternate for 0269 + x (latin capital letter i with stroke - 0197) +026B LATIN SMALL LETTER L WITH MIDDLE TILDE + * velarized voiced alveolar lateral approximant +026C LATIN SMALL LETTER L WITH BELT + * voiceless alveolar lateral fricative +026D LATIN SMALL LETTER L WITH RETROFLEX HOOK + * voiced retroflex lateral +026E LATIN SMALL LETTER LEZH + * voiced lateral fricative + * "dhl" in Zulu orthography +026F LATIN SMALL LETTER TURNED M + * high back unrounded vowel + x (latin capital letter turned m - 019C) +0270 LATIN SMALL LETTER TURNED M WITH LONG LEG + * voiced velar approximant +0271 LATIN SMALL LETTER M WITH HOOK + * voiced labiodental nasal +0272 LATIN SMALL LETTER N WITH LEFT HOOK + * voiced palatal nasal + x (latin capital letter n with left hook - 019D) +0273 LATIN SMALL LETTER N WITH RETROFLEX HOOK + * voiced retroflex nasal +0274 LATIN LETTER SMALL CAPITAL N + * voiced uvular nasal +0275 LATIN SMALL LETTER BARRED O + = o bar + * rounded mid-central vowel, i.e. rounded schwa + * uppercase is 019F + x (greek small letter theta - 03B8) + x (cyrillic small letter fita - 0473) + x (cyrillic small letter barred o - 04E9) +0276 LATIN LETTER SMALL CAPITAL OE + * low front rounded vowel + x (latin small ligature oe - 0153) +0277 LATIN SMALL LETTER CLOSED OMEGA + * semi-high back rounded vowel +@+ * obsoleted by IPA in 1989 + * preferred use is 028A latin small letter upsilon +0278 LATIN SMALL LETTER PHI + * voiceless bilabial fricative + x (greek small letter phi - 03C6) +0279 LATIN SMALL LETTER TURNED R + * voiced alveolar approximant + x (modifier letter small turned r - 02B4) +027A LATIN SMALL LETTER TURNED R WITH LONG LEG + * voiced lateral flap +027B LATIN SMALL LETTER TURNED R WITH HOOK + * voiced retroflex approximant + x (modifier letter small turned r with hook - 02B5) +027C LATIN SMALL LETTER R WITH LONG LEG + * voiced strident apico-alveolar trill +@+ * obsoleted by IPA in 1989 + * sound spelled with 0159 in Czech + * preferred phonetic representation for Czech is 0072 031D + * in current use in Gaelic types (as glyph variant of 0072) +027D LATIN SMALL LETTER R WITH TAIL + * voiced retroflex flap +027E LATIN SMALL LETTER R WITH FISHHOOK + * voiced alveolar flap or tap +027F LATIN SMALL LETTER REVERSED R WITH FISHHOOK + = long leg turned iota (a misnomer) + * apical dental vowel + * used by linguists working on Chinese and other Sino-Tibetan languages + * IPA spelling - 007A 0329 +0280 LATIN LETTER SMALL CAPITAL R * + * voiced uvular trill + * Germanic, Old Norse + * uppercase is 01A6 +0281 LATIN LETTER SMALL CAPITAL INVERTED R + * voiced uvular fricative or approximant + x (modifier letter small capital inverted r - 02B6) +0282 LATIN SMALL LETTER S WITH HOOK + * voiceless retroflex fricative +0283 LATIN SMALL LETTER ESH + * voiceless postalveolar fricative + x (latin capital letter esh - 01A9) + x (integral - 222B) +0284 LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK + * implosive palatal stop + * typographically based on 025F, not on 0283 +0285 LATIN SMALL LETTER SQUAT REVERSED ESH + * apical retroflex vowel + * used by linguists working on Chinese and other Sino-Tibetan languages + * IPA spelling - 0290 0329 + * in origin 027F plus the retroflex hook 0322, despite its name +0286 LATIN SMALL LETTER ESH WITH CURL + * palatalized voiceless postalveolar fricative + * suggested spelling - 0283 02B2 +0287 LATIN SMALL LETTER TURNED T + * dental click (sound of "tsk tsk") + x (latin letter dental click - 01C0) +0288 LATIN SMALL LETTER T WITH RETROFLEX HOOK + * voiceless retroflex stop + x (latin capital letter t with retroflex hook - 01AE) +0289 LATIN SMALL LETTER U BAR + * high central rounded vowel +028A LATIN SMALL LETTER UPSILON + * semi-high back rounded vowel + * preferred IPA alternate to 0277 + x (latin capital letter upsilon - 01B1) + x (greek small letter upsilon - 03C5) +028B LATIN SMALL LETTER V WITH HOOK + = LATIN SMALL LETTER SCRIPT V + * voiced labiodental approximant + x (latin capital letter v with hook - 01B2) + x (greek small letter upsilon - 03C5) +028C LATIN SMALL LETTER TURNED V + = caret, wedge + * lower-mid back unrounded vowel + x (greek capital letter lamda - 039B) + x (caret - 2038) + x (logical and - 2227) +028D LATIN SMALL LETTER TURNED W + * voiceless rounded labiovelar approximant +028E LATIN SMALL LETTER TURNED Y + * voiced lateral approximant +028F LATIN LETTER SMALL CAPITAL Y + * semi-high front rounded vowel +0290 LATIN SMALL LETTER Z WITH RETROFLEX HOOK + * voiced retroflex fricative +0291 LATIN SMALL LETTER Z WITH CURL + * voiced alveolo-palatal laminal fricative + * sound spelled with 017A in Polish +0292 LATIN SMALL LETTER EZH + = dram + * voiced postalveolar fricative + * mistakenly named yogh in Unicode 1.0 + * uppercase is 01B7 + * Skolt Sami + x (latin small letter yogh - 021D) + x (cyrillic small letter abkhasian dze - 04E1) + x (ounce sign - 2125) +0293 LATIN SMALL LETTER EZH WITH CURL + * palatalized voiced postalveolar fricative +0294 LATIN LETTER GLOTTAL STOP + * uppercase is 0241 + x (modifier letter glottal stop - 02C0) +0295 LATIN LETTER PHARYNGEAL VOICED FRICATIVE + = LATIN LETTER REVERSED GLOTTAL STOP + * voiced pharyngeal fricative + * ain + x (latin small letter ezh reversed - 01B9) + x (modifier letter reversed glottal stop - 02C1) +0296 LATIN LETTER INVERTED GLOTTAL STOP + * lateral click + x (latin letter lateral click - 01C1) +0297 LATIN LETTER STRETCHED C + * palatal (or alveolar) click + x (latin letter retroflex click - 01C3) + x (complement - 2201) +0298 LATIN LETTER BILABIAL CLICK + = LATIN LETTER BULLSEYE + x (circled dot operator - 2299) +0299 LATIN LETTER SMALL CAPITAL B + * bilabial trill +029A LATIN SMALL LETTER CLOSED OPEN E + = LATIN SMALL LETTER CLOSED EPSILON + * lower-mid front rounded vowel + * non-IPA alternate for the preferred 0153 +029B LATIN LETTER SMALL CAPITAL G WITH HOOK + * voiced uvular implosive +029C LATIN LETTER SMALL CAPITAL H + * voiceless epiglottal fricative +029D LATIN SMALL LETTER J WITH CROSSED-TAIL + * voiced palatal fricative +029E LATIN SMALL LETTER TURNED K + * proposed for velar click +@+ * withdrawn by IPA in 1970 +029F LATIN LETTER SMALL CAPITAL L + * velar lateral approximant +02A0 LATIN SMALL LETTER Q WITH HOOK + * voiceless uvular implosive +02A1 LATIN LETTER GLOTTAL STOP WITH STROKE + * voiced epiglottal stop +02A2 LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE + * voiced epiglottal fricative +02A3 LATIN SMALL LETTER DZ DIGRAPH + * voiced dental affricate +02A4 LATIN SMALL LETTER DEZH DIGRAPH + * voiced postalveolar affricate +02A5 LATIN SMALL LETTER DZ DIGRAPH WITH CURL + * voiced alveolo-palatal affricate +02A6 LATIN SMALL LETTER TS DIGRAPH + * voiceless dental affricate +02A7 LATIN SMALL LETTER TESH DIGRAPH + * voiceless postalveolar affricate +02A8 LATIN SMALL LETTER TC DIGRAPH WITH CURL + * voiceless alveolo-palatal affricate +@ IPA characters for disordered speech +02A9 LATIN SMALL LETTER FENG DIGRAPH + * velopharyngeal fricative +02AA LATIN SMALL LETTER LS DIGRAPH + * lateral alveolar fricative (lisp) +02AB LATIN SMALL LETTER LZ DIGRAPH + * voiced lateral alveolar fricative +02AC LATIN LETTER BILABIAL PERCUSSIVE + * audible lip smack +02AD LATIN LETTER BIDENTAL PERCUSSIVE + * audible teeth gnashing +@ Additions for Sinology +02AE LATIN SMALL LETTER TURNED H WITH FISHHOOK +02AF LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +@@ 02B0 Spacing Modifier Letters 02FF +@ Latin superscript modifier letters +02B0 MODIFIER LETTER SMALL H + * aspiration + # <super> 0068 +02B1 MODIFIER LETTER SMALL H WITH HOOK + * breathy voiced, murmured + x (latin small letter h with hook - 0266) + x (combining diaeresis below - 0324) + # <super> 0266 +02B2 MODIFIER LETTER SMALL J + * palatalization + x (combining palatalized hook below - 0321) + # <super> 006A +02B3 MODIFIER LETTER SMALL R + # <super> 0072 +02B4 MODIFIER LETTER SMALL TURNED R + x (latin small letter turned r - 0279) + # <super> 0279 +02B5 MODIFIER LETTER SMALL TURNED R WITH HOOK + x (latin small letter turned r with hook - 027B) + # <super> 027B +02B6 MODIFIER LETTER SMALL CAPITAL INVERTED R + * preceding four used for r-coloring or r-offglides + x (latin letter small capital inverted r - 0281) + # <super> 0281 +02B7 MODIFIER LETTER SMALL W + * labialization + x (combining inverted double arch below - 032B) + # <super> 0077 +02B8 MODIFIER LETTER SMALL Y + * palatalization + * common Americanist usage for 02B2 + # <super> 0079 +@ Miscellaneous phonetic modifiers +02B9 MODIFIER LETTER PRIME + * primary stress, emphasis + * transliteration of mjagkij znak (Cyrillic soft sign: palatalization) + x (apostrophe - 0027) + x (acute accent - 00B4) + x (modifier letter acute accent - 02CA) + x (combining acute accent - 0301) + x (greek numeral sign - 0374) + x (prime - 2032) +02BA MODIFIER LETTER DOUBLE PRIME + * exaggerated stress, contrastive stress + * transliteration of tverdyj znak (Cyrillic hard sign: no palatalization) + x (quotation mark - 0022) + x (combining double acute accent - 030B) + x (double prime - 2033) +02BB MODIFIER LETTER TURNED COMMA + * typographical alternate for 02BD or 02BF + x (combining turned comma above - 0312) + x (left single quotation mark - 2018) +02BC MODIFIER LETTER APOSTROPHE + = apostrophe + * glottal stop, glottalization, ejective + * spacing clone of Greek smooth breathing mark + * many languages use this as a letter of their alphabets + * 2019 is the preferred character for a punctuation apostrophe + x (apostrophe - 0027) + x (combining comma above - 0313) + x (combining comma above right - 0315) + x (armenian apostrophe - 055A) + x (right single quotation mark - 2019) +02BD MODIFIER LETTER REVERSED COMMA + * weak aspiration + * spacing clone of Greek rough breathing mark + x (combining reversed comma above - 0314) + x (armenian modifier letter left half ring - 0559) + x (single high-reversed-9 quotation mark - 201B) +02BE MODIFIER LETTER RIGHT HALF RING + * transliteration of Arabic hamza (glottal stop) + x (armenian apostrophe - 055A) + x (arabic letter hamza - 0621) +02BF MODIFIER LETTER LEFT HALF RING + * transliteration of Arabic ain (voiced pharyngeal fricative) + x (armenian modifier letter left half ring - 0559) + x (arabic letter ain - 0639) +02C0 MODIFIER LETTER GLOTTAL STOP + * ejective or glottalized + * typographical alternate for 02BC or 02BE + x (latin letter glottal stop - 0294) + x (combining hook above - 0309) +02C1 MODIFIER LETTER REVERSED GLOTTAL STOP + * typographical alternate for 02BF + x (latin letter pharyngeal voiced fricative - 0295) +02C2 MODIFIER LETTER LEFT ARROWHEAD + * fronted articulation +02C3 MODIFIER LETTER RIGHT ARROWHEAD + * backed articulation +02C4 MODIFIER LETTER UP ARROWHEAD + * raised articulation + x (circumflex accent - 005E) + x (up arrowhead - 2303) +02C5 MODIFIER LETTER DOWN ARROWHEAD + * lowered articulation +02C6 MODIFIER LETTER CIRCUMFLEX ACCENT + * rising-falling tone, falling tone, secondary stress, etc. + x (circumflex accent - 005E) + x (combining circumflex accent - 0302) +02C7 CARON (Mandarin Chinese third tone) + = hacek + * falling-rising tone + * Mandarin Chinese third tone + x (combining caron - 030C) +02C8 MODIFIER LETTER VERTICAL LINE + * primary stress, downstep + * precedes letter or syllable modified + x (apostrophe - 0027) + x (combining vertical line above - 030D) +02C9 MODIFIER LETTER MACRON (Mandarin Chinese first tone) + * high level tone + * precedes or follows letter or syllable modified + * Mandarin Chinese first tone + x (macron - 00AF) + x (combining macron - 0304) +02CA MODIFIER LETTER ACUTE ACCENT (Mandarin Chinese second tone) + * high-rising tone (IPA), high tone, primary stress + * Mandarin Chinese second tone + x (acute accent - 00B4) + x (modifier letter prime - 02B9) + x (combining acute accent - 0301) + x (greek numeral sign - 0374) + x (armenian emphasis mark - 055B) +02CB MODIFIER LETTER GRAVE ACCENT (Mandarin Chinese fourth tone) + * high-falling tone (IPA), low tone, secondary or tertiary stress + * Mandarin Chinese fourth tone + x (grave accent - 0060) + x (combining grave accent - 0300) + x (armenian comma - 055D) +02CC MODIFIER LETTER LOW VERTICAL LINE + * secondary stress + * precedes letter or syllable modified + x (combining vertical line below - 0329) +02CD MODIFIER LETTER LOW MACRON + * low level tone + x (low line - 005F) + x (combining macron below - 0331) +02CE MODIFIER LETTER LOW GRAVE ACCENT + * low-falling tone +02CF MODIFIER LETTER LOW ACUTE ACCENT + * low-rising tone + x (greek lower numeral sign - 0375) +02D0 MODIFIER LETTER TRIANGULAR COLON + * length mark + x (colon - 003A) +02D1 MODIFIER LETTER HALF TRIANGULAR COLON + * half-length mark + x (middle dot - 00B7) +02D2 MODIFIER LETTER CENTRED RIGHT HALF RING + * more rounded articulation +02D3 MODIFIER LETTER CENTRED LEFT HALF RING + * less rounded articulation +02D4 MODIFIER LETTER UP TACK + * vowel raising or closing + x (combining up tack below - 031D) + x (combining dot below - 0323) +02D5 MODIFIER LETTER DOWN TACK + * vowel lowering or opening + x (combining left half ring below - 031C) + x (combining down tack below - 031E) +02D6 MODIFIER LETTER PLUS SIGN + * advanced or fronted articulation + x (combining plus sign below - 031F) +02D7 MODIFIER LETTER MINUS SIGN + * retracted or backed articulation + * glyph may have small end-serifs + x (combining minus sign below - 0320) + x (minus sign - 2212) +@ Spacing clones of diacritics +02D8 BREVE + x (combining breve - 0306) + # 0020 0306 +02D9 DOT ABOVE (Mandarin Chinese light tone) + * Mandarin Chinese fifth tone (light or neutral) + x (combining dot above - 0307) + # 0020 0307 +02DA RING ABOVE + x (degree sign - 00B0) + x (combining ring above - 030A) + # 0020 030A +02DB OGONEK + x (combining ogonek - 0328) + # 0020 0328 +02DC SMALL TILDE + x (tilde - 007E) + x (combining tilde - 0303) + x (tilde operator - 223C) + # 0020 0303 +02DD DOUBLE ACUTE ACCENT + x (combining double acute accent - 030B) + # 0020 030B +@ Additions based on 1989 IPA +02DE MODIFIER LETTER RHOTIC HOOK + * rhotacization in vowel + * often ligated: 025A = 0259 + 02DE; 025D = 025C + 02DE +02DF MODIFIER LETTER CROSS ACCENT + * Swedish grave accent +02E0 MODIFIER LETTER SMALL GAMMA + * these modifier letters are occasionally used in transcription of affricates + # <super> 0263 +02E1 MODIFIER LETTER SMALL L + # <super> 006C +02E2 MODIFIER LETTER SMALL S + # <super> 0073 +02E3 MODIFIER LETTER SMALL X + # <super> 0078 +02E4 MODIFIER LETTER SMALL REVERSED GLOTTAL STOP + # <super> 0295 +@ Tone letters +02E5 MODIFIER LETTER EXTRA-HIGH TONE BAR +02E6 MODIFIER LETTER HIGH TONE BAR +02E7 MODIFIER LETTER MID TONE BAR +02E8 MODIFIER LETTER LOW TONE BAR +02E9 MODIFIER LETTER EXTRA-LOW TONE BAR +@ Extended Bopomofo tone marks +02EA MODIFIER LETTER YIN DEPARTING TONE MARK +02EB MODIFIER LETTER YANG DEPARTING TONE MARK +@ IPA modifiers +02EC MODIFIER LETTER VOICING +02ED MODIFIER LETTER UNASPIRATED +@ Other modifier letter +02EE MODIFIER LETTER DOUBLE APOSTROPHE + * Nenets +@ UPA modifiers +02EF MODIFIER LETTER LOW DOWN ARROWHEAD +02F0 MODIFIER LETTER LOW UP ARROWHEAD +02F1 MODIFIER LETTER LOW LEFT ARROWHEAD +02F2 MODIFIER LETTER LOW RIGHT ARROWHEAD +02F3 MODIFIER LETTER LOW RING +02F4 MODIFIER LETTER MIDDLE GRAVE ACCENT +02F5 MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT +02F6 MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT +02F7 MODIFIER LETTER LOW TILDE +02F8 MODIFIER LETTER RAISED COLON +02F9 MODIFIER LETTER BEGIN HIGH TONE +02FA MODIFIER LETTER END HIGH TONE +02FB MODIFIER LETTER BEGIN LOW TONE +02FC MODIFIER LETTER END LOW TONE +02FD MODIFIER LETTER SHELF +02FE MODIFIER LETTER OPEN SHELF +02FF MODIFIER LETTER LOW LEFT ARROW +@@ 0300 Combining Diacritical Marks 036F +@ Ordinary diacritics +0300 COMBINING GRAVE ACCENT (Varia) + = Greek varia + x (grave accent - 0060) + x (modifier letter grave accent - 02CB) +0301 COMBINING ACUTE ACCENT (Oxia, Tonos) + = stress mark + = Greek oxia, tonos + x (apostrophe - 0027) + x (acute accent - 00B4) + x (modifier letter prime - 02B9) + x (modifier letter acute accent - 02CA) + x (greek tonos - 0384) +0302 COMBINING CIRCUMFLEX ACCENT + = hat + x (circumflex accent - 005E) + x (modifier letter circumflex accent - 02C6) +0303 COMBINING TILDE + * IPA: nasalization + * Vietnamese tone mark + x (tilde - 007E) + x (small tilde - 02DC) +0304 COMBINING MACRON + = long + * distinguish from the following + x (macron - 00AF) + x (modifier letter macron - 02C9) +0305 COMBINING OVERLINE + = overscore, vinculum + * connects on left and right + x (macron - 00AF) +0306 COMBINING BREVE (Vrachy) + = short + = Greek vrachy + x (breve - 02D8) +0307 COMBINING DOT ABOVE + = derivative (Newtonian notation) +@+ * IPA (withdrawn in 1976): palatalization + x (dot above - 02D9) +0308 COMBINING DIAERESIS (Dialytika) + = double dot above, umlaut + = Greek dialytika + = double derivative + x (diaeresis - 00A8) +0309 COMBINING HOOK ABOVE + = hoi + * kerns left or right of circumflex over vowels + * Vietnamese tone mark + x (modifier letter glottal stop - 02C0) +030A COMBINING RING ABOVE + x (degree sign - 00B0) + x (ring above - 02DA) +030B COMBINING DOUBLE ACUTE ACCENT + * Hungarian, Chuvash + x (quotation mark - 0022) + x (modifier letter double prime - 02BA) + x (double acute accent - 02DD) +030C COMBINING CARON + = hacek, V above + x (caron - 02C7) +030D COMBINING VERTICAL LINE ABOVE + * this is not the Greek tonos + * Marshallese + x (modifier letter vertical line - 02C8) +030E COMBINING DOUBLE VERTICAL LINE ABOVE + * Marshallese + x (quotation mark - 0022) +030F COMBINING DOUBLE GRAVE ACCENT + * Serbian and Croatian poetics +0310 COMBINING CANDRABINDU + x (devanagari sign candrabindu - 0901) +0311 COMBINING INVERTED BREVE +0312 COMBINING TURNED COMMA ABOVE + = cedilla above + * Latvian (but not used in decomposition) + x (modifier letter turned comma - 02BB) +0313 COMBINING COMMA ABOVE (Psili) + = Greek psili, smooth breathing mark + * Americanist: ejective or glottalization + x (modifier letter apostrophe - 02BC) + x (combining cyrillic psili pneumata - 0486) + x (armenian apostrophe - 055A) +0314 COMBINING REVERSED COMMA ABOVE (Dasia) + = Greek dasia, rough breathing mark + x (modifier letter reversed comma - 02BD) + x (combining cyrillic dasia pneumata - 0485) + x (armenian modifier letter left half ring - 0559) +0315 COMBINING COMMA ABOVE RIGHT + x (modifier letter apostrophe - 02BC) +0316 COMBINING GRAVE ACCENT BELOW +0317 COMBINING ACUTE ACCENT BELOW +0318 COMBINING LEFT TACK BELOW +0319 COMBINING RIGHT TACK BELOW +031A COMBINING LEFT ANGLE ABOVE + * IPA: unreleased stop +031B COMBINING HORN + * Vietnamese +031C COMBINING LEFT HALF RING BELOW + * IPA: open variety of vowel + x (modifier letter down tack - 02D5) +031D COMBINING UP TACK BELOW + * IPA: vowel raising or closing + x (modifier letter up tack - 02D4) +031E COMBINING DOWN TACK BELOW + * IPA: vowel lowering or opening + x (modifier letter down tack - 02D5) +031F COMBINING PLUS SIGN BELOW + * IPA: advanced or fronted articulation + x (modifier letter plus sign - 02D6) +0320 COMBINING MINUS SIGN BELOW + * IPA: retracted or backed articulation + * glyph may have small end-serifs + x (modifier letter minus sign - 02D7) +0321 COMBINING PALATALIZED HOOK BELOW + * IPA: palatalization + x (modifier letter small j - 02B2) +0322 COMBINING RETROFLEX HOOK BELOW + * IPA: retroflexion +0323 COMBINING DOT BELOW + = nang + * IPA: closer variety of vowel + * Americanist and Indo-Europeanist: retraction or retroflexion + * Semiticist: velarization or pharyngealization + * Vietnamese tone mark + x (modifier letter up tack - 02D4) +0324 COMBINING DIAERESIS BELOW + * IPA: breathy-voice or murmur + x (modifier letter small h with hook - 02B1) +0325 COMBINING RING BELOW + * IPA: voiceless + * Madurese +0326 COMBINING COMMA BELOW + * Romanian, Latvian, Livonian +0327 COMBINING CEDILLA + * French, Turkish, Azerbaijani + x (cedilla - 00B8) +0328 COMBINING OGONEK + = nasal hook + * Americanist: nasalization + * Polish, Lithuanian + x (ogonek - 02DB) +0329 COMBINING VERTICAL LINE BELOW + * IPA: syllabic + * Yoruba + x (modifier letter low vertical line - 02CC) +032A COMBINING BRIDGE BELOW + * IPA: dental +032B COMBINING INVERTED DOUBLE ARCH BELOW + * IPA: labialization + x (modifier letter small w - 02B7) +032C COMBINING CARON BELOW + * IPA: voiced +032D COMBINING CIRCUMFLEX ACCENT BELOW + * Americanist: fronted articulation +032E COMBINING BREVE BELOW + * Hittite transcription +032F COMBINING INVERTED BREVE BELOW + * Americanist: fronted articulation (variant of 032D) + * Indo-Europeanist: semivowel +0330 COMBINING TILDE BELOW + * IPA: creaky voice +0331 COMBINING MACRON BELOW + x (low line - 005F) + x (modifier letter low macron - 02CD) +0332 COMBINING LOW LINE + = underline, underscore + * connects on left and right + x (low line - 005F) +0333 COMBINING DOUBLE LOW LINE + = double underline, double underscore + * connects on left and right + x (combining equals sign below - 0347) + x (double low line - 2017) +@ Overstruck diacritics +0334 COMBINING TILDE OVERLAY + * IPA: velarization or pharyngealization +0335 COMBINING SHORT STROKE OVERLAY +0336 COMBINING LONG STROKE OVERLAY +0337 COMBINING SHORT SOLIDUS OVERLAY + = short slash overlay +0338 COMBINING LONG SOLIDUS OVERLAY + = long slash overlay +@ Additions +0339 COMBINING RIGHT HALF RING BELOW +033A COMBINING INVERTED BRIDGE BELOW +033B COMBINING SQUARE BELOW +033C COMBINING SEAGULL BELOW +033D COMBINING X ABOVE +033E COMBINING VERTICAL TILDE + * Cyrillic palatalization + x (combining cyrillic palatalization - 0484) +033F COMBINING DOUBLE OVERLINE +@ Vietnamese tone marks (deprecated) +0340 COMBINING GRAVE TONE MARK (Vietnamese) + * kerns left or right of circumflex over vowels + : 0300 combining grave accent +0341 COMBINING ACUTE TONE MARK (Vietnamese) + * kerns right of circumflex over vowels + : 0301 combining acute accent +@ Additions for Greek +0342 COMBINING GREEK PERISPOMENI +0343 COMBINING GREEK KORONIS + : 0313 combining comma above +0344 COMBINING GREEK DIALYTIKA TONOS + * use of this character is discouraged + : 0308 0301 +0345 COMBINING GREEK YPOGEGRAMMENI + = GREEK NON-SPACING IOTA BELOW + = iota subscript + * note special casing issues + x (greek ypogegrammeni - 037A) + x (greek capital letter iota - 0399) +@ Additions for IPA +0346 COMBINING BRIDGE ABOVE + * IPA: dentolabial + x (combining wide bridge above - 20E9) +0347 COMBINING EQUALS SIGN BELOW + * IPA: alveolar +0348 COMBINING DOUBLE VERTICAL LINE BELOW + * IPA: strong articulation +0349 COMBINING LEFT ANGLE BELOW + * IPA: weak articulation +034A COMBINING NOT TILDE ABOVE + * IPA: denasal +@ IPA diacritics for disordered speech +034B COMBINING HOMOTHETIC ABOVE + * IPA: nasal escape +034C COMBINING ALMOST EQUAL TO ABOVE + * IPA: velopharyngeal friction +034D COMBINING LEFT RIGHT ARROW BELOW + * IPA: labial spreading +034E COMBINING UPWARDS ARROW BELOW + * IPA: whistled articulation +@ Grapheme joiner +034F COMBINING GRAPHEME JOINER + = CGJ + * has no visible glyph + * indicates that adjoining characters are to be treated as a graphemic unit +@ Additions for the Uralic Phonetic Alphabet +0350 COMBINING RIGHT ARROWHEAD ABOVE +0351 COMBINING LEFT HALF RING ABOVE +0352 COMBINING FERMATA +0353 COMBINING X BELOW +0354 COMBINING LEFT ARROWHEAD BELOW +0355 COMBINING RIGHT ARROWHEAD BELOW +0356 COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW +0357 COMBINING RIGHT HALF RING ABOVE +@ Miscellaneous additions +0358 COMBINING DOT ABOVE RIGHT + * Latin transliterations of the Southern Min dialects of Chinese +0359 COMBINING ASTERISK BELOW +035A COMBINING DOUBLE RING BELOW + * Kharoshthi transliteration +035B COMBINING ZIGZAG ABOVE + * Latin abbreviation, Lithuanian phonetics and mediaevalist transcriptions +@ Double diacritics +035C COMBINING DOUBLE BREVE BELOW + = ligature tie below, papyrological hyphen + * a common glyph alternate connects the horizontal midpoints of the characters + x (combining double breve - 035D) + x (combining double inverted breve - 0361) +035D COMBINING DOUBLE BREVE +035E COMBINING DOUBLE MACRON +035F COMBINING DOUBLE MACRON BELOW +0360 COMBINING DOUBLE TILDE +0361 COMBINING DOUBLE INVERTED BREVE + = ligature tie +0362 COMBINING DOUBLE RIGHTWARDS ARROW BELOW + * IPA: sliding articulation +@ Medieval superscript letter diacritics +@+ These are letter diacritics written directly above other letters. They appear primarily in medieval Germanic manuscripts, but saw some usage as late as the 19th century in some languages. +0363 COMBINING LATIN SMALL LETTER A +0364 COMBINING LATIN SMALL LETTER E +0365 COMBINING LATIN SMALL LETTER I +0366 COMBINING LATIN SMALL LETTER O +0367 COMBINING LATIN SMALL LETTER U +0368 COMBINING LATIN SMALL LETTER C +0369 COMBINING LATIN SMALL LETTER D +036A COMBINING LATIN SMALL LETTER H +036B COMBINING LATIN SMALL LETTER M +036C COMBINING LATIN SMALL LETTER R +036D COMBINING LATIN SMALL LETTER T +036E COMBINING LATIN SMALL LETTER V +036F COMBINING LATIN SMALL LETTER X +@@ 0370 Greek and Coptic 03FF +@ Based on ISO 8859-7 +0374 GREEK NUMERAL SIGN (Dexia keraia) + = dexia keraia + * indicates numeric use of letters + x (modifier letter acute accent - 02CA) + : 02B9 modifier letter prime +0375 GREEK LOWER NUMERAL SIGN (Aristeri keraia) + = aristeri keraia + * indicates numeric use of letters + x (modifier letter low acute accent - 02CF) +037A GREEK YPOGEGRAMMENI + = iota subscript + x (combining greek ypogegrammeni - 0345) + # 0020 0345 +037E GREEK QUESTION MARK (Erotimatiko) + = erotimatiko + * sentence-final punctuation + * 003B is the preferred character + x (question mark - 003F) + : 003B semicolon +0384 GREEK TONOS + x (acute accent - 00B4) + x (combining vertical line above - 030D) + # 0020 0301 +0385 GREEK DIALYTIKA TONOS + : 00A8 0301 +0386 GREEK CAPITAL LETTER ALPHA WITH TONOS + : 0391 0301 +0387 GREEK ANO TELEIA + * functions in Greek like a semicolon + * 00B7 is the preferred character + : 00B7 middle dot +0388 GREEK CAPITAL LETTER EPSILON WITH TONOS + : 0395 0301 +0389 GREEK CAPITAL LETTER ETA WITH TONOS + : 0397 0301 +038A GREEK CAPITAL LETTER IOTA WITH TONOS + : 0399 0301 +038C GREEK CAPITAL LETTER OMICRON WITH TONOS + : 039F 0301 +038E GREEK CAPITAL LETTER UPSILON WITH TONOS + : 03A5 0301 +038F GREEK CAPITAL LETTER OMEGA WITH TONOS + : 03A9 0301 +0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + : 03CA 0301 +0391 GREEK CAPITAL LETTER ALPHA +0392 GREEK CAPITAL LETTER BETA +0393 GREEK CAPITAL LETTER GAMMA + = gamma function +0394 GREEK CAPITAL LETTER DELTA + x (increment - 2206) +0395 GREEK CAPITAL LETTER EPSILON +0396 GREEK CAPITAL LETTER ZETA +0397 GREEK CAPITAL LETTER ETA +0398 GREEK CAPITAL LETTER THETA +0399 GREEK CAPITAL LETTER IOTA + = iota adscript +039A GREEK CAPITAL LETTER KAPPA +039B GREEK CAPITAL LETTER LAMDA +039C GREEK CAPITAL LETTER MU +039D GREEK CAPITAL LETTER NU +039E GREEK CAPITAL LETTER XI +039F GREEK CAPITAL LETTER OMICRON +03A0 GREEK CAPITAL LETTER PI + x (n-ary product - 220F) +03A1 GREEK CAPITAL LETTER RHO +03A3 GREEK CAPITAL LETTER SIGMA + x (latin capital letter esh - 01A9) + x (n-ary summation - 2211) +03A4 GREEK CAPITAL LETTER TAU +03A5 GREEK CAPITAL LETTER UPSILON +03A6 GREEK CAPITAL LETTER PHI +03A7 GREEK CAPITAL LETTER CHI +03A8 GREEK CAPITAL LETTER PSI +03A9 GREEK CAPITAL LETTER OMEGA + x (ohm sign - 2126) + x (inverted ohm sign - 2127) +03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + : 0399 0308 +03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + : 03A5 0308 +03AC GREEK SMALL LETTER ALPHA WITH TONOS + : 03B1 0301 +03AD GREEK SMALL LETTER EPSILON WITH TONOS + : 03B5 0301 +03AE GREEK SMALL LETTER ETA WITH TONOS + : 03B7 0301 +03AF GREEK SMALL LETTER IOTA WITH TONOS + : 03B9 0301 +03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + : 03CB 0301 +03B1 GREEK SMALL LETTER ALPHA + x (latin small letter alpha - 0251) + x (proportional to - 221D) +03B2 GREEK SMALL LETTER BETA + x (latin small letter sharp s - 00DF) + x (latin small letter b with stroke - 0180) +03B3 GREEK SMALL LETTER GAMMA + x (latin small letter gamma - 0263) +03B4 GREEK SMALL LETTER DELTA +03B5 GREEK SMALL LETTER EPSILON + x (latin small letter open e - 025B) +03B6 GREEK SMALL LETTER ZETA +03B7 GREEK SMALL LETTER ETA +03B8 GREEK SMALL LETTER THETA + x (latin small letter barred o - 0275) + x (cyrillic small letter fita - 0473) +03B9 GREEK SMALL LETTER IOTA + x (latin small letter iota - 0269) + x (turned greek small letter iota - 2129) +03BA GREEK SMALL LETTER KAPPA +03BB GREEK SMALL LETTER LAMDA + = lambda +03BC GREEK SMALL LETTER MU + x (micro sign - 00B5) +03BD GREEK SMALL LETTER NU +03BE GREEK SMALL LETTER XI +03BF GREEK SMALL LETTER OMICRON +03C0 GREEK SMALL LETTER PI + * math constant 3.141592... +03C1 GREEK SMALL LETTER RHO +03C2 GREEK SMALL LETTER FINAL SIGMA + = stigma (the Modern Greek name for this letterform) + * not to be confused with the actual stigma letter + x (greek small letter stigma - 03DB) +03C3 GREEK SMALL LETTER SIGMA + * used symbolically with a numeric value 200 +03C4 GREEK SMALL LETTER TAU +03C5 GREEK SMALL LETTER UPSILON + x (latin small letter upsilon - 028A) + x (latin small letter v with hook - 028B) +03C6 GREEK SMALL LETTER PHI + x (latin small letter phi - 0278) + x (greek phi symbol - 03D5) + * the ordinary Greek letter, showing considerable glyph variation + * in mathematical contexts, the loopy glyph is preferred, to contrast with 03D5 +03C7 GREEK SMALL LETTER CHI +03C8 GREEK SMALL LETTER PSI +03C9 GREEK SMALL LETTER OMEGA +03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA + : 03B9 0308 +03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA + : 03C5 0308 +03CC GREEK SMALL LETTER OMICRON WITH TONOS + : 03BF 0301 +03CD GREEK SMALL LETTER UPSILON WITH TONOS + : 03C5 0301 +03CE GREEK SMALL LETTER OMEGA WITH TONOS + : 03C9 0301 +@ Variant letterforms +03D0 GREEK BETA SYMBOL + = GREEK SMALL LETTER CURLED BETA + # 03B2 greek small letter beta +03D1 GREEK THETA SYMBOL + = GREEK SMALL LETTER SCRIPT THETA + * used as a technical symbol + # 03B8 greek small letter theta +03D2 GREEK UPSILON WITH HOOK SYMBOL + = GREEK CAPITAL LETTER UPSILON HOOK + # 03A5 greek capital letter upsilon +03D3 GREEK UPSILON WITH ACUTE AND HOOK SYMBOL + = GREEK CAPITAL LETTER UPSILON HOOK TONOS + : 03D2 0301 +03D4 GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL + = GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS + : 03D2 0308 +03D5 GREEK PHI SYMBOL + * used as a technical symbol, with a stroked glyph + * maps to "phi1" symbol entities + # 03C6 greek small letter phi +03D6 GREEK PI SYMBOL + = GREEK SMALL LETTER OMEGA PI + * used as a technical symbol + * a variant of pi, looking like omega + # 03C0 greek small letter pi +03D7 GREEK KAI SYMBOL + * used as an ampersand + x (coptic symbol kai - 2CE4) +@ Archaic letters +03D8 GREEK LETTER ARCHAIC KOPPA * +03D9 GREEK SMALL LETTER ARCHAIC KOPPA * + * the Q-shaped archaic koppas are the ordinary alphabetic letters and can also be used as symbols with a numeric value of 90 in classical and pre-classical texts +03DA GREEK LETTER STIGMA + * apparently in origin a cursive form of digamma + * the name "stigma" originally applied to a medieval sigma-tau ligature, whose shape was confusably similar to the cursive digamma + * used as a symbol with a numeric value of 6 +03DB GREEK SMALL LETTER STIGMA + x (greek small letter final sigma - 03C2) +03DC GREEK LETTER DIGAMMA +03DD GREEK SMALL LETTER DIGAMMA + * used as a symbol with a numeric value of 6 +03DE GREEK LETTER KOPPA +03DF GREEK SMALL LETTER KOPPA + * used in modern Greek as a symbol with a numeric value of 90, as in the dating of legal documentation +03E0 GREEK LETTER SAMPI +03E1 GREEK SMALL LETTER SAMPI + * used as a symbol with a numeric value of 900 +@ Coptic letters derived from Demotic +@+ For other Coptic letters see the Coptic Block. +03E2 COPTIC CAPITAL LETTER SHEI +03E3 COPTIC SMALL LETTER SHEI +03E4 COPTIC CAPITAL LETTER FEI +03E5 COPTIC SMALL LETTER FEI +03E6 COPTIC CAPITAL LETTER KHEI +03E7 COPTIC SMALL LETTER KHEI +03E8 COPTIC CAPITAL LETTER HORI +03E9 COPTIC SMALL LETTER HORI +03EA COPTIC CAPITAL LETTER GANGIA +03EB COPTIC SMALL LETTER GANGIA +03EC COPTIC CAPITAL LETTER SHIMA +03ED COPTIC SMALL LETTER SHIMA +03EE COPTIC CAPITAL LETTER DEI +03EF COPTIC SMALL LETTER DEI +@ Variant letterforms +03F0 GREEK KAPPA SYMBOL + = GREEK SMALL LETTER SCRIPT KAPPA + * used as technical symbol + # 03BA greek small letter kappa +03F1 GREEK RHO SYMBOL + = GREEK SMALL LETTER TAILED RHO + * used as technical symbol + # 03C1 greek small letter rho +03F2 GREEK LUNATE SIGMA SYMBOL + = GREEK SMALL LETTER LUNATE SIGMA + # 03C2 greek small letter final sigma +@ Additional letter +03F3 GREEK LETTER YOT +@ Variant letterforms and symbols +03F4 GREEK CAPITAL THETA SYMBOL + x (cyrillic capital letter fita - 0472) + # 0398 greek capital letter theta +03F5 GREEK LUNATE EPSILON SYMBOL + = straight epsilon + x (small element of - 220A) + # 03B5 greek small letter epsilon +03F6 GREEK REVERSED LUNATE EPSILON SYMBOL + = reversed straight epsilon + x (small contains as member - 220D) +@ Additional archaic letters for Bactrian +03F7 GREEK CAPITAL LETTER SHO +03F8 GREEK SMALL LETTER SHO +@ Variant letterform +03F9 GREEK CAPITAL LUNATE SIGMA SYMBOL + # 03A3 greek capital letter sigma +@ Archaic letters +03FA GREEK CAPITAL LETTER SAN +03FB GREEK SMALL LETTER SAN +@ Symbol +03FC GREEK RHO WITH STROKE SYMBOL + * used with abbreviations containing 03C1 +@ Editorial symbols +03FD GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL + = antisigma +03FE GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL + = sigma periestigmenon +03FF GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL + = antisigma periestigmenon +@@ 0400 Cyrillic 04FF +@ Cyrillic extensions +0400 CYRILLIC CAPITAL LETTER IE WITH GRAVE + : 0415 0300 +0401 CYRILLIC CAPITAL LETTER IO + : 0415 0308 +0402 CYRILLIC CAPITAL LETTER DJE (Serbocroatian) +0403 CYRILLIC CAPITAL LETTER GJE + : 0413 0301 +0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE +0405 CYRILLIC CAPITAL LETTER DZE +0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + x (latin capital letter i - 0049) + x (cyrillic small letter byelorussian-ukrainian i - 0456) + x (cyrillic letter palochka - 04C0) +0407 CYRILLIC CAPITAL LETTER YI (Ukrainian) + : 0406 0308 +0408 CYRILLIC CAPITAL LETTER JE +0409 CYRILLIC CAPITAL LETTER LJE +040A CYRILLIC CAPITAL LETTER NJE +040B CYRILLIC CAPITAL LETTER TSHE (Serbocroatian) +040C CYRILLIC CAPITAL LETTER KJE + : 041A 0301 +040D CYRILLIC CAPITAL LETTER I WITH GRAVE + : 0418 0300 +040E CYRILLIC CAPITAL LETTER SHORT U (Byelorussian) + : 0423 0306 +040F CYRILLIC CAPITAL LETTER DZHE +@ Basic Russian alphabet +0410 CYRILLIC CAPITAL LETTER A +0411 CYRILLIC CAPITAL LETTER BE + x (latin small letter b with topbar - 0183) +0412 CYRILLIC CAPITAL LETTER VE +0413 CYRILLIC CAPITAL LETTER GHE +0414 CYRILLIC CAPITAL LETTER DE +0415 CYRILLIC CAPITAL LETTER IE +0416 CYRILLIC CAPITAL LETTER ZHE +0417 CYRILLIC CAPITAL LETTER ZE +0418 CYRILLIC CAPITAL LETTER I +0419 CYRILLIC CAPITAL LETTER SHORT I + : 0418 0306 +041A CYRILLIC CAPITAL LETTER KA +041B CYRILLIC CAPITAL LETTER EL +041C CYRILLIC CAPITAL LETTER EM +041D CYRILLIC CAPITAL LETTER EN +041E CYRILLIC CAPITAL LETTER O +041F CYRILLIC CAPITAL LETTER PE +0420 CYRILLIC CAPITAL LETTER ER +0421 CYRILLIC CAPITAL LETTER ES +0422 CYRILLIC CAPITAL LETTER TE +0423 CYRILLIC CAPITAL LETTER U + x (cyrillic capital letter uk - 0478) + x (cyrillic small letter straight u - 04AF) +0424 CYRILLIC CAPITAL LETTER EF +0425 CYRILLIC CAPITAL LETTER HA +0426 CYRILLIC CAPITAL LETTER TSE +0427 CYRILLIC CAPITAL LETTER CHE +0428 CYRILLIC CAPITAL LETTER SHA +0429 CYRILLIC CAPITAL LETTER SHCHA +042A CYRILLIC CAPITAL LETTER HARD SIGN +042B CYRILLIC CAPITAL LETTER YERU +042C CYRILLIC CAPITAL LETTER SOFT SIGN +042D CYRILLIC CAPITAL LETTER E +042E CYRILLIC CAPITAL LETTER YU +042F CYRILLIC CAPITAL LETTER YA +0430 CYRILLIC SMALL LETTER A +0431 CYRILLIC SMALL LETTER BE +0432 CYRILLIC SMALL LETTER VE +0433 CYRILLIC SMALL LETTER GHE +0434 CYRILLIC SMALL LETTER DE +0435 CYRILLIC SMALL LETTER IE +0436 CYRILLIC SMALL LETTER ZHE +0437 CYRILLIC SMALL LETTER ZE +0438 CYRILLIC SMALL LETTER I +0439 CYRILLIC SMALL LETTER SHORT I + : 0438 0306 +043A CYRILLIC SMALL LETTER KA +043B CYRILLIC SMALL LETTER EL +043C CYRILLIC SMALL LETTER EM +043D CYRILLIC SMALL LETTER EN +043E CYRILLIC SMALL LETTER O +043F CYRILLIC SMALL LETTER PE +0440 CYRILLIC SMALL LETTER ER +0441 CYRILLIC SMALL LETTER ES +0442 CYRILLIC SMALL LETTER TE +0443 CYRILLIC SMALL LETTER U +0444 CYRILLIC SMALL LETTER EF +0445 CYRILLIC SMALL LETTER HA +0446 CYRILLIC SMALL LETTER TSE +0447 CYRILLIC SMALL LETTER CHE +0448 CYRILLIC SMALL LETTER SHA +0449 CYRILLIC SMALL LETTER SHCHA +044A CYRILLIC SMALL LETTER HARD SIGN +044B CYRILLIC SMALL LETTER YERU +044C CYRILLIC SMALL LETTER SOFT SIGN + x (latin small letter tone six - 0185) +044D CYRILLIC SMALL LETTER E +044E CYRILLIC SMALL LETTER YU +044F CYRILLIC SMALL LETTER YA +@ Cyrillic extensions +0450 CYRILLIC SMALL LETTER IE WITH GRAVE + * Macedonian + : 0435 0300 +0451 CYRILLIC SMALL LETTER IO + * Russian, ... + : 0435 0308 +0452 CYRILLIC SMALL LETTER DJE (Serbocroatian) + * Serbian + x (latin small letter d with stroke - 0111) +0453 CYRILLIC SMALL LETTER GJE + * Macedonian + : 0433 0301 +0454 CYRILLIC SMALL LETTER UKRAINIAN IE + = Old Cyrillic yest +0455 CYRILLIC SMALL LETTER DZE + = Old Cyrillic zelo + * Macedonian +0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + = Old Cyrillic i +0457 CYRILLIC SMALL LETTER YI (Ukrainian) + * Ukrainian + : 0456 0308 +0458 CYRILLIC SMALL LETTER JE + * Serbian, Azerbaijani, Altay +0459 CYRILLIC SMALL LETTER LJE + * Serbian, Macedonian + x (latin small letter lj - 01C9) +045A CYRILLIC SMALL LETTER NJE + * Serbian, Macedonian + x (latin small letter nj - 01CC) +045B CYRILLIC SMALL LETTER TSHE (Serbocroatian) + = Old Cyrillic derv + * Serbian + x (latin small letter c with acute - 0107) + x (latin small letter h with stroke - 0127) + x (cyrillic capital letter tshe - 040B) + x (planck constant over two pi - 210F) +045C CYRILLIC SMALL LETTER KJE + * Macedonian + : 043A 0301 +045D CYRILLIC SMALL LETTER I WITH GRAVE + * Macedonian + : 0438 0300 +045E CYRILLIC SMALL LETTER SHORT U (Byelorussian) + * Byelorussian, Uzbek + : 0443 0306 +045F CYRILLIC SMALL LETTER DZHE + * Serbian, Macedonian, Abkhasian + x (latin small letter dz with caron - 01C6) +@ Historic letters +0460 CYRILLIC CAPITAL LETTER OMEGA +0461 CYRILLIC SMALL LETTER OMEGA +0462 CYRILLIC CAPITAL LETTER YAT +0463 CYRILLIC SMALL LETTER YAT +0464 CYRILLIC CAPITAL LETTER IOTIFIED E +0465 CYRILLIC SMALL LETTER IOTIFIED E +0466 CYRILLIC CAPITAL LETTER LITTLE YUS +0467 CYRILLIC SMALL LETTER LITTLE YUS +0468 CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +0469 CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS +046A CYRILLIC CAPITAL LETTER BIG YUS +046B CYRILLIC SMALL LETTER BIG YUS +046C CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +046D CYRILLIC SMALL LETTER IOTIFIED BIG YUS +046E CYRILLIC CAPITAL LETTER KSI +046F CYRILLIC SMALL LETTER KSI +0470 CYRILLIC CAPITAL LETTER PSI +0471 CYRILLIC SMALL LETTER PSI +0472 CYRILLIC CAPITAL LETTER FITA +0473 CYRILLIC SMALL LETTER FITA + x (latin small letter barred o - 0275) + x (greek small letter theta - 03B8) +0474 CYRILLIC CAPITAL LETTER IZHITSA +0475 CYRILLIC SMALL LETTER IZHITSA +0476 CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT + : 0474 030F +0477 CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT + : 0475 030F +0478 CYRILLIC CAPITAL LETTER UK + * basic Old Cyrillic uk is unified with CYRILLIC LETTER U + x (cyrillic capital letter u - 0423) +0479 CYRILLIC SMALL LETTER UK +047A CYRILLIC CAPITAL LETTER ROUND OMEGA +047B CYRILLIC SMALL LETTER ROUND OMEGA +047C CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +047D CYRILLIC SMALL LETTER OMEGA WITH TITLO +047E CYRILLIC CAPITAL LETTER OT +047F CYRILLIC SMALL LETTER OT +0480 CYRILLIC CAPITAL LETTER KOPPA +0481 CYRILLIC SMALL LETTER KOPPA +@ Historic miscellaneous +0482 CYRILLIC THOUSANDS SIGN +0483 COMBINING CYRILLIC TITLO +0484 COMBINING CYRILLIC PALATALIZATION + x (combining vertical tilde - 033E) +0485 COMBINING CYRILLIC DASIA PNEUMATA + x (combining reversed comma above - 0314) +0486 COMBINING CYRILLIC PSILI PNEUMATA + x (combining comma above - 0313) +0488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN +0489 COMBINING CYRILLIC MILLIONS SIGN +@ Extended Cyrillic +048A CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +048B CYRILLIC SMALL LETTER SHORT I WITH TAIL + * Kildin Sami +048C CYRILLIC CAPITAL LETTER SEMISOFT SIGN +048D CYRILLIC SMALL LETTER SEMISOFT SIGN + * Kildin Sami +048E CYRILLIC CAPITAL LETTER ER WITH TICK +048F CYRILLIC SMALL LETTER ER WITH TICK + * Kildin Sami +0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0491 CYRILLIC SMALL LETTER GHE WITH UPTURN + * Ukrainian +0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE +0493 CYRILLIC SMALL LETTER GHE WITH STROKE + * Azerbaijani, Bashkir, ... + * full bar form preferred over half-barred "F"-type +0494 CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +0495 CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK + * Abkhasian, Yakut +0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER + * Tatar, ... +0498 CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +0499 CYRILLIC SMALL LETTER ZE WITH DESCENDER + * Bashkir + * reversed ogonek form of the descender is preferred +049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER +049B CYRILLIC SMALL LETTER KA WITH DESCENDER + * Abkhasian, Tajik, ... +049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE + * Azerbaijani +049E CYRILLIC CAPITAL LETTER KA WITH STROKE +049F CYRILLIC SMALL LETTER KA WITH STROKE + * Abkhasian +04A0 CYRILLIC CAPITAL LETTER BASHKIR KA +04A1 CYRILLIC SMALL LETTER BASHKIR KA +04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER + * Bashkir, ... +04A4 CYRILLIC CAPITAL LIGATURE EN GHE +04A5 CYRILLIC SMALL LIGATURE EN GHE + * Altay, Mari, Yakut + * this is not a decomposable ligature +04A6 CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK (Abkhasian) +04A7 CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK (Abkhasian) + * Abkhasian +04A8 CYRILLIC CAPITAL LETTER ABKHASIAN HA +04A9 CYRILLIC SMALL LETTER ABKHASIAN HA +04AA CYRILLIC CAPITAL LETTER ES WITH DESCENDER +04AB CYRILLIC SMALL LETTER ES WITH DESCENDER + * Bashkir, Chuvash + * reversed ogonek form of the descender is preferred +04AC CYRILLIC CAPITAL LETTER TE WITH DESCENDER +04AD CYRILLIC SMALL LETTER TE WITH DESCENDER + * Abkhasian +04AE CYRILLIC CAPITAL LETTER STRAIGHT U +04AF CYRILLIC SMALL LETTER STRAIGHT U + * stem is straight, unlike LETTER U + * Azerbaijani, Bashkir, ... + x (cyrillic capital letter u - 0423) +04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE + * Kazakh +04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER +04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER + * Abkhasian, Tajik, Uzbek +04B4 CYRILLIC CAPITAL LIGATURE TE TSE (Abkhasian) +04B5 CYRILLIC SMALL LIGATURE TE TSE (Abkhasian) + * Abkhasian + * this is not a decomposable ligature +04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER + * Abkhasian, Tajik +04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE + * Azerbaijani +04BA CYRILLIC CAPITAL LETTER SHHA +04BB CYRILLIC SMALL LETTER SHHA + * originally derived from Latin "h", but uppercase form 04BA is closer to an inverted che (0427) + * Azerbaijani, Bashkir, ... + x (latin small letter h - 0068) +04BC CYRILLIC CAPITAL LETTER ABKHASIAN CHE +04BD CYRILLIC SMALL LETTER ABKHASIAN CHE +04BE CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +04BF CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER + * ogonek form preferred +04C0 CYRILLIC LETTER PALOCHKA + * aspiration sign in many Caucasian languages + * has no "lowercase form", i.e. is case-invariant + x (latin capital letter i - 0049) + x (cyrillic capital letter byelorussian-ukrainian i - 0406) +04C1 CYRILLIC CAPITAL LETTER ZHE WITH BREVE + : 0416 0306 +04C2 CYRILLIC SMALL LETTER ZHE WITH BREVE + * Moldavian + : 0436 0306 +04C3 CYRILLIC CAPITAL LETTER KA WITH HOOK +04C4 CYRILLIC SMALL LETTER KA WITH HOOK + * Khanty, Chukchi +04C5 CYRILLIC CAPITAL LETTER EL WITH TAIL +04C6 CYRILLIC SMALL LETTER EL WITH TAIL + * Kildin Sami +04C7 CYRILLIC CAPITAL LETTER EN WITH HOOK +04C8 CYRILLIC SMALL LETTER EN WITH HOOK + * Khanty, Chukchi, Nenets +04C9 CYRILLIC CAPITAL LETTER EN WITH TAIL +04CA CYRILLIC SMALL LETTER EN WITH TAIL + * Kildin Sami +04CB CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +04CC CYRILLIC SMALL LETTER KHAKASSIAN CHE +04CD CYRILLIC CAPITAL LETTER EM WITH TAIL +04CE CYRILLIC SMALL LETTER EM WITH TAIL + * Kildin Sami +04D0 CYRILLIC CAPITAL LETTER A WITH BREVE + : 0410 0306 +04D1 CYRILLIC SMALL LETTER A WITH BREVE + : 0430 0306 +04D2 CYRILLIC CAPITAL LETTER A WITH DIAERESIS + : 0410 0308 +04D3 CYRILLIC SMALL LETTER A WITH DIAERESIS + : 0430 0308 +04D4 CYRILLIC CAPITAL LIGATURE A IE +04D5 CYRILLIC SMALL LIGATURE A IE + * this is not a decomposable ligature + x (latin small letter ae - 00E6) +04D6 CYRILLIC CAPITAL LETTER IE WITH BREVE + : 0415 0306 +04D7 CYRILLIC SMALL LETTER IE WITH BREVE + : 0435 0306 +04D8 CYRILLIC CAPITAL LETTER SCHWA +04D9 CYRILLIC SMALL LETTER SCHWA + x (latin small letter schwa - 0259) +04DA CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS + : 04D8 0308 +04DB CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS + : 04D9 0308 +04DC CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS + : 0416 0308 +04DD CYRILLIC SMALL LETTER ZHE WITH DIAERESIS + : 0436 0308 +04DE CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS + : 0417 0308 +04DF CYRILLIC SMALL LETTER ZE WITH DIAERESIS + : 0437 0308 +04E0 CYRILLIC CAPITAL LETTER ABKHASIAN DZE +04E1 CYRILLIC SMALL LETTER ABKHASIAN DZE + x (latin small letter ezh - 0292) +04E2 CYRILLIC CAPITAL LETTER I WITH MACRON + : 0418 0304 +04E3 CYRILLIC SMALL LETTER I WITH MACRON + : 0438 0304 +04E4 CYRILLIC CAPITAL LETTER I WITH DIAERESIS + : 0418 0308 +04E5 CYRILLIC SMALL LETTER I WITH DIAERESIS + : 0438 0308 +04E6 CYRILLIC CAPITAL LETTER O WITH DIAERESIS + : 041E 0308 +04E7 CYRILLIC SMALL LETTER O WITH DIAERESIS + : 043E 0308 +04E8 CYRILLIC CAPITAL LETTER BARRED O +04E9 CYRILLIC SMALL LETTER BARRED O + x (latin small letter barred o - 0275) +04EA CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS + : 04E8 0308 +04EB CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS + : 04E9 0308 +04EC CYRILLIC CAPITAL LETTER E WITH DIAERESIS + : 042D 0308 +04ED CYRILLIC SMALL LETTER E WITH DIAERESIS + * Kildin Sami + : 044D 0308 +04EE CYRILLIC CAPITAL LETTER U WITH MACRON + : 0423 0304 +04EF CYRILLIC SMALL LETTER U WITH MACRON + : 0443 0304 +04F0 CYRILLIC CAPITAL LETTER U WITH DIAERESIS + : 0423 0308 +04F1 CYRILLIC SMALL LETTER U WITH DIAERESIS + : 0443 0308 +04F2 CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE + : 0423 030B +04F3 CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE + : 0443 030B +04F4 CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS + : 0427 0308 +04F5 CYRILLIC SMALL LETTER CHE WITH DIAERESIS + : 0447 0308 +04F6 CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +04F7 CYRILLIC SMALL LETTER GHE WITH DESCENDER + * Yupik +04F8 CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS + : 042B 0308 +04F9 CYRILLIC SMALL LETTER YERU WITH DIAERESIS + : 044B 0308 +@@ 0500 Cyrillic Supplement 052F +@ Komi letters +0500 CYRILLIC CAPITAL LETTER KOMI DE +0501 CYRILLIC SMALL LETTER KOMI DE +0502 CYRILLIC CAPITAL LETTER KOMI DJE +0503 CYRILLIC SMALL LETTER KOMI DJE +0504 CYRILLIC CAPITAL LETTER KOMI ZJE +0505 CYRILLIC SMALL LETTER KOMI ZJE +0506 CYRILLIC CAPITAL LETTER KOMI DZJE +0507 CYRILLIC SMALL LETTER KOMI DZJE +0508 CYRILLIC CAPITAL LETTER KOMI LJE +0509 CYRILLIC SMALL LETTER KOMI LJE +050A CYRILLIC CAPITAL LETTER KOMI NJE +050B CYRILLIC SMALL LETTER KOMI NJE +050C CYRILLIC CAPITAL LETTER KOMI SJE +050D CYRILLIC SMALL LETTER KOMI SJE +050E CYRILLIC CAPITAL LETTER KOMI TJE +050F CYRILLIC SMALL LETTER KOMI TJE +@@ 0530 Armenian 058F +@ Uppercase letters +0531 ARMENIAN CAPITAL LETTER AYB +0532 ARMENIAN CAPITAL LETTER BEN +0533 ARMENIAN CAPITAL LETTER GIM +0534 ARMENIAN CAPITAL LETTER DA +0535 ARMENIAN CAPITAL LETTER ECH +0536 ARMENIAN CAPITAL LETTER ZA +0537 ARMENIAN CAPITAL LETTER EH +0538 ARMENIAN CAPITAL LETTER ET +0539 ARMENIAN CAPITAL LETTER TO +053A ARMENIAN CAPITAL LETTER ZHE +053B ARMENIAN CAPITAL LETTER INI +053C ARMENIAN CAPITAL LETTER LIWN +053D ARMENIAN CAPITAL LETTER XEH +053E ARMENIAN CAPITAL LETTER CA +053F ARMENIAN CAPITAL LETTER KEN +0540 ARMENIAN CAPITAL LETTER HO +0541 ARMENIAN CAPITAL LETTER JA +0542 ARMENIAN CAPITAL LETTER GHAD +0543 ARMENIAN CAPITAL LETTER CHEH +0544 ARMENIAN CAPITAL LETTER MEN +0545 ARMENIAN CAPITAL LETTER YI +0546 ARMENIAN CAPITAL LETTER NOW +0547 ARMENIAN CAPITAL LETTER SHA +0548 ARMENIAN CAPITAL LETTER VO +0549 ARMENIAN CAPITAL LETTER CHA +054A ARMENIAN CAPITAL LETTER PEH +054B ARMENIAN CAPITAL LETTER JHEH +054C ARMENIAN CAPITAL LETTER RA +054D ARMENIAN CAPITAL LETTER SEH +054E ARMENIAN CAPITAL LETTER VEW +054F ARMENIAN CAPITAL LETTER TIWN +0550 ARMENIAN CAPITAL LETTER REH +0551 ARMENIAN CAPITAL LETTER CO +0552 ARMENIAN CAPITAL LETTER YIWN +0553 ARMENIAN CAPITAL LETTER PIWR +0554 ARMENIAN CAPITAL LETTER KEH +0555 ARMENIAN CAPITAL LETTER OH +0556 ARMENIAN CAPITAL LETTER FEH +@ Modifier letters +0559 ARMENIAN MODIFIER LETTER LEFT HALF RING + x (modifier letter reversed comma - 02BD) + x (modifier letter left half ring - 02BF) + x (combining reversed comma above - 0314) +055A ARMENIAN APOSTROPHE + = ARMENIAN MODIFIER LETTER RIGHT HALF RING + x (modifier letter apostrophe - 02BC) + x (modifier letter right half ring - 02BE) + x (combining comma above - 0313) +055B ARMENIAN EMPHASIS MARK + = shesht + x (modifier letter acute accent - 02CA) +055C ARMENIAN EXCLAMATION MARK + = batsaganchakan nshan +055D ARMENIAN COMMA + = bowt + x (modifier letter grave accent - 02CB) +055E ARMENIAN QUESTION MARK + = hartsakan nshan +055F ARMENIAN ABBREVIATION MARK + = patiw +@ Lowercase letters +0561 ARMENIAN SMALL LETTER AYB +0562 ARMENIAN SMALL LETTER BEN +0563 ARMENIAN SMALL LETTER GIM +0564 ARMENIAN SMALL LETTER DA +0565 ARMENIAN SMALL LETTER ECH +0566 ARMENIAN SMALL LETTER ZA +0567 ARMENIAN SMALL LETTER EH +0568 ARMENIAN SMALL LETTER ET +0569 ARMENIAN SMALL LETTER TO +056A ARMENIAN SMALL LETTER ZHE +056B ARMENIAN SMALL LETTER INI +056C ARMENIAN SMALL LETTER LIWN +056D ARMENIAN SMALL LETTER XEH +056E ARMENIAN SMALL LETTER CA +056F ARMENIAN SMALL LETTER KEN +0570 ARMENIAN SMALL LETTER HO +0571 ARMENIAN SMALL LETTER JA +0572 ARMENIAN SMALL LETTER GHAD +0573 ARMENIAN SMALL LETTER CHEH +0574 ARMENIAN SMALL LETTER MEN +0575 ARMENIAN SMALL LETTER YI +0576 ARMENIAN SMALL LETTER NOW +0577 ARMENIAN SMALL LETTER SHA +0578 ARMENIAN SMALL LETTER VO +0579 ARMENIAN SMALL LETTER CHA +057A ARMENIAN SMALL LETTER PEH +057B ARMENIAN SMALL LETTER JHEH +057C ARMENIAN SMALL LETTER RA +057D ARMENIAN SMALL LETTER SEH +057E ARMENIAN SMALL LETTER VEW +057F ARMENIAN SMALL LETTER TIWN +0580 ARMENIAN SMALL LETTER REH +0581 ARMENIAN SMALL LETTER CO +0582 ARMENIAN SMALL LETTER YIWN +0583 ARMENIAN SMALL LETTER PIWR +0584 ARMENIAN SMALL LETTER KEH +0585 ARMENIAN SMALL LETTER OH +0586 ARMENIAN SMALL LETTER FEH +0587 ARMENIAN SMALL LIGATURE ECH YIWN + # 0565 0582 +@ Punctuation +0589 ARMENIAN FULL STOP + = vertsaket + * may also be used for Georgian + x (colon - 003A) +058A ARMENIAN HYPHEN + = yentamna +@@ 0590 Hebrew 05FF +@ Cantillation marks +0591 HEBREW ACCENT ETNAHTA + = atnah +0592 HEBREW ACCENT SEGOL + = segolta +0593 HEBREW ACCENT SHALSHELET +0594 HEBREW ACCENT ZAQEF QATAN +0595 HEBREW ACCENT ZAQEF GADOL +0596 HEBREW ACCENT TIPEHA * + = tarha, me'ayla ~ mayla +0597 HEBREW ACCENT REVIA +0598 HEBREW ACCENT ZARQA * + = tsinorit, zinorit; tsinor, zinor + * This character is to be used when Zarqa or Tsinor are placed above, and also for Tsinorit. + x (hebrew accent zinor - 05AE) +0599 HEBREW ACCENT PASHTA +059A HEBREW ACCENT YETIV +059B HEBREW ACCENT TEVIR +059C HEBREW ACCENT GERESH + = teres +059D HEBREW ACCENT GERESH MUQDAM +059E HEBREW ACCENT GERSHAYIM +059F HEBREW ACCENT QARNEY PARA + = pazer gadol +05A0 HEBREW ACCENT TELISHA GEDOLA +05A1 HEBREW ACCENT PAZER + = pazer qatan +05A2 HEBREW ACCENT ATNAH HAFUKH + x (hebrew accent yerah ben yomo - 05AA) +05A3 HEBREW ACCENT MUNAH +05A4 HEBREW ACCENT MAHAPAKH +05A5 HEBREW ACCENT MERKHA * + = yored +05A6 HEBREW ACCENT MERKHA KEFULA +05A7 HEBREW ACCENT DARGA +05A8 HEBREW ACCENT QADMA * + = azla +05A9 HEBREW ACCENT TELISHA QETANA +05AA HEBREW ACCENT YERAH BEN YOMO * + = galgal + x (hebrew accent atnah hafukh - 05A2) +05AB HEBREW ACCENT OLE +05AC HEBREW ACCENT ILUY +05AD HEBREW ACCENT DEHI +05AE HEBREW ACCENT ZINOR + = tsinor; zarqa + * This character is to be used when Zarqa or Tsinor are placed above left. + x (hebrew accent zarqa - 0598) +05AF HEBREW MARK MASORA CIRCLE +@ Points and punctuation +05B0 HEBREW POINT SHEVA +05B1 HEBREW POINT HATAF SEGOL +05B2 HEBREW POINT HATAF PATAH +05B3 HEBREW POINT HATAF QAMATS +05B4 HEBREW POINT HIRIQ +05B5 HEBREW POINT TSERE +05B6 HEBREW POINT SEGOL +05B7 HEBREW POINT PATAH + * furtive patah is not a distinct character +05B8 HEBREW POINT QAMATS + x (hebrew point qamats qatan - 05C7) +05B9 HEBREW POINT HOLAM +05BB HEBREW POINT QUBUTS +05BC HEBREW POINT DAGESH OR MAPIQ (or shuruq) + = shuruq + * falls within the base letter +05BD HEBREW POINT METEG * + = siluq + * may be used as a Hebrew accent sof pasuq +05BE HEBREW PUNCTUATION MAQAF +05BF HEBREW POINT RAFE + x (hebrew point judeo-spanish varika - FB1E) +05C0 HEBREW PUNCTUATION PASEQ * + = legarmeh + * may be treated as spacing punctuation, not as a point + x (vertical line - 007C) +05C1 HEBREW POINT SHIN DOT +05C2 HEBREW POINT SIN DOT +05C3 HEBREW PUNCTUATION SOF PASUQ * + * may be used as a Hebrew punctuation colon + x (colon - 003A) +@ Puncta extraordinaria +05C4 HEBREW MARK UPPER DOT +05C5 HEBREW MARK LOWER DOT + * punctum extraordinarium (Psalms 27:13) + x (hebrew point hiriq - 05B4) +@ Points and punctuation +05C6 HEBREW PUNCTUATION NUN HAFUKHA + * does not historically derive from the letter nun + x (hebrew letter nun - 05E0) +05C7 HEBREW POINT QAMATS QATAN + x (hebrew point qamats - 05B8) +@ Based on ISO 8859-8 +05D0 HEBREW LETTER ALEF + = aleph + x (alef symbol - 2135) +05D1 HEBREW LETTER BET + x (bet symbol - 2136) +05D2 HEBREW LETTER GIMEL + x (gimel symbol - 2137) +05D3 HEBREW LETTER DALET + x (dalet symbol - 2138) +05D4 HEBREW LETTER HE +05D5 HEBREW LETTER VAV +05D6 HEBREW LETTER ZAYIN +05D7 HEBREW LETTER HET +05D8 HEBREW LETTER TET +05D9 HEBREW LETTER YOD +05DA HEBREW LETTER FINAL KAF +05DB HEBREW LETTER KAF +05DC HEBREW LETTER LAMED +05DD HEBREW LETTER FINAL MEM +05DE HEBREW LETTER MEM +05DF HEBREW LETTER FINAL NUN +05E0 HEBREW LETTER NUN +05E1 HEBREW LETTER SAMEKH +05E2 HEBREW LETTER AYIN +05E3 HEBREW LETTER FINAL PE +05E4 HEBREW LETTER PE +05E5 HEBREW LETTER FINAL TSADI +05E6 HEBREW LETTER TSADI + = zade +05E7 HEBREW LETTER QOF +05E8 HEBREW LETTER RESH +05E9 HEBREW LETTER SHIN +05EA HEBREW LETTER TAV +@ Yiddish digraphs +05F0 HEBREW LIGATURE YIDDISH DOUBLE VAV + = tsvey vovn +05F1 HEBREW LIGATURE YIDDISH VAV YOD +05F2 HEBREW LIGATURE YIDDISH DOUBLE YOD + = tsvey yudn +@ Additional punctuation +05F3 HEBREW PUNCTUATION GERESH +05F4 HEBREW PUNCTUATION GERSHAYIM +@@ 0600 Arabic 06FF +@ Subtending marks +0600 ARABIC NUMBER SIGN +0601 ARABIC SIGN SANAH +0602 ARABIC FOOTNOTE MARKER +0603 ARABIC SIGN SAFHA +@ Currency sign +060B AFGHANI SIGN +@ Punctuation +060C ARABIC COMMA + * also used with Thaana and Syriac in modern text + x (comma - 002C) +060D ARABIC DATE SEPARATOR +@ Poetic marks +060E ARABIC POETIC VERSE SIGN +060F ARABIC SIGN MISRA +@ Honorifics +0610 ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM + * represents sallallahu alayhe wasallam "may God's peace and blessings be upon him" +0611 ARABIC SIGN ALAYHE ASSALLAM + * represents alayhe assalam "upon him be peace" +0612 ARABIC SIGN RAHMATULLAH ALAYHE + * represents rahmatullah alayhe "may God have mercy upon him" +0613 ARABIC SIGN RADI ALLAHOU ANHU + * represents radi allahu 'anhu "may God be pleased with him" +0614 ARABIC SIGN TAKHALLUS + * sign placed over the name or nom-de-plume of a poet, or in some writings used to mark all proper names +@ Koranic annotation sign +0615 ARABIC SMALL HIGH TAH + * marks a recommended pause position in some Korans published in Iran and Pakistan + * should not be confused with the small TAH sign used as a diacritic for some letters such as 0679 +@ Punctuation +061B ARABIC SEMICOLON + * also used with Thaana and Syriac in modern text + x (semicolon - 003B) +061E ARABIC TRIPLE DOT PUNCTUATION MARK +061F ARABIC QUESTION MARK + * also used with Thaana and Syriac in modern text + x (question mark - 003F) +@ Based on ISO 8859-6 +0621 ARABIC LETTER HAMZA + x (modifier letter right half ring - 02BE) +0622 ARABIC LETTER ALEF WITH MADDA ABOVE + : 0627 0653 +0623 ARABIC LETTER ALEF WITH HAMZA ABOVE + : 0627 0654 +0624 ARABIC LETTER WAW WITH HAMZA ABOVE + : 0648 0654 +0625 ARABIC LETTER ALEF WITH HAMZA BELOW + : 0627 0655 +0626 ARABIC LETTER YEH WITH HAMZA ABOVE + : 064A 0654 +0627 ARABIC LETTER ALEF +0628 ARABIC LETTER BEH +0629 ARABIC LETTER TEH MARBUTA +062A ARABIC LETTER TEH +062B ARABIC LETTER THEH +062C ARABIC LETTER JEEM +062D ARABIC LETTER HAH +062E ARABIC LETTER KHAH +062F ARABIC LETTER DAL +0630 ARABIC LETTER THAL +0631 ARABIC LETTER REH +0632 ARABIC LETTER ZAIN +0633 ARABIC LETTER SEEN +0634 ARABIC LETTER SHEEN +0635 ARABIC LETTER SAD +0636 ARABIC LETTER DAD +0637 ARABIC LETTER TAH +0638 ARABIC LETTER ZAH +0639 ARABIC LETTER AIN + x (latin small letter ezh reversed - 01B9) + x (modifier letter left half ring - 02BF) +063A ARABIC LETTER GHAIN +0640 ARABIC TATWEEL + = kashida + * inserted to stretch characters + * also used with Syriac +0641 ARABIC LETTER FEH +0642 ARABIC LETTER QAF +0643 ARABIC LETTER KAF +0644 ARABIC LETTER LAM +0645 ARABIC LETTER MEEM +0646 ARABIC LETTER NOON +0647 ARABIC LETTER HEH +0648 ARABIC LETTER WAW +0649 ARABIC LETTER ALEF MAKSURA + * represents YEH-shaped letter with no dots in any positional form +064A ARABIC LETTER YEH +@ Points from ISO 8859-6 +064B ARABIC FATHATAN +064C ARABIC DAMMATAN +064D ARABIC KASRATAN +064E ARABIC FATHA +064F ARABIC DAMMA +0650 ARABIC KASRA +0651 ARABIC SHADDA +0652 ARABIC SUKUN + * marks absence of a vowel after the base consonant + * used in some Korans to mark a long vowel as ignored + x (arabic small high dotless head of khah - 06E1) +@ Combining maddah and hamza +0653 ARABIC MADDAH ABOVE +0654 ARABIC HAMZA ABOVE +0655 ARABIC HAMZA BELOW +@ Other combining marks +0656 ARABIC SUBSCRIPT ALEF +0657 ARABIC INVERTED DAMMA +0658 ARABIC MARK NOON GHUNNA + * Kashmiri and Baluchi + * indicates nasalization in Urdu +0659 ARABIC ZWARAKAY + * Pashto +065A ARABIC VOWEL SIGN SMALL V ABOVE + * African languages +065B ARABIC VOWEL SIGN INVERTED SMALL V ABOVE + * African languages +065C ARABIC VOWEL SIGN DOT BELOW + * African languages +065D ARABIC REVERSED DAMMA + * Ormuri, African languages +065E ARABIC FATHA WITH TWO DOTS + * Kalami +@ Arabic-Indic digits +@+ These digits are used with Arabic proper; for languages of Iran, Pakistan, and India, see the Eastern Arabic-Indic digits at 06F0..06F9. +0660 ARABIC-INDIC DIGIT ZERO +0661 ARABIC-INDIC DIGIT ONE +0662 ARABIC-INDIC DIGIT TWO +0663 ARABIC-INDIC DIGIT THREE +0664 ARABIC-INDIC DIGIT FOUR +0665 ARABIC-INDIC DIGIT FIVE +0666 ARABIC-INDIC DIGIT SIX +0667 ARABIC-INDIC DIGIT SEVEN +0668 ARABIC-INDIC DIGIT EIGHT +0669 ARABIC-INDIC DIGIT NINE +@ Punctuation +066A ARABIC PERCENT SIGN + x (percent sign - 0025) +066B ARABIC DECIMAL SEPARATOR +066C ARABIC THOUSANDS SEPARATOR + x (apostrophe - 0027) + x (right single quotation mark - 2019) +066D ARABIC FIVE POINTED STAR + x (asterisk - 002A) +@ Archaic letters +066E ARABIC LETTER DOTLESS BEH +066F ARABIC LETTER DOTLESS QAF +@ Point +0670 ARABIC LETTER SUPERSCRIPT ALEF + * actually a vowel sign, despite the name +@ Extended Arabic letters +0671 ARABIC LETTER ALEF WASLA + * Koranic Arabic +0672 ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE + * Baluchi, Kashmiri +0673 ARABIC LETTER ALEF WITH WAVY HAMZA BELOW + * Baluchi, Kashmiri +0674 ARABIC LETTER HIGH HAMZA + * Kazakh + * forms digraphs +0675 ARABIC LETTER HIGH HAMZA ALEF + * Kazakh + # 0627 0674 +0676 ARABIC LETTER HIGH HAMZA WAW + * Kazakh + # 0648 0674 +0677 ARABIC LETTER U WITH HAMZA ABOVE + * Kazakh + # 06C7 0674 +0678 ARABIC LETTER HIGH HAMZA YEH + * Kazakh + # 064A 0674 +0679 ARABIC LETTER TTEH + * Urdu +067A ARABIC LETTER TTEHEH + * Sindhi +067B ARABIC LETTER BEEH + * Sindhi +067C ARABIC LETTER TEH WITH RING + * Pashto +067D ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS + * Sindhi +067E ARABIC LETTER PEH + * Persian, Urdu, ... +067F ARABIC LETTER TEHEH + * Sindhi +0680 ARABIC LETTER BEHEH + * Sindhi +0681 ARABIC LETTER HAH WITH HAMZA ABOVE + * Pashto letter "zhe" +0682 ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE + * not used in modern Pashto +0683 ARABIC LETTER NYEH + * Sindhi +0684 ARABIC LETTER DYEH + * Sindhi +0685 ARABIC LETTER HAH WITH THREE DOTS ABOVE + * Pashto +0686 ARABIC LETTER TCHEH + * Persian, Urdu, ... +0687 ARABIC LETTER TCHEHEH + * Sindhi +0688 ARABIC LETTER DDAL + * Urdu +0689 ARABIC LETTER DAL WITH RING + * Pashto +068A ARABIC LETTER DAL WITH DOT BELOW + * Sindhi +068B ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH + * Lahnda +068C ARABIC LETTER DAHAL + * Sindhi +068D ARABIC LETTER DDAHAL + * Sindhi +068E ARABIC LETTER DUL + * older shape for DUL, now obsolete in Sindhi +068F ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS + * Sindhi + * current shape used for DUL +0690 ARABIC LETTER DAL WITH FOUR DOTS ABOVE + * old Urdu, not in current use +0691 ARABIC LETTER RREH + * Urdu +0692 ARABIC LETTER REH WITH SMALL V + * Kurdish +0693 ARABIC LETTER REH WITH RING + * Pashto +0694 ARABIC LETTER REH WITH DOT BELOW + * Kurdish +0695 ARABIC LETTER REH WITH SMALL V BELOW + * Kurdish +0696 ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE + * Pashto +0697 ARABIC LETTER REH WITH TWO DOTS ABOVE + * Dargwa +0698 ARABIC LETTER JEH + * Persian, Urdu, ... +0699 ARABIC LETTER REH WITH FOUR DOTS ABOVE + * Sindhi +069A ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE + * Pashto +069B ARABIC LETTER SEEN WITH THREE DOTS BELOW +069C ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE + * Moroccan Arabic +069D ARABIC LETTER SAD WITH TWO DOTS BELOW + * Turkic +069E ARABIC LETTER SAD WITH THREE DOTS ABOVE + * Berber +069F ARABIC LETTER TAH WITH THREE DOTS ABOVE + * old Hausa +06A0 ARABIC LETTER AIN WITH THREE DOTS ABOVE + * old Malay +06A1 ARABIC LETTER DOTLESS FEH + * Adighe +06A2 ARABIC LETTER FEH WITH DOT MOVED BELOW + * Maghrib Arabic +06A3 ARABIC LETTER FEH WITH DOT BELOW + * Ingush +06A4 ARABIC LETTER VEH + * Middle Eastern Arabic for foreign words + * Kurdish +06A5 ARABIC LETTER FEH WITH THREE DOTS BELOW + * North African Arabic for foreign words +06A6 ARABIC LETTER PEHEH + * Sindhi +06A7 ARABIC LETTER QAF WITH DOT ABOVE + * Maghrib Arabic +06A8 ARABIC LETTER QAF WITH THREE DOTS ABOVE + * Tunisian Arabic +06A9 ARABIC LETTER KEHEH + * Persian, Urdu, ... +06AA ARABIC LETTER SWASH KAF +06AB ARABIC LETTER KAF WITH RING + * Pashto + * may appear like an Arabic KAF (0643) with a ring below the base +06AC ARABIC LETTER KAF WITH DOT ABOVE + * old Malay +06AD ARABIC LETTER NG + * Uighur, Kazakh, old Malay, ... +06AE ARABIC LETTER KAF WITH THREE DOTS BELOW + * Berber +06AF ARABIC LETTER GAF * + * Persian, Urdu, ... +06B0 ARABIC LETTER GAF WITH RING + * Lahnda +06B1 ARABIC LETTER NGOEH + * Sindhi +06B2 ARABIC LETTER GAF WITH TWO DOTS BELOW + * not used in Sindhi +06B3 ARABIC LETTER GUEH + * Sindhi +06B4 ARABIC LETTER GAF WITH THREE DOTS ABOVE + * not used in Sindhi +06B5 ARABIC LETTER LAM WITH SMALL V + * Kurdish +06B6 ARABIC LETTER LAM WITH DOT ABOVE + * Kurdish +06B7 ARABIC LETTER LAM WITH THREE DOTS ABOVE + * Kurdish +06B8 ARABIC LETTER LAM WITH THREE DOTS BELOW +06B9 ARABIC LETTER NOON WITH DOT BELOW +06BA ARABIC LETTER NOON GHUNNA + * Urdu +06BB ARABIC LETTER RNOON + * Sindhi +06BC ARABIC LETTER NOON WITH RING + * Pashto +06BD ARABIC LETTER NOON WITH THREE DOTS ABOVE + * old Malay +06BE ARABIC LETTER HEH DOACHASHMEE + * Urdu + * forms aspirate digraphs +06BF ARABIC LETTER TCHEH WITH DOT ABOVE +06C0 ARABIC LETTER HEH WITH YEH ABOVE + = ARABIC LETTER HAMZAH ON HA + = izafet + * Urdu + * actually a ligature, not an independent letter + : 06D5 0654 +06C1 ARABIC LETTER HEH GOAL + * Urdu +06C2 ARABIC LETTER HEH GOAL WITH HAMZA ABOVE + * Urdu + * actually a ligature, not an independent letter + : 06C1 0654 +06C3 ARABIC LETTER TEH MARBUTA GOAL + * Urdu +06C4 ARABIC LETTER WAW WITH RING + * Kashmiri +06C5 ARABIC LETTER KIRGHIZ OE + * Kirghiz +06C6 ARABIC LETTER OE + * Uighur, Kurdish, Kazakh +06C7 ARABIC LETTER U + * Kirghiz +06C8 ARABIC LETTER YU + * Uighur +06C9 ARABIC LETTER KIRGHIZ YU + * Kazakh, Kirghiz +06CA ARABIC LETTER WAW WITH TWO DOTS ABOVE + * Kurdish +06CB ARABIC LETTER VE + * Uighur, Kazakh +06CC ARABIC LETTER FARSI YEH + * Arabic, Persian, Urdu, ... + * initial and medial forms of this letter have dots + x (arabic letter alef maksura - 0649) + x (arabic letter yeh - 064A) +06CD ARABIC LETTER YEH WITH TAIL + * Pashto, Sindhi +06CE ARABIC LETTER YEH WITH SMALL V + * Kurdish +06CF ARABIC LETTER WAW WITH DOT ABOVE +06D0 ARABIC LETTER E * + * Pashto, Uighur + * used as the letter bbeh in Sindhi +06D1 ARABIC LETTER YEH WITH THREE DOTS BELOW + * old Malay +06D2 ARABIC LETTER YEH BARREE + * Urdu +06D3 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE + * Urdu + * actually a ligature, not an independent letter + : 06D2 0654 +@ Punctuation +06D4 ARABIC FULL STOP + * Urdu +@ Extended Arabic letter +06D5 ARABIC LETTER AE + * Uighur, Kazakh, Kirghiz +@ Koranic annotation signs +06D6 ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA +06D7 ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA +06D8 ARABIC SMALL HIGH MEEM INITIAL FORM +06D9 ARABIC SMALL HIGH LAM ALEF +06DA ARABIC SMALL HIGH JEEM +06DB ARABIC SMALL HIGH THREE DOTS +06DC ARABIC SMALL HIGH SEEN +06DD ARABIC END OF AYAH +06DE ARABIC START OF RUB EL HIZB +06DF ARABIC SMALL HIGH ROUNDED ZERO +06E0 ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO +06E1 ARABIC SMALL HIGH DOTLESS HEAD OF KHAH + = Arabic jazm + * used in some Korans to mark absence of a vowel + x (arabic sukun - 0652) +06E2 ARABIC SMALL HIGH MEEM ISOLATED FORM +06E3 ARABIC SMALL LOW SEEN +06E4 ARABIC SMALL HIGH MADDA +06E5 ARABIC SMALL WAW +06E6 ARABIC SMALL YEH +06E7 ARABIC SMALL HIGH YEH +06E8 ARABIC SMALL HIGH NOON +06E9 ARABIC PLACE OF SAJDAH +06EA ARABIC EMPTY CENTRE LOW STOP +06EB ARABIC EMPTY CENTRE HIGH STOP +06EC ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE +06ED ARABIC SMALL LOW MEEM +@ Extended Arabic letters for Parkari +06EE ARABIC LETTER DAL WITH INVERTED V +06EF ARABIC LETTER REH WITH INVERTED V +@ Eastern Arabic-Indic digits +@+ These digits are used with Arabic-script languages of Iran, Pakistan, and India (Persian, Sindhi, Urdu, etc.). For details of variations in preferred glyphs, see the block description for the Arabic script. +06F0 EXTENDED ARABIC-INDIC DIGIT ZERO +06F1 EXTENDED ARABIC-INDIC DIGIT ONE +06F2 EXTENDED ARABIC-INDIC DIGIT TWO +06F3 EXTENDED ARABIC-INDIC DIGIT THREE +06F4 EXTENDED ARABIC-INDIC DIGIT FOUR + * Persian has a different glyph than Sindhi and Urdu +06F5 EXTENDED ARABIC-INDIC DIGIT FIVE + * Persian, Sindhi, and Urdu share glyph different from Arabic +06F6 EXTENDED ARABIC-INDIC DIGIT SIX + * Persian, Sindhi, and Urdu have glyphs different from Arabic +06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN + * Urdu and Sindhi have glyphs different from Arabic +06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT +06F9 EXTENDED ARABIC-INDIC DIGIT NINE +@ Extended Arabic letters +06FA ARABIC LETTER SHEEN WITH DOT BELOW +06FB ARABIC LETTER DAD WITH DOT BELOW +06FC ARABIC LETTER GHAIN WITH DOT BELOW +@ Signs for Sindhi +06FD ARABIC SIGN SINDHI AMPERSAND +06FE ARABIC SIGN SINDHI POSTPOSITION MEN +@ Extended Arabic letter for Parkari +06FF ARABIC LETTER HEH WITH INVERTED V +@@ 0700 Syriac 074F +@ Syriac punctuation and signs +0700 SYRIAC END OF PARAGRAPH + * marks the end of a paragraph +0701 SYRIAC SUPRALINEAR FULL STOP + * marks interrogations, imperatives, and pauses, especially in Biblical texts +0702 SYRIAC SUBLINEAR FULL STOP + * marks subordinate clauses and minor pauses, especially in Biblical texts +0703 SYRIAC SUPRALINEAR COLON + * marks expressions of wonder and has a distinct pausal value in Biblical texts +0704 SYRIAC SUBLINEAR COLON + * used at the end of verses of supplications +0705 SYRIAC HORIZONTAL COLON + * joins two words closely together in a context to which a rising tone is suitable +0706 SYRIAC COLON SKEWED LEFT + * marks a dependent clause +0707 SYRIAC COLON SKEWED RIGHT + * marks the end of a subdivision of the apodosis, or latter part of a Biblical verse +0708 SYRIAC SUPRALINEAR COLON SKEWED LEFT + * marks a minor phrase division +0709 SYRIAC SUBLINEAR COLON SKEWED RIGHT + * marks the end of a real or rhetorical question +070A SYRIAC CONTRACTION + * a contraction mark, mostly used in East Syriac + * placed at the end of an incomplete word +070B SYRIAC HARKLEAN OBELUS + * marks the beginning of a phrase, word, or morpheme that has a marginal note +070C SYRIAC HARKLEAN METOBELUS + * marks the end of a section with a marginal note +070D SYRIAC HARKLEAN ASTERISCUS + * marks the beginning of a phrase, word, or morpheme that has a marginal note +@ Syriac format control character +070F SYRIAC ABBREVIATION MARK + = SAM + * marks the beginning of a Syriac abbreviation +@ Syriac letters +0710 SYRIAC LETTER ALAPH +0711 SYRIAC LETTER SUPERSCRIPT ALAPH + * used in East Syriac texts to indicate an etymological Alaph +0712 SYRIAC LETTER BETH +0713 SYRIAC LETTER GAMAL +0714 SYRIAC LETTER GAMAL GARSHUNI + * used in Garshuni documents +0715 SYRIAC LETTER DALATH +0716 SYRIAC LETTER DOTLESS DALATH RISH + * ambiguous form for undifferentiated early dalath/rish +0717 SYRIAC LETTER HE +0718 SYRIAC LETTER WAW +0719 SYRIAC LETTER ZAIN +071A SYRIAC LETTER HETH +071B SYRIAC LETTER TETH +071C SYRIAC LETTER TETH GARSHUNI + * used in Garshuni documents +071D SYRIAC LETTER YUDH +071E SYRIAC LETTER YUDH HE + * mostly used in East Syriac texts +071F SYRIAC LETTER KAPH +0720 SYRIAC LETTER LAMADH +0721 SYRIAC LETTER MIM +0722 SYRIAC LETTER NUN +0723 SYRIAC LETTER SEMKATH +0724 SYRIAC LETTER FINAL SEMKATH +0725 SYRIAC LETTER E +0726 SYRIAC LETTER PE +0727 SYRIAC LETTER REVERSED PE + * used in Christian Palestinian Aramaic +0728 SYRIAC LETTER SADHE +0729 SYRIAC LETTER QAPH +072A SYRIAC LETTER RISH +072B SYRIAC LETTER SHIN +072C SYRIAC LETTER TAW +@ Persian letters +072D SYRIAC LETTER PERSIAN BHETH +072E SYRIAC LETTER PERSIAN GHAMAL +072F SYRIAC LETTER PERSIAN DHALATH +@ Syriac points (vowels) +0730 SYRIAC PTHAHA ABOVE +0731 SYRIAC PTHAHA BELOW +0732 SYRIAC PTHAHA DOTTED +0733 SYRIAC ZQAPHA ABOVE +0734 SYRIAC ZQAPHA BELOW +0735 SYRIAC ZQAPHA DOTTED +0736 SYRIAC RBASA ABOVE +0737 SYRIAC RBASA BELOW +0738 SYRIAC DOTTED ZLAMA HORIZONTAL +0739 SYRIAC DOTTED ZLAMA ANGULAR +073A SYRIAC HBASA ABOVE +073B SYRIAC HBASA BELOW +073C SYRIAC HBASA-ESASA DOTTED +073D SYRIAC ESASA ABOVE +073E SYRIAC ESASA BELOW +073F SYRIAC RWAHA +@ Syriac marks +0740 SYRIAC FEMININE DOT + * feminine marker used with the Taw feminine suffix +0741 SYRIAC QUSHSHAYA + * indicates a plosive pronunciation +0742 SYRIAC RUKKAKHA + * indicates an aspirated (spirantized) pronunciation +0743 SYRIAC TWO VERTICAL DOTS ABOVE + * accent mark used in ancient manuscripts +0744 SYRIAC TWO VERTICAL DOTS BELOW + * accent mark used in ancient manuscripts +0745 SYRIAC THREE DOTS ABOVE + * diacritic used in Turoyo for letters not found in Syriac +0746 SYRIAC THREE DOTS BELOW + * diacritic used in Turoyo for letters not found in Syriac +0747 SYRIAC OBLIQUE LINE ABOVE + * indication of a silent letter +0748 SYRIAC OBLIQUE LINE BELOW + * indication of a silent letter + * also used to indicate numbers multiplied by a certain constant +0749 SYRIAC MUSIC + * a music mark + * also used in the Syrian Orthodox Anaphora book to mark the breaking of the Eucharist bread +074A SYRIAC BARREKH + * a diacritic cross used in liturgical texts +@ Sogdian letters +074D SYRIAC LETTER SOGDIAN ZHAIN +074E SYRIAC LETTER SOGDIAN KHAPH +074F SYRIAC LETTER SOGDIAN FE +@@ 0750 Arabic Supplement 077F +@ Extended Arabic letters +@+ These are primarily used in Arabic-script orthographies of African languages. +0750 ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW +0751 ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE +0752 ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW +0753 ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE +0754 ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE +0755 ARABIC LETTER BEH WITH INVERTED SMALL V BELOW +0756 ARABIC LETTER BEH WITH SMALL V +0757 ARABIC LETTER HAH WITH TWO DOTS ABOVE +0758 ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW +0759 ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH + * Saraiki +075A ARABIC LETTER DAL WITH INVERTED SMALL V BELOW +075B ARABIC LETTER REH WITH STROKE +075C ARABIC LETTER SEEN WITH FOUR DOTS ABOVE + * Shina +075D ARABIC LETTER AIN WITH TWO DOTS ABOVE +075E ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE +075F ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE +0760 ARABIC LETTER FEH WITH TWO DOTS BELOW +0761 ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW +0762 ARABIC LETTER KEHEH WITH DOT ABOVE + * old Malay, preferred to 06AC + x (arabic letter kaf with dot above - 06AC) +0763 ARABIC LETTER KEHEH WITH THREE DOTS ABOVE + * Moroccan Arabic, Amazigh + x (arabic letter ng - 06AD) +0764 ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW +0765 ARABIC LETTER MEEM WITH DOT ABOVE +0766 ARABIC LETTER MEEM WITH DOT BELOW + * Maba +0767 ARABIC LETTER NOON WITH TWO DOTS BELOW +0768 ARABIC LETTER NOON WITH SMALL TAH + * Saraiki, Pathwari +0769 ARABIC LETTER NOON WITH SMALL V + * Gojri +076A ARABIC LETTER LAM WITH BAR +076B ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE + * Torwali, Ormuri +076C ARABIC LETTER REH WITH HAMZA ABOVE + * Ormuri +076D ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE + * Kalami, Ormuri +@@ 0780 Thaana 07BF +@ Basic consonants +0780 THAANA LETTER HAA +0781 THAANA LETTER SHAVIYANI +0782 THAANA LETTER NOONU +0783 THAANA LETTER RAA +0784 THAANA LETTER BAA +0785 THAANA LETTER LHAVIYANI +0786 THAANA LETTER KAAFU +0787 THAANA LETTER ALIFU +0788 THAANA LETTER VAAVU +0789 THAANA LETTER MEEMU +078A THAANA LETTER FAAFU +078B THAANA LETTER DHAALU +078C THAANA LETTER THAA +078D THAANA LETTER LAAMU +078E THAANA LETTER GAAFU +078F THAANA LETTER GNAVIYANI +0790 THAANA LETTER SEENU +0791 THAANA LETTER DAVIYANI +0792 THAANA LETTER ZAVIYANI +0793 THAANA LETTER TAVIYANI +0794 THAANA LETTER YAA +0795 THAANA LETTER PAVIYANI +0796 THAANA LETTER JAVIYANI +0797 THAANA LETTER CHAVIYANI +@ Extensions for Arabic +0798 THAANA LETTER TTAA +0799 THAANA LETTER HHAA +079A THAANA LETTER KHAA +079B THAANA LETTER THAALU +079C THAANA LETTER ZAA +079D THAANA LETTER SHEENU +079E THAANA LETTER SAADHU +079F THAANA LETTER DAADHU +07A0 THAANA LETTER TO +07A1 THAANA LETTER ZO +07A2 THAANA LETTER AINU +07A3 THAANA LETTER GHAINU +07A4 THAANA LETTER QAAFU +07A5 THAANA LETTER WAAVU +@ Vowels +07A6 THAANA ABAFILI +07A7 THAANA AABAAFILI +07A8 THAANA IBIFILI +07A9 THAANA EEBEEFILI +07AA THAANA UBUFILI +07AB THAANA OOBOOFILI +07AC THAANA EBEFILI +07AD THAANA EYBEYFILI +07AE THAANA OBOFILI +07AF THAANA OABOAFILI +07B0 THAANA SUKUN +@ Consonant for Addu dialect +07B1 THAANA LETTER NAA +@@ 0900 Devanagari 097F +@ Based on ISCII 1988 +@ Various signs +0901 DEVANAGARI SIGN CANDRABINDU + = anunasika + x (combining candrabindu - 0310) +0902 DEVANAGARI SIGN ANUSVARA + = bindu +0903 DEVANAGARI SIGN VISARGA +@ Independent vowels +0904 DEVANAGARI LETTER SHORT A +0905 DEVANAGARI LETTER A +0906 DEVANAGARI LETTER AA +0907 DEVANAGARI LETTER I +0908 DEVANAGARI LETTER II +0909 DEVANAGARI LETTER U +090A DEVANAGARI LETTER UU +090B DEVANAGARI LETTER VOCALIC R +090C DEVANAGARI LETTER VOCALIC L +090D DEVANAGARI LETTER CANDRA E +090E DEVANAGARI LETTER SHORT E + * for transcribing Dravidian short e +090F DEVANAGARI LETTER E +0910 DEVANAGARI LETTER AI +0911 DEVANAGARI LETTER CANDRA O +0912 DEVANAGARI LETTER SHORT O + * for transcribing Dravidian short o +0913 DEVANAGARI LETTER O +0914 DEVANAGARI LETTER AU +@ Consonants +0915 DEVANAGARI LETTER KA +0916 DEVANAGARI LETTER KHA +0917 DEVANAGARI LETTER GA +0918 DEVANAGARI LETTER GHA +0919 DEVANAGARI LETTER NGA +091A DEVANAGARI LETTER CA +091B DEVANAGARI LETTER CHA +091C DEVANAGARI LETTER JA +091D DEVANAGARI LETTER JHA +091E DEVANAGARI LETTER NYA +091F DEVANAGARI LETTER TTA +0920 DEVANAGARI LETTER TTHA +0921 DEVANAGARI LETTER DDA +0922 DEVANAGARI LETTER DDHA +0923 DEVANAGARI LETTER NNA +0924 DEVANAGARI LETTER TA +0925 DEVANAGARI LETTER THA +0926 DEVANAGARI LETTER DA +0927 DEVANAGARI LETTER DHA +0928 DEVANAGARI LETTER NA +0929 DEVANAGARI LETTER NNNA + * for transcribing Dravidian alveolar n + : 0928 093C +092A DEVANAGARI LETTER PA +092B DEVANAGARI LETTER PHA +092C DEVANAGARI LETTER BA +092D DEVANAGARI LETTER BHA +092E DEVANAGARI LETTER MA +092F DEVANAGARI LETTER YA +0930 DEVANAGARI LETTER RA +0931 DEVANAGARI LETTER RRA + * for transcribing Dravidian alveolar r + * half form is represented as "Eyelash RA" + : 0930 093C +0932 DEVANAGARI LETTER LA +0933 DEVANAGARI LETTER LLA +0934 DEVANAGARI LETTER LLLA + * for transcribing Dravidian l + : 0933 093C +0935 DEVANAGARI LETTER VA +0936 DEVANAGARI LETTER SHA +0937 DEVANAGARI LETTER SSA +0938 DEVANAGARI LETTER SA +0939 DEVANAGARI LETTER HA +@ Various signs +093C DEVANAGARI SIGN NUKTA + * for extending the alphabet to new letters +093D DEVANAGARI SIGN AVAGRAHA +@ Dependent vowel signs +093E DEVANAGARI VOWEL SIGN AA +093F DEVANAGARI VOWEL SIGN I + * stands to the left of the consonant +0940 DEVANAGARI VOWEL SIGN II +0941 DEVANAGARI VOWEL SIGN U +0942 DEVANAGARI VOWEL SIGN UU +0943 DEVANAGARI VOWEL SIGN VOCALIC R +0944 DEVANAGARI VOWEL SIGN VOCALIC RR +0945 DEVANAGARI VOWEL SIGN CANDRA E + = candra +0946 DEVANAGARI VOWEL SIGN SHORT E + * for transcribing Dravidian vowels +0947 DEVANAGARI VOWEL SIGN E +0948 DEVANAGARI VOWEL SIGN AI +0949 DEVANAGARI VOWEL SIGN CANDRA O +094A DEVANAGARI VOWEL SIGN SHORT O + * for transcribing Dravidian vowels +094B DEVANAGARI VOWEL SIGN O +094C DEVANAGARI VOWEL SIGN AU +@ Various signs +094D DEVANAGARI SIGN VIRAMA + = halant (the preferred Hindi name) + * suppresses inherent vowel +0950 DEVANAGARI OM +0951 DEVANAGARI STRESS SIGN UDATTA + * mostly used for Rigvedic svarita, with rare use for Yajurvedic udatta +0952 DEVANAGARI STRESS SIGN ANUDATTA +0953 DEVANAGARI GRAVE ACCENT +0954 DEVANAGARI ACUTE ACCENT +@ Additional consonants +0958 DEVANAGARI LETTER QA + : 0915 093C +0959 DEVANAGARI LETTER KHHA + : 0916 093C +095A DEVANAGARI LETTER GHHA + : 0917 093C +095B DEVANAGARI LETTER ZA + : 091C 093C +095C DEVANAGARI LETTER DDDHA + : 0921 093C +095D DEVANAGARI LETTER RHA + : 0922 093C +095E DEVANAGARI LETTER FA + : 092B 093C +095F DEVANAGARI LETTER YYA + : 092F 093C +@ Generic additions +0960 DEVANAGARI LETTER VOCALIC RR +0961 DEVANAGARI LETTER VOCALIC LL +0962 DEVANAGARI VOWEL SIGN VOCALIC L +0963 DEVANAGARI VOWEL SIGN VOCALIC LL +0964 DEVANAGARI DANDA + = purna viram + * phrase separator +0965 DEVANAGARI DOUBLE DANDA + = deergh viram +@ Digits +0966 DEVANAGARI DIGIT ZERO +0967 DEVANAGARI DIGIT ONE +0968 DEVANAGARI DIGIT TWO +0969 DEVANAGARI DIGIT THREE +096A DEVANAGARI DIGIT FOUR +096B DEVANAGARI DIGIT FIVE +096C DEVANAGARI DIGIT SIX +096D DEVANAGARI DIGIT SEVEN +096E DEVANAGARI DIGIT EIGHT +096F DEVANAGARI DIGIT NINE +@ Devanagari-specific additions +0970 DEVANAGARI ABBREVIATION SIGN +@ Glottal stop +097D DEVANAGARI LETTER GLOTTAL STOP + * used for writing Limbu in Devanagari + * a glyph variant has the connecting top bar +@@ 0980 Bengali 09FF +@ Based on ISCII 1988 +@ Various signs +0981 BENGALI SIGN CANDRABINDU +0982 BENGALI SIGN ANUSVARA +0983 BENGALI SIGN VISARGA +@ Independent vowels +0985 BENGALI LETTER A +0986 BENGALI LETTER AA +0987 BENGALI LETTER I +0988 BENGALI LETTER II +0989 BENGALI LETTER U +098A BENGALI LETTER UU +098B BENGALI LETTER VOCALIC R +098C BENGALI LETTER VOCALIC L +098F BENGALI LETTER E +0990 BENGALI LETTER AI +0993 BENGALI LETTER O +0994 BENGALI LETTER AU +@ Consonants +0995 BENGALI LETTER KA +0996 BENGALI LETTER KHA +0997 BENGALI LETTER GA +0998 BENGALI LETTER GHA +0999 BENGALI LETTER NGA +099A BENGALI LETTER CA +099B BENGALI LETTER CHA +099C BENGALI LETTER JA +099D BENGALI LETTER JHA +099E BENGALI LETTER NYA +099F BENGALI LETTER TTA +09A0 BENGALI LETTER TTHA +09A1 BENGALI LETTER DDA +09A2 BENGALI LETTER DDHA +09A3 BENGALI LETTER NNA +09A4 BENGALI LETTER TA +09A5 BENGALI LETTER THA +09A6 BENGALI LETTER DA +09A7 BENGALI LETTER DHA +09A8 BENGALI LETTER NA +09AA BENGALI LETTER PA +09AB BENGALI LETTER PHA +09AC BENGALI LETTER BA + = Bengali va, wa +09AD BENGALI LETTER BHA +09AE BENGALI LETTER MA +09AF BENGALI LETTER YA +09B0 BENGALI LETTER RA +09B2 BENGALI LETTER LA +09B6 BENGALI LETTER SHA +09B7 BENGALI LETTER SSA +09B8 BENGALI LETTER SA +09B9 BENGALI LETTER HA +@ Various signs +09BC BENGALI SIGN NUKTA + * for extending the alphabet to new letters +09BD BENGALI SIGN AVAGRAHA +@ Dependent vowel signs +09BE BENGALI VOWEL SIGN AA +09BF BENGALI VOWEL SIGN I + * stands to the left of the consonant +09C0 BENGALI VOWEL SIGN II +09C1 BENGALI VOWEL SIGN U +09C2 BENGALI VOWEL SIGN UU +09C3 BENGALI VOWEL SIGN VOCALIC R +09C4 BENGALI VOWEL SIGN VOCALIC RR +09C7 BENGALI VOWEL SIGN E + * stands to the left of the consonant +09C8 BENGALI VOWEL SIGN AI + * stands to the left of the consonant +@ Two-part dependent vowel signs +@+ These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for most processing. +09CB BENGALI VOWEL SIGN O + : 09C7 09BE +09CC BENGALI VOWEL SIGN AU + : 09C7 09D7 +@ Sign +09CD BENGALI SIGN VIRAMA + = hasant (Bengali term for halant) +@ Additional consonant +09CE BENGALI LETTER KHANDA TA +@ Sign +09D7 BENGALI AU LENGTH MARK +@ Additional consonants +09DC BENGALI LETTER RRA + : 09A1 09BC +09DD BENGALI LETTER RHA + : 09A2 09BC +09DF BENGALI LETTER YYA + : 09AF 09BC +@ Generic additions +09E0 BENGALI LETTER VOCALIC RR +09E1 BENGALI LETTER VOCALIC LL +09E2 BENGALI VOWEL SIGN VOCALIC L +09E3 BENGALI VOWEL SIGN VOCALIC LL +@ Digits +09E6 BENGALI DIGIT ZERO +09E7 BENGALI DIGIT ONE +09E8 BENGALI DIGIT TWO +09E9 BENGALI DIGIT THREE +09EA BENGALI DIGIT FOUR +09EB BENGALI DIGIT FIVE +09EC BENGALI DIGIT SIX +09ED BENGALI DIGIT SEVEN +09EE BENGALI DIGIT EIGHT +09EF BENGALI DIGIT NINE +@ Bengali-specific additions +09F0 BENGALI LETTER RA WITH MIDDLE DIAGONAL (Assamese) + * Assamese +09F1 BENGALI LETTER RA WITH LOWER DIAGONAL (Assamese) + = BENGALI LETTER VA WITH LOWER DIAGONAL + * Assamese +09F2 BENGALI RUPEE MARK +09F3 BENGALI RUPEE SIGN +09F4 BENGALI CURRENCY NUMERATOR ONE + * not in current usage +09F5 BENGALI CURRENCY NUMERATOR TWO + * not in current usage +09F6 BENGALI CURRENCY NUMERATOR THREE + * not in current usage +09F7 BENGALI CURRENCY NUMERATOR FOUR +09F8 BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +09F9 BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA BENGALI ISSHAR +@@ 0A00 Gurmukhi 0A7F +@ Based on ISCII 1988 +@ Various signs +0A01 GURMUKHI SIGN ADAK BINDI +0A02 GURMUKHI SIGN BINDI +0A03 GURMUKHI SIGN VISARGA +@ Independent vowels +0A05 GURMUKHI LETTER A +0A06 GURMUKHI LETTER AA +0A07 GURMUKHI LETTER I +0A08 GURMUKHI LETTER II +0A09 GURMUKHI LETTER U +0A0A GURMUKHI LETTER UU +0A0F GURMUKHI LETTER EE +0A10 GURMUKHI LETTER AI +0A13 GURMUKHI LETTER OO +0A14 GURMUKHI LETTER AU +@ Consonants +0A15 GURMUKHI LETTER KA +0A16 GURMUKHI LETTER KHA +0A17 GURMUKHI LETTER GA +0A18 GURMUKHI LETTER GHA +0A19 GURMUKHI LETTER NGA +0A1A GURMUKHI LETTER CA +0A1B GURMUKHI LETTER CHA +0A1C GURMUKHI LETTER JA +0A1D GURMUKHI LETTER JHA +0A1E GURMUKHI LETTER NYA +0A1F GURMUKHI LETTER TTA +0A20 GURMUKHI LETTER TTHA +0A21 GURMUKHI LETTER DDA +0A22 GURMUKHI LETTER DDHA +0A23 GURMUKHI LETTER NNA +0A24 GURMUKHI LETTER TA +0A25 GURMUKHI LETTER THA +0A26 GURMUKHI LETTER DA +0A27 GURMUKHI LETTER DHA +0A28 GURMUKHI LETTER NA +0A2A GURMUKHI LETTER PA +0A2B GURMUKHI LETTER PHA +0A2C GURMUKHI LETTER BA +0A2D GURMUKHI LETTER BHA +0A2E GURMUKHI LETTER MA +0A2F GURMUKHI LETTER YA +0A30 GURMUKHI LETTER RA +0A32 GURMUKHI LETTER LA +0A33 GURMUKHI LETTER LLA + : 0A32 0A3C +0A35 GURMUKHI LETTER VA +0A36 GURMUKHI LETTER SHA + : 0A38 0A3C +0A38 GURMUKHI LETTER SA +0A39 GURMUKHI LETTER HA +@ Various signs +0A3C GURMUKHI SIGN NUKTA + * for extending the alphabet to new letters +@ Dependent vowel signs +0A3E GURMUKHI VOWEL SIGN AA +0A3F GURMUKHI VOWEL SIGN I + * stands to the left of the consonant +0A40 GURMUKHI VOWEL SIGN II +0A41 GURMUKHI VOWEL SIGN U +0A42 GURMUKHI VOWEL SIGN UU +0A47 GURMUKHI VOWEL SIGN EE +0A48 GURMUKHI VOWEL SIGN AI +0A4B GURMUKHI VOWEL SIGN OO +0A4C GURMUKHI VOWEL SIGN AU +@ Various signs +0A4D GURMUKHI SIGN VIRAMA +@ Additional consonants +0A59 GURMUKHI LETTER KHHA + : 0A16 0A3C +0A5A GURMUKHI LETTER GHHA + : 0A17 0A3C +0A5B GURMUKHI LETTER ZA + : 0A1C 0A3C +0A5C GURMUKHI LETTER RRA +0A5E GURMUKHI LETTER FA + : 0A2B 0A3C +@ Digits +0A66 GURMUKHI DIGIT ZERO +0A67 GURMUKHI DIGIT ONE +0A68 GURMUKHI DIGIT TWO +0A69 GURMUKHI DIGIT THREE +0A6A GURMUKHI DIGIT FOUR +0A6B GURMUKHI DIGIT FIVE +0A6C GURMUKHI DIGIT SIX +0A6D GURMUKHI DIGIT SEVEN +0A6E GURMUKHI DIGIT EIGHT +0A6F GURMUKHI DIGIT NINE +@ Gurmukhi-specific additions +0A70 GURMUKHI TIPPI + * nasalization +0A71 GURMUKHI ADDAK + * doubles following consonant +0A72 GURMUKHI IRI + * base for vowels +0A73 GURMUKHI URA + * base for vowels +0A74 GURMUKHI EK ONKAR + * God is One +@@ 0A80 Gujarati 0AFF +@ Based on ISCII 1988 +@ Various signs +0A81 GUJARATI SIGN CANDRABINDU +0A82 GUJARATI SIGN ANUSVARA +0A83 GUJARATI SIGN VISARGA +@ Independent vowels +0A85 GUJARATI LETTER A +0A86 GUJARATI LETTER AA +0A87 GUJARATI LETTER I +0A88 GUJARATI LETTER II +0A89 GUJARATI LETTER U +0A8A GUJARATI LETTER UU +0A8B GUJARATI LETTER VOCALIC R +0A8C GUJARATI LETTER VOCALIC L + * used with Sanskrit text +0A8D GUJARATI VOWEL CANDRA E +0A8F GUJARATI LETTER E +0A90 GUJARATI LETTER AI +0A91 GUJARATI VOWEL CANDRA O +0A93 GUJARATI LETTER O +0A94 GUJARATI LETTER AU +@ Consonants +0A95 GUJARATI LETTER KA +0A96 GUJARATI LETTER KHA +0A97 GUJARATI LETTER GA +0A98 GUJARATI LETTER GHA +0A99 GUJARATI LETTER NGA +0A9A GUJARATI LETTER CA +0A9B GUJARATI LETTER CHA +0A9C GUJARATI LETTER JA +0A9D GUJARATI LETTER JHA +0A9E GUJARATI LETTER NYA +0A9F GUJARATI LETTER TTA +0AA0 GUJARATI LETTER TTHA +0AA1 GUJARATI LETTER DDA +0AA2 GUJARATI LETTER DDHA +0AA3 GUJARATI LETTER NNA +0AA4 GUJARATI LETTER TA +0AA5 GUJARATI LETTER THA +0AA6 GUJARATI LETTER DA +0AA7 GUJARATI LETTER DHA +0AA8 GUJARATI LETTER NA +0AAA GUJARATI LETTER PA +0AAB GUJARATI LETTER PHA +0AAC GUJARATI LETTER BA +0AAD GUJARATI LETTER BHA +0AAE GUJARATI LETTER MA +0AAF GUJARATI LETTER YA +0AB0 GUJARATI LETTER RA +0AB2 GUJARATI LETTER LA +0AB3 GUJARATI LETTER LLA +0AB5 GUJARATI LETTER VA +0AB6 GUJARATI LETTER SHA +0AB7 GUJARATI LETTER SSA +0AB8 GUJARATI LETTER SA +0AB9 GUJARATI LETTER HA +@ Various signs +0ABC GUJARATI SIGN NUKTA + * for extending the alphabet to new letters +0ABD GUJARATI SIGN AVAGRAHA +@ Dependent vowel signs +0ABE GUJARATI VOWEL SIGN AA +0ABF GUJARATI VOWEL SIGN I + * stands to the left of the consonant +0AC0 GUJARATI VOWEL SIGN II +0AC1 GUJARATI VOWEL SIGN U +0AC2 GUJARATI VOWEL SIGN UU +0AC3 GUJARATI VOWEL SIGN VOCALIC R +0AC4 GUJARATI VOWEL SIGN VOCALIC RR +0AC5 GUJARATI VOWEL SIGN CANDRA E +0AC7 GUJARATI VOWEL SIGN E +0AC8 GUJARATI VOWEL SIGN AI +0AC9 GUJARATI VOWEL SIGN CANDRA O +0ACB GUJARATI VOWEL SIGN O +0ACC GUJARATI VOWEL SIGN AU +@ Various signs +0ACD GUJARATI SIGN VIRAMA +0AD0 GUJARATI OM +@ Generic addition +0AE0 GUJARATI LETTER VOCALIC RR +@ Additions for use with Sanskrit text +0AE1 GUJARATI LETTER VOCALIC LL +0AE2 GUJARATI VOWEL SIGN VOCALIC L +0AE3 GUJARATI VOWEL SIGN VOCALIC LL +@ Digits +0AE6 GUJARATI DIGIT ZERO +0AE7 GUJARATI DIGIT ONE +0AE8 GUJARATI DIGIT TWO +0AE9 GUJARATI DIGIT THREE +0AEA GUJARATI DIGIT FOUR +0AEB GUJARATI DIGIT FIVE +0AEC GUJARATI DIGIT SIX +0AED GUJARATI DIGIT SEVEN +0AEE GUJARATI DIGIT EIGHT +0AEF GUJARATI DIGIT NINE +@ Currency sign +0AF1 GUJARATI RUPEE SIGN +@@ 0B00 Oriya 0B7F +@ Based on ISCII 1988 +@ Various signs +0B01 ORIYA SIGN CANDRABINDU +0B02 ORIYA SIGN ANUSVARA +0B03 ORIYA SIGN VISARGA +@ Independent vowels +0B05 ORIYA LETTER A +0B06 ORIYA LETTER AA +0B07 ORIYA LETTER I +0B08 ORIYA LETTER II +0B09 ORIYA LETTER U +0B0A ORIYA LETTER UU +0B0B ORIYA LETTER VOCALIC R +0B0C ORIYA LETTER VOCALIC L +0B0F ORIYA LETTER E +0B10 ORIYA LETTER AI +0B13 ORIYA LETTER O +0B14 ORIYA LETTER AU +@ Consonants +0B15 ORIYA LETTER KA +0B16 ORIYA LETTER KHA +0B17 ORIYA LETTER GA +0B18 ORIYA LETTER GHA +0B19 ORIYA LETTER NGA +0B1A ORIYA LETTER CA +0B1B ORIYA LETTER CHA +0B1C ORIYA LETTER JA +0B1D ORIYA LETTER JHA +0B1E ORIYA LETTER NYA +0B1F ORIYA LETTER TTA +0B20 ORIYA LETTER TTHA +0B21 ORIYA LETTER DDA +0B22 ORIYA LETTER DDHA +0B23 ORIYA LETTER NNA +0B24 ORIYA LETTER TA +0B25 ORIYA LETTER THA +0B26 ORIYA LETTER DA +0B27 ORIYA LETTER DHA +0B28 ORIYA LETTER NA +0B2A ORIYA LETTER PA +0B2B ORIYA LETTER PHA +0B2C ORIYA LETTER BA + x (oriya letter va - 0B35) +0B2D ORIYA LETTER BHA +0B2E ORIYA LETTER MA +0B2F ORIYA LETTER YA + = ja +0B30 ORIYA LETTER RA +0B32 ORIYA LETTER LA +0B33 ORIYA LETTER LLA +0B35 ORIYA LETTER VA + x (oriya letter ba - 0B2C) +0B36 ORIYA LETTER SHA +0B37 ORIYA LETTER SSA +0B38 ORIYA LETTER SA +0B39 ORIYA LETTER HA +@ Various signs +0B3C ORIYA SIGN NUKTA + * for extending the alphabet to new letters +0B3D ORIYA SIGN AVAGRAHA +@ Dependent vowel signs +0B3E ORIYA VOWEL SIGN AA +0B3F ORIYA VOWEL SIGN I +0B40 ORIYA VOWEL SIGN II +0B41 ORIYA VOWEL SIGN U +0B42 ORIYA VOWEL SIGN UU +0B43 ORIYA VOWEL SIGN VOCALIC R +0B47 ORIYA VOWEL SIGN E + * stands to the left of the consonant +0B48 ORIYA VOWEL SIGN AI + * pieces left of and above the consonant + : 0B47 0B56 +@ Two-part dependent vowel signs +@+ These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for most processing. +0B4B ORIYA VOWEL SIGN O + : 0B47 0B3E +0B4C ORIYA VOWEL SIGN AU + : 0B47 0B57 +@ Various signs +0B4D ORIYA SIGN VIRAMA +0B56 ORIYA AI LENGTH MARK +0B57 ORIYA AU LENGTH MARK +@ Additional consonants +0B5C ORIYA LETTER RRA + = dda + : 0B21 0B3C +0B5D ORIYA LETTER RHA + = ddha + : 0B22 0B3C +0B5F ORIYA LETTER YYA + = ya +@ Generic additions +0B60 ORIYA LETTER VOCALIC RR +0B61 ORIYA LETTER VOCALIC LL +@ Digits +0B66 ORIYA DIGIT ZERO +0B67 ORIYA DIGIT ONE +0B68 ORIYA DIGIT TWO +0B69 ORIYA DIGIT THREE +0B6A ORIYA DIGIT FOUR +0B6B ORIYA DIGIT FIVE +0B6C ORIYA DIGIT SIX +0B6D ORIYA DIGIT SEVEN +0B6E ORIYA DIGIT EIGHT +0B6F ORIYA DIGIT NINE +@ Oriya-specific additions +0B70 ORIYA ISSHAR +0B71 ORIYA LETTER WA + x (oriya letter o - 0B13) + x (oriya letter va - 0B35) +@@ 0B80 Tamil 0BFF +@ Based on ISCII 1988 +@ Various signs +0B82 TAMIL SIGN ANUSVARA + * not used in Tamil +0B83 TAMIL SIGN VISARGA + = aytham +@ Independent vowels +0B85 TAMIL LETTER A +0B86 TAMIL LETTER AA +0B87 TAMIL LETTER I +0B88 TAMIL LETTER II +0B89 TAMIL LETTER U +0B8A TAMIL LETTER UU +0B8E TAMIL LETTER E +0B8F TAMIL LETTER EE +0B90 TAMIL LETTER AI +0B92 TAMIL LETTER O +0B93 TAMIL LETTER OO +0B94 TAMIL LETTER AU + : 0B92 0BD7 +@ Consonants +0B95 TAMIL LETTER KA +0B99 TAMIL LETTER NGA +0B9A TAMIL LETTER CA +0B9C TAMIL LETTER JA +0B9E TAMIL LETTER NYA +0B9F TAMIL LETTER TTA +0BA3 TAMIL LETTER NNA +0BA4 TAMIL LETTER TA +0BA8 TAMIL LETTER NA +0BA9 TAMIL LETTER NNNA +0BAA TAMIL LETTER PA +0BAE TAMIL LETTER MA +0BAF TAMIL LETTER YA +0BB0 TAMIL LETTER RA +0BB1 TAMIL LETTER RRA +0BB2 TAMIL LETTER LA +0BB3 TAMIL LETTER LLA +0BB4 TAMIL LETTER LLLA +0BB5 TAMIL LETTER VA +0BB6 TAMIL LETTER SHA +0BB7 TAMIL LETTER SSA +0BB8 TAMIL LETTER SA +0BB9 TAMIL LETTER HA +@ Dependent vowel signs +0BBE TAMIL VOWEL SIGN AA +0BBF TAMIL VOWEL SIGN I +0BC0 TAMIL VOWEL SIGN II +0BC1 TAMIL VOWEL SIGN U +0BC2 TAMIL VOWEL SIGN UU +0BC6 TAMIL VOWEL SIGN E + * stands to the left of the consonant +0BC7 TAMIL VOWEL SIGN EE + * stands to the left of the consonant +0BC8 TAMIL VOWEL SIGN AI + * stands to the left of the consonant +@ Two-part dependent vowel signs +@+ These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for most processing. +0BCA TAMIL VOWEL SIGN O + : 0BC6 0BBE +0BCB TAMIL VOWEL SIGN OO + : 0BC7 0BBE +0BCC TAMIL VOWEL SIGN AU + : 0BC6 0BD7 +@ Various signs +0BCD TAMIL SIGN VIRAMA +0BD7 TAMIL AU LENGTH MARK +@ Digits +0BE6 TAMIL DIGIT ZERO +0BE7 TAMIL DIGIT ONE +0BE8 TAMIL DIGIT TWO +0BE9 TAMIL DIGIT THREE +0BEA TAMIL DIGIT FOUR +0BEB TAMIL DIGIT FIVE +0BEC TAMIL DIGIT SIX +0BED TAMIL DIGIT SEVEN +0BEE TAMIL DIGIT EIGHT +0BEF TAMIL DIGIT NINE +@ Tamil numerics +0BF0 TAMIL NUMBER TEN +0BF1 TAMIL NUMBER ONE HUNDRED +0BF2 TAMIL NUMBER ONE THOUSAND +@ Tamil symbols +0BF3 TAMIL DAY SIGN (Naal) +0BF4 TAMIL MONTH SIGN (Maatham) +0BF5 TAMIL YEAR SIGN (Varudam) +0BF6 TAMIL DEBIT SIGN (Patru) +0BF7 TAMIL CREDIT SIGN (Varavu) +0BF8 TAMIL AS ABOVE SIGN (Merpadi) +@ Currency symbol +0BF9 TAMIL RUPEE SIGN (Rupai) +@ Tamil symbol +0BFA TAMIL NUMBER SIGN (Enn) +@@ 0C00 Telugu 0C7F +@ Based on ISCII 1988 +@ Various signs +0C01 TELUGU SIGN CANDRABINDU +0C02 TELUGU SIGN ANUSVARA + = sunna +0C03 TELUGU SIGN VISARGA +@ Independent vowels +0C05 TELUGU LETTER A +0C06 TELUGU LETTER AA +0C07 TELUGU LETTER I +0C08 TELUGU LETTER II +0C09 TELUGU LETTER U +0C0A TELUGU LETTER UU +0C0B TELUGU LETTER VOCALIC R +0C0C TELUGU LETTER VOCALIC L +0C0E TELUGU LETTER E +0C0F TELUGU LETTER EE +0C10 TELUGU LETTER AI +0C12 TELUGU LETTER O +0C13 TELUGU LETTER OO +0C14 TELUGU LETTER AU +@ Consonants +0C15 TELUGU LETTER KA +0C16 TELUGU LETTER KHA +0C17 TELUGU LETTER GA +0C18 TELUGU LETTER GHA +0C19 TELUGU LETTER NGA +0C1A TELUGU LETTER CA +0C1B TELUGU LETTER CHA +0C1C TELUGU LETTER JA +0C1D TELUGU LETTER JHA +0C1E TELUGU LETTER NYA +0C1F TELUGU LETTER TTA +0C20 TELUGU LETTER TTHA +0C21 TELUGU LETTER DDA +0C22 TELUGU LETTER DDHA +0C23 TELUGU LETTER NNA +0C24 TELUGU LETTER TA +0C25 TELUGU LETTER THA +0C26 TELUGU LETTER DA +0C27 TELUGU LETTER DHA +0C28 TELUGU LETTER NA +0C2A TELUGU LETTER PA +0C2B TELUGU LETTER PHA +0C2C TELUGU LETTER BA +0C2D TELUGU LETTER BHA +0C2E TELUGU LETTER MA +0C2F TELUGU LETTER YA +0C30 TELUGU LETTER RA +0C31 TELUGU LETTER RRA +0C32 TELUGU LETTER LA +0C33 TELUGU LETTER LLA +0C35 TELUGU LETTER VA +0C36 TELUGU LETTER SHA +0C37 TELUGU LETTER SSA +0C38 TELUGU LETTER SA +0C39 TELUGU LETTER HA +@ Dependent vowel signs +0C3E TELUGU VOWEL SIGN AA +0C3F TELUGU VOWEL SIGN I +0C40 TELUGU VOWEL SIGN II +0C41 TELUGU VOWEL SIGN U +0C42 TELUGU VOWEL SIGN UU +0C43 TELUGU VOWEL SIGN VOCALIC R +0C44 TELUGU VOWEL SIGN VOCALIC RR +0C46 TELUGU VOWEL SIGN E +0C47 TELUGU VOWEL SIGN EE +0C48 TELUGU VOWEL SIGN AI + : 0C46 0C56 +0C4A TELUGU VOWEL SIGN O +0C4B TELUGU VOWEL SIGN OO +0C4C TELUGU VOWEL SIGN AU +@ Various signs +0C4D TELUGU SIGN VIRAMA + = halant (the preferred name) +0C55 TELUGU LENGTH MARK +0C56 TELUGU AI LENGTH MARK +@ Generic additions +0C60 TELUGU LETTER VOCALIC RR +0C61 TELUGU LETTER VOCALIC LL +@ Digits +0C66 TELUGU DIGIT ZERO +0C67 TELUGU DIGIT ONE +0C68 TELUGU DIGIT TWO +0C69 TELUGU DIGIT THREE +0C6A TELUGU DIGIT FOUR +0C6B TELUGU DIGIT FIVE +0C6C TELUGU DIGIT SIX +0C6D TELUGU DIGIT SEVEN +0C6E TELUGU DIGIT EIGHT +0C6F TELUGU DIGIT NINE +@@ 0C80 Kannada 0CFF +@ Based on ISCII 1988 +@ Various signs +0C82 KANNADA SIGN ANUSVARA +0C83 KANNADA SIGN VISARGA +@ Independent vowels +0C85 KANNADA LETTER A +0C86 KANNADA LETTER AA +0C87 KANNADA LETTER I +0C88 KANNADA LETTER II +0C89 KANNADA LETTER U +0C8A KANNADA LETTER UU +0C8B KANNADA LETTER VOCALIC R +0C8C KANNADA LETTER VOCALIC L +0C8E KANNADA LETTER E +0C8F KANNADA LETTER EE +0C90 KANNADA LETTER AI +0C92 KANNADA LETTER O +0C93 KANNADA LETTER OO +0C94 KANNADA LETTER AU +@ Consonants +0C95 KANNADA LETTER KA +0C96 KANNADA LETTER KHA +0C97 KANNADA LETTER GA +0C98 KANNADA LETTER GHA +0C99 KANNADA LETTER NGA +0C9A KANNADA LETTER CA +0C9B KANNADA LETTER CHA +0C9C KANNADA LETTER JA +0C9D KANNADA LETTER JHA +0C9E KANNADA LETTER NYA +0C9F KANNADA LETTER TTA +0CA0 KANNADA LETTER TTHA +0CA1 KANNADA LETTER DDA +0CA2 KANNADA LETTER DDHA +0CA3 KANNADA LETTER NNA +0CA4 KANNADA LETTER TA +0CA5 KANNADA LETTER THA +0CA6 KANNADA LETTER DA +0CA7 KANNADA LETTER DHA +0CA8 KANNADA LETTER NA +0CAA KANNADA LETTER PA +0CAB KANNADA LETTER PHA +0CAC KANNADA LETTER BA +0CAD KANNADA LETTER BHA +0CAE KANNADA LETTER MA +0CAF KANNADA LETTER YA +0CB0 KANNADA LETTER RA +0CB1 KANNADA LETTER RRA +0CB2 KANNADA LETTER LA +0CB3 KANNADA LETTER LLA +0CB5 KANNADA LETTER VA +0CB6 KANNADA LETTER SHA +0CB7 KANNADA LETTER SSA +0CB8 KANNADA LETTER SA +0CB9 KANNADA LETTER HA +@ Various signs +0CBC KANNADA SIGN NUKTA +0CBD KANNADA SIGN AVAGRAHA +@ Dependent vowel signs +0CBE KANNADA VOWEL SIGN AA +0CBF KANNADA VOWEL SIGN I +0CC0 KANNADA VOWEL SIGN II + : 0CBF 0CD5 +0CC1 KANNADA VOWEL SIGN U +0CC2 KANNADA VOWEL SIGN UU +0CC3 KANNADA VOWEL SIGN VOCALIC R +0CC4 KANNADA VOWEL SIGN VOCALIC RR +0CC6 KANNADA VOWEL SIGN E +0CC7 KANNADA VOWEL SIGN EE + : 0CC6 0CD5 +0CC8 KANNADA VOWEL SIGN AI + : 0CC6 0CD6 +0CCA KANNADA VOWEL SIGN O + : 0CC6 0CC2 +0CCB KANNADA VOWEL SIGN OO + : 0CCA 0CD5 +0CCC KANNADA VOWEL SIGN AU +@ Various signs +0CCD KANNADA SIGN VIRAMA + * preferred name is halant +0CD5 KANNADA LENGTH MARK +0CD6 KANNADA AI LENGTH MARK +@ Additional consonants +0CDE KANNADA LETTER FA + * obsolete historic letter + * name is a mistake for LLLA +@ Generic additions +0CE0 KANNADA LETTER VOCALIC RR +0CE1 KANNADA LETTER VOCALIC LL +@ Digits +0CE6 KANNADA DIGIT ZERO +0CE7 KANNADA DIGIT ONE +0CE8 KANNADA DIGIT TWO +0CE9 KANNADA DIGIT THREE +0CEA KANNADA DIGIT FOUR +0CEB KANNADA DIGIT FIVE +0CEC KANNADA DIGIT SIX +0CED KANNADA DIGIT SEVEN +0CEE KANNADA DIGIT EIGHT +0CEF KANNADA DIGIT NINE +@@ 0D00 Malayalam 0D7F +@ Based on ISCII 1988 +@ Various signs +0D02 MALAYALAM SIGN ANUSVARA +0D03 MALAYALAM SIGN VISARGA +@ Independent vowels +0D05 MALAYALAM LETTER A +0D06 MALAYALAM LETTER AA +0D07 MALAYALAM LETTER I +0D08 MALAYALAM LETTER II +0D09 MALAYALAM LETTER U +0D0A MALAYALAM LETTER UU +0D0B MALAYALAM LETTER VOCALIC R +0D0C MALAYALAM LETTER VOCALIC L +0D0E MALAYALAM LETTER E +0D0F MALAYALAM LETTER EE +0D10 MALAYALAM LETTER AI +0D12 MALAYALAM LETTER O +0D13 MALAYALAM LETTER OO +0D14 MALAYALAM LETTER AU +@ Consonants +@+ Alternate romanizations are shown as aliases for some letters to clarify their identity. +0D15 MALAYALAM LETTER KA +0D16 MALAYALAM LETTER KHA +0D17 MALAYALAM LETTER GA +0D18 MALAYALAM LETTER GHA +0D19 MALAYALAM LETTER NGA +0D1A MALAYALAM LETTER CA + = cha +0D1B MALAYALAM LETTER CHA + = chha +0D1C MALAYALAM LETTER JA +0D1D MALAYALAM LETTER JHA +0D1E MALAYALAM LETTER NYA + = nha +0D1F MALAYALAM LETTER TTA + = ta +0D20 MALAYALAM LETTER TTHA + = tta +0D21 MALAYALAM LETTER DDA + = hard da +0D22 MALAYALAM LETTER DDHA + = hard dda +0D23 MALAYALAM LETTER NNA + = hard na +0D24 MALAYALAM LETTER TA + = tha +0D25 MALAYALAM LETTER THA + = ttha +0D26 MALAYALAM LETTER DA + = soft da +0D27 MALAYALAM LETTER DHA + = soft dda +0D28 MALAYALAM LETTER NA +0D2A MALAYALAM LETTER PA +0D2B MALAYALAM LETTER PHA +0D2C MALAYALAM LETTER BA +0D2D MALAYALAM LETTER BHA +0D2E MALAYALAM LETTER MA +0D2F MALAYALAM LETTER YA +0D30 MALAYALAM LETTER RA +0D31 MALAYALAM LETTER RRA +0D32 MALAYALAM LETTER LA +0D33 MALAYALAM LETTER LLA +0D34 MALAYALAM LETTER LLLA + = zha +0D35 MALAYALAM LETTER VA +0D36 MALAYALAM LETTER SHA + = soft sha +0D37 MALAYALAM LETTER SSA + = sha +0D38 MALAYALAM LETTER SA +0D39 MALAYALAM LETTER HA +@ Dependent vowel signs +0D3E MALAYALAM VOWEL SIGN AA +0D3F MALAYALAM VOWEL SIGN I +0D40 MALAYALAM VOWEL SIGN II +0D41 MALAYALAM VOWEL SIGN U +0D42 MALAYALAM VOWEL SIGN UU +0D43 MALAYALAM VOWEL SIGN VOCALIC R +0D46 MALAYALAM VOWEL SIGN E + * stands to the left of the consonant +0D47 MALAYALAM VOWEL SIGN EE + * stands to the left of the consonant +0D48 MALAYALAM VOWEL SIGN AI + * stands to the left of the consonant +@ Two-part dependent vowel signs +@+ These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for most processing. +0D4A MALAYALAM VOWEL SIGN O + : 0D46 0D3E +0D4B MALAYALAM VOWEL SIGN OO + : 0D47 0D3E +0D4C MALAYALAM VOWEL SIGN AU + : 0D46 0D57 +@ Various signs +0D4D MALAYALAM SIGN VIRAMA + = chandrakkala (the preferred name) + = vowel half-u +0D57 MALAYALAM AU LENGTH MARK + * only a representation of the right half of 0D4C +@ Generic additions +0D60 MALAYALAM LETTER VOCALIC RR +0D61 MALAYALAM LETTER VOCALIC LL +@ Digits +0D66 MALAYALAM DIGIT ZERO +0D67 MALAYALAM DIGIT ONE +0D68 MALAYALAM DIGIT TWO +0D69 MALAYALAM DIGIT THREE +0D6A MALAYALAM DIGIT FOUR +0D6B MALAYALAM DIGIT FIVE +0D6C MALAYALAM DIGIT SIX +0D6D MALAYALAM DIGIT SEVEN +0D6E MALAYALAM DIGIT EIGHT +0D6F MALAYALAM DIGIT NINE +@@ 0D80 Sinhala 0DFF +@ Various signs +0D82 SINHALA SIGN ANUSVARAYA + = anusvara +0D83 SINHALA SIGN VISARGAYA + = visarga +@ Independent vowels +0D85 SINHALA LETTER AYANNA + = sinhala letter a +0D86 SINHALA LETTER AAYANNA + = sinhala letter aa +0D87 SINHALA LETTER AEYANNA + = sinhala letter ae +0D88 SINHALA LETTER AEEYANNA + = sinhala letter aae +0D89 SINHALA LETTER IYANNA + = sinhala letter i +0D8A SINHALA LETTER IIYANNA + = sinhala letter ii +0D8B SINHALA LETTER UYANNA + = sinhala letter u +0D8C SINHALA LETTER UUYANNA + = sinhala letter uu +0D8D SINHALA LETTER IRUYANNA + = sinhala letter vocalic r +0D8E SINHALA LETTER IRUUYANNA + = sinhala letter vocalic rr +0D8F SINHALA LETTER ILUYANNA + = sinhala letter vocalic l +0D90 SINHALA LETTER ILUUYANNA + = sinhala letter vocalic ll +0D91 SINHALA LETTER EYANNA + = sinhala letter e +0D92 SINHALA LETTER EEYANNA + = sinhala letter ee +0D93 SINHALA LETTER AIYANNA + = sinhala letter ai +0D94 SINHALA LETTER OYANNA + = sinhala letter o +0D95 SINHALA LETTER OOYANNA + = sinhala letter oo +0D96 SINHALA LETTER AUYANNA + = sinhala letter au +@ Consonants +0D9A SINHALA LETTER ALPAPRAANA KAYANNA + = sinhala letter ka +0D9B SINHALA LETTER MAHAAPRAANA KAYANNA + = sinhala letter kha +0D9C SINHALA LETTER ALPAPRAANA GAYANNA + = sinhala letter ga +0D9D SINHALA LETTER MAHAAPRAANA GAYANNA + = sinhala letter gha +0D9E SINHALA LETTER KANTAJA NAASIKYAYA + = sinhala letter nga +0D9F SINHALA LETTER SANYAKA GAYANNA + = sinhala letter nnga +0DA0 SINHALA LETTER ALPAPRAANA CAYANNA + = sinhala letter ca +0DA1 SINHALA LETTER MAHAAPRAANA CAYANNA + = sinhala letter cha +0DA2 SINHALA LETTER ALPAPRAANA JAYANNA + = sinhala letter ja +0DA3 SINHALA LETTER MAHAAPRAANA JAYANNA + = sinhala letter jha +0DA4 SINHALA LETTER TAALUJA NAASIKYAYA + = sinhala letter nya +0DA5 SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA + = sinhala letter jnya +0DA6 SINHALA LETTER SANYAKA JAYANNA + = sinhala letter nyja +0DA7 SINHALA LETTER ALPAPRAANA TTAYANNA + = sinhala letter tta +0DA8 SINHALA LETTER MAHAAPRAANA TTAYANNA + = sinhala letter ttha +0DA9 SINHALA LETTER ALPAPRAANA DDAYANNA + = sinhala letter dda +0DAA SINHALA LETTER MAHAAPRAANA DDAYANNA + = sinhala letter ddha +0DAB SINHALA LETTER MUURDHAJA NAYANNA + = sinhala letter nna +0DAC SINHALA LETTER SANYAKA DDAYANNA + = sinhala letter nndda +0DAD SINHALA LETTER ALPAPRAANA TAYANNA + = sinhala letter ta +0DAE SINHALA LETTER MAHAAPRAANA TAYANNA + = sinhala letter tha +0DAF SINHALA LETTER ALPAPRAANA DAYANNA + = sinhala letter da +0DB0 SINHALA LETTER MAHAAPRAANA DAYANNA + = sinhala letter dha +0DB1 SINHALA LETTER DANTAJA NAYANNA + = sinhala letter na +0DB3 SINHALA LETTER SANYAKA DAYANNA + = sinhala letter nda +0DB4 SINHALA LETTER ALPAPRAANA PAYANNA + = sinhala letter pa +0DB5 SINHALA LETTER MAHAAPRAANA PAYANNA + = sinhala letter pha +0DB6 SINHALA LETTER ALPAPRAANA BAYANNA + = sinhala letter ba +0DB7 SINHALA LETTER MAHAAPRAANA BAYANNA + = sinhala letter bha +0DB8 SINHALA LETTER MAYANNA + = sinhala letter ma +0DB9 SINHALA LETTER AMBA BAYANNA + = sinhala letter mba +0DBA SINHALA LETTER YAYANNA + = sinhala letter ya +0DBB SINHALA LETTER RAYANNA + = sinhala letter ra +0DBD SINHALA LETTER DANTAJA LAYANNA + = sinhala letter la + * dental +0DC0 SINHALA LETTER VAYANNA + = sinhala letter va +0DC1 SINHALA LETTER TAALUJA SAYANNA + = sinhala letter sha +0DC2 SINHALA LETTER MUURDHAJA SAYANNA + = sinhala letter ssa + * retroflex +0DC3 SINHALA LETTER DANTAJA SAYANNA + = sinhala letter sa + * dental +0DC4 SINHALA LETTER HAYANNA + = sinhala letter ha +0DC5 SINHALA LETTER MUURDHAJA LAYANNA + = sinhala letter lla + * retroflex +0DC6 SINHALA LETTER FAYANNA + = sinhala letter fa +@ Sign +0DCA SINHALA SIGN AL-LAKUNA + = virama +@ Dependent vowel signs +0DCF SINHALA VOWEL SIGN AELA-PILLA + = sinhala vowel sign aa +0DD0 SINHALA VOWEL SIGN KETTI AEDA-PILLA + = sinhala vowel sign ae +0DD1 SINHALA VOWEL SIGN DIGA AEDA-PILLA + = sinhala vowel sign aae +0DD2 SINHALA VOWEL SIGN KETTI IS-PILLA + = sinhala vowel sign i +0DD3 SINHALA VOWEL SIGN DIGA IS-PILLA + = sinhala vowel sign ii +0DD4 SINHALA VOWEL SIGN KETTI PAA-PILLA + = sinhala vowel sign u +0DD6 SINHALA VOWEL SIGN DIGA PAA-PILLA + = sinhala vowel sign uu +0DD8 SINHALA VOWEL SIGN GAETTA-PILLA + = sinhala vowel sign vocalic r +0DD9 SINHALA VOWEL SIGN KOMBUVA + = sinhala vowel sign e +0DDA SINHALA VOWEL SIGN DIGA KOMBUVA + = sinhala vowel sign ee + : 0DD9 0DCA +0DDB SINHALA VOWEL SIGN KOMBU DEKA + = sinhala vowel sign ai +@ Two-part dependent vowel signs +@+ These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for most processing. +0DDC SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA + = sinhala vowel sign o + : 0DD9 0DCF +0DDD SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA + = sinhala vowel sign oo + : 0DDC 0DCA +0DDE SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA + = sinhala vowel sign au + : 0DD9 0DDF +@ Dependent vowel sign +0DDF SINHALA VOWEL SIGN GAYANUKITTA + = sinhala vowel sign vocalic l +@ Additional dependent vowel signs +0DF2 SINHALA VOWEL SIGN DIGA GAETTA-PILLA + = sinhala vowel sign vocalic rr +0DF3 SINHALA VOWEL SIGN DIGA GAYANUKITTA + = sinhala vowel sign vocalic ll +@ Punctuation +0DF4 SINHALA PUNCTUATION KUNDDALIYA +@@ 0E00 Thai 0E7F +@ Based on TIS 620-2533 +@ Consonants +0E01 THAI CHARACTER KO KAI +0E02 THAI CHARACTER KHO KHAI +0E03 THAI CHARACTER KHO KHUAT +0E04 THAI CHARACTER KHO KHWAI +0E05 THAI CHARACTER KHO KHON +0E06 THAI CHARACTER KHO RAKHANG +0E07 THAI CHARACTER NGO NGU +0E08 THAI CHARACTER CHO CHAN +0E09 THAI CHARACTER CHO CHING +0E0A THAI CHARACTER CHO CHANG +0E0B THAI CHARACTER SO SO +0E0C THAI CHARACTER CHO CHOE +0E0D THAI CHARACTER YO YING +0E0E THAI CHARACTER DO CHADA +0E0F THAI CHARACTER TO PATAK +0E10 THAI CHARACTER THO THAN +0E11 THAI CHARACTER THO NANGMONTHO +0E12 THAI CHARACTER THO PHUTHAO +0E13 THAI CHARACTER NO NEN +0E14 THAI CHARACTER DO DEK +0E15 THAI CHARACTER TO TAO +0E16 THAI CHARACTER THO THUNG +0E17 THAI CHARACTER THO THAHAN +0E18 THAI CHARACTER THO THONG +0E19 THAI CHARACTER NO NU +0E1A THAI CHARACTER BO BAIMAI +0E1B THAI CHARACTER PO PLA +0E1C THAI CHARACTER PHO PHUNG +0E1D THAI CHARACTER FO FA +0E1E THAI CHARACTER PHO PHAN +0E1F THAI CHARACTER FO FAN +0E20 THAI CHARACTER PHO SAMPHAO +0E21 THAI CHARACTER MO MA +0E22 THAI CHARACTER YO YAK +0E23 THAI CHARACTER RO RUA +0E24 THAI CHARACTER RU + * independent vowel letter used to write Sanskrit +0E25 THAI CHARACTER LO LING +0E26 THAI CHARACTER LU + * independent vowel letter used to write Sanskrit +0E27 THAI CHARACTER WO WAEN +0E28 THAI CHARACTER SO SALA +0E29 THAI CHARACTER SO RUSI +0E2A THAI CHARACTER SO SUA +0E2B THAI CHARACTER HO HIP +0E2C THAI CHARACTER LO CHULA +0E2D THAI CHARACTER O ANG +0E2E THAI CHARACTER HO NOKHUK + = ho nok huk +@ Sign +0E2F THAI CHARACTER PAIYANNOI (paiyan noi) + = paiyan noi + * ellipsis, abbreviation +@ Vowels +0E30 THAI CHARACTER SARA A +0E31 THAI CHARACTER MAI HAN-AKAT +0E32 THAI CHARACTER SARA AA + x (thai character lakkhangyao - 0E45) +0E33 THAI CHARACTER SARA AM + # 0E4D 0E32 +0E34 THAI CHARACTER SARA I +0E35 THAI CHARACTER SARA II +0E36 THAI CHARACTER SARA UE +0E37 THAI CHARACTER SARA UEE (sara uue) + = sara uue +0E38 THAI CHARACTER SARA U +0E39 THAI CHARACTER SARA UU +0E3A THAI CHARACTER PHINTHU + * Pali virama +@ Currency symbol +0E3F THAI CURRENCY SYMBOL BAHT +@ Vowels +0E40 THAI CHARACTER SARA E +0E41 THAI CHARACTER SARA AE +0E42 THAI CHARACTER SARA O +0E43 THAI CHARACTER SARA AI MAIMUAN (sara ai mai muan) + = sara ai mai muan +0E44 THAI CHARACTER SARA AI MAIMALAI (sara ai mai malai) + = sara ai mai malai +0E45 THAI CHARACTER LAKKHANGYAO (lakkhang yao) + = lakkhang yao + * special vowel length indication used with 0E24 or 0E26 + x (thai character sara aa - 0E32) +@ Sign +0E46 THAI CHARACTER MAIYAMOK (mai yamok) + = mai yamok + * repetition +@ Vowel +0E47 THAI CHARACTER MAITAIKHU (mai taikhu) + = mai taikhu +@ Tone marks +0E48 THAI CHARACTER MAI EK +0E49 THAI CHARACTER MAI THO +0E4A THAI CHARACTER MAI TRI +0E4B THAI CHARACTER MAI CHATTAWA +@ Signs +0E4C THAI CHARACTER THANTHAKHAT + * cancellation mark +0E4D THAI CHARACTER NIKHAHIT (nikkhahit) + = nikkhahit + * final nasal +0E4E THAI CHARACTER YAMAKKAN +0E4F THAI CHARACTER FONGMAN + * used as a bullet + x (khmer sign phnaek muan - 17D9) +@ Digits +0E50 THAI DIGIT ZERO +0E51 THAI DIGIT ONE +0E52 THAI DIGIT TWO +0E53 THAI DIGIT THREE +0E54 THAI DIGIT FOUR +0E55 THAI DIGIT FIVE +0E56 THAI DIGIT SIX +0E57 THAI DIGIT SEVEN +0E58 THAI DIGIT EIGHT +0E59 THAI DIGIT NINE +@ Signs +0E5A THAI CHARACTER ANGKHANKHU + * used to mark end of long sections + * used in combination with 0E30 to mark end of a verse +0E5B THAI CHARACTER KHOMUT + * used to mark end of chapter or document + x (khmer sign koomuut - 17DA) +@@ 0E80 Lao 0EFF +@ Based on TIS 620-2529 +@ Consonants +0E81 LAO LETTER KO +0E82 LAO LETTER KHO SUNG +0E84 LAO LETTER KHO TAM +0E87 LAO LETTER NGO +0E88 LAO LETTER CO +0E8A LAO LETTER SO TAM +0E8D LAO LETTER NYO +0E94 LAO LETTER DO +0E95 LAO LETTER TO +0E96 LAO LETTER THO SUNG +0E97 LAO LETTER THO TAM +0E99 LAO LETTER NO +0E9A LAO LETTER BO +0E9B LAO LETTER PO +0E9C LAO LETTER PHO SUNG +0E9D LAO LETTER FO TAM +0E9E LAO LETTER PHO TAM +0E9F LAO LETTER FO SUNG +0EA1 LAO LETTER MO +0EA2 LAO LETTER YO +0EA3 LAO LETTER LO LING +0EA5 LAO LETTER LO LOOT +0EA7 LAO LETTER WO +0EAA LAO LETTER SO SUNG +0EAB LAO LETTER HO SUNG +0EAD LAO LETTER O +0EAE LAO LETTER HO TAM +@ Sign +0EAF LAO ELLIPSIS +@ Vowels +0EB0 LAO VOWEL SIGN A +0EB1 LAO VOWEL SIGN MAI KAN + * vowel shortener +0EB2 LAO VOWEL SIGN AA +0EB3 LAO VOWEL SIGN AM + # 0ECD 0EB2 +0EB4 LAO VOWEL SIGN I +0EB5 LAO VOWEL SIGN II +0EB6 LAO VOWEL SIGN Y +0EB7 LAO VOWEL SIGN YY +0EB8 LAO VOWEL SIGN U +0EB9 LAO VOWEL SIGN UU +0EBB LAO VOWEL SIGN MAI KON +@ Signs +0EBC LAO SEMIVOWEL SIGN LO +0EBD LAO SEMIVOWEL SIGN NYO +@ Vowels +0EC0 LAO VOWEL SIGN E +0EC1 LAO VOWEL SIGN EI +0EC2 LAO VOWEL SIGN O +0EC3 LAO VOWEL SIGN AY +0EC4 LAO VOWEL SIGN AI +@ Sign +0EC6 LAO KO LA + * repetition +@ Tone marks +0EC8 LAO TONE MAI EK +0EC9 LAO TONE MAI THO +0ECA LAO TONE MAI TI +0ECB LAO TONE MAI CATAWA +@ Signs +0ECC LAO CANCELLATION MARK +0ECD LAO NIGGAHITA + * final nasal +@ Digits +0ED0 LAO DIGIT ZERO +0ED1 LAO DIGIT ONE +0ED2 LAO DIGIT TWO +0ED3 LAO DIGIT THREE +0ED4 LAO DIGIT FOUR +0ED5 LAO DIGIT FIVE +0ED6 LAO DIGIT SIX +0ED7 LAO DIGIT SEVEN +0ED8 LAO DIGIT EIGHT +0ED9 LAO DIGIT NINE +@ Digraphs +0EDC LAO HO NO + # 0EAB 0E99 +0EDD LAO HO MO + # 0EAB 0EA1 +@@ 0F00 Tibetan 0FFF +@ Syllable +0F00 TIBETAN SYLLABLE OM +@ Head marks +0F01 TIBETAN MARK GTER YIG MGO TRUNCATED A (ter yik go a thung) +0F02 TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA (ter yik go wum nam chey ma) +0F03 TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA (ter yik go wum ter tsek ma) +0F04 TIBETAN MARK INITIAL YIG MGO MDUN MA (yik go dun ma) + * honorific; marks beginning of text or start of new folio + x (mongolian birga - 1800) +0F05 TIBETAN MARK CLOSING YIG MGO SGAB MA (yik go kab ma) + * follows and ligates with initial yig-mgo +0F06 TIBETAN MARK CARET YIG MGO PHUR SHAD MA (yik go pur shey ma) +0F07 TIBETAN MARK YIG MGO TSHEG SHAD MA (yik go tsek shey ma) +@ Marks and signs +0F08 TIBETAN MARK SBRUL SHAD (drul shey) + * separates sections of meaning equivalent to topics and sub-topics +0F09 TIBETAN MARK BSKUR YIG MGO (kur yik go) + * list enumerator, used in Bhutan +0F0A TIBETAN MARK BKA- SHOG YIG MGO (ka sho yik go) + * petition honorific, used in Bhutan +0F0B TIBETAN MARK INTERSYLLABIC TSHEG (tsek) + * morpheme delimiter (approximate meaning) + * the normal tsheg; provides a break opportunity + * character name is a misnomer +0F0C TIBETAN MARK DELIMITER TSHEG BSTAR (tsek tar) + * a non-breaking tsheg; inhibits line breaking + * character name is a misnomer + # <noBreak> 0F0B +0F0D TIBETAN MARK SHAD (shey) + * marks end of a section of text (tshig-grub) + x (devanagari danda - 0964) +0F0E TIBETAN MARK NYIS SHAD (nyi shey) + * marks end of a whole topic (don-tshan) + x (devanagari double danda - 0965) +0F0F TIBETAN MARK TSHEG SHAD (tsek shey) +0F10 TIBETAN MARK NYIS TSHEG SHAD (nyi tsek shey) +0F11 TIBETAN MARK RIN CHEN SPUNGS SHAD (rinchen pung shey) + * shad which follows a tsheg-bar that starts a new line +0F12 TIBETAN MARK RGYA GRAM SHAD (gya tram shey) +0F13 TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN (dzu ta me long chen) +0F14 TIBETAN MARK GTER TSHEG (ter tsek) + * used as a comma-like text delimiter + x (khmer sign camnuc pii kuuh - 17D6) +@ Astrological signs +0F15 TIBETAN LOGOTYPE SIGN CHAD RTAGS (che ta) +0F16 TIBETAN LOGOTYPE SIGN LHAG RTAGS (hlak ta) +0F17 TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS (trachen char ta) +0F18 TIBETAN ASTROLOGICAL SIGN -KHYUD PA (kyu pa) + * combines with digits +0F19 TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS (dong tsu) + * combines with digits +0F1A TIBETAN SIGN RDEL DKAR GCIG (deka chig) +0F1B TIBETAN SIGN RDEL DKAR GNYIS (deka nyi) +0F1C TIBETAN SIGN RDEL DKAR GSUM (deka sum) +0F1D TIBETAN SIGN RDEL NAG GCIG (dena chig) +0F1E TIBETAN SIGN RDEL NAG GNYIS (dena nyi) +0F1F TIBETAN SIGN RDEL DKAR RDEL NAG (deka dena) +@ Digits +0F20 TIBETAN DIGIT ZERO +0F21 TIBETAN DIGIT ONE +0F22 TIBETAN DIGIT TWO +0F23 TIBETAN DIGIT THREE +0F24 TIBETAN DIGIT FOUR +0F25 TIBETAN DIGIT FIVE +0F26 TIBETAN DIGIT SIX +0F27 TIBETAN DIGIT SEVEN +0F28 TIBETAN DIGIT EIGHT +0F29 TIBETAN DIGIT NINE +@ Digits minus half +0F2A TIBETAN DIGIT HALF ONE +0F2B TIBETAN DIGIT HALF TWO +0F2C TIBETAN DIGIT HALF THREE +0F2D TIBETAN DIGIT HALF FOUR +0F2E TIBETAN DIGIT HALF FIVE +0F2F TIBETAN DIGIT HALF SIX +0F30 TIBETAN DIGIT HALF SEVEN +0F31 TIBETAN DIGIT HALF EIGHT +0F32 TIBETAN DIGIT HALF NINE +0F33 TIBETAN DIGIT HALF ZERO +@ Marks and signs +0F34 TIBETAN MARK BSDUS RTAGS (du ta) + * repetition +0F35 TIBETAN MARK NGAS BZUNG NYI ZLA (nge zung nyi da) + * honorific, emphasis; used like underlining +0F36 TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN (dzu ta shi mig chen) + * marks point of text insertion or annotation +0F37 TIBETAN MARK NGAS BZUNG SGOR RTAGS (nge zung gor ta) + * emphasis; used like underlining +0F38 TIBETAN MARK CHE MGO (che go) +0F39 TIBETAN MARK TSA -PHRU (tsa tru) + * a lenition mark +@ Paired punctuation +0F3A TIBETAN MARK GUG RTAGS GYON (gug ta yun) +0F3B TIBETAN MARK GUG RTAGS GYAS (gug ta ye) + * brackets +0F3C TIBETAN MARK ANG KHANG GYON (ang kang yun) +0F3D TIBETAN MARK ANG KHANG GYAS (ang kang ye) + * used for bracketing with a roof over +@ Astrological signs +0F3E TIBETAN SIGN YAR TSHES (yar tse) +0F3F TIBETAN SIGN MAR TSHES (mar tse) + * marks which combine with digits +@ Consonants +0F40 TIBETAN LETTER KA +0F41 TIBETAN LETTER KHA +0F42 TIBETAN LETTER GA +0F43 TIBETAN LETTER GHA + : 0F42 0FB7 +0F44 TIBETAN LETTER NGA +0F45 TIBETAN LETTER CA +0F46 TIBETAN LETTER CHA +0F47 TIBETAN LETTER JA +0F49 TIBETAN LETTER NYA +0F4A TIBETAN LETTER TTA +0F4B TIBETAN LETTER TTHA +0F4C TIBETAN LETTER DDA +0F4D TIBETAN LETTER DDHA + : 0F4C 0FB7 +0F4E TIBETAN LETTER NNA +0F4F TIBETAN LETTER TA +0F50 TIBETAN LETTER THA +0F51 TIBETAN LETTER DA +0F52 TIBETAN LETTER DHA + : 0F51 0FB7 +0F53 TIBETAN LETTER NA +0F54 TIBETAN LETTER PA +0F55 TIBETAN LETTER PHA +0F56 TIBETAN LETTER BA +0F57 TIBETAN LETTER BHA + : 0F56 0FB7 +0F58 TIBETAN LETTER MA +0F59 TIBETAN LETTER TSA +0F5A TIBETAN LETTER TSHA +0F5B TIBETAN LETTER DZA +0F5C TIBETAN LETTER DZHA + : 0F5B 0FB7 +0F5D TIBETAN LETTER WA +0F5E TIBETAN LETTER ZHA +0F5F TIBETAN LETTER ZA +0F60 TIBETAN LETTER -A +0F61 TIBETAN LETTER YA +0F62 TIBETAN LETTER RA * + * when followed by a subjoined letter = ra mgo +0F63 TIBETAN LETTER LA +0F64 TIBETAN LETTER SHA +0F65 TIBETAN LETTER SSA + = reversed sha +0F66 TIBETAN LETTER SA +0F67 TIBETAN LETTER HA +0F68 TIBETAN LETTER A + * base for dependent vowels +0F69 TIBETAN LETTER KSSA + : 0F40 0FB5 +0F6A TIBETAN LETTER FIXED-FORM RA * + * used only in transliteration and transcription +@ Dependent vowel signs +0F71 TIBETAN VOWEL SIGN AA + = a-chung + * common, vowel-lengthening mark +0F72 TIBETAN VOWEL SIGN I +0F73 TIBETAN VOWEL SIGN II + * use of this character is discouraged + : 0F71 0F72 +0F74 TIBETAN VOWEL SIGN U +0F75 TIBETAN VOWEL SIGN UU + * use of this character is discouraged + : 0F71 0F74 +0F76 TIBETAN VOWEL SIGN VOCALIC R + : 0FB2 0F80 +0F77 TIBETAN VOWEL SIGN VOCALIC RR + * use of this character is strongly discouraged + # 0FB2 0F81 +0F78 TIBETAN VOWEL SIGN VOCALIC L + : 0FB3 0F80 +0F79 TIBETAN VOWEL SIGN VOCALIC LL + * use of this character is strongly discouraged + # 0FB3 0F81 +0F7A TIBETAN VOWEL SIGN E +0F7B TIBETAN VOWEL SIGN EE +0F7C TIBETAN VOWEL SIGN O +0F7D TIBETAN VOWEL SIGN OO +@ Vocalic modification +0F7E TIBETAN SIGN RJES SU NGA RO (je su nga ro) + = anusvara +0F7F TIBETAN SIGN RNAM BCAD (nam chey) + = visarga +@ Dependent vowel signs +0F80 TIBETAN VOWEL SIGN REVERSED I +0F81 TIBETAN VOWEL SIGN REVERSED II + * use of this character is discouraged + : 0F71 0F80 +@ Marks and signs +0F82 TIBETAN SIGN NYI ZLA NAA DA (nyi da na da) +0F83 TIBETAN SIGN SNA LDAN (nan de) + x (devanagari sign candrabindu - 0901) +0F84 TIBETAN MARK HALANTA + = srog med + x (devanagari sign virama - 094D) +0F85 TIBETAN MARK PALUTA + * transliteration of Sanskrit avagraha + x (devanagari sign avagraha - 093D) +0F86 TIBETAN SIGN LCI RTAGS (ji ta) +0F87 TIBETAN SIGN YANG RTAGS (yang ta) +@ Transliteration head letters +0F88 TIBETAN SIGN LCE TSA CAN (che tsa chen) +0F89 TIBETAN SIGN MCHU CAN (chu chen) +0F8A TIBETAN SIGN GRU CAN RGYINGS (tru chen ging) + * always followed by 0F82 +0F8B TIBETAN SIGN GRU MED RGYINGS (tru me ging) +@ Subjoined consonants +0F90 TIBETAN SUBJOINED LETTER KA +0F91 TIBETAN SUBJOINED LETTER KHA +0F92 TIBETAN SUBJOINED LETTER GA +0F93 TIBETAN SUBJOINED LETTER GHA + : 0F92 0FB7 +0F94 TIBETAN SUBJOINED LETTER NGA +0F95 TIBETAN SUBJOINED LETTER CA +0F96 TIBETAN SUBJOINED LETTER CHA +0F97 TIBETAN SUBJOINED LETTER JA +0F99 TIBETAN SUBJOINED LETTER NYA +0F9A TIBETAN SUBJOINED LETTER TTA +0F9B TIBETAN SUBJOINED LETTER TTHA +0F9C TIBETAN SUBJOINED LETTER DDA +0F9D TIBETAN SUBJOINED LETTER DDHA + : 0F9C 0FB7 +0F9E TIBETAN SUBJOINED LETTER NNA +0F9F TIBETAN SUBJOINED LETTER TA +0FA0 TIBETAN SUBJOINED LETTER THA +0FA1 TIBETAN SUBJOINED LETTER DA +0FA2 TIBETAN SUBJOINED LETTER DHA + : 0FA1 0FB7 +0FA3 TIBETAN SUBJOINED LETTER NA +0FA4 TIBETAN SUBJOINED LETTER PA +0FA5 TIBETAN SUBJOINED LETTER PHA +0FA6 TIBETAN SUBJOINED LETTER BA +0FA7 TIBETAN SUBJOINED LETTER BHA + : 0FA6 0FB7 +0FA8 TIBETAN SUBJOINED LETTER MA +0FA9 TIBETAN SUBJOINED LETTER TSA +0FAA TIBETAN SUBJOINED LETTER TSHA +0FAB TIBETAN SUBJOINED LETTER DZA +0FAC TIBETAN SUBJOINED LETTER DZHA + : 0FAB 0FB7 +0FAD TIBETAN SUBJOINED LETTER WA * + = wa-zur, wa-btags +0FAE TIBETAN SUBJOINED LETTER ZHA +0FAF TIBETAN SUBJOINED LETTER ZA +0FB0 TIBETAN SUBJOINED LETTER -A + = a-chung + * rare, only used for full-sized subjoined letter + x (tibetan vowel sign aa - 0F71) +0FB1 TIBETAN SUBJOINED LETTER YA * + = ya-btags +0FB2 TIBETAN SUBJOINED LETTER RA * + = ra-btags +0FB3 TIBETAN SUBJOINED LETTER LA +0FB4 TIBETAN SUBJOINED LETTER SHA +0FB5 TIBETAN SUBJOINED LETTER SSA + = reversed subjoined sha +0FB6 TIBETAN SUBJOINED LETTER SA +0FB7 TIBETAN SUBJOINED LETTER HA +0FB8 TIBETAN SUBJOINED LETTER A +0FB9 TIBETAN SUBJOINED LETTER KSSA + : 0F90 0FB5 +@ Fixed-form subjoined consonants +@+ These characters are used only for transliteration and transcription. +0FBA TIBETAN SUBJOINED LETTER FIXED-FORM WA * +0FBB TIBETAN SUBJOINED LETTER FIXED-FORM YA * +0FBC TIBETAN SUBJOINED LETTER FIXED-FORM RA * +@ Signs +0FBE TIBETAN KU RU KHA (kuruka) + * often repeated three times; indicates a refrain +0FBF TIBETAN KU RU KHA BZHI MIG CAN (kuruka shi mik chen) + * marks point of text insertion or annotation + x (reference mark - 203B) +@ Cantillation signs +0FC0 TIBETAN CANTILLATION SIGN HEAVY BEAT + * marks a heavy drum beat +0FC1 TIBETAN CANTILLATION SIGN LIGHT BEAT + * marks a light drum beat +0FC2 TIBETAN CANTILLATION SIGN CANG TE-U (chang tyu) + * symbol of a small Tibetan hand drum +0FC3 TIBETAN CANTILLATION SIGN SBUB -CHAL (bub chey) + * symbol of a Tibetan cymbal +@ Symbols +0FC4 TIBETAN SYMBOL DRIL BU (drilbu) + * symbol of a Tibetan hand bell +0FC5 TIBETAN SYMBOL RDO RJE (dorje) +0FC6 TIBETAN SYMBOL PADMA GDAN (pema den) +0FC7 TIBETAN SYMBOL RDO RJE RGYA GRAM (dorje gya dram) +0FC8 TIBETAN SYMBOL PHUR PA (phurba) +0FC9 TIBETAN SYMBOL NOR BU (norbu) +0FCA TIBETAN SYMBOL NOR BU NYIS -KHYIL (norbu nyi khyi) + * the double body symbol + x (yin yang - 262F) +0FCB TIBETAN SYMBOL NOR BU GSUM -KHYIL (norbu sum khyi) + * the tri-kaya or triple body symbol +0FCC TIBETAN SYMBOL NOR BU BZHI -KHYIL (norbu shi khyi) + * the quadruple body symbol, a form of the swastika + x (cjk unified ideograph-534D - 534D) +@ Astrological sign +0FCF TIBETAN SIGN RDEL NAG GSUM (dena sum) +@ Marks +0FD0 TIBETAN MARK BSKA- SHOG GI MGO RGYAN (ka shog gi go gyen) + * used in Bhutan +0FD1 TIBETAN MARK MNYAM YIG GI MGO RGYAN (nyam yig gi go gyen) + * used in Bhutan +@@ 1000 Myanmar 109F +@ Consonants +1000 MYANMAR LETTER KA +1001 MYANMAR LETTER KHA +1002 MYANMAR LETTER GA +1003 MYANMAR LETTER GHA +1004 MYANMAR LETTER NGA +1005 MYANMAR LETTER CA +1006 MYANMAR LETTER CHA +1007 MYANMAR LETTER JA +1008 MYANMAR LETTER JHA +1009 MYANMAR LETTER NYA +100A MYANMAR LETTER NNYA +100B MYANMAR LETTER TTA +100C MYANMAR LETTER TTHA +100D MYANMAR LETTER DDA +100E MYANMAR LETTER DDHA +100F MYANMAR LETTER NNA +1010 MYANMAR LETTER TA +1011 MYANMAR LETTER THA +1012 MYANMAR LETTER DA +1013 MYANMAR LETTER DHA +1014 MYANMAR LETTER NA +1015 MYANMAR LETTER PA +1016 MYANMAR LETTER PHA +1017 MYANMAR LETTER BA +1018 MYANMAR LETTER BHA +1019 MYANMAR LETTER MA +101A MYANMAR LETTER YA +101B MYANMAR LETTER RA +101C MYANMAR LETTER LA +101D MYANMAR LETTER WA +101E MYANMAR LETTER SA +101F MYANMAR LETTER HA +1020 MYANMAR LETTER LLA +@ Independent vowels +1021 MYANMAR LETTER A + * also represents the glottal stop as a consonant +1023 MYANMAR LETTER I +1024 MYANMAR LETTER II +1025 MYANMAR LETTER U +1026 MYANMAR LETTER UU + : 1025 102E +1027 MYANMAR LETTER E +1029 MYANMAR LETTER O +102A MYANMAR LETTER AU +@ Dependent vowel signs +102C MYANMAR VOWEL SIGN AA +102D MYANMAR VOWEL SIGN I +102E MYANMAR VOWEL SIGN II +102F MYANMAR VOWEL SIGN U +1030 MYANMAR VOWEL SIGN UU +1031 MYANMAR VOWEL SIGN E + * stands to the left of the consonant +1032 MYANMAR VOWEL SIGN AI +@ Various signs +1036 MYANMAR SIGN ANUSVARA +1037 MYANMAR SIGN DOT BELOW + = aukmyit + * a tone mark +1038 MYANMAR SIGN VISARGA +1039 MYANMAR SIGN VIRAMA + = killer (when rendered visibly) +@ Digits +1040 MYANMAR DIGIT ZERO +1041 MYANMAR DIGIT ONE +1042 MYANMAR DIGIT TWO +1043 MYANMAR DIGIT THREE +1044 MYANMAR DIGIT FOUR +1045 MYANMAR DIGIT FIVE +1046 MYANMAR DIGIT SIX +1047 MYANMAR DIGIT SEVEN +1048 MYANMAR DIGIT EIGHT +1049 MYANMAR DIGIT NINE +@ Punctuation +104A MYANMAR SIGN LITTLE SECTION + x (devanagari danda - 0964) +104B MYANMAR SIGN SECTION + x (devanagari double danda - 0965) +@ Various signs +104C MYANMAR SYMBOL LOCATIVE +104D MYANMAR SYMBOL COMPLETED +104E MYANMAR SYMBOL AFOREMENTIONED +104F MYANMAR SYMBOL GENITIVE +@ Pali and Sanskrit extensions +1050 MYANMAR LETTER SHA +1051 MYANMAR LETTER SSA +1052 MYANMAR LETTER VOCALIC R +1053 MYANMAR LETTER VOCALIC RR +1054 MYANMAR LETTER VOCALIC L +1055 MYANMAR LETTER VOCALIC LL +1056 MYANMAR VOWEL SIGN VOCALIC R +1057 MYANMAR VOWEL SIGN VOCALIC RR +1058 MYANMAR VOWEL SIGN VOCALIC L +1059 MYANMAR VOWEL SIGN VOCALIC LL +@@ 10A0 Georgian 10FF +@ Capital letters (Khutsuri) +@+ This is the uppercase of the old ecclesiastical alphabet. The style shown in the code charts is known as Asomtavruli. See the Georgian Supplement block for lowercase Nuskhuri. +10A0 GEORGIAN CAPITAL LETTER AN (Khutsuri) +10A1 GEORGIAN CAPITAL LETTER BAN (Khutsuri) +10A2 GEORGIAN CAPITAL LETTER GAN (Khutsuri) +10A3 GEORGIAN CAPITAL LETTER DON (Khutsuri) +10A4 GEORGIAN CAPITAL LETTER EN (Khutsuri) +10A5 GEORGIAN CAPITAL LETTER VIN (Khutsuri) +10A6 GEORGIAN CAPITAL LETTER ZEN (Khutsuri) +10A7 GEORGIAN CAPITAL LETTER TAN (Khutsuri) +10A8 GEORGIAN CAPITAL LETTER IN (Khutsuri) +10A9 GEORGIAN CAPITAL LETTER KAN (Khutsuri) +10AA GEORGIAN CAPITAL LETTER LAS (Khutsuri) +10AB GEORGIAN CAPITAL LETTER MAN (Khutsuri) +10AC GEORGIAN CAPITAL LETTER NAR (Khutsuri) +10AD GEORGIAN CAPITAL LETTER ON (Khutsuri) +10AE GEORGIAN CAPITAL LETTER PAR (Khutsuri) +10AF GEORGIAN CAPITAL LETTER ZHAR (Khutsuri) +10B0 GEORGIAN CAPITAL LETTER RAE (Khutsuri) +10B1 GEORGIAN CAPITAL LETTER SAN (Khutsuri) +10B2 GEORGIAN CAPITAL LETTER TAR (Khutsuri) +10B3 GEORGIAN CAPITAL LETTER UN (Khutsuri) +10B4 GEORGIAN CAPITAL LETTER PHAR (Khutsuri) +10B5 GEORGIAN CAPITAL LETTER KHAR (Khutsuri) +10B6 GEORGIAN CAPITAL LETTER GHAN (Khutsuri) +10B7 GEORGIAN CAPITAL LETTER QAR (Khutsuri) +10B8 GEORGIAN CAPITAL LETTER SHIN (Khutsuri) +10B9 GEORGIAN CAPITAL LETTER CHIN (Khutsuri) +10BA GEORGIAN CAPITAL LETTER CAN (Khutsuri) +10BB GEORGIAN CAPITAL LETTER JIL (Khutsuri) +10BC GEORGIAN CAPITAL LETTER CIL (Khutsuri) +10BD GEORGIAN CAPITAL LETTER CHAR (Khutsuri) +10BE GEORGIAN CAPITAL LETTER XAN (Khutsuri) +10BF GEORGIAN CAPITAL LETTER JHAN (Khutsuri) +10C0 GEORGIAN CAPITAL LETTER HAE (Khutsuri) +10C1 GEORGIAN CAPITAL LETTER HE (Khutsuri) +10C2 GEORGIAN CAPITAL LETTER HIE (Khutsuri) +10C3 GEORGIAN CAPITAL LETTER WE (Khutsuri) +10C4 GEORGIAN CAPITAL LETTER HAR (Khutsuri) +10C5 GEORGIAN CAPITAL LETTER HOE (Khutsuri) +@ Mkhedruli +@+ This is the modern secular alphabet, which is caseless. +10D0 GEORGIAN LETTER AN +10D1 GEORGIAN LETTER BAN +10D2 GEORGIAN LETTER GAN +10D3 GEORGIAN LETTER DON +10D4 GEORGIAN LETTER EN +10D5 GEORGIAN LETTER VIN +10D6 GEORGIAN LETTER ZEN +10D7 GEORGIAN LETTER TAN +10D8 GEORGIAN LETTER IN +10D9 GEORGIAN LETTER KAN +10DA GEORGIAN LETTER LAS +10DB GEORGIAN LETTER MAN +10DC GEORGIAN LETTER NAR +10DD GEORGIAN LETTER ON +10DE GEORGIAN LETTER PAR +10DF GEORGIAN LETTER ZHAR +10E0 GEORGIAN LETTER RAE +10E1 GEORGIAN LETTER SAN +10E2 GEORGIAN LETTER TAR +10E3 GEORGIAN LETTER UN +10E4 GEORGIAN LETTER PHAR +10E5 GEORGIAN LETTER KHAR +10E6 GEORGIAN LETTER GHAN +10E7 GEORGIAN LETTER QAR +10E8 GEORGIAN LETTER SHIN +10E9 GEORGIAN LETTER CHIN +10EA GEORGIAN LETTER CAN +10EB GEORGIAN LETTER JIL +10EC GEORGIAN LETTER CIL +10ED GEORGIAN LETTER CHAR +10EE GEORGIAN LETTER XAN +10EF GEORGIAN LETTER JHAN +10F0 GEORGIAN LETTER HAE +@ Archaic letters +10F1 GEORGIAN LETTER HE +10F2 GEORGIAN LETTER HIE +10F3 GEORGIAN LETTER WE +10F4 GEORGIAN LETTER HAR +10F5 GEORGIAN LETTER HOE +10F6 GEORGIAN LETTER FI +@ Additional letters for Mingrelian and Svan +10F7 GEORGIAN LETTER YN +10F8 GEORGIAN LETTER ELIFI +@ Additional letters +10F9 GEORGIAN LETTER TURNED GAN +10FA GEORGIAN LETTER AIN +@ Punctuation +10FB GEORGIAN PARAGRAPH SEPARATOR +@ Modifier letter +10FC MODIFIER LETTER GEORGIAN NAR + # <super> 10DC +@@ 1100 Hangul Jamo 11FF +@+ The aliases in this block represent the Jamo short names. +@ Korean combining alphabet +@ Initial consonants +1100 HANGUL CHOSEONG KIYEOK (g) * + = G +1101 HANGUL CHOSEONG SSANGKIYEOK (gg) * + = GG +1102 HANGUL CHOSEONG NIEUN (n) * + = N +1103 HANGUL CHOSEONG TIKEUT (d) * + = D +1104 HANGUL CHOSEONG SSANGTIKEUT (dd) * + = DD +1105 HANGUL CHOSEONG RIEUL (r) * + = R +1106 HANGUL CHOSEONG MIEUM (m) * + = M +1107 HANGUL CHOSEONG PIEUP (b) * + = B +1108 HANGUL CHOSEONG SSANGPIEUP (bb) * + = BB +1109 HANGUL CHOSEONG SIOS (s) * + = S +110A HANGUL CHOSEONG SSANGSIOS (ss) * + = SS +110B HANGUL CHOSEONG IEUNG +110C HANGUL CHOSEONG CIEUC (j) * + = J +110D HANGUL CHOSEONG SSANGCIEUC (jj) * + = JJ +110E HANGUL CHOSEONG CHIEUCH (c) * + = C +110F HANGUL CHOSEONG KHIEUKH (k) * + = K +1110 HANGUL CHOSEONG THIEUTH (t) * + = T +1111 HANGUL CHOSEONG PHIEUPH (p) * + = P +1112 HANGUL CHOSEONG HIEUH (h) * + = H +1113 HANGUL CHOSEONG NIEUN-KIYEOK +1114 HANGUL CHOSEONG SSANGNIEUN +1115 HANGUL CHOSEONG NIEUN-TIKEUT +1116 HANGUL CHOSEONG NIEUN-PIEUP +1117 HANGUL CHOSEONG TIKEUT-KIYEOK +1118 HANGUL CHOSEONG RIEUL-NIEUN +1119 HANGUL CHOSEONG SSANGRIEUL +111A HANGUL CHOSEONG RIEUL-HIEUH +111B HANGUL CHOSEONG KAPYEOUNRIEUL +111C HANGUL CHOSEONG MIEUM-PIEUP +111D HANGUL CHOSEONG KAPYEOUNMIEUM +111E HANGUL CHOSEONG PIEUP-KIYEOK +111F HANGUL CHOSEONG PIEUP-NIEUN +1120 HANGUL CHOSEONG PIEUP-TIKEUT +1121 HANGUL CHOSEONG PIEUP-SIOS +1122 HANGUL CHOSEONG PIEUP-SIOS-KIYEOK +1123 HANGUL CHOSEONG PIEUP-SIOS-TIKEUT +1124 HANGUL CHOSEONG PIEUP-SIOS-PIEUP +1125 HANGUL CHOSEONG PIEUP-SSANGSIOS +1126 HANGUL CHOSEONG PIEUP-SIOS-CIEUC +1127 HANGUL CHOSEONG PIEUP-CIEUC +1128 HANGUL CHOSEONG PIEUP-CHIEUCH +1129 HANGUL CHOSEONG PIEUP-THIEUTH +112A HANGUL CHOSEONG PIEUP-PHIEUPH +112B HANGUL CHOSEONG KAPYEOUNPIEUP +112C HANGUL CHOSEONG KAPYEOUNSSANGPIEUP +112D HANGUL CHOSEONG SIOS-KIYEOK +112E HANGUL CHOSEONG SIOS-NIEUN +112F HANGUL CHOSEONG SIOS-TIKEUT +1130 HANGUL CHOSEONG SIOS-RIEUL +1131 HANGUL CHOSEONG SIOS-MIEUM +1132 HANGUL CHOSEONG SIOS-PIEUP +1133 HANGUL CHOSEONG SIOS-PIEUP-KIYEOK +1134 HANGUL CHOSEONG SIOS-SSANGSIOS +1135 HANGUL CHOSEONG SIOS-IEUNG +1136 HANGUL CHOSEONG SIOS-CIEUC +1137 HANGUL CHOSEONG SIOS-CHIEUCH +1138 HANGUL CHOSEONG SIOS-KHIEUKH +1139 HANGUL CHOSEONG SIOS-THIEUTH +113A HANGUL CHOSEONG SIOS-PHIEUPH +113B HANGUL CHOSEONG SIOS-HIEUH +113C HANGUL CHOSEONG CHITUEUMSIOS +113D HANGUL CHOSEONG CHITUEUMSSANGSIOS +113E HANGUL CHOSEONG CEONGCHIEUMSIOS +113F HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS +1140 HANGUL CHOSEONG PANSIOS +1141 HANGUL CHOSEONG IEUNG-KIYEOK +1142 HANGUL CHOSEONG IEUNG-TIKEUT +1143 HANGUL CHOSEONG IEUNG-MIEUM +1144 HANGUL CHOSEONG IEUNG-PIEUP +1145 HANGUL CHOSEONG IEUNG-SIOS +1146 HANGUL CHOSEONG IEUNG-PANSIOS +1147 HANGUL CHOSEONG SSANGIEUNG +1148 HANGUL CHOSEONG IEUNG-CIEUC +1149 HANGUL CHOSEONG IEUNG-CHIEUCH +114A HANGUL CHOSEONG IEUNG-THIEUTH +114B HANGUL CHOSEONG IEUNG-PHIEUPH +114C HANGUL CHOSEONG YESIEUNG +114D HANGUL CHOSEONG CIEUC-IEUNG +114E HANGUL CHOSEONG CHITUEUMCIEUC +114F HANGUL CHOSEONG CHITUEUMSSANGCIEUC +1150 HANGUL CHOSEONG CEONGCHIEUMCIEUC +1151 HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC +1152 HANGUL CHOSEONG CHIEUCH-KHIEUKH +1153 HANGUL CHOSEONG CHIEUCH-HIEUH +1154 HANGUL CHOSEONG CHITUEUMCHIEUCH +1155 HANGUL CHOSEONG CEONGCHIEUMCHIEUCH +1156 HANGUL CHOSEONG PHIEUPH-PIEUP +1157 HANGUL CHOSEONG KAPYEOUNPHIEUPH +1158 HANGUL CHOSEONG SSANGHIEUH +1159 HANGUL CHOSEONG YEORINHIEUH +115F HANGUL CHOSEONG FILLER +@ Medial vowels +1160 HANGUL JUNGSEONG FILLER +1161 HANGUL JUNGSEONG A + = A +1162 HANGUL JUNGSEONG AE + = AE +1163 HANGUL JUNGSEONG YA + = YA +1164 HANGUL JUNGSEONG YAE + = YAE +1165 HANGUL JUNGSEONG EO + = EO +1166 HANGUL JUNGSEONG E + = E +1167 HANGUL JUNGSEONG YEO + = YEO +1168 HANGUL JUNGSEONG YE + = YE +1169 HANGUL JUNGSEONG O + = O +116A HANGUL JUNGSEONG WA + = WA +116B HANGUL JUNGSEONG WAE + = WAE +116C HANGUL JUNGSEONG OE + = OE +116D HANGUL JUNGSEONG YO + = YO +116E HANGUL JUNGSEONG U + = U +116F HANGUL JUNGSEONG WEO + = WEO +1170 HANGUL JUNGSEONG WE + = WE +1171 HANGUL JUNGSEONG WI + = WI +1172 HANGUL JUNGSEONG YU + = YU +1173 HANGUL JUNGSEONG EU + = EU +1174 HANGUL JUNGSEONG YI + = YI +1175 HANGUL JUNGSEONG I + = I +1176 HANGUL JUNGSEONG A-O +1177 HANGUL JUNGSEONG A-U +1178 HANGUL JUNGSEONG YA-O +1179 HANGUL JUNGSEONG YA-YO +117A HANGUL JUNGSEONG EO-O +117B HANGUL JUNGSEONG EO-U +117C HANGUL JUNGSEONG EO-EU +117D HANGUL JUNGSEONG YEO-O +117E HANGUL JUNGSEONG YEO-U +117F HANGUL JUNGSEONG O-EO +1180 HANGUL JUNGSEONG O-E +1181 HANGUL JUNGSEONG O-YE +1182 HANGUL JUNGSEONG O-O +1183 HANGUL JUNGSEONG O-U +1184 HANGUL JUNGSEONG YO-YA +1185 HANGUL JUNGSEONG YO-YAE +1186 HANGUL JUNGSEONG YO-YEO +1187 HANGUL JUNGSEONG YO-O +1188 HANGUL JUNGSEONG YO-I +1189 HANGUL JUNGSEONG U-A +118A HANGUL JUNGSEONG U-AE +118B HANGUL JUNGSEONG U-EO-EU +118C HANGUL JUNGSEONG U-YE +118D HANGUL JUNGSEONG U-U +118E HANGUL JUNGSEONG YU-A +118F HANGUL JUNGSEONG YU-EO +1190 HANGUL JUNGSEONG YU-E +1191 HANGUL JUNGSEONG YU-YEO +1192 HANGUL JUNGSEONG YU-YE +1193 HANGUL JUNGSEONG YU-U +1194 HANGUL JUNGSEONG YU-I +1195 HANGUL JUNGSEONG EU-U +1196 HANGUL JUNGSEONG EU-EU +1197 HANGUL JUNGSEONG YI-U +1198 HANGUL JUNGSEONG I-A +1199 HANGUL JUNGSEONG I-YA +119A HANGUL JUNGSEONG I-O +119B HANGUL JUNGSEONG I-U +119C HANGUL JUNGSEONG I-EU +119D HANGUL JUNGSEONG I-ARAEA +119E HANGUL JUNGSEONG ARAEA +119F HANGUL JUNGSEONG ARAEA-EO +11A0 HANGUL JUNGSEONG ARAEA-U +11A1 HANGUL JUNGSEONG ARAEA-I +11A2 HANGUL JUNGSEONG SSANGARAEA +@ Final consonants +11A8 HANGUL JONGSEONG KIYEOK (g) * + = G +11A9 HANGUL JONGSEONG SSANGKIYEOK (gg) * + = GG +11AA HANGUL JONGSEONG KIYEOK-SIOS (gs) * + = GS +11AB HANGUL JONGSEONG NIEUN (n) * + = N +11AC HANGUL JONGSEONG NIEUN-CIEUC (nj) * + = NJ +11AD HANGUL JONGSEONG NIEUN-HIEUH (nh) * + = NH +11AE HANGUL JONGSEONG TIKEUT (d) * + = D +11AF HANGUL JONGSEONG RIEUL (l) * + = L +11B0 HANGUL JONGSEONG RIEUL-KIYEOK (lg) * + = LG +11B1 HANGUL JONGSEONG RIEUL-MIEUM (lm) * + = LM +11B2 HANGUL JONGSEONG RIEUL-PIEUP (lb) * + = LB +11B3 HANGUL JONGSEONG RIEUL-SIOS (ls) * + = LS +11B4 HANGUL JONGSEONG RIEUL-THIEUTH (lt) * + = LT +11B5 HANGUL JONGSEONG RIEUL-PHIEUPH (lp) * + = LP +11B6 HANGUL JONGSEONG RIEUL-HIEUH (lh) * + = LH +11B7 HANGUL JONGSEONG MIEUM (m) * + = M +11B8 HANGUL JONGSEONG PIEUP (b) * + = B +11B9 HANGUL JONGSEONG PIEUP-SIOS (bs) * + = BS +11BA HANGUL JONGSEONG SIOS (s) * + = S +11BB HANGUL JONGSEONG SSANGSIOS (ss) * + = SS +11BC HANGUL JONGSEONG IEUNG (ng) * + = NG +11BD HANGUL JONGSEONG CIEUC (j) * + = J +11BE HANGUL JONGSEONG CHIEUCH (c) * + = C +11BF HANGUL JONGSEONG KHIEUKH (k) * + = K +11C0 HANGUL JONGSEONG THIEUTH (t) * + = T +11C1 HANGUL JONGSEONG PHIEUPH (p) * + = P +11C2 HANGUL JONGSEONG HIEUH (h) * + = H +11C3 HANGUL JONGSEONG KIYEOK-RIEUL +11C4 HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK +11C5 HANGUL JONGSEONG NIEUN-KIYEOK +11C6 HANGUL JONGSEONG NIEUN-TIKEUT +11C7 HANGUL JONGSEONG NIEUN-SIOS +11C8 HANGUL JONGSEONG NIEUN-PANSIOS +11C9 HANGUL JONGSEONG NIEUN-THIEUTH +11CA HANGUL JONGSEONG TIKEUT-KIYEOK +11CB HANGUL JONGSEONG TIKEUT-RIEUL +11CC HANGUL JONGSEONG RIEUL-KIYEOK-SIOS +11CD HANGUL JONGSEONG RIEUL-NIEUN +11CE HANGUL JONGSEONG RIEUL-TIKEUT +11CF HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH +11D0 HANGUL JONGSEONG SSANGRIEUL +11D1 HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK +11D2 HANGUL JONGSEONG RIEUL-MIEUM-SIOS +11D3 HANGUL JONGSEONG RIEUL-PIEUP-SIOS +11D4 HANGUL JONGSEONG RIEUL-PIEUP-HIEUH +11D5 HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP +11D6 HANGUL JONGSEONG RIEUL-SSANGSIOS +11D7 HANGUL JONGSEONG RIEUL-PANSIOS +11D8 HANGUL JONGSEONG RIEUL-KHIEUKH +11D9 HANGUL JONGSEONG RIEUL-YEORINHIEUH +11DA HANGUL JONGSEONG MIEUM-KIYEOK +11DB HANGUL JONGSEONG MIEUM-RIEUL +11DC HANGUL JONGSEONG MIEUM-PIEUP +11DD HANGUL JONGSEONG MIEUM-SIOS +11DE HANGUL JONGSEONG MIEUM-SSANGSIOS +11DF HANGUL JONGSEONG MIEUM-PANSIOS +11E0 HANGUL JONGSEONG MIEUM-CHIEUCH +11E1 HANGUL JONGSEONG MIEUM-HIEUH +11E2 HANGUL JONGSEONG KAPYEOUNMIEUM +11E3 HANGUL JONGSEONG PIEUP-RIEUL +11E4 HANGUL JONGSEONG PIEUP-PHIEUPH +11E5 HANGUL JONGSEONG PIEUP-HIEUH +11E6 HANGUL JONGSEONG KAPYEOUNPIEUP +11E7 HANGUL JONGSEONG SIOS-KIYEOK +11E8 HANGUL JONGSEONG SIOS-TIKEUT +11E9 HANGUL JONGSEONG SIOS-RIEUL +11EA HANGUL JONGSEONG SIOS-PIEUP +11EB HANGUL JONGSEONG PANSIOS +11EC HANGUL JONGSEONG IEUNG-KIYEOK +11ED HANGUL JONGSEONG IEUNG-SSANGKIYEOK +11EE HANGUL JONGSEONG SSANGIEUNG +11EF HANGUL JONGSEONG IEUNG-KHIEUKH +11F0 HANGUL JONGSEONG YESIEUNG +11F1 HANGUL JONGSEONG YESIEUNG-SIOS +11F2 HANGUL JONGSEONG YESIEUNG-PANSIOS +11F3 HANGUL JONGSEONG PHIEUPH-PIEUP +11F4 HANGUL JONGSEONG KAPYEOUNPHIEUPH +11F5 HANGUL JONGSEONG HIEUH-NIEUN +11F6 HANGUL JONGSEONG HIEUH-RIEUL +11F7 HANGUL JONGSEONG HIEUH-MIEUM +11F8 HANGUL JONGSEONG HIEUH-PIEUP +11F9 HANGUL JONGSEONG YEORINHIEUH +@@ 1200 Ethiopic 137F +@ Syllables +1200 ETHIOPIC SYLLABLE HA +1201 ETHIOPIC SYLLABLE HU +1202 ETHIOPIC SYLLABLE HI +1203 ETHIOPIC SYLLABLE HAA +1204 ETHIOPIC SYLLABLE HEE +1205 ETHIOPIC SYLLABLE HE +1206 ETHIOPIC SYLLABLE HO +1207 ETHIOPIC SYLLABLE HOA +1208 ETHIOPIC SYLLABLE LA +1209 ETHIOPIC SYLLABLE LU +120A ETHIOPIC SYLLABLE LI +120B ETHIOPIC SYLLABLE LAA +120C ETHIOPIC SYLLABLE LEE +120D ETHIOPIC SYLLABLE LE +120E ETHIOPIC SYLLABLE LO +120F ETHIOPIC SYLLABLE LWA +1210 ETHIOPIC SYLLABLE HHA +1211 ETHIOPIC SYLLABLE HHU +1212 ETHIOPIC SYLLABLE HHI +1213 ETHIOPIC SYLLABLE HHAA +1214 ETHIOPIC SYLLABLE HHEE +1215 ETHIOPIC SYLLABLE HHE +1216 ETHIOPIC SYLLABLE HHO +1217 ETHIOPIC SYLLABLE HHWA +1218 ETHIOPIC SYLLABLE MA +1219 ETHIOPIC SYLLABLE MU +121A ETHIOPIC SYLLABLE MI +121B ETHIOPIC SYLLABLE MAA +121C ETHIOPIC SYLLABLE MEE +121D ETHIOPIC SYLLABLE ME +121E ETHIOPIC SYLLABLE MO +121F ETHIOPIC SYLLABLE MWA +1220 ETHIOPIC SYLLABLE SZA +1221 ETHIOPIC SYLLABLE SZU +1222 ETHIOPIC SYLLABLE SZI +1223 ETHIOPIC SYLLABLE SZAA +1224 ETHIOPIC SYLLABLE SZEE +1225 ETHIOPIC SYLLABLE SZE +1226 ETHIOPIC SYLLABLE SZO +1227 ETHIOPIC SYLLABLE SZWA +1228 ETHIOPIC SYLLABLE RA +1229 ETHIOPIC SYLLABLE RU +122A ETHIOPIC SYLLABLE RI +122B ETHIOPIC SYLLABLE RAA +122C ETHIOPIC SYLLABLE REE +122D ETHIOPIC SYLLABLE RE +122E ETHIOPIC SYLLABLE RO +122F ETHIOPIC SYLLABLE RWA +1230 ETHIOPIC SYLLABLE SA +1231 ETHIOPIC SYLLABLE SU +1232 ETHIOPIC SYLLABLE SI +1233 ETHIOPIC SYLLABLE SAA +1234 ETHIOPIC SYLLABLE SEE +1235 ETHIOPIC SYLLABLE SE +1236 ETHIOPIC SYLLABLE SO +1237 ETHIOPIC SYLLABLE SWA +1238 ETHIOPIC SYLLABLE SHA +1239 ETHIOPIC SYLLABLE SHU +123A ETHIOPIC SYLLABLE SHI +123B ETHIOPIC SYLLABLE SHAA +123C ETHIOPIC SYLLABLE SHEE +123D ETHIOPIC SYLLABLE SHE +123E ETHIOPIC SYLLABLE SHO +123F ETHIOPIC SYLLABLE SHWA +1240 ETHIOPIC SYLLABLE QA +1241 ETHIOPIC SYLLABLE QU +1242 ETHIOPIC SYLLABLE QI +1243 ETHIOPIC SYLLABLE QAA +1244 ETHIOPIC SYLLABLE QEE +1245 ETHIOPIC SYLLABLE QE +1246 ETHIOPIC SYLLABLE QO +1247 ETHIOPIC SYLLABLE QOA +1248 ETHIOPIC SYLLABLE QWA +124A ETHIOPIC SYLLABLE QWI +124B ETHIOPIC SYLLABLE QWAA +124C ETHIOPIC SYLLABLE QWEE +124D ETHIOPIC SYLLABLE QWE +1250 ETHIOPIC SYLLABLE QHA +1251 ETHIOPIC SYLLABLE QHU +1252 ETHIOPIC SYLLABLE QHI +1253 ETHIOPIC SYLLABLE QHAA +1254 ETHIOPIC SYLLABLE QHEE +1255 ETHIOPIC SYLLABLE QHE +1256 ETHIOPIC SYLLABLE QHO +1258 ETHIOPIC SYLLABLE QHWA +125A ETHIOPIC SYLLABLE QHWI +125B ETHIOPIC SYLLABLE QHWAA +125C ETHIOPIC SYLLABLE QHWEE +125D ETHIOPIC SYLLABLE QHWE +1260 ETHIOPIC SYLLABLE BA +1261 ETHIOPIC SYLLABLE BU +1262 ETHIOPIC SYLLABLE BI +1263 ETHIOPIC SYLLABLE BAA +1264 ETHIOPIC SYLLABLE BEE +1265 ETHIOPIC SYLLABLE BE +1266 ETHIOPIC SYLLABLE BO +1267 ETHIOPIC SYLLABLE BWA +1268 ETHIOPIC SYLLABLE VA +1269 ETHIOPIC SYLLABLE VU +126A ETHIOPIC SYLLABLE VI +126B ETHIOPIC SYLLABLE VAA +126C ETHIOPIC SYLLABLE VEE +126D ETHIOPIC SYLLABLE VE +126E ETHIOPIC SYLLABLE VO +126F ETHIOPIC SYLLABLE VWA +1270 ETHIOPIC SYLLABLE TA +1271 ETHIOPIC SYLLABLE TU +1272 ETHIOPIC SYLLABLE TI +1273 ETHIOPIC SYLLABLE TAA +1274 ETHIOPIC SYLLABLE TEE +1275 ETHIOPIC SYLLABLE TE +1276 ETHIOPIC SYLLABLE TO +1277 ETHIOPIC SYLLABLE TWA +1278 ETHIOPIC SYLLABLE CA +1279 ETHIOPIC SYLLABLE CU +127A ETHIOPIC SYLLABLE CI +127B ETHIOPIC SYLLABLE CAA +127C ETHIOPIC SYLLABLE CEE +127D ETHIOPIC SYLLABLE CE +127E ETHIOPIC SYLLABLE CO +127F ETHIOPIC SYLLABLE CWA +1280 ETHIOPIC SYLLABLE XA +1281 ETHIOPIC SYLLABLE XU +1282 ETHIOPIC SYLLABLE XI +1283 ETHIOPIC SYLLABLE XAA +1284 ETHIOPIC SYLLABLE XEE +1285 ETHIOPIC SYLLABLE XE +1286 ETHIOPIC SYLLABLE XO +1287 ETHIOPIC SYLLABLE XOA +1288 ETHIOPIC SYLLABLE XWA +128A ETHIOPIC SYLLABLE XWI +128B ETHIOPIC SYLLABLE XWAA +128C ETHIOPIC SYLLABLE XWEE +128D ETHIOPIC SYLLABLE XWE +1290 ETHIOPIC SYLLABLE NA +1291 ETHIOPIC SYLLABLE NU +1292 ETHIOPIC SYLLABLE NI +1293 ETHIOPIC SYLLABLE NAA +1294 ETHIOPIC SYLLABLE NEE +1295 ETHIOPIC SYLLABLE NE +1296 ETHIOPIC SYLLABLE NO +1297 ETHIOPIC SYLLABLE NWA +1298 ETHIOPIC SYLLABLE NYA +1299 ETHIOPIC SYLLABLE NYU +129A ETHIOPIC SYLLABLE NYI +129B ETHIOPIC SYLLABLE NYAA +129C ETHIOPIC SYLLABLE NYEE +129D ETHIOPIC SYLLABLE NYE +129E ETHIOPIC SYLLABLE NYO +129F ETHIOPIC SYLLABLE NYWA +12A0 ETHIOPIC SYLLABLE GLOTTAL A +12A1 ETHIOPIC SYLLABLE GLOTTAL U +12A2 ETHIOPIC SYLLABLE GLOTTAL I +12A3 ETHIOPIC SYLLABLE GLOTTAL AA +12A4 ETHIOPIC SYLLABLE GLOTTAL EE +12A5 ETHIOPIC SYLLABLE GLOTTAL E +12A6 ETHIOPIC SYLLABLE GLOTTAL O +12A7 ETHIOPIC SYLLABLE GLOTTAL WA +12A8 ETHIOPIC SYLLABLE KA +12A9 ETHIOPIC SYLLABLE KU +12AA ETHIOPIC SYLLABLE KI +12AB ETHIOPIC SYLLABLE KAA +12AC ETHIOPIC SYLLABLE KEE +12AD ETHIOPIC SYLLABLE KE +12AE ETHIOPIC SYLLABLE KO +12AF ETHIOPIC SYLLABLE KOA +12B0 ETHIOPIC SYLLABLE KWA +12B2 ETHIOPIC SYLLABLE KWI +12B3 ETHIOPIC SYLLABLE KWAA +12B4 ETHIOPIC SYLLABLE KWEE +12B5 ETHIOPIC SYLLABLE KWE +12B8 ETHIOPIC SYLLABLE KXA +12B9 ETHIOPIC SYLLABLE KXU +12BA ETHIOPIC SYLLABLE KXI +12BB ETHIOPIC SYLLABLE KXAA +12BC ETHIOPIC SYLLABLE KXEE +12BD ETHIOPIC SYLLABLE KXE +12BE ETHIOPIC SYLLABLE KXO +12C0 ETHIOPIC SYLLABLE KXWA +12C2 ETHIOPIC SYLLABLE KXWI +12C3 ETHIOPIC SYLLABLE KXWAA +12C4 ETHIOPIC SYLLABLE KXWEE +12C5 ETHIOPIC SYLLABLE KXWE +12C8 ETHIOPIC SYLLABLE WA +12C9 ETHIOPIC SYLLABLE WU +12CA ETHIOPIC SYLLABLE WI +12CB ETHIOPIC SYLLABLE WAA +12CC ETHIOPIC SYLLABLE WEE +12CD ETHIOPIC SYLLABLE WE +12CE ETHIOPIC SYLLABLE WO +12CF ETHIOPIC SYLLABLE WOA +12D0 ETHIOPIC SYLLABLE PHARYNGEAL A +12D1 ETHIOPIC SYLLABLE PHARYNGEAL U +12D2 ETHIOPIC SYLLABLE PHARYNGEAL I +12D3 ETHIOPIC SYLLABLE PHARYNGEAL AA +12D4 ETHIOPIC SYLLABLE PHARYNGEAL EE +12D5 ETHIOPIC SYLLABLE PHARYNGEAL E +12D6 ETHIOPIC SYLLABLE PHARYNGEAL O +12D8 ETHIOPIC SYLLABLE ZA +12D9 ETHIOPIC SYLLABLE ZU +12DA ETHIOPIC SYLLABLE ZI +12DB ETHIOPIC SYLLABLE ZAA +12DC ETHIOPIC SYLLABLE ZEE +12DD ETHIOPIC SYLLABLE ZE +12DE ETHIOPIC SYLLABLE ZO +12DF ETHIOPIC SYLLABLE ZWA +12E0 ETHIOPIC SYLLABLE ZHA +12E1 ETHIOPIC SYLLABLE ZHU +12E2 ETHIOPIC SYLLABLE ZHI +12E3 ETHIOPIC SYLLABLE ZHAA +12E4 ETHIOPIC SYLLABLE ZHEE +12E5 ETHIOPIC SYLLABLE ZHE +12E6 ETHIOPIC SYLLABLE ZHO +12E7 ETHIOPIC SYLLABLE ZHWA +12E8 ETHIOPIC SYLLABLE YA +12E9 ETHIOPIC SYLLABLE YU +12EA ETHIOPIC SYLLABLE YI +12EB ETHIOPIC SYLLABLE YAA +12EC ETHIOPIC SYLLABLE YEE +12ED ETHIOPIC SYLLABLE YE +12EE ETHIOPIC SYLLABLE YO +12EF ETHIOPIC SYLLABLE YOA +12F0 ETHIOPIC SYLLABLE DA +12F1 ETHIOPIC SYLLABLE DU +12F2 ETHIOPIC SYLLABLE DI +12F3 ETHIOPIC SYLLABLE DAA +12F4 ETHIOPIC SYLLABLE DEE +12F5 ETHIOPIC SYLLABLE DE +12F6 ETHIOPIC SYLLABLE DO +12F7 ETHIOPIC SYLLABLE DWA +12F8 ETHIOPIC SYLLABLE DDA +12F9 ETHIOPIC SYLLABLE DDU +12FA ETHIOPIC SYLLABLE DDI +12FB ETHIOPIC SYLLABLE DDAA +12FC ETHIOPIC SYLLABLE DDEE +12FD ETHIOPIC SYLLABLE DDE +12FE ETHIOPIC SYLLABLE DDO +12FF ETHIOPIC SYLLABLE DDWA +1300 ETHIOPIC SYLLABLE JA +1301 ETHIOPIC SYLLABLE JU +1302 ETHIOPIC SYLLABLE JI +1303 ETHIOPIC SYLLABLE JAA +1304 ETHIOPIC SYLLABLE JEE +1305 ETHIOPIC SYLLABLE JE +1306 ETHIOPIC SYLLABLE JO +1307 ETHIOPIC SYLLABLE JWA +1308 ETHIOPIC SYLLABLE GA +1309 ETHIOPIC SYLLABLE GU +130A ETHIOPIC SYLLABLE GI +130B ETHIOPIC SYLLABLE GAA +130C ETHIOPIC SYLLABLE GEE +130D ETHIOPIC SYLLABLE GE +130E ETHIOPIC SYLLABLE GO +130F ETHIOPIC SYLLABLE GOA +1310 ETHIOPIC SYLLABLE GWA +1312 ETHIOPIC SYLLABLE GWI +1313 ETHIOPIC SYLLABLE GWAA +1314 ETHIOPIC SYLLABLE GWEE +1315 ETHIOPIC SYLLABLE GWE +1318 ETHIOPIC SYLLABLE GGA +1319 ETHIOPIC SYLLABLE GGU +131A ETHIOPIC SYLLABLE GGI +131B ETHIOPIC SYLLABLE GGAA +131C ETHIOPIC SYLLABLE GGEE +131D ETHIOPIC SYLLABLE GGE +131E ETHIOPIC SYLLABLE GGO +131F ETHIOPIC SYLLABLE GGWAA +1320 ETHIOPIC SYLLABLE THA +1321 ETHIOPIC SYLLABLE THU +1322 ETHIOPIC SYLLABLE THI +1323 ETHIOPIC SYLLABLE THAA +1324 ETHIOPIC SYLLABLE THEE +1325 ETHIOPIC SYLLABLE THE +1326 ETHIOPIC SYLLABLE THO +1327 ETHIOPIC SYLLABLE THWA +1328 ETHIOPIC SYLLABLE CHA +1329 ETHIOPIC SYLLABLE CHU +132A ETHIOPIC SYLLABLE CHI +132B ETHIOPIC SYLLABLE CHAA +132C ETHIOPIC SYLLABLE CHEE +132D ETHIOPIC SYLLABLE CHE +132E ETHIOPIC SYLLABLE CHO +132F ETHIOPIC SYLLABLE CHWA +1330 ETHIOPIC SYLLABLE PHA +1331 ETHIOPIC SYLLABLE PHU +1332 ETHIOPIC SYLLABLE PHI +1333 ETHIOPIC SYLLABLE PHAA +1334 ETHIOPIC SYLLABLE PHEE +1335 ETHIOPIC SYLLABLE PHE +1336 ETHIOPIC SYLLABLE PHO +1337 ETHIOPIC SYLLABLE PHWA +1338 ETHIOPIC SYLLABLE TSA +1339 ETHIOPIC SYLLABLE TSU +133A ETHIOPIC SYLLABLE TSI +133B ETHIOPIC SYLLABLE TSAA +133C ETHIOPIC SYLLABLE TSEE +133D ETHIOPIC SYLLABLE TSE +133E ETHIOPIC SYLLABLE TSO +133F ETHIOPIC SYLLABLE TSWA +1340 ETHIOPIC SYLLABLE TZA +1341 ETHIOPIC SYLLABLE TZU +1342 ETHIOPIC SYLLABLE TZI +1343 ETHIOPIC SYLLABLE TZAA +1344 ETHIOPIC SYLLABLE TZEE +1345 ETHIOPIC SYLLABLE TZE +1346 ETHIOPIC SYLLABLE TZO +1347 ETHIOPIC SYLLABLE TZOA +1348 ETHIOPIC SYLLABLE FA +1349 ETHIOPIC SYLLABLE FU +134A ETHIOPIC SYLLABLE FI +134B ETHIOPIC SYLLABLE FAA +134C ETHIOPIC SYLLABLE FEE +134D ETHIOPIC SYLLABLE FE +134E ETHIOPIC SYLLABLE FO +134F ETHIOPIC SYLLABLE FWA +1350 ETHIOPIC SYLLABLE PA +1351 ETHIOPIC SYLLABLE PU +1352 ETHIOPIC SYLLABLE PI +1353 ETHIOPIC SYLLABLE PAA +1354 ETHIOPIC SYLLABLE PEE +1355 ETHIOPIC SYLLABLE PE +1356 ETHIOPIC SYLLABLE PO +1357 ETHIOPIC SYLLABLE PWA +1358 ETHIOPIC SYLLABLE RYA +1359 ETHIOPIC SYLLABLE MYA +135A ETHIOPIC SYLLABLE FYA +@ Combining mark +135F ETHIOPIC COMBINING GEMINATION MARK +@ Punctuation +1360 ETHIOPIC SECTION MARK +1361 ETHIOPIC WORDSPACE +1362 ETHIOPIC FULL STOP +1363 ETHIOPIC COMMA +1364 ETHIOPIC SEMICOLON +1365 ETHIOPIC COLON +1366 ETHIOPIC PREFACE COLON +1367 ETHIOPIC QUESTION MARK +1368 ETHIOPIC PARAGRAPH SEPARATOR +@ Digits +1369 ETHIOPIC DIGIT ONE +136A ETHIOPIC DIGIT TWO +136B ETHIOPIC DIGIT THREE +136C ETHIOPIC DIGIT FOUR +136D ETHIOPIC DIGIT FIVE +136E ETHIOPIC DIGIT SIX +136F ETHIOPIC DIGIT SEVEN +1370 ETHIOPIC DIGIT EIGHT +1371 ETHIOPIC DIGIT NINE +@ Numbers +1372 ETHIOPIC NUMBER TEN +1373 ETHIOPIC NUMBER TWENTY +1374 ETHIOPIC NUMBER THIRTY +1375 ETHIOPIC NUMBER FORTY +1376 ETHIOPIC NUMBER FIFTY +1377 ETHIOPIC NUMBER SIXTY +1378 ETHIOPIC NUMBER SEVENTY +1379 ETHIOPIC NUMBER EIGHTY +137A ETHIOPIC NUMBER NINETY +137B ETHIOPIC NUMBER HUNDRED +137C ETHIOPIC NUMBER TEN THOUSAND +@@ 1380 Ethiopic Supplement 139F +@ Syllables for Sebatbeit +1380 ETHIOPIC SYLLABLE SEBATBEIT MWA +1381 ETHIOPIC SYLLABLE MWI +1382 ETHIOPIC SYLLABLE MWEE +1383 ETHIOPIC SYLLABLE MWE +1384 ETHIOPIC SYLLABLE SEBATBEIT BWA +1385 ETHIOPIC SYLLABLE BWI +1386 ETHIOPIC SYLLABLE BWEE +1387 ETHIOPIC SYLLABLE BWE +1388 ETHIOPIC SYLLABLE SEBATBEIT FWA +1389 ETHIOPIC SYLLABLE FWI +138A ETHIOPIC SYLLABLE FWEE +138B ETHIOPIC SYLLABLE FWE +138C ETHIOPIC SYLLABLE SEBATBEIT PWA +138D ETHIOPIC SYLLABLE PWI +138E ETHIOPIC SYLLABLE PWEE +138F ETHIOPIC SYLLABLE PWE +@ Tonal Marks +@+ Intended for use with a multiline scored layout +1390 ETHIOPIC TONAL MARK YIZET +1391 ETHIOPIC TONAL MARK DERET +1392 ETHIOPIC TONAL MARK RIKRIK +1393 ETHIOPIC TONAL MARK SHORT RIKRIK +1394 ETHIOPIC TONAL MARK DIFAT +1395 ETHIOPIC TONAL MARK KENAT +1396 ETHIOPIC TONAL MARK CHIRET +1397 ETHIOPIC TONAL MARK HIDET +1398 ETHIOPIC TONAL MARK DERET-HIDET +1399 ETHIOPIC TONAL MARK KURT +@@ 13A0 Cherokee 13FF +@ Syllables +13A0 CHEROKEE LETTER A +13A1 CHEROKEE LETTER E +13A2 CHEROKEE LETTER I +13A3 CHEROKEE LETTER O +13A4 CHEROKEE LETTER U +13A5 CHEROKEE LETTER V +13A6 CHEROKEE LETTER GA +13A7 CHEROKEE LETTER KA +13A8 CHEROKEE LETTER GE +13A9 CHEROKEE LETTER GI +13AA CHEROKEE LETTER GO +13AB CHEROKEE LETTER GU +13AC CHEROKEE LETTER GV +13AD CHEROKEE LETTER HA +13AE CHEROKEE LETTER HE +13AF CHEROKEE LETTER HI +13B0 CHEROKEE LETTER HO +13B1 CHEROKEE LETTER HU +13B2 CHEROKEE LETTER HV +13B3 CHEROKEE LETTER LA +13B4 CHEROKEE LETTER LE +13B5 CHEROKEE LETTER LI +13B6 CHEROKEE LETTER LO +13B7 CHEROKEE LETTER LU +13B8 CHEROKEE LETTER LV +13B9 CHEROKEE LETTER MA +13BA CHEROKEE LETTER ME +13BB CHEROKEE LETTER MI +13BC CHEROKEE LETTER MO +13BD CHEROKEE LETTER MU +13BE CHEROKEE LETTER NA +13BF CHEROKEE LETTER HNA +13C0 CHEROKEE LETTER NAH +13C1 CHEROKEE LETTER NE +13C2 CHEROKEE LETTER NI +13C3 CHEROKEE LETTER NO +13C4 CHEROKEE LETTER NU +13C5 CHEROKEE LETTER NV +13C6 CHEROKEE LETTER QUA +13C7 CHEROKEE LETTER QUE +13C8 CHEROKEE LETTER QUI +13C9 CHEROKEE LETTER QUO +13CA CHEROKEE LETTER QUU +13CB CHEROKEE LETTER QUV +13CC CHEROKEE LETTER SA +13CD CHEROKEE LETTER S +13CE CHEROKEE LETTER SE +13CF CHEROKEE LETTER SI +13D0 CHEROKEE LETTER SO +13D1 CHEROKEE LETTER SU +13D2 CHEROKEE LETTER SV +13D3 CHEROKEE LETTER DA +13D4 CHEROKEE LETTER TA +13D5 CHEROKEE LETTER DE +13D6 CHEROKEE LETTER TE +13D7 CHEROKEE LETTER DI +13D8 CHEROKEE LETTER TI +13D9 CHEROKEE LETTER DO +13DA CHEROKEE LETTER DU +13DB CHEROKEE LETTER DV +13DC CHEROKEE LETTER DLA +13DD CHEROKEE LETTER TLA +13DE CHEROKEE LETTER TLE +13DF CHEROKEE LETTER TLI +13E0 CHEROKEE LETTER TLO +13E1 CHEROKEE LETTER TLU +13E2 CHEROKEE LETTER TLV +13E3 CHEROKEE LETTER TSA +13E4 CHEROKEE LETTER TSE +13E5 CHEROKEE LETTER TSI +13E6 CHEROKEE LETTER TSO +13E7 CHEROKEE LETTER TSU +13E8 CHEROKEE LETTER TSV +13E9 CHEROKEE LETTER WA +13EA CHEROKEE LETTER WE +13EB CHEROKEE LETTER WI +13EC CHEROKEE LETTER WO +13ED CHEROKEE LETTER WU +13EE CHEROKEE LETTER WV +13EF CHEROKEE LETTER YA +13F0 CHEROKEE LETTER YE +13F1 CHEROKEE LETTER YI +13F2 CHEROKEE LETTER YO +13F3 CHEROKEE LETTER YU +13F4 CHEROKEE LETTER YV +@@ 1400 Unified Canadian Aboriginal Syllabics 167F +@ Syllables +1401 CANADIAN SYLLABICS E + * Inuktitut (AI), Carrier (U) +1402 CANADIAN SYLLABICS AAI + * Inuktitut +1403 CANADIAN SYLLABICS I + * Carrier (O) +1404 CANADIAN SYLLABICS II +1405 CANADIAN SYLLABICS O + * Inuktitut (U), Carrier (E) +1406 CANADIAN SYLLABICS OO + * Inuktitut (UU) +1407 CANADIAN SYLLABICS Y-CREE OO +1408 CANADIAN SYLLABICS CARRIER EE +1409 CANADIAN SYLLABICS CARRIER I +140A CANADIAN SYLLABICS A +140B CANADIAN SYLLABICS AA +140C CANADIAN SYLLABICS WE +140D CANADIAN SYLLABICS WEST-CREE WE +140E CANADIAN SYLLABICS WI +140F CANADIAN SYLLABICS WEST-CREE WI +1410 CANADIAN SYLLABICS WII +1411 CANADIAN SYLLABICS WEST-CREE WII +1412 CANADIAN SYLLABICS WO +1413 CANADIAN SYLLABICS WEST-CREE WO +1414 CANADIAN SYLLABICS WOO +1415 CANADIAN SYLLABICS WEST-CREE WOO +1416 CANADIAN SYLLABICS NASKAPI WOO +1417 CANADIAN SYLLABICS WA +1418 CANADIAN SYLLABICS WEST-CREE WA +1419 CANADIAN SYLLABICS WAA +141A CANADIAN SYLLABICS WEST-CREE WAA +141B CANADIAN SYLLABICS NASKAPI WAA +141C CANADIAN SYLLABICS AI + * East Cree +141D CANADIAN SYLLABICS Y-CREE W +141E CANADIAN SYLLABICS GLOTTAL STOP + * Moose Cree (Y), Algonquian (GLOTTAL STOP) +141F CANADIAN SYLLABICS FINAL ACUTE + * West Cree (T), East Cree (Y), Inuktitut (GLOTTAL STOP) + * Athapascan (B/P), Sayisi (I), Carrier (G) +1420 CANADIAN SYLLABICS FINAL GRAVE + * West Cree (K), Athapascan (K), Carrier (KH) +1421 CANADIAN SYLLABICS FINAL BOTTOM HALF RING + * N Cree (SH), Sayisi (R), Carrier (NG) +1422 CANADIAN SYLLABICS FINAL TOP HALF RING + * Algonquian (S), Chipewyan (R), Sayisi (S) +1423 CANADIAN SYLLABICS FINAL RIGHT HALF RING + * West Cree (N), Athapascan (D/T), Sayisi (N), Carrier (N) +1424 CANADIAN SYLLABICS FINAL RING + * West Cree (W), Sayisi (O) +1425 CANADIAN SYLLABICS FINAL DOUBLE ACUTE + * Chipewyan (TT), South Slavey (GH) +1426 CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES + * Algonquian (H), Carrier (R) +1427 CANADIAN SYLLABICS FINAL MIDDLE DOT + * Moose Cree (W), Athapascan (Y), Sayisi (YU) +1428 CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE + * West Cree (C), Sayisi (D) +1429 CANADIAN SYLLABICS FINAL PLUS + * Athapascan (N), Sayisi (AI) +142A CANADIAN SYLLABICS FINAL DOWN TACK + * N Cree (L), Carrier (D) + x (down tack - 22A4) +142B CANADIAN SYLLABICS EN +142C CANADIAN SYLLABICS IN +142D CANADIAN SYLLABICS ON +142E CANADIAN SYLLABICS AN +142F CANADIAN SYLLABICS PE + * Inuktitut (PAI), Athapascan (BE), Carrier (HU) +1430 CANADIAN SYLLABICS PAAI + * Inuktitut +1431 CANADIAN SYLLABICS PI +1432 CANADIAN SYLLABICS PII +1433 CANADIAN SYLLABICS PO + * Inuktitut (PU), Athapascan (BO), Carrier (HE) +1434 CANADIAN SYLLABICS POO + * Inuktitut (PUU) +1435 CANADIAN SYLLABICS Y-CREE POO +1436 CANADIAN SYLLABICS CARRIER HEE +1437 CANADIAN SYLLABICS CARRIER HI +1438 CANADIAN SYLLABICS PA + * Athapascan (BA), Carrier (HA) +1439 CANADIAN SYLLABICS PAA +143A CANADIAN SYLLABICS PWE +143B CANADIAN SYLLABICS WEST-CREE PWE +143C CANADIAN SYLLABICS PWI +143D CANADIAN SYLLABICS WEST-CREE PWI +143E CANADIAN SYLLABICS PWII +143F CANADIAN SYLLABICS WEST-CREE PWII +1440 CANADIAN SYLLABICS PWO +1441 CANADIAN SYLLABICS WEST-CREE PWO +1442 CANADIAN SYLLABICS PWOO +1443 CANADIAN SYLLABICS WEST-CREE PWOO +1444 CANADIAN SYLLABICS PWA +1445 CANADIAN SYLLABICS WEST-CREE PWA +1446 CANADIAN SYLLABICS PWAA +1447 CANADIAN SYLLABICS WEST-CREE PWAA +1448 CANADIAN SYLLABICS Y-CREE PWAA +1449 CANADIAN SYLLABICS P +144A CANADIAN SYLLABICS WEST-CREE P + * Sayisi (G) +144B CANADIAN SYLLABICS CARRIER H +144C CANADIAN SYLLABICS TE + * Inuktitut (TAI), Athapascan (DI), Carrier (DU) +144D CANADIAN SYLLABICS TAAI + * Inuktitut +144E CANADIAN SYLLABICS TI + * Athapascan (DE), Carrier (DO) +144F CANADIAN SYLLABICS TII +1450 CANADIAN SYLLABICS TO + * Inuktitut (TU), Athapascan (DO), Carrier (DE), Sayisi (DU) +1451 CANADIAN SYLLABICS TOO + * Inuktitut (TUU) +1452 CANADIAN SYLLABICS Y-CREE TOO +1453 CANADIAN SYLLABICS CARRIER DEE +1454 CANADIAN SYLLABICS CARRIER DI +1455 CANADIAN SYLLABICS TA + * Athapascan (DA) +1456 CANADIAN SYLLABICS TAA +1457 CANADIAN SYLLABICS TWE +1458 CANADIAN SYLLABICS WEST-CREE TWE +1459 CANADIAN SYLLABICS TWI +145A CANADIAN SYLLABICS WEST-CREE TWI +145B CANADIAN SYLLABICS TWII +145C CANADIAN SYLLABICS WEST-CREE TWII +145D CANADIAN SYLLABICS TWO +145E CANADIAN SYLLABICS WEST-CREE TWO +145F CANADIAN SYLLABICS TWOO +1460 CANADIAN SYLLABICS WEST-CREE TWOO +1461 CANADIAN SYLLABICS TWA +1462 CANADIAN SYLLABICS WEST-CREE TWA +1463 CANADIAN SYLLABICS TWAA +1464 CANADIAN SYLLABICS WEST-CREE TWAA +1465 CANADIAN SYLLABICS NASKAPI TWAA +1466 CANADIAN SYLLABICS T +1467 CANADIAN SYLLABICS TTE + * South Slavey (DEH) +1468 CANADIAN SYLLABICS TTI + * South Slavey (DIH) +1469 CANADIAN SYLLABICS TTO + * South Slavey (DOH) +146A CANADIAN SYLLABICS TTA + * South Slavey (DAH) +146B CANADIAN SYLLABICS KE + * Inuktitut (KAI) +146C CANADIAN SYLLABICS KAAI + * Inuktitut +146D CANADIAN SYLLABICS KI +146E CANADIAN SYLLABICS KII +146F CANADIAN SYLLABICS KO + * Inuktitut (KU), Sayisi (KU) +1470 CANADIAN SYLLABICS KOO + * Inuktitut (KUU) +1471 CANADIAN SYLLABICS Y-CREE KOO +1472 CANADIAN SYLLABICS KA +1473 CANADIAN SYLLABICS KAA +1474 CANADIAN SYLLABICS KWE +1475 CANADIAN SYLLABICS WEST-CREE KWE +1476 CANADIAN SYLLABICS KWI +1477 CANADIAN SYLLABICS WEST-CREE KWI +1478 CANADIAN SYLLABICS KWII +1479 CANADIAN SYLLABICS WEST-CREE KWII +147A CANADIAN SYLLABICS KWO +147B CANADIAN SYLLABICS WEST-CREE KWO +147C CANADIAN SYLLABICS KWOO +147D CANADIAN SYLLABICS WEST-CREE KWOO +147E CANADIAN SYLLABICS KWA +147F CANADIAN SYLLABICS WEST-CREE KWA +1480 CANADIAN SYLLABICS KWAA +1481 CANADIAN SYLLABICS WEST-CREE KWAA +1482 CANADIAN SYLLABICS NASKAPI KWAA +1483 CANADIAN SYLLABICS K +1484 CANADIAN SYLLABICS KW + * East Cree +1485 CANADIAN SYLLABICS SOUTH-SLAVEY KEH +1486 CANADIAN SYLLABICS SOUTH-SLAVEY KIH +1487 CANADIAN SYLLABICS SOUTH-SLAVEY KOH +1488 CANADIAN SYLLABICS SOUTH-SLAVEY KAH +1489 CANADIAN SYLLABICS CE + * Inuktitut (GAI), Athapascan (DHE), Sayisi (THE) +148A CANADIAN SYLLABICS CAAI + * Inuktitut (GAAI) +148B CANADIAN SYLLABICS CI + * Inuktitut (GI), Athapascan (DHI), Sayisi (THI) +148C CANADIAN SYLLABICS CII + * Inuktitut (GII) +148D CANADIAN SYLLABICS CO + * Inuktitut (GU), Athapascan (DHO), Sayisi (THO) +148E CANADIAN SYLLABICS COO + * Inuktitut (GUU) +148F CANADIAN SYLLABICS Y-CREE COO +1490 CANADIAN SYLLABICS CA + * Inuktitut (GA), Athapascan (DHA), Sayisi (THA) +1491 CANADIAN SYLLABICS CAA + * Inuktitut (GAA) +1492 CANADIAN SYLLABICS CWE +1493 CANADIAN SYLLABICS WEST-CREE CWE +1494 CANADIAN SYLLABICS CWI +1495 CANADIAN SYLLABICS WEST-CREE CWI +1496 CANADIAN SYLLABICS CWII +1497 CANADIAN SYLLABICS WEST-CREE CWII +1498 CANADIAN SYLLABICS CWO +1499 CANADIAN SYLLABICS WEST-CREE CWO +149A CANADIAN SYLLABICS CWOO +149B CANADIAN SYLLABICS WEST-CREE CWOO +149C CANADIAN SYLLABICS CWA +149D CANADIAN SYLLABICS WEST-CREE CWA +149E CANADIAN SYLLABICS CWAA +149F CANADIAN SYLLABICS WEST-CREE CWAA +14A0 CANADIAN SYLLABICS NASKAPI CWAA +14A1 CANADIAN SYLLABICS C + * Inuktitut (G), Sayisi (T) +14A2 CANADIAN SYLLABICS SAYISI TH + * Athapascan (DH) +14A3 CANADIAN SYLLABICS ME + * Inuktitut (MAI) +14A4 CANADIAN SYLLABICS MAAI + * Inuktitut +14A5 CANADIAN SYLLABICS MI +14A6 CANADIAN SYLLABICS MII +14A7 CANADIAN SYLLABICS MO + * Inuktitut (MU), Sayisi (MU) +14A8 CANADIAN SYLLABICS MOO + * Inuktitut (MUU) +14A9 CANADIAN SYLLABICS Y-CREE MOO +14AA CANADIAN SYLLABICS MA +14AB CANADIAN SYLLABICS MAA +14AC CANADIAN SYLLABICS MWE +14AD CANADIAN SYLLABICS WEST-CREE MWE +14AE CANADIAN SYLLABICS MWI +14AF CANADIAN SYLLABICS WEST-CREE MWI +14B0 CANADIAN SYLLABICS MWII +14B1 CANADIAN SYLLABICS WEST-CREE MWII +14B2 CANADIAN SYLLABICS MWO +14B3 CANADIAN SYLLABICS WEST-CREE MWO +14B4 CANADIAN SYLLABICS MWOO +14B5 CANADIAN SYLLABICS WEST-CREE MWOO +14B6 CANADIAN SYLLABICS MWA +14B7 CANADIAN SYLLABICS WEST-CREE MWA +14B8 CANADIAN SYLLABICS MWAA +14B9 CANADIAN SYLLABICS WEST-CREE MWAA +14BA CANADIAN SYLLABICS NASKAPI MWAA +14BB CANADIAN SYLLABICS M +14BC CANADIAN SYLLABICS WEST-CREE M + * Carrier (M) +14BD CANADIAN SYLLABICS MH +14BE CANADIAN SYLLABICS ATHAPASCAN M +14BF CANADIAN SYLLABICS SAYISI M +14C0 CANADIAN SYLLABICS NE + * Inuktitut (NAI) +14C1 CANADIAN SYLLABICS NAAI + * Inuktitut +14C2 CANADIAN SYLLABICS NI +14C3 CANADIAN SYLLABICS NII +14C4 CANADIAN SYLLABICS NO + * Inuktitut (NU), Sayisi (NU) +14C5 CANADIAN SYLLABICS NOO + * Inuktitut (NUU) +14C6 CANADIAN SYLLABICS Y-CREE NOO +14C7 CANADIAN SYLLABICS NA +14C8 CANADIAN SYLLABICS NAA +14C9 CANADIAN SYLLABICS NWE +14CA CANADIAN SYLLABICS WEST-CREE NWE +14CB CANADIAN SYLLABICS NWA +14CC CANADIAN SYLLABICS WEST-CREE NWA +14CD CANADIAN SYLLABICS NWAA +14CE CANADIAN SYLLABICS WEST-CREE NWAA +14CF CANADIAN SYLLABICS NASKAPI NWAA +14D0 CANADIAN SYLLABICS N +14D1 CANADIAN SYLLABICS CARRIER NG +14D2 CANADIAN SYLLABICS NH +14D3 CANADIAN SYLLABICS LE + * Inuktitut (LAI) +14D4 CANADIAN SYLLABICS LAAI + * Inuktitut +14D5 CANADIAN SYLLABICS LI +14D6 CANADIAN SYLLABICS LII +14D7 CANADIAN SYLLABICS LO + * Inuktitut (LU) +14D8 CANADIAN SYLLABICS LOO + * Inuktitut (LUU) +14D9 CANADIAN SYLLABICS Y-CREE LOO +14DA CANADIAN SYLLABICS LA +14DB CANADIAN SYLLABICS LAA +14DC CANADIAN SYLLABICS LWE +14DD CANADIAN SYLLABICS WEST-CREE LWE +14DE CANADIAN SYLLABICS LWI +14DF CANADIAN SYLLABICS WEST-CREE LWI +14E0 CANADIAN SYLLABICS LWII +14E1 CANADIAN SYLLABICS WEST-CREE LWII +14E2 CANADIAN SYLLABICS LWO +14E3 CANADIAN SYLLABICS WEST-CREE LWO +14E4 CANADIAN SYLLABICS LWOO +14E5 CANADIAN SYLLABICS WEST-CREE LWOO +14E6 CANADIAN SYLLABICS LWA +14E7 CANADIAN SYLLABICS WEST-CREE LWA +14E8 CANADIAN SYLLABICS LWAA +14E9 CANADIAN SYLLABICS WEST-CREE LWAA +14EA CANADIAN SYLLABICS L +14EB CANADIAN SYLLABICS WEST-CREE L +14EC CANADIAN SYLLABICS MEDIAL L +14ED CANADIAN SYLLABICS SE + * Inuktitut (SAI) +14EE CANADIAN SYLLABICS SAAI + * Inuktitut +14EF CANADIAN SYLLABICS SI +14F0 CANADIAN SYLLABICS SII +14F1 CANADIAN SYLLABICS SO + * Inuktitut (SU), Sayisi (SU) +14F2 CANADIAN SYLLABICS SOO + * Inuktitut (SUU) +14F3 CANADIAN SYLLABICS Y-CREE SOO +14F4 CANADIAN SYLLABICS SA +14F5 CANADIAN SYLLABICS SAA +14F6 CANADIAN SYLLABICS SWE +14F7 CANADIAN SYLLABICS WEST-CREE SWE +14F8 CANADIAN SYLLABICS SWI +14F9 CANADIAN SYLLABICS WEST-CREE SWI +14FA CANADIAN SYLLABICS SWII +14FB CANADIAN SYLLABICS WEST-CREE SWII +14FC CANADIAN SYLLABICS SWO +14FD CANADIAN SYLLABICS WEST-CREE SWO +14FE CANADIAN SYLLABICS SWOO +14FF CANADIAN SYLLABICS WEST-CREE SWOO +1500 CANADIAN SYLLABICS SWA +1501 CANADIAN SYLLABICS WEST-CREE SWA +1502 CANADIAN SYLLABICS SWAA +1503 CANADIAN SYLLABICS WEST-CREE SWAA +1504 CANADIAN SYLLABICS NASKAPI SWAA +1505 CANADIAN SYLLABICS S +1506 CANADIAN SYLLABICS ATHAPASCAN S +1507 CANADIAN SYLLABICS SW +1508 CANADIAN SYLLABICS BLACKFOOT S +1509 CANADIAN SYLLABICS MOOSE-CREE SK +150A CANADIAN SYLLABICS NASKAPI SKW +150B CANADIAN SYLLABICS NASKAPI S-W +150C CANADIAN SYLLABICS NASKAPI SPWA +150D CANADIAN SYLLABICS NASKAPI STWA +150E CANADIAN SYLLABICS NASKAPI SKWA +150F CANADIAN SYLLABICS NASKAPI SCWA +1510 CANADIAN SYLLABICS SHE +1511 CANADIAN SYLLABICS SHI +1512 CANADIAN SYLLABICS SHII +1513 CANADIAN SYLLABICS SHO +1514 CANADIAN SYLLABICS SHOO +1515 CANADIAN SYLLABICS SHA +1516 CANADIAN SYLLABICS SHAA +1517 CANADIAN SYLLABICS SHWE +1518 CANADIAN SYLLABICS WEST-CREE SHWE +1519 CANADIAN SYLLABICS SHWI +151A CANADIAN SYLLABICS WEST-CREE SHWI +151B CANADIAN SYLLABICS SHWII +151C CANADIAN SYLLABICS WEST-CREE SHWII +151D CANADIAN SYLLABICS SHWO +151E CANADIAN SYLLABICS WEST-CREE SHWO +151F CANADIAN SYLLABICS SHWOO +1520 CANADIAN SYLLABICS WEST-CREE SHWOO +1521 CANADIAN SYLLABICS SHWA +1522 CANADIAN SYLLABICS WEST-CREE SHWA +1523 CANADIAN SYLLABICS SHWAA +1524 CANADIAN SYLLABICS WEST-CREE SHWAA +1525 CANADIAN SYLLABICS SH +1526 CANADIAN SYLLABICS YE + * Inuktitut (YAI) +1527 CANADIAN SYLLABICS YAAI + * Inuktitut +1528 CANADIAN SYLLABICS YI +1529 CANADIAN SYLLABICS YII +152A CANADIAN SYLLABICS YO + * Inuktitut (YU) +152B CANADIAN SYLLABICS YOO + * Inuktitut (YUU) +152C CANADIAN SYLLABICS Y-CREE YOO +152D CANADIAN SYLLABICS YA +152E CANADIAN SYLLABICS YAA +152F CANADIAN SYLLABICS YWE +1530 CANADIAN SYLLABICS WEST-CREE YWE +1531 CANADIAN SYLLABICS YWI +1532 CANADIAN SYLLABICS WEST-CREE YWI +1533 CANADIAN SYLLABICS YWII +1534 CANADIAN SYLLABICS WEST-CREE YWII +1535 CANADIAN SYLLABICS YWO +1536 CANADIAN SYLLABICS WEST-CREE YWO +1537 CANADIAN SYLLABICS YWOO +1538 CANADIAN SYLLABICS WEST-CREE YWOO +1539 CANADIAN SYLLABICS YWA +153A CANADIAN SYLLABICS WEST-CREE YWA +153B CANADIAN SYLLABICS YWAA +153C CANADIAN SYLLABICS WEST-CREE YWAA +153D CANADIAN SYLLABICS NASKAPI YWAA +153E CANADIAN SYLLABICS Y +153F CANADIAN SYLLABICS BIBLE-CREE Y +1540 CANADIAN SYLLABICS WEST-CREE Y +1541 CANADIAN SYLLABICS SAYISI YI +1542 CANADIAN SYLLABICS RE + * Inuktitut (RAI) +1543 CANADIAN SYLLABICS R-CREE RE + * Athapascan (LE) +1544 CANADIAN SYLLABICS WEST-CREE LE + * Athapascan (LI) +1545 CANADIAN SYLLABICS RAAI + * Inuktitut +1546 CANADIAN SYLLABICS RI +1547 CANADIAN SYLLABICS RII +1548 CANADIAN SYLLABICS RO + * Inuktitut (RU) +1549 CANADIAN SYLLABICS ROO + * Inuktitut (RUU) +154A CANADIAN SYLLABICS WEST-CREE LO + * Sayisi (LU) +154B CANADIAN SYLLABICS RA +154C CANADIAN SYLLABICS RAA +154D CANADIAN SYLLABICS WEST-CREE LA +154E CANADIAN SYLLABICS RWAA +154F CANADIAN SYLLABICS WEST-CREE RWAA +1550 CANADIAN SYLLABICS R +1551 CANADIAN SYLLABICS WEST-CREE R +1552 CANADIAN SYLLABICS MEDIAL R +1553 CANADIAN SYLLABICS FE + * Inuktitut (FAI) +1554 CANADIAN SYLLABICS FAAI + * Inuktitut +1555 CANADIAN SYLLABICS FI +1556 CANADIAN SYLLABICS FII +1557 CANADIAN SYLLABICS FO +1558 CANADIAN SYLLABICS FOO +1559 CANADIAN SYLLABICS FA +155A CANADIAN SYLLABICS FAA +155B CANADIAN SYLLABICS FWAA +155C CANADIAN SYLLABICS WEST-CREE FWAA +155D CANADIAN SYLLABICS F +155E CANADIAN SYLLABICS THE + * Sayisi (TE) +155F CANADIAN SYLLABICS N-CREE THE +1560 CANADIAN SYLLABICS THI + * Sayisi (TI) +1561 CANADIAN SYLLABICS N-CREE THI +1562 CANADIAN SYLLABICS THII +1563 CANADIAN SYLLABICS N-CREE THII +1564 CANADIAN SYLLABICS THO + * Sayisi (TU) +1565 CANADIAN SYLLABICS THOO +1566 CANADIAN SYLLABICS THA + * Sayisi (TA) +1567 CANADIAN SYLLABICS THAA +1568 CANADIAN SYLLABICS THWAA +1569 CANADIAN SYLLABICS WEST-CREE THWAA +156A CANADIAN SYLLABICS TH +156B CANADIAN SYLLABICS TTHE +156C CANADIAN SYLLABICS TTHI +156D CANADIAN SYLLABICS TTHO + * Sayisi (TTHU) +156E CANADIAN SYLLABICS TTHA +156F CANADIAN SYLLABICS TTH + * probably a mistaken interpretation of an asterisk used to mark a proper noun + x (asterisk - 002A) +1570 CANADIAN SYLLABICS TYE +1571 CANADIAN SYLLABICS TYI +1572 CANADIAN SYLLABICS TYO +1573 CANADIAN SYLLABICS TYA +1574 CANADIAN SYLLABICS NUNAVIK HE +1575 CANADIAN SYLLABICS NUNAVIK HI +1576 CANADIAN SYLLABICS NUNAVIK HII +1577 CANADIAN SYLLABICS NUNAVIK HO +1578 CANADIAN SYLLABICS NUNAVIK HOO +1579 CANADIAN SYLLABICS NUNAVIK HA +157A CANADIAN SYLLABICS NUNAVIK HAA +157B CANADIAN SYLLABICS NUNAVIK H +157C CANADIAN SYLLABICS NUNAVUT H +157D CANADIAN SYLLABICS HK + * Algonquian +157E CANADIAN SYLLABICS QAAI + * Inuktitut +157F CANADIAN SYLLABICS QI +1580 CANADIAN SYLLABICS QII +1581 CANADIAN SYLLABICS QO + * Inuktitut (QU) +1582 CANADIAN SYLLABICS QOO + * Inuktitut (QUU) +1583 CANADIAN SYLLABICS QA +1584 CANADIAN SYLLABICS QAA +1585 CANADIAN SYLLABICS Q +1586 CANADIAN SYLLABICS TLHE + * Sayisi (KLE) +1587 CANADIAN SYLLABICS TLHI + * Sayisi (KLI) +1588 CANADIAN SYLLABICS TLHO + * Sayisi (KLU) +1589 CANADIAN SYLLABICS TLHA + * Sayisi (KLA) +158A CANADIAN SYLLABICS WEST-CREE RE +158B CANADIAN SYLLABICS WEST-CREE RI +158C CANADIAN SYLLABICS WEST-CREE RO +158D CANADIAN SYLLABICS WEST-CREE RA +158E CANADIAN SYLLABICS NGAAI + * Inuktitut +158F CANADIAN SYLLABICS NGI +1590 CANADIAN SYLLABICS NGII +1591 CANADIAN SYLLABICS NGO + * Inuktitut (NGU) +1592 CANADIAN SYLLABICS NGOO + * Inuktitut (NGUU) +1593 CANADIAN SYLLABICS NGA +1594 CANADIAN SYLLABICS NGAA +1595 CANADIAN SYLLABICS NG +1596 CANADIAN SYLLABICS NNG +1597 CANADIAN SYLLABICS SAYISI SHE +1598 CANADIAN SYLLABICS SAYISI SHI +1599 CANADIAN SYLLABICS SAYISI SHO + * Sayisi (SHU) +159A CANADIAN SYLLABICS SAYISI SHA +159B CANADIAN SYLLABICS WOODS-CREE THE +159C CANADIAN SYLLABICS WOODS-CREE THI +159D CANADIAN SYLLABICS WOODS-CREE THO +159E CANADIAN SYLLABICS WOODS-CREE THA +159F CANADIAN SYLLABICS WOODS-CREE TH +15A0 CANADIAN SYLLABICS LHI +15A1 CANADIAN SYLLABICS LHII +15A2 CANADIAN SYLLABICS LHO + * Inuktitut (LHU) +15A3 CANADIAN SYLLABICS LHOO + * Inuktitut (LHUU) +15A4 CANADIAN SYLLABICS LHA +15A5 CANADIAN SYLLABICS LHAA +15A6 CANADIAN SYLLABICS LH +15A7 CANADIAN SYLLABICS TH-CREE THE +15A8 CANADIAN SYLLABICS TH-CREE THI +15A9 CANADIAN SYLLABICS TH-CREE THII +15AA CANADIAN SYLLABICS TH-CREE THO +15AB CANADIAN SYLLABICS TH-CREE THOO +15AC CANADIAN SYLLABICS TH-CREE THA +15AD CANADIAN SYLLABICS TH-CREE THAA +15AE CANADIAN SYLLABICS TH-CREE TH +15AF CANADIAN SYLLABICS AIVILIK B +15B0 CANADIAN SYLLABICS BLACKFOOT E +15B1 CANADIAN SYLLABICS BLACKFOOT I +15B2 CANADIAN SYLLABICS BLACKFOOT O +15B3 CANADIAN SYLLABICS BLACKFOOT A +15B4 CANADIAN SYLLABICS BLACKFOOT WE +15B5 CANADIAN SYLLABICS BLACKFOOT WI +15B6 CANADIAN SYLLABICS BLACKFOOT WO +15B7 CANADIAN SYLLABICS BLACKFOOT WA +15B8 CANADIAN SYLLABICS BLACKFOOT NE +15B9 CANADIAN SYLLABICS BLACKFOOT NI +15BA CANADIAN SYLLABICS BLACKFOOT NO +15BB CANADIAN SYLLABICS BLACKFOOT NA +15BC CANADIAN SYLLABICS BLACKFOOT KE +15BD CANADIAN SYLLABICS BLACKFOOT KI +15BE CANADIAN SYLLABICS BLACKFOOT KO +15BF CANADIAN SYLLABICS BLACKFOOT KA +15C0 CANADIAN SYLLABICS SAYISI HE +15C1 CANADIAN SYLLABICS SAYISI HI +15C2 CANADIAN SYLLABICS SAYISI HO + * Sayisi (HU) +15C3 CANADIAN SYLLABICS SAYISI HA +15C4 CANADIAN SYLLABICS CARRIER GHU +15C5 CANADIAN SYLLABICS CARRIER GHO +15C6 CANADIAN SYLLABICS CARRIER GHE +15C7 CANADIAN SYLLABICS CARRIER GHEE +15C8 CANADIAN SYLLABICS CARRIER GHI +15C9 CANADIAN SYLLABICS CARRIER GHA +15CA CANADIAN SYLLABICS CARRIER RU +15CB CANADIAN SYLLABICS CARRIER RO +15CC CANADIAN SYLLABICS CARRIER RE +15CD CANADIAN SYLLABICS CARRIER REE +15CE CANADIAN SYLLABICS CARRIER RI +15CF CANADIAN SYLLABICS CARRIER RA +15D0 CANADIAN SYLLABICS CARRIER WU +15D1 CANADIAN SYLLABICS CARRIER WO +15D2 CANADIAN SYLLABICS CARRIER WE +15D3 CANADIAN SYLLABICS CARRIER WEE +15D4 CANADIAN SYLLABICS CARRIER WI +15D5 CANADIAN SYLLABICS CARRIER WA +15D6 CANADIAN SYLLABICS CARRIER HWU +15D7 CANADIAN SYLLABICS CARRIER HWO +15D8 CANADIAN SYLLABICS CARRIER HWE +15D9 CANADIAN SYLLABICS CARRIER HWEE +15DA CANADIAN SYLLABICS CARRIER HWI +15DB CANADIAN SYLLABICS CARRIER HWA +15DC CANADIAN SYLLABICS CARRIER THU +15DD CANADIAN SYLLABICS CARRIER THO +15DE CANADIAN SYLLABICS CARRIER THE +15DF CANADIAN SYLLABICS CARRIER THEE +15E0 CANADIAN SYLLABICS CARRIER THI +15E1 CANADIAN SYLLABICS CARRIER THA +15E2 CANADIAN SYLLABICS CARRIER TTU +15E3 CANADIAN SYLLABICS CARRIER TTO +15E4 CANADIAN SYLLABICS CARRIER TTE +15E5 CANADIAN SYLLABICS CARRIER TTEE +15E6 CANADIAN SYLLABICS CARRIER TTI +15E7 CANADIAN SYLLABICS CARRIER TTA +15E8 CANADIAN SYLLABICS CARRIER PU +15E9 CANADIAN SYLLABICS CARRIER PO +15EA CANADIAN SYLLABICS CARRIER PE +15EB CANADIAN SYLLABICS CARRIER PEE +15EC CANADIAN SYLLABICS CARRIER PI +15ED CANADIAN SYLLABICS CARRIER PA +15EE CANADIAN SYLLABICS CARRIER P +15EF CANADIAN SYLLABICS CARRIER GU +15F0 CANADIAN SYLLABICS CARRIER GO +15F1 CANADIAN SYLLABICS CARRIER GE +15F2 CANADIAN SYLLABICS CARRIER GEE +15F3 CANADIAN SYLLABICS CARRIER GI +15F4 CANADIAN SYLLABICS CARRIER GA +15F5 CANADIAN SYLLABICS CARRIER KHU +15F6 CANADIAN SYLLABICS CARRIER KHO +15F7 CANADIAN SYLLABICS CARRIER KHE +15F8 CANADIAN SYLLABICS CARRIER KHEE +15F9 CANADIAN SYLLABICS CARRIER KHI +15FA CANADIAN SYLLABICS CARRIER KHA +15FB CANADIAN SYLLABICS CARRIER KKU +15FC CANADIAN SYLLABICS CARRIER KKO +15FD CANADIAN SYLLABICS CARRIER KKE +15FE CANADIAN SYLLABICS CARRIER KKEE +15FF CANADIAN SYLLABICS CARRIER KKI +1600 CANADIAN SYLLABICS CARRIER KKA +1601 CANADIAN SYLLABICS CARRIER KK +1602 CANADIAN SYLLABICS CARRIER NU +1603 CANADIAN SYLLABICS CARRIER NO +1604 CANADIAN SYLLABICS CARRIER NE +1605 CANADIAN SYLLABICS CARRIER NEE +1606 CANADIAN SYLLABICS CARRIER NI +1607 CANADIAN SYLLABICS CARRIER NA +1608 CANADIAN SYLLABICS CARRIER MU +1609 CANADIAN SYLLABICS CARRIER MO +160A CANADIAN SYLLABICS CARRIER ME +160B CANADIAN SYLLABICS CARRIER MEE +160C CANADIAN SYLLABICS CARRIER MI +160D CANADIAN SYLLABICS CARRIER MA +160E CANADIAN SYLLABICS CARRIER YU +160F CANADIAN SYLLABICS CARRIER YO +1610 CANADIAN SYLLABICS CARRIER YE +1611 CANADIAN SYLLABICS CARRIER YEE +1612 CANADIAN SYLLABICS CARRIER YI +1613 CANADIAN SYLLABICS CARRIER YA +1614 CANADIAN SYLLABICS CARRIER JU + * Athapascan (ZA), Sayisi (TZO), South Slavey (DHA) +1615 CANADIAN SYLLABICS SAYISI JU + * Athapascan (ZO), Sayisi (TZU), South Slavey (DHO) +1616 CANADIAN SYLLABICS CARRIER JO +1617 CANADIAN SYLLABICS CARRIER JE +1618 CANADIAN SYLLABICS CARRIER JEE +1619 CANADIAN SYLLABICS CARRIER JI +161A CANADIAN SYLLABICS SAYISI JI + * Athapascan (ZE), Sayisi (TZE), South Slavey (DHE) +161B CANADIAN SYLLABICS CARRIER JA + * Athapascan (ZI), Sayisi (TZI), South Slavey (DHI) +161C CANADIAN SYLLABICS CARRIER JJU +161D CANADIAN SYLLABICS CARRIER JJO +161E CANADIAN SYLLABICS CARRIER JJE +161F CANADIAN SYLLABICS CARRIER JJEE +1620 CANADIAN SYLLABICS CARRIER JJI +1621 CANADIAN SYLLABICS CARRIER JJA +1622 CANADIAN SYLLABICS CARRIER LU +1623 CANADIAN SYLLABICS CARRIER LO +1624 CANADIAN SYLLABICS CARRIER LE +1625 CANADIAN SYLLABICS CARRIER LEE +1626 CANADIAN SYLLABICS CARRIER LI +1627 CANADIAN SYLLABICS CARRIER LA +1628 CANADIAN SYLLABICS CARRIER DLU +1629 CANADIAN SYLLABICS CARRIER DLO +162A CANADIAN SYLLABICS CARRIER DLE +162B CANADIAN SYLLABICS CARRIER DLEE +162C CANADIAN SYLLABICS CARRIER DLI +162D CANADIAN SYLLABICS CARRIER DLA +162E CANADIAN SYLLABICS CARRIER LHU +162F CANADIAN SYLLABICS CARRIER LHO +1630 CANADIAN SYLLABICS CARRIER LHE +1631 CANADIAN SYLLABICS CARRIER LHEE +1632 CANADIAN SYLLABICS CARRIER LHI +1633 CANADIAN SYLLABICS CARRIER LHA +1634 CANADIAN SYLLABICS CARRIER TLHU +1635 CANADIAN SYLLABICS CARRIER TLHO +1636 CANADIAN SYLLABICS CARRIER TLHE +1637 CANADIAN SYLLABICS CARRIER TLHEE +1638 CANADIAN SYLLABICS CARRIER TLHI +1639 CANADIAN SYLLABICS CARRIER TLHA +163A CANADIAN SYLLABICS CARRIER TLU +163B CANADIAN SYLLABICS CARRIER TLO +163C CANADIAN SYLLABICS CARRIER TLE +163D CANADIAN SYLLABICS CARRIER TLEE +163E CANADIAN SYLLABICS CARRIER TLI +163F CANADIAN SYLLABICS CARRIER TLA +1640 CANADIAN SYLLABICS CARRIER ZU +1641 CANADIAN SYLLABICS CARRIER ZO +1642 CANADIAN SYLLABICS CARRIER ZE +1643 CANADIAN SYLLABICS CARRIER ZEE +1644 CANADIAN SYLLABICS CARRIER ZI +1645 CANADIAN SYLLABICS CARRIER ZA +1646 CANADIAN SYLLABICS CARRIER Z +1647 CANADIAN SYLLABICS CARRIER INITIAL Z +1648 CANADIAN SYLLABICS CARRIER DZU +1649 CANADIAN SYLLABICS CARRIER DZO +164A CANADIAN SYLLABICS CARRIER DZE +164B CANADIAN SYLLABICS CARRIER DZEE +164C CANADIAN SYLLABICS CARRIER DZI +164D CANADIAN SYLLABICS CARRIER DZA +164E CANADIAN SYLLABICS CARRIER SU +164F CANADIAN SYLLABICS CARRIER SO +1650 CANADIAN SYLLABICS CARRIER SE +1651 CANADIAN SYLLABICS CARRIER SEE +1652 CANADIAN SYLLABICS CARRIER SI +1653 CANADIAN SYLLABICS CARRIER SA +1654 CANADIAN SYLLABICS CARRIER SHU +1655 CANADIAN SYLLABICS CARRIER SHO +1656 CANADIAN SYLLABICS CARRIER SHE +1657 CANADIAN SYLLABICS CARRIER SHEE +1658 CANADIAN SYLLABICS CARRIER SHI +1659 CANADIAN SYLLABICS CARRIER SHA +165A CANADIAN SYLLABICS CARRIER SH +165B CANADIAN SYLLABICS CARRIER TSU +165C CANADIAN SYLLABICS CARRIER TSO +165D CANADIAN SYLLABICS CARRIER TSE +165E CANADIAN SYLLABICS CARRIER TSEE +165F CANADIAN SYLLABICS CARRIER TSI +1660 CANADIAN SYLLABICS CARRIER TSA +1661 CANADIAN SYLLABICS CARRIER CHU +1662 CANADIAN SYLLABICS CARRIER CHO +1663 CANADIAN SYLLABICS CARRIER CHE +1664 CANADIAN SYLLABICS CARRIER CHEE +1665 CANADIAN SYLLABICS CARRIER CHI +1666 CANADIAN SYLLABICS CARRIER CHA +1667 CANADIAN SYLLABICS CARRIER TTSU +1668 CANADIAN SYLLABICS CARRIER TTSO +1669 CANADIAN SYLLABICS CARRIER TTSE +166A CANADIAN SYLLABICS CARRIER TTSEE +166B CANADIAN SYLLABICS CARRIER TTSI +166C CANADIAN SYLLABICS CARRIER TTSA +@ Symbol +166D CANADIAN SYLLABICS CHI SIGN + * Algonquian + * used as a symbol to denote Christ + x (chi rho - 2627) +@ Punctuation +166E CANADIAN SYLLABICS FULL STOP +@ Syllables +166F CANADIAN SYLLABICS QAI +1670 CANADIAN SYLLABICS NGAI +1671 CANADIAN SYLLABICS NNGI +1672 CANADIAN SYLLABICS NNGII +1673 CANADIAN SYLLABICS NNGO + * Inuktitut (NNGU) +1674 CANADIAN SYLLABICS NNGOO + * Inuktitut (NNGUU) +1675 CANADIAN SYLLABICS NNGA +1676 CANADIAN SYLLABICS NNGAA +@@ 1680 Ogham 169F +@ Punctuation +1680 OGHAM SPACE MARK + * glyph is blank in "stemless" style fonts +@ Traditional letters +1681 OGHAM LETTER BEITH +1682 OGHAM LETTER LUIS +1683 OGHAM LETTER FEARN +1684 OGHAM LETTER SAIL +1685 OGHAM LETTER NION +1686 OGHAM LETTER UATH +1687 OGHAM LETTER DAIR +1688 OGHAM LETTER TINNE +1689 OGHAM LETTER COLL +168A OGHAM LETTER CEIRT +168B OGHAM LETTER MUIN +168C OGHAM LETTER GORT +168D OGHAM LETTER NGEADAL +168E OGHAM LETTER STRAIF +168F OGHAM LETTER RUIS +1690 OGHAM LETTER AILM +1691 OGHAM LETTER ONN +1692 OGHAM LETTER UR +1693 OGHAM LETTER EADHADH +1694 OGHAM LETTER IODHADH +@ Forfeda (supplementary letters) +1695 OGHAM LETTER EABHADH +1696 OGHAM LETTER OR +1697 OGHAM LETTER UILLEANN +1698 OGHAM LETTER IFIN +1699 OGHAM LETTER EAMHANCHOLL +169A OGHAM LETTER PEITH +@ Punctuation +169B OGHAM FEATHER MARK + * marks beginning of Ogham text +169C OGHAM REVERSED FEATHER MARK + * marks end of Ogham text +@@ 16A0 Runic 16FF +@ Letters +16A0 RUNIC LETTER FEHU FEOH FE F +16A1 RUNIC LETTER V +16A2 RUNIC LETTER URUZ UR U +16A3 RUNIC LETTER YR +16A4 RUNIC LETTER Y +16A5 RUNIC LETTER W +16A6 RUNIC LETTER THURISAZ THURS THORN + x (latin small letter thorn - 00FE) +16A7 RUNIC LETTER ETH +16A8 RUNIC LETTER ANSUZ A +16A9 RUNIC LETTER OS O +16AA RUNIC LETTER AC A +16AB RUNIC LETTER AESC +16AC RUNIC LETTER LONG-BRANCH-OSS O +16AD RUNIC LETTER SHORT-TWIG-OSS O +16AE RUNIC LETTER O +16AF RUNIC LETTER OE +16B0 RUNIC LETTER ON +16B1 RUNIC LETTER RAIDO RAD REID R +16B2 RUNIC LETTER KAUNA +16B3 RUNIC LETTER CEN +16B4 RUNIC LETTER KAUN K +16B5 RUNIC LETTER G +16B6 RUNIC LETTER ENG +16B7 RUNIC LETTER GEBO GYFU G +16B8 RUNIC LETTER GAR +16B9 RUNIC LETTER WUNJO WYNN W + x (latin letter wynn - 01BF) +16BA RUNIC LETTER HAGLAZ H +16BB RUNIC LETTER HAEGL H +16BC RUNIC LETTER LONG-BRANCH-HAGALL H +16BD RUNIC LETTER SHORT-TWIG-HAGALL H +16BE RUNIC LETTER NAUDIZ NYD NAUD N +16BF RUNIC LETTER SHORT-TWIG-NAUD N +16C0 RUNIC LETTER DOTTED-N +16C1 RUNIC LETTER ISAZ IS ISS I +16C2 RUNIC LETTER E +16C3 RUNIC LETTER JERAN J +16C4 RUNIC LETTER GER +16C5 RUNIC LETTER LONG-BRANCH-AR AE +16C6 RUNIC LETTER SHORT-TWIG-AR A +16C7 RUNIC LETTER IWAZ EOH +16C8 RUNIC LETTER PERTHO PEORTH P +16C9 RUNIC LETTER ALGIZ EOLHX +16CA RUNIC LETTER SOWILO S +16CB RUNIC LETTER SIGEL LONG-BRANCH-SOL S +16CC RUNIC LETTER SHORT-TWIG-SOL S +16CD RUNIC LETTER C +16CE RUNIC LETTER Z +16CF RUNIC LETTER TIWAZ TIR TYR T +16D0 RUNIC LETTER SHORT-TWIG-TYR T +16D1 RUNIC LETTER D +16D2 RUNIC LETTER BERKANAN BEORC BJARKAN B +16D3 RUNIC LETTER SHORT-TWIG-BJARKAN B +16D4 RUNIC LETTER DOTTED-P +16D5 RUNIC LETTER OPEN-P +16D6 RUNIC LETTER EHWAZ EH E +16D7 RUNIC LETTER MANNAZ MAN M +16D8 RUNIC LETTER LONG-BRANCH-MADR M +16D9 RUNIC LETTER SHORT-TWIG-MADR M +16DA RUNIC LETTER LAUKAZ LAGU LOGR L +16DB RUNIC LETTER DOTTED-L +16DC RUNIC LETTER INGWAZ +16DD RUNIC LETTER ING +16DE RUNIC LETTER DAGAZ DAEG D +16DF RUNIC LETTER OTHALAN ETHEL O +16E0 RUNIC LETTER EAR +16E1 RUNIC LETTER IOR +16E2 RUNIC LETTER CWEORTH +16E3 RUNIC LETTER CALC +16E4 RUNIC LETTER CEALC +16E5 RUNIC LETTER STAN +16E6 RUNIC LETTER LONG-BRANCH-YR +16E7 RUNIC LETTER SHORT-TWIG-YR +16E8 RUNIC LETTER ICELANDIC-YR +16E9 RUNIC LETTER Q +16EA RUNIC LETTER X +@ Punctuation +16EB RUNIC SINGLE PUNCTUATION +16EC RUNIC MULTIPLE PUNCTUATION +16ED RUNIC CROSS PUNCTUATION +@ Golden number runes +16EE RUNIC ARLAUG SYMBOL (golden number 17) + * golden number 17 +16EF RUNIC TVIMADUR SYMBOL (golden number 18) + * golden number 18 +16F0 RUNIC BELGTHOR SYMBOL (golden number 19) + * golden number 19 +@@ 1700 Tagalog 171F +@ Independent vowels +1700 TAGALOG LETTER A +1701 TAGALOG LETTER I +1702 TAGALOG LETTER U +@ Consonants +1703 TAGALOG LETTER KA +1704 TAGALOG LETTER GA +1705 TAGALOG LETTER NGA +1706 TAGALOG LETTER TA +1707 TAGALOG LETTER DA +1708 TAGALOG LETTER NA +1709 TAGALOG LETTER PA +170A TAGALOG LETTER BA +170B TAGALOG LETTER MA +170C TAGALOG LETTER YA +170E TAGALOG LETTER LA +170F TAGALOG LETTER WA +1710 TAGALOG LETTER SA +1711 TAGALOG LETTER HA +@ Dependent vowel signs +1712 TAGALOG VOWEL SIGN I +1713 TAGALOG VOWEL SIGN U +@ Virama +1714 TAGALOG SIGN VIRAMA +@@ 1720 Hanunoo 173F +@ Independent vowels +1720 HANUNOO LETTER A +1721 HANUNOO LETTER I +1722 HANUNOO LETTER U +@ Consonants +1723 HANUNOO LETTER KA +1724 HANUNOO LETTER GA +1725 HANUNOO LETTER NGA +1726 HANUNOO LETTER TA +1727 HANUNOO LETTER DA +1728 HANUNOO LETTER NA +1729 HANUNOO LETTER PA +172A HANUNOO LETTER BA +172B HANUNOO LETTER MA +172C HANUNOO LETTER YA +172D HANUNOO LETTER RA +172E HANUNOO LETTER LA +172F HANUNOO LETTER WA +1730 HANUNOO LETTER SA +1731 HANUNOO LETTER HA +@ Dependent vowel signs +1732 HANUNOO VOWEL SIGN I +1733 HANUNOO VOWEL SIGN U +@ Virama +1734 HANUNOO SIGN PAMUDPOD +@ Generic punctuation for Philippine scripts +1735 PHILIPPINE SINGLE PUNCTUATION + x (devanagari danda - 0964) +1736 PHILIPPINE DOUBLE PUNCTUATION + x (devanagari double danda - 0965) +@@ 1740 Buhid 175F +@ Independent vowels +1740 BUHID LETTER A +1741 BUHID LETTER I +1742 BUHID LETTER U +@ Consonants +1743 BUHID LETTER KA +1744 BUHID LETTER GA +1745 BUHID LETTER NGA +1746 BUHID LETTER TA +1747 BUHID LETTER DA +1748 BUHID LETTER NA +1749 BUHID LETTER PA +174A BUHID LETTER BA +174B BUHID LETTER MA +174C BUHID LETTER YA +174D BUHID LETTER RA +174E BUHID LETTER LA +174F BUHID LETTER WA +1750 BUHID LETTER SA +1751 BUHID LETTER HA +@ Dependent vowel signs +1752 BUHID VOWEL SIGN I +1753 BUHID VOWEL SIGN U +@@ 1760 Tagbanwa 177F +@ Independent vowels +1760 TAGBANWA LETTER A +1761 TAGBANWA LETTER I +1762 TAGBANWA LETTER U +@ Consonants +1763 TAGBANWA LETTER KA +1764 TAGBANWA LETTER GA +1765 TAGBANWA LETTER NGA +1766 TAGBANWA LETTER TA +1767 TAGBANWA LETTER DA +1768 TAGBANWA LETTER NA +1769 TAGBANWA LETTER PA +176A TAGBANWA LETTER BA +176B TAGBANWA LETTER MA +176C TAGBANWA LETTER YA +176E TAGBANWA LETTER LA +176F TAGBANWA LETTER WA +1770 TAGBANWA LETTER SA +@ Dependent vowel signs +1772 TAGBANWA VOWEL SIGN I +1773 TAGBANWA VOWEL SIGN U +@@ 1780 Khmer 17FF +@ Consonants +1780 KHMER LETTER KA +1781 KHMER LETTER KHA +1782 KHMER LETTER KO +1783 KHMER LETTER KHO +1784 KHMER LETTER NGO +1785 KHMER LETTER CA +1786 KHMER LETTER CHA +1787 KHMER LETTER CO +1788 KHMER LETTER CHO +1789 KHMER LETTER NYO +178A KHMER LETTER DA +178B KHMER LETTER TTHA +178C KHMER LETTER DO +178D KHMER LETTER TTHO +178E KHMER LETTER NNO + * as this character belongs to the first register, its correct transliteration is nna, not nno +178F KHMER LETTER TA +1790 KHMER LETTER THA +1791 KHMER LETTER TO +1792 KHMER LETTER THO +1793 KHMER LETTER NO +1794 KHMER LETTER BA +1795 KHMER LETTER PHA +1796 KHMER LETTER PO +1797 KHMER LETTER PHO +1798 KHMER LETTER MO +1799 KHMER LETTER YO +179A KHMER LETTER RO +179B KHMER LETTER LO +179C KHMER LETTER VO +179D KHMER LETTER SHA + * used only for Pali/Sanskrit transliteration +179E KHMER LETTER SSO + * used only for Pali/Sanskrit transliteration + * as this character belongs to the first register, its correct transliteration is ssa, not sso +179F KHMER LETTER SA +17A0 KHMER LETTER HA +17A1 KHMER LETTER LA +17A2 KHMER LETTER QA + * glottal stop +@ Independent vowel (deprecated) +17A3 KHMER INDEPENDENT VOWEL QAQ * + * originally intended only for Pali/Sanskrit transliteration + * use of this character is strongly discouraged; 17A2 should be used instead +@ Independent vowels +17A4 KHMER INDEPENDENT VOWEL QAA * + * used only for Pali/Sanskrit transliteration + * use of this character is discouraged; the sequence 17A2 17B6 should be used instead +17A5 KHMER INDEPENDENT VOWEL QI +17A6 KHMER INDEPENDENT VOWEL QII +17A7 KHMER INDEPENDENT VOWEL QU +17A8 KHMER INDEPENDENT VOWEL QUK + * obsolete ligature for the sequence 17A7 1780 + * use of the sequence is now preferred +17A9 KHMER INDEPENDENT VOWEL QUU +17AA KHMER INDEPENDENT VOWEL QUUV +17AB KHMER INDEPENDENT VOWEL RY +17AC KHMER INDEPENDENT VOWEL RYY +17AD KHMER INDEPENDENT VOWEL LY +17AE KHMER INDEPENDENT VOWEL LYY +17AF KHMER INDEPENDENT VOWEL QE +17B0 KHMER INDEPENDENT VOWEL QAI +17B1 KHMER INDEPENDENT VOWEL QOO TYPE ONE +17B2 KHMER INDEPENDENT VOWEL QOO TYPE TWO + * this is a variant for 17B1, used in only two words + * 17B1 is the normal variant of this vowel +17B3 KHMER INDEPENDENT VOWEL QAU +@ Inherent vowels +@+ These are for phonetic transcription to distinguish Indic language inherent vowels from Khmer inherent vowels. These characters are included solely for compatibility with particular applications; their use in other contexts is discouraged. +17B4 KHMER VOWEL INHERENT AQ * +17B5 KHMER VOWEL INHERENT AA * +@ Dependent vowel signs +17B6 KHMER VOWEL SIGN AA +17B7 KHMER VOWEL SIGN I +17B8 KHMER VOWEL SIGN II +17B9 KHMER VOWEL SIGN Y +17BA KHMER VOWEL SIGN YY +17BB KHMER VOWEL SIGN U +17BC KHMER VOWEL SIGN UU +17BD KHMER VOWEL SIGN UA +@ Two-part dependent vowel signs +@+ These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for processing. +17BE KHMER VOWEL SIGN OE +17BF KHMER VOWEL SIGN YA +17C0 KHMER VOWEL SIGN IE +@ Dependent vowel signs +17C1 KHMER VOWEL SIGN E +17C2 KHMER VOWEL SIGN AE +17C3 KHMER VOWEL SIGN AI +@ Two-part dependent vowel signs +@+ These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for processing. +17C4 KHMER VOWEL SIGN OO +17C5 KHMER VOWEL SIGN AU +@ Various signs +17C6 KHMER SIGN NIKAHIT + = srak am + = anusvara + * final nasalization + * this character is usually regarded as a vowel sign am, along with om and aam + x (thai character nikhahit - 0E4D) + x (myanmar sign anusvara - 1036) +17C7 KHMER SIGN REAHMUK + = srak ah + = visarga + x (myanmar sign visarga - 1038) +17C8 KHMER SIGN YUUKALEAPINTU + * inserts a short inherent vowel with abrupt glottal stop + * the preferred transliteration is yukaleakpintu +@ Consonant shifters +@+ These signs shift the base consonant between registers. +17C9 KHMER SIGN MUUSIKATOAN + * changes the second register to the first + * the preferred transliteration is muusekatoan +17CA KHMER SIGN TRIISAP + * changes the first register to the second + * the preferred transliteration is treisap +@ Various signs +17CB KHMER SIGN BANTOC + * shortens the vowel sound in the previous orthographic syllable + * the preferred transliteration is bantak +17CC KHMER SIGN ROBAT + * a diacritic historically corresponding to the repha form of ra in Devanagari +17CD KHMER SIGN TOANDAKHIAT + * indicates that the base character is not pronounced +17CE KHMER SIGN KAKABAT + * sign used with some exclamations +17CF KHMER SIGN AHSDA + * denotes stressed intonation in some single-consonant words +17D0 KHMER SIGN SAMYOK SANNYA + * denotes deviation from the general rules of pronunciation, mostly used in loan words from Pali/Sanskrit, French, and so on +17D1 KHMER SIGN VIRIAM + * mostly obsolete, a "killer" + * indicates that the base character is the final consonant of a word without its inherent vowel sound +17D2 KHMER SIGN COENG + * functions to indicate that the following Khmer letter is to be rendered subscripted + * shape shown is arbitrary and is not visibly rendered +@ Lunar date sign (deprecated) +17D3 KHMER SIGN BATHAMASAT * + * originally intended as part of lunar date symbols + * use of this character is strongly discouraged in favor of the complete set of lunar date symbols + x (khmer symbol pathamasat - 19E0) +@ Various signs +17D4 KHMER SIGN KHAN + * functions as a full stop, period + x (thai character paiyannoi - 0E2F) + x (myanmar sign little section - 104A) +17D5 KHMER SIGN BARIYOOSAN + * indicates the end of a section or a text + x (thai character angkhankhu - 0E5A) + x (myanmar sign section - 104B) +17D6 KHMER SIGN CAMNUC PII KUUH + * functions as colon + * the preferred transliteration is camnoc pii kuuh + x (division sign - 00F7) + x (tibetan mark gter tsheg - 0F14) +17D7 KHMER SIGN LEK TOO + * repetition sign + x (thai character maiyamok - 0E46) +17D8 KHMER SIGN BEYYAL * + * et cetera + * use of this character is discouraged; other abbreviations for et cetera also exist + * preferred spelling: 17D4 179B 17D4 +17D9 KHMER SIGN PHNAEK MUAN + * indicates the beginning of a book or a treatise + * the preferred transliteration is phnek moan + x (thai character fongman - 0E4F) +17DA KHMER SIGN KOOMUUT + * indicates the end of a book or treatise + * this forms a pair with 17D9 + * the preferred transliteration is koomoot + x (thai character khomut - 0E5B) +@ Currency symbol +17DB KHMER CURRENCY SYMBOL RIEL +@ Various signs +17DC KHMER SIGN AVAKRAHASANYA + * rare, shows an omitted Sanskrit vowel, like an apostrophe + * the preferred transliteration is avakraha sannya + x (devanagari sign avagraha - 093D) +17DD KHMER SIGN ATTHACAN + * mostly obsolete + * indicates that the base character is the final consonant of a word with its inherent vowel sound + x (khmer sign viriam - 17D1) +@ Digits +17E0 KHMER DIGIT ZERO +17E1 KHMER DIGIT ONE +17E2 KHMER DIGIT TWO +17E3 KHMER DIGIT THREE +17E4 KHMER DIGIT FOUR +17E5 KHMER DIGIT FIVE +17E6 KHMER DIGIT SIX +17E7 KHMER DIGIT SEVEN +17E8 KHMER DIGIT EIGHT +17E9 KHMER DIGIT NINE +@ Numeric symbols for divination lore +@+ These characters have numeric values 0-9, respectively, but are not used for calculation. +17F0 KHMER SYMBOL LEK ATTAK SON +17F1 KHMER SYMBOL LEK ATTAK MUOY +17F2 KHMER SYMBOL LEK ATTAK PII +17F3 KHMER SYMBOL LEK ATTAK BEI +17F4 KHMER SYMBOL LEK ATTAK BUON +17F5 KHMER SYMBOL LEK ATTAK PRAM +17F6 KHMER SYMBOL LEK ATTAK PRAM-MUOY +17F7 KHMER SYMBOL LEK ATTAK PRAM-PII +17F8 KHMER SYMBOL LEK ATTAK PRAM-BEI +17F9 KHMER SYMBOL LEK ATTAK PRAM-BUON +@@ 1800 Mongolian 18AF +@ Punctuation +1800 MONGOLIAN BIRGA + x (tibetan mark initial yig mgo mdun ma - 0F04) +1801 MONGOLIAN ELLIPSIS +1802 MONGOLIAN COMMA +1803 MONGOLIAN FULL STOP +1804 MONGOLIAN COLON +1805 MONGOLIAN FOUR DOTS + * marks the end of a chapter +1806 MONGOLIAN TODO SOFT HYPHEN + * not a format control character, but simply a hyphen for Todo + x (soft hyphen - 00AD) +1807 MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER +1808 MONGOLIAN MANCHU COMMA +1809 MONGOLIAN MANCHU FULL STOP +180A MONGOLIAN NIRUGU +@ Format controls +180B MONGOLIAN FREE VARIATION SELECTOR ONE + = FVS1 +180C MONGOLIAN FREE VARIATION SELECTOR TWO + = FVS2 +180D MONGOLIAN FREE VARIATION SELECTOR THREE + = FVS3 +180E MONGOLIAN VOWEL SEPARATOR + = MVS +@ Digits +1810 MONGOLIAN DIGIT ZERO +1811 MONGOLIAN DIGIT ONE +1812 MONGOLIAN DIGIT TWO +1813 MONGOLIAN DIGIT THREE +1814 MONGOLIAN DIGIT FOUR +1815 MONGOLIAN DIGIT FIVE +1816 MONGOLIAN DIGIT SIX +1817 MONGOLIAN DIGIT SEVEN +1818 MONGOLIAN DIGIT EIGHT +1819 MONGOLIAN DIGIT NINE +@ Basic letters +1820 MONGOLIAN LETTER A + x (cyrillic small letter a - 0430) +1821 MONGOLIAN LETTER E + x (cyrillic small letter e - 044D) +1822 MONGOLIAN LETTER I + x (cyrillic small letter i - 0438) +1823 MONGOLIAN LETTER O + x (cyrillic small letter o - 043E) +1824 MONGOLIAN LETTER U + x (cyrillic small letter u - 0443) +1825 MONGOLIAN LETTER OE + x (cyrillic small letter barred o - 04E9) +1826 MONGOLIAN LETTER UE + x (cyrillic small letter straight u - 04AF) +1827 MONGOLIAN LETTER EE +1828 MONGOLIAN LETTER NA + x (cyrillic small letter en - 043D) +1829 MONGOLIAN LETTER ANG +182A MONGOLIAN LETTER BA + x (cyrillic small letter be - 0431) +182B MONGOLIAN LETTER PA + x (cyrillic small letter pe - 043F) +182C MONGOLIAN LETTER QA + x (cyrillic small letter ha - 0445) +182D MONGOLIAN LETTER GA + x (cyrillic small letter ghe - 0433) +182E MONGOLIAN LETTER MA + x (cyrillic small letter em - 043C) +182F MONGOLIAN LETTER LA + x (cyrillic small letter el - 043B) +1830 MONGOLIAN LETTER SA + x (cyrillic small letter es - 0441) +1831 MONGOLIAN LETTER SHA + x (cyrillic small letter sha - 0448) +1832 MONGOLIAN LETTER TA + x (cyrillic small letter te - 0442) +1833 MONGOLIAN LETTER DA + x (cyrillic small letter de - 0434) +1834 MONGOLIAN LETTER CHA + x (cyrillic small letter che - 0447) +1835 MONGOLIAN LETTER JA + x (cyrillic small letter zhe - 0436) +1836 MONGOLIAN LETTER YA + x (cyrillic small letter short i - 0439) +1837 MONGOLIAN LETTER RA + x (cyrillic small letter er - 0440) +1838 MONGOLIAN LETTER WA + x (cyrillic small letter ve - 0432) +1839 MONGOLIAN LETTER FA + x (cyrillic small letter ef - 0444) +183A MONGOLIAN LETTER KA + x (cyrillic small letter ha - 0445) +183B MONGOLIAN LETTER KHA + x (cyrillic small letter ka - 043A) +183C MONGOLIAN LETTER TSA + x (cyrillic small letter tse - 0446) +183D MONGOLIAN LETTER ZA + x (cyrillic small letter ze - 0437) +183E MONGOLIAN LETTER HAA + x (cyrillic small letter ha - 0445) +183F MONGOLIAN LETTER ZRA + x (cyrillic small letter zhe - 0436) +1840 MONGOLIAN LETTER LHA +1841 MONGOLIAN LETTER ZHI +1842 MONGOLIAN LETTER CHI +@ Todo letters +1843 MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844 MONGOLIAN LETTER TODO E +1845 MONGOLIAN LETTER TODO I +1846 MONGOLIAN LETTER TODO O +1847 MONGOLIAN LETTER TODO U +1848 MONGOLIAN LETTER TODO OE +1849 MONGOLIAN LETTER TODO UE +184A MONGOLIAN LETTER TODO ANG +184B MONGOLIAN LETTER TODO BA +184C MONGOLIAN LETTER TODO PA +184D MONGOLIAN LETTER TODO QA +184E MONGOLIAN LETTER TODO GA +184F MONGOLIAN LETTER TODO MA +1850 MONGOLIAN LETTER TODO TA +1851 MONGOLIAN LETTER TODO DA +1852 MONGOLIAN LETTER TODO CHA +1853 MONGOLIAN LETTER TODO JA +1854 MONGOLIAN LETTER TODO TSA +1855 MONGOLIAN LETTER TODO YA +1856 MONGOLIAN LETTER TODO WA +1857 MONGOLIAN LETTER TODO KA +1858 MONGOLIAN LETTER TODO GAA +1859 MONGOLIAN LETTER TODO HAA +185A MONGOLIAN LETTER TODO JIA +185B MONGOLIAN LETTER TODO NIA +185C MONGOLIAN LETTER TODO DZA +@ Sibe letters +185D MONGOLIAN LETTER SIBE E +185E MONGOLIAN LETTER SIBE I +185F MONGOLIAN LETTER SIBE IY +1860 MONGOLIAN LETTER SIBE UE +1861 MONGOLIAN LETTER SIBE U +1862 MONGOLIAN LETTER SIBE ANG +1863 MONGOLIAN LETTER SIBE KA +1864 MONGOLIAN LETTER SIBE GA +1865 MONGOLIAN LETTER SIBE HA +1866 MONGOLIAN LETTER SIBE PA +1867 MONGOLIAN LETTER SIBE SHA +1868 MONGOLIAN LETTER SIBE TA +1869 MONGOLIAN LETTER SIBE DA +186A MONGOLIAN LETTER SIBE JA +186B MONGOLIAN LETTER SIBE FA +186C MONGOLIAN LETTER SIBE GAA +186D MONGOLIAN LETTER SIBE HAA +186E MONGOLIAN LETTER SIBE TSA +186F MONGOLIAN LETTER SIBE ZA +1870 MONGOLIAN LETTER SIBE RAA +1871 MONGOLIAN LETTER SIBE CHA +1872 MONGOLIAN LETTER SIBE ZHA +@ Manchu letters +1873 MONGOLIAN LETTER MANCHU I +1874 MONGOLIAN LETTER MANCHU KA +1875 MONGOLIAN LETTER MANCHU RA +1876 MONGOLIAN LETTER MANCHU FA +1877 MONGOLIAN LETTER MANCHU ZHA +@ Extensions for Sanskrit and Tibetan +1880 MONGOLIAN LETTER ALI GALI ANUSVARA ONE + x (tibetan sign sna ldan - 0F83) +1881 MONGOLIAN LETTER ALI GALI VISARGA ONE + x (tibetan sign rnam bcad - 0F7F) +1882 MONGOLIAN LETTER ALI GALI DAMARU + x (tibetan sign lce tsa can - 0F88) +1883 MONGOLIAN LETTER ALI GALI UBADAMA +1884 MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885 MONGOLIAN LETTER ALI GALI BALUDA + x (tibetan mark paluta - 0F85) +1886 MONGOLIAN LETTER ALI GALI THREE BALUDA +1887 MONGOLIAN LETTER ALI GALI A +1888 MONGOLIAN LETTER ALI GALI I +1889 MONGOLIAN LETTER ALI GALI KA +188A MONGOLIAN LETTER ALI GALI NGA +188B MONGOLIAN LETTER ALI GALI CA +188C MONGOLIAN LETTER ALI GALI TTA +188D MONGOLIAN LETTER ALI GALI TTHA +188E MONGOLIAN LETTER ALI GALI DDA +188F MONGOLIAN LETTER ALI GALI NNA +1890 MONGOLIAN LETTER ALI GALI TA +1891 MONGOLIAN LETTER ALI GALI DA +1892 MONGOLIAN LETTER ALI GALI PA +1893 MONGOLIAN LETTER ALI GALI PHA +1894 MONGOLIAN LETTER ALI GALI SSA +1895 MONGOLIAN LETTER ALI GALI ZHA +1896 MONGOLIAN LETTER ALI GALI ZA +1897 MONGOLIAN LETTER ALI GALI AH +1898 MONGOLIAN LETTER TODO ALI GALI TA +1899 MONGOLIAN LETTER TODO ALI GALI ZHA +189A MONGOLIAN LETTER MANCHU ALI GALI GHA +189B MONGOLIAN LETTER MANCHU ALI GALI NGA +189C MONGOLIAN LETTER MANCHU ALI GALI CA +189D MONGOLIAN LETTER MANCHU ALI GALI JHA +189E MONGOLIAN LETTER MANCHU ALI GALI TTA +189F MONGOLIAN LETTER MANCHU ALI GALI DDHA +18A0 MONGOLIAN LETTER MANCHU ALI GALI TA +18A1 MONGOLIAN LETTER MANCHU ALI GALI DHA +18A2 MONGOLIAN LETTER MANCHU ALI GALI SSA +18A3 MONGOLIAN LETTER MANCHU ALI GALI CYA +18A4 MONGOLIAN LETTER MANCHU ALI GALI ZHA +18A5 MONGOLIAN LETTER MANCHU ALI GALI ZA +18A6 MONGOLIAN LETTER ALI GALI HALF U +18A7 MONGOLIAN LETTER ALI GALI HALF YA +18A8 MONGOLIAN LETTER MANCHU ALI GALI BHA +18A9 MONGOLIAN LETTER ALI GALI DAGALGA +@@ 1900 Limbu 194F +@ Consonants +1900 LIMBU VOWEL-CARRIER LETTER +1901 LIMBU LETTER KA +1902 LIMBU LETTER KHA +1903 LIMBU LETTER GA +1904 LIMBU LETTER GHA +1905 LIMBU LETTER NGA +1906 LIMBU LETTER CA +1907 LIMBU LETTER CHA +1908 LIMBU LETTER JA +1909 LIMBU LETTER JHA +190A LIMBU LETTER YAN +190B LIMBU LETTER TA +190C LIMBU LETTER THA +190D LIMBU LETTER DA +190E LIMBU LETTER DHA +190F LIMBU LETTER NA +1910 LIMBU LETTER PA +1911 LIMBU LETTER PHA +1912 LIMBU LETTER BA +1913 LIMBU LETTER BHA +1914 LIMBU LETTER MA +1915 LIMBU LETTER YA +1916 LIMBU LETTER RA +1917 LIMBU LETTER LA +1918 LIMBU LETTER WA +1919 LIMBU LETTER SHA +191A LIMBU LETTER SSA +191B LIMBU LETTER SA +191C LIMBU LETTER HA +@ Dependent vowel signs +1920 LIMBU VOWEL SIGN A +1921 LIMBU VOWEL SIGN I +1922 LIMBU VOWEL SIGN U +1923 LIMBU VOWEL SIGN EE +1924 LIMBU VOWEL SIGN AI +1925 LIMBU VOWEL SIGN OO +1926 LIMBU VOWEL SIGN AU +1927 LIMBU VOWEL SIGN E +1928 LIMBU VOWEL SIGN O +@ Subjoined consonants +1929 LIMBU SUBJOINED LETTER YA +192A LIMBU SUBJOINED LETTER RA +192B LIMBU SUBJOINED LETTER WA +@ Final consonants +1930 LIMBU SMALL LETTER KA +1931 LIMBU SMALL LETTER NGA +1932 LIMBU SMALL LETTER ANUSVARA +1933 LIMBU SMALL LETTER TA +1934 LIMBU SMALL LETTER NA +1935 LIMBU SMALL LETTER PA +1936 LIMBU SMALL LETTER MA +1937 LIMBU SMALL LETTER RA +1938 LIMBU SMALL LETTER LA +@ Various signs +1939 LIMBU SIGN MUKPHRENG +193A LIMBU SIGN KEMPHRENG +193B LIMBU SIGN SA-I +1940 LIMBU SIGN LOO +1944 LIMBU EXCLAMATION MARK +1945 LIMBU QUESTION MARK +@ Digits +1946 LIMBU DIGIT ZERO +1947 LIMBU DIGIT ONE +1948 LIMBU DIGIT TWO +1949 LIMBU DIGIT THREE +194A LIMBU DIGIT FOUR +194B LIMBU DIGIT FIVE +194C LIMBU DIGIT SIX +194D LIMBU DIGIT SEVEN +194E LIMBU DIGIT EIGHT +194F LIMBU DIGIT NINE +@@ 1950 Tai Le 197F +@ Consonants +1950 TAI LE LETTER KA +1951 TAI LE LETTER XA +1952 TAI LE LETTER NGA +1953 TAI LE LETTER TSA +1954 TAI LE LETTER SA +1955 TAI LE LETTER YA +1956 TAI LE LETTER TA +1957 TAI LE LETTER THA +1958 TAI LE LETTER LA +1959 TAI LE LETTER PA +195A TAI LE LETTER PHA +195B TAI LE LETTER MA +195C TAI LE LETTER FA +195D TAI LE LETTER VA +195E TAI LE LETTER HA +195F TAI LE LETTER QA +1960 TAI LE LETTER KHA +1961 TAI LE LETTER TSHA +1962 TAI LE LETTER NA +@ Vowels +1963 TAI LE LETTER A +1964 TAI LE LETTER I +1965 TAI LE LETTER EE +1966 TAI LE LETTER EH +1967 TAI LE LETTER U +1968 TAI LE LETTER OO +1969 TAI LE LETTER O +196A TAI LE LETTER UE +196B TAI LE LETTER E +196C TAI LE LETTER AUE +196D TAI LE LETTER AI +@ Tone letters +1970 TAI LE LETTER TONE-2 +1971 TAI LE LETTER TONE-3 +1972 TAI LE LETTER TONE-4 +1973 TAI LE LETTER TONE-5 +1974 TAI LE LETTER TONE-6 +@@ 1980 New Tai Lue 19DF +@+ This script is also known as Xishuang Banna Dai. +@ Consonants +1980 NEW TAI LUE LETTER HIGH QA +1981 NEW TAI LUE LETTER LOW QA +1982 NEW TAI LUE LETTER HIGH KA +1983 NEW TAI LUE LETTER HIGH XA +1984 NEW TAI LUE LETTER HIGH NGA +1985 NEW TAI LUE LETTER LOW KA +1986 NEW TAI LUE LETTER LOW XA +1987 NEW TAI LUE LETTER LOW NGA +1988 NEW TAI LUE LETTER HIGH TSA +1989 NEW TAI LUE LETTER HIGH SA +198A NEW TAI LUE LETTER HIGH YA +198B NEW TAI LUE LETTER LOW TSA +198C NEW TAI LUE LETTER LOW SA +198D NEW TAI LUE LETTER LOW YA +198E NEW TAI LUE LETTER HIGH TA +198F NEW TAI LUE LETTER HIGH THA +1990 NEW TAI LUE LETTER HIGH NA +1991 NEW TAI LUE LETTER LOW TA +1992 NEW TAI LUE LETTER LOW THA +1993 NEW TAI LUE LETTER LOW NA +1994 NEW TAI LUE LETTER HIGH PA +1995 NEW TAI LUE LETTER HIGH PHA +1996 NEW TAI LUE LETTER HIGH MA +1997 NEW TAI LUE LETTER LOW PA +1998 NEW TAI LUE LETTER LOW PHA +1999 NEW TAI LUE LETTER LOW MA +199A NEW TAI LUE LETTER HIGH FA +199B NEW TAI LUE LETTER HIGH VA +199C NEW TAI LUE LETTER HIGH LA +199D NEW TAI LUE LETTER LOW FA +199E NEW TAI LUE LETTER LOW VA +199F NEW TAI LUE LETTER LOW LA +19A0 NEW TAI LUE LETTER HIGH HA +19A1 NEW TAI LUE LETTER HIGH DA +19A2 NEW TAI LUE LETTER HIGH BA +19A3 NEW TAI LUE LETTER LOW HA +19A4 NEW TAI LUE LETTER LOW DA +19A5 NEW TAI LUE LETTER LOW BA +19A6 NEW TAI LUE LETTER HIGH KVA +19A7 NEW TAI LUE LETTER HIGH XVA +19A8 NEW TAI LUE LETTER LOW KVA +19A9 NEW TAI LUE LETTER LOW XVA +@ Vowel signs +19B0 NEW TAI LUE VOWEL SIGN VOWEL SHORTENER +19B1 NEW TAI LUE VOWEL SIGN AA +19B2 NEW TAI LUE VOWEL SIGN II +19B3 NEW TAI LUE VOWEL SIGN U +19B4 NEW TAI LUE VOWEL SIGN UU +19B5 NEW TAI LUE VOWEL SIGN E +19B6 NEW TAI LUE VOWEL SIGN AE +19B7 NEW TAI LUE VOWEL SIGN O +19B8 NEW TAI LUE VOWEL SIGN OA +19B9 NEW TAI LUE VOWEL SIGN UE +19BA NEW TAI LUE VOWEL SIGN AY +19BB NEW TAI LUE VOWEL SIGN AAY +19BC NEW TAI LUE VOWEL SIGN UY +19BD NEW TAI LUE VOWEL SIGN OY +19BE NEW TAI LUE VOWEL SIGN OAY +19BF NEW TAI LUE VOWEL SIGN UEY +19C0 NEW TAI LUE VOWEL SIGN IY +@ Final consonants +19C1 NEW TAI LUE LETTER FINAL V +19C2 NEW TAI LUE LETTER FINAL NG +19C3 NEW TAI LUE LETTER FINAL N +19C4 NEW TAI LUE LETTER FINAL M +19C5 NEW TAI LUE LETTER FINAL K +19C6 NEW TAI LUE LETTER FINAL D +19C7 NEW TAI LUE LETTER FINAL B +@ Tone marks +19C8 NEW TAI LUE TONE MARK-1 +19C9 NEW TAI LUE TONE MARK-2 +@ Digits +19D0 NEW TAI LUE DIGIT ZERO +19D1 NEW TAI LUE DIGIT ONE +19D2 NEW TAI LUE DIGIT TWO +19D3 NEW TAI LUE DIGIT THREE +19D4 NEW TAI LUE DIGIT FOUR +19D5 NEW TAI LUE DIGIT FIVE +19D6 NEW TAI LUE DIGIT SIX +19D7 NEW TAI LUE DIGIT SEVEN +19D8 NEW TAI LUE DIGIT EIGHT +19D9 NEW TAI LUE DIGIT NINE +@ Various signs +19DE NEW TAI LUE SIGN LAE + * conjunction: and +19DF NEW TAI LUE SIGN LAEV + * perfective +@@ 19E0 Khmer Symbols 19FF +@ Lunar date symbols +19E0 KHMER SYMBOL PATHAMASAT + * represents the first August in a leap year +@+ The following fifteen characters represent the first through the fifteenth waxing days, respectively. +19E1 KHMER SYMBOL MUOY KOET +19E2 KHMER SYMBOL PII KOET +19E3 KHMER SYMBOL BEI KOET +19E4 KHMER SYMBOL BUON KOET +19E5 KHMER SYMBOL PRAM KOET +19E6 KHMER SYMBOL PRAM-MUOY KOET +19E7 KHMER SYMBOL PRAM-PII KOET +19E8 KHMER SYMBOL PRAM-BEI KOET +19E9 KHMER SYMBOL PRAM-BUON KOET +19EA KHMER SYMBOL DAP KOET +19EB KHMER SYMBOL DAP-MUOY KOET +19EC KHMER SYMBOL DAP-PII KOET +19ED KHMER SYMBOL DAP-BEI KOET +19EE KHMER SYMBOL DAP-BUON KOET +19EF KHMER SYMBOL DAP-PRAM KOET +19F0 KHMER SYMBOL TUTEYASAT + * represents the second August in a leap year +@+ The following fifteen characters represent the first through the fifteenth waning days, respectively. +19F1 KHMER SYMBOL MUOY ROC +19F2 KHMER SYMBOL PII ROC +19F3 KHMER SYMBOL BEI ROC +19F4 KHMER SYMBOL BUON ROC +19F5 KHMER SYMBOL PRAM ROC +19F6 KHMER SYMBOL PRAM-MUOY ROC +19F7 KHMER SYMBOL PRAM-PII ROC +19F8 KHMER SYMBOL PRAM-BEI ROC +19F9 KHMER SYMBOL PRAM-BUON ROC +19FA KHMER SYMBOL DAP ROC +19FB KHMER SYMBOL DAP-MUOY ROC +19FC KHMER SYMBOL DAP-PII ROC +19FD KHMER SYMBOL DAP-BEI ROC +19FE KHMER SYMBOL DAP-BUON ROC +19FF KHMER SYMBOL DAP-PRAM ROC +@@ 1A00 Buginese 1A1F +@+ This script is also known as Lontara. +@ Consonants +1A00 BUGINESE LETTER KA +1A01 BUGINESE LETTER GA +1A02 BUGINESE LETTER NGA +1A03 BUGINESE LETTER NGKA +1A04 BUGINESE LETTER PA +1A05 BUGINESE LETTER BA +1A06 BUGINESE LETTER MA +1A07 BUGINESE LETTER MPA +1A08 BUGINESE LETTER TA +1A09 BUGINESE LETTER DA +1A0A BUGINESE LETTER NA +1A0B BUGINESE LETTER NRA +1A0C BUGINESE LETTER CA +1A0D BUGINESE LETTER JA +1A0E BUGINESE LETTER NYA +1A0F BUGINESE LETTER NYCA +1A10 BUGINESE LETTER YA +1A11 BUGINESE LETTER RA +1A12 BUGINESE LETTER LA +1A13 BUGINESE LETTER VA +1A14 BUGINESE LETTER SA +1A15 BUGINESE LETTER A +1A16 BUGINESE LETTER HA +@ Vowels +1A17 BUGINESE VOWEL SIGN I +1A18 BUGINESE VOWEL SIGN U +1A19 BUGINESE VOWEL SIGN E +1A1A BUGINESE VOWEL SIGN O +1A1B BUGINESE VOWEL SIGN AE +@ Various signs +1A1E BUGINESE PALLAWA +1A1F BUGINESE END OF SECTION +@@ 1D00 Phonetic Extensions 1D7F +@+ These are non-IPA phonetic extensions, mostly for the Uralic Phonetic Alphabet (UPA). +@+ The small capitals, superscript, and subscript forms are for phonetic representations where style variations are semantically important. +@+ For general text, use regular Latin, Greek or Cyrillic letters with markup instead. +@ Latin letters +1D00 LATIN LETTER SMALL CAPITAL A +1D01 LATIN LETTER SMALL CAPITAL AE +1D02 LATIN SMALL LETTER TURNED AE + * glyph can also have sideways orientation +1D03 LATIN LETTER SMALL CAPITAL BARRED B +1D04 LATIN LETTER SMALL CAPITAL C +1D05 LATIN LETTER SMALL CAPITAL D +1D06 LATIN LETTER SMALL CAPITAL ETH +1D07 LATIN LETTER SMALL CAPITAL E +1D08 LATIN SMALL LETTER TURNED OPEN E +1D09 LATIN SMALL LETTER TURNED I +1D0A LATIN LETTER SMALL CAPITAL J +1D0B LATIN LETTER SMALL CAPITAL K +1D0C LATIN LETTER SMALL CAPITAL L WITH STROKE +1D0D LATIN LETTER SMALL CAPITAL M +1D0E LATIN LETTER SMALL CAPITAL REVERSED N +1D0F LATIN LETTER SMALL CAPITAL O +1D10 LATIN LETTER SMALL CAPITAL OPEN O +1D11 LATIN SMALL LETTER SIDEWAYS O +1D12 LATIN SMALL LETTER SIDEWAYS OPEN O +1D13 LATIN SMALL LETTER SIDEWAYS O WITH STROKE +1D14 LATIN SMALL LETTER TURNED OE + * glyph can also have sideways orientation +1D15 LATIN LETTER SMALL CAPITAL OU +1D16 LATIN SMALL LETTER TOP HALF O +1D17 LATIN SMALL LETTER BOTTOM HALF O +1D18 LATIN LETTER SMALL CAPITAL P + * represents a semi-voiced [p] +1D19 LATIN LETTER SMALL CAPITAL REVERSED R +1D1A LATIN LETTER SMALL CAPITAL TURNED R +1D1B LATIN LETTER SMALL CAPITAL T +1D1C LATIN LETTER SMALL CAPITAL U +1D1D LATIN SMALL LETTER SIDEWAYS U +1D1E LATIN SMALL LETTER SIDEWAYS DIAERESIZED U + * glyph can also have turned orientation +1D1F LATIN SMALL LETTER SIDEWAYS TURNED M +1D20 LATIN LETTER SMALL CAPITAL V +1D21 LATIN LETTER SMALL CAPITAL W +1D22 LATIN LETTER SMALL CAPITAL Z +1D23 LATIN LETTER SMALL CAPITAL EZH +1D24 LATIN LETTER VOICED LARYNGEAL SPIRANT +1D25 LATIN LETTER AIN +@ Greek letters +1D26 GREEK LETTER SMALL CAPITAL GAMMA +1D27 GREEK LETTER SMALL CAPITAL LAMDA +1D28 GREEK LETTER SMALL CAPITAL PI +1D29 GREEK LETTER SMALL CAPITAL RHO + * represents a voiceless uvular trill +1D2A GREEK LETTER SMALL CAPITAL PSI +@ Cyrillic letter +1D2B CYRILLIC LETTER SMALL CAPITAL EL + * in italic style, the glyph is obliqued, not italicized + x (cyrillic small letter el - 043B) +@ Latin superscript modifier letters +1D2C MODIFIER LETTER CAPITAL A + # <super> 0041 +1D2D MODIFIER LETTER CAPITAL AE + # <super> 00C6 +1D2E MODIFIER LETTER CAPITAL B + # <super> 0042 +1D2F MODIFIER LETTER CAPITAL BARRED B +1D30 MODIFIER LETTER CAPITAL D + # <super> 0044 +1D31 MODIFIER LETTER CAPITAL E + # <super> 0045 +1D32 MODIFIER LETTER CAPITAL REVERSED E + # <super> 018E +1D33 MODIFIER LETTER CAPITAL G + # <super> 0047 +1D34 MODIFIER LETTER CAPITAL H + # <super> 0048 +1D35 MODIFIER LETTER CAPITAL I + # <super> 0049 +1D36 MODIFIER LETTER CAPITAL J + # <super> 004A +1D37 MODIFIER LETTER CAPITAL K + # <super> 004B +1D38 MODIFIER LETTER CAPITAL L + # <super> 004C +1D39 MODIFIER LETTER CAPITAL M + # <super> 004D +1D3A MODIFIER LETTER CAPITAL N + # <super> 004E +1D3B MODIFIER LETTER CAPITAL REVERSED N +1D3C MODIFIER LETTER CAPITAL O + # <super> 004F +1D3D MODIFIER LETTER CAPITAL OU + # <super> 0222 +1D3E MODIFIER LETTER CAPITAL P + # <super> 0050 +1D3F MODIFIER LETTER CAPITAL R + # <super> 0052 +1D40 MODIFIER LETTER CAPITAL T + # <super> 0054 +1D41 MODIFIER LETTER CAPITAL U + # <super> 0055 +1D42 MODIFIER LETTER CAPITAL W + # <super> 0057 +1D43 MODIFIER LETTER SMALL A + # <super> 0061 +1D44 MODIFIER LETTER SMALL TURNED A + # <super> 0250 +1D45 MODIFIER LETTER SMALL ALPHA + # <super> 0251 +1D46 MODIFIER LETTER SMALL TURNED AE + # <super> 1D02 +1D47 MODIFIER LETTER SMALL B + # <super> 0062 +1D48 MODIFIER LETTER SMALL D + # <super> 0064 +1D49 MODIFIER LETTER SMALL E + # <super> 0065 +1D4A MODIFIER LETTER SMALL SCHWA + # <super> 0259 +1D4B MODIFIER LETTER SMALL OPEN E + # <super> 025B +1D4C MODIFIER LETTER SMALL TURNED OPEN E + * more appropriate equivalence would be to 1D08 + # <super> 025C +1D4D MODIFIER LETTER SMALL G + # <super> 0067 +1D4E MODIFIER LETTER SMALL TURNED I +1D4F MODIFIER LETTER SMALL K + # <super> 006B +1D50 MODIFIER LETTER SMALL M + # <super> 006D +1D51 MODIFIER LETTER SMALL ENG + # <super> 014B +1D52 MODIFIER LETTER SMALL O + # <super> 006F +1D53 MODIFIER LETTER SMALL OPEN O + # <super> 0254 +1D54 MODIFIER LETTER SMALL TOP HALF O + # <super> 1D16 +1D55 MODIFIER LETTER SMALL BOTTOM HALF O + # <super> 1D17 +1D56 MODIFIER LETTER SMALL P + # <super> 0070 +1D57 MODIFIER LETTER SMALL T + # <super> 0074 +1D58 MODIFIER LETTER SMALL U + # <super> 0075 +1D59 MODIFIER LETTER SMALL SIDEWAYS U + # <super> 1D1D +1D5A MODIFIER LETTER SMALL TURNED M + # <super> 026F +1D5B MODIFIER LETTER SMALL V + # <super> 0076 +1D5C MODIFIER LETTER SMALL AIN + # <super> 1D25 +@ Greek superscript modifier letters +1D5D MODIFIER LETTER SMALL BETA + # <super> 03B2 +1D5E MODIFIER LETTER SMALL GREEK GAMMA + # <super> 03B3 +1D5F MODIFIER LETTER SMALL DELTA + # <super> 03B4 +1D60 MODIFIER LETTER SMALL GREEK PHI + # <super> 03C6 +1D61 MODIFIER LETTER SMALL CHI + # <super> 03C7 +@ Latin subscript modifier letters +1D62 LATIN SUBSCRIPT SMALL LETTER I + # <sub> 0069 +1D63 LATIN SUBSCRIPT SMALL LETTER R + # <sub> 0072 +1D64 LATIN SUBSCRIPT SMALL LETTER U + # <sub> 0075 +1D65 LATIN SUBSCRIPT SMALL LETTER V + # <sub> 0076 +@ Greek subscript modifier letters +1D66 GREEK SUBSCRIPT SMALL LETTER BETA + # <sub> 03B2 +1D67 GREEK SUBSCRIPT SMALL LETTER GAMMA + # <sub> 03B3 +1D68 GREEK SUBSCRIPT SMALL LETTER RHO + # <sub> 03C1 +1D69 GREEK SUBSCRIPT SMALL LETTER PHI + # <sub> 03C6 +1D6A GREEK SUBSCRIPT SMALL LETTER CHI + # <sub> 03C7 +@ Latin letter +1D6B LATIN SMALL LETTER UE +@ Latin letters with middle tilde +@+ An additional letter with middle tilde is found in another block. + x (latin small letter l with middle tilde - 026B) +1D6C LATIN SMALL LETTER B WITH MIDDLE TILDE +1D6D LATIN SMALL LETTER D WITH MIDDLE TILDE +1D6E LATIN SMALL LETTER F WITH MIDDLE TILDE +1D6F LATIN SMALL LETTER M WITH MIDDLE TILDE +1D70 LATIN SMALL LETTER N WITH MIDDLE TILDE +1D71 LATIN SMALL LETTER P WITH MIDDLE TILDE +1D72 LATIN SMALL LETTER R WITH MIDDLE TILDE +1D73 LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE +1D74 LATIN SMALL LETTER S WITH MIDDLE TILDE +1D75 LATIN SMALL LETTER T WITH MIDDLE TILDE +1D76 LATIN SMALL LETTER Z WITH MIDDLE TILDE +@ Caucasian linguistics +1D77 LATIN SMALL LETTER TURNED G + * Georgian transcription + x (georgian letter turned gan - 10F9) +1D78 MODIFIER LETTER CYRILLIC EN + # <super> 043D +@ Other phonetic symbols +1D79 LATIN SMALL LETTER INSULAR G + * older Irish phonetic notation + x (latin small letter g - 0067) + x (latin small letter script g - 0261) + x (latin small letter gamma - 0263) +1D7A LATIN SMALL LETTER TH WITH STRIKETHROUGH + * American dictionary usage + x (greek small letter theta - 03B8) +1D7B LATIN SMALL CAPITAL LETTER I WITH STROKE + * used with different meanings by Americanists and Oxford dictionaries +1D7C LATIN SMALL LETTER IOTA WITH STROKE + * used by Russianists +1D7D LATIN SMALL LETTER P WITH STROKE + * used by Americanists +1D7E LATIN SMALL CAPITAL LETTER U WITH STROKE + * used by Americanists +1D7F LATIN SMALL LETTER UPSILON WITH STROKE + * used by Americanists and Oxford dictionaries +@@ 1D80 Phonetic Extensions Supplement 1DBF +@ Latin letters with palatal hook +@+ An additional letter with palatal hook is found in another block. + x (latin small letter t with palatal hook - 01AB) +1D80 LATIN SMALL LETTER B WITH PALATAL HOOK +1D81 LATIN SMALL LETTER D WITH PALATAL HOOK +1D82 LATIN SMALL LETTER F WITH PALATAL HOOK +1D83 LATIN SMALL LETTER G WITH PALATAL HOOK +1D84 LATIN SMALL LETTER K WITH PALATAL HOOK +1D85 LATIN SMALL LETTER L WITH PALATAL HOOK +1D86 LATIN SMALL LETTER M WITH PALATAL HOOK +1D87 LATIN SMALL LETTER N WITH PALATAL HOOK +1D88 LATIN SMALL LETTER P WITH PALATAL HOOK +1D89 LATIN SMALL LETTER R WITH PALATAL HOOK +1D8A LATIN SMALL LETTER S WITH PALATAL HOOK +1D8B LATIN SMALL LETTER ESH WITH PALATAL HOOK +1D8C LATIN SMALL LETTER V WITH PALATAL HOOK +1D8D LATIN SMALL LETTER X WITH PALATAL HOOK +1D8E LATIN SMALL LETTER Z WITH PALATAL HOOK +@ Latin letters with retroflex hook +@+ IPA recommends transcribing vowels with r-coloring (rhoticity) with the rhotic hook instead. + x (modifier letter rhotic hook - 02DE) +@+ Additional letters with retroflex hook are found in other blocks. + x (latin capital letter t with retroflex hook - 01AE) + x (latin small letter d with tail - 0256) + x (latin small letter l with retroflex hook - 026D) + x (latin small letter n with retroflex hook - 0273) + x (latin small letter turned r with hook - 027B) + x (latin small letter r with tail - 027D) + x (latin small letter s with hook - 0282) + x (latin small letter squat reversed esh - 0285) + x (latin small letter t with retroflex hook - 0288) + x (latin small letter z with retroflex hook - 0290) + x (latin small letter turned h with fishhook and tail - 02AF) +1D8F LATIN SMALL LETTER A WITH RETROFLEX HOOK +1D90 LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK +1D91 LATIN SMALL LETTER D WITH HOOK AND TAIL +1D92 LATIN SMALL LETTER E WITH RETROFLEX HOOK +1D93 LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK +1D94 LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK + x (latin small letter reversed open e with hook - 025D) +1D95 LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK + x (latin small letter schwa with hook - 025A) +1D96 LATIN SMALL LETTER I WITH RETROFLEX HOOK +1D97 LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK +1D98 LATIN SMALL LETTER ESH WITH RETROFLEX HOOK +1D99 LATIN SMALL LETTER U WITH RETROFLEX HOOK +1D9A LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +@ Modifier letters +@+ Other modifier letters can be found in the Spacing Modifer Letters, Phonetic Extensions, as well as Superscripts and Subscripts blocks. +1D9B MODIFIER LETTER SMALL TURNED ALPHA + # <super> 0252 +1D9C MODIFIER LETTER SMALL C + # <super> 0063 +1D9D MODIFIER LETTER SMALL C WITH CURL + # <super> 0255 +1D9E MODIFIER LETTER SMALL ETH + # <super> 00F0 +1D9F MODIFIER LETTER SMALL REVERSED OPEN E + # <super> 025C +1DA0 MODIFIER LETTER SMALL F + # <super> 0066 +1DA1 MODIFIER LETTER SMALL DOTLESS J WITH STROKE + # <super> 025F +1DA2 MODIFIER LETTER SMALL SCRIPT G + # <super> 0261 +1DA3 MODIFIER LETTER SMALL TURNED H + # <super> 0265 +1DA4 MODIFIER LETTER SMALL I WITH STROKE + # <super> 0268 +1DA5 MODIFIER LETTER SMALL IOTA + # <super> 0269 +1DA6 MODIFIER LETTER SMALL CAPITAL I + # <super> 026A +1DA7 MODIFIER LETTER SMALL CAPITAL I WITH STROKE + # <super> 1D7B +1DA8 MODIFIER LETTER SMALL J WITH CROSSED-TAIL + # <super> 029D +1DA9 MODIFIER LETTER SMALL L WITH RETROFLEX HOOK + # <super> 026D +1DAA MODIFIER LETTER SMALL L WITH PALATAL HOOK + # <super> 1D85 +1DAB MODIFIER LETTER SMALL CAPITAL L + # <super> 029F +1DAC MODIFIER LETTER SMALL M WITH HOOK + # <super> 0271 +1DAD MODIFIER LETTER SMALL TURNED M WITH LONG LEG + # <super> 0270 +1DAE MODIFIER LETTER SMALL N WITH LEFT HOOK + # <super> 0272 +1DAF MODIFIER LETTER SMALL N WITH RETROFLEX HOOK + # <super> 0273 +1DB0 MODIFIER LETTER SMALL CAPITAL N + # <super> 0274 +1DB1 MODIFIER LETTER SMALL BARRED O + # <super> 0275 +1DB2 MODIFIER LETTER SMALL PHI + # <super> 0278 +1DB3 MODIFIER LETTER SMALL S WITH HOOK + # <super> 0282 +1DB4 MODIFIER LETTER SMALL ESH + # <super> 0283 +1DB5 MODIFIER LETTER SMALL T WITH PALATAL HOOK + # <super> 01AB +1DB6 MODIFIER LETTER SMALL U BAR + # <super> 0289 +1DB7 MODIFIER LETTER SMALL UPSILON + # <super> 028A +1DB8 MODIFIER LETTER SMALL CAPITAL U + # <super> 1D1C +1DB9 MODIFIER LETTER SMALL V WITH HOOK + # <super> 028B +1DBA MODIFIER LETTER SMALL TURNED V + # <super> 028C +1DBB MODIFIER LETTER SMALL Z + # <super> 007A +1DBC MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK + # <super> 0290 +1DBD MODIFIER LETTER SMALL Z WITH CURL + # <super> 0291 +1DBE MODIFIER LETTER SMALL EZH + # <super> 0292 +1DBF MODIFIER LETTER SMALL THETA + # <super> 03B8 +@@ 1DC0 Combining Diacritical Marks Supplement 1DFF +@ Used for Ancient Greek +1DC0 COMBINING DOTTED GRAVE ACCENT + x (greek dialytika and varia - 1FED) +1DC1 COMBINING DOTTED ACUTE ACCENT + x (combining greek dialytika tonos - 0344) + x (greek dialytika and oxia - 1FEE) +@ Miscellaneous marks +1DC2 COMBINING SNAKE BELOW +1DC3 COMBINING SUSPENSION MARK + * Glagolitic + x (combining breve - 0306) +@@ 1E00 Latin Extended Additional 1EFF +@+ In this block the names "WITH LINE BELOW" refer to a macron below the letter. +@ Latin general use extensions +1E00 LATIN CAPITAL LETTER A WITH RING BELOW + : 0041 0325 +1E01 LATIN SMALL LETTER A WITH RING BELOW + : 0061 0325 +1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE + : 0042 0307 +1E03 LATIN SMALL LETTER B WITH DOT ABOVE + * Irish Gaelic (old orthography) + : 0062 0307 +1E04 LATIN CAPITAL LETTER B WITH DOT BELOW + : 0042 0323 +1E05 LATIN SMALL LETTER B WITH DOT BELOW + : 0062 0323 +1E06 LATIN CAPITAL LETTER B WITH LINE BELOW + : 0042 0331 +1E07 LATIN SMALL LETTER B WITH LINE BELOW + : 0062 0331 +1E08 LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + : 00C7 0301 +1E09 LATIN SMALL LETTER C WITH CEDILLA AND ACUTE + : 00E7 0301 +1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE + : 0044 0307 +1E0B LATIN SMALL LETTER D WITH DOT ABOVE + * Irish Gaelic (old orthography) + : 0064 0307 +1E0C LATIN CAPITAL LETTER D WITH DOT BELOW + : 0044 0323 +1E0D LATIN SMALL LETTER D WITH DOT BELOW + * Indic transliteration + : 0064 0323 +1E0E LATIN CAPITAL LETTER D WITH LINE BELOW + : 0044 0331 +1E0F LATIN SMALL LETTER D WITH LINE BELOW + : 0064 0331 +1E10 LATIN CAPITAL LETTER D WITH CEDILLA + : 0044 0327 +1E11 LATIN SMALL LETTER D WITH CEDILLA + * Livonian + : 0064 0327 +1E12 LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW + : 0044 032D +1E13 LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW + : 0064 032D +1E14 LATIN CAPITAL LETTER E WITH MACRON AND GRAVE + : 0112 0300 +1E15 LATIN SMALL LETTER E WITH MACRON AND GRAVE + : 0113 0300 +1E16 LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + : 0112 0301 +1E17 LATIN SMALL LETTER E WITH MACRON AND ACUTE + : 0113 0301 +1E18 LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW + : 0045 032D +1E19 LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW + : 0065 032D +1E1A LATIN CAPITAL LETTER E WITH TILDE BELOW + : 0045 0330 +1E1B LATIN SMALL LETTER E WITH TILDE BELOW + : 0065 0330 +1E1C LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + : 0228 0306 +1E1D LATIN SMALL LETTER E WITH CEDILLA AND BREVE + : 0229 0306 +1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE + : 0046 0307 +1E1F LATIN SMALL LETTER F WITH DOT ABOVE + * Irish Gaelic (old orthography) + : 0066 0307 +1E20 LATIN CAPITAL LETTER G WITH MACRON + : 0047 0304 +1E21 LATIN SMALL LETTER G WITH MACRON + : 0067 0304 +1E22 LATIN CAPITAL LETTER H WITH DOT ABOVE + : 0048 0307 +1E23 LATIN SMALL LETTER H WITH DOT ABOVE + : 0068 0307 +1E24 LATIN CAPITAL LETTER H WITH DOT BELOW + : 0048 0323 +1E25 LATIN SMALL LETTER H WITH DOT BELOW + * Indic transliteration + : 0068 0323 +1E26 LATIN CAPITAL LETTER H WITH DIAERESIS + : 0048 0308 +1E27 LATIN SMALL LETTER H WITH DIAERESIS + : 0068 0308 +1E28 LATIN CAPITAL LETTER H WITH CEDILLA + : 0048 0327 +1E29 LATIN SMALL LETTER H WITH CEDILLA + : 0068 0327 +1E2A LATIN CAPITAL LETTER H WITH BREVE BELOW + : 0048 032E +1E2B LATIN SMALL LETTER H WITH BREVE BELOW + * Semitic transliteration + : 0068 032E +1E2C LATIN CAPITAL LETTER I WITH TILDE BELOW + : 0049 0330 +1E2D LATIN SMALL LETTER I WITH TILDE BELOW + : 0069 0330 +1E2E LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE + : 00CF 0301 +1E2F LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE + : 00EF 0301 +1E30 LATIN CAPITAL LETTER K WITH ACUTE + : 004B 0301 +1E31 LATIN SMALL LETTER K WITH ACUTE + * Macedonian transliteration + : 006B 0301 +1E32 LATIN CAPITAL LETTER K WITH DOT BELOW + : 004B 0323 +1E33 LATIN SMALL LETTER K WITH DOT BELOW + : 006B 0323 +1E34 LATIN CAPITAL LETTER K WITH LINE BELOW + : 004B 0331 +1E35 LATIN SMALL LETTER K WITH LINE BELOW + : 006B 0331 +1E36 LATIN CAPITAL LETTER L WITH DOT BELOW + : 004C 0323 +1E37 LATIN SMALL LETTER L WITH DOT BELOW + * Indic transliteration + : 006C 0323 +1E38 LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON + : 1E36 0304 +1E39 LATIN SMALL LETTER L WITH DOT BELOW AND MACRON + * Indic transliteration + : 1E37 0304 +1E3A LATIN CAPITAL LETTER L WITH LINE BELOW + : 004C 0331 +1E3B LATIN SMALL LETTER L WITH LINE BELOW + * Indic transliteration + : 006C 0331 +1E3C LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW + : 004C 032D +1E3D LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW + : 006C 032D +1E3E LATIN CAPITAL LETTER M WITH ACUTE + : 004D 0301 +1E3F LATIN SMALL LETTER M WITH ACUTE + : 006D 0301 +1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE + : 004D 0307 +1E41 LATIN SMALL LETTER M WITH DOT ABOVE + * Irish Gaelic (old orthography) + : 006D 0307 +1E42 LATIN CAPITAL LETTER M WITH DOT BELOW + : 004D 0323 +1E43 LATIN SMALL LETTER M WITH DOT BELOW + * Indic transliteration + : 006D 0323 +1E44 LATIN CAPITAL LETTER N WITH DOT ABOVE + : 004E 0307 +1E45 LATIN SMALL LETTER N WITH DOT ABOVE + * Indic transliteration + : 006E 0307 +1E46 LATIN CAPITAL LETTER N WITH DOT BELOW + : 004E 0323 +1E47 LATIN SMALL LETTER N WITH DOT BELOW + * Indic transliteration + : 006E 0323 +1E48 LATIN CAPITAL LETTER N WITH LINE BELOW + : 004E 0331 +1E49 LATIN SMALL LETTER N WITH LINE BELOW + * Indic transliteration + : 006E 0331 +1E4A LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW + : 004E 032D +1E4B LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW + : 006E 032D +1E4C LATIN CAPITAL LETTER O WITH TILDE AND ACUTE + : 00D5 0301 +1E4D LATIN SMALL LETTER O WITH TILDE AND ACUTE + : 00F5 0301 +1E4E LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS + : 00D5 0308 +1E4F LATIN SMALL LETTER O WITH TILDE AND DIAERESIS + : 00F5 0308 +1E50 LATIN CAPITAL LETTER O WITH MACRON AND GRAVE + : 014C 0300 +1E51 LATIN SMALL LETTER O WITH MACRON AND GRAVE + : 014D 0300 +1E52 LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + : 014C 0301 +1E53 LATIN SMALL LETTER O WITH MACRON AND ACUTE + : 014D 0301 +1E54 LATIN CAPITAL LETTER P WITH ACUTE + : 0050 0301 +1E55 LATIN SMALL LETTER P WITH ACUTE + : 0070 0301 +1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE + : 0050 0307 +1E57 LATIN SMALL LETTER P WITH DOT ABOVE + * Irish Gaelic (old orthography) + : 0070 0307 +1E58 LATIN CAPITAL LETTER R WITH DOT ABOVE + : 0052 0307 +1E59 LATIN SMALL LETTER R WITH DOT ABOVE + : 0072 0307 +1E5A LATIN CAPITAL LETTER R WITH DOT BELOW + : 0052 0323 +1E5B LATIN SMALL LETTER R WITH DOT BELOW + * Indic transliteration + : 0072 0323 +1E5C LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON + : 1E5A 0304 +1E5D LATIN SMALL LETTER R WITH DOT BELOW AND MACRON + * Indic transliteration + : 1E5B 0304 +1E5E LATIN CAPITAL LETTER R WITH LINE BELOW + : 0052 0331 +1E5F LATIN SMALL LETTER R WITH LINE BELOW + * Indic transliteration + : 0072 0331 +1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE + : 0053 0307 +1E61 LATIN SMALL LETTER S WITH DOT ABOVE + * Irish Gaelic (old orthography) + : 0073 0307 +1E62 LATIN CAPITAL LETTER S WITH DOT BELOW + : 0053 0323 +1E63 LATIN SMALL LETTER S WITH DOT BELOW + * Indic transliteration + : 0073 0323 +1E64 LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE + : 015A 0307 +1E65 LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE + : 015B 0307 +1E66 LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE + : 0160 0307 +1E67 LATIN SMALL LETTER S WITH CARON AND DOT ABOVE + : 0161 0307 +1E68 LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE + : 1E62 0307 +1E69 LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE + : 1E63 0307 +1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE + : 0054 0307 +1E6B LATIN SMALL LETTER T WITH DOT ABOVE + * Irish Gaelic (old orthography) + : 0074 0307 +1E6C LATIN CAPITAL LETTER T WITH DOT BELOW + : 0054 0323 +1E6D LATIN SMALL LETTER T WITH DOT BELOW + * Indic transliteration + : 0074 0323 +1E6E LATIN CAPITAL LETTER T WITH LINE BELOW + : 0054 0331 +1E6F LATIN SMALL LETTER T WITH LINE BELOW + * Semitic transliteration + : 0074 0331 +1E70 LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW + : 0054 032D +1E71 LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW + : 0074 032D +1E72 LATIN CAPITAL LETTER U WITH DIAERESIS BELOW + : 0055 0324 +1E73 LATIN SMALL LETTER U WITH DIAERESIS BELOW + : 0075 0324 +1E74 LATIN CAPITAL LETTER U WITH TILDE BELOW + : 0055 0330 +1E75 LATIN SMALL LETTER U WITH TILDE BELOW + : 0075 0330 +1E76 LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW + : 0055 032D +1E77 LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW + : 0075 032D +1E78 LATIN CAPITAL LETTER U WITH TILDE AND ACUTE + : 0168 0301 +1E79 LATIN SMALL LETTER U WITH TILDE AND ACUTE + : 0169 0301 +1E7A LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS + : 016A 0308 +1E7B LATIN SMALL LETTER U WITH MACRON AND DIAERESIS + : 016B 0308 +1E7C LATIN CAPITAL LETTER V WITH TILDE + : 0056 0303 +1E7D LATIN SMALL LETTER V WITH TILDE + : 0076 0303 +1E7E LATIN CAPITAL LETTER V WITH DOT BELOW + : 0056 0323 +1E7F LATIN SMALL LETTER V WITH DOT BELOW + : 0076 0323 +1E80 LATIN CAPITAL LETTER W WITH GRAVE + : 0057 0300 +1E81 LATIN SMALL LETTER W WITH GRAVE + * Welsh + : 0077 0300 +1E82 LATIN CAPITAL LETTER W WITH ACUTE + : 0057 0301 +1E83 LATIN SMALL LETTER W WITH ACUTE + * Welsh + : 0077 0301 +1E84 LATIN CAPITAL LETTER W WITH DIAERESIS + : 0057 0308 +1E85 LATIN SMALL LETTER W WITH DIAERESIS + * Welsh + : 0077 0308 +1E86 LATIN CAPITAL LETTER W WITH DOT ABOVE + : 0057 0307 +1E87 LATIN SMALL LETTER W WITH DOT ABOVE + : 0077 0307 +1E88 LATIN CAPITAL LETTER W WITH DOT BELOW + : 0057 0323 +1E89 LATIN SMALL LETTER W WITH DOT BELOW + : 0077 0323 +1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE + : 0058 0307 +1E8B LATIN SMALL LETTER X WITH DOT ABOVE + : 0078 0307 +1E8C LATIN CAPITAL LETTER X WITH DIAERESIS + : 0058 0308 +1E8D LATIN SMALL LETTER X WITH DIAERESIS + : 0078 0308 +1E8E LATIN CAPITAL LETTER Y WITH DOT ABOVE + : 0059 0307 +1E8F LATIN SMALL LETTER Y WITH DOT ABOVE + : 0079 0307 +1E90 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX + : 005A 0302 +1E91 LATIN SMALL LETTER Z WITH CIRCUMFLEX + : 007A 0302 +1E92 LATIN CAPITAL LETTER Z WITH DOT BELOW + : 005A 0323 +1E93 LATIN SMALL LETTER Z WITH DOT BELOW + * Indic transliteration + : 007A 0323 +1E94 LATIN CAPITAL LETTER Z WITH LINE BELOW + : 005A 0331 +1E95 LATIN SMALL LETTER Z WITH LINE BELOW + * Semitic transliteration + : 007A 0331 +1E96 LATIN SMALL LETTER H WITH LINE BELOW + * Semitic transliteration + : 0068 0331 +1E97 LATIN SMALL LETTER T WITH DIAERESIS + : 0074 0308 +1E98 LATIN SMALL LETTER W WITH RING ABOVE + : 0077 030A +1E99 LATIN SMALL LETTER Y WITH RING ABOVE + : 0079 030A +1E9A LATIN SMALL LETTER A WITH RIGHT HALF RING + # 0061 02BE +1E9B LATIN SMALL LETTER LONG S WITH DOT ABOVE + * in current use in Gaelic types (as glyph variant of 1E61) + : 017F 0307 +@ Latin extensions for Vietnamese +1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW + : 0041 0323 +1EA1 LATIN SMALL LETTER A WITH DOT BELOW + : 0061 0323 +1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE + : 0041 0309 +1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE + : 0061 0309 +1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE + : 00C2 0301 +1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE + : 00E2 0301 +1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE + : 00C2 0300 +1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE + : 00E2 0300 +1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : 00C2 0309 +1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : 00E2 0309 +1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE + : 00C2 0303 +1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE + : 00E2 0303 +1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : 1EA0 0302 +1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : 1EA1 0302 +1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + : 0102 0301 +1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE + : 0103 0301 +1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE + : 0102 0300 +1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE + : 0103 0300 +1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE + : 0102 0309 +1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE + : 0103 0309 +1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE + : 0102 0303 +1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE + : 0103 0303 +1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW + : 1EA0 0306 +1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW + : 1EA1 0306 +1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW + : 0045 0323 +1EB9 LATIN SMALL LETTER E WITH DOT BELOW + : 0065 0323 +1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE + : 0045 0309 +1EBB LATIN SMALL LETTER E WITH HOOK ABOVE + : 0065 0309 +1EBC LATIN CAPITAL LETTER E WITH TILDE + : 0045 0303 +1EBD LATIN SMALL LETTER E WITH TILDE + : 0065 0303 +1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE + : 00CA 0301 +1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE + : 00EA 0301 +1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE + : 00CA 0300 +1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE + : 00EA 0300 +1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : 00CA 0309 +1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : 00EA 0309 +1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE + : 00CA 0303 +1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE + : 00EA 0303 +1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : 1EB8 0302 +1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : 1EB9 0302 +1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE + : 0049 0309 +1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE + : 0069 0309 +1ECA LATIN CAPITAL LETTER I WITH DOT BELOW + : 0049 0323 +1ECB LATIN SMALL LETTER I WITH DOT BELOW + : 0069 0323 +1ECC LATIN CAPITAL LETTER O WITH DOT BELOW + : 004F 0323 +1ECD LATIN SMALL LETTER O WITH DOT BELOW + : 006F 0323 +1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE + : 004F 0309 +1ECF LATIN SMALL LETTER O WITH HOOK ABOVE + : 006F 0309 +1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE + : 00D4 0301 +1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE + : 00F4 0301 +1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE + : 00D4 0300 +1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE + : 00F4 0300 +1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : 00D4 0309 +1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : 00F4 0309 +1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE + : 00D4 0303 +1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE + : 00F4 0303 +1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : 1ECC 0302 +1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : 1ECD 0302 +1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE + : 01A0 0301 +1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE + : 01A1 0301 +1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE + : 01A0 0300 +1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE + : 01A1 0300 +1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE + : 01A0 0309 +1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE + : 01A1 0309 +1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE + : 01A0 0303 +1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE + : 01A1 0303 +1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW + : 01A0 0323 +1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW + : 01A1 0323 +1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW + : 0055 0323 +1EE5 LATIN SMALL LETTER U WITH DOT BELOW + : 0075 0323 +1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE + : 0055 0309 +1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE + : 0075 0309 +1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE + : 01AF 0301 +1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE + : 01B0 0301 +1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE + : 01AF 0300 +1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE + : 01B0 0300 +1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE + : 01AF 0309 +1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE + : 01B0 0309 +1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE + : 01AF 0303 +1EEF LATIN SMALL LETTER U WITH HORN AND TILDE + : 01B0 0303 +1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW + : 01AF 0323 +1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW + : 01B0 0323 +1EF2 LATIN CAPITAL LETTER Y WITH GRAVE + : 0059 0300 +1EF3 LATIN SMALL LETTER Y WITH GRAVE + * Welsh + : 0079 0300 +1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW + : 0059 0323 +1EF5 LATIN SMALL LETTER Y WITH DOT BELOW + : 0079 0323 +1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE + : 0059 0309 +1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE + : 0079 0309 +1EF8 LATIN CAPITAL LETTER Y WITH TILDE + : 0059 0303 +1EF9 LATIN SMALL LETTER Y WITH TILDE + : 0079 0303 +@@ 1F00 Greek Extended 1FFF +@ Precomposed polytonic Greek +1F00 GREEK SMALL LETTER ALPHA WITH PSILI + : 03B1 0313 +1F01 GREEK SMALL LETTER ALPHA WITH DASIA + : 03B1 0314 +1F02 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA + : 1F00 0300 +1F03 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA + : 1F01 0300 +1F04 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA + : 1F00 0301 +1F05 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA + : 1F01 0301 +1F06 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI + : 1F00 0342 +1F07 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI + : 1F01 0342 +1F08 GREEK CAPITAL LETTER ALPHA WITH PSILI + : 0391 0313 +1F09 GREEK CAPITAL LETTER ALPHA WITH DASIA + : 0391 0314 +1F0A GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA + : 1F08 0300 +1F0B GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA + : 1F09 0300 +1F0C GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA + : 1F08 0301 +1F0D GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA + : 1F09 0301 +1F0E GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI + : 1F08 0342 +1F0F GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI + : 1F09 0342 +1F10 GREEK SMALL LETTER EPSILON WITH PSILI + : 03B5 0313 +1F11 GREEK SMALL LETTER EPSILON WITH DASIA + : 03B5 0314 +1F12 GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA + : 1F10 0300 +1F13 GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA + : 1F11 0300 +1F14 GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA + : 1F10 0301 +1F15 GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA + : 1F11 0301 +1F18 GREEK CAPITAL LETTER EPSILON WITH PSILI + : 0395 0313 +1F19 GREEK CAPITAL LETTER EPSILON WITH DASIA + : 0395 0314 +1F1A GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA + : 1F18 0300 +1F1B GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA + : 1F19 0300 +1F1C GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA + : 1F18 0301 +1F1D GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + : 1F19 0301 +1F20 GREEK SMALL LETTER ETA WITH PSILI + : 03B7 0313 +1F21 GREEK SMALL LETTER ETA WITH DASIA + : 03B7 0314 +1F22 GREEK SMALL LETTER ETA WITH PSILI AND VARIA + : 1F20 0300 +1F23 GREEK SMALL LETTER ETA WITH DASIA AND VARIA + : 1F21 0300 +1F24 GREEK SMALL LETTER ETA WITH PSILI AND OXIA + : 1F20 0301 +1F25 GREEK SMALL LETTER ETA WITH DASIA AND OXIA + : 1F21 0301 +1F26 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI + : 1F20 0342 +1F27 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI + : 1F21 0342 +1F28 GREEK CAPITAL LETTER ETA WITH PSILI + : 0397 0313 +1F29 GREEK CAPITAL LETTER ETA WITH DASIA + : 0397 0314 +1F2A GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA + : 1F28 0300 +1F2B GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA + : 1F29 0300 +1F2C GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA + : 1F28 0301 +1F2D GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA + : 1F29 0301 +1F2E GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI + : 1F28 0342 +1F2F GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI + : 1F29 0342 +1F30 GREEK SMALL LETTER IOTA WITH PSILI + : 03B9 0313 +1F31 GREEK SMALL LETTER IOTA WITH DASIA + : 03B9 0314 +1F32 GREEK SMALL LETTER IOTA WITH PSILI AND VARIA + : 1F30 0300 +1F33 GREEK SMALL LETTER IOTA WITH DASIA AND VARIA + : 1F31 0300 +1F34 GREEK SMALL LETTER IOTA WITH PSILI AND OXIA + : 1F30 0301 +1F35 GREEK SMALL LETTER IOTA WITH DASIA AND OXIA + : 1F31 0301 +1F36 GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI + : 1F30 0342 +1F37 GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI + : 1F31 0342 +1F38 GREEK CAPITAL LETTER IOTA WITH PSILI + : 0399 0313 +1F39 GREEK CAPITAL LETTER IOTA WITH DASIA + : 0399 0314 +1F3A GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA + : 1F38 0300 +1F3B GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA + : 1F39 0300 +1F3C GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA + : 1F38 0301 +1F3D GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA + : 1F39 0301 +1F3E GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI + : 1F38 0342 +1F3F GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI + : 1F39 0342 +1F40 GREEK SMALL LETTER OMICRON WITH PSILI + : 03BF 0313 +1F41 GREEK SMALL LETTER OMICRON WITH DASIA + : 03BF 0314 +1F42 GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA + : 1F40 0300 +1F43 GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA + : 1F41 0300 +1F44 GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA + : 1F40 0301 +1F45 GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA + : 1F41 0301 +1F48 GREEK CAPITAL LETTER OMICRON WITH PSILI + : 039F 0313 +1F49 GREEK CAPITAL LETTER OMICRON WITH DASIA + : 039F 0314 +1F4A GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA + : 1F48 0300 +1F4B GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA + : 1F49 0300 +1F4C GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA + : 1F48 0301 +1F4D GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + : 1F49 0301 +1F50 GREEK SMALL LETTER UPSILON WITH PSILI + : 03C5 0313 +1F51 GREEK SMALL LETTER UPSILON WITH DASIA + : 03C5 0314 +1F52 GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA + : 1F50 0300 +1F53 GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA + : 1F51 0300 +1F54 GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA + : 1F50 0301 +1F55 GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA + : 1F51 0301 +1F56 GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI + : 1F50 0342 +1F57 GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI + : 1F51 0342 +1F59 GREEK CAPITAL LETTER UPSILON WITH DASIA + : 03A5 0314 +1F5B GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA + : 1F59 0300 +1F5D GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + : 1F59 0301 +1F5F GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI + : 1F59 0342 +1F60 GREEK SMALL LETTER OMEGA WITH PSILI + : 03C9 0313 +1F61 GREEK SMALL LETTER OMEGA WITH DASIA + : 03C9 0314 +1F62 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA + : 1F60 0300 +1F63 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA + : 1F61 0300 +1F64 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA + : 1F60 0301 +1F65 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA + : 1F61 0301 +1F66 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI + : 1F60 0342 +1F67 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI + : 1F61 0342 +1F68 GREEK CAPITAL LETTER OMEGA WITH PSILI + : 03A9 0313 +1F69 GREEK CAPITAL LETTER OMEGA WITH DASIA + : 03A9 0314 +1F6A GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA + : 1F68 0300 +1F6B GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA + : 1F69 0300 +1F6C GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA + : 1F68 0301 +1F6D GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA + : 1F69 0301 +1F6E GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI + : 1F68 0342 +1F6F GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI + : 1F69 0342 +1F70 GREEK SMALL LETTER ALPHA WITH VARIA + : 03B1 0300 +1F71 GREEK SMALL LETTER ALPHA WITH OXIA + : 03AC greek small letter alpha with tonos +1F72 GREEK SMALL LETTER EPSILON WITH VARIA + : 03B5 0300 +1F73 GREEK SMALL LETTER EPSILON WITH OXIA + : 03AD greek small letter epsilon with tonos +1F74 GREEK SMALL LETTER ETA WITH VARIA + : 03B7 0300 +1F75 GREEK SMALL LETTER ETA WITH OXIA + : 03AE greek small letter eta with tonos +1F76 GREEK SMALL LETTER IOTA WITH VARIA + : 03B9 0300 +1F77 GREEK SMALL LETTER IOTA WITH OXIA + : 03AF greek small letter iota with tonos +1F78 GREEK SMALL LETTER OMICRON WITH VARIA + : 03BF 0300 +1F79 GREEK SMALL LETTER OMICRON WITH OXIA + : 03CC greek small letter omicron with tonos +1F7A GREEK SMALL LETTER UPSILON WITH VARIA + : 03C5 0300 +1F7B GREEK SMALL LETTER UPSILON WITH OXIA + : 03CD greek small letter upsilon with tonos +1F7C GREEK SMALL LETTER OMEGA WITH VARIA + : 03C9 0300 +1F7D GREEK SMALL LETTER OMEGA WITH OXIA + : 03CE greek small letter omega with tonos +1F80 GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI + : 1F00 0345 +1F81 GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI + : 1F01 0345 +1F82 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : 1F02 0345 +1F83 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : 1F03 0345 +1F84 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : 1F04 0345 +1F85 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : 1F05 0345 +1F86 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : 1F06 0345 +1F87 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : 1F07 0345 +1F88 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI + : 1F08 0345 +1F89 GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI + : 1F09 0345 +1F8A GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : 1F0A 0345 +1F8B GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : 1F0B 0345 +1F8C GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : 1F0C 0345 +1F8D GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : 1F0D 0345 +1F8E GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : 1F0E 0345 +1F8F GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : 1F0F 0345 +1F90 GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI + : 1F20 0345 +1F91 GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI + : 1F21 0345 +1F92 GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : 1F22 0345 +1F93 GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : 1F23 0345 +1F94 GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : 1F24 0345 +1F95 GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : 1F25 0345 +1F96 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : 1F26 0345 +1F97 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : 1F27 0345 +1F98 GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI + : 1F28 0345 +1F99 GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI + : 1F29 0345 +1F9A GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : 1F2A 0345 +1F9B GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : 1F2B 0345 +1F9C GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : 1F2C 0345 +1F9D GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : 1F2D 0345 +1F9E GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : 1F2E 0345 +1F9F GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : 1F2F 0345 +1FA0 GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI + : 1F60 0345 +1FA1 GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI + : 1F61 0345 +1FA2 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : 1F62 0345 +1FA3 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : 1F63 0345 +1FA4 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : 1F64 0345 +1FA5 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : 1F65 0345 +1FA6 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : 1F66 0345 +1FA7 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : 1F67 0345 +1FA8 GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI + : 1F68 0345 +1FA9 GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI + : 1F69 0345 +1FAA GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : 1F6A 0345 +1FAB GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : 1F6B 0345 +1FAC GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : 1F6C 0345 +1FAD GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : 1F6D 0345 +1FAE GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : 1F6E 0345 +1FAF GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : 1F6F 0345 +1FB0 GREEK SMALL LETTER ALPHA WITH VRACHY + : 03B1 0306 +1FB1 GREEK SMALL LETTER ALPHA WITH MACRON + : 03B1 0304 +1FB2 GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI + : 1F70 0345 +1FB3 GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI + : 03B1 0345 +1FB4 GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + : 03AC 0345 +1FB6 GREEK SMALL LETTER ALPHA WITH PERISPOMENI + : 03B1 0342 +1FB7 GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI + : 1FB6 0345 +1FB8 GREEK CAPITAL LETTER ALPHA WITH VRACHY + : 0391 0306 +1FB9 GREEK CAPITAL LETTER ALPHA WITH MACRON + : 0391 0304 +1FBA GREEK CAPITAL LETTER ALPHA WITH VARIA + : 0391 0300 +1FBB GREEK CAPITAL LETTER ALPHA WITH OXIA + : 0386 greek capital letter alpha with tonos +1FBC GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI + : 0391 0345 +1FBD GREEK KORONIS + # 0020 0313 +1FBE GREEK PROSGEGRAMMENI + : 03B9 greek small letter iota +1FBF GREEK PSILI + # 0020 0313 +1FC0 GREEK PERISPOMENI + # 0020 0342 +1FC1 GREEK DIALYTIKA AND PERISPOMENI + : 00A8 0342 +1FC2 GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI + : 1F74 0345 +1FC3 GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI + : 03B7 0345 +1FC4 GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + : 03AE 0345 +1FC6 GREEK SMALL LETTER ETA WITH PERISPOMENI + : 03B7 0342 +1FC7 GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI + : 1FC6 0345 +1FC8 GREEK CAPITAL LETTER EPSILON WITH VARIA + : 0395 0300 +1FC9 GREEK CAPITAL LETTER EPSILON WITH OXIA + : 0388 greek capital letter epsilon with tonos +1FCA GREEK CAPITAL LETTER ETA WITH VARIA + : 0397 0300 +1FCB GREEK CAPITAL LETTER ETA WITH OXIA + : 0389 greek capital letter eta with tonos +1FCC GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI + : 0397 0345 +1FCD GREEK PSILI AND VARIA + : 1FBF 0300 +1FCE GREEK PSILI AND OXIA + : 1FBF 0301 +1FCF GREEK PSILI AND PERISPOMENI + : 1FBF 0342 +1FD0 GREEK SMALL LETTER IOTA WITH VRACHY + : 03B9 0306 +1FD1 GREEK SMALL LETTER IOTA WITH MACRON + : 03B9 0304 +1FD2 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA + : 03CA 0300 +1FD3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA + : 0390 greek small letter iota with dialytika and tonos +1FD6 GREEK SMALL LETTER IOTA WITH PERISPOMENI + : 03B9 0342 +1FD7 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI + : 03CA 0342 +1FD8 GREEK CAPITAL LETTER IOTA WITH VRACHY + : 0399 0306 +1FD9 GREEK CAPITAL LETTER IOTA WITH MACRON + : 0399 0304 +1FDA GREEK CAPITAL LETTER IOTA WITH VARIA + : 0399 0300 +1FDB GREEK CAPITAL LETTER IOTA WITH OXIA + : 038A greek capital letter iota with tonos +1FDD GREEK DASIA AND VARIA + : 1FFE 0300 +1FDE GREEK DASIA AND OXIA + : 1FFE 0301 +1FDF GREEK DASIA AND PERISPOMENI + : 1FFE 0342 +1FE0 GREEK SMALL LETTER UPSILON WITH VRACHY + : 03C5 0306 +1FE1 GREEK SMALL LETTER UPSILON WITH MACRON + : 03C5 0304 +1FE2 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA + : 03CB 0300 +1FE3 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA + : 03B0 greek small letter upsilon with dialytika and tonos +1FE4 GREEK SMALL LETTER RHO WITH PSILI + : 03C1 0313 +1FE5 GREEK SMALL LETTER RHO WITH DASIA + : 03C1 0314 +1FE6 GREEK SMALL LETTER UPSILON WITH PERISPOMENI + : 03C5 0342 +1FE7 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI + : 03CB 0342 +1FE8 GREEK CAPITAL LETTER UPSILON WITH VRACHY + : 03A5 0306 +1FE9 GREEK CAPITAL LETTER UPSILON WITH MACRON + : 03A5 0304 +1FEA GREEK CAPITAL LETTER UPSILON WITH VARIA + : 03A5 0300 +1FEB GREEK CAPITAL LETTER UPSILON WITH OXIA + : 038E greek capital letter upsilon with tonos +1FEC GREEK CAPITAL LETTER RHO WITH DASIA + : 03A1 0314 +1FED GREEK DIALYTIKA AND VARIA + : 00A8 0300 +1FEE GREEK DIALYTIKA AND OXIA + : 0385 greek dialytika tonos +1FEF GREEK VARIA + : 0060 grave accent +1FF2 GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI + : 1F7C 0345 +1FF3 GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI + : 03C9 0345 +1FF4 GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + : 03CE 0345 +1FF6 GREEK SMALL LETTER OMEGA WITH PERISPOMENI + : 03C9 0342 +1FF7 GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI + : 1FF6 0345 +1FF8 GREEK CAPITAL LETTER OMICRON WITH VARIA + : 039F 0300 +1FF9 GREEK CAPITAL LETTER OMICRON WITH OXIA + : 038C greek capital letter omicron with tonos +1FFA GREEK CAPITAL LETTER OMEGA WITH VARIA + : 03A9 0300 +1FFB GREEK CAPITAL LETTER OMEGA WITH OXIA + : 038F greek capital letter omega with tonos +1FFC GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI + : 03A9 0345 +1FFD GREEK OXIA + : 00B4 acute accent +1FFE GREEK DASIA + # 0020 0314 +@@ 2000 General Punctuation 206F +@+ For additional general punctuation characters see also Basic Latin, Latin-1, Supplemental Punctuation and CJK Symbols and Punctuation. +@ Spaces +2000 EN QUAD + : 2002 en space +2001 EM QUAD + = mutton quad + : 2003 em space +2002 EN SPACE + = nut + * half an em + # 0020 space +2003 EM SPACE + = mutton + * nominally, a space equal to the type size in points + * may scale by the condensation factor of a font + # 0020 space +2004 THREE-PER-EM SPACE + = thick space + # 0020 space +2005 FOUR-PER-EM SPACE + = mid space + # 0020 space +2006 SIX-PER-EM SPACE + * in computer typography sometimes equated to thin space + # 0020 space +2007 FIGURE SPACE + * space equal to tabular width of a font + * this is equivalent to the digit width of fonts with fixed-width digits + # <noBreak> 0020 +2008 PUNCTUATION SPACE + * space equal to narrow punctuation of a font + # 0020 space +2009 THIN SPACE + * a fifth of an em (or sometimes a sixth) + # 0020 space +200A HAIR SPACE + * thinner than a thin space + * in traditional typography, the thinnest space available + # 0020 space +200B ZERO WIDTH SPACE + = ZWSP + * this character is intended for line break control; it has no width, but its presence between two characters does not prevent increased letter spacing in justification +@ Formatting characters +200C ZERO WIDTH NON-JOINER + = ZWNJ +200D ZERO WIDTH JOINER + = ZWJ +200E LEFT-TO-RIGHT MARK + = LRM +200F RIGHT-TO-LEFT MARK + = RLM +@ Dashes +2010 HYPHEN + x (hyphen-minus - 002D) + x (soft hyphen - 00AD) +2011 NON-BREAKING HYPHEN + x (hyphen-minus - 002D) + x (soft hyphen - 00AD) + # <noBreak> 2010 +2012 FIGURE DASH +2013 EN DASH +2014 EM DASH + * may be used in pairs to offset parenthetical text + x (katakana-hiragana prolonged sound mark - 30FC) +2015 HORIZONTAL BAR + = QUOTATION DASH + * long dash introducing quoted text +@ General punctuation +2016 DOUBLE VERTICAL LINE + * used in pairs to indicate norm of a matrix + x (combining double vertical stroke overlay - 20E6) + x (parallel to - 2225) +2017 DOUBLE LOW LINE + * this is a spacing character + x (low line - 005F) + x (combining double low line - 0333) + # 0020 0333 +2018 LEFT SINGLE QUOTATION MARK + = SINGLE TURNED COMMA QUOTATION MARK + * this is the preferred glyph (as opposed to 201B) + x (apostrophe - 0027) + x (modifier letter turned comma - 02BB) + x (heavy single turned comma quotation mark ornament - 275B) +2019 RIGHT SINGLE QUOTATION MARK + = SINGLE COMMA QUOTATION MARK + * this is the preferred character to use for apostrophe + x (apostrophe - 0027) + x (modifier letter apostrophe - 02BC) + x (heavy single comma quotation mark ornament - 275C) +201A SINGLE LOW-9 QUOTATION MARK + = LOW SINGLE COMMA QUOTATION MARK + * used as opening single quotation mark in some languages +201B SINGLE HIGH-REVERSED-9 QUOTATION MARK + = SINGLE REVERSED COMMA QUOTATION MARK + * glyph variant of 2018 + x (modifier letter reversed comma - 02BD) +201C LEFT DOUBLE QUOTATION MARK + = DOUBLE TURNED COMMA QUOTATION MARK + * this is the preferred glyph (as opposed to 201F) + x (quotation mark - 0022) + x (heavy double turned comma quotation mark ornament - 275D) + x (reversed double prime quotation mark - 301D) +201D RIGHT DOUBLE QUOTATION MARK + = DOUBLE COMMA QUOTATION MARK + x (quotation mark - 0022) + x (double prime - 2033) + x (heavy double comma quotation mark ornament - 275E) + x (double prime quotation mark - 301E) +201E DOUBLE LOW-9 QUOTATION MARK + = LOW DOUBLE COMMA QUOTATION MARK + * used as opening double quotation mark in some languages + x (low double prime quotation mark - 301F) +201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK + = DOUBLE REVERSED COMMA QUOTATION MARK + * glyph variant of 201C +2020 DAGGER + = obelisk, obelus, long cross +2021 DOUBLE DAGGER + = diesis, double obelisk +2022 BULLET + = black small circle + x (middle dot - 00B7) + x (one dot leader - 2024) + x (bullet operator - 2219) + x (inverse bullet - 25D8) + x (white bullet - 25E6) +2023 TRIANGULAR BULLET + x (end of proof - 220E) + x (black right-pointing small triangle - 25B8) +2024 ONE DOT LEADER + * also used as an Armenian semicolon (mijaket) + x (middle dot - 00B7) + x (bullet - 2022) + x (bullet operator - 2219) + # 002E full stop +2025 TWO DOT LEADER + # 002E 002E +2026 HORIZONTAL ELLIPSIS + = three dot leader + x (vertical ellipsis - 22EE) + x (presentation form for vertical horizontal ellipsis - FE19) + # 002E 002E 002E +2027 HYPHENATION POINT +@ Formatting characters +2028 LINE SEPARATOR + * may be used to represent this semantic unambiguously +2029 PARAGRAPH SEPARATOR + * may be used to represent this semantic unambiguously +202A LEFT-TO-RIGHT EMBEDDING + = LRE +202B RIGHT-TO-LEFT EMBEDDING + = RLE +202C POP DIRECTIONAL FORMATTING + = PDF +202D LEFT-TO-RIGHT OVERRIDE + = LRO +202E RIGHT-TO-LEFT OVERRIDE + = RLO +202F NARROW NO-BREAK SPACE + = NNBSP + x (no-break space - 00A0) + # <noBreak> 0020 +@ General punctuation +2030 PER MILLE SIGN + = permille, per thousand + * used, for example, in measures of blood alcohol content, salinity, etc. + x (percent sign - 0025) +2031 PER TEN THOUSAND SIGN + = permyriad + * percent of a percent, rarely used + x (percent sign - 0025) +2032 PRIME + = minutes, feet + x (apostrophe - 0027) + x (acute accent - 00B4) + x (modifier letter prime - 02B9) +2033 DOUBLE PRIME + = seconds, inches + x (quotation mark - 0022) + x (modifier letter double prime - 02BA) + x (right double quotation mark - 201D) + x (ditto mark - 3003) + x (double prime quotation mark - 301E) + # 2032 2032 +2034 TRIPLE PRIME + = lines (old measure, 1/12 of an inch) + # 2032 2032 2032 +2035 REVERSED PRIME + x (grave accent - 0060) +2036 REVERSED DOUBLE PRIME + x (reversed double prime quotation mark - 301D) + # 2035 2035 +2037 REVERSED TRIPLE PRIME + # 2035 2035 2035 +2038 CARET + x (up arrowhead - 2303) +2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK + = LEFT POINTING SINGLE GUILLEMET + * usually opening, sometimes closing + x (less-than sign - 003C) + x (left-pointing angle bracket - 2329) + x (left angle bracket - 3008) +203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + = RIGHT POINTING SINGLE GUILLEMET + * usually closing, sometimes opening + x (greater-than sign - 003E) + x (right-pointing angle bracket - 232A) + x (right angle bracket - 3009) +203B REFERENCE MARK + = Japanese kome + = Urdu paragraph separator + x (tibetan ku ru kha bzhi mig can - 0FBF) +@ Double punctuation for vertical text +203C DOUBLE EXCLAMATION MARK + x (exclamation mark - 0021) + # 0021 0021 +@ General punctuation +203D INTERROBANG + x (exclamation mark - 0021) + x (question mark - 003F) +203E OVERLINE + = SPACING OVERSCORE + # 0020 0305 +203F UNDERTIE (Enotikon) + = Greek enotikon + x (smile - 2323) +2040 CHARACTER TIE + = z notation sequence concatenation + x (frown - 2322) +2041 CARET INSERTION POINT + * proofreader's mark: insert here + x (right semidirect product - 22CC) +2042 ASTERISM +2043 HYPHEN BULLET +2044 FRACTION SLASH + = solidus (in typography) + * for composing arbitrary fractions + x (solidus - 002F) + x (division slash - 2215) +2045 LEFT SQUARE BRACKET WITH QUILL +2046 RIGHT SQUARE BRACKET WITH QUILL +@ Double punctuation for vertical text +2047 DOUBLE QUESTION MARK + # 003F 003F +2048 QUESTION EXCLAMATION MARK + # 003F 0021 +2049 EXCLAMATION QUESTION MARK + # 0021 003F +@ General punctuation +204A TIRONIAN SIGN ET + * Irish Gaelic, ... +204B REVERSED PILCROW SIGN + x (pilcrow sign - 00B6) +204C BLACK LEFTWARDS BULLET +204D BLACK RIGHTWARDS BULLET +204E LOW ASTERISK + x (asterisk - 002A) +204F REVERSED SEMICOLON + x (semicolon - 003B) +2050 CLOSE UP + * editing mark +2051 TWO ASTERISKS ALIGNED VERTICALLY +2052 COMMERCIAL MINUS SIGN + = abzüglich (German), med avdrag av (Swedish), piska (Swedish, "whip") + * a common glyph variant and fallback representation looks like ./. + * may also be used as a dingbat to indicate correctness + * used in Finno-Ugric Phonetic Alphabet to indicate a related borrowed form with different sound + x (percent sign - 0025) + x (arabic percent sign - 066A) +2053 SWUNG DASH + x (tilde - 007E) +2054 INVERTED UNDERTIE +2055 FLOWER PUNCTUATION MARK + = phul, puspika + * used as a punctuation mark with Syloti Nagri, Bengali and other Indic scripts + x (heavy eight teardrop-spoked propeller asterisk - 274B) +@ Archaic punctuation +2056 THREE DOT PUNCTUATION +@ General punctuation +2057 QUADRUPLE PRIME + # 2032 2032 2032 2032 +@ Archaic punctuation +2058 FOUR DOT PUNCTUATION +2059 FIVE DOT PUNCTUATION + = Greek pentonkion +205A TWO DOT PUNCTUATION + * historically used to indicate the end of a sentence or change of speaker + * extends from baseline to cap height + x (presentation form for vertical two dot leader - FE30) + x (greek acrophonic epidaurean two - 1015B) +205B FOUR DOT MARK + * used by scribes in the margin as highlighter mark + * this is centered on the line, but extends beyond top and bottom of the line +205C DOTTED CROSS + * used by scribes in the margin as highlighter mark +205D TRICOLON + = Epidaurean acrophonic symbol three + x (vertical ellipsis - 22EE) + x (triple colon operator - 2AF6) + x (presentation form for vertical horizontal ellipsis - FE19) +205E VERTICAL FOUR DOTS + * used in dictionaries to indicate legal but undesirable word break + * glyph extends the whole height of the line +@ Space +205F MEDIUM MATHEMATICAL SPACE + = MMSP + * four-eighteenths of an em + # 0020 space +@ Formatting character +2060 WORD JOINER + = WJ + * a zero width non-breaking space (only) + * intended for disambiguation of functions for byte order mark + x (zero width no-break space - FEFF) +@ Invisible operators +2061 FUNCTION APPLICATION + * contiguity operator indicating application of a function +2062 INVISIBLE TIMES + * contiguity operator indicating multiplication +2063 INVISIBLE SEPARATOR + = invisible comma + * contiguity operator indicating that adjacent mathematical symbols form a list, e.g. when no visible comma is used between multiple indices +@ Deprecated +206A INHIBIT SYMMETRIC SWAPPING +206B ACTIVATE SYMMETRIC SWAPPING +206C INHIBIT ARABIC FORM SHAPING +206D ACTIVATE ARABIC FORM SHAPING +206E NATIONAL DIGIT SHAPES +206F NOMINAL DIGIT SHAPES +@@ 2070 Superscripts and Subscripts 209F +@ Superscripts +2070 SUPERSCRIPT ZERO + # <super> 0030 +2071 SUPERSCRIPT LATIN SMALL LETTER I + # <super> 0069 +2072 <reserved> + x (superscript two - 00B2) +2073 <reserved> + x (superscript three - 00B3) +2074 SUPERSCRIPT FOUR + # <super> 0034 +2075 SUPERSCRIPT FIVE + # <super> 0035 +2076 SUPERSCRIPT SIX + # <super> 0036 +2077 SUPERSCRIPT SEVEN + # <super> 0037 +2078 SUPERSCRIPT EIGHT + # <super> 0038 +2079 SUPERSCRIPT NINE + # <super> 0039 +207A SUPERSCRIPT PLUS SIGN + # <super> 002B +207B SUPERSCRIPT MINUS + # <super> 2212 +207C SUPERSCRIPT EQUALS SIGN + # <super> 003D +207D SUPERSCRIPT LEFT PARENTHESIS + # <super> 0028 +207E SUPERSCRIPT RIGHT PARENTHESIS + # <super> 0029 +207F SUPERSCRIPT LATIN SMALL LETTER N + # <super> 006E +@ Subscripts +2080 SUBSCRIPT ZERO + # <sub> 0030 +2081 SUBSCRIPT ONE + # <sub> 0031 +2082 SUBSCRIPT TWO + # <sub> 0032 +2083 SUBSCRIPT THREE + # <sub> 0033 +2084 SUBSCRIPT FOUR + # <sub> 0034 +2085 SUBSCRIPT FIVE + # <sub> 0035 +2086 SUBSCRIPT SIX + # <sub> 0036 +2087 SUBSCRIPT SEVEN + # <sub> 0037 +2088 SUBSCRIPT EIGHT + # <sub> 0038 +2089 SUBSCRIPT NINE + # <sub> 0039 +208A SUBSCRIPT PLUS SIGN + # <sub> 002B +208B SUBSCRIPT MINUS + # <sub> 2212 +208C SUBSCRIPT EQUALS SIGN + # <sub> 003D +208D SUBSCRIPT LEFT PARENTHESIS + # <sub> 0028 +208E SUBSCRIPT RIGHT PARENTHESIS + # <sub> 0029 +2090 LATIN SUBSCRIPT SMALL LETTER A + # <sub> 0061 +2091 LATIN SUBSCRIPT SMALL LETTER E + # <sub> 0065 +2092 LATIN SUBSCRIPT SMALL LETTER O + # <sub> 006F +2093 LATIN SUBSCRIPT SMALL LETTER X + # <sub> 0078 +2094 LATIN SUBSCRIPT SMALL LETTER SCHWA + # <sub> 0259 +@@ 20A0 Currency Symbols 20CF +@ Currency symbols +@+ A number of currency symbols are found in other blocks. Fullwidth versions of some currency symbols are found in the Halfwidth and Fullwidth Forms block. + x (dollar sign - 0024) + x (cent sign - 00A2) + x (pound sign - 00A3) + x (currency sign - 00A4) + x (yen sign - 00A5) + x (latin small letter f with hook - 0192) + x (afghani sign - 060B) + x (bengali rupee mark - 09F2) + x (bengali rupee sign - 09F3) + x (gujarati rupee sign - 0AF1) + x (tamil rupee sign - 0BF9) + x (thai currency symbol baht - 0E3F) + x (khmer currency symbol riel - 17DB) + x (script capital m - 2133) + x (rial sign - FDFC) +20A0 EURO-CURRENCY SIGN + * intended for ECU, but not widely used + * historical character; this is NOT the euro! + x (euro sign - 20AC) +20A1 COLON SIGN + * Costa Rica, El Salvador +20A2 CRUZEIRO SIGN + * Brazil +20A3 FRENCH FRANC SIGN + * France +20A4 LIRA SIGN + * intended for lira, but not widely used + * preferred character for lira is 00A3 + x (pound sign - 00A3) +20A5 MILL SIGN + * USA (1/10 cent) +20A6 NAIRA SIGN + * Nigeria +20A7 PESETA SIGN + * Spain + x (peso sign - 20B1) +20A8 RUPEE SIGN + * India + # 0052 0073 +20A9 WON SIGN + * Korea +20AA NEW SHEQEL SIGN + * Israel +20AB DONG SIGN + * Vietnam +20AC EURO SIGN + * currency sign for the European Monetary Union + * euro, not ecu + x (euro-currency sign - 20A0) +20AD KIP SIGN + * Laos +20AE TUGRIK SIGN + * Mongolia + * also transliterated as tugrug, tugric, tugrog, togrog, tögrög +20AF DRACHMA SIGN + * Greece +20B0 GERMAN PENNY SIGN +20B1 PESO SIGN + * Philippines + * the Mexican peso is indicated with the dollar sign + x (peseta sign - 20A7) +20B2 GUARANI SIGN + * Paraguay + * Often represented by G. or Gs. +20B3 AUSTRAL SIGN + * former Argentinian currency +20B4 HRYVNIA SIGN + * Ukraine +20B5 CEDI SIGN + * Ghana + * glyph may look like '023B' or like C with a short vertical stroke through the upper arm + x (cent sign - 00A2) + x (latin capital letter c with stroke - 023B) +@@ 20D0 Combining Diacritical Marks for Symbols 20FF +@ Combining diacritical marks for symbols +20D0 COMBINING LEFT HARPOON ABOVE +20D1 COMBINING RIGHT HARPOON ABOVE + * vector +20D2 COMBINING LONG VERTICAL LINE OVERLAY + * negation +20D3 COMBINING SHORT VERTICAL LINE OVERLAY + * occasional variant for negation +20D4 COMBINING ANTICLOCKWISE ARROW ABOVE +20D5 COMBINING CLOCKWISE ARROW ABOVE + * rotation +20D6 COMBINING LEFT ARROW ABOVE +20D7 COMBINING RIGHT ARROW ABOVE + * vector +20D8 COMBINING RING OVERLAY +20D9 COMBINING CLOCKWISE RING OVERLAY +20DA COMBINING ANTICLOCKWISE RING OVERLAY +20DB COMBINING THREE DOTS ABOVE + = third derivative +20DC COMBINING FOUR DOTS ABOVE + = fourth derivative +@ Enclosing diacritics +20DD COMBINING ENCLOSING CIRCLE + = JIS composition circle + x (white circle - 25CB) + x (large circle - 25EF) + x (ideographic number zero - 3007) +20DE COMBINING ENCLOSING SQUARE + x (white square - 25A1) +20DF COMBINING ENCLOSING DIAMOND + x (white diamond - 25C7) +20E0 COMBINING ENCLOSING CIRCLE BACKSLASH + * prohibition +@ Additional diacritical mark for symbols +20E1 COMBINING LEFT RIGHT ARROW ABOVE + * tensor +@ Additional enclosing diacritics +20E2 COMBINING ENCLOSING SCREEN + x (clear screen symbol - 239A) +20E3 COMBINING ENCLOSING KEYCAP +20E4 COMBINING ENCLOSING UPWARD POINTING TRIANGLE + x (white up-pointing triangle - 25B3) +@ Additional diacritical marks for symbols +20E5 COMBINING REVERSE SOLIDUS OVERLAY + x (reverse solidus - 005C) +20E6 COMBINING DOUBLE VERTICAL STROKE OVERLAY + = z notation finite function diacritic + x (double vertical line - 2016) +20E7 COMBINING ANNUITY SYMBOL + = actuarial bend + x (right ceiling - 2309) +20E8 COMBINING TRIPLE UNDERDOT +20E9 COMBINING WIDE BRIDGE ABOVE + = contraction operator + * extends the full width of the base character + x (combining bridge above - 0346) +20EA COMBINING LEFTWARDS ARROW OVERLAY + x (leftwards arrow - 2190) +20EB COMBINING LONG DOUBLE SOLIDUS OVERLAY + = long double slash overlay +@@ 2100 Letterlike Symbols 214F +@ Letterlike symbols +@+ Some of the letterlike symbols are intended to complete the set of mathematical alphanumeric symbols starting at U+1D400. +2100 ACCOUNT OF + # 0061 002F 0063 +2101 ADDRESSED TO THE SUBJECT + # 0061 002F 0073 +2102 DOUBLE-STRUCK CAPITAL C + = the set of complex numbers + # <font> 0043 latin capital letter c +2103 DEGREE CELSIUS + = degrees Centigrade + # 00B0 0043 +2104 CENTRE LINE SYMBOL + = clone +2105 CARE OF + # 0063 002F 006F +2106 CADA UNA + # 0063 002F 0075 +2107 EULER CONSTANT + x (latin capital letter e - 0045) + # 0190 latin capital letter open e +2108 SCRUPLE +2109 DEGREE FAHRENHEIT + # 00B0 0046 +210A SCRIPT SMALL G + = real number symbol + # <font> 0067 latin small letter g +210B SCRIPT CAPITAL H + = Hamiltonian operator + # <font> 0048 latin capital letter h +210C BLACK-LETTER CAPITAL H + = Hilbert space + # <font> 0048 latin capital letter h +210D DOUBLE-STRUCK CAPITAL H + # <font> 0048 latin capital letter h +210E PLANCK CONSTANT + # <font> 0068 latin small letter h +210F PLANCK CONSTANT OVER TWO PI + x (cyrillic small letter tshe - 045B) + # <font> 0127 latin small letter h with stroke +2110 SCRIPT CAPITAL I + # <font> 0049 latin capital letter i +2111 BLACK-LETTER CAPITAL I + = imaginary part + # <font> 0049 latin capital letter i +2112 SCRIPT CAPITAL L + = Laplace transform + # <font> 004C latin capital letter l +2113 SCRIPT SMALL L + = mathematical symbol 'ell' + = liter (traditional symbol) + * despite its character name, this symbol is derived from a special italicized version of the small letter l + * the SI recommended symbol for liter is 006C + x (mathematical script small l - 1D4C1) + # <font> 006C latin small letter l +2114 L B BAR SYMBOL + = pounds +2115 DOUBLE-STRUCK CAPITAL N + = natural number + # <font> 004E latin capital letter n +2116 NUMERO SIGN + # 004E 006F +2117 SOUND RECORDING COPYRIGHT + = published + = phonorecord sign + x (copyright sign - 00A9) +2118 SCRIPT CAPITAL P + = Weierstrass elliptic function + * actually this has the form of a lowercase calligraphic p, despite its name +2119 DOUBLE-STRUCK CAPITAL P + # <font> 0050 latin capital letter p +211A DOUBLE-STRUCK CAPITAL Q + = the set of rational numbers + # <font> 0051 latin capital letter q +211B SCRIPT CAPITAL R + = Riemann Integral + # <font> 0052 latin capital letter r +211C BLACK-LETTER CAPITAL R + = real part + # <font> 0052 latin capital letter r +211D DOUBLE-STRUCK CAPITAL R + = the set of real numbers + # <font> 0052 latin capital letter r +211E PRESCRIPTION TAKE + = recipe + = cross ratio +211F RESPONSE +2120 SERVICE MARK + # <super> 0053 004D +2121 TELEPHONE SIGN + * typical forms for this symbol may use lower case, small caps or superscripted letter shapes + # 0054 0045 004C +2122 TRADE MARK SIGN + # <super> 0054 004D +2123 VERSICLE +2124 DOUBLE-STRUCK CAPITAL Z + = the set of integers + # <font> 005A latin capital letter z +2125 OUNCE SIGN + x (latin small letter yogh - 021D) +2126 OHM SIGN + * SI unit of resistance, named after G. S. Ohm, German physicist + * preferred representation is 03A9 + : 03A9 greek capital letter omega +2127 INVERTED OHM SIGN + = MHO + * archaic unit of conductance (= the SI unit siemens) + * typographically a turned greek capital letter omega + x (latin capital letter upsilon - 01B1) + x (greek capital letter omega - 03A9) +2128 BLACK-LETTER CAPITAL Z + # <font> 005A latin capital letter z +2129 TURNED GREEK SMALL LETTER IOTA + * unique element fulfilling a description (logic) + x (greek small letter iota - 03B9) +212A KELVIN SIGN + : 004B latin capital letter k +212B ANGSTROM SIGN + * non SI length unit (=0.1 nm) named after A. J. Ångström, Swedish physicist + * preferred representation is 00C5 + : 00C5 latin capital letter a with ring above +212C SCRIPT CAPITAL B + = Bernoulli function + # <font> 0042 latin capital letter b +212D BLACK-LETTER CAPITAL C + # <font> 0043 latin capital letter c +212E ESTIMATED SYMBOL + * used in European packaging + x (latin small letter e - 0065) +212F SCRIPT SMALL E + = error + = natural exponent + # <font> 0065 latin small letter e +2130 SCRIPT CAPITAL E + = emf (electromotive force) + # <font> 0045 latin capital letter e +2131 SCRIPT CAPITAL F + = Fourier transform + # <font> 0046 latin capital letter f +2132 TURNED CAPITAL F + x (latin capital letter f - 0046) +2133 SCRIPT CAPITAL M + = M-matrix (physics) + = German Mark (not the current Deutsche Mark) + # <font> 004D latin capital letter m +2134 SCRIPT SMALL O + = order, of inferior order to + # <font> 006F latin small letter o +@ Hebrew letterlike math symbols +@+ These are left-to-right characters. +2135 ALEF SYMBOL + = first transfinite cardinal (countable) + # 05D0 hebrew letter alef +2136 BET SYMBOL + = second transfinite cardinal (the continuum) + # 05D1 hebrew letter bet +2137 GIMEL SYMBOL + = third transfinite cardinal (functions of a real variable) + # 05D2 hebrew letter gimel +2138 DALET SYMBOL + = fourth transfinite cardinal + # 05D3 hebrew letter dalet +@ Additional letterlike symbols +2139 INFORMATION SOURCE + * intended for use with 20DD + # <font> 0069 latin small letter i +213A ROTATED CAPITAL Q + * a binding signature mark +213B FACSIMILE SIGN + * typical forms for this symbol may use lower case, small caps or superscripted letter shapes + x (telephone sign - 2121) + # 0046 0041 0058 +213C DOUBLE-STRUCK SMALL PI + # <font> 03C0 greek small letter pi +213D DOUBLE-STRUCK SMALL GAMMA + # <font> 03B3 greek small letter gamma +213E DOUBLE-STRUCK CAPITAL GAMMA + # <font> 0393 greek capital letter gamma +213F DOUBLE-STRUCK CAPITAL PI + # <font> 03A0 greek capital letter pi +@ Double-struck large operator +2140 DOUBLE-STRUCK N-ARY SUMMATION + # <font> 2211 n-ary summation +@ Additional letterlike symbols +2141 TURNED SANS-SERIF CAPITAL G + = game +2142 TURNED SANS-SERIF CAPITAL L +2143 REVERSED SANS-SERIF CAPITAL L +2144 TURNED SANS-SERIF CAPITAL Y +@ Double-struck italic mathematical symbols +@+ These stylized mathematical symbols are used in some documents to distinguish special mathematical usages from ordinary variables. +2145 DOUBLE-STRUCK ITALIC CAPITAL D + * sometimes used for the differential + # <font> 0044 latin capital letter d +2146 DOUBLE-STRUCK ITALIC SMALL D + * sometimes used for the differential + # <font> 0064 latin small letter d +2147 DOUBLE-STRUCK ITALIC SMALL E + * sometimes used for the natural exponent + # <font> 0065 latin small letter e +2148 DOUBLE-STRUCK ITALIC SMALL I + * sometimes used for the imaginary unit + # <font> 0069 latin small letter i +2149 DOUBLE-STRUCK ITALIC SMALL J + * sometimes used for the imaginary unit + # <font> 006A latin small letter j +@ Additional letterlike symbols +214A PROPERTY LINE +214B TURNED AMPERSAND + * used in linear logic + x (ampersand - 0026) +214C PER SIGN + * abbreviates the word 'per' +@@ 2150 Number Forms 218F +@ Fractions +@+ Other fraction number forms are found in the Latin-1 Supplement block. + x (vulgar fraction one quarter - 00BC) + x (vulgar fraction one half - 00BD) + x (vulgar fraction three quarters - 00BE) +2153 VULGAR FRACTION ONE THIRD + # <fraction> 0031 2044 0033 +2154 VULGAR FRACTION TWO THIRDS + # <fraction> 0032 2044 0033 +2155 VULGAR FRACTION ONE FIFTH + # <fraction> 0031 2044 0035 +2156 VULGAR FRACTION TWO FIFTHS + # <fraction> 0032 2044 0035 +2157 VULGAR FRACTION THREE FIFTHS + # <fraction> 0033 2044 0035 +2158 VULGAR FRACTION FOUR FIFTHS + # <fraction> 0034 2044 0035 +2159 VULGAR FRACTION ONE SIXTH + # <fraction> 0031 2044 0036 +215A VULGAR FRACTION FIVE SIXTHS + # <fraction> 0035 2044 0036 +215B VULGAR FRACTION ONE EIGHTH + # <fraction> 0031 2044 0038 +215C VULGAR FRACTION THREE EIGHTHS + # <fraction> 0033 2044 0038 +215D VULGAR FRACTION FIVE EIGHTHS + # <fraction> 0035 2044 0038 +215E VULGAR FRACTION SEVEN EIGHTHS + # <fraction> 0037 2044 0038 +215F FRACTION NUMERATOR ONE + # <fraction> 0031 2044 +@ Roman numerals +2160 ROMAN NUMERAL ONE + # 0049 latin capital letter i +2161 ROMAN NUMERAL TWO + # 0049 0049 +2162 ROMAN NUMERAL THREE + # 0049 0049 0049 +2163 ROMAN NUMERAL FOUR + # 0049 0056 +2164 ROMAN NUMERAL FIVE + # 0056 latin capital letter v +2165 ROMAN NUMERAL SIX + # 0056 0049 +2166 ROMAN NUMERAL SEVEN + # 0056 0049 0049 +2167 ROMAN NUMERAL EIGHT + # 0056 0049 0049 0049 +2168 ROMAN NUMERAL NINE + # 0049 0058 +2169 ROMAN NUMERAL TEN + # 0058 latin capital letter x +216A ROMAN NUMERAL ELEVEN + # 0058 0049 +216B ROMAN NUMERAL TWELVE + # 0058 0049 0049 +216C ROMAN NUMERAL FIFTY + # 004C latin capital letter l +216D ROMAN NUMERAL ONE HUNDRED + # 0043 latin capital letter c +216E ROMAN NUMERAL FIVE HUNDRED + # 0044 latin capital letter d +216F ROMAN NUMERAL ONE THOUSAND + # 004D latin capital letter m +2170 SMALL ROMAN NUMERAL ONE + # 0069 latin small letter i +2171 SMALL ROMAN NUMERAL TWO + # 0069 0069 +2172 SMALL ROMAN NUMERAL THREE + # 0069 0069 0069 +2173 SMALL ROMAN NUMERAL FOUR + # 0069 0076 +2174 SMALL ROMAN NUMERAL FIVE + # 0076 latin small letter v +2175 SMALL ROMAN NUMERAL SIX + # 0076 0069 +2176 SMALL ROMAN NUMERAL SEVEN + # 0076 0069 0069 +2177 SMALL ROMAN NUMERAL EIGHT + # 0076 0069 0069 0069 +2178 SMALL ROMAN NUMERAL NINE + # 0069 0078 +2179 SMALL ROMAN NUMERAL TEN + # 0078 latin small letter x +217A SMALL ROMAN NUMERAL ELEVEN + # 0078 0069 +217B SMALL ROMAN NUMERAL TWELVE + # 0078 0069 0069 +217C SMALL ROMAN NUMERAL FIFTY + # 006C latin small letter l +217D SMALL ROMAN NUMERAL ONE HUNDRED + # 0063 latin small letter c +217E SMALL ROMAN NUMERAL FIVE HUNDRED + # 0064 latin small letter d +217F SMALL ROMAN NUMERAL ONE THOUSAND + # 006D latin small letter m +2180 ROMAN NUMERAL ONE THOUSAND C D +2181 ROMAN NUMERAL FIVE THOUSAND +2182 ROMAN NUMERAL TEN THOUSAND +2183 ROMAN NUMERAL REVERSED ONE HUNDRED + = apostrophic C + * used in combination with C and I to form large numbers +@@ 2190 Arrows 21FF +@ Arrows +2190 LEFTWARDS ARROW + x (combining leftwards arrow overlay - 20EA) +2191 UPWARDS ARROW + * IPA: egressive airflow +2192 RIGHTWARDS ARROW + = z notation total function +2193 DOWNWARDS ARROW + * IPA: ingressive airflow +2194 LEFT RIGHT ARROW + = z notation relation +2195 UP DOWN ARROW +2196 NORTH WEST ARROW +2197 NORTH EAST ARROW +2198 SOUTH EAST ARROW +2199 SOUTH WEST ARROW +219A LEFTWARDS ARROW WITH STROKE + * negation of 2190 + : 2190 0338 +219B RIGHTWARDS ARROW WITH STROKE + * negation of 2192 + : 2192 0338 +219C LEFTWARDS WAVE ARROW +219D RIGHTWARDS WAVE ARROW +219E LEFTWARDS TWO HEADED ARROW + = fast cursor left +219F UPWARDS TWO HEADED ARROW + = fast cursor up +21A0 RIGHTWARDS TWO HEADED ARROW + = z notation total surjection + = fast cursor right +21A1 DOWNWARDS TWO HEADED ARROW + = form feed + = fast cursor down +21A2 LEFTWARDS ARROW WITH TAIL +21A3 RIGHTWARDS ARROW WITH TAIL + = z notation total injection +21A4 LEFTWARDS ARROW FROM BAR +21A5 UPWARDS ARROW FROM BAR +21A6 RIGHTWARDS ARROW FROM BAR + = z notation maplet +21A7 DOWNWARDS ARROW FROM BAR + = depth symbol +21A8 UP DOWN ARROW WITH BASE +21A9 LEFTWARDS ARROW WITH HOOK +21AA RIGHTWARDS ARROW WITH HOOK +21AB LEFTWARDS ARROW WITH LOOP +21AC RIGHTWARDS ARROW WITH LOOP +21AD LEFT RIGHT WAVE ARROW +21AE LEFT RIGHT ARROW WITH STROKE + * negation of 2194 + : 2194 0338 +21AF DOWNWARDS ZIGZAG ARROW + = electrolysis +21B0 UPWARDS ARROW WITH TIP LEFTWARDS +21B1 UPWARDS ARROW WITH TIP RIGHTWARDS +21B2 DOWNWARDS ARROW WITH TIP LEFTWARDS +21B3 DOWNWARDS ARROW WITH TIP RIGHTWARDS +21B4 RIGHTWARDS ARROW WITH CORNER DOWNWARDS + = line feed +21B5 DOWNWARDS ARROW WITH CORNER LEFTWARDS + * may indicate a carriage return or new line + x (return symbol - 23CE) +21B6 ANTICLOCKWISE TOP SEMICIRCLE ARROW +21B7 CLOCKWISE TOP SEMICIRCLE ARROW +21B8 NORTH WEST ARROW TO LONG BAR + = home +21B9 LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR + = tab with shift tab +21BA ANTICLOCKWISE OPEN CIRCLE ARROW +21BB CLOCKWISE OPEN CIRCLE ARROW +21BC LEFTWARDS HARPOON WITH BARB UPWARDS +21BD LEFTWARDS HARPOON WITH BARB DOWNWARDS +21BE UPWARDS HARPOON WITH BARB RIGHTWARDS +21BF UPWARDS HARPOON WITH BARB LEFTWARDS +21C0 RIGHTWARDS HARPOON WITH BARB UPWARDS +21C1 RIGHTWARDS HARPOON WITH BARB DOWNWARDS +21C2 DOWNWARDS HARPOON WITH BARB RIGHTWARDS +21C3 DOWNWARDS HARPOON WITH BARB LEFTWARDS +21C4 RIGHTWARDS ARROW OVER LEFTWARDS ARROW +21C5 UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW +21C6 LEFTWARDS ARROW OVER RIGHTWARDS ARROW +21C7 LEFTWARDS PAIRED ARROWS +21C8 UPWARDS PAIRED ARROWS +21C9 RIGHTWARDS PAIRED ARROWS +21CA DOWNWARDS PAIRED ARROWS +21CB LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +21CC RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +21CD LEFTWARDS DOUBLE ARROW WITH STROKE + * negation of 21D0 + : 21D0 0338 +21CE LEFT RIGHT DOUBLE ARROW WITH STROKE + * negation of 21D4 + : 21D4 0338 +21CF RIGHTWARDS DOUBLE ARROW WITH STROKE + * negation of 21D2 + : 21D2 0338 +21D0 LEFTWARDS DOUBLE ARROW +21D1 UPWARDS DOUBLE ARROW +21D2 RIGHTWARDS DOUBLE ARROW +21D3 DOWNWARDS DOUBLE ARROW +21D4 LEFT RIGHT DOUBLE ARROW +21D5 UP DOWN DOUBLE ARROW +21D6 NORTH WEST DOUBLE ARROW +21D7 NORTH EAST DOUBLE ARROW +21D8 SOUTH EAST DOUBLE ARROW +21D9 SOUTH WEST DOUBLE ARROW +21DA LEFTWARDS TRIPLE ARROW +21DB RIGHTWARDS TRIPLE ARROW +21DC LEFTWARDS SQUIGGLE ARROW +21DD RIGHTWARDS SQUIGGLE ARROW +21DE UPWARDS ARROW WITH DOUBLE STROKE + = page up +21DF DOWNWARDS ARROW WITH DOUBLE STROKE + = page down +21E0 LEFTWARDS DASHED ARROW +21E1 UPWARDS DASHED ARROW +21E2 RIGHTWARDS DASHED ARROW +21E3 DOWNWARDS DASHED ARROW +21E4 LEFTWARDS ARROW TO BAR + = leftward tab +21E5 RIGHTWARDS ARROW TO BAR + = rightward tab +21E6 LEFTWARDS WHITE ARROW +21E7 UPWARDS WHITE ARROW + = shift +21E8 RIGHTWARDS WHITE ARROW +21E9 DOWNWARDS WHITE ARROW +21EA UPWARDS WHITE ARROW FROM BAR + = caps lock +21EB UPWARDS WHITE ARROW ON PEDESTAL + = level 2 lock +21EC UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR + = caps lock +21ED UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR + = numerics lock +21EE UPWARDS WHITE DOUBLE ARROW + = level 3 select +21EF UPWARDS WHITE DOUBLE ARROW ON PEDESTAL + = level 3 lock +21F0 RIGHTWARDS WHITE ARROW FROM WALL + = group lock +21F1 NORTH WEST ARROW TO CORNER + = home +21F2 SOUTH EAST ARROW TO CORNER + = end +21F3 UP DOWN WHITE ARROW + = scrolling +21F4 RIGHT ARROW WITH SMALL CIRCLE +21F5 DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW +21F6 THREE RIGHTWARDS ARROWS +21F7 LEFTWARDS ARROW WITH VERTICAL STROKE +21F8 RIGHTWARDS ARROW WITH VERTICAL STROKE + = z notation partial function +21F9 LEFT RIGHT ARROW WITH VERTICAL STROKE + = z notation partial relation +21FA LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE +21FB RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE + = z notation finite function +21FC LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE + = z notation finite relation +21FD LEFTWARDS OPEN-HEADED ARROW +21FE RIGHTWARDS OPEN-HEADED ARROW +21FF LEFT RIGHT OPEN-HEADED ARROW +@@ 2200 Mathematical Operators 22FF +@ Miscellaneous mathematical symbols +2200 FOR ALL + = universal quantifier +2201 COMPLEMENT + x (latin letter stretched c - 0297) +2202 PARTIAL DIFFERENTIAL +2203 THERE EXISTS + = existential quantifier +2204 THERE DOES NOT EXIST + : 2203 0338 +2205 EMPTY SET + = null set + * used in linguistics to indicate a null morpheme or phonological "zero" + x (latin capital letter o with stroke - 00D8) + x (diameter sign - 2300) +2206 INCREMENT + = Laplace operator + = forward difference + x (greek capital letter delta - 0394) + x (white up-pointing triangle - 25B3) +2207 NABLA + = backward difference + = gradient, del + * used for Laplacian operator (written with superscript 2) + x (white down-pointing triangle - 25BD) +@ Set membership +2208 ELEMENT OF +2209 NOT AN ELEMENT OF + : 2208 0338 +220A SMALL ELEMENT OF + * originates in math pi fonts; not the straight epsilon + x (greek lunate epsilon symbol - 03F5) +220B CONTAINS AS MEMBER + = such that +220C DOES NOT CONTAIN AS MEMBER + : 220B 0338 +220D SMALL CONTAINS AS MEMBER + x (greek reversed lunate epsilon symbol - 03F6) +@ Miscellaneous mathematical symbol +220E END OF PROOF + = Q.E.D. + x (triangular bullet - 2023) + x (black vertical rectangle - 25AE) +@ N-ary operators +220F N-ARY PRODUCT + = product sign + x (greek capital letter pi - 03A0) +2210 N-ARY COPRODUCT + = coproduct sign +2211 N-ARY SUMMATION + = summation sign + x (greek capital letter sigma - 03A3) +@ Operators +2212 MINUS SIGN + x (hyphen-minus - 002D) +2213 MINUS-OR-PLUS SIGN + x (plus-minus sign - 00B1) +2214 DOT PLUS +2215 DIVISION SLASH + * generic division operator + x (solidus - 002F) + x (fraction slash - 2044) +2216 SET MINUS + x (reverse solidus - 005C) +2217 ASTERISK OPERATOR + x (asterisk - 002A) +2218 RING OPERATOR + = composite function + = APL jot + x (degree sign - 00B0) + x (white bullet - 25E6) +2219 BULLET OPERATOR + x (middle dot - 00B7) + x (bullet - 2022) + x (one dot leader - 2024) +221A SQUARE ROOT + = radical sign + x (check mark - 2713) +221B CUBE ROOT +221C FOURTH ROOT +221D PROPORTIONAL TO + x (greek small letter alpha - 03B1) +@ Miscellaneous mathematical symbols +221E INFINITY +221F RIGHT ANGLE +2220 ANGLE +2221 MEASURED ANGLE +2222 SPHERICAL ANGLE + = angle arc +@ Operators +2223 DIVIDES + = such that + = APL stile + x (vertical line - 007C) + x (latin letter dental click - 01C0) +2224 DOES NOT DIVIDE + : 2223 0338 +2225 PARALLEL TO + x (latin letter lateral click - 01C1) + x (double vertical line - 2016) +2226 NOT PARALLEL TO + : 2225 0338 +@ Logical and set operators +2227 LOGICAL AND + = wedge, conjunction + x (n-ary logical and - 22C0) + x (up arrowhead - 2303) +2228 LOGICAL OR + = vee, disjunction + x (n-ary logical or - 22C1) + x (down arrowhead - 2304) +2229 INTERSECTION + = cap, hat + x (n-ary intersection - 22C2) +222A UNION + = cup + x (n-ary union - 22C3) +@ Integrals +222B INTEGRAL + x (latin small letter esh - 0283) +222C DOUBLE INTEGRAL + # 222B 222B +222D TRIPLE INTEGRAL + x (quadruple integral operator - 2A0C) + # 222B 222B 222B +222E CONTOUR INTEGRAL + x (integral around a point operator - 2A15) +222F SURFACE INTEGRAL + # 222E 222E +2230 VOLUME INTEGRAL + # 222E 222E 222E +2231 CLOCKWISE INTEGRAL +2232 CLOCKWISE CONTOUR INTEGRAL +2233 ANTICLOCKWISE CONTOUR INTEGRAL + * clockwise or anticlockwise arrows do not reverse during layout mirroring +@ Miscellaneous mathematical symbols +2234 THEREFORE +2235 BECAUSE +@ Relations +2236 RATIO + x (colon - 003A) +2237 PROPORTION +@ Operator +2238 DOT MINUS + = symmetric difference +@ Relation +2239 EXCESS +@ Operator +223A GEOMETRIC PROPORTION +@ Relations +223B HOMOTHETIC + x (tilde operator with rising dots - 2A6B) +223C TILDE OPERATOR + = varies with (proportional to) + = difference between + = similar to + = not + = cycle + = APL tilde + x (tilde - 007E) + x (not sign - 00AC) + x (small tilde - 02DC) +223D REVERSED TILDE (lazy S) + = lazy S + * reversed tilde and lazy S are glyph variants +223E INVERTED LAZY S + = most positive +@ Miscellaneous mathematical symbol +223F SINE WAVE + = alternating current +@ Operator +2240 WREATH PRODUCT +@ Relations +2241 NOT TILDE + : 223C 0338 +2242 MINUS TILDE +2243 ASYMPTOTICALLY EQUAL TO +2244 NOT ASYMPTOTICALLY EQUAL TO + : 2243 0338 +2245 APPROXIMATELY EQUAL TO +2246 APPROXIMATELY BUT NOT ACTUALLY EQUAL TO +2247 NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO + : 2245 0338 +2248 ALMOST EQUAL TO + = asymptotic to +2249 NOT ALMOST EQUAL TO + : 2248 0338 +224A ALMOST EQUAL OR EQUAL TO +224B TRIPLE TILDE +224C ALL EQUAL TO + * reversed tilde and lazy S are glyph variants +224D EQUIVALENT TO +224E GEOMETRICALLY EQUIVALENT TO +224F DIFFERENCE BETWEEN +2250 APPROACHES THE LIMIT +2251 GEOMETRICALLY EQUAL TO +2252 APPROXIMATELY EQUAL TO OR THE IMAGE OF + = nearly equals +2253 IMAGE OF OR APPROXIMATELY EQUAL TO +2254 COLON EQUALS +2255 EQUALS COLON +2256 RING IN EQUAL TO +2257 RING EQUAL TO + = approximately equal to +2258 CORRESPONDS TO +2259 ESTIMATES + = corresponds to +225A EQUIANGULAR TO +225B STAR EQUALS +225C DELTA EQUAL TO + = equiangular + = equal to by definition +225D EQUAL TO BY DEFINITION +225E MEASURED BY +225F QUESTIONED EQUAL TO +2260 NOT EQUAL TO + x (equals sign - 003D) + x (latin letter alveolar click - 01C2) + : 003D 0338 +2261 IDENTICAL TO +2262 NOT IDENTICAL TO + : 2261 0338 +2263 STRICTLY EQUIVALENT TO +2264 LESS-THAN OR EQUAL TO +2265 GREATER-THAN OR EQUAL TO +2266 LESS-THAN OVER EQUAL TO +2267 GREATER-THAN OVER EQUAL TO +2268 LESS-THAN BUT NOT EQUAL TO +2269 GREATER-THAN BUT NOT EQUAL TO +226A MUCH LESS-THAN + x (left-pointing double angle quotation mark - 00AB) +226B MUCH GREATER-THAN + x (right-pointing double angle quotation mark - 00BB) +226C BETWEEN + = plaintiff, quantic +226D NOT EQUIVALENT TO + : 224D 0338 +226E NOT LESS-THAN + : 003C 0338 +226F NOT GREATER-THAN + : 003E 0338 +2270 NEITHER LESS-THAN NOR EQUAL TO + : 2264 0338 +2271 NEITHER GREATER-THAN NOR EQUAL TO + : 2265 0338 +2272 LESS-THAN OR EQUIVALENT TO +2273 GREATER-THAN OR EQUIVALENT TO +2274 NEITHER LESS-THAN NOR EQUIVALENT TO + : 2272 0338 +2275 NEITHER GREATER-THAN NOR EQUIVALENT TO + : 2273 0338 +2276 LESS-THAN OR GREATER-THAN +2277 GREATER-THAN OR LESS-THAN +2278 NEITHER LESS-THAN NOR GREATER-THAN + : 2276 0338 +2279 NEITHER GREATER-THAN NOR LESS-THAN + : 2277 0338 +227A PRECEDES + = lower rank than + x (precedes under relation - 22B0) +227B SUCCEEDS + = higher rank than + x (succeeds under relation - 22B1) +227C PRECEDES OR EQUAL TO +227D SUCCEEDS OR EQUAL TO +227E PRECEDES OR EQUIVALENT TO +227F SUCCEEDS OR EQUIVALENT TO +2280 DOES NOT PRECEDE + : 227A 0338 +2281 DOES NOT SUCCEED + : 227B 0338 +2282 SUBSET OF + = included in set +2283 SUPERSET OF + = includes in set +2284 NOT A SUBSET OF + : 2282 0338 +2285 NOT A SUPERSET OF + : 2283 0338 +2286 SUBSET OF OR EQUAL TO +2287 SUPERSET OF OR EQUAL TO +2288 NEITHER A SUBSET OF NOR EQUAL TO + : 2286 0338 +2289 NEITHER A SUPERSET OF NOR EQUAL TO + : 2287 0338 +228A SUBSET OF WITH NOT EQUAL TO +228B SUPERSET OF WITH NOT EQUAL TO +@ Operators +228C MULTISET +228D MULTISET MULTIPLICATION + x (n-ary union operator with dot - 2A03) + x (intersection with dot - 2A40) +228E MULTISET UNION + = z notation bag addition + x (n-ary union operator with plus - 2A04) +@ Relations +228F SQUARE IMAGE OF +2290 SQUARE ORIGINAL OF +2291 SQUARE IMAGE OF OR EQUAL TO +2292 SQUARE ORIGINAL OF OR EQUAL TO +@ Operators +2293 SQUARE CAP + x (n-ary square intersection operator - 2A05) +2294 SQUARE CUP +2295 CIRCLED PLUS + = direct sum + = vector pointing into page + x (earth - 2641) + x (n-ary circled plus operator - 2A01) +2296 CIRCLED MINUS + = symmetric difference + x (circle with horizontal bar - 29B5) +2297 CIRCLED TIMES + = tensor product + = vector pointing into page + x (n-ary circled times operator - 2A02) +2298 CIRCLED DIVISION SLASH +2299 CIRCLED DOT OPERATOR + = direct product + = vector pointing out of page + x (latin letter bilabial click - 0298) + x (sun - 2609) + x (n-ary circled dot operator - 2A00) +229A CIRCLED RING OPERATOR + x (apl functional symbol circle jot - 233E) + x (bullseye - 25CE) +229B CIRCLED ASTERISK OPERATOR + x (apl functional symbol circle star - 235F) +229C CIRCLED EQUALS +229D CIRCLED DASH +229E SQUARED PLUS +229F SQUARED MINUS +22A0 SQUARED TIMES + x (ballot box with x - 2612) +22A1 SQUARED DOT OPERATOR +22A2 RIGHT TACK + = turnstile + = proves, implies, yields + = reducible +22A3 LEFT TACK + = reverse turnstile + = non-theorem, does not yield +@ Miscellaneous mathematical symbols +22A4 DOWN TACK + = top +22A5 UP TACK + = base, bottom + x (perpendicular - 27C2) +@ Relations +22A6 ASSERTION + = reduces to +22A7 MODELS +22A8 TRUE + = statement is true, valid + = is a tautology + = satisfies + = results in +22A9 FORCES +22AA TRIPLE VERTICAL BAR RIGHT TURNSTILE +22AB DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22AC DOES NOT PROVE + : 22A2 0338 +22AD NOT TRUE + : 22A8 0338 +22AE DOES NOT FORCE + : 22A9 0338 +22AF NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE + : 22AB 0338 +22B0 PRECEDES UNDER RELATION + x (precedes - 227A) +22B1 SUCCEEDS UNDER RELATION + x (succeeds - 227B) +22B2 NORMAL SUBGROUP OF + x (white left-pointing pointer - 25C5) +22B3 CONTAINS AS NORMAL SUBGROUP + x (white right-pointing pointer - 25BB) +22B4 NORMAL SUBGROUP OF OR EQUAL TO +22B5 CONTAINS AS NORMAL SUBGROUP OR EQUAL TO +22B6 ORIGINAL OF +22B7 IMAGE OF +22B8 MULTIMAP +22B9 HERMITIAN CONJUGATE MATRIX +@ Operators +22BA INTERCALATE +22BB XOR +22BC NAND + x (projective - 2305) +22BD NOR +@ Miscellaneous mathematical symbols +22BE RIGHT ANGLE WITH ARC +22BF RIGHT TRIANGLE +@ N-ary operators +22C0 N-ARY LOGICAL AND + * also used to denote the universal quantifier + x (logical and - 2227) +22C1 N-ARY LOGICAL OR + * also used to denote the existential quantifier + x (logical or - 2228) +22C2 N-ARY INTERSECTION + = z notation generalised intersection + x (intersection - 2229) +22C3 N-ARY UNION + = z notation generalised union + x (union - 222A) +@ Operators +22C4 DIAMOND OPERATOR + x (white diamond - 25C7) +22C5 DOT OPERATOR + x (middle dot - 00B7) +22C6 STAR OPERATOR + * APL + x (arabic five pointed star - 066D) + x (black star - 2605) +22C7 DIVISION TIMES +@ Relation +22C8 BOWTIE + x (ocr bow tie - 2445) +@ Operators +22C9 LEFT NORMAL FACTOR SEMIDIRECT PRODUCT +22CA RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT +22CB LEFT SEMIDIRECT PRODUCT +22CC RIGHT SEMIDIRECT PRODUCT + x (caret insertion point - 2041) +@ Relation +22CD REVERSED TILDE EQUALS +@ Logical operators +22CE CURLY LOGICAL OR +22CF CURLY LOGICAL AND +@ Relations +22D0 DOUBLE SUBSET +22D1 DOUBLE SUPERSET +@ Operators +22D2 DOUBLE INTERSECTION +22D3 DOUBLE UNION +@ Relations +22D4 PITCHFORK + = proper intersection +22D5 EQUAL AND PARALLEL TO + x (viewdata square - 2317) +22D6 LESS-THAN WITH DOT +22D7 GREATER-THAN WITH DOT +22D8 VERY MUCH LESS-THAN +22D9 VERY MUCH GREATER-THAN +22DA LESS-THAN EQUAL TO OR GREATER-THAN +22DB GREATER-THAN EQUAL TO OR LESS-THAN +22DC EQUAL TO OR LESS-THAN +22DD EQUAL TO OR GREATER-THAN +22DE EQUAL TO OR PRECEDES +22DF EQUAL TO OR SUCCEEDS +22E0 DOES NOT PRECEDE OR EQUAL + : 227C 0338 +22E1 DOES NOT SUCCEED OR EQUAL + : 227D 0338 +22E2 NOT SQUARE IMAGE OF OR EQUAL TO + : 2291 0338 +22E3 NOT SQUARE ORIGINAL OF OR EQUAL TO + : 2292 0338 +22E4 SQUARE IMAGE OF OR NOT EQUAL TO +22E5 SQUARE ORIGINAL OF OR NOT EQUAL TO +22E6 LESS-THAN BUT NOT EQUIVALENT TO +22E7 GREATER-THAN BUT NOT EQUIVALENT TO +22E8 PRECEDES BUT NOT EQUIVALENT TO +22E9 SUCCEEDS BUT NOT EQUIVALENT TO +22EA NOT NORMAL SUBGROUP OF + : 22B2 0338 +22EB DOES NOT CONTAIN AS NORMAL SUBGROUP + : 22B3 0338 +22EC NOT NORMAL SUBGROUP OF OR EQUAL TO + : 22B4 0338 +22ED DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL + : 22B5 0338 +22EE VERTICAL ELLIPSIS + * these four ellipses are used for matrix row/column elision + x (tricolon - 205D) + x (horizontal ellipsis - 2026) + x (presentation form for vertical horizontal ellipsis - FE19) +22EF MIDLINE HORIZONTAL ELLIPSIS +22F0 UP RIGHT DIAGONAL ELLIPSIS +22F1 DOWN RIGHT DIAGONAL ELLIPSIS +22F2 ELEMENT OF WITH LONG HORIZONTAL STROKE +22F3 ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F4 SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F5 ELEMENT OF WITH DOT ABOVE +22F6 ELEMENT OF WITH OVERBAR +22F7 SMALL ELEMENT OF WITH OVERBAR +22F8 ELEMENT OF WITH UNDERBAR +22F9 ELEMENT OF WITH TWO HORIZONTAL STROKES +22FA CONTAINS WITH LONG HORIZONTAL STROKE +22FB CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FC SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FD CONTAINS WITH OVERBAR +22FE SMALL CONTAINS WITH OVERBAR +22FF Z NOTATION BAG MEMBERSHIP +@@ 2300 Miscellaneous Technical 23FF +@ Miscellaneous technical +2300 DIAMETER SIGN + x (empty set - 2205) +2301 ELECTRIC ARROW + * from ISO 2047 + * symbol for End of Transmission +2302 HOUSE +2303 UP ARROWHEAD + x (circumflex accent - 005E) + x (modifier letter up arrowhead - 02C4) + x (caret - 2038) + x (logical and - 2227) +2304 DOWN ARROWHEAD + x (modifier letter down arrowhead - 02C5) + x (logical or - 2228) + x (countersink - 2335) +2305 PROJECTIVE + x (nand - 22BC) +2306 PERSPECTIVE +2307 WAVY LINE + x (wavy dash - 3030) +@ Corner brackets +@+ The ceiling and floor characters are recommended for general-purpose corner brackets, rather than the CJK corner brackets, which are wide quotation marks. +2308 LEFT CEILING + = APL upstile + x (left corner bracket - 300C) +2309 RIGHT CEILING + x (combining annuity symbol - 20E7) +230A LEFT FLOOR + = APL downstile +230B RIGHT FLOOR + x (right corner bracket - 300D) +@ Crops +230C BOTTOM RIGHT CROP + * set of four "crop" corners, arranged facing outward +230D BOTTOM LEFT CROP +230E TOP RIGHT CROP +230F TOP LEFT CROP +@ Miscellaneous technical +2310 REVERSED NOT SIGN + = beginning of line + x (not sign - 00AC) +2311 SQUARE LOZENGE + = Kissen (pillow) + * used as a command delimiter in some very old computers +2312 ARC + x (upper half circle - 25E0) +2313 SEGMENT +2314 SECTOR +2315 TELEPHONE RECORDER +2316 POSITION INDICATOR +2317 VIEWDATA SQUARE + x (equal and parallel to - 22D5) +2318 PLACE OF INTEREST SIGN + = COMMAND KEY +2319 TURNED NOT SIGN + = line marker +@ GUI icons +231A WATCH +231B HOURGLASS +@ Quine corners +231C TOP LEFT CORNER + * set of four "quine" corners, for quincuncial arrangement +231D TOP RIGHT CORNER +231E BOTTOM LEFT CORNER +231F BOTTOM RIGHT CORNER +@ Integral pieces +2320 TOP HALF INTEGRAL + x (integral extension - 23AE) +2321 BOTTOM HALF INTEGRAL +@ Frown and smile +2322 FROWN + x (character tie - 2040) +2323 SMILE + x (undertie - 203F) +@ Keyboard symbols +2324 UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS + = ENTER KEY +2325 OPTION KEY +2326 ERASE TO THE RIGHT + = DELETE TO THE RIGHT KEY +2327 X IN A RECTANGLE BOX + = CLEAR KEY +2328 KEYBOARD +@ Angle brackets +@+ These are discouraged for mathematical use because of their canonical equivalence to CJK punctuation. +2329 LEFT-POINTING ANGLE BRACKET + x (less-than sign - 003C) + x (single left-pointing angle quotation mark - 2039) + x (mathematical left angle bracket - 27E8) + : 3008 left angle bracket +232A RIGHT-POINTING ANGLE BRACKET + x (greater-than sign - 003E) + x (single right-pointing angle quotation mark - 203A) + x (mathematical right angle bracket - 27E9) + : 3009 right angle bracket +@ Keyboard symbol +232B ERASE TO THE LEFT + = DELETE TO THE LEFT KEY +@ Chemistry symbol +232C BENZENE RING +@ Drafting symbols +232D CYLINDRICITY +232E ALL AROUND-PROFILE +232F SYMMETRY +2330 TOTAL RUNOUT +2331 DIMENSION ORIGIN +2332 CONICAL TAPER +2333 SLOPE + x (lower left triangle - 25FA) +2334 COUNTERBORE + x (open box - 2423) +2335 COUNTERSINK + x (down arrowhead - 2304) +@ APL +2336 APL FUNCTIONAL SYMBOL I-BEAM +2337 APL FUNCTIONAL SYMBOL SQUISH QUAD + x (apl functional symbol quad - 2395) + x (white vertical rectangle - 25AF) + x (n-ary white vertical bar - 2AFF) +2338 APL FUNCTIONAL SYMBOL QUAD EQUAL +2339 APL FUNCTIONAL SYMBOL QUAD DIVIDE +233A APL FUNCTIONAL SYMBOL QUAD DIAMOND +233B APL FUNCTIONAL SYMBOL QUAD JOT + x (squared small circle - 29C7) +233C APL FUNCTIONAL SYMBOL QUAD CIRCLE +233D APL FUNCTIONAL SYMBOL CIRCLE STILE +233E APL FUNCTIONAL SYMBOL CIRCLE JOT + x (circled ring operator - 229A) + x (circled white bullet - 29BE) +233F APL FUNCTIONAL SYMBOL SLASH BAR +2340 APL FUNCTIONAL SYMBOL BACKSLASH BAR +2341 APL FUNCTIONAL SYMBOL QUAD SLASH + x (squared rising diagonal slash - 29C4) +2342 APL FUNCTIONAL SYMBOL QUAD BACKSLASH + x (squared falling diagonal slash - 29C5) +2343 APL FUNCTIONAL SYMBOL QUAD LESS-THAN +2344 APL FUNCTIONAL SYMBOL QUAD GREATER-THAN +2345 APL FUNCTIONAL SYMBOL LEFTWARDS VANE +2346 APL FUNCTIONAL SYMBOL RIGHTWARDS VANE +2347 APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW +2348 APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW +2349 APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH + x (reversed empty set - 29B0) +234A APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR * + = up tack underbar + * preferred naming for APL tack symbols now follows the London Convention in ISO/IEC 13751:2000 (APL Extended) + x (up tack - 22A5) +234B APL FUNCTIONAL SYMBOL DELTA STILE +234C APL FUNCTIONAL SYMBOL QUAD DOWN CARET +234D APL FUNCTIONAL SYMBOL QUAD DELTA +234E APL FUNCTIONAL SYMBOL DOWN TACK JOT * + = up tack jot + x (up tack - 22A5) +234F APL FUNCTIONAL SYMBOL UPWARDS VANE +2350 APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW +2351 APL FUNCTIONAL SYMBOL UP TACK OVERBAR * + = down tack overbar + x (down tack - 22A4) + x (postal mark - 3012) +2352 APL FUNCTIONAL SYMBOL DEL STILE +2353 APL FUNCTIONAL SYMBOL QUAD UP CARET +2354 APL FUNCTIONAL SYMBOL QUAD DEL +2355 APL FUNCTIONAL SYMBOL UP TACK JOT * + = down tack jot + x (down tack - 22A4) +2356 APL FUNCTIONAL SYMBOL DOWNWARDS VANE +2357 APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW +2358 APL FUNCTIONAL SYMBOL QUOTE UNDERBAR +2359 APL FUNCTIONAL SYMBOL DELTA UNDERBAR +235A APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR +235B APL FUNCTIONAL SYMBOL JOT UNDERBAR +235C APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR +235D APL FUNCTIONAL SYMBOL UP SHOE JOT + x (intersection with dot - 2A40) +235E APL FUNCTIONAL SYMBOL QUOTE QUAD +235F APL FUNCTIONAL SYMBOL CIRCLE STAR + x (circled asterisk operator - 229B) +2360 APL FUNCTIONAL SYMBOL QUAD COLON +2361 APL FUNCTIONAL SYMBOL UP TACK DIAERESIS * + = down tack diaeresis + x (down tack - 22A4) +2362 APL FUNCTIONAL SYMBOL DEL DIAERESIS +2363 APL FUNCTIONAL SYMBOL STAR DIAERESIS +2364 APL FUNCTIONAL SYMBOL JOT DIAERESIS + = hoot +2365 APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS + = holler +2366 APL FUNCTIONAL SYMBOL DOWN SHOE STILE +2367 APL FUNCTIONAL SYMBOL LEFT SHOE STILE +2368 APL FUNCTIONAL SYMBOL TILDE DIAERESIS + = smirk +2369 APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS +236A APL FUNCTIONAL SYMBOL COMMA BAR +236B APL FUNCTIONAL SYMBOL DEL TILDE +236C APL FUNCTIONAL SYMBOL ZILDE +236D APL FUNCTIONAL SYMBOL STILE TILDE +236E APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR +236F APL FUNCTIONAL SYMBOL QUAD NOT EQUAL +2370 APL FUNCTIONAL SYMBOL QUAD QUESTION +2371 APL FUNCTIONAL SYMBOL DOWN CARET TILDE +2372 APL FUNCTIONAL SYMBOL UP CARET TILDE +2373 APL FUNCTIONAL SYMBOL IOTA +2374 APL FUNCTIONAL SYMBOL RHO +2375 APL FUNCTIONAL SYMBOL OMEGA +2376 APL FUNCTIONAL SYMBOL ALPHA UNDERBAR +2377 APL FUNCTIONAL SYMBOL EPSILON UNDERBAR +2378 APL FUNCTIONAL SYMBOL IOTA UNDERBAR +2379 APL FUNCTIONAL SYMBOL OMEGA UNDERBAR +237A APL FUNCTIONAL SYMBOL ALPHA +@ Graphics for control codes +237B NOT CHECK MARK + * from ISO 2047 + * symbol for Negative Acknowledge +@ Miscellaneous technical +237C RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +@ Graphics for control codes +237D SHOULDERED OPEN BOX + * from ISO 9995-7 + * keyboard symbol for No Break Space + x (open box - 2423) +237E BELL SYMBOL + * from ISO 2047 +237F VERTICAL LINE WITH MIDDLE DOT + * from ISO 2047 + * symbol for End of Medium +@ Keyboard symbols from ISO 9995-7 +2380 INSERTION SYMBOL +2381 CONTINUOUS UNDERLINE SYMBOL +2382 DISCONTINUOUS UNDERLINE SYMBOL +2383 EMPHASIS SYMBOL +2384 COMPOSITION SYMBOL +2385 WHITE SQUARE WITH CENTRE VERTICAL LINE + = center +2386 ENTER SYMBOL +2387 ALTERNATIVE KEY SYMBOL +2388 HELM SYMBOL + = control + x (wheel of dharma - 2638) +2389 CIRCLED HORIZONTAL BAR WITH NOTCH (pause) + = pause +238A CIRCLED TRIANGLE DOWN (break) + = interrupt +238B BROKEN CIRCLE WITH NORTHWEST ARROW (escape) + = escape +238C UNDO SYMBOL +@ Electrotechnical symbols from IR 181 +238D MONOSTABLE SYMBOL +238E HYSTERESIS SYMBOL +238F OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL +2390 OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL +2391 PASSIVE-PULL-DOWN-OUTPUT SYMBOL +2392 PASSIVE-PULL-UP-OUTPUT SYMBOL +2393 DIRECT CURRENT SYMBOL FORM TWO +2394 SOFTWARE-FUNCTION SYMBOL +@ APL +2395 APL FUNCTIONAL SYMBOL QUAD + x (apl functional symbol squish quad - 2337) + x (white vertical rectangle - 25AF) +@ Keyboard symbols from ISO 9995-7 +2396 DECIMAL SEPARATOR KEY SYMBOL +2397 PREVIOUS PAGE +2398 NEXT PAGE +2399 PRINT SCREEN SYMBOL +239A CLEAR SCREEN SYMBOL + x (combining enclosing screen - 20E2) +@ Bracket pieces +239B LEFT PARENTHESIS UPPER HOOK +239C LEFT PARENTHESIS EXTENSION +239D LEFT PARENTHESIS LOWER HOOK +239E RIGHT PARENTHESIS UPPER HOOK +239F RIGHT PARENTHESIS EXTENSION +23A0 RIGHT PARENTHESIS LOWER HOOK +23A1 LEFT SQUARE BRACKET UPPER CORNER +23A2 LEFT SQUARE BRACKET EXTENSION +23A3 LEFT SQUARE BRACKET LOWER CORNER +23A4 RIGHT SQUARE BRACKET UPPER CORNER +23A5 RIGHT SQUARE BRACKET EXTENSION +23A6 RIGHT SQUARE BRACKET LOWER CORNER +23A7 LEFT CURLY BRACKET UPPER HOOK +23A8 LEFT CURLY BRACKET MIDDLE PIECE +23A9 LEFT CURLY BRACKET LOWER HOOK +23AA CURLY BRACKET EXTENSION +23AB RIGHT CURLY BRACKET UPPER HOOK +23AC RIGHT CURLY BRACKET MIDDLE PIECE +23AD RIGHT CURLY BRACKET LOWER HOOK +@ Special character extensions +23AE INTEGRAL EXTENSION + x (top half integral - 2320) + x (bottom half integral - 2321) +23AF HORIZONTAL LINE EXTENSION + * used for extension of arrows + x (vertical line extension - 23D0) +@ Bracket pieces +23B0 UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION + = left moustache +23B1 UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION + = right moustache +@ Summation sign parts +23B2 SUMMATION TOP +23B3 SUMMATION BOTTOM +@ Vertical brackets +23B4 TOP SQUARE BRACKET + x (presentation form for vertical left square bracket - FE47) +23B5 BOTTOM SQUARE BRACKET + x (presentation form for vertical right square bracket - FE48) +23B6 BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET +@ Terminal graphic characters +23B7 RADICAL SYMBOL BOTTOM +23B8 LEFT VERTICAL BOX LINE +23B9 RIGHT VERTICAL BOX LINE +@ Scan lines for terminal graphics +@+ The scan line numbers here refer to old, low-resolution technology for terminals, with only 9 scan lines per fixed-size character glyph. Even-numbered scan lines are unified with box-drawing graphics. +23BA HORIZONTAL SCAN LINE-1 +23BB HORIZONTAL SCAN LINE-3 +23BC HORIZONTAL SCAN LINE-7 +23BD HORIZONTAL SCAN LINE-9 +@ Dentistry notation symbols +23BE DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT + x (left ceiling - 2308) +23BF DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT + x (left floor - 230A) +23C0 DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE +23C1 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE +23C2 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE +23C3 DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE +23C4 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE +23C5 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE +23C6 DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE +23C7 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE +23C8 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE +23C9 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL + x (down tack - 22A4) + x (box drawings light down and horizontal - 252C) +23CA DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL + x (up tack - 22A5) + x (box drawings light up and horizontal - 2534) +23CB DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT + x (right ceiling - 2309) +23CC DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT + x (right floor - 230B) +@ Miscellaneous technical symbol +23CD SQUARE FOOT +@ Keyboard and UI symbols +23CE RETURN SYMBOL + * may be shown with either hollow or filled glyph + x (downwards arrow with corner leftwards - 21B5) +23CF EJECT SYMBOL + * UI symbol to eject media +@ Special character extension +23D0 VERTICAL LINE EXTENSION + * used for extension of arrows + x (horizontal line extension - 23AF) +@ Metrical symbols +23D1 METRICAL BREVE +23D2 METRICAL LONG OVER SHORT +23D3 METRICAL SHORT OVER LONG +23D4 METRICAL LONG OVER TWO SHORTS +23D5 METRICAL TWO SHORTS OVER LONG +23D6 METRICAL TWO SHORTS JOINED +23D7 METRICAL TRISEME + x (combining greek musical triseme - 1D242) +23D8 METRICAL TETRASEME + x (combining greek musical tetraseme - 1D243) +23D9 METRICAL PENTASEME + x (combining greek musical pentaseme - 1D244) +@ Electrotechnical symbols +23DA EARTH GROUND +23DB FUSE +@@ 2400 Control Pictures 243F +@+ The diagonal lettering glyphs are only exemplary; alternate representations may be, and often are used in the visible display of control codes. +@ Graphic pictures for control codes +2400 SYMBOL FOR NULL +2401 SYMBOL FOR START OF HEADING +2402 SYMBOL FOR START OF TEXT +2403 SYMBOL FOR END OF TEXT +2404 SYMBOL FOR END OF TRANSMISSION +2405 SYMBOL FOR ENQUIRY +2406 SYMBOL FOR ACKNOWLEDGE +2407 SYMBOL FOR BELL +2408 SYMBOL FOR BACKSPACE +2409 SYMBOL FOR HORIZONTAL TABULATION +240A SYMBOL FOR LINE FEED +240B SYMBOL FOR VERTICAL TABULATION +240C SYMBOL FOR FORM FEED +240D SYMBOL FOR CARRIAGE RETURN +240E SYMBOL FOR SHIFT OUT +240F SYMBOL FOR SHIFT IN +2410 SYMBOL FOR DATA LINK ESCAPE +2411 SYMBOL FOR DEVICE CONTROL ONE +2412 SYMBOL FOR DEVICE CONTROL TWO +2413 SYMBOL FOR DEVICE CONTROL THREE +2414 SYMBOL FOR DEVICE CONTROL FOUR +2415 SYMBOL FOR NEGATIVE ACKNOWLEDGE +2416 SYMBOL FOR SYNCHRONOUS IDLE +2417 SYMBOL FOR END OF TRANSMISSION BLOCK +2418 SYMBOL FOR CANCEL +2419 SYMBOL FOR END OF MEDIUM +241A SYMBOL FOR SUBSTITUTE +241B SYMBOL FOR ESCAPE +241C SYMBOL FOR FILE SEPARATOR +241D SYMBOL FOR GROUP SEPARATOR +241E SYMBOL FOR RECORD SEPARATOR +241F SYMBOL FOR UNIT SEPARATOR +2420 SYMBOL FOR SPACE +2421 SYMBOL FOR DELETE +@ Specific symbols for space +2422 BLANK SYMBOL + * graphic for space + x (latin small letter b with stroke - 0180) +2423 OPEN BOX + * graphic for space + x (counterbore - 2334) +@ Graphic picture for control code +2424 SYMBOL FOR NEWLINE +@ Keyboard symbol +2425 SYMBOL FOR DELETE FORM TWO + * from ISO 9995-7 + * keyboard symbol for undoable delete +@ Specific symbol for control code +2426 SYMBOL FOR SUBSTITUTE FORM TWO + * from ISO 2047 + x (arabic question mark - 061F) +@@ 2440 Optical Character Recognition 245F +@ OCR +2440 OCR HOOK +2441 OCR CHAIR +2442 OCR FORK +2443 OCR INVERTED FORK +2444 OCR BELT BUCKLE +2445 OCR BOW TIE + x (bowtie - 22C8) +2446 OCR BRANCH BANK IDENTIFICATION + = transit +2447 OCR AMOUNT OF CHECK +2448 OCR DASH + = on us +2449 OCR CUSTOMER ACCOUNT NUMBER + = dash +244A OCR DOUBLE BACKSLASH +@@ 2460 Enclosed Alphanumerics 24FF +@ Circled numbers +2460 CIRCLED DIGIT ONE + # <circle> 0031 +2461 CIRCLED DIGIT TWO + # <circle> 0032 +2462 CIRCLED DIGIT THREE + # <circle> 0033 +2463 CIRCLED DIGIT FOUR + # <circle> 0034 +2464 CIRCLED DIGIT FIVE + # <circle> 0035 +2465 CIRCLED DIGIT SIX + # <circle> 0036 +2466 CIRCLED DIGIT SEVEN + # <circle> 0037 +2467 CIRCLED DIGIT EIGHT + # <circle> 0038 +2468 CIRCLED DIGIT NINE + # <circle> 0039 +2469 CIRCLED NUMBER TEN + # <circle> 0031 0030 +246A CIRCLED NUMBER ELEVEN + # <circle> 0031 0031 +246B CIRCLED NUMBER TWELVE + # <circle> 0031 0032 +246C CIRCLED NUMBER THIRTEEN + # <circle> 0031 0033 +246D CIRCLED NUMBER FOURTEEN + # <circle> 0031 0034 +246E CIRCLED NUMBER FIFTEEN + # <circle> 0031 0035 +246F CIRCLED NUMBER SIXTEEN + # <circle> 0031 0036 +2470 CIRCLED NUMBER SEVENTEEN + # <circle> 0031 0037 +2471 CIRCLED NUMBER EIGHTEEN + # <circle> 0031 0038 +2472 CIRCLED NUMBER NINETEEN + # <circle> 0031 0039 +2473 CIRCLED NUMBER TWENTY + # <circle> 0032 0030 +@ Parenthesized numbers +2474 PARENTHESIZED DIGIT ONE + # 0028 0031 0029 +2475 PARENTHESIZED DIGIT TWO + # 0028 0032 0029 +2476 PARENTHESIZED DIGIT THREE + # 0028 0033 0029 +2477 PARENTHESIZED DIGIT FOUR + # 0028 0034 0029 +2478 PARENTHESIZED DIGIT FIVE + # 0028 0035 0029 +2479 PARENTHESIZED DIGIT SIX + # 0028 0036 0029 +247A PARENTHESIZED DIGIT SEVEN + # 0028 0037 0029 +247B PARENTHESIZED DIGIT EIGHT + # 0028 0038 0029 +247C PARENTHESIZED DIGIT NINE + # 0028 0039 0029 +247D PARENTHESIZED NUMBER TEN + # 0028 0031 0030 0029 +247E PARENTHESIZED NUMBER ELEVEN + # 0028 0031 0031 0029 +247F PARENTHESIZED NUMBER TWELVE + # 0028 0031 0032 0029 +2480 PARENTHESIZED NUMBER THIRTEEN + # 0028 0031 0033 0029 +2481 PARENTHESIZED NUMBER FOURTEEN + # 0028 0031 0034 0029 +2482 PARENTHESIZED NUMBER FIFTEEN + # 0028 0031 0035 0029 +2483 PARENTHESIZED NUMBER SIXTEEN + # 0028 0031 0036 0029 +2484 PARENTHESIZED NUMBER SEVENTEEN + # 0028 0031 0037 0029 +2485 PARENTHESIZED NUMBER EIGHTEEN + # 0028 0031 0038 0029 +2486 PARENTHESIZED NUMBER NINETEEN + # 0028 0031 0039 0029 +2487 PARENTHESIZED NUMBER TWENTY + # 0028 0032 0030 0029 +@ Numbers period +2488 DIGIT ONE FULL STOP + # 0031 002E +2489 DIGIT TWO FULL STOP + # 0032 002E +248A DIGIT THREE FULL STOP + # 0033 002E +248B DIGIT FOUR FULL STOP + # 0034 002E +248C DIGIT FIVE FULL STOP + # 0035 002E +248D DIGIT SIX FULL STOP + # 0036 002E +248E DIGIT SEVEN FULL STOP + # 0037 002E +248F DIGIT EIGHT FULL STOP + # 0038 002E +2490 DIGIT NINE FULL STOP + # 0039 002E +2491 NUMBER TEN FULL STOP + # 0031 0030 002E +2492 NUMBER ELEVEN FULL STOP + # 0031 0031 002E +2493 NUMBER TWELVE FULL STOP + # 0031 0032 002E +2494 NUMBER THIRTEEN FULL STOP + # 0031 0033 002E +2495 NUMBER FOURTEEN FULL STOP + # 0031 0034 002E +2496 NUMBER FIFTEEN FULL STOP + # 0031 0035 002E +2497 NUMBER SIXTEEN FULL STOP + # 0031 0036 002E +2498 NUMBER SEVENTEEN FULL STOP + # 0031 0037 002E +2499 NUMBER EIGHTEEN FULL STOP + # 0031 0038 002E +249A NUMBER NINETEEN FULL STOP + # 0031 0039 002E +249B NUMBER TWENTY FULL STOP + # 0032 0030 002E +@ Parenthesized Latin letters +249C PARENTHESIZED LATIN SMALL LETTER A + # 0028 0061 0029 +249D PARENTHESIZED LATIN SMALL LETTER B + # 0028 0062 0029 +249E PARENTHESIZED LATIN SMALL LETTER C + # 0028 0063 0029 +249F PARENTHESIZED LATIN SMALL LETTER D + # 0028 0064 0029 +24A0 PARENTHESIZED LATIN SMALL LETTER E + # 0028 0065 0029 +24A1 PARENTHESIZED LATIN SMALL LETTER F + # 0028 0066 0029 +24A2 PARENTHESIZED LATIN SMALL LETTER G + # 0028 0067 0029 +24A3 PARENTHESIZED LATIN SMALL LETTER H + # 0028 0068 0029 +24A4 PARENTHESIZED LATIN SMALL LETTER I + # 0028 0069 0029 +24A5 PARENTHESIZED LATIN SMALL LETTER J + # 0028 006A 0029 +24A6 PARENTHESIZED LATIN SMALL LETTER K + # 0028 006B 0029 +24A7 PARENTHESIZED LATIN SMALL LETTER L + # 0028 006C 0029 +24A8 PARENTHESIZED LATIN SMALL LETTER M + # 0028 006D 0029 +24A9 PARENTHESIZED LATIN SMALL LETTER N + # 0028 006E 0029 +24AA PARENTHESIZED LATIN SMALL LETTER O + # 0028 006F 0029 +24AB PARENTHESIZED LATIN SMALL LETTER P + # 0028 0070 0029 +24AC PARENTHESIZED LATIN SMALL LETTER Q + # 0028 0071 0029 +24AD PARENTHESIZED LATIN SMALL LETTER R + # 0028 0072 0029 +24AE PARENTHESIZED LATIN SMALL LETTER S + # 0028 0073 0029 +24AF PARENTHESIZED LATIN SMALL LETTER T + # 0028 0074 0029 +24B0 PARENTHESIZED LATIN SMALL LETTER U + # 0028 0075 0029 +24B1 PARENTHESIZED LATIN SMALL LETTER V + # 0028 0076 0029 +24B2 PARENTHESIZED LATIN SMALL LETTER W + # 0028 0077 0029 +24B3 PARENTHESIZED LATIN SMALL LETTER X + # 0028 0078 0029 +24B4 PARENTHESIZED LATIN SMALL LETTER Y + # 0028 0079 0029 +24B5 PARENTHESIZED LATIN SMALL LETTER Z + # 0028 007A 0029 +@ Circled Latin letters +24B6 CIRCLED LATIN CAPITAL LETTER A + # <circle> 0041 +24B7 CIRCLED LATIN CAPITAL LETTER B + # <circle> 0042 +24B8 CIRCLED LATIN CAPITAL LETTER C + # <circle> 0043 +24B9 CIRCLED LATIN CAPITAL LETTER D + # <circle> 0044 +24BA CIRCLED LATIN CAPITAL LETTER E + # <circle> 0045 +24BB CIRCLED LATIN CAPITAL LETTER F + # <circle> 0046 +24BC CIRCLED LATIN CAPITAL LETTER G + # <circle> 0047 +24BD CIRCLED LATIN CAPITAL LETTER H + # <circle> 0048 +24BE CIRCLED LATIN CAPITAL LETTER I + # <circle> 0049 +24BF CIRCLED LATIN CAPITAL LETTER J + # <circle> 004A +24C0 CIRCLED LATIN CAPITAL LETTER K + # <circle> 004B +24C1 CIRCLED LATIN CAPITAL LETTER L + # <circle> 004C +24C2 CIRCLED LATIN CAPITAL LETTER M + # <circle> 004D +24C3 CIRCLED LATIN CAPITAL LETTER N + # <circle> 004E +24C4 CIRCLED LATIN CAPITAL LETTER O + # <circle> 004F +24C5 CIRCLED LATIN CAPITAL LETTER P + # <circle> 0050 +24C6 CIRCLED LATIN CAPITAL LETTER Q + # <circle> 0051 +24C7 CIRCLED LATIN CAPITAL LETTER R + # <circle> 0052 +24C8 CIRCLED LATIN CAPITAL LETTER S + # <circle> 0053 +24C9 CIRCLED LATIN CAPITAL LETTER T + # <circle> 0054 +24CA CIRCLED LATIN CAPITAL LETTER U + # <circle> 0055 +24CB CIRCLED LATIN CAPITAL LETTER V + # <circle> 0056 +24CC CIRCLED LATIN CAPITAL LETTER W + # <circle> 0057 +24CD CIRCLED LATIN CAPITAL LETTER X + # <circle> 0058 +24CE CIRCLED LATIN CAPITAL LETTER Y + # <circle> 0059 +24CF CIRCLED LATIN CAPITAL LETTER Z + # <circle> 005A +24D0 CIRCLED LATIN SMALL LETTER A + # <circle> 0061 +24D1 CIRCLED LATIN SMALL LETTER B + # <circle> 0062 +24D2 CIRCLED LATIN SMALL LETTER C + # <circle> 0063 +24D3 CIRCLED LATIN SMALL LETTER D + # <circle> 0064 +24D4 CIRCLED LATIN SMALL LETTER E + # <circle> 0065 +24D5 CIRCLED LATIN SMALL LETTER F + # <circle> 0066 +24D6 CIRCLED LATIN SMALL LETTER G + # <circle> 0067 +24D7 CIRCLED LATIN SMALL LETTER H + # <circle> 0068 +24D8 CIRCLED LATIN SMALL LETTER I + # <circle> 0069 +24D9 CIRCLED LATIN SMALL LETTER J + # <circle> 006A +24DA CIRCLED LATIN SMALL LETTER K + # <circle> 006B +24DB CIRCLED LATIN SMALL LETTER L + # <circle> 006C +24DC CIRCLED LATIN SMALL LETTER M + # <circle> 006D +24DD CIRCLED LATIN SMALL LETTER N + # <circle> 006E +24DE CIRCLED LATIN SMALL LETTER O + # <circle> 006F +24DF CIRCLED LATIN SMALL LETTER P + # <circle> 0070 +24E0 CIRCLED LATIN SMALL LETTER Q + # <circle> 0071 +24E1 CIRCLED LATIN SMALL LETTER R + # <circle> 0072 +24E2 CIRCLED LATIN SMALL LETTER S + # <circle> 0073 +24E3 CIRCLED LATIN SMALL LETTER T + # <circle> 0074 +24E4 CIRCLED LATIN SMALL LETTER U + # <circle> 0075 +24E5 CIRCLED LATIN SMALL LETTER V + # <circle> 0076 +24E6 CIRCLED LATIN SMALL LETTER W + # <circle> 0077 +24E7 CIRCLED LATIN SMALL LETTER X + # <circle> 0078 +24E8 CIRCLED LATIN SMALL LETTER Y + # <circle> 0079 +24E9 CIRCLED LATIN SMALL LETTER Z + # <circle> 007A +@ Additional circled number +24EA CIRCLED DIGIT ZERO + # <circle> 0030 +@ White on black circled numbers +24EB NEGATIVE CIRCLED NUMBER ELEVEN +24EC NEGATIVE CIRCLED NUMBER TWELVE +24ED NEGATIVE CIRCLED NUMBER THIRTEEN +24EE NEGATIVE CIRCLED NUMBER FOURTEEN +24EF NEGATIVE CIRCLED NUMBER FIFTEEN +24F0 NEGATIVE CIRCLED NUMBER SIXTEEN +24F1 NEGATIVE CIRCLED NUMBER SEVENTEEN +24F2 NEGATIVE CIRCLED NUMBER EIGHTEEN +24F3 NEGATIVE CIRCLED NUMBER NINETEEN +24F4 NEGATIVE CIRCLED NUMBER TWENTY +@ Double circled numbers +24F5 DOUBLE CIRCLED DIGIT ONE +24F6 DOUBLE CIRCLED DIGIT TWO +24F7 DOUBLE CIRCLED DIGIT THREE +24F8 DOUBLE CIRCLED DIGIT FOUR +24F9 DOUBLE CIRCLED DIGIT FIVE +24FA DOUBLE CIRCLED DIGIT SIX +24FB DOUBLE CIRCLED DIGIT SEVEN +24FC DOUBLE CIRCLED DIGIT EIGHT +24FD DOUBLE CIRCLED DIGIT NINE +24FE DOUBLE CIRCLED NUMBER TEN +@ Additional white on black circled number +24FF NEGATIVE CIRCLED DIGIT ZERO + x (dingbat negative circled digit one - 2776) +@@ 2500 Box Drawing 257F +@ Form and chart components +2500 BOX DRAWINGS LIGHT HORIZONTAL + = Videotex Mosaic DG 15 +2501 BOX DRAWINGS HEAVY HORIZONTAL +2502 BOX DRAWINGS LIGHT VERTICAL + = Videotex Mosaic DG 14 +2503 BOX DRAWINGS HEAVY VERTICAL +2504 BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL +2505 BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL +2506 BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL +2507 BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL +2508 BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL +2509 BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL +250A BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL +250B BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL +250C BOX DRAWINGS LIGHT DOWN AND RIGHT + = Videotex Mosaic DG 16 +250D BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY +250E BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT +250F BOX DRAWINGS HEAVY DOWN AND RIGHT +2510 BOX DRAWINGS LIGHT DOWN AND LEFT + = Videotex Mosaic DG 17 +2511 BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY +2512 BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT +2513 BOX DRAWINGS HEAVY DOWN AND LEFT +2514 BOX DRAWINGS LIGHT UP AND RIGHT + = Videotex Mosaic DG 18 +2515 BOX DRAWINGS UP LIGHT AND RIGHT HEAVY +2516 BOX DRAWINGS UP HEAVY AND RIGHT LIGHT +2517 BOX DRAWINGS HEAVY UP AND RIGHT +2518 BOX DRAWINGS LIGHT UP AND LEFT + = Videotex Mosaic DG 19 +2519 BOX DRAWINGS UP LIGHT AND LEFT HEAVY +251A BOX DRAWINGS UP HEAVY AND LEFT LIGHT +251B BOX DRAWINGS HEAVY UP AND LEFT +251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT + = Videotex Mosaic DG 20 +251D BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY + = Videotex Mosaic DG 03 +251E BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT +251F BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT +2520 BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +2521 BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY +2522 BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY +2523 BOX DRAWINGS HEAVY VERTICAL AND RIGHT +2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT + = Videotex Mosaic DG 21 +2525 BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY + = Videotex Mosaic DG 04 +2526 BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT +2527 BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT +2528 BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +2529 BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY +252A BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY +252B BOX DRAWINGS HEAVY VERTICAL AND LEFT +252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + = Videotex Mosaic DG 22 +252D BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT +252E BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT +252F BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY + = Videotex Mosaic DG 02 +2530 BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +2531 BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY +2532 BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY +2533 BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL + = Videotex Mosaic DG 23 +2535 BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT +2536 BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT +2537 BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY + = Videotex Mosaic DG 01 +2538 BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +2539 BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY +253A BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY +253B BOX DRAWINGS HEAVY UP AND HORIZONTAL +253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + = Videotex Mosaic DG 24 +253D BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT +253E BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT +253F BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY + = Videotex Mosaic DG 13 +2540 BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT +2541 BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT +2542 BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +2543 BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT +2544 BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT +2545 BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT +2546 BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT +2547 BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY +2548 BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY +2549 BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY +254A BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY +254B BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +254C BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL +254D BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL +254E BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL +254F BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL +2550 BOX DRAWINGS DOUBLE HORIZONTAL +2551 BOX DRAWINGS DOUBLE VERTICAL +2552 BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +2553 BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +2554 BOX DRAWINGS DOUBLE DOWN AND RIGHT +2555 BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +2556 BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +2557 BOX DRAWINGS DOUBLE DOWN AND LEFT +2558 BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +2559 BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +255A BOX DRAWINGS DOUBLE UP AND RIGHT +255B BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +255C BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +255D BOX DRAWINGS DOUBLE UP AND LEFT +255E BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +255F BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +2560 BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +2561 BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +2562 BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +2563 BOX DRAWINGS DOUBLE VERTICAL AND LEFT +2564 BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +2565 BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +2566 BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +2567 BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +2568 BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +2569 BOX DRAWINGS DOUBLE UP AND HORIZONTAL +256A BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +256B BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +256C BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +256D BOX DRAWINGS LIGHT ARC DOWN AND RIGHT +256E BOX DRAWINGS LIGHT ARC DOWN AND LEFT +256F BOX DRAWINGS LIGHT ARC UP AND LEFT +2570 BOX DRAWINGS LIGHT ARC UP AND RIGHT +2571 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT +2572 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT +2573 BOX DRAWINGS LIGHT DIAGONAL CROSS +2574 BOX DRAWINGS LIGHT LEFT +2575 BOX DRAWINGS LIGHT UP +2576 BOX DRAWINGS LIGHT RIGHT +2577 BOX DRAWINGS LIGHT DOWN +2578 BOX DRAWINGS HEAVY LEFT +2579 BOX DRAWINGS HEAVY UP +257A BOX DRAWINGS HEAVY RIGHT +257B BOX DRAWINGS HEAVY DOWN +257C BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT +257D BOX DRAWINGS LIGHT UP AND HEAVY DOWN +257E BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT +257F BOX DRAWINGS HEAVY UP AND LIGHT DOWN +@@ 2580 Block Elements 259F +@ Block elements +2580 UPPER HALF BLOCK +2581 LOWER ONE EIGHTH BLOCK +2582 LOWER ONE QUARTER BLOCK +2583 LOWER THREE EIGHTHS BLOCK +2584 LOWER HALF BLOCK +2585 LOWER FIVE EIGHTHS BLOCK +2586 LOWER THREE QUARTERS BLOCK +2587 LOWER SEVEN EIGHTHS BLOCK +2588 FULL BLOCK + = solid + x (black square - 25A0) +2589 LEFT SEVEN EIGHTHS BLOCK +258A LEFT THREE QUARTERS BLOCK +258B LEFT FIVE EIGHTHS BLOCK +258C LEFT HALF BLOCK +258D LEFT THREE EIGHTHS BLOCK +258E LEFT ONE QUARTER BLOCK +258F LEFT ONE EIGHTH BLOCK +2590 RIGHT HALF BLOCK +@ Shade characters +2591 LIGHT SHADE + * 25% +2592 MEDIUM SHADE + * 50% +2593 DARK SHADE + * 75% +@ Block elements +2594 UPPER ONE EIGHTH BLOCK +2595 RIGHT ONE EIGHTH BLOCK +@ Terminal graphic characters +2596 QUADRANT LOWER LEFT +2597 QUADRANT LOWER RIGHT +2598 QUADRANT UPPER LEFT +2599 QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT +259A QUADRANT UPPER LEFT AND LOWER RIGHT +259B QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT +259C QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT +259D QUADRANT UPPER RIGHT +259E QUADRANT UPPER RIGHT AND LOWER LEFT +259F QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT +@@ 25A0 Geometric Shapes 25FF +@ Geometric shapes +25A0 BLACK SQUARE + = moding mark (in ideographic text) + x (full block - 2588) +25A1 WHITE SQUARE + = quadrature + * may be used to represent a missing ideograph + x (combining enclosing square - 20DE) + x (ballot box - 2610) + x (geta mark - 3013) +25A2 WHITE SQUARE WITH ROUNDED CORNERS +25A3 WHITE SQUARE CONTAINING BLACK SMALL SQUARE +25A4 SQUARE WITH HORIZONTAL FILL +25A5 SQUARE WITH VERTICAL FILL +25A6 SQUARE WITH ORTHOGONAL CROSSHATCH FILL +25A7 SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL +25A8 SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL +25A9 SQUARE WITH DIAGONAL CROSSHATCH FILL +25AA BLACK SMALL SQUARE +25AB WHITE SMALL SQUARE +25AC BLACK RECTANGLE +25AD WHITE RECTANGLE +25AE BLACK VERTICAL RECTANGLE + = histogram marker + x (end of proof - 220E) +25AF WHITE VERTICAL RECTANGLE + x (apl functional symbol squish quad - 2337) + x (apl functional symbol quad - 2395) +25B0 BLACK PARALLELOGRAM +25B1 WHITE PARALLELOGRAM +25B2 BLACK UP-POINTING TRIANGLE +25B3 WHITE UP-POINTING TRIANGLE + = trine + x (combining enclosing upward pointing triangle - 20E4) + x (increment - 2206) +25B4 BLACK UP-POINTING SMALL TRIANGLE +25B5 WHITE UP-POINTING SMALL TRIANGLE +25B6 BLACK RIGHT-POINTING TRIANGLE +25B7 WHITE RIGHT-POINTING TRIANGLE + = z notation range restriction +25B8 BLACK RIGHT-POINTING SMALL TRIANGLE + x (triangular bullet - 2023) +25B9 WHITE RIGHT-POINTING SMALL TRIANGLE +25BA BLACK RIGHT-POINTING POINTER +25BB WHITE RIGHT-POINTING POINTER + = forward arrow indicator + x (contains as normal subgroup - 22B3) +25BC BLACK DOWN-POINTING TRIANGLE +25BD WHITE DOWN-POINTING TRIANGLE + = Hamilton operator + x (nabla - 2207) +25BE BLACK DOWN-POINTING SMALL TRIANGLE +25BF WHITE DOWN-POINTING SMALL TRIANGLE +25C0 BLACK LEFT-POINTING TRIANGLE +25C1 WHITE LEFT-POINTING TRIANGLE + = z notation domain restriction +25C2 BLACK LEFT-POINTING SMALL TRIANGLE +25C3 WHITE LEFT-POINTING SMALL TRIANGLE +25C4 BLACK LEFT-POINTING POINTER +25C5 WHITE LEFT-POINTING POINTER + = backward arrow indicator + x (normal subgroup of - 22B2) +25C6 BLACK DIAMOND + x (black diamond suit - 2666) +25C7 WHITE DIAMOND + x (combining enclosing diamond - 20DF) + x (diamond operator - 22C4) + x (white diamond suit - 2662) +25C8 WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND +25C9 FISHEYE + = tainome (Japanese, a kind of bullet) +25CA LOZENGE + x (white diamond suit - 2662) +25CB WHITE CIRCLE + x (combining enclosing circle - 20DD) + x (large circle - 25EF) + x (ideographic number zero - 3007) +25CC DOTTED CIRCLE + * note that the reference glyph for this character is intentionally larger than the dotted circle glyph used to indicate combining characters in this standard; see, for example, 0300 +25CD CIRCLE WITH VERTICAL FILL +25CE BULLSEYE + x (circled ring operator - 229A) +25CF BLACK CIRCLE +25D0 CIRCLE WITH LEFT HALF BLACK +25D1 CIRCLE WITH RIGHT HALF BLACK +25D2 CIRCLE WITH LOWER HALF BLACK +25D3 CIRCLE WITH UPPER HALF BLACK +25D4 CIRCLE WITH UPPER RIGHT QUADRANT BLACK +25D5 CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK +25D6 LEFT HALF BLACK CIRCLE +25D7 RIGHT HALF BLACK CIRCLE +25D8 INVERSE BULLET + x (bullet - 2022) + x (white bullet - 25E6) +25D9 INVERSE WHITE CIRCLE +25DA UPPER HALF INVERSE WHITE CIRCLE +25DB LOWER HALF INVERSE WHITE CIRCLE +25DC UPPER LEFT QUADRANT CIRCULAR ARC +25DD UPPER RIGHT QUADRANT CIRCULAR ARC +25DE LOWER RIGHT QUADRANT CIRCULAR ARC +25DF LOWER LEFT QUADRANT CIRCULAR ARC +25E0 UPPER HALF CIRCLE + x (arc - 2312) +25E1 LOWER HALF CIRCLE +25E2 BLACK LOWER RIGHT TRIANGLE +25E3 BLACK LOWER LEFT TRIANGLE +25E4 BLACK UPPER LEFT TRIANGLE +25E5 BLACK UPPER RIGHT TRIANGLE +25E6 WHITE BULLET + x (bullet - 2022) + x (ring operator - 2218) + x (inverse bullet - 25D8) +25E7 SQUARE WITH LEFT HALF BLACK + x (square with top half black - 2B12) +25E8 SQUARE WITH RIGHT HALF BLACK +25E9 SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK +25EA SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK +25EB WHITE SQUARE WITH VERTICAL BISECTING LINE +25EC WHITE UP-POINTING TRIANGLE WITH DOT +25ED UP-POINTING TRIANGLE WITH LEFT HALF BLACK +25EE UP-POINTING TRIANGLE WITH RIGHT HALF BLACK +25EF LARGE CIRCLE + x (combining enclosing circle - 20DD) + x (white circle - 25CB) + x (ideographic number zero - 3007) +@ Control code graphics +25F0 WHITE SQUARE WITH UPPER LEFT QUADRANT +25F1 WHITE SQUARE WITH LOWER LEFT QUADRANT +25F2 WHITE SQUARE WITH LOWER RIGHT QUADRANT +25F3 WHITE SQUARE WITH UPPER RIGHT QUADRANT +25F4 WHITE CIRCLE WITH UPPER LEFT QUADRANT +25F5 WHITE CIRCLE WITH LOWER LEFT QUADRANT +25F6 WHITE CIRCLE WITH LOWER RIGHT QUADRANT +25F7 WHITE CIRCLE WITH UPPER RIGHT QUADRANT +@ Geometric shapes +25F8 UPPER LEFT TRIANGLE +25F9 UPPER RIGHT TRIANGLE +25FA LOWER LEFT TRIANGLE + x (right triangle - 22BF) +25FB WHITE MEDIUM SQUARE + = always (modal operator) + x (white square - 25A1) +25FC BLACK MEDIUM SQUARE + x (black square - 25A0) +25FD WHITE MEDIUM SMALL SQUARE + x (white small square - 25AB) +25FE BLACK MEDIUM SMALL SQUARE + x (black small square - 25AA) +25FF LOWER RIGHT TRIANGLE + x (right triangle - 22BF) +@@ 2600 Miscellaneous Symbols 26FF +@ Weather and astrological symbols +2600 BLACK SUN WITH RAYS + = clear weather + x (sun - 2609) +2601 CLOUD + = cloudy weather +2602 UMBRELLA + = rainy weather +2603 SNOWMAN + = snowy weather +2604 COMET +2605 BLACK STAR + x (star operator - 22C6) +2606 WHITE STAR + x (stress outlined white star - 2729) +2607 LIGHTNING +2608 THUNDERSTORM +2609 SUN + x (circled dot operator - 2299) + x (black sun with rays - 2600) + x (white sun with rays - 263C) +260A ASCENDING NODE +260B DESCENDING NODE +260C CONJUNCTION +260D OPPOSITION +@ Miscellaneous symbols +260E BLACK TELEPHONE +260F WHITE TELEPHONE +2610 BALLOT BOX + x (white square - 25A1) +2611 BALLOT BOX WITH CHECK +2612 BALLOT BOX WITH X + x (squared times - 22A0) +2613 SALTIRE + = St. Andrew's Cross + x (ballot x - 2717) +@ Weather symbol +2614 UMBRELLA WITH RAIN DROPS + = showery weather +@ Miscellaneous symbol +2615 HOT BEVERAGE + = tea or coffee, depending on locale + * can be used to indicate a wait + x (watch - 231A) + x (hourglass - 231B) +@ Japanese chess symbols +2616 WHITE SHOGI PIECE +2617 BLACK SHOGI PIECE +@ Miscellaneous symbols +2618 SHAMROCK +2619 REVERSED ROTATED FLORAL HEART BULLET + * a binding signature mark + x (rotated floral heart bullet - 2767) +@ Pointing hand symbols +261A BLACK LEFT POINTING INDEX +261B BLACK RIGHT POINTING INDEX +261C WHITE LEFT POINTING INDEX +261D WHITE UP POINTING INDEX +261E WHITE RIGHT POINTING INDEX + = fist (typographic term) +261F WHITE DOWN POINTING INDEX +@ Warning signs +2620 SKULL AND CROSSBONES + = poison +2621 CAUTION SIGN +2622 RADIOACTIVE SIGN +2623 BIOHAZARD SIGN +@ Medical and healing symbols +2624 CADUCEUS + x (staff of aesculapius - 2695) +2625 ANKH +@ Religious and political symbols +2626 ORTHODOX CROSS +2627 CHI RHO + = Constantine's cross, Christogram + x (coptic symbol khi ro - 2CE9) +2628 CROSS OF LORRAINE +2629 CROSS OF JERUSALEM +262A STAR AND CRESCENT +262B FARSI SYMBOL + = SYMBOL OF IRAN +262C ADI SHAKTI + = Gurmukhi khanda +262D HAMMER AND SICKLE +262E PEACE SYMBOL +262F YIN YANG + x (tibetan symbol nor bu nyis -khyil - 0FCA) +@ Yijing trigram symbols +2630 TRIGRAM FOR HEAVEN + = qian2 +2631 TRIGRAM FOR LAKE + = dui4 +2632 TRIGRAM FOR FIRE + = li2 +2633 TRIGRAM FOR THUNDER + = zhen4 +2634 TRIGRAM FOR WIND + = xun4 +2635 TRIGRAM FOR WATER + = kan3 +2636 TRIGRAM FOR MOUNTAIN + = gen4 +2637 TRIGRAM FOR EARTH + = kun1 +@ Miscellaneous symbols +2638 WHEEL OF DHARMA + x (helm symbol - 2388) +2639 WHITE FROWNING FACE +263A WHITE SMILING FACE + = have a nice day! +263B BLACK SMILING FACE +263C WHITE SUN WITH RAYS + = compass + x (sun - 2609) +@ Astrological symbols +263D FIRST QUARTER MOON +263E LAST QUARTER MOON +263F MERCURY +2640 FEMALE SIGN + = Venus +2641 EARTH + x (circled plus - 2295) +2642 MALE SIGN + = Mars +2643 JUPITER +2644 SATURN +2645 URANUS +2646 NEPTUNE +2647 PLUTO +@ Zodiacal symbols +2648 ARIES +2649 TAURUS +264A GEMINI +264B CANCER +264C LEO +264D VIRGO + = minim (alternate glyph) +264E LIBRA +264F SCORPIUS + = minim, drop +2650 SAGITTARIUS +2651 CAPRICORN +2652 AQUARIUS +2653 PISCES +@ Chess symbols +2654 WHITE CHESS KING +2655 WHITE CHESS QUEEN +2656 WHITE CHESS ROOK +2657 WHITE CHESS BISHOP +2658 WHITE CHESS KNIGHT +2659 WHITE CHESS PAWN +265A BLACK CHESS KING +265B BLACK CHESS QUEEN +265C BLACK CHESS ROOK +265D BLACK CHESS BISHOP +265E BLACK CHESS KNIGHT +265F BLACK CHESS PAWN +@ Playing card symbols +2660 BLACK SPADE SUIT +2661 WHITE HEART SUIT +2662 WHITE DIAMOND SUIT + x (white diamond - 25C7) + x (lozenge - 25CA) +2663 BLACK CLUB SUIT + = shamrock +2664 WHITE SPADE SUIT +2665 BLACK HEART SUIT + = valentine + x (heavy black heart - 2764) +2666 BLACK DIAMOND SUIT + x (black diamond - 25C6) +2667 WHITE CLUB SUIT +@ Miscellaneous symbol +2668 HOT SPRINGS +@ Musical symbols +2669 QUARTER NOTE +266A EIGHTH NOTE +266B BEAMED EIGHTH NOTES +266C BEAMED SIXTEENTH NOTES +266D MUSIC FLAT SIGN +266E MUSIC NATURAL SIGN +266F MUSIC SHARP SIGN + = z notation infix bag count + x (number sign - 0023) +@ Syriac cross symbols +@+ These symbols are used in liturgical texts of Syriac-speaking churches. +2670 WEST SYRIAC CROSS +2671 EAST SYRIAC CROSS +@ Recycling symbols +2672 UNIVERSAL RECYCLING SYMBOL + * used as generic symbol for recycling or to indicate that material is recyclable +2673 RECYCLING SYMBOL FOR TYPE-1 PLASTICS (pete) + * polyethylene terephthalate +2674 RECYCLING SYMBOL FOR TYPE-2 PLASTICS (hdpe) + * high density polyethylene +2675 RECYCLING SYMBOL FOR TYPE-3 PLASTICS (pvc) + * vinyl, polyvinyl chloride +2676 RECYCLING SYMBOL FOR TYPE-4 PLASTICS (ldpe) + * low density polyethylene +2677 RECYCLING SYMBOL FOR TYPE-5 PLASTICS (pp) + * polypropylene +2678 RECYCLING SYMBOL FOR TYPE-6 PLASTICS (ps) + * polystyrene +2679 RECYCLING SYMBOL FOR TYPE-7 PLASTICS (other) + * other plastics +267A RECYCLING SYMBOL FOR GENERIC MATERIALS + * used together with other text and labels to indicate the type of material to be recycled +267B BLACK UNIVERSAL RECYCLING SYMBOL +267C RECYCLED PAPER SYMBOL + * used to indicate 100% recycled paper content +267D PARTIALLY-RECYCLED PAPER SYMBOL + * percentage of recycled paper content indicated in overlay or next to this symbol +@ Miscellaneous symbols +267E PERMANENT PAPER SIGN +267F WHEELCHAIR SYMBOL +@ Dice +2680 DIE FACE-1 +2681 DIE FACE-2 +2682 DIE FACE-3 +2683 DIE FACE-4 +2684 DIE FACE-5 +2685 DIE FACE-6 +@ Go markers +2686 WHITE CIRCLE WITH DOT RIGHT +2687 WHITE CIRCLE WITH TWO DOTS +2688 BLACK CIRCLE WITH WHITE DOT RIGHT +2689 BLACK CIRCLE WITH TWO WHITE DOTS +@ Yijing monogram and digram symbols +268A MONOGRAM FOR YANG +268B MONOGRAM FOR YIN +268C DIGRAM FOR GREATER YANG +268D DIGRAM FOR LESSER YIN +268E DIGRAM FOR LESSER YANG +268F DIGRAM FOR GREATER YIN +@ Dictionary and map symbols +2690 WHITE FLAG +2691 BLACK FLAG +2692 HAMMER AND PICK + = mining, working day (in timetables) +2693 ANCHOR + = nautical term, harbor (on maps) +2694 CROSSED SWORDS + = military term, battleground (on maps), killed in action +2695 STAFF OF AESCULAPIUS + = medical term + * both inclined or upright renderings of this symbol are common + x (caduceus - 2624) +2696 SCALES + = legal term, jurisprudence +2697 ALEMBIC + = chemical term, chemistry +2698 FLOWER + = botanical term + x (flower punctuation mark - 2055) + x (shamrock - 2618) + x (white florette - 2740) +2699 GEAR + = technology, tools +269A STAFF OF HERMES + * signifies a commercial term or commerce + * glyph shows a heraldic staff with a winged wheel +269B ATOM SYMBOL + = nuclear installation (on maps) +@ Miscellaneous symbols +269C FLEUR-DE-LIS +26A0 WARNING SIGN +26A1 HIGH VOLTAGE SIGN +@ Gender symbols +26A2 DOUBLED FEMALE SIGN + = lesbianism +26A3 DOUBLED MALE SIGN + * a glyph variant has the two circles on the same line + = male homosexuality +26A4 INTERLOCKED FEMALE AND MALE SIGN + * a glyph variant has the two circles on the same line + = bisexuality +26A5 MALE AND FEMALE SIGN + = transgendered sexuality + = hermaphrodite (in entomology) +26A6 MALE WITH STROKE SIGN + = transgendered sexuality +26A7 MALE WITH STROKE AND MALE AND FEMALE SIGN + = transgendered sexuality +26A8 VERTICAL MALE WITH STROKE SIGN + = ferrous iron sulphate (alchemy and older chemistry) +26A9 HORIZONTAL MALE WITH STROKE SIGN + = magnesium (alchemy and older chemistry) +@ Circles +26AA MEDIUM WHITE CIRCLE + = asexuality, sexless, genderless + = engaged, betrothed + * base for male or female sign +26AB MEDIUM BLACK CIRCLE + * UI symbol for record function +26AC MEDIUM SMALL WHITE CIRCLE + = engaged, betrothed (genealogy) + * can represent wedding ring +@ Genealogical symbols +26AD MARRIAGE SYMBOL + x (infinity - 221E) +26AE DIVORCE SYMBOL + x (infinity negated with vertical bar - 29DE) +26AF UNMARRIED PARTNERSHIP SYMBOL + x (double-ended multimap - 29DF) +26B0 COFFIN + = buried (genealogy) + x (white rectangle - 25AD) +26B1 FUNERAL URN + = cremated (genealogy) +@@ 2700 Dingbats 27BF +@+ ITC Zapf dingbats series 100 +@ Miscellaneous +2701 UPPER BLADE SCISSORS +2702 BLACK SCISSORS +2703 LOWER BLADE SCISSORS +2704 WHITE SCISSORS +2705 <reserved> + x (black telephone - 260E) +2706 TELEPHONE LOCATION SIGN +2707 TAPE DRIVE +2708 AIRPLANE +2709 ENVELOPE +270A <reserved> + x (black right pointing index - 261B) +270B <reserved> + x (white right pointing index - 261E) +270C VICTORY HAND +270D WRITING HAND +270E LOWER RIGHT PENCIL +270F PENCIL +2710 UPPER RIGHT PENCIL +2711 WHITE NIB +2712 BLACK NIB +2713 CHECK MARK + x (square root - 221A) +2714 HEAVY CHECK MARK +2715 MULTIPLICATION X + x (multiplication sign - 00D7) + x (box drawings light diagonal cross - 2573) +2716 HEAVY MULTIPLICATION X +2717 BALLOT X + x (saltire - 2613) +2718 HEAVY BALLOT X +@ Crosses +2719 OUTLINED GREEK CROSS +271A HEAVY GREEK CROSS +271B OPEN CENTRE CROSS +271C HEAVY OPEN CENTRE CROSS +271D LATIN CROSS +271E SHADOWED WHITE LATIN CROSS +271F OUTLINED LATIN CROSS +2720 MALTESE CROSS + * Historically, the Maltese cross took many forms; the shape shown in the Zapf Dingbats is similar to one known as the Cross Formée. +@ Stars, asterisks and snowflakes +2721 STAR OF DAVID +2722 FOUR TEARDROP-SPOKED ASTERISK +2723 FOUR BALLOON-SPOKED ASTERISK +2724 HEAVY FOUR BALLOON-SPOKED ASTERISK +2725 FOUR CLUB-SPOKED ASTERISK +2726 BLACK FOUR POINTED STAR +2727 WHITE FOUR POINTED STAR +2728 <reserved> + x (black star - 2605) +2729 STRESS OUTLINED WHITE STAR + x (white star - 2606) +272A CIRCLED WHITE STAR +272B OPEN CENTRE BLACK STAR +272C BLACK CENTRE WHITE STAR +272D OUTLINED BLACK STAR +272E HEAVY OUTLINED BLACK STAR +272F PINWHEEL STAR +2730 SHADOWED WHITE STAR +2731 HEAVY ASTERISK + x (asterisk - 002A) +2732 OPEN CENTRE ASTERISK +2733 EIGHT SPOKED ASTERISK +2734 EIGHT POINTED BLACK STAR +2735 EIGHT POINTED PINWHEEL STAR +2736 SIX POINTED BLACK STAR + = sextile +2737 EIGHT POINTED RECTILINEAR BLACK STAR +2738 HEAVY EIGHT POINTED RECTILINEAR BLACK STAR +2739 TWELVE POINTED BLACK STAR +273A SIXTEEN POINTED ASTERISK + = starburst +273B TEARDROP-SPOKED ASTERISK +273C OPEN CENTRE TEARDROP-SPOKED ASTERISK +273D HEAVY TEARDROP-SPOKED ASTERISK +273E SIX PETALLED BLACK AND WHITE FLORETTE +273F BLACK FLORETTE +2740 WHITE FLORETTE +2741 EIGHT PETALLED OUTLINED BLACK FLORETTE +2742 CIRCLED OPEN CENTRE EIGHT POINTED STAR +2743 HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK +2744 SNOWFLAKE +2745 TIGHT TRIFOLIATE SNOWFLAKE +2746 HEAVY CHEVRON SNOWFLAKE +2747 SPARKLE +2748 HEAVY SPARKLE +2749 BALLOON-SPOKED ASTERISK + = jack +274A EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274B HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK + = turbofan +@ Miscellaneous +274C <reserved> + x (black circle - 25CF) +274D SHADOWED WHITE CIRCLE +274E <reserved> + x (black square - 25A0) +274F LOWER RIGHT DROP-SHADOWED WHITE SQUARE +2750 UPPER RIGHT DROP-SHADOWED WHITE SQUARE +2751 LOWER RIGHT SHADOWED WHITE SQUARE +2752 UPPER RIGHT SHADOWED WHITE SQUARE +2753 <reserved> + x (black up-pointing triangle - 25B2) +2754 <reserved> + x (black down-pointing triangle - 25BC) +2755 <reserved> + x (black diamond - 25C6) +2756 BLACK DIAMOND MINUS WHITE X +2757 <reserved> + x (right half black circle - 25D7) +2758 LIGHT VERTICAL BAR + x (vertical line - 007C) +2759 MEDIUM VERTICAL BAR +275A HEAVY VERTICAL BAR +@ Punctuation ornaments +275B HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT + x (left single quotation mark - 2018) +275C HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT + x (right single quotation mark - 2019) +275D HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT + x (left double quotation mark - 201C) +275E HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT + x (right double quotation mark - 201D) +2761 CURVED STEM PARAGRAPH SIGN ORNAMENT + x (pilcrow sign - 00B6) +2762 HEAVY EXCLAMATION MARK ORNAMENT + x (exclamation mark - 0021) +2763 HEAVY HEART EXCLAMATION MARK ORNAMENT +2764 HEAVY BLACK HEART + x (black heart suit - 2665) +2765 ROTATED HEAVY BLACK HEART BULLET +2766 FLORAL HEART + = Aldus leaf +2767 ROTATED FLORAL HEART BULLET + = hedera, ivy leaf + x (reversed rotated floral heart bullet - 2619) +@ Ornamental brackets +2768 MEDIUM LEFT PARENTHESIS ORNAMENT + x (left parenthesis - 0028) +2769 MEDIUM RIGHT PARENTHESIS ORNAMENT + x (right parenthesis - 0029) +276A MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT + x (left-pointing angle bracket - 2329) +276D MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT + x (right-pointing angle bracket - 232A) +276E HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT + x (single left-pointing angle quotation mark - 2039) +276F HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT + x (single right-pointing angle quotation mark - 203A) +2770 HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT + x (left tortoise shell bracket - 3014) +2773 LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT + x (right tortoise shell bracket - 3015) +2774 MEDIUM LEFT CURLY BRACKET ORNAMENT + x (left curly bracket - 007B) +2775 MEDIUM RIGHT CURLY BRACKET ORNAMENT + x (right curly bracket - 007D) +@ Dingbat circled digits +2776 DINGBAT NEGATIVE CIRCLED DIGIT ONE +2777 DINGBAT NEGATIVE CIRCLED DIGIT TWO +2778 DINGBAT NEGATIVE CIRCLED DIGIT THREE +2779 DINGBAT NEGATIVE CIRCLED DIGIT FOUR +277A DINGBAT NEGATIVE CIRCLED DIGIT FIVE +277B DINGBAT NEGATIVE CIRCLED DIGIT SIX +277C DINGBAT NEGATIVE CIRCLED DIGIT SEVEN +277D DINGBAT NEGATIVE CIRCLED DIGIT EIGHT +277E DINGBAT NEGATIVE CIRCLED DIGIT NINE +277F DINGBAT NEGATIVE CIRCLED NUMBER TEN +2780 DINGBAT CIRCLED SANS-SERIF DIGIT ONE +2781 DINGBAT CIRCLED SANS-SERIF DIGIT TWO +2782 DINGBAT CIRCLED SANS-SERIF DIGIT THREE +2783 DINGBAT CIRCLED SANS-SERIF DIGIT FOUR +2784 DINGBAT CIRCLED SANS-SERIF DIGIT FIVE +2785 DINGBAT CIRCLED SANS-SERIF DIGIT SIX +2786 DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN +2787 DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT +2788 DINGBAT CIRCLED SANS-SERIF DIGIT NINE +2789 DINGBAT CIRCLED SANS-SERIF NUMBER TEN +278A DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE +278B DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO +278C DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE +278D DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR +278E DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE +278F DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX +2790 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN +2791 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT +2792 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE +2793 DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +@ Dingbat arrows +2794 HEAVY WIDE-HEADED RIGHTWARDS ARROW +2795 <reserved> + x (rightwards arrow - 2192) +2796 <reserved> + x (left right arrow - 2194) +2797 <reserved> + x (up down arrow - 2195) +2798 HEAVY SOUTH EAST ARROW +2799 HEAVY RIGHTWARDS ARROW +279A HEAVY NORTH EAST ARROW +279B DRAFTING POINT RIGHTWARDS ARROW +279C HEAVY ROUND-TIPPED RIGHTWARDS ARROW +279D TRIANGLE-HEADED RIGHTWARDS ARROW +279E HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW +279F DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +27A0 HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +27A1 BLACK RIGHTWARDS ARROW +27A2 THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD +27A3 THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD +27A4 BLACK RIGHTWARDS ARROWHEAD +27A5 HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW +27A6 HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW +27A7 SQUAT BLACK RIGHTWARDS ARROW +27A8 HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW +27A9 RIGHT-SHADED WHITE RIGHTWARDS ARROW +27AA LEFT-SHADED WHITE RIGHTWARDS ARROW +27AB BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW +27AC FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW +27AD HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27AE HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27AF NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B1 NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B2 CIRCLED HEAVY WHITE RIGHTWARDS ARROW +27B3 WHITE-FEATHERED RIGHTWARDS ARROW +27B4 BLACK-FEATHERED SOUTH EAST ARROW +27B5 BLACK-FEATHERED RIGHTWARDS ARROW +27B6 BLACK-FEATHERED NORTH EAST ARROW +27B7 HEAVY BLACK-FEATHERED SOUTH EAST ARROW +27B8 HEAVY BLACK-FEATHERED RIGHTWARDS ARROW +27B9 HEAVY BLACK-FEATHERED NORTH EAST ARROW +27BA TEARDROP-BARBED RIGHTWARDS ARROW +27BB HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW +27BC WEDGE-TAILED RIGHTWARDS ARROW +27BD HEAVY WEDGE-TAILED RIGHTWARDS ARROW +27BE OPEN-OUTLINED RIGHTWARDS ARROW +@@ 27C0 Miscellaneous Mathematical Symbols-A 27EF +@ Miscellaneous symbols +27C0 THREE DIMENSIONAL ANGLE + * used by Euclid +27C1 WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE + * used by Euclid +27C2 PERPENDICULAR + = orthogonal to + * relation, typeset with additional spacing + x (up tack - 22A5) +27C3 OPEN SUBSET +27C4 OPEN SUPERSET +27C5 LEFT S-SHAPED BAG DELIMITER +27C6 RIGHT S-SHAPED BAG DELIMITER +27D0 WHITE DIAMOND WITH CENTRED DOT +@ Operators +27D1 AND WITH DOT + x (logical and - 2227) + x (intersection with dot - 2A40) +27D2 ELEMENT OF OPENING UPWARDS + x (element of opening downwards - 2AD9) +27D3 LOWER RIGHT CORNER WITH DOT + = pullback + x (right floor - 230B) +27D4 UPPER LEFT CORNER WITH DOT + = pushout + x (left ceiling - 2308) +@ Database theory operators +27D5 LEFT OUTER JOIN +27D6 RIGHT OUTER JOIN +27D7 FULL OUTER JOIN + x (join - 2A1D) +@ Tacks and turnstiles +27D8 LARGE UP TACK + x (up tack - 22A5) +27D9 LARGE DOWN TACK + x (down tack - 22A4) +27DA LEFT AND RIGHT DOUBLE TURNSTILE + x (true - 22A8) + x (vertical bar double left turnstile - 2AE4) +27DB LEFT AND RIGHT TACK + x (right tack - 22A2) +27DC LEFT MULTIMAP + x (multimap - 22B8) +27DD LONG RIGHT TACK + x (right tack - 22A2) +27DE LONG LEFT TACK + x (left tack - 22A3) +27DF UP TACK WITH CIRCLE ABOVE + = radial component + x (down tack with circle below - 2AF1) +@ Modal logic operators +27E0 LOZENGE DIVIDED BY HORIZONTAL RULE + * used as form of possibility in modal logic + x (lozenge - 25CA) +27E1 WHITE CONCAVE-SIDED DIAMOND + = never (modal operator) +27E2 WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK + = was never (modal operator) +27E3 WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK + = will never be (modal operator) +27E4 WHITE SQUARE WITH LEFTWARDS TICK + = was always (modal operator) + x (white square - 25A1) +27E5 WHITE SQUARE WITH RIGHTWARDS TICK + = will always be (modal operator) +@ Mathematical brackets +27E6 MATHEMATICAL LEFT WHITE SQUARE BRACKET + = z notation left bag bracket + x (left white square bracket - 301A) +27E7 MATHEMATICAL RIGHT WHITE SQUARE BRACKET + = z notation right bag bracket + x (right white square bracket - 301B) +27E8 MATHEMATICAL LEFT ANGLE BRACKET + = bra + = z notation left sequence bracket + x (left-pointing angle bracket - 2329) + x (left angle bracket - 3008) +27E9 MATHEMATICAL RIGHT ANGLE BRACKET + = ket + = z notation right sequence bracket + x (right-pointing angle bracket - 232A) + x (right angle bracket - 3009) +27EA MATHEMATICAL LEFT DOUBLE ANGLE BRACKET + = z notation left chevron bracket + x (left double angle bracket - 300A) +27EB MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET + = z notation right chevron bracket + x (right double angle bracket - 300B) +@@ 27F0 Supplemental Arrows-A 27FF +@ Arrows +27F0 UPWARDS QUADRUPLE ARROW + x (upwards triple arrow - 290A) +27F1 DOWNWARDS QUADRUPLE ARROW + x (downwards triple arrow - 290B) +27F2 ANTICLOCKWISE GAPPED CIRCLE ARROW + x (anticlockwise open circle arrow - 21BA) + x (anticlockwise closed circle arrow - 2940) +27F3 CLOCKWISE GAPPED CIRCLE ARROW + x (clockwise open circle arrow - 21BB) + x (clockwise closed circle arrow - 2941) +27F4 RIGHT ARROW WITH CIRCLED PLUS +@ Long arrows +@+ The long arrows are used for mapping whereas the short forms would be used in limits. They are also needed for MathML to complete mapping to the ASMA sets. +27F5 LONG LEFTWARDS ARROW + x (leftwards arrow - 2190) +27F6 LONG RIGHTWARDS ARROW + x (rightwards arrow - 2192) +27F7 LONG LEFT RIGHT ARROW + x (left right arrow - 2194) +27F8 LONG LEFTWARDS DOUBLE ARROW + x (leftwards double arrow - 21D0) +27F9 LONG RIGHTWARDS DOUBLE ARROW + x (rightwards double arrow - 21D2) +27FA LONG LEFT RIGHT DOUBLE ARROW + x (left right double arrow - 21D4) +27FB LONG LEFTWARDS ARROW FROM BAR + = maps from + x (leftwards arrow from bar - 21A4) +27FC LONG RIGHTWARDS ARROW FROM BAR + = maps to + x (rightwards arrow from bar - 21A6) +27FD LONG LEFTWARDS DOUBLE ARROW FROM BAR + x (leftwards double arrow from bar - 2906) +27FE LONG RIGHTWARDS DOUBLE ARROW FROM BAR + x (rightwards double arrow from bar - 2907) +27FF LONG RIGHTWARDS SQUIGGLE ARROW + x (rightwards squiggle arrow - 21DD) +@@ 2800 Braille Patterns 28FF +@ Braille patterns +2800 BRAILLE PATTERN BLANK +2801 BRAILLE PATTERN DOTS-1 +2802 BRAILLE PATTERN DOTS-2 +2803 BRAILLE PATTERN DOTS-12 +2804 BRAILLE PATTERN DOTS-3 +2805 BRAILLE PATTERN DOTS-13 +2806 BRAILLE PATTERN DOTS-23 +2807 BRAILLE PATTERN DOTS-123 +2808 BRAILLE PATTERN DOTS-4 +2809 BRAILLE PATTERN DOTS-14 +280A BRAILLE PATTERN DOTS-24 +280B BRAILLE PATTERN DOTS-124 +280C BRAILLE PATTERN DOTS-34 +280D BRAILLE PATTERN DOTS-134 +280E BRAILLE PATTERN DOTS-234 +280F BRAILLE PATTERN DOTS-1234 +2810 BRAILLE PATTERN DOTS-5 +2811 BRAILLE PATTERN DOTS-15 +2812 BRAILLE PATTERN DOTS-25 +2813 BRAILLE PATTERN DOTS-125 +2814 BRAILLE PATTERN DOTS-35 +2815 BRAILLE PATTERN DOTS-135 +2816 BRAILLE PATTERN DOTS-235 +2817 BRAILLE PATTERN DOTS-1235 +2818 BRAILLE PATTERN DOTS-45 +2819 BRAILLE PATTERN DOTS-145 +281A BRAILLE PATTERN DOTS-245 +281B BRAILLE PATTERN DOTS-1245 +281C BRAILLE PATTERN DOTS-345 +281D BRAILLE PATTERN DOTS-1345 +281E BRAILLE PATTERN DOTS-2345 +281F BRAILLE PATTERN DOTS-12345 +2820 BRAILLE PATTERN DOTS-6 +2821 BRAILLE PATTERN DOTS-16 +2822 BRAILLE PATTERN DOTS-26 +2823 BRAILLE PATTERN DOTS-126 +2824 BRAILLE PATTERN DOTS-36 +2825 BRAILLE PATTERN DOTS-136 +2826 BRAILLE PATTERN DOTS-236 +2827 BRAILLE PATTERN DOTS-1236 +2828 BRAILLE PATTERN DOTS-46 +2829 BRAILLE PATTERN DOTS-146 +282A BRAILLE PATTERN DOTS-246 +282B BRAILLE PATTERN DOTS-1246 +282C BRAILLE PATTERN DOTS-346 +282D BRAILLE PATTERN DOTS-1346 +282E BRAILLE PATTERN DOTS-2346 +282F BRAILLE PATTERN DOTS-12346 +2830 BRAILLE PATTERN DOTS-56 +2831 BRAILLE PATTERN DOTS-156 +2832 BRAILLE PATTERN DOTS-256 +2833 BRAILLE PATTERN DOTS-1256 +2834 BRAILLE PATTERN DOTS-356 +2835 BRAILLE PATTERN DOTS-1356 +2836 BRAILLE PATTERN DOTS-2356 +2837 BRAILLE PATTERN DOTS-12356 +2838 BRAILLE PATTERN DOTS-456 +2839 BRAILLE PATTERN DOTS-1456 +283A BRAILLE PATTERN DOTS-2456 +283B BRAILLE PATTERN DOTS-12456 +283C BRAILLE PATTERN DOTS-3456 +283D BRAILLE PATTERN DOTS-13456 +283E BRAILLE PATTERN DOTS-23456 +283F BRAILLE PATTERN DOTS-123456 +2840 BRAILLE PATTERN DOTS-7 +2841 BRAILLE PATTERN DOTS-17 +2842 BRAILLE PATTERN DOTS-27 +2843 BRAILLE PATTERN DOTS-127 +2844 BRAILLE PATTERN DOTS-37 +2845 BRAILLE PATTERN DOTS-137 +2846 BRAILLE PATTERN DOTS-237 +2847 BRAILLE PATTERN DOTS-1237 +2848 BRAILLE PATTERN DOTS-47 +2849 BRAILLE PATTERN DOTS-147 +284A BRAILLE PATTERN DOTS-247 +284B BRAILLE PATTERN DOTS-1247 +284C BRAILLE PATTERN DOTS-347 +284D BRAILLE PATTERN DOTS-1347 +284E BRAILLE PATTERN DOTS-2347 +284F BRAILLE PATTERN DOTS-12347 +2850 BRAILLE PATTERN DOTS-57 +2851 BRAILLE PATTERN DOTS-157 +2852 BRAILLE PATTERN DOTS-257 +2853 BRAILLE PATTERN DOTS-1257 +2854 BRAILLE PATTERN DOTS-357 +2855 BRAILLE PATTERN DOTS-1357 +2856 BRAILLE PATTERN DOTS-2357 +2857 BRAILLE PATTERN DOTS-12357 +2858 BRAILLE PATTERN DOTS-457 +2859 BRAILLE PATTERN DOTS-1457 +285A BRAILLE PATTERN DOTS-2457 +285B BRAILLE PATTERN DOTS-12457 +285C BRAILLE PATTERN DOTS-3457 +285D BRAILLE PATTERN DOTS-13457 +285E BRAILLE PATTERN DOTS-23457 +285F BRAILLE PATTERN DOTS-123457 +2860 BRAILLE PATTERN DOTS-67 +2861 BRAILLE PATTERN DOTS-167 +2862 BRAILLE PATTERN DOTS-267 +2863 BRAILLE PATTERN DOTS-1267 +2864 BRAILLE PATTERN DOTS-367 +2865 BRAILLE PATTERN DOTS-1367 +2866 BRAILLE PATTERN DOTS-2367 +2867 BRAILLE PATTERN DOTS-12367 +2868 BRAILLE PATTERN DOTS-467 +2869 BRAILLE PATTERN DOTS-1467 +286A BRAILLE PATTERN DOTS-2467 +286B BRAILLE PATTERN DOTS-12467 +286C BRAILLE PATTERN DOTS-3467 +286D BRAILLE PATTERN DOTS-13467 +286E BRAILLE PATTERN DOTS-23467 +286F BRAILLE PATTERN DOTS-123467 +2870 BRAILLE PATTERN DOTS-567 +2871 BRAILLE PATTERN DOTS-1567 +2872 BRAILLE PATTERN DOTS-2567 +2873 BRAILLE PATTERN DOTS-12567 +2874 BRAILLE PATTERN DOTS-3567 +2875 BRAILLE PATTERN DOTS-13567 +2876 BRAILLE PATTERN DOTS-23567 +2877 BRAILLE PATTERN DOTS-123567 +2878 BRAILLE PATTERN DOTS-4567 +2879 BRAILLE PATTERN DOTS-14567 +287A BRAILLE PATTERN DOTS-24567 +287B BRAILLE PATTERN DOTS-124567 +287C BRAILLE PATTERN DOTS-34567 +287D BRAILLE PATTERN DOTS-134567 +287E BRAILLE PATTERN DOTS-234567 +287F BRAILLE PATTERN DOTS-1234567 +2880 BRAILLE PATTERN DOTS-8 +2881 BRAILLE PATTERN DOTS-18 +2882 BRAILLE PATTERN DOTS-28 +2883 BRAILLE PATTERN DOTS-128 +2884 BRAILLE PATTERN DOTS-38 +2885 BRAILLE PATTERN DOTS-138 +2886 BRAILLE PATTERN DOTS-238 +2887 BRAILLE PATTERN DOTS-1238 +2888 BRAILLE PATTERN DOTS-48 +2889 BRAILLE PATTERN DOTS-148 +288A BRAILLE PATTERN DOTS-248 +288B BRAILLE PATTERN DOTS-1248 +288C BRAILLE PATTERN DOTS-348 +288D BRAILLE PATTERN DOTS-1348 +288E BRAILLE PATTERN DOTS-2348 +288F BRAILLE PATTERN DOTS-12348 +2890 BRAILLE PATTERN DOTS-58 +2891 BRAILLE PATTERN DOTS-158 +2892 BRAILLE PATTERN DOTS-258 +2893 BRAILLE PATTERN DOTS-1258 +2894 BRAILLE PATTERN DOTS-358 +2895 BRAILLE PATTERN DOTS-1358 +2896 BRAILLE PATTERN DOTS-2358 +2897 BRAILLE PATTERN DOTS-12358 +2898 BRAILLE PATTERN DOTS-458 +2899 BRAILLE PATTERN DOTS-1458 +289A BRAILLE PATTERN DOTS-2458 +289B BRAILLE PATTERN DOTS-12458 +289C BRAILLE PATTERN DOTS-3458 +289D BRAILLE PATTERN DOTS-13458 +289E BRAILLE PATTERN DOTS-23458 +289F BRAILLE PATTERN DOTS-123458 +28A0 BRAILLE PATTERN DOTS-68 +28A1 BRAILLE PATTERN DOTS-168 +28A2 BRAILLE PATTERN DOTS-268 +28A3 BRAILLE PATTERN DOTS-1268 +28A4 BRAILLE PATTERN DOTS-368 +28A5 BRAILLE PATTERN DOTS-1368 +28A6 BRAILLE PATTERN DOTS-2368 +28A7 BRAILLE PATTERN DOTS-12368 +28A8 BRAILLE PATTERN DOTS-468 +28A9 BRAILLE PATTERN DOTS-1468 +28AA BRAILLE PATTERN DOTS-2468 +28AB BRAILLE PATTERN DOTS-12468 +28AC BRAILLE PATTERN DOTS-3468 +28AD BRAILLE PATTERN DOTS-13468 +28AE BRAILLE PATTERN DOTS-23468 +28AF BRAILLE PATTERN DOTS-123468 +28B0 BRAILLE PATTERN DOTS-568 +28B1 BRAILLE PATTERN DOTS-1568 +28B2 BRAILLE PATTERN DOTS-2568 +28B3 BRAILLE PATTERN DOTS-12568 +28B4 BRAILLE PATTERN DOTS-3568 +28B5 BRAILLE PATTERN DOTS-13568 +28B6 BRAILLE PATTERN DOTS-23568 +28B7 BRAILLE PATTERN DOTS-123568 +28B8 BRAILLE PATTERN DOTS-4568 +28B9 BRAILLE PATTERN DOTS-14568 +28BA BRAILLE PATTERN DOTS-24568 +28BB BRAILLE PATTERN DOTS-124568 +28BC BRAILLE PATTERN DOTS-34568 +28BD BRAILLE PATTERN DOTS-134568 +28BE BRAILLE PATTERN DOTS-234568 +28BF BRAILLE PATTERN DOTS-1234568 +28C0 BRAILLE PATTERN DOTS-78 +28C1 BRAILLE PATTERN DOTS-178 +28C2 BRAILLE PATTERN DOTS-278 +28C3 BRAILLE PATTERN DOTS-1278 +28C4 BRAILLE PATTERN DOTS-378 +28C5 BRAILLE PATTERN DOTS-1378 +28C6 BRAILLE PATTERN DOTS-2378 +28C7 BRAILLE PATTERN DOTS-12378 +28C8 BRAILLE PATTERN DOTS-478 +28C9 BRAILLE PATTERN DOTS-1478 +28CA BRAILLE PATTERN DOTS-2478 +28CB BRAILLE PATTERN DOTS-12478 +28CC BRAILLE PATTERN DOTS-3478 +28CD BRAILLE PATTERN DOTS-13478 +28CE BRAILLE PATTERN DOTS-23478 +28CF BRAILLE PATTERN DOTS-123478 +28D0 BRAILLE PATTERN DOTS-578 +28D1 BRAILLE PATTERN DOTS-1578 +28D2 BRAILLE PATTERN DOTS-2578 +28D3 BRAILLE PATTERN DOTS-12578 +28D4 BRAILLE PATTERN DOTS-3578 +28D5 BRAILLE PATTERN DOTS-13578 +28D6 BRAILLE PATTERN DOTS-23578 +28D7 BRAILLE PATTERN DOTS-123578 +28D8 BRAILLE PATTERN DOTS-4578 +28D9 BRAILLE PATTERN DOTS-14578 +28DA BRAILLE PATTERN DOTS-24578 +28DB BRAILLE PATTERN DOTS-124578 +28DC BRAILLE PATTERN DOTS-34578 +28DD BRAILLE PATTERN DOTS-134578 +28DE BRAILLE PATTERN DOTS-234578 +28DF BRAILLE PATTERN DOTS-1234578 +28E0 BRAILLE PATTERN DOTS-678 +28E1 BRAILLE PATTERN DOTS-1678 +28E2 BRAILLE PATTERN DOTS-2678 +28E3 BRAILLE PATTERN DOTS-12678 +28E4 BRAILLE PATTERN DOTS-3678 +28E5 BRAILLE PATTERN DOTS-13678 +28E6 BRAILLE PATTERN DOTS-23678 +28E7 BRAILLE PATTERN DOTS-123678 +28E8 BRAILLE PATTERN DOTS-4678 +28E9 BRAILLE PATTERN DOTS-14678 +28EA BRAILLE PATTERN DOTS-24678 +28EB BRAILLE PATTERN DOTS-124678 +28EC BRAILLE PATTERN DOTS-34678 +28ED BRAILLE PATTERN DOTS-134678 +28EE BRAILLE PATTERN DOTS-234678 +28EF BRAILLE PATTERN DOTS-1234678 +28F0 BRAILLE PATTERN DOTS-5678 +28F1 BRAILLE PATTERN DOTS-15678 +28F2 BRAILLE PATTERN DOTS-25678 +28F3 BRAILLE PATTERN DOTS-125678 +28F4 BRAILLE PATTERN DOTS-35678 +28F5 BRAILLE PATTERN DOTS-135678 +28F6 BRAILLE PATTERN DOTS-235678 +28F7 BRAILLE PATTERN DOTS-1235678 +28F8 BRAILLE PATTERN DOTS-45678 +28F9 BRAILLE PATTERN DOTS-145678 +28FA BRAILLE PATTERN DOTS-245678 +28FB BRAILLE PATTERN DOTS-1245678 +28FC BRAILLE PATTERN DOTS-345678 +28FD BRAILLE PATTERN DOTS-1345678 +28FE BRAILLE PATTERN DOTS-2345678 +28FF BRAILLE PATTERN DOTS-12345678 +@@ 2900 Supplemental Arrows-B 297F +@ Supplemental arrows +2900 RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE + = z notation partial surjection +2901 RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE + = z notation finite surjection +2902 LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE +2903 RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE +2904 LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE +2905 RIGHTWARDS TWO-HEADED ARROW FROM BAR + = maps to +2906 LEFTWARDS DOUBLE ARROW FROM BAR + = maps from + x (long leftwards arrow from bar - 27FB) +2907 RIGHTWARDS DOUBLE ARROW FROM BAR + = maps to + x (long rightwards arrow from bar - 27FC) +2908 DOWNWARDS ARROW WITH HORIZONTAL STROKE +2909 UPWARDS ARROW WITH HORIZONTAL STROKE +290A UPWARDS TRIPLE ARROW + x (upwards double arrow - 21D1) + x (upwards quadruple arrow - 27F0) +290B DOWNWARDS TRIPLE ARROW + x (downwards double arrow - 21D3) + x (downwards quadruple arrow - 27F1) +290C LEFTWARDS DOUBLE DASH ARROW +290D RIGHTWARDS DOUBLE DASH ARROW +290E LEFTWARDS TRIPLE DASH ARROW +290F RIGHTWARDS TRIPLE DASH ARROW +2910 RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW +2911 RIGHTWARDS ARROW WITH DOTTED STEM +2912 UPWARDS ARROW TO BAR +2913 DOWNWARDS ARROW TO BAR +2914 RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE + = z notation partial injection +2915 RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE + = z notation finite injection +2916 RIGHTWARDS TWO-HEADED ARROW WITH TAIL + = bijective mapping + = z notation bijection +2917 RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE + = z notation surjective injection +2918 RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE + = z notation finite surjective injection +2919 LEFTWARDS ARROW-TAIL +291A RIGHTWARDS ARROW-TAIL +291B LEFTWARDS DOUBLE ARROW-TAIL +291C RIGHTWARDS DOUBLE ARROW-TAIL +291D LEFTWARDS ARROW TO BLACK DIAMOND +291E RIGHTWARDS ARROW TO BLACK DIAMOND +291F LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND +2920 RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND +2921 NORTH WEST AND SOUTH EAST ARROW +2922 NORTH EAST AND SOUTH WEST ARROW +2923 NORTH WEST ARROW WITH HOOK +2924 NORTH EAST ARROW WITH HOOK +2925 SOUTH EAST ARROW WITH HOOK +2926 SOUTH WEST ARROW WITH HOOK +2927 NORTH WEST ARROW AND NORTH EAST ARROW +2928 NORTH EAST ARROW AND SOUTH EAST ARROW +2929 SOUTH EAST ARROW AND SOUTH WEST ARROW +292A SOUTH WEST ARROW AND NORTH WEST ARROW +292B RISING DIAGONAL CROSSING FALLING DIAGONAL +292C FALLING DIAGONAL CROSSING RISING DIAGONAL +292D SOUTH EAST ARROW CROSSING NORTH EAST ARROW +292E NORTH EAST ARROW CROSSING SOUTH EAST ARROW +292F FALLING DIAGONAL CROSSING NORTH EAST ARROW +2930 RISING DIAGONAL CROSSING SOUTH EAST ARROW +2931 NORTH EAST ARROW CROSSING NORTH WEST ARROW +2932 NORTH WEST ARROW CROSSING NORTH EAST ARROW +2933 WAVE ARROW POINTING DIRECTLY RIGHT + x (rightwards wave arrow - 219D) +2934 ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS +2935 ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS +2936 ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS +2937 ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS +2938 RIGHT-SIDE ARC CLOCKWISE ARROW +2939 LEFT-SIDE ARC ANTICLOCKWISE ARROW +293A TOP ARC ANTICLOCKWISE ARROW +293B BOTTOM ARC ANTICLOCKWISE ARROW +293C TOP ARC CLOCKWISE ARROW WITH MINUS +293D TOP ARC ANTICLOCKWISE ARROW WITH PLUS +293E LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW +293F LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW +2940 ANTICLOCKWISE CLOSED CIRCLE ARROW + x (combining anticlockwise ring overlay - 20DA) +2941 CLOCKWISE CLOSED CIRCLE ARROW + x (combining clockwise ring overlay - 20D9) +2942 RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW +2943 LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW +2944 SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW +2945 RIGHTWARDS ARROW WITH PLUS BELOW +2946 LEFTWARDS ARROW WITH PLUS BELOW +2947 RIGHTWARDS ARROW THROUGH X +2948 LEFT RIGHT ARROW THROUGH SMALL CIRCLE +2949 UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE +294A LEFT BARB UP RIGHT BARB DOWN HARPOON +294B LEFT BARB DOWN RIGHT BARB UP HARPOON +294C UP BARB RIGHT DOWN BARB LEFT HARPOON +294D UP BARB LEFT DOWN BARB RIGHT HARPOON +294E LEFT BARB UP RIGHT BARB UP HARPOON +294F UP BARB RIGHT DOWN BARB RIGHT HARPOON +2950 LEFT BARB DOWN RIGHT BARB DOWN HARPOON +2951 UP BARB LEFT DOWN BARB LEFT HARPOON +2952 LEFTWARDS HARPOON WITH BARB UP TO BAR +2953 RIGHTWARDS HARPOON WITH BARB UP TO BAR +2954 UPWARDS HARPOON WITH BARB RIGHT TO BAR +2955 DOWNWARDS HARPOON WITH BARB RIGHT TO BAR +2956 LEFTWARDS HARPOON WITH BARB DOWN TO BAR +2957 RIGHTWARDS HARPOON WITH BARB DOWN TO BAR +2958 UPWARDS HARPOON WITH BARB LEFT TO BAR +2959 DOWNWARDS HARPOON WITH BARB LEFT TO BAR +295A LEFTWARDS HARPOON WITH BARB UP FROM BAR +295B RIGHTWARDS HARPOON WITH BARB UP FROM BAR +295C UPWARDS HARPOON WITH BARB RIGHT FROM BAR +295D DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR +295E LEFTWARDS HARPOON WITH BARB DOWN FROM BAR +295F RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR +2960 UPWARDS HARPOON WITH BARB LEFT FROM BAR +2961 DOWNWARDS HARPOON WITH BARB LEFT FROM BAR +2962 LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN +2963 UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +2964 RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +2965 DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +2966 LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP +2967 LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +2968 RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP +2969 RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN +296A LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +296B LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +296C RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +296D RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +296E UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +296F DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +2970 RIGHT DOUBLE ARROW WITH ROUNDED HEAD + x (superset of - 2283) +2971 EQUALS SIGN ABOVE RIGHTWARDS ARROW +2972 TILDE OPERATOR ABOVE RIGHTWARDS ARROW +2973 LEFTWARDS ARROW ABOVE TILDE OPERATOR +2974 RIGHTWARDS ARROW ABOVE TILDE OPERATOR +2975 RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO +2976 LESS-THAN ABOVE LEFTWARDS ARROW +2977 LEFTWARDS ARROW THROUGH LESS-THAN +2978 GREATER-THAN ABOVE RIGHTWARDS ARROW +2979 SUBSET ABOVE RIGHTWARDS ARROW +297A LEFTWARDS ARROW THROUGH SUBSET +297B SUPERSET ABOVE LEFTWARDS ARROW +@ Fish tails +297C LEFT FISH TAIL +297D RIGHT FISH TAIL +297E UP FISH TAIL +297F DOWN FISH TAIL +@@ 2980 Miscellaneous Mathematical Symbols-B 29FF +@ Miscellaneous mathematical symbols +2980 TRIPLE VERTICAL BAR DELIMITER + x (triple vertical bar binary relation - 2AF4) + x (large triple vertical bar operator - 2AFC) +2981 Z NOTATION SPOT + * medium-small-sized black circle + x (bullet operator - 2219) + x (black circle - 25CF) +2982 Z NOTATION TYPE COLON + x (tibetan sign rnam bcad - 0F7F) +@ Brackets +2983 LEFT WHITE CURLY BRACKET +2984 RIGHT WHITE CURLY BRACKET +2985 LEFT WHITE PARENTHESIS + x (fullwidth left white parenthesis - FF5F) +2986 RIGHT WHITE PARENTHESIS + * used for Bourbakist intervals + x (fullwidth right white parenthesis - FF60) +2987 Z NOTATION LEFT IMAGE BRACKET +2988 Z NOTATION RIGHT IMAGE BRACKET +2989 Z NOTATION LEFT BINDING BRACKET +298A Z NOTATION RIGHT BINDING BRACKET +298B LEFT SQUARE BRACKET WITH UNDERBAR +298C RIGHT SQUARE BRACKET WITH UNDERBAR +298D LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 LEFT ANGLE BRACKET WITH DOT +2992 RIGHT ANGLE BRACKET WITH DOT +2993 LEFT ARC LESS-THAN BRACKET +2994 RIGHT ARC GREATER-THAN BRACKET +2995 DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 LEFT BLACK TORTOISE SHELL BRACKET + x (left tortoise shell bracket - 3014) + x (left white tortoise shell bracket - 3018) +2998 RIGHT BLACK TORTOISE SHELL BRACKET +@ Fences +2999 DOTTED FENCE + * four close dots vertical +299A VERTICAL ZIGZAG LINE + x (wavy line - 2307) +@ Angles +299B MEASURED ANGLE OPENING LEFT + x (measured angle - 2221) +299C RIGHT ANGLE VARIANT WITH SQUARE + x (right angle - 221F) +299D MEASURED RIGHT ANGLE WITH DOT +299E ANGLE WITH S INSIDE +299F ACUTE ANGLE +29A0 SPHERICAL ANGLE OPENING LEFT + x (spherical angle - 2222) +29A1 SPHERICAL ANGLE OPENING UP +29A2 TURNED ANGLE + x (angle - 2220) +29A3 REVERSED ANGLE +29A4 ANGLE WITH UNDERBAR +29A5 REVERSED ANGLE WITH UNDERBAR +29A6 OBLIQUE ANGLE OPENING UP +29A7 OBLIQUE ANGLE OPENING DOWN +29A8 MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT +29A9 MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT +29AA MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT +29AB MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT +29AC MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP +29AD MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP +29AE MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN +29AF MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN +@ Empty sets +29B0 REVERSED EMPTY SET + x (empty set - 2205) + x (apl functional symbol circle backslash - 2349) +29B1 EMPTY SET WITH OVERBAR +29B2 EMPTY SET WITH SMALL CIRCLE ABOVE +29B3 EMPTY SET WITH RIGHT ARROW ABOVE +29B4 EMPTY SET WITH LEFT ARROW ABOVE +@ Circle symbols +29B5 CIRCLE WITH HORIZONTAL BAR + x (circled minus - 2296) +29B6 CIRCLED VERTICAL BAR +29B7 CIRCLED PARALLEL +29B8 CIRCLED REVERSE SOLIDUS +29B9 CIRCLED PERPENDICULAR +29BA CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR +29BB CIRCLE WITH SUPERIMPOSED X + x (circled times - 2297) +29BC CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN +29BD UP ARROW THROUGH CIRCLE +29BE CIRCLED WHITE BULLET + x (circled ring operator - 229A) + x (apl functional symbol circle jot - 233E) + x (bullseye - 25CE) +29BF CIRCLED BULLET + * forms part of a graduated set of circles with enclosed black circle of different sizes + x (circled dot operator - 2299) + x (fisheye - 25C9) + x (n-ary circled dot operator - 2A00) +29C0 CIRCLED LESS-THAN +29C1 CIRCLED GREATER-THAN +29C2 CIRCLE WITH SMALL CIRCLE TO THE RIGHT +29C3 CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT +@ Square symbols +29C4 SQUARED RISING DIAGONAL SLASH + x (apl functional symbol quad slash - 2341) + x (masu mark - 303C) +29C5 SQUARED FALLING DIAGONAL SLASH + x (apl functional symbol quad backslash - 2342) +29C6 SQUARED ASTERISK +29C7 SQUARED SMALL CIRCLE + x (apl functional symbol quad jot - 233B) +29C8 SQUARED SQUARE +29C9 TWO JOINED SQUARES +@ Triangle symbols +29CA TRIANGLE WITH DOT ABOVE +29CB TRIANGLE WITH UNDERBAR +29CC S IN TRIANGLE +29CD TRIANGLE WITH SERIFS AT BOTTOM + x (white up-pointing triangle - 25B3) +29CE RIGHT TRIANGLE ABOVE LEFT TRIANGLE +29CF LEFT TRIANGLE BESIDE VERTICAL BAR +29D0 VERTICAL BAR BESIDE RIGHT TRIANGLE +@ Bowtie symbols +29D1 BOWTIE WITH LEFT HALF BLACK + x (bowtie - 22C8) +29D2 BOWTIE WITH RIGHT HALF BLACK +29D3 BLACK BOWTIE +29D4 TIMES WITH LEFT HALF BLACK + x (left normal factor semidirect product - 22C9) +29D5 TIMES WITH RIGHT HALF BLACK + x (right normal factor semidirect product - 22CA) +29D6 WHITE HOURGLASS + = vertical bowtie + = white framus + x (hourglass - 231B) +29D7 BLACK HOURGLASS +@ Fences +29D8 LEFT WIGGLY FENCE + x (presentation form for vertical wavy low line - FE34) +29D9 RIGHT WIGGLY FENCE +29DA LEFT DOUBLE WIGGLY FENCE +29DB RIGHT DOUBLE WIGGLY FENCE +@ Miscellaneous mathematical symbols +29DC INCOMPLETE INFINITY + = ISOtech entity ⧜ + x (infinity - 221E) +29DD TIE OVER INFINITY +29DE INFINITY NEGATED WITH VERTICAL BAR +29DF DOUBLE-ENDED MULTIMAP + x (multimap - 22B8) +29E0 SQUARE WITH CONTOURED OUTLINE + = D'Alembertian + x (lower right drop-shadowed white square - 274F) +29E1 INCREASES AS + x (normal subgroup of or equal to - 22B4) +29E2 SHUFFLE PRODUCT + x (z notation bag membership - 22FF) +@ Relations +29E3 EQUALS SIGN AND SLANTED PARALLEL + x (number sign - 0023) + x (equal and parallel to - 22D5) +29E4 EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE +29E5 IDENTICAL TO AND SLANTED PARALLEL + x (triple horizontal bar with double vertical stroke - 2A68) +29E6 GLEICH STARK + = tautological equivalent +@ Miscellaneous mathematical symbols +29E7 THERMODYNAMIC + * vertical bar crossed by two horizontals + x (not equal to - 2260) +29E8 DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK + x (up-pointing triangle with left half black - 25ED) +29E9 DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK + x (up-pointing triangle with right half black - 25EE) +29EA BLACK DIAMOND WITH DOWN ARROW +29EB BLACK LOZENGE + x (lozenge - 25CA) +29EC WHITE CIRCLE WITH DOWN ARROW +29ED BLACK CIRCLE WITH DOWN ARROW +@ Error bar symbols +29EE ERROR-BARRED WHITE SQUARE +29EF ERROR-BARRED BLACK SQUARE +29F0 ERROR-BARRED WHITE DIAMOND +29F1 ERROR-BARRED BLACK DIAMOND +29F2 ERROR-BARRED WHITE CIRCLE +29F3 ERROR-BARRED BLACK CIRCLE +@ Miscellaneous mathematical symbols +29F4 RULE-DELAYED + = colon right arrow +29F5 REVERSE SOLIDUS OPERATOR + x (reverse solidus - 005C) + x (set minus - 2216) +29F6 SOLIDUS WITH OVERBAR +29F7 REVERSE SOLIDUS WITH HORIZONTAL STROKE +@ Large operators +29F8 BIG SOLIDUS + x (division slash - 2215) +29F9 BIG REVERSE SOLIDUS + = z notation schema hiding + x (set minus - 2216) +@ Specialized plus sign operators +29FA DOUBLE PLUS +29FB TRIPLE PLUS +@ Brackets +29FC LEFT-POINTING CURVED ANGLE BRACKET + x (precedes - 227A) + x (left-pointing angle bracket - 2329) +29FD RIGHT-POINTING CURVED ANGLE BRACKET + x (succeeds - 227B) + x (right-pointing angle bracket - 232A) +@ Miscellaneous mathematical symbols +29FE TINY + x (plus sign - 002B) +29FF MINY + x (minus sign - 2212) +@@ 2A00 Supplemental Mathematical Operators 2AFF +@ N-ary operators +2A00 N-ARY CIRCLED DOT OPERATOR + x (circled dot operator - 2299) + x (fisheye - 25C9) +2A01 N-ARY CIRCLED PLUS OPERATOR + x (circled plus - 2295) +2A02 N-ARY CIRCLED TIMES OPERATOR + x (circled times - 2297) +2A03 N-ARY UNION OPERATOR WITH DOT +2A04 N-ARY UNION OPERATOR WITH PLUS + x (multiset union - 228E) +2A05 N-ARY SQUARE INTERSECTION OPERATOR + x (square cap - 2293) +2A06 N-ARY SQUARE UNION OPERATOR + x (square cup - 2294) +2A07 TWO LOGICAL AND OPERATOR + = merge + x (two intersecting logical and - 2A55) +2A08 TWO LOGICAL OR OPERATOR + x (two intersecting logical or - 2A56) +2A09 N-ARY TIMES OPERATOR + x (multiplication sign - 00D7) +@ Summations and integrals +2A0A MODULO TWO SUM + x (n-ary summation - 2211) +2A0B SUMMATION WITH INTEGRAL +2A0C QUADRUPLE INTEGRAL OPERATOR + x (triple integral - 222D) + # 222B 222B 222B 222B +2A0D FINITE PART INTEGRAL +2A0E INTEGRAL WITH DOUBLE STROKE +2A0F INTEGRAL AVERAGE WITH SLASH +2A10 CIRCULATION FUNCTION +2A11 ANTICLOCKWISE INTEGRATION +2A12 LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE +2A13 LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE +2A14 LINE INTEGRATION NOT INCLUDING THE POLE +2A15 INTEGRAL AROUND A POINT OPERATOR + x (contour integral - 222E) +2A16 QUATERNION INTEGRAL OPERATOR +2A17 INTEGRAL WITH LEFTWARDS ARROW WITH HOOK +2A18 INTEGRAL WITH TIMES SIGN +2A19 INTEGRAL WITH INTERSECTION +2A1A INTEGRAL WITH UNION +2A1B INTEGRAL WITH OVERBAR + = upper integral +2A1C INTEGRAL WITH UNDERBAR + = lower integral +@ Miscellaneous large operators +2A1D JOIN + = large bowtie + * relational database theory + x (bowtie - 22C8) + x (full outer join - 27D7) +2A1E LARGE LEFT TRIANGLE OPERATOR + * relational database theory + x (white left-pointing triangle - 25C1) +2A1F Z NOTATION SCHEMA COMPOSITION + x (z notation relational composition - 2A3E) +2A20 Z NOTATION SCHEMA PIPING + x (much greater-than - 226B) +2A21 Z NOTATION SCHEMA PROJECTION + x (upwards harpoon with barb rightwards - 21BE) +@ Plus and minus sign operators +2A22 PLUS SIGN WITH SMALL CIRCLE ABOVE +2A23 PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE +2A24 PLUS SIGN WITH TILDE ABOVE + = positive difference or sum +2A25 PLUS SIGN WITH DOT BELOW + x (dot plus - 2214) +2A26 PLUS SIGN WITH TILDE BELOW + = sum or positive difference +2A27 PLUS SIGN WITH SUBSCRIPT TWO + = nim-addition +2A28 PLUS SIGN WITH BLACK TRIANGLE +2A29 MINUS SIGN WITH COMMA ABOVE +2A2A MINUS SIGN WITH DOT BELOW + x (dot minus - 2238) +2A2B MINUS SIGN WITH FALLING DOTS +2A2C MINUS SIGN WITH RISING DOTS +2A2D PLUS SIGN IN LEFT HALF CIRCLE +2A2E PLUS SIGN IN RIGHT HALF CIRCLE +@ Multiplication and division sign operators +2A2F VECTOR OR CROSS PRODUCT + x (multiplication sign - 00D7) +2A30 MULTIPLICATION SIGN WITH DOT ABOVE +2A31 MULTIPLICATION SIGN WITH UNDERBAR +2A32 SEMIDIRECT PRODUCT WITH BOTTOM CLOSED +2A33 SMASH PRODUCT +2A34 MULTIPLICATION SIGN IN LEFT HALF CIRCLE +2A35 MULTIPLICATION SIGN IN RIGHT HALF CIRCLE +2A36 CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT +2A37 MULTIPLICATION SIGN IN DOUBLE CIRCLE +2A38 CIRCLED DIVISION SIGN +@ Miscellaneous mathematical operators +2A39 PLUS SIGN IN TRIANGLE +2A3A MINUS SIGN IN TRIANGLE +2A3B MULTIPLICATION SIGN IN TRIANGLE +2A3C INTERIOR PRODUCT + x (right floor - 230B) +2A3D RIGHTHAND INTERIOR PRODUCT + x (left floor - 230A) + x (turned not sign - 2319) +2A3E Z NOTATION RELATIONAL COMPOSITION + x (z notation schema composition - 2A1F) +2A3F AMALGAMATION OR COPRODUCT + x (n-ary coproduct - 2210) +@ Intersections and unions +2A40 INTERSECTION WITH DOT + x (logical and - 2227) + x (and with dot - 27D1) +2A41 UNION WITH MINUS SIGN + = z notation bag subtraction + x (multiset union - 228E) +2A42 UNION WITH OVERBAR +2A43 INTERSECTION WITH OVERBAR +2A44 INTERSECTION WITH LOGICAL AND +2A45 UNION WITH LOGICAL OR +2A46 UNION ABOVE INTERSECTION +2A47 INTERSECTION ABOVE UNION +2A48 UNION ABOVE BAR ABOVE INTERSECTION +2A49 INTERSECTION ABOVE BAR ABOVE UNION +2A4A UNION BESIDE AND JOINED WITH UNION +2A4B INTERSECTION BESIDE AND JOINED WITH INTERSECTION +2A4C CLOSED UNION WITH SERIFS + x (union - 222A) +2A4D CLOSED INTERSECTION WITH SERIFS + x (intersection - 2229) +2A4E DOUBLE SQUARE INTERSECTION +2A4F DOUBLE SQUARE UNION +2A50 CLOSED UNION WITH SERIFS AND SMASH PRODUCT +@ Logical ands and ors +2A51 LOGICAL AND WITH DOT ABOVE +2A52 LOGICAL OR WITH DOT ABOVE +2A53 DOUBLE LOGICAL AND +2A54 DOUBLE LOGICAL OR +2A55 TWO INTERSECTING LOGICAL AND + x (two logical and operator - 2A07) +2A56 TWO INTERSECTING LOGICAL OR + x (two logical or operator - 2A08) +2A57 SLOPING LARGE OR +2A58 SLOPING LARGE AND +2A59 LOGICAL OR OVERLAPPING LOGICAL AND +2A5A LOGICAL AND WITH MIDDLE STEM +2A5B LOGICAL OR WITH MIDDLE STEM +2A5C LOGICAL AND WITH HORIZONTAL DASH +2A5D LOGICAL OR WITH HORIZONTAL DASH +2A5E LOGICAL AND WITH DOUBLE OVERBAR + x (perspective - 2306) +2A5F LOGICAL AND WITH UNDERBAR +2A60 LOGICAL AND WITH DOUBLE UNDERBAR + x (estimates - 2259) +2A61 SMALL VEE WITH UNDERBAR + x (equiangular to - 225A) +2A62 LOGICAL OR WITH DOUBLE OVERBAR +2A63 LOGICAL OR WITH DOUBLE UNDERBAR + x (equiangular to - 225A) +@ Miscellaneous mathematical operators +2A64 Z NOTATION DOMAIN ANTIRESTRICTION +2A65 Z NOTATION RANGE ANTIRESTRICTION + x (conical taper - 2332) +@ Relational operators +2A66 EQUALS SIGN WITH DOT BELOW + x (approaches the limit - 2250) +2A67 IDENTICAL WITH DOT ABOVE +2A68 TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE + = identical and parallel to + x (equal and parallel to - 22D5) + x (identical to and slanted parallel - 29E5) +2A69 TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE +2A6A TILDE OPERATOR WITH DOT ABOVE +2A6B TILDE OPERATOR WITH RISING DOTS + x (homothetic - 223B) +2A6C SIMILAR MINUS SIMILAR +2A6D CONGRUENT WITH DOT ABOVE + x (approximately equal to - 2245) +2A6E EQUALS WITH ASTERISK + x (star equals - 225B) +2A6F ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT +2A70 APPROXIMATELY EQUAL OR EQUAL TO +2A71 EQUALS SIGN ABOVE PLUS SIGN + * black stands slightly better (chess notation) +2A72 PLUS SIGN ABOVE EQUALS SIGN + * white stands slightly better (chess notation) +2A73 EQUALS SIGN ABOVE TILDE OPERATOR +2A74 DOUBLE COLON EQUAL + # 003A 003A 003D +2A75 TWO CONSECUTIVE EQUALS SIGNS + # 003D 003D +2A76 THREE CONSECUTIVE EQUALS SIGNS + # 003D 003D 003D +2A77 EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW +2A78 EQUIVALENT WITH FOUR DOTS ABOVE +2A79 LESS-THAN WITH CIRCLE INSIDE +2A7A GREATER-THAN WITH CIRCLE INSIDE +2A7B LESS-THAN WITH QUESTION MARK ABOVE +2A7C GREATER-THAN WITH QUESTION MARK ABOVE +2A7D LESS-THAN OR SLANTED EQUAL TO + x (less-than or equal to - 2264) +2A7E GREATER-THAN OR SLANTED EQUAL TO + x (greater-than or equal to - 2265) +2A7F LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A80 GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A81 LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A82 GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A83 LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT +2A84 GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT +2A85 LESS-THAN OR APPROXIMATE +2A86 GREATER-THAN OR APPROXIMATE +2A87 LESS-THAN AND SINGLE-LINE NOT EQUAL TO + x (less-than but not equal to - 2268) +2A88 GREATER-THAN AND SINGLE-LINE NOT EQUAL TO + x (greater-than but not equal to - 2269) +2A89 LESS-THAN AND NOT APPROXIMATE +2A8A GREATER-THAN AND NOT APPROXIMATE +2A8B LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN + x (less-than equal to or greater-than - 22DA) +2A8C GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN + x (greater-than equal to or less-than - 22DB) +2A8D LESS-THAN ABOVE SIMILAR OR EQUAL +2A8E GREATER-THAN ABOVE SIMILAR OR EQUAL +2A8F LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN +2A90 GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN +2A91 LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL +2A92 GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL +2A93 LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL +2A94 GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL +2A95 SLANTED EQUAL TO OR LESS-THAN + x (equal to or less-than - 22DC) +2A96 SLANTED EQUAL TO OR GREATER-THAN + x (equal to or greater-than - 22DD) +2A97 SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE +2A98 SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE +2A99 DOUBLE-LINE EQUAL TO OR LESS-THAN + x (equal to or less-than - 22DC) +2A9A DOUBLE-LINE EQUAL TO OR GREATER-THAN + x (equal to or greater-than - 22DD) +2A9B DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN +2A9C DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN +2A9D SIMILAR OR LESS-THAN +2A9E SIMILAR OR GREATER-THAN +2A9F SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN +2AA0 SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN +2AA1 DOUBLE NESTED LESS-THAN + = absolute continuity + x (much less-than - 226A) +2AA2 DOUBLE NESTED GREATER-THAN + x (much greater-than - 226B) +2AA3 DOUBLE NESTED LESS-THAN WITH UNDERBAR +2AA4 GREATER-THAN OVERLAPPING LESS-THAN +2AA5 GREATER-THAN BESIDE LESS-THAN +2AA6 LESS-THAN CLOSED BY CURVE +2AA7 GREATER-THAN CLOSED BY CURVE +2AA8 LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AA9 GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AAA SMALLER THAN +2AAB LARGER THAN +2AAC SMALLER THAN OR EQUAL TO +2AAD LARGER THAN OR EQUAL TO +2AAE EQUALS SIGN WITH BUMPY ABOVE + x (difference between - 224F) +2AAF PRECEDES ABOVE SINGLE-LINE EQUALS SIGN + x (precedes or equal to - 227C) +2AB0 SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN + x (succeeds or equal to - 227D) +2AB1 PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO +2AB2 SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO +2AB3 PRECEDES ABOVE EQUALS SIGN +2AB4 SUCCEEDS ABOVE EQUALS SIGN +2AB5 PRECEDES ABOVE NOT EQUAL TO +2AB6 SUCCEEDS ABOVE NOT EQUAL TO +2AB7 PRECEDES ABOVE ALMOST EQUAL TO +2AB8 SUCCEEDS ABOVE ALMOST EQUAL TO +2AB9 PRECEDES ABOVE NOT ALMOST EQUAL TO +2ABA SUCCEEDS ABOVE NOT ALMOST EQUAL TO +2ABB DOUBLE PRECEDES +2ABC DOUBLE SUCCEEDS +@ Subset and superset relations +2ABD SUBSET WITH DOT +2ABE SUPERSET WITH DOT +2ABF SUBSET WITH PLUS SIGN BELOW +2AC0 SUPERSET WITH PLUS SIGN BELOW +2AC1 SUBSET WITH MULTIPLICATION SIGN BELOW +2AC2 SUPERSET WITH MULTIPLICATION SIGN BELOW +2AC3 SUBSET OF OR EQUAL TO WITH DOT ABOVE +2AC4 SUPERSET OF OR EQUAL TO WITH DOT ABOVE +2AC5 SUBSET OF ABOVE EQUALS SIGN +2AC6 SUPERSET OF ABOVE EQUALS SIGN +2AC7 SUBSET OF ABOVE TILDE OPERATOR +2AC8 SUPERSET OF ABOVE TILDE OPERATOR +2AC9 SUBSET OF ABOVE ALMOST EQUAL TO +2ACA SUPERSET OF ABOVE ALMOST EQUAL TO +2ACB SUBSET OF ABOVE NOT EQUAL TO +2ACC SUPERSET OF ABOVE NOT EQUAL TO +2ACD SQUARE LEFT OPEN BOX OPERATOR +2ACE SQUARE RIGHT OPEN BOX OPERATOR +2ACF CLOSED SUBSET + x (subset of - 2282) +2AD0 CLOSED SUPERSET + x (superset of - 2283) +2AD1 CLOSED SUBSET OR EQUAL TO +2AD2 CLOSED SUPERSET OR EQUAL TO +2AD3 SUBSET ABOVE SUPERSET +2AD4 SUPERSET ABOVE SUBSET +2AD5 SUBSET ABOVE SUBSET +2AD6 SUPERSET ABOVE SUPERSET +2AD7 SUPERSET BESIDE SUBSET +2AD8 SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET +@ Forks +2AD9 ELEMENT OF OPENING DOWNWARDS + x (element of - 2208) + x (element of opening upwards - 27D2) +2ADA PITCHFORK WITH TEE TOP + x (pitchfork - 22D4) +2ADB TRANSVERSAL INTERSECTION + x (pitchfork - 22D4) +2ADC FORKING (not independent) + = not independent + * an equational logic symbol, not a computing science symbol + * non-independence (original concept) is related to forking + : 2ADD 0338 +2ADD NONFORKING (independent) + = independent + * an equational logic symbol, not a computing science symbol + * independence (original concept) is related to non-forking +@ Tacks and turnstiles +2ADE SHORT LEFT TACK + x (left tack - 22A3) +2ADF SHORT DOWN TACK + x (down tack - 22A4) +2AE0 SHORT UP TACK + x (up tack - 22A5) +2AE1 PERPENDICULAR WITH S +2AE2 VERTICAL BAR TRIPLE RIGHT TURNSTILE + = ordinarily satisfies +2AE3 DOUBLE VERTICAL BAR LEFT TURNSTILE + x (forces - 22A9) +2AE4 VERTICAL BAR DOUBLE LEFT TURNSTILE + x (true - 22A8) +2AE5 DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE +2AE6 LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL + x (forces - 22A9) +2AE7 SHORT DOWN TACK WITH OVERBAR + x (down tack - 22A4) + x (apl functional symbol up tack overbar - 2351) +2AE8 SHORT UP TACK WITH UNDERBAR + x (up tack - 22A5) + x (apl functional symbol down tack underbar - 234A) +2AE9 SHORT UP TACK ABOVE SHORT DOWN TACK +2AEA DOUBLE DOWN TACK +2AEB DOUBLE UP TACK + = independence + * probability theory +2AEC DOUBLE STROKE NOT SIGN + x (not sign - 00AC) +2AED REVERSED DOUBLE STROKE NOT SIGN + x (reversed not sign - 2310) +@ Vertical line operators +2AEE DOES NOT DIVIDE WITH REVERSED NEGATION SLASH + x (does not divide - 2224) +2AEF VERTICAL LINE WITH CIRCLE ABOVE +2AF0 VERTICAL LINE WITH CIRCLE BELOW +2AF1 DOWN TACK WITH CIRCLE BELOW + = necessarily satisfies + x (up tack with circle above - 27DF) +2AF2 PARALLEL WITH HORIZONTAL STROKE + x (not parallel to - 2226) +2AF3 PARALLEL WITH TILDE OPERATOR +2AF4 TRIPLE VERTICAL BAR BINARY RELATION + = interleave + x (triple vertical bar delimiter - 2980) +2AF5 TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE +@ Miscellaneous mathematical operator +2AF6 TRIPLE COLON OPERATOR + * logic + x (tricolon - 205D) + x (vertical ellipsis - 22EE) +@ Relations +2AF7 TRIPLE NESTED LESS-THAN + x (very much less-than - 22D8) +2AF8 TRIPLE NESTED GREATER-THAN + x (very much greater-than - 22D9) +2AF9 DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO + x (less-than over equal to - 2266) +2AFA DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO + x (greater-than over equal to - 2267) +2AFB TRIPLE SOLIDUS BINARY RELATION + x (triple vertical bar binary relation - 2AF4) +@ Operators +2AFC LARGE TRIPLE VERTICAL BAR OPERATOR + * often n-ary + x (triple vertical bar binary relation - 2AF4) + x (triple vertical bar delimiter - 2980) +2AFD DOUBLE SOLIDUS OPERATOR + x (parallel to - 2225) +2AFE WHITE VERTICAL BAR + = Dijkstra choice +2AFF N-ARY WHITE VERTICAL BAR + = n-ary Dijkstra choice +@@ 2B00 Miscellaneous Symbols and Arrows 2BFF +@ White and black arrows +@+ Other white and black arrows to complete this set can be found in the Arrows and Dingbats blocks. +2B00 NORTH EAST WHITE ARROW +2B01 NORTH WEST WHITE ARROW +2B02 SOUTH EAST WHITE ARROW +2B03 SOUTH WEST WHITE ARROW +2B04 LEFT RIGHT WHITE ARROW +2B05 LEFTWARDS BLACK ARROW +2B06 UPWARDS BLACK ARROW +2B07 DOWNWARDS BLACK ARROW +2B08 NORTH EAST BLACK ARROW +2B09 NORTH WEST BLACK ARROW +2B0A SOUTH EAST BLACK ARROW +2B0B SOUTH WEST BLACK ARROW +2B0C LEFT RIGHT BLACK ARROW +2B0D UP DOWN BLACK ARROW +@ Arrows with bent tips +2B0E RIGHTWARDS ARROW WITH TIP DOWNWARDS +2B0F RIGHTWARDS ARROW WITH TIP UPWARDS +2B10 LEFTWARDS ARROW WITH TIP DOWNWARDS +2B11 LEFTWARDS ARROW WITH TIP UPWARDS +@ Squares +2B12 SQUARE WITH TOP HALF BLACK + x (square with left half black - 25E7) +2B13 SQUARE WITH BOTTOM HALF BLACK +@@ 2C00 Glagolitic 2C5F +@ Capital letters +2C00 GLAGOLITIC CAPITAL LETTER AZU +2C01 GLAGOLITIC CAPITAL LETTER BUKY +2C02 GLAGOLITIC CAPITAL LETTER VEDE +2C03 GLAGOLITIC CAPITAL LETTER GLAGOLI +2C04 GLAGOLITIC CAPITAL LETTER DOBRO +2C05 GLAGOLITIC CAPITAL LETTER YESTU +2C06 GLAGOLITIC CAPITAL LETTER ZHIVETE +2C07 GLAGOLITIC CAPITAL LETTER DZELO +2C08 GLAGOLITIC CAPITAL LETTER ZEMLJA +2C09 GLAGOLITIC CAPITAL LETTER IZHE +2C0A GLAGOLITIC CAPITAL LETTER INITIAL IZHE +2C0B GLAGOLITIC CAPITAL LETTER I +2C0C GLAGOLITIC CAPITAL LETTER DJERVI +2C0D GLAGOLITIC CAPITAL LETTER KAKO +2C0E GLAGOLITIC CAPITAL LETTER LJUDIJE +2C0F GLAGOLITIC CAPITAL LETTER MYSLITE +2C10 GLAGOLITIC CAPITAL LETTER NASHI +2C11 GLAGOLITIC CAPITAL LETTER ONU +2C12 GLAGOLITIC CAPITAL LETTER POKOJI +2C13 GLAGOLITIC CAPITAL LETTER RITSI +2C14 GLAGOLITIC CAPITAL LETTER SLOVO +2C15 GLAGOLITIC CAPITAL LETTER TVRIDO +2C16 GLAGOLITIC CAPITAL LETTER UKU +2C17 GLAGOLITIC CAPITAL LETTER FRITU +2C18 GLAGOLITIC CAPITAL LETTER HERU +2C19 GLAGOLITIC CAPITAL LETTER OTU +2C1A GLAGOLITIC CAPITAL LETTER PE +2C1B GLAGOLITIC CAPITAL LETTER SHTA +2C1C GLAGOLITIC CAPITAL LETTER TSI +2C1D GLAGOLITIC CAPITAL LETTER CHRIVI +2C1E GLAGOLITIC CAPITAL LETTER SHA +2C1F GLAGOLITIC CAPITAL LETTER YERU +2C20 GLAGOLITIC CAPITAL LETTER YERI +2C21 GLAGOLITIC CAPITAL LETTER YATI +2C22 GLAGOLITIC CAPITAL LETTER SPIDERY HA +2C23 GLAGOLITIC CAPITAL LETTER YU +2C24 GLAGOLITIC CAPITAL LETTER SMALL YUS +2C25 GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +2C26 GLAGOLITIC CAPITAL LETTER YO +2C27 GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +2C28 GLAGOLITIC CAPITAL LETTER BIG YUS +2C29 GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +2C2A GLAGOLITIC CAPITAL LETTER FITA +2C2B GLAGOLITIC CAPITAL LETTER IZHITSA +2C2C GLAGOLITIC CAPITAL LETTER SHTAPIC +2C2D GLAGOLITIC CAPITAL LETTER TROKUTASTI A +2C2E GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +@ Small letters +2C30 GLAGOLITIC SMALL LETTER AZU +2C31 GLAGOLITIC SMALL LETTER BUKY +2C32 GLAGOLITIC SMALL LETTER VEDE +2C33 GLAGOLITIC SMALL LETTER GLAGOLI +2C34 GLAGOLITIC SMALL LETTER DOBRO +2C35 GLAGOLITIC SMALL LETTER YESTU +2C36 GLAGOLITIC SMALL LETTER ZHIVETE +2C37 GLAGOLITIC SMALL LETTER DZELO +2C38 GLAGOLITIC SMALL LETTER ZEMLJA +2C39 GLAGOLITIC SMALL LETTER IZHE +2C3A GLAGOLITIC SMALL LETTER INITIAL IZHE +2C3B GLAGOLITIC SMALL LETTER I +2C3C GLAGOLITIC SMALL LETTER DJERVI +2C3D GLAGOLITIC SMALL LETTER KAKO +2C3E GLAGOLITIC SMALL LETTER LJUDIJE +2C3F GLAGOLITIC SMALL LETTER MYSLITE +2C40 GLAGOLITIC SMALL LETTER NASHI +2C41 GLAGOLITIC SMALL LETTER ONU +2C42 GLAGOLITIC SMALL LETTER POKOJI +2C43 GLAGOLITIC SMALL LETTER RITSI +2C44 GLAGOLITIC SMALL LETTER SLOVO +2C45 GLAGOLITIC SMALL LETTER TVRIDO +2C46 GLAGOLITIC SMALL LETTER UKU +2C47 GLAGOLITIC SMALL LETTER FRITU +2C48 GLAGOLITIC SMALL LETTER HERU +2C49 GLAGOLITIC SMALL LETTER OTU +2C4A GLAGOLITIC SMALL LETTER PE +2C4B GLAGOLITIC SMALL LETTER SHTA +2C4C GLAGOLITIC SMALL LETTER TSI +2C4D GLAGOLITIC SMALL LETTER CHRIVI +2C4E GLAGOLITIC SMALL LETTER SHA +2C4F GLAGOLITIC SMALL LETTER YERU +2C50 GLAGOLITIC SMALL LETTER YERI +2C51 GLAGOLITIC SMALL LETTER YATI +2C52 GLAGOLITIC SMALL LETTER SPIDERY HA +2C53 GLAGOLITIC SMALL LETTER YU +2C54 GLAGOLITIC SMALL LETTER SMALL YUS +2C55 GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL +2C56 GLAGOLITIC SMALL LETTER YO +2C57 GLAGOLITIC SMALL LETTER IOTATED SMALL YUS +2C58 GLAGOLITIC SMALL LETTER BIG YUS +2C59 GLAGOLITIC SMALL LETTER IOTATED BIG YUS +2C5A GLAGOLITIC SMALL LETTER FITA +2C5B GLAGOLITIC SMALL LETTER IZHITSA +2C5C GLAGOLITIC SMALL LETTER SHTAPIC +2C5D GLAGOLITIC SMALL LETTER TROKUTASTI A +2C5E GLAGOLITIC SMALL LETTER LATINATE MYSLITE +@@ 2C80 Coptic 2CFF +@+ Other Coptic letters derived from Demotic are encoded in the Greek and Coptic block. +@ Bohairic Coptic letters +2C80 COPTIC CAPITAL LETTER ALFA +2C81 COPTIC SMALL LETTER ALFA +2C82 COPTIC CAPITAL LETTER VIDA +2C83 COPTIC SMALL LETTER VIDA +2C84 COPTIC CAPITAL LETTER GAMMA +2C85 COPTIC SMALL LETTER GAMMA +2C86 COPTIC CAPITAL LETTER DALDA +2C87 COPTIC SMALL LETTER DALDA +2C88 COPTIC CAPITAL LETTER EIE +2C89 COPTIC SMALL LETTER EIE +2C8A COPTIC CAPITAL LETTER SOU +2C8B COPTIC SMALL LETTER SOU +2C8C COPTIC CAPITAL LETTER ZATA +2C8D COPTIC SMALL LETTER ZATA +2C8E COPTIC CAPITAL LETTER HATE +2C8F COPTIC SMALL LETTER HATE +2C90 COPTIC CAPITAL LETTER THETHE +2C91 COPTIC SMALL LETTER THETHE +2C92 COPTIC CAPITAL LETTER IAUDA +2C93 COPTIC SMALL LETTER IAUDA +2C94 COPTIC CAPITAL LETTER KAPA +2C95 COPTIC SMALL LETTER KAPA +2C96 COPTIC CAPITAL LETTER LAULA +2C97 COPTIC SMALL LETTER LAULA +2C98 COPTIC CAPITAL LETTER MI +2C99 COPTIC SMALL LETTER MI +2C9A COPTIC CAPITAL LETTER NI +2C9B COPTIC SMALL LETTER NI +2C9C COPTIC CAPITAL LETTER KSI +2C9D COPTIC SMALL LETTER KSI +2C9E COPTIC CAPITAL LETTER O +2C9F COPTIC SMALL LETTER O +2CA0 COPTIC CAPITAL LETTER PI +2CA1 COPTIC SMALL LETTER PI +2CA2 COPTIC CAPITAL LETTER RO +2CA3 COPTIC SMALL LETTER RO +2CA4 COPTIC CAPITAL LETTER SIMA +2CA5 COPTIC SMALL LETTER SIMA +2CA6 COPTIC CAPITAL LETTER TAU +2CA7 COPTIC SMALL LETTER TAU +2CA8 COPTIC CAPITAL LETTER UA +2CA9 COPTIC SMALL LETTER UA +2CAA COPTIC CAPITAL LETTER FI +2CAB COPTIC SMALL LETTER FI +2CAC COPTIC CAPITAL LETTER KHI +2CAD COPTIC SMALL LETTER KHI +2CAE COPTIC CAPITAL LETTER PSI +2CAF COPTIC SMALL LETTER PSI +2CB0 COPTIC CAPITAL LETTER OOU +2CB1 COPTIC SMALL LETTER OOU +@ Old Coptic and dialect letters +2CB2 COPTIC CAPITAL LETTER DIALECT-P ALEF +2CB3 COPTIC SMALL LETTER DIALECT-P ALEF +2CB4 COPTIC CAPITAL LETTER OLD COPTIC AIN +2CB5 COPTIC SMALL LETTER OLD COPTIC AIN +2CB6 COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +2CB7 COPTIC SMALL LETTER CRYPTOGRAMMIC EIE +2CB8 COPTIC CAPITAL LETTER DIALECT-P KAPA +2CB9 COPTIC SMALL LETTER DIALECT-P KAPA +2CBA COPTIC CAPITAL LETTER DIALECT-P NI +2CBB COPTIC SMALL LETTER DIALECT-P NI +2CBC COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +2CBD COPTIC SMALL LETTER CRYPTOGRAMMIC NI +2CBE COPTIC CAPITAL LETTER OLD COPTIC OOU +2CBF COPTIC SMALL LETTER OLD COPTIC OOU +2CC0 COPTIC CAPITAL LETTER SAMPI +2CC1 COPTIC SMALL LETTER SAMPI +2CC2 COPTIC CAPITAL LETTER CROSSED SHEI +2CC3 COPTIC SMALL LETTER CROSSED SHEI +2CC4 COPTIC CAPITAL LETTER OLD COPTIC SHEI +2CC5 COPTIC SMALL LETTER OLD COPTIC SHEI +2CC6 COPTIC CAPITAL LETTER OLD COPTIC ESH +2CC7 COPTIC SMALL LETTER OLD COPTIC ESH +2CC8 COPTIC CAPITAL LETTER AKHMIMIC KHEI +2CC9 COPTIC SMALL LETTER AKHMIMIC KHEI +2CCA COPTIC CAPITAL LETTER DIALECT-P HORI +2CCB COPTIC SMALL LETTER DIALECT-P HORI +2CCC COPTIC CAPITAL LETTER OLD COPTIC HORI +2CCD COPTIC SMALL LETTER OLD COPTIC HORI +2CCE COPTIC CAPITAL LETTER OLD COPTIC HA +2CCF COPTIC SMALL LETTER OLD COPTIC HA +2CD0 COPTIC CAPITAL LETTER L-SHAPED HA +2CD1 COPTIC SMALL LETTER L-SHAPED HA +2CD2 COPTIC CAPITAL LETTER OLD COPTIC HEI +2CD3 COPTIC SMALL LETTER OLD COPTIC HEI +2CD4 COPTIC CAPITAL LETTER OLD COPTIC HAT +2CD5 COPTIC SMALL LETTER OLD COPTIC HAT +2CD6 COPTIC CAPITAL LETTER OLD COPTIC GANGIA +2CD7 COPTIC SMALL LETTER OLD COPTIC GANGIA +2CD8 COPTIC CAPITAL LETTER OLD COPTIC DJA +2CD9 COPTIC SMALL LETTER OLD COPTIC DJA +2CDA COPTIC CAPITAL LETTER OLD COPTIC SHIMA +2CDB COPTIC SMALL LETTER OLD COPTIC SHIMA +@ Old Nubian letters +2CDC COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +2CDD COPTIC SMALL LETTER OLD NUBIAN SHIMA +2CDE COPTIC CAPITAL LETTER OLD NUBIAN NGI +2CDF COPTIC SMALL LETTER OLD NUBIAN NGI +2CE0 COPTIC CAPITAL LETTER OLD NUBIAN NYI +2CE1 COPTIC SMALL LETTER OLD NUBIAN NYI +2CE2 COPTIC CAPITAL LETTER OLD NUBIAN WAU +2CE3 COPTIC SMALL LETTER OLD NUBIAN WAU +@ Symbols +2CE4 COPTIC SYMBOL KAI + x (greek kai symbol - 03D7) +2CE5 COPTIC SYMBOL MI RO +2CE6 COPTIC SYMBOL PI RO +2CE7 COPTIC SYMBOL STAUROS +2CE8 COPTIC SYMBOL TAU RO +2CE9 COPTIC SYMBOL KHI RO + x (chi rho - 2627) +2CEA COPTIC SYMBOL SHIMA SIMA +@ Old Nubian punctuation +2CF9 COPTIC OLD NUBIAN FULL STOP +2CFA COPTIC OLD NUBIAN DIRECT QUESTION MARK +2CFB COPTIC OLD NUBIAN INDIRECT QUESTION MARK +2CFC COPTIC OLD NUBIAN VERSE DIVIDER +@ Numeric character +2CFD COPTIC FRACTION ONE HALF +@ Punctuation +2CFE COPTIC FULL STOP +2CFF COPTIC MORPHOLOGICAL DIVIDER +@@ 2D00 Georgian Supplement 2D2F +@ Small letters (Khutsuri) +@+ This is the lowercase of the old ecclesiastical alphabet. See the Georgian block for uppercase Asomtavruli. +2D00 GEORGIAN SMALL LETTER AN (Khutsuri) +2D01 GEORGIAN SMALL LETTER BAN (Khutsuri) +2D02 GEORGIAN SMALL LETTER GAN (Khutsuri) +2D03 GEORGIAN SMALL LETTER DON (Khutsuri) +2D04 GEORGIAN SMALL LETTER EN (Khutsuri) +2D05 GEORGIAN SMALL LETTER VIN (Khutsuri) +2D06 GEORGIAN SMALL LETTER ZEN (Khutsuri) +2D07 GEORGIAN SMALL LETTER TAN (Khutsuri) +2D08 GEORGIAN SMALL LETTER IN (Khutsuri) +2D09 GEORGIAN SMALL LETTER KAN (Khutsuri) +2D0A GEORGIAN SMALL LETTER LAS (Khutsuri) +2D0B GEORGIAN SMALL LETTER MAN (Khutsuri) +2D0C GEORGIAN SMALL LETTER NAR (Khutsuri) +2D0D GEORGIAN SMALL LETTER ON (Khutsuri) +2D0E GEORGIAN SMALL LETTER PAR (Khutsuri) +2D0F GEORGIAN SMALL LETTER ZHAR (Khutsuri) +2D10 GEORGIAN SMALL LETTER RAE (Khutsuri) +2D11 GEORGIAN SMALL LETTER SAN (Khutsuri) +2D12 GEORGIAN SMALL LETTER TAR (Khutsuri) +2D13 GEORGIAN SMALL LETTER UN (Khutsuri) +2D14 GEORGIAN SMALL LETTER PHAR (Khutsuri) +2D15 GEORGIAN SMALL LETTER KHAR (Khutsuri) +2D16 GEORGIAN SMALL LETTER GHAN (Khutsuri) +2D17 GEORGIAN SMALL LETTER QAR (Khutsuri) +2D18 GEORGIAN SMALL LETTER SHIN (Khutsuri) +2D19 GEORGIAN SMALL LETTER CHIN (Khutsuri) +2D1A GEORGIAN SMALL LETTER CAN (Khutsuri) +2D1B GEORGIAN SMALL LETTER JIL (Khutsuri) +2D1C GEORGIAN SMALL LETTER CIL (Khutsuri) +2D1D GEORGIAN SMALL LETTER CHAR (Khutsuri) +2D1E GEORGIAN SMALL LETTER XAN (Khutsuri) +2D1F GEORGIAN SMALL LETTER JHAN (Khutsuri) +2D20 GEORGIAN SMALL LETTER HAE (Khutsuri) +2D21 GEORGIAN SMALL LETTER HE (Khutsuri) +2D22 GEORGIAN SMALL LETTER HIE (Khutsuri) +2D23 GEORGIAN SMALL LETTER WE (Khutsuri) +2D24 GEORGIAN SMALL LETTER HAR (Khutsuri) +2D25 GEORGIAN SMALL LETTER HOE (Khutsuri) +@@ 2D30 Tifinagh 2D7F +@ Letters +2D30 TIFINAGH LETTER YA +2D31 TIFINAGH LETTER YAB +2D32 TIFINAGH LETTER YABH +2D33 TIFINAGH LETTER YAG +2D34 TIFINAGH LETTER YAGHH +2D35 TIFINAGH LETTER BERBER ACADEMY YAJ +2D36 TIFINAGH LETTER YAJ +2D37 TIFINAGH LETTER YAD +2D38 TIFINAGH LETTER YADH +2D39 TIFINAGH LETTER YADD +2D3A TIFINAGH LETTER YADDH +2D3B TIFINAGH LETTER YEY +2D3C TIFINAGH LETTER YAF +2D3D TIFINAGH LETTER YAK +2D3E TIFINAGH LETTER TUAREG YAK +2D3F TIFINAGH LETTER YAKHH +2D40 TIFINAGH LETTER YAH (Tuareg yab) + = Tuareg yab +2D41 TIFINAGH LETTER BERBER ACADEMY YAH +2D42 TIFINAGH LETTER TUAREG YAH +2D43 TIFINAGH LETTER YAHH +2D44 TIFINAGH LETTER YAA +2D45 TIFINAGH LETTER YAKH +2D46 TIFINAGH LETTER TUAREG YAKH +2D47 TIFINAGH LETTER YAQ +2D48 TIFINAGH LETTER TUAREG YAQ +2D49 TIFINAGH LETTER YI +2D4A TIFINAGH LETTER YAZH +2D4B TIFINAGH LETTER AHAGGAR YAZH +2D4C TIFINAGH LETTER TUAREG YAZH +2D4D TIFINAGH LETTER YAL +2D4E TIFINAGH LETTER YAM +2D4F TIFINAGH LETTER YAN +2D50 TIFINAGH LETTER TUAREG YAGN +2D51 TIFINAGH LETTER TUAREG YANG +2D52 TIFINAGH LETTER YAP +2D53 TIFINAGH LETTER YU (Tuareg yaw) + = Tuareg yaw +2D54 TIFINAGH LETTER YAR +2D55 TIFINAGH LETTER YARR +2D56 TIFINAGH LETTER YAGH +2D57 TIFINAGH LETTER TUAREG YAGH +2D58 TIFINAGH LETTER AYER YAGH (Adrar yaj) + = Adrar yaj +2D59 TIFINAGH LETTER YAS +2D5A TIFINAGH LETTER YASS +2D5B TIFINAGH LETTER YASH +2D5C TIFINAGH LETTER YAT +2D5D TIFINAGH LETTER YATH +2D5E TIFINAGH LETTER YACH +2D5F TIFINAGH LETTER YATT +2D60 TIFINAGH LETTER YAV +2D61 TIFINAGH LETTER YAW +2D62 TIFINAGH LETTER YAY +2D63 TIFINAGH LETTER YAZ +2D64 TIFINAGH LETTER TAWELLEMET YAZ (harpoon yaz) + = harpoon yaz +2D65 TIFINAGH LETTER YAZZ +@ Modifier letter +2D6F TIFINAGH MODIFIER LETTER LABIALIZATION MARK (tamatart) + = tamatart + # <super> 2D61 +@@ 2D80 Ethiopic Extended 2DDF +@ Syllables for Me'en +2D80 ETHIOPIC SYLLABLE LOA +2D81 ETHIOPIC SYLLABLE MOA +2D82 ETHIOPIC SYLLABLE ROA +2D83 ETHIOPIC SYLLABLE SOA +2D84 ETHIOPIC SYLLABLE SHOA +2D85 ETHIOPIC SYLLABLE BOA +2D86 ETHIOPIC SYLLABLE TOA +2D87 ETHIOPIC SYLLABLE COA +2D88 ETHIOPIC SYLLABLE NOA +2D89 ETHIOPIC SYLLABLE NYOA +2D8A ETHIOPIC SYLLABLE GLOTTAL OA +2D8B ETHIOPIC SYLLABLE ZOA +2D8C ETHIOPIC SYLLABLE DOA +2D8D ETHIOPIC SYLLABLE DDOA +2D8E ETHIOPIC SYLLABLE JOA +2D8F ETHIOPIC SYLLABLE THOA +2D90 ETHIOPIC SYLLABLE CHOA +2D91 ETHIOPIC SYLLABLE PHOA +2D92 ETHIOPIC SYLLABLE POA +@ Syllables for Blin +2D93 ETHIOPIC SYLLABLE GGWA +2D94 ETHIOPIC SYLLABLE GGWI +2D95 ETHIOPIC SYLLABLE GGWEE +2D96 ETHIOPIC SYLLABLE GGWE +@ Syllables for Sebatbeit +2DA0 ETHIOPIC SYLLABLE SSA +2DA1 ETHIOPIC SYLLABLE SSU +2DA2 ETHIOPIC SYLLABLE SSI +2DA3 ETHIOPIC SYLLABLE SSAA +2DA4 ETHIOPIC SYLLABLE SSEE +2DA5 ETHIOPIC SYLLABLE SSE +2DA6 ETHIOPIC SYLLABLE SSO +2DA8 ETHIOPIC SYLLABLE CCA +2DA9 ETHIOPIC SYLLABLE CCU +2DAA ETHIOPIC SYLLABLE CCI +2DAB ETHIOPIC SYLLABLE CCAA +2DAC ETHIOPIC SYLLABLE CCEE +2DAD ETHIOPIC SYLLABLE CCE +2DAE ETHIOPIC SYLLABLE CCO +2DB0 ETHIOPIC SYLLABLE ZZA +2DB1 ETHIOPIC SYLLABLE ZZU +2DB2 ETHIOPIC SYLLABLE ZZI +2DB3 ETHIOPIC SYLLABLE ZZAA +2DB4 ETHIOPIC SYLLABLE ZZEE +2DB5 ETHIOPIC SYLLABLE ZZE +2DB6 ETHIOPIC SYLLABLE ZZO +2DB8 ETHIOPIC SYLLABLE CCHA +2DB9 ETHIOPIC SYLLABLE CCHU +2DBA ETHIOPIC SYLLABLE CCHI +2DBB ETHIOPIC SYLLABLE CCHAA +2DBC ETHIOPIC SYLLABLE CCHEE +2DBD ETHIOPIC SYLLABLE CCHE +2DBE ETHIOPIC SYLLABLE CCHO +2DC0 ETHIOPIC SYLLABLE QYA +2DC1 ETHIOPIC SYLLABLE QYU +2DC2 ETHIOPIC SYLLABLE QYI +2DC3 ETHIOPIC SYLLABLE QYAA +2DC4 ETHIOPIC SYLLABLE QYEE +2DC5 ETHIOPIC SYLLABLE QYE +2DC6 ETHIOPIC SYLLABLE QYO +2DC8 ETHIOPIC SYLLABLE KYA +2DC9 ETHIOPIC SYLLABLE KYU +2DCA ETHIOPIC SYLLABLE KYI +2DCB ETHIOPIC SYLLABLE KYAA +2DCC ETHIOPIC SYLLABLE KYEE +2DCD ETHIOPIC SYLLABLE KYE +2DCE ETHIOPIC SYLLABLE KYO +2DD0 ETHIOPIC SYLLABLE XYA +2DD1 ETHIOPIC SYLLABLE XYU +2DD2 ETHIOPIC SYLLABLE XYI +2DD3 ETHIOPIC SYLLABLE XYAA +2DD4 ETHIOPIC SYLLABLE XYEE +2DD5 ETHIOPIC SYLLABLE XYE +2DD6 ETHIOPIC SYLLABLE XYO +2DD8 ETHIOPIC SYLLABLE GYA +2DD9 ETHIOPIC SYLLABLE GYU +2DDA ETHIOPIC SYLLABLE GYI +2DDB ETHIOPIC SYLLABLE GYAA +2DDC ETHIOPIC SYLLABLE GYEE +2DDD ETHIOPIC SYLLABLE GYE +2DDE ETHIOPIC SYLLABLE GYO +@@ 2E00 Supplemental Punctuation 2E7F +@ New Testament editorial symbols +2E00 RIGHT ANGLE SUBSTITUTION MARKER +2E01 RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02 LEFT SUBSTITUTION BRACKET +2E03 RIGHT SUBSTITUTION BRACKET +2E04 LEFT DOTTED SUBSTITUTION BRACKET +2E05 RIGHT DOTTED SUBSTITUTION BRACKET +2E06 RAISED INTERPOLATION MARKER +2E07 RAISED DOTTED INTERPOLATION MARKER +2E08 DOTTED TRANSPOSITION MARKER +2E09 LEFT TRANSPOSITION BRACKET +2E0A RIGHT TRANSPOSITION BRACKET +2E0B RAISED SQUARE + * used as an opening raised omission bracket +2E0C LEFT RAISED OMISSION BRACKET + * used as an opening or closing raised omission bracket +2E0D RIGHT RAISED OMISSION BRACKET + * used as a closing or opening raised omission bracket +@ Ancient Greek textual symbols +2E0E EDITORIAL CORONIS + x (greek koronis - 1FBD) +2E0F PARAGRAPHOS +2E10 FORKED PARAGRAPHOS +2E11 REVERSED FORKED PARAGRAPHOS +2E12 HYPODIASTOLE +2E13 DOTTED OBELOS + * glyph variants may look like '00F7' or '2238' + x (commercial minus sign - 2052) +2E14 DOWNWARDS ANCORA +2E15 UPWARDS ANCORA +2E16 DOTTED RIGHT-POINTING ANGLE + = diple periestigmene +@ Ancient Near-Eastern linguistic symbol +2E17 DOUBLE OBLIQUE HYPHEN + * used in ancient Near-Eastern linguistics + * hyphen in Fraktur text uses 002D or 2010, but with a '2E17' glyph in Fraktur fonts + x (hyphen-minus - 002D) + x (equals sign - 003D) + x (hyphen - 2010) +@ Brackets +2E1C LEFT LOW PARAPHRASE BRACKET +2E1D RIGHT LOW PARAPHRASE BRACKET + * used in N'Ko +@@ 2E80 CJK Radicals Supplement 2EFF +@ CJK radicals supplement +2E80 CJK RADICAL REPEAT +2E81 CJK RADICAL CLIFF + x 5382 +2E82 CJK RADICAL SECOND ONE + x 4E5B +2E83 CJK RADICAL SECOND TWO + x 4E5A +2E84 CJK RADICAL SECOND THREE + x 4E59 +2E85 CJK RADICAL PERSON + * form used on left side + x 4EBB +2E86 CJK RADICAL BOX + x 5182 +2E87 CJK RADICAL TABLE + x 51E0 +2E88 CJK RADICAL KNIFE ONE + * form used at top + x 5200 +2E89 CJK RADICAL KNIFE TWO + * form used on right side + x 5202 +2E8A CJK RADICAL DIVINATION + * form used at top + x 535C +2E8B CJK RADICAL SEAL + * form used at bottom + x 353E +2E8C CJK RADICAL SMALL ONE + * form used at top + x 5C0F +2E8D CJK RADICAL SMALL TWO + * form used at top + x 5C0F +2E8E CJK RADICAL LAME ONE + x 5C22 +2E8F CJK RADICAL LAME TWO + x 5C23 +2E90 CJK RADICAL LAME THREE + x 5C22 +2E91 CJK RADICAL LAME FOUR + x 5C23 +2E92 CJK RADICAL SNAKE + x 5DF3 +2E93 CJK RADICAL THREAD + x 5E7A +2E94 CJK RADICAL SNOUT ONE + x 5F51 +2E95 CJK RADICAL SNOUT TWO + x 5F50 +2E96 CJK RADICAL HEART ONE + * form used on left side + x 5FC4 +2E97 CJK RADICAL HEART TWO + * form used at bottom + x 5FC3 +2E98 CJK RADICAL HAND + * form used on left side + x 624C +2E99 CJK RADICAL RAP + * form used on right side + x 6535 +2E9B CJK RADICAL CHOKE + x 65E1 +2E9C CJK RADICAL SUN + x 65E5 +2E9D CJK RADICAL MOON + x 6708 +2E9E CJK RADICAL DEATH + x 6B7A +2E9F CJK RADICAL MOTHER + # 6BCD +2EA0 CJK RADICAL CIVILIAN + x 6C11 +2EA1 CJK RADICAL WATER ONE + * form used on left side + x 6C35 +2EA2 CJK RADICAL WATER TWO + * form used (rarely) at bottom + x 6C3A +2EA3 CJK RADICAL FIRE + * form used at bottom + x 706C +2EA4 CJK RADICAL PAW ONE + * form used at top + x 722B +2EA5 CJK RADICAL PAW TWO + * form used at top + x 722B +2EA6 CJK RADICAL SIMPLIFIED HALF TREE TRUNK + x 4E2C +2EA7 CJK RADICAL COW + x 725B +2EA8 CJK RADICAL DOG + * form used on left side + x 72AD +2EA9 CJK RADICAL JADE + * form used on left side + x 738B +2EAA CJK RADICAL BOLT OF CLOTH + * form used on left side + x 758B +2EAB CJK RADICAL EYE + * form used at top + x (cjk radical net two - 2EB2) + x 76EE +2EAC CJK RADICAL SPIRIT ONE + x 793A +2EAD CJK RADICAL SPIRIT TWO + x 793B +2EAE CJK RADICAL BAMBOO + x 7AF9 +2EAF CJK RADICAL SILK + * form used on left side + x 7CF9 +2EB0 CJK RADICAL C-SIMPLIFIED SILK + * form used on left side + x 7E9F +2EB1 CJK RADICAL NET ONE + x 7F53 +2EB2 CJK RADICAL NET TWO + x (cjk radical eye - 2EAB) + x 7F52 +2EB3 CJK RADICAL NET THREE + x 7F51 +2EB4 CJK RADICAL NET FOUR + x 7F51 +2EB5 CJK RADICAL MESH + x 2626B +2EB6 CJK RADICAL SHEEP + * form used on left side + x 7F8A +2EB7 CJK RADICAL RAM + * form used at top + x 7F8A +2EB8 CJK RADICAL EWE + x 7F8B +2EB9 CJK RADICAL OLD + x 8002 +2EBA CJK RADICAL BRUSH ONE + x 8080 +2EBB CJK RADICAL BRUSH TWO + x 807F +2EBC CJK RADICAL MEAT + x 8089 +2EBD CJK RADICAL MORTAR + x 81FC +2EBE CJK RADICAL GRASS ONE + x 8279 +2EBF CJK RADICAL GRASS TWO + x 8279 +2EC0 CJK RADICAL GRASS THREE + x 8279 +2EC1 CJK RADICAL TIGER + x 864E +2EC2 CJK RADICAL CLOTHES + * form used on left side + x 8864 +2EC3 CJK RADICAL WEST ONE + * form used at top + x 8980 +2EC4 CJK RADICAL WEST TWO + * form used on left side + x 897F +2EC5 CJK RADICAL C-SIMPLIFIED SEE + x 89C1 +2EC6 CJK RADICAL SIMPLIFIED HORN + x 89D2 +2EC7 CJK RADICAL HORN + x 278B2 +2EC8 CJK RADICAL C-SIMPLIFIED SPEECH + x 8BA0 +2EC9 CJK RADICAL C-SIMPLIFIED SHELL + x 8D1D +2ECA CJK RADICAL FOOT + * form used on left side + x 8DB3 +2ECB CJK RADICAL C-SIMPLIFIED CART + x 8F66 +2ECC CJK RADICAL SIMPLIFIED WALK + x 8FB6 +2ECD CJK RADICAL WALK ONE + x 8FB6 +2ECE CJK RADICAL WALK TWO + x 8FB6 +2ECF CJK RADICAL CITY + * form used on right side + x 9091 +2ED0 CJK RADICAL C-SIMPLIFIED GOLD + x 9485 +2ED1 CJK RADICAL LONG ONE + x 9577 +2ED2 CJK RADICAL LONG TWO + * form used on left side + x 9578 +2ED3 CJK RADICAL C-SIMPLIFIED LONG + x 957F +2ED4 CJK RADICAL C-SIMPLIFIED GATE + x 95E8 +2ED5 CJK RADICAL MOUND ONE + x 961C + x 28E0F +2ED6 CJK RADICAL MOUND TWO + * form used on left side + x 961D +2ED7 CJK RADICAL RAIN + x 96E8 +2ED8 CJK RADICAL BLUE + x 9752 +2ED9 CJK RADICAL C-SIMPLIFIED TANNED LEATHER + x 97E6 +2EDA CJK RADICAL C-SIMPLIFIED LEAF + x 9875 +2EDB CJK RADICAL C-SIMPLIFIED WIND + x 98CE +2EDC CJK RADICAL C-SIMPLIFIED FLY + x 98DE +2EDD CJK RADICAL EAT ONE + * form used at bottom + x 98DF +2EDE CJK RADICAL EAT TWO + * form used on left side + x 2967F +2EDF CJK RADICAL EAT THREE + * form used on left side + x 98E0 +2EE0 CJK RADICAL C-SIMPLIFIED EAT + * form used on left side + x 9963 +2EE1 CJK RADICAL HEAD + x 29810 +2EE2 CJK RADICAL C-SIMPLIFIED HORSE + x 9A6C +2EE3 CJK RADICAL BONE + x 9AA8 +2EE4 CJK RADICAL GHOST + x 9B3C +2EE5 CJK RADICAL C-SIMPLIFIED FISH + x 9C7C +2EE6 CJK RADICAL C-SIMPLIFIED BIRD + x 9E1F +2EE7 CJK RADICAL C-SIMPLIFIED SALT + x 9E75 +2EE8 CJK RADICAL SIMPLIFIED WHEAT + x 9EA6 +2EE9 CJK RADICAL SIMPLIFIED YELLOW + x 9EC4 +2EEA CJK RADICAL C-SIMPLIFIED FROG + x 9EFE +2EEB CJK RADICAL J-SIMPLIFIED EVEN + x 6589 +2EEC CJK RADICAL C-SIMPLIFIED EVEN + x 9F50 +2EED CJK RADICAL J-SIMPLIFIED TOOTH + x 6B6F +2EEE CJK RADICAL C-SIMPLIFIED TOOTH + x 9F7F +2EEF CJK RADICAL J-SIMPLIFIED DRAGON + x 9F8D +2EF0 CJK RADICAL C-SIMPLIFIED DRAGON + x 9F99 +2EF1 CJK RADICAL TURTLE + x 9F9C +2EF2 CJK RADICAL J-SIMPLIFIED TURTLE + x 4E80 +2EF3 CJK RADICAL C-SIMPLIFIED TURTLE + # 9F9F +@@ 2F00 Kangxi Radicals 2FDF +@ Kangxi radicals +2F00 KANGXI RADICAL ONE + # 4E00 +2F01 KANGXI RADICAL LINE + # 4E28 +2F02 KANGXI RADICAL DOT + # 4E36 +2F03 KANGXI RADICAL SLASH + # 4E3F +2F04 KANGXI RADICAL SECOND + # 4E59 +2F05 KANGXI RADICAL HOOK + # 4E85 +2F06 KANGXI RADICAL TWO + # 4E8C +2F07 KANGXI RADICAL LID + # 4EA0 +2F08 KANGXI RADICAL MAN + # 4EBA +2F09 KANGXI RADICAL LEGS + # 513F +2F0A KANGXI RADICAL ENTER + # 5165 +2F0B KANGXI RADICAL EIGHT + # 516B +2F0C KANGXI RADICAL DOWN BOX + # 5182 +2F0D KANGXI RADICAL COVER + # 5196 +2F0E KANGXI RADICAL ICE + # 51AB +2F0F KANGXI RADICAL TABLE + # 51E0 +2F10 KANGXI RADICAL OPEN BOX + # 51F5 +2F11 KANGXI RADICAL KNIFE + # 5200 +2F12 KANGXI RADICAL POWER + # 529B +2F13 KANGXI RADICAL WRAP + # 52F9 +2F14 KANGXI RADICAL SPOON + # 5315 +2F15 KANGXI RADICAL RIGHT OPEN BOX + # 531A +2F16 KANGXI RADICAL HIDING ENCLOSURE + # 5338 +2F17 KANGXI RADICAL TEN + # 5341 +2F18 KANGXI RADICAL DIVINATION + # 535C +2F19 KANGXI RADICAL SEAL + # 5369 +2F1A KANGXI RADICAL CLIFF + # 5382 +2F1B KANGXI RADICAL PRIVATE + # 53B6 +2F1C KANGXI RADICAL AGAIN + # 53C8 +2F1D KANGXI RADICAL MOUTH + # 53E3 +2F1E KANGXI RADICAL ENCLOSURE + # 56D7 +2F1F KANGXI RADICAL EARTH + # 571F +2F20 KANGXI RADICAL SCHOLAR + # 58EB +2F21 KANGXI RADICAL GO + # 5902 +2F22 KANGXI RADICAL GO SLOWLY + # 590A +2F23 KANGXI RADICAL EVENING + # 5915 +2F24 KANGXI RADICAL BIG + # 5927 +2F25 KANGXI RADICAL WOMAN + # 5973 +2F26 KANGXI RADICAL CHILD + # 5B50 +2F27 KANGXI RADICAL ROOF + # 5B80 +2F28 KANGXI RADICAL INCH + # 5BF8 +2F29 KANGXI RADICAL SMALL + # 5C0F +2F2A KANGXI RADICAL LAME + # 5C22 +2F2B KANGXI RADICAL CORPSE + # 5C38 +2F2C KANGXI RADICAL SPROUT + # 5C6E +2F2D KANGXI RADICAL MOUNTAIN + # 5C71 +2F2E KANGXI RADICAL RIVER + # 5DDB +2F2F KANGXI RADICAL WORK + # 5DE5 +2F30 KANGXI RADICAL ONESELF + # 5DF1 +2F31 KANGXI RADICAL TURBAN + # 5DFE +2F32 KANGXI RADICAL DRY + # 5E72 +2F33 KANGXI RADICAL SHORT THREAD + # 5E7A +2F34 KANGXI RADICAL DOTTED CLIFF + # 5E7F +2F35 KANGXI RADICAL LONG STRIDE + # 5EF4 +2F36 KANGXI RADICAL TWO HANDS + # 5EFE +2F37 KANGXI RADICAL SHOOT + # 5F0B +2F38 KANGXI RADICAL BOW + # 5F13 +2F39 KANGXI RADICAL SNOUT + # 5F50 +2F3A KANGXI RADICAL BRISTLE + # 5F61 +2F3B KANGXI RADICAL STEP + # 5F73 +2F3C KANGXI RADICAL HEART + # 5FC3 +2F3D KANGXI RADICAL HALBERD + # 6208 +2F3E KANGXI RADICAL DOOR + # 6236 +2F3F KANGXI RADICAL HAND + # 624B +2F40 KANGXI RADICAL BRANCH + # 652F +2F41 KANGXI RADICAL RAP + # 6534 +2F42 KANGXI RADICAL SCRIPT + # 6587 +2F43 KANGXI RADICAL DIPPER + # 6597 +2F44 KANGXI RADICAL AXE + # 65A4 +2F45 KANGXI RADICAL SQUARE + # 65B9 +2F46 KANGXI RADICAL NOT + # 65E0 +2F47 KANGXI RADICAL SUN + # 65E5 +2F48 KANGXI RADICAL SAY + # 66F0 +2F49 KANGXI RADICAL MOON + # 6708 +2F4A KANGXI RADICAL TREE + # 6728 +2F4B KANGXI RADICAL LACK + # 6B20 +2F4C KANGXI RADICAL STOP + # 6B62 +2F4D KANGXI RADICAL DEATH + # 6B79 +2F4E KANGXI RADICAL WEAPON + # 6BB3 +2F4F KANGXI RADICAL DO NOT + # 6BCB +2F50 KANGXI RADICAL COMPARE + # 6BD4 +2F51 KANGXI RADICAL FUR + # 6BDB +2F52 KANGXI RADICAL CLAN + # 6C0F +2F53 KANGXI RADICAL STEAM + # 6C14 +2F54 KANGXI RADICAL WATER + # 6C34 +2F55 KANGXI RADICAL FIRE + # 706B +2F56 KANGXI RADICAL CLAW + # 722A +2F57 KANGXI RADICAL FATHER + # 7236 +2F58 KANGXI RADICAL DOUBLE X + # 723B +2F59 KANGXI RADICAL HALF TREE TRUNK + # 723F +2F5A KANGXI RADICAL SLICE + # 7247 +2F5B KANGXI RADICAL FANG + # 7259 +2F5C KANGXI RADICAL COW + # 725B +2F5D KANGXI RADICAL DOG + # 72AC +2F5E KANGXI RADICAL PROFOUND + # 7384 +2F5F KANGXI RADICAL JADE + # 7389 +2F60 KANGXI RADICAL MELON + # 74DC +2F61 KANGXI RADICAL TILE + # 74E6 +2F62 KANGXI RADICAL SWEET + # 7518 +2F63 KANGXI RADICAL LIFE + # 751F +2F64 KANGXI RADICAL USE + # 7528 +2F65 KANGXI RADICAL FIELD + # 7530 +2F66 KANGXI RADICAL BOLT OF CLOTH + # 758B +2F67 KANGXI RADICAL SICKNESS + # 7592 +2F68 KANGXI RADICAL DOTTED TENT + # 7676 +2F69 KANGXI RADICAL WHITE + # 767D +2F6A KANGXI RADICAL SKIN + # 76AE +2F6B KANGXI RADICAL DISH + # 76BF +2F6C KANGXI RADICAL EYE + # 76EE +2F6D KANGXI RADICAL SPEAR + # 77DB +2F6E KANGXI RADICAL ARROW + # 77E2 +2F6F KANGXI RADICAL STONE + # 77F3 +2F70 KANGXI RADICAL SPIRIT + # 793A +2F71 KANGXI RADICAL TRACK + # 79B8 +2F72 KANGXI RADICAL GRAIN + # 79BE +2F73 KANGXI RADICAL CAVE + # 7A74 +2F74 KANGXI RADICAL STAND + # 7ACB +2F75 KANGXI RADICAL BAMBOO + # 7AF9 +2F76 KANGXI RADICAL RICE + # 7C73 +2F77 KANGXI RADICAL SILK + # 7CF8 +2F78 KANGXI RADICAL JAR + # 7F36 +2F79 KANGXI RADICAL NET + # 7F51 +2F7A KANGXI RADICAL SHEEP + # 7F8A +2F7B KANGXI RADICAL FEATHER + # 7FBD +2F7C KANGXI RADICAL OLD + # 8001 +2F7D KANGXI RADICAL AND + # 800C +2F7E KANGXI RADICAL PLOW + # 8012 +2F7F KANGXI RADICAL EAR + # 8033 +2F80 KANGXI RADICAL BRUSH + # 807F +2F81 KANGXI RADICAL MEAT + # 8089 +2F82 KANGXI RADICAL MINISTER + # 81E3 +2F83 KANGXI RADICAL SELF + # 81EA +2F84 KANGXI RADICAL ARRIVE + # 81F3 +2F85 KANGXI RADICAL MORTAR + # 81FC +2F86 KANGXI RADICAL TONGUE + # 820C +2F87 KANGXI RADICAL OPPOSE + # 821B +2F88 KANGXI RADICAL BOAT + # 821F +2F89 KANGXI RADICAL STOPPING + # 826E +2F8A KANGXI RADICAL COLOR + # 8272 +2F8B KANGXI RADICAL GRASS + # 8278 +2F8C KANGXI RADICAL TIGER + # 864D +2F8D KANGXI RADICAL INSECT + # 866B +2F8E KANGXI RADICAL BLOOD + # 8840 +2F8F KANGXI RADICAL WALK ENCLOSURE + # 884C +2F90 KANGXI RADICAL CLOTHES + # 8863 +2F91 KANGXI RADICAL WEST + # 897E +2F92 KANGXI RADICAL SEE + # 898B +2F93 KANGXI RADICAL HORN + # 89D2 +2F94 KANGXI RADICAL SPEECH + # 8A00 +2F95 KANGXI RADICAL VALLEY + # 8C37 +2F96 KANGXI RADICAL BEAN + # 8C46 +2F97 KANGXI RADICAL PIG + # 8C55 +2F98 KANGXI RADICAL BADGER + # 8C78 +2F99 KANGXI RADICAL SHELL + # 8C9D +2F9A KANGXI RADICAL RED + # 8D64 +2F9B KANGXI RADICAL RUN + # 8D70 +2F9C KANGXI RADICAL FOOT + # 8DB3 +2F9D KANGXI RADICAL BODY + # 8EAB +2F9E KANGXI RADICAL CART + # 8ECA +2F9F KANGXI RADICAL BITTER + # 8F9B +2FA0 KANGXI RADICAL MORNING + # 8FB0 +2FA1 KANGXI RADICAL WALK + # 8FB5 +2FA2 KANGXI RADICAL CITY + # 9091 +2FA3 KANGXI RADICAL WINE + # 9149 +2FA4 KANGXI RADICAL DISTINGUISH + # 91C6 +2FA5 KANGXI RADICAL VILLAGE + # 91CC +2FA6 KANGXI RADICAL GOLD + # 91D1 +2FA7 KANGXI RADICAL LONG + # 9577 +2FA8 KANGXI RADICAL GATE + # 9580 +2FA9 KANGXI RADICAL MOUND + # 961C +2FAA KANGXI RADICAL SLAVE + # 96B6 +2FAB KANGXI RADICAL SHORT TAILED BIRD + # 96B9 +2FAC KANGXI RADICAL RAIN + # 96E8 +2FAD KANGXI RADICAL BLUE + # 9751 +2FAE KANGXI RADICAL WRONG + # 975E +2FAF KANGXI RADICAL FACE + # 9762 +2FB0 KANGXI RADICAL LEATHER + # 9769 +2FB1 KANGXI RADICAL TANNED LEATHER + # 97CB +2FB2 KANGXI RADICAL LEEK + # 97ED +2FB3 KANGXI RADICAL SOUND + # 97F3 +2FB4 KANGXI RADICAL LEAF + # 9801 +2FB5 KANGXI RADICAL WIND + # 98A8 +2FB6 KANGXI RADICAL FLY + # 98DB +2FB7 KANGXI RADICAL EAT + # 98DF +2FB8 KANGXI RADICAL HEAD + # 9996 +2FB9 KANGXI RADICAL FRAGRANT + # 9999 +2FBA KANGXI RADICAL HORSE + # 99AC +2FBB KANGXI RADICAL BONE + # 9AA8 +2FBC KANGXI RADICAL TALL + # 9AD8 +2FBD KANGXI RADICAL HAIR + # 9ADF +2FBE KANGXI RADICAL FIGHT + # 9B25 +2FBF KANGXI RADICAL SACRIFICIAL WINE + # 9B2F +2FC0 KANGXI RADICAL CAULDRON + # 9B32 +2FC1 KANGXI RADICAL GHOST + # 9B3C +2FC2 KANGXI RADICAL FISH + # 9B5A +2FC3 KANGXI RADICAL BIRD + # 9CE5 +2FC4 KANGXI RADICAL SALT + # 9E75 +2FC5 KANGXI RADICAL DEER + # 9E7F +2FC6 KANGXI RADICAL WHEAT + # 9EA5 +2FC7 KANGXI RADICAL HEMP + # 9EBB +2FC8 KANGXI RADICAL YELLOW + # 9EC3 +2FC9 KANGXI RADICAL MILLET + # 9ECD +2FCA KANGXI RADICAL BLACK + # 9ED1 +2FCB KANGXI RADICAL EMBROIDERY + # 9EF9 +2FCC KANGXI RADICAL FROG + # 9EFD +2FCD KANGXI RADICAL TRIPOD + # 9F0E +2FCE KANGXI RADICAL DRUM + # 9F13 +2FCF KANGXI RADICAL RAT + # 9F20 +2FD0 KANGXI RADICAL NOSE + # 9F3B +2FD1 KANGXI RADICAL EVEN + # 9F4A +2FD2 KANGXI RADICAL TOOTH + # 9F52 +2FD3 KANGXI RADICAL DRAGON + # 9F8D +2FD4 KANGXI RADICAL TURTLE + # 9F9C +2FD5 KANGXI RADICAL FLUTE + # 9FA0 +@@ 2FF0 Ideographic Description Characters 2FFF +@ Ideographic description characters +@+ These are visibly displayed graphic characters, not invisible composition controls. +2FF0 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT +2FF1 IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW +2FF2 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT +2FF3 IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW +2FF4 IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND +2FF5 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE +2FF6 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW +2FF7 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT +2FF8 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT +2FF9 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT +2FFA IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT +2FFB IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +@@ 3000 CJK Symbols and Punctuation 303F +@ CJK symbols and punctuation +3000 IDEOGRAPHIC SPACE + x (space - 0020) + # <wide> 0020 +3001 IDEOGRAPHIC COMMA + x (comma - 002C) +3002 IDEOGRAPHIC FULL STOP + x (full stop - 002E) +3003 DITTO MARK + x (double prime - 2033) +3004 JAPANESE INDUSTRIAL STANDARD SYMBOL +3005 IDEOGRAPHIC ITERATION MARK +3006 IDEOGRAPHIC CLOSING MARK +3007 IDEOGRAPHIC NUMBER ZERO + x (combining enclosing circle - 20DD) + x (white circle - 25CB) + x (large circle - 25EF) +@ CJK angle brackets +3008 LEFT ANGLE BRACKET + x (less-than sign - 003C) + x (single left-pointing angle quotation mark - 2039) + x (left-pointing angle bracket - 2329) + x (mathematical left angle bracket - 27E8) +3009 RIGHT ANGLE BRACKET + x (greater-than sign - 003E) + x (single right-pointing angle quotation mark - 203A) + x (right-pointing angle bracket - 232A) + x (mathematical right angle bracket - 27E9) +300A LEFT DOUBLE ANGLE BRACKET + x (left-pointing double angle quotation mark - 00AB) + x (mathematical left double angle bracket - 27EA) +300B RIGHT DOUBLE ANGLE BRACKET + x (right-pointing double angle quotation mark - 00BB) + x (mathematical right double angle bracket - 27EB) +@ CJK corner brackets +@+ The CJK corner brackets, which function as quotation marks, are not recommended for general-purpose corner brackets. See the ceiling and floor characters, instead. +300C LEFT CORNER BRACKET + x (left ceiling - 2308) +300D RIGHT CORNER BRACKET + * used as quotation marks + x (right floor - 230B) +300E LEFT WHITE CORNER BRACKET +300F RIGHT WHITE CORNER BRACKET + * used as quotation marks +@ CJK brackets +3010 LEFT BLACK LENTICULAR BRACKET +3011 RIGHT BLACK LENTICULAR BRACKET +@ CJK symbols +3012 POSTAL MARK +3013 GETA MARK + * substitute for ideograph not in font +@ CJK brackets +3014 LEFT TORTOISE SHELL BRACKET +3015 RIGHT TORTOISE SHELL BRACKET +3016 LEFT WHITE LENTICULAR BRACKET +3017 RIGHT WHITE LENTICULAR BRACKET +3018 LEFT WHITE TORTOISE SHELL BRACKET +3019 RIGHT WHITE TORTOISE SHELL BRACKET +301A LEFT WHITE SQUARE BRACKET + = left abstract syntax bracket + x (mathematical left white square bracket - 27E6) +301B RIGHT WHITE SQUARE BRACKET + = right abstract syntax bracket + x (mathematical right white square bracket - 27E7) +@ CJK symbols and punctuation +301C WAVE DASH +@+ * This character was encoded to match JIS C 6226-1978 1-33 "wave dash". The JIS standards and some industry practice disagree in mapping. + x (wavy dash - 3030) + x (fullwidth tilde - FF5E) +301D REVERSED DOUBLE PRIME QUOTATION MARK + * sometimes depicted as double prime quotation mark + x (left double quotation mark - 201C) + x (reversed double prime - 2036) +301E DOUBLE PRIME QUOTATION MARK + * this is a mistaken analogue to 201D; 301F is preferred + x (right double quotation mark - 201D) + x (double prime - 2033) +301F LOW DOUBLE PRIME QUOTATION MARK + * may be depicted as low inverse double prime quotation mark +3020 POSTAL MARK FACE +@ Suzhou numerals +@+ The Suzhou numerals (Chinese su1zhou1ma3zi) are special numeric forms used by traders to display the prices of goods. The use of "HANGZHOU" in the names is a misnomer. +3021 HANGZHOU NUMERAL ONE +3022 HANGZHOU NUMERAL TWO +3023 HANGZHOU NUMERAL THREE +3024 HANGZHOU NUMERAL FOUR +3025 HANGZHOU NUMERAL FIVE +3026 HANGZHOU NUMERAL SIX +3027 HANGZHOU NUMERAL SEVEN +3028 HANGZHOU NUMERAL EIGHT +3029 HANGZHOU NUMERAL NINE +@ Diacritics +302A IDEOGRAPHIC LEVEL TONE MARK +302B IDEOGRAPHIC RISING TONE MARK +302C IDEOGRAPHIC DEPARTING TONE MARK +302D IDEOGRAPHIC ENTERING TONE MARK +302E HANGUL SINGLE DOT TONE MARK + = single dot Bangjeom +302F HANGUL DOUBLE DOT TONE MARK + = double dot Bangjeom +@ Other CJK symbols +3030 WAVY DASH + x (wavy line - 2307) + x (wave dash - 301C) +3031 VERTICAL KANA REPEAT MARK +3032 VERTICAL KANA REPEAT WITH VOICED SOUND MARK + * the preceding two semantic characters are preferred to the following three glyphic forms +3033 VERTICAL KANA REPEAT MARK UPPER HALF +3034 VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF + * the preceding two are glyphs used in conjunction with the following glyph +3035 VERTICAL KANA REPEAT MARK LOWER HALF +3036 CIRCLED POSTAL MARK + # 3012 postal mark +3037 IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +@ Additional Suzhou numerals +3038 HANGZHOU NUMERAL TEN + # 5341 +3039 HANGZHOU NUMERAL TWENTY + # 5344 +303A HANGZHOU NUMERAL THIRTY + # 5345 +@ Other CJK punctuation +303B VERTICAL IDEOGRAPHIC ITERATION MARK +303C MASU MARK + * informal abbreviation for Japanese -masu ending + x (squared rising diagonal slash - 29C4) +303D PART ALTERNATION MARK + * marks the start of a song part in Japanese +@ Special CJK indicators +@+ These are visibly displayed graphic characters, not invisible formatting controls. +303E IDEOGRAPHIC VARIATION INDICATOR + * visual indicator that the following ideograph is to be taken as a variant of the intended character +303F IDEOGRAPHIC HALF FILL SPACE + * visual indicator of a screen space for half of an ideograph +@@ 3040 Hiragana 309F +@ Based on JIS X 0208 +3041 HIRAGANA LETTER SMALL A +3042 HIRAGANA LETTER A +3043 HIRAGANA LETTER SMALL I +3044 HIRAGANA LETTER I +3045 HIRAGANA LETTER SMALL U +3046 HIRAGANA LETTER U +3047 HIRAGANA LETTER SMALL E +3048 HIRAGANA LETTER E +3049 HIRAGANA LETTER SMALL O +304A HIRAGANA LETTER O +304B HIRAGANA LETTER KA +304C HIRAGANA LETTER GA + : 304B 3099 +304D HIRAGANA LETTER KI +304E HIRAGANA LETTER GI + : 304D 3099 +304F HIRAGANA LETTER KU +3050 HIRAGANA LETTER GU + : 304F 3099 +3051 HIRAGANA LETTER KE +3052 HIRAGANA LETTER GE + : 3051 3099 +3053 HIRAGANA LETTER KO +3054 HIRAGANA LETTER GO + : 3053 3099 +3055 HIRAGANA LETTER SA +3056 HIRAGANA LETTER ZA + : 3055 3099 +3057 HIRAGANA LETTER SI + = SHI +3058 HIRAGANA LETTER ZI + = JI (not unique) + : 3057 3099 +3059 HIRAGANA LETTER SU +305A HIRAGANA LETTER ZU + : 3059 3099 +305B HIRAGANA LETTER SE +305C HIRAGANA LETTER ZE + : 305B 3099 +305D HIRAGANA LETTER SO +305E HIRAGANA LETTER ZO + : 305D 3099 +305F HIRAGANA LETTER TA +3060 HIRAGANA LETTER DA + : 305F 3099 +3061 HIRAGANA LETTER TI + = CHI +3062 HIRAGANA LETTER DI + = JI (not unique) + : 3061 3099 +3063 HIRAGANA LETTER SMALL TU + = SMALL TSU +3064 HIRAGANA LETTER TU + = TSU +3065 HIRAGANA LETTER DU + = ZU (not unique) + : 3064 3099 +3066 HIRAGANA LETTER TE +3067 HIRAGANA LETTER DE + : 3066 3099 +3068 HIRAGANA LETTER TO +3069 HIRAGANA LETTER DO + : 3068 3099 +306A HIRAGANA LETTER NA +306B HIRAGANA LETTER NI +306C HIRAGANA LETTER NU +306D HIRAGANA LETTER NE +306E HIRAGANA LETTER NO +306F HIRAGANA LETTER HA +3070 HIRAGANA LETTER BA + : 306F 3099 +3071 HIRAGANA LETTER PA + : 306F 309A +3072 HIRAGANA LETTER HI +3073 HIRAGANA LETTER BI + : 3072 3099 +3074 HIRAGANA LETTER PI + : 3072 309A +3075 HIRAGANA LETTER HU + = FU +3076 HIRAGANA LETTER BU + : 3075 3099 +3077 HIRAGANA LETTER PU + : 3075 309A +3078 HIRAGANA LETTER HE +3079 HIRAGANA LETTER BE + : 3078 3099 +307A HIRAGANA LETTER PE + : 3078 309A +307B HIRAGANA LETTER HO +307C HIRAGANA LETTER BO + : 307B 3099 +307D HIRAGANA LETTER PO + : 307B 309A +307E HIRAGANA LETTER MA +307F HIRAGANA LETTER MI +3080 HIRAGANA LETTER MU +3081 HIRAGANA LETTER ME +3082 HIRAGANA LETTER MO +3083 HIRAGANA LETTER SMALL YA +3084 HIRAGANA LETTER YA +3085 HIRAGANA LETTER SMALL YU +3086 HIRAGANA LETTER YU +3087 HIRAGANA LETTER SMALL YO +3088 HIRAGANA LETTER YO +3089 HIRAGANA LETTER RA +308A HIRAGANA LETTER RI +308B HIRAGANA LETTER RU +308C HIRAGANA LETTER RE +308D HIRAGANA LETTER RO +308E HIRAGANA LETTER SMALL WA +308F HIRAGANA LETTER WA +3090 HIRAGANA LETTER WI +3091 HIRAGANA LETTER WE +3092 HIRAGANA LETTER WO +3093 HIRAGANA LETTER N +3094 HIRAGANA LETTER VU + : 3046 3099 +@ Small letters +3095 HIRAGANA LETTER SMALL KA +3096 HIRAGANA LETTER SMALL KE +@ Voicing marks +3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK +309A COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309B KATAKANA-HIRAGANA VOICED SOUND MARK + # 0020 3099 +309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + # 0020 309A +@ Iteration marks +309D HIRAGANA ITERATION MARK +309E HIRAGANA VOICED ITERATION MARK + : 309D 3099 +@ Vertical form digraph +309F HIRAGANA DIGRAPH YORI + # <vertical> 3088 308A +@@ 30A0 Katakana 30FF +@ Katakana punctuation +30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN + x (equals sign - 003D) +@ Based on JIS X 0208 +30A1 KATAKANA LETTER SMALL A +30A2 KATAKANA LETTER A +30A3 KATAKANA LETTER SMALL I +30A4 KATAKANA LETTER I +30A5 KATAKANA LETTER SMALL U +30A6 KATAKANA LETTER U +30A7 KATAKANA LETTER SMALL E +30A8 KATAKANA LETTER E +30A9 KATAKANA LETTER SMALL O +30AA KATAKANA LETTER O +30AB KATAKANA LETTER KA +30AC KATAKANA LETTER GA + : 30AB 3099 +30AD KATAKANA LETTER KI +30AE KATAKANA LETTER GI + : 30AD 3099 +30AF KATAKANA LETTER KU +30B0 KATAKANA LETTER GU + : 30AF 3099 +30B1 KATAKANA LETTER KE +30B2 KATAKANA LETTER GE + : 30B1 3099 +30B3 KATAKANA LETTER KO +30B4 KATAKANA LETTER GO + : 30B3 3099 +30B5 KATAKANA LETTER SA +30B6 KATAKANA LETTER ZA + : 30B5 3099 +30B7 KATAKANA LETTER SI + = SHI +30B8 KATAKANA LETTER ZI + = JI (not unique) + : 30B7 3099 +30B9 KATAKANA LETTER SU +30BA KATAKANA LETTER ZU + : 30B9 3099 +30BB KATAKANA LETTER SE +30BC KATAKANA LETTER ZE + : 30BB 3099 +30BD KATAKANA LETTER SO +30BE KATAKANA LETTER ZO + : 30BD 3099 +30BF KATAKANA LETTER TA +30C0 KATAKANA LETTER DA + : 30BF 3099 +30C1 KATAKANA LETTER TI + = CHI +30C2 KATAKANA LETTER DI + = JI (not unique) + : 30C1 3099 +30C3 KATAKANA LETTER SMALL TU + = SMALL TSU +30C4 KATAKANA LETTER TU + = TSU +30C5 KATAKANA LETTER DU + = ZU (not unique) + : 30C4 3099 +30C6 KATAKANA LETTER TE +30C7 KATAKANA LETTER DE + : 30C6 3099 +30C8 KATAKANA LETTER TO +30C9 KATAKANA LETTER DO + : 30C8 3099 +30CA KATAKANA LETTER NA +30CB KATAKANA LETTER NI +30CC KATAKANA LETTER NU +30CD KATAKANA LETTER NE +30CE KATAKANA LETTER NO +30CF KATAKANA LETTER HA +30D0 KATAKANA LETTER BA + : 30CF 3099 +30D1 KATAKANA LETTER PA + : 30CF 309A +30D2 KATAKANA LETTER HI +30D3 KATAKANA LETTER BI + : 30D2 3099 +30D4 KATAKANA LETTER PI + : 30D2 309A +30D5 KATAKANA LETTER HU + = FU +30D6 KATAKANA LETTER BU + : 30D5 3099 +30D7 KATAKANA LETTER PU + : 30D5 309A +30D8 KATAKANA LETTER HE +30D9 KATAKANA LETTER BE + : 30D8 3099 +30DA KATAKANA LETTER PE + : 30D8 309A +30DB KATAKANA LETTER HO +30DC KATAKANA LETTER BO + : 30DB 3099 +30DD KATAKANA LETTER PO + : 30DB 309A +30DE KATAKANA LETTER MA +30DF KATAKANA LETTER MI +30E0 KATAKANA LETTER MU +30E1 KATAKANA LETTER ME +30E2 KATAKANA LETTER MO +30E3 KATAKANA LETTER SMALL YA +30E4 KATAKANA LETTER YA +30E5 KATAKANA LETTER SMALL YU +30E6 KATAKANA LETTER YU +30E7 KATAKANA LETTER SMALL YO +30E8 KATAKANA LETTER YO +30E9 KATAKANA LETTER RA +30EA KATAKANA LETTER RI +30EB KATAKANA LETTER RU +30EC KATAKANA LETTER RE +30ED KATAKANA LETTER RO +30EE KATAKANA LETTER SMALL WA +30EF KATAKANA LETTER WA +30F0 KATAKANA LETTER WI +30F1 KATAKANA LETTER WE +30F2 KATAKANA LETTER WO +30F3 KATAKANA LETTER N +30F4 KATAKANA LETTER VU + : 30A6 3099 +30F5 KATAKANA LETTER SMALL KA +30F6 KATAKANA LETTER SMALL KE +30F7 KATAKANA LETTER VA + : 30EF 3099 +30F8 KATAKANA LETTER VI + : 30F0 3099 +30F9 KATAKANA LETTER VE + : 30F1 3099 +30FA KATAKANA LETTER VO + : 30F2 3099 +@ Conjunction and length marks +30FB KATAKANA MIDDLE DOT + x (middle dot - 00B7) +30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK + x (em dash - 2014) +@ Iteration marks +30FD KATAKANA ITERATION MARK +30FE KATAKANA VOICED ITERATION MARK + : 30FD 3099 +@ Vertical form digraph +30FF KATAKANA DIGRAPH KOTO + # <vertical> 30B3 30C8 +@@ 3100 Bopomofo 312F +@+ See also the Bopomofo Extended block +@ Based on GB 2312 +3105 BOPOMOFO LETTER B +3106 BOPOMOFO LETTER P +3107 BOPOMOFO LETTER M +3108 BOPOMOFO LETTER F +3109 BOPOMOFO LETTER D +310A BOPOMOFO LETTER T +310B BOPOMOFO LETTER N +310C BOPOMOFO LETTER L +310D BOPOMOFO LETTER G +310E BOPOMOFO LETTER K +310F BOPOMOFO LETTER H +3110 BOPOMOFO LETTER J +3111 BOPOMOFO LETTER Q +3112 BOPOMOFO LETTER X +3113 BOPOMOFO LETTER ZH +3114 BOPOMOFO LETTER CH +3115 BOPOMOFO LETTER SH +3116 BOPOMOFO LETTER R +3117 BOPOMOFO LETTER Z +3118 BOPOMOFO LETTER C +3119 BOPOMOFO LETTER S +311A BOPOMOFO LETTER A +311B BOPOMOFO LETTER O +311C BOPOMOFO LETTER E +311D BOPOMOFO LETTER EH +311E BOPOMOFO LETTER AI +311F BOPOMOFO LETTER EI +3120 BOPOMOFO LETTER AU +3121 BOPOMOFO LETTER OU +3122 BOPOMOFO LETTER AN +3123 BOPOMOFO LETTER EN +3124 BOPOMOFO LETTER ANG +3125 BOPOMOFO LETTER ENG +3126 BOPOMOFO LETTER ER +3127 BOPOMOFO LETTER I +3128 BOPOMOFO LETTER U +3129 BOPOMOFO LETTER IU +@ Dialect (non-Mandarin) letters +312A BOPOMOFO LETTER V +312B BOPOMOFO LETTER NG +312C BOPOMOFO LETTER GN +@@ 3130 Hangul Compatibility Jamo 318F +@ Modern letters +3131 HANGUL LETTER KIYEOK + # 1100 hangul choseong kiyeok +3132 HANGUL LETTER SSANGKIYEOK + # 1101 hangul choseong ssangkiyeok +3133 HANGUL LETTER KIYEOK-SIOS + # 11AA hangul jongseong kiyeok-sios +3134 HANGUL LETTER NIEUN + # 1102 hangul choseong nieun +3135 HANGUL LETTER NIEUN-CIEUC + # 11AC hangul jongseong nieun-cieuc +3136 HANGUL LETTER NIEUN-HIEUH + # 11AD hangul jongseong nieun-hieuh +3137 HANGUL LETTER TIKEUT + # 1103 hangul choseong tikeut +3138 HANGUL LETTER SSANGTIKEUT + # 1104 hangul choseong ssangtikeut +3139 HANGUL LETTER RIEUL + # 1105 hangul choseong rieul +313A HANGUL LETTER RIEUL-KIYEOK + # 11B0 hangul jongseong rieul-kiyeok +313B HANGUL LETTER RIEUL-MIEUM + # 11B1 hangul jongseong rieul-mieum +313C HANGUL LETTER RIEUL-PIEUP + # 11B2 hangul jongseong rieul-pieup +313D HANGUL LETTER RIEUL-SIOS + # 11B3 hangul jongseong rieul-sios +313E HANGUL LETTER RIEUL-THIEUTH + # 11B4 hangul jongseong rieul-thieuth +313F HANGUL LETTER RIEUL-PHIEUPH + # 11B5 hangul jongseong rieul-phieuph +3140 HANGUL LETTER RIEUL-HIEUH + # 111A hangul choseong rieul-hieuh +3141 HANGUL LETTER MIEUM + # 1106 hangul choseong mieum +3142 HANGUL LETTER PIEUP + # 1107 hangul choseong pieup +3143 HANGUL LETTER SSANGPIEUP + # 1108 hangul choseong ssangpieup +3144 HANGUL LETTER PIEUP-SIOS + # 1121 hangul choseong pieup-sios +3145 HANGUL LETTER SIOS + # 1109 hangul choseong sios +3146 HANGUL LETTER SSANGSIOS + # 110A hangul choseong ssangsios +3147 HANGUL LETTER IEUNG + # 110B hangul choseong ieung +3148 HANGUL LETTER CIEUC + # 110C hangul choseong cieuc +3149 HANGUL LETTER SSANGCIEUC + # 110D hangul choseong ssangcieuc +314A HANGUL LETTER CHIEUCH + # 110E hangul choseong chieuch +314B HANGUL LETTER KHIEUKH + # 110F hangul choseong khieukh +314C HANGUL LETTER THIEUTH + # 1110 hangul choseong thieuth +314D HANGUL LETTER PHIEUPH + # 1111 hangul choseong phieuph +314E HANGUL LETTER HIEUH + # 1112 hangul choseong hieuh +314F HANGUL LETTER A + # 1161 hangul jungseong a +3150 HANGUL LETTER AE + # 1162 hangul jungseong ae +3151 HANGUL LETTER YA + # 1163 hangul jungseong ya +3152 HANGUL LETTER YAE + # 1164 hangul jungseong yae +3153 HANGUL LETTER EO + # 1165 hangul jungseong eo +3154 HANGUL LETTER E + # 1166 hangul jungseong e +3155 HANGUL LETTER YEO + # 1167 hangul jungseong yeo +3156 HANGUL LETTER YE + # 1168 hangul jungseong ye +3157 HANGUL LETTER O + # 1169 hangul jungseong o +3158 HANGUL LETTER WA + # 116A hangul jungseong wa +3159 HANGUL LETTER WAE + # 116B hangul jungseong wae +315A HANGUL LETTER OE + # 116C hangul jungseong oe +315B HANGUL LETTER YO + # 116D hangul jungseong yo +315C HANGUL LETTER U + # 116E hangul jungseong u +315D HANGUL LETTER WEO + # 116F hangul jungseong weo +315E HANGUL LETTER WE + # 1170 hangul jungseong we +315F HANGUL LETTER WI + # 1171 hangul jungseong wi +3160 HANGUL LETTER YU + # 1172 hangul jungseong yu +3161 HANGUL LETTER EU + # 1173 hangul jungseong eu +3162 HANGUL LETTER YI + # 1174 hangul jungseong yi +3163 HANGUL LETTER I + # 1175 hangul jungseong i +@ Special character +3164 HANGUL FILLER + = HANGUL CAE OM + # 1160 hangul jungseong filler +@ Archaic letters +3165 HANGUL LETTER SSANGNIEUN + # 1114 hangul choseong ssangnieun +3166 HANGUL LETTER NIEUN-TIKEUT + # 1115 hangul choseong nieun-tikeut +3167 HANGUL LETTER NIEUN-SIOS + # 11C7 hangul jongseong nieun-sios +3168 HANGUL LETTER NIEUN-PANSIOS + # 11C8 hangul jongseong nieun-pansios +3169 HANGUL LETTER RIEUL-KIYEOK-SIOS + # 11CC hangul jongseong rieul-kiyeok-sios +316A HANGUL LETTER RIEUL-TIKEUT + # 11CE hangul jongseong rieul-tikeut +316B HANGUL LETTER RIEUL-PIEUP-SIOS + # 11D3 hangul jongseong rieul-pieup-sios +316C HANGUL LETTER RIEUL-PANSIOS + # 11D7 hangul jongseong rieul-pansios +316D HANGUL LETTER RIEUL-YEORINHIEUH + # 11D9 hangul jongseong rieul-yeorinhieuh +316E HANGUL LETTER MIEUM-PIEUP + # 111C hangul choseong mieum-pieup +316F HANGUL LETTER MIEUM-SIOS + # 11DD hangul jongseong mieum-sios +3170 HANGUL LETTER MIEUM-PANSIOS + # 11DF hangul jongseong mieum-pansios +3171 HANGUL LETTER KAPYEOUNMIEUM + # 111D hangul choseong kapyeounmieum +3172 HANGUL LETTER PIEUP-KIYEOK + # 111E hangul choseong pieup-kiyeok +3173 HANGUL LETTER PIEUP-TIKEUT + # 1120 hangul choseong pieup-tikeut +3174 HANGUL LETTER PIEUP-SIOS-KIYEOK + # 1122 hangul choseong pieup-sios-kiyeok +3175 HANGUL LETTER PIEUP-SIOS-TIKEUT + # 1123 hangul choseong pieup-sios-tikeut +3176 HANGUL LETTER PIEUP-CIEUC + # 1127 hangul choseong pieup-cieuc +3177 HANGUL LETTER PIEUP-THIEUTH + # 1129 hangul choseong pieup-thieuth +3178 HANGUL LETTER KAPYEOUNPIEUP + # 112B hangul choseong kapyeounpieup +3179 HANGUL LETTER KAPYEOUNSSANGPIEUP + # 112C hangul choseong kapyeounssangpieup +317A HANGUL LETTER SIOS-KIYEOK + # 112D hangul choseong sios-kiyeok +317B HANGUL LETTER SIOS-NIEUN + # 112E hangul choseong sios-nieun +317C HANGUL LETTER SIOS-TIKEUT + # 112F hangul choseong sios-tikeut +317D HANGUL LETTER SIOS-PIEUP + # 1132 hangul choseong sios-pieup +317E HANGUL LETTER SIOS-CIEUC + # 1136 hangul choseong sios-cieuc +317F HANGUL LETTER PANSIOS + # 1140 hangul choseong pansios +3180 HANGUL LETTER SSANGIEUNG + # 1147 hangul choseong ssangieung +3181 HANGUL LETTER YESIEUNG + * archaic velar nasal + # 114C hangul choseong yesieung +3182 HANGUL LETTER YESIEUNG-SIOS + # 11F1 hangul jongseong yesieung-sios +3183 HANGUL LETTER YESIEUNG-PANSIOS + # 11F2 hangul jongseong yesieung-pansios +3184 HANGUL LETTER KAPYEOUNPHIEUPH + # 1157 hangul choseong kapyeounphieuph +3185 HANGUL LETTER SSANGHIEUH + # 1158 hangul choseong ssanghieuh +3186 HANGUL LETTER YEORINHIEUH + * archaic glottal stop + # 1159 hangul choseong yeorinhieuh +3187 HANGUL LETTER YO-YA + # 1184 hangul jungseong yo-ya +3188 HANGUL LETTER YO-YAE + # 1185 hangul jungseong yo-yae +3189 HANGUL LETTER YO-I + # 1188 hangul jungseong yo-i +318A HANGUL LETTER YU-YEO + # 1191 hangul jungseong yu-yeo +318B HANGUL LETTER YU-YE + # 1192 hangul jungseong yu-ye +318C HANGUL LETTER YU-I + # 1194 hangul jungseong yu-i +318D HANGUL LETTER ARAEA + # 119E hangul jungseong araea +318E HANGUL LETTER ARAEAE + # 11A1 hangul jungseong araea-i +@@ 3190 Kanbun 319F +@ Kanbun +3190 IDEOGRAPHIC ANNOTATION LINKING MARK (Kanbun Tateten) + = KANBUN TATETEN +3191 IDEOGRAPHIC ANNOTATION REVERSE MARK (Kaeriten) + = KAERITEN RE +3192 IDEOGRAPHIC ANNOTATION ONE MARK (Kaeriten) + # <super> 4E00 +3193 IDEOGRAPHIC ANNOTATION TWO MARK (Kaeriten) + # <super> 4E8C +3194 IDEOGRAPHIC ANNOTATION THREE MARK (Kaeriten) + # <super> 4E09 +3195 IDEOGRAPHIC ANNOTATION FOUR MARK (Kaeriten) + # <super> 56DB +3196 IDEOGRAPHIC ANNOTATION TOP MARK (Kaeriten) + # <super> 4E0A +3197 IDEOGRAPHIC ANNOTATION MIDDLE MARK (Kaeriten) + # <super> 4E2D +3198 IDEOGRAPHIC ANNOTATION BOTTOM MARK (Kaeriten) + # <super> 4E0B +3199 IDEOGRAPHIC ANNOTATION FIRST MARK (Kaeriten) + # <super> 7532 +319A IDEOGRAPHIC ANNOTATION SECOND MARK (Kaeriten) + # <super> 4E59 +319B IDEOGRAPHIC ANNOTATION THIRD MARK (Kaeriten) + # <super> 4E19 +319C IDEOGRAPHIC ANNOTATION FOURTH MARK (Kaeriten) + # <super> 4E01 +319D IDEOGRAPHIC ANNOTATION HEAVEN MARK (Kaeriten) + # <super> 5929 +319E IDEOGRAPHIC ANNOTATION EARTH MARK (Kaeriten) + # <super> 5730 +319F IDEOGRAPHIC ANNOTATION MAN MARK (Kaeriten) + # <super> 4EBA +@@ 31A0 Bopomofo Extended 31BF +@+ See also the Bopomofo block +@ Extended Bopomofo for Minnan and Hakka +31A0 BOPOMOFO LETTER BU +31A1 BOPOMOFO LETTER ZI +31A2 BOPOMOFO LETTER JI +31A3 BOPOMOFO LETTER GU +31A4 BOPOMOFO LETTER EE +31A5 BOPOMOFO LETTER ENN +31A6 BOPOMOFO LETTER OO +31A7 BOPOMOFO LETTER ONN +31A8 BOPOMOFO LETTER IR +31A9 BOPOMOFO LETTER ANN +31AA BOPOMOFO LETTER INN +31AB BOPOMOFO LETTER UNN +31AC BOPOMOFO LETTER IM +31AD BOPOMOFO LETTER NGG +31AE BOPOMOFO LETTER AINN +31AF BOPOMOFO LETTER AUNN +31B0 BOPOMOFO LETTER AM +31B1 BOPOMOFO LETTER OM +31B2 BOPOMOFO LETTER ONG +31B3 BOPOMOFO LETTER INNN +31B4 BOPOMOFO FINAL LETTER P +31B5 BOPOMOFO FINAL LETTER T +31B6 BOPOMOFO FINAL LETTER K +31B7 BOPOMOFO FINAL LETTER H +@@ 31C0 CJK Strokes 31EF +@ CJK strokes +31C0 CJK STROKE T +31C1 CJK STROKE WG +31C2 CJK STROKE XG +31C3 CJK STROKE BXG +31C4 CJK STROKE SW +31C5 CJK STROKE HZZ +31C6 CJK STROKE HZG +31C7 CJK STROKE HP +31C8 CJK STROKE HZWG +31C9 CJK STROKE SZWG +31CA CJK STROKE HZT +31CB CJK STROKE HZZP +31CC CJK STROKE HPWG +31CD CJK STROKE HZW +31CE CJK STROKE HZZZ +31CF CJK STROKE N +@@ 31F0 Katakana Phonetic Extensions 31FF +@ Phonetic extensions for Ainu +31F0 KATAKANA LETTER SMALL KU +31F1 KATAKANA LETTER SMALL SI +31F2 KATAKANA LETTER SMALL SU +31F3 KATAKANA LETTER SMALL TO +31F4 KATAKANA LETTER SMALL NU +31F5 KATAKANA LETTER SMALL HA +31F6 KATAKANA LETTER SMALL HI +31F7 KATAKANA LETTER SMALL HU +31F8 KATAKANA LETTER SMALL HE +31F9 KATAKANA LETTER SMALL HO +31FA KATAKANA LETTER SMALL MU +31FB KATAKANA LETTER SMALL RA +31FC KATAKANA LETTER SMALL RI +31FD KATAKANA LETTER SMALL RU +31FE KATAKANA LETTER SMALL RE +31FF KATAKANA LETTER SMALL RO +@@ 3200 Enclosed CJK Letters and Months 32FF +@ Parenthesized Hangul elements +3200 PARENTHESIZED HANGUL KIYEOK + # 0028 1100 0029 +3201 PARENTHESIZED HANGUL NIEUN + # 0028 1102 0029 +3202 PARENTHESIZED HANGUL TIKEUT + # 0028 1103 0029 +3203 PARENTHESIZED HANGUL RIEUL + # 0028 1105 0029 +3204 PARENTHESIZED HANGUL MIEUM + # 0028 1106 0029 +3205 PARENTHESIZED HANGUL PIEUP + # 0028 1107 0029 +3206 PARENTHESIZED HANGUL SIOS + # 0028 1109 0029 +3207 PARENTHESIZED HANGUL IEUNG + # 0028 110B 0029 +3208 PARENTHESIZED HANGUL CIEUC + # 0028 110C 0029 +3209 PARENTHESIZED HANGUL CHIEUCH + # 0028 110E 0029 +320A PARENTHESIZED HANGUL KHIEUKH + # 0028 110F 0029 +320B PARENTHESIZED HANGUL THIEUTH + # 0028 1110 0029 +320C PARENTHESIZED HANGUL PHIEUPH + # 0028 1111 0029 +320D PARENTHESIZED HANGUL HIEUH + # 0028 1112 0029 +@ Parenthesized Hangul syllables +320E PARENTHESIZED HANGUL KIYEOK A + # 0028 1100 1161 0029 +320F PARENTHESIZED HANGUL NIEUN A + # 0028 1102 1161 0029 +3210 PARENTHESIZED HANGUL TIKEUT A + # 0028 1103 1161 0029 +3211 PARENTHESIZED HANGUL RIEUL A + # 0028 1105 1161 0029 +3212 PARENTHESIZED HANGUL MIEUM A + # 0028 1106 1161 0029 +3213 PARENTHESIZED HANGUL PIEUP A + # 0028 1107 1161 0029 +3214 PARENTHESIZED HANGUL SIOS A + # 0028 1109 1161 0029 +3215 PARENTHESIZED HANGUL IEUNG A + # 0028 110B 1161 0029 +3216 PARENTHESIZED HANGUL CIEUC A + # 0028 110C 1161 0029 +3217 PARENTHESIZED HANGUL CHIEUCH A + # 0028 110E 1161 0029 +3218 PARENTHESIZED HANGUL KHIEUKH A + # 0028 110F 1161 0029 +3219 PARENTHESIZED HANGUL THIEUTH A + # 0028 1110 1161 0029 +321A PARENTHESIZED HANGUL PHIEUPH A + # 0028 1111 1161 0029 +321B PARENTHESIZED HANGUL HIEUH A + # 0028 1112 1161 0029 +321C PARENTHESIZED HANGUL CIEUC U + # 0028 110C 116E 0029 +@ Parenthesized Korean words +321D PARENTHESIZED KOREAN CHARACTER OJEON + # 0028 110B 1169 110C 1165 11AB 0029 +321E PARENTHESIZED KOREAN CHARACTER O HU + # 0028 110B 1169 1112 116E 0029 +@ Parenthesized ideographs +3220 PARENTHESIZED IDEOGRAPH ONE + # 0028 4E00 0029 +3221 PARENTHESIZED IDEOGRAPH TWO + # 0028 4E8C 0029 +3222 PARENTHESIZED IDEOGRAPH THREE + # 0028 4E09 0029 +3223 PARENTHESIZED IDEOGRAPH FOUR + # 0028 56DB 0029 +3224 PARENTHESIZED IDEOGRAPH FIVE + # 0028 4E94 0029 +3225 PARENTHESIZED IDEOGRAPH SIX + # 0028 516D 0029 +3226 PARENTHESIZED IDEOGRAPH SEVEN + # 0028 4E03 0029 +3227 PARENTHESIZED IDEOGRAPH EIGHT + # 0028 516B 0029 +3228 PARENTHESIZED IDEOGRAPH NINE + # 0028 4E5D 0029 +3229 PARENTHESIZED IDEOGRAPH TEN + # 0028 5341 0029 +322A PARENTHESIZED IDEOGRAPH MOON + * Monday + # 0028 6708 0029 +322B PARENTHESIZED IDEOGRAPH FIRE + * Tuesday + # 0028 706B 0029 +322C PARENTHESIZED IDEOGRAPH WATER + * Wednesday + # 0028 6C34 0029 +322D PARENTHESIZED IDEOGRAPH WOOD + * Thursday + # 0028 6728 0029 +322E PARENTHESIZED IDEOGRAPH METAL + * Friday + # 0028 91D1 0029 +322F PARENTHESIZED IDEOGRAPH EARTH + * Saturday + # 0028 571F 0029 +3230 PARENTHESIZED IDEOGRAPH SUN + * Sunday + # 0028 65E5 0029 +3231 PARENTHESIZED IDEOGRAPH STOCK + * incorporated + # 0028 682A 0029 +3232 PARENTHESIZED IDEOGRAPH HAVE + * limited + # 0028 6709 0029 +3233 PARENTHESIZED IDEOGRAPH SOCIETY + * company + # 0028 793E 0029 +3234 PARENTHESIZED IDEOGRAPH NAME + # 0028 540D 0029 +3235 PARENTHESIZED IDEOGRAPH SPECIAL + # 0028 7279 0029 +3236 PARENTHESIZED IDEOGRAPH FINANCIAL + # 0028 8CA1 0029 +3237 PARENTHESIZED IDEOGRAPH CONGRATULATION + # 0028 795D 0029 +3238 PARENTHESIZED IDEOGRAPH LABOR + # 0028 52B4 0029 +3239 PARENTHESIZED IDEOGRAPH REPRESENT + # 0028 4EE3 0029 +323A PARENTHESIZED IDEOGRAPH CALL + # 0028 547C 0029 +323B PARENTHESIZED IDEOGRAPH STUDY + # 0028 5B66 0029 +323C PARENTHESIZED IDEOGRAPH SUPERVISE + # 0028 76E3 0029 +323D PARENTHESIZED IDEOGRAPH ENTERPRISE + # 0028 4F01 0029 +323E PARENTHESIZED IDEOGRAPH RESOURCE + # 0028 8CC7 0029 +323F PARENTHESIZED IDEOGRAPH ALLIANCE + # 0028 5354 0029 +3240 PARENTHESIZED IDEOGRAPH FESTIVAL + # 0028 796D 0029 +3241 PARENTHESIZED IDEOGRAPH REST + # 0028 4F11 0029 +3242 PARENTHESIZED IDEOGRAPH SELF + * from + # 0028 81EA 0029 +3243 PARENTHESIZED IDEOGRAPH REACH + * to + # 0028 81F3 0029 +@ Squared Latin abbreviation +3250 PARTNERSHIP SIGN + # <square> 0050 0054 0045 +@ Circled numbers +3251 CIRCLED NUMBER TWENTY ONE + # <circle> 0032 0031 +3252 CIRCLED NUMBER TWENTY TWO + # <circle> 0032 0032 +3253 CIRCLED NUMBER TWENTY THREE + # <circle> 0032 0033 +3254 CIRCLED NUMBER TWENTY FOUR + # <circle> 0032 0034 +3255 CIRCLED NUMBER TWENTY FIVE + # <circle> 0032 0035 +3256 CIRCLED NUMBER TWENTY SIX + # <circle> 0032 0036 +3257 CIRCLED NUMBER TWENTY SEVEN + # <circle> 0032 0037 +3258 CIRCLED NUMBER TWENTY EIGHT + # <circle> 0032 0038 +3259 CIRCLED NUMBER TWENTY NINE + # <circle> 0032 0039 +325A CIRCLED NUMBER THIRTY + # <circle> 0033 0030 +325B CIRCLED NUMBER THIRTY ONE + # <circle> 0033 0031 +325C CIRCLED NUMBER THIRTY TWO + # <circle> 0033 0032 +325D CIRCLED NUMBER THIRTY THREE + # <circle> 0033 0033 +325E CIRCLED NUMBER THIRTY FOUR + # <circle> 0033 0034 +325F CIRCLED NUMBER THIRTY FIVE + # <circle> 0033 0035 +@ Circled Hangul elements +3260 CIRCLED HANGUL KIYEOK + # <circle> 1100 +3261 CIRCLED HANGUL NIEUN + # <circle> 1102 +3262 CIRCLED HANGUL TIKEUT + # <circle> 1103 +3263 CIRCLED HANGUL RIEUL + # <circle> 1105 +3264 CIRCLED HANGUL MIEUM + # <circle> 1106 +3265 CIRCLED HANGUL PIEUP + # <circle> 1107 +3266 CIRCLED HANGUL SIOS + # <circle> 1109 +3267 CIRCLED HANGUL IEUNG + # <circle> 110B +3268 CIRCLED HANGUL CIEUC + # <circle> 110C +3269 CIRCLED HANGUL CHIEUCH + # <circle> 110E +326A CIRCLED HANGUL KHIEUKH + # <circle> 110F +326B CIRCLED HANGUL THIEUTH + # <circle> 1110 +326C CIRCLED HANGUL PHIEUPH + # <circle> 1111 +326D CIRCLED HANGUL HIEUH + # <circle> 1112 +@ Circled Hangul syllables +326E CIRCLED HANGUL KIYEOK A + # <circle> 1100 1161 +326F CIRCLED HANGUL NIEUN A + # <circle> 1102 1161 +3270 CIRCLED HANGUL TIKEUT A + # <circle> 1103 1161 +3271 CIRCLED HANGUL RIEUL A + # <circle> 1105 1161 +3272 CIRCLED HANGUL MIEUM A + # <circle> 1106 1161 +3273 CIRCLED HANGUL PIEUP A + # <circle> 1107 1161 +3274 CIRCLED HANGUL SIOS A + # <circle> 1109 1161 +3275 CIRCLED HANGUL IEUNG A + # <circle> 110B 1161 +3276 CIRCLED HANGUL CIEUC A + # <circle> 110C 1161 +3277 CIRCLED HANGUL CHIEUCH A + # <circle> 110E 1161 +3278 CIRCLED HANGUL KHIEUKH A + # <circle> 110F 1161 +3279 CIRCLED HANGUL THIEUTH A + # <circle> 1110 1161 +327A CIRCLED HANGUL PHIEUPH A + # <circle> 1111 1161 +327B CIRCLED HANGUL HIEUH A + # <circle> 1112 1161 +@ Circled Korean words +327C CIRCLED KOREAN CHARACTER CHAMKO + # <circle> 110E 1161 11B7 1100 1169 +327D CIRCLED KOREAN CHARACTER JUEUI + # <circle> 110C 116E 110B 1174 +@ Circled Hangul syllable +327E CIRCLED HANGUL IEUNG U + * postal code mark + # <circle> 110B 116E +@ Symbol +327F KOREAN STANDARD SYMBOL +@ Circled ideographs +3280 CIRCLED IDEOGRAPH ONE + = maru-iti, symbol of unification + # <circle> 4E00 +3281 CIRCLED IDEOGRAPH TWO + # <circle> 4E8C +3282 CIRCLED IDEOGRAPH THREE + # <circle> 4E09 +3283 CIRCLED IDEOGRAPH FOUR + # <circle> 56DB +3284 CIRCLED IDEOGRAPH FIVE + # <circle> 4E94 +3285 CIRCLED IDEOGRAPH SIX + # <circle> 516D +3286 CIRCLED IDEOGRAPH SEVEN + # <circle> 4E03 +3287 CIRCLED IDEOGRAPH EIGHT + # <circle> 516B +3288 CIRCLED IDEOGRAPH NINE + # <circle> 4E5D +3289 CIRCLED IDEOGRAPH TEN + # <circle> 5341 +328A CIRCLED IDEOGRAPH MOON + * Monday + # <circle> 6708 +328B CIRCLED IDEOGRAPH FIRE + * Tuesday + # <circle> 706B +328C CIRCLED IDEOGRAPH WATER + * Wednesday + # <circle> 6C34 +328D CIRCLED IDEOGRAPH WOOD + * Thursday + # <circle> 6728 +328E CIRCLED IDEOGRAPH METAL + * Friday + # <circle> 91D1 +328F CIRCLED IDEOGRAPH EARTH + * Saturday + # <circle> 571F +3290 CIRCLED IDEOGRAPH SUN + * Sunday + # <circle> 65E5 +3291 CIRCLED IDEOGRAPH STOCK + * incorporated + # <circle> 682A +3292 CIRCLED IDEOGRAPH HAVE + * limited + # <circle> 6709 +3293 CIRCLED IDEOGRAPH SOCIETY + * company + # <circle> 793E +3294 CIRCLED IDEOGRAPH NAME + # <circle> 540D +3295 CIRCLED IDEOGRAPH SPECIAL + # <circle> 7279 +3296 CIRCLED IDEOGRAPH FINANCIAL + # <circle> 8CA1 +3297 CIRCLED IDEOGRAPH CONGRATULATION + # <circle> 795D +3298 CIRCLED IDEOGRAPH LABOR + # <circle> 52B4 +3299 CIRCLED IDEOGRAPH SECRET + # <circle> 79D8 +329A CIRCLED IDEOGRAPH MALE + # <circle> 7537 +329B CIRCLED IDEOGRAPH FEMALE + # <circle> 5973 +329C CIRCLED IDEOGRAPH SUITABLE + # <circle> 9069 +329D CIRCLED IDEOGRAPH EXCELLENT + # <circle> 512A +329E CIRCLED IDEOGRAPH PRINT + * name seal + # <circle> 5370 +329F CIRCLED IDEOGRAPH ATTENTION + # <circle> 6CE8 +32A0 CIRCLED IDEOGRAPH ITEM + # <circle> 9805 +32A1 CIRCLED IDEOGRAPH REST + * holiday + # <circle> 4F11 +32A2 CIRCLED IDEOGRAPH COPY + # <circle> 5199 +32A3 CIRCLED IDEOGRAPH CORRECT + # <circle> 6B63 +32A4 CIRCLED IDEOGRAPH HIGH + # <circle> 4E0A +32A5 CIRCLED IDEOGRAPH CENTRE + # <circle> 4E2D +32A6 CIRCLED IDEOGRAPH LOW + # <circle> 4E0B +32A7 CIRCLED IDEOGRAPH LEFT + # <circle> 5DE6 +32A8 CIRCLED IDEOGRAPH RIGHT + # <circle> 53F3 +32A9 CIRCLED IDEOGRAPH MEDICINE + # <circle> 533B +32AA CIRCLED IDEOGRAPH RELIGION + # <circle> 5B97 +32AB CIRCLED IDEOGRAPH STUDY + # <circle> 5B66 +32AC CIRCLED IDEOGRAPH SUPERVISE + # <circle> 76E3 +32AD CIRCLED IDEOGRAPH ENTERPRISE + # <circle> 4F01 +32AE CIRCLED IDEOGRAPH RESOURCE + # <circle> 8CC7 +32AF CIRCLED IDEOGRAPH ALLIANCE + # <circle> 5354 +32B0 CIRCLED IDEOGRAPH NIGHT + # <circle> 591C +@ Circled numbers +32B1 CIRCLED NUMBER THIRTY SIX + # <circle> 0033 0036 +32B2 CIRCLED NUMBER THIRTY SEVEN + # <circle> 0033 0037 +32B3 CIRCLED NUMBER THIRTY EIGHT + # <circle> 0033 0038 +32B4 CIRCLED NUMBER THIRTY NINE + # <circle> 0033 0039 +32B5 CIRCLED NUMBER FORTY + # <circle> 0034 0030 +32B6 CIRCLED NUMBER FORTY ONE + # <circle> 0034 0031 +32B7 CIRCLED NUMBER FORTY TWO + # <circle> 0034 0032 +32B8 CIRCLED NUMBER FORTY THREE + # <circle> 0034 0033 +32B9 CIRCLED NUMBER FORTY FOUR + # <circle> 0034 0034 +32BA CIRCLED NUMBER FORTY FIVE + # <circle> 0034 0035 +32BB CIRCLED NUMBER FORTY SIX + # <circle> 0034 0036 +32BC CIRCLED NUMBER FORTY SEVEN + # <circle> 0034 0037 +32BD CIRCLED NUMBER FORTY EIGHT + # <circle> 0034 0038 +32BE CIRCLED NUMBER FORTY NINE + # <circle> 0034 0039 +32BF CIRCLED NUMBER FIFTY + # <circle> 0035 0030 +@ Telegraph symbols for months +32C0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY + # 0031 6708 +32C1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY + # 0032 6708 +32C2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH + # 0033 6708 +32C3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL + # 0034 6708 +32C4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY + # 0035 6708 +32C5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE + # 0036 6708 +32C6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY + # 0037 6708 +32C7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST + # 0038 6708 +32C8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER + # 0039 6708 +32C9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER + # 0031 0030 6708 +32CA IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER + # 0031 0031 6708 +32CB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER + # 0031 0032 6708 +@ Squared Latin abbreviations +32CC SQUARE HG + # <square> 0048 0067 +32CD SQUARE ERG + # <square> 0065 0072 0067 +32CE SQUARE EV + # <square> 0065 0056 +32CF LIMITED LIABILITY SIGN + # <square> 004C 0054 0044 +@ Circled Katakana +32D0 CIRCLED KATAKANA A + # <circle> 30A2 +32D1 CIRCLED KATAKANA I + # <circle> 30A4 +32D2 CIRCLED KATAKANA U + # <circle> 30A6 +32D3 CIRCLED KATAKANA E + # <circle> 30A8 +32D4 CIRCLED KATAKANA O + # <circle> 30AA +32D5 CIRCLED KATAKANA KA + # <circle> 30AB +32D6 CIRCLED KATAKANA KI + # <circle> 30AD +32D7 CIRCLED KATAKANA KU + # <circle> 30AF +32D8 CIRCLED KATAKANA KE + # <circle> 30B1 +32D9 CIRCLED KATAKANA KO + # <circle> 30B3 +32DA CIRCLED KATAKANA SA + # <circle> 30B5 +32DB CIRCLED KATAKANA SI + # <circle> 30B7 +32DC CIRCLED KATAKANA SU + # <circle> 30B9 +32DD CIRCLED KATAKANA SE + # <circle> 30BB +32DE CIRCLED KATAKANA SO + # <circle> 30BD +32DF CIRCLED KATAKANA TA + # <circle> 30BF +32E0 CIRCLED KATAKANA TI + # <circle> 30C1 +32E1 CIRCLED KATAKANA TU + # <circle> 30C4 +32E2 CIRCLED KATAKANA TE + # <circle> 30C6 +32E3 CIRCLED KATAKANA TO + # <circle> 30C8 +32E4 CIRCLED KATAKANA NA + # <circle> 30CA +32E5 CIRCLED KATAKANA NI + # <circle> 30CB +32E6 CIRCLED KATAKANA NU + # <circle> 30CC +32E7 CIRCLED KATAKANA NE + # <circle> 30CD +32E8 CIRCLED KATAKANA NO + # <circle> 30CE +32E9 CIRCLED KATAKANA HA + # <circle> 30CF +32EA CIRCLED KATAKANA HI + # <circle> 30D2 +32EB CIRCLED KATAKANA HU + # <circle> 30D5 +32EC CIRCLED KATAKANA HE + # <circle> 30D8 +32ED CIRCLED KATAKANA HO + # <circle> 30DB +32EE CIRCLED KATAKANA MA + # <circle> 30DE +32EF CIRCLED KATAKANA MI + # <circle> 30DF +32F0 CIRCLED KATAKANA MU + # <circle> 30E0 +32F1 CIRCLED KATAKANA ME + # <circle> 30E1 +32F2 CIRCLED KATAKANA MO + # <circle> 30E2 +32F3 CIRCLED KATAKANA YA + # <circle> 30E4 +32F4 CIRCLED KATAKANA YU + # <circle> 30E6 +32F5 CIRCLED KATAKANA YO + # <circle> 30E8 +32F6 CIRCLED KATAKANA RA + # <circle> 30E9 +32F7 CIRCLED KATAKANA RI + # <circle> 30EA +32F8 CIRCLED KATAKANA RU + # <circle> 30EB +32F9 CIRCLED KATAKANA RE + # <circle> 30EC +32FA CIRCLED KATAKANA RO + # <circle> 30ED +32FB CIRCLED KATAKANA WA + # <circle> 30EF +32FC CIRCLED KATAKANA WI + # <circle> 30F0 +32FD CIRCLED KATAKANA WE + # <circle> 30F1 +32FE CIRCLED KATAKANA WO + # <circle> 30F2 +@@ 3300 CJK Compatibility 33FF +@ Squared Katakana words +3300 SQUARE APAATO + * apartment + # <square> 30A2 30D1 30FC 30C8 +3301 SQUARE ARUHUA + * alpha + # <square> 30A2 30EB 30D5 30A1 +3302 SQUARE ANPEA + * ampere + # <square> 30A2 30F3 30DA 30A2 +3303 SQUARE AARU + * are (unit of area) + # <square> 30A2 30FC 30EB +3304 SQUARE ININGU + * inning + # <square> 30A4 30CB 30F3 30B0 +3305 SQUARE INTI + * inch + # <square> 30A4 30F3 30C1 +3306 SQUARE UON + * won (Korean currency) + # <square> 30A6 30A9 30F3 +3307 SQUARE ESUKUUDO + * escudo (Portuguese currency) + # <square> 30A8 30B9 30AF 30FC 30C9 +3308 SQUARE EEKAA + * acre + # <square> 30A8 30FC 30AB 30FC +3309 SQUARE ONSU + * ounce + # <square> 30AA 30F3 30B9 +330A SQUARE OOMU + * ohm + # <square> 30AA 30FC 30E0 +330B SQUARE KAIRI + * kai-ri: nautical mile + # <square> 30AB 30A4 30EA +330C SQUARE KARATTO + * carat + # <square> 30AB 30E9 30C3 30C8 +330D SQUARE KARORII + * calorie + # <square> 30AB 30ED 30EA 30FC +330E SQUARE GARON + * gallon + # <square> 30AC 30ED 30F3 +330F SQUARE GANMA + * gamma + # <square> 30AC 30F3 30DE +3310 SQUARE GIGA + * giga- + # <square> 30AE 30AC +3311 SQUARE GINII + * guinea + # <square> 30AE 30CB 30FC +3312 SQUARE KYURII + * curie + # <square> 30AD 30E5 30EA 30FC +3313 SQUARE GIRUDAA + * guilder + # <square> 30AE 30EB 30C0 30FC +3314 SQUARE KIRO + * kilo- + # <square> 30AD 30ED +3315 SQUARE KIROGURAMU + * kilogram + # <square> 30AD 30ED 30B0 30E9 30E0 +3316 SQUARE KIROMEETORU + * kilometer + # <square> 30AD 30ED 30E1 30FC 30C8 30EB +3317 SQUARE KIROWATTO + * kilowatt + # <square> 30AD 30ED 30EF 30C3 30C8 +3318 SQUARE GURAMU + * gram + # <square> 30B0 30E9 30E0 +3319 SQUARE GURAMUTON + * gram ton + # <square> 30B0 30E9 30E0 30C8 30F3 +331A SQUARE KURUZEIRO + * cruzeiro (Brazilian currency) + # <square> 30AF 30EB 30BC 30A4 30ED +331B SQUARE KUROONE + * krone + # <square> 30AF 30ED 30FC 30CD +331C SQUARE KEESU + * case + # <square> 30B1 30FC 30B9 +331D SQUARE KORUNA + * koruna (Czech currency) + # <square> 30B3 30EB 30CA +331E SQUARE KOOPO + * co-op + # <square> 30B3 30FC 30DD +331F SQUARE SAIKURU + * cycle + # <square> 30B5 30A4 30AF 30EB +3320 SQUARE SANTIIMU + * centime + # <square> 30B5 30F3 30C1 30FC 30E0 +3321 SQUARE SIRINGU + * shilling + # <square> 30B7 30EA 30F3 30B0 +3322 SQUARE SENTI + * centi- + # <square> 30BB 30F3 30C1 +3323 SQUARE SENTO + * cent + # <square> 30BB 30F3 30C8 +3324 SQUARE DAASU + * dozen + # <square> 30C0 30FC 30B9 +3325 SQUARE DESI + * deci- + # <square> 30C7 30B7 +3326 SQUARE DORU + * dollar + # <square> 30C9 30EB +3327 SQUARE TON + * ton + # <square> 30C8 30F3 +3328 SQUARE NANO + * nano- + # <square> 30CA 30CE +3329 SQUARE NOTTO + * knot, nautical mile + # <square> 30CE 30C3 30C8 +332A SQUARE HAITU + * heights + # <square> 30CF 30A4 30C4 +332B SQUARE PAASENTO + * percent + # <square> 30D1 30FC 30BB 30F3 30C8 +332C SQUARE PAATU + * parts + # <square> 30D1 30FC 30C4 +332D SQUARE BAARERU + * barrel + # <square> 30D0 30FC 30EC 30EB +332E SQUARE PIASUTORU + * piaster + # <square> 30D4 30A2 30B9 30C8 30EB +332F SQUARE PIKURU + * picul (unit of weight) + # <square> 30D4 30AF 30EB +3330 SQUARE PIKO + * pico- + # <square> 30D4 30B3 +3331 SQUARE BIRU + * building + # <square> 30D3 30EB +3332 SQUARE HUARADDO + * farad + # <square> 30D5 30A1 30E9 30C3 30C9 +3333 SQUARE HUIITO + * feet + # <square> 30D5 30A3 30FC 30C8 +3334 SQUARE BUSSYERU + * bushel + # <square> 30D6 30C3 30B7 30A7 30EB +3335 SQUARE HURAN + * franc + # <square> 30D5 30E9 30F3 +3336 SQUARE HEKUTAARU + * hectare + # <square> 30D8 30AF 30BF 30FC 30EB +3337 SQUARE PESO + * peso + # <square> 30DA 30BD +3338 SQUARE PENIHI + * pfennig + # <square> 30DA 30CB 30D2 +3339 SQUARE HERUTU + * hertz + # <square> 30D8 30EB 30C4 +333A SQUARE PENSU + * pence + # <square> 30DA 30F3 30B9 +333B SQUARE PEEZI + * page + # <square> 30DA 30FC 30B8 +333C SQUARE BEETA + * beta + # <square> 30D9 30FC 30BF +333D SQUARE POINTO + * point + # <square> 30DD 30A4 30F3 30C8 +333E SQUARE BORUTO + * volt, bolt + # <square> 30DC 30EB 30C8 +333F SQUARE HON + * hon: volume + # <square> 30DB 30F3 +3340 SQUARE PONDO + * pound + # <square> 30DD 30F3 30C9 +3341 SQUARE HOORU + * hall + # <square> 30DB 30FC 30EB +3342 SQUARE HOON + * horn + # <square> 30DB 30FC 30F3 +3343 SQUARE MAIKURO + * micro- + # <square> 30DE 30A4 30AF 30ED +3344 SQUARE MAIRU + * mile + # <square> 30DE 30A4 30EB +3345 SQUARE MAHHA + * mach + # <square> 30DE 30C3 30CF +3346 SQUARE MARUKU + * mark + # <square> 30DE 30EB 30AF +3347 SQUARE MANSYON + * mansion (i.e. better quality apartment) + # <square> 30DE 30F3 30B7 30E7 30F3 +3348 SQUARE MIKURON + * micron + # <square> 30DF 30AF 30ED 30F3 +3349 SQUARE MIRI + * milli- + # <square> 30DF 30EA +334A SQUARE MIRIBAARU + * millibar + # <square> 30DF 30EA 30D0 30FC 30EB +334B SQUARE MEGA + * mega- + # <square> 30E1 30AC +334C SQUARE MEGATON + * megaton + # <square> 30E1 30AC 30C8 30F3 +334D SQUARE MEETORU + * meter + # <square> 30E1 30FC 30C8 30EB +334E SQUARE YAADO + * yard + # <square> 30E4 30FC 30C9 +334F SQUARE YAARU + * yard + # <square> 30E4 30FC 30EB +3350 SQUARE YUAN + * yuan (Chinese currency) + # <square> 30E6 30A2 30F3 +3351 SQUARE RITTORU + * liter + # <square> 30EA 30C3 30C8 30EB +3352 SQUARE RIRA + * lira + # <square> 30EA 30E9 +3353 SQUARE RUPII + * rupee + # <square> 30EB 30D4 30FC +3354 SQUARE RUUBURU + * ruble + # <square> 30EB 30FC 30D6 30EB +3355 SQUARE REMU + * rem (unit of radiation) + # <square> 30EC 30E0 +3356 SQUARE RENTOGEN + * roentgen + # <square> 30EC 30F3 30C8 30B2 30F3 +3357 SQUARE WATTO + * watt + # <square> 30EF 30C3 30C8 +@ Telegraph symbols for hours +3358 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO + # 0030 70B9 +3359 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE + # 0031 70B9 +335A IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO + # 0032 70B9 +335B IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE + # 0033 70B9 +335C IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR + # 0034 70B9 +335D IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE + # 0035 70B9 +335E IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX + # 0036 70B9 +335F IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN + # 0037 70B9 +3360 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT + # 0038 70B9 +3361 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE + # 0039 70B9 +3362 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN + # 0031 0030 70B9 +3363 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN + # 0031 0031 70B9 +3364 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE + # 0031 0032 70B9 +3365 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN + # 0031 0033 70B9 +3366 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN + # 0031 0034 70B9 +3367 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN + # 0031 0035 70B9 +3368 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN + # 0031 0036 70B9 +3369 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN + # 0031 0037 70B9 +336A IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN + # 0031 0038 70B9 +336B IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN + # 0031 0039 70B9 +336C IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY + # 0032 0030 70B9 +336D IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE + # 0032 0031 70B9 +336E IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO + # 0032 0032 70B9 +336F IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE + # 0032 0033 70B9 +3370 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR + # 0032 0034 70B9 +@ Squared Latin abbreviations +3371 SQUARE HPA + # <square> 0068 0050 0061 +3372 SQUARE DA + # <square> 0064 0061 +3373 SQUARE AU + # <square> 0041 0055 +3374 SQUARE BAR + # <square> 0062 0061 0072 +3375 SQUARE OV + # <square> 006F 0056 +3376 SQUARE PC + # <square> 0070 0063 +3377 SQUARE DM + # <square> 0064 006D +3378 SQUARE DM SQUARED + # <square> 0064 006D 00B2 +3379 SQUARE DM CUBED + # <square> 0064 006D 00B3 +337A SQUARE IU + # <square> 0049 0055 +@ Japanese era names +337B SQUARE ERA NAME HEISEI + # <square> 5E73 6210 +337C SQUARE ERA NAME SYOUWA + # <square> 662D 548C +337D SQUARE ERA NAME TAISYOU + # <square> 5927 6B63 +337E SQUARE ERA NAME MEIZI + # <square> 660E 6CBB +@ Japanese corporation +337F SQUARE CORPORATION + = kabusiki-gaisya + * incorporated + # <square> 682A 5F0F 4F1A 793E +@ Squared Latin abbreviations +3380 SQUARE PA AMPS + # <square> 0070 0041 +3381 SQUARE NA + # <square> 006E 0041 +3382 SQUARE MU A + # <square> 03BC 0041 +3383 SQUARE MA + # <square> 006D 0041 +3384 SQUARE KA + # <square> 006B 0041 +3385 SQUARE KB + # <square> 004B 0042 +3386 SQUARE MB + # <square> 004D 0042 +3387 SQUARE GB + # <square> 0047 0042 +3388 SQUARE CAL + # <square> 0063 0061 006C +3389 SQUARE KCAL + # <square> 006B 0063 0061 006C +338A SQUARE PF + # <square> 0070 0046 +338B SQUARE NF + # <square> 006E 0046 +338C SQUARE MU F + # <square> 03BC 0046 +338D SQUARE MU G + # <square> 03BC 0067 +338E SQUARE MG + # <square> 006D 0067 +338F SQUARE KG + # <square> 006B 0067 +3390 SQUARE HZ + # <square> 0048 007A +3391 SQUARE KHZ + # <square> 006B 0048 007A +3392 SQUARE MHZ + # <square> 004D 0048 007A +3393 SQUARE GHZ + # <square> 0047 0048 007A +3394 SQUARE THZ + # <square> 0054 0048 007A +3395 SQUARE MU L + # <square> 03BC 2113 +3396 SQUARE ML + # <square> 006D 2113 +3397 SQUARE DL + # <square> 0064 2113 +3398 SQUARE KL + # <square> 006B 2113 +3399 SQUARE FM + # <square> 0066 006D +339A SQUARE NM + # <square> 006E 006D +339B SQUARE MU M + # <square> 03BC 006D +339C SQUARE MM + # <square> 006D 006D +339D SQUARE CM + # <square> 0063 006D +339E SQUARE KM + # <square> 006B 006D +339F SQUARE MM SQUARED + # <square> 006D 006D 00B2 +33A0 SQUARE CM SQUARED + # <square> 0063 006D 00B2 +33A1 SQUARE M SQUARED + # <square> 006D 00B2 +33A2 SQUARE KM SQUARED + # <square> 006B 006D 00B2 +33A3 SQUARE MM CUBED + # <square> 006D 006D 00B3 +33A4 SQUARE CM CUBED + # <square> 0063 006D 00B3 +33A5 SQUARE M CUBED + # <square> 006D 00B3 +33A6 SQUARE KM CUBED + # <square> 006B 006D 00B3 +33A7 SQUARE M OVER S + # <square> 006D 2215 0073 +33A8 SQUARE M OVER S SQUARED + # <square> 006D 2215 0073 00B2 +33A9 SQUARE PA + # <square> 0050 0061 +33AA SQUARE KPA + # <square> 006B 0050 0061 +33AB SQUARE MPA + # <square> 004D 0050 0061 +33AC SQUARE GPA + # <square> 0047 0050 0061 +33AD SQUARE RAD + # <square> 0072 0061 0064 +33AE SQUARE RAD OVER S + # <square> 0072 0061 0064 2215 0073 +33AF SQUARE RAD OVER S SQUARED + # <square> 0072 0061 0064 2215 0073 00B2 +33B0 SQUARE PS + # <square> 0070 0073 +33B1 SQUARE NS + # <square> 006E 0073 +33B2 SQUARE MU S + # <square> 03BC 0073 +33B3 SQUARE MS + # <square> 006D 0073 +33B4 SQUARE PV + # <square> 0070 0056 +33B5 SQUARE NV + # <square> 006E 0056 +33B6 SQUARE MU V + # <square> 03BC 0056 +33B7 SQUARE MV + # <square> 006D 0056 +33B8 SQUARE KV + # <square> 006B 0056 +33B9 SQUARE MV MEGA + # <square> 004D 0056 +33BA SQUARE PW + # <square> 0070 0057 +33BB SQUARE NW + # <square> 006E 0057 +33BC SQUARE MU W + # <square> 03BC 0057 +33BD SQUARE MW + # <square> 006D 0057 +33BE SQUARE KW + # <square> 006B 0057 +33BF SQUARE MW MEGA + # <square> 004D 0057 +33C0 SQUARE K OHM + # <square> 006B 03A9 +33C1 SQUARE M OHM + # <square> 004D 03A9 +33C2 SQUARE AM + # <square> 0061 002E 006D 002E +33C3 SQUARE BQ + # <square> 0042 0071 +33C4 SQUARE CC + # <square> 0063 0063 +33C5 SQUARE CD + # <square> 0063 0064 +33C6 SQUARE C OVER KG + # <square> 0043 2215 006B 0067 +33C7 SQUARE CO + # <square> 0043 006F 002E +33C8 SQUARE DB + # <square> 0064 0042 +33C9 SQUARE GY + # <square> 0047 0079 +33CA SQUARE HA + # <square> 0068 0061 +33CB SQUARE HP + # <square> 0048 0050 +33CC SQUARE IN + # <square> 0069 006E +33CD SQUARE KK + # <square> 004B 004B +33CE SQUARE KM CAPITAL + # <square> 004B 004D +33CF SQUARE KT + # <square> 006B 0074 +33D0 SQUARE LM + # <square> 006C 006D +33D1 SQUARE LN + # <square> 006C 006E +33D2 SQUARE LOG + # <square> 006C 006F 0067 +33D3 SQUARE LX + # <square> 006C 0078 +33D4 SQUARE MB SMALL + # <square> 006D 0062 +33D5 SQUARE MIL + # <square> 006D 0069 006C +33D6 SQUARE MOL + # <square> 006D 006F 006C +33D7 SQUARE PH + # <square> 0050 0048 +33D8 SQUARE PM + # <square> 0070 002E 006D 002E +33D9 SQUARE PPM + # <square> 0050 0050 004D +33DA SQUARE PR + # <square> 0050 0052 +33DB SQUARE SR + # <square> 0073 0072 +33DC SQUARE SV + # <square> 0053 0076 +33DD SQUARE WB + # <square> 0057 0062 +33DE SQUARE V OVER M + # <square> 0056 2215 006D +33DF SQUARE A OVER M + # <square> 0041 2215 006D +@ Telegraph symbols for days +33E0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE + # 0031 65E5 +33E1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO + # 0032 65E5 +33E2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE + # 0033 65E5 +33E3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR + # 0034 65E5 +33E4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE + # 0035 65E5 +33E5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX + # 0036 65E5 +33E6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN + # 0037 65E5 +33E7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT + # 0038 65E5 +33E8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE + # 0039 65E5 +33E9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN + # 0031 0030 65E5 +33EA IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN + # 0031 0031 65E5 +33EB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE + # 0031 0032 65E5 +33EC IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN + # 0031 0033 65E5 +33ED IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN + # 0031 0034 65E5 +33EE IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN + # 0031 0035 65E5 +33EF IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN + # 0031 0036 65E5 +33F0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN + # 0031 0037 65E5 +33F1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN + # 0031 0038 65E5 +33F2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN + # 0031 0039 65E5 +33F3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY + # 0032 0030 65E5 +33F4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE + # 0032 0031 65E5 +33F5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO + # 0032 0032 65E5 +33F6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE + # 0032 0033 65E5 +33F7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR + # 0032 0034 65E5 +33F8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE + # 0032 0035 65E5 +33F9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX + # 0032 0036 65E5 +33FA IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN + # 0032 0037 65E5 +33FB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT + # 0032 0038 65E5 +33FC IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE + # 0032 0039 65E5 +33FD IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY + # 0033 0030 65E5 +33FE IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE + # 0033 0031 65E5 +@ Squared Latin abbreviation +33FF SQUARE GAL + # <square> 0067 0061 006C +@@ 3400 CJK Unified Ideographs Extension A 4DB5 +@@ 4DC0 Yijing Hexagram Symbols 4DFF +@ Yijing hexagram symbols +4DC0 HEXAGRAM FOR THE CREATIVE HEAVEN +4DC1 HEXAGRAM FOR THE RECEPTIVE EARTH +4DC2 HEXAGRAM FOR DIFFICULTY AT THE BEGINNING +4DC3 HEXAGRAM FOR YOUTHFUL FOLLY +4DC4 HEXAGRAM FOR WAITING +4DC5 HEXAGRAM FOR CONFLICT +4DC6 HEXAGRAM FOR THE ARMY +4DC7 HEXAGRAM FOR HOLDING TOGETHER +4DC8 HEXAGRAM FOR SMALL TAMING +4DC9 HEXAGRAM FOR TREADING +4DCA HEXAGRAM FOR PEACE +4DCB HEXAGRAM FOR STANDSTILL +4DCC HEXAGRAM FOR FELLOWSHIP +4DCD HEXAGRAM FOR GREAT POSSESSION +4DCE HEXAGRAM FOR MODESTY +4DCF HEXAGRAM FOR ENTHUSIASM +4DD0 HEXAGRAM FOR FOLLOWING +4DD1 HEXAGRAM FOR WORK ON THE DECAYED +4DD2 HEXAGRAM FOR APPROACH +4DD3 HEXAGRAM FOR CONTEMPLATION +4DD4 HEXAGRAM FOR BITING THROUGH +4DD5 HEXAGRAM FOR GRACE +4DD6 HEXAGRAM FOR SPLITTING APART +4DD7 HEXAGRAM FOR RETURN +4DD8 HEXAGRAM FOR INNOCENCE +4DD9 HEXAGRAM FOR GREAT TAMING +4DDA HEXAGRAM FOR MOUTH CORNERS +4DDB HEXAGRAM FOR GREAT PREPONDERANCE +4DDC HEXAGRAM FOR THE ABYSMAL WATER +4DDD HEXAGRAM FOR THE CLINGING FIRE +4DDE HEXAGRAM FOR INFLUENCE +4DDF HEXAGRAM FOR DURATION +4DE0 HEXAGRAM FOR RETREAT +4DE1 HEXAGRAM FOR GREAT POWER +4DE2 HEXAGRAM FOR PROGRESS +4DE3 HEXAGRAM FOR DARKENING OF THE LIGHT +4DE4 HEXAGRAM FOR THE FAMILY +4DE5 HEXAGRAM FOR OPPOSITION +4DE6 HEXAGRAM FOR OBSTRUCTION +4DE7 HEXAGRAM FOR DELIVERANCE +4DE8 HEXAGRAM FOR DECREASE +4DE9 HEXAGRAM FOR INCREASE +4DEA HEXAGRAM FOR BREAKTHROUGH +4DEB HEXAGRAM FOR COMING TO MEET +4DEC HEXAGRAM FOR GATHERING TOGETHER +4DED HEXAGRAM FOR PUSHING UPWARD +4DEE HEXAGRAM FOR OPPRESSION +4DEF HEXAGRAM FOR THE WELL +4DF0 HEXAGRAM FOR REVOLUTION +4DF1 HEXAGRAM FOR THE CAULDRON +4DF2 HEXAGRAM FOR THE AROUSING THUNDER +4DF3 HEXAGRAM FOR THE KEEPING STILL MOUNTAIN +4DF4 HEXAGRAM FOR DEVELOPMENT +4DF5 HEXAGRAM FOR THE MARRYING MAIDEN +4DF6 HEXAGRAM FOR ABUNDANCE +4DF7 HEXAGRAM FOR THE WANDERER +4DF8 HEXAGRAM FOR THE GENTLE WIND +4DF9 HEXAGRAM FOR THE JOYOUS LAKE +4DFA HEXAGRAM FOR DISPERSION +4DFB HEXAGRAM FOR LIMITATION +4DFC HEXAGRAM FOR INNER TRUTH +4DFD HEXAGRAM FOR SMALL PREPONDERANCE +4DFE HEXAGRAM FOR AFTER COMPLETION +4DFF HEXAGRAM FOR BEFORE COMPLETION +@@ 4E00 CJK Unified Ideographs 9FBB +@@ A000 Yi Syllables A48F +@ Syllables +A000 YI SYLLABLE IT +A001 YI SYLLABLE IX +A002 YI SYLLABLE I +A003 YI SYLLABLE IP +A004 YI SYLLABLE IET +A005 YI SYLLABLE IEX +A006 YI SYLLABLE IE +A007 YI SYLLABLE IEP +A008 YI SYLLABLE AT +A009 YI SYLLABLE AX +A00A YI SYLLABLE A +A00B YI SYLLABLE AP +A00C YI SYLLABLE UOX +A00D YI SYLLABLE UO +A00E YI SYLLABLE UOP +A00F YI SYLLABLE OT +A010 YI SYLLABLE OX +A011 YI SYLLABLE O +A012 YI SYLLABLE OP +A013 YI SYLLABLE EX +A014 YI SYLLABLE E +A015 YI SYLLABLE WU +A016 YI SYLLABLE BIT +A017 YI SYLLABLE BIX +A018 YI SYLLABLE BI +A019 YI SYLLABLE BIP +A01A YI SYLLABLE BIET +A01B YI SYLLABLE BIEX +A01C YI SYLLABLE BIE +A01D YI SYLLABLE BIEP +A01E YI SYLLABLE BAT +A01F YI SYLLABLE BAX +A020 YI SYLLABLE BA +A021 YI SYLLABLE BAP +A022 YI SYLLABLE BUOX +A023 YI SYLLABLE BUO +A024 YI SYLLABLE BUOP +A025 YI SYLLABLE BOT +A026 YI SYLLABLE BOX +A027 YI SYLLABLE BO +A028 YI SYLLABLE BOP +A029 YI SYLLABLE BEX +A02A YI SYLLABLE BE +A02B YI SYLLABLE BEP +A02C YI SYLLABLE BUT +A02D YI SYLLABLE BUX +A02E YI SYLLABLE BU +A02F YI SYLLABLE BUP +A030 YI SYLLABLE BURX +A031 YI SYLLABLE BUR +A032 YI SYLLABLE BYT +A033 YI SYLLABLE BYX +A034 YI SYLLABLE BY +A035 YI SYLLABLE BYP +A036 YI SYLLABLE BYRX +A037 YI SYLLABLE BYR +A038 YI SYLLABLE PIT +A039 YI SYLLABLE PIX +A03A YI SYLLABLE PI +A03B YI SYLLABLE PIP +A03C YI SYLLABLE PIEX +A03D YI SYLLABLE PIE +A03E YI SYLLABLE PIEP +A03F YI SYLLABLE PAT +A040 YI SYLLABLE PAX +A041 YI SYLLABLE PA +A042 YI SYLLABLE PAP +A043 YI SYLLABLE PUOX +A044 YI SYLLABLE PUO +A045 YI SYLLABLE PUOP +A046 YI SYLLABLE POT +A047 YI SYLLABLE POX +A048 YI SYLLABLE PO +A049 YI SYLLABLE POP +A04A YI SYLLABLE PUT +A04B YI SYLLABLE PUX +A04C YI SYLLABLE PU +A04D YI SYLLABLE PUP +A04E YI SYLLABLE PURX +A04F YI SYLLABLE PUR +A050 YI SYLLABLE PYT +A051 YI SYLLABLE PYX +A052 YI SYLLABLE PY +A053 YI SYLLABLE PYP +A054 YI SYLLABLE PYRX +A055 YI SYLLABLE PYR +A056 YI SYLLABLE BBIT +A057 YI SYLLABLE BBIX +A058 YI SYLLABLE BBI +A059 YI SYLLABLE BBIP +A05A YI SYLLABLE BBIET +A05B YI SYLLABLE BBIEX +A05C YI SYLLABLE BBIE +A05D YI SYLLABLE BBIEP +A05E YI SYLLABLE BBAT +A05F YI SYLLABLE BBAX +A060 YI SYLLABLE BBA +A061 YI SYLLABLE BBAP +A062 YI SYLLABLE BBUOX +A063 YI SYLLABLE BBUO +A064 YI SYLLABLE BBUOP +A065 YI SYLLABLE BBOT +A066 YI SYLLABLE BBOX +A067 YI SYLLABLE BBO +A068 YI SYLLABLE BBOP +A069 YI SYLLABLE BBEX +A06A YI SYLLABLE BBE +A06B YI SYLLABLE BBEP +A06C YI SYLLABLE BBUT +A06D YI SYLLABLE BBUX +A06E YI SYLLABLE BBU +A06F YI SYLLABLE BBUP +A070 YI SYLLABLE BBURX +A071 YI SYLLABLE BBUR +A072 YI SYLLABLE BBYT +A073 YI SYLLABLE BBYX +A074 YI SYLLABLE BBY +A075 YI SYLLABLE BBYP +A076 YI SYLLABLE NBIT +A077 YI SYLLABLE NBIX +A078 YI SYLLABLE NBI +A079 YI SYLLABLE NBIP +A07A YI SYLLABLE NBIEX +A07B YI SYLLABLE NBIE +A07C YI SYLLABLE NBIEP +A07D YI SYLLABLE NBAT +A07E YI SYLLABLE NBAX +A07F YI SYLLABLE NBA +A080 YI SYLLABLE NBAP +A081 YI SYLLABLE NBOT +A082 YI SYLLABLE NBOX +A083 YI SYLLABLE NBO +A084 YI SYLLABLE NBOP +A085 YI SYLLABLE NBUT +A086 YI SYLLABLE NBUX +A087 YI SYLLABLE NBU +A088 YI SYLLABLE NBUP +A089 YI SYLLABLE NBURX +A08A YI SYLLABLE NBUR +A08B YI SYLLABLE NBYT +A08C YI SYLLABLE NBYX +A08D YI SYLLABLE NBY +A08E YI SYLLABLE NBYP +A08F YI SYLLABLE NBYRX +A090 YI SYLLABLE NBYR +A091 YI SYLLABLE HMIT +A092 YI SYLLABLE HMIX +A093 YI SYLLABLE HMI +A094 YI SYLLABLE HMIP +A095 YI SYLLABLE HMIEX +A096 YI SYLLABLE HMIE +A097 YI SYLLABLE HMIEP +A098 YI SYLLABLE HMAT +A099 YI SYLLABLE HMAX +A09A YI SYLLABLE HMA +A09B YI SYLLABLE HMAP +A09C YI SYLLABLE HMUOX +A09D YI SYLLABLE HMUO +A09E YI SYLLABLE HMUOP +A09F YI SYLLABLE HMOT +A0A0 YI SYLLABLE HMOX +A0A1 YI SYLLABLE HMO +A0A2 YI SYLLABLE HMOP +A0A3 YI SYLLABLE HMUT +A0A4 YI SYLLABLE HMUX +A0A5 YI SYLLABLE HMU +A0A6 YI SYLLABLE HMUP +A0A7 YI SYLLABLE HMURX +A0A8 YI SYLLABLE HMUR +A0A9 YI SYLLABLE HMYX +A0AA YI SYLLABLE HMY +A0AB YI SYLLABLE HMYP +A0AC YI SYLLABLE HMYRX +A0AD YI SYLLABLE HMYR +A0AE YI SYLLABLE MIT +A0AF YI SYLLABLE MIX +A0B0 YI SYLLABLE MI +A0B1 YI SYLLABLE MIP +A0B2 YI SYLLABLE MIEX +A0B3 YI SYLLABLE MIE +A0B4 YI SYLLABLE MIEP +A0B5 YI SYLLABLE MAT +A0B6 YI SYLLABLE MAX +A0B7 YI SYLLABLE MA +A0B8 YI SYLLABLE MAP +A0B9 YI SYLLABLE MUOT +A0BA YI SYLLABLE MUOX +A0BB YI SYLLABLE MUO +A0BC YI SYLLABLE MUOP +A0BD YI SYLLABLE MOT +A0BE YI SYLLABLE MOX +A0BF YI SYLLABLE MO +A0C0 YI SYLLABLE MOP +A0C1 YI SYLLABLE MEX +A0C2 YI SYLLABLE ME +A0C3 YI SYLLABLE MUT +A0C4 YI SYLLABLE MUX +A0C5 YI SYLLABLE MU +A0C6 YI SYLLABLE MUP +A0C7 YI SYLLABLE MURX +A0C8 YI SYLLABLE MUR +A0C9 YI SYLLABLE MYT +A0CA YI SYLLABLE MYX +A0CB YI SYLLABLE MY +A0CC YI SYLLABLE MYP +A0CD YI SYLLABLE FIT +A0CE YI SYLLABLE FIX +A0CF YI SYLLABLE FI +A0D0 YI SYLLABLE FIP +A0D1 YI SYLLABLE FAT +A0D2 YI SYLLABLE FAX +A0D3 YI SYLLABLE FA +A0D4 YI SYLLABLE FAP +A0D5 YI SYLLABLE FOX +A0D6 YI SYLLABLE FO +A0D7 YI SYLLABLE FOP +A0D8 YI SYLLABLE FUT +A0D9 YI SYLLABLE FUX +A0DA YI SYLLABLE FU +A0DB YI SYLLABLE FUP +A0DC YI SYLLABLE FURX +A0DD YI SYLLABLE FUR +A0DE YI SYLLABLE FYT +A0DF YI SYLLABLE FYX +A0E0 YI SYLLABLE FY +A0E1 YI SYLLABLE FYP +A0E2 YI SYLLABLE VIT +A0E3 YI SYLLABLE VIX +A0E4 YI SYLLABLE VI +A0E5 YI SYLLABLE VIP +A0E6 YI SYLLABLE VIET +A0E7 YI SYLLABLE VIEX +A0E8 YI SYLLABLE VIE +A0E9 YI SYLLABLE VIEP +A0EA YI SYLLABLE VAT +A0EB YI SYLLABLE VAX +A0EC YI SYLLABLE VA +A0ED YI SYLLABLE VAP +A0EE YI SYLLABLE VOT +A0EF YI SYLLABLE VOX +A0F0 YI SYLLABLE VO +A0F1 YI SYLLABLE VOP +A0F2 YI SYLLABLE VEX +A0F3 YI SYLLABLE VEP +A0F4 YI SYLLABLE VUT +A0F5 YI SYLLABLE VUX +A0F6 YI SYLLABLE VU +A0F7 YI SYLLABLE VUP +A0F8 YI SYLLABLE VURX +A0F9 YI SYLLABLE VUR +A0FA YI SYLLABLE VYT +A0FB YI SYLLABLE VYX +A0FC YI SYLLABLE VY +A0FD YI SYLLABLE VYP +A0FE YI SYLLABLE VYRX +A0FF YI SYLLABLE VYR +A100 YI SYLLABLE DIT +A101 YI SYLLABLE DIX +A102 YI SYLLABLE DI +A103 YI SYLLABLE DIP +A104 YI SYLLABLE DIEX +A105 YI SYLLABLE DIE +A106 YI SYLLABLE DIEP +A107 YI SYLLABLE DAT +A108 YI SYLLABLE DAX +A109 YI SYLLABLE DA +A10A YI SYLLABLE DAP +A10B YI SYLLABLE DUOX +A10C YI SYLLABLE DUO +A10D YI SYLLABLE DOT +A10E YI SYLLABLE DOX +A10F YI SYLLABLE DO +A110 YI SYLLABLE DOP +A111 YI SYLLABLE DEX +A112 YI SYLLABLE DE +A113 YI SYLLABLE DEP +A114 YI SYLLABLE DUT +A115 YI SYLLABLE DUX +A116 YI SYLLABLE DU +A117 YI SYLLABLE DUP +A118 YI SYLLABLE DURX +A119 YI SYLLABLE DUR +A11A YI SYLLABLE TIT +A11B YI SYLLABLE TIX +A11C YI SYLLABLE TI +A11D YI SYLLABLE TIP +A11E YI SYLLABLE TIEX +A11F YI SYLLABLE TIE +A120 YI SYLLABLE TIEP +A121 YI SYLLABLE TAT +A122 YI SYLLABLE TAX +A123 YI SYLLABLE TA +A124 YI SYLLABLE TAP +A125 YI SYLLABLE TUOT +A126 YI SYLLABLE TUOX +A127 YI SYLLABLE TUO +A128 YI SYLLABLE TUOP +A129 YI SYLLABLE TOT +A12A YI SYLLABLE TOX +A12B YI SYLLABLE TO +A12C YI SYLLABLE TOP +A12D YI SYLLABLE TEX +A12E YI SYLLABLE TE +A12F YI SYLLABLE TEP +A130 YI SYLLABLE TUT +A131 YI SYLLABLE TUX +A132 YI SYLLABLE TU +A133 YI SYLLABLE TUP +A134 YI SYLLABLE TURX +A135 YI SYLLABLE TUR +A136 YI SYLLABLE DDIT +A137 YI SYLLABLE DDIX +A138 YI SYLLABLE DDI +A139 YI SYLLABLE DDIP +A13A YI SYLLABLE DDIEX +A13B YI SYLLABLE DDIE +A13C YI SYLLABLE DDIEP +A13D YI SYLLABLE DDAT +A13E YI SYLLABLE DDAX +A13F YI SYLLABLE DDA +A140 YI SYLLABLE DDAP +A141 YI SYLLABLE DDUOX +A142 YI SYLLABLE DDUO +A143 YI SYLLABLE DDUOP +A144 YI SYLLABLE DDOT +A145 YI SYLLABLE DDOX +A146 YI SYLLABLE DDO +A147 YI SYLLABLE DDOP +A148 YI SYLLABLE DDEX +A149 YI SYLLABLE DDE +A14A YI SYLLABLE DDEP +A14B YI SYLLABLE DDUT +A14C YI SYLLABLE DDUX +A14D YI SYLLABLE DDU +A14E YI SYLLABLE DDUP +A14F YI SYLLABLE DDURX +A150 YI SYLLABLE DDUR +A151 YI SYLLABLE NDIT +A152 YI SYLLABLE NDIX +A153 YI SYLLABLE NDI +A154 YI SYLLABLE NDIP +A155 YI SYLLABLE NDIEX +A156 YI SYLLABLE NDIE +A157 YI SYLLABLE NDAT +A158 YI SYLLABLE NDAX +A159 YI SYLLABLE NDA +A15A YI SYLLABLE NDAP +A15B YI SYLLABLE NDOT +A15C YI SYLLABLE NDOX +A15D YI SYLLABLE NDO +A15E YI SYLLABLE NDOP +A15F YI SYLLABLE NDEX +A160 YI SYLLABLE NDE +A161 YI SYLLABLE NDEP +A162 YI SYLLABLE NDUT +A163 YI SYLLABLE NDUX +A164 YI SYLLABLE NDU +A165 YI SYLLABLE NDUP +A166 YI SYLLABLE NDURX +A167 YI SYLLABLE NDUR +A168 YI SYLLABLE HNIT +A169 YI SYLLABLE HNIX +A16A YI SYLLABLE HNI +A16B YI SYLLABLE HNIP +A16C YI SYLLABLE HNIET +A16D YI SYLLABLE HNIEX +A16E YI SYLLABLE HNIE +A16F YI SYLLABLE HNIEP +A170 YI SYLLABLE HNAT +A171 YI SYLLABLE HNAX +A172 YI SYLLABLE HNA +A173 YI SYLLABLE HNAP +A174 YI SYLLABLE HNUOX +A175 YI SYLLABLE HNUO +A176 YI SYLLABLE HNOT +A177 YI SYLLABLE HNOX +A178 YI SYLLABLE HNOP +A179 YI SYLLABLE HNEX +A17A YI SYLLABLE HNE +A17B YI SYLLABLE HNEP +A17C YI SYLLABLE HNUT +A17D YI SYLLABLE NIT +A17E YI SYLLABLE NIX +A17F YI SYLLABLE NI +A180 YI SYLLABLE NIP +A181 YI SYLLABLE NIEX +A182 YI SYLLABLE NIE +A183 YI SYLLABLE NIEP +A184 YI SYLLABLE NAX +A185 YI SYLLABLE NA +A186 YI SYLLABLE NAP +A187 YI SYLLABLE NUOX +A188 YI SYLLABLE NUO +A189 YI SYLLABLE NUOP +A18A YI SYLLABLE NOT +A18B YI SYLLABLE NOX +A18C YI SYLLABLE NO +A18D YI SYLLABLE NOP +A18E YI SYLLABLE NEX +A18F YI SYLLABLE NE +A190 YI SYLLABLE NEP +A191 YI SYLLABLE NUT +A192 YI SYLLABLE NUX +A193 YI SYLLABLE NU +A194 YI SYLLABLE NUP +A195 YI SYLLABLE NURX +A196 YI SYLLABLE NUR +A197 YI SYLLABLE HLIT +A198 YI SYLLABLE HLIX +A199 YI SYLLABLE HLI +A19A YI SYLLABLE HLIP +A19B YI SYLLABLE HLIEX +A19C YI SYLLABLE HLIE +A19D YI SYLLABLE HLIEP +A19E YI SYLLABLE HLAT +A19F YI SYLLABLE HLAX +A1A0 YI SYLLABLE HLA +A1A1 YI SYLLABLE HLAP +A1A2 YI SYLLABLE HLUOX +A1A3 YI SYLLABLE HLUO +A1A4 YI SYLLABLE HLUOP +A1A5 YI SYLLABLE HLOX +A1A6 YI SYLLABLE HLO +A1A7 YI SYLLABLE HLOP +A1A8 YI SYLLABLE HLEX +A1A9 YI SYLLABLE HLE +A1AA YI SYLLABLE HLEP +A1AB YI SYLLABLE HLUT +A1AC YI SYLLABLE HLUX +A1AD YI SYLLABLE HLU +A1AE YI SYLLABLE HLUP +A1AF YI SYLLABLE HLURX +A1B0 YI SYLLABLE HLUR +A1B1 YI SYLLABLE HLYT +A1B2 YI SYLLABLE HLYX +A1B3 YI SYLLABLE HLY +A1B4 YI SYLLABLE HLYP +A1B5 YI SYLLABLE HLYRX +A1B6 YI SYLLABLE HLYR +A1B7 YI SYLLABLE LIT +A1B8 YI SYLLABLE LIX +A1B9 YI SYLLABLE LI +A1BA YI SYLLABLE LIP +A1BB YI SYLLABLE LIET +A1BC YI SYLLABLE LIEX +A1BD YI SYLLABLE LIE +A1BE YI SYLLABLE LIEP +A1BF YI SYLLABLE LAT +A1C0 YI SYLLABLE LAX +A1C1 YI SYLLABLE LA +A1C2 YI SYLLABLE LAP +A1C3 YI SYLLABLE LUOT +A1C4 YI SYLLABLE LUOX +A1C5 YI SYLLABLE LUO +A1C6 YI SYLLABLE LUOP +A1C7 YI SYLLABLE LOT +A1C8 YI SYLLABLE LOX +A1C9 YI SYLLABLE LO +A1CA YI SYLLABLE LOP +A1CB YI SYLLABLE LEX +A1CC YI SYLLABLE LE +A1CD YI SYLLABLE LEP +A1CE YI SYLLABLE LUT +A1CF YI SYLLABLE LUX +A1D0 YI SYLLABLE LU +A1D1 YI SYLLABLE LUP +A1D2 YI SYLLABLE LURX +A1D3 YI SYLLABLE LUR +A1D4 YI SYLLABLE LYT +A1D5 YI SYLLABLE LYX +A1D6 YI SYLLABLE LY +A1D7 YI SYLLABLE LYP +A1D8 YI SYLLABLE LYRX +A1D9 YI SYLLABLE LYR +A1DA YI SYLLABLE GIT +A1DB YI SYLLABLE GIX +A1DC YI SYLLABLE GI +A1DD YI SYLLABLE GIP +A1DE YI SYLLABLE GIET +A1DF YI SYLLABLE GIEX +A1E0 YI SYLLABLE GIE +A1E1 YI SYLLABLE GIEP +A1E2 YI SYLLABLE GAT +A1E3 YI SYLLABLE GAX +A1E4 YI SYLLABLE GA +A1E5 YI SYLLABLE GAP +A1E6 YI SYLLABLE GUOT +A1E7 YI SYLLABLE GUOX +A1E8 YI SYLLABLE GUO +A1E9 YI SYLLABLE GUOP +A1EA YI SYLLABLE GOT +A1EB YI SYLLABLE GOX +A1EC YI SYLLABLE GO +A1ED YI SYLLABLE GOP +A1EE YI SYLLABLE GET +A1EF YI SYLLABLE GEX +A1F0 YI SYLLABLE GE +A1F1 YI SYLLABLE GEP +A1F2 YI SYLLABLE GUT +A1F3 YI SYLLABLE GUX +A1F4 YI SYLLABLE GU +A1F5 YI SYLLABLE GUP +A1F6 YI SYLLABLE GURX +A1F7 YI SYLLABLE GUR +A1F8 YI SYLLABLE KIT +A1F9 YI SYLLABLE KIX +A1FA YI SYLLABLE KI +A1FB YI SYLLABLE KIP +A1FC YI SYLLABLE KIEX +A1FD YI SYLLABLE KIE +A1FE YI SYLLABLE KIEP +A1FF YI SYLLABLE KAT +A200 YI SYLLABLE KAX +A201 YI SYLLABLE KA +A202 YI SYLLABLE KAP +A203 YI SYLLABLE KUOX +A204 YI SYLLABLE KUO +A205 YI SYLLABLE KUOP +A206 YI SYLLABLE KOT +A207 YI SYLLABLE KOX +A208 YI SYLLABLE KO +A209 YI SYLLABLE KOP +A20A YI SYLLABLE KET +A20B YI SYLLABLE KEX +A20C YI SYLLABLE KE +A20D YI SYLLABLE KEP +A20E YI SYLLABLE KUT +A20F YI SYLLABLE KUX +A210 YI SYLLABLE KU +A211 YI SYLLABLE KUP +A212 YI SYLLABLE KURX +A213 YI SYLLABLE KUR +A214 YI SYLLABLE GGIT +A215 YI SYLLABLE GGIX +A216 YI SYLLABLE GGI +A217 YI SYLLABLE GGIEX +A218 YI SYLLABLE GGIE +A219 YI SYLLABLE GGIEP +A21A YI SYLLABLE GGAT +A21B YI SYLLABLE GGAX +A21C YI SYLLABLE GGA +A21D YI SYLLABLE GGAP +A21E YI SYLLABLE GGUOT +A21F YI SYLLABLE GGUOX +A220 YI SYLLABLE GGUO +A221 YI SYLLABLE GGUOP +A222 YI SYLLABLE GGOT +A223 YI SYLLABLE GGOX +A224 YI SYLLABLE GGO +A225 YI SYLLABLE GGOP +A226 YI SYLLABLE GGET +A227 YI SYLLABLE GGEX +A228 YI SYLLABLE GGE +A229 YI SYLLABLE GGEP +A22A YI SYLLABLE GGUT +A22B YI SYLLABLE GGUX +A22C YI SYLLABLE GGU +A22D YI SYLLABLE GGUP +A22E YI SYLLABLE GGURX +A22F YI SYLLABLE GGUR +A230 YI SYLLABLE MGIEX +A231 YI SYLLABLE MGIE +A232 YI SYLLABLE MGAT +A233 YI SYLLABLE MGAX +A234 YI SYLLABLE MGA +A235 YI SYLLABLE MGAP +A236 YI SYLLABLE MGUOX +A237 YI SYLLABLE MGUO +A238 YI SYLLABLE MGUOP +A239 YI SYLLABLE MGOT +A23A YI SYLLABLE MGOX +A23B YI SYLLABLE MGO +A23C YI SYLLABLE MGOP +A23D YI SYLLABLE MGEX +A23E YI SYLLABLE MGE +A23F YI SYLLABLE MGEP +A240 YI SYLLABLE MGUT +A241 YI SYLLABLE MGUX +A242 YI SYLLABLE MGU +A243 YI SYLLABLE MGUP +A244 YI SYLLABLE MGURX +A245 YI SYLLABLE MGUR +A246 YI SYLLABLE HXIT +A247 YI SYLLABLE HXIX +A248 YI SYLLABLE HXI +A249 YI SYLLABLE HXIP +A24A YI SYLLABLE HXIET +A24B YI SYLLABLE HXIEX +A24C YI SYLLABLE HXIE +A24D YI SYLLABLE HXIEP +A24E YI SYLLABLE HXAT +A24F YI SYLLABLE HXAX +A250 YI SYLLABLE HXA +A251 YI SYLLABLE HXAP +A252 YI SYLLABLE HXUOT +A253 YI SYLLABLE HXUOX +A254 YI SYLLABLE HXUO +A255 YI SYLLABLE HXUOP +A256 YI SYLLABLE HXOT +A257 YI SYLLABLE HXOX +A258 YI SYLLABLE HXO +A259 YI SYLLABLE HXOP +A25A YI SYLLABLE HXEX +A25B YI SYLLABLE HXE +A25C YI SYLLABLE HXEP +A25D YI SYLLABLE NGIEX +A25E YI SYLLABLE NGIE +A25F YI SYLLABLE NGIEP +A260 YI SYLLABLE NGAT +A261 YI SYLLABLE NGAX +A262 YI SYLLABLE NGA +A263 YI SYLLABLE NGAP +A264 YI SYLLABLE NGUOT +A265 YI SYLLABLE NGUOX +A266 YI SYLLABLE NGUO +A267 YI SYLLABLE NGOT +A268 YI SYLLABLE NGOX +A269 YI SYLLABLE NGO +A26A YI SYLLABLE NGOP +A26B YI SYLLABLE NGEX +A26C YI SYLLABLE NGE +A26D YI SYLLABLE NGEP +A26E YI SYLLABLE HIT +A26F YI SYLLABLE HIEX +A270 YI SYLLABLE HIE +A271 YI SYLLABLE HAT +A272 YI SYLLABLE HAX +A273 YI SYLLABLE HA +A274 YI SYLLABLE HAP +A275 YI SYLLABLE HUOT +A276 YI SYLLABLE HUOX +A277 YI SYLLABLE HUO +A278 YI SYLLABLE HUOP +A279 YI SYLLABLE HOT +A27A YI SYLLABLE HOX +A27B YI SYLLABLE HO +A27C YI SYLLABLE HOP +A27D YI SYLLABLE HEX +A27E YI SYLLABLE HE +A27F YI SYLLABLE HEP +A280 YI SYLLABLE WAT +A281 YI SYLLABLE WAX +A282 YI SYLLABLE WA +A283 YI SYLLABLE WAP +A284 YI SYLLABLE WUOX +A285 YI SYLLABLE WUO +A286 YI SYLLABLE WUOP +A287 YI SYLLABLE WOX +A288 YI SYLLABLE WO +A289 YI SYLLABLE WOP +A28A YI SYLLABLE WEX +A28B YI SYLLABLE WE +A28C YI SYLLABLE WEP +A28D YI SYLLABLE ZIT +A28E YI SYLLABLE ZIX +A28F YI SYLLABLE ZI +A290 YI SYLLABLE ZIP +A291 YI SYLLABLE ZIEX +A292 YI SYLLABLE ZIE +A293 YI SYLLABLE ZIEP +A294 YI SYLLABLE ZAT +A295 YI SYLLABLE ZAX +A296 YI SYLLABLE ZA +A297 YI SYLLABLE ZAP +A298 YI SYLLABLE ZUOX +A299 YI SYLLABLE ZUO +A29A YI SYLLABLE ZUOP +A29B YI SYLLABLE ZOT +A29C YI SYLLABLE ZOX +A29D YI SYLLABLE ZO +A29E YI SYLLABLE ZOP +A29F YI SYLLABLE ZEX +A2A0 YI SYLLABLE ZE +A2A1 YI SYLLABLE ZEP +A2A2 YI SYLLABLE ZUT +A2A3 YI SYLLABLE ZUX +A2A4 YI SYLLABLE ZU +A2A5 YI SYLLABLE ZUP +A2A6 YI SYLLABLE ZURX +A2A7 YI SYLLABLE ZUR +A2A8 YI SYLLABLE ZYT +A2A9 YI SYLLABLE ZYX +A2AA YI SYLLABLE ZY +A2AB YI SYLLABLE ZYP +A2AC YI SYLLABLE ZYRX +A2AD YI SYLLABLE ZYR +A2AE YI SYLLABLE CIT +A2AF YI SYLLABLE CIX +A2B0 YI SYLLABLE CI +A2B1 YI SYLLABLE CIP +A2B2 YI SYLLABLE CIET +A2B3 YI SYLLABLE CIEX +A2B4 YI SYLLABLE CIE +A2B5 YI SYLLABLE CIEP +A2B6 YI SYLLABLE CAT +A2B7 YI SYLLABLE CAX +A2B8 YI SYLLABLE CA +A2B9 YI SYLLABLE CAP +A2BA YI SYLLABLE CUOX +A2BB YI SYLLABLE CUO +A2BC YI SYLLABLE CUOP +A2BD YI SYLLABLE COT +A2BE YI SYLLABLE COX +A2BF YI SYLLABLE CO +A2C0 YI SYLLABLE COP +A2C1 YI SYLLABLE CEX +A2C2 YI SYLLABLE CE +A2C3 YI SYLLABLE CEP +A2C4 YI SYLLABLE CUT +A2C5 YI SYLLABLE CUX +A2C6 YI SYLLABLE CU +A2C7 YI SYLLABLE CUP +A2C8 YI SYLLABLE CURX +A2C9 YI SYLLABLE CUR +A2CA YI SYLLABLE CYT +A2CB YI SYLLABLE CYX +A2CC YI SYLLABLE CY +A2CD YI SYLLABLE CYP +A2CE YI SYLLABLE CYRX +A2CF YI SYLLABLE CYR +A2D0 YI SYLLABLE ZZIT +A2D1 YI SYLLABLE ZZIX +A2D2 YI SYLLABLE ZZI +A2D3 YI SYLLABLE ZZIP +A2D4 YI SYLLABLE ZZIET +A2D5 YI SYLLABLE ZZIEX +A2D6 YI SYLLABLE ZZIE +A2D7 YI SYLLABLE ZZIEP +A2D8 YI SYLLABLE ZZAT +A2D9 YI SYLLABLE ZZAX +A2DA YI SYLLABLE ZZA +A2DB YI SYLLABLE ZZAP +A2DC YI SYLLABLE ZZOX +A2DD YI SYLLABLE ZZO +A2DE YI SYLLABLE ZZOP +A2DF YI SYLLABLE ZZEX +A2E0 YI SYLLABLE ZZE +A2E1 YI SYLLABLE ZZEP +A2E2 YI SYLLABLE ZZUX +A2E3 YI SYLLABLE ZZU +A2E4 YI SYLLABLE ZZUP +A2E5 YI SYLLABLE ZZURX +A2E6 YI SYLLABLE ZZUR +A2E7 YI SYLLABLE ZZYT +A2E8 YI SYLLABLE ZZYX +A2E9 YI SYLLABLE ZZY +A2EA YI SYLLABLE ZZYP +A2EB YI SYLLABLE ZZYRX +A2EC YI SYLLABLE ZZYR +A2ED YI SYLLABLE NZIT +A2EE YI SYLLABLE NZIX +A2EF YI SYLLABLE NZI +A2F0 YI SYLLABLE NZIP +A2F1 YI SYLLABLE NZIEX +A2F2 YI SYLLABLE NZIE +A2F3 YI SYLLABLE NZIEP +A2F4 YI SYLLABLE NZAT +A2F5 YI SYLLABLE NZAX +A2F6 YI SYLLABLE NZA +A2F7 YI SYLLABLE NZAP +A2F8 YI SYLLABLE NZUOX +A2F9 YI SYLLABLE NZUO +A2FA YI SYLLABLE NZOX +A2FB YI SYLLABLE NZOP +A2FC YI SYLLABLE NZEX +A2FD YI SYLLABLE NZE +A2FE YI SYLLABLE NZUX +A2FF YI SYLLABLE NZU +A300 YI SYLLABLE NZUP +A301 YI SYLLABLE NZURX +A302 YI SYLLABLE NZUR +A303 YI SYLLABLE NZYT +A304 YI SYLLABLE NZYX +A305 YI SYLLABLE NZY +A306 YI SYLLABLE NZYP +A307 YI SYLLABLE NZYRX +A308 YI SYLLABLE NZYR +A309 YI SYLLABLE SIT +A30A YI SYLLABLE SIX +A30B YI SYLLABLE SI +A30C YI SYLLABLE SIP +A30D YI SYLLABLE SIEX +A30E YI SYLLABLE SIE +A30F YI SYLLABLE SIEP +A310 YI SYLLABLE SAT +A311 YI SYLLABLE SAX +A312 YI SYLLABLE SA +A313 YI SYLLABLE SAP +A314 YI SYLLABLE SUOX +A315 YI SYLLABLE SUO +A316 YI SYLLABLE SUOP +A317 YI SYLLABLE SOT +A318 YI SYLLABLE SOX +A319 YI SYLLABLE SO +A31A YI SYLLABLE SOP +A31B YI SYLLABLE SEX +A31C YI SYLLABLE SE +A31D YI SYLLABLE SEP +A31E YI SYLLABLE SUT +A31F YI SYLLABLE SUX +A320 YI SYLLABLE SU +A321 YI SYLLABLE SUP +A322 YI SYLLABLE SURX +A323 YI SYLLABLE SUR +A324 YI SYLLABLE SYT +A325 YI SYLLABLE SYX +A326 YI SYLLABLE SY +A327 YI SYLLABLE SYP +A328 YI SYLLABLE SYRX +A329 YI SYLLABLE SYR +A32A YI SYLLABLE SSIT +A32B YI SYLLABLE SSIX +A32C YI SYLLABLE SSI +A32D YI SYLLABLE SSIP +A32E YI SYLLABLE SSIEX +A32F YI SYLLABLE SSIE +A330 YI SYLLABLE SSIEP +A331 YI SYLLABLE SSAT +A332 YI SYLLABLE SSAX +A333 YI SYLLABLE SSA +A334 YI SYLLABLE SSAP +A335 YI SYLLABLE SSOT +A336 YI SYLLABLE SSOX +A337 YI SYLLABLE SSO +A338 YI SYLLABLE SSOP +A339 YI SYLLABLE SSEX +A33A YI SYLLABLE SSE +A33B YI SYLLABLE SSEP +A33C YI SYLLABLE SSUT +A33D YI SYLLABLE SSUX +A33E YI SYLLABLE SSU +A33F YI SYLLABLE SSUP +A340 YI SYLLABLE SSYT +A341 YI SYLLABLE SSYX +A342 YI SYLLABLE SSY +A343 YI SYLLABLE SSYP +A344 YI SYLLABLE SSYRX +A345 YI SYLLABLE SSYR +A346 YI SYLLABLE ZHAT +A347 YI SYLLABLE ZHAX +A348 YI SYLLABLE ZHA +A349 YI SYLLABLE ZHAP +A34A YI SYLLABLE ZHUOX +A34B YI SYLLABLE ZHUO +A34C YI SYLLABLE ZHUOP +A34D YI SYLLABLE ZHOT +A34E YI SYLLABLE ZHOX +A34F YI SYLLABLE ZHO +A350 YI SYLLABLE ZHOP +A351 YI SYLLABLE ZHET +A352 YI SYLLABLE ZHEX +A353 YI SYLLABLE ZHE +A354 YI SYLLABLE ZHEP +A355 YI SYLLABLE ZHUT +A356 YI SYLLABLE ZHUX +A357 YI SYLLABLE ZHU +A358 YI SYLLABLE ZHUP +A359 YI SYLLABLE ZHURX +A35A YI SYLLABLE ZHUR +A35B YI SYLLABLE ZHYT +A35C YI SYLLABLE ZHYX +A35D YI SYLLABLE ZHY +A35E YI SYLLABLE ZHYP +A35F YI SYLLABLE ZHYRX +A360 YI SYLLABLE ZHYR +A361 YI SYLLABLE CHAT +A362 YI SYLLABLE CHAX +A363 YI SYLLABLE CHA +A364 YI SYLLABLE CHAP +A365 YI SYLLABLE CHUOT +A366 YI SYLLABLE CHUOX +A367 YI SYLLABLE CHUO +A368 YI SYLLABLE CHUOP +A369 YI SYLLABLE CHOT +A36A YI SYLLABLE CHOX +A36B YI SYLLABLE CHO +A36C YI SYLLABLE CHOP +A36D YI SYLLABLE CHET +A36E YI SYLLABLE CHEX +A36F YI SYLLABLE CHE +A370 YI SYLLABLE CHEP +A371 YI SYLLABLE CHUX +A372 YI SYLLABLE CHU +A373 YI SYLLABLE CHUP +A374 YI SYLLABLE CHURX +A375 YI SYLLABLE CHUR +A376 YI SYLLABLE CHYT +A377 YI SYLLABLE CHYX +A378 YI SYLLABLE CHY +A379 YI SYLLABLE CHYP +A37A YI SYLLABLE CHYRX +A37B YI SYLLABLE CHYR +A37C YI SYLLABLE RRAX +A37D YI SYLLABLE RRA +A37E YI SYLLABLE RRUOX +A37F YI SYLLABLE RRUO +A380 YI SYLLABLE RROT +A381 YI SYLLABLE RROX +A382 YI SYLLABLE RRO +A383 YI SYLLABLE RROP +A384 YI SYLLABLE RRET +A385 YI SYLLABLE RREX +A386 YI SYLLABLE RRE +A387 YI SYLLABLE RREP +A388 YI SYLLABLE RRUT +A389 YI SYLLABLE RRUX +A38A YI SYLLABLE RRU +A38B YI SYLLABLE RRUP +A38C YI SYLLABLE RRURX +A38D YI SYLLABLE RRUR +A38E YI SYLLABLE RRYT +A38F YI SYLLABLE RRYX +A390 YI SYLLABLE RRY +A391 YI SYLLABLE RRYP +A392 YI SYLLABLE RRYRX +A393 YI SYLLABLE RRYR +A394 YI SYLLABLE NRAT +A395 YI SYLLABLE NRAX +A396 YI SYLLABLE NRA +A397 YI SYLLABLE NRAP +A398 YI SYLLABLE NROX +A399 YI SYLLABLE NRO +A39A YI SYLLABLE NROP +A39B YI SYLLABLE NRET +A39C YI SYLLABLE NREX +A39D YI SYLLABLE NRE +A39E YI SYLLABLE NREP +A39F YI SYLLABLE NRUT +A3A0 YI SYLLABLE NRUX +A3A1 YI SYLLABLE NRU +A3A2 YI SYLLABLE NRUP +A3A3 YI SYLLABLE NRURX +A3A4 YI SYLLABLE NRUR +A3A5 YI SYLLABLE NRYT +A3A6 YI SYLLABLE NRYX +A3A7 YI SYLLABLE NRY +A3A8 YI SYLLABLE NRYP +A3A9 YI SYLLABLE NRYRX +A3AA YI SYLLABLE NRYR +A3AB YI SYLLABLE SHAT +A3AC YI SYLLABLE SHAX +A3AD YI SYLLABLE SHA +A3AE YI SYLLABLE SHAP +A3AF YI SYLLABLE SHUOX +A3B0 YI SYLLABLE SHUO +A3B1 YI SYLLABLE SHUOP +A3B2 YI SYLLABLE SHOT +A3B3 YI SYLLABLE SHOX +A3B4 YI SYLLABLE SHO +A3B5 YI SYLLABLE SHOP +A3B6 YI SYLLABLE SHET +A3B7 YI SYLLABLE SHEX +A3B8 YI SYLLABLE SHE +A3B9 YI SYLLABLE SHEP +A3BA YI SYLLABLE SHUT +A3BB YI SYLLABLE SHUX +A3BC YI SYLLABLE SHU +A3BD YI SYLLABLE SHUP +A3BE YI SYLLABLE SHURX +A3BF YI SYLLABLE SHUR +A3C0 YI SYLLABLE SHYT +A3C1 YI SYLLABLE SHYX +A3C2 YI SYLLABLE SHY +A3C3 YI SYLLABLE SHYP +A3C4 YI SYLLABLE SHYRX +A3C5 YI SYLLABLE SHYR +A3C6 YI SYLLABLE RAT +A3C7 YI SYLLABLE RAX +A3C8 YI SYLLABLE RA +A3C9 YI SYLLABLE RAP +A3CA YI SYLLABLE RUOX +A3CB YI SYLLABLE RUO +A3CC YI SYLLABLE RUOP +A3CD YI SYLLABLE ROT +A3CE YI SYLLABLE ROX +A3CF YI SYLLABLE RO +A3D0 YI SYLLABLE ROP +A3D1 YI SYLLABLE REX +A3D2 YI SYLLABLE RE +A3D3 YI SYLLABLE REP +A3D4 YI SYLLABLE RUT +A3D5 YI SYLLABLE RUX +A3D6 YI SYLLABLE RU +A3D7 YI SYLLABLE RUP +A3D8 YI SYLLABLE RURX +A3D9 YI SYLLABLE RUR +A3DA YI SYLLABLE RYT +A3DB YI SYLLABLE RYX +A3DC YI SYLLABLE RY +A3DD YI SYLLABLE RYP +A3DE YI SYLLABLE RYRX +A3DF YI SYLLABLE RYR +A3E0 YI SYLLABLE JIT +A3E1 YI SYLLABLE JIX +A3E2 YI SYLLABLE JI +A3E3 YI SYLLABLE JIP +A3E4 YI SYLLABLE JIET +A3E5 YI SYLLABLE JIEX +A3E6 YI SYLLABLE JIE +A3E7 YI SYLLABLE JIEP +A3E8 YI SYLLABLE JUOT +A3E9 YI SYLLABLE JUOX +A3EA YI SYLLABLE JUO +A3EB YI SYLLABLE JUOP +A3EC YI SYLLABLE JOT +A3ED YI SYLLABLE JOX +A3EE YI SYLLABLE JO +A3EF YI SYLLABLE JOP +A3F0 YI SYLLABLE JUT +A3F1 YI SYLLABLE JUX +A3F2 YI SYLLABLE JU +A3F3 YI SYLLABLE JUP +A3F4 YI SYLLABLE JURX +A3F5 YI SYLLABLE JUR +A3F6 YI SYLLABLE JYT +A3F7 YI SYLLABLE JYX +A3F8 YI SYLLABLE JY +A3F9 YI SYLLABLE JYP +A3FA YI SYLLABLE JYRX +A3FB YI SYLLABLE JYR +A3FC YI SYLLABLE QIT +A3FD YI SYLLABLE QIX +A3FE YI SYLLABLE QI +A3FF YI SYLLABLE QIP +A400 YI SYLLABLE QIET +A401 YI SYLLABLE QIEX +A402 YI SYLLABLE QIE +A403 YI SYLLABLE QIEP +A404 YI SYLLABLE QUOT +A405 YI SYLLABLE QUOX +A406 YI SYLLABLE QUO +A407 YI SYLLABLE QUOP +A408 YI SYLLABLE QOT +A409 YI SYLLABLE QOX +A40A YI SYLLABLE QO +A40B YI SYLLABLE QOP +A40C YI SYLLABLE QUT +A40D YI SYLLABLE QUX +A40E YI SYLLABLE QU +A40F YI SYLLABLE QUP +A410 YI SYLLABLE QURX +A411 YI SYLLABLE QUR +A412 YI SYLLABLE QYT +A413 YI SYLLABLE QYX +A414 YI SYLLABLE QY +A415 YI SYLLABLE QYP +A416 YI SYLLABLE QYRX +A417 YI SYLLABLE QYR +A418 YI SYLLABLE JJIT +A419 YI SYLLABLE JJIX +A41A YI SYLLABLE JJI +A41B YI SYLLABLE JJIP +A41C YI SYLLABLE JJIET +A41D YI SYLLABLE JJIEX +A41E YI SYLLABLE JJIE +A41F YI SYLLABLE JJIEP +A420 YI SYLLABLE JJUOX +A421 YI SYLLABLE JJUO +A422 YI SYLLABLE JJUOP +A423 YI SYLLABLE JJOT +A424 YI SYLLABLE JJOX +A425 YI SYLLABLE JJO +A426 YI SYLLABLE JJOP +A427 YI SYLLABLE JJUT +A428 YI SYLLABLE JJUX +A429 YI SYLLABLE JJU +A42A YI SYLLABLE JJUP +A42B YI SYLLABLE JJURX +A42C YI SYLLABLE JJUR +A42D YI SYLLABLE JJYT +A42E YI SYLLABLE JJYX +A42F YI SYLLABLE JJY +A430 YI SYLLABLE JJYP +A431 YI SYLLABLE NJIT +A432 YI SYLLABLE NJIX +A433 YI SYLLABLE NJI +A434 YI SYLLABLE NJIP +A435 YI SYLLABLE NJIET +A436 YI SYLLABLE NJIEX +A437 YI SYLLABLE NJIE +A438 YI SYLLABLE NJIEP +A439 YI SYLLABLE NJUOX +A43A YI SYLLABLE NJUO +A43B YI SYLLABLE NJOT +A43C YI SYLLABLE NJOX +A43D YI SYLLABLE NJO +A43E YI SYLLABLE NJOP +A43F YI SYLLABLE NJUX +A440 YI SYLLABLE NJU +A441 YI SYLLABLE NJUP +A442 YI SYLLABLE NJURX +A443 YI SYLLABLE NJUR +A444 YI SYLLABLE NJYT +A445 YI SYLLABLE NJYX +A446 YI SYLLABLE NJY +A447 YI SYLLABLE NJYP +A448 YI SYLLABLE NJYRX +A449 YI SYLLABLE NJYR +A44A YI SYLLABLE NYIT +A44B YI SYLLABLE NYIX +A44C YI SYLLABLE NYI +A44D YI SYLLABLE NYIP +A44E YI SYLLABLE NYIET +A44F YI SYLLABLE NYIEX +A450 YI SYLLABLE NYIE +A451 YI SYLLABLE NYIEP +A452 YI SYLLABLE NYUOX +A453 YI SYLLABLE NYUO +A454 YI SYLLABLE NYUOP +A455 YI SYLLABLE NYOT +A456 YI SYLLABLE NYOX +A457 YI SYLLABLE NYO +A458 YI SYLLABLE NYOP +A459 YI SYLLABLE NYUT +A45A YI SYLLABLE NYUX +A45B YI SYLLABLE NYU +A45C YI SYLLABLE NYUP +A45D YI SYLLABLE XIT +A45E YI SYLLABLE XIX +A45F YI SYLLABLE XI +A460 YI SYLLABLE XIP +A461 YI SYLLABLE XIET +A462 YI SYLLABLE XIEX +A463 YI SYLLABLE XIE +A464 YI SYLLABLE XIEP +A465 YI SYLLABLE XUOX +A466 YI SYLLABLE XUO +A467 YI SYLLABLE XOT +A468 YI SYLLABLE XOX +A469 YI SYLLABLE XO +A46A YI SYLLABLE XOP +A46B YI SYLLABLE XYT +A46C YI SYLLABLE XYX +A46D YI SYLLABLE XY +A46E YI SYLLABLE XYP +A46F YI SYLLABLE XYRX +A470 YI SYLLABLE XYR +A471 YI SYLLABLE YIT +A472 YI SYLLABLE YIX +A473 YI SYLLABLE YI +A474 YI SYLLABLE YIP +A475 YI SYLLABLE YIET +A476 YI SYLLABLE YIEX +A477 YI SYLLABLE YIE +A478 YI SYLLABLE YIEP +A479 YI SYLLABLE YUOT +A47A YI SYLLABLE YUOX +A47B YI SYLLABLE YUO +A47C YI SYLLABLE YUOP +A47D YI SYLLABLE YOT +A47E YI SYLLABLE YOX +A47F YI SYLLABLE YO +A480 YI SYLLABLE YOP +A481 YI SYLLABLE YUT +A482 YI SYLLABLE YUX +A483 YI SYLLABLE YU +A484 YI SYLLABLE YUP +A485 YI SYLLABLE YURX +A486 YI SYLLABLE YUR +A487 YI SYLLABLE YYT +A488 YI SYLLABLE YYX +A489 YI SYLLABLE YY +A48A YI SYLLABLE YYP +A48B YI SYLLABLE YYRX +A48C YI SYLLABLE YYR +@@ A490 Yi Radicals A4CF +@ Yi radicals +A490 YI RADICAL QOT +A491 YI RADICAL LI +A492 YI RADICAL KIT +A493 YI RADICAL NYIP +A494 YI RADICAL CYP +A495 YI RADICAL SSI +A496 YI RADICAL GGOP +A497 YI RADICAL GEP +A498 YI RADICAL MI +A499 YI RADICAL HXIT +A49A YI RADICAL LYR +A49B YI RADICAL BBUT +A49C YI RADICAL MOP +A49D YI RADICAL YO +A49E YI RADICAL PUT +A49F YI RADICAL HXUO +A4A0 YI RADICAL TAT +A4A1 YI RADICAL GA +A4A2 YI RADICAL ZUP +A4A3 YI RADICAL CYT +A4A4 YI RADICAL DDUR +A4A5 YI RADICAL BUR +A4A6 YI RADICAL GGUO +A4A7 YI RADICAL NYOP +A4A8 YI RADICAL TU +A4A9 YI RADICAL OP +A4AA YI RADICAL JJUT +A4AB YI RADICAL ZOT +A4AC YI RADICAL PYT +A4AD YI RADICAL HMO +A4AE YI RADICAL YIT +A4AF YI RADICAL VUR +A4B0 YI RADICAL SHY +A4B1 YI RADICAL VEP +A4B2 YI RADICAL ZA +A4B3 YI RADICAL JO +A4B4 YI RADICAL NZUP +A4B5 YI RADICAL JJY +A4B6 YI RADICAL GOT +A4B7 YI RADICAL JJIE +A4B8 YI RADICAL WO +A4B9 YI RADICAL DU +A4BA YI RADICAL SHUR +A4BB YI RADICAL LIE +A4BC YI RADICAL CY +A4BD YI RADICAL CUOP +A4BE YI RADICAL CIP +A4BF YI RADICAL HXOP +A4C0 YI RADICAL SHAT +A4C1 YI RADICAL ZUR +A4C2 YI RADICAL SHOP +A4C3 YI RADICAL CHE +A4C4 YI RADICAL ZZIET +A4C5 YI RADICAL NBIE +A4C6 YI RADICAL KE +@@ A700 Modifier Tone Letters A71F +@ Corner tone marks for Chinese +A700 MODIFIER LETTER CHINESE TONE YIN PING +A701 MODIFIER LETTER CHINESE TONE YANG PING +A702 MODIFIER LETTER CHINESE TONE YIN SHANG +A703 MODIFIER LETTER CHINESE TONE YANG SHANG +A704 MODIFIER LETTER CHINESE TONE YIN QU +A705 MODIFIER LETTER CHINESE TONE YANG QU +A706 MODIFIER LETTER CHINESE TONE YIN RU +A707 MODIFIER LETTER CHINESE TONE YANG RU +@ Dotted tone letters +A708 MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR +A709 MODIFIER LETTER HIGH DOTTED TONE BAR +A70A MODIFIER LETTER MID DOTTED TONE BAR +A70B MODIFIER LETTER LOW DOTTED TONE BAR +A70C MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR +A70D MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR +A70E MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR +A70F MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR +A710 MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR +A711 MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR +@ Left-stem tone letters +A712 MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR +A713 MODIFIER LETTER HIGH LEFT-STEM TONE BAR +A714 MODIFIER LETTER MID LEFT-STEM TONE BAR +A715 MODIFIER LETTER LOW LEFT-STEM TONE BAR +A716 MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +@@ A800 Syloti Nagri A82F +@ Independent vowels and dvisvara +A800 SYLOTI NAGRI LETTER A +A801 SYLOTI NAGRI LETTER I +A802 SYLOTI NAGRI SIGN DVISVARA +A803 SYLOTI NAGRI LETTER U +A804 SYLOTI NAGRI LETTER E +A805 SYLOTI NAGRI LETTER O +@ Sign +A806 SYLOTI NAGRI SIGN HASANTA + = halant, virama +@ Consonants and consonant signs +A807 SYLOTI NAGRI LETTER KO +A808 SYLOTI NAGRI LETTER KHO +A809 SYLOTI NAGRI LETTER GO +A80A SYLOTI NAGRI LETTER GHO +A80B SYLOTI NAGRI SIGN ANUSVARA +A80C SYLOTI NAGRI LETTER CO +A80D SYLOTI NAGRI LETTER CHO +A80E SYLOTI NAGRI LETTER JO +A80F SYLOTI NAGRI LETTER JHO +A810 SYLOTI NAGRI LETTER TTO +A811 SYLOTI NAGRI LETTER TTHO +A812 SYLOTI NAGRI LETTER DDO +A813 SYLOTI NAGRI LETTER DDHO +A814 SYLOTI NAGRI LETTER TO +A815 SYLOTI NAGRI LETTER THO +A816 SYLOTI NAGRI LETTER DO +A817 SYLOTI NAGRI LETTER DHO +A818 SYLOTI NAGRI LETTER NO +A819 SYLOTI NAGRI LETTER PO +A81A SYLOTI NAGRI LETTER PHO +A81B SYLOTI NAGRI LETTER BO +A81C SYLOTI NAGRI LETTER BHO +A81D SYLOTI NAGRI LETTER MO +A81E SYLOTI NAGRI LETTER RO +A81F SYLOTI NAGRI LETTER LO +A820 SYLOTI NAGRI LETTER RRO +A821 SYLOTI NAGRI LETTER SO +A822 SYLOTI NAGRI LETTER HO +@ Dependent vowel signs +A823 SYLOTI NAGRI VOWEL SIGN A +A824 SYLOTI NAGRI VOWEL SIGN I +A825 SYLOTI NAGRI VOWEL SIGN U +A826 SYLOTI NAGRI VOWEL SIGN E +A827 SYLOTI NAGRI VOWEL SIGN OO +@ Poetry marks +A828 SYLOTI NAGRI POETRY MARK-1 +A829 SYLOTI NAGRI POETRY MARK-2 +A82A SYLOTI NAGRI POETRY MARK-3 +A82B SYLOTI NAGRI POETRY MARK-4 +@@ AC00 Hangul Syllables D7A3 +@@ D800 High Surrogates DB7F +@@ DB80 High Private Use Surrogates DBFF +@@ DC00 Low Surrogates DFFF +@@ E000 Private Use Area F8FF +@@ F900 CJK Compatibility Ideographs FAFF +@ Pronunciation variants from KS X 1001:1998 +F900 CJK COMPATIBILITY IDEOGRAPH-F900 + : 8C48 +F901 CJK COMPATIBILITY IDEOGRAPH-F901 + : 66F4 +F902 CJK COMPATIBILITY IDEOGRAPH-F902 + : 8ECA +F903 CJK COMPATIBILITY IDEOGRAPH-F903 + : 8CC8 +F904 CJK COMPATIBILITY IDEOGRAPH-F904 + : 6ED1 +F905 CJK COMPATIBILITY IDEOGRAPH-F905 + : 4E32 +F906 CJK COMPATIBILITY IDEOGRAPH-F906 + : 53E5 +F907 CJK COMPATIBILITY IDEOGRAPH-F907 + : 9F9C +F908 CJK COMPATIBILITY IDEOGRAPH-F908 + : 9F9C +F909 CJK COMPATIBILITY IDEOGRAPH-F909 + : 5951 +F90A CJK COMPATIBILITY IDEOGRAPH-F90A + : 91D1 +F90B CJK COMPATIBILITY IDEOGRAPH-F90B + : 5587 +F90C CJK COMPATIBILITY IDEOGRAPH-F90C + : 5948 +F90D CJK COMPATIBILITY IDEOGRAPH-F90D + : 61F6 +F90E CJK COMPATIBILITY IDEOGRAPH-F90E + : 7669 +F90F CJK COMPATIBILITY IDEOGRAPH-F90F + : 7F85 +F910 CJK COMPATIBILITY IDEOGRAPH-F910 + : 863F +F911 CJK COMPATIBILITY IDEOGRAPH-F911 + : 87BA +F912 CJK COMPATIBILITY IDEOGRAPH-F912 + : 88F8 +F913 CJK COMPATIBILITY IDEOGRAPH-F913 + : 908F +F914 CJK COMPATIBILITY IDEOGRAPH-F914 + : 6A02 +F915 CJK COMPATIBILITY IDEOGRAPH-F915 + : 6D1B +F916 CJK COMPATIBILITY IDEOGRAPH-F916 + : 70D9 +F917 CJK COMPATIBILITY IDEOGRAPH-F917 + : 73DE +F918 CJK COMPATIBILITY IDEOGRAPH-F918 + : 843D +F919 CJK COMPATIBILITY IDEOGRAPH-F919 + : 916A +F91A CJK COMPATIBILITY IDEOGRAPH-F91A + : 99F1 +F91B CJK COMPATIBILITY IDEOGRAPH-F91B + : 4E82 +F91C CJK COMPATIBILITY IDEOGRAPH-F91C + : 5375 +F91D CJK COMPATIBILITY IDEOGRAPH-F91D + : 6B04 +F91E CJK COMPATIBILITY IDEOGRAPH-F91E + : 721B +F91F CJK COMPATIBILITY IDEOGRAPH-F91F + : 862D +F920 CJK COMPATIBILITY IDEOGRAPH-F920 + : 9E1E +F921 CJK COMPATIBILITY IDEOGRAPH-F921 + : 5D50 +F922 CJK COMPATIBILITY IDEOGRAPH-F922 + : 6FEB +F923 CJK COMPATIBILITY IDEOGRAPH-F923 + : 85CD +F924 CJK COMPATIBILITY IDEOGRAPH-F924 + : 8964 +F925 CJK COMPATIBILITY IDEOGRAPH-F925 + : 62C9 +F926 CJK COMPATIBILITY IDEOGRAPH-F926 + : 81D8 +F927 CJK COMPATIBILITY IDEOGRAPH-F927 + : 881F +F928 CJK COMPATIBILITY IDEOGRAPH-F928 + : 5ECA +F929 CJK COMPATIBILITY IDEOGRAPH-F929 + : 6717 +F92A CJK COMPATIBILITY IDEOGRAPH-F92A + : 6D6A +F92B CJK COMPATIBILITY IDEOGRAPH-F92B + : 72FC +F92C CJK COMPATIBILITY IDEOGRAPH-F92C + : 90CE +F92D CJK COMPATIBILITY IDEOGRAPH-F92D + : 4F86 +F92E CJK COMPATIBILITY IDEOGRAPH-F92E + : 51B7 +F92F CJK COMPATIBILITY IDEOGRAPH-F92F + : 52DE +F930 CJK COMPATIBILITY IDEOGRAPH-F930 + : 64C4 +F931 CJK COMPATIBILITY IDEOGRAPH-F931 + : 6AD3 +F932 CJK COMPATIBILITY IDEOGRAPH-F932 + : 7210 +F933 CJK COMPATIBILITY IDEOGRAPH-F933 + : 76E7 +F934 CJK COMPATIBILITY IDEOGRAPH-F934 + : 8001 +F935 CJK COMPATIBILITY IDEOGRAPH-F935 + : 8606 +F936 CJK COMPATIBILITY IDEOGRAPH-F936 + : 865C +F937 CJK COMPATIBILITY IDEOGRAPH-F937 + : 8DEF +F938 CJK COMPATIBILITY IDEOGRAPH-F938 + : 9732 +F939 CJK COMPATIBILITY IDEOGRAPH-F939 + : 9B6F +F93A CJK COMPATIBILITY IDEOGRAPH-F93A + : 9DFA +F93B CJK COMPATIBILITY IDEOGRAPH-F93B + : 788C +F93C CJK COMPATIBILITY IDEOGRAPH-F93C + : 797F +F93D CJK COMPATIBILITY IDEOGRAPH-F93D + : 7DA0 +F93E CJK COMPATIBILITY IDEOGRAPH-F93E + : 83C9 +F93F CJK COMPATIBILITY IDEOGRAPH-F93F + : 9304 +F940 CJK COMPATIBILITY IDEOGRAPH-F940 + : 9E7F +F941 CJK COMPATIBILITY IDEOGRAPH-F941 + : 8AD6 +F942 CJK COMPATIBILITY IDEOGRAPH-F942 + : 58DF +F943 CJK COMPATIBILITY IDEOGRAPH-F943 + : 5F04 +F944 CJK COMPATIBILITY IDEOGRAPH-F944 + : 7C60 +F945 CJK COMPATIBILITY IDEOGRAPH-F945 + : 807E +F946 CJK COMPATIBILITY IDEOGRAPH-F946 + : 7262 +F947 CJK COMPATIBILITY IDEOGRAPH-F947 + : 78CA +F948 CJK COMPATIBILITY IDEOGRAPH-F948 + : 8CC2 +F949 CJK COMPATIBILITY IDEOGRAPH-F949 + : 96F7 +F94A CJK COMPATIBILITY IDEOGRAPH-F94A + : 58D8 +F94B CJK COMPATIBILITY IDEOGRAPH-F94B + : 5C62 +F94C CJK COMPATIBILITY IDEOGRAPH-F94C + : 6A13 +F94D CJK COMPATIBILITY IDEOGRAPH-F94D + : 6DDA +F94E CJK COMPATIBILITY IDEOGRAPH-F94E + : 6F0F +F94F CJK COMPATIBILITY IDEOGRAPH-F94F + : 7D2F +F950 CJK COMPATIBILITY IDEOGRAPH-F950 + : 7E37 +F951 CJK COMPATIBILITY IDEOGRAPH-F951 + : 964B +F952 CJK COMPATIBILITY IDEOGRAPH-F952 + : 52D2 +F953 CJK COMPATIBILITY IDEOGRAPH-F953 + : 808B +F954 CJK COMPATIBILITY IDEOGRAPH-F954 + : 51DC +F955 CJK COMPATIBILITY IDEOGRAPH-F955 + : 51CC +F956 CJK COMPATIBILITY IDEOGRAPH-F956 + : 7A1C +F957 CJK COMPATIBILITY IDEOGRAPH-F957 + : 7DBE +F958 CJK COMPATIBILITY IDEOGRAPH-F958 + : 83F1 +F959 CJK COMPATIBILITY IDEOGRAPH-F959 + : 9675 +F95A CJK COMPATIBILITY IDEOGRAPH-F95A + : 8B80 +F95B CJK COMPATIBILITY IDEOGRAPH-F95B + : 62CF +F95C CJK COMPATIBILITY IDEOGRAPH-F95C + : 6A02 +F95D CJK COMPATIBILITY IDEOGRAPH-F95D + : 8AFE +F95E CJK COMPATIBILITY IDEOGRAPH-F95E + : 4E39 +F95F CJK COMPATIBILITY IDEOGRAPH-F95F + : 5BE7 +F960 CJK COMPATIBILITY IDEOGRAPH-F960 + : 6012 +F961 CJK COMPATIBILITY IDEOGRAPH-F961 + : 7387 +F962 CJK COMPATIBILITY IDEOGRAPH-F962 + : 7570 +F963 CJK COMPATIBILITY IDEOGRAPH-F963 + : 5317 +F964 CJK COMPATIBILITY IDEOGRAPH-F964 + : 78FB +F965 CJK COMPATIBILITY IDEOGRAPH-F965 + : 4FBF +F966 CJK COMPATIBILITY IDEOGRAPH-F966 + : 5FA9 +F967 CJK COMPATIBILITY IDEOGRAPH-F967 + : 4E0D +F968 CJK COMPATIBILITY IDEOGRAPH-F968 + : 6CCC +F969 CJK COMPATIBILITY IDEOGRAPH-F969 + : 6578 +F96A CJK COMPATIBILITY IDEOGRAPH-F96A + : 7D22 +F96B CJK COMPATIBILITY IDEOGRAPH-F96B + : 53C3 +F96C CJK COMPATIBILITY IDEOGRAPH-F96C + : 585E +F96D CJK COMPATIBILITY IDEOGRAPH-F96D + : 7701 +F96E CJK COMPATIBILITY IDEOGRAPH-F96E + : 8449 +F96F CJK COMPATIBILITY IDEOGRAPH-F96F + : 8AAA +F970 CJK COMPATIBILITY IDEOGRAPH-F970 + : 6BBA +F971 CJK COMPATIBILITY IDEOGRAPH-F971 + : 8FB0 +F972 CJK COMPATIBILITY IDEOGRAPH-F972 + : 6C88 +F973 CJK COMPATIBILITY IDEOGRAPH-F973 + : 62FE +F974 CJK COMPATIBILITY IDEOGRAPH-F974 + : 82E5 +F975 CJK COMPATIBILITY IDEOGRAPH-F975 + : 63A0 +F976 CJK COMPATIBILITY IDEOGRAPH-F976 + : 7565 +F977 CJK COMPATIBILITY IDEOGRAPH-F977 + : 4EAE +F978 CJK COMPATIBILITY IDEOGRAPH-F978 + : 5169 +F979 CJK COMPATIBILITY IDEOGRAPH-F979 + : 51C9 +F97A CJK COMPATIBILITY IDEOGRAPH-F97A + : 6881 +F97B CJK COMPATIBILITY IDEOGRAPH-F97B + : 7CE7 +F97C CJK COMPATIBILITY IDEOGRAPH-F97C + : 826F +F97D CJK COMPATIBILITY IDEOGRAPH-F97D + : 8AD2 +F97E CJK COMPATIBILITY IDEOGRAPH-F97E + : 91CF +F97F CJK COMPATIBILITY IDEOGRAPH-F97F + : 52F5 +F980 CJK COMPATIBILITY IDEOGRAPH-F980 + : 5442 +F981 CJK COMPATIBILITY IDEOGRAPH-F981 + : 5973 +F982 CJK COMPATIBILITY IDEOGRAPH-F982 + : 5EEC +F983 CJK COMPATIBILITY IDEOGRAPH-F983 + : 65C5 +F984 CJK COMPATIBILITY IDEOGRAPH-F984 + : 6FFE +F985 CJK COMPATIBILITY IDEOGRAPH-F985 + : 792A +F986 CJK COMPATIBILITY IDEOGRAPH-F986 + : 95AD +F987 CJK COMPATIBILITY IDEOGRAPH-F987 + : 9A6A +F988 CJK COMPATIBILITY IDEOGRAPH-F988 + : 9E97 +F989 CJK COMPATIBILITY IDEOGRAPH-F989 + : 9ECE +F98A CJK COMPATIBILITY IDEOGRAPH-F98A + : 529B +F98B CJK COMPATIBILITY IDEOGRAPH-F98B + : 66C6 +F98C CJK COMPATIBILITY IDEOGRAPH-F98C + : 6B77 +F98D CJK COMPATIBILITY IDEOGRAPH-F98D + : 8F62 +F98E CJK COMPATIBILITY IDEOGRAPH-F98E + : 5E74 +F98F CJK COMPATIBILITY IDEOGRAPH-F98F + : 6190 +F990 CJK COMPATIBILITY IDEOGRAPH-F990 + : 6200 +F991 CJK COMPATIBILITY IDEOGRAPH-F991 + : 649A +F992 CJK COMPATIBILITY IDEOGRAPH-F992 + : 6F23 +F993 CJK COMPATIBILITY IDEOGRAPH-F993 + : 7149 +F994 CJK COMPATIBILITY IDEOGRAPH-F994 + : 7489 +F995 CJK COMPATIBILITY IDEOGRAPH-F995 + : 79CA +F996 CJK COMPATIBILITY IDEOGRAPH-F996 + : 7DF4 +F997 CJK COMPATIBILITY IDEOGRAPH-F997 + : 806F +F998 CJK COMPATIBILITY IDEOGRAPH-F998 + : 8F26 +F999 CJK COMPATIBILITY IDEOGRAPH-F999 + : 84EE +F99A CJK COMPATIBILITY IDEOGRAPH-F99A + : 9023 +F99B CJK COMPATIBILITY IDEOGRAPH-F99B + : 934A +F99C CJK COMPATIBILITY IDEOGRAPH-F99C + : 5217 +F99D CJK COMPATIBILITY IDEOGRAPH-F99D + : 52A3 +F99E CJK COMPATIBILITY IDEOGRAPH-F99E + : 54BD +F99F CJK COMPATIBILITY IDEOGRAPH-F99F + : 70C8 +F9A0 CJK COMPATIBILITY IDEOGRAPH-F9A0 + : 88C2 +F9A1 CJK COMPATIBILITY IDEOGRAPH-F9A1 + : 8AAA +F9A2 CJK COMPATIBILITY IDEOGRAPH-F9A2 + : 5EC9 +F9A3 CJK COMPATIBILITY IDEOGRAPH-F9A3 + : 5FF5 +F9A4 CJK COMPATIBILITY IDEOGRAPH-F9A4 + : 637B +F9A5 CJK COMPATIBILITY IDEOGRAPH-F9A5 + : 6BAE +F9A6 CJK COMPATIBILITY IDEOGRAPH-F9A6 + : 7C3E +F9A7 CJK COMPATIBILITY IDEOGRAPH-F9A7 + : 7375 +F9A8 CJK COMPATIBILITY IDEOGRAPH-F9A8 + : 4EE4 +F9A9 CJK COMPATIBILITY IDEOGRAPH-F9A9 + : 56F9 +F9AA CJK COMPATIBILITY IDEOGRAPH-F9AA + : 5BE7 +F9AB CJK COMPATIBILITY IDEOGRAPH-F9AB + : 5DBA +F9AC CJK COMPATIBILITY IDEOGRAPH-F9AC + : 601C +F9AD CJK COMPATIBILITY IDEOGRAPH-F9AD + : 73B2 +F9AE CJK COMPATIBILITY IDEOGRAPH-F9AE + : 7469 +F9AF CJK COMPATIBILITY IDEOGRAPH-F9AF + : 7F9A +F9B0 CJK COMPATIBILITY IDEOGRAPH-F9B0 + : 8046 +F9B1 CJK COMPATIBILITY IDEOGRAPH-F9B1 + : 9234 +F9B2 CJK COMPATIBILITY IDEOGRAPH-F9B2 + : 96F6 +F9B3 CJK COMPATIBILITY IDEOGRAPH-F9B3 + : 9748 +F9B4 CJK COMPATIBILITY IDEOGRAPH-F9B4 + : 9818 +F9B5 CJK COMPATIBILITY IDEOGRAPH-F9B5 + : 4F8B +F9B6 CJK COMPATIBILITY IDEOGRAPH-F9B6 + : 79AE +F9B7 CJK COMPATIBILITY IDEOGRAPH-F9B7 + : 91B4 +F9B8 CJK COMPATIBILITY IDEOGRAPH-F9B8 + x (cjk unified ideograph-96B7 - 96B7) + : 96B8 +F9B9 CJK COMPATIBILITY IDEOGRAPH-F9B9 + : 60E1 +F9BA CJK COMPATIBILITY IDEOGRAPH-F9BA + : 4E86 +F9BB CJK COMPATIBILITY IDEOGRAPH-F9BB + : 50DA +F9BC CJK COMPATIBILITY IDEOGRAPH-F9BC + : 5BEE +F9BD CJK COMPATIBILITY IDEOGRAPH-F9BD + : 5C3F +F9BE CJK COMPATIBILITY IDEOGRAPH-F9BE + : 6599 +F9BF CJK COMPATIBILITY IDEOGRAPH-F9BF + : 6A02 +F9C0 CJK COMPATIBILITY IDEOGRAPH-F9C0 + : 71CE +F9C1 CJK COMPATIBILITY IDEOGRAPH-F9C1 + : 7642 +F9C2 CJK COMPATIBILITY IDEOGRAPH-F9C2 + : 84FC +F9C3 CJK COMPATIBILITY IDEOGRAPH-F9C3 + : 907C +F9C4 CJK COMPATIBILITY IDEOGRAPH-F9C4 + : 9F8D +F9C5 CJK COMPATIBILITY IDEOGRAPH-F9C5 + : 6688 +F9C6 CJK COMPATIBILITY IDEOGRAPH-F9C6 + : 962E +F9C7 CJK COMPATIBILITY IDEOGRAPH-F9C7 + : 5289 +F9C8 CJK COMPATIBILITY IDEOGRAPH-F9C8 + : 677B +F9C9 CJK COMPATIBILITY IDEOGRAPH-F9C9 + : 67F3 +F9CA CJK COMPATIBILITY IDEOGRAPH-F9CA + : 6D41 +F9CB CJK COMPATIBILITY IDEOGRAPH-F9CB + : 6E9C +F9CC CJK COMPATIBILITY IDEOGRAPH-F9CC + : 7409 +F9CD CJK COMPATIBILITY IDEOGRAPH-F9CD + : 7559 +F9CE CJK COMPATIBILITY IDEOGRAPH-F9CE + : 786B +F9CF CJK COMPATIBILITY IDEOGRAPH-F9CF + : 7D10 +F9D0 CJK COMPATIBILITY IDEOGRAPH-F9D0 + : 985E +F9D1 CJK COMPATIBILITY IDEOGRAPH-F9D1 + : 516D +F9D2 CJK COMPATIBILITY IDEOGRAPH-F9D2 + : 622E +F9D3 CJK COMPATIBILITY IDEOGRAPH-F9D3 + : 9678 +F9D4 CJK COMPATIBILITY IDEOGRAPH-F9D4 + : 502B +F9D5 CJK COMPATIBILITY IDEOGRAPH-F9D5 + : 5D19 +F9D6 CJK COMPATIBILITY IDEOGRAPH-F9D6 + : 6DEA +F9D7 CJK COMPATIBILITY IDEOGRAPH-F9D7 + : 8F2A +F9D8 CJK COMPATIBILITY IDEOGRAPH-F9D8 + : 5F8B +F9D9 CJK COMPATIBILITY IDEOGRAPH-F9D9 + : 6144 +F9DA CJK COMPATIBILITY IDEOGRAPH-F9DA + : 6817 +F9DB CJK COMPATIBILITY IDEOGRAPH-F9DB + : 7387 +F9DC CJK COMPATIBILITY IDEOGRAPH-F9DC + : 9686 +F9DD CJK COMPATIBILITY IDEOGRAPH-F9DD + : 5229 +F9DE CJK COMPATIBILITY IDEOGRAPH-F9DE + : 540F +F9DF CJK COMPATIBILITY IDEOGRAPH-F9DF + : 5C65 +F9E0 CJK COMPATIBILITY IDEOGRAPH-F9E0 + : 6613 +F9E1 CJK COMPATIBILITY IDEOGRAPH-F9E1 + : 674E +F9E2 CJK COMPATIBILITY IDEOGRAPH-F9E2 + : 68A8 +F9E3 CJK COMPATIBILITY IDEOGRAPH-F9E3 + : 6CE5 +F9E4 CJK COMPATIBILITY IDEOGRAPH-F9E4 + : 7406 +F9E5 CJK COMPATIBILITY IDEOGRAPH-F9E5 + : 75E2 +F9E6 CJK COMPATIBILITY IDEOGRAPH-F9E6 + : 7F79 +F9E7 CJK COMPATIBILITY IDEOGRAPH-F9E7 + : 88CF +F9E8 CJK COMPATIBILITY IDEOGRAPH-F9E8 + : 88E1 +F9E9 CJK COMPATIBILITY IDEOGRAPH-F9E9 + : 91CC +F9EA CJK COMPATIBILITY IDEOGRAPH-F9EA + : 96E2 +F9EB CJK COMPATIBILITY IDEOGRAPH-F9EB + : 533F +F9EC CJK COMPATIBILITY IDEOGRAPH-F9EC + : 6EBA +F9ED CJK COMPATIBILITY IDEOGRAPH-F9ED + : 541D +F9EE CJK COMPATIBILITY IDEOGRAPH-F9EE + : 71D0 +F9EF CJK COMPATIBILITY IDEOGRAPH-F9EF + : 7498 +F9F0 CJK COMPATIBILITY IDEOGRAPH-F9F0 + : 85FA +F9F1 CJK COMPATIBILITY IDEOGRAPH-F9F1 + : 96A3 +F9F2 CJK COMPATIBILITY IDEOGRAPH-F9F2 + : 9C57 +F9F3 CJK COMPATIBILITY IDEOGRAPH-F9F3 + : 9E9F +F9F4 CJK COMPATIBILITY IDEOGRAPH-F9F4 + : 6797 +F9F5 CJK COMPATIBILITY IDEOGRAPH-F9F5 + : 6DCB +F9F6 CJK COMPATIBILITY IDEOGRAPH-F9F6 + : 81E8 +F9F7 CJK COMPATIBILITY IDEOGRAPH-F9F7 + : 7ACB +F9F8 CJK COMPATIBILITY IDEOGRAPH-F9F8 + : 7B20 +F9F9 CJK COMPATIBILITY IDEOGRAPH-F9F9 + : 7C92 +F9FA CJK COMPATIBILITY IDEOGRAPH-F9FA + : 72C0 +F9FB CJK COMPATIBILITY IDEOGRAPH-F9FB + : 7099 +F9FC CJK COMPATIBILITY IDEOGRAPH-F9FC + : 8B58 +F9FD CJK COMPATIBILITY IDEOGRAPH-F9FD + : 4EC0 +F9FE CJK COMPATIBILITY IDEOGRAPH-F9FE + : 8336 +F9FF CJK COMPATIBILITY IDEOGRAPH-F9FF + : 523A +FA00 CJK COMPATIBILITY IDEOGRAPH-FA00 + : 5207 +FA01 CJK COMPATIBILITY IDEOGRAPH-FA01 + : 5EA6 +FA02 CJK COMPATIBILITY IDEOGRAPH-FA02 + : 62D3 +FA03 CJK COMPATIBILITY IDEOGRAPH-FA03 + : 7CD6 +FA04 CJK COMPATIBILITY IDEOGRAPH-FA04 + : 5B85 +FA05 CJK COMPATIBILITY IDEOGRAPH-FA05 + : 6D1E +FA06 CJK COMPATIBILITY IDEOGRAPH-FA06 + : 66B4 +FA07 CJK COMPATIBILITY IDEOGRAPH-FA07 + : 8F3B +FA08 CJK COMPATIBILITY IDEOGRAPH-FA08 + : 884C +FA09 CJK COMPATIBILITY IDEOGRAPH-FA09 + : 964D +FA0A CJK COMPATIBILITY IDEOGRAPH-FA0A + : 898B +FA0B CJK COMPATIBILITY IDEOGRAPH-FA0B + : 5ED3 +@ Duplicates from Big 5 +FA0C CJK COMPATIBILITY IDEOGRAPH-FA0C + : 5140 +FA0D CJK COMPATIBILITY IDEOGRAPH-FA0D + : 55C0 +@ The IBM 32 compatibility ideographs +FA0E CJK COMPATIBILITY IDEOGRAPH-FA0E + * a unified CJK ideograph, not a compatibility ideograph, despite its name +FA0F CJK COMPATIBILITY IDEOGRAPH-FA0F + * a unified CJK ideograph, not a compatibility ideograph, despite its name +FA10 CJK COMPATIBILITY IDEOGRAPH-FA10 + : 585A +FA11 CJK COMPATIBILITY IDEOGRAPH-FA11 + * a unified CJK ideograph, not a compatibility ideograph, despite its name +FA12 CJK COMPATIBILITY IDEOGRAPH-FA12 + : 6674 +FA13 CJK COMPATIBILITY IDEOGRAPH-FA13 + * a unified CJK ideograph, not a compatibility ideograph, despite its name +FA14 CJK COMPATIBILITY IDEOGRAPH-FA14 + * a unified CJK ideograph, not a compatibility ideograph, despite its name +FA15 CJK COMPATIBILITY IDEOGRAPH-FA15 + : 51DE +FA16 CJK COMPATIBILITY IDEOGRAPH-FA16 + : 732A +FA17 CJK COMPATIBILITY IDEOGRAPH-FA17 + : 76CA +FA18 CJK COMPATIBILITY IDEOGRAPH-FA18 + : 793C +FA19 CJK COMPATIBILITY IDEOGRAPH-FA19 + : 795E +FA1A CJK COMPATIBILITY IDEOGRAPH-FA1A + : 7965 +FA1B CJK COMPATIBILITY IDEOGRAPH-FA1B + : 798F +FA1C CJK COMPATIBILITY IDEOGRAPH-FA1C + : 9756 +FA1D CJK COMPATIBILITY IDEOGRAPH-FA1D + : 7CBE +FA1E CJK COMPATIBILITY IDEOGRAPH-FA1E + : 7FBD +FA1F CJK COMPATIBILITY IDEOGRAPH-FA1F * + * a unified CJK ideograph, not a compatibility ideograph, despite its name +FA20 CJK COMPATIBILITY IDEOGRAPH-FA20 + : 8612 +FA21 CJK COMPATIBILITY IDEOGRAPH-FA21 + * a unified CJK ideograph, not a compatibility ideograph, despite its name +FA22 CJK COMPATIBILITY IDEOGRAPH-FA22 + : 8AF8 +FA23 CJK COMPATIBILITY IDEOGRAPH-FA23 * + * a unified CJK ideograph, not a compatibility ideograph, despite its name +FA24 CJK COMPATIBILITY IDEOGRAPH-FA24 + * a unified CJK ideograph, not a compatibility ideograph, despite its name +FA25 CJK COMPATIBILITY IDEOGRAPH-FA25 + : 9038 +FA26 CJK COMPATIBILITY IDEOGRAPH-FA26 + : 90FD +FA27 CJK COMPATIBILITY IDEOGRAPH-FA27 + * a unified CJK ideograph, not a compatibility ideograph, despite its name +FA28 CJK COMPATIBILITY IDEOGRAPH-FA28 + * a unified CJK ideograph, not a compatibility ideograph, despite its name +FA29 CJK COMPATIBILITY IDEOGRAPH-FA29 + * a unified CJK ideograph, not a compatibility ideograph, despite its name +FA2A CJK COMPATIBILITY IDEOGRAPH-FA2A + : 98EF +FA2B CJK COMPATIBILITY IDEOGRAPH-FA2B + : 98FC +FA2C CJK COMPATIBILITY IDEOGRAPH-FA2C + : 9928 +FA2D CJK COMPATIBILITY IDEOGRAPH-FA2D + : 9DB4 +@ JIS X 0213 compatibility ideographs +FA30 CJK COMPATIBILITY IDEOGRAPH-FA30 + : 4FAE +FA31 CJK COMPATIBILITY IDEOGRAPH-FA31 + : 50E7 +FA32 CJK COMPATIBILITY IDEOGRAPH-FA32 + : 514D +FA33 CJK COMPATIBILITY IDEOGRAPH-FA33 + : 52C9 +FA34 CJK COMPATIBILITY IDEOGRAPH-FA34 + : 52E4 +FA35 CJK COMPATIBILITY IDEOGRAPH-FA35 + : 5351 +FA36 CJK COMPATIBILITY IDEOGRAPH-FA36 + : 559D +FA37 CJK COMPATIBILITY IDEOGRAPH-FA37 + : 5606 +FA38 CJK COMPATIBILITY IDEOGRAPH-FA38 + : 5668 +FA39 CJK COMPATIBILITY IDEOGRAPH-FA39 + : 5840 +FA3A CJK COMPATIBILITY IDEOGRAPH-FA3A + : 58A8 +FA3B CJK COMPATIBILITY IDEOGRAPH-FA3B + : 5C64 +FA3C CJK COMPATIBILITY IDEOGRAPH-FA3C + : 5C6E +FA3D CJK COMPATIBILITY IDEOGRAPH-FA3D + : 6094 +FA3E CJK COMPATIBILITY IDEOGRAPH-FA3E + : 6168 +FA3F CJK COMPATIBILITY IDEOGRAPH-FA3F + : 618E +FA40 CJK COMPATIBILITY IDEOGRAPH-FA40 + : 61F2 +FA41 CJK COMPATIBILITY IDEOGRAPH-FA41 + : 654F +FA42 CJK COMPATIBILITY IDEOGRAPH-FA42 + : 65E2 +FA43 CJK COMPATIBILITY IDEOGRAPH-FA43 + : 6691 +FA44 CJK COMPATIBILITY IDEOGRAPH-FA44 + : 6885 +FA45 CJK COMPATIBILITY IDEOGRAPH-FA45 + : 6D77 +FA46 CJK COMPATIBILITY IDEOGRAPH-FA46 + : 6E1A +FA47 CJK COMPATIBILITY IDEOGRAPH-FA47 + : 6F22 +FA48 CJK COMPATIBILITY IDEOGRAPH-FA48 + : 716E +FA49 CJK COMPATIBILITY IDEOGRAPH-FA49 + : 722B +FA4A CJK COMPATIBILITY IDEOGRAPH-FA4A + : 7422 +FA4B CJK COMPATIBILITY IDEOGRAPH-FA4B + : 7891 +FA4C CJK COMPATIBILITY IDEOGRAPH-FA4C + : 793E +FA4D CJK COMPATIBILITY IDEOGRAPH-FA4D + : 7949 +FA4E CJK COMPATIBILITY IDEOGRAPH-FA4E + : 7948 +FA4F CJK COMPATIBILITY IDEOGRAPH-FA4F + : 7950 +FA50 CJK COMPATIBILITY IDEOGRAPH-FA50 + : 7956 +FA51 CJK COMPATIBILITY IDEOGRAPH-FA51 + : 795D +FA52 CJK COMPATIBILITY IDEOGRAPH-FA52 + : 798D +FA53 CJK COMPATIBILITY IDEOGRAPH-FA53 + : 798E +FA54 CJK COMPATIBILITY IDEOGRAPH-FA54 + : 7A40 +FA55 CJK COMPATIBILITY IDEOGRAPH-FA55 + : 7A81 +FA56 CJK COMPATIBILITY IDEOGRAPH-FA56 + : 7BC0 +FA57 CJK COMPATIBILITY IDEOGRAPH-FA57 + : 7DF4 +FA58 CJK COMPATIBILITY IDEOGRAPH-FA58 + : 7E09 +FA59 CJK COMPATIBILITY IDEOGRAPH-FA59 + : 7E41 +FA5A CJK COMPATIBILITY IDEOGRAPH-FA5A + : 7F72 +FA5B CJK COMPATIBILITY IDEOGRAPH-FA5B + : 8005 +FA5C CJK COMPATIBILITY IDEOGRAPH-FA5C + : 81ED +FA5D CJK COMPATIBILITY IDEOGRAPH-FA5D + : 8279 +FA5E CJK COMPATIBILITY IDEOGRAPH-FA5E + : 8279 +FA5F CJK COMPATIBILITY IDEOGRAPH-FA5F + : 8457 +FA60 CJK COMPATIBILITY IDEOGRAPH-FA60 + : 8910 +FA61 CJK COMPATIBILITY IDEOGRAPH-FA61 + : 8996 +FA62 CJK COMPATIBILITY IDEOGRAPH-FA62 + : 8B01 +FA63 CJK COMPATIBILITY IDEOGRAPH-FA63 + : 8B39 +FA64 CJK COMPATIBILITY IDEOGRAPH-FA64 + : 8CD3 +FA65 CJK COMPATIBILITY IDEOGRAPH-FA65 + : 8D08 +FA66 CJK COMPATIBILITY IDEOGRAPH-FA66 + : 8FB6 +FA67 CJK COMPATIBILITY IDEOGRAPH-FA67 + : 9038 +FA68 CJK COMPATIBILITY IDEOGRAPH-FA68 + : 96E3 +FA69 CJK COMPATIBILITY IDEOGRAPH-FA69 + : 97FF +FA6A CJK COMPATIBILITY IDEOGRAPH-FA6A + : 983B +@ DPRK compatibility ideographs +FA70 CJK COMPATIBILITY IDEOGRAPH-FA70 + : 4E26 +FA71 CJK COMPATIBILITY IDEOGRAPH-FA71 + : 51B5 +FA72 CJK COMPATIBILITY IDEOGRAPH-FA72 + : 5168 +FA73 CJK COMPATIBILITY IDEOGRAPH-FA73 + : 4F80 +FA74 CJK COMPATIBILITY IDEOGRAPH-FA74 + : 5145 +FA75 CJK COMPATIBILITY IDEOGRAPH-FA75 + : 5180 +FA76 CJK COMPATIBILITY IDEOGRAPH-FA76 + : 52C7 +FA77 CJK COMPATIBILITY IDEOGRAPH-FA77 + : 52FA +FA78 CJK COMPATIBILITY IDEOGRAPH-FA78 + : 559D +FA79 CJK COMPATIBILITY IDEOGRAPH-FA79 + : 5555 +FA7A CJK COMPATIBILITY IDEOGRAPH-FA7A + : 5599 +FA7B CJK COMPATIBILITY IDEOGRAPH-FA7B + : 55E2 +FA7C CJK COMPATIBILITY IDEOGRAPH-FA7C + : 585A +FA7D CJK COMPATIBILITY IDEOGRAPH-FA7D + : 58B3 +FA7E CJK COMPATIBILITY IDEOGRAPH-FA7E + : 5944 +FA7F CJK COMPATIBILITY IDEOGRAPH-FA7F + : 5954 +FA80 CJK COMPATIBILITY IDEOGRAPH-FA80 + : 5A62 +FA81 CJK COMPATIBILITY IDEOGRAPH-FA81 + : 5B28 +FA82 CJK COMPATIBILITY IDEOGRAPH-FA82 + : 5ED2 +FA83 CJK COMPATIBILITY IDEOGRAPH-FA83 + : 5ED9 +FA84 CJK COMPATIBILITY IDEOGRAPH-FA84 + : 5F69 +FA85 CJK COMPATIBILITY IDEOGRAPH-FA85 + : 5FAD +FA86 CJK COMPATIBILITY IDEOGRAPH-FA86 + : 60D8 +FA87 CJK COMPATIBILITY IDEOGRAPH-FA87 + : 614E +FA88 CJK COMPATIBILITY IDEOGRAPH-FA88 + : 6108 +FA89 CJK COMPATIBILITY IDEOGRAPH-FA89 + : 618E +FA8A CJK COMPATIBILITY IDEOGRAPH-FA8A + : 6160 +FA8B CJK COMPATIBILITY IDEOGRAPH-FA8B + : 61F2 +FA8C CJK COMPATIBILITY IDEOGRAPH-FA8C + : 6234 +FA8D CJK COMPATIBILITY IDEOGRAPH-FA8D + : 63C4 +FA8E CJK COMPATIBILITY IDEOGRAPH-FA8E + : 641C +FA8F CJK COMPATIBILITY IDEOGRAPH-FA8F + : 6452 +FA90 CJK COMPATIBILITY IDEOGRAPH-FA90 + : 6556 +FA91 CJK COMPATIBILITY IDEOGRAPH-FA91 + : 6674 +FA92 CJK COMPATIBILITY IDEOGRAPH-FA92 + : 6717 +FA93 CJK COMPATIBILITY IDEOGRAPH-FA93 + : 671B +FA94 CJK COMPATIBILITY IDEOGRAPH-FA94 + : 6756 +FA95 CJK COMPATIBILITY IDEOGRAPH-FA95 + : 6B79 +FA96 CJK COMPATIBILITY IDEOGRAPH-FA96 + : 6BBA +FA97 CJK COMPATIBILITY IDEOGRAPH-FA97 + : 6D41 +FA98 CJK COMPATIBILITY IDEOGRAPH-FA98 + : 6EDB +FA99 CJK COMPATIBILITY IDEOGRAPH-FA99 + : 6ECB +FA9A CJK COMPATIBILITY IDEOGRAPH-FA9A + : 6F22 +FA9B CJK COMPATIBILITY IDEOGRAPH-FA9B + : 701E +FA9C CJK COMPATIBILITY IDEOGRAPH-FA9C + : 716E +FA9D CJK COMPATIBILITY IDEOGRAPH-FA9D + : 77A7 +FA9E CJK COMPATIBILITY IDEOGRAPH-FA9E + : 7235 +FA9F CJK COMPATIBILITY IDEOGRAPH-FA9F + : 72AF +FAA0 CJK COMPATIBILITY IDEOGRAPH-FAA0 + : 732A +FAA1 CJK COMPATIBILITY IDEOGRAPH-FAA1 + : 7471 +FAA2 CJK COMPATIBILITY IDEOGRAPH-FAA2 + : 7506 +FAA3 CJK COMPATIBILITY IDEOGRAPH-FAA3 + : 753B +FAA4 CJK COMPATIBILITY IDEOGRAPH-FAA4 + : 761D +FAA5 CJK COMPATIBILITY IDEOGRAPH-FAA5 + : 761F +FAA6 CJK COMPATIBILITY IDEOGRAPH-FAA6 + : 76CA +FAA7 CJK COMPATIBILITY IDEOGRAPH-FAA7 + : 76DB +FAA8 CJK COMPATIBILITY IDEOGRAPH-FAA8 + : 76F4 +FAA9 CJK COMPATIBILITY IDEOGRAPH-FAA9 + : 774A +FAAA CJK COMPATIBILITY IDEOGRAPH-FAAA + : 7740 +FAAB CJK COMPATIBILITY IDEOGRAPH-FAAB + : 78CC +FAAC CJK COMPATIBILITY IDEOGRAPH-FAAC + : 7AB1 +FAAD CJK COMPATIBILITY IDEOGRAPH-FAAD + : 7BC0 +FAAE CJK COMPATIBILITY IDEOGRAPH-FAAE + : 7C7B +FAAF CJK COMPATIBILITY IDEOGRAPH-FAAF + : 7D5B +FAB0 CJK COMPATIBILITY IDEOGRAPH-FAB0 + : 7DF4 +FAB1 CJK COMPATIBILITY IDEOGRAPH-FAB1 + : 7F3E +FAB2 CJK COMPATIBILITY IDEOGRAPH-FAB2 + : 8005 +FAB3 CJK COMPATIBILITY IDEOGRAPH-FAB3 + : 8352 +FAB4 CJK COMPATIBILITY IDEOGRAPH-FAB4 + : 83EF +FAB5 CJK COMPATIBILITY IDEOGRAPH-FAB5 + : 8779 +FAB6 CJK COMPATIBILITY IDEOGRAPH-FAB6 + : 8941 +FAB7 CJK COMPATIBILITY IDEOGRAPH-FAB7 + : 8986 +FAB8 CJK COMPATIBILITY IDEOGRAPH-FAB8 + : 8996 +FAB9 CJK COMPATIBILITY IDEOGRAPH-FAB9 + : 8ABF +FABA CJK COMPATIBILITY IDEOGRAPH-FABA + : 8AF8 +FABB CJK COMPATIBILITY IDEOGRAPH-FABB + : 8ACB +FABC CJK COMPATIBILITY IDEOGRAPH-FABC + : 8B01 +FABD CJK COMPATIBILITY IDEOGRAPH-FABD + : 8AFE +FABE CJK COMPATIBILITY IDEOGRAPH-FABE + : 8AED +FABF CJK COMPATIBILITY IDEOGRAPH-FABF + : 8B39 +FAC0 CJK COMPATIBILITY IDEOGRAPH-FAC0 + : 8B8A +FAC1 CJK COMPATIBILITY IDEOGRAPH-FAC1 + : 8D08 +FAC2 CJK COMPATIBILITY IDEOGRAPH-FAC2 + : 8F38 +FAC3 CJK COMPATIBILITY IDEOGRAPH-FAC3 + : 9072 +FAC4 CJK COMPATIBILITY IDEOGRAPH-FAC4 + : 9199 +FAC5 CJK COMPATIBILITY IDEOGRAPH-FAC5 + : 9276 +FAC6 CJK COMPATIBILITY IDEOGRAPH-FAC6 + : 967C +FAC7 CJK COMPATIBILITY IDEOGRAPH-FAC7 + : 96E3 +FAC8 CJK COMPATIBILITY IDEOGRAPH-FAC8 + : 9756 +FAC9 CJK COMPATIBILITY IDEOGRAPH-FAC9 + : 97DB +FACA CJK COMPATIBILITY IDEOGRAPH-FACA + : 97FF +FACB CJK COMPATIBILITY IDEOGRAPH-FACB + : 980B +FACC CJK COMPATIBILITY IDEOGRAPH-FACC + : 983B +FACD CJK COMPATIBILITY IDEOGRAPH-FACD + : 9B12 +FACE CJK COMPATIBILITY IDEOGRAPH-FACE + : 9F9C +FACF CJK COMPATIBILITY IDEOGRAPH-FACF + : 2284A +FAD0 CJK COMPATIBILITY IDEOGRAPH-FAD0 + : 22844 +FAD1 CJK COMPATIBILITY IDEOGRAPH-FAD1 + : 233D5 +FAD2 CJK COMPATIBILITY IDEOGRAPH-FAD2 + : 3B9D +FAD3 CJK COMPATIBILITY IDEOGRAPH-FAD3 + : 4018 +FAD4 CJK COMPATIBILITY IDEOGRAPH-FAD4 + : 4039 +FAD5 CJK COMPATIBILITY IDEOGRAPH-FAD5 + : 25249 +FAD6 CJK COMPATIBILITY IDEOGRAPH-FAD6 + : 25CD0 +FAD7 CJK COMPATIBILITY IDEOGRAPH-FAD7 + : 27ED3 +FAD8 CJK COMPATIBILITY IDEOGRAPH-FAD8 + : 9F43 +FAD9 CJK COMPATIBILITY IDEOGRAPH-FAD9 + : 9F8E +@@ FB00 Alphabetic Presentation Forms FB4F +@ Latin ligatures +@+ See the Basic Latin block starting at 0020 +FB00 LATIN SMALL LIGATURE FF + # 0066 0066 +FB01 LATIN SMALL LIGATURE FI + # 0066 0069 +FB02 LATIN SMALL LIGATURE FL + # 0066 006C +FB03 LATIN SMALL LIGATURE FFI + # 0066 0066 0069 +FB04 LATIN SMALL LIGATURE FFL + # 0066 0066 006C +FB05 LATIN SMALL LIGATURE LONG S T + # 017F 0074 +FB06 LATIN SMALL LIGATURE ST + # 0073 0074 +@ Armenian ligatures +@+ See the Armenian block starting at 0530 +FB13 ARMENIAN SMALL LIGATURE MEN NOW + # 0574 0576 +FB14 ARMENIAN SMALL LIGATURE MEN ECH + # 0574 0565 +FB15 ARMENIAN SMALL LIGATURE MEN INI + # 0574 056B +FB16 ARMENIAN SMALL LIGATURE VEW NOW + # 057E 0576 +FB17 ARMENIAN SMALL LIGATURE MEN XEH + # 0574 056D +@ Hebrew presentation forms +@+ See the Hebrew block starting at 0590 +FB1D HEBREW LETTER YOD WITH HIRIQ + : 05D9 05B4 +FB1E HEBREW POINT JUDEO-SPANISH VARIKA + * a glyph variant of 05BF +FB1F HEBREW LIGATURE YIDDISH YOD YOD PATAH + : 05F2 05B7 +FB20 HEBREW LETTER ALTERNATIVE AYIN + * this form of AYIN has no descender, for use with marks placed below the letter + # <font> 05E2 hebrew letter ayin +FB21 HEBREW LETTER WIDE ALEF + # <font> 05D0 hebrew letter alef +FB22 HEBREW LETTER WIDE DALET + # <font> 05D3 hebrew letter dalet +FB23 HEBREW LETTER WIDE HE + # <font> 05D4 hebrew letter he +FB24 HEBREW LETTER WIDE KAF + # <font> 05DB hebrew letter kaf +FB25 HEBREW LETTER WIDE LAMED + # <font> 05DC hebrew letter lamed +FB26 HEBREW LETTER WIDE FINAL MEM + # <font> 05DD hebrew letter final mem +FB27 HEBREW LETTER WIDE RESH + # <font> 05E8 hebrew letter resh +FB28 HEBREW LETTER WIDE TAV + # <font> 05EA hebrew letter tav +FB29 HEBREW LETTER ALTERNATIVE PLUS SIGN + # <font> 002B plus sign +FB2A HEBREW LETTER SHIN WITH SHIN DOT + : 05E9 05C1 +FB2B HEBREW LETTER SHIN WITH SIN DOT + : 05E9 05C2 +FB2C HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT + : FB49 05C1 +FB2D HEBREW LETTER SHIN WITH DAGESH AND SIN DOT + : FB49 05C2 +FB2E HEBREW LETTER ALEF WITH PATAH + : 05D0 05B7 +FB2F HEBREW LETTER ALEF WITH QAMATS + : 05D0 05B8 +FB30 HEBREW LETTER ALEF WITH MAPIQ + : 05D0 05BC +FB31 HEBREW LETTER BET WITH DAGESH + : 05D1 05BC +FB32 HEBREW LETTER GIMEL WITH DAGESH + : 05D2 05BC +FB33 HEBREW LETTER DALET WITH DAGESH + : 05D3 05BC +FB34 HEBREW LETTER HE WITH MAPIQ + : 05D4 05BC +FB35 HEBREW LETTER VAV WITH DAGESH + : 05D5 05BC +FB36 HEBREW LETTER ZAYIN WITH DAGESH + : 05D6 05BC +FB38 HEBREW LETTER TET WITH DAGESH + : 05D8 05BC +FB39 HEBREW LETTER YOD WITH DAGESH + : 05D9 05BC +FB3A HEBREW LETTER FINAL KAF WITH DAGESH + : 05DA 05BC +FB3B HEBREW LETTER KAF WITH DAGESH + : 05DB 05BC +FB3C HEBREW LETTER LAMED WITH DAGESH + : 05DC 05BC +FB3E HEBREW LETTER MEM WITH DAGESH + : 05DE 05BC +FB40 HEBREW LETTER NUN WITH DAGESH + : 05E0 05BC +FB41 HEBREW LETTER SAMEKH WITH DAGESH + : 05E1 05BC +FB43 HEBREW LETTER FINAL PE WITH DAGESH + : 05E3 05BC +FB44 HEBREW LETTER PE WITH DAGESH + : 05E4 05BC +FB46 HEBREW LETTER TSADI WITH DAGESH + : 05E6 05BC +FB47 HEBREW LETTER QOF WITH DAGESH + : 05E7 05BC +FB48 HEBREW LETTER RESH WITH DAGESH + : 05E8 05BC +FB49 HEBREW LETTER SHIN WITH DAGESH + : 05E9 05BC +FB4A HEBREW LETTER TAV WITH DAGESH + : 05EA 05BC +FB4B HEBREW LETTER VAV WITH HOLAM + : 05D5 05B9 +FB4C HEBREW LETTER BET WITH RAFE + : 05D1 05BF +FB4D HEBREW LETTER KAF WITH RAFE + : 05DB 05BF +FB4E HEBREW LETTER PE WITH RAFE + : 05E4 05BF +FB4F HEBREW LIGATURE ALEF LAMED + # 05D0 05DC +@@ FB50 Arabic Presentation Forms-A FDFF +@+ Preferred characters are found in the Arabic block 0600 - 06FF. +@ Glyphs for contextual forms of letters for Persian, Urdu, Sindhi, etc. +FB50 ARABIC LETTER ALEF WASLA ISOLATED FORM + # <isolated> 0671 +FB51 ARABIC LETTER ALEF WASLA FINAL FORM + # <final> 0671 +FB52 ARABIC LETTER BEEH ISOLATED FORM + # <isolated> 067B +FB53 ARABIC LETTER BEEH FINAL FORM + # <final> 067B +FB54 ARABIC LETTER BEEH INITIAL FORM + # <initial> 067B +FB55 ARABIC LETTER BEEH MEDIAL FORM + # <medial> 067B +FB56 ARABIC LETTER PEH ISOLATED FORM + # <isolated> 067E +FB57 ARABIC LETTER PEH FINAL FORM + # <final> 067E +FB58 ARABIC LETTER PEH INITIAL FORM + # <initial> 067E +FB59 ARABIC LETTER PEH MEDIAL FORM + # <medial> 067E +FB5A ARABIC LETTER BEHEH ISOLATED FORM + # <isolated> 0680 +FB5B ARABIC LETTER BEHEH FINAL FORM + # <final> 0680 +FB5C ARABIC LETTER BEHEH INITIAL FORM + # <initial> 0680 +FB5D ARABIC LETTER BEHEH MEDIAL FORM + # <medial> 0680 +FB5E ARABIC LETTER TTEHEH ISOLATED FORM + # <isolated> 067A +FB5F ARABIC LETTER TTEHEH FINAL FORM + # <final> 067A +FB60 ARABIC LETTER TTEHEH INITIAL FORM + # <initial> 067A +FB61 ARABIC LETTER TTEHEH MEDIAL FORM + # <medial> 067A +FB62 ARABIC LETTER TEHEH ISOLATED FORM + # <isolated> 067F +FB63 ARABIC LETTER TEHEH FINAL FORM + # <final> 067F +FB64 ARABIC LETTER TEHEH INITIAL FORM + # <initial> 067F +FB65 ARABIC LETTER TEHEH MEDIAL FORM + # <medial> 067F +FB66 ARABIC LETTER TTEH ISOLATED FORM + # <isolated> 0679 +FB67 ARABIC LETTER TTEH FINAL FORM + # <final> 0679 +FB68 ARABIC LETTER TTEH INITIAL FORM + # <initial> 0679 +FB69 ARABIC LETTER TTEH MEDIAL FORM + # <medial> 0679 +FB6A ARABIC LETTER VEH ISOLATED FORM + # <isolated> 06A4 +FB6B ARABIC LETTER VEH FINAL FORM + # <final> 06A4 +FB6C ARABIC LETTER VEH INITIAL FORM + # <initial> 06A4 +FB6D ARABIC LETTER VEH MEDIAL FORM + # <medial> 06A4 +FB6E ARABIC LETTER PEHEH ISOLATED FORM + # <isolated> 06A6 +FB6F ARABIC LETTER PEHEH FINAL FORM + # <final> 06A6 +FB70 ARABIC LETTER PEHEH INITIAL FORM + # <initial> 06A6 +FB71 ARABIC LETTER PEHEH MEDIAL FORM + # <medial> 06A6 +FB72 ARABIC LETTER DYEH ISOLATED FORM + # <isolated> 0684 +FB73 ARABIC LETTER DYEH FINAL FORM + # <final> 0684 +FB74 ARABIC LETTER DYEH INITIAL FORM + # <initial> 0684 +FB75 ARABIC LETTER DYEH MEDIAL FORM + # <medial> 0684 +FB76 ARABIC LETTER NYEH ISOLATED FORM + # <isolated> 0683 +FB77 ARABIC LETTER NYEH FINAL FORM + # <final> 0683 +FB78 ARABIC LETTER NYEH INITIAL FORM + # <initial> 0683 +FB79 ARABIC LETTER NYEH MEDIAL FORM + # <medial> 0683 +FB7A ARABIC LETTER TCHEH ISOLATED FORM + # <isolated> 0686 +FB7B ARABIC LETTER TCHEH FINAL FORM + # <final> 0686 +FB7C ARABIC LETTER TCHEH INITIAL FORM + # <initial> 0686 +FB7D ARABIC LETTER TCHEH MEDIAL FORM + # <medial> 0686 +FB7E ARABIC LETTER TCHEHEH ISOLATED FORM + # <isolated> 0687 +FB7F ARABIC LETTER TCHEHEH FINAL FORM + # <final> 0687 +FB80 ARABIC LETTER TCHEHEH INITIAL FORM + # <initial> 0687 +FB81 ARABIC LETTER TCHEHEH MEDIAL FORM + # <medial> 0687 +FB82 ARABIC LETTER DDAHAL ISOLATED FORM + # <isolated> 068D +FB83 ARABIC LETTER DDAHAL FINAL FORM + # <final> 068D +FB84 ARABIC LETTER DAHAL ISOLATED FORM + # <isolated> 068C +FB85 ARABIC LETTER DAHAL FINAL FORM + # <final> 068C +FB86 ARABIC LETTER DUL ISOLATED FORM + # <isolated> 068E +FB87 ARABIC LETTER DUL FINAL FORM + # <final> 068E +FB88 ARABIC LETTER DDAL ISOLATED FORM + # <isolated> 0688 +FB89 ARABIC LETTER DDAL FINAL FORM + # <final> 0688 +FB8A ARABIC LETTER JEH ISOLATED FORM + # <isolated> 0698 +FB8B ARABIC LETTER JEH FINAL FORM + # <final> 0698 +FB8C ARABIC LETTER RREH ISOLATED FORM + # <isolated> 0691 +FB8D ARABIC LETTER RREH FINAL FORM + # <final> 0691 +FB8E ARABIC LETTER KEHEH ISOLATED FORM + # <isolated> 06A9 +FB8F ARABIC LETTER KEHEH FINAL FORM + # <final> 06A9 +FB90 ARABIC LETTER KEHEH INITIAL FORM + # <initial> 06A9 +FB91 ARABIC LETTER KEHEH MEDIAL FORM + # <medial> 06A9 +FB92 ARABIC LETTER GAF ISOLATED FORM + # <isolated> 06AF +FB93 ARABIC LETTER GAF FINAL FORM + # <final> 06AF +FB94 ARABIC LETTER GAF INITIAL FORM + # <initial> 06AF +FB95 ARABIC LETTER GAF MEDIAL FORM + # <medial> 06AF +FB96 ARABIC LETTER GUEH ISOLATED FORM + # <isolated> 06B3 +FB97 ARABIC LETTER GUEH FINAL FORM + # <final> 06B3 +FB98 ARABIC LETTER GUEH INITIAL FORM + # <initial> 06B3 +FB99 ARABIC LETTER GUEH MEDIAL FORM + # <medial> 06B3 +FB9A ARABIC LETTER NGOEH ISOLATED FORM + # <isolated> 06B1 +FB9B ARABIC LETTER NGOEH FINAL FORM + # <final> 06B1 +FB9C ARABIC LETTER NGOEH INITIAL FORM + # <initial> 06B1 +FB9D ARABIC LETTER NGOEH MEDIAL FORM + # <medial> 06B1 +FB9E ARABIC LETTER NOON GHUNNA ISOLATED FORM + # <isolated> 06BA +FB9F ARABIC LETTER NOON GHUNNA FINAL FORM + # <final> 06BA +FBA0 ARABIC LETTER RNOON ISOLATED FORM + # <isolated> 06BB +FBA1 ARABIC LETTER RNOON FINAL FORM + # <final> 06BB +FBA2 ARABIC LETTER RNOON INITIAL FORM + # <initial> 06BB +FBA3 ARABIC LETTER RNOON MEDIAL FORM + # <medial> 06BB +FBA4 ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM + # <isolated> 06C0 +FBA5 ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM + # <final> 06C0 +FBA6 ARABIC LETTER HEH GOAL ISOLATED FORM + # <isolated> 06C1 +FBA7 ARABIC LETTER HEH GOAL FINAL FORM + # <final> 06C1 +FBA8 ARABIC LETTER HEH GOAL INITIAL FORM + # <initial> 06C1 +FBA9 ARABIC LETTER HEH GOAL MEDIAL FORM + # <medial> 06C1 +FBAA ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM + # <isolated> 06BE +FBAB ARABIC LETTER HEH DOACHASHMEE FINAL FORM + # <final> 06BE +FBAC ARABIC LETTER HEH DOACHASHMEE INITIAL FORM + # <initial> 06BE +FBAD ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM + # <medial> 06BE +FBAE ARABIC LETTER YEH BARREE ISOLATED FORM + # <isolated> 06D2 +FBAF ARABIC LETTER YEH BARREE FINAL FORM + # <final> 06D2 +FBB0 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM + # <isolated> 06D3 +FBB1 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM + # <final> 06D3 +@ Glyphs for contextual forms of letters for Central Asian languages +FBD3 ARABIC LETTER NG ISOLATED FORM + # <isolated> 06AD +FBD4 ARABIC LETTER NG FINAL FORM + # <final> 06AD +FBD5 ARABIC LETTER NG INITIAL FORM + # <initial> 06AD +FBD6 ARABIC LETTER NG MEDIAL FORM + # <medial> 06AD +FBD7 ARABIC LETTER U ISOLATED FORM + # <isolated> 06C7 +FBD8 ARABIC LETTER U FINAL FORM + # <final> 06C7 +FBD9 ARABIC LETTER OE ISOLATED FORM + # <isolated> 06C6 +FBDA ARABIC LETTER OE FINAL FORM + # <final> 06C6 +FBDB ARABIC LETTER YU ISOLATED FORM + # <isolated> 06C8 +FBDC ARABIC LETTER YU FINAL FORM + # <final> 06C8 +FBDD ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM + # <isolated> 0677 +FBDE ARABIC LETTER VE ISOLATED FORM + # <isolated> 06CB +FBDF ARABIC LETTER VE FINAL FORM + # <final> 06CB +FBE0 ARABIC LETTER KIRGHIZ OE ISOLATED FORM + # <isolated> 06C5 +FBE1 ARABIC LETTER KIRGHIZ OE FINAL FORM + # <final> 06C5 +FBE2 ARABIC LETTER KIRGHIZ YU ISOLATED FORM + # <isolated> 06C9 +FBE3 ARABIC LETTER KIRGHIZ YU FINAL FORM + # <final> 06C9 +FBE4 ARABIC LETTER E ISOLATED FORM + # <isolated> 06D0 +FBE5 ARABIC LETTER E FINAL FORM + # <final> 06D0 +FBE6 ARABIC LETTER E INITIAL FORM + # <initial> 06D0 +FBE7 ARABIC LETTER E MEDIAL FORM + # <medial> 06D0 +FBE8 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM + # <initial> 0649 +FBE9 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM + # <medial> 0649 +@ Ligatures (two elements) +FBEA ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM + # <isolated> 0626 0627 +FBEB ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM + # <final> 0626 0627 +FBEC ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM + # <isolated> 0626 06D5 +FBED ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM + # <final> 0626 06D5 +FBEE ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM + # <isolated> 0626 0648 +FBEF ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM + # <final> 0626 0648 +FBF0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM + # <isolated> 0626 06C7 +FBF1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM + # <final> 0626 06C7 +FBF2 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM + # <isolated> 0626 06C6 +FBF3 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM + # <final> 0626 06C6 +FBF4 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM + # <isolated> 0626 06C8 +FBF5 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM + # <final> 0626 06C8 +FBF6 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM + # <isolated> 0626 06D0 +FBF7 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM + # <final> 0626 06D0 +FBF8 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM + # <initial> 0626 06D0 +FBF9 ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 0626 0649 +FBFA ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM + # <final> 0626 0649 +FBFB ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM + # <initial> 0626 0649 +FBFC ARABIC LETTER FARSI YEH ISOLATED FORM + # <isolated> 06CC +FBFD ARABIC LETTER FARSI YEH FINAL FORM + # <final> 06CC +FBFE ARABIC LETTER FARSI YEH INITIAL FORM + # <initial> 06CC +FBFF ARABIC LETTER FARSI YEH MEDIAL FORM + # <medial> 06CC +FC00 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM + # <isolated> 0626 062C +FC01 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM + # <isolated> 0626 062D +FC02 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM + # <isolated> 0626 0645 +FC03 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 0626 0649 +FC04 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM + # <isolated> 0626 064A +FC05 ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM + # <isolated> 0628 062C +FC06 ARABIC LIGATURE BEH WITH HAH ISOLATED FORM + # <isolated> 0628 062D +FC07 ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM + # <isolated> 0628 062E +FC08 ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM + # <isolated> 0628 0645 +FC09 ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 0628 0649 +FC0A ARABIC LIGATURE BEH WITH YEH ISOLATED FORM + # <isolated> 0628 064A +FC0B ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM + # <isolated> 062A 062C +FC0C ARABIC LIGATURE TEH WITH HAH ISOLATED FORM + # <isolated> 062A 062D +FC0D ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM + # <isolated> 062A 062E +FC0E ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM + # <isolated> 062A 0645 +FC0F ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 062A 0649 +FC10 ARABIC LIGATURE TEH WITH YEH ISOLATED FORM + # <isolated> 062A 064A +FC11 ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM + # <isolated> 062B 062C +FC12 ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM + # <isolated> 062B 0645 +FC13 ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 062B 0649 +FC14 ARABIC LIGATURE THEH WITH YEH ISOLATED FORM + # <isolated> 062B 064A +FC15 ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM + # <isolated> 062C 062D +FC16 ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM + # <isolated> 062C 0645 +FC17 ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM + # <isolated> 062D 062C +FC18 ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM + # <isolated> 062D 0645 +FC19 ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM + # <isolated> 062E 062C +FC1A ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM + # <isolated> 062E 062D +FC1B ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM + # <isolated> 062E 0645 +FC1C ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM + # <isolated> 0633 062C +FC1D ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM + # <isolated> 0633 062D +FC1E ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM + # <isolated> 0633 062E +FC1F ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM + # <isolated> 0633 0645 +FC20 ARABIC LIGATURE SAD WITH HAH ISOLATED FORM + # <isolated> 0635 062D +FC21 ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM + # <isolated> 0635 0645 +FC22 ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM + # <isolated> 0636 062C +FC23 ARABIC LIGATURE DAD WITH HAH ISOLATED FORM + # <isolated> 0636 062D +FC24 ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM + # <isolated> 0636 062E +FC25 ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM + # <isolated> 0636 0645 +FC26 ARABIC LIGATURE TAH WITH HAH ISOLATED FORM + # <isolated> 0637 062D +FC27 ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM + # <isolated> 0637 0645 +FC28 ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM + # <isolated> 0638 0645 +FC29 ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM + # <isolated> 0639 062C +FC2A ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM + # <isolated> 0639 0645 +FC2B ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM + # <isolated> 063A 062C +FC2C ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM + # <isolated> 063A 0645 +FC2D ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM + # <isolated> 0641 062C +FC2E ARABIC LIGATURE FEH WITH HAH ISOLATED FORM + # <isolated> 0641 062D +FC2F ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM + # <isolated> 0641 062E +FC30 ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM + # <isolated> 0641 0645 +FC31 ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 0641 0649 +FC32 ARABIC LIGATURE FEH WITH YEH ISOLATED FORM + # <isolated> 0641 064A +FC33 ARABIC LIGATURE QAF WITH HAH ISOLATED FORM + # <isolated> 0642 062D +FC34 ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM + # <isolated> 0642 0645 +FC35 ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 0642 0649 +FC36 ARABIC LIGATURE QAF WITH YEH ISOLATED FORM + # <isolated> 0642 064A +FC37 ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM + # <isolated> 0643 0627 +FC38 ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM + # <isolated> 0643 062C +FC39 ARABIC LIGATURE KAF WITH HAH ISOLATED FORM + # <isolated> 0643 062D +FC3A ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM + # <isolated> 0643 062E +FC3B ARABIC LIGATURE KAF WITH LAM ISOLATED FORM + # <isolated> 0643 0644 +FC3C ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM + # <isolated> 0643 0645 +FC3D ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 0643 0649 +FC3E ARABIC LIGATURE KAF WITH YEH ISOLATED FORM + # <isolated> 0643 064A +FC3F ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM + # <isolated> 0644 062C +FC40 ARABIC LIGATURE LAM WITH HAH ISOLATED FORM + # <isolated> 0644 062D +FC41 ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM + # <isolated> 0644 062E +FC42 ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM + # <isolated> 0644 0645 +FC43 ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 0644 0649 +FC44 ARABIC LIGATURE LAM WITH YEH ISOLATED FORM + # <isolated> 0644 064A +FC45 ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM + # <isolated> 0645 062C +FC46 ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM + # <isolated> 0645 062D +FC47 ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM + # <isolated> 0645 062E +FC48 ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM + # <isolated> 0645 0645 +FC49 ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 0645 0649 +FC4A ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM + # <isolated> 0645 064A +FC4B ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM + # <isolated> 0646 062C +FC4C ARABIC LIGATURE NOON WITH HAH ISOLATED FORM + # <isolated> 0646 062D +FC4D ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM + # <isolated> 0646 062E +FC4E ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM + # <isolated> 0646 0645 +FC4F ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 0646 0649 +FC50 ARABIC LIGATURE NOON WITH YEH ISOLATED FORM + # <isolated> 0646 064A +FC51 ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM + # <isolated> 0647 062C +FC52 ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM + # <isolated> 0647 0645 +FC53 ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 0647 0649 +FC54 ARABIC LIGATURE HEH WITH YEH ISOLATED FORM + # <isolated> 0647 064A +FC55 ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM + # <isolated> 064A 062C +FC56 ARABIC LIGATURE YEH WITH HAH ISOLATED FORM + # <isolated> 064A 062D +FC57 ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM + # <isolated> 064A 062E +FC58 ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM + # <isolated> 064A 0645 +FC59 ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 064A 0649 +FC5A ARABIC LIGATURE YEH WITH YEH ISOLATED FORM + # <isolated> 064A 064A +FC5B ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM + # <isolated> 0630 0670 +FC5C ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM + # <isolated> 0631 0670 +FC5D ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM + # <isolated> 0649 0670 +FC5E ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM + # <isolated> 0020 064C 0651 +FC5F ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM + # <isolated> 0020 064D 0651 +FC60 ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM + # <isolated> 0020 064E 0651 +FC61 ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM + # <isolated> 0020 064F 0651 +FC62 ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM + # <isolated> 0020 0650 0651 +FC63 ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM + # <isolated> 0020 0651 0670 +FC64 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM + # <final> 0626 0631 +FC65 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM + # <final> 0626 0632 +FC66 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM + # <final> 0626 0645 +FC67 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM + # <final> 0626 0646 +FC68 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM + # <final> 0626 0649 +FC69 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM + # <final> 0626 064A +FC6A ARABIC LIGATURE BEH WITH REH FINAL FORM + # <final> 0628 0631 +FC6B ARABIC LIGATURE BEH WITH ZAIN FINAL FORM + # <final> 0628 0632 +FC6C ARABIC LIGATURE BEH WITH MEEM FINAL FORM + # <final> 0628 0645 +FC6D ARABIC LIGATURE BEH WITH NOON FINAL FORM + # <final> 0628 0646 +FC6E ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM + # <final> 0628 0649 +FC6F ARABIC LIGATURE BEH WITH YEH FINAL FORM + # <final> 0628 064A +FC70 ARABIC LIGATURE TEH WITH REH FINAL FORM + # <final> 062A 0631 +FC71 ARABIC LIGATURE TEH WITH ZAIN FINAL FORM + # <final> 062A 0632 +FC72 ARABIC LIGATURE TEH WITH MEEM FINAL FORM + # <final> 062A 0645 +FC73 ARABIC LIGATURE TEH WITH NOON FINAL FORM + # <final> 062A 0646 +FC74 ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM + # <final> 062A 0649 +FC75 ARABIC LIGATURE TEH WITH YEH FINAL FORM + # <final> 062A 064A +FC76 ARABIC LIGATURE THEH WITH REH FINAL FORM + # <final> 062B 0631 +FC77 ARABIC LIGATURE THEH WITH ZAIN FINAL FORM + # <final> 062B 0632 +FC78 ARABIC LIGATURE THEH WITH MEEM FINAL FORM + # <final> 062B 0645 +FC79 ARABIC LIGATURE THEH WITH NOON FINAL FORM + # <final> 062B 0646 +FC7A ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM + # <final> 062B 0649 +FC7B ARABIC LIGATURE THEH WITH YEH FINAL FORM + # <final> 062B 064A +FC7C ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM + # <final> 0641 0649 +FC7D ARABIC LIGATURE FEH WITH YEH FINAL FORM + # <final> 0641 064A +FC7E ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM + # <final> 0642 0649 +FC7F ARABIC LIGATURE QAF WITH YEH FINAL FORM + # <final> 0642 064A +FC80 ARABIC LIGATURE KAF WITH ALEF FINAL FORM + # <final> 0643 0627 +FC81 ARABIC LIGATURE KAF WITH LAM FINAL FORM + # <final> 0643 0644 +FC82 ARABIC LIGATURE KAF WITH MEEM FINAL FORM + # <final> 0643 0645 +FC83 ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM + # <final> 0643 0649 +FC84 ARABIC LIGATURE KAF WITH YEH FINAL FORM + # <final> 0643 064A +FC85 ARABIC LIGATURE LAM WITH MEEM FINAL FORM + # <final> 0644 0645 +FC86 ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM + # <final> 0644 0649 +FC87 ARABIC LIGATURE LAM WITH YEH FINAL FORM + # <final> 0644 064A +FC88 ARABIC LIGATURE MEEM WITH ALEF FINAL FORM + # <final> 0645 0627 +FC89 ARABIC LIGATURE MEEM WITH MEEM FINAL FORM + # <final> 0645 0645 +FC8A ARABIC LIGATURE NOON WITH REH FINAL FORM + # <final> 0646 0631 +FC8B ARABIC LIGATURE NOON WITH ZAIN FINAL FORM + # <final> 0646 0632 +FC8C ARABIC LIGATURE NOON WITH MEEM FINAL FORM + # <final> 0646 0645 +FC8D ARABIC LIGATURE NOON WITH NOON FINAL FORM + # <final> 0646 0646 +FC8E ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM + # <final> 0646 0649 +FC8F ARABIC LIGATURE NOON WITH YEH FINAL FORM + # <final> 0646 064A +FC90 ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM + # <final> 0649 0670 +FC91 ARABIC LIGATURE YEH WITH REH FINAL FORM + # <final> 064A 0631 +FC92 ARABIC LIGATURE YEH WITH ZAIN FINAL FORM + # <final> 064A 0632 +FC93 ARABIC LIGATURE YEH WITH MEEM FINAL FORM + # <final> 064A 0645 +FC94 ARABIC LIGATURE YEH WITH NOON FINAL FORM + # <final> 064A 0646 +FC95 ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM + # <final> 064A 0649 +FC96 ARABIC LIGATURE YEH WITH YEH FINAL FORM + # <final> 064A 064A +FC97 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM + # <initial> 0626 062C +FC98 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM + # <initial> 0626 062D +FC99 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM + # <initial> 0626 062E +FC9A ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM + # <initial> 0626 0645 +FC9B ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM + # <initial> 0626 0647 +FC9C ARABIC LIGATURE BEH WITH JEEM INITIAL FORM + # <initial> 0628 062C +FC9D ARABIC LIGATURE BEH WITH HAH INITIAL FORM + # <initial> 0628 062D +FC9E ARABIC LIGATURE BEH WITH KHAH INITIAL FORM + # <initial> 0628 062E +FC9F ARABIC LIGATURE BEH WITH MEEM INITIAL FORM + # <initial> 0628 0645 +FCA0 ARABIC LIGATURE BEH WITH HEH INITIAL FORM + # <initial> 0628 0647 +FCA1 ARABIC LIGATURE TEH WITH JEEM INITIAL FORM + # <initial> 062A 062C +FCA2 ARABIC LIGATURE TEH WITH HAH INITIAL FORM + # <initial> 062A 062D +FCA3 ARABIC LIGATURE TEH WITH KHAH INITIAL FORM + # <initial> 062A 062E +FCA4 ARABIC LIGATURE TEH WITH MEEM INITIAL FORM + # <initial> 062A 0645 +FCA5 ARABIC LIGATURE TEH WITH HEH INITIAL FORM + # <initial> 062A 0647 +FCA6 ARABIC LIGATURE THEH WITH MEEM INITIAL FORM + # <initial> 062B 0645 +FCA7 ARABIC LIGATURE JEEM WITH HAH INITIAL FORM + # <initial> 062C 062D +FCA8 ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM + # <initial> 062C 0645 +FCA9 ARABIC LIGATURE HAH WITH JEEM INITIAL FORM + # <initial> 062D 062C +FCAA ARABIC LIGATURE HAH WITH MEEM INITIAL FORM + # <initial> 062D 0645 +FCAB ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM + # <initial> 062E 062C +FCAC ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM + # <initial> 062E 0645 +FCAD ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM + # <initial> 0633 062C +FCAE ARABIC LIGATURE SEEN WITH HAH INITIAL FORM + # <initial> 0633 062D +FCAF ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM + # <initial> 0633 062E +FCB0 ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM + # <initial> 0633 0645 +FCB1 ARABIC LIGATURE SAD WITH HAH INITIAL FORM + # <initial> 0635 062D +FCB2 ARABIC LIGATURE SAD WITH KHAH INITIAL FORM + # <initial> 0635 062E +FCB3 ARABIC LIGATURE SAD WITH MEEM INITIAL FORM + # <initial> 0635 0645 +FCB4 ARABIC LIGATURE DAD WITH JEEM INITIAL FORM + # <initial> 0636 062C +FCB5 ARABIC LIGATURE DAD WITH HAH INITIAL FORM + # <initial> 0636 062D +FCB6 ARABIC LIGATURE DAD WITH KHAH INITIAL FORM + # <initial> 0636 062E +FCB7 ARABIC LIGATURE DAD WITH MEEM INITIAL FORM + # <initial> 0636 0645 +FCB8 ARABIC LIGATURE TAH WITH HAH INITIAL FORM + # <initial> 0637 062D +FCB9 ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM + # <initial> 0638 0645 +FCBA ARABIC LIGATURE AIN WITH JEEM INITIAL FORM + # <initial> 0639 062C +FCBB ARABIC LIGATURE AIN WITH MEEM INITIAL FORM + # <initial> 0639 0645 +FCBC ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM + # <initial> 063A 062C +FCBD ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM + # <initial> 063A 0645 +FCBE ARABIC LIGATURE FEH WITH JEEM INITIAL FORM + # <initial> 0641 062C +FCBF ARABIC LIGATURE FEH WITH HAH INITIAL FORM + # <initial> 0641 062D +FCC0 ARABIC LIGATURE FEH WITH KHAH INITIAL FORM + # <initial> 0641 062E +FCC1 ARABIC LIGATURE FEH WITH MEEM INITIAL FORM + # <initial> 0641 0645 +FCC2 ARABIC LIGATURE QAF WITH HAH INITIAL FORM + # <initial> 0642 062D +FCC3 ARABIC LIGATURE QAF WITH MEEM INITIAL FORM + # <initial> 0642 0645 +FCC4 ARABIC LIGATURE KAF WITH JEEM INITIAL FORM + # <initial> 0643 062C +FCC5 ARABIC LIGATURE KAF WITH HAH INITIAL FORM + # <initial> 0643 062D +FCC6 ARABIC LIGATURE KAF WITH KHAH INITIAL FORM + # <initial> 0643 062E +FCC7 ARABIC LIGATURE KAF WITH LAM INITIAL FORM + # <initial> 0643 0644 +FCC8 ARABIC LIGATURE KAF WITH MEEM INITIAL FORM + # <initial> 0643 0645 +FCC9 ARABIC LIGATURE LAM WITH JEEM INITIAL FORM + # <initial> 0644 062C +FCCA ARABIC LIGATURE LAM WITH HAH INITIAL FORM + # <initial> 0644 062D +FCCB ARABIC LIGATURE LAM WITH KHAH INITIAL FORM + # <initial> 0644 062E +FCCC ARABIC LIGATURE LAM WITH MEEM INITIAL FORM + # <initial> 0644 0645 +FCCD ARABIC LIGATURE LAM WITH HEH INITIAL FORM + # <initial> 0644 0647 +FCCE ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM + # <initial> 0645 062C +FCCF ARABIC LIGATURE MEEM WITH HAH INITIAL FORM + # <initial> 0645 062D +FCD0 ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM + # <initial> 0645 062E +FCD1 ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM + # <initial> 0645 0645 +FCD2 ARABIC LIGATURE NOON WITH JEEM INITIAL FORM + # <initial> 0646 062C +FCD3 ARABIC LIGATURE NOON WITH HAH INITIAL FORM + # <initial> 0646 062D +FCD4 ARABIC LIGATURE NOON WITH KHAH INITIAL FORM + # <initial> 0646 062E +FCD5 ARABIC LIGATURE NOON WITH MEEM INITIAL FORM + # <initial> 0646 0645 +FCD6 ARABIC LIGATURE NOON WITH HEH INITIAL FORM + # <initial> 0646 0647 +FCD7 ARABIC LIGATURE HEH WITH JEEM INITIAL FORM + # <initial> 0647 062C +FCD8 ARABIC LIGATURE HEH WITH MEEM INITIAL FORM + # <initial> 0647 0645 +FCD9 ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM + # <initial> 0647 0670 +FCDA ARABIC LIGATURE YEH WITH JEEM INITIAL FORM + # <initial> 064A 062C +FCDB ARABIC LIGATURE YEH WITH HAH INITIAL FORM + # <initial> 064A 062D +FCDC ARABIC LIGATURE YEH WITH KHAH INITIAL FORM + # <initial> 064A 062E +FCDD ARABIC LIGATURE YEH WITH MEEM INITIAL FORM + # <initial> 064A 0645 +FCDE ARABIC LIGATURE YEH WITH HEH INITIAL FORM + # <initial> 064A 0647 +FCDF ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM + # <medial> 0626 0645 +FCE0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM + # <medial> 0626 0647 +FCE1 ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM + # <medial> 0628 0645 +FCE2 ARABIC LIGATURE BEH WITH HEH MEDIAL FORM + # <medial> 0628 0647 +FCE3 ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM + # <medial> 062A 0645 +FCE4 ARABIC LIGATURE TEH WITH HEH MEDIAL FORM + # <medial> 062A 0647 +FCE5 ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM + # <medial> 062B 0645 +FCE6 ARABIC LIGATURE THEH WITH HEH MEDIAL FORM + # <medial> 062B 0647 +FCE7 ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM + # <medial> 0633 0645 +FCE8 ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM + # <medial> 0633 0647 +FCE9 ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM + # <medial> 0634 0645 +FCEA ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM + # <medial> 0634 0647 +FCEB ARABIC LIGATURE KAF WITH LAM MEDIAL FORM + # <medial> 0643 0644 +FCEC ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM + # <medial> 0643 0645 +FCED ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM + # <medial> 0644 0645 +FCEE ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM + # <medial> 0646 0645 +FCEF ARABIC LIGATURE NOON WITH HEH MEDIAL FORM + # <medial> 0646 0647 +FCF0 ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM + # <medial> 064A 0645 +FCF1 ARABIC LIGATURE YEH WITH HEH MEDIAL FORM + # <medial> 064A 0647 +FCF2 ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM + # <medial> 0640 064E 0651 +FCF3 ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM + # <medial> 0640 064F 0651 +FCF4 ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM + # <medial> 0640 0650 0651 +FCF5 ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 0637 0649 +FCF6 ARABIC LIGATURE TAH WITH YEH ISOLATED FORM + # <isolated> 0637 064A +FCF7 ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 0639 0649 +FCF8 ARABIC LIGATURE AIN WITH YEH ISOLATED FORM + # <isolated> 0639 064A +FCF9 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 063A 0649 +FCFA ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM + # <isolated> 063A 064A +FCFB ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 0633 0649 +FCFC ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM + # <isolated> 0633 064A +FCFD ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 0634 0649 +FCFE ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM + # <isolated> 0634 064A +FCFF ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 062D 0649 +FD00 ARABIC LIGATURE HAH WITH YEH ISOLATED FORM + # <isolated> 062D 064A +FD01 ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 062C 0649 +FD02 ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM + # <isolated> 062C 064A +FD03 ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 062E 0649 +FD04 ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM + # <isolated> 062E 064A +FD05 ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 0635 0649 +FD06 ARABIC LIGATURE SAD WITH YEH ISOLATED FORM + # <isolated> 0635 064A +FD07 ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM + # <isolated> 0636 0649 +FD08 ARABIC LIGATURE DAD WITH YEH ISOLATED FORM + # <isolated> 0636 064A +FD09 ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM + # <isolated> 0634 062C +FD0A ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM + # <isolated> 0634 062D +FD0B ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM + # <isolated> 0634 062E +FD0C ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM + # <isolated> 0634 0645 +FD0D ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM + # <isolated> 0634 0631 +FD0E ARABIC LIGATURE SEEN WITH REH ISOLATED FORM + # <isolated> 0633 0631 +FD0F ARABIC LIGATURE SAD WITH REH ISOLATED FORM + # <isolated> 0635 0631 +FD10 ARABIC LIGATURE DAD WITH REH ISOLATED FORM + # <isolated> 0636 0631 +FD11 ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM + # <final> 0637 0649 +FD12 ARABIC LIGATURE TAH WITH YEH FINAL FORM + # <final> 0637 064A +FD13 ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM + # <final> 0639 0649 +FD14 ARABIC LIGATURE AIN WITH YEH FINAL FORM + # <final> 0639 064A +FD15 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM + # <final> 063A 0649 +FD16 ARABIC LIGATURE GHAIN WITH YEH FINAL FORM + # <final> 063A 064A +FD17 ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM + # <final> 0633 0649 +FD18 ARABIC LIGATURE SEEN WITH YEH FINAL FORM + # <final> 0633 064A +FD19 ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM + # <final> 0634 0649 +FD1A ARABIC LIGATURE SHEEN WITH YEH FINAL FORM + # <final> 0634 064A +FD1B ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM + # <final> 062D 0649 +FD1C ARABIC LIGATURE HAH WITH YEH FINAL FORM + # <final> 062D 064A +FD1D ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM + # <final> 062C 0649 +FD1E ARABIC LIGATURE JEEM WITH YEH FINAL FORM + # <final> 062C 064A +FD1F ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM + # <final> 062E 0649 +FD20 ARABIC LIGATURE KHAH WITH YEH FINAL FORM + # <final> 062E 064A +FD21 ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM + # <final> 0635 0649 +FD22 ARABIC LIGATURE SAD WITH YEH FINAL FORM + # <final> 0635 064A +FD23 ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM + # <final> 0636 0649 +FD24 ARABIC LIGATURE DAD WITH YEH FINAL FORM + # <final> 0636 064A +FD25 ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM + # <final> 0634 062C +FD26 ARABIC LIGATURE SHEEN WITH HAH FINAL FORM + # <final> 0634 062D +FD27 ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM + # <final> 0634 062E +FD28 ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM + # <final> 0634 0645 +FD29 ARABIC LIGATURE SHEEN WITH REH FINAL FORM + # <final> 0634 0631 +FD2A ARABIC LIGATURE SEEN WITH REH FINAL FORM + # <final> 0633 0631 +FD2B ARABIC LIGATURE SAD WITH REH FINAL FORM + # <final> 0635 0631 +FD2C ARABIC LIGATURE DAD WITH REH FINAL FORM + # <final> 0636 0631 +FD2D ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM + # <initial> 0634 062C +FD2E ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM + # <initial> 0634 062D +FD2F ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM + # <initial> 0634 062E +FD30 ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM + # <initial> 0634 0645 +FD31 ARABIC LIGATURE SEEN WITH HEH INITIAL FORM + # <initial> 0633 0647 +FD32 ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM + # <initial> 0634 0647 +FD33 ARABIC LIGATURE TAH WITH MEEM INITIAL FORM + # <initial> 0637 0645 +FD34 ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM + # <medial> 0633 062C +FD35 ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM + # <medial> 0633 062D +FD36 ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM + # <medial> 0633 062E +FD37 ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM + # <medial> 0634 062C +FD38 ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM + # <medial> 0634 062D +FD39 ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM + # <medial> 0634 062E +FD3A ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM + # <medial> 0637 0645 +FD3B ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM + # <medial> 0638 0645 +FD3C ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM + # <final> 0627 064B +FD3D ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM + # <isolated> 0627 064B +@ Punctuation +FD3E ORNATE LEFT PARENTHESIS +FD3F ORNATE RIGHT PARENTHESIS +@ Ligatures (three elements) +FD50 ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM + # <initial> 062A 062C 0645 +FD51 ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM + # <final> 062A 062D 062C +FD52 ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM + # <initial> 062A 062D 062C +FD53 ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM + # <initial> 062A 062D 0645 +FD54 ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM + # <initial> 062A 062E 0645 +FD55 ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM + # <initial> 062A 0645 062C +FD56 ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM + # <initial> 062A 0645 062D +FD57 ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM + # <initial> 062A 0645 062E +FD58 ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM + # <final> 062C 0645 062D +FD59 ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM + # <initial> 062C 0645 062D +FD5A ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM + # <final> 062D 0645 064A +FD5B ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM + # <final> 062D 0645 0649 +FD5C ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM + # <initial> 0633 062D 062C +FD5D ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM + # <initial> 0633 062C 062D +FD5E ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM + # <final> 0633 062C 0649 +FD5F ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM + # <final> 0633 0645 062D +FD60 ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM + # <initial> 0633 0645 062D +FD61 ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM + # <initial> 0633 0645 062C +FD62 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM + # <final> 0633 0645 0645 +FD63 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM + # <initial> 0633 0645 0645 +FD64 ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM + # <final> 0635 062D 062D +FD65 ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM + # <initial> 0635 062D 062D +FD66 ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM + # <final> 0635 0645 0645 +FD67 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM + # <final> 0634 062D 0645 +FD68 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM + # <initial> 0634 062D 0645 +FD69 ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM + # <final> 0634 062C 064A +FD6A ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM + # <final> 0634 0645 062E +FD6B ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM + # <initial> 0634 0645 062E +FD6C ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM + # <final> 0634 0645 0645 +FD6D ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM + # <initial> 0634 0645 0645 +FD6E ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM + # <final> 0636 062D 0649 +FD6F ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM + # <final> 0636 062E 0645 +FD70 ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM + # <initial> 0636 062E 0645 +FD71 ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM + # <final> 0637 0645 062D +FD72 ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM + # <initial> 0637 0645 062D +FD73 ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM + # <initial> 0637 0645 0645 +FD74 ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM + # <final> 0637 0645 064A +FD75 ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM + # <final> 0639 062C 0645 +FD76 ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM + # <final> 0639 0645 0645 +FD77 ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM + # <initial> 0639 0645 0645 +FD78 ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM + # <final> 0639 0645 0649 +FD79 ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM + # <final> 063A 0645 0645 +FD7A ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM + # <final> 063A 0645 064A +FD7B ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM + # <final> 063A 0645 0649 +FD7C ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM + # <final> 0641 062E 0645 +FD7D ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM + # <initial> 0641 062E 0645 +FD7E ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM + # <final> 0642 0645 062D +FD7F ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM + # <final> 0642 0645 0645 +FD80 ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM + # <final> 0644 062D 0645 +FD81 ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM + # <final> 0644 062D 064A +FD82 ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM + # <final> 0644 062D 0649 +FD83 ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM + # <initial> 0644 062C 062C +FD84 ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM + # <final> 0644 062C 062C +FD85 ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM + # <final> 0644 062E 0645 +FD86 ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM + # <initial> 0644 062E 0645 +FD87 ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM + # <final> 0644 0645 062D +FD88 ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM + # <initial> 0644 0645 062D +FD89 ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM + # <initial> 0645 062D 062C +FD8A ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM + # <initial> 0645 062D 0645 +FD8B ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM + # <final> 0645 062D 064A +FD8C ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM + # <initial> 0645 062C 062D +FD8D ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM + # <initial> 0645 062C 0645 +FD8E ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM + # <initial> 0645 062E 062C +FD8F ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM + # <initial> 0645 062E 0645 +FD92 ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM + # <initial> 0645 062C 062E +FD93 ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM + # <initial> 0647 0645 062C +FD94 ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM + # <initial> 0647 0645 0645 +FD95 ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM + # <initial> 0646 062D 0645 +FD96 ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM + # <final> 0646 062D 0649 +FD97 ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM + # <final> 0646 062C 0645 +FD98 ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM + # <initial> 0646 062C 0645 +FD99 ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM + # <final> 0646 062C 0649 +FD9A ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM + # <final> 0646 0645 064A +FD9B ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM + # <final> 0646 0645 0649 +FD9C ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM + # <final> 064A 0645 0645 +FD9D ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM + # <initial> 064A 0645 0645 +FD9E ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM + # <final> 0628 062E 064A +FD9F ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM + # <final> 062A 062C 064A +FDA0 ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM + # <final> 062A 062C 0649 +FDA1 ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM + # <final> 062A 062E 064A +FDA2 ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM + # <final> 062A 062E 0649 +FDA3 ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM + # <final> 062A 0645 064A +FDA4 ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM + # <final> 062A 0645 0649 +FDA5 ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM + # <final> 062C 0645 064A +FDA6 ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM + # <final> 062C 062D 0649 +FDA7 ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM + # <final> 062C 0645 0649 +FDA8 ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM + # <final> 0633 062E 0649 +FDA9 ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM + # <final> 0635 062D 064A +FDAA ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM + # <final> 0634 062D 064A +FDAB ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM + # <final> 0636 062D 064A +FDAC ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM + # <final> 0644 062C 064A +FDAD ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM + # <final> 0644 0645 064A +FDAE ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM + # <final> 064A 062D 064A +FDAF ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM + # <final> 064A 062C 064A +FDB0 ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM + # <final> 064A 0645 064A +FDB1 ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM + # <final> 0645 0645 064A +FDB2 ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM + # <final> 0642 0645 064A +FDB3 ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM + # <final> 0646 062D 064A +FDB4 ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM + # <initial> 0642 0645 062D +FDB5 ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM + # <initial> 0644 062D 0645 +FDB6 ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM + # <final> 0639 0645 064A +FDB7 ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM + # <final> 0643 0645 064A +FDB8 ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM + # <initial> 0646 062C 062D +FDB9 ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM + # <final> 0645 062E 064A +FDBA ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM + # <initial> 0644 062C 0645 +FDBB ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM + # <final> 0643 0645 0645 +FDBC ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM + # <final> 0644 062C 0645 +FDBD ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM + # <final> 0646 062C 062D +FDBE ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM + # <final> 062C 062D 064A +FDBF ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM + # <final> 062D 062C 064A +FDC0 ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM + # <final> 0645 062C 064A +FDC1 ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM + # <final> 0641 0645 064A +FDC2 ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM + # <final> 0628 062D 064A +FDC3 ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM + # <initial> 0643 0645 0645 +FDC4 ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM + # <initial> 0639 062C 0645 +FDC5 ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM + # <initial> 0635 0645 0645 +FDC6 ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM + # <final> 0633 062E 064A +FDC7 ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM + # <final> 0646 062C 064A +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +FDD0 <not a character> +FDD1 <not a character> +FDD2 <not a character> +FDD3 <not a character> +FDD4 <not a character> +FDD5 <not a character> +FDD6 <not a character> +FDD7 <not a character> +FDD8 <not a character> +FDD9 <not a character> +FDDA <not a character> +FDDB <not a character> +FDDC <not a character> +FDDD <not a character> +FDDE <not a character> +FDDF <not a character> +FDE0 <not a character> +FDE1 <not a character> +FDE2 <not a character> +FDE3 <not a character> +FDE4 <not a character> +FDE5 <not a character> +FDE6 <not a character> +FDE7 <not a character> +FDE8 <not a character> +FDE9 <not a character> +FDEA <not a character> +FDEB <not a character> +FDEC <not a character> +FDED <not a character> +FDEE <not a character> +FDEF <not a character> +@ Word ligatures +FDF0 ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM + # <isolated> 0635 0644 06D2 +FDF1 ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM + # <isolated> 0642 0644 06D2 +FDF2 ARABIC LIGATURE ALLAH ISOLATED FORM + # <isolated> 0627 0644 0644 0647 +FDF3 ARABIC LIGATURE AKBAR ISOLATED FORM + # <isolated> 0627 0643 0628 0631 +FDF4 ARABIC LIGATURE MOHAMMAD ISOLATED FORM + # <isolated> 0645 062D 0645 062F +FDF5 ARABIC LIGATURE SALAM ISOLATED FORM + # <isolated> 0635 0644 0639 0645 +FDF6 ARABIC LIGATURE RASOUL ISOLATED FORM + # <isolated> 0631 0633 0648 0644 +FDF7 ARABIC LIGATURE ALAYHE ISOLATED FORM + # <isolated> 0639 0644 064A 0647 +FDF8 ARABIC LIGATURE WASALLAM ISOLATED FORM + # <isolated> 0648 0633 0644 0645 +FDF9 ARABIC LIGATURE SALLA ISOLATED FORM + # <isolated> 0635 0644 0649 +FDFA ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM + # <isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645 +FDFB ARABIC LIGATURE JALLAJALALOUHOU + # <isolated> 062C 0644 0020 062C 0644 0627 0644 0647 +@ Currency sign +FDFC RIAL SIGN + # <isolated> 0631 06CC 0627 0644 +@ Symbol +FDFD ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +@@ FE00 Variation Selectors FE0F +@ Variation selectors +@+ Combining characters; in conjunction with the preceding character these indicate a predetermined choice of variant glyph +FE00 VARIATION SELECTOR-1 + * these are abbreviated VS1, and so on +FE01 VARIATION SELECTOR-2 +FE02 VARIATION SELECTOR-3 +FE03 VARIATION SELECTOR-4 +FE04 VARIATION SELECTOR-5 +FE05 VARIATION SELECTOR-6 +FE06 VARIATION SELECTOR-7 +FE07 VARIATION SELECTOR-8 +FE08 VARIATION SELECTOR-9 +FE09 VARIATION SELECTOR-10 +FE0A VARIATION SELECTOR-11 +FE0B VARIATION SELECTOR-12 +FE0C VARIATION SELECTOR-13 +FE0D VARIATION SELECTOR-14 +FE0E VARIATION SELECTOR-15 +FE0F VARIATION SELECTOR-16 +@@ FE10 Vertical forms FE1F +@+ These characters are compatibility characters needed to map to GB 18030. +@ Glyphs for vertical variants +FE10 PRESENTATION FORM FOR VERTICAL COMMA + x (small comma - FE50) + # <vertical> 002C +FE11 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA + x (sesame dot - FE45) + x (small ideographic comma - FE51) + # <vertical> 3001 +FE12 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP + # <vertical> 3002 +FE13 PRESENTATION FORM FOR VERTICAL COLON + x (small colon - FE55) + # <vertical> 003A +FE14 PRESENTATION FORM FOR VERTICAL SEMICOLON + x (small semicolon - FE54) + # <vertical> 003B +FE15 PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK + x (small exclamation mark - FE57) + # <vertical> 0021 +FE16 PRESENTATION FORM FOR VERTICAL QUESTION MARK + x (small question mark - FE56) + # <vertical> 003F +FE17 PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET + # <vertical> 3016 +FE18 PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET + # <vertical> 3017 +FE19 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS + x (vertical ellipsis - 22EE) + # <vertical> 2026 +@@ FE20 Combining Half Marks FE2F +@ Combining half marks +FE20 COMBINING LIGATURE LEFT HALF +FE21 COMBINING LIGATURE RIGHT HALF +FE22 COMBINING DOUBLE TILDE LEFT HALF +FE23 COMBINING DOUBLE TILDE RIGHT HALF +@@ FE30 CJK Compatibility Forms FE4F +@ Glyphs for vertical variants +FE30 PRESENTATION FORM FOR VERTICAL TWO DOT LEADER + # <vertical> 2025 +FE31 PRESENTATION FORM FOR VERTICAL EM DASH + # <vertical> 2014 +FE32 PRESENTATION FORM FOR VERTICAL EN DASH + # <vertical> 2013 +FE33 PRESENTATION FORM FOR VERTICAL LOW LINE + # <vertical> 005F +FE34 PRESENTATION FORM FOR VERTICAL WAVY LOW LINE + # <vertical> 005F +FE35 PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS + # <vertical> 0028 +FE36 PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS + # <vertical> 0029 +FE37 PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET + # <vertical> 007B +FE38 PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET + # <vertical> 007D +FE39 PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET + # <vertical> 3014 +FE3A PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET + # <vertical> 3015 +FE3B PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET + # <vertical> 3010 +FE3C PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET + # <vertical> 3011 +FE3D PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET + # <vertical> 300A +FE3E PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET + # <vertical> 300B +FE3F PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET + # <vertical> 3008 +FE40 PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET + # <vertical> 3009 +FE41 PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET + # <vertical> 300C +FE42 PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET + # <vertical> 300D +FE43 PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET + # <vertical> 300E +FE44 PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET + # <vertical> 300F +@ Sidelining emphasis marks +FE45 SESAME DOT + x (small ideographic comma - FE51) +FE46 WHITE SESAME DOT + * sesame dots are used beside vertical text for emphasis +@ Glyphs for vertical variants +FE47 PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET + x (top square bracket - 23B4) + # <vertical> 005B +FE48 PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET + x (bottom square bracket - 23B5) + # <vertical> 005D +@ Overscores and underscores +FE49 DASHED OVERLINE + # 203E overline +FE4A CENTRELINE OVERLINE + # 203E overline +FE4B WAVY OVERLINE + # 203E overline +FE4C DOUBLE WAVY OVERLINE + # 203E overline +FE4D DASHED LOW LINE + # 005F low line +FE4E CENTRELINE LOW LINE + # 005F low line +FE4F WAVY LOW LINE + # 005F low line +@@ FE50 Small Form Variants FE6F +@+ These characters are compatibility characters needed to map to CNS 11643. +@ Small form variants +FE50 SMALL COMMA + x (presentation form for vertical comma - FE10) + # <small> 002C +FE51 SMALL IDEOGRAPHIC COMMA + x (presentation form for vertical ideographic comma - FE11) + x (black sesame dot - FE45) + # <small> 3001 +FE52 SMALL FULL STOP + # <small> 002E +FE54 SMALL SEMICOLON + x (presentation form for vertical semicolon - FE14) + # <small> 003B +FE55 SMALL COLON + x (presentation form for vertical colon - FE13) + # <small> 003A +FE56 SMALL QUESTION MARK + x (presentation form for vertical question mark - FE16) + # <small> 003F +FE57 SMALL EXCLAMATION MARK + x (presentation form for vertical exclamation mark - FE15) + # <small> 0021 +FE58 SMALL EM DASH + # <small> 2014 +FE59 SMALL LEFT PARENTHESIS + # <small> 0028 +FE5A SMALL RIGHT PARENTHESIS + # <small> 0029 +FE5B SMALL LEFT CURLY BRACKET + # <small> 007B +FE5C SMALL RIGHT CURLY BRACKET + # <small> 007D +FE5D SMALL LEFT TORTOISE SHELL BRACKET + # <small> 3014 +FE5E SMALL RIGHT TORTOISE SHELL BRACKET + # <small> 3015 +FE5F SMALL NUMBER SIGN + # <small> 0023 +FE60 SMALL AMPERSAND + # <small> 0026 +FE61 SMALL ASTERISK + # <small> 002A +FE62 SMALL PLUS SIGN + # <small> 002B +FE63 SMALL HYPHEN-MINUS + # <small> 002D +FE64 SMALL LESS-THAN SIGN + # <small> 003C +FE65 SMALL GREATER-THAN SIGN + # <small> 003E +FE66 SMALL EQUALS SIGN + # <small> 003D +FE68 SMALL REVERSE SOLIDUS + # <small> 005C +FE69 SMALL DOLLAR SIGN + # <small> 0024 +FE6A SMALL PERCENT SIGN + # <small> 0025 +FE6B SMALL COMMERCIAL AT + # <small> 0040 +@@ FE70 Arabic Presentation Forms-B FEFF +@ Glyphs for spacing forms of Arabic points +FE70 ARABIC FATHATAN ISOLATED FORM + # <isolated> 0020 064B +FE71 ARABIC TATWEEL WITH FATHATAN ABOVE + # <medial> 0640 064B +FE72 ARABIC DAMMATAN ISOLATED FORM + # <isolated> 0020 064C +@ Glyph part +FE73 ARABIC TAIL FRAGMENT + * for compatibility with certain legacy character sets +@ Glyphs for spacing forms of Arabic points +FE74 ARABIC KASRATAN ISOLATED FORM + # <isolated> 0020 064D +FE76 ARABIC FATHA ISOLATED FORM + # <isolated> 0020 064E +FE77 ARABIC FATHA MEDIAL FORM + # <medial> 0640 064E +FE78 ARABIC DAMMA ISOLATED FORM + # <isolated> 0020 064F +FE79 ARABIC DAMMA MEDIAL FORM + # <medial> 0640 064F +FE7A ARABIC KASRA ISOLATED FORM + # <isolated> 0020 0650 +FE7B ARABIC KASRA MEDIAL FORM + # <medial> 0640 0650 +FE7C ARABIC SHADDA ISOLATED FORM + # <isolated> 0020 0651 +FE7D ARABIC SHADDA MEDIAL FORM + # <medial> 0640 0651 +FE7E ARABIC SUKUN ISOLATED FORM + # <isolated> 0020 0652 +FE7F ARABIC SUKUN MEDIAL FORM + # <medial> 0640 0652 +@ Basic glyphs for Arabic language contextual forms +FE80 ARABIC LETTER HAMZA ISOLATED FORM + # <isolated> 0621 +FE81 ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + # <isolated> 0622 +FE82 ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + # <final> 0622 +FE83 ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + # <isolated> 0623 +FE84 ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + # <final> 0623 +FE85 ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + # <isolated> 0624 +FE86 ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM + # <final> 0624 +FE87 ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM + # <isolated> 0625 +FE88 ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM + # <final> 0625 +FE89 ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM + # <isolated> 0626 +FE8A ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM + # <final> 0626 +FE8B ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + # <initial> 0626 +FE8C ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM + # <medial> 0626 +FE8D ARABIC LETTER ALEF ISOLATED FORM + # <isolated> 0627 +FE8E ARABIC LETTER ALEF FINAL FORM + # <final> 0627 +FE8F ARABIC LETTER BEH ISOLATED FORM + # <isolated> 0628 +FE90 ARABIC LETTER BEH FINAL FORM + # <final> 0628 +FE91 ARABIC LETTER BEH INITIAL FORM + # <initial> 0628 +FE92 ARABIC LETTER BEH MEDIAL FORM + # <medial> 0628 +FE93 ARABIC LETTER TEH MARBUTA ISOLATED FORM + # <isolated> 0629 +FE94 ARABIC LETTER TEH MARBUTA FINAL FORM + # <final> 0629 +FE95 ARABIC LETTER TEH ISOLATED FORM + # <isolated> 062A +FE96 ARABIC LETTER TEH FINAL FORM + # <final> 062A +FE97 ARABIC LETTER TEH INITIAL FORM + # <initial> 062A +FE98 ARABIC LETTER TEH MEDIAL FORM + # <medial> 062A +FE99 ARABIC LETTER THEH ISOLATED FORM + # <isolated> 062B +FE9A ARABIC LETTER THEH FINAL FORM + # <final> 062B +FE9B ARABIC LETTER THEH INITIAL FORM + # <initial> 062B +FE9C ARABIC LETTER THEH MEDIAL FORM + # <medial> 062B +FE9D ARABIC LETTER JEEM ISOLATED FORM + # <isolated> 062C +FE9E ARABIC LETTER JEEM FINAL FORM + # <final> 062C +FE9F ARABIC LETTER JEEM INITIAL FORM + # <initial> 062C +FEA0 ARABIC LETTER JEEM MEDIAL FORM + # <medial> 062C +FEA1 ARABIC LETTER HAH ISOLATED FORM + # <isolated> 062D +FEA2 ARABIC LETTER HAH FINAL FORM + # <final> 062D +FEA3 ARABIC LETTER HAH INITIAL FORM + # <initial> 062D +FEA4 ARABIC LETTER HAH MEDIAL FORM + # <medial> 062D +FEA5 ARABIC LETTER KHAH ISOLATED FORM + # <isolated> 062E +FEA6 ARABIC LETTER KHAH FINAL FORM + # <final> 062E +FEA7 ARABIC LETTER KHAH INITIAL FORM + # <initial> 062E +FEA8 ARABIC LETTER KHAH MEDIAL FORM + # <medial> 062E +FEA9 ARABIC LETTER DAL ISOLATED FORM + # <isolated> 062F +FEAA ARABIC LETTER DAL FINAL FORM + # <final> 062F +FEAB ARABIC LETTER THAL ISOLATED FORM + # <isolated> 0630 +FEAC ARABIC LETTER THAL FINAL FORM + # <final> 0630 +FEAD ARABIC LETTER REH ISOLATED FORM + # <isolated> 0631 +FEAE ARABIC LETTER REH FINAL FORM + # <final> 0631 +FEAF ARABIC LETTER ZAIN ISOLATED FORM + # <isolated> 0632 +FEB0 ARABIC LETTER ZAIN FINAL FORM + # <final> 0632 +FEB1 ARABIC LETTER SEEN ISOLATED FORM + # <isolated> 0633 +FEB2 ARABIC LETTER SEEN FINAL FORM + # <final> 0633 +FEB3 ARABIC LETTER SEEN INITIAL FORM + # <initial> 0633 +FEB4 ARABIC LETTER SEEN MEDIAL FORM + # <medial> 0633 +FEB5 ARABIC LETTER SHEEN ISOLATED FORM + # <isolated> 0634 +FEB6 ARABIC LETTER SHEEN FINAL FORM + # <final> 0634 +FEB7 ARABIC LETTER SHEEN INITIAL FORM + # <initial> 0634 +FEB8 ARABIC LETTER SHEEN MEDIAL FORM + # <medial> 0634 +FEB9 ARABIC LETTER SAD ISOLATED FORM + # <isolated> 0635 +FEBA ARABIC LETTER SAD FINAL FORM + # <final> 0635 +FEBB ARABIC LETTER SAD INITIAL FORM + # <initial> 0635 +FEBC ARABIC LETTER SAD MEDIAL FORM + # <medial> 0635 +FEBD ARABIC LETTER DAD ISOLATED FORM + # <isolated> 0636 +FEBE ARABIC LETTER DAD FINAL FORM + # <final> 0636 +FEBF ARABIC LETTER DAD INITIAL FORM + # <initial> 0636 +FEC0 ARABIC LETTER DAD MEDIAL FORM + # <medial> 0636 +FEC1 ARABIC LETTER TAH ISOLATED FORM + # <isolated> 0637 +FEC2 ARABIC LETTER TAH FINAL FORM + # <final> 0637 +FEC3 ARABIC LETTER TAH INITIAL FORM + # <initial> 0637 +FEC4 ARABIC LETTER TAH MEDIAL FORM + # <medial> 0637 +FEC5 ARABIC LETTER ZAH ISOLATED FORM + # <isolated> 0638 +FEC6 ARABIC LETTER ZAH FINAL FORM + # <final> 0638 +FEC7 ARABIC LETTER ZAH INITIAL FORM + # <initial> 0638 +FEC8 ARABIC LETTER ZAH MEDIAL FORM + # <medial> 0638 +FEC9 ARABIC LETTER AIN ISOLATED FORM + # <isolated> 0639 +FECA ARABIC LETTER AIN FINAL FORM + # <final> 0639 +FECB ARABIC LETTER AIN INITIAL FORM + # <initial> 0639 +FECC ARABIC LETTER AIN MEDIAL FORM + # <medial> 0639 +FECD ARABIC LETTER GHAIN ISOLATED FORM + # <isolated> 063A +FECE ARABIC LETTER GHAIN FINAL FORM + # <final> 063A +FECF ARABIC LETTER GHAIN INITIAL FORM + # <initial> 063A +FED0 ARABIC LETTER GHAIN MEDIAL FORM + # <medial> 063A +FED1 ARABIC LETTER FEH ISOLATED FORM + # <isolated> 0641 +FED2 ARABIC LETTER FEH FINAL FORM + # <final> 0641 +FED3 ARABIC LETTER FEH INITIAL FORM + # <initial> 0641 +FED4 ARABIC LETTER FEH MEDIAL FORM + # <medial> 0641 +FED5 ARABIC LETTER QAF ISOLATED FORM + # <isolated> 0642 +FED6 ARABIC LETTER QAF FINAL FORM + # <final> 0642 +FED7 ARABIC LETTER QAF INITIAL FORM + # <initial> 0642 +FED8 ARABIC LETTER QAF MEDIAL FORM + # <medial> 0642 +FED9 ARABIC LETTER KAF ISOLATED FORM + # <isolated> 0643 +FEDA ARABIC LETTER KAF FINAL FORM + # <final> 0643 +FEDB ARABIC LETTER KAF INITIAL FORM + # <initial> 0643 +FEDC ARABIC LETTER KAF MEDIAL FORM + # <medial> 0643 +FEDD ARABIC LETTER LAM ISOLATED FORM + # <isolated> 0644 +FEDE ARABIC LETTER LAM FINAL FORM + # <final> 0644 +FEDF ARABIC LETTER LAM INITIAL FORM + # <initial> 0644 +FEE0 ARABIC LETTER LAM MEDIAL FORM + # <medial> 0644 +FEE1 ARABIC LETTER MEEM ISOLATED FORM + # <isolated> 0645 +FEE2 ARABIC LETTER MEEM FINAL FORM + # <final> 0645 +FEE3 ARABIC LETTER MEEM INITIAL FORM + # <initial> 0645 +FEE4 ARABIC LETTER MEEM MEDIAL FORM + # <medial> 0645 +FEE5 ARABIC LETTER NOON ISOLATED FORM + # <isolated> 0646 +FEE6 ARABIC LETTER NOON FINAL FORM + # <final> 0646 +FEE7 ARABIC LETTER NOON INITIAL FORM + # <initial> 0646 +FEE8 ARABIC LETTER NOON MEDIAL FORM + # <medial> 0646 +FEE9 ARABIC LETTER HEH ISOLATED FORM + # <isolated> 0647 +FEEA ARABIC LETTER HEH FINAL FORM + # <final> 0647 +FEEB ARABIC LETTER HEH INITIAL FORM + # <initial> 0647 +FEEC ARABIC LETTER HEH MEDIAL FORM + # <medial> 0647 +FEED ARABIC LETTER WAW ISOLATED FORM + # <isolated> 0648 +FEEE ARABIC LETTER WAW FINAL FORM + # <final> 0648 +FEEF ARABIC LETTER ALEF MAKSURA ISOLATED FORM + # <isolated> 0649 +FEF0 ARABIC LETTER ALEF MAKSURA FINAL FORM + # <final> 0649 +FEF1 ARABIC LETTER YEH ISOLATED FORM + # <isolated> 064A +FEF2 ARABIC LETTER YEH FINAL FORM + # <final> 064A +FEF3 ARABIC LETTER YEH INITIAL FORM + # <initial> 064A +FEF4 ARABIC LETTER YEH MEDIAL FORM + # <medial> 064A +FEF5 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + # <isolated> 0644 0622 +FEF6 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + # <final> 0644 0622 +FEF7 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + # <isolated> 0644 0623 +FEF8 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + # <final> 0644 0623 +FEF9 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM + # <isolated> 0644 0625 +FEFA ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM + # <final> 0644 0625 +FEFB ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + # <isolated> 0644 0627 +FEFC ARABIC LIGATURE LAM WITH ALEF FINAL FORM + # <final> 0644 0627 +@ Special +FEFF ZERO WIDTH NO-BREAK SPACE + = BYTE ORDER MARK (BOM), ZWNBSP + * may be used to detect byte order by contrast with the noncharacter code point FFFE + * use as an indication of non-breaking is deprecated; see 2060 instead + x (zero width space - 200B) + x (word joiner - 2060) + x (<not a character> - FFFE) +@@ FF00 Halfwidth and Fullwidth Forms FFEF +@ Fullwidth ASCII variants +@+ See ASCII 0020 - 007E +FF01 FULLWIDTH EXCLAMATION MARK + # <wide> 0021 +FF02 FULLWIDTH QUOTATION MARK + # <wide> 0022 +FF03 FULLWIDTH NUMBER SIGN + # <wide> 0023 +FF04 FULLWIDTH DOLLAR SIGN + # <wide> 0024 +FF05 FULLWIDTH PERCENT SIGN + # <wide> 0025 +FF06 FULLWIDTH AMPERSAND + # <wide> 0026 +FF07 FULLWIDTH APOSTROPHE + # <wide> 0027 +FF08 FULLWIDTH LEFT PARENTHESIS + # <wide> 0028 +FF09 FULLWIDTH RIGHT PARENTHESIS + # <wide> 0029 +FF0A FULLWIDTH ASTERISK + # <wide> 002A +FF0B FULLWIDTH PLUS SIGN + # <wide> 002B +FF0C FULLWIDTH COMMA + # <wide> 002C +FF0D FULLWIDTH HYPHEN-MINUS + # <wide> 002D +FF0E FULLWIDTH FULL STOP + # <wide> 002E +FF0F FULLWIDTH SOLIDUS + # <wide> 002F +FF10 FULLWIDTH DIGIT ZERO + # <wide> 0030 +FF11 FULLWIDTH DIGIT ONE + # <wide> 0031 +FF12 FULLWIDTH DIGIT TWO + # <wide> 0032 +FF13 FULLWIDTH DIGIT THREE + # <wide> 0033 +FF14 FULLWIDTH DIGIT FOUR + # <wide> 0034 +FF15 FULLWIDTH DIGIT FIVE + # <wide> 0035 +FF16 FULLWIDTH DIGIT SIX + # <wide> 0036 +FF17 FULLWIDTH DIGIT SEVEN + # <wide> 0037 +FF18 FULLWIDTH DIGIT EIGHT + # <wide> 0038 +FF19 FULLWIDTH DIGIT NINE + # <wide> 0039 +FF1A FULLWIDTH COLON + # <wide> 003A +FF1B FULLWIDTH SEMICOLON + # <wide> 003B +FF1C FULLWIDTH LESS-THAN SIGN + # <wide> 003C +FF1D FULLWIDTH EQUALS SIGN + # <wide> 003D +FF1E FULLWIDTH GREATER-THAN SIGN + # <wide> 003E +FF1F FULLWIDTH QUESTION MARK + # <wide> 003F +FF20 FULLWIDTH COMMERCIAL AT + # <wide> 0040 +FF21 FULLWIDTH LATIN CAPITAL LETTER A + # <wide> 0041 +FF22 FULLWIDTH LATIN CAPITAL LETTER B + # <wide> 0042 +FF23 FULLWIDTH LATIN CAPITAL LETTER C + # <wide> 0043 +FF24 FULLWIDTH LATIN CAPITAL LETTER D + # <wide> 0044 +FF25 FULLWIDTH LATIN CAPITAL LETTER E + # <wide> 0045 +FF26 FULLWIDTH LATIN CAPITAL LETTER F + # <wide> 0046 +FF27 FULLWIDTH LATIN CAPITAL LETTER G + # <wide> 0047 +FF28 FULLWIDTH LATIN CAPITAL LETTER H + # <wide> 0048 +FF29 FULLWIDTH LATIN CAPITAL LETTER I + # <wide> 0049 +FF2A FULLWIDTH LATIN CAPITAL LETTER J + # <wide> 004A +FF2B FULLWIDTH LATIN CAPITAL LETTER K + # <wide> 004B +FF2C FULLWIDTH LATIN CAPITAL LETTER L + # <wide> 004C +FF2D FULLWIDTH LATIN CAPITAL LETTER M + # <wide> 004D +FF2E FULLWIDTH LATIN CAPITAL LETTER N + # <wide> 004E +FF2F FULLWIDTH LATIN CAPITAL LETTER O + # <wide> 004F +FF30 FULLWIDTH LATIN CAPITAL LETTER P + # <wide> 0050 +FF31 FULLWIDTH LATIN CAPITAL LETTER Q + # <wide> 0051 +FF32 FULLWIDTH LATIN CAPITAL LETTER R + # <wide> 0052 +FF33 FULLWIDTH LATIN CAPITAL LETTER S + # <wide> 0053 +FF34 FULLWIDTH LATIN CAPITAL LETTER T + # <wide> 0054 +FF35 FULLWIDTH LATIN CAPITAL LETTER U + # <wide> 0055 +FF36 FULLWIDTH LATIN CAPITAL LETTER V + # <wide> 0056 +FF37 FULLWIDTH LATIN CAPITAL LETTER W + # <wide> 0057 +FF38 FULLWIDTH LATIN CAPITAL LETTER X + # <wide> 0058 +FF39 FULLWIDTH LATIN CAPITAL LETTER Y + # <wide> 0059 +FF3A FULLWIDTH LATIN CAPITAL LETTER Z + # <wide> 005A +FF3B FULLWIDTH LEFT SQUARE BRACKET + # <wide> 005B +FF3C FULLWIDTH REVERSE SOLIDUS + # <wide> 005C +FF3D FULLWIDTH RIGHT SQUARE BRACKET + # <wide> 005D +FF3E FULLWIDTH CIRCUMFLEX ACCENT + # <wide> 005E +FF3F FULLWIDTH LOW LINE + # <wide> 005F +FF40 FULLWIDTH GRAVE ACCENT + # <wide> 0060 +FF41 FULLWIDTH LATIN SMALL LETTER A + # <wide> 0061 +FF42 FULLWIDTH LATIN SMALL LETTER B + # <wide> 0062 +FF43 FULLWIDTH LATIN SMALL LETTER C + # <wide> 0063 +FF44 FULLWIDTH LATIN SMALL LETTER D + # <wide> 0064 +FF45 FULLWIDTH LATIN SMALL LETTER E + # <wide> 0065 +FF46 FULLWIDTH LATIN SMALL LETTER F + # <wide> 0066 +FF47 FULLWIDTH LATIN SMALL LETTER G + # <wide> 0067 +FF48 FULLWIDTH LATIN SMALL LETTER H + # <wide> 0068 +FF49 FULLWIDTH LATIN SMALL LETTER I + # <wide> 0069 +FF4A FULLWIDTH LATIN SMALL LETTER J + # <wide> 006A +FF4B FULLWIDTH LATIN SMALL LETTER K + # <wide> 006B +FF4C FULLWIDTH LATIN SMALL LETTER L + # <wide> 006C +FF4D FULLWIDTH LATIN SMALL LETTER M + # <wide> 006D +FF4E FULLWIDTH LATIN SMALL LETTER N + # <wide> 006E +FF4F FULLWIDTH LATIN SMALL LETTER O + # <wide> 006F +FF50 FULLWIDTH LATIN SMALL LETTER P + # <wide> 0070 +FF51 FULLWIDTH LATIN SMALL LETTER Q + # <wide> 0071 +FF52 FULLWIDTH LATIN SMALL LETTER R + # <wide> 0072 +FF53 FULLWIDTH LATIN SMALL LETTER S + # <wide> 0073 +FF54 FULLWIDTH LATIN SMALL LETTER T + # <wide> 0074 +FF55 FULLWIDTH LATIN SMALL LETTER U + # <wide> 0075 +FF56 FULLWIDTH LATIN SMALL LETTER V + # <wide> 0076 +FF57 FULLWIDTH LATIN SMALL LETTER W + # <wide> 0077 +FF58 FULLWIDTH LATIN SMALL LETTER X + # <wide> 0078 +FF59 FULLWIDTH LATIN SMALL LETTER Y + # <wide> 0079 +FF5A FULLWIDTH LATIN SMALL LETTER Z + # <wide> 007A +FF5B FULLWIDTH LEFT CURLY BRACKET + # <wide> 007B +FF5C FULLWIDTH VERTICAL LINE + # <wide> 007C +FF5D FULLWIDTH RIGHT CURLY BRACKET + # <wide> 007D +FF5E FULLWIDTH TILDE + # <wide> 007E +@ Fullwidth brackets +FF5F FULLWIDTH LEFT WHITE PARENTHESIS * + # <wide> 2985 +FF60 FULLWIDTH RIGHT WHITE PARENTHESIS * + * the most commonly occurring glyph variant looks like doubled parentheses + # <wide> 2986 +@ Halfwidth CJK punctuation +@+ See CJK punctuation 3000 - 303F +FF61 HALFWIDTH IDEOGRAPHIC FULL STOP + # <narrow> 3002 +FF62 HALFWIDTH LEFT CORNER BRACKET + # <narrow> 300C +FF63 HALFWIDTH RIGHT CORNER BRACKET + # <narrow> 300D +FF64 HALFWIDTH IDEOGRAPHIC COMMA + # <narrow> 3001 +@ Halfwidth Katakana variants +@+ See Katakana 30A0 - 30FF +FF65 HALFWIDTH KATAKANA MIDDLE DOT + # <narrow> 30FB +FF66 HALFWIDTH KATAKANA LETTER WO + # <narrow> 30F2 +FF67 HALFWIDTH KATAKANA LETTER SMALL A + # <narrow> 30A1 +FF68 HALFWIDTH KATAKANA LETTER SMALL I + # <narrow> 30A3 +FF69 HALFWIDTH KATAKANA LETTER SMALL U + # <narrow> 30A5 +FF6A HALFWIDTH KATAKANA LETTER SMALL E + # <narrow> 30A7 +FF6B HALFWIDTH KATAKANA LETTER SMALL O + # <narrow> 30A9 +FF6C HALFWIDTH KATAKANA LETTER SMALL YA + # <narrow> 30E3 +FF6D HALFWIDTH KATAKANA LETTER SMALL YU + # <narrow> 30E5 +FF6E HALFWIDTH KATAKANA LETTER SMALL YO + # <narrow> 30E7 +FF6F HALFWIDTH KATAKANA LETTER SMALL TU + # <narrow> 30C3 +FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK + # <narrow> 30FC +FF71 HALFWIDTH KATAKANA LETTER A + # <narrow> 30A2 +FF72 HALFWIDTH KATAKANA LETTER I + # <narrow> 30A4 +FF73 HALFWIDTH KATAKANA LETTER U + # <narrow> 30A6 +FF74 HALFWIDTH KATAKANA LETTER E + # <narrow> 30A8 +FF75 HALFWIDTH KATAKANA LETTER O + # <narrow> 30AA +FF76 HALFWIDTH KATAKANA LETTER KA + # <narrow> 30AB +FF77 HALFWIDTH KATAKANA LETTER KI + # <narrow> 30AD +FF78 HALFWIDTH KATAKANA LETTER KU + # <narrow> 30AF +FF79 HALFWIDTH KATAKANA LETTER KE + # <narrow> 30B1 +FF7A HALFWIDTH KATAKANA LETTER KO + # <narrow> 30B3 +FF7B HALFWIDTH KATAKANA LETTER SA + # <narrow> 30B5 +FF7C HALFWIDTH KATAKANA LETTER SI + # <narrow> 30B7 +FF7D HALFWIDTH KATAKANA LETTER SU + # <narrow> 30B9 +FF7E HALFWIDTH KATAKANA LETTER SE + # <narrow> 30BB +FF7F HALFWIDTH KATAKANA LETTER SO + # <narrow> 30BD +FF80 HALFWIDTH KATAKANA LETTER TA + # <narrow> 30BF +FF81 HALFWIDTH KATAKANA LETTER TI + # <narrow> 30C1 +FF82 HALFWIDTH KATAKANA LETTER TU + # <narrow> 30C4 +FF83 HALFWIDTH KATAKANA LETTER TE + # <narrow> 30C6 +FF84 HALFWIDTH KATAKANA LETTER TO + # <narrow> 30C8 +FF85 HALFWIDTH KATAKANA LETTER NA + # <narrow> 30CA +FF86 HALFWIDTH KATAKANA LETTER NI + # <narrow> 30CB +FF87 HALFWIDTH KATAKANA LETTER NU + # <narrow> 30CC +FF88 HALFWIDTH KATAKANA LETTER NE + # <narrow> 30CD +FF89 HALFWIDTH KATAKANA LETTER NO + # <narrow> 30CE +FF8A HALFWIDTH KATAKANA LETTER HA + # <narrow> 30CF +FF8B HALFWIDTH KATAKANA LETTER HI + # <narrow> 30D2 +FF8C HALFWIDTH KATAKANA LETTER HU + # <narrow> 30D5 +FF8D HALFWIDTH KATAKANA LETTER HE + # <narrow> 30D8 +FF8E HALFWIDTH KATAKANA LETTER HO + # <narrow> 30DB +FF8F HALFWIDTH KATAKANA LETTER MA + # <narrow> 30DE +FF90 HALFWIDTH KATAKANA LETTER MI + # <narrow> 30DF +FF91 HALFWIDTH KATAKANA LETTER MU + # <narrow> 30E0 +FF92 HALFWIDTH KATAKANA LETTER ME + # <narrow> 30E1 +FF93 HALFWIDTH KATAKANA LETTER MO + # <narrow> 30E2 +FF94 HALFWIDTH KATAKANA LETTER YA + # <narrow> 30E4 +FF95 HALFWIDTH KATAKANA LETTER YU + # <narrow> 30E6 +FF96 HALFWIDTH KATAKANA LETTER YO + # <narrow> 30E8 +FF97 HALFWIDTH KATAKANA LETTER RA + # <narrow> 30E9 +FF98 HALFWIDTH KATAKANA LETTER RI + # <narrow> 30EA +FF99 HALFWIDTH KATAKANA LETTER RU + # <narrow> 30EB +FF9A HALFWIDTH KATAKANA LETTER RE + # <narrow> 30EC +FF9B HALFWIDTH KATAKANA LETTER RO + # <narrow> 30ED +FF9C HALFWIDTH KATAKANA LETTER WA + # <narrow> 30EF +FF9D HALFWIDTH KATAKANA LETTER N + # <narrow> 30F3 +FF9E HALFWIDTH KATAKANA VOICED SOUND MARK (halfwidth katakana-hiragana voiced sound mark) + # <narrow> 3099 +FF9F HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK (halfwidth katakana-hiragana semi-voiced sound mark) + # <narrow> 309A +@ Halfwidth Hangul variants +@+ See Hangul Compatibility Jamo 3130 - 318F +FFA0 HALFWIDTH HANGUL FILLER + # <narrow> 3164 +FFA1 HALFWIDTH HANGUL LETTER KIYEOK + # <narrow> 3131 +FFA2 HALFWIDTH HANGUL LETTER SSANGKIYEOK + # <narrow> 3132 +FFA3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS + # <narrow> 3133 +FFA4 HALFWIDTH HANGUL LETTER NIEUN + # <narrow> 3134 +FFA5 HALFWIDTH HANGUL LETTER NIEUN-CIEUC + # <narrow> 3135 +FFA6 HALFWIDTH HANGUL LETTER NIEUN-HIEUH + # <narrow> 3136 +FFA7 HALFWIDTH HANGUL LETTER TIKEUT + # <narrow> 3137 +FFA8 HALFWIDTH HANGUL LETTER SSANGTIKEUT + # <narrow> 3138 +FFA9 HALFWIDTH HANGUL LETTER RIEUL + # <narrow> 3139 +FFAA HALFWIDTH HANGUL LETTER RIEUL-KIYEOK + # <narrow> 313A +FFAB HALFWIDTH HANGUL LETTER RIEUL-MIEUM + # <narrow> 313B +FFAC HALFWIDTH HANGUL LETTER RIEUL-PIEUP + # <narrow> 313C +FFAD HALFWIDTH HANGUL LETTER RIEUL-SIOS + # <narrow> 313D +FFAE HALFWIDTH HANGUL LETTER RIEUL-THIEUTH + # <narrow> 313E +FFAF HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH + # <narrow> 313F +FFB0 HALFWIDTH HANGUL LETTER RIEUL-HIEUH + # <narrow> 3140 +FFB1 HALFWIDTH HANGUL LETTER MIEUM + # <narrow> 3141 +FFB2 HALFWIDTH HANGUL LETTER PIEUP + # <narrow> 3142 +FFB3 HALFWIDTH HANGUL LETTER SSANGPIEUP + # <narrow> 3143 +FFB4 HALFWIDTH HANGUL LETTER PIEUP-SIOS + # <narrow> 3144 +FFB5 HALFWIDTH HANGUL LETTER SIOS + # <narrow> 3145 +FFB6 HALFWIDTH HANGUL LETTER SSANGSIOS + # <narrow> 3146 +FFB7 HALFWIDTH HANGUL LETTER IEUNG + # <narrow> 3147 +FFB8 HALFWIDTH HANGUL LETTER CIEUC + # <narrow> 3148 +FFB9 HALFWIDTH HANGUL LETTER SSANGCIEUC + # <narrow> 3149 +FFBA HALFWIDTH HANGUL LETTER CHIEUCH + # <narrow> 314A +FFBB HALFWIDTH HANGUL LETTER KHIEUKH + # <narrow> 314B +FFBC HALFWIDTH HANGUL LETTER THIEUTH + # <narrow> 314C +FFBD HALFWIDTH HANGUL LETTER PHIEUPH + # <narrow> 314D +FFBE HALFWIDTH HANGUL LETTER HIEUH + # <narrow> 314E +FFC2 HALFWIDTH HANGUL LETTER A + # <narrow> 314F +FFC3 HALFWIDTH HANGUL LETTER AE + # <narrow> 3150 +FFC4 HALFWIDTH HANGUL LETTER YA + # <narrow> 3151 +FFC5 HALFWIDTH HANGUL LETTER YAE + # <narrow> 3152 +FFC6 HALFWIDTH HANGUL LETTER EO + # <narrow> 3153 +FFC7 HALFWIDTH HANGUL LETTER E + # <narrow> 3154 +FFCA HALFWIDTH HANGUL LETTER YEO + # <narrow> 3155 +FFCB HALFWIDTH HANGUL LETTER YE + # <narrow> 3156 +FFCC HALFWIDTH HANGUL LETTER O + # <narrow> 3157 +FFCD HALFWIDTH HANGUL LETTER WA + # <narrow> 3158 +FFCE HALFWIDTH HANGUL LETTER WAE + # <narrow> 3159 +FFCF HALFWIDTH HANGUL LETTER OE + # <narrow> 315A +FFD2 HALFWIDTH HANGUL LETTER YO + # <narrow> 315B +FFD3 HALFWIDTH HANGUL LETTER U + # <narrow> 315C +FFD4 HALFWIDTH HANGUL LETTER WEO + # <narrow> 315D +FFD5 HALFWIDTH HANGUL LETTER WE + # <narrow> 315E +FFD6 HALFWIDTH HANGUL LETTER WI + # <narrow> 315F +FFD7 HALFWIDTH HANGUL LETTER YU + # <narrow> 3160 +FFDA HALFWIDTH HANGUL LETTER EU + # <narrow> 3161 +FFDB HALFWIDTH HANGUL LETTER YI + # <narrow> 3162 +FFDC HALFWIDTH HANGUL LETTER I + # <narrow> 3163 +@ Fullwidth symbol variants +@+ See Latin-1 00A0 - 00FF +FFE0 FULLWIDTH CENT SIGN + # <wide> 00A2 +FFE1 FULLWIDTH POUND SIGN + # <wide> 00A3 +FFE2 FULLWIDTH NOT SIGN + # <wide> 00AC +FFE3 FULLWIDTH MACRON * + * sometimes treated as fullwidth overline + x (overline - 203E) + # <wide> 00AF +FFE4 FULLWIDTH BROKEN BAR + # <wide> 00A6 +FFE5 FULLWIDTH YEN SIGN + # <wide> 00A5 +FFE6 FULLWIDTH WON SIGN + # <wide> 20A9 +@ Halfwidth symbol variants +FFE8 HALFWIDTH FORMS LIGHT VERTICAL + # <narrow> 2502 +FFE9 HALFWIDTH LEFTWARDS ARROW + # <narrow> 2190 +FFEA HALFWIDTH UPWARDS ARROW + # <narrow> 2191 +FFEB HALFWIDTH RIGHTWARDS ARROW + # <narrow> 2192 +FFEC HALFWIDTH DOWNWARDS ARROW + # <narrow> 2193 +FFED HALFWIDTH BLACK SQUARE + # <narrow> 25A0 +FFEE HALFWIDTH WHITE CIRCLE + # <narrow> 25CB +@@ FFF0 Specials FFFF +@ Interlinear annotation +@+ Used internally for Japanese Ruby (furigana), etc. +FFF9 INTERLINEAR ANNOTATION ANCHOR + * marks start of annotated text +FFFA INTERLINEAR ANNOTATION SEPARATOR + * marks start of annotating character(s) +FFFB INTERLINEAR ANNOTATION TERMINATOR + * marks end of annotation block +@ Replacement characters +FFFC OBJECT REPLACEMENT CHARACTER + * used as placeholder in text for an otherwise unspecified object +FFFD REPLACEMENT CHARACTER + * used to replace an incoming character whose value is unknown or unrepresentable in Unicode + * compare the use of 001A as a control character to indicate the substitute function +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +FFFE <not a character> + * the value FFFE is guaranteed not to be a Unicode character at all + * may be used to detect byte order by contrast with FEFF which is a character + x (zero width no-break space - FEFF) +FFFF <not a character> + * the value FFFF is guaranteed not to be a Unicode character at all +@@ 10000 Linear B Syllabary 1007F +@ Basic syllables +10000 LINEAR B SYLLABLE B008 A +10001 LINEAR B SYLLABLE B038 E +10002 LINEAR B SYLLABLE B028 I +10003 LINEAR B SYLLABLE B061 O +10004 LINEAR B SYLLABLE B010 U +10005 LINEAR B SYLLABLE B001 DA +10006 LINEAR B SYLLABLE B045 DE +10007 LINEAR B SYLLABLE B007 DI +10008 LINEAR B SYLLABLE B014 DO +10009 LINEAR B SYLLABLE B051 DU +1000A LINEAR B SYLLABLE B057 JA +1000B LINEAR B SYLLABLE B046 JE +1000D LINEAR B SYLLABLE B036 JO +1000E LINEAR B SYLLABLE B065 JU + = ideogram B129 flour +1000F LINEAR B SYLLABLE B077 KA +10010 LINEAR B SYLLABLE B044 KE +10011 LINEAR B SYLLABLE B067 KI +10012 LINEAR B SYLLABLE B070 KO +10013 LINEAR B SYLLABLE B081 KU +10014 LINEAR B SYLLABLE B080 MA +10015 LINEAR B SYLLABLE B013 ME +10016 LINEAR B SYLLABLE B073 MI +10017 LINEAR B SYLLABLE B015 MO +10018 LINEAR B SYLLABLE B023 MU + = ideogram B109 ox +10019 LINEAR B SYLLABLE B006 NA +1001A LINEAR B SYLLABLE B024 NE +1001B LINEAR B SYLLABLE B030 NI + = ideogram B030 figs +1001C LINEAR B SYLLABLE B052 NO +1001D LINEAR B SYLLABLE B055 NU +1001E LINEAR B SYLLABLE B003 PA +1001F LINEAR B SYLLABLE B072 PE +10020 LINEAR B SYLLABLE B039 PI +10021 LINEAR B SYLLABLE B011 PO +10022 LINEAR B SYLLABLE B050 PU +10023 LINEAR B SYLLABLE B016 QA +10024 LINEAR B SYLLABLE B078 QE +10025 LINEAR B SYLLABLE B021 QI + = ideogram B106 sheep +10026 LINEAR B SYLLABLE B032 QO +10028 LINEAR B SYLLABLE B060 RA +10029 LINEAR B SYLLABLE B027 RE +1002A LINEAR B SYLLABLE B053 RI +1002B LINEAR B SYLLABLE B002 RO +1002C LINEAR B SYLLABLE B026 RU +1002D LINEAR B SYLLABLE B031 SA + = ideogram B031 flax +1002E LINEAR B SYLLABLE B009 SE +1002F LINEAR B SYLLABLE B041 SI +10030 LINEAR B SYLLABLE B012 SO +10031 LINEAR B SYLLABLE B058 SU +10032 LINEAR B SYLLABLE B059 TA +10033 LINEAR B SYLLABLE B004 TE +10034 LINEAR B SYLLABLE B037 TI +10035 LINEAR B SYLLABLE B005 TO +10036 LINEAR B SYLLABLE B069 TU +10037 LINEAR B SYLLABLE B054 WA +10038 LINEAR B SYLLABLE B075 WE +10039 LINEAR B SYLLABLE B040 WI +1003A LINEAR B SYLLABLE B042 WO +1003C LINEAR B SYLLABLE B017 ZA +1003D LINEAR B SYLLABLE B074 ZE +1003F LINEAR B SYLLABLE B020 ZO +@ Supplementary signs +10040 LINEAR B SYLLABLE B025 A2 +10041 LINEAR B SYLLABLE B043 A3 +10042 LINEAR B SYLLABLE B085 AU + = ideogram B108 pig +10043 LINEAR B SYLLABLE B071 DWE +10044 LINEAR B SYLLABLE B090 DWO +10045 LINEAR B SYLLABLE B048 NWA +10046 LINEAR B SYLLABLE B029 PU2 +10047 LINEAR B SYLLABLE B062 PTE +10048 LINEAR B SYLLABLE B076 RA2 +10049 LINEAR B SYLLABLE B033 RA3 + = ideogram B144 saffron +1004A LINEAR B SYLLABLE B068 RO2 +1004B LINEAR B SYLLABLE B066 TA2 +1004C LINEAR B SYLLABLE B087 TWE +1004D LINEAR B SYLLABLE B091 TWO +@ Symbols +10050 LINEAR B SYMBOL B018 +10051 LINEAR B SYMBOL B019 +10052 LINEAR B SYMBOL B022 + = ideogram B107 goat +10053 LINEAR B SYMBOL B034 +10054 LINEAR B SYMBOL B047 +10055 LINEAR B SYMBOL B049 +10056 LINEAR B SYMBOL B056 +10057 LINEAR B SYMBOL B063 +10058 LINEAR B SYMBOL B064 +10059 LINEAR B SYMBOL B079 +1005A LINEAR B SYMBOL B082 +1005B LINEAR B SYMBOL B083 +1005C LINEAR B SYMBOL B086 +1005D LINEAR B SYMBOL B089 +@@ 10080 Linear B Ideograms 100FF +@+ Some Linear B syllables are also used as Linear B ideograms. + x (linear b syllable b021 qi - 10025) + x (linear b symbol b022 - 10052) + x (linear b syllable b023 mu - 10018) + x (linear b syllable b030 ni - 1001B) + x (linear b syllable b031 sa - 1002D) + x (linear b syllable b033 ra3 - 10049) + x (linear b syllable b065 ju - 1000E) + x (linear b syllable b085 au - 10042) +@ People and animals +10080 LINEAR B IDEOGRAM B100 MAN +10081 LINEAR B IDEOGRAM B102 WOMAN +10082 LINEAR B IDEOGRAM B104 DEER +10083 LINEAR B IDEOGRAM B105 EQUID +10084 LINEAR B IDEOGRAM B105F MARE +10085 LINEAR B IDEOGRAM B105M STALLION +10086 LINEAR B IDEOGRAM B106F EWE +10087 LINEAR B IDEOGRAM B106M RAM +10088 LINEAR B IDEOGRAM B107F SHE-GOAT +10089 LINEAR B IDEOGRAM B107M HE-GOAT +1008A LINEAR B IDEOGRAM B108F SOW +1008B LINEAR B IDEOGRAM B108M BOAR +1008C LINEAR B IDEOGRAM B109F COW +1008D LINEAR B IDEOGRAM B109M BULL +@ Cereals and plants +1008E LINEAR B IDEOGRAM B120 WHEAT +1008F LINEAR B IDEOGRAM B121 BARLEY +10090 LINEAR B IDEOGRAM B122 OLIVE +10091 LINEAR B IDEOGRAM B123 SPICE +10092 LINEAR B IDEOGRAM B125 CYPERUS +10093 LINEAR B MONOGRAM B127 KAPO + = fruit +10094 LINEAR B MONOGRAM B128 KANAKO + = saffron +@ Extracts +10095 LINEAR B IDEOGRAM B130 OIL +10096 LINEAR B IDEOGRAM B131 WINE +10097 LINEAR B IDEOGRAM B132 +10098 LINEAR B MONOGRAM B133 AREPA + = ointment +10099 LINEAR B MONOGRAM B135 MERI + = honey +@ Metals +1009A LINEAR B IDEOGRAM B140 BRONZE +1009B LINEAR B IDEOGRAM B141 GOLD +1009C LINEAR B IDEOGRAM B142 +@ Other materials +1009D LINEAR B IDEOGRAM B145 WOOL +1009E LINEAR B IDEOGRAM B146 +1009F LINEAR B IDEOGRAM B150 +100A0 LINEAR B IDEOGRAM B151 HORN +100A1 LINEAR B IDEOGRAM B152 +100A2 LINEAR B IDEOGRAM B153 +100A3 LINEAR B IDEOGRAM B154 +100A4 LINEAR B MONOGRAM B156 TURO2 + = cheese +100A5 LINEAR B IDEOGRAM B157 +100A6 LINEAR B IDEOGRAM B158 +100A7 LINEAR B IDEOGRAM B159 CLOTH +100A8 LINEAR B IDEOGRAM B160 +100A9 LINEAR B IDEOGRAM B161 +100AA LINEAR B IDEOGRAM B162 GARMENT +100AB LINEAR B IDEOGRAM B163 ARMOUR +100AC LINEAR B IDEOGRAM B164 +100AD LINEAR B IDEOGRAM B165 +100AE LINEAR B IDEOGRAM B166 +100AF LINEAR B IDEOGRAM B167 +100B0 LINEAR B IDEOGRAM B168 +100B1 LINEAR B IDEOGRAM B169 +100B2 LINEAR B IDEOGRAM B170 +100B3 LINEAR B IDEOGRAM B171 +100B4 LINEAR B IDEOGRAM B172 +100B5 LINEAR B IDEOGRAM B173 MONTH +100B6 LINEAR B IDEOGRAM B174 +100B7 LINEAR B IDEOGRAM B176 TREE +100B8 LINEAR B IDEOGRAM B177 +100B9 LINEAR B IDEOGRAM B178 +100BA LINEAR B IDEOGRAM B179 +100BB LINEAR B IDEOGRAM B180 +100BC LINEAR B IDEOGRAM B181 +100BD LINEAR B IDEOGRAM B182 +100BE LINEAR B IDEOGRAM B183 +100BF LINEAR B IDEOGRAM B184 + * the shape of this ideogram is only partially known +100C0 LINEAR B IDEOGRAM B185 +100C1 LINEAR B IDEOGRAM B189 +100C2 LINEAR B IDEOGRAM B190 +100C3 LINEAR B IDEOGRAM B191 HELMET +100C4 LINEAR B IDEOGRAM B220 FOOTSTOOL +100C5 LINEAR B IDEOGRAM B225 BATHTUB +100C6 LINEAR B IDEOGRAM B230 SPEAR +100C7 LINEAR B IDEOGRAM B231 ARROW +100C8 LINEAR B IDEOGRAM B232 +100C9 LINEAR B IDEOGRAM B233 SWORD (pug) + = pugio +100CA LINEAR B IDEOGRAM B234 +100CB LINEAR B IDEOGRAM B236 (gup) + = "gupio", inverted sword +100CC LINEAR B IDEOGRAM B240 WHEELED CHARIOT +100CD LINEAR B IDEOGRAM B241 CHARIOT +100CE LINEAR B IDEOGRAM B242 CHARIOT FRAME +100CF LINEAR B IDEOGRAM B243 WHEEL +100D0 LINEAR B IDEOGRAM B245 +100D1 LINEAR B IDEOGRAM B246 +100D2 LINEAR B MONOGRAM B247 DIPTE +100D3 LINEAR B IDEOGRAM B248 +100D4 LINEAR B IDEOGRAM B249 +100D5 LINEAR B IDEOGRAM B251 + * the shape of this ideogram is only partially known +100D6 LINEAR B IDEOGRAM B252 + * the shape of this ideogram is only partially known +100D7 LINEAR B IDEOGRAM B253 +100D8 LINEAR B IDEOGRAM B254 DART +100D9 LINEAR B IDEOGRAM B255 +100DA LINEAR B IDEOGRAM B256 +100DB LINEAR B IDEOGRAM B257 +100DC LINEAR B IDEOGRAM B258 +100DD LINEAR B IDEOGRAM B259 +@ Vessels +100DE LINEAR B IDEOGRAM VESSEL B155 +100DF LINEAR B IDEOGRAM VESSEL B200 +100E0 LINEAR B IDEOGRAM VESSEL B201 +100E1 LINEAR B IDEOGRAM VESSEL B202 +100E2 LINEAR B IDEOGRAM VESSEL B203 +100E3 LINEAR B IDEOGRAM VESSEL B204 +100E4 LINEAR B IDEOGRAM VESSEL B205 +100E5 LINEAR B IDEOGRAM VESSEL B206 +100E6 LINEAR B IDEOGRAM VESSEL B207 +100E7 LINEAR B IDEOGRAM VESSEL B208 +100E8 LINEAR B IDEOGRAM VESSEL B209 +100E9 LINEAR B IDEOGRAM VESSEL B210 +100EA LINEAR B IDEOGRAM VESSEL B211 +100EB LINEAR B IDEOGRAM VESSEL B212 +100EC LINEAR B IDEOGRAM VESSEL B213 +100ED LINEAR B IDEOGRAM VESSEL B214 +100EE LINEAR B IDEOGRAM VESSEL B215 +100EF LINEAR B IDEOGRAM VESSEL B216 +100F0 LINEAR B IDEOGRAM VESSEL B217 +100F1 LINEAR B IDEOGRAM VESSEL B218 +100F2 LINEAR B IDEOGRAM VESSEL B219 +100F3 LINEAR B IDEOGRAM VESSEL B221 +100F4 LINEAR B IDEOGRAM VESSEL B222 +100F5 LINEAR B IDEOGRAM VESSEL B226 +100F6 LINEAR B IDEOGRAM VESSEL B227 +100F7 LINEAR B IDEOGRAM VESSEL B228 +100F8 LINEAR B IDEOGRAM VESSEL B229 +100F9 LINEAR B IDEOGRAM VESSEL B250 +100FA LINEAR B IDEOGRAM VESSEL B305 + * the shape of this ideogram is only partially known +@@ 10100 Aegean Numbers 1013F +@ Punctuation +10100 AEGEAN WORD SEPARATOR LINE +10101 AEGEAN WORD SEPARATOR DOT +10102 AEGEAN CHECK MARK +@ Numbers +10107 AEGEAN NUMBER ONE +10108 AEGEAN NUMBER TWO +10109 AEGEAN NUMBER THREE +1010A AEGEAN NUMBER FOUR +1010B AEGEAN NUMBER FIVE +1010C AEGEAN NUMBER SIX +1010D AEGEAN NUMBER SEVEN +1010E AEGEAN NUMBER EIGHT +1010F AEGEAN NUMBER NINE +10110 AEGEAN NUMBER TEN +10111 AEGEAN NUMBER TWENTY +10112 AEGEAN NUMBER THIRTY +10113 AEGEAN NUMBER FORTY +10114 AEGEAN NUMBER FIFTY +10115 AEGEAN NUMBER SIXTY +10116 AEGEAN NUMBER SEVENTY +10117 AEGEAN NUMBER EIGHTY +10118 AEGEAN NUMBER NINETY +10119 AEGEAN NUMBER ONE HUNDRED +1011A AEGEAN NUMBER TWO HUNDRED +1011B AEGEAN NUMBER THREE HUNDRED +1011C AEGEAN NUMBER FOUR HUNDRED +1011D AEGEAN NUMBER FIVE HUNDRED +1011E AEGEAN NUMBER SIX HUNDRED +1011F AEGEAN NUMBER SEVEN HUNDRED +10120 AEGEAN NUMBER EIGHT HUNDRED +10121 AEGEAN NUMBER NINE HUNDRED +10122 AEGEAN NUMBER ONE THOUSAND +10123 AEGEAN NUMBER TWO THOUSAND +10124 AEGEAN NUMBER THREE THOUSAND +10125 AEGEAN NUMBER FOUR THOUSAND +10126 AEGEAN NUMBER FIVE THOUSAND +10127 AEGEAN NUMBER SIX THOUSAND +10128 AEGEAN NUMBER SEVEN THOUSAND +10129 AEGEAN NUMBER EIGHT THOUSAND +1012A AEGEAN NUMBER NINE THOUSAND +1012B AEGEAN NUMBER TEN THOUSAND +1012C AEGEAN NUMBER TWENTY THOUSAND +1012D AEGEAN NUMBER THIRTY THOUSAND +1012E AEGEAN NUMBER FORTY THOUSAND +1012F AEGEAN NUMBER FIFTY THOUSAND +10130 AEGEAN NUMBER SIXTY THOUSAND +10131 AEGEAN NUMBER SEVENTY THOUSAND +10132 AEGEAN NUMBER EIGHTY THOUSAND +10133 AEGEAN NUMBER NINETY THOUSAND +@ Measures +10137 AEGEAN WEIGHT BASE UNIT +10138 AEGEAN WEIGHT FIRST SUBUNIT +10139 AEGEAN WEIGHT SECOND SUBUNIT +1013A AEGEAN WEIGHT THIRD SUBUNIT +1013B AEGEAN WEIGHT FOURTH SUBUNIT +1013C AEGEAN DRY MEASURE FIRST SUBUNIT +1013D AEGEAN LIQUID MEASURE FIRST SUBUNIT +1013E AEGEAN MEASURE SECOND SUBUNIT +1013F AEGEAN MEASURE THIRD SUBUNIT +@@ 10140 Ancient Greek Numbers 1018F +@ Ancient Greek acrophonic numerals +@+ These are shown as sans-serif forms because that corresponds more closely to their appearance in ancient texts. +10140 GREEK ACROPHONIC ATTIC ONE QUARTER +10141 GREEK ACROPHONIC ATTIC ONE HALF +10142 GREEK ACROPHONIC ATTIC ONE DRACHMA +10143 GREEK ACROPHONIC ATTIC FIVE +10144 GREEK ACROPHONIC ATTIC FIFTY +10145 GREEK ACROPHONIC ATTIC FIVE HUNDRED +10146 GREEK ACROPHONIC ATTIC FIVE THOUSAND +10147 GREEK ACROPHONIC ATTIC FIFTY THOUSAND +10148 GREEK ACROPHONIC ATTIC FIVE TALENTS +10149 GREEK ACROPHONIC ATTIC TEN TALENTS +1014A GREEK ACROPHONIC ATTIC FIFTY TALENTS +1014B GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS +1014C GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS +1014D GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS +1014E GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS +1014F GREEK ACROPHONIC ATTIC FIVE STATERS +10150 GREEK ACROPHONIC ATTIC TEN STATERS +10151 GREEK ACROPHONIC ATTIC FIFTY STATERS +10152 GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS +10153 GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS +10154 GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS +10155 GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS +10156 GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS +10157 GREEK ACROPHONIC ATTIC TEN MNAS +10158 GREEK ACROPHONIC HERAEUM ONE PLETHRON +10159 GREEK ACROPHONIC THESPIAN ONE +1015A GREEK ACROPHONIC HERMIONIAN ONE +1015B GREEK ACROPHONIC EPIDAUREAN TWO + x (two dot punctuation - 205A) +1015C GREEK ACROPHONIC THESPIAN TWO +1015D GREEK ACROPHONIC CYRENAIC TWO DRACHMAS +1015E GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS + * top line is at cap height, unlike 10111 + x (aegean number twenty - 10111) +1015F GREEK ACROPHONIC TROEZENIAN FIVE +10160 GREEK ACROPHONIC TROEZENIAN TEN +10161 GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM +10162 GREEK ACROPHONIC HERMIONIAN TEN +10163 GREEK ACROPHONIC MESSENIAN TEN +10164 GREEK ACROPHONIC THESPIAN TEN +10165 GREEK ACROPHONIC THESPIAN THIRTY +10166 GREEK ACROPHONIC TROEZENIAN FIFTY +10167 GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM +10168 GREEK ACROPHONIC HERMIONIAN FIFTY +10169 GREEK ACROPHONIC THESPIAN FIFTY +1016A GREEK ACROPHONIC THESPIAN ONE HUNDRED +1016B GREEK ACROPHONIC THESPIAN THREE HUNDRED +1016C GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED +1016D GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED +1016E GREEK ACROPHONIC THESPIAN FIVE HUNDRED +1016F GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED +10170 GREEK ACROPHONIC NAXIAN FIVE HUNDRED +10171 GREEK ACROPHONIC THESPIAN ONE THOUSAND +10172 GREEK ACROPHONIC THESPIAN FIVE THOUSAND +10173 GREEK ACROPHONIC DELPHIC FIVE MNAS +10174 GREEK ACROPHONIC STRATIAN FIFTY MNAS +@ Ancient Greek papyrological numbers +10175 GREEK ONE HALF SIGN +10176 GREEK ONE HALF SIGN ALTERNATE FORM +10177 GREEK TWO THIRDS SIGN +10178 GREEK THREE QUARTERS SIGN +10179 GREEK YEAR SIGN +1017A GREEK TALENT SIGN +1017B GREEK DRACHMA SIGN +1017C GREEK OBOL SIGN +1017D GREEK TWO OBOLS SIGN +1017E GREEK THREE OBOLS SIGN +1017F GREEK FOUR OBOLS SIGN +10180 GREEK FIVE OBOLS SIGN +10181 GREEK METRETES SIGN +10182 GREEK KYATHOS BASE SIGN +10183 GREEK LITRA SIGN +10184 GREEK OUNKIA SIGN +10185 GREEK XESTES SIGN +10186 GREEK ARTABE SIGN +10187 GREEK AROURA SIGN +10188 GREEK GRAMMA SIGN +10189 GREEK TRYBLION BASE SIGN +1018A GREEK ZERO SIGN +@@ 10300 Old Italic 1032F +@ Letters +10300 OLD ITALIC LETTER A +10301 OLD ITALIC LETTER BE +10302 OLD ITALIC LETTER KE +10303 OLD ITALIC LETTER DE +10304 OLD ITALIC LETTER E +10305 OLD ITALIC LETTER VE +10306 OLD ITALIC LETTER ZE +10307 OLD ITALIC LETTER HE +10308 OLD ITALIC LETTER THE +10309 OLD ITALIC LETTER I +1030A OLD ITALIC LETTER KA +1030B OLD ITALIC LETTER EL +1030C OLD ITALIC LETTER EM +1030D OLD ITALIC LETTER EN +1030E OLD ITALIC LETTER ESH +1030F OLD ITALIC LETTER O (Faliscan) +10310 OLD ITALIC LETTER PE +10311 OLD ITALIC LETTER SHE +10312 OLD ITALIC LETTER KU +10313 OLD ITALIC LETTER ER +10314 OLD ITALIC LETTER ES +10315 OLD ITALIC LETTER TE +10316 OLD ITALIC LETTER U +10317 OLD ITALIC LETTER EKS (Faliscan) +10318 OLD ITALIC LETTER PHE +10319 OLD ITALIC LETTER KHE +1031A OLD ITALIC LETTER EF +1031B OLD ITALIC LETTER ERS (Umbrian) +1031C OLD ITALIC LETTER CHE (Umbrian) +1031D OLD ITALIC LETTER II (Oscan) +1031E OLD ITALIC LETTER UU (Oscan) +@ Numerals +10320 OLD ITALIC NUMERAL ONE +10321 OLD ITALIC NUMERAL FIVE +10322 OLD ITALIC NUMERAL TEN +10323 OLD ITALIC NUMERAL FIFTY +@@ 10330 Gothic 1034F +@ Letters +10330 GOTHIC LETTER AHSA +10331 GOTHIC LETTER BAIRKAN +10332 GOTHIC LETTER GIBA +10333 GOTHIC LETTER DAGS +10334 GOTHIC LETTER AIHVUS +10335 GOTHIC LETTER QAIRTHRA +10336 GOTHIC LETTER IUJA +10337 GOTHIC LETTER HAGL +10338 GOTHIC LETTER THIUTH +10339 GOTHIC LETTER EIS +1033A GOTHIC LETTER KUSMA +1033B GOTHIC LETTER LAGUS +1033C GOTHIC LETTER MANNA +1033D GOTHIC LETTER NAUTHS +1033E GOTHIC LETTER JER +1033F GOTHIC LETTER URUS +10340 GOTHIC LETTER PAIRTHRA +10341 GOTHIC LETTER NINETY +10342 GOTHIC LETTER RAIDA +10343 GOTHIC LETTER SAUIL +10344 GOTHIC LETTER TEIWS +10345 GOTHIC LETTER WINJA +10346 GOTHIC LETTER FAIHU +10347 GOTHIC LETTER IGGWS +10348 GOTHIC LETTER HWAIR +10349 GOTHIC LETTER OTHAL +1034A GOTHIC LETTER NINE HUNDRED +@@ 10380 Ugaritic 1039F +@ Letters +10380 UGARITIC LETTER ALPA +10381 UGARITIC LETTER BETA +10382 UGARITIC LETTER GAMLA +10383 UGARITIC LETTER KHA +10384 UGARITIC LETTER DELTA +10385 UGARITIC LETTER HO +10386 UGARITIC LETTER WO +10387 UGARITIC LETTER ZETA +10388 UGARITIC LETTER HOTA +10389 UGARITIC LETTER TET +1038A UGARITIC LETTER YOD +1038B UGARITIC LETTER KAF +1038C UGARITIC LETTER SHIN +1038D UGARITIC LETTER LAMDA +1038E UGARITIC LETTER MEM +1038F UGARITIC LETTER DHAL +10390 UGARITIC LETTER NUN +10391 UGARITIC LETTER ZU +10392 UGARITIC LETTER SAMKA +10393 UGARITIC LETTER AIN +10394 UGARITIC LETTER PU +10395 UGARITIC LETTER SADE +10396 UGARITIC LETTER QOPA +10397 UGARITIC LETTER RASHA +10398 UGARITIC LETTER THANNA +10399 UGARITIC LETTER GHAIN +1039A UGARITIC LETTER TO +1039B UGARITIC LETTER I +1039C UGARITIC LETTER U +1039D UGARITIC LETTER SSU +@ Punctuation +1039F UGARITIC WORD DIVIDER +@@ 103A0 Old Persian 103DF +@ Independent vowels +103A0 OLD PERSIAN SIGN A +103A1 OLD PERSIAN SIGN I +103A2 OLD PERSIAN SIGN U +@ Consonants +103A3 OLD PERSIAN SIGN KA +103A4 OLD PERSIAN SIGN KU +103A5 OLD PERSIAN SIGN GA +103A6 OLD PERSIAN SIGN GU +103A7 OLD PERSIAN SIGN XA +103A8 OLD PERSIAN SIGN CA +103A9 OLD PERSIAN SIGN JA +103AA OLD PERSIAN SIGN JI +103AB OLD PERSIAN SIGN TA +103AC OLD PERSIAN SIGN TU +103AD OLD PERSIAN SIGN DA +103AE OLD PERSIAN SIGN DI +103AF OLD PERSIAN SIGN DU +103B0 OLD PERSIAN SIGN THA +103B1 OLD PERSIAN SIGN PA +103B2 OLD PERSIAN SIGN BA +103B3 OLD PERSIAN SIGN FA +103B4 OLD PERSIAN SIGN NA +103B5 OLD PERSIAN SIGN NU +103B6 OLD PERSIAN SIGN MA +103B7 OLD PERSIAN SIGN MI +103B8 OLD PERSIAN SIGN MU +103B9 OLD PERSIAN SIGN YA +103BA OLD PERSIAN SIGN VA +103BB OLD PERSIAN SIGN VI +103BC OLD PERSIAN SIGN RA +103BD OLD PERSIAN SIGN RU +103BE OLD PERSIAN SIGN LA +103BF OLD PERSIAN SIGN SA +103C0 OLD PERSIAN SIGN ZA +103C1 OLD PERSIAN SIGN SHA +103C2 OLD PERSIAN SIGN SSA +103C3 OLD PERSIAN SIGN HA +@ Various signs +103C8 OLD PERSIAN SIGN AURAMAZDAA +103C9 OLD PERSIAN SIGN AURAMAZDAA-2 +103CA OLD PERSIAN SIGN AURAMAZDAAHA +103CB OLD PERSIAN SIGN XSHAAYATHIYA +103CC OLD PERSIAN SIGN DAHYAAUSH +103CD OLD PERSIAN SIGN DAHYAAUSH-2 +103CE OLD PERSIAN SIGN BAGA +103CF OLD PERSIAN SIGN BUUMISH +@ Punctuation +103D0 OLD PERSIAN WORD DIVIDER +@ Numbers +103D1 OLD PERSIAN NUMBER ONE +103D2 OLD PERSIAN NUMBER TWO +103D3 OLD PERSIAN NUMBER TEN +103D4 OLD PERSIAN NUMBER TWENTY +103D5 OLD PERSIAN NUMBER HUNDRED +@@ 10400 Deseret 1044F +@ Uppercase letters +10400 DESERET CAPITAL LETTER LONG I +10401 DESERET CAPITAL LETTER LONG E +10402 DESERET CAPITAL LETTER LONG A +10403 DESERET CAPITAL LETTER LONG AH +10404 DESERET CAPITAL LETTER LONG O +10405 DESERET CAPITAL LETTER LONG OO +10406 DESERET CAPITAL LETTER SHORT I +10407 DESERET CAPITAL LETTER SHORT E +10408 DESERET CAPITAL LETTER SHORT A +10409 DESERET CAPITAL LETTER SHORT AH +1040A DESERET CAPITAL LETTER SHORT O +1040B DESERET CAPITAL LETTER SHORT OO +1040C DESERET CAPITAL LETTER AY +1040D DESERET CAPITAL LETTER OW +1040E DESERET CAPITAL LETTER WU +1040F DESERET CAPITAL LETTER YEE +10410 DESERET CAPITAL LETTER H +10411 DESERET CAPITAL LETTER PEE +10412 DESERET CAPITAL LETTER BEE +10413 DESERET CAPITAL LETTER TEE +10414 DESERET CAPITAL LETTER DEE +10415 DESERET CAPITAL LETTER CHEE +10416 DESERET CAPITAL LETTER JEE +10417 DESERET CAPITAL LETTER KAY +10418 DESERET CAPITAL LETTER GAY +10419 DESERET CAPITAL LETTER EF +1041A DESERET CAPITAL LETTER VEE +1041B DESERET CAPITAL LETTER ETH +1041C DESERET CAPITAL LETTER THEE +1041D DESERET CAPITAL LETTER ES +1041E DESERET CAPITAL LETTER ZEE +1041F DESERET CAPITAL LETTER ESH +10420 DESERET CAPITAL LETTER ZHEE +10421 DESERET CAPITAL LETTER ER +10422 DESERET CAPITAL LETTER EL +10423 DESERET CAPITAL LETTER EM +10424 DESERET CAPITAL LETTER EN +10425 DESERET CAPITAL LETTER ENG +10426 DESERET CAPITAL LETTER OI +10427 DESERET CAPITAL LETTER EW +@ Lowercase letters +10428 DESERET SMALL LETTER LONG I +10429 DESERET SMALL LETTER LONG E +1042A DESERET SMALL LETTER LONG A +1042B DESERET SMALL LETTER LONG AH +1042C DESERET SMALL LETTER LONG O +1042D DESERET SMALL LETTER LONG OO +1042E DESERET SMALL LETTER SHORT I +1042F DESERET SMALL LETTER SHORT E +10430 DESERET SMALL LETTER SHORT A +10431 DESERET SMALL LETTER SHORT AH +10432 DESERET SMALL LETTER SHORT O +10433 DESERET SMALL LETTER SHORT OO +10434 DESERET SMALL LETTER AY +10435 DESERET SMALL LETTER OW +10436 DESERET SMALL LETTER WU +10437 DESERET SMALL LETTER YEE +10438 DESERET SMALL LETTER H +10439 DESERET SMALL LETTER PEE +1043A DESERET SMALL LETTER BEE +1043B DESERET SMALL LETTER TEE +1043C DESERET SMALL LETTER DEE +1043D DESERET SMALL LETTER CHEE +1043E DESERET SMALL LETTER JEE +1043F DESERET SMALL LETTER KAY +10440 DESERET SMALL LETTER GAY +10441 DESERET SMALL LETTER EF +10442 DESERET SMALL LETTER VEE +10443 DESERET SMALL LETTER ETH +10444 DESERET SMALL LETTER THEE +10445 DESERET SMALL LETTER ES +10446 DESERET SMALL LETTER ZEE +10447 DESERET SMALL LETTER ESH +10448 DESERET SMALL LETTER ZHEE +10449 DESERET SMALL LETTER ER +1044A DESERET SMALL LETTER EL +1044B DESERET SMALL LETTER EM +1044C DESERET SMALL LETTER EN +1044D DESERET SMALL LETTER ENG +1044E DESERET SMALL LETTER OI +1044F DESERET SMALL LETTER EW +@@ 10450 Shavian 1047F +@ Consonants +10450 SHAVIAN LETTER PEEP +10451 SHAVIAN LETTER TOT +10452 SHAVIAN LETTER KICK +10453 SHAVIAN LETTER FEE +10454 SHAVIAN LETTER THIGH +10455 SHAVIAN LETTER SO +10456 SHAVIAN LETTER SURE +10457 SHAVIAN LETTER CHURCH +10458 SHAVIAN LETTER YEA +10459 SHAVIAN LETTER HUNG +1045A SHAVIAN LETTER BIB +1045B SHAVIAN LETTER DEAD +1045C SHAVIAN LETTER GAG +1045D SHAVIAN LETTER VOW +1045E SHAVIAN LETTER THEY +1045F SHAVIAN LETTER ZOO +10460 SHAVIAN LETTER MEASURE +10461 SHAVIAN LETTER JUDGE +10462 SHAVIAN LETTER WOE +10463 SHAVIAN LETTER HA-HA +10464 SHAVIAN LETTER LOLL +10465 SHAVIAN LETTER MIME +@ Vowels +10466 SHAVIAN LETTER IF +10467 SHAVIAN LETTER EGG +10468 SHAVIAN LETTER ASH +10469 SHAVIAN LETTER ADO +1046A SHAVIAN LETTER ON +1046B SHAVIAN LETTER WOOL +1046C SHAVIAN LETTER OUT +1046D SHAVIAN LETTER AH +1046E SHAVIAN LETTER ROAR +1046F SHAVIAN LETTER NUN +10470 SHAVIAN LETTER EAT +10471 SHAVIAN LETTER AGE +10472 SHAVIAN LETTER ICE +10473 SHAVIAN LETTER UP +10474 SHAVIAN LETTER OAK +10475 SHAVIAN LETTER OOZE +10476 SHAVIAN LETTER OIL +10477 SHAVIAN LETTER AWE +10478 SHAVIAN LETTER ARE +10479 SHAVIAN LETTER OR +1047A SHAVIAN LETTER AIR +1047B SHAVIAN LETTER ERR +1047C SHAVIAN LETTER ARRAY +1047D SHAVIAN LETTER EAR +1047E SHAVIAN LETTER IAN +1047F SHAVIAN LETTER YEW +@@ 10480 Osmanya 104AF +@ Letters +10480 OSMANYA LETTER ALEF +10481 OSMANYA LETTER BA +10482 OSMANYA LETTER TA +10483 OSMANYA LETTER JA +10484 OSMANYA LETTER XA +10485 OSMANYA LETTER KHA +10486 OSMANYA LETTER DEEL +10487 OSMANYA LETTER RA +10488 OSMANYA LETTER SA +10489 OSMANYA LETTER SHIIN +1048A OSMANYA LETTER DHA +1048B OSMANYA LETTER CAYN +1048C OSMANYA LETTER GA +1048D OSMANYA LETTER FA +1048E OSMANYA LETTER QAAF +1048F OSMANYA LETTER KAAF +10490 OSMANYA LETTER LAAN +10491 OSMANYA LETTER MIIN +10492 OSMANYA LETTER NUUN +10493 OSMANYA LETTER WAW +10494 OSMANYA LETTER HA +10495 OSMANYA LETTER YA +10496 OSMANYA LETTER A +10497 OSMANYA LETTER E +10498 OSMANYA LETTER I +10499 OSMANYA LETTER O +1049A OSMANYA LETTER U +1049B OSMANYA LETTER AA +1049C OSMANYA LETTER EE +1049D OSMANYA LETTER OO +@ Digits +104A0 OSMANYA DIGIT ZERO +104A1 OSMANYA DIGIT ONE +104A2 OSMANYA DIGIT TWO +104A3 OSMANYA DIGIT THREE +104A4 OSMANYA DIGIT FOUR +104A5 OSMANYA DIGIT FIVE +104A6 OSMANYA DIGIT SIX +104A7 OSMANYA DIGIT SEVEN +104A8 OSMANYA DIGIT EIGHT +104A9 OSMANYA DIGIT NINE +@@ 10800 Cypriot Syllabary 1083F +@ Syllables +10800 CYPRIOT SYLLABLE A +10801 CYPRIOT SYLLABLE E +10802 CYPRIOT SYLLABLE I +10803 CYPRIOT SYLLABLE O +10804 CYPRIOT SYLLABLE U +10805 CYPRIOT SYLLABLE JA +10808 CYPRIOT SYLLABLE JO +1080A CYPRIOT SYLLABLE KA +1080B CYPRIOT SYLLABLE KE +1080C CYPRIOT SYLLABLE KI +1080D CYPRIOT SYLLABLE KO +1080E CYPRIOT SYLLABLE KU +1080F CYPRIOT SYLLABLE LA +10810 CYPRIOT SYLLABLE LE +10811 CYPRIOT SYLLABLE LI +10812 CYPRIOT SYLLABLE LO +10813 CYPRIOT SYLLABLE LU +10814 CYPRIOT SYLLABLE MA +10815 CYPRIOT SYLLABLE ME +10816 CYPRIOT SYLLABLE MI +10817 CYPRIOT SYLLABLE MO +10818 CYPRIOT SYLLABLE MU +10819 CYPRIOT SYLLABLE NA +1081A CYPRIOT SYLLABLE NE +1081B CYPRIOT SYLLABLE NI +1081C CYPRIOT SYLLABLE NO +1081D CYPRIOT SYLLABLE NU +1081E CYPRIOT SYLLABLE PA +1081F CYPRIOT SYLLABLE PE +10820 CYPRIOT SYLLABLE PI +10821 CYPRIOT SYLLABLE PO +10822 CYPRIOT SYLLABLE PU +10823 CYPRIOT SYLLABLE RA +10824 CYPRIOT SYLLABLE RE +10825 CYPRIOT SYLLABLE RI +10826 CYPRIOT SYLLABLE RO +10827 CYPRIOT SYLLABLE RU +10828 CYPRIOT SYLLABLE SA +10829 CYPRIOT SYLLABLE SE +1082A CYPRIOT SYLLABLE SI +1082B CYPRIOT SYLLABLE SO +1082C CYPRIOT SYLLABLE SU +1082D CYPRIOT SYLLABLE TA +1082E CYPRIOT SYLLABLE TE +1082F CYPRIOT SYLLABLE TI +10830 CYPRIOT SYLLABLE TO +10831 CYPRIOT SYLLABLE TU +10832 CYPRIOT SYLLABLE WA +10833 CYPRIOT SYLLABLE WE +10834 CYPRIOT SYLLABLE WI +10835 CYPRIOT SYLLABLE WO +10837 CYPRIOT SYLLABLE XA +10838 CYPRIOT SYLLABLE XE +1083C CYPRIOT SYLLABLE ZA +1083F CYPRIOT SYLLABLE ZO +@@ 10A00 Kharoshthi 10A5F +@ Vowels +10A00 KHAROSHTHI LETTER A +10A01 KHAROSHTHI VOWEL SIGN I +10A02 KHAROSHTHI VOWEL SIGN U +10A03 KHAROSHTHI VOWEL SIGN VOCALIC R +10A05 KHAROSHTHI VOWEL SIGN E +10A06 KHAROSHTHI VOWEL SIGN O +@ Length mark +10A0C KHAROSHTHI VOWEL LENGTH MARK +@ Various signs +10A0D KHAROSHTHI SIGN DOUBLE RING BELOW +10A0E KHAROSHTHI SIGN ANUSVARA +10A0F KHAROSHTHI SIGN VISARGA +@ Consonants +10A10 KHAROSHTHI LETTER KA +10A11 KHAROSHTHI LETTER KHA +10A12 KHAROSHTHI LETTER GA +10A13 KHAROSHTHI LETTER GHA +10A15 KHAROSHTHI LETTER CA +10A16 KHAROSHTHI LETTER CHA +10A17 KHAROSHTHI LETTER JA +10A19 KHAROSHTHI LETTER NYA +10A1A KHAROSHTHI LETTER TTA +10A1B KHAROSHTHI LETTER TTHA +10A1C KHAROSHTHI LETTER DDA +10A1D KHAROSHTHI LETTER DDHA +10A1E KHAROSHTHI LETTER NNA +10A1F KHAROSHTHI LETTER TA +10A20 KHAROSHTHI LETTER THA +10A21 KHAROSHTHI LETTER DA +10A22 KHAROSHTHI LETTER DHA +10A23 KHAROSHTHI LETTER NA +10A24 KHAROSHTHI LETTER PA +10A25 KHAROSHTHI LETTER PHA +10A26 KHAROSHTHI LETTER BA +10A27 KHAROSHTHI LETTER BHA +10A28 KHAROSHTHI LETTER MA +10A29 KHAROSHTHI LETTER YA +10A2A KHAROSHTHI LETTER RA +10A2B KHAROSHTHI LETTER LA +10A2C KHAROSHTHI LETTER VA +10A2D KHAROSHTHI LETTER SHA +10A2E KHAROSHTHI LETTER SSA +10A2F KHAROSHTHI LETTER SA +10A30 KHAROSHTHI LETTER ZA +10A31 KHAROSHTHI LETTER HA +10A32 KHAROSHTHI LETTER KKA +10A33 KHAROSHTHI LETTER TTTHA +@ Various signs +10A38 KHAROSHTHI SIGN BAR ABOVE +10A39 KHAROSHTHI SIGN CAUDA +10A3A KHAROSHTHI SIGN DOT BELOW +@ Virama +10A3F KHAROSHTHI VIRAMA + = halant + * suppresses inherent vowel +@ Digits +10A40 KHAROSHTHI DIGIT ONE +10A41 KHAROSHTHI DIGIT TWO +10A42 KHAROSHTHI DIGIT THREE +10A43 KHAROSHTHI DIGIT FOUR +@ Numbers +10A44 KHAROSHTHI NUMBER TEN +10A45 KHAROSHTHI NUMBER TWENTY +10A46 KHAROSHTHI NUMBER ONE HUNDRED +10A47 KHAROSHTHI NUMBER ONE THOUSAND +@ Punctuation +10A50 KHAROSHTHI PUNCTUATION DOT +10A51 KHAROSHTHI PUNCTUATION SMALL CIRCLE +10A52 KHAROSHTHI PUNCTUATION CIRCLE +10A53 KHAROSHTHI PUNCTUATION CRESCENT BAR +10A54 KHAROSHTHI PUNCTUATION MANGALAM +10A55 KHAROSHTHI PUNCTUATION LOTUS +10A56 KHAROSHTHI PUNCTUATION DANDA +10A57 KHAROSHTHI PUNCTUATION DOUBLE DANDA +10A58 KHAROSHTHI PUNCTUATION LINES +@@ 1D000 Byzantine Musical Symbols 1D0FF +@ Prosodies (Prosodics) +1D000 BYZANTINE MUSICAL SYMBOL PSILI +1D001 BYZANTINE MUSICAL SYMBOL DASEIA +1D002 BYZANTINE MUSICAL SYMBOL PERISPOMENI +@ Ekfonetika +1D003 BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON +1D004 BYZANTINE MUSICAL SYMBOL OXEIA DIPLI +1D005 BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON +1D006 BYZANTINE MUSICAL SYMBOL VAREIA DIPLI +1D007 BYZANTINE MUSICAL SYMBOL KATHISTI +1D008 BYZANTINE MUSICAL SYMBOL SYRMATIKI +1D009 BYZANTINE MUSICAL SYMBOL PARAKLITIKI +1D00A BYZANTINE MUSICAL SYMBOL YPOKRISIS +1D00B BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI +1D00C BYZANTINE MUSICAL SYMBOL KREMASTI +1D00D BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON +1D00E BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON +1D00F BYZANTINE MUSICAL SYMBOL TELEIA +1D010 BYZANTINE MUSICAL SYMBOL KENTIMATA +1D011 BYZANTINE MUSICAL SYMBOL APOSTROFOS +1D012 BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI +1D013 BYZANTINE MUSICAL SYMBOL SYNEVMA +1D014 BYZANTINE MUSICAL SYMBOL THITA +@ Melodimata (Melodics) +1D015 BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION +1D016 BYZANTINE MUSICAL SYMBOL GORGON ARCHAION +1D017 BYZANTINE MUSICAL SYMBOL PSILON +1D018 BYZANTINE MUSICAL SYMBOL CHAMILON +1D019 BYZANTINE MUSICAL SYMBOL VATHY +1D01A BYZANTINE MUSICAL SYMBOL ISON ARCHAION +1D01B BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION +1D01C BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION +1D01D BYZANTINE MUSICAL SYMBOL SAXIMATA +1D01E BYZANTINE MUSICAL SYMBOL PARICHON +1D01F BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA +1D020 BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION +1D021 BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION +1D022 BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION +1D023 BYZANTINE MUSICAL SYMBOL APOTHEMA +1D024 BYZANTINE MUSICAL SYMBOL KLASMA +1D025 BYZANTINE MUSICAL SYMBOL REVMA +1D026 BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION +1D027 BYZANTINE MUSICAL SYMBOL TINAGMA +1D028 BYZANTINE MUSICAL SYMBOL ANATRICHISMA +1D029 BYZANTINE MUSICAL SYMBOL SEISMA +1D02A BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION +1D02B BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU +1D02C BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION +1D02D BYZANTINE MUSICAL SYMBOL THEMA +1D02E BYZANTINE MUSICAL SYMBOL LEMOI +1D02F BYZANTINE MUSICAL SYMBOL DYO +1D030 BYZANTINE MUSICAL SYMBOL TRIA +1D031 BYZANTINE MUSICAL SYMBOL TESSERA +1D032 BYZANTINE MUSICAL SYMBOL KRATIMATA +1D033 BYZANTINE MUSICAL SYMBOL APESO EXO NEO +1D034 BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION +1D035 BYZANTINE MUSICAL SYMBOL IMIFTHORA +1D036 BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION +1D037 BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON +1D038 BYZANTINE MUSICAL SYMBOL PELASTON +1D039 BYZANTINE MUSICAL SYMBOL PSIFISTON +1D03A BYZANTINE MUSICAL SYMBOL KONTEVMA +1D03B BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION +1D03C BYZANTINE MUSICAL SYMBOL RAPISMA +1D03D BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION +1D03E BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION +1D03F BYZANTINE MUSICAL SYMBOL ICHADIN +1D040 BYZANTINE MUSICAL SYMBOL NANA +1D041 BYZANTINE MUSICAL SYMBOL PETASMA +1D042 BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO +1D043 BYZANTINE MUSICAL SYMBOL TROMIKON ALLO +1D044 BYZANTINE MUSICAL SYMBOL STRAGGISMATA +1D045 BYZANTINE MUSICAL SYMBOL GRONTHISMATA +@ Fonitika (Vocals) +1D046 BYZANTINE MUSICAL SYMBOL ISON NEO +1D047 BYZANTINE MUSICAL SYMBOL OLIGON NEO +1D048 BYZANTINE MUSICAL SYMBOL OXEIA NEO +1D049 BYZANTINE MUSICAL SYMBOL PETASTI +1D04A BYZANTINE MUSICAL SYMBOL KOUFISMA +1D04B BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA +1D04C BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA +1D04D BYZANTINE MUSICAL SYMBOL PELASTON NEO +1D04E BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO +1D04F BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO +1D050 BYZANTINE MUSICAL SYMBOL YPSILI +1D051 BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO +1D052 BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO +1D053 BYZANTINE MUSICAL SYMBOL YPORROI +1D054 BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON +1D055 BYZANTINE MUSICAL SYMBOL ELAFRON +1D056 BYZANTINE MUSICAL SYMBOL CHAMILI +@ Afona or Ypostaseis (Mutes or Hypostases) +1D057 BYZANTINE MUSICAL SYMBOL MIKRON ISON +1D058 BYZANTINE MUSICAL SYMBOL VAREIA NEO +1D059 BYZANTINE MUSICAL SYMBOL PIASMA NEO +1D05A BYZANTINE MUSICAL SYMBOL PSIFISTON NEO +1D05B BYZANTINE MUSICAL SYMBOL OMALON +1D05C BYZANTINE MUSICAL SYMBOL ANTIKENOMA +1D05D BYZANTINE MUSICAL SYMBOL LYGISMA +1D05E BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO +1D05F BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO +1D060 BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA +1D061 BYZANTINE MUSICAL SYMBOL KYLISMA +1D062 BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA +1D063 BYZANTINE MUSICAL SYMBOL TROMIKON NEO +1D064 BYZANTINE MUSICAL SYMBOL EKSTREPTON +1D065 BYZANTINE MUSICAL SYMBOL SYNAGMA NEO +1D066 BYZANTINE MUSICAL SYMBOL SYRMA +1D067 BYZANTINE MUSICAL SYMBOL CHOREVMA NEO +1D068 BYZANTINE MUSICAL SYMBOL EPEGERMA +1D069 BYZANTINE MUSICAL SYMBOL SEISMA NEO +1D06A BYZANTINE MUSICAL SYMBOL XIRON KLASMA +1D06B BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON +1D06C BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA +1D06D BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA +1D06E BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA +1D06F BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA +1D070 BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA +1D071 BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA +1D072 BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON +1D073 BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON +1D074 BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON +1D075 BYZANTINE MUSICAL SYMBOL OYRANISMA NEO +1D076 BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO +1D077 BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO +1D078 BYZANTINE MUSICAL SYMBOL THEMA APLOUN +1D079 BYZANTINE MUSICAL SYMBOL THES KAI APOTHES +1D07A BYZANTINE MUSICAL SYMBOL KATAVASMA +1D07B BYZANTINE MUSICAL SYMBOL ENDOFONON +1D07C BYZANTINE MUSICAL SYMBOL YFEN KATO +1D07D BYZANTINE MUSICAL SYMBOL YFEN ANO +1D07E BYZANTINE MUSICAL SYMBOL STAVROS +@ Argies (Retards) +1D07F BYZANTINE MUSICAL SYMBOL KLASMA ANO +1D080 BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION +1D081 BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION +1D082 BYZANTINE MUSICAL SYMBOL KRATIMA ALLO +1D083 BYZANTINE MUSICAL SYMBOL KRATIMA NEO +1D084 BYZANTINE MUSICAL SYMBOL APODERMA NEO +1D085 BYZANTINE MUSICAL SYMBOL APLI +1D086 BYZANTINE MUSICAL SYMBOL DIPLI +1D087 BYZANTINE MUSICAL SYMBOL TRIPLI +1D088 BYZANTINE MUSICAL SYMBOL TETRAPLI +1D089 BYZANTINE MUSICAL SYMBOL KORONIS +@ Leimmata or Siopes (Leimmas or Silencers) +1D08A BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU +1D08B BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON +1D08C BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON +1D08D BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON +1D08E BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU +@ Synagmata or Gorgotites (Synagmas or Quickeners) +1D08F BYZANTINE MUSICAL SYMBOL GORGON NEO ANO +1D090 BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA +1D091 BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA +1D092 BYZANTINE MUSICAL SYMBOL DIGORGON +1D093 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO +1D094 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO +1D095 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA +1D096 BYZANTINE MUSICAL SYMBOL TRIGORGON +1D097 BYZANTINE MUSICAL SYMBOL ARGON +1D098 BYZANTINE MUSICAL SYMBOL IMIDIARGON +1D099 BYZANTINE MUSICAL SYMBOL DIARGON +@ Agogika (Conduits) +1D09A BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI +1D09B BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI +1D09C BYZANTINE MUSICAL SYMBOL AGOGI ARGI +1D09D BYZANTINE MUSICAL SYMBOL AGOGI METRIA +1D09E BYZANTINE MUSICAL SYMBOL AGOGI MESI +1D09F BYZANTINE MUSICAL SYMBOL AGOGI GORGI +1D0A0 BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI +1D0A1 BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI +@ Ichimata and Martyrika (Ichimas and Evidentials) +1D0A2 BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS +1D0A3 BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS +1D0A4 BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS +1D0A5 BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS +1D0A6 BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS +1D0A7 BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS +1D0A8 BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS +1D0A9 BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS +1D0AA BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS +1D0AB BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS +1D0AC BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS +1D0AD BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS +1D0AE BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS +1D0AF BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS +1D0B0 BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS +1D0B1 BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS +1D0B2 BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS +1D0B3 BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS +1D0B4 BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN +@ Fthores (Destroyers) +1D0B5 BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN +1D0B6 BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU +1D0B7 BYZANTINE MUSICAL SYMBOL IMIFONON +1D0B8 BYZANTINE MUSICAL SYMBOL IMIFTHORON +1D0B9 BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU +1D0BA BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA +1D0BB BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA +1D0BC BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS +1D0BD BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI +1D0BE BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI +1D0BF BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE +1D0C0 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO +1D0C1 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO +1D0C2 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO +1D0C3 BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS +1D0C4 BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS +1D0C5 BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS + * misspelling of "FTHORA" in character name is a known defect +1D0C6 BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI +1D0C7 BYZANTINE MUSICAL SYMBOL FTHORA NENANO +1D0C8 BYZANTINE MUSICAL SYMBOL CHROA ZYGOS +1D0C9 BYZANTINE MUSICAL SYMBOL CHROA KLITON +@ Alloioseis (Differentiators) +1D0CA BYZANTINE MUSICAL SYMBOL CHROA SPATHI +1D0CB BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION +1D0CC BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA +1D0CD BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION +1D0CE BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION +1D0CF BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION +1D0D0 BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA +1D0D1 BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA +1D0D2 BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA +1D0D3 BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA +1D0D4 BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA +1D0D5 BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA +1D0D6 BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA +1D0D7 BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA +1D0D8 BYZANTINE MUSICAL SYMBOL GENIKI DIESIS +@ Rythmika (Rhythmics) +1D0D9 BYZANTINE MUSICAL SYMBOL GENIKI YFESIS +1D0DA BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI +1D0DB BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI +1D0DC BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI +1D0DD BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS +1D0DE BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS +1D0DF BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU +1D0E0 BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU +1D0E1 BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU +1D0E2 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS +1D0E3 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU +1D0E4 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU +@ Grammata (Letters) +1D0E5 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU +1D0E6 BYZANTINE MUSICAL SYMBOL DIGRAMMA GG +1D0E7 BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU +1D0E8 BYZANTINE MUSICAL SYMBOL STIGMA +1D0E9 BYZANTINE MUSICAL SYMBOL ARKTIKO PA +1D0EA BYZANTINE MUSICAL SYMBOL ARKTIKO VOU +1D0EB BYZANTINE MUSICAL SYMBOL ARKTIKO GA +1D0EC BYZANTINE MUSICAL SYMBOL ARKTIKO DI +1D0ED BYZANTINE MUSICAL SYMBOL ARKTIKO KE +1D0EE BYZANTINE MUSICAL SYMBOL ARKTIKO ZO +1D0EF BYZANTINE MUSICAL SYMBOL ARKTIKO NI +@ Specials +1D0F0 BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO +1D0F1 BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO +1D0F2 BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO +1D0F3 BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO +1D0F4 BYZANTINE MUSICAL SYMBOL KLASMA KATO +1D0F5 BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +@@ 1D100 Musical Symbols 1D1FF +@ Bars +1D100 MUSICAL SYMBOL SINGLE BARLINE +1D101 MUSICAL SYMBOL DOUBLE BARLINE +1D102 MUSICAL SYMBOL FINAL BARLINE +1D103 MUSICAL SYMBOL REVERSE FINAL BARLINE +1D104 MUSICAL SYMBOL DASHED BARLINE +1D105 MUSICAL SYMBOL SHORT BARLINE +@ Codas +1D106 MUSICAL SYMBOL LEFT REPEAT SIGN +1D107 MUSICAL SYMBOL RIGHT REPEAT SIGN +1D108 MUSICAL SYMBOL REPEAT DOTS +1D109 MUSICAL SYMBOL DAL SEGNO +1D10A MUSICAL SYMBOL DA CAPO +1D10B MUSICAL SYMBOL SEGNO +1D10C MUSICAL SYMBOL CODA +@ Figure repetitions +1D10D MUSICAL SYMBOL REPEATED FIGURE-1 +1D10E MUSICAL SYMBOL REPEATED FIGURE-2 +1D10F MUSICAL SYMBOL REPEATED FIGURE-3 +@ Holds and pauses +1D110 MUSICAL SYMBOL FERMATA +1D111 MUSICAL SYMBOL FERMATA BELOW +1D112 MUSICAL SYMBOL BREATH MARK +1D113 MUSICAL SYMBOL CAESURA +@ Staff brackets +1D114 MUSICAL SYMBOL BRACE +1D115 MUSICAL SYMBOL BRACKET +@ Staves +1D116 MUSICAL SYMBOL ONE-LINE STAFF +1D117 MUSICAL SYMBOL TWO-LINE STAFF +1D118 MUSICAL SYMBOL THREE-LINE STAFF +1D119 MUSICAL SYMBOL FOUR-LINE STAFF +1D11A MUSICAL SYMBOL FIVE-LINE STAFF +1D11B MUSICAL SYMBOL SIX-LINE STAFF +@ Tablature +1D11C MUSICAL SYMBOL SIX-STRING FRETBOARD +1D11D MUSICAL SYMBOL FOUR-STRING FRETBOARD +@ Clefs +1D11E MUSICAL SYMBOL G CLEF +1D11F MUSICAL SYMBOL G CLEF OTTAVA ALTA +1D120 MUSICAL SYMBOL G CLEF OTTAVA BASSA +1D121 MUSICAL SYMBOL C CLEF +1D122 MUSICAL SYMBOL F CLEF +1D123 MUSICAL SYMBOL F CLEF OTTAVA ALTA +1D124 MUSICAL SYMBOL F CLEF OTTAVA BASSA +1D125 MUSICAL SYMBOL DRUM CLEF-1 +1D126 MUSICAL SYMBOL DRUM CLEF-2 +@ Accidentals +1D127 <reserved> + x (music flat sign - 266D) +1D128 <reserved> + x (music natural sign - 266E) +1D129 <reserved> + x (music sharp sign - 266F) +1D12A MUSICAL SYMBOL DOUBLE SHARP +1D12B MUSICAL SYMBOL DOUBLE FLAT +1D12C MUSICAL SYMBOL FLAT UP +1D12D MUSICAL SYMBOL FLAT DOWN +1D12E MUSICAL SYMBOL NATURAL UP +1D12F MUSICAL SYMBOL NATURAL DOWN +1D130 MUSICAL SYMBOL SHARP UP +1D131 MUSICAL SYMBOL SHARP DOWN +1D132 MUSICAL SYMBOL QUARTER TONE SHARP +1D133 MUSICAL SYMBOL QUARTER TONE FLAT +@ Time signatures +1D134 MUSICAL SYMBOL COMMON TIME +1D135 MUSICAL SYMBOL CUT TIME +@ Octaves +1D136 MUSICAL SYMBOL OTTAVA ALTA +1D137 MUSICAL SYMBOL OTTAVA BASSA +1D138 MUSICAL SYMBOL QUINDICESIMA ALTA +1D139 MUSICAL SYMBOL QUINDICESIMA BASSA +@ Rests +1D13A MUSICAL SYMBOL MULTI REST +1D13B MUSICAL SYMBOL WHOLE REST +1D13C MUSICAL SYMBOL HALF REST +1D13D MUSICAL SYMBOL QUARTER REST +1D13E MUSICAL SYMBOL EIGHTH REST +1D13F MUSICAL SYMBOL SIXTEENTH REST +1D140 MUSICAL SYMBOL THIRTY-SECOND REST +1D141 MUSICAL SYMBOL SIXTY-FOURTH REST +1D142 MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST +@ Noteheads +1D143 MUSICAL SYMBOL X NOTEHEAD +1D144 MUSICAL SYMBOL PLUS NOTEHEAD +1D145 MUSICAL SYMBOL CIRCLE X NOTEHEAD +1D146 MUSICAL SYMBOL SQUARE NOTEHEAD WHITE +1D147 MUSICAL SYMBOL SQUARE NOTEHEAD BLACK +1D148 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE +1D149 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK +1D14A MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE +1D14B MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK +1D14C MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE +1D14D MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK +1D14E MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE +1D14F MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK +1D150 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE +1D151 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK +1D152 MUSICAL SYMBOL MOON NOTEHEAD WHITE +1D153 MUSICAL SYMBOL MOON NOTEHEAD BLACK +1D154 MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE +1D155 MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK +1D156 MUSICAL SYMBOL PARENTHESIS NOTEHEAD +1D157 MUSICAL SYMBOL VOID NOTEHEAD +1D158 MUSICAL SYMBOL NOTEHEAD BLACK +1D159 MUSICAL SYMBOL NULL NOTEHEAD +1D15A MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE +1D15B MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK +@ Notes +1D15C MUSICAL SYMBOL BREVE +1D15D MUSICAL SYMBOL WHOLE NOTE +1D15E MUSICAL SYMBOL HALF NOTE + : 1D157 1D165 +1D15F MUSICAL SYMBOL QUARTER NOTE + : 1D158 1D165 +1D160 MUSICAL SYMBOL EIGHTH NOTE + : 1D15F 1D16E +1D161 MUSICAL SYMBOL SIXTEENTH NOTE + : 1D15F 1D16F +1D162 MUSICAL SYMBOL THIRTY-SECOND NOTE + : 1D15F 1D170 +1D163 MUSICAL SYMBOL SIXTY-FOURTH NOTE + : 1D15F 1D171 +1D164 MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE + : 1D15F 1D172 +@ Stems +1D165 MUSICAL SYMBOL COMBINING STEM +1D166 MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +@ Tremolos +1D167 MUSICAL SYMBOL COMBINING TREMOLO-1 +1D168 MUSICAL SYMBOL COMBINING TREMOLO-2 +1D169 MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16A MUSICAL SYMBOL FINGERED TREMOLO-1 +1D16B MUSICAL SYMBOL FINGERED TREMOLO-2 +1D16C MUSICAL SYMBOL FINGERED TREMOLO-3 +@ Augmentation dot +1D16D MUSICAL SYMBOL COMBINING AUGMENTATION DOT +@ Flags +1D16E MUSICAL SYMBOL COMBINING FLAG-1 +1D16F MUSICAL SYMBOL COMBINING FLAG-2 +1D170 MUSICAL SYMBOL COMBINING FLAG-3 +1D171 MUSICAL SYMBOL COMBINING FLAG-4 +1D172 MUSICAL SYMBOL COMBINING FLAG-5 +@ Beams and slurs +1D173 MUSICAL SYMBOL BEGIN BEAM +1D174 MUSICAL SYMBOL END BEAM +1D175 MUSICAL SYMBOL BEGIN TIE +1D176 MUSICAL SYMBOL END TIE +1D177 MUSICAL SYMBOL BEGIN SLUR +1D178 MUSICAL SYMBOL END SLUR +1D179 MUSICAL SYMBOL BEGIN PHRASE +1D17A MUSICAL SYMBOL END PHRASE +@ Articulation +1D17B MUSICAL SYMBOL COMBINING ACCENT +1D17C MUSICAL SYMBOL COMBINING STACCATO +1D17D MUSICAL SYMBOL COMBINING TENUTO +1D17E MUSICAL SYMBOL COMBINING STACCATISSIMO +1D17F MUSICAL SYMBOL COMBINING MARCATO +1D180 MUSICAL SYMBOL COMBINING MARCATO-STACCATO +1D181 MUSICAL SYMBOL COMBINING ACCENT-STACCATO +1D182 MUSICAL SYMBOL COMBINING LOURE +1D183 MUSICAL SYMBOL ARPEGGIATO UP +1D184 MUSICAL SYMBOL ARPEGGIATO DOWN +1D185 MUSICAL SYMBOL COMBINING DOIT +1D186 MUSICAL SYMBOL COMBINING RIP +1D187 MUSICAL SYMBOL COMBINING FLIP +1D188 MUSICAL SYMBOL COMBINING SMEAR +1D189 MUSICAL SYMBOL COMBINING BEND +1D18A MUSICAL SYMBOL COMBINING DOUBLE TONGUE +1D18B MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D18C MUSICAL SYMBOL RINFORZANDO +1D18D MUSICAL SYMBOL SUBITO +1D18E MUSICAL SYMBOL Z +@ Dynamics +1D18F MUSICAL SYMBOL PIANO +1D190 MUSICAL SYMBOL MEZZO +1D191 MUSICAL SYMBOL FORTE +1D192 MUSICAL SYMBOL CRESCENDO +1D193 MUSICAL SYMBOL DECRESCENDO +@ Ornaments +1D194 MUSICAL SYMBOL GRACE NOTE SLASH +1D195 MUSICAL SYMBOL GRACE NOTE NO SLASH +1D196 MUSICAL SYMBOL TR +1D197 MUSICAL SYMBOL TURN +1D198 MUSICAL SYMBOL INVERTED TURN +1D199 MUSICAL SYMBOL TURN SLASH +1D19A MUSICAL SYMBOL TURN UP +1D19B MUSICAL SYMBOL ORNAMENT STROKE-1 +1D19C MUSICAL SYMBOL ORNAMENT STROKE-2 +1D19D MUSICAL SYMBOL ORNAMENT STROKE-3 +1D19E MUSICAL SYMBOL ORNAMENT STROKE-4 +1D19F MUSICAL SYMBOL ORNAMENT STROKE-5 +1D1A0 MUSICAL SYMBOL ORNAMENT STROKE-6 +1D1A1 MUSICAL SYMBOL ORNAMENT STROKE-7 +1D1A2 MUSICAL SYMBOL ORNAMENT STROKE-8 +1D1A3 MUSICAL SYMBOL ORNAMENT STROKE-9 +1D1A4 MUSICAL SYMBOL ORNAMENT STROKE-10 +1D1A5 MUSICAL SYMBOL ORNAMENT STROKE-11 +@ Analytics +1D1A6 MUSICAL SYMBOL HAUPTSTIMME +1D1A7 MUSICAL SYMBOL NEBENSTIMME +1D1A8 MUSICAL SYMBOL END OF STIMME +1D1A9 MUSICAL SYMBOL DEGREE SLASH +@ Instrumentation +1D1AA MUSICAL SYMBOL COMBINING DOWN BOW +1D1AB MUSICAL SYMBOL COMBINING UP BOW +1D1AC MUSICAL SYMBOL COMBINING HARMONIC +1D1AD MUSICAL SYMBOL COMBINING SNAP PIZZICATO +@ Pedals +1D1AE MUSICAL SYMBOL PEDAL MARK +1D1AF MUSICAL SYMBOL PEDAL UP MARK +1D1B0 MUSICAL SYMBOL HALF PEDAL MARK +@ Miscellaneous symbols +1D1B1 MUSICAL SYMBOL GLISSANDO UP +1D1B2 MUSICAL SYMBOL GLISSANDO DOWN +1D1B3 MUSICAL SYMBOL WITH FINGERNAILS +1D1B4 MUSICAL SYMBOL DAMP +1D1B5 MUSICAL SYMBOL DAMP ALL +@ Mensural notation +1D1B6 MUSICAL SYMBOL MAXIMA +1D1B7 MUSICAL SYMBOL LONGA +1D1B8 MUSICAL SYMBOL BREVIS +1D1B9 MUSICAL SYMBOL SEMIBREVIS WHITE +1D1BA MUSICAL SYMBOL SEMIBREVIS BLACK +1D1BB MUSICAL SYMBOL MINIMA + : 1D1B9 1D165 +1D1BC MUSICAL SYMBOL MINIMA BLACK + : 1D1BA 1D165 +1D1BD MUSICAL SYMBOL SEMIMINIMA WHITE + : 1D1BB 1D16E +1D1BE MUSICAL SYMBOL SEMIMINIMA BLACK + : 1D1BC 1D16E +1D1BF MUSICAL SYMBOL FUSA WHITE + : 1D1BB 1D16F +1D1C0 MUSICAL SYMBOL FUSA BLACK + : 1D1BC 1D16F +@ Mensural rests +1D1C1 MUSICAL SYMBOL LONGA PERFECTA REST +1D1C2 MUSICAL SYMBOL LONGA IMPERFECTA REST +1D1C3 MUSICAL SYMBOL BREVIS REST +1D1C4 MUSICAL SYMBOL SEMIBREVIS REST +1D1C5 MUSICAL SYMBOL MINIMA REST +1D1C6 MUSICAL SYMBOL SEMIMINIMA REST +@ Mensural prolations +1D1C7 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA +1D1C8 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA +1D1C9 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1 +1D1CA MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA +1D1CB MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA +1D1CC MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1 +1D1CD MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2 +1D1CE MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3 +@ Miscellaneous symbol +1D1CF MUSICAL SYMBOL CROIX +@ Gregorian notation +1D1D0 MUSICAL SYMBOL GREGORIAN C CLEF +1D1D1 MUSICAL SYMBOL GREGORIAN F CLEF +1D1D2 MUSICAL SYMBOL SQUARE B +1D1D3 MUSICAL SYMBOL VIRGA +1D1D4 MUSICAL SYMBOL PODATUS +1D1D5 MUSICAL SYMBOL CLIVIS +1D1D6 MUSICAL SYMBOL SCANDICUS +1D1D7 MUSICAL SYMBOL CLIMACUS +1D1D8 MUSICAL SYMBOL TORCULUS +1D1D9 MUSICAL SYMBOL PORRECTUS +1D1DA MUSICAL SYMBOL PORRECTUS FLEXUS +1D1DB MUSICAL SYMBOL SCANDICUS FLEXUS +1D1DC MUSICAL SYMBOL TORCULUS RESUPINUS +1D1DD MUSICAL SYMBOL PES SUBPUNCTIS +@@ 1D200 Ancient Greek Musical Notation 1D24F +@ Ancient Greek vocalic notation +@+ In a few instances vocalic and instrumental symbols have been unified with each other. In other instances they have been unified with regular Greek letters. +1D200 GREEK VOCAL NOTATION SYMBOL-1 + * vocal E +1D201 GREEK VOCAL NOTATION SYMBOL-2 + * vocal first sharp of E +1D202 GREEK VOCAL NOTATION SYMBOL-3 + = Greek instrumental notation symbol-3 + * vocal or instrumental second sharp of E +1D203 GREEK VOCAL NOTATION SYMBOL-4 + * vocal F +1D204 GREEK VOCAL NOTATION SYMBOL-5 + * vocal first sharp of F +1D205 GREEK VOCAL NOTATION SYMBOL-6 + = Greek instrumental notation symbol-21 + * vocal second sharp of F + * instrumental second sharp of d +1D206 GREEK VOCAL NOTATION SYMBOL-7 + = Greek instrumental notation symbol-9 + * vocal G + * instrumental second sharp of G +1D207 GREEK VOCAL NOTATION SYMBOL-8 + * vocal first sharp of G +1D208 GREEK VOCAL NOTATION SYMBOL-9 + = Greek instrumental notation symbol-44 + * vocal second sharp of G + * instrumental first sharp of e´ +1D209 GREEK VOCAL NOTATION SYMBOL-10 + * vocal A + * this is a modification of 039F and is therefore not the same as 03D8 +1D20A GREEK VOCAL NOTATION SYMBOL-11 + * vocal first sharp of A +1D20B GREEK VOCAL NOTATION SYMBOL-12 + * vocal second sharp of A +1D20C GREEK VOCAL NOTATION SYMBOL-13 + * vocal B +1D20D GREEK VOCAL NOTATION SYMBOL-14 + = Greek instrumental notation symbol-41 + * vocal first sharp of B + * instrumental first sharp of d´ + x (latin capital letter v - 0056) +1D20E GREEK VOCAL NOTATION SYMBOL-15 + = Greek instrumental notation symbol-35 + * vocal second sharp of B + * instrumental first sharp of b +1D20F GREEK VOCAL NOTATION SYMBOL-16 + * vocal c + * unlike 1D23B this character has a glyph variant that looks like a horizontal line +1D210 GREEK VOCAL NOTATION SYMBOL-17 + * vocal first sharp of c +1D211 GREEK VOCAL NOTATION SYMBOL-18 + = Greek instrumental notation symbol-15 + * vocal second sharp of c + * instrumental second sharp of B +1D212 GREEK VOCAL NOTATION SYMBOL-19 + * vocal d +1D213 GREEK VOCAL NOTATION SYMBOL-20 + = Greek instrumental notation symbol-28 + * vocal first sharp of d + * instrumental g + * this is a modification of 0395 and is therefore not the same as 0046 +1D214 GREEK VOCAL NOTATION SYMBOL-21 + * vocal second sharp of d +1D215 GREEK VOCAL NOTATION SYMBOL-22 + * vocal e +1D216 GREEK VOCAL NOTATION SYMBOL-23 + * vocal first sharp of e + * this is a modification of 0392 and is therefore not the same as 0052 +1D217 GREEK VOCAL NOTATION SYMBOL-24 + * vocal second sharp of e +1D218 GREEK VOCAL NOTATION SYMBOL-50 + * vocal first sharp of g´ +1D219 GREEK VOCAL NOTATION SYMBOL-51 + * vocal second sharp of g´ +1D21A GREEK VOCAL NOTATION SYMBOL-52 + * vocal a´ +1D21B GREEK VOCAL NOTATION SYMBOL-53 + * vocal first sharp of a´ +1D21C GREEK VOCAL NOTATION SYMBOL-54 + = Greek instrumental notation symbol-20 + * vocal second sharp of a´ + * instrumental first sharp of d +@ Ancient Greek instrumental notation +1D21D GREEK INSTRUMENTAL NOTATION SYMBOL-1 + * instrumental E +1D21E GREEK INSTRUMENTAL NOTATION SYMBOL-2 + * instrumental first sharp of e +1D21F GREEK INSTRUMENTAL NOTATION SYMBOL-4 + * instrumental F +1D220 GREEK INSTRUMENTAL NOTATION SYMBOL-5 + * instrumental first sharp of F +1D221 GREEK INSTRUMENTAL NOTATION SYMBOL-7 + * instrumental G +1D222 GREEK INSTRUMENTAL NOTATION SYMBOL-8 + * instrumental first sharp of G +1D223 GREEK INSTRUMENTAL NOTATION SYMBOL-11 + * instrumental first sharp of A +1D224 GREEK INSTRUMENTAL NOTATION SYMBOL-12 + * instrumental second sharp of A +1D225 GREEK INSTRUMENTAL NOTATION SYMBOL-13 + * instrumental B +1D226 GREEK INSTRUMENTAL NOTATION SYMBOL-14 + * instrumental first sharp of B +1D227 GREEK INSTRUMENTAL NOTATION SYMBOL-17 + * instrumental first sharp of c +1D228 GREEK INSTRUMENTAL NOTATION SYMBOL-18 + * instrumental second sharp of c +1D229 GREEK INSTRUMENTAL NOTATION SYMBOL-19 + * instrumental d +1D22A GREEK INSTRUMENTAL NOTATION SYMBOL-23 + * instrumental first sharp of e +1D22B GREEK INSTRUMENTAL NOTATION SYMBOL-24 + * instrumental second sharp of e +1D22C GREEK INSTRUMENTAL NOTATION SYMBOL-25 + * instrumental f +1D22D GREEK INSTRUMENTAL NOTATION SYMBOL-26 + * instrumental first sharp of f +1D22E GREEK INSTRUMENTAL NOTATION SYMBOL-27 + * instrumental second sharp of f +1D22F GREEK INSTRUMENTAL NOTATION SYMBOL-29 + * instrumental first sharp of g +1D230 GREEK INSTRUMENTAL NOTATION SYMBOL-30 + * instrumental second sharp of g +1D231 GREEK INSTRUMENTAL NOTATION SYMBOL-32 + * instrumental first sharp of a +1D232 GREEK INSTRUMENTAL NOTATION SYMBOL-36 + * instrumental second sharp of b +1D233 GREEK INSTRUMENTAL NOTATION SYMBOL-37 + * instrumental c´ +1D234 GREEK INSTRUMENTAL NOTATION SYMBOL-38 + * instrumental first sharp of c´ +1D235 GREEK INSTRUMENTAL NOTATION SYMBOL-39 + * instrumental second sharp of c´ +1D236 GREEK INSTRUMENTAL NOTATION SYMBOL-40 + * instrumental d´ +1D237 GREEK INSTRUMENTAL NOTATION SYMBOL-42 + * instrumental second sharp of d´ +1D238 GREEK INSTRUMENTAL NOTATION SYMBOL-43 + * instrumental e´ +1D239 GREEK INSTRUMENTAL NOTATION SYMBOL-45 + * instrumental second sharp of e´ +1D23A GREEK INSTRUMENTAL NOTATION SYMBOL-47 + * instrumental first sharp of f´ + * similar but not identical to 002F +1D23B GREEK INSTRUMENTAL NOTATION SYMBOL-48 + * instrumental second sharp of f´ + * similar but not identical to 005C +1D23C GREEK INSTRUMENTAL NOTATION SYMBOL-49 + * instrumental g´ +1D23D GREEK INSTRUMENTAL NOTATION SYMBOL-50 + * instrumental first sharp of g´ +1D23E GREEK INSTRUMENTAL NOTATION SYMBOL-51 + * instrumental second sharp of g´ +1D23F GREEK INSTRUMENTAL NOTATION SYMBOL-52 + * instrumental a´ +1D240 GREEK INSTRUMENTAL NOTATION SYMBOL-53 + * instrumental first sharp of a´ +1D241 GREEK INSTRUMENTAL NOTATION SYMBOL-54 + * instrumental second sharp of a´ +@ Further Greek musical notation symbols +1D242 COMBINING GREEK MUSICAL TRISEME + x (metrical triseme - 23D7) +1D243 COMBINING GREEK MUSICAL TETRASEME + x (metrical tetraseme - 23D8) +1D244 COMBINING GREEK MUSICAL PENTASEME + x (metrical pentaseme - 23D9) +1D245 GREEK MUSICAL LEIMMA +@@ 1D300 Tai Xuan Jing Symbols 1D35F +@ Monogram +1D300 MONOGRAM FOR EARTH +@ Digrams +1D301 DIGRAM FOR HEAVENLY EARTH +1D302 DIGRAM FOR HUMAN EARTH +1D303 DIGRAM FOR EARTHLY HEAVEN +1D304 DIGRAM FOR EARTHLY HUMAN +1D305 DIGRAM FOR EARTH +@ Tetragrams +1D306 TETRAGRAM FOR CENTRE +1D307 TETRAGRAM FOR FULL CIRCLE +1D308 TETRAGRAM FOR MIRED +1D309 TETRAGRAM FOR BARRIER +1D30A TETRAGRAM FOR KEEPING SMALL +1D30B TETRAGRAM FOR CONTRARIETY +1D30C TETRAGRAM FOR ASCENT +1D30D TETRAGRAM FOR OPPOSITION +1D30E TETRAGRAM FOR BRANCHING OUT +1D30F TETRAGRAM FOR DEFECTIVENESS OR DISTORTION +1D310 TETRAGRAM FOR DIVERGENCE +1D311 TETRAGRAM FOR YOUTHFULNESS +1D312 TETRAGRAM FOR INCREASE +1D313 TETRAGRAM FOR PENETRATION +1D314 TETRAGRAM FOR REACH +1D315 TETRAGRAM FOR CONTACT +1D316 TETRAGRAM FOR HOLDING BACK +1D317 TETRAGRAM FOR WAITING +1D318 TETRAGRAM FOR FOLLOWING +1D319 TETRAGRAM FOR ADVANCE +1D31A TETRAGRAM FOR RELEASE +1D31B TETRAGRAM FOR RESISTANCE +1D31C TETRAGRAM FOR EASE +1D31D TETRAGRAM FOR JOY +1D31E TETRAGRAM FOR CONTENTION +1D31F TETRAGRAM FOR ENDEAVOUR +1D320 TETRAGRAM FOR DUTIES +1D321 TETRAGRAM FOR CHANGE +1D322 TETRAGRAM FOR DECISIVENESS +1D323 TETRAGRAM FOR BOLD RESOLUTION +1D324 TETRAGRAM FOR PACKING +1D325 TETRAGRAM FOR LEGION +1D326 TETRAGRAM FOR CLOSENESS +1D327 TETRAGRAM FOR KINSHIP +1D328 TETRAGRAM FOR GATHERING +1D329 TETRAGRAM FOR STRENGTH +1D32A TETRAGRAM FOR PURITY +1D32B TETRAGRAM FOR FULLNESS +1D32C TETRAGRAM FOR RESIDENCE +1D32D TETRAGRAM FOR LAW OR MODEL +1D32E TETRAGRAM FOR RESPONSE +1D32F TETRAGRAM FOR GOING TO MEET +1D330 TETRAGRAM FOR ENCOUNTERS +1D331 TETRAGRAM FOR STOVE +1D332 TETRAGRAM FOR GREATNESS +1D333 TETRAGRAM FOR ENLARGEMENT +1D334 TETRAGRAM FOR PATTERN +1D335 TETRAGRAM FOR RITUAL +1D336 TETRAGRAM FOR FLIGHT +1D337 TETRAGRAM FOR VASTNESS OR WASTING +1D338 TETRAGRAM FOR CONSTANCY +1D339 TETRAGRAM FOR MEASURE +1D33A TETRAGRAM FOR ETERNITY +1D33B TETRAGRAM FOR UNITY +1D33C TETRAGRAM FOR DIMINISHMENT +1D33D TETRAGRAM FOR CLOSED MOUTH +1D33E TETRAGRAM FOR GUARDEDNESS +1D33F TETRAGRAM FOR GATHERING IN +1D340 TETRAGRAM FOR MASSING +1D341 TETRAGRAM FOR ACCUMULATION +1D342 TETRAGRAM FOR EMBELLISHMENT +1D343 TETRAGRAM FOR DOUBT +1D344 TETRAGRAM FOR WATCH +1D345 TETRAGRAM FOR SINKING +1D346 TETRAGRAM FOR INNER +1D347 TETRAGRAM FOR DEPARTURE +1D348 TETRAGRAM FOR DARKENING +1D349 TETRAGRAM FOR DIMMING +1D34A TETRAGRAM FOR EXHAUSTION +1D34B TETRAGRAM FOR SEVERANCE +1D34C TETRAGRAM FOR STOPPAGE +1D34D TETRAGRAM FOR HARDNESS +1D34E TETRAGRAM FOR COMPLETION +1D34F TETRAGRAM FOR CLOSURE +1D350 TETRAGRAM FOR FAILURE +1D351 TETRAGRAM FOR AGGRAVATION +1D352 TETRAGRAM FOR COMPLIANCE +1D353 TETRAGRAM FOR ON THE VERGE +1D354 TETRAGRAM FOR DIFFICULTIES +1D355 TETRAGRAM FOR LABOURING +1D356 TETRAGRAM FOR FOSTERING +@@ 1D400 Mathematical Alphanumeric Symbols 1D7FF +@+ To be used for mathematical variables where style variations are important semantically. For general text, use standard Latin and Greek letters with markup. +@ Bold symbols +1D400 MATHEMATICAL BOLD CAPITAL A + # <font> 0041 latin capital letter a +1D401 MATHEMATICAL BOLD CAPITAL B + # <font> 0042 latin capital letter b +1D402 MATHEMATICAL BOLD CAPITAL C + # <font> 0043 latin capital letter c +1D403 MATHEMATICAL BOLD CAPITAL D + # <font> 0044 latin capital letter d +1D404 MATHEMATICAL BOLD CAPITAL E + # <font> 0045 latin capital letter e +1D405 MATHEMATICAL BOLD CAPITAL F + # <font> 0046 latin capital letter f +1D406 MATHEMATICAL BOLD CAPITAL G + # <font> 0047 latin capital letter g +1D407 MATHEMATICAL BOLD CAPITAL H + # <font> 0048 latin capital letter h +1D408 MATHEMATICAL BOLD CAPITAL I + # <font> 0049 latin capital letter i +1D409 MATHEMATICAL BOLD CAPITAL J + # <font> 004A latin capital letter j +1D40A MATHEMATICAL BOLD CAPITAL K + # <font> 004B latin capital letter k +1D40B MATHEMATICAL BOLD CAPITAL L + # <font> 004C latin capital letter l +1D40C MATHEMATICAL BOLD CAPITAL M + # <font> 004D latin capital letter m +1D40D MATHEMATICAL BOLD CAPITAL N + # <font> 004E latin capital letter n +1D40E MATHEMATICAL BOLD CAPITAL O + # <font> 004F latin capital letter o +1D40F MATHEMATICAL BOLD CAPITAL P + # <font> 0050 latin capital letter p +1D410 MATHEMATICAL BOLD CAPITAL Q + # <font> 0051 latin capital letter q +1D411 MATHEMATICAL BOLD CAPITAL R + # <font> 0052 latin capital letter r +1D412 MATHEMATICAL BOLD CAPITAL S + # <font> 0053 latin capital letter s +1D413 MATHEMATICAL BOLD CAPITAL T + # <font> 0054 latin capital letter t +1D414 MATHEMATICAL BOLD CAPITAL U + # <font> 0055 latin capital letter u +1D415 MATHEMATICAL BOLD CAPITAL V + # <font> 0056 latin capital letter v +1D416 MATHEMATICAL BOLD CAPITAL W + # <font> 0057 latin capital letter w +1D417 MATHEMATICAL BOLD CAPITAL X + # <font> 0058 latin capital letter x +1D418 MATHEMATICAL BOLD CAPITAL Y + # <font> 0059 latin capital letter y +1D419 MATHEMATICAL BOLD CAPITAL Z + # <font> 005A latin capital letter z +1D41A MATHEMATICAL BOLD SMALL A + # <font> 0061 latin small letter a +1D41B MATHEMATICAL BOLD SMALL B + # <font> 0062 latin small letter b +1D41C MATHEMATICAL BOLD SMALL C + # <font> 0063 latin small letter c +1D41D MATHEMATICAL BOLD SMALL D + # <font> 0064 latin small letter d +1D41E MATHEMATICAL BOLD SMALL E + # <font> 0065 latin small letter e +1D41F MATHEMATICAL BOLD SMALL F + # <font> 0066 latin small letter f +1D420 MATHEMATICAL BOLD SMALL G + # <font> 0067 latin small letter g +1D421 MATHEMATICAL BOLD SMALL H + # <font> 0068 latin small letter h +1D422 MATHEMATICAL BOLD SMALL I + # <font> 0069 latin small letter i +1D423 MATHEMATICAL BOLD SMALL J + # <font> 006A latin small letter j +1D424 MATHEMATICAL BOLD SMALL K + # <font> 006B latin small letter k +1D425 MATHEMATICAL BOLD SMALL L + # <font> 006C latin small letter l +1D426 MATHEMATICAL BOLD SMALL M + # <font> 006D latin small letter m +1D427 MATHEMATICAL BOLD SMALL N + # <font> 006E latin small letter n +1D428 MATHEMATICAL BOLD SMALL O + # <font> 006F latin small letter o +1D429 MATHEMATICAL BOLD SMALL P + # <font> 0070 latin small letter p +1D42A MATHEMATICAL BOLD SMALL Q + # <font> 0071 latin small letter q +1D42B MATHEMATICAL BOLD SMALL R + # <font> 0072 latin small letter r +1D42C MATHEMATICAL BOLD SMALL S + # <font> 0073 latin small letter s +1D42D MATHEMATICAL BOLD SMALL T + # <font> 0074 latin small letter t +1D42E MATHEMATICAL BOLD SMALL U + # <font> 0075 latin small letter u +1D42F MATHEMATICAL BOLD SMALL V + # <font> 0076 latin small letter v +1D430 MATHEMATICAL BOLD SMALL W + # <font> 0077 latin small letter w +1D431 MATHEMATICAL BOLD SMALL X + # <font> 0078 latin small letter x +1D432 MATHEMATICAL BOLD SMALL Y + # <font> 0079 latin small letter y +1D433 MATHEMATICAL BOLD SMALL Z + # <font> 007A latin small letter z +@ Italic symbols +@+ Several italic symbols have been previously coded in the Letterlike Symbols block and are retained there to ensure unambiguous representation. +1D434 MATHEMATICAL ITALIC CAPITAL A + # <font> 0041 latin capital letter a +1D435 MATHEMATICAL ITALIC CAPITAL B + # <font> 0042 latin capital letter b +1D436 MATHEMATICAL ITALIC CAPITAL C + # <font> 0043 latin capital letter c +1D437 MATHEMATICAL ITALIC CAPITAL D + # <font> 0044 latin capital letter d +1D438 MATHEMATICAL ITALIC CAPITAL E + # <font> 0045 latin capital letter e +1D439 MATHEMATICAL ITALIC CAPITAL F + # <font> 0046 latin capital letter f +1D43A MATHEMATICAL ITALIC CAPITAL G + # <font> 0047 latin capital letter g +1D43B MATHEMATICAL ITALIC CAPITAL H + # <font> 0048 latin capital letter h +1D43C MATHEMATICAL ITALIC CAPITAL I + # <font> 0049 latin capital letter i +1D43D MATHEMATICAL ITALIC CAPITAL J + # <font> 004A latin capital letter j +1D43E MATHEMATICAL ITALIC CAPITAL K + # <font> 004B latin capital letter k +1D43F MATHEMATICAL ITALIC CAPITAL L + # <font> 004C latin capital letter l +1D440 MATHEMATICAL ITALIC CAPITAL M + # <font> 004D latin capital letter m +1D441 MATHEMATICAL ITALIC CAPITAL N + # <font> 004E latin capital letter n +1D442 MATHEMATICAL ITALIC CAPITAL O + # <font> 004F latin capital letter o +1D443 MATHEMATICAL ITALIC CAPITAL P + # <font> 0050 latin capital letter p +1D444 MATHEMATICAL ITALIC CAPITAL Q + # <font> 0051 latin capital letter q +1D445 MATHEMATICAL ITALIC CAPITAL R + # <font> 0052 latin capital letter r +1D446 MATHEMATICAL ITALIC CAPITAL S + # <font> 0053 latin capital letter s +1D447 MATHEMATICAL ITALIC CAPITAL T + # <font> 0054 latin capital letter t +1D448 MATHEMATICAL ITALIC CAPITAL U + # <font> 0055 latin capital letter u +1D449 MATHEMATICAL ITALIC CAPITAL V + # <font> 0056 latin capital letter v +1D44A MATHEMATICAL ITALIC CAPITAL W + # <font> 0057 latin capital letter w +1D44B MATHEMATICAL ITALIC CAPITAL X + # <font> 0058 latin capital letter x +1D44C MATHEMATICAL ITALIC CAPITAL Y + # <font> 0059 latin capital letter y +1D44D MATHEMATICAL ITALIC CAPITAL Z + # <font> 005A latin capital letter z +1D44E MATHEMATICAL ITALIC SMALL A + # <font> 0061 latin small letter a +1D44F MATHEMATICAL ITALIC SMALL B + # <font> 0062 latin small letter b +1D450 MATHEMATICAL ITALIC SMALL C + # <font> 0063 latin small letter c +1D451 MATHEMATICAL ITALIC SMALL D + # <font> 0064 latin small letter d +1D452 MATHEMATICAL ITALIC SMALL E + # <font> 0065 latin small letter e +1D453 MATHEMATICAL ITALIC SMALL F + # <font> 0066 latin small letter f +1D454 MATHEMATICAL ITALIC SMALL G + # <font> 0067 latin small letter g +1D455 <reserved> + x (planck constant - 210E) +1D456 MATHEMATICAL ITALIC SMALL I + # <font> 0069 latin small letter i +1D457 MATHEMATICAL ITALIC SMALL J + # <font> 006A latin small letter j +1D458 MATHEMATICAL ITALIC SMALL K + # <font> 006B latin small letter k +1D459 MATHEMATICAL ITALIC SMALL L + # <font> 006C latin small letter l +1D45A MATHEMATICAL ITALIC SMALL M + # <font> 006D latin small letter m +1D45B MATHEMATICAL ITALIC SMALL N + # <font> 006E latin small letter n +1D45C MATHEMATICAL ITALIC SMALL O + # <font> 006F latin small letter o +1D45D MATHEMATICAL ITALIC SMALL P + # <font> 0070 latin small letter p +1D45E MATHEMATICAL ITALIC SMALL Q + # <font> 0071 latin small letter q +1D45F MATHEMATICAL ITALIC SMALL R + # <font> 0072 latin small letter r +1D460 MATHEMATICAL ITALIC SMALL S + # <font> 0073 latin small letter s +1D461 MATHEMATICAL ITALIC SMALL T + # <font> 0074 latin small letter t +1D462 MATHEMATICAL ITALIC SMALL U + # <font> 0075 latin small letter u +1D463 MATHEMATICAL ITALIC SMALL V + # <font> 0076 latin small letter v +1D464 MATHEMATICAL ITALIC SMALL W + # <font> 0077 latin small letter w +1D465 MATHEMATICAL ITALIC SMALL X + # <font> 0078 latin small letter x +1D466 MATHEMATICAL ITALIC SMALL Y + # <font> 0079 latin small letter y +1D467 MATHEMATICAL ITALIC SMALL Z + # <font> 007A latin small letter z +@ Bold italic symbols +1D468 MATHEMATICAL BOLD ITALIC CAPITAL A + # <font> 0041 latin capital letter a +1D469 MATHEMATICAL BOLD ITALIC CAPITAL B + # <font> 0042 latin capital letter b +1D46A MATHEMATICAL BOLD ITALIC CAPITAL C + # <font> 0043 latin capital letter c +1D46B MATHEMATICAL BOLD ITALIC CAPITAL D + # <font> 0044 latin capital letter d +1D46C MATHEMATICAL BOLD ITALIC CAPITAL E + # <font> 0045 latin capital letter e +1D46D MATHEMATICAL BOLD ITALIC CAPITAL F + # <font> 0046 latin capital letter f +1D46E MATHEMATICAL BOLD ITALIC CAPITAL G + # <font> 0047 latin capital letter g +1D46F MATHEMATICAL BOLD ITALIC CAPITAL H + # <font> 0048 latin capital letter h +1D470 MATHEMATICAL BOLD ITALIC CAPITAL I + # <font> 0049 latin capital letter i +1D471 MATHEMATICAL BOLD ITALIC CAPITAL J + # <font> 004A latin capital letter j +1D472 MATHEMATICAL BOLD ITALIC CAPITAL K + # <font> 004B latin capital letter k +1D473 MATHEMATICAL BOLD ITALIC CAPITAL L + # <font> 004C latin capital letter l +1D474 MATHEMATICAL BOLD ITALIC CAPITAL M + # <font> 004D latin capital letter m +1D475 MATHEMATICAL BOLD ITALIC CAPITAL N + # <font> 004E latin capital letter n +1D476 MATHEMATICAL BOLD ITALIC CAPITAL O + # <font> 004F latin capital letter o +1D477 MATHEMATICAL BOLD ITALIC CAPITAL P + # <font> 0050 latin capital letter p +1D478 MATHEMATICAL BOLD ITALIC CAPITAL Q + # <font> 0051 latin capital letter q +1D479 MATHEMATICAL BOLD ITALIC CAPITAL R + # <font> 0052 latin capital letter r +1D47A MATHEMATICAL BOLD ITALIC CAPITAL S + # <font> 0053 latin capital letter s +1D47B MATHEMATICAL BOLD ITALIC CAPITAL T + # <font> 0054 latin capital letter t +1D47C MATHEMATICAL BOLD ITALIC CAPITAL U + # <font> 0055 latin capital letter u +1D47D MATHEMATICAL BOLD ITALIC CAPITAL V + # <font> 0056 latin capital letter v +1D47E MATHEMATICAL BOLD ITALIC CAPITAL W + # <font> 0057 latin capital letter w +1D47F MATHEMATICAL BOLD ITALIC CAPITAL X + # <font> 0058 latin capital letter x +1D480 MATHEMATICAL BOLD ITALIC CAPITAL Y + # <font> 0059 latin capital letter y +1D481 MATHEMATICAL BOLD ITALIC CAPITAL Z + # <font> 005A latin capital letter z +1D482 MATHEMATICAL BOLD ITALIC SMALL A + # <font> 0061 latin small letter a +1D483 MATHEMATICAL BOLD ITALIC SMALL B + # <font> 0062 latin small letter b +1D484 MATHEMATICAL BOLD ITALIC SMALL C + # <font> 0063 latin small letter c +1D485 MATHEMATICAL BOLD ITALIC SMALL D + # <font> 0064 latin small letter d +1D486 MATHEMATICAL BOLD ITALIC SMALL E + # <font> 0065 latin small letter e +1D487 MATHEMATICAL BOLD ITALIC SMALL F + # <font> 0066 latin small letter f +1D488 MATHEMATICAL BOLD ITALIC SMALL G + # <font> 0067 latin small letter g +1D489 MATHEMATICAL BOLD ITALIC SMALL H + # <font> 0068 latin small letter h +1D48A MATHEMATICAL BOLD ITALIC SMALL I + # <font> 0069 latin small letter i +1D48B MATHEMATICAL BOLD ITALIC SMALL J + # <font> 006A latin small letter j +1D48C MATHEMATICAL BOLD ITALIC SMALL K + # <font> 006B latin small letter k +1D48D MATHEMATICAL BOLD ITALIC SMALL L + # <font> 006C latin small letter l +1D48E MATHEMATICAL BOLD ITALIC SMALL M + # <font> 006D latin small letter m +1D48F MATHEMATICAL BOLD ITALIC SMALL N + # <font> 006E latin small letter n +1D490 MATHEMATICAL BOLD ITALIC SMALL O + # <font> 006F latin small letter o +1D491 MATHEMATICAL BOLD ITALIC SMALL P + # <font> 0070 latin small letter p +1D492 MATHEMATICAL BOLD ITALIC SMALL Q + # <font> 0071 latin small letter q +1D493 MATHEMATICAL BOLD ITALIC SMALL R + # <font> 0072 latin small letter r +1D494 MATHEMATICAL BOLD ITALIC SMALL S + # <font> 0073 latin small letter s +1D495 MATHEMATICAL BOLD ITALIC SMALL T + # <font> 0074 latin small letter t +1D496 MATHEMATICAL BOLD ITALIC SMALL U + # <font> 0075 latin small letter u +1D497 MATHEMATICAL BOLD ITALIC SMALL V + # <font> 0076 latin small letter v +1D498 MATHEMATICAL BOLD ITALIC SMALL W + # <font> 0077 latin small letter w +1D499 MATHEMATICAL BOLD ITALIC SMALL X + # <font> 0078 latin small letter x +1D49A MATHEMATICAL BOLD ITALIC SMALL Y + # <font> 0079 latin small letter y +1D49B MATHEMATICAL BOLD ITALIC SMALL Z + # <font> 007A latin small letter z +@ Script symbols +@+ Several script symbols have been previously coded in the Letterlike Symbols block and are retained there to ensure unambiguous representation. +1D49C MATHEMATICAL SCRIPT CAPITAL A + # <font> 0041 latin capital letter a +1D49D <reserved> + x (script capital b - 212C) +1D49E MATHEMATICAL SCRIPT CAPITAL C + # <font> 0043 latin capital letter c +1D49F MATHEMATICAL SCRIPT CAPITAL D + # <font> 0044 latin capital letter d +1D4A0 <reserved> + x (script capital e - 2130) +1D4A1 <reserved> + x (script capital f - 2131) +1D4A2 MATHEMATICAL SCRIPT CAPITAL G + # <font> 0047 latin capital letter g +1D4A3 <reserved> + x (script capital h - 210B) +1D4A4 <reserved> + x (script capital i - 2110) +1D4A5 MATHEMATICAL SCRIPT CAPITAL J + # <font> 004A latin capital letter j +1D4A6 MATHEMATICAL SCRIPT CAPITAL K + # <font> 004B latin capital letter k +1D4A7 <reserved> + x (script capital l - 2112) +1D4A8 <reserved> + x (script capital m - 2133) +1D4A9 MATHEMATICAL SCRIPT CAPITAL N + # <font> 004E latin capital letter n +1D4AA MATHEMATICAL SCRIPT CAPITAL O + # <font> 004F latin capital letter o +1D4AB MATHEMATICAL SCRIPT CAPITAL P + = power set + # <font> 0050 latin capital letter p +1D4AC MATHEMATICAL SCRIPT CAPITAL Q + # <font> 0051 latin capital letter q +1D4AD <reserved> + x (script capital r - 211B) +1D4AE MATHEMATICAL SCRIPT CAPITAL S + # <font> 0053 latin capital letter s +1D4AF MATHEMATICAL SCRIPT CAPITAL T + # <font> 0054 latin capital letter t +1D4B0 MATHEMATICAL SCRIPT CAPITAL U + # <font> 0055 latin capital letter u +1D4B1 MATHEMATICAL SCRIPT CAPITAL V + # <font> 0056 latin capital letter v +1D4B2 MATHEMATICAL SCRIPT CAPITAL W + # <font> 0057 latin capital letter w +1D4B3 MATHEMATICAL SCRIPT CAPITAL X + # <font> 0058 latin capital letter x +1D4B4 MATHEMATICAL SCRIPT CAPITAL Y + # <font> 0059 latin capital letter y +1D4B5 MATHEMATICAL SCRIPT CAPITAL Z + # <font> 005A latin capital letter z +1D4B6 MATHEMATICAL SCRIPT SMALL A + # <font> 0061 latin small letter a +1D4B7 MATHEMATICAL SCRIPT SMALL B + # <font> 0062 latin small letter b +1D4B8 MATHEMATICAL SCRIPT SMALL C + # <font> 0063 latin small letter c +1D4B9 MATHEMATICAL SCRIPT SMALL D + # <font> 0064 latin small letter d +1D4BA <reserved> + x (script small e - 212F) +1D4BB MATHEMATICAL SCRIPT SMALL F + # <font> 0066 latin small letter f +1D4BC <reserved> + x (script small g - 210A) +1D4BD MATHEMATICAL SCRIPT SMALL H + # <font> 0068 latin small letter h +1D4BE MATHEMATICAL SCRIPT SMALL I + # <font> 0069 latin small letter i +1D4BF MATHEMATICAL SCRIPT SMALL J + # <font> 006A latin small letter j +1D4C0 MATHEMATICAL SCRIPT SMALL K + # <font> 006B latin small letter k +1D4C1 MATHEMATICAL SCRIPT SMALL L + x (script small l - 2113) + # <font> 006C latin small letter l +1D4C2 MATHEMATICAL SCRIPT SMALL M + # <font> 006D latin small letter m +1D4C3 MATHEMATICAL SCRIPT SMALL N + # <font> 006E latin small letter n +1D4C4 <reserved> + x (script small o - 2134) +1D4C5 MATHEMATICAL SCRIPT SMALL P + # <font> 0070 latin small letter p +1D4C6 MATHEMATICAL SCRIPT SMALL Q + # <font> 0071 latin small letter q +1D4C7 MATHEMATICAL SCRIPT SMALL R + # <font> 0072 latin small letter r +1D4C8 MATHEMATICAL SCRIPT SMALL S + # <font> 0073 latin small letter s +1D4C9 MATHEMATICAL SCRIPT SMALL T + # <font> 0074 latin small letter t +1D4CA MATHEMATICAL SCRIPT SMALL U + # <font> 0075 latin small letter u +1D4CB MATHEMATICAL SCRIPT SMALL V + # <font> 0076 latin small letter v +1D4CC MATHEMATICAL SCRIPT SMALL W + # <font> 0077 latin small letter w +1D4CD MATHEMATICAL SCRIPT SMALL X + # <font> 0078 latin small letter x +1D4CE MATHEMATICAL SCRIPT SMALL Y + # <font> 0079 latin small letter y +1D4CF MATHEMATICAL SCRIPT SMALL Z + # <font> 007A latin small letter z +@ Bold script symbols +1D4D0 MATHEMATICAL BOLD SCRIPT CAPITAL A + # <font> 0041 latin capital letter a +1D4D1 MATHEMATICAL BOLD SCRIPT CAPITAL B + # <font> 0042 latin capital letter b +1D4D2 MATHEMATICAL BOLD SCRIPT CAPITAL C + # <font> 0043 latin capital letter c +1D4D3 MATHEMATICAL BOLD SCRIPT CAPITAL D + # <font> 0044 latin capital letter d +1D4D4 MATHEMATICAL BOLD SCRIPT CAPITAL E + # <font> 0045 latin capital letter e +1D4D5 MATHEMATICAL BOLD SCRIPT CAPITAL F + # <font> 0046 latin capital letter f +1D4D6 MATHEMATICAL BOLD SCRIPT CAPITAL G + # <font> 0047 latin capital letter g +1D4D7 MATHEMATICAL BOLD SCRIPT CAPITAL H + # <font> 0048 latin capital letter h +1D4D8 MATHEMATICAL BOLD SCRIPT CAPITAL I + # <font> 0049 latin capital letter i +1D4D9 MATHEMATICAL BOLD SCRIPT CAPITAL J + # <font> 004A latin capital letter j +1D4DA MATHEMATICAL BOLD SCRIPT CAPITAL K + # <font> 004B latin capital letter k +1D4DB MATHEMATICAL BOLD SCRIPT CAPITAL L + # <font> 004C latin capital letter l +1D4DC MATHEMATICAL BOLD SCRIPT CAPITAL M + # <font> 004D latin capital letter m +1D4DD MATHEMATICAL BOLD SCRIPT CAPITAL N + # <font> 004E latin capital letter n +1D4DE MATHEMATICAL BOLD SCRIPT CAPITAL O + # <font> 004F latin capital letter o +1D4DF MATHEMATICAL BOLD SCRIPT CAPITAL P + # <font> 0050 latin capital letter p +1D4E0 MATHEMATICAL BOLD SCRIPT CAPITAL Q + # <font> 0051 latin capital letter q +1D4E1 MATHEMATICAL BOLD SCRIPT CAPITAL R + # <font> 0052 latin capital letter r +1D4E2 MATHEMATICAL BOLD SCRIPT CAPITAL S + # <font> 0053 latin capital letter s +1D4E3 MATHEMATICAL BOLD SCRIPT CAPITAL T + # <font> 0054 latin capital letter t +1D4E4 MATHEMATICAL BOLD SCRIPT CAPITAL U + # <font> 0055 latin capital letter u +1D4E5 MATHEMATICAL BOLD SCRIPT CAPITAL V + # <font> 0056 latin capital letter v +1D4E6 MATHEMATICAL BOLD SCRIPT CAPITAL W + # <font> 0057 latin capital letter w +1D4E7 MATHEMATICAL BOLD SCRIPT CAPITAL X + # <font> 0058 latin capital letter x +1D4E8 MATHEMATICAL BOLD SCRIPT CAPITAL Y + # <font> 0059 latin capital letter y +1D4E9 MATHEMATICAL BOLD SCRIPT CAPITAL Z + # <font> 005A latin capital letter z +1D4EA MATHEMATICAL BOLD SCRIPT SMALL A + # <font> 0061 latin small letter a +1D4EB MATHEMATICAL BOLD SCRIPT SMALL B + # <font> 0062 latin small letter b +1D4EC MATHEMATICAL BOLD SCRIPT SMALL C + # <font> 0063 latin small letter c +1D4ED MATHEMATICAL BOLD SCRIPT SMALL D + # <font> 0064 latin small letter d +1D4EE MATHEMATICAL BOLD SCRIPT SMALL E + # <font> 0065 latin small letter e +1D4EF MATHEMATICAL BOLD SCRIPT SMALL F + # <font> 0066 latin small letter f +1D4F0 MATHEMATICAL BOLD SCRIPT SMALL G + # <font> 0067 latin small letter g +1D4F1 MATHEMATICAL BOLD SCRIPT SMALL H + # <font> 0068 latin small letter h +1D4F2 MATHEMATICAL BOLD SCRIPT SMALL I + # <font> 0069 latin small letter i +1D4F3 MATHEMATICAL BOLD SCRIPT SMALL J + # <font> 006A latin small letter j +1D4F4 MATHEMATICAL BOLD SCRIPT SMALL K + # <font> 006B latin small letter k +1D4F5 MATHEMATICAL BOLD SCRIPT SMALL L + # <font> 006C latin small letter l +1D4F6 MATHEMATICAL BOLD SCRIPT SMALL M + # <font> 006D latin small letter m +1D4F7 MATHEMATICAL BOLD SCRIPT SMALL N + # <font> 006E latin small letter n +1D4F8 MATHEMATICAL BOLD SCRIPT SMALL O + # <font> 006F latin small letter o +1D4F9 MATHEMATICAL BOLD SCRIPT SMALL P + # <font> 0070 latin small letter p +1D4FA MATHEMATICAL BOLD SCRIPT SMALL Q + # <font> 0071 latin small letter q +1D4FB MATHEMATICAL BOLD SCRIPT SMALL R + # <font> 0072 latin small letter r +1D4FC MATHEMATICAL BOLD SCRIPT SMALL S + # <font> 0073 latin small letter s +1D4FD MATHEMATICAL BOLD SCRIPT SMALL T + # <font> 0074 latin small letter t +1D4FE MATHEMATICAL BOLD SCRIPT SMALL U + # <font> 0075 latin small letter u +1D4FF MATHEMATICAL BOLD SCRIPT SMALL V + # <font> 0076 latin small letter v +1D500 MATHEMATICAL BOLD SCRIPT SMALL W + # <font> 0077 latin small letter w +1D501 MATHEMATICAL BOLD SCRIPT SMALL X + # <font> 0078 latin small letter x +1D502 MATHEMATICAL BOLD SCRIPT SMALL Y + # <font> 0079 latin small letter y +1D503 MATHEMATICAL BOLD SCRIPT SMALL Z + # <font> 007A latin small letter z +@ Fraktur symbols +@+ This style is sometimes known as black-letter. Several black-letter symbols have been previously coded in the Letterlike Symbols block and are retained there to ensure unambiguous representation. +1D504 MATHEMATICAL FRAKTUR CAPITAL A + # <font> 0041 latin capital letter a +1D505 MATHEMATICAL FRAKTUR CAPITAL B + # <font> 0042 latin capital letter b +1D506 <reserved> + x (black-letter capital c - 212D) +1D507 MATHEMATICAL FRAKTUR CAPITAL D + # <font> 0044 latin capital letter d +1D508 MATHEMATICAL FRAKTUR CAPITAL E + # <font> 0045 latin capital letter e +1D509 MATHEMATICAL FRAKTUR CAPITAL F + # <font> 0046 latin capital letter f +1D50A MATHEMATICAL FRAKTUR CAPITAL G + # <font> 0047 latin capital letter g +1D50B <reserved> + x (black-letter capital h - 210C) +1D50C <reserved> + x (black-letter capital i - 2111) +1D50D MATHEMATICAL FRAKTUR CAPITAL J + # <font> 004A latin capital letter j +1D50E MATHEMATICAL FRAKTUR CAPITAL K + # <font> 004B latin capital letter k +1D50F MATHEMATICAL FRAKTUR CAPITAL L + # <font> 004C latin capital letter l +1D510 MATHEMATICAL FRAKTUR CAPITAL M + = New Testament majority text + # <font> 004D latin capital letter m +1D511 MATHEMATICAL FRAKTUR CAPITAL N + # <font> 004E latin capital letter n +1D512 MATHEMATICAL FRAKTUR CAPITAL O + # <font> 004F latin capital letter o +1D513 MATHEMATICAL FRAKTUR CAPITAL P + # <font> 0050 latin capital letter p +1D514 MATHEMATICAL FRAKTUR CAPITAL Q + # <font> 0051 latin capital letter q +1D515 <reserved> + x (black-letter capital r - 211C) +1D516 MATHEMATICAL FRAKTUR CAPITAL S + = Septuagint, Greek Old Testament + # <font> 0053 latin capital letter s +1D517 MATHEMATICAL FRAKTUR CAPITAL T + # <font> 0054 latin capital letter t +1D518 MATHEMATICAL FRAKTUR CAPITAL U + # <font> 0055 latin capital letter u +1D519 MATHEMATICAL FRAKTUR CAPITAL V + # <font> 0056 latin capital letter v +1D51A MATHEMATICAL FRAKTUR CAPITAL W + # <font> 0057 latin capital letter w +1D51B MATHEMATICAL FRAKTUR CAPITAL X + # <font> 0058 latin capital letter x +1D51C MATHEMATICAL FRAKTUR CAPITAL Y + # <font> 0059 latin capital letter y +1D51D <reserved> + x (black-letter capital z - 2128) +1D51E MATHEMATICAL FRAKTUR SMALL A + # <font> 0061 latin small letter a +1D51F MATHEMATICAL FRAKTUR SMALL B + # <font> 0062 latin small letter b +1D520 MATHEMATICAL FRAKTUR SMALL C + # <font> 0063 latin small letter c +1D521 MATHEMATICAL FRAKTUR SMALL D + # <font> 0064 latin small letter d +1D522 MATHEMATICAL FRAKTUR SMALL E + # <font> 0065 latin small letter e +1D523 MATHEMATICAL FRAKTUR SMALL F + # <font> 0066 latin small letter f +1D524 MATHEMATICAL FRAKTUR SMALL G + # <font> 0067 latin small letter g +1D525 MATHEMATICAL FRAKTUR SMALL H + # <font> 0068 latin small letter h +1D526 MATHEMATICAL FRAKTUR SMALL I + # <font> 0069 latin small letter i +1D527 MATHEMATICAL FRAKTUR SMALL J + # <font> 006A latin small letter j +1D528 MATHEMATICAL FRAKTUR SMALL K + # <font> 006B latin small letter k +1D529 MATHEMATICAL FRAKTUR SMALL L + # <font> 006C latin small letter l +1D52A MATHEMATICAL FRAKTUR SMALL M + # <font> 006D latin small letter m +1D52B MATHEMATICAL FRAKTUR SMALL N + # <font> 006E latin small letter n +1D52C MATHEMATICAL FRAKTUR SMALL O + # <font> 006F latin small letter o +1D52D MATHEMATICAL FRAKTUR SMALL P + # <font> 0070 latin small letter p +1D52E MATHEMATICAL FRAKTUR SMALL Q + # <font> 0071 latin small letter q +1D52F MATHEMATICAL FRAKTUR SMALL R + # <font> 0072 latin small letter r +1D530 MATHEMATICAL FRAKTUR SMALL S + # <font> 0073 latin small letter s +1D531 MATHEMATICAL FRAKTUR SMALL T + # <font> 0074 latin small letter t +1D532 MATHEMATICAL FRAKTUR SMALL U + # <font> 0075 latin small letter u +1D533 MATHEMATICAL FRAKTUR SMALL V + # <font> 0076 latin small letter v +1D534 MATHEMATICAL FRAKTUR SMALL W + # <font> 0077 latin small letter w +1D535 MATHEMATICAL FRAKTUR SMALL X + # <font> 0078 latin small letter x +1D536 MATHEMATICAL FRAKTUR SMALL Y + # <font> 0079 latin small letter y +1D537 MATHEMATICAL FRAKTUR SMALL Z + # <font> 007A latin small letter z +@ Double-struck symbols +@+ This style is sometimes known as open-face or blackboard-bold. Several double-struck symbols have been previously coded in the Letterlike Symbols block and are retained there to ensure unambiguous representation. +1D538 MATHEMATICAL DOUBLE-STRUCK CAPITAL A + # <font> 0041 latin capital letter a +1D539 MATHEMATICAL DOUBLE-STRUCK CAPITAL B + # <font> 0042 latin capital letter b +1D53A <reserved> + x (double-struck capital c - 2102) +1D53B MATHEMATICAL DOUBLE-STRUCK CAPITAL D + # <font> 0044 latin capital letter d +1D53C MATHEMATICAL DOUBLE-STRUCK CAPITAL E + # <font> 0045 latin capital letter e +1D53D MATHEMATICAL DOUBLE-STRUCK CAPITAL F + # <font> 0046 latin capital letter f +1D53E MATHEMATICAL DOUBLE-STRUCK CAPITAL G + # <font> 0047 latin capital letter g +1D53F <reserved> + x (double-struck capital h - 210D) +1D540 MATHEMATICAL DOUBLE-STRUCK CAPITAL I + # <font> 0049 latin capital letter i +1D541 MATHEMATICAL DOUBLE-STRUCK CAPITAL J + # <font> 004A latin capital letter j +1D542 MATHEMATICAL DOUBLE-STRUCK CAPITAL K + # <font> 004B latin capital letter k +1D543 MATHEMATICAL DOUBLE-STRUCK CAPITAL L + # <font> 004C latin capital letter l +1D544 MATHEMATICAL DOUBLE-STRUCK CAPITAL M + # <font> 004D latin capital letter m +1D545 <reserved> + x (double-struck capital n - 2115) +1D546 MATHEMATICAL DOUBLE-STRUCK CAPITAL O + # <font> 004F latin capital letter o +1D547 <reserved> + x (double-struck capital p - 2119) +1D548 <reserved> + x (double-struck capital q - 211A) +1D549 <reserved> + x (double-struck capital r - 211D) +1D54A MATHEMATICAL DOUBLE-STRUCK CAPITAL S + # <font> 0053 latin capital letter s +1D54B MATHEMATICAL DOUBLE-STRUCK CAPITAL T + # <font> 0054 latin capital letter t +1D54C MATHEMATICAL DOUBLE-STRUCK CAPITAL U + # <font> 0055 latin capital letter u +1D54D MATHEMATICAL DOUBLE-STRUCK CAPITAL V + # <font> 0056 latin capital letter v +1D54E MATHEMATICAL DOUBLE-STRUCK CAPITAL W + # <font> 0057 latin capital letter w +1D54F MATHEMATICAL DOUBLE-STRUCK CAPITAL X + # <font> 0058 latin capital letter x +1D550 MATHEMATICAL DOUBLE-STRUCK CAPITAL Y + # <font> 0059 latin capital letter y +1D551 <reserved> + x (double-struck capital z - 2124) +1D552 MATHEMATICAL DOUBLE-STRUCK SMALL A + # <font> 0061 latin small letter a +1D553 MATHEMATICAL DOUBLE-STRUCK SMALL B + # <font> 0062 latin small letter b +1D554 MATHEMATICAL DOUBLE-STRUCK SMALL C + # <font> 0063 latin small letter c +1D555 MATHEMATICAL DOUBLE-STRUCK SMALL D + # <font> 0064 latin small letter d +1D556 MATHEMATICAL DOUBLE-STRUCK SMALL E + # <font> 0065 latin small letter e +1D557 MATHEMATICAL DOUBLE-STRUCK SMALL F + # <font> 0066 latin small letter f +1D558 MATHEMATICAL DOUBLE-STRUCK SMALL G + # <font> 0067 latin small letter g +1D559 MATHEMATICAL DOUBLE-STRUCK SMALL H + # <font> 0068 latin small letter h +1D55A MATHEMATICAL DOUBLE-STRUCK SMALL I + # <font> 0069 latin small letter i +1D55B MATHEMATICAL DOUBLE-STRUCK SMALL J + # <font> 006A latin small letter j +1D55C MATHEMATICAL DOUBLE-STRUCK SMALL K + # <font> 006B latin small letter k +1D55D MATHEMATICAL DOUBLE-STRUCK SMALL L + # <font> 006C latin small letter l +1D55E MATHEMATICAL DOUBLE-STRUCK SMALL M + # <font> 006D latin small letter m +1D55F MATHEMATICAL DOUBLE-STRUCK SMALL N + # <font> 006E latin small letter n +1D560 MATHEMATICAL DOUBLE-STRUCK SMALL O + # <font> 006F latin small letter o +1D561 MATHEMATICAL DOUBLE-STRUCK SMALL P + # <font> 0070 latin small letter p +1D562 MATHEMATICAL DOUBLE-STRUCK SMALL Q + # <font> 0071 latin small letter q +1D563 MATHEMATICAL DOUBLE-STRUCK SMALL R + # <font> 0072 latin small letter r +1D564 MATHEMATICAL DOUBLE-STRUCK SMALL S + # <font> 0073 latin small letter s +1D565 MATHEMATICAL DOUBLE-STRUCK SMALL T + # <font> 0074 latin small letter t +1D566 MATHEMATICAL DOUBLE-STRUCK SMALL U + # <font> 0075 latin small letter u +1D567 MATHEMATICAL DOUBLE-STRUCK SMALL V + # <font> 0076 latin small letter v +1D568 MATHEMATICAL DOUBLE-STRUCK SMALL W + # <font> 0077 latin small letter w +1D569 MATHEMATICAL DOUBLE-STRUCK SMALL X + # <font> 0078 latin small letter x +1D56A MATHEMATICAL DOUBLE-STRUCK SMALL Y + # <font> 0079 latin small letter y +1D56B MATHEMATICAL DOUBLE-STRUCK SMALL Z + # <font> 007A latin small letter z +@ Bold Fraktur symbols +1D56C MATHEMATICAL BOLD FRAKTUR CAPITAL A + # <font> 0041 latin capital letter a +1D56D MATHEMATICAL BOLD FRAKTUR CAPITAL B + # <font> 0042 latin capital letter b +1D56E MATHEMATICAL BOLD FRAKTUR CAPITAL C + # <font> 0043 latin capital letter c +1D56F MATHEMATICAL BOLD FRAKTUR CAPITAL D + # <font> 0044 latin capital letter d +1D570 MATHEMATICAL BOLD FRAKTUR CAPITAL E + # <font> 0045 latin capital letter e +1D571 MATHEMATICAL BOLD FRAKTUR CAPITAL F + # <font> 0046 latin capital letter f +1D572 MATHEMATICAL BOLD FRAKTUR CAPITAL G + # <font> 0047 latin capital letter g +1D573 MATHEMATICAL BOLD FRAKTUR CAPITAL H + # <font> 0048 latin capital letter h +1D574 MATHEMATICAL BOLD FRAKTUR CAPITAL I + # <font> 0049 latin capital letter i +1D575 MATHEMATICAL BOLD FRAKTUR CAPITAL J + # <font> 004A latin capital letter j +1D576 MATHEMATICAL BOLD FRAKTUR CAPITAL K + # <font> 004B latin capital letter k +1D577 MATHEMATICAL BOLD FRAKTUR CAPITAL L + # <font> 004C latin capital letter l +1D578 MATHEMATICAL BOLD FRAKTUR CAPITAL M + # <font> 004D latin capital letter m +1D579 MATHEMATICAL BOLD FRAKTUR CAPITAL N + # <font> 004E latin capital letter n +1D57A MATHEMATICAL BOLD FRAKTUR CAPITAL O + # <font> 004F latin capital letter o +1D57B MATHEMATICAL BOLD FRAKTUR CAPITAL P + # <font> 0050 latin capital letter p +1D57C MATHEMATICAL BOLD FRAKTUR CAPITAL Q + # <font> 0051 latin capital letter q +1D57D MATHEMATICAL BOLD FRAKTUR CAPITAL R + # <font> 0052 latin capital letter r +1D57E MATHEMATICAL BOLD FRAKTUR CAPITAL S + # <font> 0053 latin capital letter s +1D57F MATHEMATICAL BOLD FRAKTUR CAPITAL T + # <font> 0054 latin capital letter t +1D580 MATHEMATICAL BOLD FRAKTUR CAPITAL U + # <font> 0055 latin capital letter u +1D581 MATHEMATICAL BOLD FRAKTUR CAPITAL V + # <font> 0056 latin capital letter v +1D582 MATHEMATICAL BOLD FRAKTUR CAPITAL W + # <font> 0057 latin capital letter w +1D583 MATHEMATICAL BOLD FRAKTUR CAPITAL X + # <font> 0058 latin capital letter x +1D584 MATHEMATICAL BOLD FRAKTUR CAPITAL Y + # <font> 0059 latin capital letter y +1D585 MATHEMATICAL BOLD FRAKTUR CAPITAL Z + # <font> 005A latin capital letter z +1D586 MATHEMATICAL BOLD FRAKTUR SMALL A + # <font> 0061 latin small letter a +1D587 MATHEMATICAL BOLD FRAKTUR SMALL B + # <font> 0062 latin small letter b +1D588 MATHEMATICAL BOLD FRAKTUR SMALL C + # <font> 0063 latin small letter c +1D589 MATHEMATICAL BOLD FRAKTUR SMALL D + # <font> 0064 latin small letter d +1D58A MATHEMATICAL BOLD FRAKTUR SMALL E + # <font> 0065 latin small letter e +1D58B MATHEMATICAL BOLD FRAKTUR SMALL F + # <font> 0066 latin small letter f +1D58C MATHEMATICAL BOLD FRAKTUR SMALL G + # <font> 0067 latin small letter g +1D58D MATHEMATICAL BOLD FRAKTUR SMALL H + # <font> 0068 latin small letter h +1D58E MATHEMATICAL BOLD FRAKTUR SMALL I + # <font> 0069 latin small letter i +1D58F MATHEMATICAL BOLD FRAKTUR SMALL J + # <font> 006A latin small letter j +1D590 MATHEMATICAL BOLD FRAKTUR SMALL K + # <font> 006B latin small letter k +1D591 MATHEMATICAL BOLD FRAKTUR SMALL L + # <font> 006C latin small letter l +1D592 MATHEMATICAL BOLD FRAKTUR SMALL M + # <font> 006D latin small letter m +1D593 MATHEMATICAL BOLD FRAKTUR SMALL N + # <font> 006E latin small letter n +1D594 MATHEMATICAL BOLD FRAKTUR SMALL O + # <font> 006F latin small letter o +1D595 MATHEMATICAL BOLD FRAKTUR SMALL P + # <font> 0070 latin small letter p +1D596 MATHEMATICAL BOLD FRAKTUR SMALL Q + # <font> 0071 latin small letter q +1D597 MATHEMATICAL BOLD FRAKTUR SMALL R + # <font> 0072 latin small letter r +1D598 MATHEMATICAL BOLD FRAKTUR SMALL S + # <font> 0073 latin small letter s +1D599 MATHEMATICAL BOLD FRAKTUR SMALL T + # <font> 0074 latin small letter t +1D59A MATHEMATICAL BOLD FRAKTUR SMALL U + # <font> 0075 latin small letter u +1D59B MATHEMATICAL BOLD FRAKTUR SMALL V + # <font> 0076 latin small letter v +1D59C MATHEMATICAL BOLD FRAKTUR SMALL W + # <font> 0077 latin small letter w +1D59D MATHEMATICAL BOLD FRAKTUR SMALL X + # <font> 0078 latin small letter x +1D59E MATHEMATICAL BOLD FRAKTUR SMALL Y + # <font> 0079 latin small letter y +1D59F MATHEMATICAL BOLD FRAKTUR SMALL Z + # <font> 007A latin small letter z +@ Sans-serif symbols +1D5A0 MATHEMATICAL SANS-SERIF CAPITAL A + # <font> 0041 latin capital letter a +1D5A1 MATHEMATICAL SANS-SERIF CAPITAL B + # <font> 0042 latin capital letter b +1D5A2 MATHEMATICAL SANS-SERIF CAPITAL C + # <font> 0043 latin capital letter c +1D5A3 MATHEMATICAL SANS-SERIF CAPITAL D + # <font> 0044 latin capital letter d +1D5A4 MATHEMATICAL SANS-SERIF CAPITAL E + # <font> 0045 latin capital letter e +1D5A5 MATHEMATICAL SANS-SERIF CAPITAL F + # <font> 0046 latin capital letter f +1D5A6 MATHEMATICAL SANS-SERIF CAPITAL G + # <font> 0047 latin capital letter g +1D5A7 MATHEMATICAL SANS-SERIF CAPITAL H + # <font> 0048 latin capital letter h +1D5A8 MATHEMATICAL SANS-SERIF CAPITAL I + # <font> 0049 latin capital letter i +1D5A9 MATHEMATICAL SANS-SERIF CAPITAL J + # <font> 004A latin capital letter j +1D5AA MATHEMATICAL SANS-SERIF CAPITAL K + # <font> 004B latin capital letter k +1D5AB MATHEMATICAL SANS-SERIF CAPITAL L + # <font> 004C latin capital letter l +1D5AC MATHEMATICAL SANS-SERIF CAPITAL M + # <font> 004D latin capital letter m +1D5AD MATHEMATICAL SANS-SERIF CAPITAL N + # <font> 004E latin capital letter n +1D5AE MATHEMATICAL SANS-SERIF CAPITAL O + # <font> 004F latin capital letter o +1D5AF MATHEMATICAL SANS-SERIF CAPITAL P + # <font> 0050 latin capital letter p +1D5B0 MATHEMATICAL SANS-SERIF CAPITAL Q + # <font> 0051 latin capital letter q +1D5B1 MATHEMATICAL SANS-SERIF CAPITAL R + # <font> 0052 latin capital letter r +1D5B2 MATHEMATICAL SANS-SERIF CAPITAL S + # <font> 0053 latin capital letter s +1D5B3 MATHEMATICAL SANS-SERIF CAPITAL T + # <font> 0054 latin capital letter t +1D5B4 MATHEMATICAL SANS-SERIF CAPITAL U + # <font> 0055 latin capital letter u +1D5B5 MATHEMATICAL SANS-SERIF CAPITAL V + # <font> 0056 latin capital letter v +1D5B6 MATHEMATICAL SANS-SERIF CAPITAL W + # <font> 0057 latin capital letter w +1D5B7 MATHEMATICAL SANS-SERIF CAPITAL X + # <font> 0058 latin capital letter x +1D5B8 MATHEMATICAL SANS-SERIF CAPITAL Y + # <font> 0059 latin capital letter y +1D5B9 MATHEMATICAL SANS-SERIF CAPITAL Z + # <font> 005A latin capital letter z +1D5BA MATHEMATICAL SANS-SERIF SMALL A + # <font> 0061 latin small letter a +1D5BB MATHEMATICAL SANS-SERIF SMALL B + # <font> 0062 latin small letter b +1D5BC MATHEMATICAL SANS-SERIF SMALL C + # <font> 0063 latin small letter c +1D5BD MATHEMATICAL SANS-SERIF SMALL D + # <font> 0064 latin small letter d +1D5BE MATHEMATICAL SANS-SERIF SMALL E + # <font> 0065 latin small letter e +1D5BF MATHEMATICAL SANS-SERIF SMALL F + # <font> 0066 latin small letter f +1D5C0 MATHEMATICAL SANS-SERIF SMALL G + # <font> 0067 latin small letter g +1D5C1 MATHEMATICAL SANS-SERIF SMALL H + # <font> 0068 latin small letter h +1D5C2 MATHEMATICAL SANS-SERIF SMALL I + # <font> 0069 latin small letter i +1D5C3 MATHEMATICAL SANS-SERIF SMALL J + # <font> 006A latin small letter j +1D5C4 MATHEMATICAL SANS-SERIF SMALL K + # <font> 006B latin small letter k +1D5C5 MATHEMATICAL SANS-SERIF SMALL L + # <font> 006C latin small letter l +1D5C6 MATHEMATICAL SANS-SERIF SMALL M + # <font> 006D latin small letter m +1D5C7 MATHEMATICAL SANS-SERIF SMALL N + # <font> 006E latin small letter n +1D5C8 MATHEMATICAL SANS-SERIF SMALL O + # <font> 006F latin small letter o +1D5C9 MATHEMATICAL SANS-SERIF SMALL P + # <font> 0070 latin small letter p +1D5CA MATHEMATICAL SANS-SERIF SMALL Q + # <font> 0071 latin small letter q +1D5CB MATHEMATICAL SANS-SERIF SMALL R + # <font> 0072 latin small letter r +1D5CC MATHEMATICAL SANS-SERIF SMALL S + # <font> 0073 latin small letter s +1D5CD MATHEMATICAL SANS-SERIF SMALL T + # <font> 0074 latin small letter t +1D5CE MATHEMATICAL SANS-SERIF SMALL U + # <font> 0075 latin small letter u +1D5CF MATHEMATICAL SANS-SERIF SMALL V + # <font> 0076 latin small letter v +1D5D0 MATHEMATICAL SANS-SERIF SMALL W + # <font> 0077 latin small letter w +1D5D1 MATHEMATICAL SANS-SERIF SMALL X + # <font> 0078 latin small letter x +1D5D2 MATHEMATICAL SANS-SERIF SMALL Y + # <font> 0079 latin small letter y +1D5D3 MATHEMATICAL SANS-SERIF SMALL Z + # <font> 007A latin small letter z +@ Sans-serif bold symbols +1D5D4 MATHEMATICAL SANS-SERIF BOLD CAPITAL A + # <font> 0041 latin capital letter a +1D5D5 MATHEMATICAL SANS-SERIF BOLD CAPITAL B + # <font> 0042 latin capital letter b +1D5D6 MATHEMATICAL SANS-SERIF BOLD CAPITAL C + # <font> 0043 latin capital letter c +1D5D7 MATHEMATICAL SANS-SERIF BOLD CAPITAL D + # <font> 0044 latin capital letter d +1D5D8 MATHEMATICAL SANS-SERIF BOLD CAPITAL E + # <font> 0045 latin capital letter e +1D5D9 MATHEMATICAL SANS-SERIF BOLD CAPITAL F + # <font> 0046 latin capital letter f +1D5DA MATHEMATICAL SANS-SERIF BOLD CAPITAL G + # <font> 0047 latin capital letter g +1D5DB MATHEMATICAL SANS-SERIF BOLD CAPITAL H + # <font> 0048 latin capital letter h +1D5DC MATHEMATICAL SANS-SERIF BOLD CAPITAL I + # <font> 0049 latin capital letter i +1D5DD MATHEMATICAL SANS-SERIF BOLD CAPITAL J + # <font> 004A latin capital letter j +1D5DE MATHEMATICAL SANS-SERIF BOLD CAPITAL K + # <font> 004B latin capital letter k +1D5DF MATHEMATICAL SANS-SERIF BOLD CAPITAL L + # <font> 004C latin capital letter l +1D5E0 MATHEMATICAL SANS-SERIF BOLD CAPITAL M + # <font> 004D latin capital letter m +1D5E1 MATHEMATICAL SANS-SERIF BOLD CAPITAL N + # <font> 004E latin capital letter n +1D5E2 MATHEMATICAL SANS-SERIF BOLD CAPITAL O + # <font> 004F latin capital letter o +1D5E3 MATHEMATICAL SANS-SERIF BOLD CAPITAL P + # <font> 0050 latin capital letter p +1D5E4 MATHEMATICAL SANS-SERIF BOLD CAPITAL Q + # <font> 0051 latin capital letter q +1D5E5 MATHEMATICAL SANS-SERIF BOLD CAPITAL R + # <font> 0052 latin capital letter r +1D5E6 MATHEMATICAL SANS-SERIF BOLD CAPITAL S + # <font> 0053 latin capital letter s +1D5E7 MATHEMATICAL SANS-SERIF BOLD CAPITAL T + # <font> 0054 latin capital letter t +1D5E8 MATHEMATICAL SANS-SERIF BOLD CAPITAL U + # <font> 0055 latin capital letter u +1D5E9 MATHEMATICAL SANS-SERIF BOLD CAPITAL V + # <font> 0056 latin capital letter v +1D5EA MATHEMATICAL SANS-SERIF BOLD CAPITAL W + # <font> 0057 latin capital letter w +1D5EB MATHEMATICAL SANS-SERIF BOLD CAPITAL X + # <font> 0058 latin capital letter x +1D5EC MATHEMATICAL SANS-SERIF BOLD CAPITAL Y + # <font> 0059 latin capital letter y +1D5ED MATHEMATICAL SANS-SERIF BOLD CAPITAL Z + # <font> 005A latin capital letter z +1D5EE MATHEMATICAL SANS-SERIF BOLD SMALL A + # <font> 0061 latin small letter a +1D5EF MATHEMATICAL SANS-SERIF BOLD SMALL B + # <font> 0062 latin small letter b +1D5F0 MATHEMATICAL SANS-SERIF BOLD SMALL C + # <font> 0063 latin small letter c +1D5F1 MATHEMATICAL SANS-SERIF BOLD SMALL D + # <font> 0064 latin small letter d +1D5F2 MATHEMATICAL SANS-SERIF BOLD SMALL E + # <font> 0065 latin small letter e +1D5F3 MATHEMATICAL SANS-SERIF BOLD SMALL F + # <font> 0066 latin small letter f +1D5F4 MATHEMATICAL SANS-SERIF BOLD SMALL G + # <font> 0067 latin small letter g +1D5F5 MATHEMATICAL SANS-SERIF BOLD SMALL H + # <font> 0068 latin small letter h +1D5F6 MATHEMATICAL SANS-SERIF BOLD SMALL I + # <font> 0069 latin small letter i +1D5F7 MATHEMATICAL SANS-SERIF BOLD SMALL J + # <font> 006A latin small letter j +1D5F8 MATHEMATICAL SANS-SERIF BOLD SMALL K + # <font> 006B latin small letter k +1D5F9 MATHEMATICAL SANS-SERIF BOLD SMALL L + # <font> 006C latin small letter l +1D5FA MATHEMATICAL SANS-SERIF BOLD SMALL M + # <font> 006D latin small letter m +1D5FB MATHEMATICAL SANS-SERIF BOLD SMALL N + # <font> 006E latin small letter n +1D5FC MATHEMATICAL SANS-SERIF BOLD SMALL O + # <font> 006F latin small letter o +1D5FD MATHEMATICAL SANS-SERIF BOLD SMALL P + # <font> 0070 latin small letter p +1D5FE MATHEMATICAL SANS-SERIF BOLD SMALL Q + # <font> 0071 latin small letter q +1D5FF MATHEMATICAL SANS-SERIF BOLD SMALL R + # <font> 0072 latin small letter r +1D600 MATHEMATICAL SANS-SERIF BOLD SMALL S + # <font> 0073 latin small letter s +1D601 MATHEMATICAL SANS-SERIF BOLD SMALL T + # <font> 0074 latin small letter t +1D602 MATHEMATICAL SANS-SERIF BOLD SMALL U + # <font> 0075 latin small letter u +1D603 MATHEMATICAL SANS-SERIF BOLD SMALL V + # <font> 0076 latin small letter v +1D604 MATHEMATICAL SANS-SERIF BOLD SMALL W + # <font> 0077 latin small letter w +1D605 MATHEMATICAL SANS-SERIF BOLD SMALL X + # <font> 0078 latin small letter x +1D606 MATHEMATICAL SANS-SERIF BOLD SMALL Y + # <font> 0079 latin small letter y +1D607 MATHEMATICAL SANS-SERIF BOLD SMALL Z + # <font> 007A latin small letter z +@ Sans-serif italic symbols +1D608 MATHEMATICAL SANS-SERIF ITALIC CAPITAL A + # <font> 0041 latin capital letter a +1D609 MATHEMATICAL SANS-SERIF ITALIC CAPITAL B + # <font> 0042 latin capital letter b +1D60A MATHEMATICAL SANS-SERIF ITALIC CAPITAL C + # <font> 0043 latin capital letter c +1D60B MATHEMATICAL SANS-SERIF ITALIC CAPITAL D + # <font> 0044 latin capital letter d +1D60C MATHEMATICAL SANS-SERIF ITALIC CAPITAL E + # <font> 0045 latin capital letter e +1D60D MATHEMATICAL SANS-SERIF ITALIC CAPITAL F + # <font> 0046 latin capital letter f +1D60E MATHEMATICAL SANS-SERIF ITALIC CAPITAL G + # <font> 0047 latin capital letter g +1D60F MATHEMATICAL SANS-SERIF ITALIC CAPITAL H + # <font> 0048 latin capital letter h +1D610 MATHEMATICAL SANS-SERIF ITALIC CAPITAL I + # <font> 0049 latin capital letter i +1D611 MATHEMATICAL SANS-SERIF ITALIC CAPITAL J + # <font> 004A latin capital letter j +1D612 MATHEMATICAL SANS-SERIF ITALIC CAPITAL K + # <font> 004B latin capital letter k +1D613 MATHEMATICAL SANS-SERIF ITALIC CAPITAL L + # <font> 004C latin capital letter l +1D614 MATHEMATICAL SANS-SERIF ITALIC CAPITAL M + # <font> 004D latin capital letter m +1D615 MATHEMATICAL SANS-SERIF ITALIC CAPITAL N + # <font> 004E latin capital letter n +1D616 MATHEMATICAL SANS-SERIF ITALIC CAPITAL O + # <font> 004F latin capital letter o +1D617 MATHEMATICAL SANS-SERIF ITALIC CAPITAL P + # <font> 0050 latin capital letter p +1D618 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q + # <font> 0051 latin capital letter q +1D619 MATHEMATICAL SANS-SERIF ITALIC CAPITAL R + # <font> 0052 latin capital letter r +1D61A MATHEMATICAL SANS-SERIF ITALIC CAPITAL S + # <font> 0053 latin capital letter s +1D61B MATHEMATICAL SANS-SERIF ITALIC CAPITAL T + # <font> 0054 latin capital letter t +1D61C MATHEMATICAL SANS-SERIF ITALIC CAPITAL U + # <font> 0055 latin capital letter u +1D61D MATHEMATICAL SANS-SERIF ITALIC CAPITAL V + # <font> 0056 latin capital letter v +1D61E MATHEMATICAL SANS-SERIF ITALIC CAPITAL W + # <font> 0057 latin capital letter w +1D61F MATHEMATICAL SANS-SERIF ITALIC CAPITAL X + # <font> 0058 latin capital letter x +1D620 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y + # <font> 0059 latin capital letter y +1D621 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z + # <font> 005A latin capital letter z +1D622 MATHEMATICAL SANS-SERIF ITALIC SMALL A + # <font> 0061 latin small letter a +1D623 MATHEMATICAL SANS-SERIF ITALIC SMALL B + # <font> 0062 latin small letter b +1D624 MATHEMATICAL SANS-SERIF ITALIC SMALL C + # <font> 0063 latin small letter c +1D625 MATHEMATICAL SANS-SERIF ITALIC SMALL D + # <font> 0064 latin small letter d +1D626 MATHEMATICAL SANS-SERIF ITALIC SMALL E + # <font> 0065 latin small letter e +1D627 MATHEMATICAL SANS-SERIF ITALIC SMALL F + # <font> 0066 latin small letter f +1D628 MATHEMATICAL SANS-SERIF ITALIC SMALL G + # <font> 0067 latin small letter g +1D629 MATHEMATICAL SANS-SERIF ITALIC SMALL H + # <font> 0068 latin small letter h +1D62A MATHEMATICAL SANS-SERIF ITALIC SMALL I + # <font> 0069 latin small letter i +1D62B MATHEMATICAL SANS-SERIF ITALIC SMALL J + # <font> 006A latin small letter j +1D62C MATHEMATICAL SANS-SERIF ITALIC SMALL K + # <font> 006B latin small letter k +1D62D MATHEMATICAL SANS-SERIF ITALIC SMALL L + # <font> 006C latin small letter l +1D62E MATHEMATICAL SANS-SERIF ITALIC SMALL M + # <font> 006D latin small letter m +1D62F MATHEMATICAL SANS-SERIF ITALIC SMALL N + # <font> 006E latin small letter n +1D630 MATHEMATICAL SANS-SERIF ITALIC SMALL O + # <font> 006F latin small letter o +1D631 MATHEMATICAL SANS-SERIF ITALIC SMALL P + # <font> 0070 latin small letter p +1D632 MATHEMATICAL SANS-SERIF ITALIC SMALL Q + # <font> 0071 latin small letter q +1D633 MATHEMATICAL SANS-SERIF ITALIC SMALL R + # <font> 0072 latin small letter r +1D634 MATHEMATICAL SANS-SERIF ITALIC SMALL S + # <font> 0073 latin small letter s +1D635 MATHEMATICAL SANS-SERIF ITALIC SMALL T + # <font> 0074 latin small letter t +1D636 MATHEMATICAL SANS-SERIF ITALIC SMALL U + # <font> 0075 latin small letter u +1D637 MATHEMATICAL SANS-SERIF ITALIC SMALL V + # <font> 0076 latin small letter v +1D638 MATHEMATICAL SANS-SERIF ITALIC SMALL W + # <font> 0077 latin small letter w +1D639 MATHEMATICAL SANS-SERIF ITALIC SMALL X + # <font> 0078 latin small letter x +1D63A MATHEMATICAL SANS-SERIF ITALIC SMALL Y + # <font> 0079 latin small letter y +1D63B MATHEMATICAL SANS-SERIF ITALIC SMALL Z + # <font> 007A latin small letter z +@ Sans-serif bold italic symbols +1D63C MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A + # <font> 0041 latin capital letter a +1D63D MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B + # <font> 0042 latin capital letter b +1D63E MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C + # <font> 0043 latin capital letter c +1D63F MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D + # <font> 0044 latin capital letter d +1D640 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E + # <font> 0045 latin capital letter e +1D641 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F + # <font> 0046 latin capital letter f +1D642 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G + # <font> 0047 latin capital letter g +1D643 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H + # <font> 0048 latin capital letter h +1D644 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I + # <font> 0049 latin capital letter i +1D645 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J + # <font> 004A latin capital letter j +1D646 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K + # <font> 004B latin capital letter k +1D647 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L + # <font> 004C latin capital letter l +1D648 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M + # <font> 004D latin capital letter m +1D649 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N + # <font> 004E latin capital letter n +1D64A MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O + # <font> 004F latin capital letter o +1D64B MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P + # <font> 0050 latin capital letter p +1D64C MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q + # <font> 0051 latin capital letter q +1D64D MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R + # <font> 0052 latin capital letter r +1D64E MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S + # <font> 0053 latin capital letter s +1D64F MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T + # <font> 0054 latin capital letter t +1D650 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U + # <font> 0055 latin capital letter u +1D651 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V + # <font> 0056 latin capital letter v +1D652 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W + # <font> 0057 latin capital letter w +1D653 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X + # <font> 0058 latin capital letter x +1D654 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y + # <font> 0059 latin capital letter y +1D655 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z + # <font> 005A latin capital letter z +1D656 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A + # <font> 0061 latin small letter a +1D657 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B + # <font> 0062 latin small letter b +1D658 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C + # <font> 0063 latin small letter c +1D659 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D + # <font> 0064 latin small letter d +1D65A MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E + # <font> 0065 latin small letter e +1D65B MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F + # <font> 0066 latin small letter f +1D65C MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G + # <font> 0067 latin small letter g +1D65D MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H + # <font> 0068 latin small letter h +1D65E MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I + # <font> 0069 latin small letter i +1D65F MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J + # <font> 006A latin small letter j +1D660 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K + # <font> 006B latin small letter k +1D661 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L + # <font> 006C latin small letter l +1D662 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M + # <font> 006D latin small letter m +1D663 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N + # <font> 006E latin small letter n +1D664 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O + # <font> 006F latin small letter o +1D665 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P + # <font> 0070 latin small letter p +1D666 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q + # <font> 0071 latin small letter q +1D667 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R + # <font> 0072 latin small letter r +1D668 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S + # <font> 0073 latin small letter s +1D669 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T + # <font> 0074 latin small letter t +1D66A MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U + # <font> 0075 latin small letter u +1D66B MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V + # <font> 0076 latin small letter v +1D66C MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W + # <font> 0077 latin small letter w +1D66D MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X + # <font> 0078 latin small letter x +1D66E MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y + # <font> 0079 latin small letter y +1D66F MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z + # <font> 007A latin small letter z +@ Monospace symbols +1D670 MATHEMATICAL MONOSPACE CAPITAL A + # <font> 0041 latin capital letter a +1D671 MATHEMATICAL MONOSPACE CAPITAL B + # <font> 0042 latin capital letter b +1D672 MATHEMATICAL MONOSPACE CAPITAL C + # <font> 0043 latin capital letter c +1D673 MATHEMATICAL MONOSPACE CAPITAL D + # <font> 0044 latin capital letter d +1D674 MATHEMATICAL MONOSPACE CAPITAL E + # <font> 0045 latin capital letter e +1D675 MATHEMATICAL MONOSPACE CAPITAL F + # <font> 0046 latin capital letter f +1D676 MATHEMATICAL MONOSPACE CAPITAL G + # <font> 0047 latin capital letter g +1D677 MATHEMATICAL MONOSPACE CAPITAL H + # <font> 0048 latin capital letter h +1D678 MATHEMATICAL MONOSPACE CAPITAL I + # <font> 0049 latin capital letter i +1D679 MATHEMATICAL MONOSPACE CAPITAL J + # <font> 004A latin capital letter j +1D67A MATHEMATICAL MONOSPACE CAPITAL K + # <font> 004B latin capital letter k +1D67B MATHEMATICAL MONOSPACE CAPITAL L + # <font> 004C latin capital letter l +1D67C MATHEMATICAL MONOSPACE CAPITAL M + # <font> 004D latin capital letter m +1D67D MATHEMATICAL MONOSPACE CAPITAL N + # <font> 004E latin capital letter n +1D67E MATHEMATICAL MONOSPACE CAPITAL O + # <font> 004F latin capital letter o +1D67F MATHEMATICAL MONOSPACE CAPITAL P + # <font> 0050 latin capital letter p +1D680 MATHEMATICAL MONOSPACE CAPITAL Q + # <font> 0051 latin capital letter q +1D681 MATHEMATICAL MONOSPACE CAPITAL R + # <font> 0052 latin capital letter r +1D682 MATHEMATICAL MONOSPACE CAPITAL S + # <font> 0053 latin capital letter s +1D683 MATHEMATICAL MONOSPACE CAPITAL T + # <font> 0054 latin capital letter t +1D684 MATHEMATICAL MONOSPACE CAPITAL U + # <font> 0055 latin capital letter u +1D685 MATHEMATICAL MONOSPACE CAPITAL V + # <font> 0056 latin capital letter v +1D686 MATHEMATICAL MONOSPACE CAPITAL W + # <font> 0057 latin capital letter w +1D687 MATHEMATICAL MONOSPACE CAPITAL X + # <font> 0058 latin capital letter x +1D688 MATHEMATICAL MONOSPACE CAPITAL Y + # <font> 0059 latin capital letter y +1D689 MATHEMATICAL MONOSPACE CAPITAL Z + # <font> 005A latin capital letter z +1D68A MATHEMATICAL MONOSPACE SMALL A + # <font> 0061 latin small letter a +1D68B MATHEMATICAL MONOSPACE SMALL B + # <font> 0062 latin small letter b +1D68C MATHEMATICAL MONOSPACE SMALL C + # <font> 0063 latin small letter c +1D68D MATHEMATICAL MONOSPACE SMALL D + # <font> 0064 latin small letter d +1D68E MATHEMATICAL MONOSPACE SMALL E + # <font> 0065 latin small letter e +1D68F MATHEMATICAL MONOSPACE SMALL F + # <font> 0066 latin small letter f +1D690 MATHEMATICAL MONOSPACE SMALL G + # <font> 0067 latin small letter g +1D691 MATHEMATICAL MONOSPACE SMALL H + # <font> 0068 latin small letter h +1D692 MATHEMATICAL MONOSPACE SMALL I + # <font> 0069 latin small letter i +1D693 MATHEMATICAL MONOSPACE SMALL J + # <font> 006A latin small letter j +1D694 MATHEMATICAL MONOSPACE SMALL K + # <font> 006B latin small letter k +1D695 MATHEMATICAL MONOSPACE SMALL L + # <font> 006C latin small letter l +1D696 MATHEMATICAL MONOSPACE SMALL M + # <font> 006D latin small letter m +1D697 MATHEMATICAL MONOSPACE SMALL N + # <font> 006E latin small letter n +1D698 MATHEMATICAL MONOSPACE SMALL O + # <font> 006F latin small letter o +1D699 MATHEMATICAL MONOSPACE SMALL P + # <font> 0070 latin small letter p +1D69A MATHEMATICAL MONOSPACE SMALL Q + # <font> 0071 latin small letter q +1D69B MATHEMATICAL MONOSPACE SMALL R + # <font> 0072 latin small letter r +1D69C MATHEMATICAL MONOSPACE SMALL S + # <font> 0073 latin small letter s +1D69D MATHEMATICAL MONOSPACE SMALL T + # <font> 0074 latin small letter t +1D69E MATHEMATICAL MONOSPACE SMALL U + # <font> 0075 latin small letter u +1D69F MATHEMATICAL MONOSPACE SMALL V + # <font> 0076 latin small letter v +1D6A0 MATHEMATICAL MONOSPACE SMALL W + # <font> 0077 latin small letter w +1D6A1 MATHEMATICAL MONOSPACE SMALL X + # <font> 0078 latin small letter x +1D6A2 MATHEMATICAL MONOSPACE SMALL Y + # <font> 0079 latin small letter y +1D6A3 MATHEMATICAL MONOSPACE SMALL Z + # <font> 007A latin small letter z +@ Dotless symbols +@+ For use as independent symbols. These are not required as base characters for accents since regular i and j are soft-dotted in Unicode. +1D6A4 MATHEMATICAL ITALIC SMALL DOTLESS I + = \imath + x (latin small letter dotless i - 0131) + x (mathematical italic small i - 1D456) + # <font> 0131 latin small letter dotless i +1D6A5 MATHEMATICAL ITALIC SMALL DOTLESS J + = \jmath + x (latin small letter dotless j - 0237) + x (mathematical italic small j - 1D457) + # <font> 0237 latin small letter dotless j +@ Bold Greek symbols +1D6A8 MATHEMATICAL BOLD CAPITAL ALPHA + # <font> 0391 greek capital letter alpha +1D6A9 MATHEMATICAL BOLD CAPITAL BETA + # <font> 0392 greek capital letter beta +1D6AA MATHEMATICAL BOLD CAPITAL GAMMA + # <font> 0393 greek capital letter gamma +1D6AB MATHEMATICAL BOLD CAPITAL DELTA + # <font> 0394 greek capital letter delta +1D6AC MATHEMATICAL BOLD CAPITAL EPSILON + # <font> 0395 greek capital letter epsilon +1D6AD MATHEMATICAL BOLD CAPITAL ZETA + # <font> 0396 greek capital letter zeta +1D6AE MATHEMATICAL BOLD CAPITAL ETA + # <font> 0397 greek capital letter eta +1D6AF MATHEMATICAL BOLD CAPITAL THETA + # <font> 0398 greek capital letter theta +1D6B0 MATHEMATICAL BOLD CAPITAL IOTA + # <font> 0399 greek capital letter iota +1D6B1 MATHEMATICAL BOLD CAPITAL KAPPA + # <font> 039A greek capital letter kappa +1D6B2 MATHEMATICAL BOLD CAPITAL LAMDA + # <font> 039B greek capital letter lamda +1D6B3 MATHEMATICAL BOLD CAPITAL MU + # <font> 039C greek capital letter mu +1D6B4 MATHEMATICAL BOLD CAPITAL NU + # <font> 039D greek capital letter nu +1D6B5 MATHEMATICAL BOLD CAPITAL XI + # <font> 039E greek capital letter xi +1D6B6 MATHEMATICAL BOLD CAPITAL OMICRON + # <font> 039F greek capital letter omicron +1D6B7 MATHEMATICAL BOLD CAPITAL PI + # <font> 03A0 greek capital letter pi +1D6B8 MATHEMATICAL BOLD CAPITAL RHO + # <font> 03A1 greek capital letter rho +1D6B9 MATHEMATICAL BOLD CAPITAL THETA SYMBOL + # <font> 03F4 greek capital theta symbol +1D6BA MATHEMATICAL BOLD CAPITAL SIGMA + # <font> 03A3 greek capital letter sigma +1D6BB MATHEMATICAL BOLD CAPITAL TAU + # <font> 03A4 greek capital letter tau +1D6BC MATHEMATICAL BOLD CAPITAL UPSILON + # <font> 03A5 greek capital letter upsilon +1D6BD MATHEMATICAL BOLD CAPITAL PHI + # <font> 03A6 greek capital letter phi +1D6BE MATHEMATICAL BOLD CAPITAL CHI + # <font> 03A7 greek capital letter chi +1D6BF MATHEMATICAL BOLD CAPITAL PSI + # <font> 03A8 greek capital letter psi +1D6C0 MATHEMATICAL BOLD CAPITAL OMEGA + # <font> 03A9 greek capital letter omega +1D6C1 MATHEMATICAL BOLD NABLA + # <font> 2207 nabla +1D6C2 MATHEMATICAL BOLD SMALL ALPHA + # <font> 03B1 greek small letter alpha +1D6C3 MATHEMATICAL BOLD SMALL BETA + # <font> 03B2 greek small letter beta +1D6C4 MATHEMATICAL BOLD SMALL GAMMA + # <font> 03B3 greek small letter gamma +1D6C5 MATHEMATICAL BOLD SMALL DELTA + # <font> 03B4 greek small letter delta +1D6C6 MATHEMATICAL BOLD SMALL EPSILON + # <font> 03B5 greek small letter epsilon +1D6C7 MATHEMATICAL BOLD SMALL ZETA + # <font> 03B6 greek small letter zeta +1D6C8 MATHEMATICAL BOLD SMALL ETA + # <font> 03B7 greek small letter eta +1D6C9 MATHEMATICAL BOLD SMALL THETA + # <font> 03B8 greek small letter theta +1D6CA MATHEMATICAL BOLD SMALL IOTA + # <font> 03B9 greek small letter iota +1D6CB MATHEMATICAL BOLD SMALL KAPPA + # <font> 03BA greek small letter kappa +1D6CC MATHEMATICAL BOLD SMALL LAMDA + # <font> 03BB greek small letter lamda +1D6CD MATHEMATICAL BOLD SMALL MU + # <font> 03BC greek small letter mu +1D6CE MATHEMATICAL BOLD SMALL NU + # <font> 03BD greek small letter nu +1D6CF MATHEMATICAL BOLD SMALL XI + # <font> 03BE greek small letter xi +1D6D0 MATHEMATICAL BOLD SMALL OMICRON + # <font> 03BF greek small letter omicron +1D6D1 MATHEMATICAL BOLD SMALL PI + # <font> 03C0 greek small letter pi +1D6D2 MATHEMATICAL BOLD SMALL RHO + # <font> 03C1 greek small letter rho +1D6D3 MATHEMATICAL BOLD SMALL FINAL SIGMA + # <font> 03C2 greek small letter final sigma +1D6D4 MATHEMATICAL BOLD SMALL SIGMA + # <font> 03C3 greek small letter sigma +1D6D5 MATHEMATICAL BOLD SMALL TAU + # <font> 03C4 greek small letter tau +1D6D6 MATHEMATICAL BOLD SMALL UPSILON + # <font> 03C5 greek small letter upsilon +1D6D7 MATHEMATICAL BOLD SMALL PHI + # <font> 03C6 greek small letter phi +1D6D8 MATHEMATICAL BOLD SMALL CHI + # <font> 03C7 greek small letter chi +1D6D9 MATHEMATICAL BOLD SMALL PSI + # <font> 03C8 greek small letter psi +1D6DA MATHEMATICAL BOLD SMALL OMEGA + # <font> 03C9 greek small letter omega +@ Additional bold Greek symbols +1D6DB MATHEMATICAL BOLD PARTIAL DIFFERENTIAL + # <font> 2202 partial differential +1D6DC MATHEMATICAL BOLD EPSILON SYMBOL + # <font> 03F5 greek lunate epsilon symbol +1D6DD MATHEMATICAL BOLD THETA SYMBOL + # <font> 03D1 greek theta symbol +1D6DE MATHEMATICAL BOLD KAPPA SYMBOL + # <font> 03F0 greek kappa symbol +1D6DF MATHEMATICAL BOLD PHI SYMBOL + # <font> 03D5 greek phi symbol +1D6E0 MATHEMATICAL BOLD RHO SYMBOL + # <font> 03F1 greek rho symbol +1D6E1 MATHEMATICAL BOLD PI SYMBOL + # <font> 03D6 greek pi symbol +@ Italic Greek symbols +1D6E2 MATHEMATICAL ITALIC CAPITAL ALPHA + # <font> 0391 greek capital letter alpha +1D6E3 MATHEMATICAL ITALIC CAPITAL BETA + # <font> 0392 greek capital letter beta +1D6E4 MATHEMATICAL ITALIC CAPITAL GAMMA + # <font> 0393 greek capital letter gamma +1D6E5 MATHEMATICAL ITALIC CAPITAL DELTA + # <font> 0394 greek capital letter delta +1D6E6 MATHEMATICAL ITALIC CAPITAL EPSILON + # <font> 0395 greek capital letter epsilon +1D6E7 MATHEMATICAL ITALIC CAPITAL ZETA + # <font> 0396 greek capital letter zeta +1D6E8 MATHEMATICAL ITALIC CAPITAL ETA + # <font> 0397 greek capital letter eta +1D6E9 MATHEMATICAL ITALIC CAPITAL THETA + # <font> 0398 greek capital letter theta +1D6EA MATHEMATICAL ITALIC CAPITAL IOTA + # <font> 0399 greek capital letter iota +1D6EB MATHEMATICAL ITALIC CAPITAL KAPPA + # <font> 039A greek capital letter kappa +1D6EC MATHEMATICAL ITALIC CAPITAL LAMDA + # <font> 039B greek capital letter lamda +1D6ED MATHEMATICAL ITALIC CAPITAL MU + # <font> 039C greek capital letter mu +1D6EE MATHEMATICAL ITALIC CAPITAL NU + # <font> 039D greek capital letter nu +1D6EF MATHEMATICAL ITALIC CAPITAL XI + # <font> 039E greek capital letter xi +1D6F0 MATHEMATICAL ITALIC CAPITAL OMICRON + # <font> 039F greek capital letter omicron +1D6F1 MATHEMATICAL ITALIC CAPITAL PI + # <font> 03A0 greek capital letter pi +1D6F2 MATHEMATICAL ITALIC CAPITAL RHO + # <font> 03A1 greek capital letter rho +1D6F3 MATHEMATICAL ITALIC CAPITAL THETA SYMBOL + # <font> 03F4 greek capital theta symbol +1D6F4 MATHEMATICAL ITALIC CAPITAL SIGMA + # <font> 03A3 greek capital letter sigma +1D6F5 MATHEMATICAL ITALIC CAPITAL TAU + # <font> 03A4 greek capital letter tau +1D6F6 MATHEMATICAL ITALIC CAPITAL UPSILON + # <font> 03A5 greek capital letter upsilon +1D6F7 MATHEMATICAL ITALIC CAPITAL PHI + # <font> 03A6 greek capital letter phi +1D6F8 MATHEMATICAL ITALIC CAPITAL CHI + # <font> 03A7 greek capital letter chi +1D6F9 MATHEMATICAL ITALIC CAPITAL PSI + # <font> 03A8 greek capital letter psi +1D6FA MATHEMATICAL ITALIC CAPITAL OMEGA + # <font> 03A9 greek capital letter omega +1D6FB MATHEMATICAL ITALIC NABLA + # <font> 2207 nabla +1D6FC MATHEMATICAL ITALIC SMALL ALPHA + # <font> 03B1 greek small letter alpha +1D6FD MATHEMATICAL ITALIC SMALL BETA + # <font> 03B2 greek small letter beta +1D6FE MATHEMATICAL ITALIC SMALL GAMMA + # <font> 03B3 greek small letter gamma +1D6FF MATHEMATICAL ITALIC SMALL DELTA + # <font> 03B4 greek small letter delta +1D700 MATHEMATICAL ITALIC SMALL EPSILON + # <font> 03B5 greek small letter epsilon +1D701 MATHEMATICAL ITALIC SMALL ZETA + # <font> 03B6 greek small letter zeta +1D702 MATHEMATICAL ITALIC SMALL ETA + # <font> 03B7 greek small letter eta +1D703 MATHEMATICAL ITALIC SMALL THETA + # <font> 03B8 greek small letter theta +1D704 MATHEMATICAL ITALIC SMALL IOTA + # <font> 03B9 greek small letter iota +1D705 MATHEMATICAL ITALIC SMALL KAPPA + # <font> 03BA greek small letter kappa +1D706 MATHEMATICAL ITALIC SMALL LAMDA + # <font> 03BB greek small letter lamda +1D707 MATHEMATICAL ITALIC SMALL MU + # <font> 03BC greek small letter mu +1D708 MATHEMATICAL ITALIC SMALL NU + # <font> 03BD greek small letter nu +1D709 MATHEMATICAL ITALIC SMALL XI + # <font> 03BE greek small letter xi +1D70A MATHEMATICAL ITALIC SMALL OMICRON + # <font> 03BF greek small letter omicron +1D70B MATHEMATICAL ITALIC SMALL PI + # <font> 03C0 greek small letter pi +1D70C MATHEMATICAL ITALIC SMALL RHO + # <font> 03C1 greek small letter rho +1D70D MATHEMATICAL ITALIC SMALL FINAL SIGMA + # <font> 03C2 greek small letter final sigma +1D70E MATHEMATICAL ITALIC SMALL SIGMA + # <font> 03C3 greek small letter sigma +1D70F MATHEMATICAL ITALIC SMALL TAU + # <font> 03C4 greek small letter tau +1D710 MATHEMATICAL ITALIC SMALL UPSILON + # <font> 03C5 greek small letter upsilon +1D711 MATHEMATICAL ITALIC SMALL PHI + # <font> 03C6 greek small letter phi +1D712 MATHEMATICAL ITALIC SMALL CHI + # <font> 03C7 greek small letter chi +1D713 MATHEMATICAL ITALIC SMALL PSI + # <font> 03C8 greek small letter psi +1D714 MATHEMATICAL ITALIC SMALL OMEGA + # <font> 03C9 greek small letter omega +@ Additional italic Greek symbols +1D715 MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL + # <font> 2202 partial differential +1D716 MATHEMATICAL ITALIC EPSILON SYMBOL + # <font> 03F5 greek lunate epsilon symbol +1D717 MATHEMATICAL ITALIC THETA SYMBOL + # <font> 03D1 greek theta symbol +1D718 MATHEMATICAL ITALIC KAPPA SYMBOL + # <font> 03F0 greek kappa symbol +1D719 MATHEMATICAL ITALIC PHI SYMBOL + # <font> 03D5 greek phi symbol +1D71A MATHEMATICAL ITALIC RHO SYMBOL + # <font> 03F1 greek rho symbol +1D71B MATHEMATICAL ITALIC PI SYMBOL + # <font> 03D6 greek pi symbol +@ Bold italic Greek symbols +1D71C MATHEMATICAL BOLD ITALIC CAPITAL ALPHA + # <font> 0391 greek capital letter alpha +1D71D MATHEMATICAL BOLD ITALIC CAPITAL BETA + # <font> 0392 greek capital letter beta +1D71E MATHEMATICAL BOLD ITALIC CAPITAL GAMMA + # <font> 0393 greek capital letter gamma +1D71F MATHEMATICAL BOLD ITALIC CAPITAL DELTA + # <font> 0394 greek capital letter delta +1D720 MATHEMATICAL BOLD ITALIC CAPITAL EPSILON + # <font> 0395 greek capital letter epsilon +1D721 MATHEMATICAL BOLD ITALIC CAPITAL ZETA + # <font> 0396 greek capital letter zeta +1D722 MATHEMATICAL BOLD ITALIC CAPITAL ETA + # <font> 0397 greek capital letter eta +1D723 MATHEMATICAL BOLD ITALIC CAPITAL THETA + # <font> 0398 greek capital letter theta +1D724 MATHEMATICAL BOLD ITALIC CAPITAL IOTA + # <font> 0399 greek capital letter iota +1D725 MATHEMATICAL BOLD ITALIC CAPITAL KAPPA + # <font> 039A greek capital letter kappa +1D726 MATHEMATICAL BOLD ITALIC CAPITAL LAMDA + # <font> 039B greek capital letter lamda +1D727 MATHEMATICAL BOLD ITALIC CAPITAL MU + # <font> 039C greek capital letter mu +1D728 MATHEMATICAL BOLD ITALIC CAPITAL NU + # <font> 039D greek capital letter nu +1D729 MATHEMATICAL BOLD ITALIC CAPITAL XI + # <font> 039E greek capital letter xi +1D72A MATHEMATICAL BOLD ITALIC CAPITAL OMICRON + # <font> 039F greek capital letter omicron +1D72B MATHEMATICAL BOLD ITALIC CAPITAL PI + # <font> 03A0 greek capital letter pi +1D72C MATHEMATICAL BOLD ITALIC CAPITAL RHO + # <font> 03A1 greek capital letter rho +1D72D MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL + # <font> 03F4 greek capital theta symbol +1D72E MATHEMATICAL BOLD ITALIC CAPITAL SIGMA + # <font> 03A3 greek capital letter sigma +1D72F MATHEMATICAL BOLD ITALIC CAPITAL TAU + # <font> 03A4 greek capital letter tau +1D730 MATHEMATICAL BOLD ITALIC CAPITAL UPSILON + # <font> 03A5 greek capital letter upsilon +1D731 MATHEMATICAL BOLD ITALIC CAPITAL PHI + # <font> 03A6 greek capital letter phi +1D732 MATHEMATICAL BOLD ITALIC CAPITAL CHI + # <font> 03A7 greek capital letter chi +1D733 MATHEMATICAL BOLD ITALIC CAPITAL PSI + # <font> 03A8 greek capital letter psi +1D734 MATHEMATICAL BOLD ITALIC CAPITAL OMEGA + # <font> 03A9 greek capital letter omega +1D735 MATHEMATICAL BOLD ITALIC NABLA + # <font> 2207 nabla +1D736 MATHEMATICAL BOLD ITALIC SMALL ALPHA + # <font> 03B1 greek small letter alpha +1D737 MATHEMATICAL BOLD ITALIC SMALL BETA + # <font> 03B2 greek small letter beta +1D738 MATHEMATICAL BOLD ITALIC SMALL GAMMA + # <font> 03B3 greek small letter gamma +1D739 MATHEMATICAL BOLD ITALIC SMALL DELTA + # <font> 03B4 greek small letter delta +1D73A MATHEMATICAL BOLD ITALIC SMALL EPSILON + # <font> 03B5 greek small letter epsilon +1D73B MATHEMATICAL BOLD ITALIC SMALL ZETA + # <font> 03B6 greek small letter zeta +1D73C MATHEMATICAL BOLD ITALIC SMALL ETA + # <font> 03B7 greek small letter eta +1D73D MATHEMATICAL BOLD ITALIC SMALL THETA + # <font> 03B8 greek small letter theta +1D73E MATHEMATICAL BOLD ITALIC SMALL IOTA + # <font> 03B9 greek small letter iota +1D73F MATHEMATICAL BOLD ITALIC SMALL KAPPA + # <font> 03BA greek small letter kappa +1D740 MATHEMATICAL BOLD ITALIC SMALL LAMDA + # <font> 03BB greek small letter lamda +1D741 MATHEMATICAL BOLD ITALIC SMALL MU + # <font> 03BC greek small letter mu +1D742 MATHEMATICAL BOLD ITALIC SMALL NU + # <font> 03BD greek small letter nu +1D743 MATHEMATICAL BOLD ITALIC SMALL XI + # <font> 03BE greek small letter xi +1D744 MATHEMATICAL BOLD ITALIC SMALL OMICRON + # <font> 03BF greek small letter omicron +1D745 MATHEMATICAL BOLD ITALIC SMALL PI + # <font> 03C0 greek small letter pi +1D746 MATHEMATICAL BOLD ITALIC SMALL RHO + # <font> 03C1 greek small letter rho +1D747 MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA + # <font> 03C2 greek small letter final sigma +1D748 MATHEMATICAL BOLD ITALIC SMALL SIGMA + # <font> 03C3 greek small letter sigma +1D749 MATHEMATICAL BOLD ITALIC SMALL TAU + # <font> 03C4 greek small letter tau +1D74A MATHEMATICAL BOLD ITALIC SMALL UPSILON + # <font> 03C5 greek small letter upsilon +1D74B MATHEMATICAL BOLD ITALIC SMALL PHI + # <font> 03C6 greek small letter phi +1D74C MATHEMATICAL BOLD ITALIC SMALL CHI + # <font> 03C7 greek small letter chi +1D74D MATHEMATICAL BOLD ITALIC SMALL PSI + # <font> 03C8 greek small letter psi +1D74E MATHEMATICAL BOLD ITALIC SMALL OMEGA + # <font> 03C9 greek small letter omega +@ Additional bold italic Greek symbols +1D74F MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL + # <font> 2202 partial differential +1D750 MATHEMATICAL BOLD ITALIC EPSILON SYMBOL + # <font> 03F5 greek lunate epsilon symbol +1D751 MATHEMATICAL BOLD ITALIC THETA SYMBOL + # <font> 03D1 greek theta symbol +1D752 MATHEMATICAL BOLD ITALIC KAPPA SYMBOL + # <font> 03F0 greek kappa symbol +1D753 MATHEMATICAL BOLD ITALIC PHI SYMBOL + # <font> 03D5 greek phi symbol +1D754 MATHEMATICAL BOLD ITALIC RHO SYMBOL + # <font> 03F1 greek rho symbol +1D755 MATHEMATICAL BOLD ITALIC PI SYMBOL + # <font> 03D6 greek pi symbol +@ Sans-serif bold Greek symbols +1D756 MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA + # <font> 0391 greek capital letter alpha +1D757 MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA + # <font> 0392 greek capital letter beta +1D758 MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA + # <font> 0393 greek capital letter gamma +1D759 MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA + # <font> 0394 greek capital letter delta +1D75A MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON + # <font> 0395 greek capital letter epsilon +1D75B MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA + # <font> 0396 greek capital letter zeta +1D75C MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA + # <font> 0397 greek capital letter eta +1D75D MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA + # <font> 0398 greek capital letter theta +1D75E MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA + # <font> 0399 greek capital letter iota +1D75F MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA + # <font> 039A greek capital letter kappa +1D760 MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA + # <font> 039B greek capital letter lamda +1D761 MATHEMATICAL SANS-SERIF BOLD CAPITAL MU + # <font> 039C greek capital letter mu +1D762 MATHEMATICAL SANS-SERIF BOLD CAPITAL NU + # <font> 039D greek capital letter nu +1D763 MATHEMATICAL SANS-SERIF BOLD CAPITAL XI + # <font> 039E greek capital letter xi +1D764 MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON + # <font> 039F greek capital letter omicron +1D765 MATHEMATICAL SANS-SERIF BOLD CAPITAL PI + # <font> 03A0 greek capital letter pi +1D766 MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO + # <font> 03A1 greek capital letter rho +1D767 MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL + # <font> 03F4 greek capital theta symbol +1D768 MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA + # <font> 03A3 greek capital letter sigma +1D769 MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU + # <font> 03A4 greek capital letter tau +1D76A MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON + # <font> 03A5 greek capital letter upsilon +1D76B MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI + # <font> 03A6 greek capital letter phi +1D76C MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI + # <font> 03A7 greek capital letter chi +1D76D MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI + # <font> 03A8 greek capital letter psi +1D76E MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA + # <font> 03A9 greek capital letter omega +1D76F MATHEMATICAL SANS-SERIF BOLD NABLA + # <font> 2207 nabla +1D770 MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA + # <font> 03B1 greek small letter alpha +1D771 MATHEMATICAL SANS-SERIF BOLD SMALL BETA + # <font> 03B2 greek small letter beta +1D772 MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA + # <font> 03B3 greek small letter gamma +1D773 MATHEMATICAL SANS-SERIF BOLD SMALL DELTA + # <font> 03B4 greek small letter delta +1D774 MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON + # <font> 03B5 greek small letter epsilon +1D775 MATHEMATICAL SANS-SERIF BOLD SMALL ZETA + # <font> 03B6 greek small letter zeta +1D776 MATHEMATICAL SANS-SERIF BOLD SMALL ETA + # <font> 03B7 greek small letter eta +1D777 MATHEMATICAL SANS-SERIF BOLD SMALL THETA + # <font> 03B8 greek small letter theta +1D778 MATHEMATICAL SANS-SERIF BOLD SMALL IOTA + # <font> 03B9 greek small letter iota +1D779 MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA + # <font> 03BA greek small letter kappa +1D77A MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA + # <font> 03BB greek small letter lamda +1D77B MATHEMATICAL SANS-SERIF BOLD SMALL MU + # <font> 03BC greek small letter mu +1D77C MATHEMATICAL SANS-SERIF BOLD SMALL NU + # <font> 03BD greek small letter nu +1D77D MATHEMATICAL SANS-SERIF BOLD SMALL XI + # <font> 03BE greek small letter xi +1D77E MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON + # <font> 03BF greek small letter omicron +1D77F MATHEMATICAL SANS-SERIF BOLD SMALL PI + # <font> 03C0 greek small letter pi +1D780 MATHEMATICAL SANS-SERIF BOLD SMALL RHO + # <font> 03C1 greek small letter rho +1D781 MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA + # <font> 03C2 greek small letter final sigma +1D782 MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA + # <font> 03C3 greek small letter sigma +1D783 MATHEMATICAL SANS-SERIF BOLD SMALL TAU + # <font> 03C4 greek small letter tau +1D784 MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON + # <font> 03C5 greek small letter upsilon +1D785 MATHEMATICAL SANS-SERIF BOLD SMALL PHI + # <font> 03C6 greek small letter phi +1D786 MATHEMATICAL SANS-SERIF BOLD SMALL CHI + # <font> 03C7 greek small letter chi +1D787 MATHEMATICAL SANS-SERIF BOLD SMALL PSI + # <font> 03C8 greek small letter psi +1D788 MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA + # <font> 03C9 greek small letter omega +@ Additional sans-serif bold Greek symbols +1D789 MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL + # <font> 2202 partial differential +1D78A MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL + # <font> 03F5 greek lunate epsilon symbol +1D78B MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL + # <font> 03D1 greek theta symbol +1D78C MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL + # <font> 03F0 greek kappa symbol +1D78D MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL + # <font> 03D5 greek phi symbol +1D78E MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL + # <font> 03F1 greek rho symbol +1D78F MATHEMATICAL SANS-SERIF BOLD PI SYMBOL + # <font> 03D6 greek pi symbol +@ Sans-serif bold italic Greek symbols +1D790 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA + # <font> 0391 greek capital letter alpha +1D791 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA + # <font> 0392 greek capital letter beta +1D792 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA + # <font> 0393 greek capital letter gamma +1D793 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA + # <font> 0394 greek capital letter delta +1D794 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON + # <font> 0395 greek capital letter epsilon +1D795 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA + # <font> 0396 greek capital letter zeta +1D796 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA + # <font> 0397 greek capital letter eta +1D797 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA + # <font> 0398 greek capital letter theta +1D798 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA + # <font> 0399 greek capital letter iota +1D799 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA + # <font> 039A greek capital letter kappa +1D79A MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA + # <font> 039B greek capital letter lamda +1D79B MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU + # <font> 039C greek capital letter mu +1D79C MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU + # <font> 039D greek capital letter nu +1D79D MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI + # <font> 039E greek capital letter xi +1D79E MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON + # <font> 039F greek capital letter omicron +1D79F MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI + # <font> 03A0 greek capital letter pi +1D7A0 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO + # <font> 03A1 greek capital letter rho +1D7A1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL + # <font> 03F4 greek capital theta symbol +1D7A2 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA + # <font> 03A3 greek capital letter sigma +1D7A3 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU + # <font> 03A4 greek capital letter tau +1D7A4 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON + # <font> 03A5 greek capital letter upsilon +1D7A5 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI + # <font> 03A6 greek capital letter phi +1D7A6 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI + # <font> 03A7 greek capital letter chi +1D7A7 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI + # <font> 03A8 greek capital letter psi +1D7A8 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA + # <font> 03A9 greek capital letter omega +1D7A9 MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA + # <font> 2207 nabla +1D7AA MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA + # <font> 03B1 greek small letter alpha +1D7AB MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA + # <font> 03B2 greek small letter beta +1D7AC MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA + # <font> 03B3 greek small letter gamma +1D7AD MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA + # <font> 03B4 greek small letter delta +1D7AE MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON + # <font> 03B5 greek small letter epsilon +1D7AF MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA + # <font> 03B6 greek small letter zeta +1D7B0 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA + # <font> 03B7 greek small letter eta +1D7B1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA + # <font> 03B8 greek small letter theta +1D7B2 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA + # <font> 03B9 greek small letter iota +1D7B3 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA + # <font> 03BA greek small letter kappa +1D7B4 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA + # <font> 03BB greek small letter lamda +1D7B5 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU + # <font> 03BC greek small letter mu +1D7B6 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU + # <font> 03BD greek small letter nu +1D7B7 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI + # <font> 03BE greek small letter xi +1D7B8 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON + # <font> 03BF greek small letter omicron +1D7B9 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI + # <font> 03C0 greek small letter pi +1D7BA MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO + # <font> 03C1 greek small letter rho +1D7BB MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA + # <font> 03C2 greek small letter final sigma +1D7BC MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA + # <font> 03C3 greek small letter sigma +1D7BD MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU + # <font> 03C4 greek small letter tau +1D7BE MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON + # <font> 03C5 greek small letter upsilon +1D7BF MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI + # <font> 03C6 greek small letter phi +1D7C0 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI + # <font> 03C7 greek small letter chi +1D7C1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI + # <font> 03C8 greek small letter psi +1D7C2 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA + # <font> 03C9 greek small letter omega +@ Additional sans-serif bold italic Greek symbols +1D7C3 MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL + # <font> 2202 partial differential +1D7C4 MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL + # <font> 03F5 greek lunate epsilon symbol +1D7C5 MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL + # <font> 03D1 greek theta symbol +1D7C6 MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL + # <font> 03F0 greek kappa symbol +1D7C7 MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL + # <font> 03D5 greek phi symbol +1D7C8 MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL + # <font> 03F1 greek rho symbol +1D7C9 MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL + # <font> 03D6 greek pi symbol +@ Bold digits +1D7CE MATHEMATICAL BOLD DIGIT ZERO + # <font> 0030 digit zero +1D7CF MATHEMATICAL BOLD DIGIT ONE + # <font> 0031 digit one +1D7D0 MATHEMATICAL BOLD DIGIT TWO + # <font> 0032 digit two +1D7D1 MATHEMATICAL BOLD DIGIT THREE + # <font> 0033 digit three +1D7D2 MATHEMATICAL BOLD DIGIT FOUR + # <font> 0034 digit four +1D7D3 MATHEMATICAL BOLD DIGIT FIVE + # <font> 0035 digit five +1D7D4 MATHEMATICAL BOLD DIGIT SIX + # <font> 0036 digit six +1D7D5 MATHEMATICAL BOLD DIGIT SEVEN + # <font> 0037 digit seven +1D7D6 MATHEMATICAL BOLD DIGIT EIGHT + # <font> 0038 digit eight +1D7D7 MATHEMATICAL BOLD DIGIT NINE + # <font> 0039 digit nine +@ Double-struck digits +1D7D8 MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO + # <font> 0030 digit zero +1D7D9 MATHEMATICAL DOUBLE-STRUCK DIGIT ONE + # <font> 0031 digit one +1D7DA MATHEMATICAL DOUBLE-STRUCK DIGIT TWO + # <font> 0032 digit two +1D7DB MATHEMATICAL DOUBLE-STRUCK DIGIT THREE + # <font> 0033 digit three +1D7DC MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR + # <font> 0034 digit four +1D7DD MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE + # <font> 0035 digit five +1D7DE MATHEMATICAL DOUBLE-STRUCK DIGIT SIX + # <font> 0036 digit six +1D7DF MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN + # <font> 0037 digit seven +1D7E0 MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT + # <font> 0038 digit eight +1D7E1 MATHEMATICAL DOUBLE-STRUCK DIGIT NINE + # <font> 0039 digit nine +@ Sans-serif digits +1D7E2 MATHEMATICAL SANS-SERIF DIGIT ZERO + # <font> 0030 digit zero +1D7E3 MATHEMATICAL SANS-SERIF DIGIT ONE + # <font> 0031 digit one +1D7E4 MATHEMATICAL SANS-SERIF DIGIT TWO + # <font> 0032 digit two +1D7E5 MATHEMATICAL SANS-SERIF DIGIT THREE + # <font> 0033 digit three +1D7E6 MATHEMATICAL SANS-SERIF DIGIT FOUR + # <font> 0034 digit four +1D7E7 MATHEMATICAL SANS-SERIF DIGIT FIVE + # <font> 0035 digit five +1D7E8 MATHEMATICAL SANS-SERIF DIGIT SIX + # <font> 0036 digit six +1D7E9 MATHEMATICAL SANS-SERIF DIGIT SEVEN + # <font> 0037 digit seven +1D7EA MATHEMATICAL SANS-SERIF DIGIT EIGHT + # <font> 0038 digit eight +1D7EB MATHEMATICAL SANS-SERIF DIGIT NINE + # <font> 0039 digit nine +@ Sans-serif bold digits +1D7EC MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO + # <font> 0030 digit zero +1D7ED MATHEMATICAL SANS-SERIF BOLD DIGIT ONE + # <font> 0031 digit one +1D7EE MATHEMATICAL SANS-SERIF BOLD DIGIT TWO + # <font> 0032 digit two +1D7EF MATHEMATICAL SANS-SERIF BOLD DIGIT THREE + # <font> 0033 digit three +1D7F0 MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR + # <font> 0034 digit four +1D7F1 MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE + # <font> 0035 digit five +1D7F2 MATHEMATICAL SANS-SERIF BOLD DIGIT SIX + # <font> 0036 digit six +1D7F3 MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN + # <font> 0037 digit seven +1D7F4 MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT + # <font> 0038 digit eight +1D7F5 MATHEMATICAL SANS-SERIF BOLD DIGIT NINE + # <font> 0039 digit nine +@ Monospace digits +1D7F6 MATHEMATICAL MONOSPACE DIGIT ZERO + # <font> 0030 digit zero +1D7F7 MATHEMATICAL MONOSPACE DIGIT ONE + # <font> 0031 digit one +1D7F8 MATHEMATICAL MONOSPACE DIGIT TWO + # <font> 0032 digit two +1D7F9 MATHEMATICAL MONOSPACE DIGIT THREE + # <font> 0033 digit three +1D7FA MATHEMATICAL MONOSPACE DIGIT FOUR + # <font> 0034 digit four +1D7FB MATHEMATICAL MONOSPACE DIGIT FIVE + # <font> 0035 digit five +1D7FC MATHEMATICAL MONOSPACE DIGIT SIX + # <font> 0036 digit six +1D7FD MATHEMATICAL MONOSPACE DIGIT SEVEN + # <font> 0037 digit seven +1D7FE MATHEMATICAL MONOSPACE DIGIT EIGHT + # <font> 0038 digit eight +1D7FF MATHEMATICAL MONOSPACE DIGIT NINE + # <font> 0039 digit nine +@@ 1FF80 Unassigned 1FFFF +@ Not character codes +@+ These codes are intended for process internal uses, but are not permitted for interchange. +1FFFE <not a character> + * the value 1FFFE is guaranteed not to be a Unicode character at all +1FFFF <not a character> + * the value 1FFFF is guaranteed not to be a Unicode character at all +@@ 20000 CJK Unified Ideographs Extension B 2A6D6 +@@ 2F800 CJK Compatibility Ideographs Supplement 2FA1F +@ Duplicate characters from CNS 11643-1992 +2F800 CJK COMPATIBILITY IDEOGRAPH-2F800 + : 4E3D +2F801 CJK COMPATIBILITY IDEOGRAPH-2F801 + : 4E38 +2F802 CJK COMPATIBILITY IDEOGRAPH-2F802 + : 4E41 +2F803 CJK COMPATIBILITY IDEOGRAPH-2F803 + : 20122 +2F804 CJK COMPATIBILITY IDEOGRAPH-2F804 + : 4F60 +2F805 CJK COMPATIBILITY IDEOGRAPH-2F805 + : 4FAE +2F806 CJK COMPATIBILITY IDEOGRAPH-2F806 + : 4FBB +2F807 CJK COMPATIBILITY IDEOGRAPH-2F807 + : 5002 +2F808 CJK COMPATIBILITY IDEOGRAPH-2F808 + : 507A +2F809 CJK COMPATIBILITY IDEOGRAPH-2F809 + : 5099 +2F80A CJK COMPATIBILITY IDEOGRAPH-2F80A + : 50E7 +2F80B CJK COMPATIBILITY IDEOGRAPH-2F80B + : 50CF +2F80C CJK COMPATIBILITY IDEOGRAPH-2F80C + : 349E +2F80D CJK COMPATIBILITY IDEOGRAPH-2F80D + x 5145 + : 2063A +2F80E CJK COMPATIBILITY IDEOGRAPH-2F80E + : 514D +2F80F CJK COMPATIBILITY IDEOGRAPH-2F80F + : 5154 +2F810 CJK COMPATIBILITY IDEOGRAPH-2F810 + : 5164 +2F811 CJK COMPATIBILITY IDEOGRAPH-2F811 + : 5177 +2F812 CJK COMPATIBILITY IDEOGRAPH-2F812 + : 2051C +2F813 CJK COMPATIBILITY IDEOGRAPH-2F813 + : 34B9 +2F814 CJK COMPATIBILITY IDEOGRAPH-2F814 + x 5185 + : 5167 +2F815 CJK COMPATIBILITY IDEOGRAPH-2F815 + : 518D +2F816 CJK COMPATIBILITY IDEOGRAPH-2F816 + : 2054B +2F817 CJK COMPATIBILITY IDEOGRAPH-2F817 + : 5197 +2F818 CJK COMPATIBILITY IDEOGRAPH-2F818 + : 51A4 +2F819 CJK COMPATIBILITY IDEOGRAPH-2F819 + : 4ECC +2F81A CJK COMPATIBILITY IDEOGRAPH-2F81A + : 51AC +2F81B CJK COMPATIBILITY IDEOGRAPH-2F81B + : 51B5 +2F81C CJK COMPATIBILITY IDEOGRAPH-2F81C + : 291DF +2F81D CJK COMPATIBILITY IDEOGRAPH-2F81D + : 51F5 +2F81E CJK COMPATIBILITY IDEOGRAPH-2F81E + : 5203 +2F81F CJK COMPATIBILITY IDEOGRAPH-2F81F + : 34DF +2F820 CJK COMPATIBILITY IDEOGRAPH-2F820 + : 523B +2F821 CJK COMPATIBILITY IDEOGRAPH-2F821 + : 5246 +2F822 CJK COMPATIBILITY IDEOGRAPH-2F822 + : 5272 +2F823 CJK COMPATIBILITY IDEOGRAPH-2F823 + : 5277 +2F824 CJK COMPATIBILITY IDEOGRAPH-2F824 + : 3515 +2F825 CJK COMPATIBILITY IDEOGRAPH-2F825 + : 52C7 +2F826 CJK COMPATIBILITY IDEOGRAPH-2F826 + : 52C9 +2F827 CJK COMPATIBILITY IDEOGRAPH-2F827 + : 52E4 +2F828 CJK COMPATIBILITY IDEOGRAPH-2F828 + : 52FA +2F829 CJK COMPATIBILITY IDEOGRAPH-2F829 + : 5305 +2F82A CJK COMPATIBILITY IDEOGRAPH-2F82A + : 5306 +2F82B CJK COMPATIBILITY IDEOGRAPH-2F82B + : 5317 +2F82C CJK COMPATIBILITY IDEOGRAPH-2F82C + : 5349 +2F82D CJK COMPATIBILITY IDEOGRAPH-2F82D + : 5351 +2F82E CJK COMPATIBILITY IDEOGRAPH-2F82E + : 535A +2F82F CJK COMPATIBILITY IDEOGRAPH-2F82F + : 5373 +2F830 CJK COMPATIBILITY IDEOGRAPH-2F830 + : 537D +2F831 CJK COMPATIBILITY IDEOGRAPH-2F831 + : 537F +2F832 CJK COMPATIBILITY IDEOGRAPH-2F832 + : 537F +2F833 CJK COMPATIBILITY IDEOGRAPH-2F833 + : 537F +2F834 CJK COMPATIBILITY IDEOGRAPH-2F834 + : 20A2C +2F835 CJK COMPATIBILITY IDEOGRAPH-2F835 + : 7070 +2F836 CJK COMPATIBILITY IDEOGRAPH-2F836 + : 53CA +2F837 CJK COMPATIBILITY IDEOGRAPH-2F837 + : 53DF +2F838 CJK COMPATIBILITY IDEOGRAPH-2F838 + : 20B63 +2F839 CJK COMPATIBILITY IDEOGRAPH-2F839 + : 53EB +2F83A CJK COMPATIBILITY IDEOGRAPH-2F83A + : 53F1 +2F83B CJK COMPATIBILITY IDEOGRAPH-2F83B + : 5406 +2F83C CJK COMPATIBILITY IDEOGRAPH-2F83C + : 549E +2F83D CJK COMPATIBILITY IDEOGRAPH-2F83D + : 5438 +2F83E CJK COMPATIBILITY IDEOGRAPH-2F83E + : 5448 +2F83F CJK COMPATIBILITY IDEOGRAPH-2F83F + : 5468 +2F840 CJK COMPATIBILITY IDEOGRAPH-2F840 + : 54A2 +2F841 CJK COMPATIBILITY IDEOGRAPH-2F841 + : 54F6 +2F842 CJK COMPATIBILITY IDEOGRAPH-2F842 + : 5510 +2F843 CJK COMPATIBILITY IDEOGRAPH-2F843 + : 5553 +2F844 CJK COMPATIBILITY IDEOGRAPH-2F844 + : 5563 +2F845 CJK COMPATIBILITY IDEOGRAPH-2F845 + : 5584 +2F846 CJK COMPATIBILITY IDEOGRAPH-2F846 + : 5584 +2F847 CJK COMPATIBILITY IDEOGRAPH-2F847 + : 5599 +2F848 CJK COMPATIBILITY IDEOGRAPH-2F848 + : 55AB +2F849 CJK COMPATIBILITY IDEOGRAPH-2F849 + : 55B3 +2F84A CJK COMPATIBILITY IDEOGRAPH-2F84A + : 55C2 +2F84B CJK COMPATIBILITY IDEOGRAPH-2F84B + : 5716 +2F84C CJK COMPATIBILITY IDEOGRAPH-2F84C + : 5606 +2F84D CJK COMPATIBILITY IDEOGRAPH-2F84D + : 5717 +2F84E CJK COMPATIBILITY IDEOGRAPH-2F84E + : 5651 +2F84F CJK COMPATIBILITY IDEOGRAPH-2F84F + : 5674 +2F850 CJK COMPATIBILITY IDEOGRAPH-2F850 + : 5207 +2F851 CJK COMPATIBILITY IDEOGRAPH-2F851 + : 58EE +2F852 CJK COMPATIBILITY IDEOGRAPH-2F852 + : 57CE +2F853 CJK COMPATIBILITY IDEOGRAPH-2F853 + : 57F4 +2F854 CJK COMPATIBILITY IDEOGRAPH-2F854 + : 580D +2F855 CJK COMPATIBILITY IDEOGRAPH-2F855 + : 578B +2F856 CJK COMPATIBILITY IDEOGRAPH-2F856 + : 5832 +2F857 CJK COMPATIBILITY IDEOGRAPH-2F857 + : 5831 +2F858 CJK COMPATIBILITY IDEOGRAPH-2F858 + : 58AC +2F859 CJK COMPATIBILITY IDEOGRAPH-2F859 + : 214E4 +2F85A CJK COMPATIBILITY IDEOGRAPH-2F85A + x 58F3 + : 58F2 +2F85B CJK COMPATIBILITY IDEOGRAPH-2F85B + x 21533 + : 58F7 +2F85C CJK COMPATIBILITY IDEOGRAPH-2F85C + : 5906 +2F85D CJK COMPATIBILITY IDEOGRAPH-2F85D + : 591A +2F85E CJK COMPATIBILITY IDEOGRAPH-2F85E + : 5922 +2F85F CJK COMPATIBILITY IDEOGRAPH-2F85F + : 5962 +2F860 CJK COMPATIBILITY IDEOGRAPH-2F860 + : 216A8 +2F861 CJK COMPATIBILITY IDEOGRAPH-2F861 + : 216EA +2F862 CJK COMPATIBILITY IDEOGRAPH-2F862 + : 59EC +2F863 CJK COMPATIBILITY IDEOGRAPH-2F863 + : 5A1B +2F864 CJK COMPATIBILITY IDEOGRAPH-2F864 + : 5A27 +2F865 CJK COMPATIBILITY IDEOGRAPH-2F865 + : 59D8 +2F866 CJK COMPATIBILITY IDEOGRAPH-2F866 + : 5A66 +2F867 CJK COMPATIBILITY IDEOGRAPH-2F867 + : 36EE +2F868 CJK COMPATIBILITY IDEOGRAPH-2F868 + : 36FC +2F869 CJK COMPATIBILITY IDEOGRAPH-2F869 + : 5B08 +2F86A CJK COMPATIBILITY IDEOGRAPH-2F86A + : 5B3E +2F86B CJK COMPATIBILITY IDEOGRAPH-2F86B + : 5B3E +2F86C CJK COMPATIBILITY IDEOGRAPH-2F86C + : 219C8 +2F86D CJK COMPATIBILITY IDEOGRAPH-2F86D + : 5BC3 +2F86E CJK COMPATIBILITY IDEOGRAPH-2F86E + : 5BD8 +2F86F CJK COMPATIBILITY IDEOGRAPH-2F86F + : 5BE7 +2F870 CJK COMPATIBILITY IDEOGRAPH-2F870 + : 5BF3 +2F871 CJK COMPATIBILITY IDEOGRAPH-2F871 + : 21B18 +2F872 CJK COMPATIBILITY IDEOGRAPH-2F872 + : 5BFF +2F873 CJK COMPATIBILITY IDEOGRAPH-2F873 + : 5C06 +2F874 CJK COMPATIBILITY IDEOGRAPH-2F874 + : 5F53 +2F875 CJK COMPATIBILITY IDEOGRAPH-2F875 + : 5C22 +2F876 CJK COMPATIBILITY IDEOGRAPH-2F876 + : 3781 +2F877 CJK COMPATIBILITY IDEOGRAPH-2F877 + : 5C60 +2F878 CJK COMPATIBILITY IDEOGRAPH-2F878 + : 5C6E +2F879 CJK COMPATIBILITY IDEOGRAPH-2F879 + : 5CC0 +2F87A CJK COMPATIBILITY IDEOGRAPH-2F87A + : 5C8D +2F87B CJK COMPATIBILITY IDEOGRAPH-2F87B + : 21DE4 +2F87C CJK COMPATIBILITY IDEOGRAPH-2F87C + : 5D43 +2F87D CJK COMPATIBILITY IDEOGRAPH-2F87D + : 21DE6 +2F87E CJK COMPATIBILITY IDEOGRAPH-2F87E + : 5D6E +2F87F CJK COMPATIBILITY IDEOGRAPH-2F87F + : 5D6B +2F880 CJK COMPATIBILITY IDEOGRAPH-2F880 + : 5D7C +2F881 CJK COMPATIBILITY IDEOGRAPH-2F881 + : 5DE1 +2F882 CJK COMPATIBILITY IDEOGRAPH-2F882 + : 5DE2 +2F883 CJK COMPATIBILITY IDEOGRAPH-2F883 + : 382F +2F884 CJK COMPATIBILITY IDEOGRAPH-2F884 + : 5DFD +2F885 CJK COMPATIBILITY IDEOGRAPH-2F885 + : 5E28 +2F886 CJK COMPATIBILITY IDEOGRAPH-2F886 + : 5E3D +2F887 CJK COMPATIBILITY IDEOGRAPH-2F887 + : 5E69 +2F888 CJK COMPATIBILITY IDEOGRAPH-2F888 + : 3862 +2F889 CJK COMPATIBILITY IDEOGRAPH-2F889 + : 22183 +2F88A CJK COMPATIBILITY IDEOGRAPH-2F88A + : 387C +2F88B CJK COMPATIBILITY IDEOGRAPH-2F88B + : 5EB0 +2F88C CJK COMPATIBILITY IDEOGRAPH-2F88C + : 5EB3 +2F88D CJK COMPATIBILITY IDEOGRAPH-2F88D + : 5EB6 +2F88E CJK COMPATIBILITY IDEOGRAPH-2F88E + : 5ECA +2F88F CJK COMPATIBILITY IDEOGRAPH-2F88F + : 2A392 +2F890 CJK COMPATIBILITY IDEOGRAPH-2F890 + : 5EFE +2F891 CJK COMPATIBILITY IDEOGRAPH-2F891 + : 22331 +2F892 CJK COMPATIBILITY IDEOGRAPH-2F892 + : 22331 +2F893 CJK COMPATIBILITY IDEOGRAPH-2F893 + : 8201 +2F894 CJK COMPATIBILITY IDEOGRAPH-2F894 + : 5F22 +2F895 CJK COMPATIBILITY IDEOGRAPH-2F895 + : 5F22 +2F896 CJK COMPATIBILITY IDEOGRAPH-2F896 + : 38C7 +2F897 CJK COMPATIBILITY IDEOGRAPH-2F897 + : 232B8 +2F898 CJK COMPATIBILITY IDEOGRAPH-2F898 + : 261DA +2F899 CJK COMPATIBILITY IDEOGRAPH-2F899 + : 5F62 +2F89A CJK COMPATIBILITY IDEOGRAPH-2F89A + : 5F6B +2F89B CJK COMPATIBILITY IDEOGRAPH-2F89B + : 38E3 +2F89C CJK COMPATIBILITY IDEOGRAPH-2F89C + x 22505 + : 5F9A +2F89D CJK COMPATIBILITY IDEOGRAPH-2F89D + : 5FCD +2F89E CJK COMPATIBILITY IDEOGRAPH-2F89E + : 5FD7 +2F89F CJK COMPATIBILITY IDEOGRAPH-2F89F + : 5FF9 +2F8A0 CJK COMPATIBILITY IDEOGRAPH-2F8A0 + : 6081 +2F8A1 CJK COMPATIBILITY IDEOGRAPH-2F8A1 + : 393A +2F8A2 CJK COMPATIBILITY IDEOGRAPH-2F8A2 + : 391C +2F8A3 CJK COMPATIBILITY IDEOGRAPH-2F8A3 + : 6094 +2F8A4 CJK COMPATIBILITY IDEOGRAPH-2F8A4 + : 226D4 +2F8A5 CJK COMPATIBILITY IDEOGRAPH-2F8A5 + : 60C7 +2F8A6 CJK COMPATIBILITY IDEOGRAPH-2F8A6 + : 6148 +2F8A7 CJK COMPATIBILITY IDEOGRAPH-2F8A7 + : 614C +2F8A8 CJK COMPATIBILITY IDEOGRAPH-2F8A8 + : 614E +2F8A9 CJK COMPATIBILITY IDEOGRAPH-2F8A9 + : 614C +2F8AA CJK COMPATIBILITY IDEOGRAPH-2F8AA + : 617A +2F8AB CJK COMPATIBILITY IDEOGRAPH-2F8AB + : 618E +2F8AC CJK COMPATIBILITY IDEOGRAPH-2F8AC + : 61B2 +2F8AD CJK COMPATIBILITY IDEOGRAPH-2F8AD + : 61A4 +2F8AE CJK COMPATIBILITY IDEOGRAPH-2F8AE + : 61AF +2F8AF CJK COMPATIBILITY IDEOGRAPH-2F8AF + : 61DE +2F8B0 CJK COMPATIBILITY IDEOGRAPH-2F8B0 + : 61F2 +2F8B1 CJK COMPATIBILITY IDEOGRAPH-2F8B1 + : 61F6 +2F8B2 CJK COMPATIBILITY IDEOGRAPH-2F8B2 + : 6210 +2F8B3 CJK COMPATIBILITY IDEOGRAPH-2F8B3 + : 621B +2F8B4 CJK COMPATIBILITY IDEOGRAPH-2F8B4 + : 625D +2F8B5 CJK COMPATIBILITY IDEOGRAPH-2F8B5 + : 62B1 +2F8B6 CJK COMPATIBILITY IDEOGRAPH-2F8B6 + : 62D4 +2F8B7 CJK COMPATIBILITY IDEOGRAPH-2F8B7 + : 6350 +2F8B8 CJK COMPATIBILITY IDEOGRAPH-2F8B8 + : 22B0C +2F8B9 CJK COMPATIBILITY IDEOGRAPH-2F8B9 + : 633D +2F8BA CJK COMPATIBILITY IDEOGRAPH-2F8BA + : 62FC +2F8BB CJK COMPATIBILITY IDEOGRAPH-2F8BB + : 6368 +2F8BC CJK COMPATIBILITY IDEOGRAPH-2F8BC + : 6383 +2F8BD CJK COMPATIBILITY IDEOGRAPH-2F8BD + : 63E4 +2F8BE CJK COMPATIBILITY IDEOGRAPH-2F8BE + : 22BF1 +2F8BF CJK COMPATIBILITY IDEOGRAPH-2F8BF + : 6422 +2F8C0 CJK COMPATIBILITY IDEOGRAPH-2F8C0 + : 63C5 +2F8C1 CJK COMPATIBILITY IDEOGRAPH-2F8C1 + : 63A9 +2F8C2 CJK COMPATIBILITY IDEOGRAPH-2F8C2 + : 3A2E +2F8C3 CJK COMPATIBILITY IDEOGRAPH-2F8C3 + : 6469 +2F8C4 CJK COMPATIBILITY IDEOGRAPH-2F8C4 + : 647E +2F8C5 CJK COMPATIBILITY IDEOGRAPH-2F8C5 + : 649D +2F8C6 CJK COMPATIBILITY IDEOGRAPH-2F8C6 + : 6477 +2F8C7 CJK COMPATIBILITY IDEOGRAPH-2F8C7 + : 3A6C +2F8C8 CJK COMPATIBILITY IDEOGRAPH-2F8C8 + : 654F +2F8C9 CJK COMPATIBILITY IDEOGRAPH-2F8C9 + : 656C +2F8CA CJK COMPATIBILITY IDEOGRAPH-2F8CA + : 2300A +2F8CB CJK COMPATIBILITY IDEOGRAPH-2F8CB + : 65E3 +2F8CC CJK COMPATIBILITY IDEOGRAPH-2F8CC + : 66F8 +2F8CD CJK COMPATIBILITY IDEOGRAPH-2F8CD + : 6649 +2F8CE CJK COMPATIBILITY IDEOGRAPH-2F8CE + : 3B19 +2F8CF CJK COMPATIBILITY IDEOGRAPH-2F8CF + : 6691 +2F8D0 CJK COMPATIBILITY IDEOGRAPH-2F8D0 + : 3B08 +2F8D1 CJK COMPATIBILITY IDEOGRAPH-2F8D1 + : 3AE4 +2F8D2 CJK COMPATIBILITY IDEOGRAPH-2F8D2 + : 5192 +2F8D3 CJK COMPATIBILITY IDEOGRAPH-2F8D3 + : 5195 +2F8D4 CJK COMPATIBILITY IDEOGRAPH-2F8D4 + : 6700 +2F8D5 CJK COMPATIBILITY IDEOGRAPH-2F8D5 + : 669C +2F8D6 CJK COMPATIBILITY IDEOGRAPH-2F8D6 + : 80AD +2F8D7 CJK COMPATIBILITY IDEOGRAPH-2F8D7 + : 43D9 +2F8D8 CJK COMPATIBILITY IDEOGRAPH-2F8D8 + : 6717 +2F8D9 CJK COMPATIBILITY IDEOGRAPH-2F8D9 + : 671B +2F8DA CJK COMPATIBILITY IDEOGRAPH-2F8DA + : 6721 +2F8DB CJK COMPATIBILITY IDEOGRAPH-2F8DB + : 675E +2F8DC CJK COMPATIBILITY IDEOGRAPH-2F8DC + : 6753 +2F8DD CJK COMPATIBILITY IDEOGRAPH-2F8DD + : 233C3 +2F8DE CJK COMPATIBILITY IDEOGRAPH-2F8DE + : 3B49 +2F8DF CJK COMPATIBILITY IDEOGRAPH-2F8DF + : 67FA +2F8E0 CJK COMPATIBILITY IDEOGRAPH-2F8E0 + : 6785 +2F8E1 CJK COMPATIBILITY IDEOGRAPH-2F8E1 + : 6852 +2F8E2 CJK COMPATIBILITY IDEOGRAPH-2F8E2 + : 6885 +2F8E3 CJK COMPATIBILITY IDEOGRAPH-2F8E3 + : 2346D +2F8E4 CJK COMPATIBILITY IDEOGRAPH-2F8E4 + : 688E +2F8E5 CJK COMPATIBILITY IDEOGRAPH-2F8E5 + : 681F +2F8E6 CJK COMPATIBILITY IDEOGRAPH-2F8E6 + : 6914 +2F8E7 CJK COMPATIBILITY IDEOGRAPH-2F8E7 + : 3B9D +2F8E8 CJK COMPATIBILITY IDEOGRAPH-2F8E8 + : 6942 +2F8E9 CJK COMPATIBILITY IDEOGRAPH-2F8E9 + : 69A3 +2F8EA CJK COMPATIBILITY IDEOGRAPH-2F8EA + : 69EA +2F8EB CJK COMPATIBILITY IDEOGRAPH-2F8EB + : 6AA8 +2F8EC CJK COMPATIBILITY IDEOGRAPH-2F8EC + : 236A3 +2F8ED CJK COMPATIBILITY IDEOGRAPH-2F8ED + : 6ADB +2F8EE CJK COMPATIBILITY IDEOGRAPH-2F8EE + : 3C18 +2F8EF CJK COMPATIBILITY IDEOGRAPH-2F8EF + : 6B21 +2F8F0 CJK COMPATIBILITY IDEOGRAPH-2F8F0 + : 238A7 +2F8F1 CJK COMPATIBILITY IDEOGRAPH-2F8F1 + : 6B54 +2F8F2 CJK COMPATIBILITY IDEOGRAPH-2F8F2 + : 3C4E +2F8F3 CJK COMPATIBILITY IDEOGRAPH-2F8F3 + : 6B72 +2F8F4 CJK COMPATIBILITY IDEOGRAPH-2F8F4 + : 6B9F +2F8F5 CJK COMPATIBILITY IDEOGRAPH-2F8F5 + : 6BBA +2F8F6 CJK COMPATIBILITY IDEOGRAPH-2F8F6 + : 6BBB +2F8F7 CJK COMPATIBILITY IDEOGRAPH-2F8F7 + : 23A8D +2F8F8 CJK COMPATIBILITY IDEOGRAPH-2F8F8 + : 21D0B +2F8F9 CJK COMPATIBILITY IDEOGRAPH-2F8F9 + : 23AFA +2F8FA CJK COMPATIBILITY IDEOGRAPH-2F8FA + : 6C4E +2F8FB CJK COMPATIBILITY IDEOGRAPH-2F8FB + : 23CBC +2F8FC CJK COMPATIBILITY IDEOGRAPH-2F8FC + : 6CBF +2F8FD CJK COMPATIBILITY IDEOGRAPH-2F8FD + : 6CCD +2F8FE CJK COMPATIBILITY IDEOGRAPH-2F8FE + : 6C67 +2F8FF CJK COMPATIBILITY IDEOGRAPH-2F8FF + : 6D16 +2F900 CJK COMPATIBILITY IDEOGRAPH-2F900 + : 6D3E +2F901 CJK COMPATIBILITY IDEOGRAPH-2F901 + : 6D77 +2F902 CJK COMPATIBILITY IDEOGRAPH-2F902 + : 6D41 +2F903 CJK COMPATIBILITY IDEOGRAPH-2F903 + : 6D69 +2F904 CJK COMPATIBILITY IDEOGRAPH-2F904 + : 6D78 +2F905 CJK COMPATIBILITY IDEOGRAPH-2F905 + : 6D85 +2F906 CJK COMPATIBILITY IDEOGRAPH-2F906 + : 23D1E +2F907 CJK COMPATIBILITY IDEOGRAPH-2F907 + : 6D34 +2F908 CJK COMPATIBILITY IDEOGRAPH-2F908 + : 6E2F +2F909 CJK COMPATIBILITY IDEOGRAPH-2F909 + : 6E6E +2F90A CJK COMPATIBILITY IDEOGRAPH-2F90A + : 3D33 +2F90B CJK COMPATIBILITY IDEOGRAPH-2F90B + : 6ECB +2F90C CJK COMPATIBILITY IDEOGRAPH-2F90C + : 6EC7 +2F90D CJK COMPATIBILITY IDEOGRAPH-2F90D + : 23ED1 +2F90E CJK COMPATIBILITY IDEOGRAPH-2F90E + : 6DF9 +2F90F CJK COMPATIBILITY IDEOGRAPH-2F90F + : 6F6E +2F910 CJK COMPATIBILITY IDEOGRAPH-2F910 + : 23F5E +2F911 CJK COMPATIBILITY IDEOGRAPH-2F911 + : 23F8E +2F912 CJK COMPATIBILITY IDEOGRAPH-2F912 + : 6FC6 +2F913 CJK COMPATIBILITY IDEOGRAPH-2F913 + : 7039 +2F914 CJK COMPATIBILITY IDEOGRAPH-2F914 + : 701E +2F915 CJK COMPATIBILITY IDEOGRAPH-2F915 + : 701B +2F916 CJK COMPATIBILITY IDEOGRAPH-2F916 + : 3D96 +2F917 CJK COMPATIBILITY IDEOGRAPH-2F917 + : 704A +2F918 CJK COMPATIBILITY IDEOGRAPH-2F918 + : 707D +2F919 CJK COMPATIBILITY IDEOGRAPH-2F919 + : 7077 +2F91A CJK COMPATIBILITY IDEOGRAPH-2F91A + : 70AD +2F91B CJK COMPATIBILITY IDEOGRAPH-2F91B + : 20525 +2F91C CJK COMPATIBILITY IDEOGRAPH-2F91C + : 7145 +2F91D CJK COMPATIBILITY IDEOGRAPH-2F91D + : 24263 +2F91E CJK COMPATIBILITY IDEOGRAPH-2F91E + : 719C +2F91F CJK COMPATIBILITY IDEOGRAPH-2F91F + : 243AB +2F920 CJK COMPATIBILITY IDEOGRAPH-2F920 + : 7228 +2F921 CJK COMPATIBILITY IDEOGRAPH-2F921 + : 7235 +2F922 CJK COMPATIBILITY IDEOGRAPH-2F922 + : 7250 +2F923 CJK COMPATIBILITY IDEOGRAPH-2F923 + : 24608 +2F924 CJK COMPATIBILITY IDEOGRAPH-2F924 + : 7280 +2F925 CJK COMPATIBILITY IDEOGRAPH-2F925 + : 7295 +2F926 CJK COMPATIBILITY IDEOGRAPH-2F926 + : 24735 +2F927 CJK COMPATIBILITY IDEOGRAPH-2F927 + : 24814 +2F928 CJK COMPATIBILITY IDEOGRAPH-2F928 + : 737A +2F929 CJK COMPATIBILITY IDEOGRAPH-2F929 + : 738B +2F92A CJK COMPATIBILITY IDEOGRAPH-2F92A + : 3EAC +2F92B CJK COMPATIBILITY IDEOGRAPH-2F92B + : 73A5 +2F92C CJK COMPATIBILITY IDEOGRAPH-2F92C + : 3EB8 +2F92D CJK COMPATIBILITY IDEOGRAPH-2F92D + : 3EB8 +2F92E CJK COMPATIBILITY IDEOGRAPH-2F92E + : 7447 +2F92F CJK COMPATIBILITY IDEOGRAPH-2F92F + : 745C +2F930 CJK COMPATIBILITY IDEOGRAPH-2F930 + : 7471 +2F931 CJK COMPATIBILITY IDEOGRAPH-2F931 + : 7485 +2F932 CJK COMPATIBILITY IDEOGRAPH-2F932 + : 74CA +2F933 CJK COMPATIBILITY IDEOGRAPH-2F933 + : 3F1B +2F934 CJK COMPATIBILITY IDEOGRAPH-2F934 + : 7524 +2F935 CJK COMPATIBILITY IDEOGRAPH-2F935 + : 24C36 +2F936 CJK COMPATIBILITY IDEOGRAPH-2F936 + : 753E +2F937 CJK COMPATIBILITY IDEOGRAPH-2F937 + : 24C92 +2F938 CJK COMPATIBILITY IDEOGRAPH-2F938 + : 7570 +2F939 CJK COMPATIBILITY IDEOGRAPH-2F939 + : 2219F +2F93A CJK COMPATIBILITY IDEOGRAPH-2F93A + : 7610 +2F93B CJK COMPATIBILITY IDEOGRAPH-2F93B + : 24FA1 +2F93C CJK COMPATIBILITY IDEOGRAPH-2F93C + : 24FB8 +2F93D CJK COMPATIBILITY IDEOGRAPH-2F93D + : 25044 +2F93E CJK COMPATIBILITY IDEOGRAPH-2F93E + : 3FFC +2F93F CJK COMPATIBILITY IDEOGRAPH-2F93F + : 4008 +2F940 CJK COMPATIBILITY IDEOGRAPH-2F940 + : 76F4 +2F941 CJK COMPATIBILITY IDEOGRAPH-2F941 + : 250F3 +2F942 CJK COMPATIBILITY IDEOGRAPH-2F942 + : 250F2 +2F943 CJK COMPATIBILITY IDEOGRAPH-2F943 + : 25119 +2F944 CJK COMPATIBILITY IDEOGRAPH-2F944 + : 25133 +2F945 CJK COMPATIBILITY IDEOGRAPH-2F945 + : 771E +2F946 CJK COMPATIBILITY IDEOGRAPH-2F946 + : 771F +2F947 CJK COMPATIBILITY IDEOGRAPH-2F947 + : 771F +2F948 CJK COMPATIBILITY IDEOGRAPH-2F948 + : 774A +2F949 CJK COMPATIBILITY IDEOGRAPH-2F949 + : 4039 +2F94A CJK COMPATIBILITY IDEOGRAPH-2F94A + : 778B +2F94B CJK COMPATIBILITY IDEOGRAPH-2F94B + : 4046 +2F94C CJK COMPATIBILITY IDEOGRAPH-2F94C + : 4096 +2F94D CJK COMPATIBILITY IDEOGRAPH-2F94D + : 2541D +2F94E CJK COMPATIBILITY IDEOGRAPH-2F94E + : 784E +2F94F CJK COMPATIBILITY IDEOGRAPH-2F94F + : 788C +2F950 CJK COMPATIBILITY IDEOGRAPH-2F950 + : 78CC +2F951 CJK COMPATIBILITY IDEOGRAPH-2F951 + : 40E3 +2F952 CJK COMPATIBILITY IDEOGRAPH-2F952 + : 25626 +2F953 CJK COMPATIBILITY IDEOGRAPH-2F953 + : 7956 +2F954 CJK COMPATIBILITY IDEOGRAPH-2F954 + : 2569A +2F955 CJK COMPATIBILITY IDEOGRAPH-2F955 + : 256C5 +2F956 CJK COMPATIBILITY IDEOGRAPH-2F956 + : 798F +2F957 CJK COMPATIBILITY IDEOGRAPH-2F957 + : 79EB +2F958 CJK COMPATIBILITY IDEOGRAPH-2F958 + : 412F +2F959 CJK COMPATIBILITY IDEOGRAPH-2F959 + : 7A40 +2F95A CJK COMPATIBILITY IDEOGRAPH-2F95A + : 7A4A +2F95B CJK COMPATIBILITY IDEOGRAPH-2F95B + : 7A4F +2F95C CJK COMPATIBILITY IDEOGRAPH-2F95C + : 2597C +2F95D CJK COMPATIBILITY IDEOGRAPH-2F95D + : 25AA7 +2F95E CJK COMPATIBILITY IDEOGRAPH-2F95E + : 25AA7 +2F95F CJK COMPATIBILITY IDEOGRAPH-2F95F + : 7AEE +2F960 CJK COMPATIBILITY IDEOGRAPH-2F960 + : 4202 +2F961 CJK COMPATIBILITY IDEOGRAPH-2F961 + : 25BAB +2F962 CJK COMPATIBILITY IDEOGRAPH-2F962 + : 7BC6 +2F963 CJK COMPATIBILITY IDEOGRAPH-2F963 + : 7BC9 +2F964 CJK COMPATIBILITY IDEOGRAPH-2F964 + : 4227 +2F965 CJK COMPATIBILITY IDEOGRAPH-2F965 + : 25C80 +2F966 CJK COMPATIBILITY IDEOGRAPH-2F966 + : 7CD2 +2F967 CJK COMPATIBILITY IDEOGRAPH-2F967 + : 42A0 +2F968 CJK COMPATIBILITY IDEOGRAPH-2F968 + : 7CE8 +2F969 CJK COMPATIBILITY IDEOGRAPH-2F969 + : 7CE3 +2F96A CJK COMPATIBILITY IDEOGRAPH-2F96A + : 7D00 +2F96B CJK COMPATIBILITY IDEOGRAPH-2F96B + : 25F86 +2F96C CJK COMPATIBILITY IDEOGRAPH-2F96C + : 7D63 +2F96D CJK COMPATIBILITY IDEOGRAPH-2F96D + : 4301 +2F96E CJK COMPATIBILITY IDEOGRAPH-2F96E + : 7DC7 +2F96F CJK COMPATIBILITY IDEOGRAPH-2F96F + : 7E02 +2F970 CJK COMPATIBILITY IDEOGRAPH-2F970 + : 7E45 +2F971 CJK COMPATIBILITY IDEOGRAPH-2F971 + : 4334 +2F972 CJK COMPATIBILITY IDEOGRAPH-2F972 + : 26228 +2F973 CJK COMPATIBILITY IDEOGRAPH-2F973 + : 26247 +2F974 CJK COMPATIBILITY IDEOGRAPH-2F974 + : 4359 +2F975 CJK COMPATIBILITY IDEOGRAPH-2F975 + : 262D9 +2F976 CJK COMPATIBILITY IDEOGRAPH-2F976 + : 7F7A +2F977 CJK COMPATIBILITY IDEOGRAPH-2F977 + : 2633E +2F978 CJK COMPATIBILITY IDEOGRAPH-2F978 + : 7F95 +2F979 CJK COMPATIBILITY IDEOGRAPH-2F979 + : 7FFA +2F97A CJK COMPATIBILITY IDEOGRAPH-2F97A + : 8005 +2F97B CJK COMPATIBILITY IDEOGRAPH-2F97B + : 264DA +2F97C CJK COMPATIBILITY IDEOGRAPH-2F97C + : 26523 +2F97D CJK COMPATIBILITY IDEOGRAPH-2F97D + : 8060 +2F97E CJK COMPATIBILITY IDEOGRAPH-2F97E + : 265A8 +2F97F CJK COMPATIBILITY IDEOGRAPH-2F97F + : 8070 +2F980 CJK COMPATIBILITY IDEOGRAPH-2F980 + : 2335F +2F981 CJK COMPATIBILITY IDEOGRAPH-2F981 + : 43D5 +2F982 CJK COMPATIBILITY IDEOGRAPH-2F982 + : 80B2 +2F983 CJK COMPATIBILITY IDEOGRAPH-2F983 + : 8103 +2F984 CJK COMPATIBILITY IDEOGRAPH-2F984 + : 440B +2F985 CJK COMPATIBILITY IDEOGRAPH-2F985 + : 813E +2F986 CJK COMPATIBILITY IDEOGRAPH-2F986 + : 5AB5 +2F987 CJK COMPATIBILITY IDEOGRAPH-2F987 + : 267A7 +2F988 CJK COMPATIBILITY IDEOGRAPH-2F988 + : 267B5 +2F989 CJK COMPATIBILITY IDEOGRAPH-2F989 + : 23393 +2F98A CJK COMPATIBILITY IDEOGRAPH-2F98A + : 2339C +2F98B CJK COMPATIBILITY IDEOGRAPH-2F98B + : 8201 +2F98C CJK COMPATIBILITY IDEOGRAPH-2F98C + : 8204 +2F98D CJK COMPATIBILITY IDEOGRAPH-2F98D + : 8F9E +2F98E CJK COMPATIBILITY IDEOGRAPH-2F98E + : 446B +2F98F CJK COMPATIBILITY IDEOGRAPH-2F98F + : 8291 +2F990 CJK COMPATIBILITY IDEOGRAPH-2F990 + : 828B +2F991 CJK COMPATIBILITY IDEOGRAPH-2F991 + : 829D +2F992 CJK COMPATIBILITY IDEOGRAPH-2F992 + : 52B3 +2F993 CJK COMPATIBILITY IDEOGRAPH-2F993 + : 82B1 +2F994 CJK COMPATIBILITY IDEOGRAPH-2F994 + : 82B3 +2F995 CJK COMPATIBILITY IDEOGRAPH-2F995 + : 82BD +2F996 CJK COMPATIBILITY IDEOGRAPH-2F996 + : 82E6 +2F997 CJK COMPATIBILITY IDEOGRAPH-2F997 + : 26B3C +2F998 CJK COMPATIBILITY IDEOGRAPH-2F998 + : 82E5 +2F999 CJK COMPATIBILITY IDEOGRAPH-2F999 + : 831D +2F99A CJK COMPATIBILITY IDEOGRAPH-2F99A + : 8363 +2F99B CJK COMPATIBILITY IDEOGRAPH-2F99B + : 83AD +2F99C CJK COMPATIBILITY IDEOGRAPH-2F99C + : 8323 +2F99D CJK COMPATIBILITY IDEOGRAPH-2F99D + : 83BD +2F99E CJK COMPATIBILITY IDEOGRAPH-2F99E + : 83E7 +2F99F CJK COMPATIBILITY IDEOGRAPH-2F99F + : 8457 +2F9A0 CJK COMPATIBILITY IDEOGRAPH-2F9A0 + : 8353 +2F9A1 CJK COMPATIBILITY IDEOGRAPH-2F9A1 + : 83CA +2F9A2 CJK COMPATIBILITY IDEOGRAPH-2F9A2 + : 83CC +2F9A3 CJK COMPATIBILITY IDEOGRAPH-2F9A3 + : 83DC +2F9A4 CJK COMPATIBILITY IDEOGRAPH-2F9A4 + : 26C36 +2F9A5 CJK COMPATIBILITY IDEOGRAPH-2F9A5 + : 26D6B +2F9A6 CJK COMPATIBILITY IDEOGRAPH-2F9A6 + : 26CD5 +2F9A7 CJK COMPATIBILITY IDEOGRAPH-2F9A7 + : 452B +2F9A8 CJK COMPATIBILITY IDEOGRAPH-2F9A8 + : 84F1 +2F9A9 CJK COMPATIBILITY IDEOGRAPH-2F9A9 + : 84F3 +2F9AA CJK COMPATIBILITY IDEOGRAPH-2F9AA + : 8516 +2F9AB CJK COMPATIBILITY IDEOGRAPH-2F9AB + : 273CA +2F9AC CJK COMPATIBILITY IDEOGRAPH-2F9AC + : 8564 +2F9AD CJK COMPATIBILITY IDEOGRAPH-2F9AD + : 26F2C +2F9AE CJK COMPATIBILITY IDEOGRAPH-2F9AE + : 455D +2F9AF CJK COMPATIBILITY IDEOGRAPH-2F9AF + : 4561 +2F9B0 CJK COMPATIBILITY IDEOGRAPH-2F9B0 + : 26FB1 +2F9B1 CJK COMPATIBILITY IDEOGRAPH-2F9B1 + : 270D2 +2F9B2 CJK COMPATIBILITY IDEOGRAPH-2F9B2 + x 5914 + x 270CD + x 270F0 + : 456B +2F9B3 CJK COMPATIBILITY IDEOGRAPH-2F9B3 + : 8650 +2F9B4 CJK COMPATIBILITY IDEOGRAPH-2F9B4 + : 865C +2F9B5 CJK COMPATIBILITY IDEOGRAPH-2F9B5 + : 8667 +2F9B6 CJK COMPATIBILITY IDEOGRAPH-2F9B6 + x 27205 + : 8669 +2F9B7 CJK COMPATIBILITY IDEOGRAPH-2F9B7 + : 86A9 +2F9B8 CJK COMPATIBILITY IDEOGRAPH-2F9B8 + : 8688 +2F9B9 CJK COMPATIBILITY IDEOGRAPH-2F9B9 + : 870E +2F9BA CJK COMPATIBILITY IDEOGRAPH-2F9BA + : 86E2 +2F9BB CJK COMPATIBILITY IDEOGRAPH-2F9BB + : 8779 +2F9BC CJK COMPATIBILITY IDEOGRAPH-2F9BC + : 8728 +2F9BD CJK COMPATIBILITY IDEOGRAPH-2F9BD + : 876B +2F9BE CJK COMPATIBILITY IDEOGRAPH-2F9BE + : 8786 +2F9BF CJK COMPATIBILITY IDEOGRAPH-2F9BF + : 45D7 +2F9C0 CJK COMPATIBILITY IDEOGRAPH-2F9C0 + : 87E1 +2F9C1 CJK COMPATIBILITY IDEOGRAPH-2F9C1 + : 8801 +2F9C2 CJK COMPATIBILITY IDEOGRAPH-2F9C2 + : 45F9 +2F9C3 CJK COMPATIBILITY IDEOGRAPH-2F9C3 + : 8860 +2F9C4 CJK COMPATIBILITY IDEOGRAPH-2F9C4 + : 8863 +2F9C5 CJK COMPATIBILITY IDEOGRAPH-2F9C5 + : 27667 +2F9C6 CJK COMPATIBILITY IDEOGRAPH-2F9C6 + : 88D7 +2F9C7 CJK COMPATIBILITY IDEOGRAPH-2F9C7 + : 88DE +2F9C8 CJK COMPATIBILITY IDEOGRAPH-2F9C8 + : 4635 +2F9C9 CJK COMPATIBILITY IDEOGRAPH-2F9C9 + : 88FA +2F9CA CJK COMPATIBILITY IDEOGRAPH-2F9CA + : 34BB +2F9CB CJK COMPATIBILITY IDEOGRAPH-2F9CB + x 4695 + : 278AE +2F9CC CJK COMPATIBILITY IDEOGRAPH-2F9CC + : 27966 +2F9CD CJK COMPATIBILITY IDEOGRAPH-2F9CD + : 46BE +2F9CE CJK COMPATIBILITY IDEOGRAPH-2F9CE + : 46C7 +2F9CF CJK COMPATIBILITY IDEOGRAPH-2F9CF + : 8AA0 +2F9D0 CJK COMPATIBILITY IDEOGRAPH-2F9D0 + : 8AED +2F9D1 CJK COMPATIBILITY IDEOGRAPH-2F9D1 + : 8B8A +2F9D2 CJK COMPATIBILITY IDEOGRAPH-2F9D2 + : 8C55 +2F9D3 CJK COMPATIBILITY IDEOGRAPH-2F9D3 + : 27CA8 +2F9D4 CJK COMPATIBILITY IDEOGRAPH-2F9D4 + : 8CAB +2F9D5 CJK COMPATIBILITY IDEOGRAPH-2F9D5 + : 8CC1 +2F9D6 CJK COMPATIBILITY IDEOGRAPH-2F9D6 + x 25AD4 + : 8D1B +2F9D7 CJK COMPATIBILITY IDEOGRAPH-2F9D7 + : 8D77 +2F9D8 CJK COMPATIBILITY IDEOGRAPH-2F9D8 + : 27F2F +2F9D9 CJK COMPATIBILITY IDEOGRAPH-2F9D9 + : 20804 +2F9DA CJK COMPATIBILITY IDEOGRAPH-2F9DA + : 8DCB +2F9DB CJK COMPATIBILITY IDEOGRAPH-2F9DB + : 8DBC +2F9DC CJK COMPATIBILITY IDEOGRAPH-2F9DC + : 8DF0 +2F9DD CJK COMPATIBILITY IDEOGRAPH-2F9DD + : 208DE +2F9DE CJK COMPATIBILITY IDEOGRAPH-2F9DE + : 8ED4 +2F9DF CJK COMPATIBILITY IDEOGRAPH-2F9DF + : 8F38 +2F9E0 CJK COMPATIBILITY IDEOGRAPH-2F9E0 + : 285D2 +2F9E1 CJK COMPATIBILITY IDEOGRAPH-2F9E1 + : 285ED +2F9E2 CJK COMPATIBILITY IDEOGRAPH-2F9E2 + : 9094 +2F9E3 CJK COMPATIBILITY IDEOGRAPH-2F9E3 + : 90F1 +2F9E4 CJK COMPATIBILITY IDEOGRAPH-2F9E4 + : 9111 +2F9E5 CJK COMPATIBILITY IDEOGRAPH-2F9E5 + : 2872E +2F9E6 CJK COMPATIBILITY IDEOGRAPH-2F9E6 + : 911B +2F9E7 CJK COMPATIBILITY IDEOGRAPH-2F9E7 + : 9238 +2F9E8 CJK COMPATIBILITY IDEOGRAPH-2F9E8 + : 92D7 +2F9E9 CJK COMPATIBILITY IDEOGRAPH-2F9E9 + : 92D8 +2F9EA CJK COMPATIBILITY IDEOGRAPH-2F9EA + : 927C +2F9EB CJK COMPATIBILITY IDEOGRAPH-2F9EB + : 93F9 +2F9EC CJK COMPATIBILITY IDEOGRAPH-2F9EC + : 9415 +2F9ED CJK COMPATIBILITY IDEOGRAPH-2F9ED + : 28BFA +2F9EE CJK COMPATIBILITY IDEOGRAPH-2F9EE + : 958B +2F9EF CJK COMPATIBILITY IDEOGRAPH-2F9EF + : 4995 +2F9F0 CJK COMPATIBILITY IDEOGRAPH-2F9F0 + : 95B7 +2F9F1 CJK COMPATIBILITY IDEOGRAPH-2F9F1 + : 28D77 +2F9F2 CJK COMPATIBILITY IDEOGRAPH-2F9F2 + : 49E6 +2F9F3 CJK COMPATIBILITY IDEOGRAPH-2F9F3 + : 96C3 +2F9F4 CJK COMPATIBILITY IDEOGRAPH-2F9F4 + : 5DB2 +2F9F5 CJK COMPATIBILITY IDEOGRAPH-2F9F5 + : 9723 +2F9F6 CJK COMPATIBILITY IDEOGRAPH-2F9F6 + : 29145 +2F9F7 CJK COMPATIBILITY IDEOGRAPH-2F9F7 + : 2921A +2F9F8 CJK COMPATIBILITY IDEOGRAPH-2F9F8 + : 4A6E +2F9F9 CJK COMPATIBILITY IDEOGRAPH-2F9F9 + : 4A76 +2F9FA CJK COMPATIBILITY IDEOGRAPH-2F9FA + : 97E0 +2F9FB CJK COMPATIBILITY IDEOGRAPH-2F9FB + : 2940A +2F9FC CJK COMPATIBILITY IDEOGRAPH-2F9FC + : 4AB2 +2F9FD CJK COMPATIBILITY IDEOGRAPH-2F9FD + : 29496 +2F9FE CJK COMPATIBILITY IDEOGRAPH-2F9FE + : 980B +2F9FF CJK COMPATIBILITY IDEOGRAPH-2F9FF + : 980B +2FA00 CJK COMPATIBILITY IDEOGRAPH-2FA00 + : 9829 +2FA01 CJK COMPATIBILITY IDEOGRAPH-2FA01 + : 295B6 +2FA02 CJK COMPATIBILITY IDEOGRAPH-2FA02 + : 98E2 +2FA03 CJK COMPATIBILITY IDEOGRAPH-2FA03 + : 4B33 +2FA04 CJK COMPATIBILITY IDEOGRAPH-2FA04 + : 9929 +2FA05 CJK COMPATIBILITY IDEOGRAPH-2FA05 + : 99A7 +2FA06 CJK COMPATIBILITY IDEOGRAPH-2FA06 + : 99C2 +2FA07 CJK COMPATIBILITY IDEOGRAPH-2FA07 + : 99FE +2FA08 CJK COMPATIBILITY IDEOGRAPH-2FA08 + : 4BCE +2FA09 CJK COMPATIBILITY IDEOGRAPH-2FA09 + : 29B30 +2FA0A CJK COMPATIBILITY IDEOGRAPH-2FA0A + : 9B12 +2FA0B CJK COMPATIBILITY IDEOGRAPH-2FA0B + : 9C40 +2FA0C CJK COMPATIBILITY IDEOGRAPH-2FA0C + : 9CFD +2FA0D CJK COMPATIBILITY IDEOGRAPH-2FA0D + : 4CCE +2FA0E CJK COMPATIBILITY IDEOGRAPH-2FA0E + : 4CED +2FA0F CJK COMPATIBILITY IDEOGRAPH-2FA0F + : 9D67 +2FA10 CJK COMPATIBILITY IDEOGRAPH-2FA10 + : 2A0CE +2FA11 CJK COMPATIBILITY IDEOGRAPH-2FA11 + : 4CF8 +2FA12 CJK COMPATIBILITY IDEOGRAPH-2FA12 + : 2A105 +2FA13 CJK COMPATIBILITY IDEOGRAPH-2FA13 + : 2A20E +2FA14 CJK COMPATIBILITY IDEOGRAPH-2FA14 + : 2A291 +2FA15 CJK COMPATIBILITY IDEOGRAPH-2FA15 + : 9EBB +2FA16 CJK COMPATIBILITY IDEOGRAPH-2FA16 + : 4D56 +2FA17 CJK COMPATIBILITY IDEOGRAPH-2FA17 + : 9EF9 +2FA18 CJK COMPATIBILITY IDEOGRAPH-2FA18 + : 9EFE +2FA19 CJK COMPATIBILITY IDEOGRAPH-2FA19 + : 9F05 +2FA1A CJK COMPATIBILITY IDEOGRAPH-2FA1A + : 9F0F +2FA1B CJK COMPATIBILITY IDEOGRAPH-2FA1B + : 9F16 +2FA1C CJK COMPATIBILITY IDEOGRAPH-2FA1C + : 9F3B +2FA1D CJK COMPATIBILITY IDEOGRAPH-2FA1D + : 2A600 +@@ 2FF80 Unassigned 2FFFF +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +2FFFE <not a character> + * the value 2FFFE is guaranteed not to be a Unicode character at all +2FFFF <not a character> + * the value 2FFFF is guaranteed not to be a Unicode character at all +@@ 3FF80 Unassigned 3FFFF +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +3FFFE <not a character> + * the value 3FFFE is guaranteed not to be a Unicode character at all +3FFFF <not a character> + * the value 3FFFF is guaranteed not to be a Unicode character at all +@@ 4FF80 Unassigned 4FFFF +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +4FFFE <not a character> + * the value 4FFFE is guaranteed not to be a Unicode character at all +4FFFF <not a character> + * the value 4FFFF is guaranteed not to be a Unicode character at all +@@ 5FF80 Unassigned 5FFFF +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +5FFFE <not a character> + * the value 5FFFE is guaranteed not to be a Unicode character at all +5FFFF <not a character> + * the value 5FFFF is guaranteed not to be a Unicode character at all +@@ 6FF80 Unassigned 6FFFF +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +6FFFE <not a character> + * the value 6FFFE is guaranteed not to be a Unicode character at all +6FFFF <not a character> + * the value 6FFFF is guaranteed not to be a Unicode character at all +@@ 7FF80 Unassigned 7FFFF +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +7FFFE <not a character> + * the value 7FFFE is guaranteed not to be a Unicode character at all +7FFFF <not a character> + * the value 7FFFF is guaranteed not to be a Unicode character at all +@@ 8FF80 Unassigned 8FFFF +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +8FFFE <not a character> + * the value 8FFFE is guaranteed not to be a Unicode character at all +8FFFF <not a character> + * the value 8FFFF is guaranteed not to be a Unicode character at all +@@ 9FF80 Unassigned 9FFFF +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +9FFFE <not a character> + * the value 9FFFE is guaranteed not to be a Unicode character at all +9FFFF <not a character> + * the value 9FFFF is guaranteed not to be a Unicode character at all +@@ AFF80 Unassigned AFFFF +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +AFFFE <not a character> + * the value AFFFE is guaranteed not to be a Unicode character at all +AFFFF <not a character> + * the value AFFFF is guaranteed not to be a Unicode character at all +@@ BFF80 Unassigned BFFFF +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +BFFFE <not a character> + * the value BFFFE is guaranteed not to be a Unicode character at all +BFFFF <not a character> + * the value BFFFF is guaranteed not to be a Unicode character at all +@@ CFF80 Unassigned CFFFF +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +CFFFE <not a character> + * the value CFFFE is guaranteed not to be a Unicode character at all +CFFFF <not a character> + * the value CFFFF is guaranteed not to be a Unicode character at all +@@ DFF80 Unassigned DFFFF +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +DFFFE <not a character> + * the value DFFFE is guaranteed not to be a Unicode character at all +DFFFF <not a character> + * the value DFFFF is guaranteed not to be a Unicode character at all +@@ E0000 Tags E007F +@ Tag identifiers +E0001 LANGUAGE TAG +@ Tag components +E0020 TAG SPACE +E0021 TAG EXCLAMATION MARK +E0022 TAG QUOTATION MARK +E0023 TAG NUMBER SIGN +E0024 TAG DOLLAR SIGN +E0025 TAG PERCENT SIGN +E0026 TAG AMPERSAND +E0027 TAG APOSTROPHE +E0028 TAG LEFT PARENTHESIS +E0029 TAG RIGHT PARENTHESIS +E002A TAG ASTERISK +E002B TAG PLUS SIGN +E002C TAG COMMA +E002D TAG HYPHEN-MINUS +E002E TAG FULL STOP +E002F TAG SOLIDUS +E0030 TAG DIGIT ZERO +E0031 TAG DIGIT ONE +E0032 TAG DIGIT TWO +E0033 TAG DIGIT THREE +E0034 TAG DIGIT FOUR +E0035 TAG DIGIT FIVE +E0036 TAG DIGIT SIX +E0037 TAG DIGIT SEVEN +E0038 TAG DIGIT EIGHT +E0039 TAG DIGIT NINE +E003A TAG COLON +E003B TAG SEMICOLON +E003C TAG LESS-THAN SIGN +E003D TAG EQUALS SIGN +E003E TAG GREATER-THAN SIGN +E003F TAG QUESTION MARK +E0040 TAG COMMERCIAL AT +E0041 TAG LATIN CAPITAL LETTER A +E0042 TAG LATIN CAPITAL LETTER B +E0043 TAG LATIN CAPITAL LETTER C +E0044 TAG LATIN CAPITAL LETTER D +E0045 TAG LATIN CAPITAL LETTER E +E0046 TAG LATIN CAPITAL LETTER F +E0047 TAG LATIN CAPITAL LETTER G +E0048 TAG LATIN CAPITAL LETTER H +E0049 TAG LATIN CAPITAL LETTER I +E004A TAG LATIN CAPITAL LETTER J +E004B TAG LATIN CAPITAL LETTER K +E004C TAG LATIN CAPITAL LETTER L +E004D TAG LATIN CAPITAL LETTER M +E004E TAG LATIN CAPITAL LETTER N +E004F TAG LATIN CAPITAL LETTER O +E0050 TAG LATIN CAPITAL LETTER P +E0051 TAG LATIN CAPITAL LETTER Q +E0052 TAG LATIN CAPITAL LETTER R +E0053 TAG LATIN CAPITAL LETTER S +E0054 TAG LATIN CAPITAL LETTER T +E0055 TAG LATIN CAPITAL LETTER U +E0056 TAG LATIN CAPITAL LETTER V +E0057 TAG LATIN CAPITAL LETTER W +E0058 TAG LATIN CAPITAL LETTER X +E0059 TAG LATIN CAPITAL LETTER Y +E005A TAG LATIN CAPITAL LETTER Z +E005B TAG LEFT SQUARE BRACKET +E005C TAG REVERSE SOLIDUS +E005D TAG RIGHT SQUARE BRACKET +E005E TAG CIRCUMFLEX ACCENT +E005F TAG LOW LINE +E0060 TAG GRAVE ACCENT +E0061 TAG LATIN SMALL LETTER A +E0062 TAG LATIN SMALL LETTER B +E0063 TAG LATIN SMALL LETTER C +E0064 TAG LATIN SMALL LETTER D +E0065 TAG LATIN SMALL LETTER E +E0066 TAG LATIN SMALL LETTER F +E0067 TAG LATIN SMALL LETTER G +E0068 TAG LATIN SMALL LETTER H +E0069 TAG LATIN SMALL LETTER I +E006A TAG LATIN SMALL LETTER J +E006B TAG LATIN SMALL LETTER K +E006C TAG LATIN SMALL LETTER L +E006D TAG LATIN SMALL LETTER M +E006E TAG LATIN SMALL LETTER N +E006F TAG LATIN SMALL LETTER O +E0070 TAG LATIN SMALL LETTER P +E0071 TAG LATIN SMALL LETTER Q +E0072 TAG LATIN SMALL LETTER R +E0073 TAG LATIN SMALL LETTER S +E0074 TAG LATIN SMALL LETTER T +E0075 TAG LATIN SMALL LETTER U +E0076 TAG LATIN SMALL LETTER V +E0077 TAG LATIN SMALL LETTER W +E0078 TAG LATIN SMALL LETTER X +E0079 TAG LATIN SMALL LETTER Y +E007A TAG LATIN SMALL LETTER Z +E007B TAG LEFT CURLY BRACKET +E007C TAG VERTICAL LINE +E007D TAG RIGHT CURLY BRACKET +E007E TAG TILDE +E007F CANCEL TAG +@@ E0100 Variation Selectors Supplement E01EF +@+ These complete the set started at FE00 to FE0F +@ Variation selectors +E0100 VARIATION SELECTOR-17 + * these are abbreviated VS17, and so on +E0101 VARIATION SELECTOR-18 +E0102 VARIATION SELECTOR-19 +E0103 VARIATION SELECTOR-20 +E0104 VARIATION SELECTOR-21 +E0105 VARIATION SELECTOR-22 +E0106 VARIATION SELECTOR-23 +E0107 VARIATION SELECTOR-24 +E0108 VARIATION SELECTOR-25 +E0109 VARIATION SELECTOR-26 +E010A VARIATION SELECTOR-27 +E010B VARIATION SELECTOR-28 +E010C VARIATION SELECTOR-29 +E010D VARIATION SELECTOR-30 +E010E VARIATION SELECTOR-31 +E010F VARIATION SELECTOR-32 +E0110 VARIATION SELECTOR-33 +E0111 VARIATION SELECTOR-34 +E0112 VARIATION SELECTOR-35 +E0113 VARIATION SELECTOR-36 +E0114 VARIATION SELECTOR-37 +E0115 VARIATION SELECTOR-38 +E0116 VARIATION SELECTOR-39 +E0117 VARIATION SELECTOR-40 +E0118 VARIATION SELECTOR-41 +E0119 VARIATION SELECTOR-42 +E011A VARIATION SELECTOR-43 +E011B VARIATION SELECTOR-44 +E011C VARIATION SELECTOR-45 +E011D VARIATION SELECTOR-46 +E011E VARIATION SELECTOR-47 +E011F VARIATION SELECTOR-48 +E0120 VARIATION SELECTOR-49 +E0121 VARIATION SELECTOR-50 +E0122 VARIATION SELECTOR-51 +E0123 VARIATION SELECTOR-52 +E0124 VARIATION SELECTOR-53 +E0125 VARIATION SELECTOR-54 +E0126 VARIATION SELECTOR-55 +E0127 VARIATION SELECTOR-56 +E0128 VARIATION SELECTOR-57 +E0129 VARIATION SELECTOR-58 +E012A VARIATION SELECTOR-59 +E012B VARIATION SELECTOR-60 +E012C VARIATION SELECTOR-61 +E012D VARIATION SELECTOR-62 +E012E VARIATION SELECTOR-63 +E012F VARIATION SELECTOR-64 +E0130 VARIATION SELECTOR-65 +E0131 VARIATION SELECTOR-66 +E0132 VARIATION SELECTOR-67 +E0133 VARIATION SELECTOR-68 +E0134 VARIATION SELECTOR-69 +E0135 VARIATION SELECTOR-70 +E0136 VARIATION SELECTOR-71 +E0137 VARIATION SELECTOR-72 +E0138 VARIATION SELECTOR-73 +E0139 VARIATION SELECTOR-74 +E013A VARIATION SELECTOR-75 +E013B VARIATION SELECTOR-76 +E013C VARIATION SELECTOR-77 +E013D VARIATION SELECTOR-78 +E013E VARIATION SELECTOR-79 +E013F VARIATION SELECTOR-80 +E0140 VARIATION SELECTOR-81 +E0141 VARIATION SELECTOR-82 +E0142 VARIATION SELECTOR-83 +E0143 VARIATION SELECTOR-84 +E0144 VARIATION SELECTOR-85 +E0145 VARIATION SELECTOR-86 +E0146 VARIATION SELECTOR-87 +E0147 VARIATION SELECTOR-88 +E0148 VARIATION SELECTOR-89 +E0149 VARIATION SELECTOR-90 +E014A VARIATION SELECTOR-91 +E014B VARIATION SELECTOR-92 +E014C VARIATION SELECTOR-93 +E014D VARIATION SELECTOR-94 +E014E VARIATION SELECTOR-95 +E014F VARIATION SELECTOR-96 +E0150 VARIATION SELECTOR-97 +E0151 VARIATION SELECTOR-98 +E0152 VARIATION SELECTOR-99 +E0153 VARIATION SELECTOR-100 +E0154 VARIATION SELECTOR-101 +E0155 VARIATION SELECTOR-102 +E0156 VARIATION SELECTOR-103 +E0157 VARIATION SELECTOR-104 +E0158 VARIATION SELECTOR-105 +E0159 VARIATION SELECTOR-106 +E015A VARIATION SELECTOR-107 +E015B VARIATION SELECTOR-108 +E015C VARIATION SELECTOR-109 +E015D VARIATION SELECTOR-110 +E015E VARIATION SELECTOR-111 +E015F VARIATION SELECTOR-112 +E0160 VARIATION SELECTOR-113 +E0161 VARIATION SELECTOR-114 +E0162 VARIATION SELECTOR-115 +E0163 VARIATION SELECTOR-116 +E0164 VARIATION SELECTOR-117 +E0165 VARIATION SELECTOR-118 +E0166 VARIATION SELECTOR-119 +E0167 VARIATION SELECTOR-120 +E0168 VARIATION SELECTOR-121 +E0169 VARIATION SELECTOR-122 +E016A VARIATION SELECTOR-123 +E016B VARIATION SELECTOR-124 +E016C VARIATION SELECTOR-125 +E016D VARIATION SELECTOR-126 +E016E VARIATION SELECTOR-127 +E016F VARIATION SELECTOR-128 +E0170 VARIATION SELECTOR-129 +E0171 VARIATION SELECTOR-130 +E0172 VARIATION SELECTOR-131 +E0173 VARIATION SELECTOR-132 +E0174 VARIATION SELECTOR-133 +E0175 VARIATION SELECTOR-134 +E0176 VARIATION SELECTOR-135 +E0177 VARIATION SELECTOR-136 +E0178 VARIATION SELECTOR-137 +E0179 VARIATION SELECTOR-138 +E017A VARIATION SELECTOR-139 +E017B VARIATION SELECTOR-140 +E017C VARIATION SELECTOR-141 +E017D VARIATION SELECTOR-142 +E017E VARIATION SELECTOR-143 +E017F VARIATION SELECTOR-144 +E0180 VARIATION SELECTOR-145 +E0181 VARIATION SELECTOR-146 +E0182 VARIATION SELECTOR-147 +E0183 VARIATION SELECTOR-148 +E0184 VARIATION SELECTOR-149 +E0185 VARIATION SELECTOR-150 +E0186 VARIATION SELECTOR-151 +E0187 VARIATION SELECTOR-152 +E0188 VARIATION SELECTOR-153 +E0189 VARIATION SELECTOR-154 +E018A VARIATION SELECTOR-155 +E018B VARIATION SELECTOR-156 +E018C VARIATION SELECTOR-157 +E018D VARIATION SELECTOR-158 +E018E VARIATION SELECTOR-159 +E018F VARIATION SELECTOR-160 +E0190 VARIATION SELECTOR-161 +E0191 VARIATION SELECTOR-162 +E0192 VARIATION SELECTOR-163 +E0193 VARIATION SELECTOR-164 +E0194 VARIATION SELECTOR-165 +E0195 VARIATION SELECTOR-166 +E0196 VARIATION SELECTOR-167 +E0197 VARIATION SELECTOR-168 +E0198 VARIATION SELECTOR-169 +E0199 VARIATION SELECTOR-170 +E019A VARIATION SELECTOR-171 +E019B VARIATION SELECTOR-172 +E019C VARIATION SELECTOR-173 +E019D VARIATION SELECTOR-174 +E019E VARIATION SELECTOR-175 +E019F VARIATION SELECTOR-176 +E01A0 VARIATION SELECTOR-177 +E01A1 VARIATION SELECTOR-178 +E01A2 VARIATION SELECTOR-179 +E01A3 VARIATION SELECTOR-180 +E01A4 VARIATION SELECTOR-181 +E01A5 VARIATION SELECTOR-182 +E01A6 VARIATION SELECTOR-183 +E01A7 VARIATION SELECTOR-184 +E01A8 VARIATION SELECTOR-185 +E01A9 VARIATION SELECTOR-186 +E01AA VARIATION SELECTOR-187 +E01AB VARIATION SELECTOR-188 +E01AC VARIATION SELECTOR-189 +E01AD VARIATION SELECTOR-190 +E01AE VARIATION SELECTOR-191 +E01AF VARIATION SELECTOR-192 +E01B0 VARIATION SELECTOR-193 +E01B1 VARIATION SELECTOR-194 +E01B2 VARIATION SELECTOR-195 +E01B3 VARIATION SELECTOR-196 +E01B4 VARIATION SELECTOR-197 +E01B5 VARIATION SELECTOR-198 +E01B6 VARIATION SELECTOR-199 +E01B7 VARIATION SELECTOR-200 +E01B8 VARIATION SELECTOR-201 +E01B9 VARIATION SELECTOR-202 +E01BA VARIATION SELECTOR-203 +E01BB VARIATION SELECTOR-204 +E01BC VARIATION SELECTOR-205 +E01BD VARIATION SELECTOR-206 +E01BE VARIATION SELECTOR-207 +E01BF VARIATION SELECTOR-208 +E01C0 VARIATION SELECTOR-209 +E01C1 VARIATION SELECTOR-210 +E01C2 VARIATION SELECTOR-211 +E01C3 VARIATION SELECTOR-212 +E01C4 VARIATION SELECTOR-213 +E01C5 VARIATION SELECTOR-214 +E01C6 VARIATION SELECTOR-215 +E01C7 VARIATION SELECTOR-216 +E01C8 VARIATION SELECTOR-217 +E01C9 VARIATION SELECTOR-218 +E01CA VARIATION SELECTOR-219 +E01CB VARIATION SELECTOR-220 +E01CC VARIATION SELECTOR-221 +E01CD VARIATION SELECTOR-222 +E01CE VARIATION SELECTOR-223 +E01CF VARIATION SELECTOR-224 +E01D0 VARIATION SELECTOR-225 +E01D1 VARIATION SELECTOR-226 +E01D2 VARIATION SELECTOR-227 +E01D3 VARIATION SELECTOR-228 +E01D4 VARIATION SELECTOR-229 +E01D5 VARIATION SELECTOR-230 +E01D6 VARIATION SELECTOR-231 +E01D7 VARIATION SELECTOR-232 +E01D8 VARIATION SELECTOR-233 +E01D9 VARIATION SELECTOR-234 +E01DA VARIATION SELECTOR-235 +E01DB VARIATION SELECTOR-236 +E01DC VARIATION SELECTOR-237 +E01DD VARIATION SELECTOR-238 +E01DE VARIATION SELECTOR-239 +E01DF VARIATION SELECTOR-240 +E01E0 VARIATION SELECTOR-241 +E01E1 VARIATION SELECTOR-242 +E01E2 VARIATION SELECTOR-243 +E01E3 VARIATION SELECTOR-244 +E01E4 VARIATION SELECTOR-245 +E01E5 VARIATION SELECTOR-246 +E01E6 VARIATION SELECTOR-247 +E01E7 VARIATION SELECTOR-248 +E01E8 VARIATION SELECTOR-249 +E01E9 VARIATION SELECTOR-250 +E01EA VARIATION SELECTOR-251 +E01EB VARIATION SELECTOR-252 +E01EC VARIATION SELECTOR-253 +E01ED VARIATION SELECTOR-254 +E01EE VARIATION SELECTOR-255 +E01EF VARIATION SELECTOR-256 +@@ EFF80 Unassigned EFFFF +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +EFFFE <not a character> + * the value EFFFE is guaranteed not to be a Unicode character at all +EFFFF <not a character> + * the value EFFFF is guaranteed not to be a Unicode character at all +@@ FFF80 Supplementary Private Use Area-A FFFFF +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +FFFFE <not a character> + * the value FFFFE is guaranteed not to be a Unicode character at all +FFFFF <not a character> + * the value FFFFF is guaranteed not to be a Unicode character at all +@@ 10FF80 Supplementary Private Use Area-B 10FFFF +@ Noncharacters +@+ These codes are intended for process internal uses, but are not permitted for interchange. +10FFFE <not a character> + * the value 10FFFE is guaranteed not to be a Unicode character at all +10FFFF <not a character> + * the value 10FFFF is guaranteed not to be a Unicode character at all diff --git a/Master/tlpkg/tlperl.old/lib/unicore/NormalizationCorrections.txt b/Master/tlpkg/tlperl.old/lib/unicore/NormalizationCorrections.txt new file mode 100644 index 00000000000..9391acefbb7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/NormalizationCorrections.txt @@ -0,0 +1,48 @@ +# NormalizationCorrections-4.1.0.txt +# Date: 2005-03-17, 15:21:00 PST [KW] +# +# This file is a normative contributory data file in the +# Unicode Character Database. +# +# Copyright (c) 1991-2005 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# The normalization stabilization policy of the Unicode +# Consortium ordinarily precludes any change to the decomposition +# for any character, once established in a relevant version +# of the UnicodeData.txt data file. However, under certain +# exceptional (and rare) conditions, an error in a decomposition +# mapping may be discovered that is truly just an unintended +# typo in the data, and not a matter of dubious interpretation. +# +# Whenever such an error may be found, and if it meets the +# requirements for possible exceptions to normalization +# stability, the correction is entered in this data file, +# so that any implementation depending on absolute stability +# of normalization, *including* any errors in the data, can +# safely reconstruct the exact state of the data tables at +# any given version of Unicode. +# +# Currently this list has exactly six entries in it, one for the +# typo found and corrected in Corrigendum #3, and five for +# the typos and misidentifications found and corrected in +# Corrigendum #4. All efforts +# will be made to keep the entries limited to just those fixes. +# +# Interpretation of the fields: +# Field 1: Unicode code point +# Field 2: Original (erroneous) decomposition +# Field 3: Corrected decomposition +# Field 4: Version of Unicode for which the correction was +# entered into UnicodeData.txt, in n.n.n format. +# Comment: Indicates the Unicode Corrigendum which documents +# the correction +# +# For more information, see UAX #15, Unicode Normalization Forms. +# +F951;96FB;964B;3.2.0 # Corrigendum 3 +2F868;2136A;36FC;4.0.0 # Corrigendum 4 +2F874;5F33;5F53;4.0.0 # Corrigendum 4 +2F91F;43AB;243AB;4.0.0 # Corrigendum 4 +2F95F;7AAE;7AEE;4.0.0 # Corrigendum 4 +2F9BF;4D57;45D7;4.0.0 # Corrigendum 4 diff --git a/Master/tlpkg/tlperl.old/lib/unicore/PVA.pl b/Master/tlpkg/tlperl.old/lib/unicore/PVA.pl new file mode 100644 index 00000000000..d836bdb7549 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/PVA.pl @@ -0,0 +1,2044 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + + +%utf8::PropertyAlias = ( +'sc', +'Script', +'xonfkd', +'ExpandsOnNFKD', +'patsyn', +'PatternSyntax', +'nfkcqc', +'NFKCQuickCheck', +'oalpha', +'OtherAlphabetic', +'gcb', +'GraphemeClusterBreak', +'nfcqc', +'NFCQuickCheck', +'ids', +'IDStart', +'lb', +'LineBreak', +'stc', +'SimpleTitlecaseMapping', +'xonfkc', +'ExpandsOnNFKC', +'patws', +'PatternWhiteSpace', +'tc', +'TitlecaseMapping', +'lower', +'Lowercase', +'idst', +'IDSTrinaryOperator', +'radical', +'Radical', +'fcnfkc', +'FCNFKCClosure', +'dm', +'DecompositionMapping', +'slc', +'SimpleLowercaseMapping', +'wspace', +'WhiteSpace', +'di', +'DefaultIgnorableCodePoint', +'nt', +'NumericType', +'ea', +'EastAsianWidth', +'ahex', +'ASCIIHexDigit', +'alpha', +'Alphabetic', +'uc', +'UppercaseMapping', +'dia', +'Diacritic', +'gc', +'GeneralCategory', +'xids', +'XIDStart', +'oupper', +'OtherUppercase', +'wb', +'WordBreak', +'math', +'Math', +'sb', +'SentenceBreak', +'qmark', +'QuotationMark', +'nfdqc', +'NFDQuickCheck', +'ideo', +'Ideographic', +'blk', +'Block', +'odi', +'OtherDefaultIgnorableCodePoint', +'hst', +'HangulSyllableType', +'bidim', +'BidiMirrored', +'olower', +'OtherLowercase', +'na', +'Name', +'hyphen', +'Hyphen', +'xidc', +'XIDContinue', +'oidc', +'OtherIDContinue', +'bidic', +'BidiControl', +'na1', +'Unicode1Name', +'compex', +'FullCompositionExclusion', +'ext', +'Extender', +'cf', +'CaseFolding', +'grlink', +'GraphemeLink', +'xonfc', +'ExpandsOnNFC', +'sd', +'SoftDotted', +'ccc', +'CanonicalCombiningClass', +'dash', +'Dash', +'hex', +'HexDigit', +'grbase', +'GraphemeBase', +'dt', +'DecompositionType', +'xonfd', +'ExpandsOnNFD', +'scc', +'SpecialCaseCondition', +'idsb', +'IDSBinaryOperator', +'age', +'Age', +'loe', +'LogicalOrderException', +'term', +'TerminalPunctuation', +'ce', +'CompositionExclusion', +'isc', +'ISOComment', +'dep', +'Deprecated', +'sfc', +'SimpleCaseFolding', +'bc', +'BidiClass', +'nchar', +'NoncharacterCodePoint', +'jt', +'JoiningType', +'upper', +'Uppercase', +'uideo', +'UnifiedIdeograph', +'sterm', +'STerm', +'nfkdqc', +'NFKDQuickCheck', +'oids', +'OtherIDStart', +'joinc', +'JoinControl', +'nv', +'NumericValue', +'suc', +'SimpleUppercaseMapping', +'urs', +'UnicodeRadicalStroke', +'bmg', +'BidiMirroringGlyph', +'grext', +'GraphemeExtend', +'idc', +'IDContinue', +'vs', +'VariationSelector', +'omath', +'OtherMath', +'lc', +'LowercaseMapping', +'ogrext', +'OtherGraphemeExtend', +'jg', +'JoiningGroup', +); + +%utf8::PA_reverse = ( +'linebreak', +'lb', +'bidiclass', +'bc', +'terminalpunctuation', +'Term', +'expandsonnfkc', +'XONFKC', +'extender', +'Ext', +'simplecasefolding', +'sfc', +'patternsyntax', +'PatSyn', +'sentencebreak', +'SB', +'numericvalue', +'nv', +'patternwhitespace', +'PatWS', +'softdotted', +'SD', +'logicalorderexception', +'LOE', +'idstart', +'IDS', +'generalcategory', +'gc', +'decompositiontype', +'dt', +'name', +'na', +'numerictype', +'nt', +'otherlowercase', +'OLower', +'joininggroup', +'jg', +'expandsonnfkd', +'XONFKD', +'deprecated', +'Dep', +'radical', +'Radical', +'idstrinaryoperator', +'IDST', +'xidstart', +'XIDS', +'lowercase', +'Lower', +'unifiedideograph', +'UIdeo', +'othergraphemeextend', +'OGrExt', +'eastasianwidth', +'ea', +'math', +'Math', +'graphemelink', +'GrLink', +'noncharactercodepoint', +'NChar', +'graphemebase', +'GrBase', +'bidimirrored', +'BidiM', +'casefolding', +'cf', +'simpleuppercasemapping', +'suc', +'fullcompositionexclusion', +'CompEx', +'compositionexclusion', +'CE', +'uppercasemapping', +'uc', +'decompositionmapping', +'dm', +'whitespace', +'WSpace', +'hyphen', +'Hyphen', +'ideographic', +'Ideo', +'idcontinue', +'IDC', +'idsbinaryoperator', +'IDSB', +'hangulsyllabletype', +'hst', +'asciihexdigit', +'AHex', +'otheruppercase', +'OUpper', +'nfkdquickcheck', +'NFKDQC', +'simpletitlecasemapping', +'stc', +'nfcquickcheck', +'NFCQC', +'bidicontrol', +'BidiC', +'diacritic', +'Dia', +'joiningtype', +'jt', +'otheralphabetic', +'OAlpha', +'canonicalcombiningclass', +'ccc', +'alphabetic', +'Alpha', +'titlecasemapping', +'tc', +'unicoderadicalstroke', +'URS', +'hexdigit', +'Hex', +'unicode1name', +'na1', +'dash', +'Dash', +'fcnfkcclosure', +'FCNFKC', +'graphemeextend', +'GrExt', +'joincontrol', +'JoinC', +'xidcontinue', +'XIDC', +'quotationmark', +'QMark', +'expandsonnfd', +'XONFD', +'age', +'age', +'otheridcontinue', +'OIDC', +'uppercase', +'Upper', +'expandsonnfc', +'XONFC', +'defaultignorablecodepoint', +'DI', +'nfdquickcheck', +'NFDQC', +'isocomment', +'isc', +'otherdefaultignorablecodepoint', +'ODI', +'variationselector', +'VS', +'specialcasecondition', +'scc', +'script', +'sc', +'otheridstart', +'OIDS', +'sterm', +'STerm', +'graphemeclusterbreak', +'GCB', +'nfkcquickcheck', +'NFKCQC', +'bidimirroringglyph', +'bmg', +'othermath', +'OMath', +'block', +'blk', +'wordbreak', +'WB', +'lowercasemapping', +'lc', +'simplelowercasemapping', +'slc', +); + +%utf8::PropValueAlias = ( +'sc', +{ +'tglg', +'Tagalog', +'runr', +'Runic', +'osma', +'Osmanya', +'hano', +'Hanunoo', +'cans', +'CanadianAboriginal', +'tagb', +'Tagbanwa', +'mlym', +'Malayalam', +'knda', +'Kannada', +'grek', +'Greek', +'ethi', +'Ethiopic', +'orya', +'Oriya', +'cher', +'Cherokee', +'mong', +'Mongolian', +'khmr', +'Khmer', +'ogam', +'Ogham', +'hrkt', +'KatakanaOrHiragana', +'armn', +'Armenian', +'ital', +'OldItalic', +'hani', +'Han', +'shaw', +'Shavian', +'taml', +'Tamil', +'tibt', +'Tibetan', +'guru', +'Gurmukhi', +'ugar', +'Ugaritic', +'qaai', +'Inherited', +'kana', +'Katakana', +'gujr', +'Gujarati', +'thaa', +'Thaana', +'cyrl', +'Cyrillic', +'copt', +'Coptic', +'sylo', +'SylotiNagri', +'thai', +'Thai', +'talu', +'NewTaiLue', +'laoo', +'Lao', +'sinh', +'Sinhala', +'beng', +'Bengali', +'hira', +'Hiragana', +'brai', +'Braille', +'telu', +'Telugu', +'limb', +'Limbu', +'geor', +'Georgian', +'mymr', +'Myanmar', +'glag', +'Glagolitic', +'hang', +'Hangul', +'syrc', +'Syriac', +'tfng', +'Tifinagh', +'dsrt', +'Deseret', +'buhd', +'Buhid', +'yiii', +'Yi', +'arab', +'Arabic', +'bopo', +'Bopomofo', +'khar', +'Kharoshthi', +'linb', +'LinearB', +'deva', +'Devanagari', +'xpeo', +'OldPersian', +'goth', +'Gothic', +'cprt', +'Cypriot', +'tale', +'TaiLe', +'zyyy', +'Common', +'latn', +'Latin', +'bugi', +'Buginese', +'hebr', +'Hebrew', +}, +'dt', +{ +'fra', +'Fraction', +'none', +'None', +'sml', +'Small', +'enc', +'Circle', +'font', +'Font', +'init', +'Initial', +'nb', +'Nobreak', +'iso', +'Isolated', +'sup', +'Super', +'fin', +'Final', +'wide', +'Wide', +'nar', +'Narrow', +'can', +'Canonical', +'med', +'Medial', +'sub', +'Sub', +'vert', +'Vertical', +'sqr', +'Square', +'com', +'Compat', +}, +'nt', +{ +'none', +'None', +'di', +'Digit', +'de', +'Decimal', +'nu', +'Numeric', +}, +'ea', +{ +'w', +'Wide', +'n', +'Neutral', +'h', +'Halfwidth', +'a', +'Ambiguous', +'f', +'Fullwidth', +'na', +'Narrow', +}, +'NFKC_QC', +{ +'y', +'Yes', +'n', +'No', +'m', +'Maybe', +}, +'bc', +{ +'r', +'RightToLeft', +'rlo', +'RightToLeftOverride', +'es', +'EuropeanSeparator', +'ws', +'WhiteSpace', +'rle', +'RightToLeftEmbedding', +'on', +'OtherNeutral', +'bn', +'BoundaryNeutral', +'et', +'EuropeanTerminator', +'pdf', +'PopDirectionalFormat', +'lro', +'LeftToRightOverride', +'s', +'SegmentSeparator', +'al', +'ArabicLetter', +'en', +'EuropeanNumber', +'l', +'LeftToRight', +'b', +'ParagraphSeparator', +'lre', +'LeftToRightEmbedding', +'cs', +'CommonSeparator', +'nsm', +'NonspacingMark', +'an', +'ArabicNumber', +}, +'gc', +{ +'sc', +'CurrencySymbol', +'mc', +'SpacingMark', +'lm', +'ModifierLetter', +'cn', +'Unassigned', +'pf', +'FinalPunctuation', +'no', +'OtherNumber', +'cc', +'Control', +'lo', +'OtherLetter', +'po', +'OtherPunctuation', +'zs', +'SpaceSeparator', +'co', +'PrivateUse', +'so', +'OtherSymbol', +'ll', +'LowercaseLetter', +'nd', +'DecimalNumber', +'cf', +'Format', +'me', +'EnclosingMark', +'s', +'Symbol', +'zp', +'ParagraphSeparator', +'pd', +'DashPunctuation', +'c', +'Other', +'lt', +'TitlecaseLetter', +'cs', +'Surrogate', +'l&', +'CasedLetter', +'z', +'Separator', +'ps', +'OpenPunctuation', +'zl', +'LineSeparator', +'pc', +'ConnectorPunctuation', +'pi', +'InitialPunctuation', +'n', +'Number', +'m', +'Mark', +'nl', +'LetterNumber', +'sm', +'MathSymbol', +'l', +'Letter', +'mn', +'NonspacingMark', +'p', +'Punctuation', +'lc', +'CasedLetter', +'sk', +'ModifierSymbol', +'lu', +'UppercaseLetter', +'pe', +'ClosePunctuation', +}, +'GCB', +{ +'cn', +'Control', +'ex', +'Extend', +'v', +'V', +'lv', +'LV', +'xx', +'Other', +'l', +'L', +'lvt', +'LVT', +'cr', +'CR', +'lf', +'LF', +'t', +'T', +}, +'lb', +{ +'sp', +'Space', +'ba', +'BreakAfter', +'gl', +'Glue', +'xx', +'Unknown', +'nu', +'Numeric', +'cb', +'ContingentBreak', +'sy', +'BreakSymbols', +'cr', +'CarriageReturn', +'in', +'Inseparable', +'bb', +'BreakBefore', +'sg', +'Surrogate', +'sa', +'ComplexContext', +'po', +'PostfixNumeric', +'jl', +'JL', +'id', +'Ideographic', +'al', +'Alphabetic', +'bk', +'MandatoryBreak', +'pr', +'PrefixNumeric', +'b2', +'BreakBoth', +'op', +'OpenPunctuation', +'cl', +'ClosePunctuation', +'is', +'InfixNumeric', +'qu', +'Quotation', +'hy', +'Hyphen', +'wj', +'WordJoiner', +'zw', +'ZWSpace', +'jt', +'JT', +'ex', +'Exclamation', +'cm', +'CombiningMark', +'h2', +'H2', +'nl', +'NextLine', +'ns', +'Nonstarter', +'h3', +'H3', +'ai', +'Ambiguous', +'lf', +'LineFeed', +'jv', +'JV', +}, +'jt', +{ +'l', +'LeftJoining', +'u', +'NonJoining', +'c', +'JoinCausing', +'r', +'RightJoining', +'d', +'DualJoining', +'t', +'Transparent', +}, +'NFKD_QC', +{ +'y', +'Yes', +'n', +'No', +}, +'NFC_QC', +{ +'y', +'Yes', +'n', +'No', +'m', +'Maybe', +}, +'hst', +{ +'l', +'LeadingJamo', +'lvt', +'LVTSyllable', +'v', +'VowelJamo', +'lv', +'LVSyllable', +'t', +'TrailingJamo', +'na', +'NotApplicable', +}, +'NFD_QC', +{ +'y', +'Yes', +'n', +'No', +}, +'WB', +{ +'ml', +'MidLetter', +'le', +'ALetter', +'ex', +'ExtendNumLet', +'xx', +'Other', +'nu', +'Numeric', +'fo', +'Format', +'mn', +'MidNum', +'ka', +'Katakana', +}, +'SB', +{ +'sp', +'Sp', +'cl', +'Close', +'le', +'OLetter', +'up', +'Upper', +'st', +'STerm', +'xx', +'Other', +'nu', +'Numeric', +'fo', +'Format', +'se', +'Sep', +'lo', +'Lower', +'at', +'ATerm', +}, +'ccc', +{ +'atb', +'AttachedBelow', +'db', +'DoubleBelow', +'a', +'Above', +'r', +'Right', +'da', +'DoubleAbove', +'is', +'IotaSubscript', +'nr', +'NotReordered', +'ov', +'Overlay', +'br', +'BelowRight', +'nk', +'Nukta', +'atbl', +'AttachedBelowLeft', +'al', +'AboveLeft', +'ar', +'AboveRight', +'atar', +'AttachedAboveRight', +'l', +'Left', +'b', +'Below', +'vr', +'Virama', +'kv', +'KanaVoicing', +'bl', +'BelowLeft', +}, +); + +%utf8::PVA_reverse = ( +'sc', +{ +'newtailue', +'Talu', +'canadianaboriginal', +'Cans', +'gujarati', +'Gujr', +'latin', +'Latn', +'hangul', +'Hang', +'deseret', +'Dsrt', +'hebrew', +'Hebr', +'inherited', +'Qaai', +'linearb', +'Linb', +'ugaritic', +'Ugar', +'taile', +'Tale', +'armenian', +'Armn', +'tifinagh', +'Tfng', +'myanmar', +'Mymr', +'gurmukhi', +'Guru', +'greek', +'Grek', +'coptic', +'Copt', +'cyrillic', +'Cyrl', +'thaana', +'Thaa', +'lao', +'Laoo', +'katakana', +'Kana', +'khmer', +'Khmr', +'tibetan', +'Tibt', +'hiragana', +'Hira', +'mongolian', +'Mong', +'thai', +'Thai', +'yi', +'Yiii', +'sylotinagri', +'Sylo', +'bopomofo', +'Bopo', +'malayalam', +'Mlym', +'telugu', +'Telu', +'limbu', +'Limb', +'oriya', +'Orya', +'buhid', +'Buhd', +'cypriot', +'Cprt', +'bengali', +'Beng', +'katakanaorhiragana', +'Hrkt', +'oldpersian', +'Xpeo', +'tagalog', +'Tglg', +'syriac', +'Syrc', +'cherokee', +'Cher', +'ogham', +'Ogam', +'hanunoo', +'Hano', +'braille', +'Brai', +'tamil', +'Taml', +'common', +'Zyyy', +'runic', +'Runr', +'georgian', +'Geor', +'ethiopic', +'Ethi', +'glagolitic', +'Glag', +'han', +'Hani', +'kharoshthi', +'Khar', +'kannada', +'Knda', +'tagbanwa', +'Tagb', +'arabic', +'Arab', +'sinhala', +'Sinh', +'gothic', +'Goth', +'osmanya', +'Osma', +'olditalic', +'Ital', +'devanagari', +'Deva', +'buginese', +'Bugi', +'shavian', +'Shaw', +}, +'dt', +{ +'small', +'sml', +'none', +'none', +'isolated', +'iso', +'narrow', +'nar', +'square', +'sqr', +'nobreak', +'nb', +'fraction', +'fra', +'font', +'font', +'medial', +'med', +'wide', +'wide', +'canonical', +'can', +'circle', +'enc', +'super', +'sup', +'vertical', +'vert', +'final', +'fin', +'compat', +'com', +'sub', +'sub', +'initial', +'init', +}, +'nt', +{ +'none', +'None', +'digit', +'Di', +'numeric', +'Nu', +'decimal', +'De', +}, +'ea', +{ +'halfwidth', +'H', +'fullwidth', +'F', +'ambiguous', +'A', +'narrow', +'Na', +'wide', +'W', +'neutral', +'N', +}, +'NFKC_QC', +{ +'yes', +'Y', +'maybe', +'M', +'no', +'N', +}, +'bc', +{ +'nonspacingmark', +'NSM', +'whitespace', +'WS', +'righttoleft', +'R', +'lefttoright', +'L', +'boundaryneutral', +'BN', +'segmentseparator', +'S', +'lefttorightembedding', +'LRE', +'europeanterminator', +'ET', +'righttoleftembedding', +'RLE', +'righttoleftoverride', +'RLO', +'lefttorightoverride', +'LRO', +'europeanseparator', +'ES', +'europeannumber', +'EN', +'commonseparator', +'CS', +'arabicletter', +'AL', +'paragraphseparator', +'B', +'otherneutral', +'ON', +'popdirectionalformat', +'PDF', +'arabicnumber', +'AN', +}, +'gc', +{ +'modifiersymbol', +'Sk', +'letternumber', +'Nl', +'connectorpunctuation', +'Pc', +'spacingmark', +'Mc', +'mark', +'M', +'unassigned', +'Cn', +'enclosingmark', +'Me', +'lineseparator', +'Zl', +'lowercaseletter', +'Ll', +'symbol', +'S', +'letter', +'L', +'othernumber', +'No', +'paragraphseparator', +'Zp', +'modifierletter', +'Lm', +'titlecaseletter', +'Lt', +'decimalnumber', +'Nd', +'other', +'C', +'mathsymbol', +'Sm', +'surrogate', +'Cs', +'otherletter', +'Lo', +'nonspacingmark', +'Mn', +'number', +'N', +'uppercaseletter', +'Lu', +'spaceseparator', +'Zs', +'privateuse', +'Co', +'openpunctuation', +'Ps', +'punctuation', +'P', +'control', +'Cc', +'casedletter', +'LC', +'closepunctuation', +'Pe', +'otherpunctuation', +'Po', +'finalpunctuation', +'Pf', +'format', +'Cf', +'initialpunctuation', +'Pi', +'separator', +'Z', +'othersymbol', +'So', +'dashpunctuation', +'Pd', +'currencysymbol', +'Sc', +}, +'GCB', +{ +'extend', +'EX', +'v', +'V', +'lv', +'LV', +'l', +'L', +'lvt', +'LVT', +'cr', +'CR', +'other', +'XX', +'lf', +'LF', +'control', +'CN', +'t', +'T', +}, +'lb', +{ +'carriagereturn', +'CR', +'ideographic', +'ID', +'hyphen', +'HY', +'ambiguous', +'AI', +'contingentbreak', +'CB', +'complexcontext', +'SA', +'prefixnumeric', +'PR', +'jl', +'JL', +'inseparable', +'IN', +'breaksymbols', +'SY', +'breakafter', +'BA', +'breakbefore', +'BB', +'postfixnumeric', +'PO', +'glue', +'GL', +'wordjoiner', +'WJ', +'breakboth', +'B2', +'quotation', +'QU', +'combiningmark', +'CM', +'nonstarter', +'NS', +'linefeed', +'LF', +'alphabetic', +'AL', +'surrogate', +'SG', +'mandatorybreak', +'BK', +'unknown', +'XX', +'exclamation', +'EX', +'openpunctuation', +'OP', +'jt', +'JT', +'closepunctuation', +'CL', +'space', +'SP', +'zwspace', +'ZW', +'h2', +'H2', +'infixnumeric', +'IS', +'nextline', +'NL', +'numeric', +'NU', +'h3', +'H3', +'jv', +'JV', +}, +'jt', +{ +'leftjoining', +'L', +'transparent', +'T', +'nonjoining', +'U', +'rightjoining', +'R', +'dualjoining', +'D', +'joincausing', +'C', +}, +'NFKD_QC', +{ +'yes', +'Y', +'no', +'N', +}, +'NFC_QC', +{ +'yes', +'Y', +'maybe', +'M', +'no', +'N', +}, +'hst', +{ +'lvtsyllable', +'LVT', +'lvsyllable', +'LV', +'leadingjamo', +'L', +'notapplicable', +'NA', +'voweljamo', +'V', +'trailingjamo', +'T', +}, +'NFD_QC', +{ +'yes', +'Y', +'no', +'N', +}, +'WB', +{ +'midletter', +'ML', +'format', +'FO', +'katakana', +'KA', +'other', +'XX', +'midnum', +'MN', +'numeric', +'NU', +'extendnumlet', +'EX', +'aletter', +'LE', +}, +'SB', +{ +'sp', +'SP', +'upper', +'UP', +'sterm', +'ST', +'aterm', +'AT', +'close', +'CL', +'oletter', +'LE', +'sep', +'SE', +'format', +'FO', +'other', +'XX', +'lower', +'LO', +'numeric', +'NU', +}, +'ccc', +{ +'left', +'L', +'attachedbelowleft', +'ATBL', +'belowleft', +'BL', +'aboveright', +'AR', +'kanavoicing', +'KV', +'above', +'A', +'aboveleft', +'AL', +'nukta', +'NK', +'below', +'B', +'doublebelow', +'DB', +'virama', +'VR', +'belowright', +'BR', +'notreordered', +'NR', +'attachedbelow', +'ATB', +'right', +'R', +'iotasubscript', +'IS', +'doubleabove', +'DA', +'attachedaboveright', +'ATAR', +'overlay', +'OV', +}, +); + +%utf8::PVA_abbr_map = ( +'jt', +{ +'l', +'L', +'u', +'U', +'c', +'C', +'r', +'R', +'d', +'D', +'t', +'T', +}, +'dt', +{ +'fra', +'fra', +'none', +'none', +'sml', +'sml', +'enc', +'enc', +'font', +'font', +'init', +'init', +'nb', +'nb', +'iso', +'iso', +'sup', +'sup', +'fin', +'fin', +'wide', +'wide', +'nar', +'nar', +'can', +'can', +'med', +'med', +'sub', +'sub', +'vert', +'vert', +'sqr', +'sqr', +'com', +'com', +}, +'nt', +{ +'none', +'None', +'di', +'Di', +'de', +'De', +'nu', +'Nu', +}, +'NFKD_QC', +{ +'y', +'Y', +'n', +'N', +}, +'ea', +{ +'w', +'W', +'n', +'N', +'h', +'H', +'a', +'A', +'f', +'F', +'na', +'Na', +}, +'gc_sc', +{ +'runr', +'Runr', +'osma', +'Osma', +'sc', +'Sc', +'mc', +'Mc', +'hano', +'Hano', +'cans', +'Cans', +'lm', +'Lm', +'cn', +'Cn', +'knda', +'Knda', +'orya', +'Orya', +'cher', +'Cher', +'khmr', +'Khmr', +'ogam', +'Ogam', +'lo', +'Lo', +'po', +'Po', +'co', +'Co', +'ital', +'Ital', +'ll', +'Ll', +'tibt', +'Tibt', +'kana', +'Kana', +'zp', +'Zp', +'gujr', +'Gujr', +'thaa', +'Thaa', +'cs', +'Cs', +'copt', +'Copt', +'z', +'Z', +'ps', +'Ps', +'sylo', +'Sylo', +'talu', +'Talu', +'laoo', +'Laoo', +'sinh', +'Sinh', +'zl', +'Zl', +'pc', +'Pc', +'hira', +'Hira', +'limb', +'Limb', +'mymr', +'Mymr', +'yiii', +'Yiii', +'arab', +'Arab', +'deva', +'Deva', +'xpeo', +'Xpeo', +'cprt', +'Cprt', +'bugi', +'Bugi', +'sk', +'Sk', +'hebr', +'Hebr', +'lu', +'Lu', +'pe', +'Pe', +'tglg', +'Tglg', +'tagb', +'Tagb', +'mlym', +'Mlym', +'pf', +'Pf', +'no', +'No', +'grek', +'Grek', +'ethi', +'Ethi', +'mong', +'Mong', +'cc', +'Cc', +'hrkt', +'Hrkt', +'armn', +'Armn', +'zs', +'Zs', +'so', +'So', +'hani', +'Hani', +'shaw', +'Shaw', +'taml', +'Taml', +'me', +'Me', +'cf', +'Cf', +'nd', +'Nd', +'s', +'S', +'guru', +'Guru', +'ugar', +'Ugar', +'qaai', +'Qaai', +'lt', +'Lt', +'c', +'C', +'pd', +'Pd', +'cyrl', +'Cyrl', +'l&', +'LC', +'thai', +'Thai', +'beng', +'Beng', +'brai', +'Brai', +'telu', +'Telu', +'pi', +'Pi', +'geor', +'Geor', +'glag', +'Glag', +'hang', +'Hang', +'syrc', +'Syrc', +'tfng', +'Tfng', +'n', +'N', +'dsrt', +'Dsrt', +'buhd', +'Buhd', +'m', +'M', +'khar', +'Khar', +'sm', +'Sm', +'nl', +'Nl', +'bopo', +'Bopo', +'linb', +'Linb', +'mn', +'Mn', +'l', +'L', +'p', +'P', +'goth', +'Goth', +'tale', +'Tale', +'lc', +'LC', +'zyyy', +'Zyyy', +'latn', +'Latn', +}, +'NFC_QC', +{ +'y', +'Y', +'n', +'N', +'m', +'M', +}, +'NFD_QC', +{ +'y', +'Y', +'n', +'N', +}, +'hst', +{ +'l', +'L', +'lvt', +'LVT', +'v', +'V', +'lv', +'LV', +'t', +'T', +'na', +'NA', +}, +'NFKC_QC', +{ +'y', +'Y', +'n', +'N', +'m', +'M', +}, +'WB', +{ +'ml', +'ML', +'le', +'LE', +'ex', +'EX', +'xx', +'XX', +'nu', +'NU', +'fo', +'FO', +'mn', +'MN', +'ka', +'KA', +}, +'SB', +{ +'sp', +'SP', +'cl', +'CL', +'le', +'LE', +'up', +'UP', +'st', +'ST', +'xx', +'XX', +'nu', +'NU', +'fo', +'FO', +'se', +'SE', +'lo', +'LO', +'at', +'AT', +}, +'bc', +{ +'r', +'R', +'rlo', +'RLO', +'es', +'ES', +'ws', +'WS', +'rle', +'RLE', +'on', +'ON', +'bn', +'BN', +'et', +'ET', +'pdf', +'PDF', +'lro', +'LRO', +'s', +'S', +'al', +'AL', +'en', +'EN', +'l', +'L', +'b', +'B', +'lre', +'LRE', +'cs', +'CS', +'nsm', +'NSM', +'an', +'AN', +}, +'GCB', +{ +'cn', +'CN', +'ex', +'EX', +'v', +'V', +'lv', +'LV', +'xx', +'XX', +'l', +'L', +'lvt', +'LVT', +'cr', +'CR', +'lf', +'LF', +'t', +'T', +}, +'ccc', +{ +'atb', +'ATB', +'db', +'DB', +'a', +'A', +'r', +'R', +'da', +'DA', +'is', +'IS', +'nr', +'NR', +'ov', +'OV', +'br', +'BR', +'nk', +'NK', +'atbl', +'ATBL', +'al', +'AL', +'ar', +'AR', +'atar', +'ATAR', +'l', +'L', +'b', +'B', +'vr', +'VR', +'kv', +'KV', +'bl', +'BL', +}, +'lb', +{ +'sp', +'SP', +'ba', +'BA', +'gl', +'GL', +'xx', +'XX', +'nu', +'NU', +'cb', +'CB', +'sy', +'SY', +'cr', +'CR', +'in', +'IN', +'bb', +'BB', +'sg', +'SG', +'sa', +'SA', +'po', +'PO', +'jl', +'JL', +'id', +'ID', +'al', +'AL', +'bk', +'BK', +'pr', +'PR', +'b2', +'B2', +'op', +'OP', +'cl', +'CL', +'is', +'IS', +'qu', +'QU', +'hy', +'HY', +'wj', +'WJ', +'zw', +'ZW', +'jt', +'JT', +'ex', +'EX', +'cm', +'CM', +'h2', +'H2', +'nl', +'NL', +'ns', +'NS', +'h3', +'H3', +'ai', +'AI', +'lf', +'LF', +'jv', +'JV', +}, +); +1; diff --git a/Master/tlpkg/tlperl.old/lib/unicore/PropList.txt b/Master/tlpkg/tlperl.old/lib/unicore/PropList.txt new file mode 100644 index 00000000000..befc49e8e64 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/PropList.txt @@ -0,0 +1,1049 @@ +# PropList-4.1.0.txt +# Date: 2005-03-26, 00:34:40 GMT [MD] +# +# Unicode Character Database +# Copyright (c) 1991-2005 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html + +# ================================================ + +0009..000D ; White_Space # Cc [5] <control-0009>..<control-000D> +0020 ; White_Space # Zs SPACE +0085 ; White_Space # Cc <control-0085> +00A0 ; White_Space # Zs NO-BREAK SPACE +1680 ; White_Space # Zs OGHAM SPACE MARK +180E ; White_Space # Zs MONGOLIAN VOWEL SEPARATOR +2000..200A ; White_Space # Zs [11] EN QUAD..HAIR SPACE +2028 ; White_Space # Zl LINE SEPARATOR +2029 ; White_Space # Zp PARAGRAPH SEPARATOR +202F ; White_Space # Zs NARROW NO-BREAK SPACE +205F ; White_Space # Zs MEDIUM MATHEMATICAL SPACE +3000 ; White_Space # Zs IDEOGRAPHIC SPACE + +# Total code points: 26 + +# ================================================ + +200E..200F ; Bidi_Control # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK +202A..202E ; Bidi_Control # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE + +# Total code points: 7 + +# ================================================ + +200C..200D ; Join_Control # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER + +# Total code points: 2 + +# ================================================ + +002D ; Dash # Pd HYPHEN-MINUS +058A ; Dash # Pd ARMENIAN HYPHEN +1806 ; Dash # Pd MONGOLIAN TODO SOFT HYPHEN +2010..2015 ; Dash # Pd [6] HYPHEN..HORIZONTAL BAR +2053 ; Dash # Po SWUNG DASH +207B ; Dash # Sm SUPERSCRIPT MINUS +208B ; Dash # Sm SUBSCRIPT MINUS +2212 ; Dash # Sm MINUS SIGN +2E17 ; Dash # Pd DOUBLE OBLIQUE HYPHEN +301C ; Dash # Pd WAVE DASH +3030 ; Dash # Pd WAVY DASH +30A0 ; Dash # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN +FE31..FE32 ; Dash # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +FE58 ; Dash # Pd SMALL EM DASH +FE63 ; Dash # Pd SMALL HYPHEN-MINUS +FF0D ; Dash # Pd FULLWIDTH HYPHEN-MINUS + +# Total code points: 22 + +# ================================================ + +002D ; Hyphen # Pd HYPHEN-MINUS +00AD ; Hyphen # Cf SOFT HYPHEN +058A ; Hyphen # Pd ARMENIAN HYPHEN +1806 ; Hyphen # Pd MONGOLIAN TODO SOFT HYPHEN +2010..2011 ; Hyphen # Pd [2] HYPHEN..NON-BREAKING HYPHEN +2E17 ; Hyphen # Pd DOUBLE OBLIQUE HYPHEN +30FB ; Hyphen # Po KATAKANA MIDDLE DOT +FE63 ; Hyphen # Pd SMALL HYPHEN-MINUS +FF0D ; Hyphen # Pd FULLWIDTH HYPHEN-MINUS +FF65 ; Hyphen # Po HALFWIDTH KATAKANA MIDDLE DOT + +# Total code points: 11 + +# ================================================ + +0022 ; Quotation_Mark # Po QUOTATION MARK +0027 ; Quotation_Mark # Po APOSTROPHE +00AB ; Quotation_Mark # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00BB ; Quotation_Mark # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +2018 ; Quotation_Mark # Pi LEFT SINGLE QUOTATION MARK +2019 ; Quotation_Mark # Pf RIGHT SINGLE QUOTATION MARK +201A ; Quotation_Mark # Ps SINGLE LOW-9 QUOTATION MARK +201B..201C ; Quotation_Mark # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK +201D ; Quotation_Mark # Pf RIGHT DOUBLE QUOTATION MARK +201E ; Quotation_Mark # Ps DOUBLE LOW-9 QUOTATION MARK +201F ; Quotation_Mark # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2039 ; Quotation_Mark # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; Quotation_Mark # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +300C ; Quotation_Mark # Ps LEFT CORNER BRACKET +300D ; Quotation_Mark # Pe RIGHT CORNER BRACKET +300E ; Quotation_Mark # Ps LEFT WHITE CORNER BRACKET +300F ; Quotation_Mark # Pe RIGHT WHITE CORNER BRACKET +301D ; Quotation_Mark # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F ; Quotation_Mark # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +FE41 ; Quotation_Mark # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; Quotation_Mark # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; Quotation_Mark # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; Quotation_Mark # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FF02 ; Quotation_Mark # Po FULLWIDTH QUOTATION MARK +FF07 ; Quotation_Mark # Po FULLWIDTH APOSTROPHE +FF62 ; Quotation_Mark # Ps HALFWIDTH LEFT CORNER BRACKET +FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET + +# Total code points: 29 + +# ================================================ + +0021 ; Terminal_Punctuation # Po EXCLAMATION MARK +002C ; Terminal_Punctuation # Po COMMA +002E ; Terminal_Punctuation # Po FULL STOP +003A..003B ; Terminal_Punctuation # Po [2] COLON..SEMICOLON +003F ; Terminal_Punctuation # Po QUESTION MARK +037E ; Terminal_Punctuation # Po GREEK QUESTION MARK +0387 ; Terminal_Punctuation # Po GREEK ANO TELEIA +0589 ; Terminal_Punctuation # Po ARMENIAN FULL STOP +05C3 ; Terminal_Punctuation # Po HEBREW PUNCTUATION SOF PASUQ +060C ; Terminal_Punctuation # Po ARABIC COMMA +061B ; Terminal_Punctuation # Po ARABIC SEMICOLON +061F ; Terminal_Punctuation # Po ARABIC QUESTION MARK +06D4 ; Terminal_Punctuation # Po ARABIC FULL STOP +0700..070A ; Terminal_Punctuation # Po [11] SYRIAC END OF PARAGRAPH..SYRIAC CONTRACTION +070C ; Terminal_Punctuation # Po SYRIAC HARKLEAN METOBELUS +0964..0965 ; Terminal_Punctuation # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +0E5A..0E5B ; Terminal_Punctuation # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT +0F08 ; Terminal_Punctuation # Po TIBETAN MARK SBRUL SHAD +0F0D..0F12 ; Terminal_Punctuation # Po [6] TIBETAN MARK SHAD..TIBETAN MARK RGYA GRAM SHAD +104A..104B ; Terminal_Punctuation # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION +1361..1368 ; Terminal_Punctuation # Po [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR +166D..166E ; Terminal_Punctuation # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP +16EB..16ED ; Terminal_Punctuation # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION +17D4..17D6 ; Terminal_Punctuation # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH +17DA ; Terminal_Punctuation # Po KHMER SIGN KOOMUUT +1802..1805 ; Terminal_Punctuation # Po [4] MONGOLIAN COMMA..MONGOLIAN FOUR DOTS +1808..1809 ; Terminal_Punctuation # Po [2] MONGOLIAN MANCHU COMMA..MONGOLIAN MANCHU FULL STOP +1944..1945 ; Terminal_Punctuation # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +203C..203D ; Terminal_Punctuation # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG +2047..2049 ; Terminal_Punctuation # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK +3001..3002 ; Terminal_Punctuation # Po [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP +FE50..FE52 ; Terminal_Punctuation # Po [3] SMALL COMMA..SMALL FULL STOP +FE54..FE57 ; Terminal_Punctuation # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK +FF01 ; Terminal_Punctuation # Po FULLWIDTH EXCLAMATION MARK +FF0C ; Terminal_Punctuation # Po FULLWIDTH COMMA +FF0E ; Terminal_Punctuation # Po FULLWIDTH FULL STOP +FF1A..FF1B ; Terminal_Punctuation # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON +FF1F ; Terminal_Punctuation # Po FULLWIDTH QUESTION MARK +FF61 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC FULL STOP +FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA + +# Total code points: 86 + +# ================================================ + +005E ; Other_Math # Sk CIRCUMFLEX ACCENT +03D0..03D2 ; Other_Math # L& [3] GREEK BETA SYMBOL..GREEK UPSILON WITH HOOK SYMBOL +03D5 ; Other_Math # L& GREEK PHI SYMBOL +03F0..03F1 ; Other_Math # L& [2] GREEK KAPPA SYMBOL..GREEK RHO SYMBOL +03F4..03F5 ; Other_Math # L& [2] GREEK CAPITAL THETA SYMBOL..GREEK LUNATE EPSILON SYMBOL +2016 ; Other_Math # Po DOUBLE VERTICAL LINE +2032..2034 ; Other_Math # Po [3] PRIME..TRIPLE PRIME +2040 ; Other_Math # Pc CHARACTER TIE +2061..2063 ; Other_Math # Cf [3] FUNCTION APPLICATION..INVISIBLE SEPARATOR +207D ; Other_Math # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; Other_Math # Pe SUPERSCRIPT RIGHT PARENTHESIS +208D ; Other_Math # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; Other_Math # Pe SUBSCRIPT RIGHT PARENTHESIS +20D0..20DC ; Other_Math # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20E1 ; Other_Math # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E5..20E6 ; Other_Math # Mn [2] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING DOUBLE VERTICAL STROKE OVERLAY +2102 ; Other_Math # L& DOUBLE-STRUCK CAPITAL C +210A..2113 ; Other_Math # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2115 ; Other_Math # L& DOUBLE-STRUCK CAPITAL N +2119..211D ; Other_Math # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +2124 ; Other_Math # L& DOUBLE-STRUCK CAPITAL Z +2128 ; Other_Math # L& BLACK-LETTER CAPITAL Z +2129 ; Other_Math # So TURNED GREEK SMALL LETTER IOTA +212C..212D ; Other_Math # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C +212F..2131 ; Other_Math # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F +2133..2134 ; Other_Math # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O +2135..2138 ; Other_Math # Lo [4] ALEF SYMBOL..DALET SYMBOL +213C..213F ; Other_Math # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2145..2149 ; Other_Math # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +23B7 ; Other_Math # So RADICAL SYMBOL BOTTOM +23D0 ; Other_Math # So VERTICAL LINE EXTENSION +27C5 ; Other_Math # Ps LEFT S-SHAPED BAG DELIMITER +27C6 ; Other_Math # Pe RIGHT S-SHAPED BAG DELIMITER +27E6 ; Other_Math # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; Other_Math # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; Other_Math # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; Other_Math # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; Other_Math # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; Other_Math # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +2983 ; Other_Math # Ps LEFT WHITE CURLY BRACKET +2984 ; Other_Math # Pe RIGHT WHITE CURLY BRACKET +2985 ; Other_Math # Ps LEFT WHITE PARENTHESIS +2986 ; Other_Math # Pe RIGHT WHITE PARENTHESIS +2987 ; Other_Math # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; Other_Math # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; Other_Math # Ps Z NOTATION LEFT BINDING BRACKET +298A ; Other_Math # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; Other_Math # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; Other_Math # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; Other_Math # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; Other_Math # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; Other_Math # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; Other_Math # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; Other_Math # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; Other_Math # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; Other_Math # Ps LEFT ARC LESS-THAN BRACKET +2994 ; Other_Math # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; Other_Math # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; Other_Math # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; Other_Math # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; Other_Math # Pe RIGHT BLACK TORTOISE SHELL BRACKET +29D8 ; Other_Math # Ps LEFT WIGGLY FENCE +29D9 ; Other_Math # Pe RIGHT WIGGLY FENCE +29DA ; Other_Math # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; Other_Math # Pe RIGHT DOUBLE WIGGLY FENCE +29FC ; Other_Math # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; Other_Math # Pe RIGHT-POINTING CURVED ANGLE BRACKET +FE61 ; Other_Math # Po SMALL ASTERISK +FE63 ; Other_Math # Pd SMALL HYPHEN-MINUS +FE68 ; Other_Math # Po SMALL REVERSE SOLIDUS +FF3C ; Other_Math # Po FULLWIDTH REVERSE SOLIDUS +FF3E ; Other_Math # Sk FULLWIDTH CIRCUMFLEX ACCENT +1D400..1D454 ; Other_Math # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; Other_Math # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; Other_Math # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; Other_Math # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; Other_Math # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; Other_Math # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; Other_Math # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; Other_Math # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; Other_Math # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; Other_Math # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; Other_Math # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; Other_Math # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; Other_Math # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; Other_Math # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; Other_Math # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; Other_Math # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; Other_Math # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; Other_Math # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A3 ; Other_Math # L& [338] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL MONOSPACE SMALL Z +1D6A8..1D6C0 ; Other_Math # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C2..1D6DA ; Other_Math # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DC..1D6FA ; Other_Math # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FC..1D714 ; Other_Math # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D716..1D734 ; Other_Math # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D736..1D74E ; Other_Math # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D750..1D76E ; Other_Math # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D770..1D788 ; Other_Math # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D78A..1D7A8 ; Other_Math # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7AA..1D7C2 ; Other_Math # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C4..1D7C9 ; Other_Math # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +1D7CE..1D7FF ; Other_Math # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE + +# Total code points: 1102 + +# ================================================ + +0030..0039 ; Hex_Digit # Nd [10] DIGIT ZERO..DIGIT NINE +0041..0046 ; Hex_Digit # L& [6] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER F +0061..0066 ; Hex_Digit # L& [6] LATIN SMALL LETTER A..LATIN SMALL LETTER F +FF10..FF19 ; Hex_Digit # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF21..FF26 ; Hex_Digit # L& [6] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER F +FF41..FF46 ; Hex_Digit # L& [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER F + +# Total code points: 44 + +# ================================================ + +0030..0039 ; ASCII_Hex_Digit # Nd [10] DIGIT ZERO..DIGIT NINE +0041..0046 ; ASCII_Hex_Digit # L& [6] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER F +0061..0066 ; ASCII_Hex_Digit # L& [6] LATIN SMALL LETTER A..LATIN SMALL LETTER F + +# Total code points: 22 + +# ================================================ + +0345 ; Other_Alphabetic # Mn COMBINING GREEK YPOGEGRAMMENI +05B0..05B9 ; Other_Alphabetic # Mn [10] HEBREW POINT SHEVA..HEBREW POINT HOLAM +05BB..05BD ; Other_Alphabetic # Mn [3] HEBREW POINT QUBUTS..HEBREW POINT METEG +05BF ; Other_Alphabetic # Mn HEBREW POINT RAFE +05C1..05C2 ; Other_Alphabetic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C4..05C5 ; Other_Alphabetic # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C7 ; Other_Alphabetic # Mn HEBREW POINT QAMATS QATAN +0610..0615 ; Other_Alphabetic # Mn [6] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH +064B..0657 ; Other_Alphabetic # Mn [13] ARABIC FATHATAN..ARABIC INVERTED DAMMA +0659..065E ; Other_Alphabetic # Mn [6] ARABIC ZWARAKAY..ARABIC FATHA WITH TWO DOTS +0670 ; Other_Alphabetic # Mn ARABIC LETTER SUPERSCRIPT ALEF +06D6..06DC ; Other_Alphabetic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06E1..06E4 ; Other_Alphabetic # Mn [4] ARABIC SMALL HIGH DOTLESS HEAD OF KHAH..ARABIC SMALL HIGH MADDA +06E7..06E8 ; Other_Alphabetic # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06ED ; Other_Alphabetic # Mn ARABIC SMALL LOW MEEM +0711 ; Other_Alphabetic # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0730..073F ; Other_Alphabetic # Mn [16] SYRIAC PTHAHA ABOVE..SYRIAC RWAHA +07A6..07B0 ; Other_Alphabetic # Mn [11] THAANA ABAFILI..THAANA SUKUN +0901..0902 ; Other_Alphabetic # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA +0903 ; Other_Alphabetic # Mc DEVANAGARI SIGN VISARGA +093E..0940 ; Other_Alphabetic # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0941..0948 ; Other_Alphabetic # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +0949..094C ; Other_Alphabetic # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +0962..0963 ; Other_Alphabetic # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0981 ; Other_Alphabetic # Mn BENGALI SIGN CANDRABINDU +0982..0983 ; Other_Alphabetic # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +09BE..09C0 ; Other_Alphabetic # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C1..09C4 ; Other_Alphabetic # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09C7..09C8 ; Other_Alphabetic # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC ; Other_Alphabetic # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09D7 ; Other_Alphabetic # Mc BENGALI AU LENGTH MARK +09E2..09E3 ; Other_Alphabetic # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +0A01..0A02 ; Other_Alphabetic # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A03 ; Other_Alphabetic # Mc GURMUKHI SIGN VISARGA +0A3E..0A40 ; Other_Alphabetic # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A41..0A42 ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4C ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN OO..GURMUKHI VOWEL SIGN AU +0A70..0A71 ; Other_Alphabetic # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A81..0A82 ; Other_Alphabetic # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0A83 ; Other_Alphabetic # Mc GUJARATI SIGN VISARGA +0ABE..0AC0 ; Other_Alphabetic # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC1..0AC5 ; Other_Alphabetic # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; Other_Alphabetic # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0AC9 ; Other_Alphabetic # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC ; Other_Alphabetic # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0AE2..0AE3 ; Other_Alphabetic # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0B01 ; Other_Alphabetic # Mn ORIYA SIGN CANDRABINDU +0B02..0B03 ; Other_Alphabetic # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +0B3E ; Other_Alphabetic # Mc ORIYA VOWEL SIGN AA +0B3F ; Other_Alphabetic # Mn ORIYA VOWEL SIGN I +0B40 ; Other_Alphabetic # Mc ORIYA VOWEL SIGN II +0B41..0B43 ; Other_Alphabetic # Mn [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R +0B47..0B48 ; Other_Alphabetic # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C ; Other_Alphabetic # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B56 ; Other_Alphabetic # Mn ORIYA AI LENGTH MARK +0B57 ; Other_Alphabetic # Mc ORIYA AU LENGTH MARK +0B82 ; Other_Alphabetic # Mn TAMIL SIGN ANUSVARA +0BBE..0BBF ; Other_Alphabetic # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC0 ; Other_Alphabetic # Mn TAMIL VOWEL SIGN II +0BC1..0BC2 ; Other_Alphabetic # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8 ; Other_Alphabetic # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC ; Other_Alphabetic # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BD7 ; Other_Alphabetic # Mc TAMIL AU LENGTH MARK +0C01..0C03 ; Other_Alphabetic # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C3E..0C40 ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C41..0C44 ; Other_Alphabetic # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C46..0C48 ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4C ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN O..TELUGU VOWEL SIGN AU +0C55..0C56 ; Other_Alphabetic # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C82..0C83 ; Other_Alphabetic # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0CBE ; Other_Alphabetic # Mc KANNADA VOWEL SIGN AA +0CBF ; Other_Alphabetic # Mn KANNADA VOWEL SIGN I +0CC0..0CC4 ; Other_Alphabetic # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6 ; Other_Alphabetic # Mn KANNADA VOWEL SIGN E +0CC7..0CC8 ; Other_Alphabetic # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; Other_Alphabetic # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CCC ; Other_Alphabetic # Mn KANNADA VOWEL SIGN AU +0CD5..0CD6 ; Other_Alphabetic # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0D02..0D03 ; Other_Alphabetic # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D3E..0D40 ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II +0D41..0D43 ; Other_Alphabetic # Mn [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R +0D46..0D48 ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D4A..0D4C ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0D57 ; Other_Alphabetic # Mc MALAYALAM AU LENGTH MARK +0D82..0D83 ; Other_Alphabetic # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0DCF..0DD1 ; Other_Alphabetic # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2..0DD4 ; Other_Alphabetic # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; Other_Alphabetic # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8..0DDF ; Other_Alphabetic # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DF2..0DF3 ; Other_Alphabetic # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0E31 ; Other_Alphabetic # Mn THAI CHARACTER MAI HAN-AKAT +0E34..0E3A ; Other_Alphabetic # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E4D ; Other_Alphabetic # Mn THAI CHARACTER NIKHAHIT +0EB1 ; Other_Alphabetic # Mn LAO VOWEL SIGN MAI KAN +0EB4..0EB9 ; Other_Alphabetic # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU +0EBB..0EBC ; Other_Alphabetic # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO +0ECD ; Other_Alphabetic # Mn LAO NIGGAHITA +0F71..0F7E ; Other_Alphabetic # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F7F ; Other_Alphabetic # Mc TIBETAN SIGN RNAM BCAD +0F80..0F81 ; Other_Alphabetic # Mn [2] TIBETAN VOWEL SIGN REVERSED I..TIBETAN VOWEL SIGN REVERSED II +0F90..0F97 ; Other_Alphabetic # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; Other_Alphabetic # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +102C ; Other_Alphabetic # Mc MYANMAR VOWEL SIGN AA +102D..1030 ; Other_Alphabetic # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1031 ; Other_Alphabetic # Mc MYANMAR VOWEL SIGN E +1032 ; Other_Alphabetic # Mn MYANMAR VOWEL SIGN AI +1036 ; Other_Alphabetic # Mn MYANMAR SIGN ANUSVARA +1038 ; Other_Alphabetic # Mc MYANMAR SIGN VISARGA +1056..1057 ; Other_Alphabetic # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +1058..1059 ; Other_Alphabetic # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +135F ; Other_Alphabetic # Mn ETHIOPIC COMBINING GEMINATION MARK +1712..1713 ; Other_Alphabetic # Mn [2] TAGALOG VOWEL SIGN I..TAGALOG VOWEL SIGN U +1732..1733 ; Other_Alphabetic # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U +1752..1753 ; Other_Alphabetic # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1772..1773 ; Other_Alphabetic # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +17B6 ; Other_Alphabetic # Mc KHMER VOWEL SIGN AA +17B7..17BD ; Other_Alphabetic # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17BE..17C5 ; Other_Alphabetic # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C6 ; Other_Alphabetic # Mn KHMER SIGN NIKAHIT +17C7..17C8 ; Other_Alphabetic # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +18A9 ; Other_Alphabetic # Mn MONGOLIAN LETTER ALI GALI DAGALGA +1920..1922 ; Other_Alphabetic # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1923..1926 ; Other_Alphabetic # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1927..1928 ; Other_Alphabetic # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B ; Other_Alphabetic # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931 ; Other_Alphabetic # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1932 ; Other_Alphabetic # Mn LIMBU SMALL LETTER ANUSVARA +1933..1938 ; Other_Alphabetic # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +19B0..19C0 ; Other_Alphabetic # Mc [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY +19C8..19C9 ; Other_Alphabetic # Mc [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2 +1A17..1A18 ; Other_Alphabetic # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A19..1A1B ; Other_Alphabetic # Mc [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE +24B6..24E9 ; Other_Alphabetic # So [52] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN SMALL LETTER Z +A823..A824 ; Other_Alphabetic # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +A825..A826 ; Other_Alphabetic # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A827 ; Other_Alphabetic # Mc SYLOTI NAGRI VOWEL SIGN OO +FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA +10A01..10A03 ; Other_Alphabetic # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06 ; Other_Alphabetic # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F ; Other_Alphabetic # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA + +# Total code points: 488 + +# ================================================ + +3006 ; Ideographic # Lo IDEOGRAPHIC CLOSING MARK +3007 ; Ideographic # Nl IDEOGRAPHIC NUMBER ZERO +3021..3029 ; Ideographic # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +3038..303A ; Ideographic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +3400..4DB5 ; Ideographic # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 +4E00..9FBB ; Ideographic # Lo [20924] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FBB +F900..FA2D ; Ideographic # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D +FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +20000..2A6D6 ; Ideographic # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 +2F800..2FA1D ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D + +# Total code points: 71181 + +# ================================================ + +005E ; Diacritic # Sk CIRCUMFLEX ACCENT +0060 ; Diacritic # Sk GRAVE ACCENT +00A8 ; Diacritic # Sk DIAERESIS +00AF ; Diacritic # Sk MACRON +00B4 ; Diacritic # Sk ACUTE ACCENT +00B7 ; Diacritic # Po MIDDLE DOT +00B8 ; Diacritic # Sk CEDILLA +02B0..02C1 ; Diacritic # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C5 ; Diacritic # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD +02C6..02D1 ; Diacritic # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02DF ; Diacritic # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT +02E0..02E4 ; Diacritic # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02E5..02ED ; Diacritic # Sk [9] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER UNASPIRATED +02EE ; Diacritic # Lm MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF ; Diacritic # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +0300..034E ; Diacritic # Mn [79] COMBINING GRAVE ACCENT..COMBINING UPWARDS ARROW BELOW +0350..0357 ; Diacritic # Mn [8] COMBINING RIGHT ARROWHEAD ABOVE..COMBINING RIGHT HALF RING ABOVE +035D..0362 ; Diacritic # Mn [6] COMBINING DOUBLE BREVE..COMBINING DOUBLE RIGHTWARDS ARROW BELOW +0374..0375 ; Diacritic # Sk [2] GREEK NUMERAL SIGN..GREEK LOWER NUMERAL SIGN +037A ; Diacritic # Lm GREEK YPOGEGRAMMENI +0384..0385 ; Diacritic # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS +0483..0486 ; Diacritic # Mn [4] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA +0559 ; Diacritic # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0591..05A1 ; Diacritic # Mn [17] HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER +05A3..05B9 ; Diacritic # Mn [23] HEBREW ACCENT MUNAH..HEBREW POINT HOLAM +05BB..05BD ; Diacritic # Mn [3] HEBREW POINT QUBUTS..HEBREW POINT METEG +05BF ; Diacritic # Mn HEBREW POINT RAFE +05C1..05C2 ; Diacritic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C4 ; Diacritic # Mn HEBREW MARK UPPER DOT +064B..0652 ; Diacritic # Mn [8] ARABIC FATHATAN..ARABIC SUKUN +0657..0658 ; Diacritic # Mn [2] ARABIC INVERTED DAMMA..ARABIC MARK NOON GHUNNA +06DF..06E0 ; Diacritic # Mn [2] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO +06E5..06E6 ; Diacritic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06EA..06EC ; Diacritic # Mn [3] ARABIC EMPTY CENTRE LOW STOP..ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE +0730..074A ; Diacritic # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +07A6..07B0 ; Diacritic # Mn [11] THAANA ABAFILI..THAANA SUKUN +093C ; Diacritic # Mn DEVANAGARI SIGN NUKTA +094D ; Diacritic # Mn DEVANAGARI SIGN VIRAMA +0951..0954 ; Diacritic # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT +09BC ; Diacritic # Mn BENGALI SIGN NUKTA +09CD ; Diacritic # Mn BENGALI SIGN VIRAMA +0A3C ; Diacritic # Mn GURMUKHI SIGN NUKTA +0A4D ; Diacritic # Mn GURMUKHI SIGN VIRAMA +0ABC ; Diacritic # Mn GUJARATI SIGN NUKTA +0ACD ; Diacritic # Mn GUJARATI SIGN VIRAMA +0B3C ; Diacritic # Mn ORIYA SIGN NUKTA +0B4D ; Diacritic # Mn ORIYA SIGN VIRAMA +0BCD ; Diacritic # Mn TAMIL SIGN VIRAMA +0C4D ; Diacritic # Mn TELUGU SIGN VIRAMA +0CBC ; Diacritic # Mn KANNADA SIGN NUKTA +0CCD ; Diacritic # Mn KANNADA SIGN VIRAMA +0D4D ; Diacritic # Mn MALAYALAM SIGN VIRAMA +0DCA ; Diacritic # Mn SINHALA SIGN AL-LAKUNA +0E47..0E4C ; Diacritic # Mn [6] THAI CHARACTER MAITAIKHU..THAI CHARACTER THANTHAKHAT +0E4E ; Diacritic # Mn THAI CHARACTER YAMAKKAN +0EC8..0ECC ; Diacritic # Mn [5] LAO TONE MAI EK..LAO CANCELLATION MARK +0F18..0F19 ; Diacritic # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F35 ; Diacritic # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F37 ; Diacritic # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F39 ; Diacritic # Mn TIBETAN MARK TSA -PHRU +0F3E..0F3F ; Diacritic # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F82..0F84 ; Diacritic # Mn [3] TIBETAN SIGN NYI ZLA NAA DA..TIBETAN MARK HALANTA +0F86..0F87 ; Diacritic # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0FC6 ; Diacritic # Mn TIBETAN SYMBOL PADMA GDAN +1037 ; Diacritic # Mn MYANMAR SIGN DOT BELOW +1039 ; Diacritic # Mn MYANMAR SIGN VIRAMA +17C9..17D3 ; Diacritic # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17DD ; Diacritic # Mn KHMER SIGN ATTHACAN +1939..193B ; Diacritic # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1D2C..1D61 ; Diacritic # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI +1D62..1D6A ; Diacritic # L& [9] LATIN SUBSCRIPT SMALL LETTER I..GREEK SUBSCRIPT SMALL LETTER CHI +1FBD ; Diacritic # Sk GREEK KORONIS +1FBF..1FC1 ; Diacritic # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +1FCD..1FCF ; Diacritic # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FDD..1FDF ; Diacritic # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FED..1FEF ; Diacritic # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FFD..1FFE ; Diacritic # Sk [2] GREEK OXIA..GREEK DASIA +302A..302F ; Diacritic # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK +3099..309A ; Diacritic # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309B..309C ; Diacritic # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +30FC ; Diacritic # Lm KATAKANA-HIRAGANA PROLONGED SOUND MARK +FB1E ; Diacritic # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FE20..FE23 ; Diacritic # Mn [4] COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF +FF3E ; Diacritic # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF40 ; Diacritic # Sk FULLWIDTH GRAVE ACCENT +FF70 ; Diacritic # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF9E..FF9F ; Diacritic # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFE3 ; Diacritic # Sk FULLWIDTH MACRON +1D167..1D169 ; Diacritic # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16D..1D172 ; Diacritic # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D17B..1D182 ; Diacritic # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D185..1D18B ; Diacritic # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D1AA..1D1AD ; Diacritic # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO + +# Total code points: 482 + +# ================================================ + +00B7 ; Extender # Po MIDDLE DOT +02D0..02D1 ; Extender # Lm [2] MODIFIER LETTER TRIANGULAR COLON..MODIFIER LETTER HALF TRIANGULAR COLON +0640 ; Extender # Lm ARABIC TATWEEL +0E46 ; Extender # Lm THAI CHARACTER MAIYAMOK +0EC6 ; Extender # Lm LAO KO LA +1843 ; Extender # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +3005 ; Extender # Lm IDEOGRAPHIC ITERATION MARK +3031..3035 ; Extender # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +309D..309E ; Extender # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +30FC..30FE ; Extender # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK +A015 ; Extender # Lm YI SYLLABLE WU +FF70 ; Extender # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK + +# Total code points: 20 + +# ================================================ + +02B0..02B8 ; Other_Lowercase # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y +02C0..02C1 ; Other_Lowercase # Lm [2] MODIFIER LETTER GLOTTAL STOP..MODIFIER LETTER REVERSED GLOTTAL STOP +02E0..02E4 ; Other_Lowercase # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +0345 ; Other_Lowercase # Mn COMBINING GREEK YPOGEGRAMMENI +037A ; Other_Lowercase # Lm GREEK YPOGEGRAMMENI +1D2C..1D61 ; Other_Lowercase # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI +1D78 ; Other_Lowercase # Lm MODIFIER LETTER CYRILLIC EN +1D9B..1DBF ; Other_Lowercase # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +2090..2094 ; Other_Lowercase # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA +2170..217F ; Other_Lowercase # Nl [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND +24D0..24E9 ; Other_Lowercase # So [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z + +# Total code points: 157 + +# ================================================ + +2160..216F ; Other_Uppercase # Nl [16] ROMAN NUMERAL ONE..ROMAN NUMERAL ONE THOUSAND +24B6..24CF ; Other_Uppercase # So [26] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN CAPITAL LETTER Z + +# Total code points: 42 + +# ================================================ + +FDD0..FDEF ; Noncharacter_Code_Point # Cn [32] <noncharacter-FDD0>..<noncharacter-FDEF> +FFFE..FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-FFFE>..<noncharacter-FFFF> +1FFFE..1FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-1FFFE>..<noncharacter-1FFFF> +2FFFE..2FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-2FFFE>..<noncharacter-2FFFF> +3FFFE..3FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-3FFFE>..<noncharacter-3FFFF> +4FFFE..4FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-4FFFE>..<noncharacter-4FFFF> +5FFFE..5FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-5FFFE>..<noncharacter-5FFFF> +6FFFE..6FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-6FFFE>..<noncharacter-6FFFF> +7FFFE..7FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-7FFFE>..<noncharacter-7FFFF> +8FFFE..8FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-8FFFE>..<noncharacter-8FFFF> +9FFFE..9FFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-9FFFE>..<noncharacter-9FFFF> +AFFFE..AFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-AFFFE>..<noncharacter-AFFFF> +BFFFE..BFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-BFFFE>..<noncharacter-BFFFF> +CFFFE..CFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-CFFFE>..<noncharacter-CFFFF> +DFFFE..DFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-DFFFE>..<noncharacter-DFFFF> +EFFFE..EFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-EFFFE>..<noncharacter-EFFFF> +FFFFE..FFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-FFFFE>..<noncharacter-FFFFF> +10FFFE..10FFFF; Noncharacter_Code_Point # Cn [2] <noncharacter-10FFFE>..<noncharacter-10FFFF> + +# Total code points: 66 + +# ================================================ + +09BE ; Other_Grapheme_Extend # Mc BENGALI VOWEL SIGN AA +09D7 ; Other_Grapheme_Extend # Mc BENGALI AU LENGTH MARK +0B3E ; Other_Grapheme_Extend # Mc ORIYA VOWEL SIGN AA +0B57 ; Other_Grapheme_Extend # Mc ORIYA AU LENGTH MARK +0BBE ; Other_Grapheme_Extend # Mc TAMIL VOWEL SIGN AA +0BD7 ; Other_Grapheme_Extend # Mc TAMIL AU LENGTH MARK +0CC2 ; Other_Grapheme_Extend # Mc KANNADA VOWEL SIGN UU +0CD5..0CD6 ; Other_Grapheme_Extend # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0D3E ; Other_Grapheme_Extend # Mc MALAYALAM VOWEL SIGN AA +0D57 ; Other_Grapheme_Extend # Mc MALAYALAM AU LENGTH MARK +0DCF ; Other_Grapheme_Extend # Mc SINHALA VOWEL SIGN AELA-PILLA +0DDF ; Other_Grapheme_Extend # Mc SINHALA VOWEL SIGN GAYANUKITTA +200C..200D ; Other_Grapheme_Extend # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER +1D165 ; Other_Grapheme_Extend # Mc MUSICAL SYMBOL COMBINING STEM +1D16E..1D172 ; Other_Grapheme_Extend # Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 + +# Total code points: 21 + +# ================================================ + +034F ; Grapheme_Link # Mn COMBINING GRAPHEME JOINER +094D ; Grapheme_Link # Mn DEVANAGARI SIGN VIRAMA +09CD ; Grapheme_Link # Mn BENGALI SIGN VIRAMA +0A4D ; Grapheme_Link # Mn GURMUKHI SIGN VIRAMA +0ACD ; Grapheme_Link # Mn GUJARATI SIGN VIRAMA +0B4D ; Grapheme_Link # Mn ORIYA SIGN VIRAMA +0BCD ; Grapheme_Link # Mn TAMIL SIGN VIRAMA +0C4D ; Grapheme_Link # Mn TELUGU SIGN VIRAMA +0CCD ; Grapheme_Link # Mn KANNADA SIGN VIRAMA +0D4D ; Grapheme_Link # Mn MALAYALAM SIGN VIRAMA +0DCA ; Grapheme_Link # Mn SINHALA SIGN AL-LAKUNA +0E3A ; Grapheme_Link # Mn THAI CHARACTER PHINTHU +1039 ; Grapheme_Link # Mn MYANMAR SIGN VIRAMA +17D2 ; Grapheme_Link # Mn KHMER SIGN COENG +A806 ; Grapheme_Link # Mn SYLOTI NAGRI SIGN HASANTA +10A3F ; Grapheme_Link # Mn KHAROSHTHI VIRAMA + +# Total code points: 16 + +# ================================================ + +2FF0..2FF1 ; IDS_Binary_Operator # So [2] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW +2FF4..2FFB ; IDS_Binary_Operator # So [8] IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID + +# Total code points: 10 + +# ================================================ + +2FF2..2FF3 ; IDS_Trinary_Operator # So [2] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW + +# Total code points: 2 + +# ================================================ + +2E80..2E99 ; Radical # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP +2E9B..2EF3 ; Radical # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE +2F00..2FD5 ; Radical # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE + +# Total code points: 329 + +# ================================================ + +3400..4DB5 ; Unified_Ideograph # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 +4E00..9FBB ; Unified_Ideograph # Lo [20924] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FBB +FA0E..FA0F ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F +FA11 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA11 +FA13..FA14 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14 +FA1F ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA1F +FA21 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA21 +FA23..FA24 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA23..CJK COMPATIBILITY IDEOGRAPH-FA24 +FA27..FA29 ; Unified_Ideograph # Lo [3] CJK COMPATIBILITY IDEOGRAPH-FA27..CJK COMPATIBILITY IDEOGRAPH-FA29 +20000..2A6D6 ; Unified_Ideograph # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 + +# Total code points: 70229 + +# ================================================ + +034F ; Other_Default_Ignorable_Code_Point # Mn COMBINING GRAPHEME JOINER +115F..1160 ; Other_Default_Ignorable_Code_Point # Lo [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER +2064..2069 ; Other_Default_Ignorable_Code_Point # Cn [6] <reserved-2064>..<reserved-2069> +3164 ; Other_Default_Ignorable_Code_Point # Lo HANGUL FILLER +FFA0 ; Other_Default_Ignorable_Code_Point # Lo HALFWIDTH HANGUL FILLER +FFF0..FFF8 ; Other_Default_Ignorable_Code_Point # Cn [9] <reserved-FFF0>..<reserved-FFF8> +E0000 ; Other_Default_Ignorable_Code_Point # Cn <reserved-E0000> +E0002..E001F ; Other_Default_Ignorable_Code_Point # Cn [30] <reserved-E0002>..<reserved-E001F> +E0080..E00FF ; Other_Default_Ignorable_Code_Point # Cn [128] <reserved-E0080>..<reserved-E00FF> +E01F0..E0FFF ; Other_Default_Ignorable_Code_Point # Cn [3600] <reserved-E01F0>..<reserved-E0FFF> + +# Total code points: 3779 + +# ================================================ + +0340..0341 ; Deprecated # Mn [2] COMBINING GRAVE TONE MARK..COMBINING ACUTE TONE MARK +17A3 ; Deprecated # Lo KHMER INDEPENDENT VOWEL QAQ +17D3 ; Deprecated # Mn KHMER SIGN BATHAMASAT +206A..206F ; Deprecated # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES + +# Total code points: 10 + +# ================================================ + +0069..006A ; Soft_Dotted # L& [2] LATIN SMALL LETTER I..LATIN SMALL LETTER J +012F ; Soft_Dotted # L& LATIN SMALL LETTER I WITH OGONEK +0268 ; Soft_Dotted # L& LATIN SMALL LETTER I WITH STROKE +029D ; Soft_Dotted # L& LATIN SMALL LETTER J WITH CROSSED-TAIL +02B2 ; Soft_Dotted # Lm MODIFIER LETTER SMALL J +03F3 ; Soft_Dotted # L& GREEK LETTER YOT +0456 ; Soft_Dotted # L& CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0458 ; Soft_Dotted # L& CYRILLIC SMALL LETTER JE +1D62 ; Soft_Dotted # L& LATIN SUBSCRIPT SMALL LETTER I +1D96 ; Soft_Dotted # L& LATIN SMALL LETTER I WITH RETROFLEX HOOK +1DA4 ; Soft_Dotted # Lm MODIFIER LETTER SMALL I WITH STROKE +1DA8 ; Soft_Dotted # Lm MODIFIER LETTER SMALL J WITH CROSSED-TAIL +1E2D ; Soft_Dotted # L& LATIN SMALL LETTER I WITH TILDE BELOW +1ECB ; Soft_Dotted # L& LATIN SMALL LETTER I WITH DOT BELOW +2071 ; Soft_Dotted # L& SUPERSCRIPT LATIN SMALL LETTER I +2148..2149 ; Soft_Dotted # L& [2] DOUBLE-STRUCK ITALIC SMALL I..DOUBLE-STRUCK ITALIC SMALL J +1D422..1D423 ; Soft_Dotted # L& [2] MATHEMATICAL BOLD SMALL I..MATHEMATICAL BOLD SMALL J +1D456..1D457 ; Soft_Dotted # L& [2] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL ITALIC SMALL J +1D48A..1D48B ; Soft_Dotted # L& [2] MATHEMATICAL BOLD ITALIC SMALL I..MATHEMATICAL BOLD ITALIC SMALL J +1D4BE..1D4BF ; Soft_Dotted # L& [2] MATHEMATICAL SCRIPT SMALL I..MATHEMATICAL SCRIPT SMALL J +1D4F2..1D4F3 ; Soft_Dotted # L& [2] MATHEMATICAL BOLD SCRIPT SMALL I..MATHEMATICAL BOLD SCRIPT SMALL J +1D526..1D527 ; Soft_Dotted # L& [2] MATHEMATICAL FRAKTUR SMALL I..MATHEMATICAL FRAKTUR SMALL J +1D55A..1D55B ; Soft_Dotted # L& [2] MATHEMATICAL DOUBLE-STRUCK SMALL I..MATHEMATICAL DOUBLE-STRUCK SMALL J +1D58E..1D58F ; Soft_Dotted # L& [2] MATHEMATICAL BOLD FRAKTUR SMALL I..MATHEMATICAL BOLD FRAKTUR SMALL J +1D5C2..1D5C3 ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF SMALL I..MATHEMATICAL SANS-SERIF SMALL J +1D5F6..1D5F7 ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF BOLD SMALL I..MATHEMATICAL SANS-SERIF BOLD SMALL J +1D62A..1D62B ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF ITALIC SMALL I..MATHEMATICAL SANS-SERIF ITALIC SMALL J +1D65E..1D65F ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J +1D692..1D693 ; Soft_Dotted # L& [2] MATHEMATICAL MONOSPACE SMALL I..MATHEMATICAL MONOSPACE SMALL J + +# Total code points: 44 + +# ================================================ + +0E40..0E44 ; Logical_Order_Exception # Lo [5] THAI CHARACTER SARA E..THAI CHARACTER SARA AI MAIMALAI +0EC0..0EC4 ; Logical_Order_Exception # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI + +# Total code points: 10 + +# ================================================ + +2118 ; Other_ID_Start # So SCRIPT CAPITAL P +212E ; Other_ID_Start # So ESTIMATED SYMBOL +309B..309C ; Other_ID_Start # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + +# Total code points: 4 + +# ================================================ + +1369..1371 ; Other_ID_Continue # No [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE + +# Total code points: 9 + +# ================================================ + +0021 ; STerm # Po EXCLAMATION MARK +002E ; STerm # Po FULL STOP +003F ; STerm # Po QUESTION MARK +055C ; STerm # Po ARMENIAN EXCLAMATION MARK +055E ; STerm # Po ARMENIAN QUESTION MARK +0589 ; STerm # Po ARMENIAN FULL STOP +061F ; STerm # Po ARABIC QUESTION MARK +06D4 ; STerm # Po ARABIC FULL STOP +0700..0702 ; STerm # Po [3] SYRIAC END OF PARAGRAPH..SYRIAC SUBLINEAR FULL STOP +0964..0965 ; STerm # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +104A..104B ; STerm # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION +1362 ; STerm # Po ETHIOPIC FULL STOP +1367..1368 ; STerm # Po [2] ETHIOPIC QUESTION MARK..ETHIOPIC PARAGRAPH SEPARATOR +166E ; STerm # Po CANADIAN SYLLABICS FULL STOP +1803 ; STerm # Po MONGOLIAN FULL STOP +1809 ; STerm # Po MONGOLIAN MANCHU FULL STOP +1944..1945 ; STerm # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +203C..203D ; STerm # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG +2047..2049 ; STerm # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK +3002 ; STerm # Po IDEOGRAPHIC FULL STOP +FE52 ; STerm # Po SMALL FULL STOP +FE56..FE57 ; STerm # Po [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK +FF01 ; STerm # Po FULLWIDTH EXCLAMATION MARK +FF0E ; STerm # Po FULLWIDTH FULL STOP +FF1F ; STerm # Po FULLWIDTH QUESTION MARK +FF61 ; STerm # Po HALFWIDTH IDEOGRAPHIC FULL STOP + +# Total code points: 36 + +# ================================================ + +180B..180D ; Variation_Selector # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +FE00..FE0F ; Variation_Selector # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + +# Total code points: 259 + +# ================================================ + +0009..000D ; Pattern_White_Space # Cc [5] <control-0009>..<control-000D> +0020 ; Pattern_White_Space # Zs SPACE +0085 ; Pattern_White_Space # Cc <control-0085> +200E..200F ; Pattern_White_Space # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK +2028 ; Pattern_White_Space # Zl LINE SEPARATOR +2029 ; Pattern_White_Space # Zp PARAGRAPH SEPARATOR + +# Total code points: 11 + +# ================================================ + +0021..0023 ; Pattern_Syntax # Po [3] EXCLAMATION MARK..NUMBER SIGN +0024 ; Pattern_Syntax # Sc DOLLAR SIGN +0025..0027 ; Pattern_Syntax # Po [3] PERCENT SIGN..APOSTROPHE +0028 ; Pattern_Syntax # Ps LEFT PARENTHESIS +0029 ; Pattern_Syntax # Pe RIGHT PARENTHESIS +002A ; Pattern_Syntax # Po ASTERISK +002B ; Pattern_Syntax # Sm PLUS SIGN +002C ; Pattern_Syntax # Po COMMA +002D ; Pattern_Syntax # Pd HYPHEN-MINUS +002E..002F ; Pattern_Syntax # Po [2] FULL STOP..SOLIDUS +003A..003B ; Pattern_Syntax # Po [2] COLON..SEMICOLON +003C..003E ; Pattern_Syntax # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN +003F..0040 ; Pattern_Syntax # Po [2] QUESTION MARK..COMMERCIAL AT +005B ; Pattern_Syntax # Ps LEFT SQUARE BRACKET +005C ; Pattern_Syntax # Po REVERSE SOLIDUS +005D ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET +005E ; Pattern_Syntax # Sk CIRCUMFLEX ACCENT +0060 ; Pattern_Syntax # Sk GRAVE ACCENT +007B ; Pattern_Syntax # Ps LEFT CURLY BRACKET +007C ; Pattern_Syntax # Sm VERTICAL LINE +007D ; Pattern_Syntax # Pe RIGHT CURLY BRACKET +007E ; Pattern_Syntax # Sm TILDE +00A1 ; Pattern_Syntax # Po INVERTED EXCLAMATION MARK +00A2..00A5 ; Pattern_Syntax # Sc [4] CENT SIGN..YEN SIGN +00A6..00A7 ; Pattern_Syntax # So [2] BROKEN BAR..SECTION SIGN +00A9 ; Pattern_Syntax # So COPYRIGHT SIGN +00AB ; Pattern_Syntax # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC ; Pattern_Syntax # Sm NOT SIGN +00AE ; Pattern_Syntax # So REGISTERED SIGN +00B0 ; Pattern_Syntax # So DEGREE SIGN +00B1 ; Pattern_Syntax # Sm PLUS-MINUS SIGN +00B6 ; Pattern_Syntax # So PILCROW SIGN +00BB ; Pattern_Syntax # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BF ; Pattern_Syntax # Po INVERTED QUESTION MARK +00D7 ; Pattern_Syntax # Sm MULTIPLICATION SIGN +00F7 ; Pattern_Syntax # Sm DIVISION SIGN +2010..2015 ; Pattern_Syntax # Pd [6] HYPHEN..HORIZONTAL BAR +2016..2017 ; Pattern_Syntax # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE +2018 ; Pattern_Syntax # Pi LEFT SINGLE QUOTATION MARK +2019 ; Pattern_Syntax # Pf RIGHT SINGLE QUOTATION MARK +201A ; Pattern_Syntax # Ps SINGLE LOW-9 QUOTATION MARK +201B..201C ; Pattern_Syntax # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK +201D ; Pattern_Syntax # Pf RIGHT DOUBLE QUOTATION MARK +201E ; Pattern_Syntax # Ps DOUBLE LOW-9 QUOTATION MARK +201F ; Pattern_Syntax # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020..2027 ; Pattern_Syntax # Po [8] DAGGER..HYPHENATION POINT +2030..2038 ; Pattern_Syntax # Po [9] PER MILLE SIGN..CARET +2039 ; Pattern_Syntax # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; Pattern_Syntax # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B..203E ; Pattern_Syntax # Po [4] REFERENCE MARK..OVERLINE +2041..2043 ; Pattern_Syntax # Po [3] CARET INSERTION POINT..HYPHEN BULLET +2044 ; Pattern_Syntax # Sm FRACTION SLASH +2045 ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH QUILL +2046 ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH QUILL +2047..2051 ; Pattern_Syntax # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY +2052 ; Pattern_Syntax # Sm COMMERCIAL MINUS SIGN +2053 ; Pattern_Syntax # Po SWUNG DASH +2055..205E ; Pattern_Syntax # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS +2190..2194 ; Pattern_Syntax # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +2195..2199 ; Pattern_Syntax # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219A..219B ; Pattern_Syntax # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +219C..219F ; Pattern_Syntax # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A0 ; Pattern_Syntax # Sm RIGHTWARDS TWO HEADED ARROW +21A1..21A2 ; Pattern_Syntax # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A3 ; Pattern_Syntax # Sm RIGHTWARDS ARROW WITH TAIL +21A4..21A5 ; Pattern_Syntax # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A6 ; Pattern_Syntax # Sm RIGHTWARDS ARROW FROM BAR +21A7..21AD ; Pattern_Syntax # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW +21AE ; Pattern_Syntax # Sm LEFT RIGHT ARROW WITH STROKE +21AF..21CD ; Pattern_Syntax # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF ; Pattern_Syntax # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1 ; Pattern_Syntax # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D2 ; Pattern_Syntax # Sm RIGHTWARDS DOUBLE ARROW +21D3 ; Pattern_Syntax # So DOWNWARDS DOUBLE ARROW +21D4 ; Pattern_Syntax # Sm LEFT RIGHT DOUBLE ARROW +21D5..21F3 ; Pattern_Syntax # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW +21F4..22FF ; Pattern_Syntax # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP +2300..2307 ; Pattern_Syntax # So [8] DIAMETER SIGN..WAVY LINE +2308..230B ; Pattern_Syntax # Sm [4] LEFT CEILING..RIGHT FLOOR +230C..231F ; Pattern_Syntax # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER +2320..2321 ; Pattern_Syntax # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL +2322..2328 ; Pattern_Syntax # So [7] FROWN..KEYBOARD +2329 ; Pattern_Syntax # Ps LEFT-POINTING ANGLE BRACKET +232A ; Pattern_Syntax # Pe RIGHT-POINTING ANGLE BRACKET +232B..237B ; Pattern_Syntax # So [81] ERASE TO THE LEFT..NOT CHECK MARK +237C ; Pattern_Syntax # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D..239A ; Pattern_Syntax # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL +239B..23B3 ; Pattern_Syntax # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM +23B4 ; Pattern_Syntax # Ps TOP SQUARE BRACKET +23B5 ; Pattern_Syntax # Pe BOTTOM SQUARE BRACKET +23B6 ; Pattern_Syntax # Po BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET +23B7..23DB ; Pattern_Syntax # So [37] RADICAL SYMBOL BOTTOM..FUSE +23DC..23FF ; Pattern_Syntax # Cn [36] <reserved-23DC>..<reserved-23FF> +2400..2426 ; Pattern_Syntax # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO +2427..243F ; Pattern_Syntax # Cn [25] <reserved-2427>..<reserved-243F> +2440..244A ; Pattern_Syntax # So [11] OCR HOOK..OCR DOUBLE BACKSLASH +244B..245F ; Pattern_Syntax # Cn [21] <reserved-244B>..<reserved-245F> +2500..25B6 ; Pattern_Syntax # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE +25B7 ; Pattern_Syntax # Sm WHITE RIGHT-POINTING TRIANGLE +25B8..25C0 ; Pattern_Syntax # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE +25C1 ; Pattern_Syntax # Sm WHITE LEFT-POINTING TRIANGLE +25C2..25F7 ; Pattern_Syntax # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8..25FF ; Pattern_Syntax # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE +2600..266E ; Pattern_Syntax # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN +266F ; Pattern_Syntax # Sm MUSIC SHARP SIGN +2670..269C ; Pattern_Syntax # So [45] WEST SYRIAC CROSS..FLEUR-DE-LIS +269D..269F ; Pattern_Syntax # Cn [3] <reserved-269D>..<reserved-269F> +26A0..26B1 ; Pattern_Syntax # So [18] WARNING SIGN..FUNERAL URN +26B2..2700 ; Pattern_Syntax # Cn [79] <reserved-26B2>..<reserved-2700> +2701..2704 ; Pattern_Syntax # So [4] UPPER BLADE SCISSORS..WHITE SCISSORS +2705 ; Pattern_Syntax # Cn <reserved-2705> +2706..2709 ; Pattern_Syntax # So [4] TELEPHONE LOCATION SIGN..ENVELOPE +270A..270B ; Pattern_Syntax # Cn [2] <reserved-270A>..<reserved-270B> +270C..2727 ; Pattern_Syntax # So [28] VICTORY HAND..WHITE FOUR POINTED STAR +2728 ; Pattern_Syntax # Cn <reserved-2728> +2729..274B ; Pattern_Syntax # So [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274C ; Pattern_Syntax # Cn <reserved-274C> +274D ; Pattern_Syntax # So SHADOWED WHITE CIRCLE +274E ; Pattern_Syntax # Cn <reserved-274E> +274F..2752 ; Pattern_Syntax # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE +2753..2755 ; Pattern_Syntax # Cn [3] <reserved-2753>..<reserved-2755> +2756 ; Pattern_Syntax # So BLACK DIAMOND MINUS WHITE X +2757 ; Pattern_Syntax # Cn <reserved-2757> +2758..275E ; Pattern_Syntax # So [7] LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +275F..2760 ; Pattern_Syntax # Cn [2] <reserved-275F>..<reserved-2760> +2761..2767 ; Pattern_Syntax # So [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET +2768 ; Pattern_Syntax # Ps MEDIUM LEFT PARENTHESIS ORNAMENT +2769 ; Pattern_Syntax # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT +276A ; Pattern_Syntax # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B ; Pattern_Syntax # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C ; Pattern_Syntax # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D ; Pattern_Syntax # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E ; Pattern_Syntax # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F ; Pattern_Syntax # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 ; Pattern_Syntax # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 ; Pattern_Syntax # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 ; Pattern_Syntax # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 ; Pattern_Syntax # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 ; Pattern_Syntax # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 ; Pattern_Syntax # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT +2794 ; Pattern_Syntax # So HEAVY WIDE-HEADED RIGHTWARDS ARROW +2795..2797 ; Pattern_Syntax # Cn [3] <reserved-2795>..<reserved-2797> +2798..27AF ; Pattern_Syntax # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B0 ; Pattern_Syntax # Cn <reserved-27B0> +27B1..27BE ; Pattern_Syntax # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW +27BF ; Pattern_Syntax # Cn <reserved-27BF> +27C0..27C4 ; Pattern_Syntax # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET +27C5 ; Pattern_Syntax # Ps LEFT S-SHAPED BAG DELIMITER +27C6 ; Pattern_Syntax # Pe RIGHT S-SHAPED BAG DELIMITER +27C7..27CF ; Pattern_Syntax # Cn [9] <reserved-27C7>..<reserved-27CF> +27D0..27E5 ; Pattern_Syntax # Sm [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK +27E6 ; Pattern_Syntax # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; Pattern_Syntax # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; Pattern_Syntax # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; Pattern_Syntax # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; Pattern_Syntax # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; Pattern_Syntax # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC..27EF ; Pattern_Syntax # Cn [4] <reserved-27EC>..<reserved-27EF> +27F0..27FF ; Pattern_Syntax # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2800..28FF ; Pattern_Syntax # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 +2900..2982 ; Pattern_Syntax # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON +2983 ; Pattern_Syntax # Ps LEFT WHITE CURLY BRACKET +2984 ; Pattern_Syntax # Pe RIGHT WHITE CURLY BRACKET +2985 ; Pattern_Syntax # Ps LEFT WHITE PARENTHESIS +2986 ; Pattern_Syntax # Pe RIGHT WHITE PARENTHESIS +2987 ; Pattern_Syntax # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; Pattern_Syntax # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; Pattern_Syntax # Ps Z NOTATION LEFT BINDING BRACKET +298A ; Pattern_Syntax # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; Pattern_Syntax # Ps LEFT ARC LESS-THAN BRACKET +2994 ; Pattern_Syntax # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; Pattern_Syntax # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; Pattern_Syntax # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; Pattern_Syntax # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; Pattern_Syntax # Pe RIGHT BLACK TORTOISE SHELL BRACKET +2999..29D7 ; Pattern_Syntax # Sm [63] DOTTED FENCE..BLACK HOURGLASS +29D8 ; Pattern_Syntax # Ps LEFT WIGGLY FENCE +29D9 ; Pattern_Syntax # Pe RIGHT WIGGLY FENCE +29DA ; Pattern_Syntax # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; Pattern_Syntax # Pe RIGHT DOUBLE WIGGLY FENCE +29DC..29FB ; Pattern_Syntax # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS +29FC ; Pattern_Syntax # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; Pattern_Syntax # Pe RIGHT-POINTING CURVED ANGLE BRACKET +29FE..2AFF ; Pattern_Syntax # Sm [258] TINY..N-ARY WHITE VERTICAL BAR +2B00..2B13 ; Pattern_Syntax # So [20] NORTH EAST WHITE ARROW..SQUARE WITH BOTTOM HALF BLACK +2B14..2BFF ; Pattern_Syntax # Cn [236] <reserved-2B14>..<reserved-2BFF> +2E00..2E01 ; Pattern_Syntax # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02 ; Pattern_Syntax # Pi LEFT SUBSTITUTION BRACKET +2E03 ; Pattern_Syntax # Pf RIGHT SUBSTITUTION BRACKET +2E04 ; Pattern_Syntax # Pi LEFT DOTTED SUBSTITUTION BRACKET +2E05 ; Pattern_Syntax # Pf RIGHT DOTTED SUBSTITUTION BRACKET +2E06..2E08 ; Pattern_Syntax # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER +2E09 ; Pattern_Syntax # Pi LEFT TRANSPOSITION BRACKET +2E0A ; Pattern_Syntax # Pf RIGHT TRANSPOSITION BRACKET +2E0B ; Pattern_Syntax # Po RAISED SQUARE +2E0C ; Pattern_Syntax # Pi LEFT RAISED OMISSION BRACKET +2E0D ; Pattern_Syntax # Pf RIGHT RAISED OMISSION BRACKET +2E0E..2E16 ; Pattern_Syntax # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE +2E17 ; Pattern_Syntax # Pd DOUBLE OBLIQUE HYPHEN +2E18..2E1B ; Pattern_Syntax # Cn [4] <reserved-2E18>..<reserved-2E1B> +2E1C ; Pattern_Syntax # Pi LEFT LOW PARAPHRASE BRACKET +2E1D ; Pattern_Syntax # Pf RIGHT LOW PARAPHRASE BRACKET +2E1E..2E7F ; Pattern_Syntax # Cn [98] <reserved-2E1E>..<reserved-2E7F> +3001..3003 ; Pattern_Syntax # Po [3] IDEOGRAPHIC COMMA..DITTO MARK +3008 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET +3009 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET +300A ; Pattern_Syntax # Ps LEFT DOUBLE ANGLE BRACKET +300B ; Pattern_Syntax # Pe RIGHT DOUBLE ANGLE BRACKET +300C ; Pattern_Syntax # Ps LEFT CORNER BRACKET +300D ; Pattern_Syntax # Pe RIGHT CORNER BRACKET +300E ; Pattern_Syntax # Ps LEFT WHITE CORNER BRACKET +300F ; Pattern_Syntax # Pe RIGHT WHITE CORNER BRACKET +3010 ; Pattern_Syntax # Ps LEFT BLACK LENTICULAR BRACKET +3011 ; Pattern_Syntax # Pe RIGHT BLACK LENTICULAR BRACKET +3012..3013 ; Pattern_Syntax # So [2] POSTAL MARK..GETA MARK +3014 ; Pattern_Syntax # Ps LEFT TORTOISE SHELL BRACKET +3015 ; Pattern_Syntax # Pe RIGHT TORTOISE SHELL BRACKET +3016 ; Pattern_Syntax # Ps LEFT WHITE LENTICULAR BRACKET +3017 ; Pattern_Syntax # Pe RIGHT WHITE LENTICULAR BRACKET +3018 ; Pattern_Syntax # Ps LEFT WHITE TORTOISE SHELL BRACKET +3019 ; Pattern_Syntax # Pe RIGHT WHITE TORTOISE SHELL BRACKET +301A ; Pattern_Syntax # Ps LEFT WHITE SQUARE BRACKET +301B ; Pattern_Syntax # Pe RIGHT WHITE SQUARE BRACKET +301C ; Pattern_Syntax # Pd WAVE DASH +301D ; Pattern_Syntax # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F ; Pattern_Syntax # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +3020 ; Pattern_Syntax # So POSTAL MARK FACE +3030 ; Pattern_Syntax # Pd WAVY DASH +FD3E ; Pattern_Syntax # Ps ORNATE LEFT PARENTHESIS +FD3F ; Pattern_Syntax # Pe ORNATE RIGHT PARENTHESIS +FE45..FE46 ; Pattern_Syntax # Po [2] SESAME DOT..WHITE SESAME DOT + +# Total code points: 2760 diff --git a/Master/tlpkg/tlperl.old/lib/unicore/PropValueAliases.txt b/Master/tlpkg/tlperl.old/lib/unicore/PropValueAliases.txt new file mode 100644 index 00000000000..3f7aad206e5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/PropValueAliases.txt @@ -0,0 +1,578 @@ +# PropertyValueAliases-4.1.0.txt +# Date: 2005-03-28, 17:21:48 GMT [MD] +# +# Unicode Character Database +# Copyright (c) 1991-2005 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html +# +# This file contains aliases for property values used in the UCD. +# These names can be used for XML formats of UCD data, for regular-expression +# property tests, and other programmatic textual descriptions of Unicode data. +# For information on which properties are normative, see UCD.html. +# +# The names may be translated in appropriate environments, and additional +# aliases may be useful. +# +# FORMAT +# +# Each line describes a property value name. +# This consists of three or more fields, separated by semicolons. +# +# First Field: The first field describes the property for which that +# property value name is used. +# +# Second Field: The second field is an abbreviated name. +# If there is no abbreviated name available, the field is marked with "n/a". +# +# Third Field: The third field is a long name. +# +# In the case of ccc, there are 4 fields. The second field is numeric, third +# is abbreviated, and fourth is long. +# +# The above are the preferred aliases. Other aliases may be listed in additional fields. +# +# Loose matching should be applied to all property names and property values, with +# the exception of String Property values. With loose matching of property names and +# values, the case distinctions, whitespace, and '_' are ignored. For Numeric Property +# values, numeric equivalencies are applied: thus "01.00" is equivalent to "1". +# +# NOTE: Property value names are NOT unique across properties. For example: +# +# AL means Arabic Letter for the Bidi_Class property, and +# AL means Alpha_Left for the Combining_Class property, and +# AL means Alphabetic for the Line_Break property. +# +# In addition, some property names may be the same as some property value names. +# For example: +# +# sc means the Script property, and +# Sc means the General_Category property value Currency_Symbol (Sc) +# +# The combination of property value and property name is, however, unique. +# +# For more information, see UTS #18: Regular Expression Guidelines +# ================================================ + + +# Age (age) + +age; n/a ; 1.1 +age; n/a ; 2.0 +age; n/a ; 2.1 +age; n/a ; 3.0 +age; n/a ; 3.1 +age; n/a ; 3.2 +age; n/a ; 4.0 +age; n/a ; 4.1 +age; n/a ; unassigned + +# Bidi_Class (bc) + +bc ; AL ; Arabic_Letter +bc ; AN ; Arabic_Number +bc ; B ; Paragraph_Separator +bc ; BN ; Boundary_Neutral +bc ; CS ; Common_Separator +bc ; EN ; European_Number +bc ; ES ; European_Separator +bc ; ET ; European_Terminator +bc ; L ; Left_To_Right +bc ; LRE ; Left_To_Right_Embedding +bc ; LRO ; Left_To_Right_Override +bc ; NSM ; Nonspacing_Mark +bc ; ON ; Other_Neutral +bc ; PDF ; Pop_Directional_Format +bc ; R ; Right_To_Left +bc ; RLE ; Right_To_Left_Embedding +bc ; RLO ; Right_To_Left_Override +bc ; S ; Segment_Separator +bc ; WS ; White_Space + +# Block (blk) + +blk; n/a ; Aegean_Numbers +blk; n/a ; Alphabetic_Presentation_Forms +blk; n/a ; Ancient_Greek_Musical_Notation +blk; n/a ; Ancient_Greek_Numbers +blk; n/a ; Arabic +blk; n/a ; Arabic_Presentation_Forms-A +blk; n/a ; Arabic_Presentation_Forms-B +blk; n/a ; Arabic_Supplement +blk; n/a ; Armenian +blk; n/a ; Arrows +blk; n/a ; Basic_Latin +blk; n/a ; Bengali +blk; n/a ; Block_Elements +blk; n/a ; Bopomofo +blk; n/a ; Bopomofo_Extended +blk; n/a ; Box_Drawing +blk; n/a ; Braille_Patterns +blk; n/a ; Buginese +blk; n/a ; Buhid +blk; n/a ; Byzantine_Musical_Symbols +blk; n/a ; Cherokee +blk; n/a ; CJK_Compatibility +blk; n/a ; CJK_Compatibility_Forms +blk; n/a ; CJK_Compatibility_Ideographs +blk; n/a ; CJK_Compatibility_Ideographs_Supplement +blk; n/a ; CJK_Radicals_Supplement +blk; n/a ; CJK_Strokes +blk; n/a ; CJK_Symbols_and_Punctuation +blk; n/a ; CJK_Unified_Ideographs +blk; n/a ; CJK_Unified_Ideographs_Extension_A +blk; n/a ; CJK_Unified_Ideographs_Extension_B +blk; n/a ; Combining_Diacritical_Marks +blk; n/a ; Combining_Diacritical_Marks_for_Symbols +blk; n/a ; Combining_Diacritical_Marks_Supplement +blk; n/a ; Combining_Half_Marks +blk; n/a ; Control_Pictures +blk; n/a ; Coptic +blk; n/a ; Currency_Symbols +blk; n/a ; Cypriot_Syllabary +blk; n/a ; Cyrillic +blk; n/a ; Cyrillic_Supplement ; Cyrillic_Supplementary +blk; n/a ; Deseret +blk; n/a ; Devanagari +blk; n/a ; Dingbats +blk; n/a ; Enclosed_Alphanumerics +blk; n/a ; Enclosed_CJK_Letters_and_Months +blk; n/a ; Ethiopic +blk; n/a ; Ethiopic_Extended +blk; n/a ; Ethiopic_Supplement +blk; n/a ; General_Punctuation +blk; n/a ; Geometric_Shapes +blk; n/a ; Georgian +blk; n/a ; Georgian_Supplement +blk; n/a ; Glagolitic +blk; n/a ; Gothic +blk; n/a ; Greek_and_Coptic +blk; n/a ; Greek_Extended +blk; n/a ; Gujarati +blk; n/a ; Gurmukhi +blk; n/a ; Halfwidth_and_Fullwidth_Forms +blk; n/a ; Hangul_Compatibility_Jamo +blk; n/a ; Hangul_Jamo +blk; n/a ; Hangul_Syllables +blk; n/a ; Hanunoo +blk; n/a ; Hebrew +blk; n/a ; High_Private_Use_Surrogates +blk; n/a ; High_Surrogates +blk; n/a ; Hiragana +blk; n/a ; Ideographic_Description_Characters +blk; n/a ; IPA_Extensions +blk; n/a ; Kanbun +blk; n/a ; Kangxi_Radicals +blk; n/a ; Kannada +blk; n/a ; Katakana +blk; n/a ; Katakana_Phonetic_Extensions +blk; n/a ; Kharoshthi +blk; n/a ; Khmer +blk; n/a ; Khmer_Symbols +blk; n/a ; Lao +blk; n/a ; Latin-1_Supplement +blk; n/a ; Latin_Extended-A +blk; n/a ; Latin_Extended-B +blk; n/a ; Latin_Extended_Additional +blk; n/a ; Letterlike_Symbols +blk; n/a ; Limbu +blk; n/a ; Linear_B_Ideograms +blk; n/a ; Linear_B_Syllabary +blk; n/a ; Low_Surrogates +blk; n/a ; Malayalam +blk; n/a ; Mathematical_Alphanumeric_Symbols +blk; n/a ; Mathematical_Operators +blk; n/a ; Miscellaneous_Mathematical_Symbols-A +blk; n/a ; Miscellaneous_Mathematical_Symbols-B +blk; n/a ; Miscellaneous_Symbols +blk; n/a ; Miscellaneous_Symbols_and_Arrows +blk; n/a ; Miscellaneous_Technical +blk; n/a ; Modifier_Tone_Letters +blk; n/a ; Mongolian +blk; n/a ; Musical_Symbols +blk; n/a ; Myanmar +blk; n/a ; New_Tai_Lue +blk; n/a ; No_Block +blk; n/a ; Number_Forms +blk; n/a ; Ogham +blk; n/a ; Old_Italic +blk; n/a ; Old_Persian +blk; n/a ; Optical_Character_Recognition +blk; n/a ; Oriya +blk; n/a ; Osmanya +blk; n/a ; Phonetic_Extensions +blk; n/a ; Phonetic_Extensions_Supplement +blk; n/a ; Private_Use_Area +blk; n/a ; Runic +blk; n/a ; Shavian +blk; n/a ; Sinhala +blk; n/a ; Small_Form_Variants +blk; n/a ; Spacing_Modifier_Letters +blk; n/a ; Specials +blk; n/a ; Superscripts_and_Subscripts +blk; n/a ; Supplemental_Arrows-A +blk; n/a ; Supplemental_Arrows-B +blk; n/a ; Supplemental_Mathematical_Operators +blk; n/a ; Supplemental_Punctuation +blk; n/a ; Supplementary_Private_Use_Area-A +blk; n/a ; Supplementary_Private_Use_Area-B +blk; n/a ; Syloti_Nagri +blk; n/a ; Syriac +blk; n/a ; Tagalog +blk; n/a ; Tagbanwa +blk; n/a ; Tags +blk; n/a ; Tai_Le +blk; n/a ; Tai_Xuan_Jing_Symbols +blk; n/a ; Tamil +blk; n/a ; Telugu +blk; n/a ; Thaana +blk; n/a ; Thai +blk; n/a ; Tibetan +blk; n/a ; Tifinagh +blk; n/a ; Ugaritic +blk; n/a ; Unified_Canadian_Aboriginal_Syllabics +blk; n/a ; Variation_Selectors +blk; n/a ; Variation_Selectors_Supplement +blk; n/a ; Vertical_Forms +blk; n/a ; Yi_Radicals +blk; n/a ; Yi_Syllables +blk; n/a ; Yijing_Hexagram_Symbols + +# Canonical_Combining_Class (ccc) + +ccc; 0; NR ; Not_Reordered +ccc; 1; OV ; Overlay +ccc; 7; NK ; Nukta +ccc; 8; KV ; Kana_Voicing +ccc; 9; VR ; Virama +ccc; 200; ATBL ; Attached_Below_Left +ccc; 202; ATB ; Attached_Below +ccc; 216; ATAR ; Attached_Above_Right +ccc; 218; BL ; Below_Left +ccc; 220; B ; Below +ccc; 222; BR ; Below_Right +ccc; 224; L ; Left +ccc; 226; R ; Right +ccc; 228; AL ; Above_Left +ccc; 230; A ; Above +ccc; 232; AR ; Above_Right +ccc; 233; DB ; Double_Below +ccc; 234; DA ; Double_Above +ccc; 240; IS ; Iota_Subscript + +# Decomposition_Type (dt) + +dt ; can ; Canonical +dt ; com ; Compat +dt ; enc ; Circle +dt ; fin ; Final +dt ; font ; Font +dt ; fra ; Fraction +dt ; init ; Initial +dt ; iso ; Isolated +dt ; med ; Medial +dt ; nar ; Narrow +dt ; nb ; Nobreak +dt ; none ; None +dt ; sml ; Small +dt ; sqr ; Square +dt ; sub ; Sub +dt ; sup ; Super +dt ; vert ; Vertical +dt ; wide ; Wide + +# East_Asian_Width (ea) + +ea ; A ; Ambiguous +ea ; F ; Fullwidth +ea ; H ; Halfwidth +ea ; N ; Neutral +ea ; Na ; Narrow +ea ; W ; Wide + +# General_Category (gc) + +gc ; C ; Other # Cc | Cf | Cn | Co | Cs +gc ; Cc ; Control ; cntrl +gc ; Cf ; Format +gc ; Cn ; Unassigned +gc ; Co ; Private_Use +gc ; Cs ; Surrogate +gc ; L ; Letter # Ll | Lm | Lo | Lt | Lu +gc ; LC ; Cased_Letter # Ll | Lt | Lu +gc ; Ll ; Lowercase_Letter +gc ; Lm ; Modifier_Letter +gc ; Lo ; Other_Letter +gc ; Lt ; Titlecase_Letter +gc ; Lu ; Uppercase_Letter +gc ; M ; Mark # Mc | Me | Mn +gc ; Mc ; Spacing_Mark +gc ; Me ; Enclosing_Mark +gc ; Mn ; Nonspacing_Mark +gc ; N ; Number # Nd | Nl | No +gc ; Nd ; Decimal_Number ; digit +gc ; Nl ; Letter_Number +gc ; No ; Other_Number +gc ; P ; Punctuation ; punct # Pc | Pd | Pe | Pf | Pi | Po | Ps +gc ; Pc ; Connector_Punctuation +gc ; Pd ; Dash_Punctuation +gc ; Pe ; Close_Punctuation +gc ; Pf ; Final_Punctuation +gc ; Pi ; Initial_Punctuation +gc ; Po ; Other_Punctuation +gc ; Ps ; Open_Punctuation +gc ; S ; Symbol # Sc | Sk | Sm | So +gc ; Sc ; Currency_Symbol +gc ; Sk ; Modifier_Symbol +gc ; Sm ; Math_Symbol +gc ; So ; Other_Symbol +gc ; Z ; Separator # Zl | Zp | Zs +gc ; Zl ; Line_Separator +gc ; Zp ; Paragraph_Separator +gc ; Zs ; Space_Separator + +# Grapheme_Cluster_Break (GCB) + +GCB; CN ; Control +GCB; CR ; CR +GCB; EX ; Extend +GCB; L ; L +GCB; LF ; LF +GCB; LV ; LV +GCB; LVT ; LVT +GCB; T ; T +GCB; V ; V +GCB; XX ; Other + +# Hangul_Syllable_Type (hst) + +hst; L ; Leading_Jamo +hst; LV ; LV_Syllable +hst; LVT ; LVT_Syllable +hst; NA ; Not_Applicable +hst; T ; Trailing_Jamo +hst; V ; Vowel_Jamo + +# Joining_Group (jg) + +jg ; n/a ; Ain +jg ; n/a ; Alaph +jg ; n/a ; Alef +jg ; n/a ; Beh +jg ; n/a ; Beth +jg ; n/a ; Dal +jg ; n/a ; Dalath_Rish +jg ; n/a ; E +jg ; n/a ; Fe +jg ; n/a ; Feh +jg ; n/a ; Final_Semkath +jg ; n/a ; Gaf +jg ; n/a ; Gamal +jg ; n/a ; Hah +jg ; n/a ; Hamza_On_Heh_Goal +jg ; n/a ; He +jg ; n/a ; Heh +jg ; n/a ; Heh_Goal +jg ; n/a ; Heth +jg ; n/a ; Kaf +jg ; n/a ; Kaph +jg ; n/a ; Khaph +jg ; n/a ; Knotted_Heh +jg ; n/a ; Lam +jg ; n/a ; Lamadh +jg ; n/a ; Meem +jg ; n/a ; Mim +jg ; n/a ; No_Joining_Group +jg ; n/a ; Noon +jg ; n/a ; Nun +jg ; n/a ; Pe +jg ; n/a ; Qaf +jg ; n/a ; Qaph +jg ; n/a ; Reh +jg ; n/a ; Reversed_Pe +jg ; n/a ; Sad +jg ; n/a ; Sadhe +jg ; n/a ; Seen +jg ; n/a ; Semkath +jg ; n/a ; Shin +jg ; n/a ; Swash_Kaf +jg ; n/a ; Syriac_Waw +jg ; n/a ; Tah +jg ; n/a ; Taw +jg ; n/a ; Teh_Marbuta +jg ; n/a ; Teth +jg ; n/a ; Waw +jg ; n/a ; Yeh +jg ; n/a ; Yeh_Barree +jg ; n/a ; Yeh_With_Tail +jg ; n/a ; Yudh +jg ; n/a ; Yudh_He +jg ; n/a ; Zain +jg ; n/a ; Zhain + +# Joining_Type (jt) + +jt ; C ; Join_Causing +jt ; D ; Dual_Joining +jt ; L ; Left_Joining +jt ; R ; Right_Joining +jt ; T ; Transparent +jt ; U ; Non_Joining + +# Line_Break (lb) + +lb ; AI ; Ambiguous +lb ; AL ; Alphabetic +lb ; B2 ; Break_Both +lb ; BA ; Break_After +lb ; BB ; Break_Before +lb ; BK ; Mandatory_Break +lb ; CB ; Contingent_Break +lb ; CL ; Close_Punctuation +lb ; CM ; Combining_Mark +lb ; CR ; Carriage_Return +lb ; EX ; Exclamation +lb ; GL ; Glue +lb ; H2 ; H2 +lb ; H3 ; H3 +lb ; HY ; Hyphen +lb ; ID ; Ideographic +lb ; IN ; Inseparable ; Inseperable +lb ; IS ; Infix_Numeric +lb ; JL ; JL +lb ; JT ; JT +lb ; JV ; JV +lb ; LF ; Line_Feed +lb ; NL ; Next_Line +lb ; NS ; Nonstarter +lb ; NU ; Numeric +lb ; OP ; Open_Punctuation +lb ; PO ; Postfix_Numeric +lb ; PR ; Prefix_Numeric +lb ; QU ; Quotation +lb ; SA ; Complex_Context +lb ; SG ; Surrogate +lb ; SP ; Space +lb ; SY ; Break_Symbols +lb ; WJ ; Word_Joiner +lb ; XX ; Unknown +lb ; ZW ; ZWSpace + +# NFC_Quick_Check (NFC_QC) + +NFC_QC; M ; Maybe +NFC_QC; N ; No +NFC_QC; Y ; Yes + +# NFD_Quick_Check (NFD_QC) + +NFD_QC; N ; No +NFD_QC; Y ; Yes + +# NFKC_Quick_Check (NFKC_QC) + +NFKC_QC; M ; Maybe +NFKC_QC; N ; No +NFKC_QC; Y ; Yes + +# NFKD_Quick_Check (NFKD_QC) + +NFKD_QC; N ; No +NFKD_QC; Y ; Yes + +# Numeric_Type (nt) + +nt ; De ; Decimal +nt ; Di ; Digit +nt ; None ; None +nt ; Nu ; Numeric + +# Script (sc) + +sc ; Arab ; Arabic +sc ; Armn ; Armenian +sc ; Beng ; Bengali +sc ; Bopo ; Bopomofo +sc ; Brai ; Braille +sc ; Bugi ; Buginese +sc ; Buhd ; Buhid +sc ; Cans ; Canadian_Aboriginal +sc ; Cher ; Cherokee +sc ; Copt ; Coptic ; Qaac +sc ; Cprt ; Cypriot +sc ; Cyrl ; Cyrillic +sc ; Deva ; Devanagari +sc ; Dsrt ; Deseret +sc ; Ethi ; Ethiopic +sc ; Geor ; Georgian +sc ; Glag ; Glagolitic +sc ; Goth ; Gothic +sc ; Grek ; Greek +sc ; Gujr ; Gujarati +sc ; Guru ; Gurmukhi +sc ; Hang ; Hangul +sc ; Hani ; Han +sc ; Hano ; Hanunoo +sc ; Hebr ; Hebrew +sc ; Hira ; Hiragana +sc ; Hrkt ; Katakana_Or_Hiragana +sc ; Ital ; Old_Italic +sc ; Kana ; Katakana +sc ; Khar ; Kharoshthi +sc ; Khmr ; Khmer +sc ; Knda ; Kannada +sc ; Laoo ; Lao +sc ; Latn ; Latin +sc ; Limb ; Limbu +sc ; Linb ; Linear_B +sc ; Mlym ; Malayalam +sc ; Mong ; Mongolian +sc ; Mymr ; Myanmar +sc ; Ogam ; Ogham +sc ; Orya ; Oriya +sc ; Osma ; Osmanya +sc ; Qaai ; Inherited +sc ; Runr ; Runic +sc ; Shaw ; Shavian +sc ; Sinh ; Sinhala +sc ; Sylo ; Syloti_Nagri +sc ; Syrc ; Syriac +sc ; Tagb ; Tagbanwa +sc ; Tale ; Tai_Le +sc ; Talu ; New_Tai_Lue +sc ; Taml ; Tamil +sc ; Telu ; Telugu +sc ; Tfng ; Tifinagh +sc ; Tglg ; Tagalog +sc ; Thaa ; Thaana +sc ; Thai ; Thai +sc ; Tibt ; Tibetan +sc ; Ugar ; Ugaritic +sc ; Xpeo ; Old_Persian +sc ; Yiii ; Yi +sc ; Zyyy ; Common + +# Sentence_Break (SB) + +SB ; AT ; ATerm +SB ; CL ; Close +SB ; FO ; Format +SB ; LE ; OLetter +SB ; LO ; Lower +SB ; NU ; Numeric +SB ; SE ; Sep +SB ; SP ; Sp +SB ; ST ; STerm +SB ; UP ; Upper +SB ; XX ; Other + +# Word_Break (WB) + +WB ; EX ; ExtendNumLet +WB ; FO ; Format +WB ; KA ; Katakana +WB ; LE ; ALetter +WB ; ML ; MidLetter +WB ; MN ; MidNum +WB ; NU ; Numeric +WB ; XX ; Other diff --git a/Master/tlpkg/tlperl.old/lib/unicore/Properties b/Master/tlpkg/tlperl.old/lib/unicore/Properties new file mode 100644 index 00000000000..274db8f58f4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/Properties @@ -0,0 +1,350 @@ +##
+## This file created by mktables
+## List of built-in \p{...}/\P{...} properties.
+##
+## '*' means name may be 'fuzzy'
+##
+
+ \p{ASCII} [[:ASCII:]]
+ \p{Alnum} [[:Alnum:]]
+* \p{Alphabetic} [\p{L}\p{OtherAlphabetic}]
+ \p{Alpha} [[:Alpha:]]
+ \p{Any} Alias for \p{Any} ([\x{0000}-\x{10FFFF}])
+ \p{Any} [\x{0000}-\x{10FFFF}]
+* \p{Arabic} Script 'Arabic'
+* \p{Armenian} Script 'Armenian'
+* \p{AsciiHexDigit} Extended property 'ASCII_Hex_Digit'
+ \p{Assigned} All assigned code points
+* \p{Bengali} Script 'Bengali'
+* \p{BidiControl} Extended property 'Bidi_Control'
+ \p{Blank} [[:Blank:]]
+* \p{Bopomofo} Script 'Bopomofo'
+* \p{Braille} Script 'Braille'
+* \p{Buginese} Script 'Buginese'
+* \p{Buhid} Script 'Buhid'
+* \p{CanadianAboriginal} Script 'Canadian_Aboriginal'
+* \p{Cc} Alias for \p{Cc} (General Category 'Cc')
+ \p{Cc} General Category 'Cc'
+* \p{Cf} Alias for \p{Cf} (General Category 'Cf')
+ \p{Cf} General Category 'Cf'
+* \p{Cherokee} Script 'Cherokee'
+ \p{Cntrl} [[:Cntrl:]]
+* \p{Cn} Alias for \p{Cn} (General Category 'Cn' [not functional in Perl])
+ \p{Cn} General Category 'Cn' [not functional in Perl]
+* \p{Common} Script 'Common'
+* \p{Coptic} Script 'Coptic'
+* \p{Co} Alias for \p{Co} (General Category 'Co')
+ \p{Co} General Category 'Co'
+* \p{Cs} Alias for \p{Cs} (General Category 'Cs')
+ \p{Cs} General Category 'Cs'
+* \p{Cypriot} Script 'Cypriot'
+* \p{Cyrillic} Script 'Cyrillic'
+* \p{C} Alias for \p{C} (Major Category 'C')
+ \p{C} Major Category 'C'
+* \p{Dash} Extended property 'Dash'
+* \p{Deprecated} Extended property 'Deprecated'
+* \p{Deseret} Script 'Deseret'
+* \p{Devanagari} Script 'Devanagari'
+* \p{Diacritic} Extended property 'Diacritic'
+ \p{Digit} [[:Digit:]]
+* \p{Ethiopic} Script 'Ethiopic'
+* \p{Extender} Extended property 'Extender'
+* \p{Georgian} Script 'Georgian'
+* \p{Glagolitic} Script 'Glagolitic'
+* \p{Gothic} Script 'Gothic'
+* \p{GraphemeLink} Extended property 'Grapheme_Link'
+ \p{Graph} [[:Graph:]]
+* \p{Greek} Script 'Greek'
+* \p{Gujarati} Script 'Gujarati'
+* \p{Gurmukhi} Script 'Gurmukhi'
+* \p{Hangul} Script 'Hangul'
+* \p{Hanunoo} Script 'Hanunoo'
+* \p{Han} Script 'Han'
+* \p{Hebrew} Script 'Hebrew'
+* \p{HexDigit} Extended property 'Hex_Digit'
+* \p{Hiragana} Script 'Hiragana'
+* \p{Hyphen} Extended property 'Hyphen'
+* \p{IdContinue} [\p{ID_Start}\p{Mn}\p{Mc}\p{Nd}\p{Pc}]
+* \p{IdStart} [\p{Ll}\p{Lu}\p{Lt}\p{Lm}\p{Lo}\p{Nl}]
+* \p{Ideographic} Extended property 'Ideographic'
+* \p{IdsBinaryOperator} Extended property 'IDS_Binary_Operator'
+* \p{IdsTrinaryOperator} Extended property 'IDS_Trinary_Operator'
+* \p{InAegeanNumbers} Block 'Aegean Numbers'
+* \p{InAlphabeticPresentationForms} Block 'Alphabetic Presentation Forms'
+* \p{InAncientGreekMusicalNotation} Block 'Ancient Greek Musical Notation'
+* \p{InAncientGreekNumbers} Block 'Ancient Greek Numbers'
+* \p{InArabicPresentationFormsA} Block 'Arabic Presentation Forms-A'
+* \p{InArabicPresentationFormsB} Block 'Arabic Presentation Forms-B'
+* \p{InArabicSupplement} Block 'Arabic Supplement'
+* \p{InArabic} Block 'Arabic'
+* \p{InArmenian} Block 'Armenian'
+* \p{InArrows} Block 'Arrows'
+* \p{InBasicLatin} Block 'Basic Latin'
+* \p{InBengali} Block 'Bengali'
+* \p{InBlockElements} Block 'Block Elements'
+* \p{InBopomofoExtended} Block 'Bopomofo Extended'
+* \p{InBopomofo} Block 'Bopomofo'
+* \p{InBoxDrawing} Block 'Box Drawing'
+* \p{InBraillePatterns} Block 'Braille Patterns'
+* \p{InBuginese} Block 'Buginese'
+* \p{InBuhid} Block 'Buhid'
+* \p{InByzantineMusicalSymbols} Block 'Byzantine Musical Symbols'
+* \p{InCherokee} Block 'Cherokee'
+* \p{InCjkCompatibilityForms} Block 'CJK Compatibility Forms'
+* \p{InCjkCompatibilityIdeographsSupplement} Block 'CJK Compatibility Ideographs Supplement'
+* \p{InCjkCompatibilityIdeographs} Block 'CJK Compatibility Ideographs'
+* \p{InCjkCompatibility} Block 'CJK Compatibility'
+* \p{InCjkRadicalsSupplement} Block 'CJK Radicals Supplement'
+* \p{InCjkStrokes} Block 'CJK Strokes'
+* \p{InCjkSymbolsAndPunctuation} Block 'CJK Symbols and Punctuation'
+* \p{InCjkUnifiedIdeographsExtensionA} Block 'CJK Unified Ideographs Extension A'
+* \p{InCjkUnifiedIdeographsExtensionB} Block 'CJK Unified Ideographs Extension B'
+* \p{InCjkUnifiedIdeographs} Block 'CJK Unified Ideographs'
+* \p{InCombiningDiacriticalMarksForSymbols} Block 'Combining Diacritical Marks for Symbols'
+* \p{InCombiningDiacriticalMarksSupplement} Block 'Combining Diacritical Marks Supplement'
+* \p{InCombiningDiacriticalMarks} Block 'Combining Diacritical Marks'
+* \p{InCombiningHalfMarks} Block 'Combining Half Marks'
+* \p{InControlPictures} Block 'Control Pictures'
+* \p{InCoptic} Block 'Coptic'
+* \p{InCurrencySymbols} Block 'Currency Symbols'
+* \p{InCypriotSyllabary} Block 'Cypriot Syllabary'
+* \p{InCyrillicSupplement} Block 'Cyrillic Supplement'
+* \p{InCyrillic} Block 'Cyrillic'
+* \p{InDeseret} Block 'Deseret'
+* \p{InDevanagari} Block 'Devanagari'
+* \p{InDingbats} Block 'Dingbats'
+* \p{InEnclosedAlphanumerics} Block 'Enclosed Alphanumerics'
+* \p{InEnclosedCjkLettersAndMonths} Block 'Enclosed CJK Letters and Months'
+* \p{InEthiopicExtended} Block 'Ethiopic Extended'
+* \p{InEthiopicSupplement} Block 'Ethiopic Supplement'
+* \p{InEthiopic} Block 'Ethiopic'
+* \p{InGeneralPunctuation} Block 'General Punctuation'
+* \p{InGeometricShapes} Block 'Geometric Shapes'
+* \p{InGeorgianSupplement} Block 'Georgian Supplement'
+* \p{InGeorgian} Block 'Georgian'
+* \p{InGlagolitic} Block 'Glagolitic'
+* \p{InGothic} Block 'Gothic'
+* \p{InGreekAndCoptic} Block 'Greek and Coptic'
+* \p{InGreekExtended} Block 'Greek Extended'
+* \p{InGujarati} Block 'Gujarati'
+* \p{InGurmukhi} Block 'Gurmukhi'
+* \p{InHalfwidthAndFullwidthForms} Block 'Halfwidth and Fullwidth Forms'
+* \p{InHangulCompatibilityJamo} Block 'Hangul Compatibility Jamo'
+* \p{InHangulJamo} Block 'Hangul Jamo'
+* \p{InHangulSyllables} Block 'Hangul Syllables'
+* \p{InHanunoo} Block 'Hanunoo'
+* \p{InHebrew} Block 'Hebrew'
+* \p{InHighPrivateUseSurrogates} Block 'High Private Use Surrogates'
+* \p{InHighSurrogates} Block 'High Surrogates'
+* \p{InHiragana} Block 'Hiragana'
+* \p{InIdeographicDescriptionCharacters} Block 'Ideographic Description Characters'
+* \p{InIpaExtensions} Block 'IPA Extensions'
+* \p{InKanbun} Block 'Kanbun'
+* \p{InKangxiRadicals} Block 'Kangxi Radicals'
+* \p{InKannada} Block 'Kannada'
+* \p{InKatakanaPhoneticExtensions} Block 'Katakana Phonetic Extensions'
+* \p{InKatakana} Block 'Katakana'
+* \p{InKharoshthi} Block 'Kharoshthi'
+* \p{InKhmerSymbols} Block 'Khmer Symbols'
+* \p{InKhmer} Block 'Khmer'
+* \p{InLao} Block 'Lao'
+* \p{InLatin1Supplement} Block 'Latin-1 Supplement'
+* \p{InLatinExtendedAdditional} Block 'Latin Extended Additional'
+* \p{InLatinExtendedA} Block 'Latin Extended-A'
+* \p{InLatinExtendedB} Block 'Latin Extended-B'
+* \p{InLetterlikeSymbols} Block 'Letterlike Symbols'
+* \p{InLimbu} Block 'Limbu'
+* \p{InLinearBIdeograms} Block 'Linear B Ideograms'
+* \p{InLinearBSyllabary} Block 'Linear B Syllabary'
+* \p{InLowSurrogates} Block 'Low Surrogates'
+* \p{InMalayalam} Block 'Malayalam'
+* \p{InMathematicalAlphanumericSymbols} Block 'Mathematical Alphanumeric Symbols'
+* \p{InMathematicalOperators} Block 'Mathematical Operators'
+* \p{InMiscellaneousMathematicalSymbolsA} Block 'Miscellaneous Mathematical Symbols-A'
+* \p{InMiscellaneousMathematicalSymbolsB} Block 'Miscellaneous Mathematical Symbols-B'
+* \p{InMiscellaneousSymbolsAndArrows} Block 'Miscellaneous Symbols and Arrows'
+* \p{InMiscellaneousSymbols} Block 'Miscellaneous Symbols'
+* \p{InMiscellaneousTechnical} Block 'Miscellaneous Technical'
+* \p{InModifierToneLetters} Block 'Modifier Tone Letters'
+* \p{InMongolian} Block 'Mongolian'
+* \p{InMusicalSymbols} Block 'Musical Symbols'
+* \p{InMyanmar} Block 'Myanmar'
+* \p{InNewTaiLue} Block 'New Tai Lue'
+* \p{InNumberForms} Block 'Number Forms'
+* \p{InOgham} Block 'Ogham'
+* \p{InOldItalic} Block 'Old Italic'
+* \p{InOldPersian} Block 'Old Persian'
+* \p{InOpticalCharacterRecognition} Block 'Optical Character Recognition'
+* \p{InOriya} Block 'Oriya'
+* \p{InOsmanya} Block 'Osmanya'
+* \p{InPhoneticExtensionsSupplement} Block 'Phonetic Extensions Supplement'
+* \p{InPhoneticExtensions} Block 'Phonetic Extensions'
+* \p{InPrivateUseArea} Block 'Private Use Area'
+* \p{InRunic} Block 'Runic'
+* \p{InShavian} Block 'Shavian'
+* \p{InSinhala} Block 'Sinhala'
+* \p{InSmallFormVariants} Block 'Small Form Variants'
+* \p{InSpacingModifierLetters} Block 'Spacing Modifier Letters'
+* \p{InSpecials} Block 'Specials'
+* \p{InSuperscriptsAndSubscripts} Block 'Superscripts and Subscripts'
+* \p{InSupplementalArrowsA} Block 'Supplemental Arrows-A'
+* \p{InSupplementalArrowsB} Block 'Supplemental Arrows-B'
+* \p{InSupplementalMathematicalOperators} Block 'Supplemental Mathematical Operators'
+* \p{InSupplementalPunctuation} Block 'Supplemental Punctuation'
+* \p{InSupplementaryPrivateUseAreaA} Block 'Supplementary Private Use Area-A'
+* \p{InSupplementaryPrivateUseAreaB} Block 'Supplementary Private Use Area-B'
+* \p{InSylotiNagri} Block 'Syloti Nagri'
+* \p{InSyriac} Block 'Syriac'
+* \p{InTagalog} Block 'Tagalog'
+* \p{InTagbanwa} Block 'Tagbanwa'
+* \p{InTags} Block 'Tags'
+* \p{InTaiLe} Block 'Tai Le'
+* \p{InTaiXuanJingSymbols} Block 'Tai Xuan Jing Symbols'
+* \p{InTamil} Block 'Tamil'
+* \p{InTelugu} Block 'Telugu'
+* \p{InThaana} Block 'Thaana'
+* \p{InThai} Block 'Thai'
+* \p{InTibetan} Block 'Tibetan'
+* \p{InTifinagh} Block 'Tifinagh'
+* \p{InUgaritic} Block 'Ugaritic'
+* \p{InUnifiedCanadianAboriginalSyllabics} Block 'Unified Canadian Aboriginal Syllabics'
+* \p{InVariationSelectorsSupplement} Block 'Variation Selectors Supplement'
+* \p{InVariationSelectors} Block 'Variation Selectors'
+* \p{InVerticalForms} Block 'Vertical Forms'
+* \p{InYiRadicals} Block 'Yi Radicals'
+* \p{InYiSyllables} Block 'Yi Syllables'
+* \p{InYijingHexagramSymbols} Block 'Yijing Hexagram Symbols'
+* \p{Inherited} Script 'Inherited'
+* \p{JoinControl} Extended property 'Join_Control'
+* \p{Kannada} Script 'Kannada'
+* \p{Katakana} Script 'Katakana'
+* \p{Kharoshthi} Script 'Kharoshthi'
+* \p{Khmer} Script 'Khmer'
+* \p{LC} Alias for \p{LC} ([\p{Ll}\p{Lu}\p{Lt}])
+ \p{LC} [\p{Ll}\p{Lu}\p{Lt}]
+* \p{Lao} Script 'Lao'
+* \p{Latin} Script 'Latin'
+* \p{Limbu} Script 'Limbu'
+* \p{LinearB} Script 'Linear_B'
+* \p{Ll} Alias for \p{Ll} (General Category 'Ll')
+ \p{Ll} General Category 'Ll'
+* \p{Lm} Alias for \p{Lm} (General Category 'Lm')
+ \p{Lm} General Category 'Lm'
+* \p{LogicalOrderException} Extended property 'Logical_Order_Exception'
+* \p{Lowercase} [\p{Ll}\p{OtherLowercase}]
+ \p{Lower} [[:Lower:]]
+* \p{Lo} Alias for \p{Lo} (General Category 'Lo')
+ \p{Lo} General Category 'Lo'
+* \p{Lt} Alias for \p{Lt} (General Category 'Lt')
+ \p{Lt} General Category 'Lt'
+* \p{Lu} Alias for \p{Lu} (General Category 'Lu')
+ \p{Lu} General Category 'Lu'
+* \p{L} Alias for \p{L} (Major Category 'L')
+ \p{L} Major Category 'L'
+* \p{Malayalam} Script 'Malayalam'
+* \p{Math} [\p{Sm}\p{OtherMath}]
+* \p{Mc} Alias for \p{Mc} (General Category 'Mc')
+ \p{Mc} General Category 'Mc'
+* \p{Me} Alias for \p{Me} (General Category 'Me')
+ \p{Me} General Category 'Me'
+* \p{Mn} Alias for \p{Mn} (General Category 'Mn')
+ \p{Mn} General Category 'Mn'
+* \p{Mongolian} Script 'Mongolian'
+* \p{Myanmar} Script 'Myanmar'
+* \p{M} Alias for \p{M} (Major Category 'M')
+ \p{M} Major Category 'M'
+* \p{Nd} Alias for \p{Nd} (General Category 'Nd')
+ \p{Nd} General Category 'Nd'
+* \p{NewTaiLue} Script 'New_Tai_Lue'
+* \p{Nl} Alias for \p{Nl} (General Category 'Nl')
+ \p{Nl} General Category 'Nl'
+* \p{NoncharacterCodePoint} Extended property 'Noncharacter_Code_Point'
+* \p{No} Alias for \p{No} (General Category 'No')
+ \p{No} General Category 'No'
+* \p{N} Alias for \p{N} (Major Category 'N')
+ \p{N} Major Category 'N'
+* \p{Ogham} Script 'Ogham'
+* \p{OldItalic} Script 'Old_Italic'
+* \p{OldPersian} Script 'Old_Persian'
+* \p{Oriya} Script 'Oriya'
+* \p{Osmanya} Script 'Osmanya'
+* \p{OtherAlphabetic} Extended property 'Other_Alphabetic'
+* \p{OtherDefaultIgnorableCodePoint} Extended property 'Other_Default_Ignorable_Code_Point'
+* \p{OtherGraphemeExtend} Extended property 'Other_Grapheme_Extend'
+* \p{OtherIdContinue} Extended property 'Other_ID_Continue'
+* \p{OtherIdStart} Extended property 'Other_ID_Start'
+* \p{OtherLowercase} Extended property 'Other_Lowercase'
+* \p{OtherMath} Extended property 'Other_Math'
+* \p{OtherUppercase} Extended property 'Other_Uppercase'
+* \p{PatternSyntax} Extended property 'Pattern_Syntax'
+* \p{PatternWhiteSpace} Extended property 'Pattern_White_Space'
+* \p{Pc} Alias for \p{Pc} (General Category 'Pc')
+ \p{Pc} General Category 'Pc'
+* \p{Pd} Alias for \p{Pd} (General Category 'Pd')
+ \p{Pd} General Category 'Pd'
+* \p{Pe} Alias for \p{Pe} (General Category 'Pe')
+ \p{Pe} General Category 'Pe'
+* \p{Pf} Alias for \p{Pf} (General Category 'Pf')
+ \p{Pf} General Category 'Pf'
+* \p{Pi} Alias for \p{Pi} (General Category 'Pi')
+ \p{Pi} General Category 'Pi'
+* \p{Po} Alias for \p{Po} (General Category 'Po')
+ \p{Po} General Category 'Po'
+ \p{Print} [[:Print:]]
+* \p{Ps} Alias for \p{Ps} (General Category 'Ps')
+ \p{Ps} General Category 'Ps'
+ \p{Punct} [[:Punct:]]
+* \p{P} Alias for \p{P} (Major Category 'P')
+ \p{P} Major Category 'P'
+* \p{QuotationMark} Extended property 'Quotation_Mark'
+* \p{Radical} Extended property 'Radical'
+* \p{Runic} Script 'Runic'
+* \p{Sc} Alias for \p{Sc} (General Category 'Sc')
+ \p{Sc} General Category 'Sc'
+* \p{Shavian} Script 'Shavian'
+* \p{Sinhala} Script 'Sinhala'
+* \p{Sk} Alias for \p{Sk} (General Category 'Sk')
+ \p{Sk} General Category 'Sk'
+* \p{Sm} Alias for \p{Sm} (General Category 'Sm')
+ \p{Sm} General Category 'Sm'
+* \p{SoftDotted} Extended property 'Soft_Dotted'
+* \p{So} Alias for \p{So} (General Category 'So')
+ \p{So} General Category 'So'
+ \p{SpacePerl} \s
+ \p{Space} [[:Space:]]
+* \p{Sterm} Extended property 'STerm'
+* \p{SylotiNagri} Script 'Syloti_Nagri'
+* \p{Syriac} Script 'Syriac'
+* \p{S} Alias for \p{S} (Major Category 'S')
+ \p{S} Major Category 'S'
+* \p{Tagalog} Script 'Tagalog'
+* \p{Tagbanwa} Script 'Tagbanwa'
+* \p{TaiLe} Script 'Tai_Le'
+* \p{Tamil} Script 'Tamil'
+* \p{Telugu} Script 'Telugu'
+* \p{TerminalPunctuation} Extended property 'Terminal_Punctuation'
+* \p{Thaana} Script 'Thaana'
+* \p{Thai} Script 'Thai'
+* \p{Tibetan} Script 'Tibetan'
+* \p{Tifinagh} Script 'Tifinagh'
+ \p{Title} [[:Title:]]
+* \p{Ugaritic} Script 'Ugaritic'
+* \p{UnifiedIdeograph} Extended property 'Unified_Ideograph'
+* \p{Uppercase} [\p{Lu}\p{Other_Uppercase}]
+ \p{Upper} [[:Upper:]]
+* \p{VariationSelector} Extended property 'Variation_Selector'
+* \p{WhiteSpace} Extended property 'White_Space'
+ \p{Word} [[:Word:]]
+ \p{XDigit} [[:XDigit:]]
+* \p{Yi} Script 'Yi'
+* \p{Zl} Alias for \p{Zl} (General Category 'Zl')
+ \p{Zl} General Category 'Zl'
+* \p{Zp} Alias for \p{Zp} (General Category 'Zp')
+ \p{Zp} General Category 'Zp'
+* \p{Zs} Alias for \p{Zs} (General Category 'Zs')
+ \p{Zs} General Category 'Zs'
+* \p{Z} Alias for \p{Z} (Major Category 'Z')
+ \p{Z} Major Category 'Z'
+ \p{_CanonDCIJ} (for internal casefolding use)
+ \p{_CaseIgnorable} (for internal casefolding use)
+ \p{_CombAbove} (for internal casefolding use)
diff --git a/Master/tlpkg/tlperl.old/lib/unicore/PropertyAliases.txt b/Master/tlpkg/tlperl.old/lib/unicore/PropertyAliases.txt new file mode 100644 index 00000000000..39b14e5e6f3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/PropertyAliases.txt @@ -0,0 +1,163 @@ +# PropertyAliases-4.1.0.txt +# Date: 2005-02-26, 11:13:41 GMT [MD] +# +# Unicode Character Database +# Copyright (c) 1991-2005 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html +# This file contains aliases for properties used in the UCD. +# These names can be used for XML formats of UCD data, for regular-expression +# property tests, and other programmatic textual descriptions of Unicode data. +# For information on which properties are normative, see UCD.html. +# +# The names may be translated in appropriate environments, and additional +# aliases may be useful. +# +# FORMAT +# +# Each line has two or more fields, separated by semicolons. +# +# First Field: The first field is an abbreviated name for the property. +# +# Second Field: The second field is a long name +# +# The above are the preferred aliases. Other aliases may be listed in additional fields. +# +# Loose matching should be applied to all property names and property values, with +# the exception of String Property values. With loose matching of property names and +# values, the case distinctions, whitespace, and '_' are ignored. For Numeric Property +# values, numeric equivalencies are applied: thus "01.00" is equivalent to "1". +# +# NOTE: Property value names are NOT unique across properties. For example: +# +# AL means Arabic Letter for the Bidi_Class property, and +# AL means Alpha_Left for the Combining_Class property, and +# AL means Alphabetic for the Line_Break property. +# +# In addition, some property names may be the same as some property value names. +# For example: +# +# sc means the Script property, and +# Sc means the General_Category property value Currency_Symbol (Sc) +# +# The combination of property value and property name is, however, unique. +# +# For more information, see UTS #18: Regular Expression Guidelines +# ================================================ + + +# ================================================ +# Numeric Properties +# ================================================ +nv ; Numeric_Value + +# ================================================ +# String Properties +# ================================================ +bmg ; Bidi_Mirroring_Glyph +cf ; Case_Folding +dm ; Decomposition_Mapping +FC_NFKC ; FC_NFKC_Closure +lc ; Lowercase_Mapping +scc ; Special_Case_Condition +sfc ; Simple_Case_Folding +slc ; Simple_Lowercase_Mapping +stc ; Simple_Titlecase_Mapping +suc ; Simple_Uppercase_Mapping +tc ; Titlecase_Mapping +uc ; Uppercase_Mapping + +# ================================================ +# Miscellaneous Properties +# ================================================ +isc ; ISO_Comment +na ; Name +na1 ; Unicode_1_Name +URS ; Unicode_Radical_Stroke + +# ================================================ +# Catalog Properties +# ================================================ +age ; Age +blk ; Block +sc ; Script + +# ================================================ +# Enumerated Properties +# ================================================ +bc ; Bidi_Class +ccc ; Canonical_Combining_Class +dt ; Decomposition_Type +ea ; East_Asian_Width +gc ; General_Category +GCB ; Grapheme_Cluster_Break +hst ; Hangul_Syllable_Type +jg ; Joining_Group +jt ; Joining_Type +lb ; Line_Break +NFC_QC ; NFC_Quick_Check +NFD_QC ; NFD_Quick_Check +NFKC_QC ; NFKC_Quick_Check +NFKD_QC ; NFKD_Quick_Check +nt ; Numeric_Type +SB ; Sentence_Break +WB ; Word_Break + +# ================================================ +# Binary Properties +# ================================================ +AHex ; ASCII_Hex_Digit +Alpha ; Alphabetic +Bidi_C ; Bidi_Control +Bidi_M ; Bidi_Mirrored +CE ; Composition_Exclusion +Comp_Ex ; Full_Composition_Exclusion +Dash ; Dash +Dep ; Deprecated +DI ; Default_Ignorable_Code_Point +Dia ; Diacritic +Ext ; Extender +Gr_Base ; Grapheme_Base +Gr_Ext ; Grapheme_Extend +Gr_Link ; Grapheme_Link +Hex ; Hex_Digit +Hyphen ; Hyphen +IDC ; ID_Continue +Ideo ; Ideographic +IDS ; ID_Start +IDSB ; IDS_Binary_Operator +IDST ; IDS_Trinary_Operator +Join_C ; Join_Control +LOE ; Logical_Order_Exception +Lower ; Lowercase +Math ; Math +NChar ; Noncharacter_Code_Point +OAlpha ; Other_Alphabetic +ODI ; Other_Default_Ignorable_Code_Point +OGr_Ext ; Other_Grapheme_Extend +OIDC ; Other_ID_Continue +OIDS ; Other_ID_Start +OLower ; Other_Lowercase +OMath ; Other_Math +OUpper ; Other_Uppercase +Pat_Syn ; Pattern_Syntax +Pat_WS ; Pattern_White_Space +QMark ; Quotation_Mark +Radical ; Radical +SD ; Soft_Dotted +STerm ; STerm +Term ; Terminal_Punctuation +UIdeo ; Unified_Ideograph +Upper ; Uppercase +VS ; Variation_Selector +WSpace ; White_Space ; space +XIDC ; XID_Continue +XIDS ; XID_Start +XO_NFC ; Expands_On_NFC +XO_NFD ; Expands_On_NFD +XO_NFKC ; Expands_On_NFKC +XO_NFKD ; Expands_On_NFKD + +# ================================================ +# Total: 88 + diff --git a/Master/tlpkg/tlperl.old/lib/unicore/ReadMe.txt b/Master/tlpkg/tlperl.old/lib/unicore/ReadMe.txt new file mode 100644 index 00000000000..0ad5623c830 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/ReadMe.txt @@ -0,0 +1,24 @@ +2005 March 30 + +Welcome to the Unicode Character Database + +This directory contains contributory data files +for the Unicode Character Database of the Unicode Standard. + +Copyright (c) 1991-2005 Unicode, Inc. +For terms of use, see http://www.unicode.org/terms_of_use.html + +For an overview of how to access a specific version of +the Unicode Character Database (UCD) and other information, see: + +http://www.unicode.org/ucd/ + +If you accessed this file via the URL: + +http://www.unicode.org/Public/UNIDATA/ReadMe.txt + +then you are looking at the most current version of the UCD. +Otherwise the version number of the UCD is part of the path name. + +The file UCD.html in this directory, as well as any file +headers, where present, also identify the version of the UCD. diff --git a/Master/tlpkg/tlperl.old/lib/unicore/Scripts.txt b/Master/tlpkg/tlperl.old/lib/unicore/Scripts.txt new file mode 100644 index 00000000000..8e2bae372ad --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/Scripts.txt @@ -0,0 +1,1464 @@ +# Scripts-4.1.0.txt +# Date: 2005-03-10, 01:56:19 GMT [MD] +# +# Unicode Character Database +# Copyright (c) 1991-2005 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html + +# ================================================ + +# Property: Script + +# All code points not explicitly listed for Script +# have the value Common (Zyyy). + +# ================================================ + +0000..001F ; Common # Cc [32] <control-0000>..<control-001F> +0020 ; Common # Zs SPACE +0021..0023 ; Common # Po [3] EXCLAMATION MARK..NUMBER SIGN +0024 ; Common # Sc DOLLAR SIGN +0025..0027 ; Common # Po [3] PERCENT SIGN..APOSTROPHE +0028 ; Common # Ps LEFT PARENTHESIS +0029 ; Common # Pe RIGHT PARENTHESIS +002A ; Common # Po ASTERISK +002B ; Common # Sm PLUS SIGN +002C ; Common # Po COMMA +002D ; Common # Pd HYPHEN-MINUS +002E..002F ; Common # Po [2] FULL STOP..SOLIDUS +0030..0039 ; Common # Nd [10] DIGIT ZERO..DIGIT NINE +003A..003B ; Common # Po [2] COLON..SEMICOLON +003C..003E ; Common # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN +003F..0040 ; Common # Po [2] QUESTION MARK..COMMERCIAL AT +005B ; Common # Ps LEFT SQUARE BRACKET +005C ; Common # Po REVERSE SOLIDUS +005D ; Common # Pe RIGHT SQUARE BRACKET +005E ; Common # Sk CIRCUMFLEX ACCENT +005F ; Common # Pc LOW LINE +0060 ; Common # Sk GRAVE ACCENT +007B ; Common # Ps LEFT CURLY BRACKET +007C ; Common # Sm VERTICAL LINE +007D ; Common # Pe RIGHT CURLY BRACKET +007E ; Common # Sm TILDE +007F..009F ; Common # Cc [33] <control-007F>..<control-009F> +00A0 ; Common # Zs NO-BREAK SPACE +00A1 ; Common # Po INVERTED EXCLAMATION MARK +00A2..00A5 ; Common # Sc [4] CENT SIGN..YEN SIGN +00A6..00A7 ; Common # So [2] BROKEN BAR..SECTION SIGN +00A8 ; Common # Sk DIAERESIS +00A9 ; Common # So COPYRIGHT SIGN +00AB ; Common # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC ; Common # Sm NOT SIGN +00AD ; Common # Cf SOFT HYPHEN +00AE ; Common # So REGISTERED SIGN +00AF ; Common # Sk MACRON +00B0 ; Common # So DEGREE SIGN +00B1 ; Common # Sm PLUS-MINUS SIGN +00B2..00B3 ; Common # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE +00B4 ; Common # Sk ACUTE ACCENT +00B5 ; Common # L& MICRO SIGN +00B6 ; Common # So PILCROW SIGN +00B7 ; Common # Po MIDDLE DOT +00B8 ; Common # Sk CEDILLA +00B9 ; Common # No SUPERSCRIPT ONE +00BB ; Common # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BC..00BE ; Common # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS +00BF ; Common # Po INVERTED QUESTION MARK +00D7 ; Common # Sm MULTIPLICATION SIGN +00F7 ; Common # Sm DIVISION SIGN +02B9..02C1 ; Common # Lm [9] MODIFIER LETTER PRIME..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C5 ; Common # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD +02C6..02D1 ; Common # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02DF ; Common # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT +02E5..02ED ; Common # Sk [9] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER UNASPIRATED +02EE ; Common # Lm MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF ; Common # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +037E ; Common # Po GREEK QUESTION MARK +0387 ; Common # Po GREEK ANO TELEIA +0589 ; Common # Po ARMENIAN FULL STOP +0600..0603 ; Common # Cf [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA +060C ; Common # Po ARABIC COMMA +061B ; Common # Po ARABIC SEMICOLON +061F ; Common # Po ARABIC QUESTION MARK +0640 ; Common # Lm ARABIC TATWEEL +0660..0669 ; Common # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE +06DD ; Common # Cf ARABIC END OF AYAH +0964..0965 ; Common # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +0970 ; Common # Po DEVANAGARI ABBREVIATION SIGN +0E3F ; Common # Sc THAI CURRENCY SYMBOL BAHT +10FB ; Common # Po GEORGIAN PARAGRAPH SEPARATOR +16EB..16ED ; Common # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION +1735..1736 ; Common # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +2000..200A ; Common # Zs [11] EN QUAD..HAIR SPACE +200B ; Common # Cf ZERO WIDTH SPACE +200E..200F ; Common # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK +2010..2015 ; Common # Pd [6] HYPHEN..HORIZONTAL BAR +2016..2017 ; Common # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE +2018 ; Common # Pi LEFT SINGLE QUOTATION MARK +2019 ; Common # Pf RIGHT SINGLE QUOTATION MARK +201A ; Common # Ps SINGLE LOW-9 QUOTATION MARK +201B..201C ; Common # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK +201D ; Common # Pf RIGHT DOUBLE QUOTATION MARK +201E ; Common # Ps DOUBLE LOW-9 QUOTATION MARK +201F ; Common # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020..2027 ; Common # Po [8] DAGGER..HYPHENATION POINT +2028 ; Common # Zl LINE SEPARATOR +2029 ; Common # Zp PARAGRAPH SEPARATOR +202A..202E ; Common # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +202F ; Common # Zs NARROW NO-BREAK SPACE +2030..2038 ; Common # Po [9] PER MILLE SIGN..CARET +2039 ; Common # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; Common # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B..203E ; Common # Po [4] REFERENCE MARK..OVERLINE +203F..2040 ; Common # Pc [2] UNDERTIE..CHARACTER TIE +2041..2043 ; Common # Po [3] CARET INSERTION POINT..HYPHEN BULLET +2044 ; Common # Sm FRACTION SLASH +2045 ; Common # Ps LEFT SQUARE BRACKET WITH QUILL +2046 ; Common # Pe RIGHT SQUARE BRACKET WITH QUILL +2047..2051 ; Common # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY +2052 ; Common # Sm COMMERCIAL MINUS SIGN +2053 ; Common # Po SWUNG DASH +2054 ; Common # Pc INVERTED UNDERTIE +2055..205E ; Common # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS +205F ; Common # Zs MEDIUM MATHEMATICAL SPACE +2060..2063 ; Common # Cf [4] WORD JOINER..INVISIBLE SEPARATOR +206A..206F ; Common # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES +2070 ; Common # No SUPERSCRIPT ZERO +2074..2079 ; Common # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE +207A..207C ; Common # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN +207D ; Common # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; Common # Pe SUPERSCRIPT RIGHT PARENTHESIS +2080..2089 ; Common # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE +208A..208C ; Common # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN +208D ; Common # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; Common # Pe SUBSCRIPT RIGHT PARENTHESIS +20A0..20B5 ; Common # Sc [22] EURO-CURRENCY SIGN..CEDI SIGN +2100..2101 ; Common # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT +2102 ; Common # L& DOUBLE-STRUCK CAPITAL C +2103..2106 ; Common # So [4] DEGREE CELSIUS..CADA UNA +2107 ; Common # L& EULER CONSTANT +2108..2109 ; Common # So [2] SCRUPLE..DEGREE FAHRENHEIT +210A..2113 ; Common # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2114 ; Common # So L B BAR SYMBOL +2115 ; Common # L& DOUBLE-STRUCK CAPITAL N +2116..2118 ; Common # So [3] NUMERO SIGN..SCRIPT CAPITAL P +2119..211D ; Common # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +211E..2123 ; Common # So [6] PRESCRIPTION TAKE..VERSICLE +2124 ; Common # L& DOUBLE-STRUCK CAPITAL Z +2125 ; Common # So OUNCE SIGN +2127 ; Common # So INVERTED OHM SIGN +2128 ; Common # L& BLACK-LETTER CAPITAL Z +2129 ; Common # So TURNED GREEK SMALL LETTER IOTA +212C..212D ; Common # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C +212E ; Common # So ESTIMATED SYMBOL +212F..2131 ; Common # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F +2132 ; Common # So TURNED CAPITAL F +2133..2134 ; Common # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O +2135..2138 ; Common # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139 ; Common # L& INFORMATION SOURCE +213A..213B ; Common # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN +213C..213F ; Common # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2140..2144 ; Common # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y +2145..2149 ; Common # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214A ; Common # So PROPERTY LINE +214B ; Common # Sm TURNED AMPERSAND +214C ; Common # So PER SIGN +2153..215F ; Common # No [13] VULGAR FRACTION ONE THIRD..FRACTION NUMERATOR ONE +2160..2183 ; Common # Nl [36] ROMAN NUMERAL ONE..ROMAN NUMERAL REVERSED ONE HUNDRED +2190..2194 ; Common # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +2195..2199 ; Common # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219A..219B ; Common # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +219C..219F ; Common # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A0 ; Common # Sm RIGHTWARDS TWO HEADED ARROW +21A1..21A2 ; Common # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A3 ; Common # Sm RIGHTWARDS ARROW WITH TAIL +21A4..21A5 ; Common # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A6 ; Common # Sm RIGHTWARDS ARROW FROM BAR +21A7..21AD ; Common # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW +21AE ; Common # Sm LEFT RIGHT ARROW WITH STROKE +21AF..21CD ; Common # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF ; Common # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1 ; Common # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D2 ; Common # Sm RIGHTWARDS DOUBLE ARROW +21D3 ; Common # So DOWNWARDS DOUBLE ARROW +21D4 ; Common # Sm LEFT RIGHT DOUBLE ARROW +21D5..21F3 ; Common # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW +21F4..22FF ; Common # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP +2300..2307 ; Common # So [8] DIAMETER SIGN..WAVY LINE +2308..230B ; Common # Sm [4] LEFT CEILING..RIGHT FLOOR +230C..231F ; Common # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER +2320..2321 ; Common # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL +2322..2328 ; Common # So [7] FROWN..KEYBOARD +2329 ; Common # Ps LEFT-POINTING ANGLE BRACKET +232A ; Common # Pe RIGHT-POINTING ANGLE BRACKET +232B..237B ; Common # So [81] ERASE TO THE LEFT..NOT CHECK MARK +237C ; Common # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D..239A ; Common # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL +239B..23B3 ; Common # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM +23B4 ; Common # Ps TOP SQUARE BRACKET +23B5 ; Common # Pe BOTTOM SQUARE BRACKET +23B6 ; Common # Po BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET +23B7..23DB ; Common # So [37] RADICAL SYMBOL BOTTOM..FUSE +2400..2426 ; Common # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO +2440..244A ; Common # So [11] OCR HOOK..OCR DOUBLE BACKSLASH +2460..249B ; Common # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP +249C..24E9 ; Common # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +24EA..24FF ; Common # No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO +2500..25B6 ; Common # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE +25B7 ; Common # Sm WHITE RIGHT-POINTING TRIANGLE +25B8..25C0 ; Common # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE +25C1 ; Common # Sm WHITE LEFT-POINTING TRIANGLE +25C2..25F7 ; Common # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8..25FF ; Common # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE +2600..266E ; Common # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN +266F ; Common # Sm MUSIC SHARP SIGN +2670..269C ; Common # So [45] WEST SYRIAC CROSS..FLEUR-DE-LIS +26A0..26B1 ; Common # So [18] WARNING SIGN..FUNERAL URN +2701..2704 ; Common # So [4] UPPER BLADE SCISSORS..WHITE SCISSORS +2706..2709 ; Common # So [4] TELEPHONE LOCATION SIGN..ENVELOPE +270C..2727 ; Common # So [28] VICTORY HAND..WHITE FOUR POINTED STAR +2729..274B ; Common # So [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274D ; Common # So SHADOWED WHITE CIRCLE +274F..2752 ; Common # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE +2756 ; Common # So BLACK DIAMOND MINUS WHITE X +2758..275E ; Common # So [7] LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +2761..2767 ; Common # So [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET +2768 ; Common # Ps MEDIUM LEFT PARENTHESIS ORNAMENT +2769 ; Common # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT +276A ; Common # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B ; Common # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C ; Common # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D ; Common # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E ; Common # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F ; Common # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 ; Common # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 ; Common # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 ; Common # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 ; Common # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 ; Common # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 ; Common # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT +2776..2793 ; Common # No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +2794 ; Common # So HEAVY WIDE-HEADED RIGHTWARDS ARROW +2798..27AF ; Common # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B1..27BE ; Common # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW +27C0..27C4 ; Common # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET +27C5 ; Common # Ps LEFT S-SHAPED BAG DELIMITER +27C6 ; Common # Pe RIGHT S-SHAPED BAG DELIMITER +27D0..27E5 ; Common # Sm [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK +27E6 ; Common # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; Common # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; Common # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; Common # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; Common # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; Common # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27F0..27FF ; Common # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2900..2982 ; Common # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON +2983 ; Common # Ps LEFT WHITE CURLY BRACKET +2984 ; Common # Pe RIGHT WHITE CURLY BRACKET +2985 ; Common # Ps LEFT WHITE PARENTHESIS +2986 ; Common # Pe RIGHT WHITE PARENTHESIS +2987 ; Common # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; Common # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; Common # Ps Z NOTATION LEFT BINDING BRACKET +298A ; Common # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; Common # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; Common # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; Common # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; Common # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; Common # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; Common # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; Common # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; Common # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; Common # Ps LEFT ARC LESS-THAN BRACKET +2994 ; Common # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; Common # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; Common # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; Common # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; Common # Pe RIGHT BLACK TORTOISE SHELL BRACKET +2999..29D7 ; Common # Sm [63] DOTTED FENCE..BLACK HOURGLASS +29D8 ; Common # Ps LEFT WIGGLY FENCE +29D9 ; Common # Pe RIGHT WIGGLY FENCE +29DA ; Common # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; Common # Pe RIGHT DOUBLE WIGGLY FENCE +29DC..29FB ; Common # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS +29FC ; Common # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; Common # Pe RIGHT-POINTING CURVED ANGLE BRACKET +29FE..2AFF ; Common # Sm [258] TINY..N-ARY WHITE VERTICAL BAR +2B00..2B13 ; Common # So [20] NORTH EAST WHITE ARROW..SQUARE WITH BOTTOM HALF BLACK +2E00..2E01 ; Common # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02 ; Common # Pi LEFT SUBSTITUTION BRACKET +2E03 ; Common # Pf RIGHT SUBSTITUTION BRACKET +2E04 ; Common # Pi LEFT DOTTED SUBSTITUTION BRACKET +2E05 ; Common # Pf RIGHT DOTTED SUBSTITUTION BRACKET +2E06..2E08 ; Common # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER +2E09 ; Common # Pi LEFT TRANSPOSITION BRACKET +2E0A ; Common # Pf RIGHT TRANSPOSITION BRACKET +2E0B ; Common # Po RAISED SQUARE +2E0C ; Common # Pi LEFT RAISED OMISSION BRACKET +2E0D ; Common # Pf RIGHT RAISED OMISSION BRACKET +2E0E..2E16 ; Common # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE +2E17 ; Common # Pd DOUBLE OBLIQUE HYPHEN +2E1C ; Common # Pi LEFT LOW PARAPHRASE BRACKET +2E1D ; Common # Pf RIGHT LOW PARAPHRASE BRACKET +2FF0..2FFB ; Common # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +3000 ; Common # Zs IDEOGRAPHIC SPACE +3001..3003 ; Common # Po [3] IDEOGRAPHIC COMMA..DITTO MARK +3004 ; Common # So JAPANESE INDUSTRIAL STANDARD SYMBOL +3006 ; Common # Lo IDEOGRAPHIC CLOSING MARK +3008 ; Common # Ps LEFT ANGLE BRACKET +3009 ; Common # Pe RIGHT ANGLE BRACKET +300A ; Common # Ps LEFT DOUBLE ANGLE BRACKET +300B ; Common # Pe RIGHT DOUBLE ANGLE BRACKET +300C ; Common # Ps LEFT CORNER BRACKET +300D ; Common # Pe RIGHT CORNER BRACKET +300E ; Common # Ps LEFT WHITE CORNER BRACKET +300F ; Common # Pe RIGHT WHITE CORNER BRACKET +3010 ; Common # Ps LEFT BLACK LENTICULAR BRACKET +3011 ; Common # Pe RIGHT BLACK LENTICULAR BRACKET +3012..3013 ; Common # So [2] POSTAL MARK..GETA MARK +3014 ; Common # Ps LEFT TORTOISE SHELL BRACKET +3015 ; Common # Pe RIGHT TORTOISE SHELL BRACKET +3016 ; Common # Ps LEFT WHITE LENTICULAR BRACKET +3017 ; Common # Pe RIGHT WHITE LENTICULAR BRACKET +3018 ; Common # Ps LEFT WHITE TORTOISE SHELL BRACKET +3019 ; Common # Pe RIGHT WHITE TORTOISE SHELL BRACKET +301A ; Common # Ps LEFT WHITE SQUARE BRACKET +301B ; Common # Pe RIGHT WHITE SQUARE BRACKET +301C ; Common # Pd WAVE DASH +301D ; Common # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F ; Common # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +3020 ; Common # So POSTAL MARK FACE +3030 ; Common # Pd WAVY DASH +3031..3035 ; Common # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +3036..3037 ; Common # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +303C ; Common # Lo MASU MARK +303D ; Common # Po PART ALTERNATION MARK +303E..303F ; Common # So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE +309B..309C ; Common # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +30A0 ; Common # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN +30FB ; Common # Po KATAKANA MIDDLE DOT +30FC ; Common # Lm KATAKANA-HIRAGANA PROLONGED SOUND MARK +3190..3191 ; Common # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK +3192..3195 ; Common # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK +3196..319F ; Common # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK +31C0..31CF ; Common # So [16] CJK STROKE T..CJK STROKE N +3220..3229 ; Common # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN +322A..3243 ; Common # So [26] PARENTHESIZED IDEOGRAPH MOON..PARENTHESIZED IDEOGRAPH REACH +3250 ; Common # So PARTNERSHIP SIGN +3251..325F ; Common # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE +327E..327F ; Common # So [2] CIRCLED HANGUL IEUNG U..KOREAN STANDARD SYMBOL +3280..3289 ; Common # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN +328A..32B0 ; Common # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT +32B1..32BF ; Common # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY +32C0..32FE ; Common # So [63] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..CIRCLED KATAKANA WO +3300..33FF ; Common # So [256] SQUARE APAATO..SQUARE GAL +4DC0..4DFF ; Common # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION +A700..A716 ; Common # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +E000..F8FF ; Common # Co [6400] <private-use-E000>..<private-use-F8FF> +FD3E ; Common # Ps ORNATE LEFT PARENTHESIS +FD3F ; Common # Pe ORNATE RIGHT PARENTHESIS +FDFD ; Common # So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +FE10..FE16 ; Common # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19 ; Common # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +FE30 ; Common # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31..FE32 ; Common # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +FE33..FE34 ; Common # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45..FE46 ; Common # Po [2] SESAME DOT..WHITE SESAME DOT +FE47 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49..FE4C ; Common # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE +FE4D..FE4F ; Common # Pc [3] DASHED LOW LINE..WAVY LOW LINE +FE50..FE52 ; Common # Po [3] SMALL COMMA..SMALL FULL STOP +FE54..FE57 ; Common # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK +FE58 ; Common # Pd SMALL EM DASH +FE59 ; Common # Ps SMALL LEFT PARENTHESIS +FE5A ; Common # Pe SMALL RIGHT PARENTHESIS +FE5B ; Common # Ps SMALL LEFT CURLY BRACKET +FE5C ; Common # Pe SMALL RIGHT CURLY BRACKET +FE5D ; Common # Ps SMALL LEFT TORTOISE SHELL BRACKET +FE5E ; Common # Pe SMALL RIGHT TORTOISE SHELL BRACKET +FE5F..FE61 ; Common # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK +FE62 ; Common # Sm SMALL PLUS SIGN +FE63 ; Common # Pd SMALL HYPHEN-MINUS +FE64..FE66 ; Common # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN +FE68 ; Common # Po SMALL REVERSE SOLIDUS +FE69 ; Common # Sc SMALL DOLLAR SIGN +FE6A..FE6B ; Common # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT +FEFF ; Common # Cf ZERO WIDTH NO-BREAK SPACE +FF01..FF03 ; Common # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN +FF04 ; Common # Sc FULLWIDTH DOLLAR SIGN +FF05..FF07 ; Common # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE +FF08 ; Common # Ps FULLWIDTH LEFT PARENTHESIS +FF09 ; Common # Pe FULLWIDTH RIGHT PARENTHESIS +FF0A ; Common # Po FULLWIDTH ASTERISK +FF0B ; Common # Sm FULLWIDTH PLUS SIGN +FF0C ; Common # Po FULLWIDTH COMMA +FF0D ; Common # Pd FULLWIDTH HYPHEN-MINUS +FF0E..FF0F ; Common # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS +FF10..FF19 ; Common # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF1A..FF1B ; Common # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON +FF1C..FF1E ; Common # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN +FF1F..FF20 ; Common # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT +FF3B ; Common # Ps FULLWIDTH LEFT SQUARE BRACKET +FF3C ; Common # Po FULLWIDTH REVERSE SOLIDUS +FF3D ; Common # Pe FULLWIDTH RIGHT SQUARE BRACKET +FF3E ; Common # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF3F ; Common # Pc FULLWIDTH LOW LINE +FF40 ; Common # Sk FULLWIDTH GRAVE ACCENT +FF5B ; Common # Ps FULLWIDTH LEFT CURLY BRACKET +FF5C ; Common # Sm FULLWIDTH VERTICAL LINE +FF5D ; Common # Pe FULLWIDTH RIGHT CURLY BRACKET +FF5E ; Common # Sm FULLWIDTH TILDE +FF5F ; Common # Ps FULLWIDTH LEFT WHITE PARENTHESIS +FF60 ; Common # Pe FULLWIDTH RIGHT WHITE PARENTHESIS +FF61 ; Common # Po HALFWIDTH IDEOGRAPHIC FULL STOP +FF62 ; Common # Ps HALFWIDTH LEFT CORNER BRACKET +FF63 ; Common # Pe HALFWIDTH RIGHT CORNER BRACKET +FF64..FF65 ; Common # Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT +FF70 ; Common # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF9E..FF9F ; Common # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFE0..FFE1 ; Common # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN +FFE2 ; Common # Sm FULLWIDTH NOT SIGN +FFE3 ; Common # Sk FULLWIDTH MACRON +FFE4 ; Common # So FULLWIDTH BROKEN BAR +FFE5..FFE6 ; Common # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN +FFE8 ; Common # So HALFWIDTH FORMS LIGHT VERTICAL +FFE9..FFEC ; Common # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW +FFED..FFEE ; Common # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE +FFF9..FFFB ; Common # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR +FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER +10100..10101 ; Common # Po [2] AEGEAN WORD SEPARATOR LINE..AEGEAN WORD SEPARATOR DOT +10102 ; Common # So AEGEAN CHECK MARK +10107..10133 ; Common # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND +10137..1013F ; Common # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT +1D000..1D0F5 ; Common # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100..1D126 ; Common # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 +1D12A..1D164 ; Common # So [59] MUSICAL SYMBOL DOUBLE SHARP..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D165..1D166 ; Common # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D16A..1D16C ; Common # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D..1D172 ; Common # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D173..1D17A ; Common # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +1D183..1D184 ; Common # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN +1D18C..1D1A9 ; Common # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH +1D1AE..1D1DD ; Common # So [48] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL PES SUBPUNCTIS +1D300..1D356 ; Common # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING +1D400..1D454 ; Common # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; Common # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; Common # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; Common # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; Common # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; Common # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; Common # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; Common # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; Common # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; Common # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; Common # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; Common # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; Common # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; Common # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; Common # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; Common # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; Common # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; Common # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1 ; Common # Sm MATHEMATICAL BOLD NABLA +1D6C2..1D6DA ; Common # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DB ; Common # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC..1D6FA ; Common # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB ; Common # Sm MATHEMATICAL ITALIC NABLA +1D6FC..1D714 ; Common # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D715 ; Common # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716..1D734 ; Common # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735 ; Common # Sm MATHEMATICAL BOLD ITALIC NABLA +1D736..1D74E ; Common # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F ; Common # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750..1D76E ; Common # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F ; Common # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D770..1D788 ; Common # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A..1D7A8 ; Common # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA..1D7C2 ; Common # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4..1D7C9 ; Common # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +1D7CE..1D7FF ; Common # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +E0001 ; Common # Cf LANGUAGE TAG +E0020..E007F ; Common # Cf [96] TAG SPACE..CANCEL TAG +F0000..FFFFD ; Common # Co [65534] <private-use-F0000>..<private-use-FFFFD> +100000..10FFFD; Common # Co [65534] <private-use-100000>..<private-use-10FFFD> + +# The above property value applies to 878924 code points not listed here. +# Total code points: 1021355 + +# ================================================ + +0041..005A ; Latin # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +0061..007A ; Latin # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +00AA ; Latin # L& FEMININE ORDINAL INDICATOR +00BA ; Latin # L& MASCULINE ORDINAL INDICATOR +00C0..00D6 ; Latin # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D8..00F6 ; Latin # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS +00F8..01BA ; Latin # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BB ; Latin # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF ; Latin # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3 ; Latin # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..0241 ; Latin # L& [126] LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER GLOTTAL STOP +0250..02AF ; Latin # L& [96] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02B8 ; Latin # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y +02E0..02E4 ; Latin # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +1D00..1D25 ; Latin # L& [38] LATIN LETTER SMALL CAPITAL A..LATIN LETTER AIN +1D2C..1D5C ; Latin # Lm [49] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL AIN +1D62..1D65 ; Latin # L& [4] LATIN SUBSCRIPT SMALL LETTER I..LATIN SUBSCRIPT SMALL LETTER V +1D6B..1D77 ; Latin # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D79..1D9A ; Latin # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B..1DBF ; Latin # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +1E00..1E9B ; Latin # L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE +1EA0..1EF9 ; Latin # L& [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE +2071 ; Latin # L& SUPERSCRIPT LATIN SMALL LETTER I +207F ; Latin # L& SUPERSCRIPT LATIN SMALL LETTER N +2090..2094 ; Latin # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA +212A..212B ; Latin # L& [2] KELVIN SIGN..ANGSTROM SIGN +FB00..FB06 ; Latin # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FF21..FF3A ; Latin # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF41..FF5A ; Latin # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z + +# Total code points: 1037 + +# ================================================ + +0374..0375 ; Greek # Sk [2] GREEK NUMERAL SIGN..GREEK LOWER NUMERAL SIGN +037A ; Greek # Lm GREEK YPOGEGRAMMENI +0384..0385 ; Greek # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS +0386 ; Greek # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0388..038A ; Greek # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; Greek # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..03A1 ; Greek # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO +03A3..03CE ; Greek # L& [44] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS +03D0..03E1 ; Greek # L& [18] GREEK BETA SYMBOL..GREEK SMALL LETTER SAMPI +03F0..03F5 ; Greek # L& [6] GREEK KAPPA SYMBOL..GREEK LUNATE EPSILON SYMBOL +03F6 ; Greek # Sm GREEK REVERSED LUNATE EPSILON SYMBOL +03F7..03FF ; Greek # L& [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +1D26..1D2A ; Greek # L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI +1D5D..1D61 ; Greek # Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI +1D66..1D6A ; Greek # L& [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI +1F00..1F15 ; Greek # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; Greek # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; Greek # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; Greek # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; Greek # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; Greek # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; Greek # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; Greek # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD ; Greek # Sk GREEK KORONIS +1FBE ; Greek # L& GREEK PROSGEGRAMMENI +1FBF..1FC1 ; Greek # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +1FC2..1FC4 ; Greek # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; Greek # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD..1FCF ; Greek # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FD0..1FD3 ; Greek # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; Greek # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD..1FDF ; Greek # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FE0..1FEC ; Greek # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FED..1FEF ; Greek # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FF2..1FF4 ; Greek # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; Greek # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD..1FFE ; Greek # Sk [2] GREEK OXIA..GREEK DASIA +2126 ; Greek # L& OHM SIGN +10140..10174 ; Greek # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS +10175..10178 ; Greek # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN +10179..10189 ; Greek # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN +1018A ; Greek # No GREEK ZERO SIGN +1D200..1D241 ; Greek # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D242..1D244 ; Greek # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1D245 ; Greek # So GREEK MUSICAL LEIMMA + +# Total code points: 502 + +# ================================================ + +0400..0481 ; Cyrillic # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA +0482 ; Cyrillic # So CYRILLIC THOUSANDS SIGN +0483..0486 ; Cyrillic # Mn [4] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA +0488..0489 ; Cyrillic # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN +048A..04CE ; Cyrillic # L& [69] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EM WITH TAIL +04D0..04F9 ; Cyrillic # L& [42] CYRILLIC CAPITAL LETTER A WITH BREVE..CYRILLIC SMALL LETTER YERU WITH DIAERESIS +0500..050F ; Cyrillic # L& [16] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER KOMI TJE +1D2B ; Cyrillic # L& CYRILLIC LETTER SMALL CAPITAL EL +1D78 ; Cyrillic # Lm MODIFIER LETTER CYRILLIC EN + +# Total code points: 266 + +# ================================================ + +0531..0556 ; Armenian # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559 ; Armenian # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +055A..055F ; Armenian # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK +0561..0587 ; Armenian # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN +058A ; Armenian # Pd ARMENIAN HYPHEN +FB13..FB17 ; Armenian # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH + +# Total code points: 90 + +# ================================================ + +0591..05B9 ; Hebrew # Mn [41] HEBREW ACCENT ETNAHTA..HEBREW POINT HOLAM +05BB..05BD ; Hebrew # Mn [3] HEBREW POINT QUBUTS..HEBREW POINT METEG +05BE ; Hebrew # Po HEBREW PUNCTUATION MAQAF +05BF ; Hebrew # Mn HEBREW POINT RAFE +05C0 ; Hebrew # Po HEBREW PUNCTUATION PASEQ +05C1..05C2 ; Hebrew # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C3 ; Hebrew # Po HEBREW PUNCTUATION SOF PASUQ +05C4..05C5 ; Hebrew # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C6 ; Hebrew # Po HEBREW PUNCTUATION NUN HAFUKHA +05C7 ; Hebrew # Mn HEBREW POINT QAMATS QATAN +05D0..05EA ; Hebrew # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05F0..05F2 ; Hebrew # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD +05F3..05F4 ; Hebrew # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM +FB1D ; Hebrew # Lo HEBREW LETTER YOD WITH HIRIQ +FB1E ; Hebrew # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FB1F..FB28 ; Hebrew # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB29 ; Hebrew # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN +FB2A..FB36 ; Hebrew # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C ; Hebrew # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E ; Hebrew # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41 ; Hebrew # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44 ; Hebrew # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FB4F ; Hebrew # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED + +# Total code points: 132 + +# ================================================ + +060B ; Arabic # Sc AFGHANI SIGN +060D ; Arabic # Po ARABIC DATE SEPARATOR +060E..060F ; Arabic # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA +0610..0615 ; Arabic # Mn [6] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH +061E ; Arabic # Po ARABIC TRIPLE DOT PUNCTUATION MARK +0621..063A ; Arabic # Lo [26] ARABIC LETTER HAMZA..ARABIC LETTER GHAIN +0641..064A ; Arabic # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +0656..065E ; Arabic # Mn [9] ARABIC SUBSCRIPT ALEF..ARABIC FATHA WITH TWO DOTS +066A..066D ; Arabic # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR +066E..066F ; Arabic # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0671..06D3 ; Arabic # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D4 ; Arabic # Po ARABIC FULL STOP +06D5 ; Arabic # Lo ARABIC LETTER AE +06D6..06DC ; Arabic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DE ; Arabic # Me ARABIC START OF RUB EL HIZB +06DF..06E4 ; Arabic # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E5..06E6 ; Arabic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06E7..06E8 ; Arabic # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06E9 ; Arabic # So ARABIC PLACE OF SAJDAH +06EA..06ED ; Arabic # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +06EE..06EF ; Arabic # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06F0..06F9 ; Arabic # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE +06FA..06FC ; Arabic # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FD..06FE ; Arabic # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN +06FF ; Arabic # Lo ARABIC LETTER HEH WITH INVERTED V +0750..076D ; Arabic # Lo [30] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE +FB50..FBB1 ; Arabic # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBD3..FD3D ; Arabic # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD50..FD8F ; Arabic # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FDC7 ; Arabic # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDF0..FDFB ; Arabic # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +FDFC ; Arabic # Sc RIAL SIGN +FE70..FE74 ; Arabic # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM +FE76..FEFC ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM + +# Total code points: 966 + +# ================================================ + +0700..070D ; Syriac # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS +070F ; Syriac # Cf SYRIAC ABBREVIATION MARK +0710 ; Syriac # Lo SYRIAC LETTER ALAPH +0711 ; Syriac # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0712..072F ; Syriac # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +0730..074A ; Syriac # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +074D..074F ; Syriac # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE + +# Total code points: 77 + +# ================================================ + +0780..07A5 ; Thaana # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU +07A6..07B0 ; Thaana # Mn [11] THAANA ABAFILI..THAANA SUKUN +07B1 ; Thaana # Lo THAANA LETTER NAA + +# Total code points: 50 + +# ================================================ + +0901..0902 ; Devanagari # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA +0903 ; Devanagari # Mc DEVANAGARI SIGN VISARGA +0904..0939 ; Devanagari # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093C ; Devanagari # Mn DEVANAGARI SIGN NUKTA +093D ; Devanagari # Lo DEVANAGARI SIGN AVAGRAHA +093E..0940 ; Devanagari # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0941..0948 ; Devanagari # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +0949..094C ; Devanagari # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +094D ; Devanagari # Mn DEVANAGARI SIGN VIRAMA +0950 ; Devanagari # Lo DEVANAGARI OM +0951..0954 ; Devanagari # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT +0958..0961 ; Devanagari # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0962..0963 ; Devanagari # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0966..096F ; Devanagari # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE +097D ; Devanagari # Lo DEVANAGARI LETTER GLOTTAL STOP + +# Total code points: 103 + +# ================================================ + +0981 ; Bengali # Mn BENGALI SIGN CANDRABINDU +0982..0983 ; Bengali # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +0985..098C ; Bengali # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990 ; Bengali # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8 ; Bengali # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0 ; Bengali # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2 ; Bengali # Lo BENGALI LETTER LA +09B6..09B9 ; Bengali # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BC ; Bengali # Mn BENGALI SIGN NUKTA +09BD ; Bengali # Lo BENGALI SIGN AVAGRAHA +09BE..09C0 ; Bengali # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C1..09C4 ; Bengali # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09C7..09C8 ; Bengali # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC ; Bengali # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09CD ; Bengali # Mn BENGALI SIGN VIRAMA +09CE ; Bengali # Lo BENGALI LETTER KHANDA TA +09D7 ; Bengali # Mc BENGALI AU LENGTH MARK +09DC..09DD ; Bengali # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1 ; Bengali # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09E2..09E3 ; Bengali # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +09E6..09EF ; Bengali # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE +09F0..09F1 ; Bengali # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09F2..09F3 ; Bengali # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN +09F4..09F9 ; Bengali # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA ; Bengali # So BENGALI ISSHAR + +# Total code points: 91 + +# ================================================ + +0A01..0A02 ; Gurmukhi # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A03 ; Gurmukhi # Mc GURMUKHI SIGN VISARGA +0A05..0A0A ; Gurmukhi # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU +0A0F..0A10 ; Gurmukhi # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28 ; Gurmukhi # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30 ; Gurmukhi # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33 ; Gurmukhi # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36 ; Gurmukhi # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39 ; Gurmukhi # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A3C ; Gurmukhi # Mn GURMUKHI SIGN NUKTA +0A3E..0A40 ; Gurmukhi # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A41..0A42 ; Gurmukhi # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; Gurmukhi # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4D ; Gurmukhi # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A59..0A5C ; Gurmukhi # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E ; Gurmukhi # Lo GURMUKHI LETTER FA +0A66..0A6F ; Gurmukhi # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE +0A70..0A71 ; Gurmukhi # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A72..0A74 ; Gurmukhi # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR + +# Total code points: 77 + +# ================================================ + +0A81..0A82 ; Gujarati # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0A83 ; Gujarati # Mc GUJARATI SIGN VISARGA +0A85..0A8D ; Gujarati # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91 ; Gujarati # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8 ; Gujarati # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0 ; Gujarati # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3 ; Gujarati # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9 ; Gujarati # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABC ; Gujarati # Mn GUJARATI SIGN NUKTA +0ABD ; Gujarati # Lo GUJARATI SIGN AVAGRAHA +0ABE..0AC0 ; Gujarati # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC1..0AC5 ; Gujarati # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; Gujarati # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0AC9 ; Gujarati # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC ; Gujarati # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0ACD ; Gujarati # Mn GUJARATI SIGN VIRAMA +0AD0 ; Gujarati # Lo GUJARATI OM +0AE0..0AE1 ; Gujarati # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AE2..0AE3 ; Gujarati # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AE6..0AEF ; Gujarati # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +0AF1 ; Gujarati # Sc GUJARATI RUPEE SIGN + +# Total code points: 83 + +# ================================================ + +0B01 ; Oriya # Mn ORIYA SIGN CANDRABINDU +0B02..0B03 ; Oriya # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +0B05..0B0C ; Oriya # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L +0B0F..0B10 ; Oriya # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28 ; Oriya # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30 ; Oriya # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33 ; Oriya # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39 ; Oriya # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3C ; Oriya # Mn ORIYA SIGN NUKTA +0B3D ; Oriya # Lo ORIYA SIGN AVAGRAHA +0B3E ; Oriya # Mc ORIYA VOWEL SIGN AA +0B3F ; Oriya # Mn ORIYA VOWEL SIGN I +0B40 ; Oriya # Mc ORIYA VOWEL SIGN II +0B41..0B43 ; Oriya # Mn [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R +0B47..0B48 ; Oriya # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C ; Oriya # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B4D ; Oriya # Mn ORIYA SIGN VIRAMA +0B56 ; Oriya # Mn ORIYA AI LENGTH MARK +0B57 ; Oriya # Mc ORIYA AU LENGTH MARK +0B5C..0B5D ; Oriya # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61 ; Oriya # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B66..0B6F ; Oriya # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE +0B70 ; Oriya # So ORIYA ISSHAR +0B71 ; Oriya # Lo ORIYA LETTER WA + +# Total code points: 81 + +# ================================================ + +0B82 ; Tamil # Mn TAMIL SIGN ANUSVARA +0B83 ; Tamil # Lo TAMIL SIGN VISARGA +0B85..0B8A ; Tamil # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90 ; Tamil # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95 ; Tamil # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A ; Tamil # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C ; Tamil # Lo TAMIL LETTER JA +0B9E..0B9F ; Tamil # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4 ; Tamil # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA ; Tamil # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB9 ; Tamil # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA +0BBE..0BBF ; Tamil # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC0 ; Tamil # Mn TAMIL VOWEL SIGN II +0BC1..0BC2 ; Tamil # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8 ; Tamil # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC ; Tamil # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BCD ; Tamil # Mn TAMIL SIGN VIRAMA +0BD7 ; Tamil # Mc TAMIL AU LENGTH MARK +0BE6..0BEF ; Tamil # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE +0BF0..0BF2 ; Tamil # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND +0BF3..0BF8 ; Tamil # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN +0BF9 ; Tamil # Sc TAMIL RUPEE SIGN +0BFA ; Tamil # So TAMIL NUMBER SIGN + +# Total code points: 71 + +# ================================================ + +0C01..0C03 ; Telugu # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C05..0C0C ; Telugu # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10 ; Telugu # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28 ; Telugu # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C33 ; Telugu # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA +0C35..0C39 ; Telugu # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA +0C3E..0C40 ; Telugu # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C41..0C44 ; Telugu # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C46..0C48 ; Telugu # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4D ; Telugu # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C55..0C56 ; Telugu # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C60..0C61 ; Telugu # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C66..0C6F ; Telugu # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE + +# Total code points: 80 + +# ================================================ + +0C82..0C83 ; Kannada # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0C85..0C8C ; Kannada # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90 ; Kannada # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8 ; Kannada # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3 ; Kannada # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9 ; Kannada # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBC ; Kannada # Mn KANNADA SIGN NUKTA +0CBD ; Kannada # Lo KANNADA SIGN AVAGRAHA +0CBE ; Kannada # Mc KANNADA VOWEL SIGN AA +0CBF ; Kannada # Mn KANNADA VOWEL SIGN I +0CC0..0CC4 ; Kannada # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6 ; Kannada # Mn KANNADA VOWEL SIGN E +0CC7..0CC8 ; Kannada # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; Kannada # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CCC..0CCD ; Kannada # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +0CD5..0CD6 ; Kannada # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CDE ; Kannada # Lo KANNADA LETTER FA +0CE0..0CE1 ; Kannada # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +0CE6..0CEF ; Kannada # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE + +# Total code points: 82 + +# ================================================ + +0D02..0D03 ; Malayalam # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D05..0D0C ; Malayalam # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L +0D0E..0D10 ; Malayalam # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI +0D12..0D28 ; Malayalam # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA +0D2A..0D39 ; Malayalam # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA +0D3E..0D40 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II +0D41..0D43 ; Malayalam # Mn [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R +0D46..0D48 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D4A..0D4C ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0D4D ; Malayalam # Mn MALAYALAM SIGN VIRAMA +0D57 ; Malayalam # Mc MALAYALAM AU LENGTH MARK +0D60..0D61 ; Malayalam # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL +0D66..0D6F ; Malayalam # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE + +# Total code points: 78 + +# ================================================ + +0D82..0D83 ; Sinhala # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0D85..0D96 ; Sinhala # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1 ; Sinhala # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB ; Sinhala # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD ; Sinhala # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6 ; Sinhala # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0DCA ; Sinhala # Mn SINHALA SIGN AL-LAKUNA +0DCF..0DD1 ; Sinhala # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2..0DD4 ; Sinhala # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; Sinhala # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8..0DDF ; Sinhala # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DF2..0DF3 ; Sinhala # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DF4 ; Sinhala # Po SINHALA PUNCTUATION KUNDDALIYA + +# Total code points: 80 + +# ================================================ + +0E01..0E30 ; Thai # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E31 ; Thai # Mn THAI CHARACTER MAI HAN-AKAT +0E32..0E33 ; Thai # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +0E34..0E3A ; Thai # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E40..0E45 ; Thai # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46 ; Thai # Lm THAI CHARACTER MAIYAMOK +0E47..0E4E ; Thai # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +0E4F ; Thai # Po THAI CHARACTER FONGMAN +0E50..0E59 ; Thai # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE +0E5A..0E5B ; Thai # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT + +# Total code points: 86 + +# ================================================ + +0E81..0E82 ; Lao # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84 ; Lao # Lo LAO LETTER KHO TAM +0E87..0E88 ; Lao # Lo [2] LAO LETTER NGO..LAO LETTER CO +0E8A ; Lao # Lo LAO LETTER SO TAM +0E8D ; Lao # Lo LAO LETTER NYO +0E94..0E97 ; Lao # Lo [4] LAO LETTER DO..LAO LETTER THO TAM +0E99..0E9F ; Lao # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG +0EA1..0EA3 ; Lao # Lo [3] LAO LETTER MO..LAO LETTER LO LING +0EA5 ; Lao # Lo LAO LETTER LO LOOT +0EA7 ; Lao # Lo LAO LETTER WO +0EAA..0EAB ; Lao # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG +0EAD..0EB0 ; Lao # Lo [4] LAO LETTER O..LAO VOWEL SIGN A +0EB1 ; Lao # Mn LAO VOWEL SIGN MAI KAN +0EB2..0EB3 ; Lao # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +0EB4..0EB9 ; Lao # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU +0EBB..0EBC ; Lao # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO +0EBD ; Lao # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4 ; Lao # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6 ; Lao # Lm LAO KO LA +0EC8..0ECD ; Lao # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0ED0..0ED9 ; Lao # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE +0EDC..0EDD ; Lao # Lo [2] LAO HO NO..LAO HO MO + +# Total code points: 65 + +# ================================================ + +0F00 ; Tibetan # Lo TIBETAN SYLLABLE OM +0F01..0F03 ; Tibetan # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04..0F12 ; Tibetan # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD +0F13..0F17 ; Tibetan # So [5] TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F18..0F19 ; Tibetan # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F1A..0F1F ; Tibetan # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG +0F20..0F29 ; Tibetan # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE +0F2A..0F33 ; Tibetan # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO +0F34 ; Tibetan # So TIBETAN MARK BSDUS RTAGS +0F35 ; Tibetan # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F36 ; Tibetan # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F37 ; Tibetan # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F38 ; Tibetan # So TIBETAN MARK CHE MGO +0F39 ; Tibetan # Mn TIBETAN MARK TSA -PHRU +0F3A ; Tibetan # Ps TIBETAN MARK GUG RTAGS GYON +0F3B ; Tibetan # Pe TIBETAN MARK GUG RTAGS GYAS +0F3C ; Tibetan # Ps TIBETAN MARK ANG KHANG GYON +0F3D ; Tibetan # Pe TIBETAN MARK ANG KHANG GYAS +0F3E..0F3F ; Tibetan # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F40..0F47 ; Tibetan # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6A ; Tibetan # Lo [34] TIBETAN LETTER NYA..TIBETAN LETTER FIXED-FORM RA +0F71..0F7E ; Tibetan # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F7F ; Tibetan # Mc TIBETAN SIGN RNAM BCAD +0F80..0F84 ; Tibetan # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +0F85 ; Tibetan # Po TIBETAN MARK PALUTA +0F86..0F87 ; Tibetan # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0F88..0F8B ; Tibetan # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS +0F90..0F97 ; Tibetan # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; Tibetan # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FBE..0FC5 ; Tibetan # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE +0FC6 ; Tibetan # Mn TIBETAN SYMBOL PADMA GDAN +0FC7..0FCC ; Tibetan # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCF ; Tibetan # So TIBETAN SIGN RDEL NAG GSUM +0FD0..0FD1 ; Tibetan # Po [2] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK MNYAM YIG GI MGO RGYAN + +# Total code points: 195 + +# ================================================ + +1000..1021 ; Myanmar # Lo [34] MYANMAR LETTER KA..MYANMAR LETTER A +1023..1027 ; Myanmar # Lo [5] MYANMAR LETTER I..MYANMAR LETTER E +1029..102A ; Myanmar # Lo [2] MYANMAR LETTER O..MYANMAR LETTER AU +102C ; Myanmar # Mc MYANMAR VOWEL SIGN AA +102D..1030 ; Myanmar # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1031 ; Myanmar # Mc MYANMAR VOWEL SIGN E +1032 ; Myanmar # Mn MYANMAR VOWEL SIGN AI +1036..1037 ; Myanmar # Mn [2] MYANMAR SIGN ANUSVARA..MYANMAR SIGN DOT BELOW +1038 ; Myanmar # Mc MYANMAR SIGN VISARGA +1039 ; Myanmar # Mn MYANMAR SIGN VIRAMA +1040..1049 ; Myanmar # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE +104A..104F ; Myanmar # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE +1050..1055 ; Myanmar # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +1056..1057 ; Myanmar # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +1058..1059 ; Myanmar # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL + +# Total code points: 78 + +# ================================================ + +10A0..10C5 ; Georgian # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10D0..10FA ; Georgian # Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FC ; Georgian # Lm MODIFIER LETTER GEORGIAN NAR +2D00..2D25 ; Georgian # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE + +# Total code points: 120 + +# ================================================ + +1100..1159 ; Hangul # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH +115F..11A2 ; Hangul # Lo [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA +11A8..11F9 ; Hangul # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH +3131..318E ; Hangul # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +3200..321E ; Hangul # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU +3260..327D ; Hangul # So [30] CIRCLED HANGUL KIYEOK..CIRCLED KOREAN CHARACTER JUEUI +AC00..D7A3 ; Hangul # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +FFA0..FFBE ; Hangul # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7 ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7 ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC ; Hangul # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I + +# Total code points: 11619 + +# ================================================ + +1200..1248 ; Ethiopic # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA +124A..124D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258 ; Ethiopic # Lo ETHIOPIC SYLLABLE QHWA +125A..125D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1288 ; Ethiopic # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA +128A..128D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12B0 ; Ethiopic # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA +12B2..12B5 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0 ; Ethiopic # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12D6 ; Ethiopic # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..1310 ; Ethiopic # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA +1312..1315 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..135A ; Ethiopic # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA +135F ; Ethiopic # Mn ETHIOPIC COMBINING GEMINATION MARK +1360 ; Ethiopic # So ETHIOPIC SECTION MARK +1361..1368 ; Ethiopic # Po [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR +1369..137C ; Ethiopic # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND +1380..138F ; Ethiopic # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +1390..1399 ; Ethiopic # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT +2D80..2D96 ; Ethiopic # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +2DA0..2DA6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +2DA8..2DAE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +2DB0..2DB6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +2DB8..2DBE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +2DC0..2DC6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +2DC8..2DCE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +2DD0..2DD6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +2DD8..2DDE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO + +# Total code points: 461 + +# ================================================ + +13A0..13F4 ; Cherokee # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV + +# Total code points: 85 + +# ================================================ + +1401..166C ; Canadian_Aboriginal # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166D..166E ; Canadian_Aboriginal # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP +166F..1676 ; Canadian_Aboriginal # Lo [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA + +# Total code points: 630 + +# ================================================ + +1680 ; Ogham # Zs OGHAM SPACE MARK +1681..169A ; Ogham # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +169B ; Ogham # Ps OGHAM FEATHER MARK +169C ; Ogham # Pe OGHAM REVERSED FEATHER MARK + +# Total code points: 29 + +# ================================================ + +16A0..16EA ; Runic # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EE..16F0 ; Runic # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL + +# Total code points: 78 + +# ================================================ + +1780..17B3 ; Khmer # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B4..17B5 ; Khmer # Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B6 ; Khmer # Mc KHMER VOWEL SIGN AA +17B7..17BD ; Khmer # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17BE..17C5 ; Khmer # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C6 ; Khmer # Mn KHMER SIGN NIKAHIT +17C7..17C8 ; Khmer # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +17C9..17D3 ; Khmer # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17D4..17D6 ; Khmer # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH +17D7 ; Khmer # Lm KHMER SIGN LEK TOO +17D8..17DA ; Khmer # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT +17DB ; Khmer # Sc KHMER CURRENCY SYMBOL RIEL +17DC ; Khmer # Lo KHMER SIGN AVAKRAHASANYA +17DD ; Khmer # Mn KHMER SIGN ATTHACAN +17E0..17E9 ; Khmer # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE +17F0..17F9 ; Khmer # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON +19E0..19FF ; Khmer # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC + +# Total code points: 146 + +# ================================================ + +1800..1805 ; Mongolian # Po [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS +1806 ; Mongolian # Pd MONGOLIAN TODO SOFT HYPHEN +1807..180A ; Mongolian # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU +180B..180D ; Mongolian # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +180E ; Mongolian # Zs MONGOLIAN VOWEL SEPARATOR +1810..1819 ; Mongolian # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE +1820..1842 ; Mongolian # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843 ; Mongolian # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1877 ; Mongolian # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA +1880..18A8 ; Mongolian # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA +18A9 ; Mongolian # Mn MONGOLIAN LETTER ALI GALI DAGALGA + +# Total code points: 155 + +# ================================================ + +3041..3096 ; Hiragana # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE +309D..309E ; Hiragana # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F ; Hiragana # Lo HIRAGANA DIGRAPH YORI + +# Total code points: 89 + +# ================================================ + +30A1..30FA ; Katakana # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +30FD..30FE ; Katakana # Lm [2] KATAKANA ITERATION MARK..KATAKANA VOICED ITERATION MARK +30FF ; Katakana # Lo KATAKANA DIGRAPH KOTO +31F0..31FF ; Katakana # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +FF66..FF6F ; Katakana # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N + +# Total code points: 164 + +# ================================================ + +3105..312C ; Bopomofo # Lo [40] BOPOMOFO LETTER B..BOPOMOFO LETTER GN +31A0..31B7 ; Bopomofo # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H + +# Total code points: 64 + +# ================================================ + +2E80..2E99 ; Han # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP +2E9B..2EF3 ; Han # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE +2F00..2FD5 ; Han # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE +3005 ; Han # Lm IDEOGRAPHIC ITERATION MARK +3007 ; Han # Nl IDEOGRAPHIC NUMBER ZERO +3021..3029 ; Han # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +3038..303A ; Han # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B ; Han # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +3400..4DB5 ; Han # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 +4E00..9FBB ; Han # Lo [20924] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FBB +F900..FA2D ; Han # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D +FA30..FA6A ; Han # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A +FA70..FAD9 ; Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +20000..2A6D6 ; Han # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 +2F800..2FA1D ; Han # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D + +# Total code points: 71570 + +# ================================================ + +A000..A014 ; Yi # Lo [21] YI SYLLABLE IT..YI SYLLABLE E +A015 ; Yi # Lm YI SYLLABLE WU +A016..A48C ; Yi # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR +A490..A4C6 ; Yi # So [55] YI RADICAL QOT..YI RADICAL KE + +# Total code points: 1220 + +# ================================================ + +10300..1031E ; Old_Italic # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU +10320..10323 ; Old_Italic # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY + +# Total code points: 35 + +# ================================================ + +10330..10349 ; Gothic # Lo [26] GOTHIC LETTER AHSA..GOTHIC LETTER OTHAL +1034A ; Gothic # Nl GOTHIC LETTER NINE HUNDRED + +# Total code points: 27 + +# ================================================ + +10400..1044F ; Deseret # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW + +# Total code points: 80 + +# ================================================ + +0300..036F ; Inherited # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X +064B..0655 ; Inherited # Mn [11] ARABIC FATHATAN..ARABIC HAMZA BELOW +0670 ; Inherited # Mn ARABIC LETTER SUPERSCRIPT ALEF +1DC0..1DC3 ; Inherited # Mn [4] COMBINING DOTTED GRAVE ACCENT..COMBINING SUSPENSION MARK +200C..200D ; Inherited # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER +20D0..20DC ; Inherited # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20DD..20E0 ; Inherited # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH +20E1 ; Inherited # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E2..20E4 ; Inherited # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE +20E5..20EB ; Inherited # Mn [7] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING LONG DOUBLE SOLIDUS OVERLAY +302A..302F ; Inherited # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK +3099..309A ; Inherited # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +FE00..FE0F ; Inherited # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FE20..FE23 ; Inherited # Mn [4] COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF +1D167..1D169 ; Inherited # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D17B..1D182 ; Inherited # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D185..1D18B ; Inherited # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D1AA..1D1AD ; Inherited # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +E0100..E01EF ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + +# Total code points: 448 + +# ================================================ + +1700..170C ; Tagalog # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA +170E..1711 ; Tagalog # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA +1712..1714 ; Tagalog # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA + +# Total code points: 20 + +# ================================================ + +1720..1731 ; Hanunoo # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA +1732..1734 ; Hanunoo # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD + +# Total code points: 21 + +# ================================================ + +1740..1751 ; Buhid # Lo [18] BUHID LETTER A..BUHID LETTER HA +1752..1753 ; Buhid # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U + +# Total code points: 20 + +# ================================================ + +1760..176C ; Tagbanwa # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770 ; Tagbanwa # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1772..1773 ; Tagbanwa # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U + +# Total code points: 18 + +# ================================================ + +1900..191C ; Limbu # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA +1920..1922 ; Limbu # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1923..1926 ; Limbu # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1927..1928 ; Limbu # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B ; Limbu # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931 ; Limbu # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1932 ; Limbu # Mn LIMBU SMALL LETTER ANUSVARA +1933..1938 ; Limbu # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1939..193B ; Limbu # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1940 ; Limbu # So LIMBU SIGN LOO +1944..1945 ; Limbu # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1946..194F ; Limbu # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE + +# Total code points: 66 + +# ================================================ + +1950..196D ; Tai_Le # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974 ; Tai_Le # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 + +# Total code points: 35 + +# ================================================ + +10000..1000B ; Linear_B # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026 ; Linear_B # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A ; Linear_B # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D ; Linear_B # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D ; Linear_B # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D ; Linear_B # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA ; Linear_B # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 + +# Total code points: 211 + +# ================================================ + +10380..1039D ; Ugaritic # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +1039F ; Ugaritic # Po UGARITIC WORD DIVIDER + +# Total code points: 31 + +# ================================================ + +10450..1047F ; Shavian # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW + +# Total code points: 48 + +# ================================================ + +10480..1049D ; Osmanya # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO +104A0..104A9 ; Osmanya # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE + +# Total code points: 40 + +# ================================================ + +10800..10805 ; Cypriot # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10808 ; Cypriot # Lo CYPRIOT SYLLABLE JO +1080A..10835 ; Cypriot # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10837..10838 ; Cypriot # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +1083C ; Cypriot # Lo CYPRIOT SYLLABLE ZA +1083F ; Cypriot # Lo CYPRIOT SYLLABLE ZO + +# Total code points: 55 + +# ================================================ + +2800..28FF ; Braille # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 + +# Total code points: 256 + +# ================================================ + +1A00..1A16 ; Buginese # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA +1A17..1A18 ; Buginese # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A19..1A1B ; Buginese # Mc [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE +1A1E..1A1F ; Buginese # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION + +# Total code points: 30 + +# ================================================ + +03E2..03EF ; Coptic # L& [14] COPTIC CAPITAL LETTER SHEI..COPTIC SMALL LETTER DEI +2C80..2CE4 ; Coptic # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI +2CE5..2CEA ; Coptic # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA +2CF9..2CFC ; Coptic # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER +2CFD ; Coptic # No COPTIC FRACTION ONE HALF +2CFE..2CFF ; Coptic # Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER + +# Total code points: 128 + +# ================================================ + +1980..19A9 ; New_Tai_Lue # Lo [42] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW XVA +19B0..19C0 ; New_Tai_Lue # Mc [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY +19C1..19C7 ; New_Tai_Lue # Lo [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B +19C8..19C9 ; New_Tai_Lue # Mc [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2 +19D0..19D9 ; New_Tai_Lue # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE +19DE..19DF ; New_Tai_Lue # Po [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV + +# Total code points: 80 + +# ================================================ + +2C00..2C2E ; Glagolitic # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C30..2C5E ; Glagolitic # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE + +# Total code points: 94 + +# ================================================ + +2D30..2D65 ; Tifinagh # Lo [54] TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ +2D6F ; Tifinagh # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK + +# Total code points: 55 + +# ================================================ + +A800..A801 ; Syloti_Nagri # Lo [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I +A802 ; Syloti_Nagri # Mc SYLOTI NAGRI SIGN DVISVARA +A803..A805 ; Syloti_Nagri # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O +A806 ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN HASANTA +A807..A80A ; Syloti_Nagri # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO +A80B ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN ANUSVARA +A80C..A822 ; Syloti_Nagri # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO +A823..A824 ; Syloti_Nagri # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +A825..A826 ; Syloti_Nagri # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A827 ; Syloti_Nagri # Mc SYLOTI NAGRI VOWEL SIGN OO +A828..A82B ; Syloti_Nagri # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 + +# Total code points: 44 + +# ================================================ + +103A0..103C3 ; Old_Persian # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +103C8..103CF ; Old_Persian # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +103D0 ; Old_Persian # So OLD PERSIAN WORD DIVIDER +103D1..103D5 ; Old_Persian # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED + +# Total code points: 50 + +# ================================================ + +10A00 ; Kharoshthi # Lo KHAROSHTHI LETTER A +10A01..10A03 ; Kharoshthi # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06 ; Kharoshthi # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F ; Kharoshthi # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +10A10..10A13 ; Kharoshthi # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA +10A15..10A17 ; Kharoshthi # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +10A19..10A33 ; Kharoshthi # Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA +10A38..10A3A ; Kharoshthi # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3F ; Kharoshthi # Mn KHAROSHTHI VIRAMA +10A40..10A47 ; Kharoshthi # No [8] KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND +10A50..10A58 ; Kharoshthi # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES + +# Total code points: 65 diff --git a/Master/tlpkg/tlperl.old/lib/unicore/SpecialCasing.txt b/Master/tlpkg/tlperl.old/lib/unicore/SpecialCasing.txt new file mode 100644 index 00000000000..11a5b1d69e1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/SpecialCasing.txt @@ -0,0 +1,260 @@ +# SpecialCasing-4.1.0.txt +# Date: 2005-03-26, 00:35:45 GMT [MD] +# +# Unicode Character Database +# Copyright (c) 1991-2005 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html +# +# 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 the discussion of Case Mappings in the Unicode Standard. +# +# All code points not listed in this file that do not have a simple case mappings +# in UnicodeData.txt map to themselves. +# ================================================================================ +# Format +# ================================================================================ +# The entries in this file are in the following machine-readable format: +# +# <code>; <lower> ; <title> ; <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 locale IDs +# 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 ID is defined by taking any language tag as defined by +# RFC 3066 (or its successor), and replacing '-' by '_'. +# +# A context for a character C is defined by Section 3.13 Default Case Operations, +# on p. 89-90 of The Unicode Standard, Version 4.0, as amended by Unicode 4.1.0, +# as specified in http://www.unicode.org/versions/Unicode4.1.0/ +# +# Parsers of this file must be prepared to deal with 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 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_I; # COMBINING DOT ABOVE +0307; ; 0307; 0307; az After_I; # 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/Master/tlpkg/tlperl.old/lib/unicore/StandardizedVariants.txt b/Master/tlpkg/tlperl.old/lib/unicore/StandardizedVariants.txt new file mode 100644 index 00000000000..f049159dd3f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/StandardizedVariants.txt @@ -0,0 +1,122 @@ +# StandardizedVariants-4.1.0.txt +# Date: 2005-03-17, 15:21:00 PST [KW] +# +# Specification of the variant sequences that are defined in the +# Unicode Standard. +# +# This file is a normative contributory data file in the +# Unicode Character Database. +# +# Copyright (c) 1991-2005 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Warning: Only the variation sequences specifically defined in this file +# are sanctioned for standard use. In all other cases the variation selector +# cannot change the visual appearance of the preceding base character from +# what it would have had in the absence of the variation selector. +# +# For more information, see Section 15.6, Variation Selectors, +# in The Unicode Standard, Version 4.0. +# +# Format: +# Field 0: the variation sequence +# Field 1: the description of the desired appearance +# Field 2: where the appearance is only different in in particular shaping environments +# this field lists them. The possible values are: isolate, initial, medial, final. +# If more than one is present, there are spaces between them. +# ============================= + +# Mathematical + +2229 FE00; with serifs; # INTERSECTION +222A FE00; with serifs; # UNION +2268 FE00; with vertical stroke; # LESS-THAN BUT NOT EQUAL TO +2269 FE00; with vertical stroke; # GREATER-THAN AND NOT DOUBLE EQUAL +2272 FE00; following the slant of the lower leg; # LESS-THAN OR EQUIVALENT TO +2273 FE00; following the slant of the lower leg; # GREATER-THAN OR EQUIVALENT TO +#2278 FE00; with vertical stroke; # NEITHER LESS-THAN NOR GREATER-THAN +#2279 FE00; with vertical stroke; # NEITHER GREATER-THAN NOR LESS-THAN +228A FE00; with stroke through bottom members; # SUBSET OF WITH NOT EQUAL TO +228B FE00; with stroke through bottom members; # SUPERSET OF WITH NOT EQUAL TO +2293 FE00; with serifs; # SQUARE CAP +2294 FE00; with serifs; # SQUARE CUP +2295 FE00; with white rim; # CIRCLED PLUS +2297 FE00; with white rim; # CIRCLED TIMES +229C FE00; with equal sign touching the circle; # CIRCLED EQUALS +22DA FE00; with slanted equal; # LESS-THAN EQUAL TO OR GREATER-THAN +22DB FE00; with slanted equal; # GREATER-THAN EQUAL TO OR LESS-THAN +2A3C FE00; tall variant with narrow foot; # INTERIOR PRODUCT +2A3D FE00; tall variant with narrow foot; # RIGHTHAND INTERIOR PRODUCT +2A9D FE00; with similar following the slant of the upper leg; # SIMILAR OR LESS-THAN +2A9E FE00; with similar following the slant of the upper leg; # SIMILAR OR GREATER-THAN +2AAC FE00; with slanted equal; # SMALLER THAN OR EQUAL TO +2AAD FE00; with slanted equal; # LARGER THAN OR EQUAL TO +2ACB FE00; with stroke through bottom members; # SUBSET OF ABOVE NOT EQUAL TO +2ACC FE00; with stroke through bottom members; # SUPERSET OF ABOVE NOT EQUAL TO + +#Mongolian + +1820 180B; second form; isolate medial final # MONGOLIAN LETTER A +1820 180C; third form; medial # MONGOLIAN LETTER A +1821 180B; second form; initial final # MONGOLIAN LETTER E +1822 180B; second form; medial # MONGOLIAN LETTER I +1823 180B; second form; medial final # MONGOLIAN LETTER O +1824 180B; second form; medial # MONGOLIAN LETTER U +1825 180B; second form; medial final # MONGOLIAN LETTER OE +1825 180C; third form; medial # MONGOLIAN LETTER OE +1826 180B; second form; isolate medial final # MONGOLIAN LETTER UE +1826 180C; third form; medial # MONGOLIAN LETTER UE +1828 180B; second form; initial medial # MONGOLIAN LETTER NA +1828 180C; third form; medial # MONGOLIAN LETTER NA +1828 180D; separate form; medial # MONGOLIAN LETTER NA +182A 180B; alternative form; final # MONGOLIAN LETTER BA +182C 180B; second form; initial medial # MONGOLIAN LETTER QA +182C 180B; feminine second form; isolate # MONGOLIAN LETTER QA +182C 180C; third form; medial # MONGOLIAN LETTER QA +182C 180D; fourth form; medial # MONGOLIAN LETTER QA +182D 180B; second form; initial medial # MONGOLIAN LETTER GA +182D 180B; feminine form; final # MONGOLIAN LETTER GA +182D 180C; third form; medial # MONGOLIAN LETTER GA +182D 180D; feminine form; medial # MONGOLIAN LETTER GA +1830 180B; second form; final # MONGOLIAN LETTER SA +1830 180C; third form; final # MONGOLIAN LETTER SA +1832 180B; second form; medial # MONGOLIAN LETTER TA +1833 180B; second form; initial medial final # MONGOLIAN LETTER DA +1835 180B; second form; medial # MONGOLIAN LETTER JA +1836 180B; second form; initial medial # # MONGOLIAN LETTER YA +1836 180C; third form; medial # MONGOLIAN LETTER YA +1838 180B; second form; final # MONGOLIAN LETTER WA +1844 180B; second form; medial # MONGOLIAN LETTER TODO E +1845 180B; second form; medial # MONGOLIAN LETTER TODO I +1846 180B; second form; medial # MONGOLIAN LETTER TODO O +1847 180B; second form; isolate medial final # MONGOLIAN LETTER TODO U +1847 180C; third form; medial # MONGOLIAN LETTER TODO U +1848 180B; second form; medial # MONGOLIAN LETTER TODO OE +1849 180B; second form; isolate medial # MONGOLIAN LETTER TODO UE +184D 180B; feminine form; initial medial # MONGOLIAN LETTER TODO QA +184E 180B; second form; medial # MONGOLIAN LETTER TODO GA +185D 180B; second form; medial final # MONGOLIAN LETTER SIBE E +185E 180B; second form; medial final # MONGOLIAN LETTER SIBE I +185E 180C; third form; medial final # MONGOLIAN LETTER SIBE I +1860 180B; second form; medial final # MONGOLIAN LETTER SIBE UE +1863 180B; second form; medial # MONGOLIAN LETTER SIBE KA +1868 180B; second form; initial medial # MONGOLIAN LETTER SIBE TA +1868 180C; third form; medial # MONGOLIAN LETTER SIBE TA +1869 180B; second form; initial medial # MONGOLIAN LETTER SIBE DA +186F 180B; second form; initial medial # MONGOLIAN LETTER SIBE ZA +1873 180B; second form; medial final # MONGOLIAN LETTER MANCHU I +1873 180C; third form; medial final # MONGOLIAN LETTER MANCHU I +1873 180D; fourth form; medial # MONGOLIAN LETTER MANCHU I +1874 180B; second form; medial # MONGOLIAN LETTER MANCHU KA +1874 180B; feminine first final form; final # MONGOLIAN LETTER MANCHU KA +1874 180C; feminine first medial form; medial # MONGOLIAN LETTER MANCHU KA +1874 180C; feminine second final form; final # MONGOLIAN LETTER MANCHU KA +1874 180D; feminine second medial form; medial # MONGOLIAN LETTER MANCHU KA +1876 180B; second form; initial medial # MONGOLIAN LETTER MANCHU FA +1880 180B; second form; # MONGOLIAN LETTER ALI GALI ANUSVARA ONE +1881 180B; second form; # MONGOLIAN LETTER ALI GALI VISARGA ONE +1887 180B; second form; isolate final # MONGOLIAN LETTER ALI GALI A +1887 180C; third form; final # MONGOLIAN LETTER ALI GALI A +1887 180D; fourth form; final # MONGOLIAN LETTER ALI GALI A +1888 180B; second form; final # MONGOLIAN LETTER ALI GALI I +188A 180B; second form; initial medial # MONGOLIAN LETTER ALI GALI NGA diff --git a/Master/tlpkg/tlperl.old/lib/unicore/To/Digit.pl b/Master/tlpkg/tlperl.old/lib/unicore/To/Digit.pl new file mode 100644 index 00000000000..25af374eadf --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/To/Digit.pl @@ -0,0 +1,276 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +return <<'END'; +0030 0 +0031 1 +0032 2 +0033 3 +0034 4 +0035 5 +0036 6 +0037 7 +0038 8 +0039 9 +0660 0 +0661 1 +0662 2 +0663 3 +0664 4 +0665 5 +0666 6 +0667 7 +0668 8 +0669 9 +06F0 0 +06F1 1 +06F2 2 +06F3 3 +06F4 4 +06F5 5 +06F6 6 +06F7 7 +06F8 8 +06F9 9 +0966 0 +0967 1 +0968 2 +0969 3 +096A 4 +096B 5 +096C 6 +096D 7 +096E 8 +096F 9 +09E6 0 +09E7 1 +09E8 2 +09E9 3 +09EA 4 +09EB 5 +09EC 6 +09ED 7 +09EE 8 +09EF 9 +0A66 0 +0A67 1 +0A68 2 +0A69 3 +0A6A 4 +0A6B 5 +0A6C 6 +0A6D 7 +0A6E 8 +0A6F 9 +0AE6 0 +0AE7 1 +0AE8 2 +0AE9 3 +0AEA 4 +0AEB 5 +0AEC 6 +0AED 7 +0AEE 8 +0AEF 9 +0B66 0 +0B67 1 +0B68 2 +0B69 3 +0B6A 4 +0B6B 5 +0B6C 6 +0B6D 7 +0B6E 8 +0B6F 9 +0BE6 0 +0BE7 1 +0BE8 2 +0BE9 3 +0BEA 4 +0BEB 5 +0BEC 6 +0BED 7 +0BEE 8 +0BEF 9 +0C66 0 +0C67 1 +0C68 2 +0C69 3 +0C6A 4 +0C6B 5 +0C6C 6 +0C6D 7 +0C6E 8 +0C6F 9 +0CE6 0 +0CE7 1 +0CE8 2 +0CE9 3 +0CEA 4 +0CEB 5 +0CEC 6 +0CED 7 +0CEE 8 +0CEF 9 +0D66 0 +0D67 1 +0D68 2 +0D69 3 +0D6A 4 +0D6B 5 +0D6C 6 +0D6D 7 +0D6E 8 +0D6F 9 +0E50 0 +0E51 1 +0E52 2 +0E53 3 +0E54 4 +0E55 5 +0E56 6 +0E57 7 +0E58 8 +0E59 9 +0ED0 0 +0ED1 1 +0ED2 2 +0ED3 3 +0ED4 4 +0ED5 5 +0ED6 6 +0ED7 7 +0ED8 8 +0ED9 9 +0F20 0 +0F21 1 +0F22 2 +0F23 3 +0F24 4 +0F25 5 +0F26 6 +0F27 7 +0F28 8 +0F29 9 +1040 0 +1041 1 +1042 2 +1043 3 +1044 4 +1045 5 +1046 6 +1047 7 +1048 8 +1049 9 +17E0 0 +17E1 1 +17E2 2 +17E3 3 +17E4 4 +17E5 5 +17E6 6 +17E7 7 +17E8 8 +17E9 9 +1810 0 +1811 1 +1812 2 +1813 3 +1814 4 +1815 5 +1816 6 +1817 7 +1818 8 +1819 9 +1946 0 +1947 1 +1948 2 +1949 3 +194A 4 +194B 5 +194C 6 +194D 7 +194E 8 +194F 9 +19D0 0 +19D1 1 +19D2 2 +19D3 3 +19D4 4 +19D5 5 +19D6 6 +19D7 7 +19D8 8 +19D9 9 +FF10 0 +FF11 1 +FF12 2 +FF13 3 +FF14 4 +FF15 5 +FF16 6 +FF17 7 +FF18 8 +FF19 9 +104A0 0 +104A1 1 +104A2 2 +104A3 3 +104A4 4 +104A5 5 +104A6 6 +104A7 7 +104A8 8 +104A9 9 +1D7CE 0 +1D7CF 1 +1D7D0 2 +1D7D1 3 +1D7D2 4 +1D7D3 5 +1D7D4 6 +1D7D5 7 +1D7D6 8 +1D7D7 9 +1D7D8 0 +1D7D9 1 +1D7DA 2 +1D7DB 3 +1D7DC 4 +1D7DD 5 +1D7DE 6 +1D7DF 7 +1D7E0 8 +1D7E1 9 +1D7E2 0 +1D7E3 1 +1D7E4 2 +1D7E5 3 +1D7E6 4 +1D7E7 5 +1D7E8 6 +1D7E9 7 +1D7EA 8 +1D7EB 9 +1D7EC 0 +1D7ED 1 +1D7EE 2 +1D7EF 3 +1D7F0 4 +1D7F1 5 +1D7F2 6 +1D7F3 7 +1D7F4 8 +1D7F5 9 +1D7F6 0 +1D7F7 1 +1D7F8 2 +1D7F9 3 +1D7FA 4 +1D7FB 5 +1D7FC 6 +1D7FD 7 +1D7FE 8 +1D7FF 9 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/To/Fold.pl b/Master/tlpkg/tlperl.old/lib/unicore/To/Fold.pl new file mode 100644 index 00000000000..4555e9fd5bd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/To/Fold.pl @@ -0,0 +1,993 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + + +# The ke UTF-8 _bytes_, the value UTF-8 (speed hack) +%utf8::ToSpecFold = +( +"\xC3\x9F" => "\x{0073}\x{0073}", +"\xC4\xB0" => "\x{0069}\x{0307}", +"\xC5\x89" => "\x{02BC}\x{006E}", +"\xC7\xB0" => "\x{006A}\x{030C}", +"\xCE\x90" => "\x{03B9}\x{0308}\x{0301}", +"\xCE\xB0" => "\x{03C5}\x{0308}\x{0301}", +"\xD6\x87" => "\x{0565}\x{0582}", +"\xE1\xBA\x96" => "\x{0068}\x{0331}", +"\xE1\xBA\x97" => "\x{0074}\x{0308}", +"\xE1\xBA\x98" => "\x{0077}\x{030A}", +"\xE1\xBA\x99" => "\x{0079}\x{030A}", +"\xE1\xBA\x9A" => "\x{0061}\x{02BE}", +"\xE1\xBD\x90" => "\x{03C5}\x{0313}", +"\xE1\xBD\x92" => "\x{03C5}\x{0313}\x{0300}", +"\xE1\xBD\x94" => "\x{03C5}\x{0313}\x{0301}", +"\xE1\xBD\x96" => "\x{03C5}\x{0313}\x{0342}", +"\xE1\xBE\x80" => "\x{1F00}\x{03B9}", +"\xE1\xBE\x81" => "\x{1F01}\x{03B9}", +"\xE1\xBE\x82" => "\x{1F02}\x{03B9}", +"\xE1\xBE\x83" => "\x{1F03}\x{03B9}", +"\xE1\xBE\x84" => "\x{1F04}\x{03B9}", +"\xE1\xBE\x85" => "\x{1F05}\x{03B9}", +"\xE1\xBE\x86" => "\x{1F06}\x{03B9}", +"\xE1\xBE\x87" => "\x{1F07}\x{03B9}", +"\xE1\xBE\x88" => "\x{1F00}\x{03B9}", +"\xE1\xBE\x89" => "\x{1F01}\x{03B9}", +"\xE1\xBE\x8A" => "\x{1F02}\x{03B9}", +"\xE1\xBE\x8B" => "\x{1F03}\x{03B9}", +"\xE1\xBE\x8C" => "\x{1F04}\x{03B9}", +"\xE1\xBE\x8D" => "\x{1F05}\x{03B9}", +"\xE1\xBE\x8E" => "\x{1F06}\x{03B9}", +"\xE1\xBE\x8F" => "\x{1F07}\x{03B9}", +"\xE1\xBE\x90" => "\x{1F20}\x{03B9}", +"\xE1\xBE\x91" => "\x{1F21}\x{03B9}", +"\xE1\xBE\x92" => "\x{1F22}\x{03B9}", +"\xE1\xBE\x93" => "\x{1F23}\x{03B9}", +"\xE1\xBE\x94" => "\x{1F24}\x{03B9}", +"\xE1\xBE\x95" => "\x{1F25}\x{03B9}", +"\xE1\xBE\x96" => "\x{1F26}\x{03B9}", +"\xE1\xBE\x97" => "\x{1F27}\x{03B9}", +"\xE1\xBE\x98" => "\x{1F20}\x{03B9}", +"\xE1\xBE\x99" => "\x{1F21}\x{03B9}", +"\xE1\xBE\x9A" => "\x{1F22}\x{03B9}", +"\xE1\xBE\x9B" => "\x{1F23}\x{03B9}", +"\xE1\xBE\x9C" => "\x{1F24}\x{03B9}", +"\xE1\xBE\x9D" => "\x{1F25}\x{03B9}", +"\xE1\xBE\x9E" => "\x{1F26}\x{03B9}", +"\xE1\xBE\x9F" => "\x{1F27}\x{03B9}", +"\xE1\xBE\xA0" => "\x{1F60}\x{03B9}", +"\xE1\xBE\xA1" => "\x{1F61}\x{03B9}", +"\xE1\xBE\xA2" => "\x{1F62}\x{03B9}", +"\xE1\xBE\xA3" => "\x{1F63}\x{03B9}", +"\xE1\xBE\xA4" => "\x{1F64}\x{03B9}", +"\xE1\xBE\xA5" => "\x{1F65}\x{03B9}", +"\xE1\xBE\xA6" => "\x{1F66}\x{03B9}", +"\xE1\xBE\xA7" => "\x{1F67}\x{03B9}", +"\xE1\xBE\xA8" => "\x{1F60}\x{03B9}", +"\xE1\xBE\xA9" => "\x{1F61}\x{03B9}", +"\xE1\xBE\xAA" => "\x{1F62}\x{03B9}", +"\xE1\xBE\xAB" => "\x{1F63}\x{03B9}", +"\xE1\xBE\xAC" => "\x{1F64}\x{03B9}", +"\xE1\xBE\xAD" => "\x{1F65}\x{03B9}", +"\xE1\xBE\xAE" => "\x{1F66}\x{03B9}", +"\xE1\xBE\xAF" => "\x{1F67}\x{03B9}", +"\xE1\xBE\xB2" => "\x{1F70}\x{03B9}", +"\xE1\xBE\xB3" => "\x{03B1}\x{03B9}", +"\xE1\xBE\xB4" => "\x{03AC}\x{03B9}", +"\xE1\xBE\xB6" => "\x{03B1}\x{0342}", +"\xE1\xBE\xB7" => "\x{03B1}\x{0342}\x{03B9}", +"\xE1\xBE\xBC" => "\x{03B1}\x{03B9}", +"\xE1\xBF\x82" => "\x{1F74}\x{03B9}", +"\xE1\xBF\x83" => "\x{03B7}\x{03B9}", +"\xE1\xBF\x84" => "\x{03AE}\x{03B9}", +"\xE1\xBF\x86" => "\x{03B7}\x{0342}", +"\xE1\xBF\x87" => "\x{03B7}\x{0342}\x{03B9}", +"\xE1\xBF\x8C" => "\x{03B7}\x{03B9}", +"\xE1\xBF\x92" => "\x{03B9}\x{0308}\x{0300}", +"\xE1\xBF\x93" => "\x{03B9}\x{0308}\x{0301}", +"\xE1\xBF\x96" => "\x{03B9}\x{0342}", +"\xE1\xBF\x97" => "\x{03B9}\x{0308}\x{0342}", +"\xE1\xBF\xA2" => "\x{03C5}\x{0308}\x{0300}", +"\xE1\xBF\xA3" => "\x{03C5}\x{0308}\x{0301}", +"\xE1\xBF\xA4" => "\x{03C1}\x{0313}", +"\xE1\xBF\xA6" => "\x{03C5}\x{0342}", +"\xE1\xBF\xA7" => "\x{03C5}\x{0308}\x{0342}", +"\xE1\xBF\xB2" => "\x{1F7C}\x{03B9}", +"\xE1\xBF\xB3" => "\x{03C9}\x{03B9}", +"\xE1\xBF\xB4" => "\x{03CE}\x{03B9}", +"\xE1\xBF\xB6" => "\x{03C9}\x{0342}", +"\xE1\xBF\xB7" => "\x{03C9}\x{0342}\x{03B9}", +"\xE1\xBF\xBC" => "\x{03C9}\x{03B9}", +"\xEF\xAC\x80" => "\x{0066}\x{0066}", +"\xEF\xAC\x81" => "\x{0066}\x{0069}", +"\xEF\xAC\x82" => "\x{0066}\x{006C}", +"\xEF\xAC\x83" => "\x{0066}\x{0066}\x{0069}", +"\xEF\xAC\x84" => "\x{0066}\x{0066}\x{006C}", +"\xEF\xAC\x85" => "\x{0073}\x{0074}", +"\xEF\xAC\x86" => "\x{0073}\x{0074}", +"\xEF\xAC\x93" => "\x{0574}\x{0576}", +"\xEF\xAC\x94" => "\x{0574}\x{0565}", +"\xEF\xAC\x95" => "\x{0574}\x{056B}", +"\xEF\xAC\x96" => "\x{057E}\x{0576}", +"\xEF\xAC\x97" => "\x{0574}\x{056D}", +); + +return <<'END'; +0041 0061 +0042 0062 +0043 0063 +0044 0064 +0045 0065 +0046 0066 +0047 0067 +0048 0068 +0049 0069 +004A 006A +004B 006B +004C 006C +004D 006D +004E 006E +004F 006F +0050 0070 +0051 0071 +0052 0072 +0053 0073 +0054 0074 +0055 0075 +0056 0076 +0057 0077 +0058 0078 +0059 0079 +005A 007A +00B5 03BC +00C0 00E0 +00C1 00E1 +00C2 00E2 +00C3 00E3 +00C4 00E4 +00C5 00E5 +00C6 00E6 +00C7 00E7 +00C8 00E8 +00C9 00E9 +00CA 00EA +00CB 00EB +00CC 00EC +00CD 00ED +00CE 00EE +00CF 00EF +00D0 00F0 +00D1 00F1 +00D2 00F2 +00D3 00F3 +00D4 00F4 +00D5 00F5 +00D6 00F6 +00D8 00F8 +00D9 00F9 +00DA 00FA +00DB 00FB +00DC 00FC +00DD 00FD +00DE 00FE +0100 0101 +0102 0103 +0104 0105 +0106 0107 +0108 0109 +010A 010B +010C 010D +010E 010F +0110 0111 +0112 0113 +0114 0115 +0116 0117 +0118 0119 +011A 011B +011C 011D +011E 011F +0120 0121 +0122 0123 +0124 0125 +0126 0127 +0128 0129 +012A 012B +012C 012D +012E 012F +0132 0133 +0134 0135 +0136 0137 +0139 013A +013B 013C +013D 013E +013F 0140 +0141 0142 +0143 0144 +0145 0146 +0147 0148 +014A 014B +014C 014D +014E 014F +0150 0151 +0152 0153 +0154 0155 +0156 0157 +0158 0159 +015A 015B +015C 015D +015E 015F +0160 0161 +0162 0163 +0164 0165 +0166 0167 +0168 0169 +016A 016B +016C 016D +016E 016F +0170 0171 +0172 0173 +0174 0175 +0176 0177 +0178 00FF +0179 017A +017B 017C +017D 017E +017F 0073 +0181 0253 +0182 0183 +0184 0185 +0186 0254 +0187 0188 +0189 0256 +018A 0257 +018B 018C +018E 01DD +018F 0259 +0190 025B +0191 0192 +0193 0260 +0194 0263 +0196 0269 +0197 0268 +0198 0199 +019C 026F +019D 0272 +019F 0275 +01A0 01A1 +01A2 01A3 +01A4 01A5 +01A6 0280 +01A7 01A8 +01A9 0283 +01AC 01AD +01AE 0288 +01AF 01B0 +01B1 028A +01B2 028B +01B3 01B4 +01B5 01B6 +01B7 0292 +01B8 01B9 +01BC 01BD +01C4 01C6 +01C5 01C6 +01C7 01C9 +01C8 01C9 +01CA 01CC +01CB 01CC +01CD 01CE +01CF 01D0 +01D1 01D2 +01D3 01D4 +01D5 01D6 +01D7 01D8 +01D9 01DA +01DB 01DC +01DE 01DF +01E0 01E1 +01E2 01E3 +01E4 01E5 +01E6 01E7 +01E8 01E9 +01EA 01EB +01EC 01ED +01EE 01EF +01F1 01F3 +01F2 01F3 +01F4 01F5 +01F6 0195 +01F7 01BF +01F8 01F9 +01FA 01FB +01FC 01FD +01FE 01FF +0200 0201 +0202 0203 +0204 0205 +0206 0207 +0208 0209 +020A 020B +020C 020D +020E 020F +0210 0211 +0212 0213 +0214 0215 +0216 0217 +0218 0219 +021A 021B +021C 021D +021E 021F +0220 019E +0222 0223 +0224 0225 +0226 0227 +0228 0229 +022A 022B +022C 022D +022E 022F +0230 0231 +0232 0233 +023B 023C +023D 019A +0241 0294 +0345 03B9 +0386 03AC +0388 03AD +0389 03AE +038A 03AF +038C 03CC +038E 03CD +038F 03CE +0391 03B1 +0392 03B2 +0393 03B3 +0394 03B4 +0395 03B5 +0396 03B6 +0397 03B7 +0398 03B8 +0399 03B9 +039A 03BA +039B 03BB +039C 03BC +039D 03BD +039E 03BE +039F 03BF +03A0 03C0 +03A1 03C1 +03A3 03C3 +03A4 03C4 +03A5 03C5 +03A6 03C6 +03A7 03C7 +03A8 03C8 +03A9 03C9 +03AA 03CA +03AB 03CB +03C2 03C3 +03D0 03B2 +03D1 03B8 +03D5 03C6 +03D6 03C0 +03D8 03D9 +03DA 03DB +03DC 03DD +03DE 03DF +03E0 03E1 +03E2 03E3 +03E4 03E5 +03E6 03E7 +03E8 03E9 +03EA 03EB +03EC 03ED +03EE 03EF +03F0 03BA +03F1 03C1 +03F4 03B8 +03F5 03B5 +03F7 03F8 +03F9 03F2 +03FA 03FB +0400 0450 +0401 0451 +0402 0452 +0403 0453 +0404 0454 +0405 0455 +0406 0456 +0407 0457 +0408 0458 +0409 0459 +040A 045A +040B 045B +040C 045C +040D 045D +040E 045E +040F 045F +0410 0430 +0411 0431 +0412 0432 +0413 0433 +0414 0434 +0415 0435 +0416 0436 +0417 0437 +0418 0438 +0419 0439 +041A 043A +041B 043B +041C 043C +041D 043D +041E 043E +041F 043F +0420 0440 +0421 0441 +0422 0442 +0423 0443 +0424 0444 +0425 0445 +0426 0446 +0427 0447 +0428 0448 +0429 0449 +042A 044A +042B 044B +042C 044C +042D 044D +042E 044E +042F 044F +0460 0461 +0462 0463 +0464 0465 +0466 0467 +0468 0469 +046A 046B +046C 046D +046E 046F +0470 0471 +0472 0473 +0474 0475 +0476 0477 +0478 0479 +047A 047B +047C 047D +047E 047F +0480 0481 +048A 048B +048C 048D +048E 048F +0490 0491 +0492 0493 +0494 0495 +0496 0497 +0498 0499 +049A 049B +049C 049D +049E 049F +04A0 04A1 +04A2 04A3 +04A4 04A5 +04A6 04A7 +04A8 04A9 +04AA 04AB +04AC 04AD +04AE 04AF +04B0 04B1 +04B2 04B3 +04B4 04B5 +04B6 04B7 +04B8 04B9 +04BA 04BB +04BC 04BD +04BE 04BF +04C1 04C2 +04C3 04C4 +04C5 04C6 +04C7 04C8 +04C9 04CA +04CB 04CC +04CD 04CE +04D0 04D1 +04D2 04D3 +04D4 04D5 +04D6 04D7 +04D8 04D9 +04DA 04DB +04DC 04DD +04DE 04DF +04E0 04E1 +04E2 04E3 +04E4 04E5 +04E6 04E7 +04E8 04E9 +04EA 04EB +04EC 04ED +04EE 04EF +04F0 04F1 +04F2 04F3 +04F4 04F5 +04F6 04F7 +04F8 04F9 +0500 0501 +0502 0503 +0504 0505 +0506 0507 +0508 0509 +050A 050B +050C 050D +050E 050F +0531 0561 +0532 0562 +0533 0563 +0534 0564 +0535 0565 +0536 0566 +0537 0567 +0538 0568 +0539 0569 +053A 056A +053B 056B +053C 056C +053D 056D +053E 056E +053F 056F +0540 0570 +0541 0571 +0542 0572 +0543 0573 +0544 0574 +0545 0575 +0546 0576 +0547 0577 +0548 0578 +0549 0579 +054A 057A +054B 057B +054C 057C +054D 057D +054E 057E +054F 057F +0550 0580 +0551 0581 +0552 0582 +0553 0583 +0554 0584 +0555 0585 +0556 0586 +10A0 2D00 +10A1 2D01 +10A2 2D02 +10A3 2D03 +10A4 2D04 +10A5 2D05 +10A6 2D06 +10A7 2D07 +10A8 2D08 +10A9 2D09 +10AA 2D0A +10AB 2D0B +10AC 2D0C +10AD 2D0D +10AE 2D0E +10AF 2D0F +10B0 2D10 +10B1 2D11 +10B2 2D12 +10B3 2D13 +10B4 2D14 +10B5 2D15 +10B6 2D16 +10B7 2D17 +10B8 2D18 +10B9 2D19 +10BA 2D1A +10BB 2D1B +10BC 2D1C +10BD 2D1D +10BE 2D1E +10BF 2D1F +10C0 2D20 +10C1 2D21 +10C2 2D22 +10C3 2D23 +10C4 2D24 +10C5 2D25 +1E00 1E01 +1E02 1E03 +1E04 1E05 +1E06 1E07 +1E08 1E09 +1E0A 1E0B +1E0C 1E0D +1E0E 1E0F +1E10 1E11 +1E12 1E13 +1E14 1E15 +1E16 1E17 +1E18 1E19 +1E1A 1E1B +1E1C 1E1D +1E1E 1E1F +1E20 1E21 +1E22 1E23 +1E24 1E25 +1E26 1E27 +1E28 1E29 +1E2A 1E2B +1E2C 1E2D +1E2E 1E2F +1E30 1E31 +1E32 1E33 +1E34 1E35 +1E36 1E37 +1E38 1E39 +1E3A 1E3B +1E3C 1E3D +1E3E 1E3F +1E40 1E41 +1E42 1E43 +1E44 1E45 +1E46 1E47 +1E48 1E49 +1E4A 1E4B +1E4C 1E4D +1E4E 1E4F +1E50 1E51 +1E52 1E53 +1E54 1E55 +1E56 1E57 +1E58 1E59 +1E5A 1E5B +1E5C 1E5D +1E5E 1E5F +1E60 1E61 +1E62 1E63 +1E64 1E65 +1E66 1E67 +1E68 1E69 +1E6A 1E6B +1E6C 1E6D +1E6E 1E6F +1E70 1E71 +1E72 1E73 +1E74 1E75 +1E76 1E77 +1E78 1E79 +1E7A 1E7B +1E7C 1E7D +1E7E 1E7F +1E80 1E81 +1E82 1E83 +1E84 1E85 +1E86 1E87 +1E88 1E89 +1E8A 1E8B +1E8C 1E8D +1E8E 1E8F +1E90 1E91 +1E92 1E93 +1E94 1E95 +1E9B 1E61 +1EA0 1EA1 +1EA2 1EA3 +1EA4 1EA5 +1EA6 1EA7 +1EA8 1EA9 +1EAA 1EAB +1EAC 1EAD +1EAE 1EAF +1EB0 1EB1 +1EB2 1EB3 +1EB4 1EB5 +1EB6 1EB7 +1EB8 1EB9 +1EBA 1EBB +1EBC 1EBD +1EBE 1EBF +1EC0 1EC1 +1EC2 1EC3 +1EC4 1EC5 +1EC6 1EC7 +1EC8 1EC9 +1ECA 1ECB +1ECC 1ECD +1ECE 1ECF +1ED0 1ED1 +1ED2 1ED3 +1ED4 1ED5 +1ED6 1ED7 +1ED8 1ED9 +1EDA 1EDB +1EDC 1EDD +1EDE 1EDF +1EE0 1EE1 +1EE2 1EE3 +1EE4 1EE5 +1EE6 1EE7 +1EE8 1EE9 +1EEA 1EEB +1EEC 1EED +1EEE 1EEF +1EF0 1EF1 +1EF2 1EF3 +1EF4 1EF5 +1EF6 1EF7 +1EF8 1EF9 +1F08 1F00 +1F09 1F01 +1F0A 1F02 +1F0B 1F03 +1F0C 1F04 +1F0D 1F05 +1F0E 1F06 +1F0F 1F07 +1F18 1F10 +1F19 1F11 +1F1A 1F12 +1F1B 1F13 +1F1C 1F14 +1F1D 1F15 +1F28 1F20 +1F29 1F21 +1F2A 1F22 +1F2B 1F23 +1F2C 1F24 +1F2D 1F25 +1F2E 1F26 +1F2F 1F27 +1F38 1F30 +1F39 1F31 +1F3A 1F32 +1F3B 1F33 +1F3C 1F34 +1F3D 1F35 +1F3E 1F36 +1F3F 1F37 +1F48 1F40 +1F49 1F41 +1F4A 1F42 +1F4B 1F43 +1F4C 1F44 +1F4D 1F45 +1F59 1F51 +1F5B 1F53 +1F5D 1F55 +1F5F 1F57 +1F68 1F60 +1F69 1F61 +1F6A 1F62 +1F6B 1F63 +1F6C 1F64 +1F6D 1F65 +1F6E 1F66 +1F6F 1F67 +1FB8 1FB0 +1FB9 1FB1 +1FBA 1F70 +1FBB 1F71 +1FBE 03B9 +1FC8 1F72 +1FC9 1F73 +1FCA 1F74 +1FCB 1F75 +1FD8 1FD0 +1FD9 1FD1 +1FDA 1F76 +1FDB 1F77 +1FE8 1FE0 +1FE9 1FE1 +1FEA 1F7A +1FEB 1F7B +1FEC 1FE5 +1FF8 1F78 +1FF9 1F79 +1FFA 1F7C +1FFB 1F7D +2126 03C9 +212A 006B +212B 00E5 +2160 2170 +2161 2171 +2162 2172 +2163 2173 +2164 2174 +2165 2175 +2166 2176 +2167 2177 +2168 2178 +2169 2179 +216A 217A +216B 217B +216C 217C +216D 217D +216E 217E +216F 217F +24B6 24D0 +24B7 24D1 +24B8 24D2 +24B9 24D3 +24BA 24D4 +24BB 24D5 +24BC 24D6 +24BD 24D7 +24BE 24D8 +24BF 24D9 +24C0 24DA +24C1 24DB +24C2 24DC +24C3 24DD +24C4 24DE +24C5 24DF +24C6 24E0 +24C7 24E1 +24C8 24E2 +24C9 24E3 +24CA 24E4 +24CB 24E5 +24CC 24E6 +24CD 24E7 +24CE 24E8 +24CF 24E9 +2C00 2C30 +2C01 2C31 +2C02 2C32 +2C03 2C33 +2C04 2C34 +2C05 2C35 +2C06 2C36 +2C07 2C37 +2C08 2C38 +2C09 2C39 +2C0A 2C3A +2C0B 2C3B +2C0C 2C3C +2C0D 2C3D +2C0E 2C3E +2C0F 2C3F +2C10 2C40 +2C11 2C41 +2C12 2C42 +2C13 2C43 +2C14 2C44 +2C15 2C45 +2C16 2C46 +2C17 2C47 +2C18 2C48 +2C19 2C49 +2C1A 2C4A +2C1B 2C4B +2C1C 2C4C +2C1D 2C4D +2C1E 2C4E +2C1F 2C4F +2C20 2C50 +2C21 2C51 +2C22 2C52 +2C23 2C53 +2C24 2C54 +2C25 2C55 +2C26 2C56 +2C27 2C57 +2C28 2C58 +2C29 2C59 +2C2A 2C5A +2C2B 2C5B +2C2C 2C5C +2C2D 2C5D +2C2E 2C5E +2C80 2C81 +2C82 2C83 +2C84 2C85 +2C86 2C87 +2C88 2C89 +2C8A 2C8B +2C8C 2C8D +2C8E 2C8F +2C90 2C91 +2C92 2C93 +2C94 2C95 +2C96 2C97 +2C98 2C99 +2C9A 2C9B +2C9C 2C9D +2C9E 2C9F +2CA0 2CA1 +2CA2 2CA3 +2CA4 2CA5 +2CA6 2CA7 +2CA8 2CA9 +2CAA 2CAB +2CAC 2CAD +2CAE 2CAF +2CB0 2CB1 +2CB2 2CB3 +2CB4 2CB5 +2CB6 2CB7 +2CB8 2CB9 +2CBA 2CBB +2CBC 2CBD +2CBE 2CBF +2CC0 2CC1 +2CC2 2CC3 +2CC4 2CC5 +2CC6 2CC7 +2CC8 2CC9 +2CCA 2CCB +2CCC 2CCD +2CCE 2CCF +2CD0 2CD1 +2CD2 2CD3 +2CD4 2CD5 +2CD6 2CD7 +2CD8 2CD9 +2CDA 2CDB +2CDC 2CDD +2CDE 2CDF +2CE0 2CE1 +2CE2 2CE3 +FF21 FF41 +FF22 FF42 +FF23 FF43 +FF24 FF44 +FF25 FF45 +FF26 FF46 +FF27 FF47 +FF28 FF48 +FF29 FF49 +FF2A FF4A +FF2B FF4B +FF2C FF4C +FF2D FF4D +FF2E FF4E +FF2F FF4F +FF30 FF50 +FF31 FF51 +FF32 FF52 +FF33 FF53 +FF34 FF54 +FF35 FF55 +FF36 FF56 +FF37 FF57 +FF38 FF58 +FF39 FF59 +FF3A FF5A +10400 10428 +10401 10429 +10402 1042A +10403 1042B +10404 1042C +10405 1042D +10406 1042E +10407 1042F +10408 10430 +10409 10431 +1040A 10432 +1040B 10433 +1040C 10434 +1040D 10435 +1040E 10436 +1040F 10437 +10410 10438 +10411 10439 +10412 1043A +10413 1043B +10414 1043C +10415 1043D +10416 1043E +10417 1043F +10418 10440 +10419 10441 +1041A 10442 +1041B 10443 +1041C 10444 +1041D 10445 +1041E 10446 +1041F 10447 +10420 10448 +10421 10449 +10422 1044A +10423 1044B +10424 1044C +10425 1044D +10426 1044E +10427 1044F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/To/Lower.pl b/Master/tlpkg/tlperl.old/lib/unicore/To/Lower.pl new file mode 100644 index 00000000000..77a7a7fb0e0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/To/Lower.pl @@ -0,0 +1,905 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + + +# The key UTF-8 _bytes_, the value UTF-8 (speed hack) +%utf8::ToSpecLower = +( +"\xC4\xB0" => "\x{0069}\x{0307}", +"\xE1\xBE\x88" => "\x{1F80}", +"\xE1\xBE\x89" => "\x{1F81}", +"\xE1\xBE\x8A" => "\x{1F82}", +"\xE1\xBE\x8B" => "\x{1F83}", +"\xE1\xBE\x8C" => "\x{1F84}", +"\xE1\xBE\x8D" => "\x{1F85}", +"\xE1\xBE\x8E" => "\x{1F86}", +"\xE1\xBE\x8F" => "\x{1F87}", +"\xE1\xBE\x98" => "\x{1F90}", +"\xE1\xBE\x99" => "\x{1F91}", +"\xE1\xBE\x9A" => "\x{1F92}", +"\xE1\xBE\x9B" => "\x{1F93}", +"\xE1\xBE\x9C" => "\x{1F94}", +"\xE1\xBE\x9D" => "\x{1F95}", +"\xE1\xBE\x9E" => "\x{1F96}", +"\xE1\xBE\x9F" => "\x{1F97}", +"\xE1\xBE\xA8" => "\x{1FA0}", +"\xE1\xBE\xA9" => "\x{1FA1}", +"\xE1\xBE\xAA" => "\x{1FA2}", +"\xE1\xBE\xAB" => "\x{1FA3}", +"\xE1\xBE\xAC" => "\x{1FA4}", +"\xE1\xBE\xAD" => "\x{1FA5}", +"\xE1\xBE\xAE" => "\x{1FA6}", +"\xE1\xBE\xAF" => "\x{1FA7}", +"\xE1\xBE\xBC" => "\x{1FB3}", +"\xE1\xBF\x8C" => "\x{1FC3}", +"\xE1\xBF\xBC" => "\x{1FF3}", +); + +return <<'END'; +0041 0061 +0042 0062 +0043 0063 +0044 0064 +0045 0065 +0046 0066 +0047 0067 +0048 0068 +0049 0069 +004A 006A +004B 006B +004C 006C +004D 006D +004E 006E +004F 006F +0050 0070 +0051 0071 +0052 0072 +0053 0073 +0054 0074 +0055 0075 +0056 0076 +0057 0077 +0058 0078 +0059 0079 +005A 007A +00C0 00E0 +00C1 00E1 +00C2 00E2 +00C3 00E3 +00C4 00E4 +00C5 00E5 +00C6 00E6 +00C7 00E7 +00C8 00E8 +00C9 00E9 +00CA 00EA +00CB 00EB +00CC 00EC +00CD 00ED +00CE 00EE +00CF 00EF +00D0 00F0 +00D1 00F1 +00D2 00F2 +00D3 00F3 +00D4 00F4 +00D5 00F5 +00D6 00F6 +00D8 00F8 +00D9 00F9 +00DA 00FA +00DB 00FB +00DC 00FC +00DD 00FD +00DE 00FE +0100 0101 +0102 0103 +0104 0105 +0106 0107 +0108 0109 +010A 010B +010C 010D +010E 010F +0110 0111 +0112 0113 +0114 0115 +0116 0117 +0118 0119 +011A 011B +011C 011D +011E 011F +0120 0121 +0122 0123 +0124 0125 +0126 0127 +0128 0129 +012A 012B +012C 012D +012E 012F +0132 0133 +0134 0135 +0136 0137 +0139 013A +013B 013C +013D 013E +013F 0140 +0141 0142 +0143 0144 +0145 0146 +0147 0148 +014A 014B +014C 014D +014E 014F +0150 0151 +0152 0153 +0154 0155 +0156 0157 +0158 0159 +015A 015B +015C 015D +015E 015F +0160 0161 +0162 0163 +0164 0165 +0166 0167 +0168 0169 +016A 016B +016C 016D +016E 016F +0170 0171 +0172 0173 +0174 0175 +0176 0177 +0178 00FF +0179 017A +017B 017C +017D 017E +0181 0253 +0182 0183 +0184 0185 +0186 0254 +0187 0188 +0189 0256 +018A 0257 +018B 018C +018E 01DD +018F 0259 +0190 025B +0191 0192 +0193 0260 +0194 0263 +0196 0269 +0197 0268 +0198 0199 +019C 026F +019D 0272 +019F 0275 +01A0 01A1 +01A2 01A3 +01A4 01A5 +01A6 0280 +01A7 01A8 +01A9 0283 +01AC 01AD +01AE 0288 +01AF 01B0 +01B1 028A +01B2 028B +01B3 01B4 +01B5 01B6 +01B7 0292 +01B8 01B9 +01BC 01BD +01C4 01C6 +01C5 01C6 +01C7 01C9 +01C8 01C9 +01CA 01CC +01CB 01CC +01CD 01CE +01CF 01D0 +01D1 01D2 +01D3 01D4 +01D5 01D6 +01D7 01D8 +01D9 01DA +01DB 01DC +01DE 01DF +01E0 01E1 +01E2 01E3 +01E4 01E5 +01E6 01E7 +01E8 01E9 +01EA 01EB +01EC 01ED +01EE 01EF +01F1 01F3 +01F2 01F3 +01F4 01F5 +01F6 0195 +01F7 01BF +01F8 01F9 +01FA 01FB +01FC 01FD +01FE 01FF +0200 0201 +0202 0203 +0204 0205 +0206 0207 +0208 0209 +020A 020B +020C 020D +020E 020F +0210 0211 +0212 0213 +0214 0215 +0216 0217 +0218 0219 +021A 021B +021C 021D +021E 021F +0220 019E +0222 0223 +0224 0225 +0226 0227 +0228 0229 +022A 022B +022C 022D +022E 022F +0230 0231 +0232 0233 +023B 023C +023D 019A +0241 0294 +0386 03AC +0388 03AD +0389 03AE +038A 03AF +038C 03CC +038E 03CD +038F 03CE +0391 03B1 +0392 03B2 +0393 03B3 +0394 03B4 +0395 03B5 +0396 03B6 +0397 03B7 +0398 03B8 +0399 03B9 +039A 03BA +039B 03BB +039C 03BC +039D 03BD +039E 03BE +039F 03BF +03A0 03C0 +03A1 03C1 +03A3 03C3 +03A4 03C4 +03A5 03C5 +03A6 03C6 +03A7 03C7 +03A8 03C8 +03A9 03C9 +03AA 03CA +03AB 03CB +03D8 03D9 +03DA 03DB +03DC 03DD +03DE 03DF +03E0 03E1 +03E2 03E3 +03E4 03E5 +03E6 03E7 +03E8 03E9 +03EA 03EB +03EC 03ED +03EE 03EF +03F4 03B8 +03F7 03F8 +03F9 03F2 +03FA 03FB +0400 0450 +0401 0451 +0402 0452 +0403 0453 +0404 0454 +0405 0455 +0406 0456 +0407 0457 +0408 0458 +0409 0459 +040A 045A +040B 045B +040C 045C +040D 045D +040E 045E +040F 045F +0410 0430 +0411 0431 +0412 0432 +0413 0433 +0414 0434 +0415 0435 +0416 0436 +0417 0437 +0418 0438 +0419 0439 +041A 043A +041B 043B +041C 043C +041D 043D +041E 043E +041F 043F +0420 0440 +0421 0441 +0422 0442 +0423 0443 +0424 0444 +0425 0445 +0426 0446 +0427 0447 +0428 0448 +0429 0449 +042A 044A +042B 044B +042C 044C +042D 044D +042E 044E +042F 044F +0460 0461 +0462 0463 +0464 0465 +0466 0467 +0468 0469 +046A 046B +046C 046D +046E 046F +0470 0471 +0472 0473 +0474 0475 +0476 0477 +0478 0479 +047A 047B +047C 047D +047E 047F +0480 0481 +048A 048B +048C 048D +048E 048F +0490 0491 +0492 0493 +0494 0495 +0496 0497 +0498 0499 +049A 049B +049C 049D +049E 049F +04A0 04A1 +04A2 04A3 +04A4 04A5 +04A6 04A7 +04A8 04A9 +04AA 04AB +04AC 04AD +04AE 04AF +04B0 04B1 +04B2 04B3 +04B4 04B5 +04B6 04B7 +04B8 04B9 +04BA 04BB +04BC 04BD +04BE 04BF +04C1 04C2 +04C3 04C4 +04C5 04C6 +04C7 04C8 +04C9 04CA +04CB 04CC +04CD 04CE +04D0 04D1 +04D2 04D3 +04D4 04D5 +04D6 04D7 +04D8 04D9 +04DA 04DB +04DC 04DD +04DE 04DF +04E0 04E1 +04E2 04E3 +04E4 04E5 +04E6 04E7 +04E8 04E9 +04EA 04EB +04EC 04ED +04EE 04EF +04F0 04F1 +04F2 04F3 +04F4 04F5 +04F6 04F7 +04F8 04F9 +0500 0501 +0502 0503 +0504 0505 +0506 0507 +0508 0509 +050A 050B +050C 050D +050E 050F +0531 0561 +0532 0562 +0533 0563 +0534 0564 +0535 0565 +0536 0566 +0537 0567 +0538 0568 +0539 0569 +053A 056A +053B 056B +053C 056C +053D 056D +053E 056E +053F 056F +0540 0570 +0541 0571 +0542 0572 +0543 0573 +0544 0574 +0545 0575 +0546 0576 +0547 0577 +0548 0578 +0549 0579 +054A 057A +054B 057B +054C 057C +054D 057D +054E 057E +054F 057F +0550 0580 +0551 0581 +0552 0582 +0553 0583 +0554 0584 +0555 0585 +0556 0586 +10A0 2D00 +10A1 2D01 +10A2 2D02 +10A3 2D03 +10A4 2D04 +10A5 2D05 +10A6 2D06 +10A7 2D07 +10A8 2D08 +10A9 2D09 +10AA 2D0A +10AB 2D0B +10AC 2D0C +10AD 2D0D +10AE 2D0E +10AF 2D0F +10B0 2D10 +10B1 2D11 +10B2 2D12 +10B3 2D13 +10B4 2D14 +10B5 2D15 +10B6 2D16 +10B7 2D17 +10B8 2D18 +10B9 2D19 +10BA 2D1A +10BB 2D1B +10BC 2D1C +10BD 2D1D +10BE 2D1E +10BF 2D1F +10C0 2D20 +10C1 2D21 +10C2 2D22 +10C3 2D23 +10C4 2D24 +10C5 2D25 +1E00 1E01 +1E02 1E03 +1E04 1E05 +1E06 1E07 +1E08 1E09 +1E0A 1E0B +1E0C 1E0D +1E0E 1E0F +1E10 1E11 +1E12 1E13 +1E14 1E15 +1E16 1E17 +1E18 1E19 +1E1A 1E1B +1E1C 1E1D +1E1E 1E1F +1E20 1E21 +1E22 1E23 +1E24 1E25 +1E26 1E27 +1E28 1E29 +1E2A 1E2B +1E2C 1E2D +1E2E 1E2F +1E30 1E31 +1E32 1E33 +1E34 1E35 +1E36 1E37 +1E38 1E39 +1E3A 1E3B +1E3C 1E3D +1E3E 1E3F +1E40 1E41 +1E42 1E43 +1E44 1E45 +1E46 1E47 +1E48 1E49 +1E4A 1E4B +1E4C 1E4D +1E4E 1E4F +1E50 1E51 +1E52 1E53 +1E54 1E55 +1E56 1E57 +1E58 1E59 +1E5A 1E5B +1E5C 1E5D +1E5E 1E5F +1E60 1E61 +1E62 1E63 +1E64 1E65 +1E66 1E67 +1E68 1E69 +1E6A 1E6B +1E6C 1E6D +1E6E 1E6F +1E70 1E71 +1E72 1E73 +1E74 1E75 +1E76 1E77 +1E78 1E79 +1E7A 1E7B +1E7C 1E7D +1E7E 1E7F +1E80 1E81 +1E82 1E83 +1E84 1E85 +1E86 1E87 +1E88 1E89 +1E8A 1E8B +1E8C 1E8D +1E8E 1E8F +1E90 1E91 +1E92 1E93 +1E94 1E95 +1EA0 1EA1 +1EA2 1EA3 +1EA4 1EA5 +1EA6 1EA7 +1EA8 1EA9 +1EAA 1EAB +1EAC 1EAD +1EAE 1EAF +1EB0 1EB1 +1EB2 1EB3 +1EB4 1EB5 +1EB6 1EB7 +1EB8 1EB9 +1EBA 1EBB +1EBC 1EBD +1EBE 1EBF +1EC0 1EC1 +1EC2 1EC3 +1EC4 1EC5 +1EC6 1EC7 +1EC8 1EC9 +1ECA 1ECB +1ECC 1ECD +1ECE 1ECF +1ED0 1ED1 +1ED2 1ED3 +1ED4 1ED5 +1ED6 1ED7 +1ED8 1ED9 +1EDA 1EDB +1EDC 1EDD +1EDE 1EDF +1EE0 1EE1 +1EE2 1EE3 +1EE4 1EE5 +1EE6 1EE7 +1EE8 1EE9 +1EEA 1EEB +1EEC 1EED +1EEE 1EEF +1EF0 1EF1 +1EF2 1EF3 +1EF4 1EF5 +1EF6 1EF7 +1EF8 1EF9 +1F08 1F00 +1F09 1F01 +1F0A 1F02 +1F0B 1F03 +1F0C 1F04 +1F0D 1F05 +1F0E 1F06 +1F0F 1F07 +1F18 1F10 +1F19 1F11 +1F1A 1F12 +1F1B 1F13 +1F1C 1F14 +1F1D 1F15 +1F28 1F20 +1F29 1F21 +1F2A 1F22 +1F2B 1F23 +1F2C 1F24 +1F2D 1F25 +1F2E 1F26 +1F2F 1F27 +1F38 1F30 +1F39 1F31 +1F3A 1F32 +1F3B 1F33 +1F3C 1F34 +1F3D 1F35 +1F3E 1F36 +1F3F 1F37 +1F48 1F40 +1F49 1F41 +1F4A 1F42 +1F4B 1F43 +1F4C 1F44 +1F4D 1F45 +1F59 1F51 +1F5B 1F53 +1F5D 1F55 +1F5F 1F57 +1F68 1F60 +1F69 1F61 +1F6A 1F62 +1F6B 1F63 +1F6C 1F64 +1F6D 1F65 +1F6E 1F66 +1F6F 1F67 +1FB8 1FB0 +1FB9 1FB1 +1FBA 1F70 +1FBB 1F71 +1FC8 1F72 +1FC9 1F73 +1FCA 1F74 +1FCB 1F75 +1FD8 1FD0 +1FD9 1FD1 +1FDA 1F76 +1FDB 1F77 +1FE8 1FE0 +1FE9 1FE1 +1FEA 1F7A +1FEB 1F7B +1FEC 1FE5 +1FF8 1F78 +1FF9 1F79 +1FFA 1F7C +1FFB 1F7D +2126 03C9 +212A 006B +212B 00E5 +2160 2170 +2161 2171 +2162 2172 +2163 2173 +2164 2174 +2165 2175 +2166 2176 +2167 2177 +2168 2178 +2169 2179 +216A 217A +216B 217B +216C 217C +216D 217D +216E 217E +216F 217F +24B6 24D0 +24B7 24D1 +24B8 24D2 +24B9 24D3 +24BA 24D4 +24BB 24D5 +24BC 24D6 +24BD 24D7 +24BE 24D8 +24BF 24D9 +24C0 24DA +24C1 24DB +24C2 24DC +24C3 24DD +24C4 24DE +24C5 24DF +24C6 24E0 +24C7 24E1 +24C8 24E2 +24C9 24E3 +24CA 24E4 +24CB 24E5 +24CC 24E6 +24CD 24E7 +24CE 24E8 +24CF 24E9 +2C00 2C30 +2C01 2C31 +2C02 2C32 +2C03 2C33 +2C04 2C34 +2C05 2C35 +2C06 2C36 +2C07 2C37 +2C08 2C38 +2C09 2C39 +2C0A 2C3A +2C0B 2C3B +2C0C 2C3C +2C0D 2C3D +2C0E 2C3E +2C0F 2C3F +2C10 2C40 +2C11 2C41 +2C12 2C42 +2C13 2C43 +2C14 2C44 +2C15 2C45 +2C16 2C46 +2C17 2C47 +2C18 2C48 +2C19 2C49 +2C1A 2C4A +2C1B 2C4B +2C1C 2C4C +2C1D 2C4D +2C1E 2C4E +2C1F 2C4F +2C20 2C50 +2C21 2C51 +2C22 2C52 +2C23 2C53 +2C24 2C54 +2C25 2C55 +2C26 2C56 +2C27 2C57 +2C28 2C58 +2C29 2C59 +2C2A 2C5A +2C2B 2C5B +2C2C 2C5C +2C2D 2C5D +2C2E 2C5E +2C80 2C81 +2C82 2C83 +2C84 2C85 +2C86 2C87 +2C88 2C89 +2C8A 2C8B +2C8C 2C8D +2C8E 2C8F +2C90 2C91 +2C92 2C93 +2C94 2C95 +2C96 2C97 +2C98 2C99 +2C9A 2C9B +2C9C 2C9D +2C9E 2C9F +2CA0 2CA1 +2CA2 2CA3 +2CA4 2CA5 +2CA6 2CA7 +2CA8 2CA9 +2CAA 2CAB +2CAC 2CAD +2CAE 2CAF +2CB0 2CB1 +2CB2 2CB3 +2CB4 2CB5 +2CB6 2CB7 +2CB8 2CB9 +2CBA 2CBB +2CBC 2CBD +2CBE 2CBF +2CC0 2CC1 +2CC2 2CC3 +2CC4 2CC5 +2CC6 2CC7 +2CC8 2CC9 +2CCA 2CCB +2CCC 2CCD +2CCE 2CCF +2CD0 2CD1 +2CD2 2CD3 +2CD4 2CD5 +2CD6 2CD7 +2CD8 2CD9 +2CDA 2CDB +2CDC 2CDD +2CDE 2CDF +2CE0 2CE1 +2CE2 2CE3 +FF21 FF41 +FF22 FF42 +FF23 FF43 +FF24 FF44 +FF25 FF45 +FF26 FF46 +FF27 FF47 +FF28 FF48 +FF29 FF49 +FF2A FF4A +FF2B FF4B +FF2C FF4C +FF2D FF4D +FF2E FF4E +FF2F FF4F +FF30 FF50 +FF31 FF51 +FF32 FF52 +FF33 FF53 +FF34 FF54 +FF35 FF55 +FF36 FF56 +FF37 FF57 +FF38 FF58 +FF39 FF59 +FF3A FF5A +10400 10428 +10401 10429 +10402 1042A +10403 1042B +10404 1042C +10405 1042D +10406 1042E +10407 1042F +10408 10430 +10409 10431 +1040A 10432 +1040B 10433 +1040C 10434 +1040D 10435 +1040E 10436 +1040F 10437 +10410 10438 +10411 10439 +10412 1043A +10413 1043B +10414 1043C +10415 1043D +10416 1043E +10417 1043F +10418 10440 +10419 10441 +1041A 10442 +1041B 10443 +1041C 10444 +1041D 10445 +1041E 10446 +1041F 10447 +10420 10448 +10421 10449 +10422 1044A +10423 1044B +10424 1044C +10425 1044D +10426 1044E +10427 1044F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/To/Title.pl b/Master/tlpkg/tlperl.old/lib/unicore/To/Title.pl new file mode 100644 index 00000000000..761767520c2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/To/Title.pl @@ -0,0 +1,966 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + + +# The key UTF-8 _bytes_, the value UTF-8 (speed hack) +%utf8::ToSpecTitle = +( +"\xC3\x9F" => "\x{0053}\x{0073}", +"\xC5\x89" => "\x{02BC}\x{004E}", +"\xC7\xB0" => "\x{004A}\x{030C}", +"\xCE\x90" => "\x{0399}\x{0308}\x{0301}", +"\xCE\xB0" => "\x{03A5}\x{0308}\x{0301}", +"\xD6\x87" => "\x{0535}\x{0582}", +"\xE1\xBA\x96" => "\x{0048}\x{0331}", +"\xE1\xBA\x97" => "\x{0054}\x{0308}", +"\xE1\xBA\x98" => "\x{0057}\x{030A}", +"\xE1\xBA\x99" => "\x{0059}\x{030A}", +"\xE1\xBA\x9A" => "\x{0041}\x{02BE}", +"\xE1\xBD\x90" => "\x{03A5}\x{0313}", +"\xE1\xBD\x92" => "\x{03A5}\x{0313}\x{0300}", +"\xE1\xBD\x94" => "\x{03A5}\x{0313}\x{0301}", +"\xE1\xBD\x96" => "\x{03A5}\x{0313}\x{0342}", +"\xE1\xBE\x80" => "\x{1F88}", +"\xE1\xBE\x81" => "\x{1F89}", +"\xE1\xBE\x82" => "\x{1F8A}", +"\xE1\xBE\x83" => "\x{1F8B}", +"\xE1\xBE\x84" => "\x{1F8C}", +"\xE1\xBE\x85" => "\x{1F8D}", +"\xE1\xBE\x86" => "\x{1F8E}", +"\xE1\xBE\x87" => "\x{1F8F}", +"\xE1\xBE\x90" => "\x{1F98}", +"\xE1\xBE\x91" => "\x{1F99}", +"\xE1\xBE\x92" => "\x{1F9A}", +"\xE1\xBE\x93" => "\x{1F9B}", +"\xE1\xBE\x94" => "\x{1F9C}", +"\xE1\xBE\x95" => "\x{1F9D}", +"\xE1\xBE\x96" => "\x{1F9E}", +"\xE1\xBE\x97" => "\x{1F9F}", +"\xE1\xBE\xA0" => "\x{1FA8}", +"\xE1\xBE\xA1" => "\x{1FA9}", +"\xE1\xBE\xA2" => "\x{1FAA}", +"\xE1\xBE\xA3" => "\x{1FAB}", +"\xE1\xBE\xA4" => "\x{1FAC}", +"\xE1\xBE\xA5" => "\x{1FAD}", +"\xE1\xBE\xA6" => "\x{1FAE}", +"\xE1\xBE\xA7" => "\x{1FAF}", +"\xE1\xBE\xB2" => "\x{1FBA}\x{0345}", +"\xE1\xBE\xB3" => "\x{1FBC}", +"\xE1\xBE\xB4" => "\x{0386}\x{0345}", +"\xE1\xBE\xB6" => "\x{0391}\x{0342}", +"\xE1\xBE\xB7" => "\x{0391}\x{0342}\x{0345}", +"\xE1\xBF\x82" => "\x{1FCA}\x{0345}", +"\xE1\xBF\x83" => "\x{1FCC}", +"\xE1\xBF\x84" => "\x{0389}\x{0345}", +"\xE1\xBF\x86" => "\x{0397}\x{0342}", +"\xE1\xBF\x87" => "\x{0397}\x{0342}\x{0345}", +"\xE1\xBF\x92" => "\x{0399}\x{0308}\x{0300}", +"\xE1\xBF\x93" => "\x{0399}\x{0308}\x{0301}", +"\xE1\xBF\x96" => "\x{0399}\x{0342}", +"\xE1\xBF\x97" => "\x{0399}\x{0308}\x{0342}", +"\xE1\xBF\xA2" => "\x{03A5}\x{0308}\x{0300}", +"\xE1\xBF\xA3" => "\x{03A5}\x{0308}\x{0301}", +"\xE1\xBF\xA4" => "\x{03A1}\x{0313}", +"\xE1\xBF\xA6" => "\x{03A5}\x{0342}", +"\xE1\xBF\xA7" => "\x{03A5}\x{0308}\x{0342}", +"\xE1\xBF\xB2" => "\x{1FFA}\x{0345}", +"\xE1\xBF\xB3" => "\x{1FFC}", +"\xE1\xBF\xB4" => "\x{038F}\x{0345}", +"\xE1\xBF\xB6" => "\x{03A9}\x{0342}", +"\xE1\xBF\xB7" => "\x{03A9}\x{0342}\x{0345}", +"\xEF\xAC\x80" => "\x{0046}\x{0066}", +"\xEF\xAC\x81" => "\x{0046}\x{0069}", +"\xEF\xAC\x82" => "\x{0046}\x{006C}", +"\xEF\xAC\x83" => "\x{0046}\x{0066}\x{0069}", +"\xEF\xAC\x84" => "\x{0046}\x{0066}\x{006C}", +"\xEF\xAC\x85" => "\x{0053}\x{0074}", +"\xEF\xAC\x86" => "\x{0053}\x{0074}", +"\xEF\xAC\x93" => "\x{0544}\x{0576}", +"\xEF\xAC\x94" => "\x{0544}\x{0565}", +"\xEF\xAC\x95" => "\x{0544}\x{056B}", +"\xEF\xAC\x96" => "\x{054E}\x{0576}", +"\xEF\xAC\x97" => "\x{0544}\x{056D}", +); + +return <<'END'; +0061 0041 +0062 0042 +0063 0043 +0064 0044 +0065 0045 +0066 0046 +0067 0047 +0068 0048 +0069 0049 +006A 004A +006B 004B +006C 004C +006D 004D +006E 004E +006F 004F +0070 0050 +0071 0051 +0072 0052 +0073 0053 +0074 0054 +0075 0055 +0076 0056 +0077 0057 +0078 0058 +0079 0059 +007A 005A +00B5 039C +00E0 00C0 +00E1 00C1 +00E2 00C2 +00E3 00C3 +00E4 00C4 +00E5 00C5 +00E6 00C6 +00E7 00C7 +00E8 00C8 +00E9 00C9 +00EA 00CA +00EB 00CB +00EC 00CC +00ED 00CD +00EE 00CE +00EF 00CF +00F0 00D0 +00F1 00D1 +00F2 00D2 +00F3 00D3 +00F4 00D4 +00F5 00D5 +00F6 00D6 +00F8 00D8 +00F9 00D9 +00FA 00DA +00FB 00DB +00FC 00DC +00FD 00DD +00FE 00DE +00FF 0178 +0101 0100 +0103 0102 +0105 0104 +0107 0106 +0109 0108 +010B 010A +010D 010C +010F 010E +0111 0110 +0113 0112 +0115 0114 +0117 0116 +0119 0118 +011B 011A +011D 011C +011F 011E +0121 0120 +0123 0122 +0125 0124 +0127 0126 +0129 0128 +012B 012A +012D 012C +012F 012E +0131 0049 +0133 0132 +0135 0134 +0137 0136 +013A 0139 +013C 013B +013E 013D +0140 013F +0142 0141 +0144 0143 +0146 0145 +0148 0147 +014B 014A +014D 014C +014F 014E +0151 0150 +0153 0152 +0155 0154 +0157 0156 +0159 0158 +015B 015A +015D 015C +015F 015E +0161 0160 +0163 0162 +0165 0164 +0167 0166 +0169 0168 +016B 016A +016D 016C +016F 016E +0171 0170 +0173 0172 +0175 0174 +0177 0176 +017A 0179 +017C 017B +017E 017D +017F 0053 +0183 0182 +0185 0184 +0188 0187 +018C 018B +0192 0191 +0195 01F6 +0199 0198 +019A 023D +019E 0220 +01A1 01A0 +01A3 01A2 +01A5 01A4 +01A8 01A7 +01AD 01AC +01B0 01AF +01B4 01B3 +01B6 01B5 +01B9 01B8 +01BD 01BC +01BF 01F7 +01C4 01C5 +01C5 01C5 +01C6 01C5 +01C7 01C8 +01C8 01C8 +01C9 01C8 +01CA 01CB +01CB 01CB +01CC 01CB +01CE 01CD +01D0 01CF +01D2 01D1 +01D4 01D3 +01D6 01D5 +01D8 01D7 +01DA 01D9 +01DC 01DB +01DD 018E +01DF 01DE +01E1 01E0 +01E3 01E2 +01E5 01E4 +01E7 01E6 +01E9 01E8 +01EB 01EA +01ED 01EC +01EF 01EE +01F1 01F2 +01F2 01F2 +01F3 01F2 +01F5 01F4 +01F9 01F8 +01FB 01FA +01FD 01FC +01FF 01FE +0201 0200 +0203 0202 +0205 0204 +0207 0206 +0209 0208 +020B 020A +020D 020C +020F 020E +0211 0210 +0213 0212 +0215 0214 +0217 0216 +0219 0218 +021B 021A +021D 021C +021F 021E +0223 0222 +0225 0224 +0227 0226 +0229 0228 +022B 022A +022D 022C +022F 022E +0231 0230 +0233 0232 +023C 023B +0253 0181 +0254 0186 +0256 0189 +0257 018A +0259 018F +025B 0190 +0260 0193 +0263 0194 +0268 0197 +0269 0196 +026F 019C +0272 019D +0275 019F +0280 01A6 +0283 01A9 +0288 01AE +028A 01B1 +028B 01B2 +0292 01B7 +0294 0241 +0345 0399 +03AC 0386 +03AD 0388 +03AE 0389 +03AF 038A +03B1 0391 +03B2 0392 +03B3 0393 +03B4 0394 +03B5 0395 +03B6 0396 +03B7 0397 +03B8 0398 +03B9 0399 +03BA 039A +03BB 039B +03BC 039C +03BD 039D +03BE 039E +03BF 039F +03C0 03A0 +03C1 03A1 +03C2 03A3 +03C3 03A3 +03C4 03A4 +03C5 03A5 +03C6 03A6 +03C7 03A7 +03C8 03A8 +03C9 03A9 +03CA 03AA +03CB 03AB +03CC 038C +03CD 038E +03CE 038F +03D0 0392 +03D1 0398 +03D5 03A6 +03D6 03A0 +03D9 03D8 +03DB 03DA +03DD 03DC +03DF 03DE +03E1 03E0 +03E3 03E2 +03E5 03E4 +03E7 03E6 +03E9 03E8 +03EB 03EA +03ED 03EC +03EF 03EE +03F0 039A +03F1 03A1 +03F2 03F9 +03F5 0395 +03F8 03F7 +03FB 03FA +0430 0410 +0431 0411 +0432 0412 +0433 0413 +0434 0414 +0435 0415 +0436 0416 +0437 0417 +0438 0418 +0439 0419 +043A 041A +043B 041B +043C 041C +043D 041D +043E 041E +043F 041F +0440 0420 +0441 0421 +0442 0422 +0443 0423 +0444 0424 +0445 0425 +0446 0426 +0447 0427 +0448 0428 +0449 0429 +044A 042A +044B 042B +044C 042C +044D 042D +044E 042E +044F 042F +0450 0400 +0451 0401 +0452 0402 +0453 0403 +0454 0404 +0455 0405 +0456 0406 +0457 0407 +0458 0408 +0459 0409 +045A 040A +045B 040B +045C 040C +045D 040D +045E 040E +045F 040F +0461 0460 +0463 0462 +0465 0464 +0467 0466 +0469 0468 +046B 046A +046D 046C +046F 046E +0471 0470 +0473 0472 +0475 0474 +0477 0476 +0479 0478 +047B 047A +047D 047C +047F 047E +0481 0480 +048B 048A +048D 048C +048F 048E +0491 0490 +0493 0492 +0495 0494 +0497 0496 +0499 0498 +049B 049A +049D 049C +049F 049E +04A1 04A0 +04A3 04A2 +04A5 04A4 +04A7 04A6 +04A9 04A8 +04AB 04AA +04AD 04AC +04AF 04AE +04B1 04B0 +04B3 04B2 +04B5 04B4 +04B7 04B6 +04B9 04B8 +04BB 04BA +04BD 04BC +04BF 04BE +04C2 04C1 +04C4 04C3 +04C6 04C5 +04C8 04C7 +04CA 04C9 +04CC 04CB +04CE 04CD +04D1 04D0 +04D3 04D2 +04D5 04D4 +04D7 04D6 +04D9 04D8 +04DB 04DA +04DD 04DC +04DF 04DE +04E1 04E0 +04E3 04E2 +04E5 04E4 +04E7 04E6 +04E9 04E8 +04EB 04EA +04ED 04EC +04EF 04EE +04F1 04F0 +04F3 04F2 +04F5 04F4 +04F7 04F6 +04F9 04F8 +0501 0500 +0503 0502 +0505 0504 +0507 0506 +0509 0508 +050B 050A +050D 050C +050F 050E +0561 0531 +0562 0532 +0563 0533 +0564 0534 +0565 0535 +0566 0536 +0567 0537 +0568 0538 +0569 0539 +056A 053A +056B 053B +056C 053C +056D 053D +056E 053E +056F 053F +0570 0540 +0571 0541 +0572 0542 +0573 0543 +0574 0544 +0575 0545 +0576 0546 +0577 0547 +0578 0548 +0579 0549 +057A 054A +057B 054B +057C 054C +057D 054D +057E 054E +057F 054F +0580 0550 +0581 0551 +0582 0552 +0583 0553 +0584 0554 +0585 0555 +0586 0556 +1E01 1E00 +1E03 1E02 +1E05 1E04 +1E07 1E06 +1E09 1E08 +1E0B 1E0A +1E0D 1E0C +1E0F 1E0E +1E11 1E10 +1E13 1E12 +1E15 1E14 +1E17 1E16 +1E19 1E18 +1E1B 1E1A +1E1D 1E1C +1E1F 1E1E +1E21 1E20 +1E23 1E22 +1E25 1E24 +1E27 1E26 +1E29 1E28 +1E2B 1E2A +1E2D 1E2C +1E2F 1E2E +1E31 1E30 +1E33 1E32 +1E35 1E34 +1E37 1E36 +1E39 1E38 +1E3B 1E3A +1E3D 1E3C +1E3F 1E3E +1E41 1E40 +1E43 1E42 +1E45 1E44 +1E47 1E46 +1E49 1E48 +1E4B 1E4A +1E4D 1E4C +1E4F 1E4E +1E51 1E50 +1E53 1E52 +1E55 1E54 +1E57 1E56 +1E59 1E58 +1E5B 1E5A +1E5D 1E5C +1E5F 1E5E +1E61 1E60 +1E63 1E62 +1E65 1E64 +1E67 1E66 +1E69 1E68 +1E6B 1E6A +1E6D 1E6C +1E6F 1E6E +1E71 1E70 +1E73 1E72 +1E75 1E74 +1E77 1E76 +1E79 1E78 +1E7B 1E7A +1E7D 1E7C +1E7F 1E7E +1E81 1E80 +1E83 1E82 +1E85 1E84 +1E87 1E86 +1E89 1E88 +1E8B 1E8A +1E8D 1E8C +1E8F 1E8E +1E91 1E90 +1E93 1E92 +1E95 1E94 +1E9B 1E60 +1EA1 1EA0 +1EA3 1EA2 +1EA5 1EA4 +1EA7 1EA6 +1EA9 1EA8 +1EAB 1EAA +1EAD 1EAC +1EAF 1EAE +1EB1 1EB0 +1EB3 1EB2 +1EB5 1EB4 +1EB7 1EB6 +1EB9 1EB8 +1EBB 1EBA +1EBD 1EBC +1EBF 1EBE +1EC1 1EC0 +1EC3 1EC2 +1EC5 1EC4 +1EC7 1EC6 +1EC9 1EC8 +1ECB 1ECA +1ECD 1ECC +1ECF 1ECE +1ED1 1ED0 +1ED3 1ED2 +1ED5 1ED4 +1ED7 1ED6 +1ED9 1ED8 +1EDB 1EDA +1EDD 1EDC +1EDF 1EDE +1EE1 1EE0 +1EE3 1EE2 +1EE5 1EE4 +1EE7 1EE6 +1EE9 1EE8 +1EEB 1EEA +1EED 1EEC +1EEF 1EEE +1EF1 1EF0 +1EF3 1EF2 +1EF5 1EF4 +1EF7 1EF6 +1EF9 1EF8 +1F00 1F08 +1F01 1F09 +1F02 1F0A +1F03 1F0B +1F04 1F0C +1F05 1F0D +1F06 1F0E +1F07 1F0F +1F10 1F18 +1F11 1F19 +1F12 1F1A +1F13 1F1B +1F14 1F1C +1F15 1F1D +1F20 1F28 +1F21 1F29 +1F22 1F2A +1F23 1F2B +1F24 1F2C +1F25 1F2D +1F26 1F2E +1F27 1F2F +1F30 1F38 +1F31 1F39 +1F32 1F3A +1F33 1F3B +1F34 1F3C +1F35 1F3D +1F36 1F3E +1F37 1F3F +1F40 1F48 +1F41 1F49 +1F42 1F4A +1F43 1F4B +1F44 1F4C +1F45 1F4D +1F51 1F59 +1F53 1F5B +1F55 1F5D +1F57 1F5F +1F60 1F68 +1F61 1F69 +1F62 1F6A +1F63 1F6B +1F64 1F6C +1F65 1F6D +1F66 1F6E +1F67 1F6F +1F70 1FBA +1F71 1FBB +1F72 1FC8 +1F73 1FC9 +1F74 1FCA +1F75 1FCB +1F76 1FDA +1F77 1FDB +1F78 1FF8 +1F79 1FF9 +1F7A 1FEA +1F7B 1FEB +1F7C 1FFA +1F7D 1FFB +1FB0 1FB8 +1FB1 1FB9 +1FBE 0399 +1FD0 1FD8 +1FD1 1FD9 +1FE0 1FE8 +1FE1 1FE9 +1FE5 1FEC +2170 2160 +2171 2161 +2172 2162 +2173 2163 +2174 2164 +2175 2165 +2176 2166 +2177 2167 +2178 2168 +2179 2169 +217A 216A +217B 216B +217C 216C +217D 216D +217E 216E +217F 216F +24D0 24B6 +24D1 24B7 +24D2 24B8 +24D3 24B9 +24D4 24BA +24D5 24BB +24D6 24BC +24D7 24BD +24D8 24BE +24D9 24BF +24DA 24C0 +24DB 24C1 +24DC 24C2 +24DD 24C3 +24DE 24C4 +24DF 24C5 +24E0 24C6 +24E1 24C7 +24E2 24C8 +24E3 24C9 +24E4 24CA +24E5 24CB +24E6 24CC +24E7 24CD +24E8 24CE +24E9 24CF +2C30 2C00 +2C31 2C01 +2C32 2C02 +2C33 2C03 +2C34 2C04 +2C35 2C05 +2C36 2C06 +2C37 2C07 +2C38 2C08 +2C39 2C09 +2C3A 2C0A +2C3B 2C0B +2C3C 2C0C +2C3D 2C0D +2C3E 2C0E +2C3F 2C0F +2C40 2C10 +2C41 2C11 +2C42 2C12 +2C43 2C13 +2C44 2C14 +2C45 2C15 +2C46 2C16 +2C47 2C17 +2C48 2C18 +2C49 2C19 +2C4A 2C1A +2C4B 2C1B +2C4C 2C1C +2C4D 2C1D +2C4E 2C1E +2C4F 2C1F +2C50 2C20 +2C51 2C21 +2C52 2C22 +2C53 2C23 +2C54 2C24 +2C55 2C25 +2C56 2C26 +2C57 2C27 +2C58 2C28 +2C59 2C29 +2C5A 2C2A +2C5B 2C2B +2C5C 2C2C +2C5D 2C2D +2C5E 2C2E +2C81 2C80 +2C83 2C82 +2C85 2C84 +2C87 2C86 +2C89 2C88 +2C8B 2C8A +2C8D 2C8C +2C8F 2C8E +2C91 2C90 +2C93 2C92 +2C95 2C94 +2C97 2C96 +2C99 2C98 +2C9B 2C9A +2C9D 2C9C +2C9F 2C9E +2CA1 2CA0 +2CA3 2CA2 +2CA5 2CA4 +2CA7 2CA6 +2CA9 2CA8 +2CAB 2CAA +2CAD 2CAC +2CAF 2CAE +2CB1 2CB0 +2CB3 2CB2 +2CB5 2CB4 +2CB7 2CB6 +2CB9 2CB8 +2CBB 2CBA +2CBD 2CBC +2CBF 2CBE +2CC1 2CC0 +2CC3 2CC2 +2CC5 2CC4 +2CC7 2CC6 +2CC9 2CC8 +2CCB 2CCA +2CCD 2CCC +2CCF 2CCE +2CD1 2CD0 +2CD3 2CD2 +2CD5 2CD4 +2CD7 2CD6 +2CD9 2CD8 +2CDB 2CDA +2CDD 2CDC +2CDF 2CDE +2CE1 2CE0 +2CE3 2CE2 +2D00 10A0 +2D01 10A1 +2D02 10A2 +2D03 10A3 +2D04 10A4 +2D05 10A5 +2D06 10A6 +2D07 10A7 +2D08 10A8 +2D09 10A9 +2D0A 10AA +2D0B 10AB +2D0C 10AC +2D0D 10AD +2D0E 10AE +2D0F 10AF +2D10 10B0 +2D11 10B1 +2D12 10B2 +2D13 10B3 +2D14 10B4 +2D15 10B5 +2D16 10B6 +2D17 10B7 +2D18 10B8 +2D19 10B9 +2D1A 10BA +2D1B 10BB +2D1C 10BC +2D1D 10BD +2D1E 10BE +2D1F 10BF +2D20 10C0 +2D21 10C1 +2D22 10C2 +2D23 10C3 +2D24 10C4 +2D25 10C5 +FF41 FF21 +FF42 FF22 +FF43 FF23 +FF44 FF24 +FF45 FF25 +FF46 FF26 +FF47 FF27 +FF48 FF28 +FF49 FF29 +FF4A FF2A +FF4B FF2B +FF4C FF2C +FF4D FF2D +FF4E FF2E +FF4F FF2F +FF50 FF30 +FF51 FF31 +FF52 FF32 +FF53 FF33 +FF54 FF34 +FF55 FF35 +FF56 FF36 +FF57 FF37 +FF58 FF38 +FF59 FF39 +FF5A FF3A +10428 10400 +10429 10401 +1042A 10402 +1042B 10403 +1042C 10404 +1042D 10405 +1042E 10406 +1042F 10407 +10430 10408 +10431 10409 +10432 1040A +10433 1040B +10434 1040C +10435 1040D +10436 1040E +10437 1040F +10438 10410 +10439 10411 +1043A 10412 +1043B 10413 +1043C 10414 +1043D 10415 +1043E 10416 +1043F 10417 +10440 10418 +10441 10419 +10442 1041A +10443 1041B +10444 1041C +10445 1041D +10446 1041E +10447 1041F +10448 10420 +10449 10421 +1044A 10422 +1044B 10423 +1044C 10424 +1044D 10425 +1044E 10426 +1044F 10427 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/To/Upper.pl b/Master/tlpkg/tlperl.old/lib/unicore/To/Upper.pl new file mode 100644 index 00000000000..6b1f3e29c47 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/To/Upper.pl @@ -0,0 +1,989 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + + +# The key UTF-8 _bytes_, the value UTF-8 (speed hack) +%utf8::ToSpecUpper = +( +"\xC3\x9F" => "\x{0053}\x{0053}", +"\xC5\x89" => "\x{02BC}\x{004E}", +"\xC7\xB0" => "\x{004A}\x{030C}", +"\xCE\x90" => "\x{0399}\x{0308}\x{0301}", +"\xCE\xB0" => "\x{03A5}\x{0308}\x{0301}", +"\xD6\x87" => "\x{0535}\x{0552}", +"\xE1\xBA\x96" => "\x{0048}\x{0331}", +"\xE1\xBA\x97" => "\x{0054}\x{0308}", +"\xE1\xBA\x98" => "\x{0057}\x{030A}", +"\xE1\xBA\x99" => "\x{0059}\x{030A}", +"\xE1\xBA\x9A" => "\x{0041}\x{02BE}", +"\xE1\xBD\x90" => "\x{03A5}\x{0313}", +"\xE1\xBD\x92" => "\x{03A5}\x{0313}\x{0300}", +"\xE1\xBD\x94" => "\x{03A5}\x{0313}\x{0301}", +"\xE1\xBD\x96" => "\x{03A5}\x{0313}\x{0342}", +"\xE1\xBE\x80" => "\x{1F08}\x{0399}", +"\xE1\xBE\x81" => "\x{1F09}\x{0399}", +"\xE1\xBE\x82" => "\x{1F0A}\x{0399}", +"\xE1\xBE\x83" => "\x{1F0B}\x{0399}", +"\xE1\xBE\x84" => "\x{1F0C}\x{0399}", +"\xE1\xBE\x85" => "\x{1F0D}\x{0399}", +"\xE1\xBE\x86" => "\x{1F0E}\x{0399}", +"\xE1\xBE\x87" => "\x{1F0F}\x{0399}", +"\xE1\xBE\x88" => "\x{1F08}\x{0399}", +"\xE1\xBE\x89" => "\x{1F09}\x{0399}", +"\xE1\xBE\x8A" => "\x{1F0A}\x{0399}", +"\xE1\xBE\x8B" => "\x{1F0B}\x{0399}", +"\xE1\xBE\x8C" => "\x{1F0C}\x{0399}", +"\xE1\xBE\x8D" => "\x{1F0D}\x{0399}", +"\xE1\xBE\x8E" => "\x{1F0E}\x{0399}", +"\xE1\xBE\x8F" => "\x{1F0F}\x{0399}", +"\xE1\xBE\x90" => "\x{1F28}\x{0399}", +"\xE1\xBE\x91" => "\x{1F29}\x{0399}", +"\xE1\xBE\x92" => "\x{1F2A}\x{0399}", +"\xE1\xBE\x93" => "\x{1F2B}\x{0399}", +"\xE1\xBE\x94" => "\x{1F2C}\x{0399}", +"\xE1\xBE\x95" => "\x{1F2D}\x{0399}", +"\xE1\xBE\x96" => "\x{1F2E}\x{0399}", +"\xE1\xBE\x97" => "\x{1F2F}\x{0399}", +"\xE1\xBE\x98" => "\x{1F28}\x{0399}", +"\xE1\xBE\x99" => "\x{1F29}\x{0399}", +"\xE1\xBE\x9A" => "\x{1F2A}\x{0399}", +"\xE1\xBE\x9B" => "\x{1F2B}\x{0399}", +"\xE1\xBE\x9C" => "\x{1F2C}\x{0399}", +"\xE1\xBE\x9D" => "\x{1F2D}\x{0399}", +"\xE1\xBE\x9E" => "\x{1F2E}\x{0399}", +"\xE1\xBE\x9F" => "\x{1F2F}\x{0399}", +"\xE1\xBE\xA0" => "\x{1F68}\x{0399}", +"\xE1\xBE\xA1" => "\x{1F69}\x{0399}", +"\xE1\xBE\xA2" => "\x{1F6A}\x{0399}", +"\xE1\xBE\xA3" => "\x{1F6B}\x{0399}", +"\xE1\xBE\xA4" => "\x{1F6C}\x{0399}", +"\xE1\xBE\xA5" => "\x{1F6D}\x{0399}", +"\xE1\xBE\xA6" => "\x{1F6E}\x{0399}", +"\xE1\xBE\xA7" => "\x{1F6F}\x{0399}", +"\xE1\xBE\xA8" => "\x{1F68}\x{0399}", +"\xE1\xBE\xA9" => "\x{1F69}\x{0399}", +"\xE1\xBE\xAA" => "\x{1F6A}\x{0399}", +"\xE1\xBE\xAB" => "\x{1F6B}\x{0399}", +"\xE1\xBE\xAC" => "\x{1F6C}\x{0399}", +"\xE1\xBE\xAD" => "\x{1F6D}\x{0399}", +"\xE1\xBE\xAE" => "\x{1F6E}\x{0399}", +"\xE1\xBE\xAF" => "\x{1F6F}\x{0399}", +"\xE1\xBE\xB2" => "\x{1FBA}\x{0399}", +"\xE1\xBE\xB3" => "\x{0391}\x{0399}", +"\xE1\xBE\xB4" => "\x{0386}\x{0399}", +"\xE1\xBE\xB6" => "\x{0391}\x{0342}", +"\xE1\xBE\xB7" => "\x{0391}\x{0342}\x{0399}", +"\xE1\xBE\xBC" => "\x{0391}\x{0399}", +"\xE1\xBF\x82" => "\x{1FCA}\x{0399}", +"\xE1\xBF\x83" => "\x{0397}\x{0399}", +"\xE1\xBF\x84" => "\x{0389}\x{0399}", +"\xE1\xBF\x86" => "\x{0397}\x{0342}", +"\xE1\xBF\x87" => "\x{0397}\x{0342}\x{0399}", +"\xE1\xBF\x8C" => "\x{0397}\x{0399}", +"\xE1\xBF\x92" => "\x{0399}\x{0308}\x{0300}", +"\xE1\xBF\x93" => "\x{0399}\x{0308}\x{0301}", +"\xE1\xBF\x96" => "\x{0399}\x{0342}", +"\xE1\xBF\x97" => "\x{0399}\x{0308}\x{0342}", +"\xE1\xBF\xA2" => "\x{03A5}\x{0308}\x{0300}", +"\xE1\xBF\xA3" => "\x{03A5}\x{0308}\x{0301}", +"\xE1\xBF\xA4" => "\x{03A1}\x{0313}", +"\xE1\xBF\xA6" => "\x{03A5}\x{0342}", +"\xE1\xBF\xA7" => "\x{03A5}\x{0308}\x{0342}", +"\xE1\xBF\xB2" => "\x{1FFA}\x{0399}", +"\xE1\xBF\xB3" => "\x{03A9}\x{0399}", +"\xE1\xBF\xB4" => "\x{038F}\x{0399}", +"\xE1\xBF\xB6" => "\x{03A9}\x{0342}", +"\xE1\xBF\xB7" => "\x{03A9}\x{0342}\x{0399}", +"\xE1\xBF\xBC" => "\x{03A9}\x{0399}", +"\xEF\xAC\x80" => "\x{0046}\x{0046}", +"\xEF\xAC\x81" => "\x{0046}\x{0049}", +"\xEF\xAC\x82" => "\x{0046}\x{004C}", +"\xEF\xAC\x83" => "\x{0046}\x{0046}\x{0049}", +"\xEF\xAC\x84" => "\x{0046}\x{0046}\x{004C}", +"\xEF\xAC\x85" => "\x{0053}\x{0054}", +"\xEF\xAC\x86" => "\x{0053}\x{0054}", +"\xEF\xAC\x93" => "\x{0544}\x{0546}", +"\xEF\xAC\x94" => "\x{0544}\x{0535}", +"\xEF\xAC\x95" => "\x{0544}\x{053B}", +"\xEF\xAC\x96" => "\x{054E}\x{0546}", +"\xEF\xAC\x97" => "\x{0544}\x{053D}", +); + +return <<'END'; +0061 0041 +0062 0042 +0063 0043 +0064 0044 +0065 0045 +0066 0046 +0067 0047 +0068 0048 +0069 0049 +006A 004A +006B 004B +006C 004C +006D 004D +006E 004E +006F 004F +0070 0050 +0071 0051 +0072 0052 +0073 0053 +0074 0054 +0075 0055 +0076 0056 +0077 0057 +0078 0058 +0079 0059 +007A 005A +00B5 039C +00E0 00C0 +00E1 00C1 +00E2 00C2 +00E3 00C3 +00E4 00C4 +00E5 00C5 +00E6 00C6 +00E7 00C7 +00E8 00C8 +00E9 00C9 +00EA 00CA +00EB 00CB +00EC 00CC +00ED 00CD +00EE 00CE +00EF 00CF +00F0 00D0 +00F1 00D1 +00F2 00D2 +00F3 00D3 +00F4 00D4 +00F5 00D5 +00F6 00D6 +00F8 00D8 +00F9 00D9 +00FA 00DA +00FB 00DB +00FC 00DC +00FD 00DD +00FE 00DE +00FF 0178 +0101 0100 +0103 0102 +0105 0104 +0107 0106 +0109 0108 +010B 010A +010D 010C +010F 010E +0111 0110 +0113 0112 +0115 0114 +0117 0116 +0119 0118 +011B 011A +011D 011C +011F 011E +0121 0120 +0123 0122 +0125 0124 +0127 0126 +0129 0128 +012B 012A +012D 012C +012F 012E +0131 0049 +0133 0132 +0135 0134 +0137 0136 +013A 0139 +013C 013B +013E 013D +0140 013F +0142 0141 +0144 0143 +0146 0145 +0148 0147 +014B 014A +014D 014C +014F 014E +0151 0150 +0153 0152 +0155 0154 +0157 0156 +0159 0158 +015B 015A +015D 015C +015F 015E +0161 0160 +0163 0162 +0165 0164 +0167 0166 +0169 0168 +016B 016A +016D 016C +016F 016E +0171 0170 +0173 0172 +0175 0174 +0177 0176 +017A 0179 +017C 017B +017E 017D +017F 0053 +0183 0182 +0185 0184 +0188 0187 +018C 018B +0192 0191 +0195 01F6 +0199 0198 +019A 023D +019E 0220 +01A1 01A0 +01A3 01A2 +01A5 01A4 +01A8 01A7 +01AD 01AC +01B0 01AF +01B4 01B3 +01B6 01B5 +01B9 01B8 +01BD 01BC +01BF 01F7 +01C5 01C4 +01C6 01C4 +01C8 01C7 +01C9 01C7 +01CB 01CA +01CC 01CA +01CE 01CD +01D0 01CF +01D2 01D1 +01D4 01D3 +01D6 01D5 +01D8 01D7 +01DA 01D9 +01DC 01DB +01DD 018E +01DF 01DE +01E1 01E0 +01E3 01E2 +01E5 01E4 +01E7 01E6 +01E9 01E8 +01EB 01EA +01ED 01EC +01EF 01EE +01F2 01F1 +01F3 01F1 +01F5 01F4 +01F9 01F8 +01FB 01FA +01FD 01FC +01FF 01FE +0201 0200 +0203 0202 +0205 0204 +0207 0206 +0209 0208 +020B 020A +020D 020C +020F 020E +0211 0210 +0213 0212 +0215 0214 +0217 0216 +0219 0218 +021B 021A +021D 021C +021F 021E +0223 0222 +0225 0224 +0227 0226 +0229 0228 +022B 022A +022D 022C +022F 022E +0231 0230 +0233 0232 +023C 023B +0253 0181 +0254 0186 +0256 0189 +0257 018A +0259 018F +025B 0190 +0260 0193 +0263 0194 +0268 0197 +0269 0196 +026F 019C +0272 019D +0275 019F +0280 01A6 +0283 01A9 +0288 01AE +028A 01B1 +028B 01B2 +0292 01B7 +0294 0241 +0345 0399 +03AC 0386 +03AD 0388 +03AE 0389 +03AF 038A +03B1 0391 +03B2 0392 +03B3 0393 +03B4 0394 +03B5 0395 +03B6 0396 +03B7 0397 +03B8 0398 +03B9 0399 +03BA 039A +03BB 039B +03BC 039C +03BD 039D +03BE 039E +03BF 039F +03C0 03A0 +03C1 03A1 +03C2 03A3 +03C3 03A3 +03C4 03A4 +03C5 03A5 +03C6 03A6 +03C7 03A7 +03C8 03A8 +03C9 03A9 +03CA 03AA +03CB 03AB +03CC 038C +03CD 038E +03CE 038F +03D0 0392 +03D1 0398 +03D5 03A6 +03D6 03A0 +03D9 03D8 +03DB 03DA +03DD 03DC +03DF 03DE +03E1 03E0 +03E3 03E2 +03E5 03E4 +03E7 03E6 +03E9 03E8 +03EB 03EA +03ED 03EC +03EF 03EE +03F0 039A +03F1 03A1 +03F2 03F9 +03F5 0395 +03F8 03F7 +03FB 03FA +0430 0410 +0431 0411 +0432 0412 +0433 0413 +0434 0414 +0435 0415 +0436 0416 +0437 0417 +0438 0418 +0439 0419 +043A 041A +043B 041B +043C 041C +043D 041D +043E 041E +043F 041F +0440 0420 +0441 0421 +0442 0422 +0443 0423 +0444 0424 +0445 0425 +0446 0426 +0447 0427 +0448 0428 +0449 0429 +044A 042A +044B 042B +044C 042C +044D 042D +044E 042E +044F 042F +0450 0400 +0451 0401 +0452 0402 +0453 0403 +0454 0404 +0455 0405 +0456 0406 +0457 0407 +0458 0408 +0459 0409 +045A 040A +045B 040B +045C 040C +045D 040D +045E 040E +045F 040F +0461 0460 +0463 0462 +0465 0464 +0467 0466 +0469 0468 +046B 046A +046D 046C +046F 046E +0471 0470 +0473 0472 +0475 0474 +0477 0476 +0479 0478 +047B 047A +047D 047C +047F 047E +0481 0480 +048B 048A +048D 048C +048F 048E +0491 0490 +0493 0492 +0495 0494 +0497 0496 +0499 0498 +049B 049A +049D 049C +049F 049E +04A1 04A0 +04A3 04A2 +04A5 04A4 +04A7 04A6 +04A9 04A8 +04AB 04AA +04AD 04AC +04AF 04AE +04B1 04B0 +04B3 04B2 +04B5 04B4 +04B7 04B6 +04B9 04B8 +04BB 04BA +04BD 04BC +04BF 04BE +04C2 04C1 +04C4 04C3 +04C6 04C5 +04C8 04C7 +04CA 04C9 +04CC 04CB +04CE 04CD +04D1 04D0 +04D3 04D2 +04D5 04D4 +04D7 04D6 +04D9 04D8 +04DB 04DA +04DD 04DC +04DF 04DE +04E1 04E0 +04E3 04E2 +04E5 04E4 +04E7 04E6 +04E9 04E8 +04EB 04EA +04ED 04EC +04EF 04EE +04F1 04F0 +04F3 04F2 +04F5 04F4 +04F7 04F6 +04F9 04F8 +0501 0500 +0503 0502 +0505 0504 +0507 0506 +0509 0508 +050B 050A +050D 050C +050F 050E +0561 0531 +0562 0532 +0563 0533 +0564 0534 +0565 0535 +0566 0536 +0567 0537 +0568 0538 +0569 0539 +056A 053A +056B 053B +056C 053C +056D 053D +056E 053E +056F 053F +0570 0540 +0571 0541 +0572 0542 +0573 0543 +0574 0544 +0575 0545 +0576 0546 +0577 0547 +0578 0548 +0579 0549 +057A 054A +057B 054B +057C 054C +057D 054D +057E 054E +057F 054F +0580 0550 +0581 0551 +0582 0552 +0583 0553 +0584 0554 +0585 0555 +0586 0556 +1E01 1E00 +1E03 1E02 +1E05 1E04 +1E07 1E06 +1E09 1E08 +1E0B 1E0A +1E0D 1E0C +1E0F 1E0E +1E11 1E10 +1E13 1E12 +1E15 1E14 +1E17 1E16 +1E19 1E18 +1E1B 1E1A +1E1D 1E1C +1E1F 1E1E +1E21 1E20 +1E23 1E22 +1E25 1E24 +1E27 1E26 +1E29 1E28 +1E2B 1E2A +1E2D 1E2C +1E2F 1E2E +1E31 1E30 +1E33 1E32 +1E35 1E34 +1E37 1E36 +1E39 1E38 +1E3B 1E3A +1E3D 1E3C +1E3F 1E3E +1E41 1E40 +1E43 1E42 +1E45 1E44 +1E47 1E46 +1E49 1E48 +1E4B 1E4A +1E4D 1E4C +1E4F 1E4E +1E51 1E50 +1E53 1E52 +1E55 1E54 +1E57 1E56 +1E59 1E58 +1E5B 1E5A +1E5D 1E5C +1E5F 1E5E +1E61 1E60 +1E63 1E62 +1E65 1E64 +1E67 1E66 +1E69 1E68 +1E6B 1E6A +1E6D 1E6C +1E6F 1E6E +1E71 1E70 +1E73 1E72 +1E75 1E74 +1E77 1E76 +1E79 1E78 +1E7B 1E7A +1E7D 1E7C +1E7F 1E7E +1E81 1E80 +1E83 1E82 +1E85 1E84 +1E87 1E86 +1E89 1E88 +1E8B 1E8A +1E8D 1E8C +1E8F 1E8E +1E91 1E90 +1E93 1E92 +1E95 1E94 +1E9B 1E60 +1EA1 1EA0 +1EA3 1EA2 +1EA5 1EA4 +1EA7 1EA6 +1EA9 1EA8 +1EAB 1EAA +1EAD 1EAC +1EAF 1EAE +1EB1 1EB0 +1EB3 1EB2 +1EB5 1EB4 +1EB7 1EB6 +1EB9 1EB8 +1EBB 1EBA +1EBD 1EBC +1EBF 1EBE +1EC1 1EC0 +1EC3 1EC2 +1EC5 1EC4 +1EC7 1EC6 +1EC9 1EC8 +1ECB 1ECA +1ECD 1ECC +1ECF 1ECE +1ED1 1ED0 +1ED3 1ED2 +1ED5 1ED4 +1ED7 1ED6 +1ED9 1ED8 +1EDB 1EDA +1EDD 1EDC +1EDF 1EDE +1EE1 1EE0 +1EE3 1EE2 +1EE5 1EE4 +1EE7 1EE6 +1EE9 1EE8 +1EEB 1EEA +1EED 1EEC +1EEF 1EEE +1EF1 1EF0 +1EF3 1EF2 +1EF5 1EF4 +1EF7 1EF6 +1EF9 1EF8 +1F00 1F08 +1F01 1F09 +1F02 1F0A +1F03 1F0B +1F04 1F0C +1F05 1F0D +1F06 1F0E +1F07 1F0F +1F10 1F18 +1F11 1F19 +1F12 1F1A +1F13 1F1B +1F14 1F1C +1F15 1F1D +1F20 1F28 +1F21 1F29 +1F22 1F2A +1F23 1F2B +1F24 1F2C +1F25 1F2D +1F26 1F2E +1F27 1F2F +1F30 1F38 +1F31 1F39 +1F32 1F3A +1F33 1F3B +1F34 1F3C +1F35 1F3D +1F36 1F3E +1F37 1F3F +1F40 1F48 +1F41 1F49 +1F42 1F4A +1F43 1F4B +1F44 1F4C +1F45 1F4D +1F51 1F59 +1F53 1F5B +1F55 1F5D +1F57 1F5F +1F60 1F68 +1F61 1F69 +1F62 1F6A +1F63 1F6B +1F64 1F6C +1F65 1F6D +1F66 1F6E +1F67 1F6F +1F70 1FBA +1F71 1FBB +1F72 1FC8 +1F73 1FC9 +1F74 1FCA +1F75 1FCB +1F76 1FDA +1F77 1FDB +1F78 1FF8 +1F79 1FF9 +1F7A 1FEA +1F7B 1FEB +1F7C 1FFA +1F7D 1FFB +1FB0 1FB8 +1FB1 1FB9 +1FBE 0399 +1FD0 1FD8 +1FD1 1FD9 +1FE0 1FE8 +1FE1 1FE9 +1FE5 1FEC +2170 2160 +2171 2161 +2172 2162 +2173 2163 +2174 2164 +2175 2165 +2176 2166 +2177 2167 +2178 2168 +2179 2169 +217A 216A +217B 216B +217C 216C +217D 216D +217E 216E +217F 216F +24D0 24B6 +24D1 24B7 +24D2 24B8 +24D3 24B9 +24D4 24BA +24D5 24BB +24D6 24BC +24D7 24BD +24D8 24BE +24D9 24BF +24DA 24C0 +24DB 24C1 +24DC 24C2 +24DD 24C3 +24DE 24C4 +24DF 24C5 +24E0 24C6 +24E1 24C7 +24E2 24C8 +24E3 24C9 +24E4 24CA +24E5 24CB +24E6 24CC +24E7 24CD +24E8 24CE +24E9 24CF +2C30 2C00 +2C31 2C01 +2C32 2C02 +2C33 2C03 +2C34 2C04 +2C35 2C05 +2C36 2C06 +2C37 2C07 +2C38 2C08 +2C39 2C09 +2C3A 2C0A +2C3B 2C0B +2C3C 2C0C +2C3D 2C0D +2C3E 2C0E +2C3F 2C0F +2C40 2C10 +2C41 2C11 +2C42 2C12 +2C43 2C13 +2C44 2C14 +2C45 2C15 +2C46 2C16 +2C47 2C17 +2C48 2C18 +2C49 2C19 +2C4A 2C1A +2C4B 2C1B +2C4C 2C1C +2C4D 2C1D +2C4E 2C1E +2C4F 2C1F +2C50 2C20 +2C51 2C21 +2C52 2C22 +2C53 2C23 +2C54 2C24 +2C55 2C25 +2C56 2C26 +2C57 2C27 +2C58 2C28 +2C59 2C29 +2C5A 2C2A +2C5B 2C2B +2C5C 2C2C +2C5D 2C2D +2C5E 2C2E +2C81 2C80 +2C83 2C82 +2C85 2C84 +2C87 2C86 +2C89 2C88 +2C8B 2C8A +2C8D 2C8C +2C8F 2C8E +2C91 2C90 +2C93 2C92 +2C95 2C94 +2C97 2C96 +2C99 2C98 +2C9B 2C9A +2C9D 2C9C +2C9F 2C9E +2CA1 2CA0 +2CA3 2CA2 +2CA5 2CA4 +2CA7 2CA6 +2CA9 2CA8 +2CAB 2CAA +2CAD 2CAC +2CAF 2CAE +2CB1 2CB0 +2CB3 2CB2 +2CB5 2CB4 +2CB7 2CB6 +2CB9 2CB8 +2CBB 2CBA +2CBD 2CBC +2CBF 2CBE +2CC1 2CC0 +2CC3 2CC2 +2CC5 2CC4 +2CC7 2CC6 +2CC9 2CC8 +2CCB 2CCA +2CCD 2CCC +2CCF 2CCE +2CD1 2CD0 +2CD3 2CD2 +2CD5 2CD4 +2CD7 2CD6 +2CD9 2CD8 +2CDB 2CDA +2CDD 2CDC +2CDF 2CDE +2CE1 2CE0 +2CE3 2CE2 +2D00 10A0 +2D01 10A1 +2D02 10A2 +2D03 10A3 +2D04 10A4 +2D05 10A5 +2D06 10A6 +2D07 10A7 +2D08 10A8 +2D09 10A9 +2D0A 10AA +2D0B 10AB +2D0C 10AC +2D0D 10AD +2D0E 10AE +2D0F 10AF +2D10 10B0 +2D11 10B1 +2D12 10B2 +2D13 10B3 +2D14 10B4 +2D15 10B5 +2D16 10B6 +2D17 10B7 +2D18 10B8 +2D19 10B9 +2D1A 10BA +2D1B 10BB +2D1C 10BC +2D1D 10BD +2D1E 10BE +2D1F 10BF +2D20 10C0 +2D21 10C1 +2D22 10C2 +2D23 10C3 +2D24 10C4 +2D25 10C5 +FF41 FF21 +FF42 FF22 +FF43 FF23 +FF44 FF24 +FF45 FF25 +FF46 FF26 +FF47 FF27 +FF48 FF28 +FF49 FF29 +FF4A FF2A +FF4B FF2B +FF4C FF2C +FF4D FF2D +FF4E FF2E +FF4F FF2F +FF50 FF30 +FF51 FF31 +FF52 FF32 +FF53 FF33 +FF54 FF34 +FF55 FF35 +FF56 FF36 +FF57 FF37 +FF58 FF38 +FF59 FF39 +FF5A FF3A +10428 10400 +10429 10401 +1042A 10402 +1042B 10403 +1042C 10404 +1042D 10405 +1042E 10406 +1042F 10407 +10430 10408 +10431 10409 +10432 1040A +10433 1040B +10434 1040C +10435 1040D +10436 1040E +10437 1040F +10438 10410 +10439 10411 +1043A 10412 +1043B 10413 +1043C 10414 +1043D 10415 +1043E 10416 +1043F 10417 +10440 10418 +10441 10419 +10442 1041A +10443 1041B +10444 1041C +10445 1041D +10446 1041E +10447 1041F +10448 10420 +10449 10421 +1044A 10422 +1044B 10423 +1044C 10424 +1044D 10425 +1044E 10426 +1044F 10427 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/UnicodeData.txt b/Master/tlpkg/tlperl.old/lib/unicore/UnicodeData.txt new file mode 100644 index 00000000000..f314186b29c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/UnicodeData.txt @@ -0,0 +1,16351 @@ +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;ES;;;;;N;;;;; +002C;COMMA;Po;0;CS;;;;;N;;;;; +002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;; +002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; +002F;SOLIDUS;Po;0;CS;;;;;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;Cf;0;BN;;;;;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;N;SUPERSCRIPT DIGIT TWO;;;; +00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;;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;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;;023D;;023D +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;01C5 +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;01C8 +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;01CB +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;01F2 +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; +0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;; +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 +0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;; +0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;; +0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;; +0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;; +0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;; +0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;; +023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;; +023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C; +023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B +023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A; +023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;; +023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;;; +0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;;; +0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0294; +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;;;0241;;0241 +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;;;;; +02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;; +02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;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;Lm;0;ON;;;;;N;;;;; +02BA;MODIFIER LETTER DOUBLE PRIME;Lm;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;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;; +02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;Mandarin Chinese third tone;;; +02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;; +02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;Mandarin Chinese first tone;;; +02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;Mandarin Chinese second tone;;; +02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;Mandarin Chinese fourth tone;;; +02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;; +02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;; +02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;; +02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;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;;;;; +02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;; +02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; +02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; +02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;; +02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;; +02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;; +02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;; +02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;; +02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;; +02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;; +02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;; +02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;; +02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;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;;;;; +0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;; +0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;; +0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; +0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;; +035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;; +035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;; +035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;; +035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;; +035F;COMBINING DOUBLE MACRON BELOW;Mn;233;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;;03F9;;03F9 +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;;;;; +03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8; +03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7 +03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L;<compat> 03A3;;;;N;;;;03F2; +03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB; +03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA +03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;; +03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;; +03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;; +03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;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 +04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7; +04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6 +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;;;;; +05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;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;;;;; +05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;; +05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;; +05C7;HEBREW POINT QAMATS QATAN;Mn;18;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;;;;; +0600;ARABIC NUMBER SIGN;Cf;0;AL;;;;;N;;;;; +0601;ARABIC SIGN SANAH;Cf;0;AL;;;;;N;;;;; +0602;ARABIC FOOTNOTE MARKER;Cf;0;AL;;;;;N;;;;; +0603;ARABIC SIGN SAFHA;Cf;0;AL;;;;;N;;;;; +060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;; +060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; +060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;; +060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;; +060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;; +0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;; +0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;; +0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;; +0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;; +0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;; +0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;; +061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; +061E;ARABIC TRIPLE DOT PUNCTUATION MARK;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;;;;; +0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;; +0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;; +0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; +0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;; +065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;; +065E;ARABIC FATHA WITH TWO DOTS;Mn;230;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;;;;; +06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;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;;;;; +06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;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;;;;; +072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;; +072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;; +072F;SYRIAC LETTER PERSIAN DHALATH;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;;;;; +074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;; +074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;; +074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;; +0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;; +0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;; +075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;; +075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;; +0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;; +076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;; +076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;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;;;;; +0904;DEVANAGARI LETTER SHORT A;Lo;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;;;;; +097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;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;;;;; +09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;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;;;;; +09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;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;;;;; +0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;; +0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;; +0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;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;;;;; +0A8C;GUJARATI LETTER VOCALIC L;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;;;;; +0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;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;;;;; +0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;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;;;;; +0B35;ORIYA LETTER VA;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;;;;; +0B71;ORIYA LETTER WA;Lo;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;;;;; +0BB6;TAMIL LETTER SHA;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;;;;; +0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;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;;;;; +0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;Naal;;; +0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;Maatham;;; +0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;Varudam;;; +0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;Patru;;; +0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;Varavu;;; +0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;Merpadi;;; +0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;Rupai;;; +0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;Enn;;; +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;;;;; +0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;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;L;;;;;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;;; +0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;ka shog gi go gyen;;; +0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;nyam yig gi go gyen;;; +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;;2D00; +10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;2D01; +10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;2D02; +10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;2D03; +10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;2D04; +10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;2D05; +10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;2D06; +10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;2D07; +10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;2D08; +10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;2D09; +10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;2D0A; +10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;2D0B; +10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;2D0C; +10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;2D0D; +10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;2D0E; +10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;2D0F; +10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;2D10; +10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;2D11; +10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;2D12; +10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;2D13; +10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;2D14; +10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;2D15; +10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;2D16; +10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;2D17; +10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;2D18; +10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;2D19; +10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;2D1A; +10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;2D1B; +10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;2D1C; +10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;2D1D; +10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;2D1E; +10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;2D1F; +10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;2D20; +10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;2D21; +10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;2D22; +10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;2D23; +10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;2D24; +10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;2D25; +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;;;;; +10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;; +10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;; +10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L;<super> 10DC;;;;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;;;;; +1207;ETHIOPIC SYLLABLE HOA;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;;;;; +1247;ETHIOPIC SYLLABLE QOA;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;;;;; +1287;ETHIOPIC SYLLABLE XOA;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;;;;; +12AF;ETHIOPIC SYLLABLE KOA;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;;;;; +12CF;ETHIOPIC SYLLABLE WOA;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;;;;; +12EF;ETHIOPIC SYLLABLE YOA;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;;;;; +130F;ETHIOPIC SYLLABLE GOA;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;;;;; +131F;ETHIOPIC SYLLABLE GGWAA;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;;;;; +1347;ETHIOPIC SYLLABLE TZOA;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;;;;; +135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; +1360;ETHIOPIC SECTION MARK;So;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;No;0;L;;;1;1;N;;;;; +136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;; +136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;; +136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;; +136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;; +136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;; +136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;; +1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;; +1371;ETHIOPIC DIGIT NINE;No;0;L;;;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;;;;; +1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;; +1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;; +1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;; +1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;; +1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;; +1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;; +1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;; +1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;; +1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;; +1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;; +138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;; +138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;; +138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;; +138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;; +138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;; +138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;; +1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;; +1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;; +1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;; +1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;; +1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;; +1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;; +1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;; +1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;; +1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;; +1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;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;Cf;0;L;;;;;N;;*;;; +17B5;KHMER VOWEL INHERENT AA;Cf;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;;;;; +17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;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;;;;; +17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;; +17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;; +17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;; +17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;; +17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;; +17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;; +17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;; +17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;; +17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;; +17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;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;Zs;0;WS;;;;;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;;;;; +1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;; +1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;; +1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;; +1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;; +1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;; +1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;; +1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;; +1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;; +1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;; +1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;; +190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;; +190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;; +190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;; +190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;; +190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;; +190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;; +1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;; +1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;; +1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;; +1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;; +1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;; +1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;; +1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;; +1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;; +1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;; +1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;; +191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;; +191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;; +191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;; +1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; +1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +1929;LIMBU SUBJOINED LETTER YA;Mc;0;NSM;;;;;N;;;;; +192A;LIMBU SUBJOINED LETTER RA;Mc;0;NSM;;;;;N;;;;; +192B;LIMBU SUBJOINED LETTER WA;Mc;0;NSM;;;;;N;;;;; +1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;; +1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;; +1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;; +1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;; +1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;; +1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;; +1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;; +1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;; +1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;; +193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;; +193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;; +1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;; +1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;; +1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;; +1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;; +1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;; +1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;; +1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;; +1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;; +1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;; +1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;; +1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;; +1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;; +195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;; +195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;; +195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;; +195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;; +195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;; +195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;; +1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;; +1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;; +1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;; +1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;; +1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;; +1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;; +1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;; +1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;; +1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;; +1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;; +196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;; +196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;; +196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;; +196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;; +1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;; +1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;; +1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;; +1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;; +1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;; +1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;; +1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;; +1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;; +1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;; +1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;; +1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;; +1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;; +1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;; +198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;; +198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;; +198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;; +1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;; +1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;; +1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;; +199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;; +199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;; +199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;; +199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;; +199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;; +19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;; +19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;; +19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;; +19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;; +19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;; +19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;; +19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;; +19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;; +19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;; +19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Mc;0;L;;;;;N;;;;; +19B1;NEW TAI LUE VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +19B2;NEW TAI LUE VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +19B3;NEW TAI LUE VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +19B4;NEW TAI LUE VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +19B5;NEW TAI LUE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +19B6;NEW TAI LUE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +19B7;NEW TAI LUE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +19B8;NEW TAI LUE VOWEL SIGN OA;Mc;0;L;;;;;N;;;;; +19B9;NEW TAI LUE VOWEL SIGN UE;Mc;0;L;;;;;N;;;;; +19BA;NEW TAI LUE VOWEL SIGN AY;Mc;0;L;;;;;N;;;;; +19BB;NEW TAI LUE VOWEL SIGN AAY;Mc;0;L;;;;;N;;;;; +19BC;NEW TAI LUE VOWEL SIGN UY;Mc;0;L;;;;;N;;;;; +19BD;NEW TAI LUE VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; +19BE;NEW TAI LUE VOWEL SIGN OAY;Mc;0;L;;;;;N;;;;; +19BF;NEW TAI LUE VOWEL SIGN UEY;Mc;0;L;;;;;N;;;;; +19C0;NEW TAI LUE VOWEL SIGN IY;Mc;0;L;;;;;N;;;;; +19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;; +19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;; +19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;; +19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;; +19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;; +19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;; +19C8;NEW TAI LUE TONE MARK-1;Mc;0;L;;;;;N;;;;; +19C9;NEW TAI LUE TONE MARK-2;Mc;0;L;;;;;N;;;;; +19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +19DE;NEW TAI LUE SIGN LAE;Po;0;ON;;;;;N;;;;; +19DF;NEW TAI LUE SIGN LAEV;Po;0;ON;;;;;N;;;;; +19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;; +19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;; +19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;; +19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;; +19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;; +19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;; +19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;; +19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;; +19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;; +19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;; +19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;; +19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;; +19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;; +19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;; +19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;; +19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;; +19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;; +19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;; +19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;; +19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;; +19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;; +19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;; +19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;; +19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;; +19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;; +19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;; +19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;; +19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;; +19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;; +19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;; +19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;; +19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;; +1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;; +1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;; +1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;; +1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;; +1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;; +1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;; +1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;; +1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1A1B;BUGINESE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;; +1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;; +1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;; +1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;; +1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;; +1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;; +1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;; +1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;; +1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;; +1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;; +1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;; +1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;; +1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;; +1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;; +1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;; +1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;; +1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;; +1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;; +1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;; +1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;; +1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;; +1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;; +1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;; +1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;; +1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;; +1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;; +1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;; +1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;; +1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;; +1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;; +1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;; +1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;; +1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;; +1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;; +1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;; +1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;; +1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;; +1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;; +1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;; +1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;; +1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;; +1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;; +1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;; +1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;; +1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;; +1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;; +1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L;<super> 0041;;;;N;;;;; +1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L;<super> 00C6;;;;N;;;;; +1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L;<super> 0042;;;;N;;;;; +1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;; +1D30;MODIFIER LETTER CAPITAL D;Lm;0;L;<super> 0044;;;;N;;;;; +1D31;MODIFIER LETTER CAPITAL E;Lm;0;L;<super> 0045;;;;N;;;;; +1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L;<super> 018E;;;;N;;;;; +1D33;MODIFIER LETTER CAPITAL G;Lm;0;L;<super> 0047;;;;N;;;;; +1D34;MODIFIER LETTER CAPITAL H;Lm;0;L;<super> 0048;;;;N;;;;; +1D35;MODIFIER LETTER CAPITAL I;Lm;0;L;<super> 0049;;;;N;;;;; +1D36;MODIFIER LETTER CAPITAL J;Lm;0;L;<super> 004A;;;;N;;;;; +1D37;MODIFIER LETTER CAPITAL K;Lm;0;L;<super> 004B;;;;N;;;;; +1D38;MODIFIER LETTER CAPITAL L;Lm;0;L;<super> 004C;;;;N;;;;; +1D39;MODIFIER LETTER CAPITAL M;Lm;0;L;<super> 004D;;;;N;;;;; +1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L;<super> 004E;;;;N;;;;; +1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;; +1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L;<super> 004F;;;;N;;;;; +1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L;<super> 0222;;;;N;;;;; +1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L;<super> 0050;;;;N;;;;; +1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L;<super> 0052;;;;N;;;;; +1D40;MODIFIER LETTER CAPITAL T;Lm;0;L;<super> 0054;;;;N;;;;; +1D41;MODIFIER LETTER CAPITAL U;Lm;0;L;<super> 0055;;;;N;;;;; +1D42;MODIFIER LETTER CAPITAL W;Lm;0;L;<super> 0057;;;;N;;;;; +1D43;MODIFIER LETTER SMALL A;Lm;0;L;<super> 0061;;;;N;;;;; +1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L;<super> 0250;;;;N;;;;; +1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L;<super> 0251;;;;N;;;;; +1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L;<super> 1D02;;;;N;;;;; +1D47;MODIFIER LETTER SMALL B;Lm;0;L;<super> 0062;;;;N;;;;; +1D48;MODIFIER LETTER SMALL D;Lm;0;L;<super> 0064;;;;N;;;;; +1D49;MODIFIER LETTER SMALL E;Lm;0;L;<super> 0065;;;;N;;;;; +1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L;<super> 0259;;;;N;;;;; +1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L;<super> 025B;;;;N;;;;; +1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;; +1D4D;MODIFIER LETTER SMALL G;Lm;0;L;<super> 0067;;;;N;;;;; +1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;; +1D4F;MODIFIER LETTER SMALL K;Lm;0;L;<super> 006B;;;;N;;;;; +1D50;MODIFIER LETTER SMALL M;Lm;0;L;<super> 006D;;;;N;;;;; +1D51;MODIFIER LETTER SMALL ENG;Lm;0;L;<super> 014B;;;;N;;;;; +1D52;MODIFIER LETTER SMALL O;Lm;0;L;<super> 006F;;;;N;;;;; +1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L;<super> 0254;;;;N;;;;; +1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L;<super> 1D16;;;;N;;;;; +1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L;<super> 1D17;;;;N;;;;; +1D56;MODIFIER LETTER SMALL P;Lm;0;L;<super> 0070;;;;N;;;;; +1D57;MODIFIER LETTER SMALL T;Lm;0;L;<super> 0074;;;;N;;;;; +1D58;MODIFIER LETTER SMALL U;Lm;0;L;<super> 0075;;;;N;;;;; +1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L;<super> 1D1D;;;;N;;;;; +1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L;<super> 026F;;;;N;;;;; +1D5B;MODIFIER LETTER SMALL V;Lm;0;L;<super> 0076;;;;N;;;;; +1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L;<super> 1D25;;;;N;;;;; +1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L;<super> 03B2;;;;N;;;;; +1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L;<super> 03B3;;;;N;;;;; +1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L;<super> 03B4;;;;N;;;;; +1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L;<super> 03C6;;;;N;;;;; +1D61;MODIFIER LETTER SMALL CHI;Lm;0;L;<super> 03C7;;;;N;;;;; +1D62;LATIN SUBSCRIPT SMALL LETTER I;Ll;0;L;<sub> 0069;;;;N;;;;; +1D63;LATIN SUBSCRIPT SMALL LETTER R;Ll;0;L;<sub> 0072;;;;N;;;;; +1D64;LATIN SUBSCRIPT SMALL LETTER U;Ll;0;L;<sub> 0075;;;;N;;;;; +1D65;LATIN SUBSCRIPT SMALL LETTER V;Ll;0;L;<sub> 0076;;;;N;;;;; +1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Ll;0;L;<sub> 03B2;;;;N;;;;; +1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Ll;0;L;<sub> 03B3;;;;N;;;;; +1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Ll;0;L;<sub> 03C1;;;;N;;;;; +1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Ll;0;L;<sub> 03C6;;;;N;;;;; +1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Ll;0;L;<sub> 03C7;;;;N;;;;; +1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;; +1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;; +1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L;<super> 043D;;;;N;;;;; +1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;;; +1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;; +1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;; +1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;; +1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L;<super> 0252;;;;N;;;;; +1D9C;MODIFIER LETTER SMALL C;Lm;0;L;<super> 0063;;;;N;;;;; +1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L;<super> 0255;;;;N;;;;; +1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L;<super> 00F0;;;;N;;;;; +1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;; +1DA0;MODIFIER LETTER SMALL F;Lm;0;L;<super> 0066;;;;N;;;;; +1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L;<super> 025F;;;;N;;;;; +1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L;<super> 0261;;;;N;;;;; +1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L;<super> 0265;;;;N;;;;; +1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L;<super> 0268;;;;N;;;;; +1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L;<super> 0269;;;;N;;;;; +1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L;<super> 026A;;;;N;;;;; +1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L;<super> 1D7B;;;;N;;;;; +1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L;<super> 029D;;;;N;;;;; +1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L;<super> 026D;;;;N;;;;; +1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L;<super> 1D85;;;;N;;;;; +1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L;<super> 029F;;;;N;;;;; +1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L;<super> 0271;;;;N;;;;; +1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L;<super> 0270;;;;N;;;;; +1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L;<super> 0272;;;;N;;;;; +1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L;<super> 0273;;;;N;;;;; +1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L;<super> 0274;;;;N;;;;; +1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L;<super> 0275;;;;N;;;;; +1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L;<super> 0278;;;;N;;;;; +1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L;<super> 0282;;;;N;;;;; +1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L;<super> 0283;;;;N;;;;; +1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L;<super> 01AB;;;;N;;;;; +1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L;<super> 0289;;;;N;;;;; +1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L;<super> 028A;;;;N;;;;; +1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L;<super> 1D1C;;;;N;;;;; +1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L;<super> 028B;;;;N;;;;; +1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L;<super> 028C;;;;N;;;;; +1DBB;MODIFIER LETTER SMALL Z;Lm;0;L;<super> 007A;;;;N;;;;; +1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L;<super> 0290;;;;N;;;;; +1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L;<super> 0291;;;;N;;;;; +1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L;<super> 0292;;;;N;;;;; +1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L;<super> 03B8;;;;N;;;;; +1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;; +1DC3;COMBINING SUSPENSION MARK;Mn;230;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;Cf;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;CS;<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;CS;;;;;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;;;;; +2053;SWUNG DASH;Po;0;ON;;;;;N;;;;; +2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;; +2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;; +2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2057;QUADRUPLE PRIME;Po;0;ON;<compat> 2032 2032 2032 2032;;;;N;;;;; +2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;; +205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;; +205D;TRICOLON;Po;0;ON;;;;;N;;;;; +205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;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;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;N;SUPERSCRIPT DIGIT FOUR;;;; +2075;SUPERSCRIPT FIVE;No;0;EN;<super> 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;; +2076;SUPERSCRIPT SIX;No;0;EN;<super> 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;; +2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; +2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; +2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;; +207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES;<super> 002B;;;;N;;;;; +207B;SUPERSCRIPT MINUS;Sm;0;ES;<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;N;SUBSCRIPT DIGIT ZERO;;;; +2081;SUBSCRIPT ONE;No;0;EN;<sub> 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;; +2082;SUBSCRIPT TWO;No;0;EN;<sub> 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;; +2083;SUBSCRIPT THREE;No;0;EN;<sub> 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;; +2084;SUBSCRIPT FOUR;No;0;EN;<sub> 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;; +2085;SUBSCRIPT FIVE;No;0;EN;<sub> 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;; +2086;SUBSCRIPT SIX;No;0;EN;<sub> 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;; +2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; +2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; +2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;; +208A;SUBSCRIPT PLUS SIGN;Sm;0;ES;<sub> 002B;;;;N;;;;; +208B;SUBSCRIPT MINUS;Sm;0;ES;<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;;;; +2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L;<sub> 0061;;;;N;;;;; +2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L;<sub> 0065;;;;N;;;;; +2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L;<sub> 006F;;;;N;;;;; +2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L;<sub> 0078;;;;N;;;;; +2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L;<sub> 0259;;;;N;;;;; +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;;;;; +20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;; +20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;; +20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;; +20B5;CEDI 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;;;;; +20EB;COMBINING LONG DOUBLE SOLIDUS 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;;;;; +213B;FACSIMILE SIGN;So;0;ON;<compat> 0046 0041 0058;;;;N;;;;; +213C;DOUBLE-STRUCK SMALL PI;Ll;0;L;<font> 03C0;;;;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;;;;; +214C;PER SIGN;So;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;ES;;;;;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;;;;; +23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;; +23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;; +23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;; +23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;; +23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;; +23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;; +23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;; +23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;; +23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;; +23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;; +23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;; +23DA;EARTH GROUND;So;0;ON;;;;;N;;;;; +23DB;FUSE;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;ON;<circle> 0031;;1;1;N;;;;; +2461;CIRCLED DIGIT TWO;No;0;ON;<circle> 0032;;2;2;N;;;;; +2462;CIRCLED DIGIT THREE;No;0;ON;<circle> 0033;;3;3;N;;;;; +2463;CIRCLED DIGIT FOUR;No;0;ON;<circle> 0034;;4;4;N;;;;; +2464;CIRCLED DIGIT FIVE;No;0;ON;<circle> 0035;;5;5;N;;;;; +2465;CIRCLED DIGIT SIX;No;0;ON;<circle> 0036;;6;6;N;;;;; +2466;CIRCLED DIGIT SEVEN;No;0;ON;<circle> 0037;;7;7;N;;;;; +2467;CIRCLED DIGIT EIGHT;No;0;ON;<circle> 0038;;8;8;N;;;;; +2468;CIRCLED DIGIT NINE;No;0;ON;<circle> 0039;;9;9;N;;;;; +2469;CIRCLED NUMBER TEN;No;0;ON;<circle> 0031 0030;;;10;N;;;;; +246A;CIRCLED NUMBER ELEVEN;No;0;ON;<circle> 0031 0031;;;11;N;;;;; +246B;CIRCLED NUMBER TWELVE;No;0;ON;<circle> 0031 0032;;;12;N;;;;; +246C;CIRCLED NUMBER THIRTEEN;No;0;ON;<circle> 0031 0033;;;13;N;;;;; +246D;CIRCLED NUMBER FOURTEEN;No;0;ON;<circle> 0031 0034;;;14;N;;;;; +246E;CIRCLED NUMBER FIFTEEN;No;0;ON;<circle> 0031 0035;;;15;N;;;;; +246F;CIRCLED NUMBER SIXTEEN;No;0;ON;<circle> 0031 0036;;;16;N;;;;; +2470;CIRCLED NUMBER SEVENTEEN;No;0;ON;<circle> 0031 0037;;;17;N;;;;; +2471;CIRCLED NUMBER EIGHTEEN;No;0;ON;<circle> 0031 0038;;;18;N;;;;; +2472;CIRCLED NUMBER NINETEEN;No;0;ON;<circle> 0031 0039;;;19;N;;;;; +2473;CIRCLED NUMBER TWENTY;No;0;ON;<circle> 0032 0030;;;20;N;;;;; +2474;PARENTHESIZED DIGIT ONE;No;0;ON;<compat> 0028 0031 0029;;1;1;N;;;;; +2475;PARENTHESIZED DIGIT TWO;No;0;ON;<compat> 0028 0032 0029;;2;2;N;;;;; +2476;PARENTHESIZED DIGIT THREE;No;0;ON;<compat> 0028 0033 0029;;3;3;N;;;;; +2477;PARENTHESIZED DIGIT FOUR;No;0;ON;<compat> 0028 0034 0029;;4;4;N;;;;; +2478;PARENTHESIZED DIGIT FIVE;No;0;ON;<compat> 0028 0035 0029;;5;5;N;;;;; +2479;PARENTHESIZED DIGIT SIX;No;0;ON;<compat> 0028 0036 0029;;6;6;N;;;;; +247A;PARENTHESIZED DIGIT SEVEN;No;0;ON;<compat> 0028 0037 0029;;7;7;N;;;;; +247B;PARENTHESIZED DIGIT EIGHT;No;0;ON;<compat> 0028 0038 0029;;8;8;N;;;;; +247C;PARENTHESIZED DIGIT NINE;No;0;ON;<compat> 0028 0039 0029;;9;9;N;;;;; +247D;PARENTHESIZED NUMBER TEN;No;0;ON;<compat> 0028 0031 0030 0029;;;10;N;;;;; +247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON;<compat> 0028 0031 0031 0029;;;11;N;;;;; +247F;PARENTHESIZED NUMBER TWELVE;No;0;ON;<compat> 0028 0031 0032 0029;;;12;N;;;;; +2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON;<compat> 0028 0031 0033 0029;;;13;N;;;;; +2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON;<compat> 0028 0031 0034 0029;;;14;N;;;;; +2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON;<compat> 0028 0031 0035 0029;;;15;N;;;;; +2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON;<compat> 0028 0031 0036 0029;;;16;N;;;;; +2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON;<compat> 0028 0031 0037 0029;;;17;N;;;;; +2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON;<compat> 0028 0031 0038 0029;;;18;N;;;;; +2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON;<compat> 0028 0031 0039 0029;;;19;N;;;;; +2487;PARENTHESIZED NUMBER TWENTY;No;0;ON;<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;ON;<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;;;;; +24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;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;;;;; +2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;; +2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;; +2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; +2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +2618;SHAMROCK;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;;;;; +267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;; +267F;WHEELCHAIR 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;;;;; +268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;; +268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;; +268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;; +268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;; +268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;; +268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;; +2690;WHITE FLAG;So;0;ON;;;;;N;;;;; +2691;BLACK FLAG;So;0;ON;;;;;N;;;;; +2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;; +2693;ANCHOR;So;0;ON;;;;;N;;;;; +2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;; +2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;; +2696;SCALES;So;0;ON;;;;;N;;;;; +2697;ALEMBIC;So;0;ON;;;;;N;;;;; +2698;FLOWER;So;0;ON;;;;;N;;;;; +2699;GEAR;So;0;ON;;;;;N;;;;; +269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;; +269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;; +269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;; +26A0;WARNING SIGN;So;0;ON;;;;;N;;;;; +26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;; +26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;; +26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;; +26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;; +26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;; +26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;; +26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;; +26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;; +26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;; +26B0;COFFIN;So;0;ON;;;;;N;;;;; +26B1;FUNERAL URN;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;;;; +27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;; +27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;; +27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;; +27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;; +27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;; +27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;; +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;L;;;;;N;;;;; +2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;; +2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;; +2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;; +2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;; +2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;; +2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;; +2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;; +2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;; +2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;; +280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;; +280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;; +280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;; +280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;; +280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;; +280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;; +2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;; +2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;; +2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;; +2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;; +2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;; +2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;; +2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;; +2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;; +2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;; +2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;; +281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;; +281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;; +281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;; +281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;; +281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;; +281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;; +2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;; +2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;; +2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;; +2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;; +2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;; +2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;; +2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;; +2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;; +2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;; +2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;; +282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;; +282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;; +282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;; +282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;; +282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;; +282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;; +2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;; +2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;; +2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;; +2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;; +2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;; +2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;; +2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;; +2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;; +2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;; +2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;; +283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;; +283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;; +283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;; +283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;; +283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;; +283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;; +2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;; +2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;; +2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;; +2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;; +2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;; +2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;; +2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;; +2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;; +2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;; +2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;; +284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;; +284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;; +284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;; +284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;; +284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;; +284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;; +2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;; +2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;; +2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;; +2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;; +2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;; +2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;; +2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;; +2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;; +2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;; +2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;; +285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;; +285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;; +285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;; +285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;; +285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;; +285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;; +2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;; +2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;; +2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;; +2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;; +2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;; +2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;; +2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;; +2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;; +2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;; +2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;; +286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;; +286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;; +286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;; +286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;; +286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;; +286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;; +2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;; +2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;; +2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;; +2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;; +2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;; +2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;; +2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;; +2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;; +2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;; +2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;; +287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;; +287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;; +287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;; +287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;; +287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;; +287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;; +2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;; +2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;; +2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;; +2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;; +2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;; +2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;; +2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;; +2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;; +2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;; +2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;; +288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;; +288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;; +288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;; +288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;; +288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;; +288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;; +2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;; +2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;; +2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;; +2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;; +2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;; +2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;; +2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;; +2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;; +2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;; +2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;; +289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;; +289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;; +289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;; +289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;; +289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;; +289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;; +28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;; +28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;; +28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;; +28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;; +28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;; +28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;; +28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;; +28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;; +28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;; +28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;; +28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;; +28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;; +28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;; +28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;; +28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;; +28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;; +28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;; +28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;; +28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;; +28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;; +28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;; +28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;; +28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;; +28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;; +28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;; +28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;; +28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;; +28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;; +28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;; +28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;; +28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;; +28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;; +28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;; +28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;; +28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;; +28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;; +28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;; +28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;; +28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;; +28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;; +28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;; +28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;; +28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;; +28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;; +28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;; +28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;; +28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;; +28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;; +28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;; +28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;; +28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;; +28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;; +28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;; +28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;; +28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;; +28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;; +28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;; +28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;; +28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;; +28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;; +28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;; +28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;; +28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;; +28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;; +28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;; +28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;; +28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;; +28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;; +28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;; +28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;; +28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;; +28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;; +28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;; +28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;; +28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;; +28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;; +28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;; +28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;; +28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;; +28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;; +28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;; +28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;; +28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;; +28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;; +28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;; +28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;; +28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;; +28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;; +28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;; +28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;; +28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;; +28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;; +28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;; +28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;; +28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;; +28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;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;;;;; +2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;; +2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30; +2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31; +2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32; +2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33; +2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34; +2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35; +2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36; +2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37; +2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38; +2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39; +2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A; +2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B; +2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C; +2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D; +2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E; +2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F; +2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40; +2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41; +2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42; +2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43; +2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44; +2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45; +2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46; +2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47; +2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48; +2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49; +2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A; +2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B; +2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C; +2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D; +2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E; +2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F; +2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50; +2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51; +2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52; +2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53; +2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54; +2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55; +2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56; +2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57; +2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58; +2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59; +2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A; +2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B; +2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C; +2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D; +2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E; +2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00 +2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01 +2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02 +2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03 +2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04 +2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05 +2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06 +2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07 +2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08 +2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09 +2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A +2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B +2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C +2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D +2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E +2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F +2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10 +2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11 +2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12 +2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13 +2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14 +2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15 +2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16 +2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17 +2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18 +2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19 +2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A +2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B +2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C +2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D +2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E +2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F +2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20 +2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21 +2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22 +2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23 +2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24 +2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25 +2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26 +2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27 +2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28 +2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29 +2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A +2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B +2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C +2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D +2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E +2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81; +2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80 +2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83; +2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82 +2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85; +2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84 +2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87; +2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86 +2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89; +2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88 +2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B; +2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A +2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D; +2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C +2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F; +2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E +2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91; +2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90 +2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93; +2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92 +2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95; +2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94 +2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97; +2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96 +2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99; +2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98 +2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B; +2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A +2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D; +2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C +2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F; +2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E +2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1; +2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0 +2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3; +2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2 +2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5; +2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4 +2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7; +2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6 +2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9; +2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8 +2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB; +2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA +2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD; +2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC +2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF; +2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE +2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1; +2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0 +2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3; +2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2 +2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5; +2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4 +2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7; +2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6 +2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9; +2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8 +2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB; +2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA +2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD; +2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC +2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF; +2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE +2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1; +2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0 +2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3; +2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2 +2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5; +2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4 +2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7; +2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6 +2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9; +2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8 +2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB; +2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA +2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD; +2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC +2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF; +2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE +2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1; +2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0 +2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3; +2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2 +2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5; +2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4 +2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7; +2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6 +2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9; +2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8 +2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB; +2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA +2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD; +2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC +2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF; +2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE +2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1; +2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0 +2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3; +2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2 +2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;; +2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;; +2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;; +2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;; +2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;; +2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;; +2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;; +2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;; +2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;; +2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;; +2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;; +2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;; +2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;Khutsuri;10A0;;10A0 +2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;Khutsuri;10A1;;10A1 +2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;Khutsuri;10A2;;10A2 +2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;Khutsuri;10A3;;10A3 +2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;Khutsuri;10A4;;10A4 +2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;Khutsuri;10A5;;10A5 +2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;Khutsuri;10A6;;10A6 +2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;Khutsuri;10A7;;10A7 +2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;Khutsuri;10A8;;10A8 +2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;Khutsuri;10A9;;10A9 +2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;Khutsuri;10AA;;10AA +2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;Khutsuri;10AB;;10AB +2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;Khutsuri;10AC;;10AC +2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;Khutsuri;10AD;;10AD +2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;Khutsuri;10AE;;10AE +2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;Khutsuri;10AF;;10AF +2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;Khutsuri;10B0;;10B0 +2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;Khutsuri;10B1;;10B1 +2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;Khutsuri;10B2;;10B2 +2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;Khutsuri;10B3;;10B3 +2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;Khutsuri;10B4;;10B4 +2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;Khutsuri;10B5;;10B5 +2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;Khutsuri;10B6;;10B6 +2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;Khutsuri;10B7;;10B7 +2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;Khutsuri;10B8;;10B8 +2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;Khutsuri;10B9;;10B9 +2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;Khutsuri;10BA;;10BA +2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;Khutsuri;10BB;;10BB +2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;Khutsuri;10BC;;10BC +2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;Khutsuri;10BD;;10BD +2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;Khutsuri;10BE;;10BE +2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;Khutsuri;10BF;;10BF +2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;Khutsuri;10C0;;10C0 +2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;Khutsuri;10C1;;10C1 +2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;Khutsuri;10C2;;10C2 +2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;Khutsuri;10C3;;10C3 +2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;Khutsuri;10C4;;10C4 +2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;Khutsuri;10C5;;10C5 +2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;; +2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;; +2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;; +2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;; +2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;; +2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;; +2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;; +2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;; +2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;; +2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;; +2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;; +2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;; +2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;; +2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;; +2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;; +2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;; +2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;Tuareg yab;;; +2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;; +2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;; +2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;; +2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;; +2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;; +2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;; +2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;; +2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;; +2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;; +2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;; +2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;; +2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;; +2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;; +2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;; +2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;; +2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;; +2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;; +2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;; +2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;Tuareg yaw;;; +2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;; +2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;; +2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;; +2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;; +2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;Adrar yaj;;; +2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;; +2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;; +2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;; +2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;; +2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;; +2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;; +2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;; +2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;; +2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;; +2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;; +2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;; +2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;harpoon yaz;;; +2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;; +2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L;<super> 2D61;;;;N;;tamatart;;; +2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;; +2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;; +2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;; +2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;; +2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;; +2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;; +2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;; +2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;; +2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;; +2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;; +2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;; +2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;; +2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;; +2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;; +2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;; +2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;; +2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;; +2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;; +2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;; +2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;; +2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;; +2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;; +2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;; +2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;; +2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;; +2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;; +2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;; +2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;; +2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;; +2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;; +2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;; +2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;; +2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;; +2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;; +2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;; +2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;; +2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;; +2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;; +2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;; +2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;; +2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;; +2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;; +2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;; +2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;; +2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;; +2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;; +2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;; +2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;; +2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;; +2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;; +2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;; +2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;; +2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;; +2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;; +2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;; +2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;; +2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;; +2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;; +2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;; +2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;; +2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;; +2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;; +2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;; +2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;; +2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;; +2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;; +2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;; +2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;; +2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;; +2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;; +2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;; +2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;; +2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;; +2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;; +2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;; +2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;; +2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;; +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;Po;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;;;;; +31C0;CJK STROKE T;So;0;ON;;;;;N;;;;; +31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;; +31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;; +31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;; +31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;; +31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;; +31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;; +31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;; +31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;; +31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;; +31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;; +31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;; +31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;; +31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;; +31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;; +31CF;CJK STROKE N;So;0;ON;;;;;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;;;; +321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON;<compat> 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;; +321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON;<compat> 0028 110B 1169 1112 116E 0029;;;;N;;;;; +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;;;;; +3250;PARTNERSHIP SIGN;So;0;ON;<square> 0050 0054 0045;;;;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;;;; +327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON;<circle> 110E 1161 11B7 1100 1169;;;;N;;;;; +327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON;<circle> 110C 116E 110B 1174;;;;N;;;;; +327E;CIRCLED HANGUL IEUNG U;So;0;ON;<circle> 110B 116E;;;;N;;;;; +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;;;;; +32CC;SQUARE HG;So;0;ON;<square> 0048 0067;;;;N;;;;; +32CD;SQUARE ERG;So;0;ON;<square> 0065 0072 0067;;;;N;;;;; +32CE;SQUARE EV;So;0;ON;<square> 0065 0056;;;;N;;;;; +32CF;LIMITED LIABILITY SIGN;So;0;ON;<square> 004C 0054 0044;;;;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;;;;; +3377;SQUARE DM;So;0;ON;<square> 0064 006D;;;;N;;;;; +3378;SQUARE DM SQUARED;So;0;ON;<square> 0064 006D 00B2;;;;N;;;;; +3379;SQUARE DM CUBED;So;0;ON;<square> 0064 006D 00B3;;;;N;;;;; +337A;SQUARE IU;So;0;ON;<square> 0049 0055;;;;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;;;; +33DE;SQUARE V OVER M;So;0;ON;<square> 0056 2215 006D;;;;N;;;;; +33DF;SQUARE A OVER M;So;0;ON;<square> 0041 2215 006D;;;;N;;;;; +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;;;;; +33FF;SQUARE GAL;So;0;ON;<square> 0067 0061 006C;;;;N;;;;; +3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;; +4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;; +4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;; +4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;; +4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;; +4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;; +4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; +4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;; +4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;; +4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;; +4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;; +4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;; +4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;; +4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;; +4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;; +4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;; +4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;; +4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;; +4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; +4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;; +4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;; +4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;; +4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;; +4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;; +4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;; +4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;; +4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;; +4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;; +4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;; +4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;; +4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;; +4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;; +4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;; +4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;; +4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;; +4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;; +4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;; +4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;; +4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;; +4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; +4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;; +4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;; +4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;; +4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; +4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;; +4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;; +4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;; +4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;; +4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;; +4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;; +4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;; +4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;; +4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;; +4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;; +4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;; +4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;; +4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;; +4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;; +4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;; +4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;; +4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;; +4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;; +4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;; +4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;; +4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;; +4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;; +4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;; +9FBB;<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;Lm;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;;;;; +A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;; +A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;; +A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;; +A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;; +A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;; +A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;; +A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;; +A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;; +A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;; +A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;; +A802;SYLOTI NAGRI SIGN DVISVARA;Mc;0;NSM;;;;;N;;;;; +A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;; +A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;; +A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;; +A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;; +A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;; +A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;; +A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;; +A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;; +A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;; +A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;; +A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;; +A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;; +A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;; +A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;; +A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;; +A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;; +A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;; +A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;; +A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;; +A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;; +A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;; +A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;; +A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;; +A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;; +A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;; +A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;; +A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;; +A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;; +A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;; +A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;; +A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;; +A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;; +A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;; +A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;; +A82B;SYLOTI NAGRI POETRY MARK-4;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;;;;; +FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;; +FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;; +FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;; +FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;; +FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;; +FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;; +FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;; +FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;; +FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;; +FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;; +FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;; +FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;; +FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;; +FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;; +FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;; +FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;; +FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;; +FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;; +FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;; +FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;; +FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;; +FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;; +FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;; +FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;; +FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;; +FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;; +FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;; +FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;; +FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;; +FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;; +FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;; +FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;; +FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;; +FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;; +FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;; +FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;; +FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;; +FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;; +FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;; +FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;; +FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;; +FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;; +FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;; +FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;; +FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;; +FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;; +FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;; +FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;; +FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;; +FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;; +FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;; +FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;; +FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;; +FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;; +FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;; +FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;; +FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;; +FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;; +FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;; +FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;; +FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;; +FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;; +FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;; +FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;; +FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;; +FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;; +FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;; +FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;; +FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;; +FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;; +FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;; +FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;; +FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;; +FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;; +FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;; +FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;; +FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;; +FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;; +FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;; +FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;; +FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;; +FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;; +FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;; +FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;; +FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;; +FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;; +FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;; +FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;; +FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;; +FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;; +FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;; +FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;; +FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;; +FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;; +FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;; +FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;; +FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;; +FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;; +FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;; +FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;; +FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;; +FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;; +FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;; +FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;; +FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;; +FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;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;ES;<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;;;;; +FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;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;;;;; +FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON;<vertical> 002C;;;;N;;;;; +FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON;<vertical> 3001;;;;N;;;;; +FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON;<vertical> 3002;;;;N;;;;; +FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON;<vertical> 003A;;;;N;;;;; +FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON;<vertical> 003B;;;;N;;;;; +FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON;<vertical> 0021;;;;N;;;;; +FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON;<vertical> 003F;;;;N;;;;; +FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;<vertical> 3016;;;;N;;;;; +FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON;<vertical> 3017;;;;N;;;;; +FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON;<vertical> 2026;;;;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;;;;; +FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON;<vertical> 005B;;;;N;;;;; +FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON;<vertical> 005D;;;;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;ES;<small> 002B;;;;N;;;;; +FE63;SMALL HYPHEN-MINUS;Pd;0;ES;<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;ES;<wide> 002B;;;;N;;;;; +FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;; +FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES;<wide> 002D;;;;N;;;;; +FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;; +FF0F;FULLWIDTH SOLIDUS;Po;0;CS;<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;Po;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;ON;;;;;N;;;;; +FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;; +FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;; +FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;; +10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;; +10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;; +10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;; +10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;; +10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;; +10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;; +10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;; +10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;; +10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;; +1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;; +1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;; +1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;; +1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;; +1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;; +10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;; +10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;; +10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;; +10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;; +10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;; +10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;; +10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;; +10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;; +10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;; +10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;; +1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;; +1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;; +1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;; +1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;; +1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;; +1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;; +10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;; +10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;; +10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;; +10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;; +10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;; +10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;; +10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;; +10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;; +10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;; +1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;; +1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;; +1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;; +1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;; +1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;; +1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;; +10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;; +10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;; +10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;; +10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;; +10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;; +10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;; +10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;; +10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;; +10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;; +10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;; +1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;; +1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;; +1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;; +1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;; +10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;; +10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;; +10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;; +10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;; +10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;; +10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;; +10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;; +10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;; +10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;; +10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;; +1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;; +1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;; +1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;; +1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;; +10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;; +10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;; +10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;; +10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;; +10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;; +10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;; +10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;; +10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;; +10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;; +10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;; +1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;; +1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;; +1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;; +1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;; +10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;; +10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;; +10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;; +10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;; +10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;; +10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;; +10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;; +10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;; +10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;; +10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;; +1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;; +1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;; +1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;; +1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;; +1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;; +1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;; +10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;; +10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;; +10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;; +10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;; +10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;; +10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;; +10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;; +10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;; +10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;; +10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;; +1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;; +1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;; +1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;; +1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;; +1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;; +1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;; +100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;; +100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;; +100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;; +100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;; +100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;; +100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;; +100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;; +100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;; +100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;; +100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;; +100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;; +100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;; +100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;; +100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;; +100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;; +100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;; +100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;; +100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;; +100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;; +100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;; +100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;; +100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;; +100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;; +100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;; +100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;; +100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;; +100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;; +100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;; +100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;; +100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;; +100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;; +100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;; +100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;; +100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;; +100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;; +100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;; +100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;; +100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;; +100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;; +100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;; +100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;; +100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;pug;;; +100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;; +100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;gup;;; +100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;; +100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;; +100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;; +100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;; +100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;; +100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;; +100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;; +100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;; +100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;; +100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;; +100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;; +100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;; +100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;; +100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;; +100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;; +100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;; +100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;; +100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;; +100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;; +100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;; +100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;; +100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;; +100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;; +100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;; +100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;; +100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;; +100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;; +100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;; +100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;; +100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;; +100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;; +100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;; +100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;; +100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;; +100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;; +100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;; +100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;; +100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;; +100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;; +100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;; +100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;; +100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;; +100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;; +100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;; +100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;; +100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;; +100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;; +10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;; +10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;; +10102;AEGEAN CHECK MARK;So;0;L;;;;;N;;;;; +10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;; +10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;; +10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;; +1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;; +1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;; +1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;; +1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;; +1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;; +1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;; +10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;; +10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;; +10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;; +10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;; +10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;; +10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;; +10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;; +10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;; +1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;; +1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;; +1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;; +1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;; +1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;; +10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;; +10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;; +10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;; +10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;; +10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;; +10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;; +10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;; +10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;; +10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;; +1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;; +1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;; +1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;; +1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;; +1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;; +10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;; +10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;; +10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;; +10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;; +10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;; +10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;; +10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;; +1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;; +1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;; +1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; +1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; +1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;; +1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;; +10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;; +10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;; +10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;; +10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;; +10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;; +10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;; +10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;; +10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;; +1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;; +1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;; +1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;; +1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;; +1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;; +1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;; +10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;; +10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;; +10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;; +10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;; +10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;; +10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;; +10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;; +10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;; +10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;; +10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;; +1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;; +1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;; +10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;; +10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;; +10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;; +10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;; +10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;; +10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;; +1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;; +1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;; +10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;; +10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;; +10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;; +10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;; +10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;; +10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;; +10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;; +1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;; +1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;; +1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;; +1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;; +10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;; +10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;; +10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;; +10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;; +10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;; +10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;; +10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;; +10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;; +10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;; +10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;; +1018A;GREEK ZERO SIGN;No;0;ON;;;;0;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;;;;900;N;;;;; +10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;; +10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;; +10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;; +10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;; +10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;; +10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;; +10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;; +10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;; +10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;; +10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;; +1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;; +1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;; +1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;; +1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;; +1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;; +1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;; +10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;; +10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;; +10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;; +10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;; +10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;; +10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;; +10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;; +10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;; +10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;; +10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;; +1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;; +1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;; +1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;; +1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;; +1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;; +103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;; +103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;; +103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;; +103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;; +103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;; +103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;; +103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;; +103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;; +103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;; +103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;; +103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;; +103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;; +103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;; +103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;; +103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;; +103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;; +103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;; +103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;; +103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;; +103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;; +103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;; +103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;; +103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;; +103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;; +103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;; +103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;; +103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;; +103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;; +103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;; +103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;; +103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;; +103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;; +103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;; +103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;; +103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;; +103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;; +103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;; +103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;; +103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;; +103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;; +103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;; +103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;; +103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;; +103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;; +103D0;OLD PERSIAN WORD DIVIDER;So;0;L;;;;;N;;;;; +103D1;OLD PERSIAN NUMBER ONE;Nl;0;ON;;;;1;N;;;;; +103D2;OLD PERSIAN NUMBER TWO;Nl;0;ON;;;;2;N;;;;; +103D3;OLD PERSIAN NUMBER TEN;Nl;0;ON;;;;10;N;;;;; +103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;ON;;;;20;N;;;;; +103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;ON;;;;100;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; +10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E; +10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F; +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 +1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426 +1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427 +10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;; +10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;; +10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;; +10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;; +10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;; +10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;; +10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;; +10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;; +10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;; +10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;; +1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;; +1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;; +1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;; +1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;; +1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;; +1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;; +10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;; +10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;; +10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;; +10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;; +10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;; +10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;; +10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;; +10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;; +10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;; +10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;; +1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;; +1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;; +1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;; +1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;; +1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;; +1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;; +10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;; +10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;; +10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;; +10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;; +10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;; +10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;; +10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;; +10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;; +10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;; +10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;; +1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;; +1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;; +1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;; +1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;; +1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;; +1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;; +10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;; +10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;; +10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;; +10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;; +10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;; +10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;; +10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;; +10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;; +10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;; +10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;; +1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;; +1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;; +1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;; +1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;; +1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;; +1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;; +10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;; +10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;; +10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;; +10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;; +10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;; +10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;; +10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;; +10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;; +10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;; +10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;; +1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;; +1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;; +1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;; +1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;; +104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;; +10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;; +10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;; +10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;; +10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;; +10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;; +10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;; +1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;; +1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;; +1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;; +1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;; +1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;; +1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;; +10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;; +10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;; +10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;; +10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;; +10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;; +10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;; +10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;; +10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;; +10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;; +10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;; +1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;; +1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;; +1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;; +1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;; +1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;; +1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;; +10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;; +10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;; +10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;; +10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;; +10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;; +10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;; +10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;; +10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;; +10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;; +10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;; +1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;; +1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;; +1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;; +1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;; +1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;; +1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;; +10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;; +10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;; +10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;; +10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;; +10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;; +10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;; +10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;; +10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;; +1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;; +1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;; +10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;; +10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; +10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;; +10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;; +10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;; +10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;; +10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;; +10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;; +10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;; +10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;; +10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;; +10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;; +10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;; +10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;; +10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;; +10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;; +10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;; +10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;; +10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;; +10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;; +10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;; +10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;; +10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;; +10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;; +10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;; +10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;; +10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;; +10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;; +10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;; +10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;; +10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;; +10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;; +10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;; +10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;; +10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;; +10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;; +10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;; +10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;; +10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;; +10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;; +10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;; +10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;; +10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;; +10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;; +10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;; +10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;; +10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;; +10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;; +10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;; +10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;; +10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;; +10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;; +10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;; +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;;;;; +1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;; +1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;; +1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;; +1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;; +1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;; +1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;; +1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;; +1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;; +1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;; +1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;; +1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;; +1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;; +1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;; +1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;; +1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;; +1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;; +1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;; +1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;; +1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;; +1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;; +1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;; +1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;; +1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;; +1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;; +1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;; +1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;; +1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;; +1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;; +1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;; +1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;; +1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;; +1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;; +1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;; +1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;; +1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;; +1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;; +1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;; +1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;; +1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;; +1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;; +1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;; +1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; +1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;; +1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;; +1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;; +1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;; +1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; +1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;; +1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;; +1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;; +1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;; +1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; +1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; +1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;; +1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;; +1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;; +1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;; +1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;; +1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;; +1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;; +1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;; +1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;; +1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;; +1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;; +1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;; +1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;; +1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;; +1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;; +1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;; +1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;; +1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;; +1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;; +1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;; +1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;; +1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;; +1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;; +1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;; +1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;; +1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;; +1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;; +1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;; +1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;; +1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;; +1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;; +1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;; +1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;; +1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;; +1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;; +1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;; +1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;; +1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;; +1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;; +1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;; +1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;; +1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;; +1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;; +1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;; +1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;; +1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;; +1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;; +1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;; +1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;; +1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;; +1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;; +1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;; +1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;; +1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;; +1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;; +1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;; +1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;; +1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;; +1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;; +1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;; +1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;; +1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;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;;;;; +1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;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;;;;; +1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L;<font> 0131;;;;N;;;;; +1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L;<font> 0237;;;;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;36FC;;;;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;5F53;;;;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;243AB;;;;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;7AEE;;;;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;45D7;;;;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;;;;; +E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;; +E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;; +E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;; +E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;; +E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;; +E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;; +E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;; +E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;; +E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;; +E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;; +E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;; +E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;; +E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;; +E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;; +E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;; +E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;; +E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;; +E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;; +E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;; +E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;; +E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;; +E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;; +E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;; +E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;; +E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;; +E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;; +E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;; +E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;; +E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;; +E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;; +E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;; +E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;; +E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;; +E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;; +E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;; +E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;; +E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;; +E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;; +E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;; +E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;; +E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;; +E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;; +E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;; +E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;; +E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;; +E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;; +E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;; +E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;; +E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;; +E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;; +E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;; +E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;; +E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;; +E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;; +E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;; +E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;; +E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;; +E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;; +E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;; +E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;; +E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;; +E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;; +E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;; +E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;; +E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;; +E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;; +E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;; +E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;; +E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;; +E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;; +E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;; +E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;; +E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;; +E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;; +E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;; +E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;; +E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;; +E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;; +E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;; +E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;; +E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;; +E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;; +E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;; +E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;; +E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;; +E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;; +E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;; +E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;; +E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;; +E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;; +E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;; +E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;; +E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;; +E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;; +E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;; +E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;; +E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;; +E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;; +E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;; +E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;; +E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;; +E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;; +E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;; +E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;; +E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;; +E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;; +E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;; +E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;; +E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;; +E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;; +E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;; +E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;; +E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;; +E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;; +E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;; +E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;; +E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;; +E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;; +E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;; +E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;; +E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;; +E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;; +E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;; +E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;; +E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;; +E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;; +E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;; +E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;; +E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;; +E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;; +E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;; +E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;; +E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;; +E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;; +E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;; +E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;; +E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;; +E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;; +E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;; +E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;; +E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;; +E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;; +E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;; +E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;; +E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;; +E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;; +E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;; +E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;; +E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;; +E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;; +E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;; +E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;; +E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;; +E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;; +E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;; +E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;; +E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;; +E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;; +E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;; +E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;; +E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;; +E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;; +E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;; +E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;; +E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;; +E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;; +E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;; +E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;; +E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;; +E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;; +E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;; +E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;; +E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;; +E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;; +E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;; +E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;; +E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;; +E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;; +E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;; +E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;; +E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;; +E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;; +E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;; +E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;; +E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;; +E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;; +E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;; +E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;; +E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;; +E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;; +E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;; +E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;; +E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;; +E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;; +E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;; +E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;; +E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;; +E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;; +E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;; +E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;; +E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;; +E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;; +E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;; +E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;; +E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;; +E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;; +E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;; +E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;; +E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;; +E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;; +E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;; +E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;; +E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;; +E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;; +E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;; +E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;; +E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;; +E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;; +E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;; +E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;; +E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;; +E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;; +E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;; +E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;; +E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;; +E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;; +E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;; +E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;; +E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;; +E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;; +E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;; +E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;; +E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;; +E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;; +E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;; +E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;; +E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;; +E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;; +E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;; +E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;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/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/AL.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/AL.pl new file mode 100644 index 00000000000..f8fa70d730f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/AL.pl @@ -0,0 +1,34 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'Arabic_Letter' +# +return <<'END'; +0600 0603 +060B +060D +061B +061E 061F +0621 063A +0640 064A +066D 066F +0671 06D5 +06DD +06E5 06E6 +06EE 06EF +06FA 070D +0710 +0712 072F +074D 076D +0780 07A5 +07B1 +FB50 FBB1 +FBD3 FD3D +FD50 FD8F +FD92 FDC7 +FDF0 FDFC +FE70 FE74 +FE76 FEFC +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/AN.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/AN.pl new file mode 100644 index 00000000000..018e6977a86 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/AN.pl @@ -0,0 +1,11 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'Arabic_Number' +# +return <<'END'; +0660 0669 +066B 066C +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/B.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/B.pl new file mode 100644 index 00000000000..d6402e620cc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/B.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'Paragraph_Separator' +# +return <<'END'; +000A +000D +001C 001E +0085 +2029 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/BN.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/BN.pl new file mode 100644 index 00000000000..3e87d4e6ddd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/BN.pl @@ -0,0 +1,22 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'Boundary_Neutral' +# +return <<'END'; +0000 0008 +000E 001B +007F 0084 +0086 009F +00AD +070F +200B 200D +2060 2063 +206A 206F +FEFF +1D173 1D17A +E0001 +E0020 E007F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/CS.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/CS.pl new file mode 100644 index 00000000000..b1470ad0bb9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/CS.pl @@ -0,0 +1,22 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'Common_Separator' +# +return <<'END'; +002C +002E 002F +003A +00A0 +060C +202F +2044 +FE50 +FE52 +FE55 +FF0C +FF0E FF0F +FF1A +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/EN.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/EN.pl new file mode 100644 index 00000000000..a0186d50cd3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/EN.pl @@ -0,0 +1,19 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'European_Number' +# +return <<'END'; +0030 0039 +00B2 00B3 +00B9 +06F0 06F9 +2070 +2074 2079 +2080 2089 +2488 249B +FF10 FF19 +1D7CE 1D7FF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/ES.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/ES.pl new file mode 100644 index 00000000000..c33abdfb3a6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/ES.pl @@ -0,0 +1,18 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'European_Separator' +# +return <<'END'; +002B +002D +207A 207B +208A 208B +2212 +FB29 +FE62 FE63 +FF0B +FF0D +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/ET.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/ET.pl new file mode 100644 index 00000000000..f27a05ca3db --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/ET.pl @@ -0,0 +1,27 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'European_Terminator' +# +return <<'END'; +0023 0025 +00A2 00A5 +00B0 00B1 +066A +09F2 09F3 +0AF1 +0BF9 +0E3F +17DB +2030 2034 +20A0 20B5 +212E +2213 +FE5F +FE69 FE6A +FF03 FF05 +FFE0 FFE1 +FFE5 FFE6 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/L.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/L.pl new file mode 100644 index 00000000000..020f5b36396 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/L.pl @@ -0,0 +1,400 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'Left_To_Right' +# +return <<'END'; +0041 005A +0061 007A +00AA +00B5 +00BA +00C0 00D6 +00D8 00F6 +00F8 0241 +0250 02B8 +02BB 02C1 +02D0 02D1 +02E0 02E4 +02EE +037A +0386 +0388 038A +038C +038E 03A1 +03A3 03CE +03D0 03F5 +03F7 0482 +048A 04CE +04D0 04F9 +0500 050F +0531 0556 +0559 055F +0561 0587 +0589 +0903 0939 +093D 0940 +0949 094C +0950 +0958 0961 +0964 0970 +097D +0982 0983 +0985 098C +098F 0990 +0993 09A8 +09AA 09B0 +09B2 +09B6 09B9 +09BD 09C0 +09C7 09C8 +09CB 09CC +09CE +09D7 +09DC 09DD +09DF 09E1 +09E6 09F1 +09F4 09FA +0A03 +0A05 0A0A +0A0F 0A10 +0A13 0A28 +0A2A 0A30 +0A32 0A33 +0A35 0A36 +0A38 0A39 +0A3E 0A40 +0A59 0A5C +0A5E +0A66 0A6F +0A72 0A74 +0A83 +0A85 0A8D +0A8F 0A91 +0A93 0AA8 +0AAA 0AB0 +0AB2 0AB3 +0AB5 0AB9 +0ABD 0AC0 +0AC9 +0ACB 0ACC +0AD0 +0AE0 0AE1 +0AE6 0AEF +0B02 0B03 +0B05 0B0C +0B0F 0B10 +0B13 0B28 +0B2A 0B30 +0B32 0B33 +0B35 0B39 +0B3D 0B3E +0B40 +0B47 0B48 +0B4B 0B4C +0B57 +0B5C 0B5D +0B5F 0B61 +0B66 0B71 +0B83 +0B85 0B8A +0B8E 0B90 +0B92 0B95 +0B99 0B9A +0B9C +0B9E 0B9F +0BA3 0BA4 +0BA8 0BAA +0BAE 0BB9 +0BBE 0BBF +0BC1 0BC2 +0BC6 0BC8 +0BCA 0BCC +0BD7 +0BE6 0BF2 +0C01 0C03 +0C05 0C0C +0C0E 0C10 +0C12 0C28 +0C2A 0C33 +0C35 0C39 +0C41 0C44 +0C60 0C61 +0C66 0C6F +0C82 0C83 +0C85 0C8C +0C8E 0C90 +0C92 0CA8 +0CAA 0CB3 +0CB5 0CB9 +0CBD 0CC4 +0CC6 0CC8 +0CCA 0CCB +0CD5 0CD6 +0CDE +0CE0 0CE1 +0CE6 0CEF +0D02 0D03 +0D05 0D0C +0D0E 0D10 +0D12 0D28 +0D2A 0D39 +0D3E 0D40 +0D46 0D48 +0D4A 0D4C +0D57 +0D60 0D61 +0D66 0D6F +0D82 0D83 +0D85 0D96 +0D9A 0DB1 +0DB3 0DBB +0DBD +0DC0 0DC6 +0DCF 0DD1 +0DD8 0DDF +0DF2 0DF4 +0E01 0E30 +0E32 0E33 +0E40 0E46 +0E4F 0E5B +0E81 0E82 +0E84 +0E87 0E88 +0E8A +0E8D +0E94 0E97 +0E99 0E9F +0EA1 0EA3 +0EA5 +0EA7 +0EAA 0EAB +0EAD 0EB0 +0EB2 0EB3 +0EBD +0EC0 0EC4 +0EC6 +0ED0 0ED9 +0EDC 0EDD +0F00 0F17 +0F1A 0F34 +0F36 +0F38 +0F3E 0F47 +0F49 0F6A +0F7F +0F85 +0F88 0F8B +0FBE 0FC5 +0FC7 0FCC +0FCF 0FD1 +1000 1021 +1023 1027 +1029 102A +102C +1031 +1038 +1040 1057 +10A0 10C5 +10D0 10FC +1100 1159 +115F 11A2 +11A8 11F9 +1200 1248 +124A 124D +1250 1256 +1258 +125A 125D +1260 1288 +128A 128D +1290 12B0 +12B2 12B5 +12B8 12BE +12C0 +12C2 12C5 +12C8 12D6 +12D8 1310 +1312 1315 +1318 135A +1360 137C +1380 138F +13A0 13F4 +1401 1676 +1681 169A +16A0 16F0 +1700 170C +170E 1711 +1720 1731 +1735 1736 +1740 1751 +1760 176C +176E 1770 +1780 17B6 +17BE 17C5 +17C7 17C8 +17D4 17DA +17DC +17E0 17E9 +1810 1819 +1820 1877 +1880 18A8 +1900 191C +1923 1926 +1930 1931 +1933 1938 +1946 196D +1970 1974 +1980 19A9 +19B0 19C9 +19D0 19D9 +1A00 1A16 +1A19 1A1B +1A1E 1A1F +1D00 1DBF +1E00 1E9B +1EA0 1EF9 +1F00 1F15 +1F18 1F1D +1F20 1F45 +1F48 1F4D +1F50 1F57 +1F59 +1F5B +1F5D +1F5F 1F7D +1F80 1FB4 +1FB6 1FBC +1FBE +1FC2 1FC4 +1FC6 1FCC +1FD0 1FD3 +1FD6 1FDB +1FE0 1FEC +1FF2 1FF4 +1FF6 1FFC +200E +2071 +207F +2090 2094 +2102 +2107 +210A 2113 +2115 +2119 211D +2124 +2126 +2128 +212A 212D +212F 2131 +2133 2139 +213C 213F +2145 2149 +2160 2183 +2336 237A +2395 +249C 24E9 +26AC +2800 28FF +2C00 2C2E +2C30 2C5E +2C80 2CE4 +2D00 2D25 +2D30 2D65 +2D6F +2D80 2D96 +2DA0 2DA6 +2DA8 2DAE +2DB0 2DB6 +2DB8 2DBE +2DC0 2DC6 +2DC8 2DCE +2DD0 2DD6 +2DD8 2DDE +3005 3007 +3021 3029 +3031 3035 +3038 303C +3041 3096 +309D 309F +30A1 30FA +30FC 30FF +3105 312C +3131 318E +3190 31B7 +31F0 321C +3220 3243 +3260 327B +327F 32B0 +32C0 32CB +32D0 32FE +3300 3376 +337B 33DD +33E0 33FE +A000 A48C +A800 A801 +A803 A805 +A807 A80A +A80C A824 +A827 +F900 FA2D +FA30 FA6A +FA70 FAD9 +FB00 FB06 +FB13 FB17 +FF21 FF3A +FF41 FF5A +FF66 FFBE +FFC2 FFC7 +FFCA FFCF +FFD2 FFD7 +FFDA FFDC +10000 1000B +1000D 10026 +10028 1003A +1003C 1003D +1003F 1004D +10050 1005D +10080 100FA +10100 +10102 +10107 10133 +10137 1013F +10300 1031E +10320 10323 +10330 1034A +10380 1039D +1039F 103C3 +103C8 103D0 +10400 1049D +104A0 104A9 +1D000 1D0F5 +1D100 1D126 +1D12A 1D166 +1D16A 1D172 +1D183 1D184 +1D18C 1D1A9 +1D1AE 1D1DD +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A5 +1D6A8 1D7C9 +2F800 2FA1D +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/LRE.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/LRE.pl new file mode 100644 index 00000000000..22129c44f2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/LRE.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'Left_To_Right_Embedding' +# +return <<'END'; +202A +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/LRO.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/LRO.pl new file mode 100644 index 00000000000..10790d181d8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/LRO.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'Left_To_Right_Override' +# +return <<'END'; +202D +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/NSM.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/NSM.pl new file mode 100644 index 00000000000..75a8e8adc67 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/NSM.pl @@ -0,0 +1,131 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'Nonspacing_Mark' +# +return <<'END'; +0300 036F +0483 0486 +0488 0489 +0591 05B9 +05BB 05BD +05BF +05C1 05C2 +05C4 05C5 +05C7 +0610 0615 +064B 065E +0670 +06D6 06DC +06DE 06E4 +06E7 06E8 +06EA 06ED +0711 +0730 074A +07A6 07B0 +0901 0902 +093C +0941 0948 +094D +0951 0954 +0962 0963 +0981 +09BC +09C1 09C4 +09CD +09E2 09E3 +0A01 0A02 +0A3C +0A41 0A42 +0A47 0A48 +0A4B 0A4D +0A70 0A71 +0A81 0A82 +0ABC +0AC1 0AC5 +0AC7 0AC8 +0ACD +0AE2 0AE3 +0B01 +0B3C +0B3F +0B41 0B43 +0B4D +0B56 +0B82 +0BC0 +0BCD +0C3E 0C40 +0C46 0C48 +0C4A 0C4D +0C55 0C56 +0CBC +0CCC 0CCD +0D41 0D43 +0D4D +0DCA +0DD2 0DD4 +0DD6 +0E31 +0E34 0E3A +0E47 0E4E +0EB1 +0EB4 0EB9 +0EBB 0EBC +0EC8 0ECD +0F18 0F19 +0F35 +0F37 +0F39 +0F71 0F7E +0F80 0F84 +0F86 0F87 +0F90 0F97 +0F99 0FBC +0FC6 +102D 1030 +1032 +1036 1037 +1039 +1058 1059 +135F +1712 1714 +1732 1734 +1752 1753 +1772 1773 +17B7 17BD +17C6 +17C9 17D3 +17DD +180B 180D +18A9 +1920 1922 +1927 192B +1932 +1939 193B +1A17 1A18 +1DC0 1DC3 +20D0 20EB +302A 302F +3099 309A +A802 +A806 +A80B +A825 A826 +FB1E +FE00 FE0F +FE20 FE23 +10A01 10A03 +10A05 10A06 +10A0C 10A0F +10A38 10A3A +10A3F +1D167 1D169 +1D17B 1D182 +1D185 1D18B +1D1AA 1D1AD +1D242 1D244 +E0100 E01EF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/ON.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/ON.pl new file mode 100644 index 00000000000..7d51dcbdd50 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/ON.pl @@ -0,0 +1,150 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'Other_Neutral' +# +return <<'END'; +0021 0022 +0026 002A +003B 0040 +005B 0060 +007B 007E +00A1 +00A6 00A9 +00AB 00AC +00AE 00AF +00B4 +00B6 00B8 +00BB 00BF +00D7 +00F7 +02B9 02BA +02C2 02CF +02D2 02DF +02E5 02ED +02EF 02FF +0374 0375 +037E +0384 0385 +0387 +03F6 +058A +060E 060F +06E9 +0BF3 0BF8 +0BFA +0F3A 0F3D +1390 1399 +169B 169C +17F0 17F9 +1800 180A +1940 +1944 1945 +19DE 19FF +1FBD +1FBF 1FC1 +1FCD 1FCF +1FDD 1FDF +1FED 1FEF +1FFD 1FFE +2010 2027 +2035 2043 +2045 205E +207C 207E +208C 208E +2100 2101 +2103 2106 +2108 2109 +2114 +2116 2118 +211E 2123 +2125 +2127 +2129 +2132 +213A 213B +2140 2144 +214A 214C +2153 215F +2190 2211 +2214 2335 +237B 2394 +2396 23DB +2400 2426 +2440 244A +2460 2487 +24EA 269C +26A0 26AB +26AD 26B1 +2701 2704 +2706 2709 +270C 2727 +2729 274B +274D +274F 2752 +2756 +2758 275E +2761 2794 +2798 27AF +27B1 27BE +27C0 27C6 +27D0 27EB +27F0 27FF +2900 2B13 +2CE5 2CEA +2CF9 2CFF +2E00 2E17 +2E1C 2E1D +2E80 2E99 +2E9B 2EF3 +2F00 2FD5 +2FF0 2FFB +3001 3004 +3008 3020 +3030 +3036 3037 +303D 303F +309B 309C +30A0 +30FB +31C0 31CF +321D 321E +3250 325F +327C 327E +32B1 32BF +32CC 32CF +3377 337A +33DE 33DF +33FF +4DC0 4DFF +A490 A4C6 +A700 A716 +A828 A82B +FD3E FD3F +FDFD +FE10 FE19 +FE30 FE4F +FE51 +FE54 +FE56 FE5E +FE60 FE61 +FE64 FE66 +FE68 +FE6B +FF01 FF02 +FF06 FF0A +FF1B FF20 +FF3B FF40 +FF5B FF65 +FFE2 FFE4 +FFE8 FFEE +FFF9 FFFD +10101 +10140 1018A +103D1 103D5 +1D200 1D241 +1D245 +1D300 1D356 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/PDF.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/PDF.pl new file mode 100644 index 00000000000..6cbfb1f8d1b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/PDF.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'Pop_Directional_Format' +# +return <<'END'; +202C +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/R.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/R.pl new file mode 100644 index 00000000000..65ba799e3bb --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/R.pl @@ -0,0 +1,36 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'Right_To_Left' +# +return <<'END'; +05BE +05C0 +05C3 +05C6 +05D0 05EA +05F0 05F4 +200F +FB1D +FB1F FB28 +FB2A FB36 +FB38 FB3C +FB3E +FB40 FB41 +FB43 FB44 +FB46 FB4F +10800 10805 +10808 +1080A 10835 +10837 10838 +1083C +1083F +10A00 +10A10 10A13 +10A15 10A17 +10A19 10A33 +10A40 10A47 +10A50 10A58 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/RLE.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/RLE.pl new file mode 100644 index 00000000000..851f1fd3513 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/RLE.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'Right_To_Left_Embedding' +# +return <<'END'; +202B +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/RLO.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/RLO.pl new file mode 100644 index 00000000000..565941526ff --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/RLO.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'Right_To_Left_Override' +# +return <<'END'; +202E +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/S.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/S.pl new file mode 100644 index 00000000000..ac494648f0f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/S.pl @@ -0,0 +1,12 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'Segment_Separator' +# +return <<'END'; +0009 +000B +001F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/WS.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/WS.pl new file mode 100644 index 00000000000..98f3a5ea3fb --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/bc/WS.pl @@ -0,0 +1,17 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# BidiClass category 'White_Space' +# +return <<'END'; +000C +0020 +1680 +180E +2000 200A +2028 +205F +3000 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/A.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/A.pl new file mode 100644 index 00000000000..0a094e60306 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/A.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Above' +# +return <<'END'; +00E6 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/AL.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/AL.pl new file mode 100644 index 00000000000..9d820799c98 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/AL.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Above_Left' +# +return <<'END'; +00E4 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/AR.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/AR.pl new file mode 100644 index 00000000000..c0f80d057b0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/AR.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Above_Right' +# +return <<'END'; +00E8 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/ATAR.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/ATAR.pl new file mode 100644 index 00000000000..e5af6df6d8e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/ATAR.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Attached_Above_Right' +# +return <<'END'; +00D8 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/ATB.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/ATB.pl new file mode 100644 index 00000000000..186ef05559a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/ATB.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Attached_Below' +# +return <<'END'; +00CA +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/ATBL.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/ATBL.pl new file mode 100644 index 00000000000..c67cd441643 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/ATBL.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Attached_Below_Left' +# +return <<'END'; +00C8 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/B.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/B.pl new file mode 100644 index 00000000000..33ed0f6c825 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/B.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Below' +# +return <<'END'; +00DC +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/BL.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/BL.pl new file mode 100644 index 00000000000..6f3377bbdfa --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/BL.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Below_Left' +# +return <<'END'; +00DA +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/BR.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/BR.pl new file mode 100644 index 00000000000..c836d184506 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/BR.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Below_Right' +# +return <<'END'; +00DE +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/DA.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/DA.pl new file mode 100644 index 00000000000..8fd33b2e57e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/DA.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Double_Above' +# +return <<'END'; +00EA +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/DB.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/DB.pl new file mode 100644 index 00000000000..a151b8bf94c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/DB.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Double_Below' +# +return <<'END'; +00E9 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/IS.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/IS.pl new file mode 100644 index 00000000000..5d0573a5ee3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/IS.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Iota_Subscript' +# +return <<'END'; +00F0 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/KV.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/KV.pl new file mode 100644 index 00000000000..b3a98646ca4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/KV.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Kana_Voicing' +# +return <<'END'; +0008 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/L.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/L.pl new file mode 100644 index 00000000000..587a1c4d9c2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/L.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Left' +# +return <<'END'; +00E0 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/NK.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/NK.pl new file mode 100644 index 00000000000..ff831830fe2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/NK.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Nukta' +# +return <<'END'; +0007 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/NR.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/NR.pl new file mode 100644 index 00000000000..d6bf5574952 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/NR.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Not_Reordered' +# +return <<'END'; +0000 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/OV.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/OV.pl new file mode 100644 index 00000000000..1ebefafb28f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/OV.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Overlay' +# +return <<'END'; +0001 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/R.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/R.pl new file mode 100644 index 00000000000..4046b71875d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/R.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Right' +# +return <<'END'; +00E2 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/VR.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/VR.pl new file mode 100644 index 00000000000..482ff128797 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ccc/VR.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# CombiningClass category 'Virama' +# +return <<'END'; +0009 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/can.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/can.pl new file mode 100644 index 00000000000..08ddf367ee4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/can.pl @@ -0,0 +1,222 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Canonical' +# +return <<'END'; +00C0 00C5 +00C7 00CF +00D1 00D6 +00D9 00DD +00E0 00E5 +00E7 00EF +00F1 00F6 +00F9 00FD +00FF 010F +0112 0125 +0128 0130 +0134 0137 +0139 013E +0143 0148 +014C 0151 +0154 0165 +0168 017E +01A0 01A1 +01AF 01B0 +01CD 01DC +01DE 01E3 +01E6 01F0 +01F4 01F5 +01F8 021B +021E 021F +0226 0233 +0340 0341 +0343 0344 +0374 +037E +0385 038A +038C +038E 0390 +03AA 03B0 +03CA 03CE +03D3 03D4 +0400 0401 +0403 +0407 +040C 040E +0419 +0439 +0450 0451 +0453 +0457 +045C 045E +0476 0477 +04C1 04C2 +04D0 04D3 +04D6 04D7 +04DA 04DF +04E2 04E7 +04EA 04F5 +04F8 04F9 +0622 0626 +06C0 +06C2 +06D3 +0929 +0931 +0934 +0958 095F +09CB 09CC +09DC 09DD +09DF +0A33 +0A36 +0A59 0A5B +0A5E +0B48 +0B4B 0B4C +0B5C 0B5D +0B94 +0BCA 0BCC +0C48 +0CC0 +0CC7 0CC8 +0CCA 0CCB +0D4A 0D4C +0DDA +0DDC 0DDE +0F43 +0F4D +0F52 +0F57 +0F5C +0F69 +0F73 +0F75 0F76 +0F78 +0F81 +0F93 +0F9D +0FA2 +0FA7 +0FAC +0FB9 +1026 +1E00 1E99 +1E9B +1EA0 1EF9 +1F00 1F15 +1F18 1F1D +1F20 1F45 +1F48 1F4D +1F50 1F57 +1F59 +1F5B +1F5D +1F5F 1F7D +1F80 1FB4 +1FB6 1FBC +1FBE +1FC1 1FC4 +1FC6 1FD3 +1FD6 1FDB +1FDD 1FEF +1FF2 1FF4 +1FF6 1FFD +2000 2001 +2126 +212A 212B +219A 219B +21AE +21CD 21CF +2204 +2209 +220C +2224 +2226 +2241 +2244 +2247 +2249 +2260 +2262 +226D 2271 +2274 2275 +2278 2279 +2280 2281 +2284 2285 +2288 2289 +22AC 22AF +22E0 22E3 +22EA 22ED +2329 232A +2ADC +304C +304E +3050 +3052 +3054 +3056 +3058 +305A +305C +305E +3060 +3062 +3065 +3067 +3069 +3070 3071 +3073 3074 +3076 3077 +3079 307A +307C 307D +3094 +309E +30AC +30AE +30B0 +30B2 +30B4 +30B6 +30B8 +30BA +30BC +30BE +30C0 +30C2 +30C5 +30C7 +30C9 +30D0 30D1 +30D3 30D4 +30D6 30D7 +30D9 30DA +30DC 30DD +30F4 +30F7 30FA +30FE +F900 FA0D +FA10 +FA12 +FA15 FA1E +FA20 +FA22 +FA25 FA26 +FA2A FA2D +FA30 FA6A +FA70 FAD9 +FB1D +FB1F +FB2A FB36 +FB38 FB3C +FB3E +FB40 FB41 +FB43 FB44 +FB46 FB4E +1D15E 1D164 +1D1BB 1D1C0 +2F800 2FA1D +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/com.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/com.pl new file mode 100644 index 00000000000..973c63cfdad --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/com.pl @@ -0,0 +1,820 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Compat' +# +return <<'END'; +00A0 +00A8 +00A8 +00AA +00AF +00AF +00B2 00B4 +00B4 00B5 +00B5 +00B8 +00B8 00BA +00BC 00BE +0132 +0132 0133 +0133 +013F +013F 0140 +0140 +0149 +0149 +017F +017F +01C4 +01C4 01C5 +01C5 01C6 +01C6 01C7 +01C7 01C8 +01C8 01C9 +01C9 01CA +01CA 01CB +01CB 01CC +01CC +01F1 +01F1 01F2 +01F2 01F3 +01F3 +02B0 02B8 +02D8 +02D8 02D9 +02D9 02DA +02DA 02DB +02DB 02DC +02DC 02DD +02DD +02E0 02E4 +037A +037A +0384 +0384 +03D0 +03D0 03D1 +03D1 03D2 +03D2 +03D5 +03D5 03D6 +03D6 +03F0 +03F0 03F1 +03F1 03F2 +03F2 +03F4 +03F4 03F5 +03F5 +03F9 +03F9 +0587 +0587 +0675 +0675 0676 +0676 0677 +0677 0678 +0678 +0E33 +0E33 +0EB3 +0EB3 +0EDC +0EDC 0EDD +0EDD +0F0C +0F77 +0F77 +0F79 +0F79 +10FC +1D2C 1D2E +1D30 1D3A +1D3C 1D4D +1D4F 1D6A +1D78 +1D9B 1DBF +1E9A +1E9A +1FBD +1FBD +1FBF +1FBF 1FC0 +1FC0 +1FFE +1FFE +2002 +2002 2003 +2003 2004 +2004 2005 +2005 2006 +2006 2008 +2008 2009 +2009 200A +200A +2011 +2017 +2017 +2024 +2024 2025 +2025 2026 +2026 +202F +2033 +2033 2034 +2034 +2036 +2036 2037 +2037 +203C +203C +203E +203E +2047 +2047 2048 +2048 2049 +2049 +2057 +2057 +205F +205F +2070 2071 +2074 208E +2090 2094 +20A8 +20A8 +2100 +2100 2101 +2101 2103 +2103 +2105 +2105 2106 +2106 2107 +2107 +2109 +2109 2113 +2115 2116 +2116 +2119 211D +2120 2121 +2121 2122 +2124 +2128 +212C 212D +212F 2131 +2133 2135 +2135 2136 +2136 2137 +2137 2138 +2138 2139 +213B +213B 2140 +2145 2149 +2153 2160 +2160 2161 +2161 2162 +2162 2163 +2163 2164 +2164 2165 +2165 2166 +2166 2167 +2167 2168 +2168 2169 +2169 216A +216A 216B +216B 216C +216C 216D +216D 216E +216E 216F +216F 2170 +2170 2171 +2171 2172 +2172 2173 +2173 2174 +2174 2175 +2175 2176 +2176 2177 +2177 2178 +2178 2179 +2179 217A +217A 217B +217B 217C +217C 217D +217D 217E +217E 217F +217F +222C +222C 222D +222D +222F +222F 2230 +2230 +2460 2474 +2474 2475 +2475 2476 +2476 2477 +2477 2478 +2478 2479 +2479 247A +247A 247B +247B 247C +247C 247D +247D 247E +247E 247F +247F 2480 +2480 2481 +2481 2482 +2482 2483 +2483 2484 +2484 2485 +2485 2486 +2486 2487 +2487 2488 +2488 2489 +2489 248A +248A 248B +248B 248C +248C 248D +248D 248E +248E 248F +248F 2490 +2490 2491 +2491 2492 +2492 2493 +2493 2494 +2494 2495 +2495 2496 +2496 2497 +2497 2498 +2498 2499 +2499 249A +249A 249B +249B 249C +249C 249D +249D 249E +249E 249F +249F 24A0 +24A0 24A1 +24A1 24A2 +24A2 24A3 +24A3 24A4 +24A4 24A5 +24A5 24A6 +24A6 24A7 +24A7 24A8 +24A8 24A9 +24A9 24AA +24AA 24AB +24AB 24AC +24AC 24AD +24AD 24AE +24AE 24AF +24AF 24B0 +24B0 24B1 +24B1 24B2 +24B2 24B3 +24B3 24B4 +24B4 24B5 +24B5 24EA +2A0C +2A0C +2A74 +2A74 2A75 +2A75 2A76 +2A76 +2D6F +2E9F +2E9F +2EF3 +2EF3 +2F00 +2F00 2F01 +2F01 2F02 +2F02 2F03 +2F03 2F04 +2F04 2F05 +2F05 2F06 +2F06 2F07 +2F07 2F08 +2F08 2F09 +2F09 2F0A +2F0A 2F0B +2F0B 2F0C +2F0C 2F0D +2F0D 2F0E +2F0E 2F0F +2F0F 2F10 +2F10 2F11 +2F11 2F12 +2F12 2F13 +2F13 2F14 +2F14 2F15 +2F15 2F16 +2F16 2F17 +2F17 2F18 +2F18 2F19 +2F19 2F1A +2F1A 2F1B +2F1B 2F1C +2F1C 2F1D +2F1D 2F1E +2F1E 2F1F +2F1F 2F20 +2F20 2F21 +2F21 2F22 +2F22 2F23 +2F23 2F24 +2F24 2F25 +2F25 2F26 +2F26 2F27 +2F27 2F28 +2F28 2F29 +2F29 2F2A +2F2A 2F2B +2F2B 2F2C +2F2C 2F2D +2F2D 2F2E +2F2E 2F2F +2F2F 2F30 +2F30 2F31 +2F31 2F32 +2F32 2F33 +2F33 2F34 +2F34 2F35 +2F35 2F36 +2F36 2F37 +2F37 2F38 +2F38 2F39 +2F39 2F3A +2F3A 2F3B +2F3B 2F3C +2F3C 2F3D +2F3D 2F3E +2F3E 2F3F +2F3F 2F40 +2F40 2F41 +2F41 2F42 +2F42 2F43 +2F43 2F44 +2F44 2F45 +2F45 2F46 +2F46 2F47 +2F47 2F48 +2F48 2F49 +2F49 2F4A +2F4A 2F4B +2F4B 2F4C +2F4C 2F4D +2F4D 2F4E +2F4E 2F4F +2F4F 2F50 +2F50 2F51 +2F51 2F52 +2F52 2F53 +2F53 2F54 +2F54 2F55 +2F55 2F56 +2F56 2F57 +2F57 2F58 +2F58 2F59 +2F59 2F5A +2F5A 2F5B +2F5B 2F5C +2F5C 2F5D +2F5D 2F5E +2F5E 2F5F +2F5F 2F60 +2F60 2F61 +2F61 2F62 +2F62 2F63 +2F63 2F64 +2F64 2F65 +2F65 2F66 +2F66 2F67 +2F67 2F68 +2F68 2F69 +2F69 2F6A +2F6A 2F6B +2F6B 2F6C +2F6C 2F6D +2F6D 2F6E +2F6E 2F6F +2F6F 2F70 +2F70 2F71 +2F71 2F72 +2F72 2F73 +2F73 2F74 +2F74 2F75 +2F75 2F76 +2F76 2F77 +2F77 2F78 +2F78 2F79 +2F79 2F7A +2F7A 2F7B +2F7B 2F7C +2F7C 2F7D +2F7D 2F7E +2F7E 2F7F +2F7F 2F80 +2F80 2F81 +2F81 2F82 +2F82 2F83 +2F83 2F84 +2F84 2F85 +2F85 2F86 +2F86 2F87 +2F87 2F88 +2F88 2F89 +2F89 2F8A +2F8A 2F8B +2F8B 2F8C +2F8C 2F8D +2F8D 2F8E +2F8E 2F8F +2F8F 2F90 +2F90 2F91 +2F91 2F92 +2F92 2F93 +2F93 2F94 +2F94 2F95 +2F95 2F96 +2F96 2F97 +2F97 2F98 +2F98 2F99 +2F99 2F9A +2F9A 2F9B +2F9B 2F9C +2F9C 2F9D +2F9D 2F9E +2F9E 2F9F +2F9F 2FA0 +2FA0 2FA1 +2FA1 2FA2 +2FA2 2FA3 +2FA3 2FA4 +2FA4 2FA5 +2FA5 2FA6 +2FA6 2FA7 +2FA7 2FA8 +2FA8 2FA9 +2FA9 2FAA +2FAA 2FAB +2FAB 2FAC +2FAC 2FAD +2FAD 2FAE +2FAE 2FAF +2FAF 2FB0 +2FB0 2FB1 +2FB1 2FB2 +2FB2 2FB3 +2FB3 2FB4 +2FB4 2FB5 +2FB5 2FB6 +2FB6 2FB7 +2FB7 2FB8 +2FB8 2FB9 +2FB9 2FBA +2FBA 2FBB +2FBB 2FBC +2FBC 2FBD +2FBD 2FBE +2FBE 2FBF +2FBF 2FC0 +2FC0 2FC1 +2FC1 2FC2 +2FC2 2FC3 +2FC3 2FC4 +2FC4 2FC5 +2FC5 2FC6 +2FC6 2FC7 +2FC7 2FC8 +2FC8 2FC9 +2FC9 2FCA +2FCA 2FCB +2FCB 2FCC +2FCC 2FCD +2FCD 2FCE +2FCE 2FCF +2FCF 2FD0 +2FD0 2FD1 +2FD1 2FD2 +2FD2 2FD3 +2FD3 2FD4 +2FD4 2FD5 +2FD5 +3000 +3036 +3036 +3038 +3038 3039 +3039 303A +303A +309B +309B 309C +309C +309F +30FF +3131 +3131 3132 +3132 3133 +3133 3134 +3134 3135 +3135 3136 +3136 3137 +3137 3138 +3138 3139 +3139 313A +313A 313B +313B 313C +313C 313D +313D 313E +313E 313F +313F 3140 +3140 3141 +3141 3142 +3142 3143 +3143 3144 +3144 3145 +3145 3146 +3146 3147 +3147 3148 +3148 3149 +3149 314A +314A 314B +314B 314C +314C 314D +314D 314E +314E 314F +314F 3150 +3150 3151 +3151 3152 +3152 3153 +3153 3154 +3154 3155 +3155 3156 +3156 3157 +3157 3158 +3158 3159 +3159 315A +315A 315B +315B 315C +315C 315D +315D 315E +315E 315F +315F 3160 +3160 3161 +3161 3162 +3162 3163 +3163 3164 +3164 3165 +3165 3166 +3166 3167 +3167 3168 +3168 3169 +3169 316A +316A 316B +316B 316C +316C 316D +316D 316E +316E 316F +316F 3170 +3170 3171 +3171 3172 +3172 3173 +3173 3174 +3174 3175 +3175 3176 +3176 3177 +3177 3178 +3178 3179 +3179 317A +317A 317B +317B 317C +317C 317D +317D 317E +317E 317F +317F 3180 +3180 3181 +3181 3182 +3182 3183 +3183 3184 +3184 3185 +3185 3186 +3186 3187 +3187 3188 +3188 3189 +3189 318A +318A 318B +318B 318C +318C 318D +318D 318E +318E +3192 319F +3200 +3200 3201 +3201 3202 +3202 3203 +3203 3204 +3204 3205 +3205 3206 +3206 3207 +3207 3208 +3208 3209 +3209 320A +320A 320B +320B 320C +320C 320D +320D 320E +320E 320F +320F 3210 +3210 3211 +3211 3212 +3212 3213 +3213 3214 +3214 3215 +3215 3216 +3216 3217 +3217 3218 +3218 3219 +3219 321A +321A 321B +321B 321C +321C 321D +321D 321E +321E +3220 +3220 3221 +3221 3222 +3222 3223 +3223 3224 +3224 3225 +3225 3226 +3226 3227 +3227 3228 +3228 3229 +3229 322A +322A 322B +322B 322C +322C 322D +322D 322E +322E 322F +322F 3230 +3230 3231 +3231 3232 +3232 3233 +3233 3234 +3234 3235 +3235 3236 +3236 3237 +3237 3238 +3238 3239 +3239 323A +323A 323B +323B 323C +323C 323D +323D 323E +323E 323F +323F 3240 +3240 3241 +3241 3242 +3242 3243 +3243 +3250 327E +3280 32C0 +32C0 32C1 +32C1 32C2 +32C2 32C3 +32C3 32C4 +32C4 32C5 +32C5 32C6 +32C6 32C7 +32C7 32C8 +32C8 32C9 +32C9 32CA +32CA 32CB +32CB 32FE +3300 3358 +3358 3359 +3359 335A +335A 335B +335B 335C +335C 335D +335D 335E +335E 335F +335F 3360 +3360 3361 +3361 3362 +3362 3363 +3363 3364 +3364 3365 +3365 3366 +3366 3367 +3367 3368 +3368 3369 +3369 336A +336A 336B +336B 336C +336C 336D +336D 336E +336E 336F +336F 3370 +3370 33E0 +33E0 33E1 +33E1 33E2 +33E2 33E3 +33E3 33E4 +33E4 33E5 +33E5 33E6 +33E6 33E7 +33E7 33E8 +33E8 33E9 +33E9 33EA +33EA 33EB +33EB 33EC +33EC 33ED +33ED 33EE +33EE 33EF +33EF 33F0 +33F0 33F1 +33F1 33F2 +33F2 33F3 +33F3 33F4 +33F4 33F5 +33F5 33F6 +33F6 33F7 +33F7 33F8 +33F8 33F9 +33F9 33FA +33FA 33FB +33FB 33FC +33FC 33FD +33FD 33FE +33FE 33FF +FB00 +FB00 FB01 +FB01 FB02 +FB02 FB03 +FB03 FB04 +FB04 FB05 +FB05 FB06 +FB06 +FB13 +FB13 FB14 +FB14 FB15 +FB15 FB16 +FB16 FB17 +FB17 +FB20 FB29 +FB4F +FB4F FBB1 +FBD3 FD3D +FD50 FD8F +FD92 FDC7 +FDF0 FDFC +FE10 FE19 +FE30 FE44 +FE47 FE49 +FE49 FE4A +FE4A FE4B +FE4B FE4C +FE4C FE4D +FE4D FE4E +FE4E FE4F +FE4F FE52 +FE54 FE66 +FE68 FE6B +FE70 FE72 +FE74 +FE76 FEFC +FF01 FFBE +FFC2 FFC7 +FFCA FFCF +FFD2 FFD7 +FFDA FFDC +FFE0 FFE6 +FFE8 FFEE +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A5 +1D6A8 1D7C9 +1D7CE 1D7FF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/enc.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/enc.pl new file mode 100644 index 00000000000..e5cb3a29692 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/enc.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Circle' +# +return <<'END'; +2460 2473 +24B6 24EA +3251 327E +3280 32BF +32D0 32FE +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/fin.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/fin.pl new file mode 100644 index 00000000000..904383302ff --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/fin.pl @@ -0,0 +1,122 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Final' +# +return <<'END'; +FB51 +FB53 +FB57 +FB5B +FB5F +FB63 +FB67 +FB6B +FB6F +FB73 +FB77 +FB7B +FB7F +FB83 +FB85 +FB87 +FB89 +FB8B +FB8D +FB8F +FB93 +FB97 +FB9B +FB9F +FBA1 +FBA5 +FBA7 +FBAB +FBAF +FBB1 +FBD4 +FBD8 +FBDA +FBDC +FBDF +FBE1 +FBE3 +FBE5 +FBEB +FBED +FBEF +FBF1 +FBF3 +FBF5 +FBF7 +FBFA +FBFD +FC64 FC96 +FD11 FD2C +FD3C +FD51 +FD58 +FD5A FD5B +FD5E FD5F +FD62 +FD64 +FD66 FD67 +FD69 FD6A +FD6C +FD6E FD6F +FD71 +FD74 FD76 +FD78 FD7C +FD7E FD82 +FD84 FD85 +FD87 +FD8B +FD96 FD97 +FD99 FD9C +FD9E FDB3 +FDB6 FDB7 +FDB9 +FDBB FDC2 +FDC6 FDC7 +FE82 +FE84 +FE86 +FE88 +FE8A +FE8E +FE90 +FE94 +FE96 +FE9A +FE9E +FEA2 +FEA6 +FEAA +FEAC +FEAE +FEB0 +FEB2 +FEB6 +FEBA +FEBE +FEC2 +FEC6 +FECA +FECE +FED2 +FED6 +FEDA +FEDE +FEE2 +FEE6 +FEEA +FEEE +FEF0 +FEF2 +FEF6 +FEF8 +FEFA +FEFC +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/font.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/font.pl new file mode 100644 index 00000000000..849112dbd4d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/font.pl @@ -0,0 +1,43 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Font' +# +return <<'END'; +2102 +210A 2113 +2115 +2119 211D +2124 +2128 +212C 212D +212F 2131 +2133 2134 +2139 +213C 2140 +2145 2149 +FB20 FB29 +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A5 +1D6A8 1D7C9 +1D7CE 1D7FF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/fra.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/fra.pl new file mode 100644 index 00000000000..94db2d36735 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/fra.pl @@ -0,0 +1,11 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Fraction' +# +return <<'END'; +00BC 00BE +2153 215F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/init.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/init.pl new file mode 100644 index 00000000000..7fd35d29ae5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/init.pl @@ -0,0 +1,84 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Initial' +# +return <<'END'; +FB54 +FB58 +FB5C +FB60 +FB64 +FB68 +FB6C +FB70 +FB74 +FB78 +FB7C +FB80 +FB90 +FB94 +FB98 +FB9C +FBA2 +FBA8 +FBAC +FBD5 +FBE6 +FBE8 +FBF8 +FBFB +FBFE +FC97 FCDE +FD2D FD33 +FD50 +FD52 FD57 +FD59 +FD5C FD5D +FD60 FD61 +FD63 +FD65 +FD68 +FD6B +FD6D +FD70 +FD72 FD73 +FD77 +FD7D +FD83 +FD86 +FD88 FD8A +FD8C FD8F +FD92 FD95 +FD98 +FD9D +FDB4 FDB5 +FDB8 +FDBA +FDC3 FDC5 +FE8B +FE91 +FE97 +FE9B +FE9F +FEA3 +FEA7 +FEB3 +FEB7 +FEBB +FEBF +FEC3 +FEC7 +FECB +FECF +FED3 +FED7 +FEDB +FEDF +FEE3 +FEE7 +FEEB +FEF3 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/iso.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/iso.pl new file mode 100644 index 00000000000..1c39772d1a4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/iso.pl @@ -0,0 +1,107 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Isolated' +# +return <<'END'; +FB50 +FB52 +FB56 +FB5A +FB5E +FB62 +FB66 +FB6A +FB6E +FB72 +FB76 +FB7A +FB7E +FB82 +FB84 +FB86 +FB88 +FB8A +FB8C +FB8E +FB92 +FB96 +FB9A +FB9E +FBA0 +FBA4 +FBA6 +FBAA +FBAE +FBB0 +FBD3 +FBD7 +FBD9 +FBDB +FBDD FBDE +FBE0 +FBE2 +FBE4 +FBEA +FBEC +FBEE +FBF0 +FBF2 +FBF4 +FBF6 +FBF9 +FBFC +FC00 FC63 +FCF5 FD10 +FD3D +FDF0 FDFC +FE70 +FE72 +FE74 +FE76 +FE78 +FE7A +FE7C +FE7E +FE80 FE81 +FE83 +FE85 +FE87 +FE89 +FE8D +FE8F +FE93 +FE95 +FE99 +FE9D +FEA1 +FEA5 +FEA9 +FEAB +FEAD +FEAF +FEB1 +FEB5 +FEB9 +FEBD +FEC1 +FEC5 +FEC9 +FECD +FED1 +FED5 +FED9 +FEDD +FEE1 +FEE5 +FEE9 +FEED +FEEF +FEF1 +FEF5 +FEF7 +FEF9 +FEFB +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/med.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/med.pl new file mode 100644 index 00000000000..88ae9102947 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/med.pl @@ -0,0 +1,63 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Medial' +# +return <<'END'; +FB55 +FB59 +FB5D +FB61 +FB65 +FB69 +FB6D +FB71 +FB75 +FB79 +FB7D +FB81 +FB91 +FB95 +FB99 +FB9D +FBA3 +FBA9 +FBAD +FBD6 +FBE7 +FBE9 +FBFF +FCDF FCF4 +FD34 FD3B +FE71 +FE77 +FE79 +FE7B +FE7D +FE7F +FE8C +FE92 +FE98 +FE9C +FEA0 +FEA4 +FEA8 +FEB4 +FEB8 +FEBC +FEC0 +FEC4 +FEC8 +FECC +FED0 +FED4 +FED8 +FEDC +FEE0 +FEE4 +FEE8 +FEEC +FEF4 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/nar.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/nar.pl new file mode 100644 index 00000000000..03d169a7250 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/nar.pl @@ -0,0 +1,15 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Narrow' +# +return <<'END'; +FF61 FFBE +FFC2 FFC7 +FFCA FFCF +FFD2 FFD7 +FFDA FFDC +FFE8 FFEE +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/nb.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/nb.pl new file mode 100644 index 00000000000..bdf1ac40251 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/nb.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Nobreak' +# +return <<'END'; +00A0 +0F0C +2007 +2011 +202F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/sml.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/sml.pl new file mode 100644 index 00000000000..ca6b15f36f8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/sml.pl @@ -0,0 +1,12 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Small' +# +return <<'END'; +FE50 FE52 +FE54 FE66 +FE68 FE6B +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/sqr.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/sqr.pl new file mode 100644 index 00000000000..604d8978744 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/sqr.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Square' +# +return <<'END'; +3250 +32CC 32CF +3300 3357 +3371 33DF +33FF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/sub.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/sub.pl new file mode 100644 index 00000000000..c5eee14337c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/sub.pl @@ -0,0 +1,12 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Sub' +# +return <<'END'; +1D62 1D6A +2080 208E +2090 2094 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/sup.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/sup.pl new file mode 100644 index 00000000000..ae522e76b37 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/sup.pl @@ -0,0 +1,27 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Super' +# +return <<'END'; +00AA +00B2 00B3 +00B9 00BA +02B0 02B8 +02E0 02E4 +10FC +1D2C 1D2E +1D30 1D3A +1D3C 1D4D +1D4F 1D61 +1D78 +1D9B 1DBF +2070 2071 +2074 207F +2120 +2122 +2D6F +3192 319F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/vert.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/vert.pl new file mode 100644 index 00000000000..6edf400e8e1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/vert.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Vertical' +# +return <<'END'; +309F +30FF +FE10 FE19 +FE30 FE44 +FE47 FE48 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/wide.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/wide.pl new file mode 100644 index 00000000000..99ef5131f17 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/dt/wide.pl @@ -0,0 +1,12 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# DecompositionType category 'Wide' +# +return <<'END'; +3000 +FF01 FF60 +FFE0 FFE6 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/A.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/A.pl new file mode 100644 index 00000000000..4a0cbd04120 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/A.pl @@ -0,0 +1,168 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# EastAsianWidth category 'Ambiguous' +# +return <<'END'; +00A1 +00A4 +00A7 00A8 +00AA +00AD 00AE +00B0 00B4 +00B6 00BA +00BC 00BF +00C6 +00D0 +00D7 00D8 +00DE 00E1 +00E6 +00E8 00EA +00EC 00ED +00F0 +00F2 00F3 +00F7 00FA +00FC +00FE +0101 +0111 +0113 +011B +0126 0127 +012B +0131 0133 +0138 +013F 0142 +0144 +0148 014B +014D +0152 0153 +0166 0167 +016B +01CE +01D0 +01D2 +01D4 +01D6 +01D8 +01DA +01DC +0251 +0261 +02C4 +02C7 +02C9 02CB +02CD +02D0 +02D8 02DB +02DD +02DF +0300 036F +0391 03A1 +03A3 03A9 +03B1 03C1 +03C3 03C9 +0401 +0410 044F +0451 +2010 +2013 2016 +2018 2019 +201C 201D +2020 2022 +2024 2027 +2030 +2032 2033 +2035 +203B +203E +2074 +207F +2081 2084 +20AC +2103 +2105 +2109 +2113 +2116 +2121 2122 +2126 +212B +2153 2154 +215B 215E +2160 216B +2170 2179 +2190 2199 +21B8 21B9 +21D2 +21D4 +21E7 +2200 +2202 2203 +2207 2208 +220B +220F +2211 +2215 +221A +221D 2220 +2223 +2225 +2227 222C +222E +2234 2237 +223C 223D +2248 +224C +2252 +2260 2261 +2264 2267 +226A 226B +226E 226F +2282 2283 +2286 2287 +2295 +2299 +22A5 +22BF +2312 +2460 24E9 +24EB 254B +2550 2573 +2580 258F +2592 2595 +25A0 25A1 +25A3 25A9 +25B2 25B3 +25B6 25B7 +25BC 25BD +25C0 25C1 +25C6 25C8 +25CB +25CE 25D1 +25E2 25E5 +25EF +2605 2606 +2609 +260E 260F +2614 2615 +261C +261E +2640 +2642 +2660 2661 +2663 2665 +2667 266A +266C 266D +266F +273D +2776 277F +E000 F8FF +FE00 FE0F +FFFD +E0100 E01EF +F0000 FFFFD +100000 10FFFD +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/F.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/F.pl new file mode 100644 index 00000000000..593b4680ec2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/F.pl @@ -0,0 +1,12 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# EastAsianWidth category 'Fullwidth' +# +return <<'END'; +3000 +FF01 FF60 +FFE0 FFE6 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/H.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/H.pl new file mode 100644 index 00000000000..ad6e3280b78 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/H.pl @@ -0,0 +1,16 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# EastAsianWidth category 'Halfwidth' +# +return <<'END'; +20A9 +FF61 FFBE +FFC2 FFC7 +FFCA FFCF +FFD2 FFD7 +FFDA FFDC +FFE8 FFEE +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/N.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/N.pl new file mode 100644 index 00000000000..fc34014ca7a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/N.pl @@ -0,0 +1,540 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# EastAsianWidth category 'Neutral' +# +return <<'END'; +0000 001F +007F 00A0 +00A9 +00AB +00B5 +00BB +00C0 00C5 +00C7 00CF +00D1 00D6 +00D9 00DD +00E2 00E5 +00E7 +00EB +00EE 00EF +00F1 +00F4 00F6 +00FB +00FD +00FF 0100 +0102 0110 +0112 +0114 011A +011C 0125 +0128 012A +012C 0130 +0134 0137 +0139 013E +0143 +0145 0147 +014C +014E 0151 +0154 0165 +0168 016A +016C 01CD +01CF +01D1 +01D3 +01D5 +01D7 +01D9 +01DB +01DD 0241 +0250 +0252 0260 +0262 02C3 +02C5 02C6 +02C8 +02CC +02CE 02CF +02D1 02D7 +02DC +02DE +02E0 02FF +0374 0375 +037A +037E +0384 038A +038C +038E 0390 +03AA 03B0 +03C2 +03CA 03CE +03D0 0400 +0402 040F +0450 +0452 0486 +0488 04CE +04D0 04F9 +0500 050F +0531 0556 +0559 055F +0561 0587 +0589 058A +0591 05B9 +05BB 05C7 +05D0 05EA +05F0 05F4 +0600 0603 +060B 0615 +061B +061E 061F +0621 063A +0640 065E +0660 070D +070F 074A +074D 076D +0780 07B1 +0901 0939 +093C 094D +0950 0954 +0958 0970 +097D +0981 0983 +0985 098C +098F 0990 +0993 09A8 +09AA 09B0 +09B2 +09B6 09B9 +09BC 09C4 +09C7 09C8 +09CB 09CE +09D7 +09DC 09DD +09DF 09E3 +09E6 09FA +0A01 0A03 +0A05 0A0A +0A0F 0A10 +0A13 0A28 +0A2A 0A30 +0A32 0A33 +0A35 0A36 +0A38 0A39 +0A3C +0A3E 0A42 +0A47 0A48 +0A4B 0A4D +0A59 0A5C +0A5E +0A66 0A74 +0A81 0A83 +0A85 0A8D +0A8F 0A91 +0A93 0AA8 +0AAA 0AB0 +0AB2 0AB3 +0AB5 0AB9 +0ABC 0AC5 +0AC7 0AC9 +0ACB 0ACD +0AD0 +0AE0 0AE3 +0AE6 0AEF +0AF1 +0B01 0B03 +0B05 0B0C +0B0F 0B10 +0B13 0B28 +0B2A 0B30 +0B32 0B33 +0B35 0B39 +0B3C 0B43 +0B47 0B48 +0B4B 0B4D +0B56 0B57 +0B5C 0B5D +0B5F 0B61 +0B66 0B71 +0B82 0B83 +0B85 0B8A +0B8E 0B90 +0B92 0B95 +0B99 0B9A +0B9C +0B9E 0B9F +0BA3 0BA4 +0BA8 0BAA +0BAE 0BB9 +0BBE 0BC2 +0BC6 0BC8 +0BCA 0BCD +0BD7 +0BE6 0BFA +0C01 0C03 +0C05 0C0C +0C0E 0C10 +0C12 0C28 +0C2A 0C33 +0C35 0C39 +0C3E 0C44 +0C46 0C48 +0C4A 0C4D +0C55 0C56 +0C60 0C61 +0C66 0C6F +0C82 0C83 +0C85 0C8C +0C8E 0C90 +0C92 0CA8 +0CAA 0CB3 +0CB5 0CB9 +0CBC 0CC4 +0CC6 0CC8 +0CCA 0CCD +0CD5 0CD6 +0CDE +0CE0 0CE1 +0CE6 0CEF +0D02 0D03 +0D05 0D0C +0D0E 0D10 +0D12 0D28 +0D2A 0D39 +0D3E 0D43 +0D46 0D48 +0D4A 0D4D +0D57 +0D60 0D61 +0D66 0D6F +0D82 0D83 +0D85 0D96 +0D9A 0DB1 +0DB3 0DBB +0DBD +0DC0 0DC6 +0DCA +0DCF 0DD4 +0DD6 +0DD8 0DDF +0DF2 0DF4 +0E01 0E3A +0E3F 0E5B +0E81 0E82 +0E84 +0E87 0E88 +0E8A +0E8D +0E94 0E97 +0E99 0E9F +0EA1 0EA3 +0EA5 +0EA7 +0EAA 0EAB +0EAD 0EB9 +0EBB 0EBD +0EC0 0EC4 +0EC6 +0EC8 0ECD +0ED0 0ED9 +0EDC 0EDD +0F00 0F47 +0F49 0F6A +0F71 0F8B +0F90 0F97 +0F99 0FBC +0FBE 0FCC +0FCF 0FD1 +1000 1021 +1023 1027 +1029 102A +102C 1032 +1036 1039 +1040 1059 +10A0 10C5 +10D0 10FC +1160 11A2 +11A8 11F9 +1200 1248 +124A 124D +1250 1256 +1258 +125A 125D +1260 1288 +128A 128D +1290 12B0 +12B2 12B5 +12B8 12BE +12C0 +12C2 12C5 +12C8 12D6 +12D8 1310 +1312 1315 +1318 135A +135F 137C +1380 1399 +13A0 13F4 +1401 1676 +1680 169C +16A0 16F0 +1700 170C +170E 1714 +1720 1736 +1740 1753 +1760 176C +176E 1770 +1772 1773 +1780 17DD +17E0 17E9 +17F0 17F9 +1800 180E +1810 1819 +1820 1877 +1880 18A9 +1900 191C +1920 192B +1930 193B +1940 +1944 196D +1970 1974 +1980 19A9 +19B0 19C9 +19D0 19D9 +19DE 1A1B +1A1E 1A1F +1D00 1DC3 +1E00 1E9B +1EA0 1EF9 +1F00 1F15 +1F18 1F1D +1F20 1F45 +1F48 1F4D +1F50 1F57 +1F59 +1F5B +1F5D +1F5F 1F7D +1F80 1FB4 +1FB6 1FC4 +1FC6 1FD3 +1FD6 1FDB +1FDD 1FEF +1FF2 1FF4 +1FF6 1FFE +2000 200F +2011 2012 +2017 +201A 201B +201E 201F +2023 +2028 202F +2031 +2034 +2036 203A +203C 203D +203F 2063 +206A 2071 +2075 207E +2080 +2085 208E +2090 2094 +20A0 20A8 +20AA 20AB +20AD 20B5 +20D0 20EB +2100 2102 +2104 +2106 2108 +210A 2112 +2114 2115 +2117 2120 +2123 2125 +2127 212A +212C 214C +2155 215A +215F +216C 216F +217A 2183 +219A 21B7 +21BA 21D1 +21D3 +21D5 21E6 +21E8 21FF +2201 +2204 2206 +2209 220A +220C 220E +2210 +2212 2214 +2216 2219 +221B 221C +2221 2222 +2224 +2226 +222D +222F 2233 +2238 223B +223E 2247 +2249 224B +224D 2251 +2253 225F +2262 2263 +2268 2269 +226C 226D +2270 2281 +2284 2285 +2288 2294 +2296 2298 +229A 22A4 +22A6 22BE +22C0 2311 +2313 2328 +232B 23DB +2400 2426 +2440 244A +24EA +254C 254F +2574 257F +2590 2591 +2596 259F +25A2 +25AA 25B1 +25B4 25B5 +25B8 25BB +25BE 25BF +25C2 25C5 +25C9 25CA +25CC 25CD +25D2 25E1 +25E6 25EE +25F0 2604 +2607 2608 +260A 260D +2610 2613 +2616 261B +261D +261F 263F +2641 +2643 265F +2662 +2666 +266B +266E +2670 269C +26A0 26B1 +2701 2704 +2706 2709 +270C 2727 +2729 273C +273E 274B +274D +274F 2752 +2756 +2758 275E +2761 2775 +2780 2794 +2798 27AF +27B1 27BE +27C0 27C6 +27D0 27E5 +27F0 2984 +2987 2B13 +2C00 2C2E +2C30 2C5E +2C80 2CEA +2CF9 2D25 +2D30 2D65 +2D6F +2D80 2D96 +2DA0 2DA6 +2DA8 2DAE +2DB0 2DB6 +2DB8 2DBE +2DC0 2DC6 +2DC8 2DCE +2DD0 2DD6 +2DD8 2DDE +2E00 2E17 +2E1C 2E1D +303F +4DC0 4DFF +A700 A716 +A800 A82B +D800 DFFF +FB00 FB06 +FB13 FB17 +FB1D FB36 +FB38 FB3C +FB3E +FB40 FB41 +FB43 FB44 +FB46 FBB1 +FBD3 FD3F +FD50 FD8F +FD92 FDC7 +FDF0 FDFD +FE20 FE23 +FE70 FE74 +FE76 FEFC +FEFF +FFF9 FFFC +10000 1000B +1000D 10026 +10028 1003A +1003C 1003D +1003F 1004D +10050 1005D +10080 100FA +10100 10102 +10107 10133 +10137 1018A +10300 1031E +10320 10323 +10330 1034A +10380 1039D +1039F 103C3 +103C8 103D5 +10400 1049D +104A0 104A9 +10800 10805 +10808 +1080A 10835 +10837 10838 +1083C +1083F +10A00 10A03 +10A05 10A06 +10A0C 10A13 +10A15 10A17 +10A19 10A33 +10A38 10A3A +10A3F 10A47 +10A50 10A58 +1D000 1D0F5 +1D100 1D126 +1D12A 1D1DD +1D200 1D245 +1D300 1D356 +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A5 +1D6A8 1D7C9 +1D7CE 1D7FF +E0001 +E0020 E007F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/Na.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/Na.pl new file mode 100644 index 00000000000..3e74768687b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/Na.pl @@ -0,0 +1,16 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# EastAsianWidth category 'Narrow' +# +return <<'END'; +0020 007E +00A2 00A3 +00A5 00A6 +00AC +00AF +27E6 27EB +2985 2986 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/W.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/W.pl new file mode 100644 index 00000000000..5976941c199 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/ea/W.pl @@ -0,0 +1,40 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# EastAsianWidth category 'Wide' +# +return <<'END'; +1100 1159 +115F +2329 232A +2E80 2E99 +2E9B 2EF3 +2F00 2FD5 +2FF0 2FFB +3001 303E +3041 3096 +3099 30FF +3105 312C +3131 318E +3190 31B7 +31C0 31CF +31F0 321E +3220 3243 +3250 32FE +3300 4DB5 +4E00 9FBB +A000 A48C +A490 A4C6 +AC00 D7A3 +F900 FA2D +FA30 FA6A +FA70 FAD9 +FE10 FE19 +FE30 FE52 +FE54 FE66 +FE68 FE6B +20000 2FFFD +30000 3FFFD +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/AHex.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/AHex.pl new file mode 100644 index 00000000000..917392baafc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/AHex.pl @@ -0,0 +1,12 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'ASCII_Hex_Digit' +# +return <<'END'; +0030 0039 ASCII_Hex_Digit +0041 0046 ASCII_Hex_Digit +0061 0066 ASCII_Hex_Digit +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/ASCII.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/ASCII.pl new file mode 100644 index 00000000000..dc7db1e1773 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/ASCII.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{ASCII} +# +# Meaning: [[:ASCII:]] +# +return <<'END'; +0000 007F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Alnum.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Alnum.pl new file mode 100644 index 00000000000..58176b0bb58 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Alnum.pl @@ -0,0 +1,448 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Alnum} +# +# Meaning: [[:Alnum:]] +# +return <<'END'; +0030 0039 +0041 005A +0061 007A +00AA +00B5 +00BA +00C0 00D6 +00D8 00F6 +00F8 0241 +0250 02C1 +02C6 02D1 +02E0 02E4 +02EE +0300 036F +037A +0386 +0388 038A +038C +038E 03A1 +03A3 03CE +03D0 03F5 +03F7 0481 +0483 0486 +0488 04CE +04D0 04F9 +0500 050F +0531 0556 +0559 +0561 0587 +0591 05B9 +05BB 05BD +05BF +05C1 05C2 +05C4 05C5 +05C7 +05D0 05EA +05F0 05F2 +0610 0615 +0621 063A +0640 065E +0660 0669 +066E 06D3 +06D5 06DC +06DE 06E8 +06EA 06FC +06FF +0710 074A +074D 076D +0780 07B1 +0901 0939 +093C 094D +0950 0954 +0958 0963 +0966 096F +097D +0981 0983 +0985 098C +098F 0990 +0993 09A8 +09AA 09B0 +09B2 +09B6 09B9 +09BC 09C4 +09C7 09C8 +09CB 09CE +09D7 +09DC 09DD +09DF 09E3 +09E6 09F1 +0A01 0A03 +0A05 0A0A +0A0F 0A10 +0A13 0A28 +0A2A 0A30 +0A32 0A33 +0A35 0A36 +0A38 0A39 +0A3C +0A3E 0A42 +0A47 0A48 +0A4B 0A4D +0A59 0A5C +0A5E +0A66 0A74 +0A81 0A83 +0A85 0A8D +0A8F 0A91 +0A93 0AA8 +0AAA 0AB0 +0AB2 0AB3 +0AB5 0AB9 +0ABC 0AC5 +0AC7 0AC9 +0ACB 0ACD +0AD0 +0AE0 0AE3 +0AE6 0AEF +0B01 0B03 +0B05 0B0C +0B0F 0B10 +0B13 0B28 +0B2A 0B30 +0B32 0B33 +0B35 0B39 +0B3C 0B43 +0B47 0B48 +0B4B 0B4D +0B56 0B57 +0B5C 0B5D +0B5F 0B61 +0B66 0B6F +0B71 +0B82 0B83 +0B85 0B8A +0B8E 0B90 +0B92 0B95 +0B99 0B9A +0B9C +0B9E 0B9F +0BA3 0BA4 +0BA8 0BAA +0BAE 0BB9 +0BBE 0BC2 +0BC6 0BC8 +0BCA 0BCD +0BD7 +0BE6 0BEF +0C01 0C03 +0C05 0C0C +0C0E 0C10 +0C12 0C28 +0C2A 0C33 +0C35 0C39 +0C3E 0C44 +0C46 0C48 +0C4A 0C4D +0C55 0C56 +0C60 0C61 +0C66 0C6F +0C82 0C83 +0C85 0C8C +0C8E 0C90 +0C92 0CA8 +0CAA 0CB3 +0CB5 0CB9 +0CBC 0CC4 +0CC6 0CC8 +0CCA 0CCD +0CD5 0CD6 +0CDE +0CE0 0CE1 +0CE6 0CEF +0D02 0D03 +0D05 0D0C +0D0E 0D10 +0D12 0D28 +0D2A 0D39 +0D3E 0D43 +0D46 0D48 +0D4A 0D4D +0D57 +0D60 0D61 +0D66 0D6F +0D82 0D83 +0D85 0D96 +0D9A 0DB1 +0DB3 0DBB +0DBD +0DC0 0DC6 +0DCA +0DCF 0DD4 +0DD6 +0DD8 0DDF +0DF2 0DF3 +0E01 0E3A +0E40 0E4E +0E50 0E59 +0E81 0E82 +0E84 +0E87 0E88 +0E8A +0E8D +0E94 0E97 +0E99 0E9F +0EA1 0EA3 +0EA5 +0EA7 +0EAA 0EAB +0EAD 0EB9 +0EBB 0EBD +0EC0 0EC4 +0EC6 +0EC8 0ECD +0ED0 0ED9 +0EDC 0EDD +0F00 +0F18 0F19 +0F20 0F29 +0F35 +0F37 +0F39 +0F3E 0F47 +0F49 0F6A +0F71 0F84 +0F86 0F8B +0F90 0F97 +0F99 0FBC +0FC6 +1000 1021 +1023 1027 +1029 102A +102C 1032 +1036 1039 +1040 1049 +1050 1059 +10A0 10C5 +10D0 10FA +10FC +1100 1159 +115F 11A2 +11A8 11F9 +1200 1248 +124A 124D +1250 1256 +1258 +125A 125D +1260 1288 +128A 128D +1290 12B0 +12B2 12B5 +12B8 12BE +12C0 +12C2 12C5 +12C8 12D6 +12D8 1310 +1312 1315 +1318 135A +135F +1380 138F +13A0 13F4 +1401 166C +166F 1676 +1681 169A +16A0 16EA +1700 170C +170E 1714 +1720 1734 +1740 1753 +1760 176C +176E 1770 +1772 1773 +1780 17B3 +17B6 17D3 +17D7 +17DC 17DD +17E0 17E9 +180B 180D +1810 1819 +1820 1877 +1880 18A9 +1900 191C +1920 192B +1930 193B +1946 196D +1970 1974 +1980 19A9 +19B0 19C9 +19D0 19D9 +1A00 1A1B +1D00 1DC3 +1E00 1E9B +1EA0 1EF9 +1F00 1F15 +1F18 1F1D +1F20 1F45 +1F48 1F4D +1F50 1F57 +1F59 +1F5B +1F5D +1F5F 1F7D +1F80 1FB4 +1FB6 1FBC +1FBE +1FC2 1FC4 +1FC6 1FCC +1FD0 1FD3 +1FD6 1FDB +1FE0 1FEC +1FF2 1FF4 +1FF6 1FFC +2071 +207F +2090 2094 +20D0 20EB +2102 +2107 +210A 2113 +2115 +2119 211D +2124 +2126 +2128 +212A 212D +212F 2131 +2133 2139 +213C 213F +2145 2149 +2C00 2C2E +2C30 2C5E +2C80 2CE4 +2D00 2D25 +2D30 2D65 +2D6F +2D80 2D96 +2DA0 2DA6 +2DA8 2DAE +2DB0 2DB6 +2DB8 2DBE +2DC0 2DC6 +2DC8 2DCE +2DD0 2DD6 +2DD8 2DDE +3005 3006 +302A 302F +3031 3035 +303B 303C +3041 3096 +3099 309A +309D 309F +30A1 30FA +30FC 30FF +3105 312C +3131 318E +31A0 31B7 +31F0 31FF +3400 4DB5 +4E00 9FBB +A000 A48C +A800 A827 +AC00 D7A3 +F900 FA2D +FA30 FA6A +FA70 FAD9 +FB00 FB06 +FB13 FB17 +FB1D FB28 +FB2A FB36 +FB38 FB3C +FB3E +FB40 FB41 +FB43 FB44 +FB46 FBB1 +FBD3 FD3D +FD50 FD8F +FD92 FDC7 +FDF0 FDFB +FE00 FE0F +FE20 FE23 +FE70 FE74 +FE76 FEFC +FF10 FF19 +FF21 FF3A +FF41 FF5A +FF66 FFBE +FFC2 FFC7 +FFCA FFCF +FFD2 FFD7 +FFDA FFDC +10000 1000B +1000D 10026 +10028 1003A +1003C 1003D +1003F 1004D +10050 1005D +10080 100FA +10300 1031E +10330 10349 +10380 1039D +103A0 103C3 +103C8 103CF +10400 1049D +104A0 104A9 +10800 10805 +10808 +1080A 10835 +10837 10838 +1083C +1083F +10A00 10A03 +10A05 10A06 +10A0C 10A13 +10A15 10A17 +10A19 10A33 +10A38 10A3A +10A3F +1D165 1D169 +1D16D 1D172 +1D17B 1D182 +1D185 1D18B +1D1AA 1D1AD +1D242 1D244 +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A5 +1D6A8 1D6C0 +1D6C2 1D6DA +1D6DC 1D6FA +1D6FC 1D714 +1D716 1D734 +1D736 1D74E +1D750 1D76E +1D770 1D788 +1D78A 1D7A8 +1D7AA 1D7C2 +1D7C4 1D7C9 +1D7CE 1D7FF +20000 2A6D6 +2F800 2FA1D +E0100 E01EF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Alpha.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Alpha.pl new file mode 100644 index 00000000000..54a4bda4b05 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Alpha.pl @@ -0,0 +1,430 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Alpha} +# +# Meaning: [[:Alpha:]] +# +return <<'END'; +0041 005A +0061 007A +00AA +00B5 +00BA +00C0 00D6 +00D8 00F6 +00F8 0241 +0250 02C1 +02C6 02D1 +02E0 02E4 +02EE +0300 036F +037A +0386 +0388 038A +038C +038E 03A1 +03A3 03CE +03D0 03F5 +03F7 0481 +0483 0486 +0488 04CE +04D0 04F9 +0500 050F +0531 0556 +0559 +0561 0587 +0591 05B9 +05BB 05BD +05BF +05C1 05C2 +05C4 05C5 +05C7 +05D0 05EA +05F0 05F2 +0610 0615 +0621 063A +0640 065E +066E 06D3 +06D5 06DC +06DE 06E8 +06EA 06EF +06FA 06FC +06FF +0710 074A +074D 076D +0780 07B1 +0901 0939 +093C 094D +0950 0954 +0958 0963 +097D +0981 0983 +0985 098C +098F 0990 +0993 09A8 +09AA 09B0 +09B2 +09B6 09B9 +09BC 09C4 +09C7 09C8 +09CB 09CE +09D7 +09DC 09DD +09DF 09E3 +09F0 09F1 +0A01 0A03 +0A05 0A0A +0A0F 0A10 +0A13 0A28 +0A2A 0A30 +0A32 0A33 +0A35 0A36 +0A38 0A39 +0A3C +0A3E 0A42 +0A47 0A48 +0A4B 0A4D +0A59 0A5C +0A5E +0A70 0A74 +0A81 0A83 +0A85 0A8D +0A8F 0A91 +0A93 0AA8 +0AAA 0AB0 +0AB2 0AB3 +0AB5 0AB9 +0ABC 0AC5 +0AC7 0AC9 +0ACB 0ACD +0AD0 +0AE0 0AE3 +0B01 0B03 +0B05 0B0C +0B0F 0B10 +0B13 0B28 +0B2A 0B30 +0B32 0B33 +0B35 0B39 +0B3C 0B43 +0B47 0B48 +0B4B 0B4D +0B56 0B57 +0B5C 0B5D +0B5F 0B61 +0B71 +0B82 0B83 +0B85 0B8A +0B8E 0B90 +0B92 0B95 +0B99 0B9A +0B9C +0B9E 0B9F +0BA3 0BA4 +0BA8 0BAA +0BAE 0BB9 +0BBE 0BC2 +0BC6 0BC8 +0BCA 0BCD +0BD7 +0C01 0C03 +0C05 0C0C +0C0E 0C10 +0C12 0C28 +0C2A 0C33 +0C35 0C39 +0C3E 0C44 +0C46 0C48 +0C4A 0C4D +0C55 0C56 +0C60 0C61 +0C82 0C83 +0C85 0C8C +0C8E 0C90 +0C92 0CA8 +0CAA 0CB3 +0CB5 0CB9 +0CBC 0CC4 +0CC6 0CC8 +0CCA 0CCD +0CD5 0CD6 +0CDE +0CE0 0CE1 +0D02 0D03 +0D05 0D0C +0D0E 0D10 +0D12 0D28 +0D2A 0D39 +0D3E 0D43 +0D46 0D48 +0D4A 0D4D +0D57 +0D60 0D61 +0D82 0D83 +0D85 0D96 +0D9A 0DB1 +0DB3 0DBB +0DBD +0DC0 0DC6 +0DCA +0DCF 0DD4 +0DD6 +0DD8 0DDF +0DF2 0DF3 +0E01 0E3A +0E40 0E4E +0E81 0E82 +0E84 +0E87 0E88 +0E8A +0E8D +0E94 0E97 +0E99 0E9F +0EA1 0EA3 +0EA5 +0EA7 +0EAA 0EAB +0EAD 0EB9 +0EBB 0EBD +0EC0 0EC4 +0EC6 +0EC8 0ECD +0EDC 0EDD +0F00 +0F18 0F19 +0F35 +0F37 +0F39 +0F3E 0F47 +0F49 0F6A +0F71 0F84 +0F86 0F8B +0F90 0F97 +0F99 0FBC +0FC6 +1000 1021 +1023 1027 +1029 102A +102C 1032 +1036 1039 +1050 1059 +10A0 10C5 +10D0 10FA +10FC +1100 1159 +115F 11A2 +11A8 11F9 +1200 1248 +124A 124D +1250 1256 +1258 +125A 125D +1260 1288 +128A 128D +1290 12B0 +12B2 12B5 +12B8 12BE +12C0 +12C2 12C5 +12C8 12D6 +12D8 1310 +1312 1315 +1318 135A +135F +1380 138F +13A0 13F4 +1401 166C +166F 1676 +1681 169A +16A0 16EA +1700 170C +170E 1714 +1720 1734 +1740 1753 +1760 176C +176E 1770 +1772 1773 +1780 17B3 +17B6 17D3 +17D7 +17DC 17DD +180B 180D +1820 1877 +1880 18A9 +1900 191C +1920 192B +1930 193B +1950 196D +1970 1974 +1980 19A9 +19B0 19C9 +1A00 1A1B +1D00 1DC3 +1E00 1E9B +1EA0 1EF9 +1F00 1F15 +1F18 1F1D +1F20 1F45 +1F48 1F4D +1F50 1F57 +1F59 +1F5B +1F5D +1F5F 1F7D +1F80 1FB4 +1FB6 1FBC +1FBE +1FC2 1FC4 +1FC6 1FCC +1FD0 1FD3 +1FD6 1FDB +1FE0 1FEC +1FF2 1FF4 +1FF6 1FFC +2071 +207F +2090 2094 +20D0 20EB +2102 +2107 +210A 2113 +2115 +2119 211D +2124 +2126 +2128 +212A 212D +212F 2131 +2133 2139 +213C 213F +2145 2149 +2C00 2C2E +2C30 2C5E +2C80 2CE4 +2D00 2D25 +2D30 2D65 +2D6F +2D80 2D96 +2DA0 2DA6 +2DA8 2DAE +2DB0 2DB6 +2DB8 2DBE +2DC0 2DC6 +2DC8 2DCE +2DD0 2DD6 +2DD8 2DDE +3005 3006 +302A 302F +3031 3035 +303B 303C +3041 3096 +3099 309A +309D 309F +30A1 30FA +30FC 30FF +3105 312C +3131 318E +31A0 31B7 +31F0 31FF +3400 4DB5 +4E00 9FBB +A000 A48C +A800 A827 +AC00 D7A3 +F900 FA2D +FA30 FA6A +FA70 FAD9 +FB00 FB06 +FB13 FB17 +FB1D FB28 +FB2A FB36 +FB38 FB3C +FB3E +FB40 FB41 +FB43 FB44 +FB46 FBB1 +FBD3 FD3D +FD50 FD8F +FD92 FDC7 +FDF0 FDFB +FE00 FE0F +FE20 FE23 +FE70 FE74 +FE76 FEFC +FF21 FF3A +FF41 FF5A +FF66 FFBE +FFC2 FFC7 +FFCA FFCF +FFD2 FFD7 +FFDA FFDC +10000 1000B +1000D 10026 +10028 1003A +1003C 1003D +1003F 1004D +10050 1005D +10080 100FA +10300 1031E +10330 10349 +10380 1039D +103A0 103C3 +103C8 103CF +10400 1049D +10800 10805 +10808 +1080A 10835 +10837 10838 +1083C +1083F +10A00 10A03 +10A05 10A06 +10A0C 10A13 +10A15 10A17 +10A19 10A33 +10A38 10A3A +10A3F +1D165 1D169 +1D16D 1D172 +1D17B 1D182 +1D185 1D18B +1D1AA 1D1AD +1D242 1D244 +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A5 +1D6A8 1D6C0 +1D6C2 1D6DA +1D6DC 1D6FA +1D6FC 1D714 +1D716 1D734 +1D736 1D74E +1D750 1D76E +1D770 1D788 +1D78A 1D7A8 +1D7AA 1D7C2 +1D7C4 1D7C9 +20000 2A6D6 +2F800 2FA1D +E0100 E01EF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Alphabet.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Alphabet.pl new file mode 100644 index 00000000000..17b2548e144 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Alphabet.pl @@ -0,0 +1,415 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Alphabetic} (and fuzzy permutations) +# +# Meaning: [\p{L}\p{OtherAlphabetic}] +# +return <<'END'; +0041 005A +0061 007A +00AA +00B5 +00BA +00C0 00D6 +00D8 00F6 +00F8 0241 +0250 02C1 +02C6 02D1 +02E0 02E4 +02EE +0345 +037A +0386 +0388 038A +038C +038E 03A1 +03A3 03CE +03D0 03F5 +03F7 0481 +048A 04CE +04D0 04F9 +0500 050F +0531 0556 +0559 +0561 0587 +05B0 05B9 +05BB 05BD +05BF +05C1 05C2 +05C4 05C5 +05C7 +05D0 05EA +05F0 05F2 +0610 0615 +0621 063A +0640 0657 +0659 065E +066E 06D3 +06D5 06DC +06E1 06E8 +06ED 06EF +06FA 06FC +06FF +0710 073F +074D 076D +0780 07B1 +0901 0939 +093D 094C +0950 +0958 0963 +097D +0981 0983 +0985 098C +098F 0990 +0993 09A8 +09AA 09B0 +09B2 +09B6 09B9 +09BD 09C4 +09C7 09C8 +09CB 09CC +09CE +09D7 +09DC 09DD +09DF 09E3 +09F0 09F1 +0A01 0A03 +0A05 0A0A +0A0F 0A10 +0A13 0A28 +0A2A 0A30 +0A32 0A33 +0A35 0A36 +0A38 0A39 +0A3E 0A42 +0A47 0A48 +0A4B 0A4C +0A59 0A5C +0A5E +0A70 0A74 +0A81 0A83 +0A85 0A8D +0A8F 0A91 +0A93 0AA8 +0AAA 0AB0 +0AB2 0AB3 +0AB5 0AB9 +0ABD 0AC5 +0AC7 0AC9 +0ACB 0ACC +0AD0 +0AE0 0AE3 +0B01 0B03 +0B05 0B0C +0B0F 0B10 +0B13 0B28 +0B2A 0B30 +0B32 0B33 +0B35 0B39 +0B3D 0B43 +0B47 0B48 +0B4B 0B4C +0B56 0B57 +0B5C 0B5D +0B5F 0B61 +0B71 +0B82 0B83 +0B85 0B8A +0B8E 0B90 +0B92 0B95 +0B99 0B9A +0B9C +0B9E 0B9F +0BA3 0BA4 +0BA8 0BAA +0BAE 0BB9 +0BBE 0BC2 +0BC6 0BC8 +0BCA 0BCC +0BD7 +0C01 0C03 +0C05 0C0C +0C0E 0C10 +0C12 0C28 +0C2A 0C33 +0C35 0C39 +0C3E 0C44 +0C46 0C48 +0C4A 0C4C +0C55 0C56 +0C60 0C61 +0C82 0C83 +0C85 0C8C +0C8E 0C90 +0C92 0CA8 +0CAA 0CB3 +0CB5 0CB9 +0CBD 0CC4 +0CC6 0CC8 +0CCA 0CCC +0CD5 0CD6 +0CDE +0CE0 0CE1 +0D02 0D03 +0D05 0D0C +0D0E 0D10 +0D12 0D28 +0D2A 0D39 +0D3E 0D43 +0D46 0D48 +0D4A 0D4C +0D57 +0D60 0D61 +0D82 0D83 +0D85 0D96 +0D9A 0DB1 +0DB3 0DBB +0DBD +0DC0 0DC6 +0DCF 0DD4 +0DD6 +0DD8 0DDF +0DF2 0DF3 +0E01 0E3A +0E40 0E46 +0E4D +0E81 0E82 +0E84 +0E87 0E88 +0E8A +0E8D +0E94 0E97 +0E99 0E9F +0EA1 0EA3 +0EA5 +0EA7 +0EAA 0EAB +0EAD 0EB9 +0EBB 0EBD +0EC0 0EC4 +0EC6 +0ECD +0EDC 0EDD +0F00 +0F40 0F47 +0F49 0F6A +0F71 0F81 +0F88 0F8B +0F90 0F97 +0F99 0FBC +1000 1021 +1023 1027 +1029 102A +102C 1032 +1036 +1038 +1050 1059 +10A0 10C5 +10D0 10FA +10FC +1100 1159 +115F 11A2 +11A8 11F9 +1200 1248 +124A 124D +1250 1256 +1258 +125A 125D +1260 1288 +128A 128D +1290 12B0 +12B2 12B5 +12B8 12BE +12C0 +12C2 12C5 +12C8 12D6 +12D8 1310 +1312 1315 +1318 135A +135F +1380 138F +13A0 13F4 +1401 166C +166F 1676 +1681 169A +16A0 16EA +1700 170C +170E 1713 +1720 1733 +1740 1753 +1760 176C +176E 1770 +1772 1773 +1780 17B3 +17B6 17C8 +17D7 +17DC +1820 1877 +1880 18A9 +1900 191C +1920 192B +1930 1938 +1950 196D +1970 1974 +1980 19A9 +19B0 19C9 +1A00 1A1B +1D00 1DBF +1E00 1E9B +1EA0 1EF9 +1F00 1F15 +1F18 1F1D +1F20 1F45 +1F48 1F4D +1F50 1F57 +1F59 +1F5B +1F5D +1F5F 1F7D +1F80 1FB4 +1FB6 1FBC +1FBE +1FC2 1FC4 +1FC6 1FCC +1FD0 1FD3 +1FD6 1FDB +1FE0 1FEC +1FF2 1FF4 +1FF6 1FFC +2071 +207F +2090 2094 +2102 +2107 +210A 2113 +2115 +2119 211D +2124 +2126 +2128 +212A 212D +212F 2131 +2133 2139 +213C 213F +2145 2149 +24B6 24E9 +2C00 2C2E +2C30 2C5E +2C80 2CE4 +2D00 2D25 +2D30 2D65 +2D6F +2D80 2D96 +2DA0 2DA6 +2DA8 2DAE +2DB0 2DB6 +2DB8 2DBE +2DC0 2DC6 +2DC8 2DCE +2DD0 2DD6 +2DD8 2DDE +3005 3006 +3031 3035 +303B 303C +3041 3096 +309D 309F +30A1 30FA +30FC 30FF +3105 312C +3131 318E +31A0 31B7 +31F0 31FF +3400 4DB5 +4E00 9FBB +A000 A48C +A800 A801 +A803 A805 +A807 A80A +A80C A827 +AC00 D7A3 +F900 FA2D +FA30 FA6A +FA70 FAD9 +FB00 FB06 +FB13 FB17 +FB1D FB28 +FB2A FB36 +FB38 FB3C +FB3E +FB40 FB41 +FB43 FB44 +FB46 FBB1 +FBD3 FD3D +FD50 FD8F +FD92 FDC7 +FDF0 FDFB +FE70 FE74 +FE76 FEFC +FF21 FF3A +FF41 FF5A +FF66 FFBE +FFC2 FFC7 +FFCA FFCF +FFD2 FFD7 +FFDA FFDC +10000 1000B +1000D 10026 +10028 1003A +1003C 1003D +1003F 1004D +10050 1005D +10080 100FA +10300 1031E +10330 10349 +10380 1039D +103A0 103C3 +103C8 103CF +10400 1049D +10800 10805 +10808 +1080A 10835 +10837 10838 +1083C +1083F +10A00 10A03 +10A05 10A06 +10A0C 10A13 +10A15 10A17 +10A19 10A33 +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A5 +1D6A8 1D6C0 +1D6C2 1D6DA +1D6DC 1D6FA +1D6FC 1D714 +1D716 1D734 +1D736 1D74E +1D750 1D76E +1D770 1D788 +1D78A 1D7A8 +1D7AA 1D7C2 +1D7C4 1D7C9 +20000 2A6D6 +2F800 2FA1D +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Any.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Any.pl new file mode 100644 index 00000000000..f98cd73ced4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Any.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Any} +# \p{Any} +# +# Meaning: [\x{0000}-\x{10FFFF}] +# +return <<'END'; +0000 10FFFF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Arab.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Arab.pl new file mode 100644 index 00000000000..ed9ebd5c069 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Arab.pl @@ -0,0 +1,29 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Arabic} (and fuzzy permutations) +# +# Meaning: Script 'Arabic' +# +return <<'END'; +060B Arabic +060D 0615 Arabic +061E Arabic +0621 063A Arabic +0641 064A Arabic +0656 065E Arabic +066A 066F Arabic +0671 06DC Arabic +06DE 06FF Arabic +0750 076D Arabic +FB50 FBB1 Arabic +FBD3 FD3D Arabic +FD50 FD8F Arabic +FD92 FDC7 Arabic +FDF0 FDFC Arabic +FE70 FE74 Arabic +FE76 FEFC Arabic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Armn.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Armn.pl new file mode 100644 index 00000000000..0aa98b8de20 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Armn.pl @@ -0,0 +1,17 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Armenian} (and fuzzy permutations) +# +# Meaning: Script 'Armenian' +# +return <<'END'; +0531 0556 Armenian +0559 055F Armenian +0561 0587 Armenian +058A Armenian +FB13 FB17 Armenian +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/AsciiHex.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/AsciiHex.pl new file mode 100644 index 00000000000..be2637d80ed --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/AsciiHex.pl @@ -0,0 +1,15 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{AsciiHexDigit} (and fuzzy permutations) +# +# Meaning: Extended property 'ASCII_Hex_Digit' +# +return <<'END'; +0030 0039 ASCII_Hex_Digit +0041 0046 ASCII_Hex_Digit +0061 0066 ASCII_Hex_Digit +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Assigned.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Assigned.pl new file mode 100644 index 00000000000..66a7c540201 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Assigned.pl @@ -0,0 +1,432 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Assigned} +# +# Meaning: All assigned code points +# +return <<'END'; +0000 0241 +0250 036F +0374 0375 +037A +037E +0384 038A +038C +038E 03A1 +03A3 03CE +03D0 0486 +0488 04CE +04D0 04F9 +0500 050F +0531 0556 +0559 055F +0561 0587 +0589 058A +0591 05B9 +05BB 05C7 +05D0 05EA +05F0 05F4 +0600 0603 +060B 0615 +061B +061E 061F +0621 063A +0640 065E +0660 070D +070F 074A +074D 076D +0780 07B1 +0901 0939 +093C 094D +0950 0954 +0958 0970 +097D +0981 0983 +0985 098C +098F 0990 +0993 09A8 +09AA 09B0 +09B2 +09B6 09B9 +09BC 09C4 +09C7 09C8 +09CB 09CE +09D7 +09DC 09DD +09DF 09E3 +09E6 09FA +0A01 0A03 +0A05 0A0A +0A0F 0A10 +0A13 0A28 +0A2A 0A30 +0A32 0A33 +0A35 0A36 +0A38 0A39 +0A3C +0A3E 0A42 +0A47 0A48 +0A4B 0A4D +0A59 0A5C +0A5E +0A66 0A74 +0A81 0A83 +0A85 0A8D +0A8F 0A91 +0A93 0AA8 +0AAA 0AB0 +0AB2 0AB3 +0AB5 0AB9 +0ABC 0AC5 +0AC7 0AC9 +0ACB 0ACD +0AD0 +0AE0 0AE3 +0AE6 0AEF +0AF1 +0B01 0B03 +0B05 0B0C +0B0F 0B10 +0B13 0B28 +0B2A 0B30 +0B32 0B33 +0B35 0B39 +0B3C 0B43 +0B47 0B48 +0B4B 0B4D +0B56 0B57 +0B5C 0B5D +0B5F 0B61 +0B66 0B71 +0B82 0B83 +0B85 0B8A +0B8E 0B90 +0B92 0B95 +0B99 0B9A +0B9C +0B9E 0B9F +0BA3 0BA4 +0BA8 0BAA +0BAE 0BB9 +0BBE 0BC2 +0BC6 0BC8 +0BCA 0BCD +0BD7 +0BE6 0BFA +0C01 0C03 +0C05 0C0C +0C0E 0C10 +0C12 0C28 +0C2A 0C33 +0C35 0C39 +0C3E 0C44 +0C46 0C48 +0C4A 0C4D +0C55 0C56 +0C60 0C61 +0C66 0C6F +0C82 0C83 +0C85 0C8C +0C8E 0C90 +0C92 0CA8 +0CAA 0CB3 +0CB5 0CB9 +0CBC 0CC4 +0CC6 0CC8 +0CCA 0CCD +0CD5 0CD6 +0CDE +0CE0 0CE1 +0CE6 0CEF +0D02 0D03 +0D05 0D0C +0D0E 0D10 +0D12 0D28 +0D2A 0D39 +0D3E 0D43 +0D46 0D48 +0D4A 0D4D +0D57 +0D60 0D61 +0D66 0D6F +0D82 0D83 +0D85 0D96 +0D9A 0DB1 +0DB3 0DBB +0DBD +0DC0 0DC6 +0DCA +0DCF 0DD4 +0DD6 +0DD8 0DDF +0DF2 0DF4 +0E01 0E3A +0E3F 0E5B +0E81 0E82 +0E84 +0E87 0E88 +0E8A +0E8D +0E94 0E97 +0E99 0E9F +0EA1 0EA3 +0EA5 +0EA7 +0EAA 0EAB +0EAD 0EB9 +0EBB 0EBD +0EC0 0EC4 +0EC6 +0EC8 0ECD +0ED0 0ED9 +0EDC 0EDD +0F00 0F47 +0F49 0F6A +0F71 0F8B +0F90 0F97 +0F99 0FBC +0FBE 0FCC +0FCF 0FD1 +1000 1021 +1023 1027 +1029 102A +102C 1032 +1036 1039 +1040 1059 +10A0 10C5 +10D0 10FC +1100 1159 +115F 11A2 +11A8 11F9 +1200 1248 +124A 124D +1250 1256 +1258 +125A 125D +1260 1288 +128A 128D +1290 12B0 +12B2 12B5 +12B8 12BE +12C0 +12C2 12C5 +12C8 12D6 +12D8 1310 +1312 1315 +1318 135A +135F 137C +1380 1399 +13A0 13F4 +1401 1676 +1680 169C +16A0 16F0 +1700 170C +170E 1714 +1720 1736 +1740 1753 +1760 176C +176E 1770 +1772 1773 +1780 17DD +17E0 17E9 +17F0 17F9 +1800 180E +1810 1819 +1820 1877 +1880 18A9 +1900 191C +1920 192B +1930 193B +1940 +1944 196D +1970 1974 +1980 19A9 +19B0 19C9 +19D0 19D9 +19DE 1A1B +1A1E 1A1F +1D00 1DC3 +1E00 1E9B +1EA0 1EF9 +1F00 1F15 +1F18 1F1D +1F20 1F45 +1F48 1F4D +1F50 1F57 +1F59 +1F5B +1F5D +1F5F 1F7D +1F80 1FB4 +1FB6 1FC4 +1FC6 1FD3 +1FD6 1FDB +1FDD 1FEF +1FF2 1FF4 +1FF6 1FFE +2000 2063 +206A 2071 +2074 208E +2090 2094 +20A0 20B5 +20D0 20EB +2100 214C +2153 2183 +2190 23DB +2400 2426 +2440 244A +2460 269C +26A0 26B1 +2701 2704 +2706 2709 +270C 2727 +2729 274B +274D +274F 2752 +2756 +2758 275E +2761 2794 +2798 27AF +27B1 27BE +27C0 27C6 +27D0 27EB +27F0 2B13 +2C00 2C2E +2C30 2C5E +2C80 2CEA +2CF9 2D25 +2D30 2D65 +2D6F +2D80 2D96 +2DA0 2DA6 +2DA8 2DAE +2DB0 2DB6 +2DB8 2DBE +2DC0 2DC6 +2DC8 2DCE +2DD0 2DD6 +2DD8 2DDE +2E00 2E17 +2E1C 2E1D +2E80 2E99 +2E9B 2EF3 +2F00 2FD5 +2FF0 2FFB +3000 303F +3041 3096 +3099 30FF +3105 312C +3131 318E +3190 31B7 +31C0 31CF +31F0 321E +3220 3243 +3250 32FE +3300 4DB5 +4DC0 9FBB +A000 A48C +A490 A4C6 +A700 A716 +A800 A82B +AC00 D7A3 +D800 FA2D +FA30 FA6A +FA70 FAD9 +FB00 FB06 +FB13 FB17 +FB1D FB36 +FB38 FB3C +FB3E +FB40 FB41 +FB43 FB44 +FB46 FBB1 +FBD3 FD3F +FD50 FD8F +FD92 FDC7 +FDF0 FDFD +FE00 FE19 +FE20 FE23 +FE30 FE52 +FE54 FE66 +FE68 FE6B +FE70 FE74 +FE76 FEFC +FEFF +FF01 FFBE +FFC2 FFC7 +FFCA FFCF +FFD2 FFD7 +FFDA FFDC +FFE0 FFE6 +FFE8 FFEE +FFF9 FFFD +10000 1000B +1000D 10026 +10028 1003A +1003C 1003D +1003F 1004D +10050 1005D +10080 100FA +10100 10102 +10107 10133 +10137 1018A +10300 1031E +10320 10323 +10330 1034A +10380 1039D +1039F 103C3 +103C8 103D5 +10400 1049D +104A0 104A9 +10800 10805 +10808 +1080A 10835 +10837 10838 +1083C +1083F +10A00 10A03 +10A05 10A06 +10A0C 10A13 +10A15 10A17 +10A19 10A33 +10A38 10A3A +10A3F 10A47 +10A50 10A58 +1D000 1D0F5 +1D100 1D126 +1D12A 1D1DD +1D200 1D245 +1D300 1D356 +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A5 +1D6A8 1D7C9 +1D7CE 1D7FF +20000 2A6D6 +2F800 2FA1D +E0001 +E0020 E007F +E0100 E01EF +F0000 FFFFD +100000 10FFFD +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Beng.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Beng.pl new file mode 100644 index 00000000000..2df6a3ccfa4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Beng.pl @@ -0,0 +1,26 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Bengali} (and fuzzy permutations) +# +# Meaning: Script 'Bengali' +# +return <<'END'; +0981 0983 Bengali +0985 098C Bengali +098F 0990 Bengali +0993 09A8 Bengali +09AA 09B0 Bengali +09B2 Bengali +09B6 09B9 Bengali +09BC 09C4 Bengali +09C7 09C8 Bengali +09CB 09CE Bengali +09D7 Bengali +09DC 09DD Bengali +09DF 09E3 Bengali +09E6 09FA Bengali +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/BidiC.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/BidiC.pl new file mode 100644 index 00000000000..634625fc6f2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/BidiC.pl @@ -0,0 +1,11 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Bidi_Control' +# +return <<'END'; +200E 200F Bidi_Control +202A 202E Bidi_Control +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/BidiCont.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/BidiCont.pl new file mode 100644 index 00000000000..7f51ac42b26 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/BidiCont.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{BidiControl} (and fuzzy permutations) +# +# Meaning: Extended property 'Bidi_Control' +# +return <<'END'; +200E 200F Bidi_Control +202A 202E Bidi_Control +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Blank.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Blank.pl new file mode 100644 index 00000000000..6d8519ac41c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Blank.pl @@ -0,0 +1,21 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Blank} +# +# Meaning: [[:Blank:]] +# +return <<'END'; +0009 +0020 +00A0 +1680 +180E +2000 200A +202F +205F +3000 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Bopo.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Bopo.pl new file mode 100644 index 00000000000..955e0c99a2d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Bopo.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Bopomofo} (and fuzzy permutations) +# +# Meaning: Script 'Bopomofo' +# +return <<'END'; +3105 312C Bopomofo +31A0 31B7 Bopomofo +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Brai.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Brai.pl new file mode 100644 index 00000000000..368ded7e411 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Brai.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Braille} (and fuzzy permutations) +# +# Meaning: Script 'Braille' +# +return <<'END'; +2800 28FF Braille +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Bugi.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Bugi.pl new file mode 100644 index 00000000000..41957df22fe --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Bugi.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Buginese} (and fuzzy permutations) +# +# Meaning: Script 'Buginese' +# +return <<'END'; +1A00 1A1B Buginese +1A1E 1A1F Buginese +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Buhd.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Buhd.pl new file mode 100644 index 00000000000..47e8b1f6134 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Buhd.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Buhid} (and fuzzy permutations) +# +# Meaning: Script 'Buhid' +# +return <<'END'; +1740 1753 Buhid +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/C.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/C.pl new file mode 100644 index 00000000000..9d6c14681d9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/C.pl @@ -0,0 +1,435 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{C} +# \p{C} (and fuzzy permutations) +# +# Meaning: Major Category 'C' +# +return <<'END'; +0000 001F +007F 009F +00AD +0242 024F +0370 0373 +0376 0379 +037B 037D +037F 0383 +038B +038D +03A2 +03CF +0487 +04CF +04FA 04FF +0510 0530 +0557 0558 +0560 +0588 +058B 0590 +05BA +05C8 05CF +05EB 05EF +05F5 060A +0616 061A +061C 061D +0620 +063B 063F +065F +06DD +070E 070F +074B 074C +076E 077F +07B2 0900 +093A 093B +094E 094F +0955 0957 +0971 097C +097E 0980 +0984 +098D 098E +0991 0992 +09A9 +09B1 +09B3 09B5 +09BA 09BB +09C5 09C6 +09C9 09CA +09CF 09D6 +09D8 09DB +09DE +09E4 09E5 +09FB 0A00 +0A04 +0A0B 0A0E +0A11 0A12 +0A29 +0A31 +0A34 +0A37 +0A3A 0A3B +0A3D +0A43 0A46 +0A49 0A4A +0A4E 0A58 +0A5D +0A5F 0A65 +0A75 0A80 +0A84 +0A8E +0A92 +0AA9 +0AB1 +0AB4 +0ABA 0ABB +0AC6 +0ACA +0ACE 0ACF +0AD1 0ADF +0AE4 0AE5 +0AF0 +0AF2 0B00 +0B04 +0B0D 0B0E +0B11 0B12 +0B29 +0B31 +0B34 +0B3A 0B3B +0B44 0B46 +0B49 0B4A +0B4E 0B55 +0B58 0B5B +0B5E +0B62 0B65 +0B72 0B81 +0B84 +0B8B 0B8D +0B91 +0B96 0B98 +0B9B +0B9D +0BA0 0BA2 +0BA5 0BA7 +0BAB 0BAD +0BBA 0BBD +0BC3 0BC5 +0BC9 +0BCE 0BD6 +0BD8 0BE5 +0BFB 0C00 +0C04 +0C0D +0C11 +0C29 +0C34 +0C3A 0C3D +0C45 +0C49 +0C4E 0C54 +0C57 0C5F +0C62 0C65 +0C70 0C81 +0C84 +0C8D +0C91 +0CA9 +0CB4 +0CBA 0CBB +0CC5 +0CC9 +0CCE 0CD4 +0CD7 0CDD +0CDF +0CE2 0CE5 +0CF0 0D01 +0D04 +0D0D +0D11 +0D29 +0D3A 0D3D +0D44 0D45 +0D49 +0D4E 0D56 +0D58 0D5F +0D62 0D65 +0D70 0D81 +0D84 +0D97 0D99 +0DB2 +0DBC +0DBE 0DBF +0DC7 0DC9 +0DCB 0DCE +0DD5 +0DD7 +0DE0 0DF1 +0DF5 0E00 +0E3B 0E3E +0E5C 0E80 +0E83 +0E85 0E86 +0E89 +0E8B 0E8C +0E8E 0E93 +0E98 +0EA0 +0EA4 +0EA6 +0EA8 0EA9 +0EAC +0EBA +0EBE 0EBF +0EC5 +0EC7 +0ECE 0ECF +0EDA 0EDB +0EDE 0EFF +0F48 +0F6B 0F70 +0F8C 0F8F +0F98 +0FBD +0FCD 0FCE +0FD2 0FFF +1022 +1028 +102B +1033 1035 +103A 103F +105A 109F +10C6 10CF +10FD 10FF +115A 115E +11A3 11A7 +11FA 11FF +1249 +124E 124F +1257 +1259 +125E 125F +1289 +128E 128F +12B1 +12B6 12B7 +12BF +12C1 +12C6 12C7 +12D7 +1311 +1316 1317 +135B 135E +137D 137F +139A 139F +13F5 1400 +1677 167F +169D 169F +16F1 16FF +170D +1715 171F +1737 173F +1754 175F +176D +1771 +1774 177F +17B4 17B5 +17DE 17DF +17EA 17EF +17FA 17FF +180F +181A 181F +1878 187F +18AA 18FF +191D 191F +192C 192F +193C 193F +1941 1943 +196E 196F +1975 197F +19AA 19AF +19CA 19CF +19DA 19DD +1A1C 1A1D +1A20 1CFF +1DC4 1DFF +1E9C 1E9F +1EFA 1EFF +1F16 1F17 +1F1E 1F1F +1F46 1F47 +1F4E 1F4F +1F58 +1F5A +1F5C +1F5E +1F7E 1F7F +1FB5 +1FC5 +1FD4 1FD5 +1FDC +1FF0 1FF1 +1FF5 +1FFF +200B 200F +202A 202E +2060 206F +2072 2073 +208F +2095 209F +20B6 20CF +20EC 20FF +214D 2152 +2184 218F +23DC 23FF +2427 243F +244B 245F +269D 269F +26B2 2700 +2705 +270A 270B +2728 +274C +274E +2753 2755 +2757 +275F 2760 +2795 2797 +27B0 +27BF +27C7 27CF +27EC 27EF +2B14 2BFF +2C2F +2C5F 2C7F +2CEB 2CF8 +2D26 2D2F +2D66 2D6E +2D70 2D7F +2D97 2D9F +2DA7 +2DAF +2DB7 +2DBF +2DC7 +2DCF +2DD7 +2DDF 2DFF +2E18 2E1B +2E1E 2E7F +2E9A +2EF4 2EFF +2FD6 2FEF +2FFC 2FFF +3040 +3097 3098 +3100 3104 +312D 3130 +318F +31B8 31BF +31D0 31EF +321F +3244 324F +32FF +4DB6 4DBF +9FBC 9FFF +A48D A48F +A4C7 A6FF +A717 A7FF +A82C ABFF +D7A4 F8FF +FA2E FA2F +FA6B FA6F +FADA FAFF +FB07 FB12 +FB18 FB1C +FB37 +FB3D +FB3F +FB42 +FB45 +FBB2 FBD2 +FD40 FD4F +FD90 FD91 +FDC8 FDEF +FDFE FDFF +FE1A FE1F +FE24 FE2F +FE53 +FE67 +FE6C FE6F +FE75 +FEFD FF00 +FFBF FFC1 +FFC8 FFC9 +FFD0 FFD1 +FFD8 FFD9 +FFDD FFDF +FFE7 +FFEF FFFB +FFFE FFFF +1000C +10027 +1003B +1003E +1004E 1004F +1005E 1007F +100FB 100FF +10103 10106 +10134 10136 +1018B 102FF +1031F +10324 1032F +1034B 1037F +1039E +103C4 103C7 +103D6 103FF +1049E 1049F +104AA 107FF +10806 10807 +10809 +10836 +10839 1083B +1083D 1083E +10840 109FF +10A04 +10A07 10A0B +10A14 +10A18 +10A34 10A37 +10A3B 10A3E +10A48 10A4F +10A59 1CFFF +1D0F6 1D0FF +1D127 1D129 +1D173 1D17A +1D1DE 1D1FF +1D246 1D2FF +1D357 1D3FF +1D455 +1D49D +1D4A0 1D4A1 +1D4A3 1D4A4 +1D4A7 1D4A8 +1D4AD +1D4BA +1D4BC +1D4C4 +1D506 +1D50B 1D50C +1D515 +1D51D +1D53A +1D53F +1D545 +1D547 1D549 +1D551 +1D6A6 1D6A7 +1D7CA 1D7CD +1D800 1FFFF +2A6D7 2F7FF +2FA1E E00FF +E01F0 10FFFF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Canadian.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Canadian.pl new file mode 100644 index 00000000000..6eb1c061bad --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Canadian.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{CanadianAboriginal} (and fuzzy permutations) +# +# Meaning: Script 'Canadian_Aboriginal' +# +return <<'END'; +1401 1676 Canadian_Aboriginal +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cc.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cc.pl new file mode 100644 index 00000000000..f7715fc9d24 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cc.pl @@ -0,0 +1,15 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Cc} +# \p{Cc} (and fuzzy permutations) +# +# Meaning: General Category 'Cc' +# +return <<'END'; +0000 001F +007F 009F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cf.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cf.pl new file mode 100644 index 00000000000..d2291e2bce5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cf.pl @@ -0,0 +1,27 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Cf} +# \p{Cf} (and fuzzy permutations) +# +# Meaning: General Category 'Cf' +# +return <<'END'; +00AD +0600 0603 +06DD +070F +17B4 17B5 +200B 200F +202A 202E +2060 2063 +206A 206F +FEFF +FFF9 FFFB +1D173 1D17A +E0001 +E0020 E007F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cher.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cher.pl new file mode 100644 index 00000000000..11e7733fcb7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cher.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Cherokee} (and fuzzy permutations) +# +# Meaning: Script 'Cherokee' +# +return <<'END'; +13A0 13F4 Cherokee +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cn.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cn.pl new file mode 100644 index 00000000000..d94d4bc7e11 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cn.pl @@ -0,0 +1,433 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Cn} +# \p{Cn} (and fuzzy permutations) +# +# Meaning: General Category 'Cn' [not functional in Perl] +# +return <<'END'; +0242 024F +0370 0373 +0376 0379 +037B 037D +037F 0383 +038B +038D +03A2 +03CF +0487 +04CF +04FA 04FF +0510 0530 +0557 0558 +0560 +0588 +058B 0590 +05BA +05C8 05CF +05EB 05EF +05F5 05FF +0604 060A +0616 061A +061C 061D +0620 +063B 063F +065F +070E +074B 074C +076E 077F +07B2 0900 +093A 093B +094E 094F +0955 0957 +0971 097C +097E 0980 +0984 +098D 098E +0991 0992 +09A9 +09B1 +09B3 09B5 +09BA 09BB +09C5 09C6 +09C9 09CA +09CF 09D6 +09D8 09DB +09DE +09E4 09E5 +09FB 0A00 +0A04 +0A0B 0A0E +0A11 0A12 +0A29 +0A31 +0A34 +0A37 +0A3A 0A3B +0A3D +0A43 0A46 +0A49 0A4A +0A4E 0A58 +0A5D +0A5F 0A65 +0A75 0A80 +0A84 +0A8E +0A92 +0AA9 +0AB1 +0AB4 +0ABA 0ABB +0AC6 +0ACA +0ACE 0ACF +0AD1 0ADF +0AE4 0AE5 +0AF0 +0AF2 0B00 +0B04 +0B0D 0B0E +0B11 0B12 +0B29 +0B31 +0B34 +0B3A 0B3B +0B44 0B46 +0B49 0B4A +0B4E 0B55 +0B58 0B5B +0B5E +0B62 0B65 +0B72 0B81 +0B84 +0B8B 0B8D +0B91 +0B96 0B98 +0B9B +0B9D +0BA0 0BA2 +0BA5 0BA7 +0BAB 0BAD +0BBA 0BBD +0BC3 0BC5 +0BC9 +0BCE 0BD6 +0BD8 0BE5 +0BFB 0C00 +0C04 +0C0D +0C11 +0C29 +0C34 +0C3A 0C3D +0C45 +0C49 +0C4E 0C54 +0C57 0C5F +0C62 0C65 +0C70 0C81 +0C84 +0C8D +0C91 +0CA9 +0CB4 +0CBA 0CBB +0CC5 +0CC9 +0CCE 0CD4 +0CD7 0CDD +0CDF +0CE2 0CE5 +0CF0 0D01 +0D04 +0D0D +0D11 +0D29 +0D3A 0D3D +0D44 0D45 +0D49 +0D4E 0D56 +0D58 0D5F +0D62 0D65 +0D70 0D81 +0D84 +0D97 0D99 +0DB2 +0DBC +0DBE 0DBF +0DC7 0DC9 +0DCB 0DCE +0DD5 +0DD7 +0DE0 0DF1 +0DF5 0E00 +0E3B 0E3E +0E5C 0E80 +0E83 +0E85 0E86 +0E89 +0E8B 0E8C +0E8E 0E93 +0E98 +0EA0 +0EA4 +0EA6 +0EA8 0EA9 +0EAC +0EBA +0EBE 0EBF +0EC5 +0EC7 +0ECE 0ECF +0EDA 0EDB +0EDE 0EFF +0F48 +0F6B 0F70 +0F8C 0F8F +0F98 +0FBD +0FCD 0FCE +0FD2 0FFF +1022 +1028 +102B +1033 1035 +103A 103F +105A 109F +10C6 10CF +10FD 10FF +115A 115E +11A3 11A7 +11FA 11FF +1249 +124E 124F +1257 +1259 +125E 125F +1289 +128E 128F +12B1 +12B6 12B7 +12BF +12C1 +12C6 12C7 +12D7 +1311 +1316 1317 +135B 135E +137D 137F +139A 139F +13F5 1400 +1677 167F +169D 169F +16F1 16FF +170D +1715 171F +1737 173F +1754 175F +176D +1771 +1774 177F +17DE 17DF +17EA 17EF +17FA 17FF +180F +181A 181F +1878 187F +18AA 18FF +191D 191F +192C 192F +193C 193F +1941 1943 +196E 196F +1975 197F +19AA 19AF +19CA 19CF +19DA 19DD +1A1C 1A1D +1A20 1CFF +1DC4 1DFF +1E9C 1E9F +1EFA 1EFF +1F16 1F17 +1F1E 1F1F +1F46 1F47 +1F4E 1F4F +1F58 +1F5A +1F5C +1F5E +1F7E 1F7F +1FB5 +1FC5 +1FD4 1FD5 +1FDC +1FF0 1FF1 +1FF5 +1FFF +2064 2069 +2072 2073 +208F +2095 209F +20B6 20CF +20EC 20FF +214D 2152 +2184 218F +23DC 23FF +2427 243F +244B 245F +269D 269F +26B2 2700 +2705 +270A 270B +2728 +274C +274E +2753 2755 +2757 +275F 2760 +2795 2797 +27B0 +27BF +27C7 27CF +27EC 27EF +2B14 2BFF +2C2F +2C5F 2C7F +2CEB 2CF8 +2D26 2D2F +2D66 2D6E +2D70 2D7F +2D97 2D9F +2DA7 +2DAF +2DB7 +2DBF +2DC7 +2DCF +2DD7 +2DDF 2DFF +2E18 2E1B +2E1E 2E7F +2E9A +2EF4 2EFF +2FD6 2FEF +2FFC 2FFF +3040 +3097 3098 +3100 3104 +312D 3130 +318F +31B8 31BF +31D0 31EF +321F +3244 324F +32FF +4DB6 4DBF +9FBC 9FFF +A48D A48F +A4C7 A6FF +A717 A7FF +A82C ABFF +D7A4 D7FF +FA2E FA2F +FA6B FA6F +FADA FAFF +FB07 FB12 +FB18 FB1C +FB37 +FB3D +FB3F +FB42 +FB45 +FBB2 FBD2 +FD40 FD4F +FD90 FD91 +FDC8 FDEF +FDFE FDFF +FE1A FE1F +FE24 FE2F +FE53 +FE67 +FE6C FE6F +FE75 +FEFD FEFE +FF00 +FFBF FFC1 +FFC8 FFC9 +FFD0 FFD1 +FFD8 FFD9 +FFDD FFDF +FFE7 +FFEF FFF8 +FFFE FFFF +1000C +10027 +1003B +1003E +1004E 1004F +1005E 1007F +100FB 100FF +10103 10106 +10134 10136 +1018B 102FF +1031F +10324 1032F +1034B 1037F +1039E +103C4 103C7 +103D6 103FF +1049E 1049F +104AA 107FF +10806 10807 +10809 +10836 +10839 1083B +1083D 1083E +10840 109FF +10A04 +10A07 10A0B +10A14 +10A18 +10A34 10A37 +10A3B 10A3E +10A48 10A4F +10A59 1CFFF +1D0F6 1D0FF +1D127 1D129 +1D1DE 1D1FF +1D246 1D2FF +1D357 1D3FF +1D455 +1D49D +1D4A0 1D4A1 +1D4A3 1D4A4 +1D4A7 1D4A8 +1D4AD +1D4BA +1D4BC +1D4C4 +1D506 +1D50B 1D50C +1D515 +1D51D +1D53A +1D53F +1D545 +1D547 1D549 +1D551 +1D6A6 1D6A7 +1D7CA 1D7CD +1D800 1FFFF +2A6D7 2F7FF +2FA1E E0000 +E0002 E001F +E0080 E00FF +E01F0 EFFFF +FFFFE FFFFF +10FFFE 10FFFF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cntrl.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cntrl.pl new file mode 100644 index 00000000000..9d9f7407318 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cntrl.pl @@ -0,0 +1,31 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Cntrl} +# +# Meaning: [[:Cntrl:]] +# +return <<'END'; +0000 001F +007F 009F +00AD +0600 0603 +06DD +070F +17B4 17B5 +200B 200F +202A 202E +2060 2063 +206A 206F +D800 F8FF +FEFF +FFF9 FFFB +1D173 1D17A +E0001 +E0020 E007F +F0000 FFFFD +100000 10FFFD +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Co.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Co.pl new file mode 100644 index 00000000000..5cb8379366e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Co.pl @@ -0,0 +1,16 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Co} +# \p{Co} (and fuzzy permutations) +# +# Meaning: General Category 'Co' +# +return <<'END'; +E000 F8FF +F0000 FFFFD +100000 10FFFD +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Copt.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Copt.pl new file mode 100644 index 00000000000..f8942a996f9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Copt.pl @@ -0,0 +1,15 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Coptic} (and fuzzy permutations) +# +# Meaning: Script 'Coptic' +# +return <<'END'; +03E2 03EF Coptic +2C80 2CEA Coptic +2CF9 2CFF Coptic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cprt.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cprt.pl new file mode 100644 index 00000000000..95b9922a16e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cprt.pl @@ -0,0 +1,18 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Cypriot} (and fuzzy permutations) +# +# Meaning: Script 'Cypriot' +# +return <<'END'; +10800 10805 Cypriot +10808 Cypriot +1080A 10835 Cypriot +10837 10838 Cypriot +1083C Cypriot +1083F Cypriot +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cs.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cs.pl new file mode 100644 index 00000000000..02ccb70cae6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cs.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Cs} +# \p{Cs} (and fuzzy permutations) +# +# Meaning: General Category 'Cs' +# +return <<'END'; +D800 DFFF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cyrl.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cyrl.pl new file mode 100644 index 00000000000..1b3412ffffe --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Cyrl.pl @@ -0,0 +1,18 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Cyrillic} (and fuzzy permutations) +# +# Meaning: Script 'Cyrillic' +# +return <<'END'; +0400 0486 Cyrillic +0488 04CE Cyrillic +04D0 04F9 Cyrillic +0500 050F Cyrillic +1D2B Cyrillic +1D78 Cyrillic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Dash.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Dash.pl new file mode 100644 index 00000000000..98b7e3401ed --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Dash.pl @@ -0,0 +1,25 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Dash' +# +return <<'END'; +002D Dash +058A Dash +1806 Dash +2010 2015 Dash +2053 Dash +207B Dash +208B Dash +2212 Dash +2E17 Dash +301C Dash +3030 Dash +30A0 Dash +FE31 FE32 Dash +FE58 Dash +FE63 Dash +FF0D Dash +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Dash2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Dash2.pl new file mode 100644 index 00000000000..b6c40f34bb5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Dash2.pl @@ -0,0 +1,28 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Dash} (and fuzzy permutations) +# +# Meaning: Extended property 'Dash' +# +return <<'END'; +002D Dash +058A Dash +1806 Dash +2010 2015 Dash +2053 Dash +207B Dash +208B Dash +2212 Dash +2E17 Dash +301C Dash +3030 Dash +30A0 Dash +FE31 FE32 Dash +FE58 Dash +FE63 Dash +FF0D Dash +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Dep.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Dep.pl new file mode 100644 index 00000000000..c2b4606d967 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Dep.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Deprecated' +# +return <<'END'; +0340 0341 Deprecated +17A3 Deprecated +17D3 Deprecated +206A 206F Deprecated +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Deprecat.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Deprecat.pl new file mode 100644 index 00000000000..b9adc5df2a0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Deprecat.pl @@ -0,0 +1,16 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Deprecated} (and fuzzy permutations) +# +# Meaning: Extended property 'Deprecated' +# +return <<'END'; +0340 0341 Deprecated +17A3 Deprecated +17D3 Deprecated +206A 206F Deprecated +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Deva.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Deva.pl new file mode 100644 index 00000000000..53bab955a4e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Deva.pl @@ -0,0 +1,18 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Devanagari} (and fuzzy permutations) +# +# Meaning: Script 'Devanagari' +# +return <<'END'; +0901 0939 Devanagari +093C 094D Devanagari +0950 0954 Devanagari +0958 0963 Devanagari +0966 096F Devanagari +097D Devanagari +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Dia.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Dia.pl new file mode 100644 index 00000000000..2d790de5e5d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Dia.pl @@ -0,0 +1,91 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Diacritic' +# +return <<'END'; +005E Diacritic +0060 Diacritic +00A8 Diacritic +00AF Diacritic +00B4 Diacritic +00B7 00B8 Diacritic +02B0 034E Diacritic +0350 0357 Diacritic +035D 0362 Diacritic +0374 0375 Diacritic +037A Diacritic +0384 0385 Diacritic +0483 0486 Diacritic +0559 Diacritic +0591 05A1 Diacritic +05A3 05B9 Diacritic +05BB 05BD Diacritic +05BF Diacritic +05C1 05C2 Diacritic +05C4 Diacritic +064B 0652 Diacritic +0657 0658 Diacritic +06DF 06E0 Diacritic +06E5 06E6 Diacritic +06EA 06EC Diacritic +0730 074A Diacritic +07A6 07B0 Diacritic +093C Diacritic +094D Diacritic +0951 0954 Diacritic +09BC Diacritic +09CD Diacritic +0A3C Diacritic +0A4D Diacritic +0ABC Diacritic +0ACD Diacritic +0B3C Diacritic +0B4D Diacritic +0BCD Diacritic +0C4D Diacritic +0CBC Diacritic +0CCD Diacritic +0D4D Diacritic +0DCA Diacritic +0E47 0E4C Diacritic +0E4E Diacritic +0EC8 0ECC Diacritic +0F18 0F19 Diacritic +0F35 Diacritic +0F37 Diacritic +0F39 Diacritic +0F3E 0F3F Diacritic +0F82 0F84 Diacritic +0F86 0F87 Diacritic +0FC6 Diacritic +1037 Diacritic +1039 Diacritic +17C9 17D3 Diacritic +17DD Diacritic +1939 193B Diacritic +1D2C 1D6A Diacritic +1FBD Diacritic +1FBF 1FC1 Diacritic +1FCD 1FCF Diacritic +1FDD 1FDF Diacritic +1FED 1FEF Diacritic +1FFD 1FFE Diacritic +302A 302F Diacritic +3099 309C Diacritic +30FC Diacritic +FB1E Diacritic +FE20 FE23 Diacritic +FF3E Diacritic +FF40 Diacritic +FF70 Diacritic +FF9E FF9F Diacritic +FFE3 Diacritic +1D167 1D169 Diacritic +1D16D 1D172 Diacritic +1D17B 1D182 Diacritic +1D185 1D18B Diacritic +1D1AA 1D1AD Diacritic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Diacriti.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Diacriti.pl new file mode 100644 index 00000000000..6b4cf421db0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Diacriti.pl @@ -0,0 +1,94 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Diacritic} (and fuzzy permutations) +# +# Meaning: Extended property 'Diacritic' +# +return <<'END'; +005E Diacritic +0060 Diacritic +00A8 Diacritic +00AF Diacritic +00B4 Diacritic +00B7 00B8 Diacritic +02B0 034E Diacritic +0350 0357 Diacritic +035D 0362 Diacritic +0374 0375 Diacritic +037A Diacritic +0384 0385 Diacritic +0483 0486 Diacritic +0559 Diacritic +0591 05A1 Diacritic +05A3 05B9 Diacritic +05BB 05BD Diacritic +05BF Diacritic +05C1 05C2 Diacritic +05C4 Diacritic +064B 0652 Diacritic +0657 0658 Diacritic +06DF 06E0 Diacritic +06E5 06E6 Diacritic +06EA 06EC Diacritic +0730 074A Diacritic +07A6 07B0 Diacritic +093C Diacritic +094D Diacritic +0951 0954 Diacritic +09BC Diacritic +09CD Diacritic +0A3C Diacritic +0A4D Diacritic +0ABC Diacritic +0ACD Diacritic +0B3C Diacritic +0B4D Diacritic +0BCD Diacritic +0C4D Diacritic +0CBC Diacritic +0CCD Diacritic +0D4D Diacritic +0DCA Diacritic +0E47 0E4C Diacritic +0E4E Diacritic +0EC8 0ECC Diacritic +0F18 0F19 Diacritic +0F35 Diacritic +0F37 Diacritic +0F39 Diacritic +0F3E 0F3F Diacritic +0F82 0F84 Diacritic +0F86 0F87 Diacritic +0FC6 Diacritic +1037 Diacritic +1039 Diacritic +17C9 17D3 Diacritic +17DD Diacritic +1939 193B Diacritic +1D2C 1D6A Diacritic +1FBD Diacritic +1FBF 1FC1 Diacritic +1FCD 1FCF Diacritic +1FDD 1FDF Diacritic +1FED 1FEF Diacritic +1FFD 1FFE Diacritic +302A 302F Diacritic +3099 309C Diacritic +30FC Diacritic +FB1E Diacritic +FE20 FE23 Diacritic +FF3E Diacritic +FF40 Diacritic +FF70 Diacritic +FF9E FF9F Diacritic +FFE3 Diacritic +1D167 1D169 Diacritic +1D16D 1D172 Diacritic +1D17B 1D182 Diacritic +1D185 1D18B Diacritic +1D1AA 1D1AD Diacritic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Digit.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Digit.pl new file mode 100644 index 00000000000..bdcab28dd2b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Digit.pl @@ -0,0 +1,35 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Digit} +# +# Meaning: [[:Digit:]] +# +return <<'END'; +0030 0039 +0660 0669 +06F0 06F9 +0966 096F +09E6 09EF +0A66 0A6F +0AE6 0AEF +0B66 0B6F +0BE6 0BEF +0C66 0C6F +0CE6 0CEF +0D66 0D6F +0E50 0E59 +0ED0 0ED9 +0F20 0F29 +1040 1049 +17E0 17E9 +1810 1819 +1946 194F +19D0 19D9 +FF10 FF19 +104A0 104A9 +1D7CE 1D7FF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Dsrt.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Dsrt.pl new file mode 100644 index 00000000000..dcc68e83478 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Dsrt.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Deseret} (and fuzzy permutations) +# +# Meaning: Script 'Deseret' +# +return <<'END'; +10400 1044F Deseret +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ethi.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ethi.pl new file mode 100644 index 00000000000..318289d6a2c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ethi.pl @@ -0,0 +1,39 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Ethiopic} (and fuzzy permutations) +# +# Meaning: Script 'Ethiopic' +# +return <<'END'; +1200 1248 Ethiopic +124A 124D Ethiopic +1250 1256 Ethiopic +1258 Ethiopic +125A 125D Ethiopic +1260 1288 Ethiopic +128A 128D Ethiopic +1290 12B0 Ethiopic +12B2 12B5 Ethiopic +12B8 12BE Ethiopic +12C0 Ethiopic +12C2 12C5 Ethiopic +12C8 12D6 Ethiopic +12D8 1310 Ethiopic +1312 1315 Ethiopic +1318 135A Ethiopic +135F 137C Ethiopic +1380 1399 Ethiopic +2D80 2D96 Ethiopic +2DA0 2DA6 Ethiopic +2DA8 2DAE Ethiopic +2DB0 2DB6 Ethiopic +2DB8 2DBE Ethiopic +2DC0 2DC6 Ethiopic +2DC8 2DCE Ethiopic +2DD0 2DD6 Ethiopic +2DD8 2DDE Ethiopic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ext.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ext.pl new file mode 100644 index 00000000000..0166715de23 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ext.pl @@ -0,0 +1,21 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Extender' +# +return <<'END'; +00B7 Extender +02D0 02D1 Extender +0640 Extender +0E46 Extender +0EC6 Extender +1843 Extender +3005 Extender +3031 3035 Extender +309D 309E Extender +30FC 30FE Extender +A015 Extender +FF70 Extender +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Extender.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Extender.pl new file mode 100644 index 00000000000..c9131e041dd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Extender.pl @@ -0,0 +1,24 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Extender} (and fuzzy permutations) +# +# Meaning: Extended property 'Extender' +# +return <<'END'; +00B7 Extender +02D0 02D1 Extender +0640 Extender +0E46 Extender +0EC6 Extender +1843 Extender +3005 Extender +3031 3035 Extender +309D 309E Extender +30FC 30FE Extender +A015 Extender +FF70 Extender +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Geor.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Geor.pl new file mode 100644 index 00000000000..63033e2f429 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Geor.pl @@ -0,0 +1,16 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Georgian} (and fuzzy permutations) +# +# Meaning: Script 'Georgian' +# +return <<'END'; +10A0 10C5 Georgian +10D0 10FA Georgian +10FC Georgian +2D00 2D25 Georgian +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Glag.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Glag.pl new file mode 100644 index 00000000000..2b873484e1e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Glag.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Glagolitic} (and fuzzy permutations) +# +# Meaning: Script 'Glagolitic' +# +return <<'END'; +2C00 2C2E Glagolitic +2C30 2C5E Glagolitic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Goth.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Goth.pl new file mode 100644 index 00000000000..7637cc65826 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Goth.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Gothic} (and fuzzy permutations) +# +# Meaning: Script 'Gothic' +# +return <<'END'; +10330 1034A Gothic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/GrLink.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/GrLink.pl new file mode 100644 index 00000000000..58bca9fe1a7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/GrLink.pl @@ -0,0 +1,25 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Grapheme_Link' +# +return <<'END'; +034F Grapheme_Link +094D Grapheme_Link +09CD Grapheme_Link +0A4D Grapheme_Link +0ACD Grapheme_Link +0B4D Grapheme_Link +0BCD Grapheme_Link +0C4D Grapheme_Link +0CCD Grapheme_Link +0D4D Grapheme_Link +0DCA Grapheme_Link +0E3A Grapheme_Link +1039 Grapheme_Link +17D2 Grapheme_Link +A806 Grapheme_Link +10A3F Grapheme_Link +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Graph.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Graph.pl new file mode 100644 index 00000000000..be38ba9505c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Graph.pl @@ -0,0 +1,436 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Graph} +# +# Meaning: [[:Graph:]] +# +return <<'END'; +0021 007E +00A1 0241 +0250 036F +0374 0375 +037A +037E +0384 038A +038C +038E 03A1 +03A3 03CE +03D0 0486 +0488 04CE +04D0 04F9 +0500 050F +0531 0556 +0559 055F +0561 0587 +0589 058A +0591 05B9 +05BB 05C7 +05D0 05EA +05F0 05F4 +0600 0603 +060B 0615 +061B +061E 061F +0621 063A +0640 065E +0660 070D +070F 074A +074D 076D +0780 07B1 +0901 0939 +093C 094D +0950 0954 +0958 0970 +097D +0981 0983 +0985 098C +098F 0990 +0993 09A8 +09AA 09B0 +09B2 +09B6 09B9 +09BC 09C4 +09C7 09C8 +09CB 09CE +09D7 +09DC 09DD +09DF 09E3 +09E6 09FA +0A01 0A03 +0A05 0A0A +0A0F 0A10 +0A13 0A28 +0A2A 0A30 +0A32 0A33 +0A35 0A36 +0A38 0A39 +0A3C +0A3E 0A42 +0A47 0A48 +0A4B 0A4D +0A59 0A5C +0A5E +0A66 0A74 +0A81 0A83 +0A85 0A8D +0A8F 0A91 +0A93 0AA8 +0AAA 0AB0 +0AB2 0AB3 +0AB5 0AB9 +0ABC 0AC5 +0AC7 0AC9 +0ACB 0ACD +0AD0 +0AE0 0AE3 +0AE6 0AEF +0AF1 +0B01 0B03 +0B05 0B0C +0B0F 0B10 +0B13 0B28 +0B2A 0B30 +0B32 0B33 +0B35 0B39 +0B3C 0B43 +0B47 0B48 +0B4B 0B4D +0B56 0B57 +0B5C 0B5D +0B5F 0B61 +0B66 0B71 +0B82 0B83 +0B85 0B8A +0B8E 0B90 +0B92 0B95 +0B99 0B9A +0B9C +0B9E 0B9F +0BA3 0BA4 +0BA8 0BAA +0BAE 0BB9 +0BBE 0BC2 +0BC6 0BC8 +0BCA 0BCD +0BD7 +0BE6 0BFA +0C01 0C03 +0C05 0C0C +0C0E 0C10 +0C12 0C28 +0C2A 0C33 +0C35 0C39 +0C3E 0C44 +0C46 0C48 +0C4A 0C4D +0C55 0C56 +0C60 0C61 +0C66 0C6F +0C82 0C83 +0C85 0C8C +0C8E 0C90 +0C92 0CA8 +0CAA 0CB3 +0CB5 0CB9 +0CBC 0CC4 +0CC6 0CC8 +0CCA 0CCD +0CD5 0CD6 +0CDE +0CE0 0CE1 +0CE6 0CEF +0D02 0D03 +0D05 0D0C +0D0E 0D10 +0D12 0D28 +0D2A 0D39 +0D3E 0D43 +0D46 0D48 +0D4A 0D4D +0D57 +0D60 0D61 +0D66 0D6F +0D82 0D83 +0D85 0D96 +0D9A 0DB1 +0DB3 0DBB +0DBD +0DC0 0DC6 +0DCA +0DCF 0DD4 +0DD6 +0DD8 0DDF +0DF2 0DF4 +0E01 0E3A +0E3F 0E5B +0E81 0E82 +0E84 +0E87 0E88 +0E8A +0E8D +0E94 0E97 +0E99 0E9F +0EA1 0EA3 +0EA5 +0EA7 +0EAA 0EAB +0EAD 0EB9 +0EBB 0EBD +0EC0 0EC4 +0EC6 +0EC8 0ECD +0ED0 0ED9 +0EDC 0EDD +0F00 0F47 +0F49 0F6A +0F71 0F8B +0F90 0F97 +0F99 0FBC +0FBE 0FCC +0FCF 0FD1 +1000 1021 +1023 1027 +1029 102A +102C 1032 +1036 1039 +1040 1059 +10A0 10C5 +10D0 10FC +1100 1159 +115F 11A2 +11A8 11F9 +1200 1248 +124A 124D +1250 1256 +1258 +125A 125D +1260 1288 +128A 128D +1290 12B0 +12B2 12B5 +12B8 12BE +12C0 +12C2 12C5 +12C8 12D6 +12D8 1310 +1312 1315 +1318 135A +135F 137C +1380 1399 +13A0 13F4 +1401 1676 +1681 169C +16A0 16F0 +1700 170C +170E 1714 +1720 1736 +1740 1753 +1760 176C +176E 1770 +1772 1773 +1780 17DD +17E0 17E9 +17F0 17F9 +1800 180D +1810 1819 +1820 1877 +1880 18A9 +1900 191C +1920 192B +1930 193B +1940 +1944 196D +1970 1974 +1980 19A9 +19B0 19C9 +19D0 19D9 +19DE 1A1B +1A1E 1A1F +1D00 1DC3 +1E00 1E9B +1EA0 1EF9 +1F00 1F15 +1F18 1F1D +1F20 1F45 +1F48 1F4D +1F50 1F57 +1F59 +1F5B +1F5D +1F5F 1F7D +1F80 1FB4 +1FB6 1FC4 +1FC6 1FD3 +1FD6 1FDB +1FDD 1FEF +1FF2 1FF4 +1FF6 1FFE +200B 2027 +202A 202E +2030 205E +2060 2063 +206A 2071 +2074 208E +2090 2094 +20A0 20B5 +20D0 20EB +2100 214C +2153 2183 +2190 23DB +2400 2426 +2440 244A +2460 269C +26A0 26B1 +2701 2704 +2706 2709 +270C 2727 +2729 274B +274D +274F 2752 +2756 +2758 275E +2761 2794 +2798 27AF +27B1 27BE +27C0 27C6 +27D0 27EB +27F0 2B13 +2C00 2C2E +2C30 2C5E +2C80 2CEA +2CF9 2D25 +2D30 2D65 +2D6F +2D80 2D96 +2DA0 2DA6 +2DA8 2DAE +2DB0 2DB6 +2DB8 2DBE +2DC0 2DC6 +2DC8 2DCE +2DD0 2DD6 +2DD8 2DDE +2E00 2E17 +2E1C 2E1D +2E80 2E99 +2E9B 2EF3 +2F00 2FD5 +2FF0 2FFB +3001 303F +3041 3096 +3099 30FF +3105 312C +3131 318E +3190 31B7 +31C0 31CF +31F0 321E +3220 3243 +3250 32FE +3300 4DB5 +4DC0 9FBB +A000 A48C +A490 A4C6 +A700 A716 +A800 A82B +AC00 D7A3 +E000 FA2D +FA30 FA6A +FA70 FAD9 +FB00 FB06 +FB13 FB17 +FB1D FB36 +FB38 FB3C +FB3E +FB40 FB41 +FB43 FB44 +FB46 FBB1 +FBD3 FD3F +FD50 FD8F +FD92 FDC7 +FDF0 FDFD +FE00 FE19 +FE20 FE23 +FE30 FE52 +FE54 FE66 +FE68 FE6B +FE70 FE74 +FE76 FEFC +FEFF +FF01 FFBE +FFC2 FFC7 +FFCA FFCF +FFD2 FFD7 +FFDA FFDC +FFE0 FFE6 +FFE8 FFEE +FFF9 FFFD +10000 1000B +1000D 10026 +10028 1003A +1003C 1003D +1003F 1004D +10050 1005D +10080 100FA +10100 10102 +10107 10133 +10137 1018A +10300 1031E +10320 10323 +10330 1034A +10380 1039D +1039F 103C3 +103C8 103D5 +10400 1049D +104A0 104A9 +10800 10805 +10808 +1080A 10835 +10837 10838 +1083C +1083F +10A00 10A03 +10A05 10A06 +10A0C 10A13 +10A15 10A17 +10A19 10A33 +10A38 10A3A +10A3F 10A47 +10A50 10A58 +1D000 1D0F5 +1D100 1D126 +1D12A 1D1DD +1D200 1D245 +1D300 1D356 +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A5 +1D6A8 1D7C9 +1D7CE 1D7FF +20000 2A6D6 +2F800 2FA1D +E0001 +E0020 E007F +E0100 E01EF +F0000 FFFFD +100000 10FFFD +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Grapheme.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Grapheme.pl new file mode 100644 index 00000000000..b01db81fb31 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Grapheme.pl @@ -0,0 +1,28 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{GraphemeLink} (and fuzzy permutations) +# +# Meaning: Extended property 'Grapheme_Link' +# +return <<'END'; +034F Grapheme_Link +094D Grapheme_Link +09CD Grapheme_Link +0A4D Grapheme_Link +0ACD Grapheme_Link +0B4D Grapheme_Link +0BCD Grapheme_Link +0C4D Grapheme_Link +0CCD Grapheme_Link +0D4D Grapheme_Link +0DCA Grapheme_Link +0E3A Grapheme_Link +1039 Grapheme_Link +17D2 Grapheme_Link +A806 Grapheme_Link +10A3F Grapheme_Link +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Grek.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Grek.pl new file mode 100644 index 00000000000..6dce82bb2db --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Grek.pl @@ -0,0 +1,43 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Greek} (and fuzzy permutations) +# +# Meaning: Script 'Greek' +# +return <<'END'; +0374 0375 Greek +037A Greek +0384 0386 Greek +0388 038A Greek +038C Greek +038E 03A1 Greek +03A3 03CE Greek +03D0 03E1 Greek +03F0 03FF Greek +1D26 1D2A Greek +1D5D 1D61 Greek +1D66 1D6A Greek +1F00 1F15 Greek +1F18 1F1D Greek +1F20 1F45 Greek +1F48 1F4D Greek +1F50 1F57 Greek +1F59 Greek +1F5B Greek +1F5D Greek +1F5F 1F7D Greek +1F80 1FB4 Greek +1FB6 1FC4 Greek +1FC6 1FD3 Greek +1FD6 1FDB Greek +1FDD 1FEF Greek +1FF2 1FF4 Greek +1FF6 1FFE Greek +2126 Greek +10140 1018A Greek +1D200 1D245 Greek +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Gujr.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Gujr.pl new file mode 100644 index 00000000000..b35bce38c9f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Gujr.pl @@ -0,0 +1,26 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Gujarati} (and fuzzy permutations) +# +# Meaning: Script 'Gujarati' +# +return <<'END'; +0A81 0A83 Gujarati +0A85 0A8D Gujarati +0A8F 0A91 Gujarati +0A93 0AA8 Gujarati +0AAA 0AB0 Gujarati +0AB2 0AB3 Gujarati +0AB5 0AB9 Gujarati +0ABC 0AC5 Gujarati +0AC7 0AC9 Gujarati +0ACB 0ACD Gujarati +0AD0 Gujarati +0AE0 0AE3 Gujarati +0AE6 0AEF Gujarati +0AF1 Gujarati +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Guru.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Guru.pl new file mode 100644 index 00000000000..7525edc2ef0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Guru.pl @@ -0,0 +1,27 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Gurmukhi} (and fuzzy permutations) +# +# Meaning: Script 'Gurmukhi' +# +return <<'END'; +0A01 0A03 Gurmukhi +0A05 0A0A Gurmukhi +0A0F 0A10 Gurmukhi +0A13 0A28 Gurmukhi +0A2A 0A30 Gurmukhi +0A32 0A33 Gurmukhi +0A35 0A36 Gurmukhi +0A38 0A39 Gurmukhi +0A3C Gurmukhi +0A3E 0A42 Gurmukhi +0A47 0A48 Gurmukhi +0A4B 0A4D Gurmukhi +0A59 0A5C Gurmukhi +0A5E Gurmukhi +0A66 0A74 Gurmukhi +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hang.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hang.pl new file mode 100644 index 00000000000..d7de1eaf34e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hang.pl @@ -0,0 +1,24 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Hangul} (and fuzzy permutations) +# +# Meaning: Script 'Hangul' +# +return <<'END'; +1100 1159 Hangul +115F 11A2 Hangul +11A8 11F9 Hangul +3131 318E Hangul +3200 321E Hangul +3260 327D Hangul +AC00 D7A3 Hangul +FFA0 FFBE Hangul +FFC2 FFC7 Hangul +FFCA FFCF Hangul +FFD2 FFD7 Hangul +FFDA FFDC Hangul +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hani.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hani.pl new file mode 100644 index 00000000000..e641a71d69e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hani.pl @@ -0,0 +1,26 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Han} (and fuzzy permutations) +# +# Meaning: Script 'Han' +# +return <<'END'; +2E80 2E99 Han +2E9B 2EF3 Han +2F00 2FD5 Han +3005 Han +3007 Han +3021 3029 Han +3038 303B Han +3400 4DB5 Han +4E00 9FBB Han +F900 FA2D Han +FA30 FA6A Han +FA70 FAD9 Han +20000 2A6D6 Han +2F800 2FA1D Han +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hano.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hano.pl new file mode 100644 index 00000000000..f11def791e4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hano.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Hanunoo} (and fuzzy permutations) +# +# Meaning: Script 'Hanunoo' +# +return <<'END'; +1720 1734 Hanunoo +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hebr.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hebr.pl new file mode 100644 index 00000000000..bdb6829c218 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hebr.pl @@ -0,0 +1,22 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Hebrew} (and fuzzy permutations) +# +# Meaning: Script 'Hebrew' +# +return <<'END'; +0591 05B9 Hebrew +05BB 05C7 Hebrew +05D0 05EA Hebrew +05F0 05F4 Hebrew +FB1D FB36 Hebrew +FB38 FB3C Hebrew +FB3E Hebrew +FB40 FB41 Hebrew +FB43 FB44 Hebrew +FB46 FB4F Hebrew +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hex.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hex.pl new file mode 100644 index 00000000000..328d4abaaf1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hex.pl @@ -0,0 +1,15 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Hex_Digit' +# +return <<'END'; +0030 0039 Hex_Digit +0041 0046 Hex_Digit +0061 0066 Hex_Digit +FF10 FF19 Hex_Digit +FF21 FF26 Hex_Digit +FF41 FF46 Hex_Digit +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/HexDigit.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/HexDigit.pl new file mode 100644 index 00000000000..83ce8547cf3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/HexDigit.pl @@ -0,0 +1,18 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{HexDigit} (and fuzzy permutations) +# +# Meaning: Extended property 'Hex_Digit' +# +return <<'END'; +0030 0039 Hex_Digit +0041 0046 Hex_Digit +0061 0066 Hex_Digit +FF10 FF19 Hex_Digit +FF21 FF26 Hex_Digit +FF41 FF46 Hex_Digit +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hira.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hira.pl new file mode 100644 index 00000000000..1b98d7c690c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hira.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Hiragana} (and fuzzy permutations) +# +# Meaning: Script 'Hiragana' +# +return <<'END'; +3041 3096 Hiragana +309D 309F Hiragana +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hyphen.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hyphen.pl new file mode 100644 index 00000000000..8741bf21b0a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hyphen.pl @@ -0,0 +1,19 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Hyphen' +# +return <<'END'; +002D Hyphen +00AD Hyphen +058A Hyphen +1806 Hyphen +2010 2011 Hyphen +2E17 Hyphen +30FB Hyphen +FE63 Hyphen +FF0D Hyphen +FF65 Hyphen +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hyphen2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hyphen2.pl new file mode 100644 index 00000000000..387bfc0fa40 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Hyphen2.pl @@ -0,0 +1,22 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Hyphen} (and fuzzy permutations) +# +# Meaning: Extended property 'Hyphen' +# +return <<'END'; +002D Hyphen +00AD Hyphen +058A Hyphen +1806 Hyphen +2010 2011 Hyphen +2E17 Hyphen +30FB Hyphen +FE63 Hyphen +FF0D Hyphen +FF65 Hyphen +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IDSB.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IDSB.pl new file mode 100644 index 00000000000..b0282c29d26 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IDSB.pl @@ -0,0 +1,11 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'IDS_Binary_Operator' +# +return <<'END'; +2FF0 2FF1 IDS_Binary_Operator +2FF4 2FFB IDS_Binary_Operator +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IDST.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IDST.pl new file mode 100644 index 00000000000..7bafc477652 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IDST.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'IDS_Trinary_Operator' +# +return <<'END'; +2FF2 2FF3 IDS_Trinary_Operator +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IdContin.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IdContin.pl new file mode 100644 index 00000000000..324e85f68f8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IdContin.pl @@ -0,0 +1,460 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{IdContinue} (and fuzzy permutations) +# +# Meaning: [\p{ID_Start}\p{Mn}\p{Mc}\p{Nd}\p{Pc}] +# +return <<'END'; +0030 0039 +0041 005A +005F +0061 007A +00AA +00B5 +00BA +00C0 00D6 +00D8 00F6 +00F8 0241 +0250 02C1 +02C6 02D1 +02E0 02E4 +02EE +0300 036F +037A +0386 +0388 038A +038C +038E 03A1 +03A3 03CE +03D0 03F5 +03F7 0481 +0483 0486 +048A 04CE +04D0 04F9 +0500 050F +0531 0556 +0559 +0561 0587 +0591 05B9 +05BB 05BD +05BF +05C1 05C2 +05C4 05C5 +05C7 +05D0 05EA +05F0 05F2 +0610 0615 +0621 063A +0640 065E +0660 0669 +066E 06D3 +06D5 06DC +06DF 06E8 +06EA 06FC +06FF +0710 074A +074D 076D +0780 07B1 +0901 0939 +093C 094D +0950 0954 +0958 0963 +0966 096F +097D +0981 0983 +0985 098C +098F 0990 +0993 09A8 +09AA 09B0 +09B2 +09B6 09B9 +09BC 09C4 +09C7 09C8 +09CB 09CE +09D7 +09DC 09DD +09DF 09E3 +09E6 09F1 +0A01 0A03 +0A05 0A0A +0A0F 0A10 +0A13 0A28 +0A2A 0A30 +0A32 0A33 +0A35 0A36 +0A38 0A39 +0A3C +0A3E 0A42 +0A47 0A48 +0A4B 0A4D +0A59 0A5C +0A5E +0A66 0A74 +0A81 0A83 +0A85 0A8D +0A8F 0A91 +0A93 0AA8 +0AAA 0AB0 +0AB2 0AB3 +0AB5 0AB9 +0ABC 0AC5 +0AC7 0AC9 +0ACB 0ACD +0AD0 +0AE0 0AE3 +0AE6 0AEF +0B01 0B03 +0B05 0B0C +0B0F 0B10 +0B13 0B28 +0B2A 0B30 +0B32 0B33 +0B35 0B39 +0B3C 0B43 +0B47 0B48 +0B4B 0B4D +0B56 0B57 +0B5C 0B5D +0B5F 0B61 +0B66 0B6F +0B71 +0B82 0B83 +0B85 0B8A +0B8E 0B90 +0B92 0B95 +0B99 0B9A +0B9C +0B9E 0B9F +0BA3 0BA4 +0BA8 0BAA +0BAE 0BB9 +0BBE 0BC2 +0BC6 0BC8 +0BCA 0BCD +0BD7 +0BE6 0BEF +0C01 0C03 +0C05 0C0C +0C0E 0C10 +0C12 0C28 +0C2A 0C33 +0C35 0C39 +0C3E 0C44 +0C46 0C48 +0C4A 0C4D +0C55 0C56 +0C60 0C61 +0C66 0C6F +0C82 0C83 +0C85 0C8C +0C8E 0C90 +0C92 0CA8 +0CAA 0CB3 +0CB5 0CB9 +0CBC 0CC4 +0CC6 0CC8 +0CCA 0CCD +0CD5 0CD6 +0CDE +0CE0 0CE1 +0CE6 0CEF +0D02 0D03 +0D05 0D0C +0D0E 0D10 +0D12 0D28 +0D2A 0D39 +0D3E 0D43 +0D46 0D48 +0D4A 0D4D +0D57 +0D60 0D61 +0D66 0D6F +0D82 0D83 +0D85 0D96 +0D9A 0DB1 +0DB3 0DBB +0DBD +0DC0 0DC6 +0DCA +0DCF 0DD4 +0DD6 +0DD8 0DDF +0DF2 0DF3 +0E01 0E3A +0E40 0E4E +0E50 0E59 +0E81 0E82 +0E84 +0E87 0E88 +0E8A +0E8D +0E94 0E97 +0E99 0E9F +0EA1 0EA3 +0EA5 +0EA7 +0EAA 0EAB +0EAD 0EB9 +0EBB 0EBD +0EC0 0EC4 +0EC6 +0EC8 0ECD +0ED0 0ED9 +0EDC 0EDD +0F00 +0F18 0F19 +0F20 0F29 +0F35 +0F37 +0F39 +0F3E 0F47 +0F49 0F6A +0F71 0F84 +0F86 0F8B +0F90 0F97 +0F99 0FBC +0FC6 +1000 1021 +1023 1027 +1029 102A +102C 1032 +1036 1039 +1040 1049 +1050 1059 +10A0 10C5 +10D0 10FA +10FC +1100 1159 +115F 11A2 +11A8 11F9 +1200 1248 +124A 124D +1250 1256 +1258 +125A 125D +1260 1288 +128A 128D +1290 12B0 +12B2 12B5 +12B8 12BE +12C0 +12C2 12C5 +12C8 12D6 +12D8 1310 +1312 1315 +1318 135A +135F +1380 138F +13A0 13F4 +1401 166C +166F 1676 +1681 169A +16A0 16EA +16EE 16F0 +1700 170C +170E 1714 +1720 1734 +1740 1753 +1760 176C +176E 1770 +1772 1773 +1780 17B3 +17B6 17D3 +17D7 +17DC 17DD +17E0 17E9 +180B 180D +1810 1819 +1820 1877 +1880 18A9 +1900 191C +1920 192B +1930 193B +1946 196D +1970 1974 +1980 19A9 +19B0 19C9 +19D0 19D9 +1A00 1A1B +1D00 1DC3 +1E00 1E9B +1EA0 1EF9 +1F00 1F15 +1F18 1F1D +1F20 1F45 +1F48 1F4D +1F50 1F57 +1F59 +1F5B +1F5D +1F5F 1F7D +1F80 1FB4 +1FB6 1FBC +1FBE +1FC2 1FC4 +1FC6 1FCC +1FD0 1FD3 +1FD6 1FDB +1FE0 1FEC +1FF2 1FF4 +1FF6 1FFC +203F 2040 +2054 +2071 +207F +2090 2094 +20D0 20DC +20E1 +20E5 20EB +2102 +2107 +210A 2113 +2115 +2119 211D +2124 +2126 +2128 +212A 212D +212F 2131 +2133 2139 +213C 213F +2145 2149 +2160 2183 +2C00 2C2E +2C30 2C5E +2C80 2CE4 +2D00 2D25 +2D30 2D65 +2D6F +2D80 2D96 +2DA0 2DA6 +2DA8 2DAE +2DB0 2DB6 +2DB8 2DBE +2DC0 2DC6 +2DC8 2DCE +2DD0 2DD6 +2DD8 2DDE +3005 3007 +3021 302F +3031 3035 +3038 303C +3041 3096 +3099 309A +309D 309F +30A1 30FA +30FC 30FF +3105 312C +3131 318E +31A0 31B7 +31F0 31FF +3400 4DB5 +4E00 9FBB +A000 A48C +A800 A827 +AC00 D7A3 +F900 FA2D +FA30 FA6A +FA70 FAD9 +FB00 FB06 +FB13 FB17 +FB1D FB28 +FB2A FB36 +FB38 FB3C +FB3E +FB40 FB41 +FB43 FB44 +FB46 FBB1 +FBD3 FD3D +FD50 FD8F +FD92 FDC7 +FDF0 FDFB +FE00 FE0F +FE20 FE23 +FE33 FE34 +FE4D FE4F +FE70 FE74 +FE76 FEFC +FF10 FF19 +FF21 FF3A +FF3F +FF41 FF5A +FF66 FFBE +FFC2 FFC7 +FFCA FFCF +FFD2 FFD7 +FFDA FFDC +10000 1000B +1000D 10026 +10028 1003A +1003C 1003D +1003F 1004D +10050 1005D +10080 100FA +10140 10174 +10300 1031E +10330 1034A +10380 1039D +103A0 103C3 +103C8 103CF +103D1 103D5 +10400 1049D +104A0 104A9 +10800 10805 +10808 +1080A 10835 +10837 10838 +1083C +1083F +10A00 10A03 +10A05 10A06 +10A0C 10A13 +10A15 10A17 +10A19 10A33 +10A38 10A3A +10A3F +1D165 1D169 +1D16D 1D172 +1D17B 1D182 +1D185 1D18B +1D1AA 1D1AD +1D242 1D244 +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A5 +1D6A8 1D6C0 +1D6C2 1D6DA +1D6DC 1D6FA +1D6FC 1D714 +1D716 1D734 +1D736 1D74E +1D750 1D76E +1D770 1D788 +1D78A 1D7A8 +1D7AA 1D7C2 +1D7C4 1D7C9 +1D7CE 1D7FF +20000 2A6D6 +2F800 2FA1D +E0100 E01EF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IdStart.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IdStart.pl new file mode 100644 index 00000000000..36b6b51a205 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IdStart.pl @@ -0,0 +1,364 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{IdStart} (and fuzzy permutations) +# +# Meaning: [\p{Ll}\p{Lu}\p{Lt}\p{Lm}\p{Lo}\p{Nl}] +# +return <<'END'; +0041 005A +0061 007A +00AA +00B5 +00BA +00C0 00D6 +00D8 00F6 +00F8 0241 +0250 02C1 +02C6 02D1 +02E0 02E4 +02EE +037A +0386 +0388 038A +038C +038E 03A1 +03A3 03CE +03D0 03F5 +03F7 0481 +048A 04CE +04D0 04F9 +0500 050F +0531 0556 +0559 +0561 0587 +05D0 05EA +05F0 05F2 +0621 063A +0640 064A +066E 066F +0671 06D3 +06D5 +06E5 06E6 +06EE 06EF +06FA 06FC +06FF +0710 +0712 072F +074D 076D +0780 07A5 +07B1 +0904 0939 +093D +0950 +0958 0961 +097D +0985 098C +098F 0990 +0993 09A8 +09AA 09B0 +09B2 +09B6 09B9 +09BD +09CE +09DC 09DD +09DF 09E1 +09F0 09F1 +0A05 0A0A +0A0F 0A10 +0A13 0A28 +0A2A 0A30 +0A32 0A33 +0A35 0A36 +0A38 0A39 +0A59 0A5C +0A5E +0A72 0A74 +0A85 0A8D +0A8F 0A91 +0A93 0AA8 +0AAA 0AB0 +0AB2 0AB3 +0AB5 0AB9 +0ABD +0AD0 +0AE0 0AE1 +0B05 0B0C +0B0F 0B10 +0B13 0B28 +0B2A 0B30 +0B32 0B33 +0B35 0B39 +0B3D +0B5C 0B5D +0B5F 0B61 +0B71 +0B83 +0B85 0B8A +0B8E 0B90 +0B92 0B95 +0B99 0B9A +0B9C +0B9E 0B9F +0BA3 0BA4 +0BA8 0BAA +0BAE 0BB9 +0C05 0C0C +0C0E 0C10 +0C12 0C28 +0C2A 0C33 +0C35 0C39 +0C60 0C61 +0C85 0C8C +0C8E 0C90 +0C92 0CA8 +0CAA 0CB3 +0CB5 0CB9 +0CBD +0CDE +0CE0 0CE1 +0D05 0D0C +0D0E 0D10 +0D12 0D28 +0D2A 0D39 +0D60 0D61 +0D85 0D96 +0D9A 0DB1 +0DB3 0DBB +0DBD +0DC0 0DC6 +0E01 0E30 +0E32 0E33 +0E40 0E46 +0E81 0E82 +0E84 +0E87 0E88 +0E8A +0E8D +0E94 0E97 +0E99 0E9F +0EA1 0EA3 +0EA5 +0EA7 +0EAA 0EAB +0EAD 0EB0 +0EB2 0EB3 +0EBD +0EC0 0EC4 +0EC6 +0EDC 0EDD +0F00 +0F40 0F47 +0F49 0F6A +0F88 0F8B +1000 1021 +1023 1027 +1029 102A +1050 1055 +10A0 10C5 +10D0 10FA +10FC +1100 1159 +115F 11A2 +11A8 11F9 +1200 1248 +124A 124D +1250 1256 +1258 +125A 125D +1260 1288 +128A 128D +1290 12B0 +12B2 12B5 +12B8 12BE +12C0 +12C2 12C5 +12C8 12D6 +12D8 1310 +1312 1315 +1318 135A +1380 138F +13A0 13F4 +1401 166C +166F 1676 +1681 169A +16A0 16EA +16EE 16F0 +1700 170C +170E 1711 +1720 1731 +1740 1751 +1760 176C +176E 1770 +1780 17B3 +17D7 +17DC +1820 1877 +1880 18A8 +1900 191C +1950 196D +1970 1974 +1980 19A9 +19C1 19C7 +1A00 1A16 +1D00 1DBF +1E00 1E9B +1EA0 1EF9 +1F00 1F15 +1F18 1F1D +1F20 1F45 +1F48 1F4D +1F50 1F57 +1F59 +1F5B +1F5D +1F5F 1F7D +1F80 1FB4 +1FB6 1FBC +1FBE +1FC2 1FC4 +1FC6 1FCC +1FD0 1FD3 +1FD6 1FDB +1FE0 1FEC +1FF2 1FF4 +1FF6 1FFC +2071 +207F +2090 2094 +2102 +2107 +210A 2113 +2115 +2119 211D +2124 +2126 +2128 +212A 212D +212F 2131 +2133 2139 +213C 213F +2145 2149 +2160 2183 +2C00 2C2E +2C30 2C5E +2C80 2CE4 +2D00 2D25 +2D30 2D65 +2D6F +2D80 2D96 +2DA0 2DA6 +2DA8 2DAE +2DB0 2DB6 +2DB8 2DBE +2DC0 2DC6 +2DC8 2DCE +2DD0 2DD6 +2DD8 2DDE +3005 3007 +3021 3029 +3031 3035 +3038 303C +3041 3096 +309D 309F +30A1 30FA +30FC 30FF +3105 312C +3131 318E +31A0 31B7 +31F0 31FF +3400 4DB5 +4E00 9FBB +A000 A48C +A800 A801 +A803 A805 +A807 A80A +A80C A822 +AC00 D7A3 +F900 FA2D +FA30 FA6A +FA70 FAD9 +FB00 FB06 +FB13 FB17 +FB1D +FB1F FB28 +FB2A FB36 +FB38 FB3C +FB3E +FB40 FB41 +FB43 FB44 +FB46 FBB1 +FBD3 FD3D +FD50 FD8F +FD92 FDC7 +FDF0 FDFB +FE70 FE74 +FE76 FEFC +FF21 FF3A +FF41 FF5A +FF66 FFBE +FFC2 FFC7 +FFCA FFCF +FFD2 FFD7 +FFDA FFDC +10000 1000B +1000D 10026 +10028 1003A +1003C 1003D +1003F 1004D +10050 1005D +10080 100FA +10140 10174 +10300 1031E +10330 1034A +10380 1039D +103A0 103C3 +103C8 103CF +103D1 103D5 +10400 1049D +10800 10805 +10808 +1080A 10835 +10837 10838 +1083C +1083F +10A00 +10A10 10A13 +10A15 10A17 +10A19 10A33 +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A5 +1D6A8 1D6C0 +1D6C2 1D6DA +1D6DC 1D6FA +1D6FC 1D714 +1D716 1D734 +1D736 1D74E +1D750 1D76E +1D770 1D788 +1D78A 1D7A8 +1D7AA 1D7C2 +1D7C4 1D7C9 +20000 2A6D6 +2F800 2FA1D +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ideo.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ideo.pl new file mode 100644 index 00000000000..1c5231cf614 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ideo.pl @@ -0,0 +1,18 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Ideographic' +# +return <<'END'; +3006 3007 Ideographic +3021 3029 Ideographic +3038 303A Ideographic +3400 4DB5 Ideographic +4E00 9FBB Ideographic +F900 FA2D Ideographic +FA70 FAD9 Ideographic +20000 2A6D6 Ideographic +2F800 2FA1D Ideographic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ideograp.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ideograp.pl new file mode 100644 index 00000000000..e102ddc5f9c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ideograp.pl @@ -0,0 +1,21 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Ideographic} (and fuzzy permutations) +# +# Meaning: Extended property 'Ideographic' +# +return <<'END'; +3006 3007 Ideographic +3021 3029 Ideographic +3038 303A Ideographic +3400 4DB5 Ideographic +4E00 9FBB Ideographic +F900 FA2D Ideographic +FA70 FAD9 Ideographic +20000 2A6D6 Ideographic +2F800 2FA1D Ideographic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IdsBinar.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IdsBinar.pl new file mode 100644 index 00000000000..f4369d3c5d5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IdsBinar.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{IdsBinaryOperator} (and fuzzy permutations) +# +# Meaning: Extended property 'IDS_Binary_Operator' +# +return <<'END'; +2FF0 2FF1 IDS_Binary_Operator +2FF4 2FFB IDS_Binary_Operator +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IdsTrina.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IdsTrina.pl new file mode 100644 index 00000000000..c670c87c9fd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/IdsTrina.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{IdsTrinaryOperator} (and fuzzy permutations) +# +# Meaning: Extended property 'IDS_Trinary_Operator' +# +return <<'END'; +2FF2 2FF3 IDS_Trinary_Operator +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InAegean.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InAegean.pl new file mode 100644 index 00000000000..cc79a027883 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InAegean.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InAegeanNumbers} (and fuzzy permutations) +# +# Meaning: Block 'Aegean Numbers' +# +return <<'END'; +10100 1013F Aegean Numbers +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InAlphab.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InAlphab.pl new file mode 100644 index 00000000000..077354b7014 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InAlphab.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InAlphabeticPresentationForms} (and fuzzy permutations) +# +# Meaning: Block 'Alphabetic Presentation Forms' +# +return <<'END'; +FB00 FB4F Alphabetic Presentation Forms +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InAncie2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InAncie2.pl new file mode 100644 index 00000000000..86bb0d1e934 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InAncie2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InAncientGreekMusicalNotation} (and fuzzy permutations) +# +# Meaning: Block 'Ancient Greek Musical Notation' +# +return <<'END'; +1D200 1D24F Ancient Greek Musical Notation +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InAncien.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InAncien.pl new file mode 100644 index 00000000000..7bd66942de4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InAncien.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InAncientGreekNumbers} (and fuzzy permutations) +# +# Meaning: Block 'Ancient Greek Numbers' +# +return <<'END'; +10140 1018F Ancient Greek Numbers +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArabi2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArabi2.pl new file mode 100644 index 00000000000..8f51aa9c114 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArabi2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InArabicSupplement} (and fuzzy permutations) +# +# Meaning: Block 'Arabic Supplement' +# +return <<'END'; +0750 077F Arabic Supplement +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArabi3.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArabi3.pl new file mode 100644 index 00000000000..0c73cbaddba --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArabi3.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InArabicPresentationFormsB} (and fuzzy permutations) +# +# Meaning: Block 'Arabic Presentation Forms-B' +# +return <<'END'; +FE70 FEFF Arabic Presentation Forms-B +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArabi4.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArabi4.pl new file mode 100644 index 00000000000..d05b7d9e62e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArabi4.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InArabicPresentationFormsA} (and fuzzy permutations) +# +# Meaning: Block 'Arabic Presentation Forms-A' +# +return <<'END'; +FB50 FDFF Arabic Presentation Forms-A +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArabic.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArabic.pl new file mode 100644 index 00000000000..aa60b068c6b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArabic.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InArabic} (and fuzzy permutations) +# +# Meaning: Block 'Arabic' +# +return <<'END'; +0600 06FF Arabic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArmeni.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArmeni.pl new file mode 100644 index 00000000000..789cbc27e18 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArmeni.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InArmenian} (and fuzzy permutations) +# +# Meaning: Block 'Armenian' +# +return <<'END'; +0530 058F Armenian +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArrows.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArrows.pl new file mode 100644 index 00000000000..028e3e75465 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InArrows.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InArrows} (and fuzzy permutations) +# +# Meaning: Block 'Arrows' +# +return <<'END'; +2190 21FF Arrows +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBasicL.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBasicL.pl new file mode 100644 index 00000000000..e1b019a4007 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBasicL.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InBasicLatin} (and fuzzy permutations) +# +# Meaning: Block 'Basic Latin' +# +return <<'END'; +0000 007F Basic Latin +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBengal.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBengal.pl new file mode 100644 index 00000000000..50b23eed58c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBengal.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InBengali} (and fuzzy permutations) +# +# Meaning: Block 'Bengali' +# +return <<'END'; +0980 09FF Bengali +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBlockE.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBlockE.pl new file mode 100644 index 00000000000..a7fb74e514b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBlockE.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InBlockElements} (and fuzzy permutations) +# +# Meaning: Block 'Block Elements' +# +return <<'END'; +2580 259F Block Elements +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBopom2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBopom2.pl new file mode 100644 index 00000000000..2e68025f4ba --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBopom2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InBopomofoExtended} (and fuzzy permutations) +# +# Meaning: Block 'Bopomofo Extended' +# +return <<'END'; +31A0 31BF Bopomofo Extended +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBopomo.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBopomo.pl new file mode 100644 index 00000000000..b5ef89cfd72 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBopomo.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InBopomofo} (and fuzzy permutations) +# +# Meaning: Block 'Bopomofo' +# +return <<'END'; +3100 312F Bopomofo +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBoxDra.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBoxDra.pl new file mode 100644 index 00000000000..f98d5b9ceff --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBoxDra.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InBoxDrawing} (and fuzzy permutations) +# +# Meaning: Block 'Box Drawing' +# +return <<'END'; +2500 257F Box Drawing +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBraill.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBraill.pl new file mode 100644 index 00000000000..c3229754d8e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBraill.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InBraillePatterns} (and fuzzy permutations) +# +# Meaning: Block 'Braille Patterns' +# +return <<'END'; +2800 28FF Braille Patterns +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBugine.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBugine.pl new file mode 100644 index 00000000000..c9c343866bb --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBugine.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InBuginese} (and fuzzy permutations) +# +# Meaning: Block 'Buginese' +# +return <<'END'; +1A00 1A1F Buginese +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBuhid.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBuhid.pl new file mode 100644 index 00000000000..53c924ed26c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InBuhid.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InBuhid} (and fuzzy permutations) +# +# Meaning: Block 'Buhid' +# +return <<'END'; +1740 175F Buhid +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InByzant.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InByzant.pl new file mode 100644 index 00000000000..85d4bd0cc31 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InByzant.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InByzantineMusicalSymbols} (and fuzzy permutations) +# +# Meaning: Block 'Byzantine Musical Symbols' +# +return <<'END'; +1D000 1D0FF Byzantine Musical Symbols +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCherok.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCherok.pl new file mode 100644 index 00000000000..cd72f1c1364 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCherok.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCherokee} (and fuzzy permutations) +# +# Meaning: Block 'Cherokee' +# +return <<'END'; +13A0 13FF Cherokee +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkCo2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkCo2.pl new file mode 100644 index 00000000000..cc47a3717f4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkCo2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCjkCompatibilityForms} (and fuzzy permutations) +# +# Meaning: Block 'CJK Compatibility Forms' +# +return <<'END'; +FE30 FE4F CJK Compatibility Forms +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkCo3.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkCo3.pl new file mode 100644 index 00000000000..bf3387cd61d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkCo3.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCjkCompatibilityIdeographs} (and fuzzy permutations) +# +# Meaning: Block 'CJK Compatibility Ideographs' +# +return <<'END'; +F900 FAFF CJK Compatibility Ideographs +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkCo4.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkCo4.pl new file mode 100644 index 00000000000..0e280e12d80 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkCo4.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCjkCompatibilityIdeographsSupplement} (and fuzzy permutations) +# +# Meaning: Block 'CJK Compatibility Ideographs Supplement' +# +return <<'END'; +2F800 2FA1F CJK Compatibility Ideographs Supplement +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkCom.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkCom.pl new file mode 100644 index 00000000000..28ddd82a363 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkCom.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCjkCompatibility} (and fuzzy permutations) +# +# Meaning: Block 'CJK Compatibility' +# +return <<'END'; +3300 33FF CJK Compatibility +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkRad.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkRad.pl new file mode 100644 index 00000000000..d89d3db21ab --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkRad.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCjkRadicalsSupplement} (and fuzzy permutations) +# +# Meaning: Block 'CJK Radicals Supplement' +# +return <<'END'; +2E80 2EFF CJK Radicals Supplement +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkStr.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkStr.pl new file mode 100644 index 00000000000..0b3751b44cc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkStr.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCjkStrokes} (and fuzzy permutations) +# +# Meaning: Block 'CJK Strokes' +# +return <<'END'; +31C0 31EF CJK Strokes +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkSym.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkSym.pl new file mode 100644 index 00000000000..d40cb8942ad --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkSym.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCjkSymbolsAndPunctuation} (and fuzzy permutations) +# +# Meaning: Block 'CJK Symbols and Punctuation' +# +return <<'END'; +3000 303F CJK Symbols and Punctuation +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkUn2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkUn2.pl new file mode 100644 index 00000000000..1ef3202509b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkUn2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCjkUnifiedIdeographsExtensionB} (and fuzzy permutations) +# +# Meaning: Block 'CJK Unified Ideographs Extension B' +# +return <<'END'; +20000 2A6DF CJK Unified Ideographs Extension B +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkUn3.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkUn3.pl new file mode 100644 index 00000000000..49496758c55 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkUn3.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCjkUnifiedIdeographsExtensionA} (and fuzzy permutations) +# +# Meaning: Block 'CJK Unified Ideographs Extension A' +# +return <<'END'; +3400 4DBF CJK Unified Ideographs Extension A +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkUni.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkUni.pl new file mode 100644 index 00000000000..b6f4934beb3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCjkUni.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCjkUnifiedIdeographs} (and fuzzy permutations) +# +# Meaning: Block 'CJK Unified Ideographs' +# +return <<'END'; +4E00 9FFF CJK Unified Ideographs +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCombi2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCombi2.pl new file mode 100644 index 00000000000..1d3f01809f3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCombi2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCombiningDiacriticalMarks} (and fuzzy permutations) +# +# Meaning: Block 'Combining Diacritical Marks' +# +return <<'END'; +0300 036F Combining Diacritical Marks +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCombi3.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCombi3.pl new file mode 100644 index 00000000000..db10c12f5ee --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCombi3.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCombiningDiacriticalMarksSupplement} (and fuzzy permutations) +# +# Meaning: Block 'Combining Diacritical Marks Supplement' +# +return <<'END'; +1DC0 1DFF Combining Diacritical Marks Supplement +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCombi4.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCombi4.pl new file mode 100644 index 00000000000..192f74bf1b0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCombi4.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCombiningDiacriticalMarksForSymbols} (and fuzzy permutations) +# +# Meaning: Block 'Combining Diacritical Marks for Symbols' +# +return <<'END'; +20D0 20FF Combining Diacritical Marks for Symbols +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCombin.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCombin.pl new file mode 100644 index 00000000000..0bcbaa88331 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCombin.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCombiningHalfMarks} (and fuzzy permutations) +# +# Meaning: Block 'Combining Half Marks' +# +return <<'END'; +FE20 FE2F Combining Half Marks +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InContro.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InContro.pl new file mode 100644 index 00000000000..58274485166 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InContro.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InControlPictures} (and fuzzy permutations) +# +# Meaning: Block 'Control Pictures' +# +return <<'END'; +2400 243F Control Pictures +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCoptic.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCoptic.pl new file mode 100644 index 00000000000..0e60f4faf9a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCoptic.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCoptic} (and fuzzy permutations) +# +# Meaning: Block 'Coptic' +# +return <<'END'; +2C80 2CFF Coptic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCurren.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCurren.pl new file mode 100644 index 00000000000..c5778875dd4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCurren.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCurrencySymbols} (and fuzzy permutations) +# +# Meaning: Block 'Currency Symbols' +# +return <<'END'; +20A0 20CF Currency Symbols +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCyprio.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCyprio.pl new file mode 100644 index 00000000000..f1f53874a92 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCyprio.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCypriotSyllabary} (and fuzzy permutations) +# +# Meaning: Block 'Cypriot Syllabary' +# +return <<'END'; +10800 1083F Cypriot Syllabary +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCyril2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCyril2.pl new file mode 100644 index 00000000000..0f748ef501f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCyril2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCyrillicSupplement} (and fuzzy permutations) +# +# Meaning: Block 'Cyrillic Supplement' +# +return <<'END'; +0500 052F Cyrillic Supplement +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCyrill.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCyrill.pl new file mode 100644 index 00000000000..fc252cfcd5e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InCyrill.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InCyrillic} (and fuzzy permutations) +# +# Meaning: Block 'Cyrillic' +# +return <<'END'; +0400 04FF Cyrillic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InDesere.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InDesere.pl new file mode 100644 index 00000000000..1f670a5e540 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InDesere.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InDeseret} (and fuzzy permutations) +# +# Meaning: Block 'Deseret' +# +return <<'END'; +10400 1044F Deseret +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InDevana.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InDevana.pl new file mode 100644 index 00000000000..147b3ba239c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InDevana.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InDevanagari} (and fuzzy permutations) +# +# Meaning: Block 'Devanagari' +# +return <<'END'; +0900 097F Devanagari +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InDingba.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InDingba.pl new file mode 100644 index 00000000000..758fe902a39 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InDingba.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InDingbats} (and fuzzy permutations) +# +# Meaning: Block 'Dingbats' +# +return <<'END'; +2700 27BF Dingbats +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InEnclo2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InEnclo2.pl new file mode 100644 index 00000000000..8f040d22cf3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InEnclo2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InEnclosedCjkLettersAndMonths} (and fuzzy permutations) +# +# Meaning: Block 'Enclosed CJK Letters and Months' +# +return <<'END'; +3200 32FF Enclosed CJK Letters and Months +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InEnclos.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InEnclos.pl new file mode 100644 index 00000000000..2a8fc240d4e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InEnclos.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InEnclosedAlphanumerics} (and fuzzy permutations) +# +# Meaning: Block 'Enclosed Alphanumerics' +# +return <<'END'; +2460 24FF Enclosed Alphanumerics +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InEthio2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InEthio2.pl new file mode 100644 index 00000000000..0c3c5c9b66f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InEthio2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InEthiopicExtended} (and fuzzy permutations) +# +# Meaning: Block 'Ethiopic Extended' +# +return <<'END'; +2D80 2DDF Ethiopic Extended +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InEthio3.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InEthio3.pl new file mode 100644 index 00000000000..026972adc84 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InEthio3.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InEthiopicSupplement} (and fuzzy permutations) +# +# Meaning: Block 'Ethiopic Supplement' +# +return <<'END'; +1380 139F Ethiopic Supplement +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InEthiop.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InEthiop.pl new file mode 100644 index 00000000000..5a9c8058c90 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InEthiop.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InEthiopic} (and fuzzy permutations) +# +# Meaning: Block 'Ethiopic' +# +return <<'END'; +1200 137F Ethiopic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGenera.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGenera.pl new file mode 100644 index 00000000000..c8f64b98c15 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGenera.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InGeneralPunctuation} (and fuzzy permutations) +# +# Meaning: Block 'General Punctuation' +# +return <<'END'; +2000 206F General Punctuation +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGeomet.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGeomet.pl new file mode 100644 index 00000000000..f6f80ef24e9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGeomet.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InGeometricShapes} (and fuzzy permutations) +# +# Meaning: Block 'Geometric Shapes' +# +return <<'END'; +25A0 25FF Geometric Shapes +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGeorg2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGeorg2.pl new file mode 100644 index 00000000000..0af43cd13e1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGeorg2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InGeorgianSupplement} (and fuzzy permutations) +# +# Meaning: Block 'Georgian Supplement' +# +return <<'END'; +2D00 2D2F Georgian Supplement +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGeorgi.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGeorgi.pl new file mode 100644 index 00000000000..c91f2e01ddd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGeorgi.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InGeorgian} (and fuzzy permutations) +# +# Meaning: Block 'Georgian' +# +return <<'END'; +10A0 10FF Georgian +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGlagol.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGlagol.pl new file mode 100644 index 00000000000..c9f8d6ab8d6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGlagol.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InGlagolitic} (and fuzzy permutations) +# +# Meaning: Block 'Glagolitic' +# +return <<'END'; +2C00 2C5F Glagolitic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGothic.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGothic.pl new file mode 100644 index 00000000000..8e6db64ce9f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGothic.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InGothic} (and fuzzy permutations) +# +# Meaning: Block 'Gothic' +# +return <<'END'; +10330 1034F Gothic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGreekA.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGreekA.pl new file mode 100644 index 00000000000..404e9687525 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGreekA.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InGreekAndCoptic} (and fuzzy permutations) +# +# Meaning: Block 'Greek and Coptic' +# +return <<'END'; +0370 03FF Greek and Coptic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGreekE.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGreekE.pl new file mode 100644 index 00000000000..941e892f9cf --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGreekE.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InGreekExtended} (and fuzzy permutations) +# +# Meaning: Block 'Greek Extended' +# +return <<'END'; +1F00 1FFF Greek Extended +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGujara.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGujara.pl new file mode 100644 index 00000000000..6028b4411ed --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGujara.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InGujarati} (and fuzzy permutations) +# +# Meaning: Block 'Gujarati' +# +return <<'END'; +0A80 0AFF Gujarati +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGurmuk.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGurmuk.pl new file mode 100644 index 00000000000..53dbbdbde9b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InGurmuk.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InGurmukhi} (and fuzzy permutations) +# +# Meaning: Block 'Gurmukhi' +# +return <<'END'; +0A00 0A7F Gurmukhi +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHalfwi.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHalfwi.pl new file mode 100644 index 00000000000..a03cb114347 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHalfwi.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InHalfwidthAndFullwidthForms} (and fuzzy permutations) +# +# Meaning: Block 'Halfwidth and Fullwidth Forms' +# +return <<'END'; +FF00 FFEF Halfwidth and Fullwidth Forms +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHangu2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHangu2.pl new file mode 100644 index 00000000000..558674c704b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHangu2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InHangulSyllables} (and fuzzy permutations) +# +# Meaning: Block 'Hangul Syllables' +# +return <<'END'; +AC00 D7AF Hangul Syllables +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHangu3.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHangu3.pl new file mode 100644 index 00000000000..87e35ea36e4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHangu3.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InHangulCompatibilityJamo} (and fuzzy permutations) +# +# Meaning: Block 'Hangul Compatibility Jamo' +# +return <<'END'; +3130 318F Hangul Compatibility Jamo +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHangul.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHangul.pl new file mode 100644 index 00000000000..c73c1650994 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHangul.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InHangulJamo} (and fuzzy permutations) +# +# Meaning: Block 'Hangul Jamo' +# +return <<'END'; +1100 11FF Hangul Jamo +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHanuno.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHanuno.pl new file mode 100644 index 00000000000..38802fff087 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHanuno.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InHanunoo} (and fuzzy permutations) +# +# Meaning: Block 'Hanunoo' +# +return <<'END'; +1720 173F Hanunoo +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHebrew.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHebrew.pl new file mode 100644 index 00000000000..ab060cc410f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHebrew.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InHebrew} (and fuzzy permutations) +# +# Meaning: Block 'Hebrew' +# +return <<'END'; +0590 05FF Hebrew +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHighPr.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHighPr.pl new file mode 100644 index 00000000000..df0eaebc3cd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHighPr.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InHighPrivateUseSurrogates} (and fuzzy permutations) +# +# Meaning: Block 'High Private Use Surrogates' +# +return <<'END'; +DB80 DBFF High Private Use Surrogates +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHighSu.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHighSu.pl new file mode 100644 index 00000000000..52d75820482 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHighSu.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InHighSurrogates} (and fuzzy permutations) +# +# Meaning: Block 'High Surrogates' +# +return <<'END'; +D800 DB7F High Surrogates +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHiraga.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHiraga.pl new file mode 100644 index 00000000000..d683fc34abe --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InHiraga.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InHiragana} (and fuzzy permutations) +# +# Meaning: Block 'Hiragana' +# +return <<'END'; +3040 309F Hiragana +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InIdeogr.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InIdeogr.pl new file mode 100644 index 00000000000..9e5798a4792 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InIdeogr.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InIdeographicDescriptionCharacters} (and fuzzy permutations) +# +# Meaning: Block 'Ideographic Description Characters' +# +return <<'END'; +2FF0 2FFF Ideographic Description Characters +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InIpaExt.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InIpaExt.pl new file mode 100644 index 00000000000..ad4bd5f3daf --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InIpaExt.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InIpaExtensions} (and fuzzy permutations) +# +# Meaning: Block 'IPA Extensions' +# +return <<'END'; +0250 02AF IPA Extensions +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKanbun.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKanbun.pl new file mode 100644 index 00000000000..86a2c184c53 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKanbun.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InKanbun} (and fuzzy permutations) +# +# Meaning: Block 'Kanbun' +# +return <<'END'; +3190 319F Kanbun +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKangxi.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKangxi.pl new file mode 100644 index 00000000000..4ad505a139f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKangxi.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InKangxiRadicals} (and fuzzy permutations) +# +# Meaning: Block 'Kangxi Radicals' +# +return <<'END'; +2F00 2FDF Kangxi Radicals +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKannad.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKannad.pl new file mode 100644 index 00000000000..fa11e21ef26 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKannad.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InKannada} (and fuzzy permutations) +# +# Meaning: Block 'Kannada' +# +return <<'END'; +0C80 0CFF Kannada +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKatak2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKatak2.pl new file mode 100644 index 00000000000..5be44f8eb36 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKatak2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InKatakanaPhoneticExtensions} (and fuzzy permutations) +# +# Meaning: Block 'Katakana Phonetic Extensions' +# +return <<'END'; +31F0 31FF Katakana Phonetic Extensions +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKataka.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKataka.pl new file mode 100644 index 00000000000..00abc4a8eab --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKataka.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InKatakana} (and fuzzy permutations) +# +# Meaning: Block 'Katakana' +# +return <<'END'; +30A0 30FF Katakana +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKharos.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKharos.pl new file mode 100644 index 00000000000..d504623a164 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKharos.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InKharoshthi} (and fuzzy permutations) +# +# Meaning: Block 'Kharoshthi' +# +return <<'END'; +10A00 10A5F Kharoshthi +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKhmer.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKhmer.pl new file mode 100644 index 00000000000..062e5448eca --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKhmer.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InKhmer} (and fuzzy permutations) +# +# Meaning: Block 'Khmer' +# +return <<'END'; +1780 17FF Khmer +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKhmerS.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKhmerS.pl new file mode 100644 index 00000000000..4de36f31bfc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InKhmerS.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InKhmerSymbols} (and fuzzy permutations) +# +# Meaning: Block 'Khmer Symbols' +# +return <<'END'; +19E0 19FF Khmer Symbols +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLao.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLao.pl new file mode 100644 index 00000000000..48d350e6b6a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLao.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InLao} (and fuzzy permutations) +# +# Meaning: Block 'Lao' +# +return <<'END'; +0E80 0EFF Lao +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLatin1.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLatin1.pl new file mode 100644 index 00000000000..0c226d9dfe0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLatin1.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InLatin1Supplement} (and fuzzy permutations) +# +# Meaning: Block 'Latin-1 Supplement' +# +return <<'END'; +0080 00FF Latin-1 Supplement +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLatin2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLatin2.pl new file mode 100644 index 00000000000..0cc83e013b3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLatin2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InLatinExtendedA} (and fuzzy permutations) +# +# Meaning: Block 'Latin Extended-A' +# +return <<'END'; +0100 017F Latin Extended-A +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLatin3.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLatin3.pl new file mode 100644 index 00000000000..9e507e3698c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLatin3.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InLatinExtendedAdditional} (and fuzzy permutations) +# +# Meaning: Block 'Latin Extended Additional' +# +return <<'END'; +1E00 1EFF Latin Extended Additional +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLatinE.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLatinE.pl new file mode 100644 index 00000000000..bcd85ce3f23 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLatinE.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InLatinExtendedB} (and fuzzy permutations) +# +# Meaning: Block 'Latin Extended-B' +# +return <<'END'; +0180 024F Latin Extended-B +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLetter.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLetter.pl new file mode 100644 index 00000000000..30cb9322c04 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLetter.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InLetterlikeSymbols} (and fuzzy permutations) +# +# Meaning: Block 'Letterlike Symbols' +# +return <<'END'; +2100 214F Letterlike Symbols +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLimbu.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLimbu.pl new file mode 100644 index 00000000000..18f69237c30 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLimbu.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InLimbu} (and fuzzy permutations) +# +# Meaning: Block 'Limbu' +# +return <<'END'; +1900 194F Limbu +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLinea2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLinea2.pl new file mode 100644 index 00000000000..d988b319af2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLinea2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InLinearBSyllabary} (and fuzzy permutations) +# +# Meaning: Block 'Linear B Syllabary' +# +return <<'END'; +10000 1007F Linear B Syllabary +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLinear.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLinear.pl new file mode 100644 index 00000000000..26fa532dbc4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLinear.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InLinearBIdeograms} (and fuzzy permutations) +# +# Meaning: Block 'Linear B Ideograms' +# +return <<'END'; +10080 100FF Linear B Ideograms +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLowSur.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLowSur.pl new file mode 100644 index 00000000000..2a8df1afd9c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InLowSur.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InLowSurrogates} (and fuzzy permutations) +# +# Meaning: Block 'Low Surrogates' +# +return <<'END'; +DC00 DFFF Low Surrogates +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMalaya.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMalaya.pl new file mode 100644 index 00000000000..4963a2e752f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMalaya.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InMalayalam} (and fuzzy permutations) +# +# Meaning: Block 'Malayalam' +# +return <<'END'; +0D00 0D7F Malayalam +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMathe2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMathe2.pl new file mode 100644 index 00000000000..28fad1fe920 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMathe2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InMathematicalAlphanumericSymbols} (and fuzzy permutations) +# +# Meaning: Block 'Mathematical Alphanumeric Symbols' +# +return <<'END'; +1D400 1D7FF Mathematical Alphanumeric Symbols +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMathem.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMathem.pl new file mode 100644 index 00000000000..7e4b77e48a1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMathem.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InMathematicalOperators} (and fuzzy permutations) +# +# Meaning: Block 'Mathematical Operators' +# +return <<'END'; +2200 22FF Mathematical Operators +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMisce2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMisce2.pl new file mode 100644 index 00000000000..cb5de83c684 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMisce2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InMiscellaneousTechnical} (and fuzzy permutations) +# +# Meaning: Block 'Miscellaneous Technical' +# +return <<'END'; +2300 23FF Miscellaneous Technical +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMisce3.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMisce3.pl new file mode 100644 index 00000000000..2df83f9e504 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMisce3.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InMiscellaneousSymbolsAndArrows} (and fuzzy permutations) +# +# Meaning: Block 'Miscellaneous Symbols and Arrows' +# +return <<'END'; +2B00 2BFF Miscellaneous Symbols and Arrows +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMisce4.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMisce4.pl new file mode 100644 index 00000000000..1be2bed9102 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMisce4.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InMiscellaneousMathematicalSymbolsA} (and fuzzy permutations) +# +# Meaning: Block 'Miscellaneous Mathematical Symbols-A' +# +return <<'END'; +27C0 27EF Miscellaneous Mathematical Symbols-A +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMisce5.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMisce5.pl new file mode 100644 index 00000000000..765410a21cd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMisce5.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InMiscellaneousMathematicalSymbolsB} (and fuzzy permutations) +# +# Meaning: Block 'Miscellaneous Mathematical Symbols-B' +# +return <<'END'; +2980 29FF Miscellaneous Mathematical Symbols-B +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMiscel.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMiscel.pl new file mode 100644 index 00000000000..e03e58a6407 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMiscel.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InMiscellaneousSymbols} (and fuzzy permutations) +# +# Meaning: Block 'Miscellaneous Symbols' +# +return <<'END'; +2600 26FF Miscellaneous Symbols +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InModifi.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InModifi.pl new file mode 100644 index 00000000000..301b68e2c7f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InModifi.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InModifierToneLetters} (and fuzzy permutations) +# +# Meaning: Block 'Modifier Tone Letters' +# +return <<'END'; +A700 A71F Modifier Tone Letters +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMongol.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMongol.pl new file mode 100644 index 00000000000..facdf8583bf --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMongol.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InMongolian} (and fuzzy permutations) +# +# Meaning: Block 'Mongolian' +# +return <<'END'; +1800 18AF Mongolian +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMusica.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMusica.pl new file mode 100644 index 00000000000..e13a83ed3d2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMusica.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InMusicalSymbols} (and fuzzy permutations) +# +# Meaning: Block 'Musical Symbols' +# +return <<'END'; +1D100 1D1FF Musical Symbols +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMyanma.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMyanma.pl new file mode 100644 index 00000000000..4fc596ad29d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InMyanma.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InMyanmar} (and fuzzy permutations) +# +# Meaning: Block 'Myanmar' +# +return <<'END'; +1000 109F Myanmar +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InNewTai.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InNewTai.pl new file mode 100644 index 00000000000..8eb2d94520c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InNewTai.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InNewTaiLue} (and fuzzy permutations) +# +# Meaning: Block 'New Tai Lue' +# +return <<'END'; +1980 19DF New Tai Lue +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InNumber.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InNumber.pl new file mode 100644 index 00000000000..e962dad1830 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InNumber.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InNumberForms} (and fuzzy permutations) +# +# Meaning: Block 'Number Forms' +# +return <<'END'; +2150 218F Number Forms +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOgham.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOgham.pl new file mode 100644 index 00000000000..aabf05a0460 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOgham.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InOgham} (and fuzzy permutations) +# +# Meaning: Block 'Ogham' +# +return <<'END'; +1680 169F Ogham +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOldIta.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOldIta.pl new file mode 100644 index 00000000000..4a20df50380 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOldIta.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InOldItalic} (and fuzzy permutations) +# +# Meaning: Block 'Old Italic' +# +return <<'END'; +10300 1032F Old Italic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOldPer.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOldPer.pl new file mode 100644 index 00000000000..8cc534e29fe --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOldPer.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InOldPersian} (and fuzzy permutations) +# +# Meaning: Block 'Old Persian' +# +return <<'END'; +103A0 103DF Old Persian +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOptica.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOptica.pl new file mode 100644 index 00000000000..a191ec9621e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOptica.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InOpticalCharacterRecognition} (and fuzzy permutations) +# +# Meaning: Block 'Optical Character Recognition' +# +return <<'END'; +2440 245F Optical Character Recognition +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOriya.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOriya.pl new file mode 100644 index 00000000000..a44c55a2615 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOriya.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InOriya} (and fuzzy permutations) +# +# Meaning: Block 'Oriya' +# +return <<'END'; +0B00 0B7F Oriya +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOsmany.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOsmany.pl new file mode 100644 index 00000000000..9ec5f8b7032 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InOsmany.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InOsmanya} (and fuzzy permutations) +# +# Meaning: Block 'Osmanya' +# +return <<'END'; +10480 104AF Osmanya +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InPhone2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InPhone2.pl new file mode 100644 index 00000000000..f22e8d16d96 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InPhone2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InPhoneticExtensionsSupplement} (and fuzzy permutations) +# +# Meaning: Block 'Phonetic Extensions Supplement' +# +return <<'END'; +1D80 1DBF Phonetic Extensions Supplement +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InPhonet.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InPhonet.pl new file mode 100644 index 00000000000..017d026a9b1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InPhonet.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InPhoneticExtensions} (and fuzzy permutations) +# +# Meaning: Block 'Phonetic Extensions' +# +return <<'END'; +1D00 1D7F Phonetic Extensions +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InPrivat.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InPrivat.pl new file mode 100644 index 00000000000..42fcd64103a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InPrivat.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InPrivateUseArea} (and fuzzy permutations) +# +# Meaning: Block 'Private Use Area' +# +return <<'END'; +E000 F8FF Private Use Area +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InRunic.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InRunic.pl new file mode 100644 index 00000000000..786799e7052 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InRunic.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InRunic} (and fuzzy permutations) +# +# Meaning: Block 'Runic' +# +return <<'END'; +16A0 16FF Runic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InShavia.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InShavia.pl new file mode 100644 index 00000000000..341fb513954 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InShavia.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InShavian} (and fuzzy permutations) +# +# Meaning: Block 'Shavian' +# +return <<'END'; +10450 1047F Shavian +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSinhal.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSinhal.pl new file mode 100644 index 00000000000..6a374728ff2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSinhal.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InSinhala} (and fuzzy permutations) +# +# Meaning: Block 'Sinhala' +# +return <<'END'; +0D80 0DFF Sinhala +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSmallF.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSmallF.pl new file mode 100644 index 00000000000..011abec7579 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSmallF.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InSmallFormVariants} (and fuzzy permutations) +# +# Meaning: Block 'Small Form Variants' +# +return <<'END'; +FE50 FE6F Small Form Variants +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSpacin.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSpacin.pl new file mode 100644 index 00000000000..960ec0adde1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSpacin.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InSpacingModifierLetters} (and fuzzy permutations) +# +# Meaning: Block 'Spacing Modifier Letters' +# +return <<'END'; +02B0 02FF Spacing Modifier Letters +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSpecia.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSpecia.pl new file mode 100644 index 00000000000..85771f6a27c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSpecia.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InSpecials} (and fuzzy permutations) +# +# Meaning: Block 'Specials' +# +return <<'END'; +FFF0 FFFF Specials +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSupers.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSupers.pl new file mode 100644 index 00000000000..df6a9adf689 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSupers.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InSuperscriptsAndSubscripts} (and fuzzy permutations) +# +# Meaning: Block 'Superscripts and Subscripts' +# +return <<'END'; +2070 209F Superscripts and Subscripts +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSuppl2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSuppl2.pl new file mode 100644 index 00000000000..d6201c7377c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSuppl2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InSupplementalArrowsA} (and fuzzy permutations) +# +# Meaning: Block 'Supplemental Arrows-A' +# +return <<'END'; +27F0 27FF Supplemental Arrows-A +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSuppl3.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSuppl3.pl new file mode 100644 index 00000000000..a1fe7ce5c03 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSuppl3.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InSupplementalPunctuation} (and fuzzy permutations) +# +# Meaning: Block 'Supplemental Punctuation' +# +return <<'END'; +2E00 2E7F Supplemental Punctuation +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSuppl4.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSuppl4.pl new file mode 100644 index 00000000000..ed610354f9d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSuppl4.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InSupplementaryPrivateUseAreaA} (and fuzzy permutations) +# +# Meaning: Block 'Supplementary Private Use Area-A' +# +return <<'END'; +F0000 FFFFF Supplementary Private Use Area-A +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSuppl5.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSuppl5.pl new file mode 100644 index 00000000000..19e3d669059 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSuppl5.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InSupplementaryPrivateUseAreaB} (and fuzzy permutations) +# +# Meaning: Block 'Supplementary Private Use Area-B' +# +return <<'END'; +100000 10FFFF Supplementary Private Use Area-B +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSuppl6.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSuppl6.pl new file mode 100644 index 00000000000..a5efef621a0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSuppl6.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InSupplementalMathematicalOperators} (and fuzzy permutations) +# +# Meaning: Block 'Supplemental Mathematical Operators' +# +return <<'END'; +2A00 2AFF Supplemental Mathematical Operators +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSupple.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSupple.pl new file mode 100644 index 00000000000..755dc683567 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSupple.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InSupplementalArrowsB} (and fuzzy permutations) +# +# Meaning: Block 'Supplemental Arrows-B' +# +return <<'END'; +2900 297F Supplemental Arrows-B +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSyloti.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSyloti.pl new file mode 100644 index 00000000000..d29f285b5e3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSyloti.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InSylotiNagri} (and fuzzy permutations) +# +# Meaning: Block 'Syloti Nagri' +# +return <<'END'; +A800 A82F Syloti Nagri +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSyriac.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSyriac.pl new file mode 100644 index 00000000000..aed8b10fabf --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InSyriac.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InSyriac} (and fuzzy permutations) +# +# Meaning: Block 'Syriac' +# +return <<'END'; +0700 074F Syriac +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTagalo.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTagalo.pl new file mode 100644 index 00000000000..32a9c5840df --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTagalo.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InTagalog} (and fuzzy permutations) +# +# Meaning: Block 'Tagalog' +# +return <<'END'; +1700 171F Tagalog +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTagban.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTagban.pl new file mode 100644 index 00000000000..ed664910df1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTagban.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InTagbanwa} (and fuzzy permutations) +# +# Meaning: Block 'Tagbanwa' +# +return <<'END'; +1760 177F Tagbanwa +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTags.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTags.pl new file mode 100644 index 00000000000..6dff3c0bff5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTags.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InTags} (and fuzzy permutations) +# +# Meaning: Block 'Tags' +# +return <<'END'; +E0000 E007F Tags +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTaiLe.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTaiLe.pl new file mode 100644 index 00000000000..f5e01dc6504 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTaiLe.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InTaiLe} (and fuzzy permutations) +# +# Meaning: Block 'Tai Le' +# +return <<'END'; +1950 197F Tai Le +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTaiXua.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTaiXua.pl new file mode 100644 index 00000000000..16bb6ec493a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTaiXua.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InTaiXuanJingSymbols} (and fuzzy permutations) +# +# Meaning: Block 'Tai Xuan Jing Symbols' +# +return <<'END'; +1D300 1D35F Tai Xuan Jing Symbols +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTamil.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTamil.pl new file mode 100644 index 00000000000..8880319d95b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTamil.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InTamil} (and fuzzy permutations) +# +# Meaning: Block 'Tamil' +# +return <<'END'; +0B80 0BFF Tamil +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTelugu.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTelugu.pl new file mode 100644 index 00000000000..a67de0ac2ae --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTelugu.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InTelugu} (and fuzzy permutations) +# +# Meaning: Block 'Telugu' +# +return <<'END'; +0C00 0C7F Telugu +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InThaana.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InThaana.pl new file mode 100644 index 00000000000..118ea7217bd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InThaana.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InThaana} (and fuzzy permutations) +# +# Meaning: Block 'Thaana' +# +return <<'END'; +0780 07BF Thaana +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InThai.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InThai.pl new file mode 100644 index 00000000000..584ac9c236f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InThai.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InThai} (and fuzzy permutations) +# +# Meaning: Block 'Thai' +# +return <<'END'; +0E00 0E7F Thai +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTibeta.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTibeta.pl new file mode 100644 index 00000000000..c91c5278534 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTibeta.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InTibetan} (and fuzzy permutations) +# +# Meaning: Block 'Tibetan' +# +return <<'END'; +0F00 0FFF Tibetan +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTifina.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTifina.pl new file mode 100644 index 00000000000..4035719d5a0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InTifina.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InTifinagh} (and fuzzy permutations) +# +# Meaning: Block 'Tifinagh' +# +return <<'END'; +2D30 2D7F Tifinagh +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InUgarit.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InUgarit.pl new file mode 100644 index 00000000000..e2b8b1a2f1c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InUgarit.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InUgaritic} (and fuzzy permutations) +# +# Meaning: Block 'Ugaritic' +# +return <<'END'; +10380 1039F Ugaritic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InUnifie.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InUnifie.pl new file mode 100644 index 00000000000..0eb4ecbe8f3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InUnifie.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InUnifiedCanadianAboriginalSyllabics} (and fuzzy permutations) +# +# Meaning: Block 'Unified Canadian Aboriginal Syllabics' +# +return <<'END'; +1400 167F Unified Canadian Aboriginal Syllabics +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InVaria2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InVaria2.pl new file mode 100644 index 00000000000..d6633f7ec5b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InVaria2.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InVariationSelectorsSupplement} (and fuzzy permutations) +# +# Meaning: Block 'Variation Selectors Supplement' +# +return <<'END'; +E0100 E01EF Variation Selectors Supplement +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InVariat.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InVariat.pl new file mode 100644 index 00000000000..edd7cb38ea5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InVariat.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InVariationSelectors} (and fuzzy permutations) +# +# Meaning: Block 'Variation Selectors' +# +return <<'END'; +FE00 FE0F Variation Selectors +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InVertic.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InVertic.pl new file mode 100644 index 00000000000..c3a67dcd8a7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InVertic.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InVerticalForms} (and fuzzy permutations) +# +# Meaning: Block 'Vertical Forms' +# +return <<'END'; +FE10 FE1F Vertical Forms +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InYiRadi.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InYiRadi.pl new file mode 100644 index 00000000000..92a91f2621f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InYiRadi.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InYiRadicals} (and fuzzy permutations) +# +# Meaning: Block 'Yi Radicals' +# +return <<'END'; +A490 A4CF Yi Radicals +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InYiSyll.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InYiSyll.pl new file mode 100644 index 00000000000..1570090781b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InYiSyll.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InYiSyllables} (and fuzzy permutations) +# +# Meaning: Block 'Yi Syllables' +# +return <<'END'; +A000 A48F Yi Syllables +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InYijing.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InYijing.pl new file mode 100644 index 00000000000..4253e74bc23 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/InYijing.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{InYijingHexagramSymbols} (and fuzzy permutations) +# +# Meaning: Block 'Yijing Hexagram Symbols' +# +return <<'END'; +4DC0 4DFF Yijing Hexagram Symbols +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/JoinC.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/JoinC.pl new file mode 100644 index 00000000000..eefe1c748b6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/JoinC.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Join_Control' +# +return <<'END'; +200C 200D Join_Control +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/JoinCont.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/JoinCont.pl new file mode 100644 index 00000000000..b75583f586e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/JoinCont.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{JoinControl} (and fuzzy permutations) +# +# Meaning: Extended property 'Join_Control' +# +return <<'END'; +200C 200D Join_Control +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Kana.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Kana.pl new file mode 100644 index 00000000000..d544196323f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Kana.pl @@ -0,0 +1,17 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Katakana} (and fuzzy permutations) +# +# Meaning: Script 'Katakana' +# +return <<'END'; +30A1 30FA Katakana +30FD 30FF Katakana +31F0 31FF Katakana +FF66 FF6F Katakana +FF71 FF9D Katakana +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Khar.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Khar.pl new file mode 100644 index 00000000000..8197e1534b0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Khar.pl @@ -0,0 +1,20 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Kharoshthi} (and fuzzy permutations) +# +# Meaning: Script 'Kharoshthi' +# +return <<'END'; +10A00 10A03 Kharoshthi +10A05 10A06 Kharoshthi +10A0C 10A13 Kharoshthi +10A15 10A17 Kharoshthi +10A19 10A33 Kharoshthi +10A38 10A3A Kharoshthi +10A3F 10A47 Kharoshthi +10A50 10A58 Kharoshthi +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Khmr.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Khmr.pl new file mode 100644 index 00000000000..d1850f5b5a8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Khmr.pl @@ -0,0 +1,16 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Khmer} (and fuzzy permutations) +# +# Meaning: Script 'Khmer' +# +return <<'END'; +1780 17DD Khmer +17E0 17E9 Khmer +17F0 17F9 Khmer +19E0 19FF Khmer +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Knda.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Knda.pl new file mode 100644 index 00000000000..0c2c23aa10b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Knda.pl @@ -0,0 +1,25 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Kannada} (and fuzzy permutations) +# +# Meaning: Script 'Kannada' +# +return <<'END'; +0C82 0C83 Kannada +0C85 0C8C Kannada +0C8E 0C90 Kannada +0C92 0CA8 Kannada +0CAA 0CB3 Kannada +0CB5 0CB9 Kannada +0CBC 0CC4 Kannada +0CC6 0CC8 Kannada +0CCA 0CCD Kannada +0CD5 0CD6 Kannada +0CDE Kannada +0CE0 0CE1 Kannada +0CE6 0CEF Kannada +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/L.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/L.pl new file mode 100644 index 00000000000..bae3355a4b4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/L.pl @@ -0,0 +1,360 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{L} +# \p{L} (and fuzzy permutations) +# +# Meaning: Major Category 'L' +# +return <<'END'; +0041 005A +0061 007A +00AA +00B5 +00BA +00C0 00D6 +00D8 00F6 +00F8 0241 +0250 02C1 +02C6 02D1 +02E0 02E4 +02EE +037A +0386 +0388 038A +038C +038E 03A1 +03A3 03CE +03D0 03F5 +03F7 0481 +048A 04CE +04D0 04F9 +0500 050F +0531 0556 +0559 +0561 0587 +05D0 05EA +05F0 05F2 +0621 063A +0640 064A +066E 066F +0671 06D3 +06D5 +06E5 06E6 +06EE 06EF +06FA 06FC +06FF +0710 +0712 072F +074D 076D +0780 07A5 +07B1 +0904 0939 +093D +0950 +0958 0961 +097D +0985 098C +098F 0990 +0993 09A8 +09AA 09B0 +09B2 +09B6 09B9 +09BD +09CE +09DC 09DD +09DF 09E1 +09F0 09F1 +0A05 0A0A +0A0F 0A10 +0A13 0A28 +0A2A 0A30 +0A32 0A33 +0A35 0A36 +0A38 0A39 +0A59 0A5C +0A5E +0A72 0A74 +0A85 0A8D +0A8F 0A91 +0A93 0AA8 +0AAA 0AB0 +0AB2 0AB3 +0AB5 0AB9 +0ABD +0AD0 +0AE0 0AE1 +0B05 0B0C +0B0F 0B10 +0B13 0B28 +0B2A 0B30 +0B32 0B33 +0B35 0B39 +0B3D +0B5C 0B5D +0B5F 0B61 +0B71 +0B83 +0B85 0B8A +0B8E 0B90 +0B92 0B95 +0B99 0B9A +0B9C +0B9E 0B9F +0BA3 0BA4 +0BA8 0BAA +0BAE 0BB9 +0C05 0C0C +0C0E 0C10 +0C12 0C28 +0C2A 0C33 +0C35 0C39 +0C60 0C61 +0C85 0C8C +0C8E 0C90 +0C92 0CA8 +0CAA 0CB3 +0CB5 0CB9 +0CBD +0CDE +0CE0 0CE1 +0D05 0D0C +0D0E 0D10 +0D12 0D28 +0D2A 0D39 +0D60 0D61 +0D85 0D96 +0D9A 0DB1 +0DB3 0DBB +0DBD +0DC0 0DC6 +0E01 0E30 +0E32 0E33 +0E40 0E46 +0E81 0E82 +0E84 +0E87 0E88 +0E8A +0E8D +0E94 0E97 +0E99 0E9F +0EA1 0EA3 +0EA5 +0EA7 +0EAA 0EAB +0EAD 0EB0 +0EB2 0EB3 +0EBD +0EC0 0EC4 +0EC6 +0EDC 0EDD +0F00 +0F40 0F47 +0F49 0F6A +0F88 0F8B +1000 1021 +1023 1027 +1029 102A +1050 1055 +10A0 10C5 +10D0 10FA +10FC +1100 1159 +115F 11A2 +11A8 11F9 +1200 1248 +124A 124D +1250 1256 +1258 +125A 125D +1260 1288 +128A 128D +1290 12B0 +12B2 12B5 +12B8 12BE +12C0 +12C2 12C5 +12C8 12D6 +12D8 1310 +1312 1315 +1318 135A +1380 138F +13A0 13F4 +1401 166C +166F 1676 +1681 169A +16A0 16EA +1700 170C +170E 1711 +1720 1731 +1740 1751 +1760 176C +176E 1770 +1780 17B3 +17D7 +17DC +1820 1877 +1880 18A8 +1900 191C +1950 196D +1970 1974 +1980 19A9 +19C1 19C7 +1A00 1A16 +1D00 1DBF +1E00 1E9B +1EA0 1EF9 +1F00 1F15 +1F18 1F1D +1F20 1F45 +1F48 1F4D +1F50 1F57 +1F59 +1F5B +1F5D +1F5F 1F7D +1F80 1FB4 +1FB6 1FBC +1FBE +1FC2 1FC4 +1FC6 1FCC +1FD0 1FD3 +1FD6 1FDB +1FE0 1FEC +1FF2 1FF4 +1FF6 1FFC +2071 +207F +2090 2094 +2102 +2107 +210A 2113 +2115 +2119 211D +2124 +2126 +2128 +212A 212D +212F 2131 +2133 2139 +213C 213F +2145 2149 +2C00 2C2E +2C30 2C5E +2C80 2CE4 +2D00 2D25 +2D30 2D65 +2D6F +2D80 2D96 +2DA0 2DA6 +2DA8 2DAE +2DB0 2DB6 +2DB8 2DBE +2DC0 2DC6 +2DC8 2DCE +2DD0 2DD6 +2DD8 2DDE +3005 3006 +3031 3035 +303B 303C +3041 3096 +309D 309F +30A1 30FA +30FC 30FF +3105 312C +3131 318E +31A0 31B7 +31F0 31FF +3400 4DB5 +4E00 9FBB +A000 A48C +A800 A801 +A803 A805 +A807 A80A +A80C A822 +AC00 D7A3 +F900 FA2D +FA30 FA6A +FA70 FAD9 +FB00 FB06 +FB13 FB17 +FB1D +FB1F FB28 +FB2A FB36 +FB38 FB3C +FB3E +FB40 FB41 +FB43 FB44 +FB46 FBB1 +FBD3 FD3D +FD50 FD8F +FD92 FDC7 +FDF0 FDFB +FE70 FE74 +FE76 FEFC +FF21 FF3A +FF41 FF5A +FF66 FFBE +FFC2 FFC7 +FFCA FFCF +FFD2 FFD7 +FFDA FFDC +10000 1000B +1000D 10026 +10028 1003A +1003C 1003D +1003F 1004D +10050 1005D +10080 100FA +10300 1031E +10330 10349 +10380 1039D +103A0 103C3 +103C8 103CF +10400 1049D +10800 10805 +10808 +1080A 10835 +10837 10838 +1083C +1083F +10A00 +10A10 10A13 +10A15 10A17 +10A19 10A33 +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A5 +1D6A8 1D6C0 +1D6C2 1D6DA +1D6DC 1D6FA +1D6FC 1D714 +1D716 1D734 +1D736 1D74E +1D750 1D76E +1D770 1D788 +1D78A 1D7A8 +1D7AA 1D7C2 +1D7C4 1D7C9 +20000 2A6D6 +2F800 2FA1D +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/LC.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/LC.pl new file mode 100644 index 00000000000..c86b0a6af8a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/LC.pl @@ -0,0 +1,116 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{LC} +# \p{LC} (and fuzzy permutations) +# +# Meaning: [\p{Ll}\p{Lu}\p{Lt}] +# +return <<'END'; +0041 005A +0061 007A +00AA +00B5 +00BA +00C0 00D6 +00D8 00F6 +00F8 01BA +01BC 01BF +01C4 0241 +0250 02AF +0386 +0388 038A +038C +038E 03A1 +03A3 03CE +03D0 03F5 +03F7 0481 +048A 04CE +04D0 04F9 +0500 050F +0531 0556 +0561 0587 +10A0 10C5 +1D00 1D2B +1D62 1D77 +1D79 1D9A +1E00 1E9B +1EA0 1EF9 +1F00 1F15 +1F18 1F1D +1F20 1F45 +1F48 1F4D +1F50 1F57 +1F59 +1F5B +1F5D +1F5F 1F7D +1F80 1FB4 +1FB6 1FBC +1FBE +1FC2 1FC4 +1FC6 1FCC +1FD0 1FD3 +1FD6 1FDB +1FE0 1FEC +1FF2 1FF4 +1FF6 1FFC +2071 +207F +2102 +2107 +210A 2113 +2115 +2119 211D +2124 +2126 +2128 +212A 212D +212F 2131 +2133 2134 +2139 +213C 213F +2145 2149 +2C00 2C2E +2C30 2C5E +2C80 2CE4 +2D00 2D25 +FB00 FB06 +FB13 FB17 +FF21 FF3A +FF41 FF5A +10400 1044F +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A5 +1D6A8 1D6C0 +1D6C2 1D6DA +1D6DC 1D6FA +1D6FC 1D714 +1D716 1D734 +1D736 1D74E +1D750 1D76E +1D770 1D788 +1D78A 1D7A8 +1D7AA 1D7C2 +1D7C4 1D7C9 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/LOE.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/LOE.pl new file mode 100644 index 00000000000..f82a91f1cf9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/LOE.pl @@ -0,0 +1,11 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Logical_Order_Exception' +# +return <<'END'; +0E40 0E44 Logical_Order_Exception +0EC0 0EC4 Logical_Order_Exception +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Laoo.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Laoo.pl new file mode 100644 index 00000000000..e34a6e44bc8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Laoo.pl @@ -0,0 +1,30 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Lao} (and fuzzy permutations) +# +# Meaning: Script 'Lao' +# +return <<'END'; +0E81 0E82 Lao +0E84 Lao +0E87 0E88 Lao +0E8A Lao +0E8D Lao +0E94 0E97 Lao +0E99 0E9F Lao +0EA1 0EA3 Lao +0EA5 Lao +0EA7 Lao +0EAA 0EAB Lao +0EAD 0EB9 Lao +0EBB 0EBD Lao +0EC0 0EC4 Lao +0EC6 Lao +0EC8 0ECD Lao +0ED0 0ED9 Lao +0EDC 0EDD Lao +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Latn.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Latn.pl new file mode 100644 index 00000000000..c5d4b83d5b2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Latn.pl @@ -0,0 +1,35 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Latin} (and fuzzy permutations) +# +# Meaning: Script 'Latin' +# +return <<'END'; +0041 005A Latin +0061 007A Latin +00AA Latin +00BA Latin +00C0 00D6 Latin +00D8 00F6 Latin +00F8 0241 Latin +0250 02B8 Latin +02E0 02E4 Latin +1D00 1D25 Latin +1D2C 1D5C Latin +1D62 1D65 Latin +1D6B 1D77 Latin +1D79 1DBF Latin +1E00 1E9B Latin +1EA0 1EF9 Latin +2071 Latin +207F Latin +2090 2094 Latin +212A 212B Latin +FB00 FB06 Latin +FF21 FF3A Latin +FF41 FF5A Latin +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Limb.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Limb.pl new file mode 100644 index 00000000000..be5d715d4e2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Limb.pl @@ -0,0 +1,17 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Limbu} (and fuzzy permutations) +# +# Meaning: Script 'Limbu' +# +return <<'END'; +1900 191C Limbu +1920 192B Limbu +1930 193B Limbu +1940 Limbu +1944 194F Limbu +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/LinearB.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/LinearB.pl new file mode 100644 index 00000000000..04fb45a392b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/LinearB.pl @@ -0,0 +1,19 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{LinearB} (and fuzzy permutations) +# +# Meaning: Script 'Linear_B' +# +return <<'END'; +10000 1000B Linear_B +1000D 10026 Linear_B +10028 1003A Linear_B +1003C 1003D Linear_B +1003F 1004D Linear_B +10050 1005D Linear_B +10080 100FA Linear_B +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ll.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ll.pl new file mode 100644 index 00000000000..1d4db7696e3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ll.pl @@ -0,0 +1,493 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Ll} +# \p{Ll} (and fuzzy permutations) +# +# Meaning: General Category 'Ll' +# +return <<'END'; +0061 007A +00AA +00B5 +00BA +00DF 00F6 +00F8 00FF +0101 +0103 +0105 +0107 +0109 +010B +010D +010F +0111 +0113 +0115 +0117 +0119 +011B +011D +011F +0121 +0123 +0125 +0127 +0129 +012B +012D +012F +0131 +0133 +0135 +0137 0138 +013A +013C +013E +0140 +0142 +0144 +0146 +0148 0149 +014B +014D +014F +0151 +0153 +0155 +0157 +0159 +015B +015D +015F +0161 +0163 +0165 +0167 +0169 +016B +016D +016F +0171 +0173 +0175 +0177 +017A +017C +017E 0180 +0183 +0185 +0188 +018C 018D +0192 +0195 +0199 019B +019E +01A1 +01A3 +01A5 +01A8 +01AA 01AB +01AD +01B0 +01B4 +01B6 +01B9 01BA +01BD 01BF +01C6 +01C9 +01CC +01CE +01D0 +01D2 +01D4 +01D6 +01D8 +01DA +01DC 01DD +01DF +01E1 +01E3 +01E5 +01E7 +01E9 +01EB +01ED +01EF 01F0 +01F3 +01F5 +01F9 +01FB +01FD +01FF +0201 +0203 +0205 +0207 +0209 +020B +020D +020F +0211 +0213 +0215 +0217 +0219 +021B +021D +021F +0221 +0223 +0225 +0227 +0229 +022B +022D +022F +0231 +0233 0239 +023C +023F 0240 +0250 02AF +0390 +03AC 03CE +03D0 03D1 +03D5 03D7 +03D9 +03DB +03DD +03DF +03E1 +03E3 +03E5 +03E7 +03E9 +03EB +03ED +03EF 03F3 +03F5 +03F8 +03FB 03FC +0430 045F +0461 +0463 +0465 +0467 +0469 +046B +046D +046F +0471 +0473 +0475 +0477 +0479 +047B +047D +047F +0481 +048B +048D +048F +0491 +0493 +0495 +0497 +0499 +049B +049D +049F +04A1 +04A3 +04A5 +04A7 +04A9 +04AB +04AD +04AF +04B1 +04B3 +04B5 +04B7 +04B9 +04BB +04BD +04BF +04C2 +04C4 +04C6 +04C8 +04CA +04CC +04CE +04D1 +04D3 +04D5 +04D7 +04D9 +04DB +04DD +04DF +04E1 +04E3 +04E5 +04E7 +04E9 +04EB +04ED +04EF +04F1 +04F3 +04F5 +04F7 +04F9 +0501 +0503 +0505 +0507 +0509 +050B +050D +050F +0561 0587 +1D00 1D2B +1D62 1D77 +1D79 1D9A +1E01 +1E03 +1E05 +1E07 +1E09 +1E0B +1E0D +1E0F +1E11 +1E13 +1E15 +1E17 +1E19 +1E1B +1E1D +1E1F +1E21 +1E23 +1E25 +1E27 +1E29 +1E2B +1E2D +1E2F +1E31 +1E33 +1E35 +1E37 +1E39 +1E3B +1E3D +1E3F +1E41 +1E43 +1E45 +1E47 +1E49 +1E4B +1E4D +1E4F +1E51 +1E53 +1E55 +1E57 +1E59 +1E5B +1E5D +1E5F +1E61 +1E63 +1E65 +1E67 +1E69 +1E6B +1E6D +1E6F +1E71 +1E73 +1E75 +1E77 +1E79 +1E7B +1E7D +1E7F +1E81 +1E83 +1E85 +1E87 +1E89 +1E8B +1E8D +1E8F +1E91 +1E93 +1E95 1E9B +1EA1 +1EA3 +1EA5 +1EA7 +1EA9 +1EAB +1EAD +1EAF +1EB1 +1EB3 +1EB5 +1EB7 +1EB9 +1EBB +1EBD +1EBF +1EC1 +1EC3 +1EC5 +1EC7 +1EC9 +1ECB +1ECD +1ECF +1ED1 +1ED3 +1ED5 +1ED7 +1ED9 +1EDB +1EDD +1EDF +1EE1 +1EE3 +1EE5 +1EE7 +1EE9 +1EEB +1EED +1EEF +1EF1 +1EF3 +1EF5 +1EF7 +1EF9 +1F00 1F07 +1F10 1F15 +1F20 1F27 +1F30 1F37 +1F40 1F45 +1F50 1F57 +1F60 1F67 +1F70 1F7D +1F80 1F87 +1F90 1F97 +1FA0 1FA7 +1FB0 1FB4 +1FB6 1FB7 +1FBE +1FC2 1FC4 +1FC6 1FC7 +1FD0 1FD3 +1FD6 1FD7 +1FE0 1FE7 +1FF2 1FF4 +1FF6 1FF7 +2071 +207F +210A +210E 210F +2113 +212F +2134 +2139 +213C 213D +2146 2149 +2C30 2C5E +2C81 +2C83 +2C85 +2C87 +2C89 +2C8B +2C8D +2C8F +2C91 +2C93 +2C95 +2C97 +2C99 +2C9B +2C9D +2C9F +2CA1 +2CA3 +2CA5 +2CA7 +2CA9 +2CAB +2CAD +2CAF +2CB1 +2CB3 +2CB5 +2CB7 +2CB9 +2CBB +2CBD +2CBF +2CC1 +2CC3 +2CC5 +2CC7 +2CC9 +2CCB +2CCD +2CCF +2CD1 +2CD3 +2CD5 +2CD7 +2CD9 +2CDB +2CDD +2CDF +2CE1 +2CE3 2CE4 +2D00 2D25 +FB00 FB06 +FB13 FB17 +FF41 FF5A +10428 1044F +1D41A 1D433 +1D44E 1D454 +1D456 1D467 +1D482 1D49B +1D4B6 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D4CF +1D4EA 1D503 +1D51E 1D537 +1D552 1D56B +1D586 1D59F +1D5BA 1D5D3 +1D5EE 1D607 +1D622 1D63B +1D656 1D66F +1D68A 1D6A5 +1D6C2 1D6DA +1D6DC 1D6E1 +1D6FC 1D714 +1D716 1D71B +1D736 1D74E +1D750 1D755 +1D770 1D788 +1D78A 1D78F +1D7AA 1D7C2 +1D7C4 1D7C9 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lm.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lm.pl new file mode 100644 index 00000000000..7e1e28af9ed --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lm.pl @@ -0,0 +1,39 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Lm} +# \p{Lm} (and fuzzy permutations) +# +# Meaning: General Category 'Lm' +# +return <<'END'; +02B0 02C1 +02C6 02D1 +02E0 02E4 +02EE +037A +0559 +0640 +06E5 06E6 +0E46 +0EC6 +10FC +17D7 +1843 +1D2C 1D61 +1D78 +1D9B 1DBF +2090 2094 +2D6F +3005 +3031 3035 +303B +309D 309E +30FC 30FE +A015 +FF70 +FF9E FF9F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lo.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lo.pl new file mode 100644 index 00000000000..7721bac7e20 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lo.pl @@ -0,0 +1,258 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Lo} +# \p{Lo} (and fuzzy permutations) +# +# Meaning: General Category 'Lo' +# +return <<'END'; +01BB +01C0 01C3 +05D0 05EA +05F0 05F2 +0621 063A +0641 064A +066E 066F +0671 06D3 +06D5 +06EE 06EF +06FA 06FC +06FF +0710 +0712 072F +074D 076D +0780 07A5 +07B1 +0904 0939 +093D +0950 +0958 0961 +097D +0985 098C +098F 0990 +0993 09A8 +09AA 09B0 +09B2 +09B6 09B9 +09BD +09CE +09DC 09DD +09DF 09E1 +09F0 09F1 +0A05 0A0A +0A0F 0A10 +0A13 0A28 +0A2A 0A30 +0A32 0A33 +0A35 0A36 +0A38 0A39 +0A59 0A5C +0A5E +0A72 0A74 +0A85 0A8D +0A8F 0A91 +0A93 0AA8 +0AAA 0AB0 +0AB2 0AB3 +0AB5 0AB9 +0ABD +0AD0 +0AE0 0AE1 +0B05 0B0C +0B0F 0B10 +0B13 0B28 +0B2A 0B30 +0B32 0B33 +0B35 0B39 +0B3D +0B5C 0B5D +0B5F 0B61 +0B71 +0B83 +0B85 0B8A +0B8E 0B90 +0B92 0B95 +0B99 0B9A +0B9C +0B9E 0B9F +0BA3 0BA4 +0BA8 0BAA +0BAE 0BB9 +0C05 0C0C +0C0E 0C10 +0C12 0C28 +0C2A 0C33 +0C35 0C39 +0C60 0C61 +0C85 0C8C +0C8E 0C90 +0C92 0CA8 +0CAA 0CB3 +0CB5 0CB9 +0CBD +0CDE +0CE0 0CE1 +0D05 0D0C +0D0E 0D10 +0D12 0D28 +0D2A 0D39 +0D60 0D61 +0D85 0D96 +0D9A 0DB1 +0DB3 0DBB +0DBD +0DC0 0DC6 +0E01 0E30 +0E32 0E33 +0E40 0E45 +0E81 0E82 +0E84 +0E87 0E88 +0E8A +0E8D +0E94 0E97 +0E99 0E9F +0EA1 0EA3 +0EA5 +0EA7 +0EAA 0EAB +0EAD 0EB0 +0EB2 0EB3 +0EBD +0EC0 0EC4 +0EDC 0EDD +0F00 +0F40 0F47 +0F49 0F6A +0F88 0F8B +1000 1021 +1023 1027 +1029 102A +1050 1055 +10D0 10FA +1100 1159 +115F 11A2 +11A8 11F9 +1200 1248 +124A 124D +1250 1256 +1258 +125A 125D +1260 1288 +128A 128D +1290 12B0 +12B2 12B5 +12B8 12BE +12C0 +12C2 12C5 +12C8 12D6 +12D8 1310 +1312 1315 +1318 135A +1380 138F +13A0 13F4 +1401 166C +166F 1676 +1681 169A +16A0 16EA +1700 170C +170E 1711 +1720 1731 +1740 1751 +1760 176C +176E 1770 +1780 17B3 +17DC +1820 1842 +1844 1877 +1880 18A8 +1900 191C +1950 196D +1970 1974 +1980 19A9 +19C1 19C7 +1A00 1A16 +2135 2138 +2D30 2D65 +2D80 2D96 +2DA0 2DA6 +2DA8 2DAE +2DB0 2DB6 +2DB8 2DBE +2DC0 2DC6 +2DC8 2DCE +2DD0 2DD6 +2DD8 2DDE +3006 +303C +3041 3096 +309F +30A1 30FA +30FF +3105 312C +3131 318E +31A0 31B7 +31F0 31FF +3400 4DB5 +4E00 9FBB +A000 A014 +A016 A48C +A800 A801 +A803 A805 +A807 A80A +A80C A822 +AC00 D7A3 +F900 FA2D +FA30 FA6A +FA70 FAD9 +FB1D +FB1F FB28 +FB2A FB36 +FB38 FB3C +FB3E +FB40 FB41 +FB43 FB44 +FB46 FBB1 +FBD3 FD3D +FD50 FD8F +FD92 FDC7 +FDF0 FDFB +FE70 FE74 +FE76 FEFC +FF66 FF6F +FF71 FF9D +FFA0 FFBE +FFC2 FFC7 +FFCA FFCF +FFD2 FFD7 +FFDA FFDC +10000 1000B +1000D 10026 +10028 1003A +1003C 1003D +1003F 1004D +10050 1005D +10080 100FA +10300 1031E +10330 10349 +10380 1039D +103A0 103C3 +103C8 103CF +10450 1049D +10800 10805 +10808 +1080A 10835 +10837 10838 +1083C +1083F +10A00 +10A10 10A13 +10A15 10A17 +10A19 10A33 +20000 2A6D6 +2F800 2FA1D +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/LogicalO.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/LogicalO.pl new file mode 100644 index 00000000000..72ed9fe581d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/LogicalO.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{LogicalOrderException} (and fuzzy permutations) +# +# Meaning: Extended property 'Logical_Order_Exception' +# +return <<'END'; +0E40 0E44 Logical_Order_Exception +0EC0 0EC4 Logical_Order_Exception +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lower.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lower.pl new file mode 100644 index 00000000000..f4208ffd909 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lower.pl @@ -0,0 +1,492 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Lower} +# +# Meaning: [[:Lower:]] +# +return <<'END'; +0061 007A +00AA +00B5 +00BA +00DF 00F6 +00F8 00FF +0101 +0103 +0105 +0107 +0109 +010B +010D +010F +0111 +0113 +0115 +0117 +0119 +011B +011D +011F +0121 +0123 +0125 +0127 +0129 +012B +012D +012F +0131 +0133 +0135 +0137 0138 +013A +013C +013E +0140 +0142 +0144 +0146 +0148 0149 +014B +014D +014F +0151 +0153 +0155 +0157 +0159 +015B +015D +015F +0161 +0163 +0165 +0167 +0169 +016B +016D +016F +0171 +0173 +0175 +0177 +017A +017C +017E 0180 +0183 +0185 +0188 +018C 018D +0192 +0195 +0199 019B +019E +01A1 +01A3 +01A5 +01A8 +01AA 01AB +01AD +01B0 +01B4 +01B6 +01B9 01BA +01BD 01BF +01C6 +01C9 +01CC +01CE +01D0 +01D2 +01D4 +01D6 +01D8 +01DA +01DC 01DD +01DF +01E1 +01E3 +01E5 +01E7 +01E9 +01EB +01ED +01EF 01F0 +01F3 +01F5 +01F9 +01FB +01FD +01FF +0201 +0203 +0205 +0207 +0209 +020B +020D +020F +0211 +0213 +0215 +0217 +0219 +021B +021D +021F +0221 +0223 +0225 +0227 +0229 +022B +022D +022F +0231 +0233 0239 +023C +023F 0240 +0250 02AF +0390 +03AC 03CE +03D0 03D1 +03D5 03D7 +03D9 +03DB +03DD +03DF +03E1 +03E3 +03E5 +03E7 +03E9 +03EB +03ED +03EF 03F3 +03F5 +03F8 +03FB 03FC +0430 045F +0461 +0463 +0465 +0467 +0469 +046B +046D +046F +0471 +0473 +0475 +0477 +0479 +047B +047D +047F +0481 +048B +048D +048F +0491 +0493 +0495 +0497 +0499 +049B +049D +049F +04A1 +04A3 +04A5 +04A7 +04A9 +04AB +04AD +04AF +04B1 +04B3 +04B5 +04B7 +04B9 +04BB +04BD +04BF +04C2 +04C4 +04C6 +04C8 +04CA +04CC +04CE +04D1 +04D3 +04D5 +04D7 +04D9 +04DB +04DD +04DF +04E1 +04E3 +04E5 +04E7 +04E9 +04EB +04ED +04EF +04F1 +04F3 +04F5 +04F7 +04F9 +0501 +0503 +0505 +0507 +0509 +050B +050D +050F +0561 0587 +1D00 1D2B +1D62 1D77 +1D79 1D9A +1E01 +1E03 +1E05 +1E07 +1E09 +1E0B +1E0D +1E0F +1E11 +1E13 +1E15 +1E17 +1E19 +1E1B +1E1D +1E1F +1E21 +1E23 +1E25 +1E27 +1E29 +1E2B +1E2D +1E2F +1E31 +1E33 +1E35 +1E37 +1E39 +1E3B +1E3D +1E3F +1E41 +1E43 +1E45 +1E47 +1E49 +1E4B +1E4D +1E4F +1E51 +1E53 +1E55 +1E57 +1E59 +1E5B +1E5D +1E5F +1E61 +1E63 +1E65 +1E67 +1E69 +1E6B +1E6D +1E6F +1E71 +1E73 +1E75 +1E77 +1E79 +1E7B +1E7D +1E7F +1E81 +1E83 +1E85 +1E87 +1E89 +1E8B +1E8D +1E8F +1E91 +1E93 +1E95 1E9B +1EA1 +1EA3 +1EA5 +1EA7 +1EA9 +1EAB +1EAD +1EAF +1EB1 +1EB3 +1EB5 +1EB7 +1EB9 +1EBB +1EBD +1EBF +1EC1 +1EC3 +1EC5 +1EC7 +1EC9 +1ECB +1ECD +1ECF +1ED1 +1ED3 +1ED5 +1ED7 +1ED9 +1EDB +1EDD +1EDF +1EE1 +1EE3 +1EE5 +1EE7 +1EE9 +1EEB +1EED +1EEF +1EF1 +1EF3 +1EF5 +1EF7 +1EF9 +1F00 1F07 +1F10 1F15 +1F20 1F27 +1F30 1F37 +1F40 1F45 +1F50 1F57 +1F60 1F67 +1F70 1F7D +1F80 1F87 +1F90 1F97 +1FA0 1FA7 +1FB0 1FB4 +1FB6 1FB7 +1FBE +1FC2 1FC4 +1FC6 1FC7 +1FD0 1FD3 +1FD6 1FD7 +1FE0 1FE7 +1FF2 1FF4 +1FF6 1FF7 +2071 +207F +210A +210E 210F +2113 +212F +2134 +2139 +213C 213D +2146 2149 +2C30 2C5E +2C81 +2C83 +2C85 +2C87 +2C89 +2C8B +2C8D +2C8F +2C91 +2C93 +2C95 +2C97 +2C99 +2C9B +2C9D +2C9F +2CA1 +2CA3 +2CA5 +2CA7 +2CA9 +2CAB +2CAD +2CAF +2CB1 +2CB3 +2CB5 +2CB7 +2CB9 +2CBB +2CBD +2CBF +2CC1 +2CC3 +2CC5 +2CC7 +2CC9 +2CCB +2CCD +2CCF +2CD1 +2CD3 +2CD5 +2CD7 +2CD9 +2CDB +2CDD +2CDF +2CE1 +2CE3 2CE4 +2D00 2D25 +FB00 FB06 +FB13 FB17 +FF41 FF5A +10428 1044F +1D41A 1D433 +1D44E 1D454 +1D456 1D467 +1D482 1D49B +1D4B6 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D4CF +1D4EA 1D503 +1D51E 1D537 +1D552 1D56B +1D586 1D59F +1D5BA 1D5D3 +1D5EE 1D607 +1D622 1D63B +1D656 1D66F +1D68A 1D6A5 +1D6C2 1D6DA +1D6DC 1D6E1 +1D6FC 1D714 +1D716 1D71B +1D736 1D74E +1D750 1D755 +1D770 1D788 +1D78A 1D78F +1D7AA 1D7C2 +1D7C4 1D7C9 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lowercas.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lowercas.pl new file mode 100644 index 00000000000..86dd301eec8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lowercas.pl @@ -0,0 +1,497 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Lowercase} (and fuzzy permutations) +# +# Meaning: [\p{Ll}\p{OtherLowercase}] +# +return <<'END'; +0061 007A +00AA +00B5 +00BA +00DF 00F6 +00F8 00FF +0101 +0103 +0105 +0107 +0109 +010B +010D +010F +0111 +0113 +0115 +0117 +0119 +011B +011D +011F +0121 +0123 +0125 +0127 +0129 +012B +012D +012F +0131 +0133 +0135 +0137 0138 +013A +013C +013E +0140 +0142 +0144 +0146 +0148 0149 +014B +014D +014F +0151 +0153 +0155 +0157 +0159 +015B +015D +015F +0161 +0163 +0165 +0167 +0169 +016B +016D +016F +0171 +0173 +0175 +0177 +017A +017C +017E 0180 +0183 +0185 +0188 +018C 018D +0192 +0195 +0199 019B +019E +01A1 +01A3 +01A5 +01A8 +01AA 01AB +01AD +01B0 +01B4 +01B6 +01B9 01BA +01BD 01BF +01C6 +01C9 +01CC +01CE +01D0 +01D2 +01D4 +01D6 +01D8 +01DA +01DC 01DD +01DF +01E1 +01E3 +01E5 +01E7 +01E9 +01EB +01ED +01EF 01F0 +01F3 +01F5 +01F9 +01FB +01FD +01FF +0201 +0203 +0205 +0207 +0209 +020B +020D +020F +0211 +0213 +0215 +0217 +0219 +021B +021D +021F +0221 +0223 +0225 +0227 +0229 +022B +022D +022F +0231 +0233 0239 +023C +023F 0240 +0250 02B8 +02C0 02C1 +02E0 02E4 +0345 +037A +0390 +03AC 03CE +03D0 03D1 +03D5 03D7 +03D9 +03DB +03DD +03DF +03E1 +03E3 +03E5 +03E7 +03E9 +03EB +03ED +03EF 03F3 +03F5 +03F8 +03FB 03FC +0430 045F +0461 +0463 +0465 +0467 +0469 +046B +046D +046F +0471 +0473 +0475 +0477 +0479 +047B +047D +047F +0481 +048B +048D +048F +0491 +0493 +0495 +0497 +0499 +049B +049D +049F +04A1 +04A3 +04A5 +04A7 +04A9 +04AB +04AD +04AF +04B1 +04B3 +04B5 +04B7 +04B9 +04BB +04BD +04BF +04C2 +04C4 +04C6 +04C8 +04CA +04CC +04CE +04D1 +04D3 +04D5 +04D7 +04D9 +04DB +04DD +04DF +04E1 +04E3 +04E5 +04E7 +04E9 +04EB +04ED +04EF +04F1 +04F3 +04F5 +04F7 +04F9 +0501 +0503 +0505 +0507 +0509 +050B +050D +050F +0561 0587 +1D00 1DBF +1E01 +1E03 +1E05 +1E07 +1E09 +1E0B +1E0D +1E0F +1E11 +1E13 +1E15 +1E17 +1E19 +1E1B +1E1D +1E1F +1E21 +1E23 +1E25 +1E27 +1E29 +1E2B +1E2D +1E2F +1E31 +1E33 +1E35 +1E37 +1E39 +1E3B +1E3D +1E3F +1E41 +1E43 +1E45 +1E47 +1E49 +1E4B +1E4D +1E4F +1E51 +1E53 +1E55 +1E57 +1E59 +1E5B +1E5D +1E5F +1E61 +1E63 +1E65 +1E67 +1E69 +1E6B +1E6D +1E6F +1E71 +1E73 +1E75 +1E77 +1E79 +1E7B +1E7D +1E7F +1E81 +1E83 +1E85 +1E87 +1E89 +1E8B +1E8D +1E8F +1E91 +1E93 +1E95 1E9B +1EA1 +1EA3 +1EA5 +1EA7 +1EA9 +1EAB +1EAD +1EAF +1EB1 +1EB3 +1EB5 +1EB7 +1EB9 +1EBB +1EBD +1EBF +1EC1 +1EC3 +1EC5 +1EC7 +1EC9 +1ECB +1ECD +1ECF +1ED1 +1ED3 +1ED5 +1ED7 +1ED9 +1EDB +1EDD +1EDF +1EE1 +1EE3 +1EE5 +1EE7 +1EE9 +1EEB +1EED +1EEF +1EF1 +1EF3 +1EF5 +1EF7 +1EF9 +1F00 1F07 +1F10 1F15 +1F20 1F27 +1F30 1F37 +1F40 1F45 +1F50 1F57 +1F60 1F67 +1F70 1F7D +1F80 1F87 +1F90 1F97 +1FA0 1FA7 +1FB0 1FB4 +1FB6 1FB7 +1FBE +1FC2 1FC4 +1FC6 1FC7 +1FD0 1FD3 +1FD6 1FD7 +1FE0 1FE7 +1FF2 1FF4 +1FF6 1FF7 +2071 +207F +2090 2094 +210A +210E 210F +2113 +212F +2134 +2139 +213C 213D +2146 2149 +2170 217F +24D0 24E9 +2C30 2C5E +2C81 +2C83 +2C85 +2C87 +2C89 +2C8B +2C8D +2C8F +2C91 +2C93 +2C95 +2C97 +2C99 +2C9B +2C9D +2C9F +2CA1 +2CA3 +2CA5 +2CA7 +2CA9 +2CAB +2CAD +2CAF +2CB1 +2CB3 +2CB5 +2CB7 +2CB9 +2CBB +2CBD +2CBF +2CC1 +2CC3 +2CC5 +2CC7 +2CC9 +2CCB +2CCD +2CCF +2CD1 +2CD3 +2CD5 +2CD7 +2CD9 +2CDB +2CDD +2CDF +2CE1 +2CE3 2CE4 +2D00 2D25 +FB00 FB06 +FB13 FB17 +FF41 FF5A +10428 1044F +1D41A 1D433 +1D44E 1D454 +1D456 1D467 +1D482 1D49B +1D4B6 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D4CF +1D4EA 1D503 +1D51E 1D537 +1D552 1D56B +1D586 1D59F +1D5BA 1D5D3 +1D5EE 1D607 +1D622 1D63B +1D656 1D66F +1D68A 1D6A5 +1D6C2 1D6DA +1D6DC 1D6E1 +1D6FC 1D714 +1D716 1D71B +1D736 1D74E +1D750 1D755 +1D770 1D788 +1D78A 1D78F +1D7AA 1D7C2 +1D7C4 1D7C9 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lt.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lt.pl new file mode 100644 index 00000000000..6518f8e079c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lt.pl @@ -0,0 +1,23 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Lt} +# \p{Lt} (and fuzzy permutations) +# +# Meaning: General Category 'Lt' +# +return <<'END'; +01C5 +01C8 +01CB +01F2 +1F88 1F8F +1F98 1F9F +1FA8 1FAF +1FBC +1FCC +1FFC +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lu.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lu.pl new file mode 100644 index 00000000000..18634cb627e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Lu.pl @@ -0,0 +1,489 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Lu} +# \p{Lu} (and fuzzy permutations) +# +# Meaning: General Category 'Lu' +# +return <<'END'; +0041 005A +00C0 00D6 +00D8 00DE +0100 +0102 +0104 +0106 +0108 +010A +010C +010E +0110 +0112 +0114 +0116 +0118 +011A +011C +011E +0120 +0122 +0124 +0126 +0128 +012A +012C +012E +0130 +0132 +0134 +0136 +0139 +013B +013D +013F +0141 +0143 +0145 +0147 +014A +014C +014E +0150 +0152 +0154 +0156 +0158 +015A +015C +015E +0160 +0162 +0164 +0166 +0168 +016A +016C +016E +0170 +0172 +0174 +0176 +0178 0179 +017B +017D +0181 0182 +0184 +0186 0187 +0189 018B +018E 0191 +0193 0194 +0196 0198 +019C 019D +019F 01A0 +01A2 +01A4 +01A6 01A7 +01A9 +01AC +01AE 01AF +01B1 01B3 +01B5 +01B7 01B8 +01BC +01C4 +01C7 +01CA +01CD +01CF +01D1 +01D3 +01D5 +01D7 +01D9 +01DB +01DE +01E0 +01E2 +01E4 +01E6 +01E8 +01EA +01EC +01EE +01F1 +01F4 +01F6 01F8 +01FA +01FC +01FE +0200 +0202 +0204 +0206 +0208 +020A +020C +020E +0210 +0212 +0214 +0216 +0218 +021A +021C +021E +0220 +0222 +0224 +0226 +0228 +022A +022C +022E +0230 +0232 +023A 023B +023D 023E +0241 +0386 +0388 038A +038C +038E 038F +0391 03A1 +03A3 03AB +03D2 03D4 +03D8 +03DA +03DC +03DE +03E0 +03E2 +03E4 +03E6 +03E8 +03EA +03EC +03EE +03F4 +03F7 +03F9 03FA +03FD 042F +0460 +0462 +0464 +0466 +0468 +046A +046C +046E +0470 +0472 +0474 +0476 +0478 +047A +047C +047E +0480 +048A +048C +048E +0490 +0492 +0494 +0496 +0498 +049A +049C +049E +04A0 +04A2 +04A4 +04A6 +04A8 +04AA +04AC +04AE +04B0 +04B2 +04B4 +04B6 +04B8 +04BA +04BC +04BE +04C0 04C1 +04C3 +04C5 +04C7 +04C9 +04CB +04CD +04D0 +04D2 +04D4 +04D6 +04D8 +04DA +04DC +04DE +04E0 +04E2 +04E4 +04E6 +04E8 +04EA +04EC +04EE +04F0 +04F2 +04F4 +04F6 +04F8 +0500 +0502 +0504 +0506 +0508 +050A +050C +050E +0531 0556 +10A0 10C5 +1E00 +1E02 +1E04 +1E06 +1E08 +1E0A +1E0C +1E0E +1E10 +1E12 +1E14 +1E16 +1E18 +1E1A +1E1C +1E1E +1E20 +1E22 +1E24 +1E26 +1E28 +1E2A +1E2C +1E2E +1E30 +1E32 +1E34 +1E36 +1E38 +1E3A +1E3C +1E3E +1E40 +1E42 +1E44 +1E46 +1E48 +1E4A +1E4C +1E4E +1E50 +1E52 +1E54 +1E56 +1E58 +1E5A +1E5C +1E5E +1E60 +1E62 +1E64 +1E66 +1E68 +1E6A +1E6C +1E6E +1E70 +1E72 +1E74 +1E76 +1E78 +1E7A +1E7C +1E7E +1E80 +1E82 +1E84 +1E86 +1E88 +1E8A +1E8C +1E8E +1E90 +1E92 +1E94 +1EA0 +1EA2 +1EA4 +1EA6 +1EA8 +1EAA +1EAC +1EAE +1EB0 +1EB2 +1EB4 +1EB6 +1EB8 +1EBA +1EBC +1EBE +1EC0 +1EC2 +1EC4 +1EC6 +1EC8 +1ECA +1ECC +1ECE +1ED0 +1ED2 +1ED4 +1ED6 +1ED8 +1EDA +1EDC +1EDE +1EE0 +1EE2 +1EE4 +1EE6 +1EE8 +1EEA +1EEC +1EEE +1EF0 +1EF2 +1EF4 +1EF6 +1EF8 +1F08 1F0F +1F18 1F1D +1F28 1F2F +1F38 1F3F +1F48 1F4D +1F59 +1F5B +1F5D +1F5F +1F68 1F6F +1FB8 1FBB +1FC8 1FCB +1FD8 1FDB +1FE8 1FEC +1FF8 1FFB +2102 +2107 +210B 210D +2110 2112 +2115 +2119 211D +2124 +2126 +2128 +212A 212D +2130 2131 +2133 +213E 213F +2145 +2C00 2C2E +2C80 +2C82 +2C84 +2C86 +2C88 +2C8A +2C8C +2C8E +2C90 +2C92 +2C94 +2C96 +2C98 +2C9A +2C9C +2C9E +2CA0 +2CA2 +2CA4 +2CA6 +2CA8 +2CAA +2CAC +2CAE +2CB0 +2CB2 +2CB4 +2CB6 +2CB8 +2CBA +2CBC +2CBE +2CC0 +2CC2 +2CC4 +2CC6 +2CC8 +2CCA +2CCC +2CCE +2CD0 +2CD2 +2CD4 +2CD6 +2CD8 +2CDA +2CDC +2CDE +2CE0 +2CE2 +FF21 FF3A +10400 10427 +1D400 1D419 +1D434 1D44D +1D468 1D481 +1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B5 +1D4D0 1D4E9 +1D504 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D538 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D56C 1D585 +1D5A0 1D5B9 +1D5D4 1D5ED +1D608 1D621 +1D63C 1D655 +1D670 1D689 +1D6A8 1D6C0 +1D6E2 1D6FA +1D71C 1D734 +1D756 1D76E +1D790 1D7A8 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/M.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/M.pl new file mode 100644 index 00000000000..10d6c61a669 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/M.pl @@ -0,0 +1,146 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{M} +# \p{M} (and fuzzy permutations) +# +# Meaning: Major Category 'M' +# +return <<'END'; +0300 036F +0483 0486 +0488 0489 +0591 05B9 +05BB 05BD +05BF +05C1 05C2 +05C4 05C5 +05C7 +0610 0615 +064B 065E +0670 +06D6 06DC +06DE 06E4 +06E7 06E8 +06EA 06ED +0711 +0730 074A +07A6 07B0 +0901 0903 +093C +093E 094D +0951 0954 +0962 0963 +0981 0983 +09BC +09BE 09C4 +09C7 09C8 +09CB 09CD +09D7 +09E2 09E3 +0A01 0A03 +0A3C +0A3E 0A42 +0A47 0A48 +0A4B 0A4D +0A70 0A71 +0A81 0A83 +0ABC +0ABE 0AC5 +0AC7 0AC9 +0ACB 0ACD +0AE2 0AE3 +0B01 0B03 +0B3C +0B3E 0B43 +0B47 0B48 +0B4B 0B4D +0B56 0B57 +0B82 +0BBE 0BC2 +0BC6 0BC8 +0BCA 0BCD +0BD7 +0C01 0C03 +0C3E 0C44 +0C46 0C48 +0C4A 0C4D +0C55 0C56 +0C82 0C83 +0CBC +0CBE 0CC4 +0CC6 0CC8 +0CCA 0CCD +0CD5 0CD6 +0D02 0D03 +0D3E 0D43 +0D46 0D48 +0D4A 0D4D +0D57 +0D82 0D83 +0DCA +0DCF 0DD4 +0DD6 +0DD8 0DDF +0DF2 0DF3 +0E31 +0E34 0E3A +0E47 0E4E +0EB1 +0EB4 0EB9 +0EBB 0EBC +0EC8 0ECD +0F18 0F19 +0F35 +0F37 +0F39 +0F3E 0F3F +0F71 0F84 +0F86 0F87 +0F90 0F97 +0F99 0FBC +0FC6 +102C 1032 +1036 1039 +1056 1059 +135F +1712 1714 +1732 1734 +1752 1753 +1772 1773 +17B6 17D3 +17DD +180B 180D +18A9 +1920 192B +1930 193B +19B0 19C0 +19C8 19C9 +1A17 1A1B +1DC0 1DC3 +20D0 20EB +302A 302F +3099 309A +A802 +A806 +A80B +A823 A827 +FB1E +FE00 FE0F +FE20 FE23 +10A01 10A03 +10A05 10A06 +10A0C 10A0F +10A38 10A3A +10A3F +1D165 1D169 +1D16D 1D172 +1D17B 1D182 +1D185 1D18B +1D1AA 1D1AD +1D242 1D244 +E0100 E01EF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Math.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Math.pl new file mode 100644 index 00000000000..a8cb569a258 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Math.pl @@ -0,0 +1,103 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Math} (and fuzzy permutations) +# +# Meaning: [\p{Sm}\p{OtherMath}] +# +return <<'END'; +002B +003C 003E +005E +007C +007E +00AC +00B1 +00D7 +00F7 +03D0 03D2 +03D5 +03F0 03F1 +03F4 03F6 +2016 +2032 2034 +2040 +2044 +2052 +2061 2063 +207A 207E +208A 208E +20D0 20DC +20E1 +20E5 20E6 +2102 +210A 2113 +2115 +2119 211D +2124 +2128 2129 +212C 212D +212F 2131 +2133 2138 +213C 2149 +214B +2190 2194 +219A 219B +21A0 +21A3 +21A6 +21AE +21CE 21CF +21D2 +21D4 +21F4 22FF +2308 230B +2320 2321 +237C +239B 23B3 +23B7 +23D0 +25B7 +25C1 +25F8 25FF +266F +27C0 27C6 +27D0 27EB +27F0 27FF +2900 2AFF +FB29 +FE61 FE66 +FE68 +FF0B +FF1C FF1E +FF3C +FF3E +FF5C +FF5E +FFE2 +FFE9 FFEC +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A3 +1D6A8 1D7C9 +1D7CE 1D7FF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Mc.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Mc.pl new file mode 100644 index 00000000000..26e02469f02 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Mc.pl @@ -0,0 +1,76 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Mc} +# \p{Mc} (and fuzzy permutations) +# +# Meaning: General Category 'Mc' +# +return <<'END'; +0903 +093E 0940 +0949 094C +0982 0983 +09BE 09C0 +09C7 09C8 +09CB 09CC +09D7 +0A03 +0A3E 0A40 +0A83 +0ABE 0AC0 +0AC9 +0ACB 0ACC +0B02 0B03 +0B3E +0B40 +0B47 0B48 +0B4B 0B4C +0B57 +0BBE 0BBF +0BC1 0BC2 +0BC6 0BC8 +0BCA 0BCC +0BD7 +0C01 0C03 +0C41 0C44 +0C82 0C83 +0CBE +0CC0 0CC4 +0CC7 0CC8 +0CCA 0CCB +0CD5 0CD6 +0D02 0D03 +0D3E 0D40 +0D46 0D48 +0D4A 0D4C +0D57 +0D82 0D83 +0DCF 0DD1 +0DD8 0DDF +0DF2 0DF3 +0F3E 0F3F +0F7F +102C +1031 +1038 +1056 1057 +17B6 +17BE 17C5 +17C7 17C8 +1923 1926 +1929 192B +1930 1931 +1933 1938 +19B0 19C0 +19C8 19C9 +1A19 1A1B +A802 +A823 A824 +A827 +1D165 1D166 +1D16D 1D172 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Me.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Me.pl new file mode 100644 index 00000000000..a8ffc8fee21 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Me.pl @@ -0,0 +1,17 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Me} +# \p{Me} (and fuzzy permutations) +# +# Meaning: General Category 'Me' +# +return <<'END'; +0488 0489 +06DE +20DD 20E0 +20E2 20E4 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Mlym.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Mlym.pl new file mode 100644 index 00000000000..9a3ad1b56cc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Mlym.pl @@ -0,0 +1,23 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Malayalam} (and fuzzy permutations) +# +# Meaning: Script 'Malayalam' +# +return <<'END'; +0D02 0D03 Malayalam +0D05 0D0C Malayalam +0D0E 0D10 Malayalam +0D12 0D28 Malayalam +0D2A 0D39 Malayalam +0D3E 0D43 Malayalam +0D46 0D48 Malayalam +0D4A 0D4D Malayalam +0D57 Malayalam +0D60 0D61 Malayalam +0D66 0D6F Malayalam +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Mn.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Mn.pl new file mode 100644 index 00000000000..a37b319a1cb --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Mn.pl @@ -0,0 +1,137 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Mn} +# \p{Mn} (and fuzzy permutations) +# +# Meaning: General Category 'Mn' +# +return <<'END'; +0300 036F +0483 0486 +0591 05B9 +05BB 05BD +05BF +05C1 05C2 +05C4 05C5 +05C7 +0610 0615 +064B 065E +0670 +06D6 06DC +06DF 06E4 +06E7 06E8 +06EA 06ED +0711 +0730 074A +07A6 07B0 +0901 0902 +093C +0941 0948 +094D +0951 0954 +0962 0963 +0981 +09BC +09C1 09C4 +09CD +09E2 09E3 +0A01 0A02 +0A3C +0A41 0A42 +0A47 0A48 +0A4B 0A4D +0A70 0A71 +0A81 0A82 +0ABC +0AC1 0AC5 +0AC7 0AC8 +0ACD +0AE2 0AE3 +0B01 +0B3C +0B3F +0B41 0B43 +0B4D +0B56 +0B82 +0BC0 +0BCD +0C3E 0C40 +0C46 0C48 +0C4A 0C4D +0C55 0C56 +0CBC +0CBF +0CC6 +0CCC 0CCD +0D41 0D43 +0D4D +0DCA +0DD2 0DD4 +0DD6 +0E31 +0E34 0E3A +0E47 0E4E +0EB1 +0EB4 0EB9 +0EBB 0EBC +0EC8 0ECD +0F18 0F19 +0F35 +0F37 +0F39 +0F71 0F7E +0F80 0F84 +0F86 0F87 +0F90 0F97 +0F99 0FBC +0FC6 +102D 1030 +1032 +1036 1037 +1039 +1058 1059 +135F +1712 1714 +1732 1734 +1752 1753 +1772 1773 +17B7 17BD +17C6 +17C9 17D3 +17DD +180B 180D +18A9 +1920 1922 +1927 1928 +1932 +1939 193B +1A17 1A18 +1DC0 1DC3 +20D0 20DC +20E1 +20E5 20EB +302A 302F +3099 309A +A806 +A80B +A825 A826 +FB1E +FE00 FE0F +FE20 FE23 +10A01 10A03 +10A05 10A06 +10A0C 10A0F +10A38 10A3A +10A3F +1D167 1D169 +1D17B 1D182 +1D185 1D18B +1D1AA 1D1AD +1D242 1D244 +E0100 E01EF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Mong.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Mong.pl new file mode 100644 index 00000000000..b72e78316c8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Mong.pl @@ -0,0 +1,16 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Mongolian} (and fuzzy permutations) +# +# Meaning: Script 'Mongolian' +# +return <<'END'; +1800 180E Mongolian +1810 1819 Mongolian +1820 1877 Mongolian +1880 18A9 Mongolian +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Mymr.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Mymr.pl new file mode 100644 index 00000000000..dc737eee2c9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Mymr.pl @@ -0,0 +1,18 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Myanmar} (and fuzzy permutations) +# +# Meaning: Script 'Myanmar' +# +return <<'END'; +1000 1021 Myanmar +1023 1027 Myanmar +1029 102A Myanmar +102C 1032 Myanmar +1036 1039 Myanmar +1040 1059 Myanmar +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/N.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/N.pl new file mode 100644 index 00000000000..c94d2d97317 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/N.pl @@ -0,0 +1,66 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{N} +# \p{N} (and fuzzy permutations) +# +# Meaning: Major Category 'N' +# +return <<'END'; +0030 0039 +00B2 00B3 +00B9 +00BC 00BE +0660 0669 +06F0 06F9 +0966 096F +09E6 09EF +09F4 09F9 +0A66 0A6F +0AE6 0AEF +0B66 0B6F +0BE6 0BF2 +0C66 0C6F +0CE6 0CEF +0D66 0D6F +0E50 0E59 +0ED0 0ED9 +0F20 0F33 +1040 1049 +1369 137C +16EE 16F0 +17E0 17E9 +17F0 17F9 +1810 1819 +1946 194F +19D0 19D9 +2070 +2074 2079 +2080 2089 +2153 2183 +2460 249B +24EA 24FF +2776 2793 +2CFD +3007 +3021 3029 +3038 303A +3192 3195 +3220 3229 +3251 325F +3280 3289 +32B1 32BF +FF10 FF19 +10107 10133 +10140 10178 +1018A +10320 10323 +1034A +103D1 103D5 +104A0 104A9 +10A40 10A47 +1D7CE 1D7FF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/NChar.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/NChar.pl new file mode 100644 index 00000000000..46f865d878c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/NChar.pl @@ -0,0 +1,27 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Noncharacter_Code_Point' +# +return <<'END'; +FDD0 FDEF Noncharacter_Code_Point +FFFE FFFF Noncharacter_Code_Point +1FFFE 1FFFF Noncharacter_Code_Point +2FFFE 2FFFF Noncharacter_Code_Point +3FFFE 3FFFF Noncharacter_Code_Point +4FFFE 4FFFF Noncharacter_Code_Point +5FFFE 5FFFF Noncharacter_Code_Point +6FFFE 6FFFF Noncharacter_Code_Point +7FFFE 7FFFF Noncharacter_Code_Point +8FFFE 8FFFF Noncharacter_Code_Point +9FFFE 9FFFF Noncharacter_Code_Point +AFFFE AFFFF Noncharacter_Code_Point +BFFFE BFFFF Noncharacter_Code_Point +CFFFE CFFFF Noncharacter_Code_Point +DFFFE DFFFF Noncharacter_Code_Point +EFFFE EFFFF Noncharacter_Code_Point +FFFFE FFFFF Noncharacter_Code_Point +10FFFE 10FFFF Noncharacter_Code_Point +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Nd.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Nd.pl new file mode 100644 index 00000000000..e38926a9880 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Nd.pl @@ -0,0 +1,36 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Nd} +# \p{Nd} (and fuzzy permutations) +# +# Meaning: General Category 'Nd' +# +return <<'END'; +0030 0039 +0660 0669 +06F0 06F9 +0966 096F +09E6 09EF +0A66 0A6F +0AE6 0AEF +0B66 0B6F +0BE6 0BEF +0C66 0C6F +0CE6 0CEF +0D66 0D6F +0E50 0E59 +0ED0 0ED9 +0F20 0F29 +1040 1049 +17E0 17E9 +1810 1819 +1946 194F +19D0 19D9 +FF10 FF19 +104A0 104A9 +1D7CE 1D7FF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/NewTaiLu.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/NewTaiLu.pl new file mode 100644 index 00000000000..506c6011ab5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/NewTaiLu.pl @@ -0,0 +1,16 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{NewTaiLue} (and fuzzy permutations) +# +# Meaning: Script 'New_Tai_Lue' +# +return <<'END'; +1980 19A9 New_Tai_Lue +19B0 19C9 New_Tai_Lue +19D0 19D9 New_Tai_Lue +19DE 19DF New_Tai_Lue +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Nl.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Nl.pl new file mode 100644 index 00000000000..3acf890e1e9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Nl.pl @@ -0,0 +1,21 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Nl} +# \p{Nl} (and fuzzy permutations) +# +# Meaning: General Category 'Nl' +# +return <<'END'; +16EE 16F0 +2160 2183 +3007 +3021 3029 +3038 303A +10140 10174 +1034A +103D1 103D5 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/No.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/No.pl new file mode 100644 index 00000000000..4e8b11c2ab6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/No.pl @@ -0,0 +1,39 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{No} +# \p{No} (and fuzzy permutations) +# +# Meaning: General Category 'No' +# +return <<'END'; +00B2 00B3 +00B9 +00BC 00BE +09F4 09F9 +0BF0 0BF2 +0F2A 0F33 +1369 137C +17F0 17F9 +2070 +2074 2079 +2080 2089 +2153 215F +2460 249B +24EA 24FF +2776 2793 +2CFD +3192 3195 +3220 3229 +3251 325F +3280 3289 +32B1 32BF +10107 10133 +10175 10178 +1018A +10320 10323 +10A40 10A47 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Nonchara.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Nonchara.pl new file mode 100644 index 00000000000..02624831133 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Nonchara.pl @@ -0,0 +1,30 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{NoncharacterCodePoint} (and fuzzy permutations) +# +# Meaning: Extended property 'Noncharacter_Code_Point' +# +return <<'END'; +FDD0 FDEF Noncharacter_Code_Point +FFFE FFFF Noncharacter_Code_Point +1FFFE 1FFFF Noncharacter_Code_Point +2FFFE 2FFFF Noncharacter_Code_Point +3FFFE 3FFFF Noncharacter_Code_Point +4FFFE 4FFFF Noncharacter_Code_Point +5FFFE 5FFFF Noncharacter_Code_Point +6FFFE 6FFFF Noncharacter_Code_Point +7FFFE 7FFFF Noncharacter_Code_Point +8FFFE 8FFFF Noncharacter_Code_Point +9FFFE 9FFFF Noncharacter_Code_Point +AFFFE AFFFF Noncharacter_Code_Point +BFFFE BFFFF Noncharacter_Code_Point +CFFFE CFFFF Noncharacter_Code_Point +DFFFE DFFFF Noncharacter_Code_Point +EFFFE EFFFF Noncharacter_Code_Point +FFFFE FFFFF Noncharacter_Code_Point +10FFFE 10FFFF Noncharacter_Code_Point +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OAlpha.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OAlpha.pl new file mode 100644 index 00000000000..ad6b3b331dd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OAlpha.pl @@ -0,0 +1,108 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Other_Alphabetic' +# +return <<'END'; +0345 Other_Alphabetic +05B0 05B9 Other_Alphabetic +05BB 05BD Other_Alphabetic +05BF Other_Alphabetic +05C1 05C2 Other_Alphabetic +05C4 05C5 Other_Alphabetic +05C7 Other_Alphabetic +0610 0615 Other_Alphabetic +064B 0657 Other_Alphabetic +0659 065E Other_Alphabetic +0670 Other_Alphabetic +06D6 06DC Other_Alphabetic +06E1 06E4 Other_Alphabetic +06E7 06E8 Other_Alphabetic +06ED Other_Alphabetic +0711 Other_Alphabetic +0730 073F Other_Alphabetic +07A6 07B0 Other_Alphabetic +0901 0903 Other_Alphabetic +093E 094C Other_Alphabetic +0962 0963 Other_Alphabetic +0981 0983 Other_Alphabetic +09BE 09C4 Other_Alphabetic +09C7 09C8 Other_Alphabetic +09CB 09CC Other_Alphabetic +09D7 Other_Alphabetic +09E2 09E3 Other_Alphabetic +0A01 0A03 Other_Alphabetic +0A3E 0A42 Other_Alphabetic +0A47 0A48 Other_Alphabetic +0A4B 0A4C Other_Alphabetic +0A70 0A71 Other_Alphabetic +0A81 0A83 Other_Alphabetic +0ABE 0AC5 Other_Alphabetic +0AC7 0AC9 Other_Alphabetic +0ACB 0ACC Other_Alphabetic +0AE2 0AE3 Other_Alphabetic +0B01 0B03 Other_Alphabetic +0B3E 0B43 Other_Alphabetic +0B47 0B48 Other_Alphabetic +0B4B 0B4C Other_Alphabetic +0B56 0B57 Other_Alphabetic +0B82 Other_Alphabetic +0BBE 0BC2 Other_Alphabetic +0BC6 0BC8 Other_Alphabetic +0BCA 0BCC Other_Alphabetic +0BD7 Other_Alphabetic +0C01 0C03 Other_Alphabetic +0C3E 0C44 Other_Alphabetic +0C46 0C48 Other_Alphabetic +0C4A 0C4C Other_Alphabetic +0C55 0C56 Other_Alphabetic +0C82 0C83 Other_Alphabetic +0CBE 0CC4 Other_Alphabetic +0CC6 0CC8 Other_Alphabetic +0CCA 0CCC Other_Alphabetic +0CD5 0CD6 Other_Alphabetic +0D02 0D03 Other_Alphabetic +0D3E 0D43 Other_Alphabetic +0D46 0D48 Other_Alphabetic +0D4A 0D4C Other_Alphabetic +0D57 Other_Alphabetic +0D82 0D83 Other_Alphabetic +0DCF 0DD4 Other_Alphabetic +0DD6 Other_Alphabetic +0DD8 0DDF Other_Alphabetic +0DF2 0DF3 Other_Alphabetic +0E31 Other_Alphabetic +0E34 0E3A Other_Alphabetic +0E4D Other_Alphabetic +0EB1 Other_Alphabetic +0EB4 0EB9 Other_Alphabetic +0EBB 0EBC Other_Alphabetic +0ECD Other_Alphabetic +0F71 0F81 Other_Alphabetic +0F90 0F97 Other_Alphabetic +0F99 0FBC Other_Alphabetic +102C 1032 Other_Alphabetic +1036 Other_Alphabetic +1038 Other_Alphabetic +1056 1059 Other_Alphabetic +135F Other_Alphabetic +1712 1713 Other_Alphabetic +1732 1733 Other_Alphabetic +1752 1753 Other_Alphabetic +1772 1773 Other_Alphabetic +17B6 17C8 Other_Alphabetic +18A9 Other_Alphabetic +1920 192B Other_Alphabetic +1930 1938 Other_Alphabetic +19B0 19C0 Other_Alphabetic +19C8 19C9 Other_Alphabetic +1A17 1A1B Other_Alphabetic +24B6 24E9 Other_Alphabetic +A823 A827 Other_Alphabetic +FB1E Other_Alphabetic +10A01 10A03 Other_Alphabetic +10A05 10A06 Other_Alphabetic +10A0C 10A0F Other_Alphabetic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/ODI.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/ODI.pl new file mode 100644 index 00000000000..0bcb43d5650 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/ODI.pl @@ -0,0 +1,19 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Other_Default_Ignorable_Code_Point' +# +return <<'END'; +034F Other_Default_Ignorable_Code_Point +115F 1160 Other_Default_Ignorable_Code_Point +2064 2069 Other_Default_Ignorable_Code_Point +3164 Other_Default_Ignorable_Code_Point +FFA0 Other_Default_Ignorable_Code_Point +FFF0 FFF8 Other_Default_Ignorable_Code_Point +E0000 Other_Default_Ignorable_Code_Point +E0002 E001F Other_Default_Ignorable_Code_Point +E0080 E00FF Other_Default_Ignorable_Code_Point +E01F0 E0FFF Other_Default_Ignorable_Code_Point +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OGrExt.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OGrExt.pl new file mode 100644 index 00000000000..1db852615cc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OGrExt.pl @@ -0,0 +1,24 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Other_Grapheme_Extend' +# +return <<'END'; +09BE Other_Grapheme_Extend +09D7 Other_Grapheme_Extend +0B3E Other_Grapheme_Extend +0B57 Other_Grapheme_Extend +0BBE Other_Grapheme_Extend +0BD7 Other_Grapheme_Extend +0CC2 Other_Grapheme_Extend +0CD5 0CD6 Other_Grapheme_Extend +0D3E Other_Grapheme_Extend +0D57 Other_Grapheme_Extend +0DCF Other_Grapheme_Extend +0DDF Other_Grapheme_Extend +200C 200D Other_Grapheme_Extend +1D165 Other_Grapheme_Extend +1D16E 1D172 Other_Grapheme_Extend +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OIDC.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OIDC.pl new file mode 100644 index 00000000000..3c66febbd46 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OIDC.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Other_ID_Continue' +# +return <<'END'; +1369 1371 Other_ID_Continue +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OIDS.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OIDS.pl new file mode 100644 index 00000000000..2fa61e8bf7d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OIDS.pl @@ -0,0 +1,12 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Other_ID_Start' +# +return <<'END'; +2118 Other_ID_Start +212E Other_ID_Start +309B 309C Other_ID_Start +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OLower.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OLower.pl new file mode 100644 index 00000000000..d403c834e8a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OLower.pl @@ -0,0 +1,20 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Other_Lowercase' +# +return <<'END'; +02B0 02B8 Other_Lowercase +02C0 02C1 Other_Lowercase +02E0 02E4 Other_Lowercase +0345 Other_Lowercase +037A Other_Lowercase +1D2C 1D61 Other_Lowercase +1D78 Other_Lowercase +1D9B 1DBF Other_Lowercase +2090 2094 Other_Lowercase +2170 217F Other_Lowercase +24D0 24E9 Other_Lowercase +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OMath.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OMath.pl new file mode 100644 index 00000000000..a04d5d44761 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OMath.pl @@ -0,0 +1,77 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Other_Math' +# +return <<'END'; +005E Other_Math +03D0 03D2 Other_Math +03D5 Other_Math +03F0 03F1 Other_Math +03F4 03F5 Other_Math +2016 Other_Math +2032 2034 Other_Math +2040 Other_Math +2061 2063 Other_Math +207D 207E Other_Math +208D 208E Other_Math +20D0 20DC Other_Math +20E1 Other_Math +20E5 20E6 Other_Math +2102 Other_Math +210A 2113 Other_Math +2115 Other_Math +2119 211D Other_Math +2124 Other_Math +2128 2129 Other_Math +212C 212D Other_Math +212F 2131 Other_Math +2133 2138 Other_Math +213C 213F Other_Math +2145 2149 Other_Math +23B7 Other_Math +23D0 Other_Math +27C5 27C6 Other_Math +27E6 27EB Other_Math +2983 2998 Other_Math +29D8 29DB Other_Math +29FC 29FD Other_Math +FE61 Other_Math +FE63 Other_Math +FE68 Other_Math +FF3C Other_Math +FF3E Other_Math +1D400 1D454 Other_Math +1D456 1D49C Other_Math +1D49E 1D49F Other_Math +1D4A2 Other_Math +1D4A5 1D4A6 Other_Math +1D4A9 1D4AC Other_Math +1D4AE 1D4B9 Other_Math +1D4BB Other_Math +1D4BD 1D4C3 Other_Math +1D4C5 1D505 Other_Math +1D507 1D50A Other_Math +1D50D 1D514 Other_Math +1D516 1D51C Other_Math +1D51E 1D539 Other_Math +1D53B 1D53E Other_Math +1D540 1D544 Other_Math +1D546 Other_Math +1D54A 1D550 Other_Math +1D552 1D6A3 Other_Math +1D6A8 1D6C0 Other_Math +1D6C2 1D6DA Other_Math +1D6DC 1D6FA Other_Math +1D6FC 1D714 Other_Math +1D716 1D734 Other_Math +1D736 1D74E Other_Math +1D750 1D76E Other_Math +1D770 1D788 Other_Math +1D78A 1D7A8 Other_Math +1D7AA 1D7C2 Other_Math +1D7C4 1D7C9 Other_Math +1D7CE 1D7FF Other_Math +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OUpper.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OUpper.pl new file mode 100644 index 00000000000..28ae9bec896 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OUpper.pl @@ -0,0 +1,11 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Other_Uppercase' +# +return <<'END'; +2160 216F Other_Uppercase +24B6 24CF Other_Uppercase +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ogam.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ogam.pl new file mode 100644 index 00000000000..febdcd5f0f9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ogam.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Ogham} (and fuzzy permutations) +# +# Meaning: Script 'Ogham' +# +return <<'END'; +1680 169C Ogham +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OldItali.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OldItali.pl new file mode 100644 index 00000000000..d2084536937 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OldItali.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{OldItalic} (and fuzzy permutations) +# +# Meaning: Script 'Old_Italic' +# +return <<'END'; +10300 1031E Old_Italic +10320 10323 Old_Italic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OldPersi.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OldPersi.pl new file mode 100644 index 00000000000..9558e2e822e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OldPersi.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{OldPersian} (and fuzzy permutations) +# +# Meaning: Script 'Old_Persian' +# +return <<'END'; +103A0 103C3 Old_Persian +103C8 103D5 Old_Persian +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Orya.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Orya.pl new file mode 100644 index 00000000000..9b96b1f7dee --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Orya.pl @@ -0,0 +1,26 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Oriya} (and fuzzy permutations) +# +# Meaning: Script 'Oriya' +# +return <<'END'; +0B01 0B03 Oriya +0B05 0B0C Oriya +0B0F 0B10 Oriya +0B13 0B28 Oriya +0B2A 0B30 Oriya +0B32 0B33 Oriya +0B35 0B39 Oriya +0B3C 0B43 Oriya +0B47 0B48 Oriya +0B4B 0B4D Oriya +0B56 0B57 Oriya +0B5C 0B5D Oriya +0B5F 0B61 Oriya +0B66 0B71 Oriya +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Osma.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Osma.pl new file mode 100644 index 00000000000..de7a8935552 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Osma.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Osmanya} (and fuzzy permutations) +# +# Meaning: Script 'Osmanya' +# +return <<'END'; +10480 1049D Osmanya +104A0 104A9 Osmanya +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherAlp.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherAlp.pl new file mode 100644 index 00000000000..a786ad9fb6e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherAlp.pl @@ -0,0 +1,111 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{OtherAlphabetic} (and fuzzy permutations) +# +# Meaning: Extended property 'Other_Alphabetic' +# +return <<'END'; +0345 Other_Alphabetic +05B0 05B9 Other_Alphabetic +05BB 05BD Other_Alphabetic +05BF Other_Alphabetic +05C1 05C2 Other_Alphabetic +05C4 05C5 Other_Alphabetic +05C7 Other_Alphabetic +0610 0615 Other_Alphabetic +064B 0657 Other_Alphabetic +0659 065E Other_Alphabetic +0670 Other_Alphabetic +06D6 06DC Other_Alphabetic +06E1 06E4 Other_Alphabetic +06E7 06E8 Other_Alphabetic +06ED Other_Alphabetic +0711 Other_Alphabetic +0730 073F Other_Alphabetic +07A6 07B0 Other_Alphabetic +0901 0903 Other_Alphabetic +093E 094C Other_Alphabetic +0962 0963 Other_Alphabetic +0981 0983 Other_Alphabetic +09BE 09C4 Other_Alphabetic +09C7 09C8 Other_Alphabetic +09CB 09CC Other_Alphabetic +09D7 Other_Alphabetic +09E2 09E3 Other_Alphabetic +0A01 0A03 Other_Alphabetic +0A3E 0A42 Other_Alphabetic +0A47 0A48 Other_Alphabetic +0A4B 0A4C Other_Alphabetic +0A70 0A71 Other_Alphabetic +0A81 0A83 Other_Alphabetic +0ABE 0AC5 Other_Alphabetic +0AC7 0AC9 Other_Alphabetic +0ACB 0ACC Other_Alphabetic +0AE2 0AE3 Other_Alphabetic +0B01 0B03 Other_Alphabetic +0B3E 0B43 Other_Alphabetic +0B47 0B48 Other_Alphabetic +0B4B 0B4C Other_Alphabetic +0B56 0B57 Other_Alphabetic +0B82 Other_Alphabetic +0BBE 0BC2 Other_Alphabetic +0BC6 0BC8 Other_Alphabetic +0BCA 0BCC Other_Alphabetic +0BD7 Other_Alphabetic +0C01 0C03 Other_Alphabetic +0C3E 0C44 Other_Alphabetic +0C46 0C48 Other_Alphabetic +0C4A 0C4C Other_Alphabetic +0C55 0C56 Other_Alphabetic +0C82 0C83 Other_Alphabetic +0CBE 0CC4 Other_Alphabetic +0CC6 0CC8 Other_Alphabetic +0CCA 0CCC Other_Alphabetic +0CD5 0CD6 Other_Alphabetic +0D02 0D03 Other_Alphabetic +0D3E 0D43 Other_Alphabetic +0D46 0D48 Other_Alphabetic +0D4A 0D4C Other_Alphabetic +0D57 Other_Alphabetic +0D82 0D83 Other_Alphabetic +0DCF 0DD4 Other_Alphabetic +0DD6 Other_Alphabetic +0DD8 0DDF Other_Alphabetic +0DF2 0DF3 Other_Alphabetic +0E31 Other_Alphabetic +0E34 0E3A Other_Alphabetic +0E4D Other_Alphabetic +0EB1 Other_Alphabetic +0EB4 0EB9 Other_Alphabetic +0EBB 0EBC Other_Alphabetic +0ECD Other_Alphabetic +0F71 0F81 Other_Alphabetic +0F90 0F97 Other_Alphabetic +0F99 0FBC Other_Alphabetic +102C 1032 Other_Alphabetic +1036 Other_Alphabetic +1038 Other_Alphabetic +1056 1059 Other_Alphabetic +135F Other_Alphabetic +1712 1713 Other_Alphabetic +1732 1733 Other_Alphabetic +1752 1753 Other_Alphabetic +1772 1773 Other_Alphabetic +17B6 17C8 Other_Alphabetic +18A9 Other_Alphabetic +1920 192B Other_Alphabetic +1930 1938 Other_Alphabetic +19B0 19C0 Other_Alphabetic +19C8 19C9 Other_Alphabetic +1A17 1A1B Other_Alphabetic +24B6 24E9 Other_Alphabetic +A823 A827 Other_Alphabetic +FB1E Other_Alphabetic +10A01 10A03 Other_Alphabetic +10A05 10A06 Other_Alphabetic +10A0C 10A0F Other_Alphabetic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherDef.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherDef.pl new file mode 100644 index 00000000000..ced4761b930 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherDef.pl @@ -0,0 +1,22 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{OtherDefaultIgnorableCodePoint} (and fuzzy permutations) +# +# Meaning: Extended property 'Other_Default_Ignorable_Code_Point' +# +return <<'END'; +034F Other_Default_Ignorable_Code_Point +115F 1160 Other_Default_Ignorable_Code_Point +2064 2069 Other_Default_Ignorable_Code_Point +3164 Other_Default_Ignorable_Code_Point +FFA0 Other_Default_Ignorable_Code_Point +FFF0 FFF8 Other_Default_Ignorable_Code_Point +E0000 Other_Default_Ignorable_Code_Point +E0002 E001F Other_Default_Ignorable_Code_Point +E0080 E00FF Other_Default_Ignorable_Code_Point +E01F0 E0FFF Other_Default_Ignorable_Code_Point +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherGra.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherGra.pl new file mode 100644 index 00000000000..00e75a8c5fa --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherGra.pl @@ -0,0 +1,27 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{OtherGraphemeExtend} (and fuzzy permutations) +# +# Meaning: Extended property 'Other_Grapheme_Extend' +# +return <<'END'; +09BE Other_Grapheme_Extend +09D7 Other_Grapheme_Extend +0B3E Other_Grapheme_Extend +0B57 Other_Grapheme_Extend +0BBE Other_Grapheme_Extend +0BD7 Other_Grapheme_Extend +0CC2 Other_Grapheme_Extend +0CD5 0CD6 Other_Grapheme_Extend +0D3E Other_Grapheme_Extend +0D57 Other_Grapheme_Extend +0DCF Other_Grapheme_Extend +0DDF Other_Grapheme_Extend +200C 200D Other_Grapheme_Extend +1D165 Other_Grapheme_Extend +1D16E 1D172 Other_Grapheme_Extend +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherIdC.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherIdC.pl new file mode 100644 index 00000000000..ddd390b2241 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherIdC.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{OtherIdContinue} (and fuzzy permutations) +# +# Meaning: Extended property 'Other_ID_Continue' +# +return <<'END'; +1369 1371 Other_ID_Continue +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherIdS.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherIdS.pl new file mode 100644 index 00000000000..1f165d1ce17 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherIdS.pl @@ -0,0 +1,15 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{OtherIdStart} (and fuzzy permutations) +# +# Meaning: Extended property 'Other_ID_Start' +# +return <<'END'; +2118 Other_ID_Start +212E Other_ID_Start +309B 309C Other_ID_Start +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherLow.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherLow.pl new file mode 100644 index 00000000000..b2804306e65 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherLow.pl @@ -0,0 +1,23 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{OtherLowercase} (and fuzzy permutations) +# +# Meaning: Extended property 'Other_Lowercase' +# +return <<'END'; +02B0 02B8 Other_Lowercase +02C0 02C1 Other_Lowercase +02E0 02E4 Other_Lowercase +0345 Other_Lowercase +037A Other_Lowercase +1D2C 1D61 Other_Lowercase +1D78 Other_Lowercase +1D9B 1DBF Other_Lowercase +2090 2094 Other_Lowercase +2170 217F Other_Lowercase +24D0 24E9 Other_Lowercase +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherMat.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherMat.pl new file mode 100644 index 00000000000..6264a6b0d89 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherMat.pl @@ -0,0 +1,80 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{OtherMath} (and fuzzy permutations) +# +# Meaning: Extended property 'Other_Math' +# +return <<'END'; +005E Other_Math +03D0 03D2 Other_Math +03D5 Other_Math +03F0 03F1 Other_Math +03F4 03F5 Other_Math +2016 Other_Math +2032 2034 Other_Math +2040 Other_Math +2061 2063 Other_Math +207D 207E Other_Math +208D 208E Other_Math +20D0 20DC Other_Math +20E1 Other_Math +20E5 20E6 Other_Math +2102 Other_Math +210A 2113 Other_Math +2115 Other_Math +2119 211D Other_Math +2124 Other_Math +2128 2129 Other_Math +212C 212D Other_Math +212F 2131 Other_Math +2133 2138 Other_Math +213C 213F Other_Math +2145 2149 Other_Math +23B7 Other_Math +23D0 Other_Math +27C5 27C6 Other_Math +27E6 27EB Other_Math +2983 2998 Other_Math +29D8 29DB Other_Math +29FC 29FD Other_Math +FE61 Other_Math +FE63 Other_Math +FE68 Other_Math +FF3C Other_Math +FF3E Other_Math +1D400 1D454 Other_Math +1D456 1D49C Other_Math +1D49E 1D49F Other_Math +1D4A2 Other_Math +1D4A5 1D4A6 Other_Math +1D4A9 1D4AC Other_Math +1D4AE 1D4B9 Other_Math +1D4BB Other_Math +1D4BD 1D4C3 Other_Math +1D4C5 1D505 Other_Math +1D507 1D50A Other_Math +1D50D 1D514 Other_Math +1D516 1D51C Other_Math +1D51E 1D539 Other_Math +1D53B 1D53E Other_Math +1D540 1D544 Other_Math +1D546 Other_Math +1D54A 1D550 Other_Math +1D552 1D6A3 Other_Math +1D6A8 1D6C0 Other_Math +1D6C2 1D6DA Other_Math +1D6DC 1D6FA Other_Math +1D6FC 1D714 Other_Math +1D716 1D734 Other_Math +1D736 1D74E Other_Math +1D750 1D76E Other_Math +1D770 1D788 Other_Math +1D78A 1D7A8 Other_Math +1D7AA 1D7C2 Other_Math +1D7C4 1D7C9 Other_Math +1D7CE 1D7FF Other_Math +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherUpp.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherUpp.pl new file mode 100644 index 00000000000..4ee526f338e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/OtherUpp.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{OtherUppercase} (and fuzzy permutations) +# +# Meaning: Extended property 'Other_Uppercase' +# +return <<'END'; +2160 216F Other_Uppercase +24B6 24CF Other_Uppercase +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/P.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/P.pl new file mode 100644 index 00000000000..9633611f351 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/P.pl @@ -0,0 +1,109 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{P} +# \p{P} (and fuzzy permutations) +# +# Meaning: Major Category 'P' +# +return <<'END'; +0021 0023 +0025 002A +002C 002F +003A 003B +003F 0040 +005B 005D +005F +007B +007D +00A1 +00AB +00B7 +00BB +00BF +037E +0387 +055A 055F +0589 058A +05BE +05C0 +05C3 +05C6 +05F3 05F4 +060C 060D +061B +061E 061F +066A 066D +06D4 +0700 070D +0964 0965 +0970 +0DF4 +0E4F +0E5A 0E5B +0F04 0F12 +0F3A 0F3D +0F85 +0FD0 0FD1 +104A 104F +10FB +1361 1368 +166D 166E +169B 169C +16EB 16ED +1735 1736 +17D4 17D6 +17D8 17DA +1800 180A +1944 1945 +19DE 19DF +1A1E 1A1F +2010 2027 +2030 2043 +2045 2051 +2053 205E +207D 207E +208D 208E +2329 232A +23B4 23B6 +2768 2775 +27C5 27C6 +27E6 27EB +2983 2998 +29D8 29DB +29FC 29FD +2CF9 2CFC +2CFE 2CFF +2E00 2E17 +2E1C 2E1D +3001 3003 +3008 3011 +3014 301F +3030 +303D +30A0 +30FB +FD3E FD3F +FE10 FE19 +FE30 FE52 +FE54 FE61 +FE63 +FE68 +FE6A FE6B +FF01 FF03 +FF05 FF0A +FF0C FF0F +FF1A FF1B +FF1F FF20 +FF3B FF3D +FF3F +FF5B +FF5D +FF5F FF65 +10100 10101 +1039F +10A50 10A58 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/PatSyn.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/PatSyn.pl new file mode 100644 index 00000000000..bb53683d6e4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/PatSyn.pl @@ -0,0 +1,37 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Pattern_Syntax' +# +return <<'END'; +0021 002F Pattern_Syntax +003A 0040 Pattern_Syntax +005B 005E Pattern_Syntax +0060 Pattern_Syntax +007B 007E Pattern_Syntax +00A1 00A7 Pattern_Syntax +00A9 Pattern_Syntax +00AB 00AC Pattern_Syntax +00AE Pattern_Syntax +00B0 00B1 Pattern_Syntax +00B6 Pattern_Syntax +00BB Pattern_Syntax +00BF Pattern_Syntax +00D7 Pattern_Syntax +00F7 Pattern_Syntax +2010 2027 Pattern_Syntax +2030 203E Pattern_Syntax +2041 2053 Pattern_Syntax +2055 205E Pattern_Syntax +2190 245F Pattern_Syntax +2500 2775 Pattern_Syntax +2794 2BFF Pattern_Syntax +2E00 2E7F Pattern_Syntax +3001 3003 Pattern_Syntax +3008 3020 Pattern_Syntax +3030 Pattern_Syntax +FD3E FD3F Pattern_Syntax +FE45 FE46 Pattern_Syntax +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/PatWS.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/PatWS.pl new file mode 100644 index 00000000000..4157e6479c7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/PatWS.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Pattern_White_Space' +# +return <<'END'; +0009 000D Pattern_White_Space +0020 Pattern_White_Space +0085 Pattern_White_Space +200E 200F Pattern_White_Space +2028 2029 Pattern_White_Space +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/PatternS.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/PatternS.pl new file mode 100644 index 00000000000..ef8441d6b6f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/PatternS.pl @@ -0,0 +1,40 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{PatternSyntax} (and fuzzy permutations) +# +# Meaning: Extended property 'Pattern_Syntax' +# +return <<'END'; +0021 002F Pattern_Syntax +003A 0040 Pattern_Syntax +005B 005E Pattern_Syntax +0060 Pattern_Syntax +007B 007E Pattern_Syntax +00A1 00A7 Pattern_Syntax +00A9 Pattern_Syntax +00AB 00AC Pattern_Syntax +00AE Pattern_Syntax +00B0 00B1 Pattern_Syntax +00B6 Pattern_Syntax +00BB Pattern_Syntax +00BF Pattern_Syntax +00D7 Pattern_Syntax +00F7 Pattern_Syntax +2010 2027 Pattern_Syntax +2030 203E Pattern_Syntax +2041 2053 Pattern_Syntax +2055 205E Pattern_Syntax +2190 245F Pattern_Syntax +2500 2775 Pattern_Syntax +2794 2BFF Pattern_Syntax +2E00 2E7F Pattern_Syntax +3001 3003 Pattern_Syntax +3008 3020 Pattern_Syntax +3030 Pattern_Syntax +FD3E FD3F Pattern_Syntax +FE45 FE46 Pattern_Syntax +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/PatternW.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/PatternW.pl new file mode 100644 index 00000000000..9d63eca6541 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/PatternW.pl @@ -0,0 +1,17 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{PatternWhiteSpace} (and fuzzy permutations) +# +# Meaning: Extended property 'Pattern_White_Space' +# +return <<'END'; +0009 000D Pattern_White_Space +0020 Pattern_White_Space +0085 Pattern_White_Space +200E 200F Pattern_White_Space +2028 2029 Pattern_White_Space +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Pc.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Pc.pl new file mode 100644 index 00000000000..2a2cbe552dc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Pc.pl @@ -0,0 +1,19 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Pc} +# \p{Pc} (and fuzzy permutations) +# +# Meaning: General Category 'Pc' +# +return <<'END'; +005F +203F 2040 +2054 +FE33 FE34 +FE4D FE4F +FF3F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Pd.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Pd.pl new file mode 100644 index 00000000000..5aa3eb3ee32 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Pd.pl @@ -0,0 +1,25 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Pd} +# \p{Pd} (and fuzzy permutations) +# +# Meaning: General Category 'Pd' +# +return <<'END'; +002D +058A +1806 +2010 2015 +2E17 +301C +3030 +30A0 +FE31 FE32 +FE58 +FE63 +FF0D +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Pe.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Pe.pl new file mode 100644 index 00000000000..c22445a2790 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Pe.pl @@ -0,0 +1,78 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Pe} +# \p{Pe} (and fuzzy permutations) +# +# Meaning: General Category 'Pe' +# +return <<'END'; +0029 +005D +007D +0F3B +0F3D +169C +2046 +207E +208E +232A +23B5 +2769 +276B +276D +276F +2771 +2773 +2775 +27C6 +27E7 +27E9 +27EB +2984 +2986 +2988 +298A +298C +298E +2990 +2992 +2994 +2996 +2998 +29D9 +29DB +29FD +3009 +300B +300D +300F +3011 +3015 +3017 +3019 +301B +301E 301F +FD3F +FE18 +FE36 +FE38 +FE3A +FE3C +FE3E +FE40 +FE42 +FE44 +FE48 +FE5A +FE5C +FE5E +FF09 +FF3D +FF5D +FF60 +FF63 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Pf.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Pf.pl new file mode 100644 index 00000000000..256bef78d23 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Pf.pl @@ -0,0 +1,22 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Pf} +# \p{Pf} (and fuzzy permutations) +# +# Meaning: General Category 'Pf' +# +return <<'END'; +00BB +2019 +201D +203A +2E03 +2E05 +2E0A +2E0D +2E1D +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Pi.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Pi.pl new file mode 100644 index 00000000000..d1e23c27b3d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Pi.pl @@ -0,0 +1,23 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Pi} +# \p{Pi} (and fuzzy permutations) +# +# Meaning: General Category 'Pi' +# +return <<'END'; +00AB +2018 +201B 201C +201F +2039 +2E02 +2E04 +2E09 +2E0C +2E1C +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Po.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Po.pl new file mode 100644 index 00000000000..55ca20ca1e7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Po.pl @@ -0,0 +1,101 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Po} +# \p{Po} (and fuzzy permutations) +# +# Meaning: General Category 'Po' +# +return <<'END'; +0021 0023 +0025 0027 +002A +002C +002E 002F +003A 003B +003F 0040 +005C +00A1 +00B7 +00BF +037E +0387 +055A 055F +0589 +05BE +05C0 +05C3 +05C6 +05F3 05F4 +060C 060D +061B +061E 061F +066A 066D +06D4 +0700 070D +0964 0965 +0970 +0DF4 +0E4F +0E5A 0E5B +0F04 0F12 +0F85 +0FD0 0FD1 +104A 104F +10FB +1361 1368 +166D 166E +16EB 16ED +1735 1736 +17D4 17D6 +17D8 17DA +1800 1805 +1807 180A +1944 1945 +19DE 19DF +1A1E 1A1F +2016 2017 +2020 2027 +2030 2038 +203B 203E +2041 2043 +2047 2051 +2053 +2055 205E +23B6 +2CF9 2CFC +2CFE 2CFF +2E00 2E01 +2E06 2E08 +2E0B +2E0E 2E16 +3001 3003 +303D +30FB +FE10 FE16 +FE19 +FE30 +FE45 FE46 +FE49 FE4C +FE50 FE52 +FE54 FE57 +FE5F FE61 +FE68 +FE6A FE6B +FF01 FF03 +FF05 FF07 +FF0A +FF0C +FF0E FF0F +FF1A FF1B +FF1F FF20 +FF3C +FF61 +FF64 FF65 +10100 10101 +1039F +10A50 10A58 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Print.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Print.pl new file mode 100644 index 00000000000..e2df8d7b884 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Print.pl @@ -0,0 +1,435 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Print} +# +# Meaning: [[:Print:]] +# +return <<'END'; +0009 000D +0020 007E +0085 +00A0 0241 +0250 036F +0374 0375 +037A +037E +0384 038A +038C +038E 03A1 +03A3 03CE +03D0 0486 +0488 04CE +04D0 04F9 +0500 050F +0531 0556 +0559 055F +0561 0587 +0589 058A +0591 05B9 +05BB 05C7 +05D0 05EA +05F0 05F4 +0600 0603 +060B 0615 +061B +061E 061F +0621 063A +0640 065E +0660 070D +070F 074A +074D 076D +0780 07B1 +0901 0939 +093C 094D +0950 0954 +0958 0970 +097D +0981 0983 +0985 098C +098F 0990 +0993 09A8 +09AA 09B0 +09B2 +09B6 09B9 +09BC 09C4 +09C7 09C8 +09CB 09CE +09D7 +09DC 09DD +09DF 09E3 +09E6 09FA +0A01 0A03 +0A05 0A0A +0A0F 0A10 +0A13 0A28 +0A2A 0A30 +0A32 0A33 +0A35 0A36 +0A38 0A39 +0A3C +0A3E 0A42 +0A47 0A48 +0A4B 0A4D +0A59 0A5C +0A5E +0A66 0A74 +0A81 0A83 +0A85 0A8D +0A8F 0A91 +0A93 0AA8 +0AAA 0AB0 +0AB2 0AB3 +0AB5 0AB9 +0ABC 0AC5 +0AC7 0AC9 +0ACB 0ACD +0AD0 +0AE0 0AE3 +0AE6 0AEF +0AF1 +0B01 0B03 +0B05 0B0C +0B0F 0B10 +0B13 0B28 +0B2A 0B30 +0B32 0B33 +0B35 0B39 +0B3C 0B43 +0B47 0B48 +0B4B 0B4D +0B56 0B57 +0B5C 0B5D +0B5F 0B61 +0B66 0B71 +0B82 0B83 +0B85 0B8A +0B8E 0B90 +0B92 0B95 +0B99 0B9A +0B9C +0B9E 0B9F +0BA3 0BA4 +0BA8 0BAA +0BAE 0BB9 +0BBE 0BC2 +0BC6 0BC8 +0BCA 0BCD +0BD7 +0BE6 0BFA +0C01 0C03 +0C05 0C0C +0C0E 0C10 +0C12 0C28 +0C2A 0C33 +0C35 0C39 +0C3E 0C44 +0C46 0C48 +0C4A 0C4D +0C55 0C56 +0C60 0C61 +0C66 0C6F +0C82 0C83 +0C85 0C8C +0C8E 0C90 +0C92 0CA8 +0CAA 0CB3 +0CB5 0CB9 +0CBC 0CC4 +0CC6 0CC8 +0CCA 0CCD +0CD5 0CD6 +0CDE +0CE0 0CE1 +0CE6 0CEF +0D02 0D03 +0D05 0D0C +0D0E 0D10 +0D12 0D28 +0D2A 0D39 +0D3E 0D43 +0D46 0D48 +0D4A 0D4D +0D57 +0D60 0D61 +0D66 0D6F +0D82 0D83 +0D85 0D96 +0D9A 0DB1 +0DB3 0DBB +0DBD +0DC0 0DC6 +0DCA +0DCF 0DD4 +0DD6 +0DD8 0DDF +0DF2 0DF4 +0E01 0E3A +0E3F 0E5B +0E81 0E82 +0E84 +0E87 0E88 +0E8A +0E8D +0E94 0E97 +0E99 0E9F +0EA1 0EA3 +0EA5 +0EA7 +0EAA 0EAB +0EAD 0EB9 +0EBB 0EBD +0EC0 0EC4 +0EC6 +0EC8 0ECD +0ED0 0ED9 +0EDC 0EDD +0F00 0F47 +0F49 0F6A +0F71 0F8B +0F90 0F97 +0F99 0FBC +0FBE 0FCC +0FCF 0FD1 +1000 1021 +1023 1027 +1029 102A +102C 1032 +1036 1039 +1040 1059 +10A0 10C5 +10D0 10FC +1100 1159 +115F 11A2 +11A8 11F9 +1200 1248 +124A 124D +1250 1256 +1258 +125A 125D +1260 1288 +128A 128D +1290 12B0 +12B2 12B5 +12B8 12BE +12C0 +12C2 12C5 +12C8 12D6 +12D8 1310 +1312 1315 +1318 135A +135F 137C +1380 1399 +13A0 13F4 +1401 1676 +1680 169C +16A0 16F0 +1700 170C +170E 1714 +1720 1736 +1740 1753 +1760 176C +176E 1770 +1772 1773 +1780 17DD +17E0 17E9 +17F0 17F9 +1800 180E +1810 1819 +1820 1877 +1880 18A9 +1900 191C +1920 192B +1930 193B +1940 +1944 196D +1970 1974 +1980 19A9 +19B0 19C9 +19D0 19D9 +19DE 1A1B +1A1E 1A1F +1D00 1DC3 +1E00 1E9B +1EA0 1EF9 +1F00 1F15 +1F18 1F1D +1F20 1F45 +1F48 1F4D +1F50 1F57 +1F59 +1F5B +1F5D +1F5F 1F7D +1F80 1FB4 +1FB6 1FC4 +1FC6 1FD3 +1FD6 1FDB +1FDD 1FEF +1FF2 1FF4 +1FF6 1FFE +2000 2063 +206A 2071 +2074 208E +2090 2094 +20A0 20B5 +20D0 20EB +2100 214C +2153 2183 +2190 23DB +2400 2426 +2440 244A +2460 269C +26A0 26B1 +2701 2704 +2706 2709 +270C 2727 +2729 274B +274D +274F 2752 +2756 +2758 275E +2761 2794 +2798 27AF +27B1 27BE +27C0 27C6 +27D0 27EB +27F0 2B13 +2C00 2C2E +2C30 2C5E +2C80 2CEA +2CF9 2D25 +2D30 2D65 +2D6F +2D80 2D96 +2DA0 2DA6 +2DA8 2DAE +2DB0 2DB6 +2DB8 2DBE +2DC0 2DC6 +2DC8 2DCE +2DD0 2DD6 +2DD8 2DDE +2E00 2E17 +2E1C 2E1D +2E80 2E99 +2E9B 2EF3 +2F00 2FD5 +2FF0 2FFB +3000 303F +3041 3096 +3099 30FF +3105 312C +3131 318E +3190 31B7 +31C0 31CF +31F0 321E +3220 3243 +3250 32FE +3300 4DB5 +4DC0 9FBB +A000 A48C +A490 A4C6 +A700 A716 +A800 A82B +AC00 D7A3 +E000 FA2D +FA30 FA6A +FA70 FAD9 +FB00 FB06 +FB13 FB17 +FB1D FB36 +FB38 FB3C +FB3E +FB40 FB41 +FB43 FB44 +FB46 FBB1 +FBD3 FD3F +FD50 FD8F +FD92 FDC7 +FDF0 FDFD +FE00 FE19 +FE20 FE23 +FE30 FE52 +FE54 FE66 +FE68 FE6B +FE70 FE74 +FE76 FEFC +FEFF +FF01 FFBE +FFC2 FFC7 +FFCA FFCF +FFD2 FFD7 +FFDA FFDC +FFE0 FFE6 +FFE8 FFEE +FFF9 FFFD +10000 1000B +1000D 10026 +10028 1003A +1003C 1003D +1003F 1004D +10050 1005D +10080 100FA +10100 10102 +10107 10133 +10137 1018A +10300 1031E +10320 10323 +10330 1034A +10380 1039D +1039F 103C3 +103C8 103D5 +10400 1049D +104A0 104A9 +10800 10805 +10808 +1080A 10835 +10837 10838 +1083C +1083F +10A00 10A03 +10A05 10A06 +10A0C 10A13 +10A15 10A17 +10A19 10A33 +10A38 10A3A +10A3F 10A47 +10A50 10A58 +1D000 1D0F5 +1D100 1D126 +1D12A 1D1DD +1D200 1D245 +1D300 1D356 +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A5 +1D6A8 1D7C9 +1D7CE 1D7FF +20000 2A6D6 +2F800 2FA1D +E0001 +E0020 E007F +E0100 E01EF +F0000 FFFFD +100000 10FFFD +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ps.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ps.pl new file mode 100644 index 00000000000..f08bebe61ac --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ps.pl @@ -0,0 +1,80 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Ps} +# \p{Ps} (and fuzzy permutations) +# +# Meaning: General Category 'Ps' +# +return <<'END'; +0028 +005B +007B +0F3A +0F3C +169B +201A +201E +2045 +207D +208D +2329 +23B4 +2768 +276A +276C +276E +2770 +2772 +2774 +27C5 +27E6 +27E8 +27EA +2983 +2985 +2987 +2989 +298B +298D +298F +2991 +2993 +2995 +2997 +29D8 +29DA +29FC +3008 +300A +300C +300E +3010 +3014 +3016 +3018 +301A +301D +FD3E +FE17 +FE35 +FE37 +FE39 +FE3B +FE3D +FE3F +FE41 +FE43 +FE47 +FE59 +FE5B +FE5D +FF08 +FF3B +FF5B +FF5F +FF62 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Punct.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Punct.pl new file mode 100644 index 00000000000..d6cfefe06e2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Punct.pl @@ -0,0 +1,108 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Punct} +# +# Meaning: [[:Punct:]] +# +return <<'END'; +0021 0023 +0025 002A +002C 002F +003A 003B +003F 0040 +005B 005D +005F +007B +007D +00A1 +00AB +00B7 +00BB +00BF +037E +0387 +055A 055F +0589 058A +05BE +05C0 +05C3 +05C6 +05F3 05F4 +060C 060D +061B +061E 061F +066A 066D +06D4 +0700 070D +0964 0965 +0970 +0DF4 +0E4F +0E5A 0E5B +0F04 0F12 +0F3A 0F3D +0F85 +0FD0 0FD1 +104A 104F +10FB +1361 1368 +166D 166E +169B 169C +16EB 16ED +1735 1736 +17D4 17D6 +17D8 17DA +1800 180A +1944 1945 +19DE 19DF +1A1E 1A1F +2010 2027 +2030 2043 +2045 2051 +2053 205E +207D 207E +208D 208E +2329 232A +23B4 23B6 +2768 2775 +27C5 27C6 +27E6 27EB +2983 2998 +29D8 29DB +29FC 29FD +2CF9 2CFC +2CFE 2CFF +2E00 2E17 +2E1C 2E1D +3001 3003 +3008 3011 +3014 301F +3030 +303D +30A0 +30FB +FD3E FD3F +FE10 FE19 +FE30 FE52 +FE54 FE61 +FE63 +FE68 +FE6A FE6B +FF01 FF03 +FF05 FF0A +FF0C FF0F +FF1A FF1B +FF1F FF20 +FF3B FF3D +FF3F +FF5B +FF5D +FF5F FF65 +10100 10101 +1039F +10A50 10A58 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/QMark.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/QMark.pl new file mode 100644 index 00000000000..9778cd953bb --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/QMark.pl @@ -0,0 +1,21 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Quotation_Mark' +# +return <<'END'; +0022 Quotation_Mark +0027 Quotation_Mark +00AB Quotation_Mark +00BB Quotation_Mark +2018 201F Quotation_Mark +2039 203A Quotation_Mark +300C 300F Quotation_Mark +301D 301F Quotation_Mark +FE41 FE44 Quotation_Mark +FF02 Quotation_Mark +FF07 Quotation_Mark +FF62 FF63 Quotation_Mark +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Qaai.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Qaai.pl new file mode 100644 index 00000000000..afbf5fea80d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Qaai.pl @@ -0,0 +1,27 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Inherited} (and fuzzy permutations) +# +# Meaning: Script 'Inherited' +# +return <<'END'; +0300 036F Inherited +064B 0655 Inherited +0670 Inherited +1DC0 1DC3 Inherited +200C 200D Inherited +20D0 20EB Inherited +302A 302F Inherited +3099 309A Inherited +FE00 FE0F Inherited +FE20 FE23 Inherited +1D167 1D169 Inherited +1D17B 1D182 Inherited +1D185 1D18B Inherited +1D1AA 1D1AD Inherited +E0100 E01EF Inherited +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Quotatio.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Quotatio.pl new file mode 100644 index 00000000000..255d986ff3b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Quotatio.pl @@ -0,0 +1,24 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{QuotationMark} (and fuzzy permutations) +# +# Meaning: Extended property 'Quotation_Mark' +# +return <<'END'; +0022 Quotation_Mark +0027 Quotation_Mark +00AB Quotation_Mark +00BB Quotation_Mark +2018 201F Quotation_Mark +2039 203A Quotation_Mark +300C 300F Quotation_Mark +301D 301F Quotation_Mark +FE41 FE44 Quotation_Mark +FF02 Quotation_Mark +FF07 Quotation_Mark +FF62 FF63 Quotation_Mark +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Radical.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Radical.pl new file mode 100644 index 00000000000..aeb66ed45b9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Radical.pl @@ -0,0 +1,12 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Radical' +# +return <<'END'; +2E80 2E99 Radical +2E9B 2EF3 Radical +2F00 2FD5 Radical +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Radical2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Radical2.pl new file mode 100644 index 00000000000..1bd455af14a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Radical2.pl @@ -0,0 +1,15 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Radical} (and fuzzy permutations) +# +# Meaning: Extended property 'Radical' +# +return <<'END'; +2E80 2E99 Radical +2E9B 2EF3 Radical +2F00 2FD5 Radical +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Runr.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Runr.pl new file mode 100644 index 00000000000..02f180a46aa --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Runr.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Runic} (and fuzzy permutations) +# +# Meaning: Script 'Runic' +# +return <<'END'; +16A0 16EA Runic +16EE 16F0 Runic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/S.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/S.pl new file mode 100644 index 00000000000..58f6e311eab --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/S.pl @@ -0,0 +1,175 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{S} +# \p{S} (and fuzzy permutations) +# +# Meaning: Major Category 'S' +# +return <<'END'; +0024 +002B +003C 003E +005E +0060 +007C +007E +00A2 00A9 +00AC +00AE 00B1 +00B4 +00B6 +00B8 +00D7 +00F7 +02C2 02C5 +02D2 02DF +02E5 02ED +02EF 02FF +0374 0375 +0384 0385 +03F6 +0482 +060B +060E 060F +06E9 +06FD 06FE +09F2 09F3 +09FA +0AF1 +0B70 +0BF3 0BFA +0E3F +0F01 0F03 +0F13 0F17 +0F1A 0F1F +0F34 +0F36 +0F38 +0FBE 0FC5 +0FC7 0FCC +0FCF +1360 +1390 1399 +17DB +1940 +19E0 19FF +1FBD +1FBF 1FC1 +1FCD 1FCF +1FDD 1FDF +1FED 1FEF +1FFD 1FFE +2044 +2052 +207A 207C +208A 208C +20A0 20B5 +2100 2101 +2103 2106 +2108 2109 +2114 +2116 2118 +211E 2123 +2125 +2127 +2129 +212E +2132 +213A 213B +2140 2144 +214A 214C +2190 2328 +232B 23B3 +23B7 23DB +2400 2426 +2440 244A +249C 24E9 +2500 269C +26A0 26B1 +2701 2704 +2706 2709 +270C 2727 +2729 274B +274D +274F 2752 +2756 +2758 275E +2761 2767 +2794 +2798 27AF +27B1 27BE +27C0 27C4 +27D0 27E5 +27F0 2982 +2999 29D7 +29DC 29FB +29FE 2B13 +2CE5 2CEA +2E80 2E99 +2E9B 2EF3 +2F00 2FD5 +2FF0 2FFB +3004 +3012 3013 +3020 +3036 3037 +303E 303F +309B 309C +3190 3191 +3196 319F +31C0 31CF +3200 321E +322A 3243 +3250 +3260 327F +328A 32B0 +32C0 32FE +3300 33FF +4DC0 4DFF +A490 A4C6 +A700 A716 +A828 A82B +FB29 +FDFC FDFD +FE62 +FE64 FE66 +FE69 +FF04 +FF0B +FF1C FF1E +FF3E +FF40 +FF5C +FF5E +FFE0 FFE6 +FFE8 FFEE +FFFC FFFD +10102 +10137 1013F +10179 10189 +103D0 +1D000 1D0F5 +1D100 1D126 +1D12A 1D164 +1D16A 1D16C +1D183 1D184 +1D18C 1D1A9 +1D1AE 1D1DD +1D200 1D241 +1D245 +1D300 1D356 +1D6C1 +1D6DB +1D6FB +1D715 +1D735 +1D74F +1D76F +1D789 +1D7A9 +1D7C3 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/SD.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/SD.pl new file mode 100644 index 00000000000..f8d12d548ae --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/SD.pl @@ -0,0 +1,38 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Soft_Dotted' +# +return <<'END'; +0069 006A Soft_Dotted +012F Soft_Dotted +0268 Soft_Dotted +029D Soft_Dotted +02B2 Soft_Dotted +03F3 Soft_Dotted +0456 Soft_Dotted +0458 Soft_Dotted +1D62 Soft_Dotted +1D96 Soft_Dotted +1DA4 Soft_Dotted +1DA8 Soft_Dotted +1E2D Soft_Dotted +1ECB Soft_Dotted +2071 Soft_Dotted +2148 2149 Soft_Dotted +1D422 1D423 Soft_Dotted +1D456 1D457 Soft_Dotted +1D48A 1D48B Soft_Dotted +1D4BE 1D4BF Soft_Dotted +1D4F2 1D4F3 Soft_Dotted +1D526 1D527 Soft_Dotted +1D55A 1D55B Soft_Dotted +1D58E 1D58F Soft_Dotted +1D5C2 1D5C3 Soft_Dotted +1D5F6 1D5F7 Soft_Dotted +1D62A 1D62B Soft_Dotted +1D65E 1D65F Soft_Dotted +1D692 1D693 Soft_Dotted +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/STerm.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/STerm.pl new file mode 100644 index 00000000000..2e1ac3958dc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/STerm.pl @@ -0,0 +1,35 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'STerm' +# +return <<'END'; +0021 STerm +002E STerm +003F STerm +055C STerm +055E STerm +0589 STerm +061F STerm +06D4 STerm +0700 0702 STerm +0964 0965 STerm +104A 104B STerm +1362 STerm +1367 1368 STerm +166E STerm +1803 STerm +1809 STerm +1944 1945 STerm +203C 203D STerm +2047 2049 STerm +3002 STerm +FE52 STerm +FE56 FE57 STerm +FF01 STerm +FF0E STerm +FF1F STerm +FF61 STerm +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Sc.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Sc.pl new file mode 100644 index 00000000000..c85cf4175b3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Sc.pl @@ -0,0 +1,27 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Sc} +# \p{Sc} (and fuzzy permutations) +# +# Meaning: General Category 'Sc' +# +return <<'END'; +0024 +00A2 00A5 +060B +09F2 09F3 +0AF1 +0BF9 +0E3F +17DB +20A0 20B5 +FDFC +FE69 +FF04 +FFE0 FFE1 +FFE5 FFE6 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Shaw.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Shaw.pl new file mode 100644 index 00000000000..385dd06f31d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Shaw.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Shavian} (and fuzzy permutations) +# +# Meaning: Script 'Shavian' +# +return <<'END'; +10450 1047F Shavian +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Sinh.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Sinh.pl new file mode 100644 index 00000000000..154fcd4fddb --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Sinh.pl @@ -0,0 +1,23 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Sinhala} (and fuzzy permutations) +# +# Meaning: Script 'Sinhala' +# +return <<'END'; +0D82 0D83 Sinhala +0D85 0D96 Sinhala +0D9A 0DB1 Sinhala +0DB3 0DBB Sinhala +0DBD Sinhala +0DC0 0DC6 Sinhala +0DCA Sinhala +0DCF 0DD4 Sinhala +0DD6 Sinhala +0DD8 0DDF Sinhala +0DF2 0DF4 Sinhala +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Sk.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Sk.pl new file mode 100644 index 00000000000..7e202b38f32 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Sk.pl @@ -0,0 +1,36 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Sk} +# \p{Sk} (and fuzzy permutations) +# +# Meaning: General Category 'Sk' +# +return <<'END'; +005E +0060 +00A8 +00AF +00B4 +00B8 +02C2 02C5 +02D2 02DF +02E5 02ED +02EF 02FF +0374 0375 +0384 0385 +1FBD +1FBF 1FC1 +1FCD 1FCF +1FDD 1FDF +1FED 1FEF +1FFD 1FFE +309B 309C +A700 A716 +FF3E +FF40 +FFE3 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Sm.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Sm.pl new file mode 100644 index 00000000000..e5b5e4d0320 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Sm.pl @@ -0,0 +1,72 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Sm} +# \p{Sm} (and fuzzy permutations) +# +# Meaning: General Category 'Sm' +# +return <<'END'; +002B +003C 003E +007C +007E +00AC +00B1 +00D7 +00F7 +03F6 +2044 +2052 +207A 207C +208A 208C +2140 2144 +214B +2190 2194 +219A 219B +21A0 +21A3 +21A6 +21AE +21CE 21CF +21D2 +21D4 +21F4 22FF +2308 230B +2320 2321 +237C +239B 23B3 +25B7 +25C1 +25F8 25FF +266F +27C0 27C4 +27D0 27E5 +27F0 27FF +2900 2982 +2999 29D7 +29DC 29FB +29FE 2AFF +FB29 +FE62 +FE64 FE66 +FF0B +FF1C FF1E +FF5C +FF5E +FFE2 +FFE9 FFEC +1D6C1 +1D6DB +1D6FB +1D715 +1D735 +1D74F +1D76F +1D789 +1D7A9 +1D7C3 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/So.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/So.pl new file mode 100644 index 00000000000..d50e3f63bf4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/So.pl @@ -0,0 +1,133 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{So} +# \p{So} (and fuzzy permutations) +# +# Meaning: General Category 'So' +# +return <<'END'; +00A6 00A7 +00A9 +00AE +00B0 +00B6 +0482 +060E 060F +06E9 +06FD 06FE +09FA +0B70 +0BF3 0BF8 +0BFA +0F01 0F03 +0F13 0F17 +0F1A 0F1F +0F34 +0F36 +0F38 +0FBE 0FC5 +0FC7 0FCC +0FCF +1360 +1390 1399 +1940 +19E0 19FF +2100 2101 +2103 2106 +2108 2109 +2114 +2116 2118 +211E 2123 +2125 +2127 +2129 +212E +2132 +213A 213B +214A +214C +2195 2199 +219C 219F +21A1 21A2 +21A4 21A5 +21A7 21AD +21AF 21CD +21D0 21D1 +21D3 +21D5 21F3 +2300 2307 +230C 231F +2322 2328 +232B 237B +237D 239A +23B7 23DB +2400 2426 +2440 244A +249C 24E9 +2500 25B6 +25B8 25C0 +25C2 25F7 +2600 266E +2670 269C +26A0 26B1 +2701 2704 +2706 2709 +270C 2727 +2729 274B +274D +274F 2752 +2756 +2758 275E +2761 2767 +2794 +2798 27AF +27B1 27BE +2800 28FF +2B00 2B13 +2CE5 2CEA +2E80 2E99 +2E9B 2EF3 +2F00 2FD5 +2FF0 2FFB +3004 +3012 3013 +3020 +3036 3037 +303E 303F +3190 3191 +3196 319F +31C0 31CF +3200 321E +322A 3243 +3250 +3260 327F +328A 32B0 +32C0 32FE +3300 33FF +4DC0 4DFF +A490 A4C6 +A828 A82B +FDFD +FFE4 +FFE8 +FFED FFEE +FFFC FFFD +10102 +10137 1013F +10179 10189 +103D0 +1D000 1D0F5 +1D100 1D126 +1D12A 1D164 +1D16A 1D16C +1D183 1D184 +1D18C 1D1A9 +1D1AE 1D1DD +1D200 1D241 +1D245 +1D300 1D356 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/SoftDott.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/SoftDott.pl new file mode 100644 index 00000000000..0542df885ef --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/SoftDott.pl @@ -0,0 +1,41 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{SoftDotted} (and fuzzy permutations) +# +# Meaning: Extended property 'Soft_Dotted' +# +return <<'END'; +0069 006A Soft_Dotted +012F Soft_Dotted +0268 Soft_Dotted +029D Soft_Dotted +02B2 Soft_Dotted +03F3 Soft_Dotted +0456 Soft_Dotted +0458 Soft_Dotted +1D62 Soft_Dotted +1D96 Soft_Dotted +1DA4 Soft_Dotted +1DA8 Soft_Dotted +1E2D Soft_Dotted +1ECB Soft_Dotted +2071 Soft_Dotted +2148 2149 Soft_Dotted +1D422 1D423 Soft_Dotted +1D456 1D457 Soft_Dotted +1D48A 1D48B Soft_Dotted +1D4BE 1D4BF Soft_Dotted +1D4F2 1D4F3 Soft_Dotted +1D526 1D527 Soft_Dotted +1D55A 1D55B Soft_Dotted +1D58E 1D58F Soft_Dotted +1D5C2 1D5C3 Soft_Dotted +1D5F6 1D5F7 Soft_Dotted +1D62A 1D62B Soft_Dotted +1D65E 1D65F Soft_Dotted +1D692 1D693 Soft_Dotted +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Space.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Space.pl new file mode 100644 index 00000000000..44b8a618ad8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Space.pl @@ -0,0 +1,23 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Space} +# +# Meaning: [[:Space:]] +# +return <<'END'; +0009 000D +0020 +0085 +00A0 +1680 +180E +2000 200A +2028 2029 +202F +205F +3000 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/SpacePer.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/SpacePer.pl new file mode 100644 index 00000000000..97281a6f1a6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/SpacePer.pl @@ -0,0 +1,24 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{SpacePerl} +# +# Meaning: \s +# +return <<'END'; +0009 000A +000C 000D +0020 +0085 +00A0 +1680 +180E +2000 200A +2028 2029 +202F +205F +3000 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Sterm2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Sterm2.pl new file mode 100644 index 00000000000..c76da9a15b8 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Sterm2.pl @@ -0,0 +1,38 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Sterm} (and fuzzy permutations) +# +# Meaning: Extended property 'STerm' +# +return <<'END'; +0021 STerm +002E STerm +003F STerm +055C STerm +055E STerm +0589 STerm +061F STerm +06D4 STerm +0700 0702 STerm +0964 0965 STerm +104A 104B STerm +1362 STerm +1367 1368 STerm +166E STerm +1803 STerm +1809 STerm +1944 1945 STerm +203C 203D STerm +2047 2049 STerm +3002 STerm +FE52 STerm +FE56 FE57 STerm +FF01 STerm +FF0E STerm +FF1F STerm +FF61 STerm +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/SylotiNa.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/SylotiNa.pl new file mode 100644 index 00000000000..d95b569f671 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/SylotiNa.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{SylotiNagri} (and fuzzy permutations) +# +# Meaning: Script 'Syloti_Nagri' +# +return <<'END'; +A800 A82B Syloti_Nagri +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Syrc.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Syrc.pl new file mode 100644 index 00000000000..8c7aa69187a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Syrc.pl @@ -0,0 +1,15 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Syriac} (and fuzzy permutations) +# +# Meaning: Script 'Syriac' +# +return <<'END'; +0700 070D Syriac +070F 074A Syriac +074D 074F Syriac +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Tagb.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Tagb.pl new file mode 100644 index 00000000000..5ea4e4a29d9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Tagb.pl @@ -0,0 +1,15 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Tagbanwa} (and fuzzy permutations) +# +# Meaning: Script 'Tagbanwa' +# +return <<'END'; +1760 176C Tagbanwa +176E 1770 Tagbanwa +1772 1773 Tagbanwa +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/TaiLe.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/TaiLe.pl new file mode 100644 index 00000000000..92d901046dd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/TaiLe.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{TaiLe} (and fuzzy permutations) +# +# Meaning: Script 'Tai_Le' +# +return <<'END'; +1950 196D Tai_Le +1970 1974 Tai_Le +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Taml.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Taml.pl new file mode 100644 index 00000000000..6c4c5fff8d7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Taml.pl @@ -0,0 +1,27 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Tamil} (and fuzzy permutations) +# +# Meaning: Script 'Tamil' +# +return <<'END'; +0B82 0B83 Tamil +0B85 0B8A Tamil +0B8E 0B90 Tamil +0B92 0B95 Tamil +0B99 0B9A Tamil +0B9C Tamil +0B9E 0B9F Tamil +0BA3 0BA4 Tamil +0BA8 0BAA Tamil +0BAE 0BB9 Tamil +0BBE 0BC2 Tamil +0BC6 0BC8 Tamil +0BCA 0BCD Tamil +0BD7 Tamil +0BE6 0BFA Tamil +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Telu.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Telu.pl new file mode 100644 index 00000000000..74de197eeb9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Telu.pl @@ -0,0 +1,24 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Telugu} (and fuzzy permutations) +# +# Meaning: Script 'Telugu' +# +return <<'END'; +0C01 0C03 Telugu +0C05 0C0C Telugu +0C0E 0C10 Telugu +0C12 0C28 Telugu +0C2A 0C33 Telugu +0C35 0C39 Telugu +0C3E 0C44 Telugu +0C46 0C48 Telugu +0C4A 0C4D Telugu +0C55 0C56 Telugu +0C60 0C61 Telugu +0C66 0C6F Telugu +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Term.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Term.pl new file mode 100644 index 00000000000..124872bd54c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Term.pl @@ -0,0 +1,49 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Terminal_Punctuation' +# +return <<'END'; +0021 Terminal_Punctuation +002C Terminal_Punctuation +002E Terminal_Punctuation +003A 003B Terminal_Punctuation +003F Terminal_Punctuation +037E Terminal_Punctuation +0387 Terminal_Punctuation +0589 Terminal_Punctuation +05C3 Terminal_Punctuation +060C Terminal_Punctuation +061B Terminal_Punctuation +061F Terminal_Punctuation +06D4 Terminal_Punctuation +0700 070A Terminal_Punctuation +070C Terminal_Punctuation +0964 0965 Terminal_Punctuation +0E5A 0E5B Terminal_Punctuation +0F08 Terminal_Punctuation +0F0D 0F12 Terminal_Punctuation +104A 104B Terminal_Punctuation +1361 1368 Terminal_Punctuation +166D 166E Terminal_Punctuation +16EB 16ED Terminal_Punctuation +17D4 17D6 Terminal_Punctuation +17DA Terminal_Punctuation +1802 1805 Terminal_Punctuation +1808 1809 Terminal_Punctuation +1944 1945 Terminal_Punctuation +203C 203D Terminal_Punctuation +2047 2049 Terminal_Punctuation +3001 3002 Terminal_Punctuation +FE50 FE52 Terminal_Punctuation +FE54 FE57 Terminal_Punctuation +FF01 Terminal_Punctuation +FF0C Terminal_Punctuation +FF0E Terminal_Punctuation +FF1A FF1B Terminal_Punctuation +FF1F Terminal_Punctuation +FF61 Terminal_Punctuation +FF64 Terminal_Punctuation +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Terminal.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Terminal.pl new file mode 100644 index 00000000000..da5860f1fe3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Terminal.pl @@ -0,0 +1,52 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{TerminalPunctuation} (and fuzzy permutations) +# +# Meaning: Extended property 'Terminal_Punctuation' +# +return <<'END'; +0021 Terminal_Punctuation +002C Terminal_Punctuation +002E Terminal_Punctuation +003A 003B Terminal_Punctuation +003F Terminal_Punctuation +037E Terminal_Punctuation +0387 Terminal_Punctuation +0589 Terminal_Punctuation +05C3 Terminal_Punctuation +060C Terminal_Punctuation +061B Terminal_Punctuation +061F Terminal_Punctuation +06D4 Terminal_Punctuation +0700 070A Terminal_Punctuation +070C Terminal_Punctuation +0964 0965 Terminal_Punctuation +0E5A 0E5B Terminal_Punctuation +0F08 Terminal_Punctuation +0F0D 0F12 Terminal_Punctuation +104A 104B Terminal_Punctuation +1361 1368 Terminal_Punctuation +166D 166E Terminal_Punctuation +16EB 16ED Terminal_Punctuation +17D4 17D6 Terminal_Punctuation +17DA Terminal_Punctuation +1802 1805 Terminal_Punctuation +1808 1809 Terminal_Punctuation +1944 1945 Terminal_Punctuation +203C 203D Terminal_Punctuation +2047 2049 Terminal_Punctuation +3001 3002 Terminal_Punctuation +FE50 FE52 Terminal_Punctuation +FE54 FE57 Terminal_Punctuation +FF01 Terminal_Punctuation +FF0C Terminal_Punctuation +FF0E Terminal_Punctuation +FF1A FF1B Terminal_Punctuation +FF1F Terminal_Punctuation +FF61 Terminal_Punctuation +FF64 Terminal_Punctuation +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Tfng.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Tfng.pl new file mode 100644 index 00000000000..4ee12034069 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Tfng.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Tifinagh} (and fuzzy permutations) +# +# Meaning: Script 'Tifinagh' +# +return <<'END'; +2D30 2D65 Tifinagh +2D6F Tifinagh +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Tglg.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Tglg.pl new file mode 100644 index 00000000000..f9d24576279 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Tglg.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Tagalog} (and fuzzy permutations) +# +# Meaning: Script 'Tagalog' +# +return <<'END'; +1700 170C Tagalog +170E 1714 Tagalog +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Thaa.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Thaa.pl new file mode 100644 index 00000000000..7ab38dc4eab --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Thaa.pl @@ -0,0 +1,13 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Thaana} (and fuzzy permutations) +# +# Meaning: Script 'Thaana' +# +return <<'END'; +0780 07B1 Thaana +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Thai.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Thai.pl new file mode 100644 index 00000000000..03467d4b8ec --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Thai.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Thai} (and fuzzy permutations) +# +# Meaning: Script 'Thai' +# +return <<'END'; +0E01 0E3A Thai +0E40 0E5B Thai +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Tibt.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Tibt.pl new file mode 100644 index 00000000000..aa6be295479 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Tibt.pl @@ -0,0 +1,19 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Tibetan} (and fuzzy permutations) +# +# Meaning: Script 'Tibetan' +# +return <<'END'; +0F00 0F47 Tibetan +0F49 0F6A Tibetan +0F71 0F8B Tibetan +0F90 0F97 Tibetan +0F99 0FBC Tibetan +0FBE 0FCC Tibetan +0FCF 0FD1 Tibetan +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Title.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Title.pl new file mode 100644 index 00000000000..158a6cd6eb5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Title.pl @@ -0,0 +1,22 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Title} +# +# Meaning: [[:Title:]] +# +return <<'END'; +01C5 +01C8 +01CB +01F2 +1F88 1F8F +1F98 1F9F +1FA8 1FAF +1FBC +1FCC +1FFC +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/UIdeo.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/UIdeo.pl new file mode 100644 index 00000000000..e0629a335d0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/UIdeo.pl @@ -0,0 +1,19 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Unified_Ideograph' +# +return <<'END'; +3400 4DB5 Unified_Ideograph +4E00 9FBB Unified_Ideograph +FA0E FA0F Unified_Ideograph +FA11 Unified_Ideograph +FA13 FA14 Unified_Ideograph +FA1F Unified_Ideograph +FA21 Unified_Ideograph +FA23 FA24 Unified_Ideograph +FA27 FA29 Unified_Ideograph +20000 2A6D6 Unified_Ideograph +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ugar.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ugar.pl new file mode 100644 index 00000000000..e79e6c67738 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Ugar.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Ugaritic} (and fuzzy permutations) +# +# Meaning: Script 'Ugaritic' +# +return <<'END'; +10380 1039D Ugaritic +1039F Ugaritic +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/UnifiedI.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/UnifiedI.pl new file mode 100644 index 00000000000..440dc126aae --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/UnifiedI.pl @@ -0,0 +1,22 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{UnifiedIdeograph} (and fuzzy permutations) +# +# Meaning: Extended property 'Unified_Ideograph' +# +return <<'END'; +3400 4DB5 Unified_Ideograph +4E00 9FBB Unified_Ideograph +FA0E FA0F Unified_Ideograph +FA11 Unified_Ideograph +FA13 FA14 Unified_Ideograph +FA1F Unified_Ideograph +FA21 Unified_Ideograph +FA23 FA24 Unified_Ideograph +FA27 FA29 Unified_Ideograph +20000 2A6D6 Unified_Ideograph +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Upper.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Upper.pl new file mode 100644 index 00000000000..214ab48efef --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Upper.pl @@ -0,0 +1,488 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Upper} +# +# Meaning: [[:Upper:]] +# +return <<'END'; +0041 005A +00C0 00D6 +00D8 00DE +0100 +0102 +0104 +0106 +0108 +010A +010C +010E +0110 +0112 +0114 +0116 +0118 +011A +011C +011E +0120 +0122 +0124 +0126 +0128 +012A +012C +012E +0130 +0132 +0134 +0136 +0139 +013B +013D +013F +0141 +0143 +0145 +0147 +014A +014C +014E +0150 +0152 +0154 +0156 +0158 +015A +015C +015E +0160 +0162 +0164 +0166 +0168 +016A +016C +016E +0170 +0172 +0174 +0176 +0178 0179 +017B +017D +0181 0182 +0184 +0186 0187 +0189 018B +018E 0191 +0193 0194 +0196 0198 +019C 019D +019F 01A0 +01A2 +01A4 +01A6 01A7 +01A9 +01AC +01AE 01AF +01B1 01B3 +01B5 +01B7 01B8 +01BC +01C4 +01C7 +01CA +01CD +01CF +01D1 +01D3 +01D5 +01D7 +01D9 +01DB +01DE +01E0 +01E2 +01E4 +01E6 +01E8 +01EA +01EC +01EE +01F1 +01F4 +01F6 01F8 +01FA +01FC +01FE +0200 +0202 +0204 +0206 +0208 +020A +020C +020E +0210 +0212 +0214 +0216 +0218 +021A +021C +021E +0220 +0222 +0224 +0226 +0228 +022A +022C +022E +0230 +0232 +023A 023B +023D 023E +0241 +0386 +0388 038A +038C +038E 038F +0391 03A1 +03A3 03AB +03D2 03D4 +03D8 +03DA +03DC +03DE +03E0 +03E2 +03E4 +03E6 +03E8 +03EA +03EC +03EE +03F4 +03F7 +03F9 03FA +03FD 042F +0460 +0462 +0464 +0466 +0468 +046A +046C +046E +0470 +0472 +0474 +0476 +0478 +047A +047C +047E +0480 +048A +048C +048E +0490 +0492 +0494 +0496 +0498 +049A +049C +049E +04A0 +04A2 +04A4 +04A6 +04A8 +04AA +04AC +04AE +04B0 +04B2 +04B4 +04B6 +04B8 +04BA +04BC +04BE +04C0 04C1 +04C3 +04C5 +04C7 +04C9 +04CB +04CD +04D0 +04D2 +04D4 +04D6 +04D8 +04DA +04DC +04DE +04E0 +04E2 +04E4 +04E6 +04E8 +04EA +04EC +04EE +04F0 +04F2 +04F4 +04F6 +04F8 +0500 +0502 +0504 +0506 +0508 +050A +050C +050E +0531 0556 +10A0 10C5 +1E00 +1E02 +1E04 +1E06 +1E08 +1E0A +1E0C +1E0E +1E10 +1E12 +1E14 +1E16 +1E18 +1E1A +1E1C +1E1E +1E20 +1E22 +1E24 +1E26 +1E28 +1E2A +1E2C +1E2E +1E30 +1E32 +1E34 +1E36 +1E38 +1E3A +1E3C +1E3E +1E40 +1E42 +1E44 +1E46 +1E48 +1E4A +1E4C +1E4E +1E50 +1E52 +1E54 +1E56 +1E58 +1E5A +1E5C +1E5E +1E60 +1E62 +1E64 +1E66 +1E68 +1E6A +1E6C +1E6E +1E70 +1E72 +1E74 +1E76 +1E78 +1E7A +1E7C +1E7E +1E80 +1E82 +1E84 +1E86 +1E88 +1E8A +1E8C +1E8E +1E90 +1E92 +1E94 +1EA0 +1EA2 +1EA4 +1EA6 +1EA8 +1EAA +1EAC +1EAE +1EB0 +1EB2 +1EB4 +1EB6 +1EB8 +1EBA +1EBC +1EBE +1EC0 +1EC2 +1EC4 +1EC6 +1EC8 +1ECA +1ECC +1ECE +1ED0 +1ED2 +1ED4 +1ED6 +1ED8 +1EDA +1EDC +1EDE +1EE0 +1EE2 +1EE4 +1EE6 +1EE8 +1EEA +1EEC +1EEE +1EF0 +1EF2 +1EF4 +1EF6 +1EF8 +1F08 1F0F +1F18 1F1D +1F28 1F2F +1F38 1F3F +1F48 1F4D +1F59 +1F5B +1F5D +1F5F +1F68 1F6F +1FB8 1FBB +1FC8 1FCB +1FD8 1FDB +1FE8 1FEC +1FF8 1FFB +2102 +2107 +210B 210D +2110 2112 +2115 +2119 211D +2124 +2126 +2128 +212A 212D +2130 2131 +2133 +213E 213F +2145 +2C00 2C2E +2C80 +2C82 +2C84 +2C86 +2C88 +2C8A +2C8C +2C8E +2C90 +2C92 +2C94 +2C96 +2C98 +2C9A +2C9C +2C9E +2CA0 +2CA2 +2CA4 +2CA6 +2CA8 +2CAA +2CAC +2CAE +2CB0 +2CB2 +2CB4 +2CB6 +2CB8 +2CBA +2CBC +2CBE +2CC0 +2CC2 +2CC4 +2CC6 +2CC8 +2CCA +2CCC +2CCE +2CD0 +2CD2 +2CD4 +2CD6 +2CD8 +2CDA +2CDC +2CDE +2CE0 +2CE2 +FF21 FF3A +10400 10427 +1D400 1D419 +1D434 1D44D +1D468 1D481 +1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B5 +1D4D0 1D4E9 +1D504 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D538 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D56C 1D585 +1D5A0 1D5B9 +1D5D4 1D5ED +1D608 1D621 +1D63C 1D655 +1D670 1D689 +1D6A8 1D6C0 +1D6E2 1D6FA +1D71C 1D734 +1D756 1D76E +1D790 1D7A8 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Uppercas.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Uppercas.pl new file mode 100644 index 00000000000..4778dc3ab52 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Uppercas.pl @@ -0,0 +1,490 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Uppercase} (and fuzzy permutations) +# +# Meaning: [\p{Lu}\p{Other_Uppercase}] +# +return <<'END'; +0041 005A +00C0 00D6 +00D8 00DE +0100 +0102 +0104 +0106 +0108 +010A +010C +010E +0110 +0112 +0114 +0116 +0118 +011A +011C +011E +0120 +0122 +0124 +0126 +0128 +012A +012C +012E +0130 +0132 +0134 +0136 +0139 +013B +013D +013F +0141 +0143 +0145 +0147 +014A +014C +014E +0150 +0152 +0154 +0156 +0158 +015A +015C +015E +0160 +0162 +0164 +0166 +0168 +016A +016C +016E +0170 +0172 +0174 +0176 +0178 0179 +017B +017D +0181 0182 +0184 +0186 0187 +0189 018B +018E 0191 +0193 0194 +0196 0198 +019C 019D +019F 01A0 +01A2 +01A4 +01A6 01A7 +01A9 +01AC +01AE 01AF +01B1 01B3 +01B5 +01B7 01B8 +01BC +01C4 +01C7 +01CA +01CD +01CF +01D1 +01D3 +01D5 +01D7 +01D9 +01DB +01DE +01E0 +01E2 +01E4 +01E6 +01E8 +01EA +01EC +01EE +01F1 +01F4 +01F6 01F8 +01FA +01FC +01FE +0200 +0202 +0204 +0206 +0208 +020A +020C +020E +0210 +0212 +0214 +0216 +0218 +021A +021C +021E +0220 +0222 +0224 +0226 +0228 +022A +022C +022E +0230 +0232 +023A 023B +023D 023E +0241 +0386 +0388 038A +038C +038E 038F +0391 03A1 +03A3 03AB +03D2 03D4 +03D8 +03DA +03DC +03DE +03E0 +03E2 +03E4 +03E6 +03E8 +03EA +03EC +03EE +03F4 +03F7 +03F9 03FA +03FD 042F +0460 +0462 +0464 +0466 +0468 +046A +046C +046E +0470 +0472 +0474 +0476 +0478 +047A +047C +047E +0480 +048A +048C +048E +0490 +0492 +0494 +0496 +0498 +049A +049C +049E +04A0 +04A2 +04A4 +04A6 +04A8 +04AA +04AC +04AE +04B0 +04B2 +04B4 +04B6 +04B8 +04BA +04BC +04BE +04C0 04C1 +04C3 +04C5 +04C7 +04C9 +04CB +04CD +04D0 +04D2 +04D4 +04D6 +04D8 +04DA +04DC +04DE +04E0 +04E2 +04E4 +04E6 +04E8 +04EA +04EC +04EE +04F0 +04F2 +04F4 +04F6 +04F8 +0500 +0502 +0504 +0506 +0508 +050A +050C +050E +0531 0556 +10A0 10C5 +1E00 +1E02 +1E04 +1E06 +1E08 +1E0A +1E0C +1E0E +1E10 +1E12 +1E14 +1E16 +1E18 +1E1A +1E1C +1E1E +1E20 +1E22 +1E24 +1E26 +1E28 +1E2A +1E2C +1E2E +1E30 +1E32 +1E34 +1E36 +1E38 +1E3A +1E3C +1E3E +1E40 +1E42 +1E44 +1E46 +1E48 +1E4A +1E4C +1E4E +1E50 +1E52 +1E54 +1E56 +1E58 +1E5A +1E5C +1E5E +1E60 +1E62 +1E64 +1E66 +1E68 +1E6A +1E6C +1E6E +1E70 +1E72 +1E74 +1E76 +1E78 +1E7A +1E7C +1E7E +1E80 +1E82 +1E84 +1E86 +1E88 +1E8A +1E8C +1E8E +1E90 +1E92 +1E94 +1EA0 +1EA2 +1EA4 +1EA6 +1EA8 +1EAA +1EAC +1EAE +1EB0 +1EB2 +1EB4 +1EB6 +1EB8 +1EBA +1EBC +1EBE +1EC0 +1EC2 +1EC4 +1EC6 +1EC8 +1ECA +1ECC +1ECE +1ED0 +1ED2 +1ED4 +1ED6 +1ED8 +1EDA +1EDC +1EDE +1EE0 +1EE2 +1EE4 +1EE6 +1EE8 +1EEA +1EEC +1EEE +1EF0 +1EF2 +1EF4 +1EF6 +1EF8 +1F08 1F0F +1F18 1F1D +1F28 1F2F +1F38 1F3F +1F48 1F4D +1F59 +1F5B +1F5D +1F5F +1F68 1F6F +1FB8 1FBB +1FC8 1FCB +1FD8 1FDB +1FE8 1FEC +1FF8 1FFB +2102 +2107 +210B 210D +2110 2112 +2115 +2119 211D +2124 +2126 +2128 +212A 212D +2130 2131 +2133 +213E 213F +2145 +2160 216F +24B6 24CF +2C00 2C2E +2C80 +2C82 +2C84 +2C86 +2C88 +2C8A +2C8C +2C8E +2C90 +2C92 +2C94 +2C96 +2C98 +2C9A +2C9C +2C9E +2CA0 +2CA2 +2CA4 +2CA6 +2CA8 +2CAA +2CAC +2CAE +2CB0 +2CB2 +2CB4 +2CB6 +2CB8 +2CBA +2CBC +2CBE +2CC0 +2CC2 +2CC4 +2CC6 +2CC8 +2CCA +2CCC +2CCE +2CD0 +2CD2 +2CD4 +2CD6 +2CD8 +2CDA +2CDC +2CDE +2CE0 +2CE2 +FF21 FF3A +10400 10427 +1D400 1D419 +1D434 1D44D +1D468 1D481 +1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B5 +1D4D0 1D4E9 +1D504 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D538 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D56C 1D585 +1D5A0 1D5B9 +1D5D4 1D5ED +1D608 1D621 +1D63C 1D655 +1D670 1D689 +1D6A8 1D6C0 +1D6E2 1D6FA +1D71C 1D734 +1D756 1D76E +1D790 1D7A8 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/VS.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/VS.pl new file mode 100644 index 00000000000..ca505d75531 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/VS.pl @@ -0,0 +1,12 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'Variation_Selector' +# +return <<'END'; +180B 180D Variation_Selector +FE00 FE0F Variation_Selector +E0100 E01EF Variation_Selector +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Variatio.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Variatio.pl new file mode 100644 index 00000000000..74173e857ce --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Variatio.pl @@ -0,0 +1,15 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{VariationSelector} (and fuzzy permutations) +# +# Meaning: Extended property 'Variation_Selector' +# +return <<'END'; +180B 180D Variation_Selector +FE00 FE0F Variation_Selector +E0100 E01EF Variation_Selector +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/WSpace.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/WSpace.pl new file mode 100644 index 00000000000..0078091db50 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/WSpace.pl @@ -0,0 +1,20 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Binary property 'White_Space' +# +return <<'END'; +0009 000D White_Space +0020 White_Space +0085 White_Space +00A0 White_Space +1680 White_Space +180E White_Space +2000 200A White_Space +2028 2029 White_Space +202F White_Space +205F White_Space +3000 White_Space +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/WhiteSpa.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/WhiteSpa.pl new file mode 100644 index 00000000000..0284bc05318 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/WhiteSpa.pl @@ -0,0 +1,23 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{WhiteSpace} (and fuzzy permutations) +# +# Meaning: Extended property 'White_Space' +# +return <<'END'; +0009 000D White_Space +0020 White_Space +0085 White_Space +00A0 White_Space +1680 White_Space +180E White_Space +2000 200A White_Space +2028 2029 White_Space +202F White_Space +205F White_Space +3000 White_Space +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Word.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Word.pl new file mode 100644 index 00000000000..fcae9e4d565 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Word.pl @@ -0,0 +1,476 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Word} +# +# Meaning: [[:Word:]] +# +return <<'END'; +0030 0039 +0041 005A +005F +0061 007A +00AA +00B2 00B3 +00B5 +00B9 00BA +00BC 00BE +00C0 00D6 +00D8 00F6 +00F8 0241 +0250 02C1 +02C6 02D1 +02E0 02E4 +02EE +0300 036F +037A +0386 +0388 038A +038C +038E 03A1 +03A3 03CE +03D0 03F5 +03F7 0481 +0483 0486 +0488 04CE +04D0 04F9 +0500 050F +0531 0556 +0559 +0561 0587 +0591 05B9 +05BB 05BD +05BF +05C1 05C2 +05C4 05C5 +05C7 +05D0 05EA +05F0 05F2 +0610 0615 +0621 063A +0640 065E +0660 0669 +066E 06D3 +06D5 06DC +06DE 06E8 +06EA 06FC +06FF +0710 074A +074D 076D +0780 07B1 +0901 0939 +093C 094D +0950 0954 +0958 0963 +0966 096F +097D +0981 0983 +0985 098C +098F 0990 +0993 09A8 +09AA 09B0 +09B2 +09B6 09B9 +09BC 09C4 +09C7 09C8 +09CB 09CE +09D7 +09DC 09DD +09DF 09E3 +09E6 09F1 +09F4 09F9 +0A01 0A03 +0A05 0A0A +0A0F 0A10 +0A13 0A28 +0A2A 0A30 +0A32 0A33 +0A35 0A36 +0A38 0A39 +0A3C +0A3E 0A42 +0A47 0A48 +0A4B 0A4D +0A59 0A5C +0A5E +0A66 0A74 +0A81 0A83 +0A85 0A8D +0A8F 0A91 +0A93 0AA8 +0AAA 0AB0 +0AB2 0AB3 +0AB5 0AB9 +0ABC 0AC5 +0AC7 0AC9 +0ACB 0ACD +0AD0 +0AE0 0AE3 +0AE6 0AEF +0B01 0B03 +0B05 0B0C +0B0F 0B10 +0B13 0B28 +0B2A 0B30 +0B32 0B33 +0B35 0B39 +0B3C 0B43 +0B47 0B48 +0B4B 0B4D +0B56 0B57 +0B5C 0B5D +0B5F 0B61 +0B66 0B6F +0B71 +0B82 0B83 +0B85 0B8A +0B8E 0B90 +0B92 0B95 +0B99 0B9A +0B9C +0B9E 0B9F +0BA3 0BA4 +0BA8 0BAA +0BAE 0BB9 +0BBE 0BC2 +0BC6 0BC8 +0BCA 0BCD +0BD7 +0BE6 0BF2 +0C01 0C03 +0C05 0C0C +0C0E 0C10 +0C12 0C28 +0C2A 0C33 +0C35 0C39 +0C3E 0C44 +0C46 0C48 +0C4A 0C4D +0C55 0C56 +0C60 0C61 +0C66 0C6F +0C82 0C83 +0C85 0C8C +0C8E 0C90 +0C92 0CA8 +0CAA 0CB3 +0CB5 0CB9 +0CBC 0CC4 +0CC6 0CC8 +0CCA 0CCD +0CD5 0CD6 +0CDE +0CE0 0CE1 +0CE6 0CEF +0D02 0D03 +0D05 0D0C +0D0E 0D10 +0D12 0D28 +0D2A 0D39 +0D3E 0D43 +0D46 0D48 +0D4A 0D4D +0D57 +0D60 0D61 +0D66 0D6F +0D82 0D83 +0D85 0D96 +0D9A 0DB1 +0DB3 0DBB +0DBD +0DC0 0DC6 +0DCA +0DCF 0DD4 +0DD6 +0DD8 0DDF +0DF2 0DF3 +0E01 0E3A +0E40 0E4E +0E50 0E59 +0E81 0E82 +0E84 +0E87 0E88 +0E8A +0E8D +0E94 0E97 +0E99 0E9F +0EA1 0EA3 +0EA5 +0EA7 +0EAA 0EAB +0EAD 0EB9 +0EBB 0EBD +0EC0 0EC4 +0EC6 +0EC8 0ECD +0ED0 0ED9 +0EDC 0EDD +0F00 +0F18 0F19 +0F20 0F33 +0F35 +0F37 +0F39 +0F3E 0F47 +0F49 0F6A +0F71 0F84 +0F86 0F8B +0F90 0F97 +0F99 0FBC +0FC6 +1000 1021 +1023 1027 +1029 102A +102C 1032 +1036 1039 +1040 1049 +1050 1059 +10A0 10C5 +10D0 10FA +10FC +1100 1159 +115F 11A2 +11A8 11F9 +1200 1248 +124A 124D +1250 1256 +1258 +125A 125D +1260 1288 +128A 128D +1290 12B0 +12B2 12B5 +12B8 12BE +12C0 +12C2 12C5 +12C8 12D6 +12D8 1310 +1312 1315 +1318 135A +135F +1369 137C +1380 138F +13A0 13F4 +1401 166C +166F 1676 +1681 169A +16A0 16EA +16EE 16F0 +1700 170C +170E 1714 +1720 1734 +1740 1753 +1760 176C +176E 1770 +1772 1773 +1780 17B3 +17B6 17D3 +17D7 +17DC 17DD +17E0 17E9 +17F0 17F9 +180B 180D +1810 1819 +1820 1877 +1880 18A9 +1900 191C +1920 192B +1930 193B +1946 196D +1970 1974 +1980 19A9 +19B0 19C9 +19D0 19D9 +1A00 1A1B +1D00 1DC3 +1E00 1E9B +1EA0 1EF9 +1F00 1F15 +1F18 1F1D +1F20 1F45 +1F48 1F4D +1F50 1F57 +1F59 +1F5B +1F5D +1F5F 1F7D +1F80 1FB4 +1FB6 1FBC +1FBE +1FC2 1FC4 +1FC6 1FCC +1FD0 1FD3 +1FD6 1FDB +1FE0 1FEC +1FF2 1FF4 +1FF6 1FFC +203F 2040 +2054 +2070 2071 +2074 2079 +207F 2089 +2090 2094 +20D0 20EB +2102 +2107 +210A 2113 +2115 +2119 211D +2124 +2126 +2128 +212A 212D +212F 2131 +2133 2139 +213C 213F +2145 2149 +2153 2183 +2460 249B +24EA 24FF +2776 2793 +2C00 2C2E +2C30 2C5E +2C80 2CE4 +2CFD +2D00 2D25 +2D30 2D65 +2D6F +2D80 2D96 +2DA0 2DA6 +2DA8 2DAE +2DB0 2DB6 +2DB8 2DBE +2DC0 2DC6 +2DC8 2DCE +2DD0 2DD6 +2DD8 2DDE +3005 3007 +3021 302F +3031 3035 +3038 303C +3041 3096 +3099 309A +309D 309F +30A1 30FA +30FC 30FF +3105 312C +3131 318E +3192 3195 +31A0 31B7 +31F0 31FF +3220 3229 +3251 325F +3280 3289 +32B1 32BF +3400 4DB5 +4E00 9FBB +A000 A48C +A800 A827 +AC00 D7A3 +F900 FA2D +FA30 FA6A +FA70 FAD9 +FB00 FB06 +FB13 FB17 +FB1D FB28 +FB2A FB36 +FB38 FB3C +FB3E +FB40 FB41 +FB43 FB44 +FB46 FBB1 +FBD3 FD3D +FD50 FD8F +FD92 FDC7 +FDF0 FDFB +FE00 FE0F +FE20 FE23 +FE33 FE34 +FE4D FE4F +FE70 FE74 +FE76 FEFC +FF10 FF19 +FF21 FF3A +FF3F +FF41 FF5A +FF66 FFBE +FFC2 FFC7 +FFCA FFCF +FFD2 FFD7 +FFDA FFDC +10000 1000B +1000D 10026 +10028 1003A +1003C 1003D +1003F 1004D +10050 1005D +10080 100FA +10107 10133 +10140 10178 +1018A +10300 1031E +10320 10323 +10330 1034A +10380 1039D +103A0 103C3 +103C8 103CF +103D1 103D5 +10400 1049D +104A0 104A9 +10800 10805 +10808 +1080A 10835 +10837 10838 +1083C +1083F +10A00 10A03 +10A05 10A06 +10A0C 10A13 +10A15 10A17 +10A19 10A33 +10A38 10A3A +10A3F 10A47 +1D165 1D169 +1D16D 1D172 +1D17B 1D182 +1D185 1D18B +1D1AA 1D1AD +1D242 1D244 +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A5 +1D6A8 1D6C0 +1D6C2 1D6DA +1D6DC 1D6FA +1D6FC 1D714 +1D716 1D734 +1D736 1D74E +1D750 1D76E +1D770 1D788 +1D78A 1D7A8 +1D7AA 1D7C2 +1D7C4 1D7C9 +1D7CE 1D7FF +20000 2A6D6 +2F800 2FA1D +E0100 E01EF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/XDigit.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/XDigit.pl new file mode 100644 index 00000000000..62350a4646f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/XDigit.pl @@ -0,0 +1,15 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{XDigit} +# +# Meaning: [[:XDigit:]] +# +return <<'END'; +0030 0039 +0041 0046 +0061 0066 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Yiii.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Yiii.pl new file mode 100644 index 00000000000..628bd87ba41 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Yiii.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Yi} (and fuzzy permutations) +# +# Meaning: Script 'Yi' +# +return <<'END'; +A000 A48C Yi +A490 A4C6 Yi +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Z.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Z.pl new file mode 100644 index 00000000000..361c4a92e23 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Z.pl @@ -0,0 +1,22 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Z} +# \p{Z} (and fuzzy permutations) +# +# Meaning: Major Category 'Z' +# +return <<'END'; +0020 +00A0 +1680 +180E +2000 200A +2028 2029 +202F +205F +3000 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Zl.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Zl.pl new file mode 100644 index 00000000000..ed1819bd008 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Zl.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Zl} +# \p{Zl} (and fuzzy permutations) +# +# Meaning: General Category 'Zl' +# +return <<'END'; +2028 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Zp.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Zp.pl new file mode 100644 index 00000000000..bd18ea4696f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Zp.pl @@ -0,0 +1,14 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Zp} +# \p{Zp} (and fuzzy permutations) +# +# Meaning: General Category 'Zp' +# +return <<'END'; +2029 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Zs.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Zs.pl new file mode 100644 index 00000000000..32c9497794c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Zs.pl @@ -0,0 +1,21 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Zs} +# \p{Zs} (and fuzzy permutations) +# +# Meaning: General Category 'Zs' +# +return <<'END'; +0020 +00A0 +1680 +180E +2000 200A +202F +205F +3000 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Zyyy.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Zyyy.pl new file mode 100644 index 00000000000..a6eaa6a6887 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/Zyyy.pl @@ -0,0 +1,138 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{Common} (and fuzzy permutations) +# +# Meaning: Script 'Common' +# +return <<'END'; +0000 0040 Common +005B 0060 Common +007B 00A9 Common +00AB 00B9 Common +00BB 00BF Common +00D7 Common +00F7 Common +02B9 02DF Common +02E5 02FF Common +037E Common +0387 Common +0589 Common +0600 0603 Common +060C Common +061B Common +061F Common +0640 Common +0660 0669 Common +06DD Common +0964 0965 Common +0970 Common +0E3F Common +10FB Common +16EB 16ED Common +1735 1736 Common +2000 200B Common +200E 2063 Common +206A 2070 Common +2074 207E Common +2080 208E Common +20A0 20B5 Common +2100 2125 Common +2127 2129 Common +212C 214C Common +2153 2183 Common +2190 23DB Common +2400 2426 Common +2440 244A Common +2460 269C Common +26A0 26B1 Common +2701 2704 Common +2706 2709 Common +270C 2727 Common +2729 274B Common +274D Common +274F 2752 Common +2756 Common +2758 275E Common +2761 2794 Common +2798 27AF Common +27B1 27BE Common +27C0 27C6 Common +27D0 27EB Common +27F0 27FF Common +2900 2B13 Common +2E00 2E17 Common +2E1C 2E1D Common +2FF0 2FFB Common +3000 3004 Common +3006 Common +3008 3020 Common +3030 3037 Common +303C 303F Common +309B 309C Common +30A0 Common +30FB 30FC Common +3190 319F Common +31C0 31CF Common +3220 3243 Common +3250 325F Common +327E 32FE Common +3300 33FF Common +4DC0 4DFF Common +A700 A716 Common +E000 F8FF Common +FD3E FD3F Common +FDFD Common +FE10 FE19 Common +FE30 FE52 Common +FE54 FE66 Common +FE68 FE6B Common +FEFF Common +FF01 FF20 Common +FF3B FF40 Common +FF5B FF65 Common +FF70 Common +FF9E FF9F Common +FFE0 FFE6 Common +FFE8 FFEE Common +FFF9 FFFD Common +10100 10102 Common +10107 10133 Common +10137 1013F Common +1D000 1D0F5 Common +1D100 1D126 Common +1D12A 1D166 Common +1D16A 1D17A Common +1D183 1D184 Common +1D18C 1D1A9 Common +1D1AE 1D1DD Common +1D300 1D356 Common +1D400 1D454 Common +1D456 1D49C Common +1D49E 1D49F Common +1D4A2 Common +1D4A5 1D4A6 Common +1D4A9 1D4AC Common +1D4AE 1D4B9 Common +1D4BB Common +1D4BD 1D4C3 Common +1D4C5 1D505 Common +1D507 1D50A Common +1D50D 1D514 Common +1D516 1D51C Common +1D51E 1D539 Common +1D53B 1D53E Common +1D540 1D544 Common +1D546 Common +1D54A 1D550 Common +1D552 1D6A5 Common +1D6A8 1D7C9 Common +1D7CE 1D7FF Common +E0001 Common +E0020 E007F Common +F0000 FFFFD Common +100000 10FFFD Common +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/_CanonDC.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/_CanonDC.pl new file mode 100644 index 00000000000..5da8da98335 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/_CanonDC.pl @@ -0,0 +1,16 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{_CanonDCIJ} +# +# Meaning: (for internal casefolding use) +# +return <<'END'; +0069 006A +012F +1E2D +1ECB +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/_CaseIgn.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/_CaseIgn.pl new file mode 100644 index 00000000000..e6c2b6619d3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/_CaseIgn.pl @@ -0,0 +1,138 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{_CaseIgnorable} +# +# Meaning: (for internal casefolding use) +# +return <<'END'; +00AD +0300 036F +0483 0486 +0591 05B9 +05BB 05BD +05BF +05C1 05C2 +05C4 05C5 +05C7 +0610 0615 +064B 065E +0670 +06D6 06DC +06DF 06E4 +06E7 06E8 +06EA 06ED +0711 +0730 074A +07A6 07B0 +0901 0902 +093C +0941 0948 +094D +0951 0954 +0962 0963 +0981 +09BC +09C1 09C4 +09CD +09E2 09E3 +0A01 0A02 +0A3C +0A41 0A42 +0A47 0A48 +0A4B 0A4D +0A70 0A71 +0A81 0A82 +0ABC +0AC1 0AC5 +0AC7 0AC8 +0ACD +0AE2 0AE3 +0B01 +0B3C +0B3F +0B41 0B43 +0B4D +0B56 +0B82 +0BC0 +0BCD +0C3E 0C40 +0C46 0C48 +0C4A 0C4D +0C55 0C56 +0CBC +0CBF +0CC6 +0CCC 0CCD +0D41 0D43 +0D4D +0DCA +0DD2 0DD4 +0DD6 +0E31 +0E34 0E3A +0E47 0E4E +0EB1 +0EB4 0EB9 +0EBB 0EBC +0EC8 0ECD +0F18 0F19 +0F35 +0F37 +0F39 +0F71 0F7E +0F80 0F84 +0F86 0F87 +0F90 0F97 +0F99 0FBC +0FC6 +102D 1030 +1032 +1036 1037 +1039 +1058 1059 +135F +1712 1714 +1732 1734 +1752 1753 +1772 1773 +17B7 17BD +17C6 +17C9 17D3 +17DD +180B 180D +18A9 +1920 1922 +1927 1928 +1932 +1939 193B +1A17 1A18 +1DC0 1DC3 +2010 +20D0 20DC +20E1 +20E5 20EB +302A 302F +3099 309A +A806 +A80B +A825 A826 +FB1E +FE00 FE0F +FE20 FE23 +10A01 10A03 +10A05 10A06 +10A0C 10A0F +10A38 10A3A +10A3F +1D167 1D169 +1D17B 1D182 +1D185 1D18B +1D1AA 1D1AD +1D242 1D244 +E0100 E01EF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/_CombAbo.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/_CombAbo.pl new file mode 100644 index 00000000000..0bf4915039c --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/gc_sc/_CombAbo.pl @@ -0,0 +1,69 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# This file supports: +# \p{_CombAbove} +# +# Meaning: (for internal casefolding use) +# +return <<'END'; +0300 0314 +033D 0344 +0346 +034A 034C +0350 0352 +0357 +035B +0363 036F +0483 0486 +0592 0595 +0597 0599 +059C 05A1 +05A8 05A9 +05AB 05AC +05AF +05C4 +0610 0615 +0653 0654 +0657 065B +065D 065E +06D6 06DC +06DF 06E2 +06E4 +06E7 06E8 +06EB 06EC +0730 +0732 0733 +0735 0736 +073A +073D +073F 0741 +0743 +0745 +0747 +0749 074A +0951 +0953 0954 +0F82 0F83 +0F86 0F87 +135F +17DD +193A +1A17 +1DC0 1DC1 +1DC3 +20D0 20D1 +20D4 20D7 +20DB 20DC +20E1 +20E7 +20E9 +FE20 FE23 +10A0F +10A38 +1D185 1D189 +1D1AA 1D1AD +1D242 1D244 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/hst/L.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/hst/L.pl new file mode 100644 index 00000000000..945fc18394f --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/hst/L.pl @@ -0,0 +1,11 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# HangulSyllableType category 'Leading_Jamo' +# +return <<'END'; +1100 1159 +115F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/hst/LV.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/hst/LV.pl new file mode 100644 index 00000000000..13d12ad5f31 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/hst/LV.pl @@ -0,0 +1,408 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# HangulSyllableType category 'LV_Syllable' +# +return <<'END'; +AC00 +AC1C +AC38 +AC54 +AC70 +AC8C +ACA8 +ACC4 +ACE0 +ACFC +AD18 +AD34 +AD50 +AD6C +AD88 +ADA4 +ADC0 +ADDC +ADF8 +AE14 +AE30 +AE4C +AE68 +AE84 +AEA0 +AEBC +AED8 +AEF4 +AF10 +AF2C +AF48 +AF64 +AF80 +AF9C +AFB8 +AFD4 +AFF0 +B00C +B028 +B044 +B060 +B07C +B098 +B0B4 +B0D0 +B0EC +B108 +B124 +B140 +B15C +B178 +B194 +B1B0 +B1CC +B1E8 +B204 +B220 +B23C +B258 +B274 +B290 +B2AC +B2C8 +B2E4 +B300 +B31C +B338 +B354 +B370 +B38C +B3A8 +B3C4 +B3E0 +B3FC +B418 +B434 +B450 +B46C +B488 +B4A4 +B4C0 +B4DC +B4F8 +B514 +B530 +B54C +B568 +B584 +B5A0 +B5BC +B5D8 +B5F4 +B610 +B62C +B648 +B664 +B680 +B69C +B6B8 +B6D4 +B6F0 +B70C +B728 +B744 +B760 +B77C +B798 +B7B4 +B7D0 +B7EC +B808 +B824 +B840 +B85C +B878 +B894 +B8B0 +B8CC +B8E8 +B904 +B920 +B93C +B958 +B974 +B990 +B9AC +B9C8 +B9E4 +BA00 +BA1C +BA38 +BA54 +BA70 +BA8C +BAA8 +BAC4 +BAE0 +BAFC +BB18 +BB34 +BB50 +BB6C +BB88 +BBA4 +BBC0 +BBDC +BBF8 +BC14 +BC30 +BC4C +BC68 +BC84 +BCA0 +BCBC +BCD8 +BCF4 +BD10 +BD2C +BD48 +BD64 +BD80 +BD9C +BDB8 +BDD4 +BDF0 +BE0C +BE28 +BE44 +BE60 +BE7C +BE98 +BEB4 +BED0 +BEEC +BF08 +BF24 +BF40 +BF5C +BF78 +BF94 +BFB0 +BFCC +BFE8 +C004 +C020 +C03C +C058 +C074 +C090 +C0AC +C0C8 +C0E4 +C100 +C11C +C138 +C154 +C170 +C18C +C1A8 +C1C4 +C1E0 +C1FC +C218 +C234 +C250 +C26C +C288 +C2A4 +C2C0 +C2DC +C2F8 +C314 +C330 +C34C +C368 +C384 +C3A0 +C3BC +C3D8 +C3F4 +C410 +C42C +C448 +C464 +C480 +C49C +C4B8 +C4D4 +C4F0 +C50C +C528 +C544 +C560 +C57C +C598 +C5B4 +C5D0 +C5EC +C608 +C624 +C640 +C65C +C678 +C694 +C6B0 +C6CC +C6E8 +C704 +C720 +C73C +C758 +C774 +C790 +C7AC +C7C8 +C7E4 +C800 +C81C +C838 +C854 +C870 +C88C +C8A8 +C8C4 +C8E0 +C8FC +C918 +C934 +C950 +C96C +C988 +C9A4 +C9C0 +C9DC +C9F8 +CA14 +CA30 +CA4C +CA68 +CA84 +CAA0 +CABC +CAD8 +CAF4 +CB10 +CB2C +CB48 +CB64 +CB80 +CB9C +CBB8 +CBD4 +CBF0 +CC0C +CC28 +CC44 +CC60 +CC7C +CC98 +CCB4 +CCD0 +CCEC +CD08 +CD24 +CD40 +CD5C +CD78 +CD94 +CDB0 +CDCC +CDE8 +CE04 +CE20 +CE3C +CE58 +CE74 +CE90 +CEAC +CEC8 +CEE4 +CF00 +CF1C +CF38 +CF54 +CF70 +CF8C +CFA8 +CFC4 +CFE0 +CFFC +D018 +D034 +D050 +D06C +D088 +D0A4 +D0C0 +D0DC +D0F8 +D114 +D130 +D14C +D168 +D184 +D1A0 +D1BC +D1D8 +D1F4 +D210 +D22C +D248 +D264 +D280 +D29C +D2B8 +D2D4 +D2F0 +D30C +D328 +D344 +D360 +D37C +D398 +D3B4 +D3D0 +D3EC +D408 +D424 +D440 +D45C +D478 +D494 +D4B0 +D4CC +D4E8 +D504 +D520 +D53C +D558 +D574 +D590 +D5AC +D5C8 +D5E4 +D600 +D61C +D638 +D654 +D670 +D68C +D6A8 +D6C4 +D6E0 +D6FC +D718 +D734 +D750 +D76C +D788 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/hst/LVT.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/hst/LVT.pl new file mode 100644 index 00000000000..c429e0216ee --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/hst/LVT.pl @@ -0,0 +1,408 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# HangulSyllableType category 'LVT_Syllable' +# +return <<'END'; +AC01 AC1B +AC1D AC37 +AC39 AC53 +AC55 AC6F +AC71 AC8B +AC8D ACA7 +ACA9 ACC3 +ACC5 ACDF +ACE1 ACFB +ACFD AD17 +AD19 AD33 +AD35 AD4F +AD51 AD6B +AD6D AD87 +AD89 ADA3 +ADA5 ADBF +ADC1 ADDB +ADDD ADF7 +ADF9 AE13 +AE15 AE2F +AE31 AE4B +AE4D AE67 +AE69 AE83 +AE85 AE9F +AEA1 AEBB +AEBD AED7 +AED9 AEF3 +AEF5 AF0F +AF11 AF2B +AF2D AF47 +AF49 AF63 +AF65 AF7F +AF81 AF9B +AF9D AFB7 +AFB9 AFD3 +AFD5 AFEF +AFF1 B00B +B00D B027 +B029 B043 +B045 B05F +B061 B07B +B07D B097 +B099 B0B3 +B0B5 B0CF +B0D1 B0EB +B0ED B107 +B109 B123 +B125 B13F +B141 B15B +B15D B177 +B179 B193 +B195 B1AF +B1B1 B1CB +B1CD B1E7 +B1E9 B203 +B205 B21F +B221 B23B +B23D B257 +B259 B273 +B275 B28F +B291 B2AB +B2AD B2C7 +B2C9 B2E3 +B2E5 B2FF +B301 B31B +B31D B337 +B339 B353 +B355 B36F +B371 B38B +B38D B3A7 +B3A9 B3C3 +B3C5 B3DF +B3E1 B3FB +B3FD B417 +B419 B433 +B435 B44F +B451 B46B +B46D B487 +B489 B4A3 +B4A5 B4BF +B4C1 B4DB +B4DD B4F7 +B4F9 B513 +B515 B52F +B531 B54B +B54D B567 +B569 B583 +B585 B59F +B5A1 B5BB +B5BD B5D7 +B5D9 B5F3 +B5F5 B60F +B611 B62B +B62D B647 +B649 B663 +B665 B67F +B681 B69B +B69D B6B7 +B6B9 B6D3 +B6D5 B6EF +B6F1 B70B +B70D B727 +B729 B743 +B745 B75F +B761 B77B +B77D B797 +B799 B7B3 +B7B5 B7CF +B7D1 B7EB +B7ED B807 +B809 B823 +B825 B83F +B841 B85B +B85D B877 +B879 B893 +B895 B8AF +B8B1 B8CB +B8CD B8E7 +B8E9 B903 +B905 B91F +B921 B93B +B93D B957 +B959 B973 +B975 B98F +B991 B9AB +B9AD B9C7 +B9C9 B9E3 +B9E5 B9FF +BA01 BA1B +BA1D BA37 +BA39 BA53 +BA55 BA6F +BA71 BA8B +BA8D BAA7 +BAA9 BAC3 +BAC5 BADF +BAE1 BAFB +BAFD BB17 +BB19 BB33 +BB35 BB4F +BB51 BB6B +BB6D BB87 +BB89 BBA3 +BBA5 BBBF +BBC1 BBDB +BBDD BBF7 +BBF9 BC13 +BC15 BC2F +BC31 BC4B +BC4D BC67 +BC69 BC83 +BC85 BC9F +BCA1 BCBB +BCBD BCD7 +BCD9 BCF3 +BCF5 BD0F +BD11 BD2B +BD2D BD47 +BD49 BD63 +BD65 BD7F +BD81 BD9B +BD9D BDB7 +BDB9 BDD3 +BDD5 BDEF +BDF1 BE0B +BE0D BE27 +BE29 BE43 +BE45 BE5F +BE61 BE7B +BE7D BE97 +BE99 BEB3 +BEB5 BECF +BED1 BEEB +BEED BF07 +BF09 BF23 +BF25 BF3F +BF41 BF5B +BF5D BF77 +BF79 BF93 +BF95 BFAF +BFB1 BFCB +BFCD BFE7 +BFE9 C003 +C005 C01F +C021 C03B +C03D C057 +C059 C073 +C075 C08F +C091 C0AB +C0AD C0C7 +C0C9 C0E3 +C0E5 C0FF +C101 C11B +C11D C137 +C139 C153 +C155 C16F +C171 C18B +C18D C1A7 +C1A9 C1C3 +C1C5 C1DF +C1E1 C1FB +C1FD C217 +C219 C233 +C235 C24F +C251 C26B +C26D C287 +C289 C2A3 +C2A5 C2BF +C2C1 C2DB +C2DD C2F7 +C2F9 C313 +C315 C32F +C331 C34B +C34D C367 +C369 C383 +C385 C39F +C3A1 C3BB +C3BD C3D7 +C3D9 C3F3 +C3F5 C40F +C411 C42B +C42D C447 +C449 C463 +C465 C47F +C481 C49B +C49D C4B7 +C4B9 C4D3 +C4D5 C4EF +C4F1 C50B +C50D C527 +C529 C543 +C545 C55F +C561 C57B +C57D C597 +C599 C5B3 +C5B5 C5CF +C5D1 C5EB +C5ED C607 +C609 C623 +C625 C63F +C641 C65B +C65D C677 +C679 C693 +C695 C6AF +C6B1 C6CB +C6CD C6E7 +C6E9 C703 +C705 C71F +C721 C73B +C73D C757 +C759 C773 +C775 C78F +C791 C7AB +C7AD C7C7 +C7C9 C7E3 +C7E5 C7FF +C801 C81B +C81D C837 +C839 C853 +C855 C86F +C871 C88B +C88D C8A7 +C8A9 C8C3 +C8C5 C8DF +C8E1 C8FB +C8FD C917 +C919 C933 +C935 C94F +C951 C96B +C96D C987 +C989 C9A3 +C9A5 C9BF +C9C1 C9DB +C9DD C9F7 +C9F9 CA13 +CA15 CA2F +CA31 CA4B +CA4D CA67 +CA69 CA83 +CA85 CA9F +CAA1 CABB +CABD CAD7 +CAD9 CAF3 +CAF5 CB0F +CB11 CB2B +CB2D CB47 +CB49 CB63 +CB65 CB7F +CB81 CB9B +CB9D CBB7 +CBB9 CBD3 +CBD5 CBEF +CBF1 CC0B +CC0D CC27 +CC29 CC43 +CC45 CC5F +CC61 CC7B +CC7D CC97 +CC99 CCB3 +CCB5 CCCF +CCD1 CCEB +CCED CD07 +CD09 CD23 +CD25 CD3F +CD41 CD5B +CD5D CD77 +CD79 CD93 +CD95 CDAF +CDB1 CDCB +CDCD CDE7 +CDE9 CE03 +CE05 CE1F +CE21 CE3B +CE3D CE57 +CE59 CE73 +CE75 CE8F +CE91 CEAB +CEAD CEC7 +CEC9 CEE3 +CEE5 CEFF +CF01 CF1B +CF1D CF37 +CF39 CF53 +CF55 CF6F +CF71 CF8B +CF8D CFA7 +CFA9 CFC3 +CFC5 CFDF +CFE1 CFFB +CFFD D017 +D019 D033 +D035 D04F +D051 D06B +D06D D087 +D089 D0A3 +D0A5 D0BF +D0C1 D0DB +D0DD D0F7 +D0F9 D113 +D115 D12F +D131 D14B +D14D D167 +D169 D183 +D185 D19F +D1A1 D1BB +D1BD D1D7 +D1D9 D1F3 +D1F5 D20F +D211 D22B +D22D D247 +D249 D263 +D265 D27F +D281 D29B +D29D D2B7 +D2B9 D2D3 +D2D5 D2EF +D2F1 D30B +D30D D327 +D329 D343 +D345 D35F +D361 D37B +D37D D397 +D399 D3B3 +D3B5 D3CF +D3D1 D3EB +D3ED D407 +D409 D423 +D425 D43F +D441 D45B +D45D D477 +D479 D493 +D495 D4AF +D4B1 D4CB +D4CD D4E7 +D4E9 D503 +D505 D51F +D521 D53B +D53D D557 +D559 D573 +D575 D58F +D591 D5AB +D5AD D5C7 +D5C9 D5E3 +D5E5 D5FF +D601 D61B +D61D D637 +D639 D653 +D655 D66F +D671 D68B +D68D D6A7 +D6A9 D6C3 +D6C5 D6DF +D6E1 D6FB +D6FD D717 +D719 D733 +D735 D74F +D751 D76B +D76D D787 +D789 D7A3 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/hst/T.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/hst/T.pl new file mode 100644 index 00000000000..7a319da9208 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/hst/T.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# HangulSyllableType category 'Trailing_Jamo' +# +return <<'END'; +11A8 11F9 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/hst/V.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/hst/V.pl new file mode 100644 index 00000000000..a15ff227215 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/hst/V.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# HangulSyllableType category 'Vowel_Jamo' +# +return <<'END'; +1160 11A2 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/jt/C.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/jt/C.pl new file mode 100644 index 00000000000..ff7d7801b8d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/jt/C.pl @@ -0,0 +1,11 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# JoiningType category 'Join_Causing' +# +return <<'END'; +0640 +200D +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/jt/D.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/jt/D.pl new file mode 100644 index 00000000000..b5fe86b95c5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/jt/D.pl @@ -0,0 +1,33 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# JoiningType category 'Dual_Joining' +# +return <<'END'; +0626 +0628 +062A 062E +0633 063A +0641 0647 +0649 064A +066E 066F +0678 0687 +069A 06BF +06C1 06C2 +06CC +06CE +06D0 06D1 +06FA 06FC +06FF +0712 0714 +071A 071D +071F 0727 +0729 +072B +072D 072E +074E 0758 +075C 076A +076D +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/jt/R.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/jt/R.pl new file mode 100644 index 00000000000..5ab772036f0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/jt/R.pl @@ -0,0 +1,34 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# JoiningType category 'Right_Joining' +# +return <<'END'; +0622 0625 +0627 +0629 +062F 0632 +0648 +0671 0673 +0675 0677 +0688 0699 +06C0 +06C3 06CB +06CD +06CF +06D2 06D3 +06D5 +06EE 06EF +0710 +0715 0719 +071E +0728 +072A +072C +072F +074D +0759 075B +076B 076C +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/jt/U.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/jt/U.pl new file mode 100644 index 00000000000..5d344f64f3a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/jt/U.pl @@ -0,0 +1,15 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# JoiningType category 'Non_Joining' +# +return <<'END'; +0600 0603 +060B +0621 +0674 +06DD +200C +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/AI.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/AI.pl new file mode 100644 index 00000000000..2837c8eca14 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/AI.pl @@ -0,0 +1,101 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Ambiguous' +# +return <<'END'; +00A1 +00A7 00A8 +00AA +00B2 00B3 +00B6 00BA +00BC 00BF +00D7 +00F7 +02C7 +02C9 02CB +02CD +02D0 +02D8 02DB +02DD +2015 2016 +2020 2021 +203B +2074 +207F +2081 2084 +2105 +2113 +2121 2122 +212B +2154 2155 +215B +215E +2160 216B +2170 2179 +2190 2199 +21D2 +21D4 +2200 +2202 2203 +2207 2208 +220B +220F +2211 +2215 +221A +221D 2220 +2223 +2225 +2227 222C +222E +2234 2237 +223C 223D +2248 +224C +2252 +2260 2261 +2264 2267 +226A 226B +226E 226F +2282 2283 +2286 2287 +2295 +2299 +22A5 +22BF +2312 +2460 24FE +2500 254B +2550 2574 +2580 258F +2592 2595 +25A0 25A1 +25A3 25A9 +25B2 25B3 +25B6 25B7 +25BC 25BD +25C0 25C1 +25C6 25C8 +25CB +25CE 25D1 +25E2 25E5 +25EF +2605 2606 +2609 +260E 260F +2614 2617 +261C +261E +2640 +2642 +2660 2661 +2663 2665 +2667 266A +266C 266D +266F +2776 2793 +FFFD +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/AL.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/AL.pl new file mode 100644 index 00000000000..7263f9ca1e6 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/AL.pl @@ -0,0 +1,449 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Alphabetic' +# +return <<'END'; +0023 +0026 +002A +003C 003E +0040 005A +005E 007A +007E +00A6 +00A9 +00AC +00AE 00AF +00B5 +00C0 00D6 +00D8 00F6 +00F8 0241 +0250 02C6 +02CE 02CF +02D1 02D7 +02DC +02DE 02FF +0374 0375 +037A +0384 038A +038C +038E 03A1 +03A3 03CE +03D0 0482 +048A 04CE +04D0 04F9 +0500 050F +0531 0556 +0559 055F +0561 0587 +05BE +05C0 +05C3 +05D0 05EA +05F0 05F4 +0600 0603 +060E 060F +0621 063A +0640 064A +066D 066F +0671 06D3 +06D5 +06DD +06E5 06E6 +06E9 +06EE 06EF +06FA 070D +070F 0710 +0712 072F +074D 076D +0780 07A5 +07B1 +0904 0939 +093D +0950 +0958 0961 +0970 +097D +0985 098C +098F 0990 +0993 09A8 +09AA 09B0 +09B2 +09B6 09B9 +09BD +09CE +09DC 09DD +09DF 09E1 +09F0 09F1 +09F4 09FA +0A05 0A0A +0A0F 0A10 +0A13 0A28 +0A2A 0A30 +0A32 0A33 +0A35 0A36 +0A38 0A39 +0A59 0A5C +0A5E +0A72 0A74 +0A85 0A8D +0A8F 0A91 +0A93 0AA8 +0AAA 0AB0 +0AB2 0AB3 +0AB5 0AB9 +0ABD +0AD0 +0AE0 0AE1 +0B05 0B0C +0B0F 0B10 +0B13 0B28 +0B2A 0B30 +0B32 0B33 +0B35 0B39 +0B3D +0B5C 0B5D +0B5F 0B61 +0B70 0B71 +0B83 +0B85 0B8A +0B8E 0B90 +0B92 0B95 +0B99 0B9A +0B9C +0B9E 0B9F +0BA3 0BA4 +0BA8 0BAA +0BAE 0BB9 +0BF0 0BF8 +0BFA +0C05 0C0C +0C0E 0C10 +0C12 0C28 +0C2A 0C33 +0C35 0C39 +0C60 0C61 +0C85 0C8C +0C8E 0C90 +0C92 0CA8 +0CAA 0CB3 +0CB5 0CB9 +0CBD +0CDE +0CE0 0CE1 +0D05 0D0C +0D0E 0D10 +0D12 0D28 +0D2A 0D39 +0D60 0D61 +0D85 0D96 +0D9A 0DB1 +0DB3 0DBB +0DBD +0DC0 0DC6 +0DF4 +0E4F +0F00 +0F05 +0F13 +0F15 0F17 +0F1A 0F1F +0F2A 0F33 +0F36 +0F38 +0F40 0F47 +0F49 0F6A +0F88 0F8B +0FC0 0FC5 +0FC7 0FCC +0FCF +104C 104F +10A0 10C5 +10D0 10FC +1200 1248 +124A 124D +1250 1256 +1258 +125A 125D +1260 1288 +128A 128D +1290 12B0 +12B2 12B5 +12B8 12BE +12C0 +12C2 12C5 +12C8 12D6 +12D8 1310 +1312 1315 +1318 135A +1360 +1362 137C +1380 1399 +13A0 13F4 +1401 1676 +1681 169A +16A0 16EA +16EE 16F0 +1700 170C +170E 1711 +1720 1731 +1735 1736 +1740 1751 +1760 176C +176E 1770 +17DC +17F0 17F9 +1800 1801 +1807 +180A +1820 1877 +1880 18A8 +1900 191C +1940 +1950 196D +1970 1974 +1980 19A9 +19C1 19C7 +19DE 1A16 +1A1F +1D00 1DBF +1E00 1E9B +1EA0 1EF9 +1F00 1F15 +1F18 1F1D +1F20 1F45 +1F48 1F4D +1F50 1F57 +1F59 +1F5B +1F5D +1F5F 1F7D +1F80 1FB4 +1FB6 1FC4 +1FC6 1FD3 +1FD6 1FDB +1FDD 1FEF +1FF2 1FF4 +1FF6 1FFE +2017 +2022 2023 +2038 +203D 2043 +2047 2055 +2057 +205C +2061 2063 +2070 2071 +2075 207C +2080 +2085 208C +2090 2094 +2100 2102 +2104 +2106 2108 +210A 2112 +2114 2115 +2117 2120 +2123 212A +212C 214C +2153 +2156 215A +215C 215D +215F +216C 216F +217A 2183 +219A 21D1 +21D3 +21D5 21FF +2201 +2204 2206 +2209 220A +220C 220E +2210 +2214 +2216 2219 +221B 221C +2221 2222 +2224 +2226 +222D +222F 2233 +2238 223B +223E 2247 +2249 224B +224D 2251 +2253 225F +2262 2263 +2268 2269 +226C 226D +2270 2281 +2284 2285 +2288 2294 +2296 2298 +229A 22A4 +22A6 22BE +22C0 2311 +2313 2328 +232B 23B3 +23B7 23DB +2400 2426 +2440 244A +24FF +254C 254F +2575 257F +2590 2591 +2596 259F +25A2 +25AA 25B1 +25B4 25B5 +25B8 25BB +25BE 25BF +25C2 25C5 +25C9 25CA +25CC 25CD +25D2 25E1 +25E6 25EE +25F0 2604 +2607 2608 +260A 260D +2610 2613 +2618 261B +261D +261F 263F +2641 +2643 265F +2662 +2666 +266B +266E +2670 269C +26A0 26B1 +2701 2704 +2706 2709 +270C 2727 +2729 274B +274D +274F 2752 +2756 +2758 275A +2761 +2764 2767 +2794 +2798 27AF +27B1 27BE +27C0 27C4 +27D0 27E5 +27F0 2982 +2999 29D7 +29DC 29FB +29FE 2B13 +2C00 2C2E +2C30 2C5E +2C80 2CEA +2CFD +2D00 2D25 +2D30 2D65 +2D6F +2D80 2D96 +2DA0 2DA6 +2DA8 2DAE +2DB0 2DB6 +2DB8 2DBE +2DC0 2DC6 +2DC8 2DCE +2DD0 2DD6 +2DD8 2DDE +2E16 +4DC0 4DFF +A700 A716 +A800 A801 +A803 A805 +A807 A80A +A80C A822 +A828 A82B +FB00 FB06 +FB13 FB17 +FB1D +FB1F FB36 +FB38 FB3C +FB3E +FB40 FB41 +FB43 FB44 +FB46 FBB1 +FBD3 FD3D +FD50 FD8F +FD92 FDC7 +FDF0 FDFB +FDFD +FE70 FE74 +FE76 FEFC +FF66 +FF71 FF9D +FFA0 FFBE +FFC2 FFC7 +FFCA FFCF +FFD2 FFD7 +FFDA FFDC +FFE8 FFEE +10000 1000B +1000D 10026 +10028 1003A +1003C 1003D +1003F 1004D +10050 1005D +10080 100FA +10107 10133 +10137 1018A +10300 1031E +10320 10323 +10330 1034A +10380 1039D +103A0 103C3 +103C8 103D5 +10400 1049D +10800 10805 +10808 +1080A 10835 +10837 10838 +1083C +1083F +10A00 +10A10 10A13 +10A15 10A17 +10A19 10A33 +10A40 10A47 +10A58 +1D000 1D0F5 +1D100 1D126 +1D12A 1D164 +1D16A 1D16C +1D183 1D184 +1D18C 1D1A9 +1D1AE 1D1DD +1D200 1D241 +1D245 +1D300 1D356 +1D400 1D454 +1D456 1D49C +1D49E 1D49F +1D4A2 +1D4A5 1D4A6 +1D4A9 1D4AC +1D4AE 1D4B9 +1D4BB +1D4BD 1D4C3 +1D4C5 1D505 +1D507 1D50A +1D50D 1D514 +1D516 1D51C +1D51E 1D539 +1D53B 1D53E +1D540 1D544 +1D546 +1D54A 1D550 +1D552 1D6A5 +1D6A8 1D7C9 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/B2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/B2.pl new file mode 100644 index 00000000000..d00f5791082 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/B2.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Break_Both' +# +return <<'END'; +2014 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/BA.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/BA.pl new file mode 100644 index 00000000000..48d2f10faf0 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/BA.pl @@ -0,0 +1,45 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Break_After' +# +return <<'END'; +0009 +007C +00AD +058A +0964 0965 +0E5A 0E5B +0F0B +0F34 +0F7F +0F85 +0FBE 0FBF +104A 104B +1361 +1680 +16EB 16ED +17D4 17D5 +17D8 +17DA +1802 1805 +1808 1809 +1A1E +2000 2006 +2008 200A +2010 +2012 2013 +2027 +2056 +2058 205B +205D 205F +2CF9 2CFC +2CFE 2CFF +2E0E 2E15 +2E17 +10100 10102 +1039F +10A50 10A57 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/BB.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/BB.pl new file mode 100644 index 00000000000..497a4b89835 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/BB.pl @@ -0,0 +1,17 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Break_Before' +# +return <<'END'; +00B4 +02C8 +02CC +0F01 0F04 +0F06 0F07 +0F09 0F0A +0FD0 0FD1 +1806 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/BK.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/BK.pl new file mode 100644 index 00000000000..c55b1be7ebd --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/BK.pl @@ -0,0 +1,11 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Mandatory_Break' +# +return <<'END'; +000C +2028 2029 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/CB.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/CB.pl new file mode 100644 index 00000000000..eb229b7bf98 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/CB.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Contingent_Break' +# +return <<'END'; +FFFC +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/CL.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/CL.pl new file mode 100644 index 00000000000..337639a26a5 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/CL.pl @@ -0,0 +1,80 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Close_Punctuation' +# +return <<'END'; +0029 +005D +007D +0F3B +0F3D +169C +2046 +207E +208E +232A +23B5 +2769 +276B +276D +276F +2771 +2773 +2775 +27C6 +27E7 +27E9 +27EB +2984 +2986 +2988 +298A +298C +298E +2990 +2992 +2994 +2996 +2998 +29D9 +29DB +29FD +3001 3002 +3009 +300B +300D +300F +3011 +3015 +3017 +3019 +301B +301E 301F +FD3F +FE11 FE12 +FE18 +FE36 +FE38 +FE3A +FE3C +FE3E +FE40 +FE42 +FE44 +FE48 +FE50 +FE52 +FE5A +FE5C +FE5E +FF09 +FF0C +FF0E +FF3D +FF5D +FF60 FF61 +FF63 FF64 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/CM.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/CM.pl new file mode 100644 index 00000000000..56aff56a330 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/CM.pl @@ -0,0 +1,155 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Combining_Mark' +# +return <<'END'; +0000 0008 +000B +000E 001F +007F 0084 +0086 009F +0300 034E +0350 035C +0363 036F +0483 0486 +0488 0489 +0591 05B9 +05BB 05BD +05BF +05C1 05C2 +05C4 05C5 +05C7 +0610 0615 +064B 065E +0670 +06D6 06DC +06DE 06E4 +06E7 06E8 +06EA 06ED +0711 +0730 074A +07A6 07B0 +0901 0903 +093C +093E 094D +0951 0954 +0962 0963 +0981 0983 +09BC +09BE 09C4 +09C7 09C8 +09CB 09CD +09D7 +09E2 09E3 +0A01 0A03 +0A3C +0A3E 0A42 +0A47 0A48 +0A4B 0A4D +0A70 0A71 +0A81 0A83 +0ABC +0ABE 0AC5 +0AC7 0AC9 +0ACB 0ACD +0AE2 0AE3 +0B01 0B03 +0B3C +0B3E 0B43 +0B47 0B48 +0B4B 0B4D +0B56 0B57 +0B82 +0BBE 0BC2 +0BC6 0BC8 +0BCA 0BCD +0BD7 +0C01 0C03 +0C3E 0C44 +0C46 0C48 +0C4A 0C4D +0C55 0C56 +0C82 0C83 +0CBC +0CBE 0CC4 +0CC6 0CC8 +0CCA 0CCD +0CD5 0CD6 +0D02 0D03 +0D3E 0D43 +0D46 0D48 +0D4A 0D4D +0D57 +0D82 0D83 +0DCA +0DCF 0DD4 +0DD6 +0DD8 0DDF +0DF2 0DF3 +0E31 +0E34 0E3A +0E47 0E4E +0EB1 +0EB4 0EB9 +0EBB 0EBC +0EC8 0ECD +0F18 0F19 +0F35 +0F37 +0F39 +0F3E 0F3F +0F71 0F7E +0F80 0F84 +0F86 0F87 +0F90 0F97 +0F99 0FBC +0FC6 +102C 1032 +1036 1039 +1056 1059 +135F +1712 1714 +1732 1734 +1752 1753 +1772 1773 +17B6 17D3 +17DD +180B 180D +18A9 +1920 192B +1930 193B +19B0 19C0 +19C8 19C9 +1A17 1A1B +1DC0 1DC3 +200C 200F +202A 202E +206A 206F +20D0 20EB +302A 302F +3099 309A +A802 +A806 +A80B +A823 A827 +FB1E +FE00 FE0F +FE20 FE23 +FFF9 FFFB +10A01 10A03 +10A05 10A06 +10A0C 10A0F +10A38 10A3A +10A3F +1D165 1D169 +1D16D 1D182 +1D185 1D18B +1D1AA 1D1AD +1D242 1D244 +E0001 +E0020 E007F +E0100 E01EF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/CR.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/CR.pl new file mode 100644 index 00000000000..b4c096404b2 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/CR.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Carriage_Return' +# +return <<'END'; +000D +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/EX.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/EX.pl new file mode 100644 index 00000000000..c459ef107a4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/EX.pl @@ -0,0 +1,25 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Exclamation' +# +return <<'END'; +0021 +003F +05C6 +060C +061B +061E 061F +066A +06D4 +0F0D 0F11 +0F14 +1944 1945 +2762 2763 +FE15 FE16 +FE56 FE57 +FF01 +FF1F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/GL.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/GL.pl new file mode 100644 index 00000000000..5ec8b1513d4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/GL.pl @@ -0,0 +1,19 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Glue' +# +return <<'END'; +00A0 +034F +035D 0362 +0F08 +0F0C +0F12 +180E +2007 +2011 +202F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/H2.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/H2.pl new file mode 100644 index 00000000000..c4b8a0a65eb --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/H2.pl @@ -0,0 +1,408 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'H2' +# +return <<'END'; +AC00 +AC1C +AC38 +AC54 +AC70 +AC8C +ACA8 +ACC4 +ACE0 +ACFC +AD18 +AD34 +AD50 +AD6C +AD88 +ADA4 +ADC0 +ADDC +ADF8 +AE14 +AE30 +AE4C +AE68 +AE84 +AEA0 +AEBC +AED8 +AEF4 +AF10 +AF2C +AF48 +AF64 +AF80 +AF9C +AFB8 +AFD4 +AFF0 +B00C +B028 +B044 +B060 +B07C +B098 +B0B4 +B0D0 +B0EC +B108 +B124 +B140 +B15C +B178 +B194 +B1B0 +B1CC +B1E8 +B204 +B220 +B23C +B258 +B274 +B290 +B2AC +B2C8 +B2E4 +B300 +B31C +B338 +B354 +B370 +B38C +B3A8 +B3C4 +B3E0 +B3FC +B418 +B434 +B450 +B46C +B488 +B4A4 +B4C0 +B4DC +B4F8 +B514 +B530 +B54C +B568 +B584 +B5A0 +B5BC +B5D8 +B5F4 +B610 +B62C +B648 +B664 +B680 +B69C +B6B8 +B6D4 +B6F0 +B70C +B728 +B744 +B760 +B77C +B798 +B7B4 +B7D0 +B7EC +B808 +B824 +B840 +B85C +B878 +B894 +B8B0 +B8CC +B8E8 +B904 +B920 +B93C +B958 +B974 +B990 +B9AC +B9C8 +B9E4 +BA00 +BA1C +BA38 +BA54 +BA70 +BA8C +BAA8 +BAC4 +BAE0 +BAFC +BB18 +BB34 +BB50 +BB6C +BB88 +BBA4 +BBC0 +BBDC +BBF8 +BC14 +BC30 +BC4C +BC68 +BC84 +BCA0 +BCBC +BCD8 +BCF4 +BD10 +BD2C +BD48 +BD64 +BD80 +BD9C +BDB8 +BDD4 +BDF0 +BE0C +BE28 +BE44 +BE60 +BE7C +BE98 +BEB4 +BED0 +BEEC +BF08 +BF24 +BF40 +BF5C +BF78 +BF94 +BFB0 +BFCC +BFE8 +C004 +C020 +C03C +C058 +C074 +C090 +C0AC +C0C8 +C0E4 +C100 +C11C +C138 +C154 +C170 +C18C +C1A8 +C1C4 +C1E0 +C1FC +C218 +C234 +C250 +C26C +C288 +C2A4 +C2C0 +C2DC +C2F8 +C314 +C330 +C34C +C368 +C384 +C3A0 +C3BC +C3D8 +C3F4 +C410 +C42C +C448 +C464 +C480 +C49C +C4B8 +C4D4 +C4F0 +C50C +C528 +C544 +C560 +C57C +C598 +C5B4 +C5D0 +C5EC +C608 +C624 +C640 +C65C +C678 +C694 +C6B0 +C6CC +C6E8 +C704 +C720 +C73C +C758 +C774 +C790 +C7AC +C7C8 +C7E4 +C800 +C81C +C838 +C854 +C870 +C88C +C8A8 +C8C4 +C8E0 +C8FC +C918 +C934 +C950 +C96C +C988 +C9A4 +C9C0 +C9DC +C9F8 +CA14 +CA30 +CA4C +CA68 +CA84 +CAA0 +CABC +CAD8 +CAF4 +CB10 +CB2C +CB48 +CB64 +CB80 +CB9C +CBB8 +CBD4 +CBF0 +CC0C +CC28 +CC44 +CC60 +CC7C +CC98 +CCB4 +CCD0 +CCEC +CD08 +CD24 +CD40 +CD5C +CD78 +CD94 +CDB0 +CDCC +CDE8 +CE04 +CE20 +CE3C +CE58 +CE74 +CE90 +CEAC +CEC8 +CEE4 +CF00 +CF1C +CF38 +CF54 +CF70 +CF8C +CFA8 +CFC4 +CFE0 +CFFC +D018 +D034 +D050 +D06C +D088 +D0A4 +D0C0 +D0DC +D0F8 +D114 +D130 +D14C +D168 +D184 +D1A0 +D1BC +D1D8 +D1F4 +D210 +D22C +D248 +D264 +D280 +D29C +D2B8 +D2D4 +D2F0 +D30C +D328 +D344 +D360 +D37C +D398 +D3B4 +D3D0 +D3EC +D408 +D424 +D440 +D45C +D478 +D494 +D4B0 +D4CC +D4E8 +D504 +D520 +D53C +D558 +D574 +D590 +D5AC +D5C8 +D5E4 +D600 +D61C +D638 +D654 +D670 +D68C +D6A8 +D6C4 +D6E0 +D6FC +D718 +D734 +D750 +D76C +D788 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/H3.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/H3.pl new file mode 100644 index 00000000000..fdb4a80a8b9 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/H3.pl @@ -0,0 +1,408 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'H3' +# +return <<'END'; +AC01 AC1B +AC1D AC37 +AC39 AC53 +AC55 AC6F +AC71 AC8B +AC8D ACA7 +ACA9 ACC3 +ACC5 ACDF +ACE1 ACFB +ACFD AD17 +AD19 AD33 +AD35 AD4F +AD51 AD6B +AD6D AD87 +AD89 ADA3 +ADA5 ADBF +ADC1 ADDB +ADDD ADF7 +ADF9 AE13 +AE15 AE2F +AE31 AE4B +AE4D AE67 +AE69 AE83 +AE85 AE9F +AEA1 AEBB +AEBD AED7 +AED9 AEF3 +AEF5 AF0F +AF11 AF2B +AF2D AF47 +AF49 AF63 +AF65 AF7F +AF81 AF9B +AF9D AFB7 +AFB9 AFD3 +AFD5 AFEF +AFF1 B00B +B00D B027 +B029 B043 +B045 B05F +B061 B07B +B07D B097 +B099 B0B3 +B0B5 B0CF +B0D1 B0EB +B0ED B107 +B109 B123 +B125 B13F +B141 B15B +B15D B177 +B179 B193 +B195 B1AF +B1B1 B1CB +B1CD B1E7 +B1E9 B203 +B205 B21F +B221 B23B +B23D B257 +B259 B273 +B275 B28F +B291 B2AB +B2AD B2C7 +B2C9 B2E3 +B2E5 B2FF +B301 B31B +B31D B337 +B339 B353 +B355 B36F +B371 B38B +B38D B3A7 +B3A9 B3C3 +B3C5 B3DF +B3E1 B3FB +B3FD B417 +B419 B433 +B435 B44F +B451 B46B +B46D B487 +B489 B4A3 +B4A5 B4BF +B4C1 B4DB +B4DD B4F7 +B4F9 B513 +B515 B52F +B531 B54B +B54D B567 +B569 B583 +B585 B59F +B5A1 B5BB +B5BD B5D7 +B5D9 B5F3 +B5F5 B60F +B611 B62B +B62D B647 +B649 B663 +B665 B67F +B681 B69B +B69D B6B7 +B6B9 B6D3 +B6D5 B6EF +B6F1 B70B +B70D B727 +B729 B743 +B745 B75F +B761 B77B +B77D B797 +B799 B7B3 +B7B5 B7CF +B7D1 B7EB +B7ED B807 +B809 B823 +B825 B83F +B841 B85B +B85D B877 +B879 B893 +B895 B8AF +B8B1 B8CB +B8CD B8E7 +B8E9 B903 +B905 B91F +B921 B93B +B93D B957 +B959 B973 +B975 B98F +B991 B9AB +B9AD B9C7 +B9C9 B9E3 +B9E5 B9FF +BA01 BA1B +BA1D BA37 +BA39 BA53 +BA55 BA6F +BA71 BA8B +BA8D BAA7 +BAA9 BAC3 +BAC5 BADF +BAE1 BAFB +BAFD BB17 +BB19 BB33 +BB35 BB4F +BB51 BB6B +BB6D BB87 +BB89 BBA3 +BBA5 BBBF +BBC1 BBDB +BBDD BBF7 +BBF9 BC13 +BC15 BC2F +BC31 BC4B +BC4D BC67 +BC69 BC83 +BC85 BC9F +BCA1 BCBB +BCBD BCD7 +BCD9 BCF3 +BCF5 BD0F +BD11 BD2B +BD2D BD47 +BD49 BD63 +BD65 BD7F +BD81 BD9B +BD9D BDB7 +BDB9 BDD3 +BDD5 BDEF +BDF1 BE0B +BE0D BE27 +BE29 BE43 +BE45 BE5F +BE61 BE7B +BE7D BE97 +BE99 BEB3 +BEB5 BECF +BED1 BEEB +BEED BF07 +BF09 BF23 +BF25 BF3F +BF41 BF5B +BF5D BF77 +BF79 BF93 +BF95 BFAF +BFB1 BFCB +BFCD BFE7 +BFE9 C003 +C005 C01F +C021 C03B +C03D C057 +C059 C073 +C075 C08F +C091 C0AB +C0AD C0C7 +C0C9 C0E3 +C0E5 C0FF +C101 C11B +C11D C137 +C139 C153 +C155 C16F +C171 C18B +C18D C1A7 +C1A9 C1C3 +C1C5 C1DF +C1E1 C1FB +C1FD C217 +C219 C233 +C235 C24F +C251 C26B +C26D C287 +C289 C2A3 +C2A5 C2BF +C2C1 C2DB +C2DD C2F7 +C2F9 C313 +C315 C32F +C331 C34B +C34D C367 +C369 C383 +C385 C39F +C3A1 C3BB +C3BD C3D7 +C3D9 C3F3 +C3F5 C40F +C411 C42B +C42D C447 +C449 C463 +C465 C47F +C481 C49B +C49D C4B7 +C4B9 C4D3 +C4D5 C4EF +C4F1 C50B +C50D C527 +C529 C543 +C545 C55F +C561 C57B +C57D C597 +C599 C5B3 +C5B5 C5CF +C5D1 C5EB +C5ED C607 +C609 C623 +C625 C63F +C641 C65B +C65D C677 +C679 C693 +C695 C6AF +C6B1 C6CB +C6CD C6E7 +C6E9 C703 +C705 C71F +C721 C73B +C73D C757 +C759 C773 +C775 C78F +C791 C7AB +C7AD C7C7 +C7C9 C7E3 +C7E5 C7FF +C801 C81B +C81D C837 +C839 C853 +C855 C86F +C871 C88B +C88D C8A7 +C8A9 C8C3 +C8C5 C8DF +C8E1 C8FB +C8FD C917 +C919 C933 +C935 C94F +C951 C96B +C96D C987 +C989 C9A3 +C9A5 C9BF +C9C1 C9DB +C9DD C9F7 +C9F9 CA13 +CA15 CA2F +CA31 CA4B +CA4D CA67 +CA69 CA83 +CA85 CA9F +CAA1 CABB +CABD CAD7 +CAD9 CAF3 +CAF5 CB0F +CB11 CB2B +CB2D CB47 +CB49 CB63 +CB65 CB7F +CB81 CB9B +CB9D CBB7 +CBB9 CBD3 +CBD5 CBEF +CBF1 CC0B +CC0D CC27 +CC29 CC43 +CC45 CC5F +CC61 CC7B +CC7D CC97 +CC99 CCB3 +CCB5 CCCF +CCD1 CCEB +CCED CD07 +CD09 CD23 +CD25 CD3F +CD41 CD5B +CD5D CD77 +CD79 CD93 +CD95 CDAF +CDB1 CDCB +CDCD CDE7 +CDE9 CE03 +CE05 CE1F +CE21 CE3B +CE3D CE57 +CE59 CE73 +CE75 CE8F +CE91 CEAB +CEAD CEC7 +CEC9 CEE3 +CEE5 CEFF +CF01 CF1B +CF1D CF37 +CF39 CF53 +CF55 CF6F +CF71 CF8B +CF8D CFA7 +CFA9 CFC3 +CFC5 CFDF +CFE1 CFFB +CFFD D017 +D019 D033 +D035 D04F +D051 D06B +D06D D087 +D089 D0A3 +D0A5 D0BF +D0C1 D0DB +D0DD D0F7 +D0F9 D113 +D115 D12F +D131 D14B +D14D D167 +D169 D183 +D185 D19F +D1A1 D1BB +D1BD D1D7 +D1D9 D1F3 +D1F5 D20F +D211 D22B +D22D D247 +D249 D263 +D265 D27F +D281 D29B +D29D D2B7 +D2B9 D2D3 +D2D5 D2EF +D2F1 D30B +D30D D327 +D329 D343 +D345 D35F +D361 D37B +D37D D397 +D399 D3B3 +D3B5 D3CF +D3D1 D3EB +D3ED D407 +D409 D423 +D425 D43F +D441 D45B +D45D D477 +D479 D493 +D495 D4AF +D4B1 D4CB +D4CD D4E7 +D4E9 D503 +D505 D51F +D521 D53B +D53D D557 +D559 D573 +D575 D58F +D591 D5AB +D5AD D5C7 +D5C9 D5E3 +D5E5 D5FF +D601 D61B +D61D D637 +D639 D653 +D655 D66F +D671 D68B +D68D D6A7 +D6A9 D6C3 +D6C5 D6DF +D6E1 D6FB +D6FD D717 +D719 D733 +D735 D74F +D751 D76B +D76D D787 +D789 D7A3 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/HY.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/HY.pl new file mode 100644 index 00000000000..321218960fc --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/HY.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Hyphen' +# +return <<'END'; +002D +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/ID.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/ID.pl new file mode 100644 index 00000000000..9e6b32e5bab --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/ID.pl @@ -0,0 +1,80 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Ideographic' +# +return <<'END'; +2E80 2E99 +2E9B 2EF3 +2F00 2FD5 +2FF0 2FFB +3000 +3003 3004 +3006 3007 +3012 3013 +3020 3029 +3030 303A +303D 303F +3042 +3044 +3046 +3048 +304A 3062 +3064 3082 +3084 +3086 +3088 308D +308F 3094 +309F +30A2 +30A4 +30A6 +30A8 +30AA 30C2 +30C4 30E2 +30E4 +30E6 +30E8 30ED +30EF 30F4 +30F7 30FA +30FF +3105 312C +3131 318E +3190 31B7 +31C0 31CF +3200 321E +3220 3243 +3250 32FE +3300 4DB5 +4E00 9FBB +A000 A014 +A016 A48C +A490 A4C6 +F900 FA2D +FA30 FA6A +FA70 FAD9 +FE30 FE34 +FE45 FE46 +FE49 FE4F +FE51 +FE58 +FE5F FE66 +FE68 +FE6B +FF02 FF03 +FF06 FF07 +FF0A FF0B +FF0D +FF0F FF19 +FF1C FF1E +FF20 FF3A +FF3C +FF3E FF5A +FF5C +FF5E +FFE2 FFE4 +20000 2A6D6 +2F800 2FA1D +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/IN.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/IN.pl new file mode 100644 index 00000000000..c13572b1169 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/IN.pl @@ -0,0 +1,11 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Inseparable' +# +return <<'END'; +2024 2026 +FE19 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/IS.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/IS.pl new file mode 100644 index 00000000000..7ce2318e40e --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/IS.pl @@ -0,0 +1,18 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Infix_Numeric' +# +return <<'END'; +002C +002E +003A 003B +037E +0589 +060D +2044 +FE10 +FE13 FE14 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/JL.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/JL.pl new file mode 100644 index 00000000000..c771ea9bd0d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/JL.pl @@ -0,0 +1,11 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'JL' +# +return <<'END'; +1100 1159 +115F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/JT.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/JT.pl new file mode 100644 index 00000000000..8697ef25a76 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/JT.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'JT' +# +return <<'END'; +11A8 11F9 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/JV.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/JV.pl new file mode 100644 index 00000000000..5d615ad6fec --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/JV.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'JV' +# +return <<'END'; +1160 11A2 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/LF.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/LF.pl new file mode 100644 index 00000000000..08bb773718d --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/LF.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Line_Feed' +# +return <<'END'; +000A +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/NL.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/NL.pl new file mode 100644 index 00000000000..c1c59b268ac --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/NL.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Next_Line' +# +return <<'END'; +0085 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/NS.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/NS.pl new file mode 100644 index 00000000000..babb9c703c7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/NS.pl @@ -0,0 +1,46 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Nonstarter' +# +return <<'END'; +17D6 17D7 +17D9 +203C +3005 +301C +303B 303C +3041 +3043 +3045 +3047 +3049 +3063 +3083 +3085 +3087 +308E +3095 3096 +309B 309E +30A0 30A1 +30A3 +30A5 +30A7 +30A9 +30C3 +30E3 +30E5 +30E7 +30EE +30F5 30F6 +30FB 30FE +31F0 31FF +A015 +FE54 FE55 +FF1A FF1B +FF65 +FF67 FF70 +FF9E FF9F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/NU.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/NU.pl new file mode 100644 index 00000000000..aa493a09add --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/NU.pl @@ -0,0 +1,32 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Numeric' +# +return <<'END'; +0030 0039 +0660 0669 +066B 066C +06F0 06F9 +0966 096F +09E6 09EF +0A66 0A6F +0AE6 0AEF +0B66 0B6F +0BE6 0BEF +0C66 0C6F +0CE6 0CEF +0D66 0D6F +0E50 0E59 +0ED0 0ED9 +0F20 0F29 +1040 1049 +17E0 17E9 +1810 1819 +1946 194F +19D0 19D9 +104A0 104A9 +1D7CE 1D7FF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/OP.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/OP.pl new file mode 100644 index 00000000000..01c0761ad8a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/OP.pl @@ -0,0 +1,76 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Open_Punctuation' +# +return <<'END'; +0028 +005B +007B +0F3A +0F3C +169B +201A +201E +2045 +207D +208D +2329 +23B4 +2768 +276A +276C +276E +2770 +2772 +2774 +27C5 +27E6 +27E8 +27EA +2983 +2985 +2987 +2989 +298B +298D +298F +2991 +2993 +2995 +2997 +29D8 +29DA +29FC +3008 +300A +300C +300E +3010 +3014 +3016 +3018 +301A +301D +FD3E +FE17 +FE35 +FE37 +FE39 +FE3B +FE3D +FE3F +FE41 +FE43 +FE47 +FE59 +FE5B +FE5D +FF08 +FF3B +FF5B +FF5F +FF62 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/PO.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/PO.pl new file mode 100644 index 00000000000..f3765ef7b61 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/PO.pl @@ -0,0 +1,21 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Postfix_Numeric' +# +return <<'END'; +0025 +00A2 +00B0 +060B +2030 2037 +20A7 +2103 +2109 +FDFC +FE6A +FF05 +FFE0 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/PR.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/PR.pl new file mode 100644 index 00000000000..65195054dd1 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/PR.pl @@ -0,0 +1,27 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Prefix_Numeric' +# +return <<'END'; +0024 +002B +005C +00A3 00A5 +00B1 +09F2 09F3 +0AF1 +0BF9 +0E3F +17DB +20A0 20A6 +20A8 20B5 +2116 +2212 2213 +FE69 +FF04 +FFE1 +FFE5 FFE6 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/QU.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/QU.pl new file mode 100644 index 00000000000..6f4386b1d24 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/QU.pl @@ -0,0 +1,21 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Quotation' +# +return <<'END'; +0022 +0027 +00AB +00BB +2018 2019 +201B 201D +201F +2039 203A +23B6 +275B 275E +2E00 2E0D +2E1C 2E1D +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/SA.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/SA.pl new file mode 100644 index 00000000000..e6308583bf4 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/SA.pl @@ -0,0 +1,34 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Complex_Context' +# +return <<'END'; +0E01 0E30 +0E32 0E33 +0E40 0E46 +0E81 0E82 +0E84 +0E87 0E88 +0E8A +0E8D +0E94 0E97 +0E99 0E9F +0EA1 0EA3 +0EA5 +0EA7 +0EAA 0EAB +0EAD 0EB0 +0EB2 0EB3 +0EBD +0EC0 0EC4 +0EC6 +0EDC 0EDD +1000 1021 +1023 1027 +1029 102A +1050 1055 +1780 17B5 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/SG.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/SG.pl new file mode 100644 index 00000000000..65be30b6844 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/SG.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Surrogate' +# +return <<'END'; +D800 DFFF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/SP.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/SP.pl new file mode 100644 index 00000000000..ae815232b92 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/SP.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Space' +# +return <<'END'; +0020 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/SY.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/SY.pl new file mode 100644 index 00000000000..ae43e49e922 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/SY.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Break_Symbols' +# +return <<'END'; +002F +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/WJ.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/WJ.pl new file mode 100644 index 00000000000..e4375785a47 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/WJ.pl @@ -0,0 +1,11 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Word_Joiner' +# +return <<'END'; +2060 +FEFF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/XX.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/XX.pl new file mode 100644 index 00000000000..552f71808a7 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/XX.pl @@ -0,0 +1,12 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'Unknown' +# +return <<'END'; +E000 F8FF +F0000 FFFFD +100000 10FFFD +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/ZW.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/ZW.pl new file mode 100644 index 00000000000..8cc1e823e24 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/lb/ZW.pl @@ -0,0 +1,10 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# Linebreak category 'ZWSpace' +# +return <<'END'; +200B +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/nt/De.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/nt/De.pl new file mode 100644 index 00000000000..af3697fc7ac --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/nt/De.pl @@ -0,0 +1,32 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# NumericType category 'Decimal' +# +return <<'END'; +0030 0039 +0660 0669 +06F0 06F9 +0966 096F +09E6 09EF +0A66 0A6F +0AE6 0AEF +0B66 0B6F +0BE6 0BEF +0C66 0C6F +0CE6 0CEF +0D66 0D6F +0E50 0E59 +0ED0 0ED9 +0F20 0F29 +1040 1049 +17E0 17E9 +1810 1819 +1946 194F +19D0 19D9 +FF10 FF19 +104A0 104A9 +1D7CE 1D7FF +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/nt/Di.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/nt/Di.pl new file mode 100644 index 00000000000..8a29b9db9c3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/nt/Di.pl @@ -0,0 +1,25 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# NumericType category 'Digit' +# +return <<'END'; +00B2 00B3 +00B9 +1369 1371 +2070 +2074 2079 +2080 2089 +2460 2468 +2474 247C +2488 2490 +24EA +24F5 24FD +24FF +2776 277E +2780 2788 +278A 2792 +10A40 10A43 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/lib/nt/Nu.pl b/Master/tlpkg/tlperl.old/lib/unicore/lib/nt/Nu.pl new file mode 100644 index 00000000000..587a3a6e113 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/lib/nt/Nu.pl @@ -0,0 +1,42 @@ +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by mktables from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +# +# NumericType category 'Numeric' +# +return <<'END'; +00BC 00BE +09F4 09F7 +09F9 +0BF0 0BF2 +0F2A 0F33 +1372 137C +16EE 16F0 +17F0 17F9 +2153 2182 +2469 2473 +247D 2487 +2491 249B +24EB 24F4 +24FE +277F +2789 +2793 +2CFD +3007 +3021 3029 +3038 303A +3192 3195 +3220 3229 +3251 325F +3280 3289 +32B1 32BF +10107 10133 +10140 10178 +1018A +10320 10323 +1034A +103D1 103D5 +10A44 10A47 +END diff --git a/Master/tlpkg/tlperl.old/lib/unicore/mktables b/Master/tlpkg/tlperl.old/lib/unicore/mktables new file mode 100644 index 00000000000..42003663849 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/mktables @@ -0,0 +1,2197 @@ +## !!!!!!!!!!!!!! IF YOU MODIFY THIS FILE !!!!!!!!!!!!!!!!!!!!!!!!! +## Any files created or read by this program should be listed in 'mktables.lst' + +#!/usr/bin/perl -w +require 5.008; # Needs pack "U". Probably safest to run on 5.8.x +use strict; +use Carp; +use File::Spec; + +## +## mktables -- create the runtime Perl Unicode files (lib/unicore/**/*.pl) +## from the Unicode database files (lib/unicore/*.txt). +## + +## "Fuzzy" means this section in Unicode TR18: +## +## The recommended names for UCD properties and property values are in +## PropertyAliases.txt [Prop] and PropertyValueAliases.txt +## [PropValue]. There are both abbreviated names and longer, more +## descriptive names. It is strongly recommended that both names be +## recognized, and that loose matching of property names be used, +## whereby the case distinctions, whitespace, hyphens, and underbar +## are ignored. + +## Base names already used in lib/gc_sc (for avoiding 8.3 conflicts) +my %BaseNames; + +## +## Process any args. +## +my $Verbose = 0; +my $MakeTestScript = 0; +my $AlwaysWrite = 0; +my $UseDir = ""; +my $FileList = "$0.lst"; +my $MakeList = 0; + +while (@ARGV) +{ + my $arg = shift @ARGV; + if ($arg eq '-v') { + $Verbose = 1; + } elsif ($arg eq '-q') { + $Verbose = 0; + } elsif ($arg eq '-w') { + $AlwaysWrite = 1; # update the files even if they havent changed + $FileList = ""; + } elsif ($arg eq '-maketest') { + $MakeTestScript = 1; + } elsif ($arg eq '-makelist') { + $MakeList = 1; + } elsif ($arg eq '-C' && defined ($UseDir = shift)) { + -d $UseDir or die "Unknown directory '$UseDir'"; + } elsif ($arg eq '-L' && defined ($FileList = shift)) { + -e $FileList or die "Filelist '$FileList' doesn't appear to exist!"; + } else { + die "usage: $0 [-v|-q|-w|-C dir|-L filelist] [-maketest] [-makelist]\n", + " -v : Verbose Mode\n", + " -q : Quiet Mode\n", + " -w : Write files regardless\n", + " -maketest : Make test script\n", + " -makelist : Rewrite the file list based on current setup\n", + " -L filelist : Use this file list, (defaults to $0)\n", + " -C dir : Change to this directory before proceding\n"; + } +} + +if ($FileList) { + print "Reading file list '$FileList'\n" + if $Verbose; + open my $fh,"<",$FileList or die "Failed to read '$FileList':$!"; + my @input; + my @output; + for my $list ( \@input, \@output ) { + while (<$fh>) { + s/^ \s+ | \s+ $//xg; + next if /^ \s* (?: \# .* )? $/x; + last if /^ =+ $/x; + my ( $file ) = split /\t/, $_; + push @$list, $file; + } + my %dupe; + @$list = grep !$dupe{ $_ }++, @$list; + } + close $fh; + die "No input or output files in '$FileList'!" + if !@input or !@output; + if ( $MakeList ) { + foreach my $file (@output) { + unlink $file; + } + } + if ( $Verbose ) { + print "Expecting ".scalar( @input )." input files. ", + "Checking ".scalar( @output )." output files.\n"; + } + # we set maxtime to be the youngest input file, including $0 itself. + my $maxtime = -M $0; # do this before the chdir! + if ($UseDir) { + chdir $UseDir or die "Failed to chdir to '$UseDir':$!"; + } + foreach my $in (@input) { + my $time = -M $in; + die "Missing input file '$in'" unless defined $time; + $maxtime = $time if $maxtime < $time; + } + + # now we check to see if any output files are older than maxtime, if + # they are we need to continue on, otherwise we can presumably bail. + my $ok = 1; + foreach my $out (@output) { + if ( ! -e $out ) { + print "'$out' is missing.\n" + if $Verbose; + $ok = 0; + last; + } + if ( -M $out > $maxtime ) { + print "'$out' is too old.\n" + if $Verbose; + $ok = 0; + last; + } + } + if ($ok) { + print "Files seem to be ok, not bothering to rebuild.\n"; + exit(0); + } + print "Must rebuild tables.\n" + if $Verbose; +} else { + if ($Verbose) { + print "Not checking filelist.\n"; + } + if ($UseDir) { + chdir $UseDir or die "Failed to chdir to '$UseDir':$!"; + } +} + +foreach my $lib ('To', 'lib', + map {File::Spec->catdir("lib",$_)} + qw(gc_sc dt bc hst ea jt lb nt ccc)) { + next if -d $lib; + mkdir $lib, 0755 or die "mkdir '$lib': $!"; +} + +my $LastUnicodeCodepoint = 0x10FFFF; # As of Unicode 3.1.1. + +my $HEADER=<<"EOF"; +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by $0 from e.g. UnicodeData.txt. +# Any changes made here will be lost! + +EOF + +sub force_unlink { + my $filename = shift; + return unless -e $filename; + return if CORE::unlink($filename); + # We might need write permission + chmod 0777, $filename; + CORE::unlink($filename) or die "Couldn't unlink $filename: $!\n"; +} + +## +## Given a filename and a reference to an array of lines, +## write the lines to the file only if the contents have not changed. +## Filename can be given as an arrayref of directory names +## +sub WriteIfChanged($\@) +{ + my $file = shift; + my $lines = shift; + + $file = File::Spec->catfile(@$file) if ref $file; + + my $TextToWrite = join '', @$lines; + if (open IN, $file) { + local($/) = undef; + my $PreviousText = <IN>; + close IN; + if ($PreviousText eq $TextToWrite) { + print "$file unchanged.\n" if $Verbose; + return unless $AlwaysWrite; + } + } + force_unlink ($file); + if (not open OUT, ">$file") { + die "$0: can't open $file for output: $!\n"; + } + print "$file written.\n" if $Verbose; + + print OUT $TextToWrite; + close OUT; +} + +## +## The main datastructure (a "Table") represents a set of code points that +## are part of a particular quality (that are part of \pL, \p{InGreek}, +## etc.). They are kept as ranges of code points (starting and ending of +## each range). +## +## For example, a range ASCII LETTERS would be represented as: +## [ [ 0x41 => 0x5A, 'UPPER' ], +## [ 0x61 => 0x7A, 'LOWER, ] ] +## +sub RANGE_START() { 0 } ## index into range element +sub RANGE_END() { 1 } ## index into range element +sub RANGE_NAME() { 2 } ## index into range element + +## Conceptually, these should really be folded into the 'Table' objects +my %TableInfo; +my %TableDesc; +my %FuzzyNames; +my %AliasInfo; +my %CanonicalToOrig; + +## +## Turn something like +## OLD-ITALIC +## into +## OldItalic +## +sub CanonicalName($) +{ + my $orig = shift; + my $name = lc $orig; + $name =~ s/(?<![a-z])(\w)/\u$1/g; + $name =~ s/[-_\s]+//g; + + $CanonicalToOrig{$name} = $orig if not $CanonicalToOrig{$name}; + return $name; +} + + +## +## Store the alias definitions for later use. +## +my %PropertyAlias; +my %PropValueAlias; + +my %PA_reverse; +my %PVA_reverse; + +sub Build_Aliases() +{ + ## + ## Most of the work with aliases doesn't occur here, + ## but rather in utf8_heavy.pl, which uses PVA.pl, + + # Placate the warnings about used only once. (They are used again, but + # via a typeglob lookup) + %utf8::PropertyAlias = (); + %utf8::PA_reverse = (); + %utf8::PropValueAlias = (); + %utf8::PVA_reverse = (); + %utf8::PVA_abbr_map = (); + + open PA, "< PropertyAliases.txt" + or confess "Can't open PropertyAliases.txt: $!"; + while (<PA>) { + s/#.*//; + s/\s+$//; + next if /^$/; + + my ($abbrev, $name) = split /\s*;\s*/; + next if $abbrev eq "n/a"; + $PropertyAlias{$abbrev} = $name; + $PA_reverse{$name} = $abbrev; + + # The %utf8::... versions use japhy's code originally from utf8_pva.pl + # However, it's moved here so that we build the tables at runtime. + tr/ _-//d for $abbrev, $name; + $utf8::PropertyAlias{lc $abbrev} = $name; + $utf8::PA_reverse{lc $name} = $abbrev; + } + close PA; + + open PVA, "< PropValueAliases.txt" + or confess "Can't open PropValueAliases.txt: $!"; + while (<PVA>) { + s/#.*//; + s/\s+$//; + next if /^$/; + + my ($prop, @data) = split /\s*;\s*/; + + if ($prop eq 'ccc') { + $PropValueAlias{$prop}{$data[1]} = [ @data[0,2] ]; + $PVA_reverse{$prop}{$data[2]} = [ @data[0,1] ]; + } + else { + next if $data[0] eq "n/a"; + $PropValueAlias{$prop}{$data[0]} = $data[1]; + $PVA_reverse{$prop}{$data[1]} = $data[0]; + } + + shift @data if $prop eq 'ccc'; + next if $data[0] eq "n/a"; + + $data[1] =~ tr/ _-//d; + $utf8::PropValueAlias{$prop}{lc $data[0]} = $data[1]; + $utf8::PVA_reverse{$prop}{lc $data[1]} = $data[0]; + + my $abbr_class = ($prop eq 'gc' or $prop eq 'sc') ? 'gc_sc' : $prop; + $utf8::PVA_abbr_map{$abbr_class}{lc $data[0]} = $data[0]; + } + close PVA; + + # backwards compatibility for L& -> LC + $utf8::PropValueAlias{gc}{'l&'} = $utf8::PropValueAlias{gc}{lc}; + $utf8::PVA_abbr_map{gc_sc}{'l&'} = $utf8::PVA_abbr_map{gc_sc}{lc}; + +} + + +## +## Associates a property ("Greek", "Lu", "Assigned",...) with a Table. +## +## Called like: +## New_Prop(In => 'Greek', $Table, Desc => 'Greek Block', Fuzzy => 1); +## +## Normally, these parameters are set when the Table is created (when the +## Table->New constructor is called), but there are times when it needs to +## be done after-the-fact...) +## +sub New_Prop($$$@) +{ + my $Type = shift; ## "Is" or "In"; + my $Name = shift; + my $Table = shift; + + ## remaining args are optional key/val + my %Args = @_; + + my $Fuzzy = delete $Args{Fuzzy}; + my $Desc = delete $Args{Desc}; # description + + $Name = CanonicalName($Name) if $Fuzzy; + + ## sanity check a few args + if (%Args or ($Type ne 'Is' and $Type ne 'In') or not ref $Table) { + confess "$0: bad args to New_Prop" + } + + if (not $TableInfo{$Type}->{$Name}) + { + $TableInfo{$Type}->{$Name} = $Table; + $TableDesc{$Type}->{$Name} = $Desc; + if ($Fuzzy) { + $FuzzyNames{$Type}->{$Name} = $Name; + } + } +} + + +## +## Creates a new Table object. +## +## Args are key/value pairs: +## In => Name -- Name of "In" property to be associated with +## Is => Name -- Name of "Is" property to be associated with +## Fuzzy => Boolean -- True if name can be accessed "fuzzily" +## Desc => String -- Description of the property +## +## No args are required. +## +sub Table::New +{ + my $class = shift; + my %Args = @_; + + my $Table = bless [], $class; + + my $Fuzzy = delete $Args{Fuzzy}; + my $Desc = delete $Args{Desc}; + + for my $Type ('Is', 'In') + { + if (my $Name = delete $Args{$Type}) { + New_Prop($Type => $Name, $Table, Desc => $Desc, Fuzzy => $Fuzzy); + } + } + + ## shouldn't have any left over + if (%Args) { + confess "$0: bad args to Table->New" + } + + return $Table; +} + + +## +## Returns the maximum code point currently in the table. +## +sub Table::Max +{ + my $last = $_[0]->[-1]; ## last code point + confess "oops" unless $last; ## must have code points to have a max + return $last->[RANGE_END]; +} + +## +## Replaces the codepoints in the Table with those in the Table given +## as an arg. (NOTE: this is not a "deep copy"). +## +sub Table::Replace($$) +{ + my $Table = shift; #self + my $New = shift; + + @$Table = @$New; +} + +## +## Given a new code point, make the last range of the Table extend to +## include the new (and all intervening) code points. +## +## Takes the time to make sure that the extension is valid. +## +sub Table::Extend +{ + my $Table = shift; #self + my $codepoint = shift; + + my $PrevMax = $Table->Max; + + confess "oops ($codepoint <= $PrevMax)" if $codepoint <= $PrevMax; + + $Table->ExtendNoCheck($codepoint); +} + + +## +## Given a new code point, make the last range of the Table extend to +## include the new (and all intervening) code points. +## +## Does NOT check that the extension is valid. Assumes that the caller +## has already made this check. +## +sub Table::ExtendNoCheck +{ + ## Optmized adding: Assumes $Table and $codepoint as parms + $_[0]->[-1]->[RANGE_END] = $_[1]; +} + +## +## Given a code point range start and end (and optional name), blindly +## append them to the list of ranges for the Table. +## +## NOTE: Code points must be added in strictly ascending numeric order. +## +sub Table::RawAppendRange +{ + my $Table = shift; #self + my $start = shift; + my $end = shift; + my $name = shift; + $name = "" if not defined $name; ## warning: $name can be "0" + + push @$Table, [ $start, # RANGE_START + $end, # RANGE_END + $name ]; # RANGE_NAME +} + +## +## Given a code point (and optional name), add it to the Table. +## +## NOTE: Code points must be added in strictly ascending numeric order. +## +sub Table::Append +{ + my $Table = shift; #self + my $codepoint = shift; + my $name = shift; + $name = "" if not defined $name; ## warning: $name can be "0" + + ## + ## If we've already got a range working, and this code point is the next + ## one in line, and if the name is the same, just extend the current range. + ## + my $last = $Table->[-1]; + if ($last + and + $last->[RANGE_END] == $codepoint - 1 + and + $last->[RANGE_NAME] eq $name) + { + $Table->ExtendNoCheck($codepoint); + } + else + { + $Table->RawAppendRange($codepoint, $codepoint, $name); + } +} + +## +## Given a code point range starting value and ending value (and name), +## Add the range to teh Table. +## +## NOTE: Code points must be added in strictly ascending numeric order. +## +sub Table::AppendRange +{ + my $Table = shift; #self + my $start = shift; + my $end = shift; + my $name = shift; + $name = "" if not defined $name; ## warning: $name can be "0" + + $Table->Append($start, $name); + $Table->Extend($end) if $end > $start; +} + +## +## Return a new Table that represents all code points not in the Table. +## +sub Table::Invert +{ + my $Table = shift; #self + + my $New = Table->New(); + my $max = -1; + for my $range (@$Table) + { + my $start = $range->[RANGE_START]; + my $end = $range->[RANGE_END]; + if ($start-1 >= $max+1) { + $New->AppendRange($max+1, $start-1, ""); + } + $max = $end; + } + if ($max+1 < $LastUnicodeCodepoint) { + $New->AppendRange($max+1, $LastUnicodeCodepoint); + } + return $New; +} + +## +## Merges any number of other tables with $self, returning the new table. +## (existing tables are not modified) +## +## +## Args may be Tables, or individual code points (as integers). +## +## Can be called as either a constructor or a method. +## +sub Table::Merge +{ + shift(@_) if not ref $_[0]; ## if called as a constructor, lose the class + my @Tables = @_; + + ## Accumulate all records from all tables + my @Records; + for my $Arg (@Tables) + { + if (ref $Arg) { + ## arg is a table -- get its ranges + push @Records, @$Arg; + } else { + ## arg is a codepoint, make a range + push @Records, [ $Arg, $Arg ] + } + } + + ## sort by range start, with longer ranges coming first. + my ($first, @Rest) = sort { + ($a->[RANGE_START] <=> $b->[RANGE_START]) + or + ($b->[RANGE_END] <=> $b->[RANGE_END]) + } @Records; + + my $New = Table->New(); + + ## Ensuring the first range is there makes the subsequent loop easier + $New->AppendRange($first->[RANGE_START], + $first->[RANGE_END]); + + ## Fold in records so long as they add new information. + for my $set (@Rest) + { + my $start = $set->[RANGE_START]; + my $end = $set->[RANGE_END]; + if ($start > $New->Max) { + $New->AppendRange($start, $end); + } elsif ($end > $New->Max) { + $New->ExtendNoCheck($end); + } + } + + return $New; +} + +## +## Given a filename, write a representation of the Table to a file. +## May have an optional comment as a 2nd arg. +## Filename may actually be an arrayref of directories +## +sub Table::Write +{ + my $Table = shift; #self + my $filename = shift; + my $comment = shift; + + my @OUT = $HEADER; + if (defined $comment) { + $comment =~ s/\s+\Z//; + $comment =~ s/^/# /gm; + push @OUT, "#\n$comment\n#\n"; + } + push @OUT, "return <<'END';\n"; + + for my $set (@$Table) + { + my $start = $set->[RANGE_START]; + my $end = $set->[RANGE_END]; + my $name = $set->[RANGE_NAME]; + + if ($start == $end) { + push @OUT, sprintf "%04X\t\t%s\n", $start, $name; + } else { + push @OUT, sprintf "%04X\t%04X\t%s\n", $start, $end, $name; + } + } + + push @OUT, "END\n"; + + WriteIfChanged($filename, @OUT); +} + +## This used only for making the test script. +## helper function +sub IsUsable($) +{ + my $code = shift; + return 0 if $code <= 0x0000; ## don't use null + return 0 if $code >= $LastUnicodeCodepoint; ## keep in range + return 0 if ($code >= 0xD800 and $code <= 0xDFFF); ## no surrogates + return 0 if ($code >= 0xFDD0 and $code <= 0xFDEF); ## utf8.c says no good + return 0 if (($code & 0xFFFF) == 0xFFFE); ## utf8.c says no good + return 0 if (($code & 0xFFFF) == 0xFFFF); ## utf8.c says no good + return 1; +} + +## Return a code point that's part of the table. +## Returns nothing if the table is empty (or covers only surrogates). +## This used only for making the test script. +sub Table::ValidCode +{ + my $Table = shift; #self + for my $set (@$Table) { + return $set->[RANGE_END] if IsUsable($set->[RANGE_END]); + } + return (); +} + +## Return a code point that's not part of the table +## Returns nothing if the table covers all code points. +## This used only for making the test script. +sub Table::InvalidCode +{ + my $Table = shift; #self + + return 0x1234 if not @$Table; + + for my $set (@$Table) + { + if (IsUsable($set->[RANGE_END] + 1)) + { + return $set->[RANGE_END] + 1; + } + + if (IsUsable($set->[RANGE_START] - 1)) + { + return $set->[RANGE_START] - 1; + } + } + return (); +} + +########################################################################### +########################################################################### +########################################################################### + + +## +## Called like: +## New_Alias(Is => 'All', SameAs => 'Any', Fuzzy => 1); +## +## The args must be in that order, although the Fuzzy pair may be omitted. +## +## This creates 'IsAll' as an alias for 'IsAny' +## +sub New_Alias($$$@) +{ + my $Type = shift; ## "Is" or "In" + my $Alias = shift; + my $SameAs = shift; # expecting "SameAs" -- just ignored + my $Name = shift; + + ## remaining args are optional key/val + my %Args = @_; + + my $Fuzzy = delete $Args{Fuzzy}; + + ## sanity check a few args + if (%Args or ($Type ne 'Is' and $Type ne 'In') or $SameAs ne 'SameAs') { + confess "$0: bad args to New_Alias" + } + + $Alias = CanonicalName($Alias) if $Fuzzy; + + if (not $TableInfo{$Type}->{$Name}) + { + my $CName = CanonicalName($Name); + if ($TableInfo{$Type}->{$CName}) { + confess "$0: Use canonical form '$CName' instead of '$Name' for alias."; + } else { + confess "$0: don't have original $Type => $Name to make alias\n"; + } + } + if ($TableInfo{$Alias}) { + confess "$0: already have original $Type => $Alias; can't make alias"; + } + $AliasInfo{$Type}->{$Name} = $Alias; + if ($Fuzzy) { + $FuzzyNames{$Type}->{$Alias} = $Name; + } + +} + + +## All assigned code points +my $Assigned = Table->New(Is => 'Assigned', + Desc => "All assigned code points", + Fuzzy => 0); + +my $Name = Table->New(); ## all characters, individually by name +my $General = Table->New(); ## all characters, grouped by category +my %General; +my %Cat; + +## Simple Data::Dumper alike. Good enough for our needs. We can't use the real +## thing as we have to run under miniperl +sub simple_dumper { + my @lines; + my $item; + foreach $item (@_) { + if (ref $item) { + if (ref $item eq 'ARRAY') { + push @lines, "[\n", simple_dumper (@$item), "],\n"; + } elsif (ref $item eq 'HASH') { + push @lines, "{\n", simple_dumper (%$item), "},\n"; + } else { + die "Can't cope with $item"; + } + } else { + if (defined $item) { + my $copy = $item; + $copy =~ s/([\'\\])/\\$1/gs; + push @lines, "'$copy',\n"; + } else { + push @lines, "undef,\n"; + } + } + } + @lines; +} + +## +## Process UnicodeData.txt (Categories, etc.) +## +sub UnicodeData_Txt() +{ + my $Bidi = Table->New(); + my $Deco = Table->New(); + my $Comb = Table->New(); + my $Number = Table->New(); + my $Mirrored = Table->New();#Is => 'Mirrored', + #Desc => "Mirrored in bidirectional text", + #Fuzzy => 0); + + my %DC; + my %Bidi; + my %Number; + $DC{can} = Table->New(); + $DC{com} = Table->New(); + + ## Initialize Perl-generated categories + ## (Categories from UnicodeData.txt are auto-initialized in gencat) + $Cat{Alnum} = + Table->New(Is => 'Alnum', Desc => "[[:Alnum:]]", Fuzzy => 0); + $Cat{Alpha} = + Table->New(Is => 'Alpha', Desc => "[[:Alpha:]]", Fuzzy => 0); + $Cat{ASCII} = + Table->New(Is => 'ASCII', Desc => "[[:ASCII:]]", Fuzzy => 0); + $Cat{Blank} = + Table->New(Is => 'Blank', Desc => "[[:Blank:]]", Fuzzy => 0); + $Cat{Cntrl} = + Table->New(Is => 'Cntrl', Desc => "[[:Cntrl:]]", Fuzzy => 0); + $Cat{Digit} = + Table->New(Is => 'Digit', Desc => "[[:Digit:]]", Fuzzy => 0); + $Cat{Graph} = + Table->New(Is => 'Graph', Desc => "[[:Graph:]]", Fuzzy => 0); + $Cat{Lower} = + Table->New(Is => 'Lower', Desc => "[[:Lower:]]", Fuzzy => 0); + $Cat{Print} = + Table->New(Is => 'Print', Desc => "[[:Print:]]", Fuzzy => 0); + $Cat{Punct} = + Table->New(Is => 'Punct', Desc => "[[:Punct:]]", Fuzzy => 0); + $Cat{Space} = + Table->New(Is => 'Space', Desc => "[[:Space:]]", Fuzzy => 0); + $Cat{Title} = + Table->New(Is => 'Title', Desc => "[[:Title:]]", Fuzzy => 0); + $Cat{Upper} = + Table->New(Is => 'Upper', Desc => "[[:Upper:]]", Fuzzy => 0); + $Cat{XDigit} = + Table->New(Is => 'XDigit', Desc => "[[:XDigit:]]", Fuzzy => 0); + $Cat{Word} = + Table->New(Is => 'Word', Desc => "[[:Word:]]", Fuzzy => 0); + $Cat{SpacePerl} = + Table->New(Is => 'SpacePerl', Desc => '\s', Fuzzy => 0); + + my %To; + $To{Upper} = Table->New(); + $To{Lower} = Table->New(); + $To{Title} = Table->New(); + $To{Digit} = Table->New(); + + sub gencat($$$$) + { + my ($name, ## Name ("LATIN CAPITAL LETTER A") + $cat, ## Category ("Lu", "Zp", "Nd", etc.) + $code, ## Code point (as an integer) + $op) = @_; + + my $MajorCat = substr($cat, 0, 1); ## L, M, Z, S, etc + + $Assigned->$op($code); + $Name->$op($code, $name); + $General->$op($code, $cat); + + ## add to the sub category (e.g. "Lu", "Nd", "Cf", ..) + $Cat{$cat} ||= Table->New(Is => $cat, + Desc => "General Category '$cat'", + Fuzzy => 0); + $Cat{$cat}->$op($code); + + ## add to the major category (e.g. "L", "N", "C", ...) + $Cat{$MajorCat} ||= Table->New(Is => $MajorCat, + Desc => "Major Category '$MajorCat'", + Fuzzy => 0); + $Cat{$MajorCat}->$op($code); + + ($General{$name} ||= Table->New)->$op($code, $name); + + # 005F: SPACING UNDERSCORE + $Cat{Word}->$op($code) if $cat =~ /^[LMN]|Pc/; + $Cat{Alnum}->$op($code) if $cat =~ /^[LM]|Nd/; + $Cat{Alpha}->$op($code) if $cat =~ /^[LM]/; + + my $isspace = + ($cat =~ /Zs|Zl|Zp/ && + $code != 0x200B) # 200B is ZWSP which is for line break control + # and therefore it is not part of "space" even while it is "Zs". + || $code == 0x0009 # 0009: HORIZONTAL TAB + || $code == 0x000A # 000A: LINE FEED + || $code == 0x000B # 000B: VERTICAL TAB + || $code == 0x000C # 000C: FORM FEED + || $code == 0x000D # 000D: CARRIAGE RETURN + || $code == 0x0085 # 0085: NEL + + ; + + $Cat{Space}->$op($code) if $isspace; + + $Cat{SpacePerl}->$op($code) if $isspace + && $code != 0x000B; # Backward compat. + + $Cat{Blank}->$op($code) if $isspace + && !($code == 0x000A || + $code == 0x000B || + $code == 0x000C || + $code == 0x000D || + $code == 0x0085 || + $cat =~ /^Z[lp]/); + + $Cat{Digit}->$op($code) if $cat eq "Nd"; + $Cat{Upper}->$op($code) if $cat eq "Lu"; + $Cat{Lower}->$op($code) if $cat eq "Ll"; + $Cat{Title}->$op($code) if $cat eq "Lt"; + $Cat{ASCII}->$op($code) if $code <= 0x007F; + $Cat{Cntrl}->$op($code) if $cat =~ /^C/; + my $isgraph = !$isspace && $cat !~ /Cc|Cs|Cn/; + $Cat{Graph}->$op($code) if $isgraph; + $Cat{Print}->$op($code) if $isgraph || $isspace; + $Cat{Punct}->$op($code) if $cat =~ /^P/; + + $Cat{XDigit}->$op($code) if ($code >= 0x30 && $code <= 0x39) ## 0..9 + || ($code >= 0x41 && $code <= 0x46) ## A..F + || ($code >= 0x61 && $code <= 0x66); ## a..f + } + + ## open ane read file..... + if (not open IN, "UnicodeData.txt") { + die "$0: UnicodeData.txt: $!\n"; + } + + ## + ## For building \p{_CombAbove} and \p{_CanonDCIJ} + ## + my %_Above_HexCodes; ## Hexcodes for chars with $comb == 230 ("ABOVE") + + my %CodeToDeco; ## Maps code to decomp. list for chars with first + ## decomp. char an "i" or "j" (for \p{_CanonDCIJ}) + + ## This is filled in as we go.... + my $CombAbove = Table->New(Is => '_CombAbove', + Desc => '(for internal casefolding use)', + Fuzzy => 0); + + while (<IN>) + { + next unless /^[0-9A-Fa-f]+;/; + s/\s+$//; + + my ($hexcode, ## code point in hex (e.g. "0041") + $name, ## character name (e.g. "LATIN CAPITAL LETTER A") + $cat, ## category (e.g. "Lu") + $comb, ## Canonical combining class (e.t. "230") + $bidi, ## directional category (e.g. "L") + $deco, ## decomposition mapping + $decimal, ## decimal digit value + $digit, ## digit value + $number, ## numeric value + $mirrored, ## mirrored + $unicode10, ## name in Unicode 1.0 + $comment, ## comment field + $upper, ## uppercase mapping + $lower, ## lowercase mapping + $title, ## titlecase mapping + ) = split(/\s*;\s*/); + + # Note that in Unicode 3.2 there will be names like + # LINE FEED (LF), which probably means that \N{} needs + # to cope also with LINE FEED and LF. + $name = $unicode10 if $name eq '<control>' && $unicode10 ne ''; + + my $code = hex($hexcode); + + if ($comb and $comb == 230) { + $CombAbove->Append($code); + $_Above_HexCodes{$hexcode} = 1; + } + + ## Used in building \p{_CanonDCIJ} + if ($deco and $deco =~ m/^006[9A]\b/) { + $CodeToDeco{$code} = $deco; + } + + ## + ## There are a few pairs of lines like: + ## AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;; + ## D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;; + ## that define ranges. + ## + if ($name =~ /^<(.+), (First|Last)>$/) + { + $name = $1; + gencat($name, $cat, $code, $2 eq 'First' ? 'Append' : 'Extend'); + #New_Prop(In => $name, $General{$name}, Fuzzy => 1); + } + else + { + ## normal (single-character) lines + gencat($name, $cat, $code, 'Append'); + + # No Append() here since since several codes may map into one. + $To{Upper}->RawAppendRange($code, $code, $upper) if $upper; + $To{Lower}->RawAppendRange($code, $code, $lower) if $lower; + $To{Title}->RawAppendRange($code, $code, $title) if $title; + $To{Digit}->Append($code, $decimal) if length $decimal; + + $Bidi->Append($code, $bidi); + $Comb->Append($code, $comb) if $comb; + $Number->Append($code, $number) if length $number; + + length($decimal) and ($Number{De} ||= Table->New())->Append($code) + or + length($digit) and ($Number{Di} ||= Table->New())->Append($code) + or + length($number) and ($Number{Nu} ||= Table->New())->Append($code); + + $Mirrored->Append($code) if $mirrored eq "Y"; + + $Bidi{$bidi} ||= Table->New();#Is => "bt/$bidi", + #Desc => "Bi-directional category '$bidi'", + #Fuzzy => 0); + $Bidi{$bidi}->Append($code); + + if ($deco) + { + $Deco->Append($code, $deco); + if ($deco =~/^<(\w+)>/) + { + my $dshort = $PVA_reverse{dt}{ucfirst lc $1}; + $DC{com}->Append($code); + + $DC{$dshort} ||= Table->New(); + $DC{$dshort}->Append($code); + } + else + { + $DC{can}->Append($code); + } + } + } + } + close IN; + + ## + ## Tidy up a few special cases.... + ## + + $Cat{Cn} = $Assigned->Invert; ## Cn is everything that doesn't exist + New_Prop(Is => 'Cn', + $Cat{Cn}, + Desc => "General Category 'Cn' [not functional in Perl]", + Fuzzy => 0); + + ## Unassigned is the same as 'Cn' + New_Alias(Is => 'Unassigned', SameAs => 'Cn', Fuzzy => 0); + + $Cat{C}->Replace($Cat{C}->Merge($Cat{Cn})); ## Now merge in Cn into C + + + # LC is Ll, Lu, and Lt. + # (used to be L& or L_, but PropValueAliases.txt defines it as LC) + New_Prop(Is => 'LC', + Table->Merge(@Cat{qw[Ll Lu Lt]}), + Desc => '[\p{Ll}\p{Lu}\p{Lt}]', + Fuzzy => 0); + + ## Any and All are all code points. + my $Any = Table->New(Is => 'Any', + Desc => sprintf("[\\x{0000}-\\x{%X}]", + $LastUnicodeCodepoint), + Fuzzy => 0); + $Any->RawAppendRange(0, $LastUnicodeCodepoint); + + New_Alias(Is => 'All', SameAs => 'Any', Fuzzy => 0); + + ## + ## Build special properties for Perl's internal case-folding needs: + ## \p{_CaseIgnorable} + ## \p{_CanonDCIJ} + ## \p{_CombAbove} + ## _CombAbove was built above. Others are built here.... + ## + + ## \p{_CaseIgnorable} is [\p{Mn}\0x00AD\x2010] + New_Prop(Is => '_CaseIgnorable', + Table->Merge($Cat{Mn}, + 0x00AD, #SOFT HYPHEN + 0x2010), #HYPHEN + Desc => '(for internal casefolding use)', + Fuzzy => 0); + + + ## \p{_CanonDCIJ} is fairly complex... + my $CanonCDIJ = Table->New(Is => '_CanonDCIJ', + Desc => '(for internal casefolding use)', + Fuzzy => 0); + ## It contains the ASCII 'i' and 'j'.... + $CanonCDIJ->Append(0x0069); # ASCII ord("i") + $CanonCDIJ->Append(0x006A); # ASCII ord("j") + ## ...and any character with a decomposition that starts with either of + ## those code points, but only if the decomposition does not have any + ## combining character with the "ABOVE" canonical combining class. + for my $code (sort { $a <=> $b} keys %CodeToDeco) + { + ## Need to ensure that all decomposition characters do not have + ## a %HexCodeToComb in %AboveCombClasses. + my $want = 1; + for my $deco_hexcode (split / /, $CodeToDeco{$code}) + { + if (exists $_Above_HexCodes{$deco_hexcode}) { + ## one of the decmposition chars has an ABOVE combination + ## class, so we're not interested in this one + $want = 0; + last; + } + } + if ($want) { + $CanonCDIJ->Append($code); + } + } + + + + ## + ## Now dump the files. + ## + $Name->Write("Name.pl"); + + { + my @PVA = $HEADER; + foreach my $name (qw (PropertyAlias PA_reverse PropValueAlias + PVA_reverse PVA_abbr_map)) { + # Should I really jump through typeglob hoops just to avoid a + # symbolic reference? (%{"utf8::$name}) + push @PVA, "\n", "\%utf8::$name = (\n", + simple_dumper (%{$utf8::{$name}}), ");\n"; + } + push @PVA, "1;\n"; + WriteIfChanged("PVA.pl", @PVA); + } + + # $Bidi->Write("Bidirectional.pl"); + for (keys %Bidi) { + $Bidi{$_}->Write( + ["lib","bc","$_.pl"], + "BidiClass category '$PropValueAlias{bc}{$_}'" + ); + } + + $Comb->Write("CombiningClass.pl"); + for (keys %{ $PropValueAlias{ccc} }) { + my ($code, $name) = @{ $PropValueAlias{ccc}{$_} }; + (my $c = Table->New())->Append($code); + $c->Write( + ["lib","ccc","$_.pl"], + "CombiningClass category '$name'" + ); + } + + $Deco->Write("Decomposition.pl"); + for (keys %DC) { + $DC{$_}->Write( + ["lib","dt","$_.pl"], + "DecompositionType category '$PropValueAlias{dt}{$_}'" + ); + } + + # $Number->Write("Number.pl"); + for (keys %Number) { + $Number{$_}->Write( + ["lib","nt","$_.pl"], + "NumericType category '$PropValueAlias{nt}{$_}'" + ); + } + + # $General->Write("Category.pl"); + + for my $to (sort keys %To) { + $To{$to}->Write(["To","$to.pl"]); + } + + for (keys %{ $PropValueAlias{gc} }) { + New_Alias(Is => $PropValueAlias{gc}{$_}, SameAs => $_, Fuzzy => 1); + } +} + +## +## Process LineBreak.txt +## +sub LineBreak_Txt() +{ + if (not open IN, "LineBreak.txt") { + die "$0: LineBreak.txt: $!\n"; + } + + my $Lbrk = Table->New(); + my %Lbrk; + + while (<IN>) + { + next unless /^([0-9A-Fa-f]+)(?:\.\.([0-9A-Fa-f]+))?\s*;\s*(\w+)/; + + my ($first, $last, $lbrk) = (hex($1), hex($2||""), $3); + + $Lbrk->Append($first, $lbrk); + + $Lbrk{$lbrk} ||= Table->New(); + $Lbrk{$lbrk}->Append($first); + + if ($last) { + $Lbrk->Extend($last); + $Lbrk{$lbrk}->Extend($last); + } + } + close IN; + + # $Lbrk->Write("Lbrk.pl"); + + + for (keys %Lbrk) { + $Lbrk{$_}->Write( + ["lib","lb","$_.pl"], + "Linebreak category '$PropValueAlias{lb}{$_}'" + ); + } +} + +## +## Process ArabicShaping.txt. +## +sub ArabicShaping_txt() +{ + if (not open IN, "ArabicShaping.txt") { + die "$0: ArabicShaping.txt: $!\n"; + } + + my $ArabLink = Table->New(); + my $ArabLinkGroup = Table->New(); + + my %JoinType; + + while (<IN>) + { + next unless /^[0-9A-Fa-f]+;/; + s/\s+$//; + + my ($hexcode, $name, $link, $linkgroup) = split(/\s*;\s*/); + my $code = hex($hexcode); + $ArabLink->Append($code, $link); + $ArabLinkGroup->Append($code, $linkgroup); + + $JoinType{$link} ||= Table->New(Is => "JoinType$link"); + $JoinType{$link}->Append($code); + } + close IN; + + # $ArabLink->Write("ArabLink.pl"); + # $ArabLinkGroup->Write("ArabLnkGrp.pl"); + + + for (keys %JoinType) { + $JoinType{$_}->Write( + ["lib","jt","$_.pl"], + "JoiningType category '$PropValueAlias{jt}{$_}'" + ); + } +} + +## +## Process EastAsianWidth.txt. +## +sub EastAsianWidth_txt() +{ + if (not open IN, "EastAsianWidth.txt") { + die "$0: EastAsianWidth.txt: $!\n"; + } + + my %EAW; + + while (<IN>) + { + next unless /^[0-9A-Fa-f]+(\.\.[0-9A-Fa-f]+)?;/; + s/#.*//; + s/\s+$//; + + my ($hexcodes, $pv) = split(/\s*;\s*/); + $EAW{$pv} ||= Table->New(Is => "EastAsianWidth$pv"); + my ($start, $end) = split(/\.\./, $hexcodes); + if (defined $end) { + $EAW{$pv}->AppendRange(hex($start), hex($end)); + } else { + $EAW{$pv}->Append(hex($start)); + } + } + close IN; + + + for (keys %EAW) { + $EAW{$_}->Write( + ["lib","ea","$_.pl"], + "EastAsianWidth category '$PropValueAlias{ea}{$_}'" + ); + } +} + +## +## Process HangulSyllableType.txt. +## +sub HangulSyllableType_txt() +{ + if (not open IN, "HangulSyllableType.txt") { + die "$0: HangulSyllableType.txt: $!\n"; + } + + my %HST; + + while (<IN>) + { + next unless /^([0-9A-Fa-f]+)(?:\.\.([0-9A-Fa-f]+))?\s*;\s*(\w+)/; + my ($first, $last, $pv) = (hex($1), hex($2||""), $3); + + $HST{$pv} ||= Table->New(Is => "HangulSyllableType$pv"); + $HST{$pv}->Append($first); + + if ($last) { $HST{$pv}->Extend($last) } + } + close IN; + + for (keys %HST) { + $HST{$_}->Write( + ["lib","hst","$_.pl"], + "HangulSyllableType category '$PropValueAlias{hst}{$_}'" + ); + } +} + +## +## Process Jamo.txt. +## +sub Jamo_txt() +{ + if (not open IN, "Jamo.txt") { + die "$0: Jamo.txt: $!\n"; + } + my $Short = Table->New(); + + while (<IN>) + { + next unless /^([0-9A-Fa-f]+)\s*;\s*(\w*)/; + my ($code, $short) = (hex($1), $2); + + $Short->Append($code, $short); + } + close IN; + # $Short->Write("JamoShort.pl"); +} + +## +## Process Scripts.txt. +## +sub Scripts_txt() +{ + my @ScriptInfo; + + if (not open(IN, "Scripts.txt")) { + die "$0: Scripts.txt: $!\n"; + } + while (<IN>) { + next unless /^([0-9A-Fa-f]+)(?:\.\.([0-9A-Fa-f]+))?\s*;\s*(.+?)\s*\#/; + + # Wait until all the scripts have been read since + # they are not listed in numeric order. + push @ScriptInfo, [ hex($1), hex($2||""), $3 ]; + } + close IN; + + # Now append the scripts properties in their code point order. + + my %Script; + my $Scripts = Table->New(); + + for my $script (sort { $a->[0] <=> $b->[0] } @ScriptInfo) + { + my ($first, $last, $name) = @$script; + $Scripts->Append($first, $name); + + $Script{$name} ||= Table->New(Is => $name, + Desc => "Script '$name'", + Fuzzy => 1); + $Script{$name}->Append($first, $name); + + if ($last) { + $Scripts->Extend($last); + $Script{$name}->Extend($last); + } + } + + # $Scripts->Write("Scripts.pl"); + + ## Common is everything not explicitly assigned to a Script + ## + ## ***shouldn't this be intersected with \p{Assigned}? ****** + ## + New_Prop(Is => 'Common', + $Scripts->Invert, + Desc => 'Pseudo-Script of codepoints not in other Unicode scripts', + Fuzzy => 1); +} + +## +## Given a name like "Close Punctuation", return a regex (that when applied +## with /i) matches any valid form of that name (e.g. "ClosePunctuation", +## "Close-Punctuation", etc.) +## +## Accept any space, dash, or underbar where in the official name there is +## space or a dash (or underbar, but there never is). +## +## +sub NameToRegex($) +{ + my $Name = shift; + $Name =~ s/[- _]/(?:[-_]|\\s+)?/g; + return $Name; +} + +## +## Process Blocks.txt. +## +sub Blocks_txt() +{ + my $Blocks = Table->New(); + my %Blocks; + + if (not open IN, "Blocks.txt") { + die "$0: Blocks.txt: $!\n"; + } + + while (<IN>) + { + #next if not /Private Use$/; + next if not /^([0-9A-Fa-f]+)\.\.([0-9A-Fa-f]+)\s*;\s*(.+?)\s*$/; + + my ($first, $last, $name) = (hex($1), hex($2), $3); + + $Blocks->Append($first, $name); + + $Blocks{$name} ||= Table->New(In => $name, + Desc => "Block '$name'", + Fuzzy => 1); + $Blocks{$name}->Append($first, $name); + + if ($last and $last != $first) { + $Blocks->Extend($last); + $Blocks{$name}->Extend($last); + } + } + close IN; + + # $Blocks->Write("Blocks.pl"); +} + +## +## Read in the PropList.txt. It contains extended properties not +## listed in the UnicodeData.txt, such as 'Other_Alphabetic': +## alphabetic but not of the general category L; many modifiers +## belong to this extended property category: while they are not +## alphabets, they are alphabetic in nature. +## +sub PropList_txt() +{ + my @PropInfo; + + if (not open IN, "PropList.txt") { + die "$0: PropList.txt: $!\n"; + } + + while (<IN>) + { + next unless /^([0-9A-Fa-f]+)(?:\.\.([0-9A-Fa-f]+))?\s*;\s*(.+?)\s*\#/; + + # Wait until all the extended properties have been read since + # they are not listed in numeric order. + push @PropInfo, [ hex($1), hex($2||""), $3 ]; + } + close IN; + + # Now append the extended properties in their code point order. + my $Props = Table->New(); + my %Prop; + + for my $prop (sort { $a->[0] <=> $b->[0] } @PropInfo) + { + my ($first, $last, $name) = @$prop; + $Props->Append($first, $name); + + $Prop{$name} ||= Table->New(Is => $name, + Desc => "Extended property '$name'", + Fuzzy => 1); + $Prop{$name}->Append($first, $name); + + if ($last) { + $Props->Extend($last); + $Prop{$name}->Extend($last); + } + } + + for (keys %Prop) { + (my $file = $PA_reverse{$_}) =~ tr/_//d; + # XXX I'm assuming that the names from %Prop don't suffer 8.3 clashes. + $BaseNames{lc $file}++; + $Prop{$_}->Write( + ["lib","gc_sc","$file.pl"], + "Binary property '$_'" + ); + } + + # Alphabetic is L and Other_Alphabetic. + New_Prop(Is => 'Alphabetic', + Table->Merge($Cat{L}, $Prop{Other_Alphabetic}), + Desc => '[\p{L}\p{OtherAlphabetic}]', # use canonical names here + Fuzzy => 1); + + # Lowercase is Ll and Other_Lowercase. + New_Prop(Is => 'Lowercase', + Table->Merge($Cat{Ll}, $Prop{Other_Lowercase}), + Desc => '[\p{Ll}\p{OtherLowercase}]', # use canonical names here + Fuzzy => 1); + + # Uppercase is Lu and Other_Uppercase. + New_Prop(Is => 'Uppercase', + Table->Merge($Cat{Lu}, $Prop{Other_Uppercase}), + Desc => '[\p{Lu}\p{Other_Uppercase}]', # use canonical names here + Fuzzy => 1); + + # Math is Sm and Other_Math. + New_Prop(Is => 'Math', + Table->Merge($Cat{Sm}, $Prop{Other_Math}), + Desc => '[\p{Sm}\p{OtherMath}]', # use canonical names here + Fuzzy => 1); + + # ID_Start is Ll, Lu, Lt, Lm, Lo, and Nl. + New_Prop(Is => 'ID_Start', + Table->Merge(@Cat{qw[Ll Lu Lt Lm Lo Nl]}), + Desc => '[\p{Ll}\p{Lu}\p{Lt}\p{Lm}\p{Lo}\p{Nl}]', + Fuzzy => 1); + + # ID_Continue is ID_Start, Mn, Mc, Nd, and Pc. + New_Prop(Is => 'ID_Continue', + Table->Merge(@Cat{qw[Ll Lu Lt Lm Lo Nl Mn Mc Nd Pc ]}), + Desc => '[\p{ID_Start}\p{Mn}\p{Mc}\p{Nd}\p{Pc}]', + Fuzzy => 1); +} + + +## +## These are used in: +## MakePropTestScript() +## WriteAllMappings() +## for making the test script. +## +my %FuzzyNameToTest; +my %ExactNameToTest; + + +## This used only for making the test script +sub GenTests($$$$) +{ + my $FH = shift; + my $Prop = shift; + my $MatchCode = shift; + my $FailCode = shift; + + if (defined $MatchCode) { + printf $FH qq/Expect(1, "\\x{%04X}", '\\p{$Prop}' );\n/, $MatchCode; + printf $FH qq/Expect(0, "\\x{%04X}", '\\p{^$Prop}');\n/, $MatchCode; + printf $FH qq/Expect(0, "\\x{%04X}", '\\P{$Prop}' );\n/, $MatchCode; + printf $FH qq/Expect(1, "\\x{%04X}", '\\P{^$Prop}');\n/, $MatchCode; + } + if (defined $FailCode) { + printf $FH qq/Expect(0, "\\x{%04X}", '\\p{$Prop}' );\n/, $FailCode; + printf $FH qq/Expect(1, "\\x{%04X}", '\\p{^$Prop}');\n/, $FailCode; + printf $FH qq/Expect(1, "\\x{%04X}", '\\P{$Prop}' );\n/, $FailCode; + printf $FH qq/Expect(0, "\\x{%04X}", '\\P{^$Prop}');\n/, $FailCode; + } +} + +## This used only for making the test script +sub ExpectError($$) +{ + my $FH = shift; + my $prop = shift; + + print $FH qq/Error('\\p{$prop}');\n/; + print $FH qq/Error('\\P{$prop}');\n/; +} + +## This used only for making the test script +my @GoodSeps = ( + " ", + "-", + " \t ", + "", + "", + "_", + ); +my @BadSeps = ( + "--", + "__", + " _", + "/" + ); + +## This used only for making the test script +sub RandomlyFuzzifyName($;$) +{ + my $Name = shift; + my $WantError = shift; ## if true, make an error + + my @parts; + for my $part (split /[-\s_]+/, $Name) + { + if (@parts) { + if ($WantError and rand() < 0.3) { + push @parts, $BadSeps[rand(@BadSeps)]; + $WantError = 0; + } else { + push @parts, $GoodSeps[rand(@GoodSeps)]; + } + } + my $switch = int rand(4); + if ($switch == 0) { + push @parts, uc $part; + } elsif ($switch == 1) { + push @parts, lc $part; + } elsif ($switch == 2) { + push @parts, ucfirst $part; + } else { + push @parts, $part; + } + } + my $new = join('', @parts); + + if ($WantError) { + if (rand() >= 0.5) { + $new .= $BadSeps[rand(@BadSeps)]; + } else { + $new = $BadSeps[rand(@BadSeps)] . $new; + } + } + return $new; +} + +## This used only for making the test script +sub MakePropTestScript() +{ + ## this written directly -- it's huge. + force_unlink ("TestProp.pl"); + if (not open OUT, ">TestProp.pl") { + die "$0: TestProp.pl: $!\n"; + } + print OUT <DATA>; + + while (my ($Name, $Table) = each %ExactNameToTest) + { + GenTests(*OUT, $Name, $Table->ValidCode, $Table->InvalidCode); + ExpectError(*OUT, uc $Name) if uc $Name ne $Name; + ExpectError(*OUT, lc $Name) if lc $Name ne $Name; + } + + + while (my ($Name, $Table) = each %FuzzyNameToTest) + { + my $Orig = $CanonicalToOrig{$Name}; + my %Names = ( + $Name => 1, + $Orig => 1, + RandomlyFuzzifyName($Orig) => 1 + ); + + for my $N (keys %Names) { + GenTests(*OUT, $N, $Table->ValidCode, $Table->InvalidCode); + } + + ExpectError(*OUT, RandomlyFuzzifyName($Orig, 'ERROR')); + } + + print OUT "Finished();\n"; + close OUT; +} + + +## +## These are used only in: +## RegisterFileForName() +## WriteAllMappings() +## +my %Exact; ## will become %utf8::Exact; +my %Canonical; ## will become %utf8::Canonical; +my %CaComment; ## Comment for %Canonical entry of same key + +## +## Given info about a name and a datafile that it should be associated with, +## register that assocation in %Exact and %Canonical. +sub RegisterFileForName($$$$) +{ + my $Type = shift; + my $Name = shift; + my $IsFuzzy = shift; + my $filename = shift; + + ## + ## Now in details for the mapping. $Type eq 'Is' has the + ## Is removed, as it will be removed in utf8_heavy when this + ## data is being checked. In keeps its "In", but a second + ## sans-In record is written if it doesn't conflict with + ## anything already there. + ## + if (not $IsFuzzy) + { + if ($Type eq 'Is') { + die "oops[$Name]" if $Exact{$Name}; + $Exact{$Name} = $filename; + } else { + die "oops[$Type$Name]" if $Exact{"$Type$Name"}; + $Exact{"$Type$Name"} = $filename; + $Exact{$Name} = $filename if not $Exact{$Name}; + } + } + else + { + my $CName = lc $Name; + if ($Type eq 'Is') { + die "oops[$CName]" if $Canonical{$CName}; + $Canonical{$CName} = $filename; + $CaComment{$CName} = $Name if $Name =~ tr/A-Z// >= 2; + } else { + die "oops[$Type$CName]" if $Canonical{lc "$Type$CName"}; + $Canonical{lc "$Type$CName"} = $filename; + $CaComment{lc "$Type$CName"} = "$Type$Name"; + if (not $Canonical{$CName}) { + $Canonical{$CName} = $filename; + $CaComment{$CName} = "$Type$Name"; + } + } + } +} + +## +## Writes the info accumulated in +## +## %TableInfo; +## %FuzzyNames; +## %AliasInfo; +## +## +sub WriteAllMappings() +{ + my @MAP; + + ## 'Is' *MUST* come first, so its names have precidence over 'In's + for my $Type ('Is', 'In') + { + my %RawNameToFile; ## a per-$Type cache + + for my $Name (sort {length $a <=> length $b} keys %{$TableInfo{$Type}}) + { + ## Note: $Name is already canonical + my $Table = $TableInfo{$Type}->{$Name}; + my $IsFuzzy = $FuzzyNames{$Type}->{$Name}; + + ## Need an 8.3 safe filename (which means "an 8 safe" $filename) + my $filename; + { + ## 'Is' items lose 'Is' from the basename. + $filename = $Type eq 'Is' ? + ($PVA_reverse{sc}{$Name} || $Name) : + "$Type$Name"; + + $filename =~ s/[^\w_]+/_/g; # "L&" -> "L_" + substr($filename, 8) = '' if length($filename) > 8; + + ## + ## Make sure the basename doesn't conflict with something we + ## might have already written. If we have, say, + ## InGreekExtended1 + ## InGreekExtended2 + ## they become + ## InGreekE + ## InGreek2 + ## + while (my $num = $BaseNames{lc $filename}++) + { + $num++; ## so basenames with numbers start with '2', which + ## just looks more natural. + ## Want to append $num, but if it'll make the basename longer + ## than 8 characters, pre-truncate $filename so that the result + ## is acceptable. + my $delta = length($filename) + length($num) - 8; + if ($delta > 0) { + substr($filename, -$delta) = $num; + } else { + $filename .= $num; + } + } + }; + + ## + ## Construct a nice comment to add to the file, and build data + ## for the "./Properties" file along the way. + ## + my $Comment; + { + my $Desc = $TableDesc{$Type}->{$Name} || ""; + ## get list of names this table is reference by + my @Supported = $Name; + while (my ($Orig, $Alias) = each %{ $AliasInfo{$Type} }) + { + if ($Orig eq $Name) { + push @Supported, $Alias; + } + } + + my $TypeToShow = $Type eq 'Is' ? "" : $Type; + my $OrigProp; + + $Comment = "This file supports:\n"; + for my $N (@Supported) + { + my $IsFuzzy = $FuzzyNames{$Type}->{$N}; + my $Prop = "\\p{$TypeToShow$Name}"; + $OrigProp = $Prop if not $OrigProp; #cache for aliases + if ($IsFuzzy) { + $Comment .= "\t$Prop (and fuzzy permutations)\n"; + } else { + $Comment .= "\t$Prop\n"; + } + my $MyDesc = ($N eq $Name) ? $Desc : "Alias for $OrigProp ($Desc)"; + + push @MAP, sprintf("%s %-42s %s\n", + $IsFuzzy ? '*' : ' ', $Prop, $MyDesc); + } + if ($Desc) { + $Comment .= "\nMeaning: $Desc\n"; + } + + } + ## + ## Okay, write the file... + ## + $Table->Write(["lib","gc_sc","$filename.pl"], $Comment); + + ## and register it + $RawNameToFile{$Name} = $filename; + RegisterFileForName($Type => $Name, $IsFuzzy, $filename); + + if ($IsFuzzy) + { + my $CName = CanonicalName($Type . '_'. $Name); + $FuzzyNameToTest{$Name} = $Table if !$FuzzyNameToTest{$Name}; + $FuzzyNameToTest{$CName} = $Table if !$FuzzyNameToTest{$CName}; + } else { + $ExactNameToTest{$Name} = $Table; + } + + } + + ## Register aliase info + for my $Name (sort {length $a <=> length $b} keys %{$AliasInfo{$Type}}) + { + my $Alias = $AliasInfo{$Type}->{$Name}; + my $IsFuzzy = $FuzzyNames{$Type}->{$Alias}; + my $filename = $RawNameToFile{$Name}; + die "oops [$Alias]->[$Name]" if not $filename; + RegisterFileForName($Type => $Alias, $IsFuzzy, $filename); + + my $Table = $TableInfo{$Type}->{$Name}; + die "oops" if not $Table; + if ($IsFuzzy) + { + my $CName = CanonicalName($Type .'_'. $Alias); + $FuzzyNameToTest{$Alias} = $Table if !$FuzzyNameToTest{$Alias}; + $FuzzyNameToTest{$CName} = $Table if !$FuzzyNameToTest{$CName}; + } else { + $ExactNameToTest{$Alias} = $Table; + } + } + } + + ## + ## Write out the property list + ## + { + my @OUT = ( + "##\n", + "## This file created by $0\n", + "## List of built-in \\p{...}/\\P{...} properties.\n", + "##\n", + "## '*' means name may be 'fuzzy'\n", + "##\n\n", + sort { substr($a,2) cmp substr($b, 2) } @MAP, + ); + WriteIfChanged('Properties', @OUT); + } + + use Text::Tabs (); ## using this makes the files about half the size + + ## Write Exact.pl + { + my @OUT = ( + $HEADER, + "##\n", + "## Data in this file used by ../utf8_heavy.pl\n", + "##\n\n", + "## Mapping from name to filename in ./lib/gc_sc\n", + "%utf8::Exact = (\n", + ); + + $Exact{InGreek} = 'InGreekA'; # this is evil kludge + for my $Name (sort keys %Exact) + { + my $File = $Exact{$Name}; + $Name = $Name =~ m/\W/ ? qq/'$Name'/ : " $Name "; + my $Text = sprintf("%-15s => %s,\n", $Name, qq/'$File'/); + push @OUT, Text::Tabs::unexpand($Text); + } + push @OUT, ");\n1;\n"; + + WriteIfChanged('Exact.pl', @OUT); + } + + ## Write Canonical.pl + { + my @OUT = ( + $HEADER, + "##\n", + "## Data in this file used by ../utf8_heavy.pl\n", + "##\n\n", + "## Mapping from lc(canonical name) to filename in ./lib\n", + "%utf8::Canonical = (\n", + ); + my $Trail = ""; ## used just to keep the spacing pretty + for my $Name (sort keys %Canonical) + { + my $File = $Canonical{$Name}; + if ($CaComment{$Name}) { + push @OUT, "\n" if not $Trail; + push @OUT, " # $CaComment{$Name}\n"; + $Trail = "\n"; + } else { + $Trail = ""; + } + $Name = $Name =~ m/\W/ ? qq/'$Name'/ : " $Name "; + my $Text = sprintf(" %-41s => %s,\n$Trail", $Name, qq/'$File'/); + push @OUT, Text::Tabs::unexpand($Text); + } + push @OUT, ");\n1\n"; + WriteIfChanged('Canonical.pl', @OUT); + } + + MakePropTestScript() if $MakeTestScript; +} + + +sub SpecialCasing_txt() +{ + # + # Read in the special cases. + # + + my %CaseInfo; + + if (not open IN, "SpecialCasing.txt") { + die "$0: SpecialCasing.txt: $!\n"; + } + while (<IN>) { + next unless /^[0-9A-Fa-f]+;/; + s/\#.*//; + s/\s+$//; + + my ($code, $lower, $title, $upper, $condition) = split(/\s*;\s*/); + + if ($condition) { # not implemented yet + print "# SKIPPING $_\n" if $Verbose; + next; + } + + # Wait until all the special cases have been read since + # they are not listed in numeric order. + my $ix = hex($code); + push @{$CaseInfo{Lower}}, [ $ix, $code, $lower ] + unless $code eq $lower; + push @{$CaseInfo{Title}}, [ $ix, $code, $title ] + unless $code eq $title; + push @{$CaseInfo{Upper}}, [ $ix, $code, $upper ] + unless $code eq $upper; + } + close IN; + + # Now write out the special cases properties in their code point order. + # Prepend them to the To/{Upper,Lower,Title}.pl. + + for my $case (qw(Lower Title Upper)) + { + my $NormalCase = do "To/$case.pl" || die "$0: $@\n"; + + my @OUT = + ( + $HEADER, "\n", + "# The key UTF-8 _bytes_, the value UTF-8 (speed hack)\n", + "%utf8::ToSpec$case =\n(\n", + ); + + for my $prop (sort { $a->[0] <=> $b->[0] } @{$CaseInfo{$case}}) { + my ($ix, $code, $to) = @$prop; + my $tostr = + join "", map { sprintf "\\x{%s}", $_ } split ' ', $to; + push @OUT, sprintf qq["%s" => "$tostr",\n], join("", map { sprintf "\\x%02X", $_ } unpack("U0C*", pack("U", $ix))); + # Remove any single-character mappings for + # the same character since we are going for + # the special casing rules. + $NormalCase =~ s/^$code\t\t\w+\n//m; + } + push @OUT, ( + ");\n\n", + "return <<'END';\n", + $NormalCase, + "END\n" + ); + WriteIfChanged(["To","$case.pl"], @OUT); + } +} + +# +# Read in the case foldings. +# +# We will do full case folding, C + F + I (see CaseFolding.txt). +# +sub CaseFolding_txt() +{ + if (not open IN, "CaseFolding.txt") { + die "$0: CaseFolding.txt: $!\n"; + } + + my $Fold = Table->New(); + my %Fold; + + while (<IN>) { + # Skip status 'S', simple case folding + next unless /^([0-9A-Fa-f]+)\s*;\s*([CFI])\s*;\s*([0-9A-Fa-f]+(?: [0-9A-Fa-f]+)*)\s*;/; + + my ($code, $status, $fold) = (hex($1), $2, $3); + + if ($status eq 'C') { # Common: one-to-one folding + # No append() since several codes may fold into one. + $Fold->RawAppendRange($code, $code, $fold); + } else { # F: full, or I: dotted uppercase I -> dotless lowercase I + $Fold{$code} = $fold; + } + } + close IN; + + $Fold->Write("To/Fold.pl"); + + # + # Prepend the special foldings to the common foldings. + # + my $CommonFold = do "To/Fold.pl" || die "$0: To/Fold.pl: $!\n"; + + my @OUT = + ( + $HEADER, "\n", + "# The ke UTF-8 _bytes_, the value UTF-8 (speed hack)\n", + "%utf8::ToSpecFold =\n(\n", + ); + for my $code (sort { $a <=> $b } keys %Fold) { + my $foldstr = + join "", map { sprintf "\\x{%s}", $_ } split ' ', $Fold{$code}; + push @OUT, sprintf qq["%s" => "$foldstr",\n], join("", map { sprintf "\\x%02X", $_ } unpack("U0C*", pack("U", $code))); + } + push @OUT, ( + ");\n\n", + "return <<'END';\n", + $CommonFold, + "END\n", + ); + + WriteIfChanged(["To","Fold.pl"], @OUT); +} + +## Do it.... + +Build_Aliases(); +UnicodeData_Txt(); +PropList_txt(); + +Scripts_txt(); +Blocks_txt(); + +WriteAllMappings(); + +LineBreak_Txt(); +ArabicShaping_txt(); +EastAsianWidth_txt(); +HangulSyllableType_txt(); +Jamo_txt(); +SpecialCasing_txt(); +CaseFolding_txt(); + +if ( $FileList and $MakeList ) { + + print "Updating '$FileList'\n" + if ($Verbose); + + open my $ofh,">",$FileList + or die "Can't write to '$FileList':$!"; + print $ofh <<"EOFHEADER"; +# +# mktables.lst -- File list for mktables. +# +# Autogenerated on @{[scalar localtime]} +# +# - First section is input files +# (mktables itself is automatically included) +# - Section seperator is /^=+\$/ +# - Second section is a list of output files. +# - Lines matching /^\\s*#/ are treated as comments +# which along with blank lines are ignored. +# + +# Input files: + +EOFHEADER + my @input=("version",glob('*.txt')); + print $ofh "$_\n" for + @input, + "\n=================================\n", + "# Output files:\n", + # special files + "Properties"; + + + require File::Find; + my $count=0; + File::Find::find({ + no_chdir=>1, + wanted=>sub { + if (/\.pl$/) { + s!^\./!!; + print $ofh "$_\n"; + $count++; + } + }, + },"."); + + print $ofh "\n# ",scalar(@input)," input files\n", + "# ",scalar($count+1)," output files\n\n", + "# End list\n"; + close $ofh + or warn "Failed to close $ofh: $!"; + + print "Filelist has ",scalar(@input)," input files and ", + scalar($count+1)," output files\n" + if $Verbose; +} +print "All done\n" if $Verbose; +exit(0); + +## TRAILING CODE IS USED BY MakePropTestScript() +__DATA__ +use strict; +use warnings; + +my $Tests = 0; +my $Fails = 0; + +sub Expect($$$) +{ + my $Expect = shift; + my $String = shift; + my $Regex = shift; + my $Line = (caller)[2]; + + $Tests++; + my $RegObj; + my $result = eval { + $RegObj = qr/$Regex/; + $String =~ $RegObj ? 1 : 0 + }; + + if (not defined $result) { + print "couldn't compile /$Regex/ on $0 line $Line: $@\n"; + $Fails++; + } elsif ($result ^ $Expect) { + print "bad result (expected $Expect) on $0 line $Line: $@\n"; + $Fails++; + } +} + +sub Error($) +{ + my $Regex = shift; + $Tests++; + if (eval { 'x' =~ qr/$Regex/; 1 }) { + $Fails++; + my $Line = (caller)[2]; + print "expected error for /$Regex/ on $0 line $Line: $@\n"; + } +} + +sub Finished() +{ + if ($Fails == 0) { + print "All $Tests tests passed.\n"; + exit(0); + } else { + print "$Tests tests, $Fails failed!\n"; + exit(-1); + } +} diff --git a/Master/tlpkg/tlperl.old/lib/unicore/mktables.lst b/Master/tlpkg/tlperl.old/lib/unicore/mktables.lst new file mode 100644 index 00000000000..c3b6dc8b32b --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/mktables.lst @@ -0,0 +1,505 @@ +# +# mktables.lst -- File list for mktables. +# +# Autogenerated on Sun Apr 24 21:25:22 2005 +# +# - First section is input files +# (mktables itself is automatically included) +# - Section seperator is /^=+$/ +# - Second section is a list of output files. +# - Lines matching /^\s*#/ are treated as comments +# which along with blank lines are ignored. +# + +# Input files: + +version +ArabicShaping.txt +BidiMirroring.txt +Blocks.txt +CaseFolding.txt +CompositionExclusions.txt +EastAsianWidth.txt +HangulSyllableType.txt +Index.txt +Jamo.txt +LineBreak.txt +NamedSequences.txt +NamesList.txt +NormalizationCorrections.txt +PropertyAliases.txt +PropList.txt +PropValueAliases.txt +ReadMe.txt +Scripts.txt +SpecialCasing.txt +StandardizedVariants.txt +UnicodeData.txt + +================================= + +# Output files: + +Properties +Canonical.pl +CombiningClass.pl +Decomposition.pl +Exact.pl +Name.pl +PVA.pl +lib/bc/AL.pl +lib/bc/AN.pl +lib/bc/B.pl +lib/bc/BN.pl +lib/bc/CS.pl +lib/bc/EN.pl +lib/bc/ES.pl +lib/bc/ET.pl +lib/bc/L.pl +lib/bc/LRE.pl +lib/bc/LRO.pl +lib/bc/NSM.pl +lib/bc/ON.pl +lib/bc/PDF.pl +lib/bc/R.pl +lib/bc/RLE.pl +lib/bc/RLO.pl +lib/bc/S.pl +lib/bc/WS.pl +lib/ccc/A.pl +lib/ccc/AL.pl +lib/ccc/AR.pl +lib/ccc/ATAR.pl +lib/ccc/ATB.pl +lib/ccc/ATBL.pl +lib/ccc/B.pl +lib/ccc/BL.pl +lib/ccc/BR.pl +lib/ccc/DA.pl +lib/ccc/DB.pl +lib/ccc/IS.pl +lib/ccc/KV.pl +lib/ccc/L.pl +lib/ccc/NK.pl +lib/ccc/NR.pl +lib/ccc/OV.pl +lib/ccc/R.pl +lib/ccc/VR.pl +lib/dt/can.pl +lib/dt/com.pl +lib/dt/enc.pl +lib/dt/fin.pl +lib/dt/font.pl +lib/dt/fra.pl +lib/dt/init.pl +lib/dt/iso.pl +lib/dt/med.pl +lib/dt/nar.pl +lib/dt/nb.pl +lib/dt/sml.pl +lib/dt/sqr.pl +lib/dt/sub.pl +lib/dt/sup.pl +lib/dt/vert.pl +lib/dt/wide.pl +lib/ea/A.pl +lib/ea/F.pl +lib/ea/H.pl +lib/ea/N.pl +lib/ea/Na.pl +lib/ea/W.pl +lib/gc_sc/AHex.pl +lib/gc_sc/Alnum.pl +lib/gc_sc/Alpha.pl +lib/gc_sc/Alphabet.pl +lib/gc_sc/Any.pl +lib/gc_sc/Arab.pl +lib/gc_sc/Armn.pl +lib/gc_sc/ASCII.pl +lib/gc_sc/AsciiHex.pl +lib/gc_sc/Assigned.pl +lib/gc_sc/Beng.pl +lib/gc_sc/BidiC.pl +lib/gc_sc/BidiCont.pl +lib/gc_sc/Blank.pl +lib/gc_sc/Bopo.pl +lib/gc_sc/Brai.pl +lib/gc_sc/Bugi.pl +lib/gc_sc/Buhd.pl +lib/gc_sc/C.pl +lib/gc_sc/Canadian.pl +lib/gc_sc/Cc.pl +lib/gc_sc/Cf.pl +lib/gc_sc/Cher.pl +lib/gc_sc/Cn.pl +lib/gc_sc/Cntrl.pl +lib/gc_sc/Co.pl +lib/gc_sc/Copt.pl +lib/gc_sc/Cprt.pl +lib/gc_sc/Cs.pl +lib/gc_sc/Cyrl.pl +lib/gc_sc/Dash.pl +lib/gc_sc/Dash2.pl +lib/gc_sc/Dep.pl +lib/gc_sc/Deprecat.pl +lib/gc_sc/Deva.pl +lib/gc_sc/Dia.pl +lib/gc_sc/Diacriti.pl +lib/gc_sc/Digit.pl +lib/gc_sc/Dsrt.pl +lib/gc_sc/Ethi.pl +lib/gc_sc/Ext.pl +lib/gc_sc/Extender.pl +lib/gc_sc/Geor.pl +lib/gc_sc/Glag.pl +lib/gc_sc/Goth.pl +lib/gc_sc/Graph.pl +lib/gc_sc/Grapheme.pl +lib/gc_sc/Grek.pl +lib/gc_sc/GrLink.pl +lib/gc_sc/Gujr.pl +lib/gc_sc/Guru.pl +lib/gc_sc/Hang.pl +lib/gc_sc/Hani.pl +lib/gc_sc/Hano.pl +lib/gc_sc/Hebr.pl +lib/gc_sc/Hex.pl +lib/gc_sc/HexDigit.pl +lib/gc_sc/Hira.pl +lib/gc_sc/Hyphen.pl +lib/gc_sc/Hyphen2.pl +lib/gc_sc/IdContin.pl +lib/gc_sc/Ideo.pl +lib/gc_sc/Ideograp.pl +lib/gc_sc/IDSB.pl +lib/gc_sc/IdsBinar.pl +lib/gc_sc/IDST.pl +lib/gc_sc/IdStart.pl +lib/gc_sc/IdsTrina.pl +lib/gc_sc/InAegean.pl +lib/gc_sc/InAlphab.pl +lib/gc_sc/InAncie2.pl +lib/gc_sc/InAncien.pl +lib/gc_sc/InArabi2.pl +lib/gc_sc/InArabi3.pl +lib/gc_sc/InArabi4.pl +lib/gc_sc/InArabic.pl +lib/gc_sc/InArmeni.pl +lib/gc_sc/InArrows.pl +lib/gc_sc/InBasicL.pl +lib/gc_sc/InBengal.pl +lib/gc_sc/InBlockE.pl +lib/gc_sc/InBopom2.pl +lib/gc_sc/InBopomo.pl +lib/gc_sc/InBoxDra.pl +lib/gc_sc/InBraill.pl +lib/gc_sc/InBugine.pl +lib/gc_sc/InBuhid.pl +lib/gc_sc/InByzant.pl +lib/gc_sc/InCherok.pl +lib/gc_sc/InCjkCo2.pl +lib/gc_sc/InCjkCo3.pl +lib/gc_sc/InCjkCo4.pl +lib/gc_sc/InCjkCom.pl +lib/gc_sc/InCjkRad.pl +lib/gc_sc/InCjkStr.pl +lib/gc_sc/InCjkSym.pl +lib/gc_sc/InCjkUn2.pl +lib/gc_sc/InCjkUn3.pl +lib/gc_sc/InCjkUni.pl +lib/gc_sc/InCombi2.pl +lib/gc_sc/InCombi3.pl +lib/gc_sc/InCombi4.pl +lib/gc_sc/InCombin.pl +lib/gc_sc/InContro.pl +lib/gc_sc/InCoptic.pl +lib/gc_sc/InCurren.pl +lib/gc_sc/InCyprio.pl +lib/gc_sc/InCyril2.pl +lib/gc_sc/InCyrill.pl +lib/gc_sc/InDesere.pl +lib/gc_sc/InDevana.pl +lib/gc_sc/InDingba.pl +lib/gc_sc/InEnclo2.pl +lib/gc_sc/InEnclos.pl +lib/gc_sc/InEthio2.pl +lib/gc_sc/InEthio3.pl +lib/gc_sc/InEthiop.pl +lib/gc_sc/InGenera.pl +lib/gc_sc/InGeomet.pl +lib/gc_sc/InGeorg2.pl +lib/gc_sc/InGeorgi.pl +lib/gc_sc/InGlagol.pl +lib/gc_sc/InGothic.pl +lib/gc_sc/InGreekA.pl +lib/gc_sc/InGreekE.pl +lib/gc_sc/InGujara.pl +lib/gc_sc/InGurmuk.pl +lib/gc_sc/InHalfwi.pl +lib/gc_sc/InHangu2.pl +lib/gc_sc/InHangu3.pl +lib/gc_sc/InHangul.pl +lib/gc_sc/InHanuno.pl +lib/gc_sc/InHebrew.pl +lib/gc_sc/InHighPr.pl +lib/gc_sc/InHighSu.pl +lib/gc_sc/InHiraga.pl +lib/gc_sc/InIdeogr.pl +lib/gc_sc/InIpaExt.pl +lib/gc_sc/InKanbun.pl +lib/gc_sc/InKangxi.pl +lib/gc_sc/InKannad.pl +lib/gc_sc/InKatak2.pl +lib/gc_sc/InKataka.pl +lib/gc_sc/InKharos.pl +lib/gc_sc/InKhmer.pl +lib/gc_sc/InKhmerS.pl +lib/gc_sc/InLao.pl +lib/gc_sc/InLatin1.pl +lib/gc_sc/InLatin2.pl +lib/gc_sc/InLatin3.pl +lib/gc_sc/InLatinE.pl +lib/gc_sc/InLetter.pl +lib/gc_sc/InLimbu.pl +lib/gc_sc/InLinea2.pl +lib/gc_sc/InLinear.pl +lib/gc_sc/InLowSur.pl +lib/gc_sc/InMalaya.pl +lib/gc_sc/InMathe2.pl +lib/gc_sc/InMathem.pl +lib/gc_sc/InMisce2.pl +lib/gc_sc/InMisce3.pl +lib/gc_sc/InMisce4.pl +lib/gc_sc/InMisce5.pl +lib/gc_sc/InMiscel.pl +lib/gc_sc/InModifi.pl +lib/gc_sc/InMongol.pl +lib/gc_sc/InMusica.pl +lib/gc_sc/InMyanma.pl +lib/gc_sc/InNewTai.pl +lib/gc_sc/InNumber.pl +lib/gc_sc/InOgham.pl +lib/gc_sc/InOldIta.pl +lib/gc_sc/InOldPer.pl +lib/gc_sc/InOptica.pl +lib/gc_sc/InOriya.pl +lib/gc_sc/InOsmany.pl +lib/gc_sc/InPhone2.pl +lib/gc_sc/InPhonet.pl +lib/gc_sc/InPrivat.pl +lib/gc_sc/InRunic.pl +lib/gc_sc/InShavia.pl +lib/gc_sc/InSinhal.pl +lib/gc_sc/InSmallF.pl +lib/gc_sc/InSpacin.pl +lib/gc_sc/InSpecia.pl +lib/gc_sc/InSupers.pl +lib/gc_sc/InSuppl2.pl +lib/gc_sc/InSuppl3.pl +lib/gc_sc/InSuppl4.pl +lib/gc_sc/InSuppl5.pl +lib/gc_sc/InSuppl6.pl +lib/gc_sc/InSupple.pl +lib/gc_sc/InSyloti.pl +lib/gc_sc/InSyriac.pl +lib/gc_sc/InTagalo.pl +lib/gc_sc/InTagban.pl +lib/gc_sc/InTags.pl +lib/gc_sc/InTaiLe.pl +lib/gc_sc/InTaiXua.pl +lib/gc_sc/InTamil.pl +lib/gc_sc/InTelugu.pl +lib/gc_sc/InThaana.pl +lib/gc_sc/InThai.pl +lib/gc_sc/InTibeta.pl +lib/gc_sc/InTifina.pl +lib/gc_sc/InUgarit.pl +lib/gc_sc/InUnifie.pl +lib/gc_sc/InVaria2.pl +lib/gc_sc/InVariat.pl +lib/gc_sc/InVertic.pl +lib/gc_sc/InYijing.pl +lib/gc_sc/InYiRadi.pl +lib/gc_sc/InYiSyll.pl +lib/gc_sc/JoinC.pl +lib/gc_sc/JoinCont.pl +lib/gc_sc/Kana.pl +lib/gc_sc/Khar.pl +lib/gc_sc/Khmr.pl +lib/gc_sc/Knda.pl +lib/gc_sc/L.pl +lib/gc_sc/Laoo.pl +lib/gc_sc/Latn.pl +lib/gc_sc/LC.pl +lib/gc_sc/Limb.pl +lib/gc_sc/LinearB.pl +lib/gc_sc/Ll.pl +lib/gc_sc/Lm.pl +lib/gc_sc/Lo.pl +lib/gc_sc/LOE.pl +lib/gc_sc/LogicalO.pl +lib/gc_sc/Lower.pl +lib/gc_sc/Lowercas.pl +lib/gc_sc/Lt.pl +lib/gc_sc/Lu.pl +lib/gc_sc/M.pl +lib/gc_sc/Math.pl +lib/gc_sc/Mc.pl +lib/gc_sc/Me.pl +lib/gc_sc/Mlym.pl +lib/gc_sc/Mn.pl +lib/gc_sc/Mong.pl +lib/gc_sc/Mymr.pl +lib/gc_sc/N.pl +lib/gc_sc/NChar.pl +lib/gc_sc/Nd.pl +lib/gc_sc/NewTaiLu.pl +lib/gc_sc/Nl.pl +lib/gc_sc/No.pl +lib/gc_sc/Nonchara.pl +lib/gc_sc/OAlpha.pl +lib/gc_sc/ODI.pl +lib/gc_sc/Ogam.pl +lib/gc_sc/OGrExt.pl +lib/gc_sc/OIDC.pl +lib/gc_sc/OIDS.pl +lib/gc_sc/OldItali.pl +lib/gc_sc/OldPersi.pl +lib/gc_sc/OLower.pl +lib/gc_sc/OMath.pl +lib/gc_sc/Orya.pl +lib/gc_sc/Osma.pl +lib/gc_sc/OtherAlp.pl +lib/gc_sc/OtherDef.pl +lib/gc_sc/OtherGra.pl +lib/gc_sc/OtherIdC.pl +lib/gc_sc/OtherIdS.pl +lib/gc_sc/OtherLow.pl +lib/gc_sc/OtherMat.pl +lib/gc_sc/OtherUpp.pl +lib/gc_sc/OUpper.pl +lib/gc_sc/P.pl +lib/gc_sc/PatSyn.pl +lib/gc_sc/PatternS.pl +lib/gc_sc/PatternW.pl +lib/gc_sc/PatWS.pl +lib/gc_sc/Pc.pl +lib/gc_sc/Pd.pl +lib/gc_sc/Pe.pl +lib/gc_sc/Pf.pl +lib/gc_sc/Pi.pl +lib/gc_sc/Po.pl +lib/gc_sc/Print.pl +lib/gc_sc/Ps.pl +lib/gc_sc/Punct.pl +lib/gc_sc/Qaai.pl +lib/gc_sc/QMark.pl +lib/gc_sc/Quotatio.pl +lib/gc_sc/Radical.pl +lib/gc_sc/Radical2.pl +lib/gc_sc/Runr.pl +lib/gc_sc/S.pl +lib/gc_sc/Sc.pl +lib/gc_sc/SD.pl +lib/gc_sc/Shaw.pl +lib/gc_sc/Sinh.pl +lib/gc_sc/Sk.pl +lib/gc_sc/Sm.pl +lib/gc_sc/So.pl +lib/gc_sc/SoftDott.pl +lib/gc_sc/Space.pl +lib/gc_sc/SpacePer.pl +lib/gc_sc/STerm.pl +lib/gc_sc/Sterm2.pl +lib/gc_sc/SylotiNa.pl +lib/gc_sc/Syrc.pl +lib/gc_sc/Tagb.pl +lib/gc_sc/TaiLe.pl +lib/gc_sc/Taml.pl +lib/gc_sc/Telu.pl +lib/gc_sc/Term.pl +lib/gc_sc/Terminal.pl +lib/gc_sc/Tfng.pl +lib/gc_sc/Tglg.pl +lib/gc_sc/Thaa.pl +lib/gc_sc/Thai.pl +lib/gc_sc/Tibt.pl +lib/gc_sc/Title.pl +lib/gc_sc/Ugar.pl +lib/gc_sc/UIdeo.pl +lib/gc_sc/UnifiedI.pl +lib/gc_sc/Upper.pl +lib/gc_sc/Uppercas.pl +lib/gc_sc/Variatio.pl +lib/gc_sc/VS.pl +lib/gc_sc/WhiteSpa.pl +lib/gc_sc/Word.pl +lib/gc_sc/WSpace.pl +lib/gc_sc/XDigit.pl +lib/gc_sc/Yiii.pl +lib/gc_sc/Z.pl +lib/gc_sc/Zl.pl +lib/gc_sc/Zp.pl +lib/gc_sc/Zs.pl +lib/gc_sc/Zyyy.pl +lib/gc_sc/_CanonDC.pl +lib/gc_sc/_CaseIgn.pl +lib/gc_sc/_CombAbo.pl +lib/hst/L.pl +lib/hst/LV.pl +lib/hst/LVT.pl +lib/hst/T.pl +lib/hst/V.pl +lib/jt/C.pl +lib/jt/D.pl +lib/jt/R.pl +lib/jt/U.pl +lib/lb/AI.pl +lib/lb/AL.pl +lib/lb/B2.pl +lib/lb/BA.pl +lib/lb/BB.pl +lib/lb/BK.pl +lib/lb/CB.pl +lib/lb/CL.pl +lib/lb/CM.pl +lib/lb/CR.pl +lib/lb/EX.pl +lib/lb/GL.pl +lib/lb/H2.pl +lib/lb/H3.pl +lib/lb/HY.pl +lib/lb/ID.pl +lib/lb/IN.pl +lib/lb/IS.pl +lib/lb/JL.pl +lib/lb/JT.pl +lib/lb/JV.pl +lib/lb/LF.pl +lib/lb/NL.pl +lib/lb/NS.pl +lib/lb/NU.pl +lib/lb/OP.pl +lib/lb/PO.pl +lib/lb/PR.pl +lib/lb/QU.pl +lib/lb/SA.pl +lib/lb/SG.pl +lib/lb/SP.pl +lib/lb/SY.pl +lib/lb/WJ.pl +lib/lb/XX.pl +lib/lb/ZW.pl +lib/nt/De.pl +lib/nt/Di.pl +lib/nt/Nu.pl +To/Digit.pl +To/Fold.pl +To/Lower.pl +To/Title.pl +To/Upper.pl + +# 22 input files +# 458 output files + +# End list diff --git a/Master/tlpkg/tlperl.old/lib/unicore/version b/Master/tlpkg/tlperl.old/lib/unicore/version new file mode 100644 index 00000000000..ee74734aa22 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/unicore/version @@ -0,0 +1 @@ +4.1.0 diff --git a/Master/tlpkg/tlperl.old/lib/utf8.pm b/Master/tlpkg/tlperl.old/lib/utf8.pm new file mode 100644 index 00000000000..56c991bef9a --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/utf8.pm @@ -0,0 +1,214 @@ +package utf8; + +$utf8::hint_bits = 0x00800000; + +our $VERSION = '1.06'; + +sub import { + $^H |= $utf8::hint_bits; + $enc{caller()} = $_[1] if $_[1]; +} + +sub unimport { + $^H &= ~$utf8::hint_bits; +} + +sub AUTOLOAD { + require "utf8_heavy.pl"; + goto &$AUTOLOAD if defined &$AUTOLOAD; + require Carp; + Carp::croak("Undefined subroutine $AUTOLOAD called"); +} + +1; +__END__ + +=head1 NAME + +utf8 - Perl pragma to enable/disable UTF-8 (or UTF-EBCDIC) in source code + +=head1 SYNOPSIS + + use utf8; + no utf8; + + # Convert a Perl scalar to/from UTF-8. + $num_octets = utf8::upgrade($string); + $success = utf8::downgrade($string[, FAIL_OK]); + + # Change the native bytes of a Perl scalar to/from UTF-8 bytes. + utf8::encode($string); + utf8::decode($string); + + $flag = utf8::is_utf8(STRING); # since Perl 5.8.1 + $flag = utf8::valid(STRING); + +=head1 DESCRIPTION + +The C<use utf8> pragma tells the Perl parser to allow UTF-8 in the +program text in the current lexical scope (allow UTF-EBCDIC on EBCDIC based +platforms). The C<no utf8> pragma tells Perl to switch back to treating +the source text as literal bytes in the current lexical scope. + +This pragma is primarily a compatibility device. Perl versions +earlier than 5.6 allowed arbitrary bytes in source code, whereas +in future we would like to standardize on the UTF-8 encoding for +source text. + +B<Do not use this pragma for anything else than telling Perl that your +script is written in UTF-8.> The utility functions described below are +useful for their own purposes, but they are not really part of the +"pragmatic" effect. + +Until UTF-8 becomes the default format for source text, either this +pragma or the L<encoding> pragma should be used to recognize UTF-8 +in the source. When UTF-8 becomes the standard source format, this +pragma will effectively become a no-op. For convenience in what +follows the term I<UTF-X> is used to refer to UTF-8 on ASCII and ISO +Latin based platforms and UTF-EBCDIC on EBCDIC based platforms. + +See also the effects of the C<-C> switch and its cousin, the +C<$ENV{PERL_UNICODE}>, in L<perlrun>. + +Enabling the C<utf8> pragma has the following effect: + +=over 4 + +=item * + +Bytes in the source text that have their high-bit set will be treated +as being part of a literal UTF-8 character. This includes most +literals such as identifier names, string constants, and constant +regular expression patterns. + +On EBCDIC platforms characters in the Latin 1 character set are +treated as being part of a literal UTF-EBCDIC character. + +=back + +Note that if you have bytes with the eighth bit on in your script +(for example embedded Latin-1 in your string literals), C<use utf8> +will be unhappy since the bytes are most probably not well-formed +UTF-8. If you want to have such bytes and use utf8, you can disable +utf8 until the end the block (or file, if at top level) by C<no utf8;>. + +If you want to automatically upgrade your 8-bit legacy bytes to UTF-8, +use the L<encoding> pragma instead of this pragma. For example, if +you want to implicitly upgrade your ISO 8859-1 (Latin-1) bytes to UTF-8 +as used in e.g. C<chr()> and C<\x{...}>, try this: + + use encoding "latin-1"; + my $c = chr(0xc4); + my $x = "\x{c5}"; + +In case you are wondering: yes, C<use encoding 'utf8';> works much +the same as C<use utf8;>. + +=head2 Utility functions + +The following functions are defined in the C<utf8::> package by the +Perl core. You do not need to say C<use utf8> to use these and in fact +you should not say that unless you really want to have UTF-8 source code. + +=over 4 + +=item * $num_octets = utf8::upgrade($string) + +Converts in-place the octet sequence in the native encoding +(Latin-1 or EBCDIC) to the equivalent character sequence in I<UTF-X>. +I<$string> already encoded as characters does no harm. +Returns the number of octets necessary to represent the string as I<UTF-X>. +Can be used to make sure that the UTF-8 flag is on, +so that C<\w> or C<lc()> work as Unicode on strings +containing characters in the range 0x80-0xFF (on ASCII and +derivatives). + +B<Note that this function does not handle arbitrary encodings.> +Therefore I<Encode.pm> is recommended for the general purposes. + +Affected by the encoding pragma. + +=item * $success = utf8::downgrade($string[, FAIL_OK]) + +Converts in-place the character sequence in I<UTF-X> +to the equivalent octet sequence in the native encoding (Latin-1 or EBCDIC). +I<$string> already encoded as octets does no harm. +Returns true on success. On failure dies or, if the value of +C<FAIL_OK> is true, returns false. +Can be used to make sure that the UTF-8 flag is off, +e.g. when you want to make sure that the substr() or length() function +works with the usually faster byte algorithm. + +B<Note that this function does not handle arbitrary encodings.> +Therefore I<Encode.pm> is recommended for the general purposes. + +B<Not> affected by the encoding pragma. + +B<NOTE:> this function is experimental and may change +or be removed without notice. + +=item * utf8::encode($string) + +Converts in-place the character sequence to the corresponding octet sequence +in I<UTF-X>. The UTF-8 flag is turned off. Returns nothing. + +B<Note that this function does not handle arbitrary encodings.> +Therefore I<Encode.pm> is recommended for the general purposes. + +=item * utf8::decode($string) + +Attempts to convert in-place the octet sequence in I<UTF-X> +to the corresponding character sequence. The UTF-8 flag is turned on +only if the source string contains multiple-byte I<UTF-X> characters. +If I<$string> is invalid as I<UTF-X>, returns false; otherwise returns true. + +B<Note that this function does not handle arbitrary encodings.> +Therefore I<Encode.pm> is recommended for the general purposes. + +B<NOTE:> this function is experimental and may change +or be removed without notice. + +=item * $flag = utf8::is_utf8(STRING) + +(Since Perl 5.8.1) Test whether STRING is in UTF-8. Functionally +the same as Encode::is_utf8(). + +=item * $flag = utf8::valid(STRING) + +[INTERNAL] Test whether STRING is in a consistent state regarding +UTF-8. Will return true is well-formed UTF-8 and has the UTF-8 flag +on B<or> if string is held as bytes (both these states are 'consistent'). +Main reason for this routine is to allow Perl's testsuite to check +that operations have left strings in a consistent state. You most +probably want to use utf8::is_utf8() instead. + +=back + +C<utf8::encode> is like C<utf8::upgrade>, but the UTF8 flag is +cleared. See L<perlunicode> for more on the UTF8 flag and the C API +functions C<sv_utf8_upgrade>, C<sv_utf8_downgrade>, C<sv_utf8_encode>, +and C<sv_utf8_decode>, which are wrapped by the Perl functions +C<utf8::upgrade>, C<utf8::downgrade>, C<utf8::encode> and +C<utf8::decode>. Note that in the Perl 5.8.0 and 5.8.1 implementation +the functions utf8::is_utf8, utf8::valid, utf8::encode, utf8::decode, +utf8::upgrade, and utf8::downgrade are always available, without a +C<require utf8> statement-- this may change in future releases. + +=head1 BUGS + +One can have Unicode in identifier names, but not in package/class or +subroutine names. While some limited functionality towards this does +exist as of Perl 5.8.0, that is more accidental than designed; use of +Unicode for the said purposes is unsupported. + +One reason of this unfinishedness is its (currently) inherent +unportability: since both package names and subroutine names may need +to be mapped to file and directory names, the Unicode capability of +the filesystem becomes important-- and there unfortunately aren't +portable answers. + +=head1 SEE ALSO + +L<perluniintro>, L<encoding>, L<perlrun>, L<bytes>, L<perlunicode> + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/utf8_heavy.pl b/Master/tlpkg/tlperl.old/lib/utf8_heavy.pl new file mode 100644 index 00000000000..b6fdeb997b3 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/utf8_heavy.pl @@ -0,0 +1,412 @@ +package utf8; +use strict; +use warnings; + +sub DEBUG () { 0 } + +sub DESTROY {} + +my %Cache; + +our (%PropertyAlias, %PA_reverse, %PropValueAlias, %PVA_reverse, %PVA_abbr_map); + +sub croak { require Carp; Carp::croak(@_) } + +## +## "SWASH" == "SWATCH HASH". A "swatch" is a swatch of the Unicode landscape. +## It's a data structure that encodes a set of Unicode characters. +## + +sub SWASHNEW { + my ($class, $type, $list, $minbits, $none) = @_; + local $^D = 0 if $^D; + + print STDERR "SWASHNEW @_\n" if DEBUG; + + ## + ## Get the list of codepoints for the type. + ## Called from utf8.c + ## + ## Given a $type, our goal is to fill $list with the set of codepoint + ## ranges. + ## + ## To make the parsing of $type clear, this code takes the a rather + ## unorthodox approach of last'ing out of the block once we have the + ## info we need. Were this to be a subroutine, the 'last' would just + ## be a 'return'. + ## + my $file; ## file to load data from, and also part of the %Cache key. + my $ListSorted = 0; + + if ($type) + { + $type =~ s/^\s+//; + $type =~ s/\s+$//; + + print "type = $type\n" if DEBUG; + + GETFILE: + { + ## + ## It could be a user-defined property. + ## + + my $caller1 = $type =~ s/(.+)::// ? $1 : caller(1); + + if (defined $caller1 && $type =~ /^(?:\w+)$/) { + my $prop = "${caller1}::$type"; + if (exists &{$prop}) { + no strict 'refs'; + + $list = &{$prop}; + last GETFILE; + } + } + + my $wasIs; + + ($wasIs = $type =~ s/^Is(?:\s+|[-_])?//i) + or + $type =~ s/^(?:(?:General(?:\s+|_)?)?Category|gc)\s*[:=]\s*//i + or + $type =~ s/^(?:Script|sc)\s*[:=]\s*//i + or + $type =~ s/^Block\s*[:=]\s*/In/i; + + + ## + ## See if it's in some enumeration. + ## + require "unicore/PVA.pl"; + if ($type =~ /^([\w\s]+)[:=]\s*(.*)/) { + my ($enum, $val) = (lc $1, lc $2); + $enum =~ tr/ _-//d; + $val =~ tr/ _-//d; + + my $pa = $PropertyAlias{$enum} ? $enum : $PA_reverse{$enum}; + my $f = $PropValueAlias{$pa}{$val} ? $val : $PVA_reverse{$pa}{lc $val}; + + if ($pa and $f) { + $pa = "gc_sc" if $pa eq "gc" or $pa eq "sc"; + $file = "unicore/lib/$pa/$PVA_abbr_map{$pa}{lc $f}.pl"; + last GETFILE; + } + } + else { + my $t = lc $type; + $t =~ tr/ _-//d; + + if ($PropValueAlias{gc}{$t} or $PropValueAlias{sc}{$t}) { + $file = "unicore/lib/gc_sc/$PVA_abbr_map{gc_sc}{$t}.pl"; + last GETFILE; + } + } + + ## + ## See if it's in the direct mapping table. + ## + require "unicore/Exact.pl"; + if (my $base = $utf8::Exact{$type}) { + $file = "unicore/lib/gc_sc/$base.pl"; + last GETFILE; + } + + ## + ## If not there exactly, try the canonical form. The canonical + ## form is lowercased, with any separators (\s+|[-_]) removed. + ## + my $canonical = lc $type; + $canonical =~ s/(?<=[a-z\d])(?:\s+|[-_])(?=[a-z\d])//g; + print "canonical = $canonical\n" if DEBUG; + + require "unicore/Canonical.pl"; + if (my $base = ($utf8::Canonical{$canonical} || $utf8::Canonical{ lc $utf8::PropertyAlias{$canonical} })) { + $file = "unicore/lib/gc_sc/$base.pl"; + last GETFILE; + } + + ## + ## See if it's a user-level "To". + ## + + my $caller0 = caller(0); + + if (defined $caller0 && $type =~ /^To(?:\w+)$/) { + my $map = $caller0 . "::" . $type; + + if (exists &{$map}) { + no strict 'refs'; + + $list = &{$map}; + last GETFILE; + } + } + + ## + ## Last attempt -- see if it's a standard "To" name + ## (e.g. "ToLower") ToTitle is used by ucfirst(). + ## The user-level way to access ToDigit() and ToFold() + ## is to use Unicode::UCD. + ## + if ($type =~ /^To(Digit|Fold|Lower|Title|Upper)$/) + { + $file = "unicore/To/$1.pl"; + ## would like to test to see if $file actually exists.... + last GETFILE; + } + + ## + ## If we reach this line, it's because we couldn't figure + ## out what to do with $type. Ouch. + ## + + return $type; + } + + if (defined $file) { + print "found it (file='$file')\n" if DEBUG; + + ## + ## If we reach here, it was due to a 'last GETFILE' above + ## (exception: user-defined properties and mappings), so we + ## have a filename, so now we load it if we haven't already. + ## If we have, return the cached results. The cache key is the + ## file to load. + ## + if ($Cache{$file} and ref($Cache{$file}) eq $class) + { + print "Returning cached '$file' for \\p{$type}\n" if DEBUG; + return $Cache{$class, $file}; + } + + $list = do $file; + } + + $ListSorted = 1; ## we know that these lists are sorted + } + + my $extras; + my $bits = 0; + + my $ORIG = $list; + if ($list) { + my @tmp = split(/^/m, $list); + my %seen; + no warnings; + $extras = join '', grep /^[^0-9a-fA-F]/, @tmp; + $list = join '', + map { $_->[1] } + sort { $a->[0] <=> $b->[0] } + map { /^([0-9a-fA-F]+)/; [ hex($1), $_ ] } + grep { /^([0-9a-fA-F]+)/ and not $seen{$1}++ } @tmp; # XXX doesn't do ranges right + } + + if ($none) { + my $hextra = sprintf "%04x", $none + 1; + $list =~ s/\tXXXX$/\t$hextra/mg; + } + + if ($minbits < 32) { + my $top = 0; + while ($list =~ /^([0-9a-fA-F]+)(?:[\t]([0-9a-fA-F]+)?)(?:[ \t]([0-9a-fA-F]+))?/mg) { + my $min = hex $1; + my $max = defined $2 ? hex $2 : $min; + my $val = defined $3 ? hex $3 : 0; + $val += $max - $min if defined $3; + $top = $val if $val > $top; + } + $bits = + $top > 0xffff ? 32 : + $top > 0xff ? 16 : + $top > 1 ? 8 : 1 + } + $bits = $minbits if $bits < $minbits; + + my @extras; + for my $x ($extras) { + pos $x = 0; + while ($x =~ /^([^0-9a-fA-F\n])(.*)/mg) { + my $char = $1; + my $name = $2; + print STDERR "$1 => $2\n" if DEBUG; + if ($char =~ /[-+!&]/) { + my ($c,$t) = split(/::/, $name, 2); # bogus use of ::, really + my $subobj; + if ($c eq 'utf8') { + $subobj = utf8->SWASHNEW($t, "", 0, 0, 0); + } + elsif (exists &$name) { + $subobj = utf8->SWASHNEW($name, "", 0, 0, 0); + } + elsif ($c =~ /^([0-9a-fA-F]+)/) { + $subobj = utf8->SWASHNEW("", $c, 0, 0, 0); + } + return $subobj unless ref $subobj; + push @extras, $name => $subobj; + $bits = $subobj->{BITS} if $bits < $subobj->{BITS}; + } + } + } + + print STDERR "CLASS = $class, TYPE => $type, BITS => $bits, NONE => $none\nEXTRAS =>\n$extras\nLIST =>\n$list\n" if DEBUG; + + my $SWASH = bless { + TYPE => $type, + BITS => $bits, + EXTRAS => $extras, + LIST => $list, + NONE => $none, + @extras, + } => $class; + + if ($file) { + $Cache{$class, $file} = $SWASH; + } + + return $SWASH; +} + +# NOTE: utf8.c:swash_init() assumes entries are never modified once generated. + +sub SWASHGET { + # See utf8.c:Perl_swash_fetch for problems with this interface. + my ($self, $start, $len) = @_; + local $^D = 0 if $^D; + my $type = $self->{TYPE}; + my $bits = $self->{BITS}; + my $none = $self->{NONE}; + print STDERR "SWASHGET @_ [$type/$bits/$none]\n" if DEBUG; + my $end = $start + $len; + my $swatch = ""; + my $key; + vec($swatch, $len - 1, $bits) = 0; # Extend to correct length. + if ($none) { + for $key (0 .. $len - 1) { vec($swatch, $key, $bits) = $none } + } + + for ($self->{LIST}) { + pos $_ = 0; + if ($bits > 1) { + LINE: + while (/^([0-9a-fA-F]+)(?:[ \t]([0-9a-fA-F]+)?)?(?:[ \t]([0-9a-fA-F]+))?/mg) { + chomp; + my ($a, $b, $c) = ($1, $2, $3); + croak "$type: illegal mapping '$_'" + if $type =~ /^To/ && + !(defined $a && defined $c); + my $min = hex $a; + my $max = defined $b ? hex $b : $min; + my $val = defined $c ? hex $c : 0; + next if $max < $start; + print "$min $max $val\n" if DEBUG; + if ($none) { + if ($min < $start) { + $val += $start - $min if $val < $none; + $min = $start; + } + for ($key = $min; $key <= $max; $key++) { + last LINE if $key >= $end; + print STDERR "$key => $val\n" if DEBUG; + vec($swatch, $key - $start, $bits) = $val; + ++$val if $val < $none; + } + } + else { + if ($min < $start) { + $val += $start - $min; + $min = $start; + } + for ($key = $min; $key <= $max; $key++, $val++) { + last LINE if $key >= $end; + print STDERR "$key => $val\n" if DEBUG; + vec($swatch, $key - $start, $bits) = $val; + } + } + } + } + else { + LINE: + while (/^([0-9a-fA-F]+)(?:[ \t]+([0-9a-fA-F]+))?/mg) { + chomp; + my $min = hex $1; + my $max = defined $2 ? hex $2 : $min; + next if $max < $start; + if ($min < $start) { + $min = $start; + } + for ($key = $min; $key <= $max; $key++) { + last LINE if $key >= $end; + print STDERR "$key => 1\n" if DEBUG; + vec($swatch, $key - $start, 1) = 1; + } + } + } + } + for my $x ($self->{EXTRAS}) { + pos $x = 0; + while ($x =~ /^([-+!&])(.*)/mg) { + my $char = $1; + my $name = $2; + print STDERR "INDIRECT $1 $2\n" if DEBUG; + my $otherbits = $self->{$name}->{BITS}; + croak("SWASHGET size mismatch") if $bits < $otherbits; + my $other = $self->{$name}->SWASHGET($start, $len); + if ($char eq '+') { + if ($bits == 1 and $otherbits == 1) { + $swatch |= $other; + } + else { + for ($key = 0; $key < $len; $key++) { + vec($swatch, $key, $bits) = vec($other, $key, $otherbits); + } + } + } + elsif ($char eq '!') { + if ($bits == 1 and $otherbits == 1) { + $swatch |= ~$other; + } + else { + for ($key = 0; $key < $len; $key++) { + if (!vec($other, $key, $otherbits)) { + vec($swatch, $key, $bits) = 1; + } + } + } + } + elsif ($char eq '-') { + if ($bits == 1 and $otherbits == 1) { + $swatch &= ~$other; + } + else { + for ($key = 0; $key < $len; $key++) { + if (vec($other, $key, $otherbits)) { + vec($swatch, $key, $bits) = 0; + } + } + } + } + elsif ($char eq '&') { + if ($bits == 1 and $otherbits == 1) { + $swatch &= $other; + } + else { + for ($key = 0; $key < $len; $key++) { + if (!vec($other, $key, $otherbits)) { + vec($swatch, $key, $bits) = 0; + } + } + } + } + } + } + if (DEBUG) { + print STDERR "CELLS "; + for ($key = 0; $key < $len; $key++) { + print STDERR vec($swatch, $key, $bits), " "; + } + print STDERR "\n"; + } + $swatch; +} + +1; diff --git a/Master/tlpkg/tlperl.old/lib/vars.pm b/Master/tlpkg/tlperl.old/lib/vars.pm new file mode 100644 index 00000000000..a0151b84030 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/vars.pm @@ -0,0 +1,82 @@ +package vars; + +use 5.006; + +our $VERSION = '1.01'; + +use warnings::register; +use strict qw(vars subs); + +sub import { + my $callpack = caller; + my ($pack, @imports) = @_; + my ($sym, $ch); + foreach (@imports) { + if (($ch, $sym) = /^([\$\@\%\*\&])(.+)/) { + if ($sym =~ /\W/) { + # time for a more-detailed check-up + if ($sym =~ /^\w+[[{].*[]}]$/) { + require Carp; + Carp::croak("Can't declare individual elements of hash or array"); + } elsif (warnings::enabled() and length($sym) == 1 and $sym !~ tr/a-zA-Z//) { + warnings::warn("No need to declare built-in vars"); + } elsif (($^H &= strict::bits('vars'))) { + require Carp; + Carp::croak("'$_' is not a valid variable name under strict vars"); + } + } + $sym = "${callpack}::$sym" unless $sym =~ /::/; + *$sym = + ( $ch eq "\$" ? \$$sym + : $ch eq "\@" ? \@$sym + : $ch eq "\%" ? \%$sym + : $ch eq "\*" ? \*$sym + : $ch eq "\&" ? \&$sym + : do { + require Carp; + Carp::croak("'$_' is not a valid variable name"); + }); + } else { + require Carp; + Carp::croak("'$_' is not a valid variable name"); + } + } +}; + +1; +__END__ + +=head1 NAME + +vars - Perl pragma to predeclare global variable names (obsolete) + +=head1 SYNOPSIS + + use vars qw($frob @mung %seen); + +=head1 DESCRIPTION + +NOTE: For variables in the current package, the functionality provided +by this pragma has been superseded by C<our> declarations, available +in Perl v5.6.0 or later. See L<perlfunc/our>. + +This will predeclare all the variables whose names are +in the list, allowing you to use them under "use strict", and +disabling any typo warnings. + +Unlike pragmas that affect the C<$^H> hints variable, the C<use vars> and +C<use subs> declarations are not BLOCK-scoped. They are thus effective +for the entire file in which they appear. You may not rescind such +declarations with C<no vars> or C<no subs>. + +Packages such as the B<AutoLoader> and B<SelfLoader> that delay +loading of subroutines within packages can create problems with +package lexicals defined using C<my()>. While the B<vars> pragma +cannot duplicate the effect of package lexicals (total transparency +outside of the package), it can act as an acceptable substitute by +pre-declaring global symbols, ensuring their availability to the +later-loaded routines. + +See L<perlmodlib/Pragmatic Modules>. + +=cut diff --git a/Master/tlpkg/tlperl.old/lib/warnings.pm b/Master/tlpkg/tlperl.old/lib/warnings.pm new file mode 100644 index 00000000000..e43b686c908 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/warnings.pm @@ -0,0 +1,497 @@ +# -*- buffer-read-only: t -*- +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file was created by warnings.pl +# Any changes made here will be lost. +# + +package warnings; + +our $VERSION = '1.05'; + +=head1 NAME + +warnings - Perl pragma to control optional warnings + +=head1 SYNOPSIS + + use warnings; + no warnings; + + use warnings "all"; + no warnings "all"; + + use warnings::register; + if (warnings::enabled()) { + warnings::warn("some warning"); + } + + if (warnings::enabled("void")) { + warnings::warn("void", "some warning"); + } + + if (warnings::enabled($object)) { + warnings::warn($object, "some warning"); + } + + warnings::warnif("some warning"); + warnings::warnif("void", "some warning"); + warnings::warnif($object, "some warning"); + +=head1 DESCRIPTION + +The C<warnings> pragma is a replacement for the command line flag C<-w>, +but the pragma is limited to the enclosing block, while the flag is global. +See L<perllexwarn> for more information. + +If no import list is supplied, all possible warnings are either enabled +or disabled. + +A number of functions are provided to assist module authors. + +=over 4 + +=item use warnings::register + +Creates a new warnings category with the same name as the package where +the call to the pragma is used. + +=item warnings::enabled() + +Use the warnings category with the same name as the current package. + +Return TRUE if that warnings category is enabled in the calling module. +Otherwise returns FALSE. + +=item warnings::enabled($category) + +Return TRUE if the warnings category, C<$category>, is enabled in the +calling module. +Otherwise returns FALSE. + +=item warnings::enabled($object) + +Use the name of the class for the object reference, C<$object>, as the +warnings category. + +Return TRUE if that warnings category is enabled in the first scope +where the object is used. +Otherwise returns FALSE. + +=item warnings::warn($message) + +Print C<$message> to STDERR. + +Use the warnings category with the same name as the current package. + +If that warnings category has been set to "FATAL" in the calling module +then die. Otherwise return. + +=item warnings::warn($category, $message) + +Print C<$message> to STDERR. + +If the warnings category, C<$category>, has been set to "FATAL" in the +calling module then die. Otherwise return. + +=item warnings::warn($object, $message) + +Print C<$message> to STDERR. + +Use the name of the class for the object reference, C<$object>, as the +warnings category. + +If that warnings category has been set to "FATAL" in the scope where C<$object> +is first used then die. Otherwise return. + + +=item warnings::warnif($message) + +Equivalent to: + + if (warnings::enabled()) + { warnings::warn($message) } + +=item warnings::warnif($category, $message) + +Equivalent to: + + if (warnings::enabled($category)) + { warnings::warn($category, $message) } + +=item warnings::warnif($object, $message) + +Equivalent to: + + if (warnings::enabled($object)) + { warnings::warn($object, $message) } + +=back + +See L<perlmodlib/Pragmatic Modules> and L<perllexwarn>. + +=cut + +use Carp (); + +our %Offsets = ( + + # Warnings Categories added in Perl 5.008 + + 'all' => 0, + 'closure' => 2, + 'deprecated' => 4, + 'exiting' => 6, + 'glob' => 8, + 'io' => 10, + 'closed' => 12, + 'exec' => 14, + 'layer' => 16, + 'newline' => 18, + 'pipe' => 20, + 'unopened' => 22, + 'misc' => 24, + 'numeric' => 26, + 'once' => 28, + 'overflow' => 30, + 'pack' => 32, + 'portable' => 34, + 'recursion' => 36, + 'redefine' => 38, + 'regexp' => 40, + 'severe' => 42, + 'debugging' => 44, + 'inplace' => 46, + 'internal' => 48, + 'malloc' => 50, + 'signal' => 52, + 'substr' => 54, + 'syntax' => 56, + 'ambiguous' => 58, + 'bareword' => 60, + 'digit' => 62, + 'parenthesis' => 64, + 'precedence' => 66, + 'printf' => 68, + 'prototype' => 70, + 'qw' => 72, + 'reserved' => 74, + 'semicolon' => 76, + 'taint' => 78, + 'threads' => 80, + 'uninitialized' => 82, + 'unpack' => 84, + 'untie' => 86, + 'utf8' => 88, + 'void' => 90, + 'y2k' => 92, + ); + +our %Bits = ( + 'all' => "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x15", # [0..46] + 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [29] + 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [30] + 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] + 'closure' => "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] + 'debugging' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [22] + 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2] + 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [31] + 'exec' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] + 'exiting' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] + 'glob' => "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] + 'inplace' => "\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [23] + 'internal' => "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [24] + 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [5..11] + 'layer' => "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] + 'malloc' => "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [25] + 'misc' => "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00", # [12] + 'newline' => "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9] + 'numeric' => "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [13] + 'once' => "\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00", # [14] + 'overflow' => "\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [15] + 'pack' => "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [16] + 'parenthesis' => "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [32] + 'pipe' => "\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10] + 'portable' => "\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [17] + 'precedence' => "\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [33] + 'printf' => "\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [34] + 'prototype' => "\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [35] + 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [36] + 'recursion' => "\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [18] + 'redefine' => "\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [19] + 'regexp' => "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00", # [20] + 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [37] + 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [38] + 'severe' => "\x00\x00\x00\x00\x00\x54\x05\x00\x00\x00\x00\x00", # [21..25] + 'signal' => "\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [26] + 'substr' => "\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [27] + 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\x55\x55\x15\x00\x00", # [28..38] + 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [39] + 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [40] + 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [41] + 'unopened' => "\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11] + 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [42] + 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [43] + 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [44] + 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [45] + 'y2k' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [46] + ); + +our %DeadBits = ( + 'all' => "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x2a", # [0..46] + 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [29] + 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [30] + 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] + 'closure' => "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] + 'debugging' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [22] + 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2] + 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [31] + 'exec' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] + 'exiting' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] + 'glob' => "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] + 'inplace' => "\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [23] + 'internal' => "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [24] + 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [5..11] + 'layer' => "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] + 'malloc' => "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [25] + 'misc' => "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00", # [12] + 'newline' => "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9] + 'numeric' => "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [13] + 'once' => "\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00", # [14] + 'overflow' => "\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [15] + 'pack' => "\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [16] + 'parenthesis' => "\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [32] + 'pipe' => "\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10] + 'portable' => "\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [17] + 'precedence' => "\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [33] + 'printf' => "\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [34] + 'prototype' => "\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [35] + 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [36] + 'recursion' => "\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [18] + 'redefine' => "\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [19] + 'regexp' => "\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00", # [20] + 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [37] + 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [38] + 'severe' => "\x00\x00\x00\x00\x00\xa8\x0a\x00\x00\x00\x00\x00", # [21..25] + 'signal' => "\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [26] + 'substr' => "\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [27] + 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\x2a\x00\x00", # [28..38] + 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [39] + 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [40] + 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [41] + 'unopened' => "\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11] + 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [42] + 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [43] + 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [44] + 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [45] + 'y2k' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [46] + ); + +$NONE = "\0\0\0\0\0\0\0\0\0\0\0\0"; +$LAST_BIT = 94 ; +$BYTES = 12 ; + +$All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ; + +sub Croaker +{ + local $Carp::CarpInternal{'warnings'}; + delete $Carp::CarpInternal{'warnings'}; + Carp::croak(@_); +} + +sub bits +{ + # called from B::Deparse.pm + + push @_, 'all' unless @_; + + my $mask; + my $catmask ; + my $fatal = 0 ; + my $no_fatal = 0 ; + + foreach my $word ( @_ ) { + if ($word eq 'FATAL') { + $fatal = 1; + $no_fatal = 0; + } + elsif ($word eq 'NONFATAL') { + $fatal = 0; + $no_fatal = 1; + } + elsif ($catmask = $Bits{$word}) { + $mask |= $catmask ; + $mask |= $DeadBits{$word} if $fatal ; + $mask &= ~($DeadBits{$word}|$All) if $no_fatal ; + } + else + { Croaker("Unknown warnings category '$word'")} + } + + return $mask ; +} + +sub import +{ + shift; + + my $catmask ; + my $fatal = 0 ; + my $no_fatal = 0 ; + + my $mask = ${^WARNING_BITS} ; + + if (vec($mask, $Offsets{'all'}, 1)) { + $mask |= $Bits{'all'} ; + $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1); + } + + push @_, 'all' unless @_; + + foreach my $word ( @_ ) { + if ($word eq 'FATAL') { + $fatal = 1; + $no_fatal = 0; + } + elsif ($word eq 'NONFATAL') { + $fatal = 0; + $no_fatal = 1; + } + elsif ($catmask = $Bits{$word}) { + $mask |= $catmask ; + $mask |= $DeadBits{$word} if $fatal ; + $mask &= ~($DeadBits{$word}|$All) if $no_fatal ; + } + else + { Croaker("Unknown warnings category '$word'")} + } + + ${^WARNING_BITS} = $mask ; +} + +sub unimport +{ + shift; + + my $catmask ; + my $mask = ${^WARNING_BITS} ; + + if (vec($mask, $Offsets{'all'}, 1)) { + $mask |= $Bits{'all'} ; + $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1); + } + + push @_, 'all' unless @_; + + foreach my $word ( @_ ) { + if ($word eq 'FATAL') { + next; + } + elsif ($catmask = $Bits{$word}) { + $mask &= ~($catmask | $DeadBits{$word} | $All); + } + else + { Croaker("Unknown warnings category '$word'")} + } + + ${^WARNING_BITS} = $mask ; +} + +my %builtin_type; @builtin_type{qw(SCALAR ARRAY HASH CODE REF GLOB LVALUE Regexp)} = (); + +sub __chk +{ + my $category ; + my $offset ; + my $isobj = 0 ; + + if (@_) { + # check the category supplied. + $category = shift ; + if (my $type = ref $category) { + Croaker("not an object") + if exists $builtin_type{$type}; + $category = $type; + $isobj = 1 ; + } + $offset = $Offsets{$category}; + Croaker("Unknown warnings category '$category'") + unless defined $offset; + } + else { + $category = (caller(1))[0] ; + $offset = $Offsets{$category}; + Croaker("package '$category' not registered for warnings") + unless defined $offset ; + } + + my $this_pkg = (caller(1))[0] ; + my $i = 2 ; + my $pkg ; + + if ($isobj) { + while (do { { package DB; $pkg = (caller($i++))[0] } } ) { + last unless @DB::args && $DB::args[0] =~ /^$category=/ ; + } + $i -= 2 ; + } + else { + for ($i = 2 ; $pkg = (caller($i))[0] ; ++ $i) { + last if $pkg ne $this_pkg ; + } + $i = 2 + if !$pkg || $pkg eq $this_pkg ; + } + + my $callers_bitmask = (caller($i))[9] ; + return ($callers_bitmask, $offset, $i) ; +} + +sub enabled +{ + Croaker("Usage: warnings::enabled([category])") + unless @_ == 1 || @_ == 0 ; + + my ($callers_bitmask, $offset, $i) = __chk(@_) ; + + return 0 unless defined $callers_bitmask ; + return vec($callers_bitmask, $offset, 1) || + vec($callers_bitmask, $Offsets{'all'}, 1) ; +} + + +sub warn +{ + Croaker("Usage: warnings::warn([category,] 'message')") + unless @_ == 2 || @_ == 1 ; + + my $message = pop ; + my ($callers_bitmask, $offset, $i) = __chk(@_) ; + Carp::croak($message) + if vec($callers_bitmask, $offset+1, 1) || + vec($callers_bitmask, $Offsets{'all'}+1, 1) ; + Carp::carp($message) ; +} + +sub warnif +{ + Croaker("Usage: warnings::warnif([category,] 'message')") + unless @_ == 2 || @_ == 1 ; + + my $message = pop ; + my ($callers_bitmask, $offset, $i) = __chk(@_) ; + + return + unless defined $callers_bitmask && + (vec($callers_bitmask, $offset, 1) || + vec($callers_bitmask, $Offsets{'all'}, 1)) ; + + Carp::croak($message) + if vec($callers_bitmask, $offset+1, 1) || + vec($callers_bitmask, $Offsets{'all'}+1, 1) ; + + Carp::carp($message) ; +} + +1; +# ex: set ro: diff --git a/Master/tlpkg/tlperl.old/lib/warnings/register.pm b/Master/tlpkg/tlperl.old/lib/warnings/register.pm new file mode 100644 index 00000000000..57c865df522 --- /dev/null +++ b/Master/tlpkg/tlperl.old/lib/warnings/register.pm @@ -0,0 +1,51 @@ +package warnings::register; + +our $VERSION = '1.01'; + +=pod + +=head1 NAME + +warnings::register - warnings import function + +=head1 SYNOPSIS + + use warnings::register; + +=head1 DESCRIPTION + +Creates a warnings category with the same name as the current package. + +See L<warnings> and L<perllexwarn> for more information on this module's +usage. + +=cut + +require warnings; + +sub mkMask +{ + my ($bit) = @_; + my $mask = ""; + + vec($mask, $bit, 1) = 1; + return $mask; +} + +sub import +{ + shift; + my $package = (caller(0))[0]; + if (! defined $warnings::Bits{$package}) { + $warnings::Bits{$package} = mkMask($warnings::LAST_BIT); + vec($warnings::Bits{'all'}, $warnings::LAST_BIT, 1) = 1; + $warnings::Offsets{$package} = $warnings::LAST_BIT ++; + foreach my $k (keys %warnings::Bits) { + vec($warnings::Bits{$k}, $warnings::LAST_BIT, 1) = 0; + } + $warnings::DeadBits{$package} = mkMask($warnings::LAST_BIT); + vec($warnings::DeadBits{'all'}, $warnings::LAST_BIT++, 1) = 1; + } +} + +1; |